/*
 * 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_BRIDGE_COOKIE_JAR_H_
#define COBALT_NETWORK_BRIDGE_COOKIE_JAR_H_

#include <string>

#include "googleurl/src/gurl.h"

namespace cobalt {
namespace network_bridge {

// An interface to allow interaction with the cookie store, which is owned
// by the network module, without requiring a dependency on the network module.
class CookieJar {
 public:
  CookieJar() {}
  virtual ~CookieJar() {}
  // Return all the cookies for this origin in a string, delimited by ';'
  virtual std::string GetCookies(const GURL& origin) = 0;
  // Set a single cookie for the origin. Format should be as per
  // CookieStore::SetCookieWithOptionsAsync()
  virtual void SetCookie(const GURL& origin,
                         const std::string& cookie_line) = 0;

 private:
  DISALLOW_COPY_AND_ASSIGN(CookieJar);
};

}  // namespace network_bridge
}  // namespace cobalt

#endif  // COBALT_NETWORK_BRIDGE_COOKIE_JAR_H_
