blob: 6bfa2a3a68170961164a364178c852e84c08d6a4 [file] [log] [blame]
Juergen Schmieda9a4f4e1998-11-22 18:26:23 +00001/*
2 * file type mapping
3 * (HKEY_CLASSES_ROOT - Stuff)
4 *
5 *
6 */
7#include <stdlib.h>
8#include <string.h>
Alexandre Julliard383da682000-02-10 22:15:21 +00009#include <stdio.h>
Alexandre Julliarda099a551999-06-12 15:45:58 +000010#include "debugtools.h"
Juergen Schmieda9a4f4e1998-11-22 18:26:23 +000011#include "winerror.h"
Marcus Meissner317af321999-02-17 13:51:06 +000012#include "winreg.h"
Juergen Schmieda9a4f4e1998-11-22 18:26:23 +000013
Juergen Schmiedba28ba11999-01-23 14:12:48 +000014#include "shlobj.h"
Juergen Schmieda9a4f4e1998-11-22 18:26:23 +000015#include "shell32_main.h"
Juergen Schmiedd72ace41999-08-15 14:24:49 +000016#include "shlguid.h"
17#include "shresdef.h"
Juergen Schmieda9a4f4e1998-11-22 18:26:23 +000018
Alexandre Julliard383da682000-02-10 22:15:21 +000019DEFAULT_DEBUG_CHANNEL(shell);
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000020
Juergen Schmied166cfd51999-07-25 12:19:12 +000021#define MAX_EXTENSION_LENGTH 20
22
Juergen Schmiedd72ace41999-08-15 14:24:49 +000023BOOL HCR_MapTypeToValue ( LPCSTR szExtension, LPSTR szFileType, DWORD len, BOOL bPrependDot)
Juergen Schmieda9a4f4e1998-11-22 18:26:23 +000024{ HKEY hkey;
Juergen Schmied166cfd51999-07-25 12:19:12 +000025 char szTemp[MAX_EXTENSION_LENGTH + 2];
Juergen Schmieda9a4f4e1998-11-22 18:26:23 +000026
Alexandre Julliarda099a551999-06-12 15:45:58 +000027 TRACE("%s %p\n",szExtension, szFileType );
Juergen Schmied98f6cf01998-12-11 10:58:48 +000028
Juergen Schmiedd72ace41999-08-15 14:24:49 +000029 if (bPrependDot)
30 strcpy(szTemp, ".");
31
32 lstrcpynA(szTemp+((bPrependDot)?1:0), szExtension, MAX_EXTENSION_LENGTH);
Juergen Schmied166cfd51999-07-25 12:19:12 +000033
34 if (RegOpenKeyExA(HKEY_CLASSES_ROOT,szTemp,0,0x02000000,&hkey))
Juergen Schmieda9a4f4e1998-11-22 18:26:23 +000035 { return FALSE;
36 }
37
Alexandre Julliarda3960291999-02-26 11:11:13 +000038 if (RegQueryValueA(hkey,NULL,szFileType,&len))
Juergen Schmieda9a4f4e1998-11-22 18:26:23 +000039 { RegCloseKey(hkey);
40 return FALSE;
41 }
42
43 RegCloseKey(hkey);
44
Alexandre Julliarda099a551999-06-12 15:45:58 +000045 TRACE("-- %s\n", szFileType );
Juergen Schmieda9a4f4e1998-11-22 18:26:23 +000046
47 return TRUE;
48}
Alexandre Julliarda3960291999-02-26 11:11:13 +000049BOOL HCR_GetExecuteCommand ( LPCSTR szClass, LPCSTR szVerb, LPSTR szDest, DWORD len )
Juergen Schmied98f6cf01998-12-11 10:58:48 +000050{ HKEY hkey;
51 char sTemp[256];
52
Alexandre Julliarda099a551999-06-12 15:45:58 +000053 TRACE("%s %s\n",szClass, szVerb );
Juergen Schmied98f6cf01998-12-11 10:58:48 +000054
55 sprintf(sTemp, "%s\\shell\\%s\\command",szClass, szVerb);
56
Alexandre Julliarda3960291999-02-26 11:11:13 +000057 if (RegOpenKeyExA(HKEY_CLASSES_ROOT,sTemp,0,0x02000000,&hkey))
Juergen Schmied98f6cf01998-12-11 10:58:48 +000058 { return FALSE;
59 }
60
Alexandre Julliarda3960291999-02-26 11:11:13 +000061 if (RegQueryValueA(hkey,NULL,szDest,&len))
Juergen Schmied98f6cf01998-12-11 10:58:48 +000062 { RegCloseKey(hkey);
63 return FALSE;
64 }
65 RegCloseKey(hkey);
66
Alexandre Julliarda099a551999-06-12 15:45:58 +000067 TRACE("-- %s\n", szDest );
Juergen Schmied98f6cf01998-12-11 10:58:48 +000068
69 return TRUE;
70
71}
Juergen Schmied01fc2ba1998-12-14 17:33:00 +000072/***************************************************************************************
73* HCR_GetDefaultIcon [internal]
74*
75* Gets the icon for a filetype
76*/
Alexandre Julliarda3960291999-02-26 11:11:13 +000077BOOL HCR_GetDefaultIcon (LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr)
Juergen Schmied01fc2ba1998-12-14 17:33:00 +000078{ HKEY hkey;
79 char sTemp[256];
80 char sNum[5];
81
Alexandre Julliarda099a551999-06-12 15:45:58 +000082 TRACE("%s\n",szClass );
Juergen Schmied01fc2ba1998-12-14 17:33:00 +000083
84 sprintf(sTemp, "%s\\DefaultIcon",szClass);
85
Alexandre Julliarda3960291999-02-26 11:11:13 +000086 if (RegOpenKeyExA(HKEY_CLASSES_ROOT,sTemp,0,0x02000000,&hkey))
Juergen Schmied01fc2ba1998-12-14 17:33:00 +000087 { return FALSE;
88 }
89
Alexandre Julliarda3960291999-02-26 11:11:13 +000090 if (RegQueryValueA(hkey,NULL,szDest,&len))
Juergen Schmied01fc2ba1998-12-14 17:33:00 +000091 { RegCloseKey(hkey);
92 return FALSE;
93 }
94
95 RegCloseKey(hkey);
96
Alexandre Julliarda3960291999-02-26 11:11:13 +000097 if (ParseFieldA (szDest, 2, sNum, 5))
Juergen Schmied01fc2ba1998-12-14 17:33:00 +000098 { *dwNr=atoi(sNum);
99 }
100
Alexandre Julliarda3960291999-02-26 11:11:13 +0000101 ParseFieldA (szDest, 1, szDest, len);
Juergen Schmied01fc2ba1998-12-14 17:33:00 +0000102
Alexandre Julliarda099a551999-06-12 15:45:58 +0000103 TRACE("-- %s %li\n", szDest, *dwNr );
Juergen Schmied01fc2ba1998-12-14 17:33:00 +0000104
105 return TRUE;
Juergen Schmied166cfd51999-07-25 12:19:12 +0000106}
Juergen Schmied01fc2ba1998-12-14 17:33:00 +0000107
Juergen Schmied166cfd51999-07-25 12:19:12 +0000108/***************************************************************************************
109* HCR_GetClassName [internal]
110*
111* Gets the name of a registred class
112*/
113BOOL HCR_GetClassName (REFIID riid, LPSTR szDest, DWORD len)
114{ HKEY hkey;
115 char xriid[50];
Juergen Schmiedd72ace41999-08-15 14:24:49 +0000116 BOOL ret = FALSE;
117 DWORD buflen = len;
Juergen Schmied166cfd51999-07-25 12:19:12 +0000118
119 strcpy(xriid,"CLSID\\");
120 WINE_StringFromCLSID(riid,&xriid[strlen(xriid)]);
121
122 TRACE("%s\n",xriid );
123
Juergen Schmiedd72ace41999-08-15 14:24:49 +0000124 if (!RegOpenKeyExA(HKEY_CLASSES_ROOT,xriid,0,KEY_READ,&hkey))
125 {
126 if (!RegQueryValueExA(hkey,"",0,NULL,szDest,&len))
127 {
128 ret = TRUE;
129 }
130 RegCloseKey(hkey);
Juergen Schmied166cfd51999-07-25 12:19:12 +0000131 }
132
Juergen Schmiedd72ace41999-08-15 14:24:49 +0000133 if (!ret || !szDest[0])
134 {
135 if(IsEqualIID(riid, &CLSID_ShellDesktop))
136 {
137 LoadStringA(shell32_hInstance, IDS_DESKTOP, szDest, buflen);
138 ret = TRUE;
139 }
Juergen Schmiedafe53ed1999-11-23 22:31:18 +0000140 else if (IsEqualIID(riid, &CLSID_MyComputer))
Juergen Schmiedd72ace41999-08-15 14:24:49 +0000141 {
142 LoadStringA(shell32_hInstance, IDS_MYCOMPUTER, szDest, buflen);
143 ret = TRUE;
144 }
145 }
Juergen Schmied166cfd51999-07-25 12:19:12 +0000146
147 TRACE("-- %s\n", szDest);
148
Juergen Schmiedd72ace41999-08-15 14:24:49 +0000149 return ret;
Juergen Schmied166cfd51999-07-25 12:19:12 +0000150}
151
152/***************************************************************************************
153* HCR_GetFolderAttributes [internal]
154*
155* gets the folder attributes of a class
Juergen Schmiedafe53ed1999-11-23 22:31:18 +0000156*
157* FIXME
158* verify the defaultvalue for *szDest
Juergen Schmied166cfd51999-07-25 12:19:12 +0000159*/
160BOOL HCR_GetFolderAttributes (REFIID riid, LPDWORD szDest)
161{ HKEY hkey;
162 char xriid[60];
163 DWORD attributes;
164 DWORD len = 4;
165
166 strcpy(xriid,"CLSID\\");
167 WINE_StringFromCLSID(riid,&xriid[strlen(xriid)]);
168 TRACE("%s\n",xriid );
169
Juergen Schmiedafe53ed1999-11-23 22:31:18 +0000170 if (!szDest) return FALSE;
171 *szDest = SFGAO_FOLDER|SFGAO_FILESYSTEM;
172
Juergen Schmied166cfd51999-07-25 12:19:12 +0000173 strcat (xriid, "\\ShellFolder");
174
175 if (RegOpenKeyExA(HKEY_CLASSES_ROOT,xriid,0,KEY_READ,&hkey))
176 {
177 return FALSE;
178 }
179
180 if (RegQueryValueExA(hkey,"Attributes",0,NULL,(LPBYTE)&attributes,&len))
181 {
182 RegCloseKey(hkey);
183 return FALSE;
Juergen Schmiedd72ace41999-08-15 14:24:49 +0000184 }
Juergen Schmied166cfd51999-07-25 12:19:12 +0000185
186 RegCloseKey(hkey);
187
188 TRACE("-- 0x%08lx\n", attributes);
189
190 *szDest = attributes;
191
192 return TRUE;
Juergen Schmied01fc2ba1998-12-14 17:33:00 +0000193}
Juergen Schmieda9a4f4e1998-11-22 18:26:23 +0000194