<?php
require_once(dirname(__FILE__) . '/BaiduUtils.php');
abstract class BaiduStore
{
protected static $supportedKeys = array(
'state', 'code', 'session',
);
protected $clientId;
public function __construct($clientId)
{
$this->clientId = $clientId;
}
abstract public function get($key, $default = false);
abstract public function set($key, $value);
abstract public function remove($key);
abstract public function removeAll();
protected function getKeyForStore($key)
{
return implode('_', array('bds', $this->clientId, $key));
}
}
class BaiduCookieStore extends BaiduStore
{
protected $domain;
public function __construct($clientId, $domain = '')
{
parent::__construct($clientId);
$this->domain = $domain;
header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTR STP IND DEM"');
}
public function get($key, $default = false)
{
if (!in_array($key, self::$supportedKeys)) {
return $default;
}
$name = $this->getKeyForStore($key);
$value = $_COOKIE[$name];
if ($value && $key == 'session') {
parse_str($value, $value);
}
if (empty($value)) {
$value = $default;
}
return $value;
}
public function set($key, $value)
{
if (!in_array($key, self::$supportedKeys)) {
return false;
}
$name = $this->getKeyForStore($key);
if ($key == 'session') {
$expires = isset($value['expires_in']) ? $value['expires_in'] * 2 : 3600*24;
$value = http_build_query($value, '', '&');
} else {
$expires = 3600*24;
}
setcookie($name, $value, time() + $expires, '/');
$_COOKIE[$name] = $value;
return true;
}
public function remove($key)
{
if (!in_array($key, self::$supportedKeys)) {
return false;
}
$name = $this->getKeyForStore($key);
setcookie($name, 'delete', time() - 3600*24, '/');
unset($_COOKIE[$name]);
return true;
}
public function removeAll()
{
foreach (self::$supportedKeys as $key) {
$this->remove($key);
}
return true;
}
}
class BaiduSessionStore extends BaiduStore
{
public function __construct($clientId)
{
if (!session_id()) {
session_start();
}
parent::__construct($clientId);
}
public function get($key, $default = false)
{
if (!in_array($key, self::$supportedKeys)) {
return $default;
}
$name = $this->getKeyForStore($key);
return isset($_SESSION[$name]) ? $_SESSION[$name] : $default;
}
public function set($key, $value)
{
if (!in_array($key, self::$supportedKeys)) {
return false;
}
$name = $this->getKeyForStore($key);
$_SESSION[$name] = $value;
return true;
}
public function remove($key)
{
if (!in_array($key, self::$supportedKeys)) {
return false;
}
$name = $this->getKeyForStore($key);
unset($_SESSION[$name]);
return true;
}
public function removeAll()
{
foreach (self::$supportedKeys as $key) {
$this->remove($key);
}
return true;
}
}
class BaiduMemcachedStore extends BaiduStore
{
protected $memcache;
protected $sessionId;
public function __construct($clientId, $memcache, $sessionId)
{
$this->memcache = $memcache;
$this->sessionId = $sessionId;
parent::__construct($clientId);
}
public function get($key, $default = false)
{
if (!in_array($key, self::$supportedKeys)) {
return $default;
}
$name = $this->getKeyForStore($key);
$value = $this->memcache->get($name);
return ($value === false) ? $default : $value;
}
public function set($key, $value)
{
if (!in_array($key, self::$supportedKeys)) {
return false;
}
$name = $this->getKeyForStore($key);
return $this->memcache->set($name, $value, 0, 0);
}
public function remove($key)
{
if (!in_array($key, self::$supportedKeys)) {
return false;
}
$name = $this->getKeyForStore($key);
return $this->memcache->delete($name);
}
public function removeAll()
{
foreach (self::$supportedKeys as $key) {
$this->remove($key);
}
return true;
}
protected function getKeyForStore($key)
{
return implode('_', array('bds', $this->clientId, $this->sessionId, $key));
}
}