15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef GOOGLE_APIS_GCM_ENGINE_GCM_STORE_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define GOOGLE_APIS_GCM_ENGINE_GCM_STORE_H_
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector>
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <google/protobuf/message_lite.h>
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback_forward.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/linked_ptr.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/time/time.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gcm/base/gcm_export.h"
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "google_apis/gcm/engine/registration_info.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace gcm {
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MCSMessage;
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A GCM data store interface. GCM Store will handle persistence portion of RMQ,
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// as well as store device and user checkin information.
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GCM_EXPORT GCMStore {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Map of message id to message data for outgoing messages.
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::map<std::string, linked_ptr<google::protobuf::MessageLite> >
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OutgoingMessageMap;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Container for Load(..) results.
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  struct GCM_EXPORT LoadResult {
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LoadResult();
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ~LoadResult();
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool success;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    uint64 device_android_id;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    uint64 device_security_token;
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    RegistrationInfoMap registrations;
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<std::string> incoming_messages;
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OutgoingMessageMap outgoing_messages;
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::map<std::string, std::string> gservices_settings;
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string gservices_digest;
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::Time last_checkin_time;
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::vector<std::string> PersistentIdList;
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef base::Callback<void(scoped_ptr<LoadResult> result)> LoadCallback;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef base::Callback<void(bool success)> UpdateCallback;
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GCMStore();
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~GCMStore();
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Load the data from persistent store and pass the initial state back to
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // caller.
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Load(const LoadCallback& callback) = 0;
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Close the persistent store.
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void Close() = 0;
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Clears the GCM store of all data.
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Destroy(const UpdateCallback& callback) = 0;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sets this device's messaging credentials.
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetDeviceCredentials(uint64 device_android_id,
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    uint64 device_security_token,
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    const UpdateCallback& callback) = 0;
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Registration info.
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void AddRegistration(const std::string& app_id,
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                               const linked_ptr<RegistrationInfo>& registration,
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                               const UpdateCallback& callback) = 0;
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void RemoveRegistration(const std::string& app_id,
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  const UpdateCallback& callback) = 0;
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Unacknowledged incoming message handling.
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AddIncomingMessage(const std::string& persistent_id,
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  const UpdateCallback& callback) = 0;
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void RemoveIncomingMessage(const std::string& persistent_id,
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     const UpdateCallback& callback) = 0;
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void RemoveIncomingMessages(const PersistentIdList& persistent_ids,
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      const UpdateCallback& callback) = 0;
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Unacknowledged outgoing messages handling.
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns false if app has surpassed message limits, else returns true. Note
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // that the message isn't persisted until |callback| is invoked with
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |success| == true.
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool AddOutgoingMessage(const std::string& persistent_id,
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  const MCSMessage& message,
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  const UpdateCallback& callback) = 0;
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OverwriteOutgoingMessage(const std::string& persistent_id,
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const MCSMessage& message,
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const UpdateCallback& callback) = 0;
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void RemoveOutgoingMessage(const std::string& persistent_id,
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     const UpdateCallback& callback) = 0;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void RemoveOutgoingMessages(const PersistentIdList& persistent_ids,
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      const UpdateCallback& callback) = 0;
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Sets last device's checkin time.
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetLastCheckinTime(const base::Time& last_checkin_time,
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  const UpdateCallback& callback) = 0;
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // G-service settings handling.
108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Persists |settings| and |settings_digest|. It completely replaces the
109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // existing data.
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetGServicesSettings(
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const std::map<std::string, std::string>& settings,
112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const std::string& settings_digest,
113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const UpdateCallback& callback) = 0;
114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GCMStore);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace gcm
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // GOOGLE_APIS_GCM_ENGINE_GCM_STORE_H_
122