0) { return TRUE; } return FALSE; } protected static function is_desktop_according_to_wurfl($ua) { if (preg_match('£^(webtrends|curl/|nutchcvs|windows-media-player/\d+|firefox/|enteos customer care|lynx/|opera/\d+|nsplayer/\d+\.\d+\.\d+\.\d+|mozilla/\d+\.\d+|mimanet\! webtools \(http\://www\.mimanet\.com/scripts/webtools\.html\)|vobsub|opera \d+|getright|fun web products|mediapartners-google/\d+\.\d+)£i', $ua) > 0) { return TRUE; } return FALSE; } protected static function is_wireless_according_to_headers() { if (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_X_OPERAMINI_PHONE']) || isset($_SERVER['HTTP_X_NOKIA_GID']) || isset($_SERVER['HTTP_X_NOKIA_BEARER']) || isset($_SERVER['HTTP_X_ICAP_VERSION']) || isset($_SERVER['HTTP_UA_VOICE'])) { return TRUE; } if (preg_match('£vnd\.symbian\.install|3gpp|vnd\.wap|vnd\.sun\.j2me|vnd\.smaf|vnd\.oma\.drm|text/orangeml£i', @$_SERVER['HTTP_ACCEPT']) > 0) { return TRUE; } return FALSE; } protected static function is_desktop_according_to_shortcuts($ua) { if (stripos($ua, 'Windows') !== FALSE && stripos($ua, 'Windows CE') === FALSE && stripos($ua, 'Windows generic') === FALSE) { return TRUE; } return FALSE; } /** * Retourne si un terminal est mobile ou non, d'après un cookie. * * @return boolean NULL si le cookie n'existe pas, TRUE ou FALSE sinon. */ protected static function is_wireless_according_to_cookies() { $is_wireless = @$_COOKIE[WIRELESS_DETECTOR_COOKIE_NAME]; if ($is_wireless === '0') { return FALSE; } if ($is_wireless === '1') { return TRUE; } return NULL; } /** * Tente de mémoriser le type de terminal dans un cookie. * * @param boolean $status TRUE s'il s'agit d'un terminal mobile, FALSE sinon. * @return boolean FALSE en cas d'erreur */ protected static function store_wireless_status_into_cookies($status) { if ($status === FALSE) { $cookie_value = '0'; } elseif ($status === TRUE) { $cookie_value = '1'; } else { return FALSE; } return @setcookie(WIRELESS_DETECTOR_COOKIE_NAME, $cookie_value, time() + WIRELESS_DETECTOR_COOKIE_EXPIRATION, '/'); } /** * Teste si le client est un mobile. * * Cette methode tente de determiner si un client est un mobile, * @return boolean TRUE si c'est le cas et FALSE s'il s'agit d'un poste fixe. */ public static function is_wireless() { $is_wireless_according_to_cookies = self::is_wireless_according_to_cookies(); if ($is_wireless_according_to_cookies !== NULL) { return $is_wireless_according_to_cookies; } $is_wireless_according_to_headers = self::is_wireless_according_to_headers(); $ua = @$_SERVER['HTTP_USER_AGENT']; if (empty($ua)) { self::store_wireless_status_into_cookies($is_wireless_according_to_headers); return $is_wireless_according_to_headers; } if (self::is_desktop_according_to_shortcuts($ua) === TRUE) { self::store_wireless_status_into_cookies(FALSE); return FALSE; } $is_wireless_according_to_wurfl = self::is_wireless_according_to_wurfl($ua); $is_desktop_according_to_wurfl = self::is_desktop_according_to_wurfl($ua); $default_is_wireless = FALSE; if ($is_wireless_according_to_wurfl === FALSE) { if ($is_desktop_according_to_wurfl === FALSE) { self::store_wireless_status_into_cookies($is_wireless_according_to_headers); return $is_wireless_according_to_headers; } else { if ($is_wireless_according_to_headers === FALSE) { self::store_wireless_status_into_cookies(FALSE); return FALSE; } else { return $default_is_wireless; } } } else { if ($is_desktop_according_to_wurfl === FALSE) { if ($is_wireless_according_to_headers === FALSE) { return !$default_is_wireless; } else { self::store_wireless_status_into_cookies(TRUE); return TRUE; } } else { if ($is_wireless_according_to_headers === FALSE) { self::store_wireless_status_into_cookies($default_is_wireless); return $default_is_wireless; } else { return !$default_is_wireless; } } } } /** * Teste si le client est un poste fixe. * * Cette methode tente de determiner si un client est un poste fixe, * @return boolean TRUE si c'est le cas et FALSE s'il s'agit d'un mobile. */ public static function is_desktop() { return !self::is_wireless(); } /** * Redirige le client sur une autre URL, en utilisant le WML si necessaire. * * @param string $url L'URL de destination. */ public static function redirect_to_url($url) { header('Location: ' . $url); header('Cache-Control: no-cache, must-revalidate'); header('Pragma: no-cache'); if (stripos((string) @$_SERVER['HTTP_ACCEPT'], 'vnd.wap') === FALSE) { exit(0); } header('Content-type: text/vnd.wap.wml'); echo '' . "\n"; echo ' ' . "\n"; $xml_escaped_url = htmlspecialchars($url, ENT_QUOTES); $xml_escaped_url = preg_replace('/�*39;/', ''', $xml_escaped_url); echo ' ' . "\n"; echo ' ' . "\n"; echo '' . "\n"; exit(0); } }