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