From 6bdee2a765b760526c5ff886eff1c5b9ac9feb7a Mon Sep 17 00:00:00 2001
From: Rodrigo Braz Monteiro <zeratul@cellosoft.com>
Date: Fri, 7 Mar 2008 00:47:57 +0000
Subject: [PATCH] Originally committed to SVN as r1945.

---
 aegisub/Makefile.am                        |  1 +
 aegisub/audio_player.cpp                   |  8 +--
 aegisub/audio_player.h                     |  2 +-
 aegisub/audio_provider.cpp                 |  6 --
 aegisub/main.cpp                           | 16 +++--
 aegisub/main.h                             |  3 +
 aegisub/plugin_manager.cpp                 | 71 ++++++++++++++++++++++
 aegisub/plugin_manager.h                   | 51 ++++++++++++++++
 aegisub/subtitles_provider.cpp             |  6 --
 aegisub/video_provider.cpp                 |  6 --
 build/aegisub_vs2008/aegisub_vs2008.vcproj |  8 +++
 11 files changed, 147 insertions(+), 31 deletions(-)
 create mode 100644 aegisub/plugin_manager.cpp
 create mode 100644 aegisub/plugin_manager.h

diff --git a/aegisub/Makefile.am b/aegisub/Makefile.am
index 8ae3c2da4..f68c907ca 100644
--- a/aegisub/Makefile.am
+++ b/aegisub/Makefile.am
@@ -231,6 +231,7 @@ aegisub_SOURCES = \
 	mkv_wrap.cpp \
 	mythes.cxx \
 	options.cpp \
+	plugin_manager.cpp \
 	scintilla_text_ctrl.cpp \
 	spellchecker.cpp \
 	spline.cpp \
