Index: src/Platform.cpp |
diff --git a/src/Platform.cpp b/src/Platform.cpp |
index 0e80c142086086fe21e9b78123a1d04e7c8809fa..35859444a8db9ae5e5899b9ef82d7ec5bcf7f217 100644 |
--- a/src/Platform.cpp |
+++ b/src/Platform.cpp |
@@ -21,6 +21,7 @@ |
#include "DefaultTimer.h" |
#include "DefaultWebRequest.h" |
#include "DefaultFileSystem.h" |
+#include <stdexcept> |
using namespace AdblockPlus; |
@@ -30,36 +31,23 @@ namespace |
{ |
std::thread(task).detach(); |
} |
-} |
-TimerPtr AdblockPlus::CreateDefaultTimer() |
-{ |
- return TimerPtr(new DefaultTimer()); |
-} |
- |
-FileSystemPtr AdblockPlus::CreateDefaultFileSystem(const Scheduler& scheduler, const std::string& basePath) |
-{ |
- return FileSystemPtr(new DefaultFileSystem(scheduler, std::unique_ptr<DefaultFileSystemSync>(new DefaultFileSystemSync(basePath)))); |
-} |
- |
-WebRequestPtr AdblockPlus::CreateDefaultWebRequest(const Scheduler& scheduler, WebRequestSyncPtr syncImpl) |
-{ |
- if (!syncImpl) |
- syncImpl.reset(new DefaultWebRequestSync()); |
- return WebRequestPtr(new DefaultWebRequest(scheduler, std::move(syncImpl))); |
+ template<typename T> |
+ void ValidatePlatformCreationParameter(const std::unique_ptr<T>& param, const char* paramName) |
+ { |
+ if (!param) |
+ throw std::logic_error(paramName + std::string(" must not be nullptr")); |
+ } |
} |
-LogSystemPtr AdblockPlus::CreateDefaultLogSystem() |
-{ |
- return LogSystemPtr(new DefaultLogSystem()); |
-} |
+#define ASSIGN_PLATFORM_PARAM(param) ValidatePlatformCreationParameter(param = std::move(creationParameters.param), #param) |
Platform::Platform(CreationParameters&& creationParameters) |
{ |
- logSystem = creationParameters.logSystem ? std::move(creationParameters.logSystem) : CreateDefaultLogSystem(); |
- timer = creationParameters.timer ? std::move(creationParameters.timer) : CreateDefaultTimer(); |
- fileSystem = creationParameters.fileSystem ? std::move(creationParameters.fileSystem) : CreateDefaultFileSystem(::DummyScheduler); |
- webRequest = creationParameters.webRequest ? std::move(creationParameters.webRequest) : CreateDefaultWebRequest(::DummyScheduler); |
+ ASSIGN_PLATFORM_PARAM(logSystem); |
+ ASSIGN_PLATFORM_PARAM(timer); |
+ ASSIGN_PLATFORM_PARAM(fileSystem); |
+ ASSIGN_PLATFORM_PARAM(webRequest); |
} |
Platform::~Platform() |
@@ -125,4 +113,78 @@ IWebRequest& Platform::GetWebRequest() |
LogSystem& Platform::GetLogSystem() |
{ |
return *logSystem; |
+} |
+ |
+namespace |
+{ |
+ class DefaultPlatform : public Platform |
+ { |
+ public: |
+ typedef std::shared_ptr<Scheduler> AsyncExecutorPtr; |
+ explicit DefaultPlatform(const AsyncExecutorPtr& asyncExecutor, CreationParameters&& creationParams) |
+ : Platform(std::move(creationParams)), asyncExecutor(asyncExecutor) |
+ { |
+ } |
+ ~DefaultPlatform() |
+ { |
+ asyncExecutor.reset(); |
sergei
2017/09/04 12:16:27
While the actual executor is not ready yet (https:
|
+ } |
+ private: |
+ AsyncExecutorPtr asyncExecutor; |
+ }; |
+} |
+ |
+Scheduler DefaultPlatformBuilder::GetDefaultAsyncExecutor() |
+{ |
+ if (!defaultScheduler) |
+ { |
+ asyncExecutor = std::make_shared<Scheduler>(::DummyScheduler); |
+ std::weak_ptr<Scheduler> weakExecutor = asyncExecutor; |
+ defaultScheduler = [weakExecutor](const SchedulerTask& task) |
+ { |
+ if (auto executor = weakExecutor.lock()) |
+ { |
+ (*executor)(task); |
+ } |
+ }; |
+ } |
+ return defaultScheduler; |
+} |
+ |
+void DefaultPlatformBuilder::CreateDefaultTimer() |
+{ |
+ timer.reset(new DefaultTimer()); |
+} |
+ |
+void DefaultPlatformBuilder::CreateDefaultFileSystem(const std::string& basePath) |
+{ |
+ fileSystem.reset(new DefaultFileSystem(GetDefaultAsyncExecutor(), std::unique_ptr<DefaultFileSystemSync>(new DefaultFileSystemSync(basePath)))); |
+} |
+ |
+void DefaultPlatformBuilder::CreateDefaultWebRequest(std::unique_ptr<IWebRequestSync> webRequest) |
+{ |
+ if (!webRequest) |
+ webRequest.reset(new DefaultWebRequestSync()); |
+ this->webRequest.reset(new DefaultWebRequest(GetDefaultAsyncExecutor(), std::move(webRequest))); |
+} |
+ |
+void DefaultPlatformBuilder::CreateDefaultLogSystem() |
+{ |
+ logSystem.reset(new DefaultLogSystem()); |
+} |
+ |
+std::unique_ptr<Platform> DefaultPlatformBuilder::CreatePlatform() |
+{ |
+ if (!logSystem) |
+ CreateDefaultLogSystem(); |
+ if (!timer) |
+ CreateDefaultTimer(); |
+ if (!fileSystem) |
+ CreateDefaultFileSystem(); |
+ if (!webRequest) |
+ CreateDefaultWebRequest(); |
+ |
+ std::unique_ptr<Platform> platform(new DefaultPlatform(asyncExecutor, std::move(*this))); |
+ asyncExecutor.reset(); |
sergei
2017/09/04 12:16:27
This `reset` is merely to ensure that async execut
|
+ return platform; |
} |