diff --git a/headers/private/storage/AddOnMonitorHandler.h b/headers/private/storage/AddOnMonitorHandler.h index ae03bd7d72..7cdd835ddd 100644 --- a/headers/private/storage/AddOnMonitorHandler.h +++ b/headers/private/storage/AddOnMonitorHandler.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2010, Haiku, Inc. All rights reserved. + * Copyright 2004-2013, Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef _ADD_ON_MONITOR_HANDLER_H @@ -45,6 +45,8 @@ public: virtual status_t AddDirectory(const node_ref* nref, bool sync = false); + status_t AddAddOnDirectories(const char* leafPath = ""); + protected: // hooks for sub-class virtual void AddOnCreated( diff --git a/src/kits/storage/AddOnMonitorHandler.cpp b/src/kits/storage/AddOnMonitorHandler.cpp index 24b6b882fe..377113596e 100644 --- a/src/kits/storage/AddOnMonitorHandler.cpp +++ b/src/kits/storage/AddOnMonitorHandler.cpp @@ -1,10 +1,11 @@ /* - * Copyright 2004-2010, Haiku, Inc. All rights reserved. + * Copyright 2004-2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: + * Stephan Aßmus, superstippi@gmx.de * Andrew Bachmann - * Stephan Aßmus + * John Scipione, jscipione@gmail.com */ @@ -14,6 +15,12 @@ #include #include +#include +#include + +#include +#include +#include #ifndef ADD_ON_STABLE_SECONDS @@ -105,6 +112,59 @@ AddOnMonitorHandler::AddDirectory(const node_ref* nref, bool sync) } +status_t +AddOnMonitorHandler::AddAddOnDirectories(const char* leafPath) +{ + char parameter[32]; + size_t parameterLength = sizeof(parameter); + uint32 start = 0; + + const directory_which addOnDirectories[] = { + B_USER_NONPACKAGED_ADDONS_DIRECTORY, + B_USER_ADDONS_DIRECTORY, + B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY, + B_SYSTEM_ADDONS_DIRECTORY + }; + + if (_kern_get_safemode_option(B_SAFEMODE_DISABLE_USER_ADD_ONS, parameter, + ¶meterLength) == B_OK) { + if (!strcasecmp(parameter, "enabled") || !strcasecmp(parameter, "on") + || !strcasecmp(parameter, "true") || !strcasecmp(parameter, "yes") + || !strcasecmp(parameter, "enable") || !strcmp(parameter, "1")) { + // skip user add on directories + start = 2; + } + } + + if (_kern_get_safemode_option(B_SAFEMODE_SAFE_MODE, parameter, + ¶meterLength) == B_OK) { + if (!strcasecmp(parameter, "enabled") || !strcasecmp(parameter, "on") + || !strcasecmp(parameter, "true") || !strcasecmp(parameter, "yes") + || !strcasecmp(parameter, "enable") || !strcmp(parameter, "1")) { + // safe mode, only B_SYSTEM_ADDONS_DIRECTORY is used + start = 3; + } + } + + for (uint32 i = start; + i < sizeof(addOnDirectories) / sizeof(directory_which); i++) { + BDirectory directory; + node_ref nodeRef; + BPath path; + if (find_directory(addOnDirectories[i], &path) == B_OK + && path.Append(leafPath) == B_OK + && directory.SetTo(path.Path()) == B_OK + && directory.GetNodeRef(&nodeRef) == B_OK) { + status_t result = this->AddDirectory(&nodeRef); + if (result != B_OK) + return result; + } + } + + return B_OK; +} + + // #pragma mark - AddOnMonitorHandler hooks diff --git a/src/servers/index/IndexServer.cpp b/src/servers/index/IndexServer.cpp index 515e99975e..9270609fe1 100644 --- a/src/servers/index/IndexServer.cpp +++ b/src/servers/index/IndexServer.cpp @@ -1,21 +1,18 @@ /* - * Copyright 2010, Haiku. + * Copyright 2010-2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: - * Clemens Zeidler + * John Scipione, jscipione@gmail.com + * Clemens Zeidler, haiku@clemens-zeidler.de */ + #include "IndexServer.h" -#include -#include -#include #include #include -#include - VolumeObserverHandler::VolumeObserverHandler(IndexServer* indexServer) : @@ -315,41 +312,12 @@ void IndexServer::_StartWatchingAddOns() { AddHandler(&fAddOnMonitorHandler); + BMessage pulse(B_PULSE); fPulseRunner = new BMessageRunner(&fAddOnMonitorHandler, &pulse, 1000000LL); // the monitor handler needs a pulse to check if add-ons are ready - char parameter[32]; - size_t parameterLength = sizeof(parameter); - bool safeMode = false; - if (_kern_get_safemode_option(B_SAFEMODE_SAFE_MODE, parameter, - ¶meterLength) == B_OK) { - if (!strcasecmp(parameter, "enabled") || !strcasecmp(parameter, "on") - || !strcasecmp(parameter, "true") || !strcasecmp(parameter, "yes") - || !strcasecmp(parameter, "enable") || !strcmp(parameter, "1")) - safeMode = true; - } - - // load dormant media nodes - const directory_which directories[] = { - B_USER_NONPACKAGED_ADDONS_DIRECTORY, - B_USER_ADDONS_DIRECTORY, - B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY, - B_SYSTEM_ADDONS_DIRECTORY - }; - - // when safemode, only B_SYSTEM_ADDONS_DIRECTORY is used - for (uint32 i = safeMode ? 3 : 0; - i < sizeof(directories) / sizeof(directory_which); i++) { - BDirectory directory; - node_ref nodeRef; - BPath path; - if (find_directory(directories[i], &path) == B_OK - && path.Append("index_server") == B_OK - && directory.SetTo(path.Path()) == B_OK - && directory.GetNodeRef(&nodeRef) == B_OK) - fAddOnMonitorHandler.AddDirectory(&nodeRef, true); - } + &fAddOnMonitorHandler->AddAddOnDirectories("index_server"); } diff --git a/src/servers/input/AddOnManager.cpp b/src/servers/input/AddOnManager.cpp index 2f779c1484..eeb3248bc3 100644 --- a/src/servers/input/AddOnManager.cpp +++ b/src/servers/input/AddOnManager.cpp @@ -1,11 +1,12 @@ /* - * Copyright 2004-2010, Haiku, Inc. All rights reserved. + * Copyright 2004-2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: - * Marcus Overhagen * Axel Dörfler, axeld@pinc-software.de * Jérôme Duval + * Marcus Overhagen + * John Scipione, jscipione@gmail.com */ @@ -21,7 +22,6 @@ #include #include #include -#include #include #include #include @@ -118,14 +118,13 @@ instantiate_add_on(image_id image, const char* path, const char* type) } -// #pragma mark - +// #pragma mark - AddOnManager -AddOnManager::AddOnManager(bool safeMode) +AddOnManager::AddOnManager() : AddOnMonitor(), - fHandler(new(std::nothrow) MonitorHandler(this)), - fSafeMode(safeMode) + fHandler(new(std::nothrow) MonitorHandler(this)) { SetHandler(fHandler); } @@ -259,34 +258,9 @@ AddOnManager::_RegisterAddOns() CALLED(); BAutolock locker(this); - const directory_which directories[] = { - B_USER_NONPACKAGED_ADDONS_DIRECTORY, - B_USER_ADDONS_DIRECTORY, - B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY, - B_SYSTEM_ADDONS_DIRECTORY - }; - const char* subDirectories[] = { - "input_server/devices", - "input_server/filters", - "input_server/methods" - }; - int32 subDirectoryCount = sizeof(subDirectories) / sizeof(const char*); - - node_ref nref; - BDirectory directory; - BPath path; - // when safemode, only B_SYSTEM_ADDONS_DIRECTORY is used - for (uint32 i = fSafeMode ? 2 : 0; - i < sizeof(directories) / sizeof(directory_which); i++) { - for (int32 j = 0; j < subDirectoryCount; j++) { - if (find_directory(directories[i], &path) == B_OK - && path.Append(subDirectories[j]) == B_OK - && directory.SetTo(path.Path()) == B_OK - && directory.GetNodeRef(&nref) == B_OK) { - fHandler->AddDirectory(&nref); - } - } - } + fHandler->AddAddOnDirectories("input_server/devices"); + fHandler->AddAddOnDirectories("input_server/filters"); + fHandler->AddAddOnDirectories("input_server/methods"); } diff --git a/src/servers/input/AddOnManager.h b/src/servers/input/AddOnManager.h index 7e7fcd631b..38b74a1d44 100644 --- a/src/servers/input/AddOnManager.h +++ b/src/servers/input/AddOnManager.h @@ -1,11 +1,12 @@ /* - * Copyright 2004-2010, Haiku, Inc. All rights reserved. + * Copyright 2004-2013, Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: - * Marcus Overhagen * Axel Dörfler, axeld@pinc-software.de * Jérôme Duval + * Marcus Overhagen + * John Scipione, jscipione@gmail.com */ #ifndef ADD_ON_MANAGER_H #define ADD_ON_MANAGER_H @@ -27,7 +28,7 @@ using namespace BPrivate; class AddOnManager : public AddOnMonitor { public: - AddOnManager(bool safeMode); + AddOnManager(); ~AddOnManager(); virtual void MessageReceived(BMessage* message); diff --git a/src/servers/input/InputServer.cpp b/src/servers/input/InputServer.cpp index 48ca839f1b..40ca36debe 100644 --- a/src/servers/input/InputServer.cpp +++ b/src/servers/input/InputServer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011, Haiku, Inc. All Rights Reserved. + * Copyright 2002-2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ @@ -9,6 +9,7 @@ #include "BottomlineWindow.h" #include "MethodReplicant.h" +#include #include #include @@ -20,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -138,8 +138,8 @@ InputDeviceListItem::Matches(const char* name, input_device_type type) const InputServer::InputServer() - : BApplication(INPUTSERVER_SIGNATURE), - fSafeMode(false), + : + BApplication(INPUTSERVER_SIGNATURE), fKeyboardID(0), fInputDeviceListLocker("input server device list"), fKeyboardSettings(), @@ -162,28 +162,9 @@ InputServer::InputServer() _StartEventLoop(); - char parameter[32]; - size_t parameterLength = sizeof(parameter); - - if (_kern_get_safemode_option(B_SAFEMODE_SAFE_MODE, parameter, - ¶meterLength) == B_OK) { - if (!strcasecmp(parameter, "enabled") || !strcasecmp(parameter, "on") - || !strcasecmp(parameter, "true") || !strcasecmp(parameter, "yes") - || !strcasecmp(parameter, "enable") || !strcmp(parameter, "1")) - fSafeMode = true; - } - - if (_kern_get_safemode_option(B_SAFEMODE_DISABLE_USER_ADD_ONS, parameter, - ¶meterLength) == B_OK) { - if (!strcasecmp(parameter, "enabled") || !strcasecmp(parameter, "on") - || !strcasecmp(parameter, "true") || !strcasecmp(parameter, "yes") - || !strcasecmp(parameter, "enable") || !strcmp(parameter, "1")) - fSafeMode = true; - } - _InitKeyboardMouseStates(); - fAddOnManager = new(std::nothrow) ::AddOnManager(SafeMode()); + fAddOnManager = new(std::nothrow) ::AddOnManager(); if (fAddOnManager != NULL) { // We need to Run() the AddOnManager looper after having loaded // the initial add-ons, otherwise we may deadlock when the looper @@ -1363,7 +1344,28 @@ InputServer::SetMousePos(long *, long *, float, float) bool InputServer::SafeMode() { - return fSafeMode; + char parameter[32]; + size_t parameterLength = sizeof(parameter); + + if (_kern_get_safemode_option(B_SAFEMODE_SAFE_MODE, parameter, + ¶meterLength) == B_OK) { + if (!strcasecmp(parameter, "enabled") || !strcasecmp(parameter, "on") + || !strcasecmp(parameter, "true") || !strcasecmp(parameter, "yes") + || !strcasecmp(parameter, "enable") || !strcmp(parameter, "1")) { + return true; + } + } + + if (_kern_get_safemode_option(B_SAFEMODE_DISABLE_USER_ADD_ONS, parameter, + ¶meterLength) == B_OK) { + if (!strcasecmp(parameter, "enabled") || !strcasecmp(parameter, "on") + || !strcasecmp(parameter, "true") || !strcasecmp(parameter, "yes") + || !strcasecmp(parameter, "enable") || !strcmp(parameter, "1")) { + return true; + } + } + + return false; } diff --git a/src/servers/input/InputServer.h b/src/servers/input/InputServer.h index 43f540c986..cff913d767 100644 --- a/src/servers/input/InputServer.h +++ b/src/servers/input/InputServer.h @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008, Haiku, Inc. All Rights Reserved. + * Copyright 2001-2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef INPUT_SERVER_APP_H @@ -211,7 +211,6 @@ class InputServer : public BApplication { void _ReleaseInput(BMessage* message); private: - bool fSafeMode; uint16 fKeyboardID; BList fInputDeviceList; diff --git a/src/servers/media_addon/MediaAddonServer.cpp b/src/servers/media_addon/MediaAddonServer.cpp index 2b7f6e611a..ddf6a36ded 100644 --- a/src/servers/media_addon/MediaAddonServer.cpp +++ b/src/servers/media_addon/MediaAddonServer.cpp @@ -1,5 +1,6 @@ /* * Copyright 2009, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ @@ -37,9 +38,7 @@ #include #include #include -#include #include -#include #include #include #include @@ -47,9 +46,6 @@ #include #include -#include -#include - #include #include #include @@ -274,17 +270,6 @@ MediaAddonServer::ReadyToRun() // will be autostarted. Finally, add-ons that don't have // any active nodes (flavors) will be unloaded. - char parameter[32]; - size_t parameterLength = sizeof(parameter); - bool safeMode = false; - if (_kern_get_safemode_option(B_SAFEMODE_SAFE_MODE, parameter, - ¶meterLength) == B_OK) { - if (!strcasecmp(parameter, "enabled") || !strcasecmp(parameter, "on") - || !strcasecmp(parameter, "true") || !strcasecmp(parameter, "yes") - || !strcasecmp(parameter, "enable") || !strcmp(parameter, "1")) - safeMode = true; - } - fMonitorHandler = new MonitorHandler(this); AddHandler(fMonitorHandler); @@ -292,32 +277,14 @@ MediaAddonServer::ReadyToRun() fPulseRunner = new BMessageRunner(fMonitorHandler, &pulse, 1000000LL); // the monitor handler needs a pulse to check if add-ons are ready - // load dormant media nodes - const directory_which directories[] = { - B_USER_NONPACKAGED_ADDONS_DIRECTORY, - B_USER_ADDONS_DIRECTORY, - B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY, - B_SYSTEM_ADDONS_DIRECTORY - }; - - // when safemode, only B_SYSTEM_ADDONS_DIRECTORY is used - for (uint32 i = safeMode ? 3 : 0; - i < sizeof(directories) / sizeof(directory_which); i++) { - BDirectory directory; - node_ref nodeRef; - BPath path; - if (find_directory(directories[i], &path) == B_OK - && path.Append("media") == B_OK - && directory.SetTo(path.Path()) == B_OK - && directory.GetNodeRef(&nodeRef) == B_OK) - fMonitorHandler->AddDirectory(&nodeRef); - } + fMonitorHandler->AddAddOnDirectories("media"); #ifdef USER_ADDON_PATH node_ref nodeRef; if (entry.SetTo(USER_ADDON_PATH) == B_OK - && entry.GetNodeRef(&nodeRef) == B_OK) + && entry.GetNodeRef(&nodeRef) == B_OK) { fMonitorHandler->AddDirectory(&nodeRef); + } #endif fStartup = false;