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