summaryrefslogtreecommitdiff
path: root/toolkit/components/places/nsAnnotationService.h
blob: f1b4921d81ecc817016fce79fc3d23e0165547c2 (plain)
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___ */