aboutsummaryrefslogtreecommitdiff
path: root/src/zenhttp/transports
diff options
context:
space:
mode:
Diffstat (limited to 'src/zenhttp/transports')
-rw-r--r--src/zenhttp/transports/dlltransport.cpp44
-rw-r--r--src/zenhttp/transports/dlltransport.h1
2 files changed, 45 insertions, 0 deletions
diff --git a/src/zenhttp/transports/dlltransport.cpp b/src/zenhttp/transports/dlltransport.cpp
index e09e62ec5..91d27a49b 100644
--- a/src/zenhttp/transports/dlltransport.cpp
+++ b/src/zenhttp/transports/dlltransport.cpp
@@ -43,6 +43,7 @@ public:
virtual bool IsAvailable() override;
virtual void LoadDll(std::string_view Name) override;
+ virtual void LoadDll(std::string_view Name, std::string_view Path) override;
virtual void ConfigureDll(std::string_view Name, const char* OptionTag, const char* OptionValue) override;
private:
@@ -181,6 +182,49 @@ DllTransportPluginImpl::LoadDll(std::string_view Name)
m_Transports.emplace_back(std::move(NewDll));
}
+void
+DllTransportPluginImpl::LoadDll(std::string_view Name, std::string_view Path)
+{
+ RwLock::ExclusiveLockScope _(m_Lock);
+
+ ExtendableStringBuilder<256> DllPath;
+ DllPath << Path;
+ if (!Path.ends_with('\\'))
+ {
+ DllPath << '\\';
+ }
+ DllPath << Name << ".dll";
+
+ HMODULE DllHandle = LoadLibraryA(DllPath.c_str());
+
+ if (!DllHandle)
+ {
+ std::error_code Ec = MakeErrorCodeFromLastError();
+
+ throw std::system_error(Ec, fmt::format("failed to load transport DLL from '{}'", DllPath));
+ }
+
+ TransportPlugin* CreateTransportPlugin();
+
+ PfnCreateTransportPlugin CreatePlugin = (PfnCreateTransportPlugin)GetProcAddress(DllHandle, "CreateTransportPlugin");
+
+ if (!CreatePlugin)
+ {
+ std::error_code Ec = MakeErrorCodeFromLastError();
+
+ FreeLibrary(DllHandle);
+
+ throw std::system_error(Ec, fmt::format("API mismatch detected in transport DLL loaded from '{}'", DllPath));
+ }
+
+ LoadedDll NewDll;
+ NewDll.Name = Name;
+ NewDll.LoadedFromPath = DllPath.c_str();
+ NewDll.Plugin = CreatePlugin();
+
+ m_Transports.emplace_back(std::move(NewDll));
+}
+
DllTransportPlugin*
CreateDllTransportPlugin()
{
diff --git a/src/zenhttp/transports/dlltransport.h b/src/zenhttp/transports/dlltransport.h
index 9346a10ce..21985bac8 100644
--- a/src/zenhttp/transports/dlltransport.h
+++ b/src/zenhttp/transports/dlltransport.h
@@ -16,6 +16,7 @@ class DllTransportPlugin : public TransportPlugin
{
public:
virtual void LoadDll(std::string_view Name) = 0;
+ virtual void LoadDll(std::string_view Name, std::string_view Path) = 0;
virtual void ConfigureDll(std::string_view Name, const char* OptionTag, const char* OptionValue) = 0;
};