Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenshellstring.cpp
Go to the documentation of this file.
00001 /* 00002 * Copyright 2000 Juergen Schmied 00003 * 00004 * This library is free software; you can redistribute it and/or 00005 * modify it under the terms of the GNU Lesser General Public 00006 * License as published by the Free Software Foundation; either 00007 * version 2.1 of the License, or (at your option) any later version. 00008 * 00009 * This library is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Lesser General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Lesser General Public 00015 * License along with this library; if not, write to the Free Software 00016 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00017 */ 00018 00019 #include <precomp.h> 00020 00021 WINE_DEFAULT_DEBUG_CHANNEL(shell); 00022 00023 /************************* STRRET functions ****************************/ 00024 00025 BOOL WINAPI StrRetToStrNA(LPSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) 00026 { 00027 TRACE("dest=%p len=0x%x strret=%p(%s) pidl=%p\n", 00028 dest,len,src, 00029 (src->uType == STRRET_WSTR) ? "STRRET_WSTR" : 00030 (src->uType == STRRET_CSTR) ? "STRRET_CSTR" : 00031 (src->uType == STRRET_OFFSET) ? "STRRET_OFFSET" : "STRRET_???", 00032 pidl); 00033 00034 if (!dest) 00035 return FALSE; 00036 00037 switch (src->uType) 00038 { 00039 case STRRET_WSTR: 00040 WideCharToMultiByte(CP_ACP, 0, src->pOleStr, -1, dest, len, NULL, NULL); 00041 CoTaskMemFree(src->pOleStr); 00042 break; 00043 00044 case STRRET_CSTR: 00045 lstrcpynA(dest, src->cStr, len); 00046 break; 00047 00048 case STRRET_OFFSET: 00049 lstrcpynA(dest, ((LPCSTR)&pidl->mkid)+src->uOffset, len); 00050 break; 00051 00052 default: 00053 FIXME("unknown type!\n"); 00054 if (len) *dest = '\0'; 00055 return FALSE; 00056 } 00057 TRACE("-- %s\n", debugstr_a(dest) ); 00058 return TRUE; 00059 } 00060 00061 /************************************************************************/ 00062 00063 BOOL WINAPI StrRetToStrNW(LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) 00064 { 00065 TRACE("dest=%p len=0x%x strret=%p(%s) pidl=%p\n", 00066 dest,len,src, 00067 (src->uType == STRRET_WSTR) ? "STRRET_WSTR" : 00068 (src->uType == STRRET_CSTR) ? "STRRET_CSTR" : 00069 (src->uType == STRRET_OFFSET) ? "STRRET_OFFSET" : "STRRET_???", 00070 pidl); 00071 00072 if (!dest) 00073 return FALSE; 00074 00075 switch (src->uType) 00076 { 00077 case STRRET_WSTR: 00078 lstrcpynW(dest, src->pOleStr, len); 00079 CoTaskMemFree(src->pOleStr); 00080 break; 00081 00082 case STRRET_CSTR: 00083 if (!MultiByteToWideChar( CP_ACP, 0, src->cStr, -1, dest, len ) && len) 00084 dest[len-1] = 0; 00085 break; 00086 00087 case STRRET_OFFSET: 00088 if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->uOffset, -1, dest, len ) && len) 00089 dest[len-1] = 0; 00090 break; 00091 00092 default: 00093 FIXME("unknown type!\n"); 00094 if (len) *dest = '\0'; 00095 return FALSE; 00096 } 00097 return TRUE; 00098 } 00099 00100 00101 /************************************************************************* 00102 * StrRetToStrN [SHELL32.96] 00103 * 00104 * converts a STRRET to a normal string 00105 * 00106 * NOTES 00107 * the pidl is for STRRET OFFSET 00108 */ 00109 EXTERN_C BOOL WINAPI StrRetToStrNAW(LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) 00110 { 00111 if(SHELL_OsIsUnicode()) 00112 return StrRetToStrNW((LPWSTR)dest, len, src, pidl); 00113 else 00114 return StrRetToStrNA((LPSTR)dest, len, src, pidl); 00115 } 00116 00117 /************************* OLESTR functions ****************************/ 00118 00119 /************************************************************************ 00120 * StrToOleStr [SHELL32.163] 00121 * 00122 */ 00123 static int StrToOleStrA (LPWSTR lpWideCharStr, LPCSTR lpMultiByteString) 00124 { 00125 TRACE("(%p, %p %s)\n", 00126 lpWideCharStr, lpMultiByteString, debugstr_a(lpMultiByteString)); 00127 00128 return MultiByteToWideChar(0, 0, lpMultiByteString, -1, lpWideCharStr, MAX_PATH); 00129 00130 } 00131 static int StrToOleStrW (LPWSTR lpWideCharStr, LPCWSTR lpWString) 00132 { 00133 TRACE("(%p, %p %s)\n", 00134 lpWideCharStr, lpWString, debugstr_w(lpWString)); 00135 00136 wcscpy (lpWideCharStr, lpWString ); 00137 return wcslen(lpWideCharStr); 00138 } 00139 00140 EXTERN_C BOOL WINAPI StrToOleStrAW (LPWSTR lpWideCharStr, LPCVOID lpString) 00141 { 00142 if (SHELL_OsIsUnicode()) 00143 return StrToOleStrW (lpWideCharStr, (LPCWSTR)lpString); 00144 return StrToOleStrA (lpWideCharStr, (LPCSTR)lpString); 00145 } 00146 00147 /************************************************************************* 00148 * StrToOleStrN [SHELL32.79] 00149 * lpMulti, nMulti, nWide [IN] 00150 * lpWide [OUT] 00151 */ 00152 static BOOL StrToOleStrNA (LPWSTR lpWide, INT nWide, LPCSTR lpStrA, INT nStr) 00153 { 00154 TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_an(lpStrA,nStr), nStr); 00155 return MultiByteToWideChar (0, 0, lpStrA, nStr, lpWide, nWide); 00156 } 00157 static BOOL StrToOleStrNW (LPWSTR lpWide, INT nWide, LPCWSTR lpStrW, INT nStr) 00158 { 00159 TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_wn(lpStrW, nStr), nStr); 00160 00161 if (lstrcpynW (lpWide, lpStrW, nWide)) 00162 { return wcslen (lpWide); 00163 } 00164 return 0; 00165 } 00166 00167 EXTERN_C BOOL WINAPI StrToOleStrNAW (LPWSTR lpWide, INT nWide, LPCVOID lpStr, INT nStr) 00168 { 00169 if (SHELL_OsIsUnicode()) 00170 return StrToOleStrNW (lpWide, nWide, (LPCWSTR)lpStr, nStr); 00171 return StrToOleStrNA (lpWide, nWide, (LPCSTR)lpStr, nStr); 00172 } 00173 00174 /************************************************************************* 00175 * OleStrToStrN [SHELL32.78] 00176 */ 00177 static BOOL OleStrToStrNA (LPSTR lpStr, INT nStr, LPCWSTR lpOle, INT nOle) 00178 { 00179 TRACE("(%p, %x, %s, %x)\n", lpStr, nStr, debugstr_wn(lpOle,nOle), nOle); 00180 return WideCharToMultiByte (0, 0, lpOle, nOle, lpStr, nStr, NULL, NULL); 00181 } 00182 00183 static BOOL OleStrToStrNW (LPWSTR lpwStr, INT nwStr, LPCWSTR lpOle, INT nOle) 00184 { 00185 TRACE("(%p, %x, %s, %x)\n", lpwStr, nwStr, debugstr_wn(lpOle,nOle), nOle); 00186 00187 if (lstrcpynW ( lpwStr, lpOle, nwStr)) 00188 { return wcslen (lpwStr); 00189 } 00190 return 0; 00191 } 00192 00193 EXTERN_C BOOL WINAPI OleStrToStrNAW (LPVOID lpOut, INT nOut, LPCVOID lpIn, INT nIn) 00194 { 00195 if (SHELL_OsIsUnicode()) 00196 return OleStrToStrNW ((LPWSTR)lpOut, nOut, (LPCWSTR)lpIn, nIn); 00197 return OleStrToStrNA ((LPSTR)lpOut, nOut, (LPCWSTR)lpIn, nIn); 00198 } 00199 00200 00201 /************************************************************************* 00202 * CheckEscapesA [SHELL32.@] 00203 * 00204 * Checks a string for special characters which are not allowed in a path 00205 * and encloses it in quotes if that is the case. 00206 * 00207 * PARAMS 00208 * string [I/O] string to check and on return eventually quoted 00209 * len [I] length of string 00210 * 00211 * RETURNS 00212 * length of actual string 00213 * 00214 * NOTES 00215 * Not really sure if this function returns actually a value at all. 00216 */ 00217 DWORD WINAPI CheckEscapesA( 00218 LPSTR string, /* [I/O] string to check ??*/ 00219 DWORD len) /* [I] is 0 */ 00220 { 00221 LPWSTR wString; 00222 DWORD ret = 0; 00223 00224 TRACE("(%s %d)\n", debugstr_a(string), len); 00225 wString = (LPWSTR)LocalAlloc(LPTR, len * sizeof(WCHAR)); 00226 if (wString) 00227 { 00228 MultiByteToWideChar(CP_ACP, 0, string, len, wString, len); 00229 ret = CheckEscapesW(wString, len); 00230 WideCharToMultiByte(CP_ACP, 0, wString, len, string, len, NULL, NULL); 00231 LocalFree(wString); 00232 } 00233 return ret; 00234 } 00235 00236 static const WCHAR strEscapedChars[] = {' ','"',',',';','^',0}; 00237 00238 /************************************************************************* 00239 * CheckEscapesW [SHELL32.@] 00240 * 00241 * See CheckEscapesA. 00242 */ 00243 DWORD WINAPI CheckEscapesW( 00244 LPWSTR string, 00245 DWORD len) 00246 { 00247 DWORD size = wcslen(string); 00248 LPWSTR s, d; 00249 00250 TRACE("(%s %d) stub\n", debugstr_w(string), len); 00251 00252 if (StrPBrkW(string, strEscapedChars) && size + 2 <= len) 00253 { 00254 s = &string[size - 1]; 00255 d = &string[size + 2]; 00256 *d-- = 0; 00257 *d-- = '"'; 00258 for (;d > string;) 00259 *d-- = *s--; 00260 *d = '"'; 00261 return size + 2; 00262 } 00263 return size; 00264 } Generated on Sat May 26 2012 04:25:03 for ReactOS by
1.7.6.1
|