1 /* w32_reg.c - Posix emulation layer for Sylpheed (Claws)
2 *
3 * This file is part of w32lib.
4 *
5 * w32lib is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * w32lib is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * For more information and a list of changes, see w32lib.h
19 */
20
21 #include <windows.h>
22 #include "utils.h"
23 #include "w32lib.h"
24
get_root_key_from_str(char * parent)25 static HKEY get_root_key_from_str(char *parent)
26 {
27 HKEY rootKey = NULL;
28 if (!parent || !strlen(parent))
29 rootKey = HKEY_CURRENT_USER ;
30 else if (!strcmp(parent, "HKCR") || !strcmp(parent,"HKEY_CLASSES_ROOT"))
31 rootKey = HKEY_CLASSES_ROOT ;
32 else if (!strcmp(parent, "HKCU") || !strcmp(parent,"HKEY_CURRENT_USER"))
33 rootKey = HKEY_CURRENT_USER ;
34 else if (!strcmp(parent, "HKLM") || !strcmp(parent,"HKEY_LOCAL_MACHINE"))
35 rootKey = HKEY_LOCAL_MACHINE ;
36 else if (!strcmp(parent, "HKU") || !strcmp(parent,"HKEY_USERS"))
37 rootKey = HKEY_USERS ;
38 else if (!strcmp(parent, "HKCC") || !strcmp(parent,"HKEY_CURRENT_CONFIG"))
39 rootKey = HKEY_CURRENT_CONFIG ;
40 return rootKey;
41
42 }
43
write_w32_registry_string(char * parent,char * section,char * value,char * data)44 int write_w32_registry_string( char *parent, char *section, char *value, char *data )
45 {
46 HKEY hKey, rootKey;
47 int ret;
48
49 rootKey = get_root_key_from_str(parent);
50 ret = RegCreateKeyEx(rootKey, section, 0, NULL,
51 REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL);
52 if (ret != ERROR_SUCCESS) {
53 debug_print("can't write key %s\\%s: %d\n", parent, section, ret);
54 return -1;
55 }
56 ret = RegSetValueEx(hKey, value, 0, REG_SZ, (LPVOID)data, strlen(data)+1);
57 if (ret != ERROR_SUCCESS) {
58 RegCloseKey(hKey);
59 debug_print("can't write key %s\\%s: %d\n", parent, section, ret);
60 return -1;
61 }
62 RegCloseKey(hKey);
63 return 0;
64 }
65
write_w32_registry_dword(char * parent,char * section,char * value,int data)66 int write_w32_registry_dword( char *parent, char *section, char *value, int data )
67 {
68 HKEY hKey, rootKey;
69 int ret;
70
71 rootKey = get_root_key_from_str(parent);
72 ret = RegCreateKeyEx(rootKey, section, 0, NULL,
73 REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL);
74 if (ret != ERROR_SUCCESS) {
75 debug_print("can't write key %s\\%s: %d\n", parent, section, ret);
76 return -1;
77 }
78 ret = RegSetValueEx(hKey, value, 0, REG_DWORD, (LPBYTE)&data, sizeof(data));
79 if (ret != ERROR_SUCCESS) {
80 RegCloseKey(hKey);
81 debug_print("can't write key %s\\%s: %d\n", parent, section, ret);
82 return -1;
83 }
84 RegCloseKey(hKey);
85 return 0;
86 }
87
read_w32_registry_string(char * parent,char * section,char * key)88 char *read_w32_registry_string( char *parent, char *section, char *key )
89 {
90 HKEY hKey, rootKey;
91 char *str;
92 int ret;
93
94 char buf[ MAX_PATH ];
95 DWORD bufsiz = sizeof( buf );
96
97 rootKey = get_root_key_from_str(parent);
98
99 if (!rootKey)
100 return NULL;
101
102 str = NULL;
103 ret = RegOpenKeyEx( rootKey, section, 0, KEY_READ, &hKey );
104 if ( ERROR_SUCCESS == ret ){
105 ret = RegQueryValueEx( hKey, key, 0, NULL,
106 (LPBYTE)buf, &bufsiz );
107 if ( ERROR_SUCCESS == ret ){
108 str = strdup( buf );
109 }
110 RegCloseKey( hKey );
111 }
112 return str;
113 }
114
get_content_type_from_registry_with_ext(char * ext)115 char *get_content_type_from_registry_with_ext( char *ext )
116 {
117 HKEY hKey, parent;
118 int ret;
119 char buf[ MAX_PATH ];
120 DWORD bufsiz;
121 char *section, *key, *value;
122
123 if (ext == NULL)
124 return NULL;
125
126 // parent : HKEY_CLASSES_ROOT
127 // section : ".txt"
128 parent = HKEY_CLASSES_ROOT;
129 section = malloc ( 1 + strlen (ext) + 1);
130 if (!section)
131 return NULL;
132 *section = '.';
133 strcpy (section+1, ext);
134
135 value = NULL;
136 while ( 1 ) {
137 ret = RegOpenKeyEx( parent, section, 0, KEY_READ, &hKey );
138 if ( ERROR_SUCCESS != ret ) {
139 // If section is not found...
140 value = NULL;
141 break;
142 }
143
144 // key : "Content Type"
145 key = "Content Type";
146 bufsiz = sizeof( buf );
147 ret = RegQueryValueEx( hKey, key, 0, NULL, (LPBYTE)buf, &bufsiz );
148 if ( ERROR_SUCCESS == ret ) {
149 // If value is found!
150 RegCloseKey( hKey );
151 value = strdup( buf );
152 break;
153 }
154
155 key = "";
156 bufsiz = sizeof( buf );
157 ret = RegQueryValueEx( hKey, key, 0, NULL, (LPBYTE)buf, &bufsiz );
158 if ( ERROR_SUCCESS != ret ) {
159 RegCloseKey( hKey );
160 value = NULL;
161 break;
162 }
163
164 RegCloseKey( hKey );
165 free( section );
166 section = strdup( buf );
167 break; //XXX:tm-gtk2
168 }
169
170 free( section );
171 return value;
172 }
173