Small fix.
[wine] / dlls / shell32 / classes.c
1 /*
2  *      file type mapping 
3  *      (HKEY_CLASSES_ROOT - Stuff)
4  *
5  *
6  */
7 #include <stdlib.h>
8 #include <string.h>
9 #include "debugtools.h"
10 #include "winerror.h"
11 #include "winreg.h"
12
13 #include "shlobj.h"
14 #include "shell32_main.h"
15 #include "shlguid.h"
16 #include "shresdef.h"
17
18 DEFAULT_DEBUG_CHANNEL(shell)
19
20 #define MAX_EXTENSION_LENGTH 20
21
22 BOOL HCR_MapTypeToValue ( LPCSTR szExtension, LPSTR szFileType, DWORD len, BOOL bPrependDot)
23 {       HKEY    hkey;
24         char    szTemp[MAX_EXTENSION_LENGTH + 2];
25
26         TRACE("%s %p\n",szExtension, szFileType );
27
28         if (bPrependDot)
29           strcpy(szTemp, ".");
30
31         lstrcpynA(szTemp+((bPrependDot)?1:0), szExtension, MAX_EXTENSION_LENGTH);
32         
33         if (RegOpenKeyExA(HKEY_CLASSES_ROOT,szTemp,0,0x02000000,&hkey))
34         { return FALSE;
35         }
36
37         if (RegQueryValueA(hkey,NULL,szFileType,&len))
38         { RegCloseKey(hkey);
39           return FALSE;
40         }       
41
42         RegCloseKey(hkey);
43
44         TRACE("-- %s\n", szFileType );
45
46         return TRUE;
47 }
48 BOOL HCR_GetExecuteCommand ( LPCSTR szClass, LPCSTR szVerb, LPSTR szDest, DWORD len )
49 {       HKEY    hkey;
50         char    sTemp[256];
51         
52         TRACE("%s %s\n",szClass, szVerb );
53
54         sprintf(sTemp, "%s\\shell\\%s\\command",szClass, szVerb);
55
56         if (RegOpenKeyExA(HKEY_CLASSES_ROOT,sTemp,0,0x02000000,&hkey))
57         { return FALSE;
58         }
59
60         if (RegQueryValueA(hkey,NULL,szDest,&len))
61         { RegCloseKey(hkey);
62           return FALSE;
63         }       
64         RegCloseKey(hkey);
65
66         TRACE("-- %s\n", szDest );
67
68         return TRUE;
69
70 }
71 /***************************************************************************************
72 *       HCR_GetDefaultIcon      [internal]
73 *
74 * Gets the icon for a filetype
75 */
76 BOOL HCR_GetDefaultIcon (LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr)
77 {       HKEY    hkey;
78         char    sTemp[256];
79         char    sNum[5];
80
81         TRACE("%s\n",szClass );
82
83         sprintf(sTemp, "%s\\DefaultIcon",szClass);
84
85         if (RegOpenKeyExA(HKEY_CLASSES_ROOT,sTemp,0,0x02000000,&hkey))
86         { return FALSE;
87         }
88
89         if (RegQueryValueA(hkey,NULL,szDest,&len))
90         { RegCloseKey(hkey);
91           return FALSE;
92         }       
93
94         RegCloseKey(hkey);
95
96         if (ParseFieldA (szDest, 2, sNum, 5))
97         { *dwNr=atoi(sNum);
98         }
99         
100         ParseFieldA (szDest, 1, szDest, len);
101         
102         TRACE("-- %s %li\n", szDest, *dwNr );
103
104         return TRUE;
105 }
106
107 /***************************************************************************************
108 *       HCR_GetClassName        [internal]
109 *
110 * Gets the name of a registred class
111 */
112 BOOL HCR_GetClassName (REFIID riid, LPSTR szDest, DWORD len)
113 {       HKEY    hkey;
114         char    xriid[50];
115         BOOL ret = FALSE;
116         DWORD buflen = len;
117
118         strcpy(xriid,"CLSID\\");
119         WINE_StringFromCLSID(riid,&xriid[strlen(xriid)]);
120
121         TRACE("%s\n",xriid );
122
123         if (!RegOpenKeyExA(HKEY_CLASSES_ROOT,xriid,0,KEY_READ,&hkey))
124         {
125           if (!RegQueryValueExA(hkey,"",0,NULL,szDest,&len))
126           {
127             ret = TRUE;
128           }
129           RegCloseKey(hkey);
130         }
131
132         if (!ret || !szDest[0])
133         { 
134           if(IsEqualIID(riid, &CLSID_ShellDesktop))
135           {
136             LoadStringA(shell32_hInstance, IDS_DESKTOP, szDest, buflen);
137             ret = TRUE;
138           }
139           else if (IsEqualIID(riid, &CLSID_MyComputer))
140           {
141             LoadStringA(shell32_hInstance, IDS_MYCOMPUTER, szDest, buflen);
142             ret = TRUE;
143           }     
144         }
145
146         TRACE("-- %s\n", szDest);
147
148         return ret;
149 }
150
151 /***************************************************************************************
152 *       HCR_GetFolderAttributes [internal]
153 *
154 * gets the folder attributes of a class
155 *
156 * FIXME
157 *       verify the defaultvalue for *szDest
158 */
159 BOOL HCR_GetFolderAttributes (REFIID riid, LPDWORD szDest)
160 {       HKEY    hkey;
161         char    xriid[60];
162         DWORD   attributes;
163         DWORD   len = 4;
164
165         strcpy(xriid,"CLSID\\");
166         WINE_StringFromCLSID(riid,&xriid[strlen(xriid)]);
167         TRACE("%s\n",xriid );
168
169         if (!szDest) return FALSE;
170         *szDest = SFGAO_FOLDER|SFGAO_FILESYSTEM;
171         
172         strcat (xriid, "\\ShellFolder");
173
174         if (RegOpenKeyExA(HKEY_CLASSES_ROOT,xriid,0,KEY_READ,&hkey))
175         {
176           return FALSE;
177         }
178
179         if (RegQueryValueExA(hkey,"Attributes",0,NULL,(LPBYTE)&attributes,&len))
180         {
181           RegCloseKey(hkey);
182           return FALSE;
183         }
184
185         RegCloseKey(hkey);
186
187         TRACE("-- 0x%08lx\n", attributes);
188
189         *szDest = attributes;
190
191         return TRUE;
192 }
193