xref: /haiku/src/apps/haikudepot/server/ServerHelper.cpp (revision 54312619ab0d6bdebdb2426f6cfe275e2afa0fd6)
1*54312619SAndrew Lindesay /*
2*54312619SAndrew Lindesay  * Copyright 2017-2018, Andrew Lindesay <apl@lindesay.co.nz>.
3*54312619SAndrew Lindesay  * All rights reserved. Distributed under the terms of the MIT License.
4*54312619SAndrew Lindesay  */
5*54312619SAndrew Lindesay 
6*54312619SAndrew Lindesay #include "ServerHelper.h"
7*54312619SAndrew Lindesay 
8*54312619SAndrew Lindesay #include <stdio.h>
9*54312619SAndrew Lindesay #include <stdlib.h>
10*54312619SAndrew Lindesay 
11*54312619SAndrew Lindesay #include <Alert.h>
12*54312619SAndrew Lindesay #include <Application.h>
13*54312619SAndrew Lindesay #include <Catalog.h>
14*54312619SAndrew Lindesay #include <NetworkInterface.h>
15*54312619SAndrew Lindesay #include <NetworkRoster.h>
16*54312619SAndrew Lindesay 
17*54312619SAndrew Lindesay #include "HaikuDepotConstants.h"
18*54312619SAndrew Lindesay #include "ServerSettings.h"
19*54312619SAndrew Lindesay 
20*54312619SAndrew Lindesay 
21*54312619SAndrew Lindesay #undef B_TRANSLATION_CONTEXT
22*54312619SAndrew Lindesay #define B_TRANSLATION_CONTEXT "ServerHelper"
23*54312619SAndrew Lindesay #define KEY_MSG_MINIMUM_VERSION "minimumVersion"
24*54312619SAndrew Lindesay #define KEY_HEADER_MINIMUM_VERSION "X-Desktop-Application-Minimum-Version"
25*54312619SAndrew Lindesay 
26*54312619SAndrew Lindesay 
27*54312619SAndrew Lindesay void
28*54312619SAndrew Lindesay ServerHelper::NotifyClientTooOld(const BHttpHeaders& responseHeaders)
29*54312619SAndrew Lindesay {
30*54312619SAndrew Lindesay 	if (!ServerSettings::IsClientTooOld()) {
31*54312619SAndrew Lindesay 		ServerSettings::SetClientTooOld();
32*54312619SAndrew Lindesay 
33*54312619SAndrew Lindesay 		const char* minimumVersionC = responseHeaders[KEY_HEADER_MINIMUM_VERSION];
34*54312619SAndrew Lindesay 		BMessage message(MSG_CLIENT_TOO_OLD);
35*54312619SAndrew Lindesay 
36*54312619SAndrew Lindesay 		if (minimumVersionC != NULL && strlen(minimumVersionC) != 0) {
37*54312619SAndrew Lindesay 			message.AddString(KEY_MSG_MINIMUM_VERSION, minimumVersionC);
38*54312619SAndrew Lindesay 		}
39*54312619SAndrew Lindesay 
40*54312619SAndrew Lindesay 		be_app->PostMessage(&message);
41*54312619SAndrew Lindesay 	}
42*54312619SAndrew Lindesay }
43*54312619SAndrew Lindesay 
44*54312619SAndrew Lindesay 
45*54312619SAndrew Lindesay void
46*54312619SAndrew Lindesay ServerHelper::AlertClientTooOld(BMessage* message)
47*54312619SAndrew Lindesay {
48*54312619SAndrew Lindesay 	BString minimumVersion;
49*54312619SAndrew Lindesay 	BString alertText;
50*54312619SAndrew Lindesay 
51*54312619SAndrew Lindesay 	if (message->FindString(KEY_MSG_MINIMUM_VERSION, &minimumVersion) != B_OK)
52*54312619SAndrew Lindesay 		minimumVersion = "???";
53*54312619SAndrew Lindesay 
54*54312619SAndrew Lindesay 	alertText.SetToFormat(
55*54312619SAndrew Lindesay 		B_TRANSLATE("This application is too old to communicate with the "
56*54312619SAndrew Lindesay 			" HaikuDepot server system.  Obtain a newer version of HaikuDepot "
57*54312619SAndrew Lindesay 			" by updating your Haiku system.  The minimum version of "
58*54312619SAndrew Lindesay 			" HaikuDepot required is \"%s\"."), minimumVersion.String());
59*54312619SAndrew Lindesay 
60*54312619SAndrew Lindesay 	BAlert* alert = new BAlert(
61*54312619SAndrew Lindesay 		B_TRANSLATE("client_version_too_old"),
62*54312619SAndrew Lindesay 		alertText,
63*54312619SAndrew Lindesay 		B_TRANSLATE("OK"));
64*54312619SAndrew Lindesay 
65*54312619SAndrew Lindesay 	alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
66*54312619SAndrew Lindesay 	alert->Go();
67*54312619SAndrew Lindesay }
68*54312619SAndrew Lindesay 
69*54312619SAndrew Lindesay 
70*54312619SAndrew Lindesay bool
71*54312619SAndrew Lindesay ServerHelper::IsNetworkAvailable()
72*54312619SAndrew Lindesay {
73*54312619SAndrew Lindesay 	return !ServerSettings::ForceNoNetwork() && IsPlatformNetworkAvailable();
74*54312619SAndrew Lindesay }
75*54312619SAndrew Lindesay 
76*54312619SAndrew Lindesay 
77*54312619SAndrew Lindesay bool
78*54312619SAndrew Lindesay ServerHelper::IsPlatformNetworkAvailable()
79*54312619SAndrew Lindesay {
80*54312619SAndrew Lindesay 	BNetworkRoster& roster = BNetworkRoster::Default();
81*54312619SAndrew Lindesay 	BNetworkInterface interface;
82*54312619SAndrew Lindesay 	uint32 cookie = 0;
83*54312619SAndrew Lindesay 	while (roster.GetNextInterface(&cookie, interface) == B_OK) {
84*54312619SAndrew Lindesay 		uint32 flags = interface.Flags();
85*54312619SAndrew Lindesay 		if ((flags & IFF_LOOPBACK) == 0
86*54312619SAndrew Lindesay 			&& (flags & (IFF_UP | IFF_LINK)) == (IFF_UP | IFF_LINK)) {
87*54312619SAndrew Lindesay 			return true;
88*54312619SAndrew Lindesay 		}
89*54312619SAndrew Lindesay 	}
90*54312619SAndrew Lindesay 
91*54312619SAndrew Lindesay 	return false;
92*54312619SAndrew Lindesay }
93