ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

shellstring.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.