xref: /haiku/src/apps/processcontroller/Preferences.cpp (revision f65814780ea997e99b6ed90bb5dca4d13aa464c7)
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