xref: /haiku/src/apps/diskusage/App.cpp (revision 746cac055adc6ac3308c7bc2d29040fb95689cc9)
1 /*
2  * Copyright (c) 2008 Stephan Aßmus <superstippi@gmx.de>. All rights reserved.
3  * Distributed under the terms of the MIT/X11 license.
4  *
5  * Copyright (c) 1999 Mike Steed. You are free to use and distribute this software
6  * as long as it is accompanied by it's documentation and this copyright notice.
7  * The software comes with no warranty, etc.
8  */
9 #include "App.h"
10 
11 #include <stdio.h>
12 
13 #include <File.h>
14 #include <FindDirectory.h>
15 #include <Node.h>
16 #include <Path.h>
17 
18 #include "Common.h"
19 #include "MainWindow.h"
20 
21 
22 App::App()
23 	: BApplication(kAppSignature),
24 	  fResources(read_resources(kAppSignature)),
25 	  fMainWindow(NULL),
26 	  fSavedRefsReceived(NULL)
27 {
28 }
29 
30 
31 App::~App()
32 {
33 	delete fResources;
34 	delete fSavedRefsReceived;
35 }
36 
37 
38 void
39 App::ArgvReceived(int32 argc, char** argv)
40 {
41 	BMessage refsReceived(B_REFS_RECEIVED);
42 	for (int32 i = 1; i < argc; i++) {
43 		BEntry entry(argv[i], true);
44 		entry_ref ref;
45 		if (entry.GetRef(&ref) == B_OK)
46 			refsReceived.AddRef("refs", &ref);
47 	}
48 	if (refsReceived.HasRef("refs"))
49 		PostMessage(&refsReceived);
50 }
51 
52 
53 void
54 App::RefsReceived(BMessage* message)
55 {
56 	if (fMainWindow == NULL) {
57 		// ReadyToRun() has not been called yet, this happens when someone
58 		// launches us with a B_REFS_RECEIVED message.
59 		delete fSavedRefsReceived;
60 		fSavedRefsReceived = new BMessage(*message);
61 	} else
62 		fMainWindow->PostMessage(message);
63 }
64 
65 
66 void
67 App::ReadyToRun()
68 {
69 	BRect frame;
70 
71 	BPath path;
72 	BFile settingsFile;
73 	BMessage settings;
74 	if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK
75 		|| path.Append("DiskUsage") != B_OK
76 		|| settingsFile.SetTo(path.Path(), B_READ_ONLY) != B_OK
77 		|| settings.Unflatten(&settingsFile) != B_OK
78 		|| settings.FindRect("window frame", &frame) != B_OK) {
79 		// use default window frame
80 		frame.Set(0, 0, kDefaultPieSize, kDefaultPieSize);
81 		frame.OffsetTo(50, 50);
82 	}
83 
84 	fMainWindow = new MainWindow(frame);
85 
86 	if (fSavedRefsReceived) {
87 		// RefsReceived() was called earlier than ReadyToRun()
88 		fMainWindow->PostMessage(fSavedRefsReceived);
89 		delete fSavedRefsReceived;
90 		fSavedRefsReceived = NULL;
91 	}
92 }
93 
94 
95 bool
96 App::QuitRequested()
97 {
98 	// Save the settings.
99 	BPath path;
100 	BFile settingsFile;
101 	BMessage settings;
102 	if (settings.AddRect("window frame", fMainWindow->Frame()) != B_OK
103 		|| find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK
104 		|| path.Append("DiskUsage") != B_OK
105 		|| settingsFile.SetTo(path.Path(),
106 			B_CREATE_FILE | B_WRITE_ONLY | B_ERASE_FILE) != B_OK
107 		|| settings.Flatten(&settingsFile) != B_OK) {
108 		fprintf(stderr, "Failed to write application settings.\n");
109 	}
110 
111 	return BApplication::QuitRequested();
112 }
113