xref: /haiku/src/apps/networkstatus/NetworkStatus.cpp (revision d7e7e13c6775d09535096f6d5396c15890324f25)
1 /*
2  * Copyright 2006-2008, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Axel Dörfler, axeld@pinc-software.de
7  *		Stephan Aßmus <superstippi@gmx.de>
8  */
9 
10 
11 #include "NetworkStatus.h"
12 #include "NetworkStatusWindow.h"
13 
14 #include <Alert.h>
15 #include <Application.h>
16 #include <Catalog.h>
17 #include <Deskbar.h>
18 #include <Entry.h>
19 #include <Locale.h>
20 
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 
25 
26 #undef B_TRANSLATION_CONTEXT
27 #define B_TRANSLATION_CONTEXT "NetworkStatus"
28 
29 
30 class NetworkStatus : public BApplication {
31 	public:
32 		NetworkStatus();
33 		virtual	~NetworkStatus();
34 
35 		virtual	void	ArgvReceived(int32 argc, char** argv);
36 		virtual	void	ReadyToRun();
37 		virtual void	AboutRequested();
38 	private:
39 				void	_InstallReplicantInDeskbar();
40 
41 				bool	fAutoInstallInDeskbar;
42 				bool	fQuitImmediately;
43 };
44 
45 
46 const char* kSignature = "application/x-vnd.Haiku-NetworkStatus";
47 const char* kDeskbarSignature = "application/x-vnd.Be-TSKB";
48 const char* kDeskbarItemName = "NetworkStatus";
49 
50 
51 status_t
our_image(image_info & image)52 our_image(image_info& image)
53 {
54 	int32 cookie = 0;
55 	while (get_next_image_info(B_CURRENT_TEAM, &cookie, &image) == B_OK) {
56 		if ((char *)our_image >= (char *)image.text
57 			&& (char *)our_image <= (char *)image.text + image.text_size)
58 			return B_OK;
59 	}
60 
61 	return B_ERROR;
62 }
63 
64 
65 //	#pragma mark -
66 
67 
NetworkStatus()68 NetworkStatus::NetworkStatus()
69 	:
70 	BApplication(kSignature),
71 	fAutoInstallInDeskbar(false),
72 	fQuitImmediately(false)
73 {
74 }
75 
76 
~NetworkStatus()77 NetworkStatus::~NetworkStatus()
78 {
79 }
80 
81 
82 void
ArgvReceived(int32 argc,char ** argv)83 NetworkStatus::ArgvReceived(int32 argc, char** argv)
84 {
85 	if (argc <= 1)
86 		return;
87 
88 	if (strcmp(argv[1], "--help") == 0
89 		|| strcmp(argv[1], "-h") == 0) {
90 		const char* str = B_TRANSLATE("NetworkStatus options:\n"
91 			"\t--deskbar\tautomatically add replicant to Deskbar\n"
92 			"\t--help\t\tprint this info and exit");
93 		puts(str);
94 		fQuitImmediately = true;
95 		return;
96 	}
97 
98 	if (strcmp(argv[1], "--deskbar") == 0)
99 		fAutoInstallInDeskbar = true;
100 }
101 
102 
103 void
ReadyToRun()104 NetworkStatus::ReadyToRun()
105 {
106 	if (fQuitImmediately) {
107 		// we printed the help message into the Terminal and
108 		// should just quit
109 		Quit();
110 		return;
111 	}
112 
113 	bool isDeskbarRunning = true;
114 	bool isInstalled = false;
115 
116 	{
117 		// if the Deskbar is not alive at this point, it might be after having
118 		// acknowledged the requester below
119 		BDeskbar deskbar;
120 #ifdef HAIKU_TARGET_PLATFORM_HAIKU
121 		isDeskbarRunning = deskbar.IsRunning();
122 #endif
123 		isInstalled = deskbar.HasItem(kDeskbarItemName);
124 	}
125 
126 	if (fAutoInstallInDeskbar) {
127 		if (isInstalled) {
128 			Quit();
129 			return;
130 		}
131 #ifdef HAIKU_TARGET_PLATFORM_HAIKU
132 		// wait up to 10 seconds for Deskbar to become available
133 		// in case it is not running (yet?)
134 		int32 tries = 10;
135 		while (!isDeskbarRunning && --tries) {
136 			BDeskbar deskbar;
137 			if (deskbar.IsRunning()) {
138 				isDeskbarRunning = true;
139 				break;
140 			}
141 			snooze(1000000);
142 		}
143 #endif
144 		if (!isDeskbarRunning) {
145 			const char* str = B_TRANSLATE("Deskbar is not running, giving up.");
146 			puts(str);
147 			Quit();
148 			return;
149 		}
150 
151 		_InstallReplicantInDeskbar();
152 		return;
153 	}
154 
155 	if (isDeskbarRunning && !isInstalled) {
156 		BAlert* alert = new BAlert("", B_TRANSLATE("You can run NetworkStatus "
157 			"in a window or install it in the Deskbar."),
158 			B_TRANSLATE("Run in window"), B_TRANSLATE("Install in Deskbar"),
159 			NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
160 
161 		if (alert->Go() == 1) {
162 			_InstallReplicantInDeskbar();
163 			return;
164 		}
165 	}
166 
167 	BWindow* window = new NetworkStatusWindow();
168 	window->Show();
169 }
170 
171 
172 void
AboutRequested()173 NetworkStatus::AboutRequested()
174 {
175 	BWindow* window = WindowAt(0);
176 	if (window == NULL)
177 		return;
178 
179 	BView* view = window->FindView(kDeskbarItemName);
180 	if (view == NULL)
181 		return;
182 
183 	BMessenger target((BHandler*)view);
184 	BMessage about(B_ABOUT_REQUESTED);
185 	target.SendMessage(&about);
186 }
187 
188 
189 void
_InstallReplicantInDeskbar()190 NetworkStatus::_InstallReplicantInDeskbar()
191 {
192 	image_info info;
193 	entry_ref ref;
194 
195 	if (our_image(info) == B_OK
196 		&& get_ref_for_path(info.name, &ref) == B_OK) {
197 		BDeskbar deskbar;
198 		deskbar.AddItem(&ref);
199 	}
200 
201 	Quit();
202 }
203 
204 
205 //	#pragma mark -
206 
207 
208 int
main(int,char **)209 main(int, char**)
210 {
211 	NetworkStatus app;
212 	app.Run();
213 
214 	return 0;
215 }
216 
217