Home | History | Annotate | Download | only in engine
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef GOOGLE_APIS_GCM_ENGINE_GCM_STORE_IMPL_H_
      6 #define GOOGLE_APIS_GCM_ENGINE_GCM_STORE_IMPL_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/memory/ref_counted.h"
     10 #include "base/memory/weak_ptr.h"
     11 #include "google_apis/gcm/base/gcm_export.h"
     12 #include "google_apis/gcm/engine/gcm_store.h"
     13 
     14 namespace base {
     15 class FilePath;
     16 class SequencedTaskRunner;
     17 }  // namespace base
     18 
     19 namespace gcm {
     20 
     21 class Encryptor;
     22 
     23 // An implementation of GCM Store that uses LevelDB for persistence.
     24 // It performs all blocking operations on the blocking task runner, and posts
     25 // all callbacks to the thread on which the GCMStoreImpl is created.
     26 class GCM_EXPORT GCMStoreImpl : public GCMStore {
     27  public:
     28   GCMStoreImpl(const base::FilePath& path,
     29                scoped_refptr<base::SequencedTaskRunner> blocking_task_runner,
     30                scoped_ptr<Encryptor> encryptor);
     31   virtual ~GCMStoreImpl();
     32 
     33   // Load the directory and pass the initial state back to caller.
     34   virtual void Load(const LoadCallback& callback) OVERRIDE;
     35 
     36   // Closes the GCM store.
     37   virtual void Close() OVERRIDE;
     38 
     39   // Clears the GCM store of all data and destroys any LevelDB files associated
     40   // with this store.
     41   // WARNING: this will permanently destroy any pending outgoing messages
     42   // and require the device to re-create credentials and serial number mapping
     43   // tables.
     44   virtual void Destroy(const UpdateCallback& callback) OVERRIDE;
     45 
     46   // Sets this device's messaging credentials.
     47   virtual void SetDeviceCredentials(uint64 device_android_id,
     48                                     uint64 device_security_token,
     49                                     const UpdateCallback& callback) OVERRIDE;
     50 
     51   // Registration info.
     52   virtual void AddRegistration(const std::string& app_id,
     53                                const linked_ptr<RegistrationInfo>& registration,
     54                                const UpdateCallback& callback) OVERRIDE;
     55   virtual void RemoveRegistration(const std::string& app_id,
     56                                   const UpdateCallback& callback) OVERRIDE;
     57 
     58   // Unacknowledged incoming message handling.
     59   virtual void AddIncomingMessage(const std::string& persistent_id,
     60                                   const UpdateCallback& callback) OVERRIDE;
     61   virtual void RemoveIncomingMessage(const std::string& persistent_id,
     62                                      const UpdateCallback& callback) OVERRIDE;
     63   virtual void RemoveIncomingMessages(const PersistentIdList& persistent_ids,
     64                                       const UpdateCallback& callback) OVERRIDE;
     65 
     66   // Unacknowledged outgoing messages handling.
     67   virtual bool AddOutgoingMessage(const std::string& persistent_id,
     68                                   const MCSMessage& message,
     69                                   const UpdateCallback& callback) OVERRIDE;
     70   virtual void OverwriteOutgoingMessage(const std::string& persistent_id,
     71                                         const MCSMessage& message,
     72                                         const UpdateCallback& callback)
     73       OVERRIDE;
     74   virtual void RemoveOutgoingMessage(const std::string& persistent_id,
     75                                      const UpdateCallback& callback) OVERRIDE;
     76   virtual void RemoveOutgoingMessages(const PersistentIdList& persistent_ids,
     77                                       const UpdateCallback& callback) OVERRIDE;
     78 
     79   // Sets last device's checkin information.
     80   virtual void SetLastCheckinInfo(const base::Time& time,
     81                                   const std::set<std::string>& accounts,
     82                                   const UpdateCallback& callback) OVERRIDE;
     83 
     84   // G-service settings handling.
     85   virtual void SetGServicesSettings(
     86       const std::map<std::string, std::string>& settings,
     87       const std::string& settings_digest,
     88       const UpdateCallback& callback) OVERRIDE;
     89 
     90   // Sets the account information related to device to account mapping.
     91   virtual void AddAccountMapping(const AccountMapping& account_mapping,
     92                                  const UpdateCallback& callback) OVERRIDE;
     93   virtual void RemoveAccountMapping(const std::string& account_id,
     94                                     const UpdateCallback& callback) OVERRIDE;
     95 
     96  private:
     97   typedef std::map<std::string, int> AppIdToMessageCountMap;
     98 
     99   // Continuation to update the per-app message counts after a load.
    100   void LoadContinuation(const LoadCallback& callback,
    101                         scoped_ptr<LoadResult> result);
    102 
    103   // Continuation to update the per-app message counts when adding messages.
    104   // In particular, if a message fails to add, the message count is decremented.
    105   void AddOutgoingMessageContinuation(const UpdateCallback& callback,
    106                                       const std::string& app_id,
    107                                       bool success);
    108 
    109   // Continuation to update the per-app message counts when removing messages.
    110   // Note: if doing a read-then-write when removing messages proves expensive,
    111   // an in-memory mapping of persisted message id to app could be maintained
    112   // instead.
    113   void RemoveOutgoingMessagesContinuation(
    114       const UpdateCallback& callback,
    115       bool success,
    116       const std::map<std::string, int>& removed_message_counts);
    117 
    118   class Backend;
    119 
    120   // Map of App ids to their message counts.
    121   AppIdToMessageCountMap app_message_counts_;
    122 
    123   scoped_refptr<Backend> backend_;
    124   scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
    125 
    126   base::WeakPtrFactory<GCMStoreImpl> weak_ptr_factory_;
    127 
    128   DISALLOW_COPY_AND_ASSIGN(GCMStoreImpl);
    129 };
    130 
    131 }  // namespace gcm
    132 
    133 #endif  // GOOGLE_APIS_GCM_ENGINE_GCM_STORE_IMPL_H_
    134