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
30class 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
46const char* kSignature = "application/x-vnd.Haiku-NetworkStatus";
47const char* kDeskbarSignature = "application/x-vnd.Be-TSKB";
48const char* kDeskbarItemName = "NetworkStatus";
49
50
51status_t
52our_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
68NetworkStatus::NetworkStatus()
69	:
70	BApplication(kSignature),
71	fAutoInstallInDeskbar(false),
72	fQuitImmediately(false)
73{
74}
75
76
77NetworkStatus::~NetworkStatus()
78{
79}
80
81
82void
83NetworkStatus::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\n");
93		printf(str);
94		fQuitImmediately = true;
95		return;
96	}
97
98	if (strcmp(argv[1], "--deskbar") == 0)
99		fAutoInstallInDeskbar = true;
100}
101
102
103void
104NetworkStatus::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			printf("Deskbar is not running, giving up.\n");
146			Quit();
147			return;
148		}
149
150		_InstallReplicantInDeskbar();
151		return;
152	}
153
154	if (isDeskbarRunning && !isInstalled) {
155		BAlert* alert = new BAlert("", B_TRANSLATE("You can run NetworkStatus "
156			"in a window or install it in the Deskbar."),
157			B_TRANSLATE("Run in window"), B_TRANSLATE("Install in Deskbar"),
158			NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
159
160		if (alert->Go() == 1) {
161			_InstallReplicantInDeskbar();
162			return;
163		}
164	}
165
166	BWindow* window = new NetworkStatusWindow();
167	window->Show();
168}
169
170
171void
172NetworkStatus::AboutRequested()
173{
174	BWindow* window = WindowAt(0);
175	if (window == NULL)
176		return;
177
178	BView* view = window->FindView(kDeskbarItemName);
179	if (view == NULL)
180		return;
181
182	BMessenger target((BHandler*)view);
183	BMessage about(B_ABOUT_REQUESTED);
184	target.SendMessage(&about);
185}
186
187
188void
189NetworkStatus::_InstallReplicantInDeskbar()
190{
191	image_info info;
192	entry_ref ref;
193
194	if (our_image(info) == B_OK
195		&& get_ref_for_path(info.name, &ref) == B_OK) {
196		BDeskbar deskbar;
197		deskbar.AddItem(&ref);
198	}
199
200	Quit();
201}
202
203
204//	#pragma mark -
205
206
207int
208main(int, char**)
209{
210	NetworkStatus app;
211	app.Run();
212
213	return 0;
214}
215
216