DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (5350524bb654)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
//* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 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 nsAnnotationService_h___
#define nsAnnotationService_h___

#include "nsIAnnotationService.h"
#include "nsTArray.h"
#include "nsCOMArray.h"
#include "nsCOMPtr.h"
#include "nsServiceManagerUtils.h"
#include "nsWeakReference.h"
#include "nsToolkitCompsCID.h"
#include "Database.h"
#include "nsString.h"
#include "mozilla/Attributes.h"

namespace mozilla {
namespace places {

class AnnotatedResult final : public mozIAnnotatedResult
{
public:
  NS_DECL_ISUPPORTS
  NS_DECL_MOZIANNOTATEDRESULT

  AnnotatedResult(const nsCString& aGUID, nsIURI* aURI, int64_t aItemd,
                  const nsACString& aAnnotationName,
                  nsIVariant* aAnnotationValue);

private:
  ~AnnotatedResult();

  const nsCString mGUID;
  nsCOMPtr<nsIURI> mURI;
  const int64_t mItemId;
  const nsCString mAnnotationName;
  nsCOMPtr<nsIVariant> mAnnotationValue;
};

} // namespace places
} // namespace mozilla

class nsAnnotationService final : public nsIAnnotationService
                                , public nsIObserver
                                , public nsSupportsWeakReference
{
public:
  NS_DECL_ISUPPORTS
  NS_DECL_NSIANNOTATIONSERVICE
  NS_DECL_NSIOBSERVER

  nsAnnotationService();

  /**
   * Obtains the service's object.
   */
  static already_AddRefed<nsAnnotationService> GetSingleton();

  /**
   * Initializes the service's object.  This should only be called once.
   */
  nsresult Init();

  /**
   * Returns a cached pointer to the annotation service for consumers in the
   * places directory.
   */
  static nsAnnotationService* GetAnnotationService()
  {
    if (!gAnnotationService) {
      nsCOMPtr<nsIAnnotationService> serv =
        do_GetService(NS_ANNOTATIONSERVICE_CONTRACTID);
      NS_ENSURE_TRUE(serv, nullptr);
      NS_ASSERTION(gAnnotationService,
                   "Should have static instance pointer now");
    }
    return gAnnotationService;
  }

private:
  ~nsAnnotationService();

protected:
  RefPtr<mozilla::places::Database> mDB;

  nsCOMArray<nsIAnnotationObserver> mObservers;
  bool mHasSessionAnnotations;

  static nsAnnotationService* gAnnotationService;

  static const int kAnnoIndex_ID;
  static const int kAnnoIndex_PageOrItem;
  static const int kAnnoIndex_NameID;
  static const int kAnnoIndex_Content;
  static const int kAnnoIndex_Flags;
  static const int kAnnoIndex_Expiration;
  static const int kAnnoIndex_Type;
  static const int kAnnoIndex_DateAdded;
  static const int kAnnoIndex_LastModified;

  nsresult HasAnnotationInternal(nsIURI* aURI,
                                 int64_t aItemId,
                                 const nsACString& aName,
                                 bool* _hasAnno);

  nsresult StartGetAnnotation(nsIURI* aURI,
                              int64_t aItemId,
                              const nsACString& aName,
                              nsCOMPtr<mozIStorageStatement>& aStatement);

  nsresult StartSetAnnotation(nsIURI* aURI,
                              int64_t aItemId,
                              const nsACString& aName,
                              int32_t aFlags,
                              uint16_t aExpiration,
                              uint16_t aType,
                              nsCOMPtr<mozIStorageStatement>& aStatement);

  nsresult SetAnnotationStringInternal(nsIURI* aURI,
                                       int64_t aItemId,
                                       const nsACString& aName,
                                       const nsAString& aValue,
                                       int32_t aFlags,
                                       uint16_t aExpiration);
  nsresult SetAnnotationInt32Internal(nsIURI* aURI,
                                      int64_t aItemId,
                                      const nsACString& aName,
                                      int32_t aValue,
                                      int32_t aFlags,
                                      uint16_t aExpiration);
  nsresult SetAnnotationInt64Internal(nsIURI* aURI,
                                      int64_t aItemId,
                                      const nsACString& aName,
                                      int64_t aValue,
                                      int32_t aFlags,
                                      uint16_t aExpiration);
  nsresult SetAnnotationDoubleInternal(nsIURI* aURI,
                                       int64_t aItemId,
                                       const nsACString& aName,
                                       double aValue,
                                       int32_t aFlags,
                                       uint16_t aExpiration);

  nsresult RemoveAnnotationInternal(nsIURI* aURI,
                                    int64_t aItemId,
                                    const nsACString& aName);

public:
  nsresult GetPagesWithAnnotationCOMArray(const nsACString& aName,
                                          nsCOMArray<nsIURI>* _results);
  nsresult GetItemsWithAnnotationTArray(const nsACString& aName,
                                        nsTArray<int64_t>* _result);
  nsresult GetAnnotationNamesTArray(nsIURI* aURI,
                                    int64_t aItemId,
                                    nsTArray<nsCString>* _result);
};

#endif /* nsAnnotationService_h___ */