From 6ae75ecafed3b06013b49fd30edd97ee2e040969 Mon Sep 17 00:00:00 2001
From: humbletim <humbletim@gmail.com>
Date: Thu, 25 Jul 2019 21:53:17 -0400
Subject: [PATCH] segregated scripting/ plugins (re: permissions checkbox)

---
 cmake/macros/SetupHifiClientServerPlugin.cmake  |  8 +++++++-
 libraries/plugins/src/plugins/PluginManager.cpp | 14 +++++++++++++-
 libraries/plugins/src/plugins/PluginManager.h   |  4 ++++
 plugins/KasenAPIExample/CMakeLists.txt          |  2 +-
 4 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/cmake/macros/SetupHifiClientServerPlugin.cmake b/cmake/macros/SetupHifiClientServerPlugin.cmake
index bc66484c30..1ce0b0ca6e 100644
--- a/cmake/macros/SetupHifiClientServerPlugin.cmake
+++ b/cmake/macros/SetupHifiClientServerPlugin.cmake
@@ -7,7 +7,8 @@
 #
 macro(SETUP_HIFI_CLIENT_SERVER_PLUGIN)
   set(${TARGET_NAME}_SHARED 1)
-  setup_hifi_library(${ARGV})
+  set(PLUGIN_SUBFOLDER ${ARGN})
+  setup_hifi_library()
 
   if (BUILD_CLIENT)
     add_dependencies(interface ${TARGET_NAME})
@@ -27,6 +28,11 @@ macro(SETUP_HIFI_CLIENT_SERVER_PLUGIN)
     set(SERVER_PLUGIN_PATH "plugins")
   endif()
 
+  if (PLUGIN_SUBFOLDER)
+      set(CLIENT_PLUGIN_PATH "${CLIENT_PLUGIN_PATH}/${PLUGIN_SUBFOLDER}")
+      set(SERVER_PLUGIN_PATH "${SERVER_PLUGIN_PATH}/${PLUGIN_SUBFOLDER}")
+  endif()
+
   if (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_GENERATOR STREQUAL "Unix Makefiles")
     set(CLIENT_PLUGIN_FULL_PATH "${CMAKE_BINARY_DIR}/interface/${CLIENT_PLUGIN_PATH}/")
     set(SERVER_PLUGIN_FULL_PATH "${CMAKE_BINARY_DIR}/assignment-client/${SERVER_PLUGIN_PATH}/")
diff --git a/libraries/plugins/src/plugins/PluginManager.cpp b/libraries/plugins/src/plugins/PluginManager.cpp
index 420842b453..8f1184904e 100644
--- a/libraries/plugins/src/plugins/PluginManager.cpp
+++ b/libraries/plugins/src/plugins/PluginManager.cpp
@@ -110,6 +110,16 @@ int PluginManager::instantiate() {
             pluginDir.setNameFilters(QStringList() << "libplugins_lib*.so");
 #endif
             auto candidates = pluginDir.entryList();
+
+            if (_enableScriptingPlugins.get()) {
+                QDir scriptingPluginDir{ pluginDir };
+                scriptingPluginDir.cd("scripting");
+                qCDebug(plugins) << "Loading scripting plugins from " << scriptingPluginDir.path();
+                for (auto plugin : scriptingPluginDir.entryList()) {
+                    candidates << "scripting/" + plugin;
+                }
+            }
+
             for (auto plugin : candidates) {
                 qCDebug(plugins) << "Attempting plugin" << qPrintable(plugin);
                 QSharedPointer<QPluginLoader> loader(new QPluginLoader(pluginPath + plugin));
@@ -144,7 +154,9 @@ int PluginManager::instantiate() {
                     qCDebug(plugins) << " " << qPrintable(loader->errorString());
                 }
             }
-        } else qWarning() << "pluginPath does not exit..." << pluginDir;
+        } else {
+            qWarning() << "pluginPath does not exit..." << pluginDir;
+        }
     });
     return loadedPlugins;
 }
diff --git a/libraries/plugins/src/plugins/PluginManager.h b/libraries/plugins/src/plugins/PluginManager.h
index e0d35a690d..eb377a2c8e 100644
--- a/libraries/plugins/src/plugins/PluginManager.h
+++ b/libraries/plugins/src/plugins/PluginManager.h
@@ -10,6 +10,7 @@
 #include <QObject>
 
 #include <DependencyManager.h>
+#include <SettingHandle.h>
 
 #include "Forward.h"
 
@@ -70,6 +71,9 @@ private:
     using LoaderList = QList<Loader>;
 
     const LoaderList& getLoadedPlugins() const;
+    Setting::Handle<bool> _enableScriptingPlugins {
+        "private/enableScriptingPlugins", (bool)qgetenv("enableScriptingPlugins").toInt()
+    };
 };
 
 // TODO: we should define this value in CMake, and then use CMake
diff --git a/plugins/KasenAPIExample/CMakeLists.txt b/plugins/KasenAPIExample/CMakeLists.txt
index 14e2dc0b3d..96ac84e10d 100644
--- a/plugins/KasenAPIExample/CMakeLists.txt
+++ b/plugins/KasenAPIExample/CMakeLists.txt
@@ -1,3 +1,3 @@
 set(TARGET_NAME KasenAPIExample)
-setup_hifi_client_server_plugin()
+setup_hifi_client_server_plugin(scripting)
 link_hifi_libraries(shared plugins avatars networking graphics gpu)