summaryrefslogtreecommitdiffstats
path: root/browser/components/shell/nsGNOMEShellSearchProvider.h
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/shell/nsGNOMEShellSearchProvider.h')
-rw-r--r--browser/components/shell/nsGNOMEShellSearchProvider.h153
1 files changed, 153 insertions, 0 deletions
diff --git a/browser/components/shell/nsGNOMEShellSearchProvider.h b/browser/components/shell/nsGNOMEShellSearchProvider.h
new file mode 100644
index 0000000000..ce215183fc
--- /dev/null
+++ b/browser/components/shell/nsGNOMEShellSearchProvider.h
@@ -0,0 +1,153 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:expandtab:shiftwidth=2:tabstop=2:
+ */
+/* 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/. */
+
+#ifndef __nsGNOMEShellSearchProvider_h__
+#define __nsGNOMEShellSearchProvider_h__
+
+#include <gio/gio.h>
+
+#include "mozilla/RefPtr.h"
+#include "mozilla/GRefPtr.h"
+#include "nsINavHistoryService.h"
+#include "nsUnixRemoteServer.h"
+#include "nsString.h"
+#include "nsCOMPtr.h"
+#include "mozilla/UniquePtr.h"
+#include "nsGNOMEShellDBusHelper.h"
+
+class nsGNOMEShellSearchProvider;
+
+class GnomeHistoryIcon {
+ public:
+ GnomeHistoryIcon() : mTimeStamp(-1), mWidth(0), mHeight(0){};
+
+ // From which search is this icon
+ void Set(int aTimeStamp, mozilla::UniquePtr<uint8_t[]> aData, int aWidth,
+ int aHeight) {
+ mTimeStamp = aTimeStamp;
+ mWidth = aWidth;
+ mHeight = aHeight;
+ mData = std::move(aData);
+ }
+
+ bool IsLoaded() { return mData && mWidth > 0 && mHeight > 0; }
+ int GetTimeStamp() { return mTimeStamp; }
+ uint8_t* GetData() { return mData.get(); }
+ int GetWidth() { return mWidth; }
+ int GetHeight() { return mHeight; }
+
+ private:
+ int mTimeStamp;
+ mozilla::UniquePtr<uint8_t[]> mData;
+ int mWidth;
+ int mHeight;
+};
+
+// nsGNOMEShellHistorySearchResult is a container with contains search results
+// which are files asynchronously by nsGNOMEShellHistoryService.
+// The search results can be opened by Firefox then.
+class nsGNOMEShellHistorySearchResult : public nsUnixRemoteServer {
+ public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(nsGNOMEShellHistorySearchResult)
+
+ nsGNOMEShellHistorySearchResult(nsGNOMEShellSearchProvider* aSearchProvider,
+ GDBusConnection* aConnection, int aTimeStamp)
+ : mSearchProvider(aSearchProvider),
+ mConnection(aConnection),
+ mTimeStamp(aTimeStamp){};
+
+ void SetReply(RefPtr<GDBusMethodInvocation> aReply) {
+ mReply = std::move(aReply);
+ }
+ void SetSearchTerm(const char* aSearchTerm) {
+ mSearchTerm = nsAutoCString(aSearchTerm);
+ }
+ GDBusConnection* GetDBusConnection() { return mConnection; }
+ void SetTimeStamp(int aTimeStamp) { mTimeStamp = aTimeStamp; }
+ int GetTimeStamp() { return mTimeStamp; }
+ nsAutoCString& GetSearchTerm() { return mSearchTerm; }
+
+ // Receive (asynchronously) history search results from history service.
+ // This is called asynchronously by nsGNOMEShellHistoryService
+ // when we have search results available.
+ void ReceiveSearchResultContainer(
+ nsCOMPtr<nsINavHistoryContainerResultNode> aHistResultContainer);
+
+ nsCOMPtr<nsINavHistoryContainerResultNode> GetSearchResultContainer() {
+ return mHistResultContainer;
+ }
+ void HandleCommandLine(const char* aBuffer, uint32_t aTimestamp) {
+ nsUnixRemoteServer::HandleCommandLine(aBuffer, aTimestamp);
+ }
+
+ void SetHistoryIcon(int aTimeStamp, mozilla::UniquePtr<uint8_t[]> aData,
+ int aWidth, int aHeight, int aIconIndex);
+ GnomeHistoryIcon* GetHistoryIcon(int aIconIndex);
+
+ private:
+ void HandleSearchResultReply();
+
+ ~nsGNOMEShellHistorySearchResult() = default;
+
+ private:
+ nsGNOMEShellSearchProvider* mSearchProvider;
+ nsCOMPtr<nsINavHistoryContainerResultNode> mHistResultContainer;
+ nsAutoCString mSearchTerm;
+ RefPtr<GDBusMethodInvocation> mReply;
+ GDBusConnection* mConnection = nullptr;
+ int mTimeStamp;
+ GnomeHistoryIcon mHistoryIcons[MAX_SEARCH_RESULTS_NUM];
+};
+
+class nsGNOMEShellHistoryService {
+ public:
+ nsresult QueryHistory(RefPtr<nsGNOMEShellHistorySearchResult> aSearchResult);
+
+ private:
+ nsCOMPtr<nsINavHistoryService> mHistoryService;
+};
+
+class nsGNOMEShellSearchProvider {
+ public:
+ nsGNOMEShellSearchProvider()
+ : mConnection(nullptr), mSearchResultTimeStamp(0) {}
+ ~nsGNOMEShellSearchProvider() { Shutdown(); }
+
+ nsresult Startup();
+ void Shutdown();
+
+ void UnregisterDBusInterface(GDBusConnection* aConnection);
+
+ bool SetSearchResult(RefPtr<nsGNOMEShellHistorySearchResult> aSearchResult);
+
+ void HandleSearchResultSet(GVariant* aParameters,
+ GDBusMethodInvocation* aInvocation,
+ bool aInitialSearch);
+ void HandleResultMetas(GVariant* aParameters,
+ GDBusMethodInvocation* aInvocation);
+ void ActivateResult(GVariant* aParameters,
+ GDBusMethodInvocation* aInvocation);
+ void LaunchSearch(GVariant* aParameters, GDBusMethodInvocation* aInvocation);
+
+ void OnBusAcquired(GDBusConnection* aConnection);
+ void OnNameAcquired(GDBusConnection* aConnection);
+ void OnNameLost(GDBusConnection* aConnection);
+
+ private:
+ // The connection is owned by DBus library
+ uint mDBusID = 0;
+ uint mRegistrationId = 0;
+ GDBusConnection* mConnection = nullptr;
+ RefPtr<GDBusNodeInfo> mIntrospectionData;
+
+ RefPtr<nsGNOMEShellHistorySearchResult> mSearchResult;
+ int mSearchResultTimeStamp;
+};
+
+nsGNOMEShellHistoryService* GetGNOMEShellHistoryService();
+
+#endif // __nsGNOMEShellSearchProvider_h__