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