summaryrefslogtreecommitdiffstats
path: root/remote/startup/RemoteAgentHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--remote/startup/RemoteAgentHandler.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/remote/startup/RemoteAgentHandler.cpp b/remote/startup/RemoteAgentHandler.cpp
new file mode 100644
index 0000000000..45cf6ed941
--- /dev/null
+++ b/remote/startup/RemoteAgentHandler.cpp
@@ -0,0 +1,36 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/ClearOnShutdown.h"
+#include "mozilla/StaticPtr.h"
+#include "nsCOMPtr.h"
+#include "nsICommandLineHandler.h"
+#include "nsISupportsUtils.h"
+
+#include "RemoteAgentHandler.h"
+
+// anonymous namespace prevents outside C++ code
+// from improperly accessing these implementation details
+namespace {
+extern "C" {
+// implemented in Rust, see handler.rs
+void new_remote_agent_handler(nsICommandLineHandler** result);
+}
+
+static mozilla::StaticRefPtr<nsICommandLineHandler> sHandler;
+} // namespace
+
+already_AddRefed<nsICommandLineHandler> GetRemoteAgentHandler() {
+ nsCOMPtr<nsICommandLineHandler> handler;
+
+ if (sHandler) {
+ handler = sHandler;
+ } else {
+ new_remote_agent_handler(getter_AddRefs(handler));
+ sHandler = handler;
+ mozilla::ClearOnShutdown(&sHandler);
+ }
+
+ return handler.forget();
+}