1 /*
2 * Copyright 2000, Georges-Edouard Berenger. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7 #include "Preferences.h"
8 #include "Utilities.h"
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13
14 #include <Alert.h>
15 #include <Catalog.h>
16 #include <Directory.h>
17 #include <File.h>
18 #include <FindDirectory.h>
19 #include <Locker.h>
20 #include <Mime.h>
21 #include <Path.h>
22
23 #undef B_TRANSLATION_CONTEXT
24 #define B_TRANSLATION_CONTEXT "ProcessController"
25
Preferences(const char * name,const char * signature,bool doSave)26 Preferences::Preferences(const char* name, const char* signature, bool doSave)
27 : BMessage('Pref'), BLocker("Preferences", true),
28 fSavePreferences(doSave)
29 {
30 fNewPreferences = false;
31 fSettingsFile = 0;
32 BPath prefpath;
33 fName = strdup(name);
34 if (signature)
35 fSignature = strdup(signature);
36 else
37 fSignature = NULL;
38
39 if (find_directory(B_USER_SETTINGS_DIRECTORY, &prefpath) == B_OK) {
40 BDirectory prefdir(prefpath.Path());
41 BEntry entry;
42 prefdir.FindEntry(fName, &entry);
43
44 BFile file(&entry, B_READ_ONLY);
45 if (file.InitCheck() == B_OK)
46 Unflatten(&file);
47 else
48 fNewPreferences = true;
49 }
50 }
51
52
Preferences(const entry_ref & ref,const char * signature,bool doSave)53 Preferences::Preferences(const entry_ref &ref, const char* signature, bool doSave)
54 : BMessage('Pref'), BLocker("Preferences", true),
55 fSavePreferences(doSave)
56 {
57 fSettingsFile = new entry_ref(ref);
58 fNewPreferences = false;
59 BPath prefpath;
60 fName = NULL;
61 if (signature)
62 fSignature = strdup(signature);
63 else
64 fSignature = NULL;
65
66 BFile file(fSettingsFile, B_READ_ONLY);
67 if (file.InitCheck() == B_OK)
68 Unflatten(&file);
69 else
70 fNewPreferences = true;
71 }
72
73
~Preferences()74 Preferences::~Preferences()
75 {
76 if (fSavePreferences) {
77 BFile file;
78 if (fSettingsFile)
79 file.SetTo(fSettingsFile, B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE);
80 else {
81 BPath prefpath;
82 if (find_directory(B_USER_SETTINGS_DIRECTORY, &prefpath, true) == B_OK) {
83 BDirectory prefdir(prefpath.Path());
84 prefdir.CreateFile(fName, &file, false);
85 }
86 }
87
88 if (file.InitCheck () == B_OK) {
89 Flatten(&file);
90 if (fSignature) {
91 file.WriteAttr("BEOS:TYPE", B_MIME_STRING_TYPE, 0, fSignature,
92 strlen(fSignature) + 1);
93 }
94 } else {
95 // implement saving somewhere else!
96 BString error;
97 snprintf(error.LockBuffer(256), 256,
98 B_TRANSLATE("Your setting file could not be saved!\n(%s)"),
99 strerror(file.InitCheck()));
100 error.UnlockBuffer();
101 BAlert *alert = new BAlert(B_TRANSLATE("Error saving file"),
102 error.String(), B_TRANSLATE("Damned!"), NULL, NULL,
103 B_WIDTH_AS_USUAL, B_STOP_ALERT);
104 alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
105 alert->Go();
106 }
107 }
108 delete fSettingsFile;
109 free(fName);
110 free(fSignature);
111 }
112
113
114 status_t
MakeEmpty()115 Preferences::MakeEmpty()
116 {
117 Lock();
118 status_t status = BMessage::MakeEmpty();
119 Unlock();
120 return status;
121 }
122
123
124 void
SaveWindowPosition(BWindow * window,const char * name)125 Preferences::SaveWindowPosition(BWindow* window, const char* name)
126 {
127 Lock();
128
129 BRect rect = window->Frame();
130 if (HasPoint(name))
131 ReplacePoint(name, rect.LeftTop());
132 else
133 AddPoint(name, rect.LeftTop());
134
135 Unlock();
136 }
137
138
139 void
LoadWindowPosition(BWindow * window,const char * name)140 Preferences::LoadWindowPosition(BWindow* window, const char* name)
141 {
142 Lock();
143
144 BPoint p;
145 if (FindPoint(name, &p) == B_OK) {
146 window->MoveTo(p);
147 make_window_visible(window);
148 }
149
150 Unlock();
151 }
152
153
154 void
SaveWindowFrame(BWindow * window,const char * name)155 Preferences::SaveWindowFrame(BWindow* window, const char* name)
156 {
157 Lock();
158
159 BRect rect = window->Frame();
160 if (HasRect(name))
161 ReplaceRect(name, rect);
162 else
163 AddRect(name, rect);
164
165 Unlock();
166 }
167
168
169 void
LoadWindowFrame(BWindow * window,const char * name)170 Preferences::LoadWindowFrame(BWindow* window, const char* name)
171 {
172 Lock();
173
174 BRect frame;
175 if (FindRect(name, &frame) == B_OK) {
176 window->MoveTo(frame.LeftTop());
177 window->ResizeTo(frame.Width(), frame.Height());
178 make_window_visible(window);
179 }
180
181 Unlock();
182 }
183
184
185 void
SaveInt32(int32 value,const char * name)186 Preferences::SaveInt32(int32 value, const char* name)
187 {
188 Lock();
189
190 if (HasInt32(name))
191 ReplaceInt32(name, value);
192 else
193 AddInt32(name, value);
194
195 Unlock();
196 }
197
198
199 bool
ReadInt32(int32 & val,const char * name)200 Preferences::ReadInt32(int32 &val, const char* name)
201 {
202 Lock();
203 int32 readVal;
204 bool found = FindInt32(name, &readVal) == B_OK;
205 if (found)
206 val = readVal;
207 Unlock();
208 return found;
209 }
210
211
212 void
SaveFloat(float val,const char * name)213 Preferences::SaveFloat(float val, const char* name)
214 {
215 Lock();
216 if (HasFloat(name))
217 ReplaceFloat(name, val);
218 else
219 AddFloat(name, val);
220 Unlock();
221 }
222
223
224 bool
ReadFloat(float & val,const char * name)225 Preferences::ReadFloat(float &val, const char* name)
226 {
227 Lock();
228 float readVal;
229 bool found = FindFloat(name, &readVal) == B_OK;
230 if (found)
231 val = readVal;
232 Unlock();
233 return found;
234 }
235
236
237 void
SaveRect(BRect & rect,const char * name)238 Preferences::SaveRect(BRect& rect, const char* name)
239 {
240 Lock();
241 if (HasRect(name))
242 ReplaceRect(name, rect);
243 else
244 AddRect(name, rect);
245 Unlock();
246 }
247
248
249 BRect &
ReadRect(BRect & rect,const char * name)250 Preferences::ReadRect(BRect& rect, const char* name)
251 {
252 Lock();
253 BRect loaded;
254 if (FindRect(name, &loaded) == B_OK)
255 rect = loaded;
256 Unlock();
257 return rect;
258 }
259
260
261 void
SaveString(BString & string,const char * name)262 Preferences::SaveString(BString &string, const char* name)
263 {
264 Lock();
265 if (HasString(name))
266 ReplaceString(name, string);
267 else
268 AddString(name, string);
269 Unlock();
270 }
271
272
273 void
SaveString(const char * string,const char * name)274 Preferences::SaveString(const char* string, const char* name)
275 {
276 Lock();
277 if (HasString(name))
278 ReplaceString(name, string);
279 else
280 AddString(name, string);
281 Unlock();
282 }
283
284
285 bool
ReadString(BString & string,const char * name)286 Preferences::ReadString(BString &string, const char* name)
287 {
288 Lock();
289 bool loaded = FindString(name, &string) == B_OK;
290 Unlock();
291 return loaded;
292 }
293