1 /**
2 * Inkscape Registry Tool
3 *
4 * This simple tool is intended for allowing Inkscape to append subdirectories
5 * to its path. This will allow extensions and other files to be accesses
6 * without explicit user intervention.
7 *
8 * Authors:
9 * Bob Jamison
10 *
11 * Copyright (C) 2005-2008 Bob Jamison
12 *
13 * This library is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2.1 of the License, or (at your option) any later version.
17 *
18 * This library is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
22 *
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with this library; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 */
28 #include <windows.h>
29 #include <string>
31 #include "registrytool.h"
34 typedef struct
35 {
36 HKEY key;
37 int strlen;
38 const char *str;
39 } KeyTableEntry;
43 KeyTableEntry keyTable[] =
44 {
45 { HKEY_CLASSES_ROOT, 18, "HKEY_CLASSES_ROOT\\" },
46 { HKEY_CURRENT_CONFIG, 20, "HKEY_CURRENT_CONFIG\\" },
47 { HKEY_CURRENT_USER, 18, "HKEY_CURRENT_USER\\" },
48 { HKEY_LOCAL_MACHINE, 19, "HKEY_LOCAL_MACHINE\\" },
49 { HKEY_USERS, 11, "HKEY_USERS\\" },
50 { NULL, 0, NULL }
51 };
54 /**
55 * Set the string value of a key/name registry entry
56 */
57 bool RegistryTool::setStringValue(const Glib::ustring &keyNameArg,
58 const Glib::ustring &valueName,
59 const Glib::ustring &value)
60 {
61 Glib::ustring keyName = keyNameArg;
63 HKEY rootKey = HKEY_LOCAL_MACHINE; //default root
64 //Trim out the root key if necessary
65 for (KeyTableEntry *entry = keyTable; entry->key; entry++)
66 {
67 if (keyName.compare(0, entry->strlen, entry->str)==0)
68 {
69 rootKey = entry->key;
70 keyName = keyName.substr(entry->strlen);
71 }
72 }
73 //printf("trimmed string: '%s'\n", keyName.c_str());
75 //Get or create the key
76 HKEY key;
77 if (RegCreateKeyEx(rootKey, keyName.c_str(),
78 0, NULL, REG_OPTION_NON_VOLATILE,
79 KEY_WRITE, NULL, &key, NULL))
80 {
81 fprintf(stderr, "RegistryTool: Could not create the registry key '%s'\n", keyName.c_str());
82 return false;
83 }
85 //Set the value
86 if (RegSetValueEx(key, valueName.c_str(),
87 0, REG_SZ, (LPBYTE) value.c_str(), (DWORD) value.size()))
88 {
89 fprintf(stderr, "RegistryTool: Could not set the value '%s'\n", value.c_str());
90 RegCloseKey(key);
91 return false;
92 }
95 RegCloseKey(key);
97 return true;
98 }
102 /**
103 * Get the full path, directory, and base file name of this running executable
104 */
105 bool RegistryTool::getExeInfo(Glib::ustring &fullPath,
106 Glib::ustring &path,
107 Glib::ustring &exeName)
108 {
110 char buf[MAX_PATH+1];
111 if (!GetModuleFileName(NULL, buf, MAX_PATH))
112 {
113 fprintf(stderr, "Could not fetch executable file name\n");
114 return false;
115 }
116 else
117 {
118 //printf("Executable file name: '%s'\n", buf);
119 }
121 fullPath = buf;
122 path = "";
123 exeName = "";
124 Glib::ustring::size_type pos = fullPath.rfind('\\');
125 if (pos != fullPath.npos)
126 {
127 path = fullPath.substr(0, pos);
128 exeName = fullPath.substr(pos+1);
129 }
131 return true;
132 }
136 /**
137 * Append our subdirectories to the Application Path for this
138 * application
139 */
140 bool RegistryTool::setPathInfo()
141 {
142 Glib::ustring fullPath;
143 Glib::ustring path;
144 Glib::ustring exeName;
146 if (!getExeInfo(fullPath, path, exeName))
147 return false;
149 //printf("full:'%s' path:'%s' exe:'%s'\n",
150 // fullPath.c_str(), path.c_str(), exeName.c_str());
152 Glib::ustring keyName =
153 "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\";
154 keyName.append(exeName);
156 Glib::ustring valueName = "";
157 Glib::ustring value = fullPath;
159 if (!setStringValue(keyName, valueName, value))
160 return false;
162 //add our subdirectories
163 Glib::ustring appPath = path;
164 appPath.append("\\python;");
165 appPath.append(path);
166 appPath.append("\\perl");
167 valueName = "Path";
168 value = appPath;
170 if (!setStringValue(keyName, valueName, value))
171 return false;
173 return true;
174 }
177 #ifdef TESTREG
180 /**
181 * Compile this file with
182 * g++ -DTESTREG registrytool.cpp -o registrytool
183 * to run these tests.
184 */
188 void testReg()
189 {
190 RegistryTool rt;
191 char *key =
192 "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\inkscape.exe";
193 char const *name = "";
194 char const *value = "c:\\inkscape\\inkscape.exe";
195 if (!rt.setStringValue(key, name, value))
196 {
197 printf("Test failed\n");
198 }
199 else
200 {
201 printf("Test succeeded\n");
202 }
203 name = "Path";
204 value = "c:\\inkscape\\python";
205 if (!rt.setStringValue(key, name, value))
206 {
207 printf("Test failed\n");
208 }
209 else
210 {
211 printf("Test succeeded\n");
212 }
213 }
216 void testPath()
217 {
218 RegistryTool rt;
219 rt.setPathInfo();
220 }
223 int main(int argc, char **argv)
224 {
225 //testReg();
226 testPath();
227 return 0;
228 }
230 #endif /* TESTREG */
232 //########################################################################
233 //# E N D O F F I L E
234 //########################################################################