15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "google_apis/gcm/engine/account_mapping.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/strings/string_util.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace gcm {
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kSeparator[] = "&";
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst uint32 kEmailIndex = 0;
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst uint32 kStatusIndex = 1;
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst uint32 kStatusChangeTimestampIndex = 2;
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst uint32 kSizeWithNoMessage = kStatusChangeTimestampIndex + 1;
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst uint32 kMessageIdIndex = 3;
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst uint32 kSizeWithMessage = kMessageIdIndex + 1;
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kStatusNew[] = "new";
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kStatusAdding[] = "adding";
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kStatusMapped[] = "mapped";
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kStatusRemoving[] = "removing";
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string StatusToString(AccountMapping::MappingStatus status) {
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (status) {
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case AccountMapping::NEW:
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return kStatusNew;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case AccountMapping::ADDING:
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return kStatusAdding;
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case AccountMapping::MAPPED:
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return kStatusMapped;
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case AccountMapping::REMOVING:
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return kStatusRemoving;
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    default:
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      NOTREACHED();
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return std::string();
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool StringToStatus(const std::string& status_str,
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    AccountMapping::MappingStatus* status) {
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (status_str.compare(kStatusAdding) == 0)
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *status = AccountMapping::ADDING;
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else if (status_str.compare(kStatusMapped) == 0)
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *status = AccountMapping::MAPPED;
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else if (status_str.compare(kStatusRemoving) == 0)
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *status = AccountMapping::REMOVING;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else if (status_str.compare(kStatusNew) == 0)
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *status = AccountMapping::NEW;
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  else
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return false;
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return true;
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciAccountMapping::AccountMapping() : status(NEW) {
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)AccountMapping::~AccountMapping() {
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)std::string AccountMapping::SerializeAsString() const {
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string value;
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  value.append(email);
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  value.append(kSeparator);
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  value.append(StatusToString(status));
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  value.append(kSeparator);
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  value.append(base::Int64ToString(status_change_timestamp.ToInternalValue()));
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!last_message_id.empty()) {
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value.append(kSeparator);
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value.append(last_message_id);
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return value;
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool AccountMapping::ParseFromString(const std::string& value) {
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<std::string> values;
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Tokenize(value, kSeparator, &values);
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (values.size() != kSizeWithNoMessage &&
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      values.size() != kSizeWithMessage) {
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return false;
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (values[kEmailIndex].empty() ||
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      values[kStatusChangeTimestampIndex].empty() ||
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      values[kStatusIndex].empty()) {
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return false;
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (values.size() == kSizeWithMessage && values[kMessageIdIndex].empty())
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return false;
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MappingStatus temp_status;
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!StringToStatus(values[kStatusIndex], &temp_status))
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return false;
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (values.size() == kSizeWithNoMessage &&
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (temp_status == REMOVING || temp_status == ADDING)) {
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return false;
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int64 status_change_ts_internal = 0LL;
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!base::StringToInt64(values[kStatusChangeTimestampIndex],
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           &status_change_ts_internal)) {
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return false;
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  status_change_timestamp =
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Time::FromInternalValue(status_change_ts_internal);
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  status = temp_status;
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  email = values[kEmailIndex];
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  access_token.clear();
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (values.size() == kSizeWithMessage)
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    last_message_id = values[kMessageIdIndex];
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  else
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    last_message_id.clear();
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return true;
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace gcm
129