diff --git a/aegisub/audio_player.cpp b/aegisub/audio_player.cpp
index ea2f4b6f6..ec71f70f0 100644
--- a/aegisub/audio_player.cpp
+++ b/aegisub/audio_player.cpp
@@ -127,12 +127,6 @@ void AudioPlayer::OnStopAudio(wxCommandEvent &event) {
 //////////////
 // Get player
 AudioPlayer* AudioPlayerFactory::GetAudioPlayer() {
-	// Register factories
-	// HACK: fix me
-	static bool init = false;
-	if (!init) RegisterFactories();
-	init = true;
-
 	// List of providers
 	wxArrayString list = GetFactoryList(Options.AsText(_T("Audio player")));
 
@@ -158,7 +152,7 @@ AudioPlayer* AudioPlayerFactory::GetAudioPlayer() {
 
 //////////////////////////
 // Register all factories
-void AudioPlayerFactory::RegisterFactories() {
+void AudioPlayerFactory::RegisterProviders() {
 #ifdef WITH_ALSA
 	new AlsaPlayerFactory();
 #endif
diff --git a/aegisub/audio_player.h b/aegisub/audio_player.h
index 4190e4ee8..d9fe29a0b 100644
--- a/aegisub/audio_player.h
+++ b/aegisub/audio_player.h
@@ -104,7 +104,7 @@ protected:
 public:
 	virtual ~AudioPlayerFactory() {}
 	static AudioPlayer *GetAudioPlayer();
-	static void RegisterFactories();
+	static void RegisterProviders();
 };
 
 
diff --git a/aegisub/audio_provider.cpp b/aegisub/audio_provider.cpp
index 500baafb3..15e76c29d 100644
--- a/aegisub/audio_provider.cpp
+++ b/aegisub/audio_provider.cpp
@@ -192,12 +192,6 @@ void AudioProvider::GetAudioWithVolume(void *buf, int64_t start, int64_t count,
 ////////////////
 // Get provider
 AudioProvider *AudioProviderFactory::GetAudioProvider(wxString filename, int cache) {
-	// Initialize providers
-	// HACK: fixme
-	static bool init = false;
-	if (!init) RegisterProviders();
-	init = true;
-
 	// Prepare provider
 	AudioProvider *provider = NULL;
 
diff --git a/aegisub/main.cpp b/aegisub/main.cpp
index ab78a5052..3eb2400ac 100644
--- a/aegisub/main.cpp
+++ b/aegisub/main.cpp
@@ -65,6 +65,7 @@
 #include "auto4_base.h"
 #endif
 #include "version.h"
+#include "plugin_manager.h"
 
 
 ///////////////////
@@ -156,11 +157,9 @@ bool AegisubApp::OnInit() {
 		locale.Init(wxLANGUAGE_DEFAULT);
 #endif
 
-		// Set association
-#ifndef _DEBUG
-		StartupLog(_T("Install file type associations"));
-		RegistryAssociate();
-#endif
+		// Load plugins
+		plugins = new PluginManager();
+		plugins->RegisterBuiltInPlugins();
 
 		// Load Automation scripts
 #ifdef WITH_AUTOMATION
@@ -172,6 +171,12 @@ bool AegisubApp::OnInit() {
 		StartupLog(_T("Prepare export filters"));
 		AssExportFilterChain::PrepareFilters();
 
+		// Set association
+#ifndef _DEBUG
+		StartupLog(_T("Install file type associations"));
+		RegistryAssociate();
+#endif
+
 		// Get parameter subs
 		StartupLog(_T("Parse command line"));
 		wxArrayString subs;
@@ -205,6 +210,7 @@ bool AegisubApp::OnInit() {
 int AegisubApp::OnExit() {
 	SubtitleFormat::DestroyFormats();
 	VideoContext::Clear();
+	delete plugins;
 	Options.Clear();
 #ifdef WITH_AUTOMATION
 	delete global_scripts;
diff --git a/aegisub/main.h b/aegisub/main.h
index fa8da8744..94722ca6e 100644
--- a/aegisub/main.h
+++ b/aegisub/main.h
@@ -51,6 +51,7 @@
 //////////////
 // Prototypes
 class FrameMain;
+class PluginManager;
 namespace Automation4 { class AutoloadScriptManager; }
 
 
@@ -58,6 +59,8 @@ namespace Automation4 { class AutoloadScriptManager; }
 // Application class definition
 class AegisubApp: public wxApp {
 private:
+	PluginManager *plugins;
+
 	void OnMouseWheel(wxMouseEvent &event);
 	void OnKey(wxKeyEvent &key);
 
diff --git a/aegisub/plugin_manager.cpp b/aegisub/plugin_manager.cpp
new file mode 100644
index 000000000..20aafe946
--- /dev/null
+++ b/aegisub/plugin_manager.cpp
@@ -0,0 +1,71 @@
+// Copyright (c) 2008, Rodrigo Braz Monteiro
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//   * Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//   * Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//   * Neither the name of the Aegisub Group nor the names of its contributors
+//     may be used to endorse or promote products derived from this software
+//     without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// -----------------------------------------------------------------------------
+//
+// AEGISUB
+//
+// Website: http://aegisub.cellosoft.com
+// Contact: mailto:zeratul@cellosoft.com
+//
+
+
+///////////
+// Headers
+#include "plugin_manager.h"
+#include "video_provider.h"
+#include "audio_provider.h"
+#include "audio_player.h"
+#include "subtitles_provider.h"
+
+
+///////////////
+// Constructor
+PluginManager::PluginManager() {
+	init = false;
+}
+
+
+//////////////
+// Destructor
+PluginManager::~PluginManager() {
+}
+
+
+//////////////////////////////////
+// Registers all built-in plugins
+void PluginManager::RegisterBuiltInPlugins() {
+	if (!init) {
+		VideoProviderFactory::RegisterProviders();
+		AudioProviderFactory::RegisterProviders();
+		AudioPlayerFactory::RegisterProviders();
+		SubtitlesProviderFactory::RegisterProviders();
+	}
+
+	// Done
+	init = true;
+}
diff --git a/aegisub/plugin_manager.h b/aegisub/plugin_manager.h
new file mode 100644
index 000000000..74b994c87
--- /dev/null
+++ b/aegisub/plugin_manager.h
@@ -0,0 +1,51 @@
+// Copyright (c) 2008, Rodrigo Braz Monteiro
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//   * Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//   * Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//   * Neither the name of the Aegisub Group nor the names of its contributors
+//     may be used to endorse or promote products derived from this software
+//     without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// -----------------------------------------------------------------------------
+//
+// AEGISUB
+//
+// Website: http://aegisub.cellosoft.com
+// Contact: mailto:zeratul@cellosoft.com
+//
+
+
+#pragma once
+
+
+////////////////////////
+// Plugin manager class
+class PluginManager {
+private:
+	bool init;
+
+public:
+	PluginManager();
+	~PluginManager();
+
+	void RegisterBuiltInPlugins();
+};
diff --git a/aegisub/subtitles_provider.cpp b/aegisub/subtitles_provider.cpp
index fa71a6044..59792158e 100644
--- a/aegisub/subtitles_provider.cpp
+++ b/aegisub/subtitles_provider.cpp
@@ -66,12 +66,6 @@ bool SubtitlesProviderFactory::ProviderAvailable() {
 ////////////////
 // Get provider
 SubtitlesProvider* SubtitlesProviderFactory::GetProvider() {
-	// Register them
-	// HACK: fix me
-	static bool init = false;
-	if (!init) RegisterProviders();
-	init = true;
-
 	// List of providers
 	wxArrayString list = GetFactoryList(Options.AsText(_T("Subtitles provider")));
 
diff --git a/aegisub/video_provider.cpp b/aegisub/video_provider.cpp
index e0bcd1200..92486d464 100644
--- a/aegisub/video_provider.cpp
+++ b/aegisub/video_provider.cpp
@@ -61,12 +61,6 @@ VideoProvider *VideoProviderFactory::GetProvider(wxString video,double fps) {
 		return new DummyVideoProvider(video, fps);
 	}
 
-	// Register the first time
-	// HACK: move this into program initialization later
-	static bool init = false;
-	if (!init) RegisterProviders();
-	init = true;
-
 	// List of providers
 	wxArrayString list = GetFactoryList(Options.AsText(_T("Video provider")));
 
diff --git a/build/aegisub_vs2008/aegisub_vs2008.vcproj b/build/aegisub_vs2008/aegisub_vs2008.vcproj
index d08d6f47e..a284007a6 100644
--- a/build/aegisub_vs2008/aegisub_vs2008.vcproj
+++ b/build/aegisub_vs2008/aegisub_vs2008.vcproj
@@ -1444,6 +1444,14 @@
 				RelativePath="..\..\aegisub\options.h"
 				>
 			</File>
+			<File
+				RelativePath="..\..\aegisub\plugin_manager.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\aegisub\plugin_manager.h"
+				>
+			</File>
 			<File
 				RelativePath="..\..\aegisub\setup.cpp"
 				>
-- 
GitLab