// Copyright 2014 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 "mojo/services/network/cookie_store_impl.h"

#include "mojo/converters/url/url_type_converters.h"
#include "mojo/services/network/network_context.h"
#include "net/cookies/cookie_store.h"
#include "net/url_request/url_request_context.h"

namespace mojo {
namespace {

void AdaptGetCookiesCallback(const Callback<void(String)>& callback,
                             const std::string& cookies) {
  callback.Run(cookies);
}

void AdaptSetCookieCallback(const Callback<void(bool)>& callback,
                            bool success) {
  callback.Run(success);
}

}  // namespace

CookieStoreImpl::CookieStoreImpl(InterfaceRequest<CookieStore> request,
                                 NetworkContext* context,
                                 const GURL& origin)
    : binding_(this, request.Pass()), context_(context), origin_(origin) {
}

CookieStoreImpl::~CookieStoreImpl() {
}

void CookieStoreImpl::Get(const String& url,
                          const Callback<void(String)>& callback) {
  // TODO(darin): Perform origin restriction.
  net::CookieStore* store = context_->url_request_context()->cookie_store();
  if (!store) {
    callback.Run(String());
    return;
  }
  store->GetCookiesWithOptionsAsync(
      url.To<GURL>(),
      net::CookieOptions(),
      base::Bind(&AdaptGetCookiesCallback, callback));
}

void CookieStoreImpl::Set(const String& url,
                          const String& cookie,
                          const Callback<void(bool)>& callback) {
  // TODO(darin): Perform origin restriction.
  net::CookieStore* store = context_->url_request_context()->cookie_store();
  if (!store) {
    callback.Run(false);
    return;
  }
  store->SetCookieWithOptionsAsync(
      url.To<GURL>(),
      cookie,
      net::CookieOptions(),
      base::Bind(&AdaptSetCookieCallback, callback));
}

}  // namespace mojo
