Fixed the behavior for SHGetFileInfo when the SHGFI_USEFILEATTRIBUTES
[wine] / dlls / shell32 / shellstring.c
1 #include <string.h>
2 #include <stdio.h>
3 #include <ctype.h>
4 #include <stdlib.h> 
5
6 #include "winnls.h"
7 #include "winerror.h"
8 #include "debugtools.h"
9
10 #include "shlobj.h"
11 #include "shlwapi.h"
12 #include "shellapi.h"
13 #include "shell32_main.h"
14 #include "undocshell.h"
15 #include "wine/unicode.h"
16
17 DEFAULT_DEBUG_CHANNEL(shell);
18
19 /************************* STRRET functions ****************************/
20
21 /*************************************************************************
22  * StrRetToStrN                         [SHELL32.96]
23  * 
24  * converts a STRRET to a normal string
25  *
26  * NOTES
27  *  the pidl is for STRRET OFFSET
28  */
29 HRESULT WINAPI StrRetToStrNA (LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl)
30 {
31         TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
32
33         switch (src->uType)
34         {
35           case STRRET_WSTR:
36             WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, (LPSTR)dest, len, NULL, NULL);
37 /*          SHFree(src->u.pOleStr);  FIXME: is this right? */
38             break;
39
40           case STRRET_CSTRA:
41             lstrcpynA((LPSTR)dest, src->u.cStr, len);
42             break;
43
44           case STRRET_OFFSETA:
45             lstrcpynA((LPSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
46             break;
47
48           default:
49             FIXME("unknown type!\n");
50             if (len)
51             {
52               *(LPSTR)dest = '\0';
53             }
54             return(FALSE);
55         }
56         return S_OK;
57 }
58
59 /*************************************************************************/
60
61 HRESULT WINAPI StrRetToStrNW (LPVOID dest1, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl)
62 {
63     LPWSTR dest = (LPWSTR) dest1;
64         TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
65
66         switch (src->uType)
67         {
68           case STRRET_WSTR:
69             lstrcpynW((LPWSTR)dest, src->u.pOleStr, len);
70 /*          SHFree(src->u.pOleStr);  FIXME: is this right? */
71             break;
72
73           case STRRET_CSTRA:
74               if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ) && len)
75                   dest[len-1] = 0;
76             break;
77
78           case STRRET_OFFSETA:
79             if (pidl)
80             {
81               if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->u.uOffset, -1,
82                                         dest, len ) && len)
83                   dest[len-1] = 0;
84             }
85             break;
86
87           default:
88             FIXME("unknown type!\n");
89             if (len)
90             { *(LPSTR)dest = '\0';
91             }
92             return(FALSE);
93         }
94         return S_OK;
95 }
96
97 /*************************************************************************/
98
99 HRESULT WINAPI StrRetToStrNAW (LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl)
100 {
101         if(SHELL_OsIsUnicode())
102           return StrRetToStrNW (dest, len, src, pidl);
103         return StrRetToStrNA (dest, len, src, pidl);
104 }
105
106 /************************* OLESTR functions ****************************/
107
108 /************************************************************************
109  *      StrToOleStr                     [SHELL32.163]
110  *
111  */
112 int WINAPI StrToOleStrA (LPWSTR lpWideCharStr, LPCSTR lpMultiByteString)
113 {
114         TRACE("(%p, %p %s)\n",
115         lpWideCharStr, lpMultiByteString, debugstr_a(lpMultiByteString));
116
117         return MultiByteToWideChar(0, 0, lpMultiByteString, -1, lpWideCharStr, MAX_PATH);
118
119 }
120 int WINAPI StrToOleStrW (LPWSTR lpWideCharStr, LPCWSTR lpWString)
121 {
122         TRACE("(%p, %p %s)\n",
123         lpWideCharStr, lpWString, debugstr_w(lpWString));
124
125         strcpyW (lpWideCharStr, lpWString );
126         return strlenW(lpWideCharStr);
127 }
128
129 BOOL WINAPI StrToOleStrAW (LPWSTR lpWideCharStr, LPCVOID lpString)
130 {
131         if (SHELL_OsIsUnicode())
132           return StrToOleStrW (lpWideCharStr, lpString);
133         return StrToOleStrA (lpWideCharStr, lpString);
134 }
135
136 /*************************************************************************
137  * StrToOleStrN                                 [SHELL32.79]
138  *  lpMulti, nMulti, nWide [IN]
139  *  lpWide [OUT]
140  */
141 BOOL WINAPI StrToOleStrNA (LPWSTR lpWide, INT nWide, LPCSTR lpStrA, INT nStr) 
142 {
143         TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_an(lpStrA,nStr), nStr);
144         return MultiByteToWideChar (0, 0, lpStrA, nStr, lpWide, nWide);
145 }
146 BOOL WINAPI StrToOleStrNW (LPWSTR lpWide, INT nWide, LPCWSTR lpStrW, INT nStr) 
147 {
148         TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_wn(lpStrW, nStr), nStr);
149
150         if (lstrcpynW (lpWide, lpStrW, nWide))
151         { return lstrlenW (lpWide);
152         }
153         return 0;
154 }
155
156 BOOL WINAPI StrToOleStrNAW (LPWSTR lpWide, INT nWide, LPCVOID lpStr, INT nStr) 
157 {
158         if (SHELL_OsIsUnicode())
159           return StrToOleStrNW (lpWide, nWide, lpStr, nStr);
160         return StrToOleStrNA (lpWide, nWide, lpStr, nStr);
161 }
162
163 /*************************************************************************
164  * OleStrToStrN                                 [SHELL32.78]
165  */
166 BOOL WINAPI OleStrToStrNA (LPSTR lpStr, INT nStr, LPCWSTR lpOle, INT nOle) 
167 {
168         TRACE("(%p, %x, %s, %x)\n", lpStr, nStr, debugstr_wn(lpOle,nOle), nOle);
169         return WideCharToMultiByte (0, 0, lpOle, nOle, lpStr, nStr, NULL, NULL);
170 }
171
172 BOOL WINAPI OleStrToStrNW (LPWSTR lpwStr, INT nwStr, LPCWSTR lpOle, INT nOle) 
173 {
174         TRACE("(%p, %x, %s, %x)\n", lpwStr, nwStr, debugstr_wn(lpOle,nOle), nOle);
175
176         if (lstrcpynW ( lpwStr, lpOle, nwStr))
177         { return lstrlenW (lpwStr);
178         }
179         return 0;
180 }
181
182 BOOL WINAPI OleStrToStrNAW (LPVOID lpOut, INT nOut, LPCVOID lpIn, INT nIn) 
183 {
184         if (SHELL_OsIsUnicode())
185           return OleStrToStrNW (lpOut, nOut, lpIn, nIn);
186         return OleStrToStrNA (lpOut, nOut, lpIn, nIn);
187 }