1// Copyright 2013 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#include "sync/internal_api/public/base/ack_handle.h"
6
7#include <cstddef>
8#include "base/rand_util.h"
9#include "base/strings/string_number_conversions.h"
10#include "base/values.h"
11
12namespace syncer {
13
14namespace {
15// Hopefully enough bytes for uniqueness.
16const size_t kBytesInHandle = 16;
17}  // namespace
18
19AckHandle AckHandle::CreateUnique() {
20  // This isn't a valid UUID, so we don't attempt to format it like one.
21  uint8 random_bytes[kBytesInHandle];
22  base::RandBytes(random_bytes, sizeof(random_bytes));
23  return AckHandle(base::HexEncode(random_bytes, sizeof(random_bytes)),
24                   base::Time::Now());
25}
26
27AckHandle AckHandle::InvalidAckHandle() {
28  return AckHandle(std::string(), base::Time());
29}
30
31bool AckHandle::Equals(const AckHandle& other) const {
32  return state_ == other.state_ && timestamp_ == other.timestamp_;
33}
34
35scoped_ptr<base::DictionaryValue> AckHandle::ToValue() const {
36  scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue());
37  value->SetString("state", state_);
38  value->SetString("timestamp",
39                   base::Int64ToString(timestamp_.ToInternalValue()));
40  return value.Pass();
41}
42
43bool AckHandle::ResetFromValue(const base::DictionaryValue& value) {
44  if (!value.GetString("state", &state_))
45    return false;
46  std::string timestamp_as_string;
47  if (!value.GetString("timestamp", &timestamp_as_string))
48    return false;
49  int64 timestamp_value;
50  if (!base::StringToInt64(timestamp_as_string, &timestamp_value))
51    return false;
52  timestamp_ = base::Time::FromInternalValue(timestamp_value);
53  return true;
54}
55
56bool AckHandle::IsValid() const {
57  return !state_.empty();
58}
59
60AckHandle::AckHandle(const std::string& state, base::Time timestamp)
61    : state_(state), timestamp_(timestamp) {
62}
63
64AckHandle::~AckHandle() {
65}
66
67}  // namespace syncer
68