• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 SYNC_API_ATTACHMENTS_ATTACHMENT_STORE_H_
6 #define SYNC_API_ATTACHMENTS_ATTACHMENT_STORE_H_
7 
8 #include "base/callback.h"
9 #include "base/memory/ref_counted.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "sync/api/attachments/attachment.h"
12 #include "sync/api/attachments/attachment_id.h"
13 #include "sync/base/sync_export.h"
14 
15 namespace base {
16 class RefCountedMemory;
17 }  // namespace base
18 
19 namespace syncer {
20 
21 class Attachment;
22 class AttachmentId;
23 
24 // A place to locally store and access Attachments.
25 //
26 // Destroying this object does not necessarily cancel outstanding async
27 // operations. If you need cancel like semantics, use WeakPtr in the callbacks.
28 class SYNC_EXPORT AttachmentStore : public base::RefCounted<AttachmentStore> {
29  public:
30   AttachmentStore();
31 
32   // TODO(maniscalco): Consider udpating Read and Write methods to support
33   // resumable transfers (bug 353292).
34 
35   enum Result {
36     SUCCESS,            // No error, all completed successfully.
37     UNSPECIFIED_ERROR,  // An unspecified error occurred for one or more items.
38   };
39 
40   typedef base::Callback<void(const Result&,
41                               scoped_ptr<AttachmentMap>,
42                               scoped_ptr<AttachmentIdList>)> ReadCallback;
43   typedef base::Callback<void(const Result&)> WriteCallback;
44   typedef base::Callback<void(const Result&)> DropCallback;
45 
46   // Asynchronously reads the attachments identified by |ids|.
47   //
48   // |callback| will be invoked when finished. AttachmentStore will attempt to
49   // read all attachments specified in ids. If any of the attachments do not
50   // exist or could not be read, |callback|'s Result will be UNSPECIFIED_ERROR.
51   // Callback's AttachmentMap will contain all attachments that were
52   // successfully read, AttachmentIdList will contain attachment ids of
53   // attachments that are unavailable in attachment store, these need to be
54   // downloaded from server.
55   //
56   // Reads on individual attachments are treated atomically; |callback| will not
57   // read only part of an attachment.
58   virtual void Read(const AttachmentIdList& ids,
59                     const ReadCallback& callback) = 0;
60 
61   // Asynchronously writes |attachments| to the store.
62   //
63   // Will not overwrite stored attachments. Attempting to overwrite an
64   // attachment that already exists is not an error.
65   //
66   // |callback| will be invoked when finished. If any of the attachments could
67   // not be written |callback|'s Result will be UNSPECIFIED_ERROR. When this
68   // happens, some or none of the attachments may have been written
69   // successfully.
70   virtual void Write(const AttachmentList& attachments,
71                      const WriteCallback& callback) = 0;
72 
73   // Asynchronously drops |attchments| from this store.
74   //
75   // This does not remove attachments from the server.
76   //
77   // |callback| will be invoked when finished. Attempting to drop an attachment
78   // that does not exist is not an error. If any of the existing attachment
79   // could not be dropped, |callback|'s Result will be UNSPECIFIED_ERROR. When
80   // this happens, some or none of the attachments may have been dropped
81   // successfully.
82   virtual void Drop(const AttachmentIdList& ids,
83                     const DropCallback& callback) = 0;
84 
85  protected:
86   friend class base::RefCounted<AttachmentStore>;
87   virtual ~AttachmentStore();
88 };
89 
90 }  // namespace syncer
91 
92 #endif  // SYNC_API_ATTACHMENTS_ATTACHMENT_STORE_H_
93