// 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/common/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
