summaryrefslogtreecommitdiffstats
path: root/sync/api/sync_error.cc
blob: 49bf74b4fac64a9f12f9ce1cb3a2c88a6d89c548 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "sync/api/sync_error.h"

#include <ostream>

#include "base/location.h"
#include "base/logging.h"
#include "sync/syncable/model_type.h"

SyncError::SyncError() {
  Clear();
}

SyncError::SyncError(const tracked_objects::Location& location,
                     const std::string& message,
                     syncable::ModelType type) {
  Init(location, message, type);
  PrintLogError();
}

SyncError::SyncError(const SyncError& other) {
  Copy(other);
}

SyncError::~SyncError() {
}

SyncError& SyncError::operator=(const SyncError& other) {
  if (this == &other) {
    return *this;
  }
  Copy(other);
  return *this;
}

void SyncError::Copy(const SyncError& other) {
  if (other.IsSet()) {
    Init(other.location(),
         other.message(),
         other.type());
  } else {
    Clear();
  }
}

void SyncError::Clear() {
  location_.reset();
  message_ = std::string();
  type_ = syncable::UNSPECIFIED;
}

void SyncError::Reset(const tracked_objects::Location& location,
                      const std::string& message,
                      syncable::ModelType type) {
  Init(location, message, type);
  PrintLogError();
}

void SyncError::Init(const tracked_objects::Location& location,
                     const std::string& message,
                     syncable::ModelType type) {
  location_.reset(new tracked_objects::Location(location));
  message_ = message;
  type_ = type;
}

bool SyncError::IsSet() const {
  return location_.get() != NULL;
}


const tracked_objects::Location& SyncError::location() const {
  CHECK(IsSet());
  return *location_;
}

const std::string& SyncError::message() const {
  CHECK(IsSet());
  return message_;
}

syncable::ModelType SyncError::type() const {
  CHECK(IsSet());
  return type_;
}

std::string SyncError::ToString() const {
  if (!IsSet()) {
    return std::string();
  }
  return location_->ToString() + ", " + syncable::ModelTypeToString(type_) +
      ", Sync Error: " + message_;
}

void SyncError::PrintLogError() const {
  LAZY_STREAM(logging::LogMessage(location_->file_name(),
                                  location_->line_number(),
                                  logging::LOG_ERROR).stream(),
              LOG_IS_ON(ERROR))
      << syncable::ModelTypeToString(type_) << ", Sync Error: " << message_;
}

void PrintTo(const SyncError& sync_error, std::ostream* os) {
  *os << sync_error.ToString();
}