// Copyright (c) 2013 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 "net/quic/crypto/source_address_token.h"

#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"

using std::string;

namespace net {

SourceAddressToken::SourceAddressToken()
    : has_cached_network_parameters_(false) {
}

SourceAddressToken::~SourceAddressToken() {
}

string SourceAddressToken::SerializeAsString() const {
  string out;
  out.push_back(static_cast<char>(ip_.size()));
  out.append(ip_);
  string time_str = base::Int64ToString(timestamp_);
  out.push_back(static_cast<char>(time_str.size()));
  out.append(time_str);
  // TODO(rtenneti): Implement serialization of optional CachedNetworkParameters
  // when they are used.
  return out;
}

bool SourceAddressToken::ParseFromArray(const char* plaintext,
                                        size_t plaintext_length) {
  if (plaintext_length == 0) {
    return false;
  }
  size_t ip_len = plaintext[0];
  if (plaintext_length <= 1 + ip_len) {
    return false;
  }
  size_t time_len = plaintext[1 + ip_len];
  if (plaintext_length != 1 + ip_len + 1 + time_len) {
    return false;
  }

  string time_str(&plaintext[1 + ip_len + 1], time_len);
  int64 timestamp;
  if (!base::StringToInt64(time_str, &timestamp)) {
    return false;
  }

  ip_.assign(&plaintext[1], ip_len);
  timestamp_ = timestamp;

  // TODO(rtenneti): Implement parsing of optional CachedNetworkParameters when
  // they are used.
  return true;
}

}  // namespace net
