/*
 *  Copyright 2015 The WebRTC Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/rtc_base/cryptstring.h"

namespace rtc {

size_t EmptyCryptStringImpl::GetLength() const {
  return 0;
}

void EmptyCryptStringImpl::CopyTo(char* dest, bool nullterminate) const {
  if (nullterminate) {
    *dest = '\0';
  }
}

std::string EmptyCryptStringImpl::UrlEncode() const {
  return "";
}

CryptStringImpl* EmptyCryptStringImpl::Copy() const {
  return new EmptyCryptStringImpl();
}

void EmptyCryptStringImpl::CopyRawTo(std::vector<unsigned char>* dest) const {
  dest->clear();
}

CryptString::CryptString() : impl_(new EmptyCryptStringImpl()) {
}

CryptString::CryptString(const CryptString& other)
    : impl_(other.impl_->Copy()) {
}

CryptString::CryptString(const CryptStringImpl& impl) : impl_(impl.Copy()) {
}

CryptString::~CryptString() = default;

size_t InsecureCryptStringImpl::GetLength() const {
  return password_.size();
}

void InsecureCryptStringImpl::CopyTo(char* dest, bool nullterminate) const {
  memcpy(dest, password_.data(), password_.size());
  if (nullterminate)
    dest[password_.size()] = 0;
}

std::string InsecureCryptStringImpl::UrlEncode() const {
  return password_;
}

CryptStringImpl* InsecureCryptStringImpl::Copy() const {
  InsecureCryptStringImpl* copy = new InsecureCryptStringImpl;
  copy->password() = password_;
  return copy;
}

void InsecureCryptStringImpl::CopyRawTo(
    std::vector<unsigned char>* dest) const {
  dest->resize(password_.size());
  memcpy(&dest->front(), password_.data(), password_.size());
}

};  // namespace rtc
