Support for building bf-blender under windows with gcc (huge thanks to
[blender.git] / source / blender / blenlib / intern / winstuff.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  * Windows-posix compatibility layer, windows-specific functions.
32  */
33
34 #ifdef HAVE_CONFIG_H
35 #include <config.h>
36 #endif
37
38 #ifdef WIN32
39
40 #include <stdlib.h>
41 #include <stdio.h>
42
43 #include "MEM_guardedalloc.h"
44
45 #include "BLI_blenlib.h"
46 #include "BLI_util.h"
47 #include "BLI_winstuff.h"
48
49 #include "BKE_utildefines.h" /* FILE_MAXDIR + FILE_MAXFILE */
50
51 int BLI_getInstallationDir( char * str ) {
52         LONG lresult;
53         HKEY hkey = 0;
54         LONG type;
55         char buffer[FILE_MAXDIR+FILE_MAXFILE];
56         DWORD size;
57         
58         size = sizeof(buffer);
59
60         lresult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\BlenderFoundation", 0, 
61                 KEY_ALL_ACCESS, &hkey);
62
63         if (lresult == ERROR_SUCCESS) {
64                 lresult = RegQueryValueEx(hkey, "Install_Dir", 0, NULL, (LPBYTE)buffer, &size);
65                 strcpy(str, buffer);
66                 RegCloseKey(hkey);
67                 return 1;
68         }
69         else
70                 return 0;
71 }
72
73
74 void RegisterBlendExtension(char * str) {
75         LONG lresult;
76         HKEY hkey = 0;
77         DWORD dwd = 0;
78         char *dir;
79         char buffer[128];
80         
81         /* Add installation dir to registry --aphex */
82
83         strncpy(dir, str, strlen(str)-11);
84
85         lresult = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\BlenderFoundation", 0, 
86                 "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
87
88         if (lresult == ERROR_SUCCESS) {
89                 if (dwd != REG_OPENED_EXISTING_KEY)
90                         lresult = RegSetValueEx(hkey, "Install_Dir", 0, REG_SZ, dir, strlen(dir)+1);
91                 RegCloseKey(hkey);
92         }
93
94         lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, "blendfile\\shell\\open\\command", 0,
95                 "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
96
97         if (lresult == ERROR_SUCCESS) {
98                 sprintf(buffer, "\"%s\" \"%%1\"", str);
99                 lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
100                 RegCloseKey(hkey);
101         }
102
103         lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, "blendfile\\DefaultIcon", 0,
104                 "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
105
106         if (lresult == ERROR_SUCCESS) {
107                 sprintf(buffer, "\"%s\",1", str);
108                 lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
109                 RegCloseKey(hkey);
110         }
111
112         lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, ".blend", 0,
113                 "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
114
115         if (lresult == ERROR_SUCCESS) {
116                 sprintf(buffer, "%s", "blendfile");
117                 lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
118                 RegCloseKey(hkey);
119         }
120 }
121
122 static void strlower (char *str) {
123         while (*str) {
124                 *str= tolower(*str);
125                 str++;
126         }
127 }
128
129 static void strnlower (char *str, int n) {
130         while (n>0 && *str) {
131                 *str= tolower(*str);
132                 str++;
133                 n--;
134         }
135 }
136
137 #ifndef FREE_WINDOWS
138 int strcasecmp (char *s1, char *s2) {
139         char *st1, *st2;
140         int r;
141         
142         st1= MEM_mallocN(strlen(s1)+1, "temp string");
143         strcpy(st1, s1);
144
145         st2= MEM_mallocN(strlen(s2)+1, "temp string");
146         strcpy(st2, s2);
147
148         strlower(st1);
149         strlower(st2);
150         r= strcmp (st1, st2);
151         
152         MEM_freeN(st1);
153         MEM_freeN(st2);
154
155         return r;
156 }
157
158 int strncasecmp (char *s1, char *s2, int n) {
159         char *st1, *st2;
160         int r;
161         
162         st1= MEM_mallocN(n, "temp string");
163         memcpy(st1, s1, n);
164
165         st2= MEM_mallocN(n, "temp string");
166         memcpy(st2, s2, n);
167
168         strnlower(st1, n);
169         strnlower(st2, n);
170
171         r= strncmp (st1, st2, n);
172         
173         MEM_freeN(st1);
174         MEM_freeN(st2);
175
176         return r;       
177 }
178 #endif
179
180 DIR *opendir (const char *path) {
181         if (GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY) {
182                 DIR *newd= MEM_mallocN(sizeof(DIR), "opendir");
183
184                 newd->handle = INVALID_HANDLE_VALUE;
185                 sprintf(newd->path, "%s/*.*",path);
186                 
187                 newd->direntry.d_ino= 0;
188                 newd->direntry.d_off= 0;
189                 newd->direntry.d_reclen= 0;
190                 newd->direntry.d_name= NULL;
191                 
192                 return newd;
193         } else {
194                 return NULL;
195         }
196 }
197
198 struct dirent *readdir(DIR *dp) {
199         if (dp->direntry.d_name) {
200                 MEM_freeN(dp->direntry.d_name);
201                 dp->direntry.d_name= NULL;
202         }
203                 
204         if (dp->handle==INVALID_HANDLE_VALUE) {
205                 dp->handle= FindFirstFile(dp->path, &(dp->data));
206                 if (dp->handle==INVALID_HANDLE_VALUE)
207                         return NULL;
208                         
209                 dp->direntry.d_name= BLI_strdup(dp->data.cFileName);
210
211                 return &dp->direntry;
212         } else if (FindNextFile (dp->handle, &(dp->data))) {
213                 dp->direntry.d_name= BLI_strdup(dp->data.cFileName);
214
215                 return &dp->direntry;
216         } else {
217                 return NULL;
218         }
219 }
220
221 int closedir (DIR *dp) {
222         if (dp->direntry.d_name) MEM_freeN(dp->direntry.d_name);
223         if (dp->handle!=INVALID_HANDLE_VALUE) FindClose(dp->handle);
224
225         MEM_freeN(dp);
226         
227         return 0;
228 }
229
230 #else
231
232 void BLI_WINSTUFF_C_IS_EMPTY_FOR_UNIX(void) 
233 {
234   /*intentionally empty*/
235 }
236
237 #endif