123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file.
423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#ifndef SYNC_API_ATTACHMENTS_ATTACHMENT_ID_H_
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define SYNC_API_ATTACHMENTS_ATTACHMENT_ID_H_
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <set>
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <string>
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <vector>
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "sync/base/sync_export.h"
13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "sync/internal_api/public/util/immutable.h"
14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace sync_pb {
16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass AttachmentIdProto;
17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}  // namespace sync_pb
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace syncer {
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Uniquely identifies an attachment.
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)//
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Two attachments with equal (operator==) AttachmentIds are considered
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// equivalent.
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class SYNC_EXPORT AttachmentId {
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ~AttachmentId();
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Default copy and assignment are welcome.
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool operator==(const AttachmentId& other) const;
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool operator!=(const AttachmentId& other) const;
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Needed for using AttachmentId as key in std::map.
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool operator<(const AttachmentId& other) const;
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Creates a unique attachment id.
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static AttachmentId Create();
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Creates an attachment id from an initialized proto.
42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  static AttachmentId CreateFromProto(const sync_pb::AttachmentIdProto& proto);
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  const sync_pb::AttachmentIdProto& GetProto() const;
45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch private:
47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Necessary since we forward-declare sync_pb::AttachmentIdProto; see comments
48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // in immutable.h.
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  struct SYNC_EXPORT ImmutableAttachmentIdProtoTraits {
50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    typedef sync_pb::AttachmentIdProto* Wrapper;
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    static void InitializeWrapper(Wrapper* wrapper);
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    static void DestroyWrapper(Wrapper* wrapper);
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    static const sync_pb::AttachmentIdProto& Unwrap(const Wrapper& wrapper);
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    static sync_pb::AttachmentIdProto* UnwrapMutable(Wrapper* wrapper);
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    static void Swap(sync_pb::AttachmentIdProto* t1,
56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                     sync_pb::AttachmentIdProto* t2);
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  };
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef Immutable<sync_pb::AttachmentIdProto,
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                    ImmutableAttachmentIdProtoTraits>
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ImmutableAttachmentIdProto;
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ImmutableAttachmentIdProto proto_;
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  AttachmentId(sync_pb::AttachmentIdProto* proto);
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)typedef std::vector<AttachmentId> AttachmentIdList;
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)typedef std::set<AttachmentId> AttachmentIdSet;
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace syncer
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif  // SYNC_API_ATTACHMENTS_ATTACHMENT_ID_H_
74