/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_NETWORK_COOKIE_JAR_IMPL_H_
#define COBALT_NETWORK_COOKIE_JAR_IMPL_H_

#include <string>

#include "base/compiler_specific.h"
#include "base/threading/thread.h"
#include "cobalt/network_bridge/cookie_jar.h"
#include "net/cookies/cookie_store.h"

namespace cobalt {
namespace network {

class CookieJarImpl : public network_bridge::CookieJar {
 public:
  explicit CookieJarImpl(net::CookieStore* cookie_store);

  std::string GetCookies(const GURL& origin) OVERRIDE;
  void SetCookie(const GURL& origin, const std::string& cookie_line) OVERRIDE;

 private:
  // We use a dedicated thread for making GetCookiesWithOptionsAsync() calls in
  // order to workaround GetCookiesWithOptionsAsync()'s default behavior of
  // PostTask()ing the completion callback to the message loop that the
  // GetCookiesWithOptionsAsync() call was made from.
  base::Thread get_cookies_thread_;
  net::CookieStore* cookie_store_;

  DISALLOW_COPY_AND_ASSIGN(CookieJarImpl);
};

}  // namespace network
}  // namespace cobalt

#endif  // COBALT_NETWORK_COOKIE_JAR_IMPL_H_
