diff --git a/src/add-ons/network_settings/sshd/ServiceView.cpp b/src/add-ons/network_settings/sshd/ServiceView.cpp index 0da6335ea5..0c22f929b4 100644 --- a/src/add-ons/network_settings/sshd/ServiceView.cpp +++ b/src/add-ons/network_settings/sshd/ServiceView.cpp @@ -12,13 +12,15 @@ #include #include #include +#include #include #include -#include - static const uint32 kMsgToggleService = 'tgls'; +static const uint32 kMsgEnableToggleButton = 'entg'; + +static const bigtime_t kDisableDuration = 500000; #undef B_TRANSLATION_CONTEXT @@ -54,6 +56,8 @@ ServiceView::ServiceView(const char* name, const char* executable, SetExplicitMinSize(BSize(200, B_SIZE_UNSET)); _UpdateEnableButton(); + + fWasEnabled = IsEnabled(); } @@ -62,6 +66,21 @@ ServiceView::~ServiceView() } +bool +ServiceView::IsRevertable() +{ + return IsEnabled() != fWasEnabled; +} + + +void +ServiceView::Revert() +{ + if (IsRevertable()) + _Toggle(); +} + + void ServiceView::SettingsUpdated(uint32 which) { @@ -82,13 +101,14 @@ ServiceView::MessageReceived(BMessage* message) { switch (message->what) { case kMsgToggleService: - if (IsEnabled()) - Disable(); - else - Enable(); + _Toggle(); + break; + case kMsgEnableToggleButton: + fEnableButton->SetEnabled(true); _UpdateEnableButton(); break; + default: BView::MessageReceived(message); break; @@ -99,16 +119,7 @@ ServiceView::MessageReceived(BMessage* message) bool ServiceView::IsEnabled() const { - BMessage request(kMsgIsServiceRunning); - request.AddString("name", fName); - - BMessenger networkServer(kNetServerSignature); - BMessage reply; - status_t status = networkServer.SendMessage(&request, &reply); - if (status == B_OK) - return reply.GetBool("running"); - - return false; + return fSettings.Service(fName).IsRunning(); } @@ -132,6 +143,20 @@ ServiceView::Disable() } +void +ServiceView::_Toggle() +{ + if (IsEnabled()) + Disable(); + else + Enable(); + + fEnableButton->SetEnabled(false); + BMessage reenable(kMsgEnableToggleButton); + BMessageRunner::StartSending(this, &reenable, kDisableDuration, 1); +} + + void ServiceView::_UpdateEnableButton() { diff --git a/src/add-ons/network_settings/sshd/ServiceView.h b/src/add-ons/network_settings/sshd/ServiceView.h index 2143945247..d34dcd857a 100644 --- a/src/add-ons/network_settings/sshd/ServiceView.h +++ b/src/add-ons/network_settings/sshd/ServiceView.h @@ -26,6 +26,9 @@ public: BNetworkSettings& settings); virtual ~ServiceView(); + bool IsRevertable(); + void Revert(); + void SettingsUpdated(uint32 which); virtual void AttachedToWindow(); @@ -37,6 +40,7 @@ protected: virtual void Disable(); private: + void _Toggle(); void _UpdateEnableButton(); protected: @@ -44,6 +48,7 @@ protected: const char* fExecutable; BNetworkSettings& fSettings; BButton* fEnableButton; + bool fWasEnabled; };