538 Zeilen
12 KiB
PHP
538 Zeilen
12 KiB
PHP
<?php
|
|
/**
|
|
* Zend Framework
|
|
*
|
|
* LICENSE
|
|
*
|
|
* This source file is subject to the new BSD license that is bundled
|
|
* with this package in the file LICENSE.txt.
|
|
* It is also available through the world-wide-web at this URL:
|
|
* http://framework.zend.com/license/new-bsd
|
|
* If you did not receive a copy of the license and are unable to
|
|
* obtain it through the world-wide-web, please send an email
|
|
* to license@zend.com so we can send you a copy immediately.
|
|
*
|
|
* @category Zend
|
|
* @package Zend_Http
|
|
* @subpackage UserAgent
|
|
* @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
*/
|
|
|
|
require_once 'Zend/Http/UserAgent/AbstractDevice.php';
|
|
|
|
/**
|
|
* Mobile browser type matcher
|
|
*
|
|
* @category Zend
|
|
* @package Zend_Http
|
|
* @subpackage UserAgent
|
|
* @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
*/
|
|
class Zend_Http_UserAgent_Mobile extends Zend_Http_UserAgent_AbstractDevice
|
|
{
|
|
|
|
const DEFAULT_FEATURES_ADAPTER_CLASSNAME = 'Zend_Http_UserAgent_Features_Adapter_WurflApi';
|
|
|
|
const DEFAULT_FEATURES_ADAPTER_PATH = 'Zend/Http/UserAgent/Features/Adapter/WurflApi.php';
|
|
|
|
/**
|
|
* User Agent Signatures
|
|
*
|
|
* @var array
|
|
*/
|
|
protected static $_uaSignatures = array(
|
|
'iphone',
|
|
'ipod',
|
|
'ipad',
|
|
'android',
|
|
'blackberry',
|
|
'opera mini',
|
|
'opera mobi',
|
|
'palm',
|
|
'palmos',
|
|
'elaine',
|
|
'windows ce',
|
|
'icab',
|
|
'_mms',
|
|
'ahong',
|
|
'archos',
|
|
'armv',
|
|
'astel',
|
|
'avantgo',
|
|
'benq',
|
|
'blazer',
|
|
'brew',
|
|
'com2',
|
|
'compal',
|
|
'danger',
|
|
'pocket',
|
|
'docomo',
|
|
'epoc',
|
|
'ericsson',
|
|
'eudoraweb',
|
|
'hiptop',
|
|
'htc-',
|
|
'htc_',
|
|
'iemobile',
|
|
'ipad',
|
|
'iris',
|
|
'j-phone',
|
|
'kddi',
|
|
'kindle',
|
|
'lg ',
|
|
'lg-',
|
|
'lg/',
|
|
'lg;lx',
|
|
'lge vx',
|
|
'lge',
|
|
'lge-',
|
|
'lge-cx',
|
|
'lge-lx',
|
|
'lge-mx',
|
|
'linux armv',
|
|
'maemo',
|
|
'midp',
|
|
'mini 9.5',
|
|
'minimo',
|
|
'mob-x',
|
|
'mobi',
|
|
'mobile',
|
|
'mobilephone',
|
|
'mot 24',
|
|
'mot-',
|
|
'motorola',
|
|
'n410',
|
|
'netfront',
|
|
'nintendo wii',
|
|
'nintendo',
|
|
'nitro',
|
|
'nokia',
|
|
'novarra-vision',
|
|
'nuvifone',
|
|
'openweb',
|
|
'oper',
|
|
'opwv',
|
|
'palmsource',
|
|
'pdxgw',
|
|
'phone',
|
|
'playstation',
|
|
'polaris',
|
|
'portalmmm',
|
|
'qt embedded',
|
|
'reqwirelessweb',
|
|
'sagem',
|
|
'sam-r',
|
|
'samsu',
|
|
'samsung',
|
|
'sec-',
|
|
'sec-sgh',
|
|
'semc-browser',
|
|
'series60',
|
|
'series70',
|
|
'series80',
|
|
'series90',
|
|
'sharp',
|
|
'sie-m',
|
|
'sie-s',
|
|
'smartphone',
|
|
'sony cmd',
|
|
'sonyericsson',
|
|
'sprint',
|
|
'spv',
|
|
'symbian os',
|
|
'symbian',
|
|
'symbianos',
|
|
'telco',
|
|
'teleca',
|
|
'treo',
|
|
'up.browser',
|
|
'up.link',
|
|
'vodafone',
|
|
'vodaphone',
|
|
'webos',
|
|
'wml',
|
|
'windows phone os 7',
|
|
'wireless',
|
|
'wm5 pie',
|
|
'wms pie',
|
|
'xiino',
|
|
'wap',
|
|
'up/',
|
|
'psion',
|
|
'j2me',
|
|
'klondike',
|
|
'kbrowser'
|
|
);
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected static $_haTerms = array(
|
|
'midp',
|
|
'wml',
|
|
'vnd.rim',
|
|
'vnd.wap',
|
|
'j2me',
|
|
);
|
|
|
|
/**
|
|
* first 4 letters of mobile User Agent chains
|
|
*
|
|
* @var array
|
|
*/
|
|
protected static $_uaBegin = array(
|
|
'w3c ',
|
|
'acs-',
|
|
'alav',
|
|
'alca',
|
|
'amoi',
|
|
'audi',
|
|
'avan',
|
|
'benq',
|
|
'bird',
|
|
'blac',
|
|
'blaz',
|
|
'brew',
|
|
'cell',
|
|
'cldc',
|
|
'cmd-',
|
|
'dang',
|
|
'doco',
|
|
'eric',
|
|
'hipt',
|
|
'inno',
|
|
'ipaq',
|
|
'java',
|
|
'jigs',
|
|
'kddi',
|
|
'keji',
|
|
'leno',
|
|
'lg-c',
|
|
'lg-d',
|
|
'lg-g',
|
|
'lge-',
|
|
'maui',
|
|
'maxo',
|
|
'midp',
|
|
'mits',
|
|
'mmef',
|
|
'mobi',
|
|
'mot-',
|
|
'moto',
|
|
'mwbp',
|
|
'nec-',
|
|
'newt',
|
|
'noki',
|
|
'palm',
|
|
'pana',
|
|
'pant',
|
|
'phil',
|
|
'play',
|
|
'port',
|
|
'prox',
|
|
'qwap',
|
|
'sage',
|
|
'sams',
|
|
'sany',
|
|
'sch-',
|
|
'sec-',
|
|
'send',
|
|
'seri',
|
|
'sgh-',
|
|
'shar',
|
|
'sie-',
|
|
'siem',
|
|
'smal',
|
|
'smar',
|
|
'sony',
|
|
'sph-',
|
|
'symb',
|
|
't-mo',
|
|
'teli',
|
|
'tim-',
|
|
'tosh',
|
|
'tsm-',
|
|
'upg1',
|
|
'upsi',
|
|
'vk-v',
|
|
'voda',
|
|
'wap-',
|
|
'wapa',
|
|
'wapi',
|
|
'wapp',
|
|
'wapr',
|
|
'webc',
|
|
'winw',
|
|
'winw',
|
|
'xda',
|
|
'xda-',
|
|
);
|
|
|
|
/**
|
|
* Comparison of the UserAgent chain and User Agent signatures
|
|
*
|
|
* @param string $userAgent User Agent chain
|
|
* @param array $server $_SERVER like param
|
|
* @return bool
|
|
*/
|
|
public static function match($userAgent, $server)
|
|
{
|
|
// To have a quick identification, try light-weight tests first
|
|
if (isset($server['all_http'])) {
|
|
if (strpos(strtolower(str_replace(' ', '', $server['all_http'])), 'operam') !== false) {
|
|
// Opera Mini or Opera Mobi
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (isset($server['http_x_wap_profile']) || isset($server['http_profile'])) {
|
|
return true;
|
|
}
|
|
|
|
if (isset($server['http_accept'])) {
|
|
if (self::_matchAgentAgainstSignatures($server['http_accept'], self::$_haTerms)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (self::userAgentStart($userAgent)) {
|
|
return true;
|
|
}
|
|
|
|
if (self::_matchAgentAgainstSignatures($userAgent, self::$_uaSignatures)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Retrieve beginning clause of user agent
|
|
*
|
|
* @param string $userAgent
|
|
* @return string
|
|
*/
|
|
public static function userAgentStart($userAgent)
|
|
{
|
|
|
|
$mobile_ua = strtolower(substr($userAgent, 0, 4));
|
|
|
|
return (in_array($mobile_ua, self::$_uaBegin));
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct($userAgent = null, array $server = array(), array $config = array())
|
|
{
|
|
// For mobile detection, an adapter must be defined
|
|
if (empty($config['mobile']['features'])) {
|
|
$config['mobile']['features']['path'] = self::DEFAULT_FEATURES_ADAPTER_PATH;
|
|
$config['mobile']['features']['classname'] = self::DEFAULT_FEATURES_ADAPTER_CLASSNAME;
|
|
}
|
|
parent::__construct($userAgent, $server, $config);
|
|
}
|
|
|
|
/**
|
|
* Gives the current browser type
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getType()
|
|
{
|
|
return 'mobile';
|
|
}
|
|
|
|
/**
|
|
* Look for features
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function _defineFeatures()
|
|
{
|
|
$this->setFeature('is_wireless_device', false, 'product_info');
|
|
|
|
parent::_defineFeatures();
|
|
|
|
if (isset($this->_aFeatures["mobile_browser"])) {
|
|
$this->setFeature("browser_name", $this->_aFeatures["mobile_browser"]);
|
|
$this->_browser = $this->_aFeatures["mobile_browser"];
|
|
}
|
|
if (isset($this->_aFeatures["mobile_browser_version"])) {
|
|
$this->setFeature("browser_version", $this->_aFeatures["mobile_browser_version"]);
|
|
$this->_browserVersion = $this->_aFeatures["mobile_browser_version"];
|
|
}
|
|
|
|
// markup
|
|
if ($this->getFeature('device_os') == 'iPhone OS'
|
|
|| $this->getFeature('device_os_token') == 'iPhone OS'
|
|
) {
|
|
$this->setFeature('markup', 'iphone');
|
|
} else {
|
|
$this->setFeature('markup', $this->getMarkupLanguage($this->getFeature('preferred_markup')));
|
|
}
|
|
|
|
// image format
|
|
$this->_images = array();
|
|
|
|
if ($this->getFeature('png')) {
|
|
$this->_images[] = 'png';
|
|
}
|
|
if ($this->getFeature('jpg')) {
|
|
$this->_images[] = 'jpg';
|
|
}
|
|
if ($this->getFeature('gif')) {
|
|
$this->_images[] = 'gif';
|
|
}
|
|
if ($this->getFeature('wbmp')) {
|
|
$this->_images[] = 'wbmp';
|
|
}
|
|
|
|
return $this->_aFeatures;
|
|
}
|
|
|
|
/**
|
|
* Determine markup language expected
|
|
*
|
|
* @access public
|
|
* @return __TYPE__
|
|
*/
|
|
public function getMarkupLanguage($preferredMarkup = null)
|
|
{
|
|
$return = '';
|
|
switch ($preferredMarkup) {
|
|
case 'wml_1_1':
|
|
case 'wml_1_2':
|
|
case 'wml_1_3':
|
|
$return = 'wml'; //text/vnd.wap.wml encoding="ISO-8859-15"
|
|
case 'html_wi_imode_compact_generic':
|
|
case 'html_wi_imode_html_1':
|
|
case 'html_wi_imode_html_2':
|
|
case 'html_wi_imode_html_3':
|
|
case 'html_wi_imode_html_4':
|
|
case 'html_wi_imode_html_5':
|
|
$return = 'chtml'; //text/html
|
|
case 'html_wi_oma_xhtmlmp_1_0': //application/vnd.wap.xhtml+xml
|
|
case 'html_wi_w3_xhtmlbasic': //application/xhtml+xml DTD XHTML Basic 1.0
|
|
$return = 'xhtml';
|
|
case 'html_web_3_2': //text/html DTD Html 3.2 Final
|
|
case 'html_web_4_0': //text/html DTD Html 4.01 Transitional
|
|
$return = '';
|
|
}
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Determine image format support
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getImageFormatSupport()
|
|
{
|
|
return $this->_images;
|
|
}
|
|
|
|
/**
|
|
* Determine maximum image height supported
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getMaxImageHeight()
|
|
{
|
|
return $this->getFeature('max_image_height');
|
|
}
|
|
|
|
/**
|
|
* Determine maximum image width supported
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getMaxImageWidth()
|
|
{
|
|
return $this->getFeature('max_image_width');
|
|
}
|
|
|
|
/**
|
|
* Determine physical screen height
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getPhysicalScreenHeight()
|
|
{
|
|
return $this->getFeature('physical_screen_height');
|
|
}
|
|
|
|
/**
|
|
* Determine physical screen width
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getPhysicalScreenWidth()
|
|
{
|
|
return $this->getFeature('physical_screen_width');
|
|
}
|
|
|
|
/**
|
|
* Determine preferred markup
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getPreferredMarkup()
|
|
{
|
|
return $this->getFeature("markup");
|
|
}
|
|
|
|
/**
|
|
* Determine X/HTML support level
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getXhtmlSupportLevel()
|
|
{
|
|
return $this->getFeature('xhtml_support_level');
|
|
}
|
|
|
|
/**
|
|
* Does the device support Flash?
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasFlashSupport()
|
|
{
|
|
return $this->getFeature('fl_browser');
|
|
}
|
|
|
|
/**
|
|
* Does the device support PDF?
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasPdfSupport()
|
|
{
|
|
return $this->getFeature('pdf_support');
|
|
}
|
|
|
|
/**
|
|
* Does the device have an associated phone number?
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasPhoneNumber()
|
|
{
|
|
return $this->getFeature('can_assign_phone_number');
|
|
}
|
|
|
|
/**
|
|
* Does the device support HTTPS?
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function httpsSupport()
|
|
{
|
|
return ($this->getFeature('https_support') == 'supported');
|
|
}
|
|
}
|