source: branches/version-2/data/module/Net/UserAgent/Mobile.php @ 17127

Revision 17127, 13.2 KB checked in by satou, 15 years ago (diff)

PEARモジュールの更新

  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/* vim: set expandtab tabstop=4 shiftwidth=4: */
3
4/**
5 * PHP versions 4 and 5
6 *
7 * LICENSE: This source file is subject to version 3.0 of the PHP license
8 * that is available through the world-wide-web at the following URI:
9 * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
10 * the PHP License and are unable to obtain it through the web, please
11 * send a note to license@php.net so we can mail you a copy immediately.
12 *
13 * @category   Networking
14 * @package    Net_UserAgent_Mobile
15 * @author     KUBO Atsuhiro <iteman@users.sourceforge.net>
16 * @copyright  2003-2008 KUBO Atsuhiro <iteman@users.sourceforge.net>
17 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
18 * @version    CVS: $Id$
19 * @since      File available since Release 0.1
20 */
21
22require_once 'PEAR.php';
23
24// {{{ constants
25
26/**
27 * Constants for error handling.
28 */
29define('NET_USERAGENT_MOBILE_OK',               1);
30define('NET_USERAGENT_MOBILE_ERROR',           -1);
31define('NET_USERAGENT_MOBILE_ERROR_NOMATCH',   -2);
32define('NET_USERAGENT_MOBILE_ERROR_NOT_FOUND', -3);
33
34// }}}
35// {{{ GLOBALS
36
37/**
38 * globals for fallback on no match
39 *
40 * @global boolean $GLOBALS['_NET_USERAGENT_MOBILE_FALLBACK_ON_NOMATCH']
41 */
42$GLOBALS['_NET_USERAGENT_MOBILE_FALLBACK_ON_NOMATCH'] = false;
43
44// }}}
45// {{{ Net_UserAgent_Mobile
46
47/**
48 * HTTP mobile user agent string parser
49 *
50 * Net_UserAgent_Mobile parses HTTP_USER_AGENT strings of (mainly Japanese)
51 * mobile HTTP user agents. It'll be useful in page dispatching by user
52 * agents.
53 * This package was ported from Perl's HTTP::MobileAgent.
54 * See {@link http://search.cpan.org/search?mode=module&query=HTTP-MobileAgent}
55 * The author of the HTTP::MobileAgent module is Tatsuhiko Miyagawa
56 * <miyagawa@bulknews.net>
57 *
58 * SYNOPSIS:
59 * <code>
60 * require_once 'Net/UserAgent/Mobile.php';
61 *
62 * $agent = &Net_UserAgent_Mobile::factory($agent_string);
63 * // or $agent = &Net_UserAgent_Mobile::factory(); // to get from $_SERVER
64 *
65 * if ($agent->isDoCoMo()) {
66 *     // or if ($agent->getName() == 'DoCoMo')
67 *     // or if (strtolower(get_class($agent)) == 'http_mobileagent_docomo')
68 *     // it's NTT DoCoMo i-mode
69 *     // see what's available in Net_UserAgent_Mobile_DoCoMo
70 * } elseif ($agent->isVodafone()) {
71 *     // it's Vodafone(J-PHONE)
72 *     // see what's available in Net_UserAgent_Mobile_Vodafone
73 * } elseif ($agent->isEZweb()) {
74 *     // it's KDDI/EZWeb
75 *     // see what's available in Net_UserAgent_Mobile_EZweb
76 * } else {
77 *     // may be PC
78 *     // $agent is Net_UserAgent_Mobile_NonMobile
79 * }
80 *
81 * $display = $agent->getDisplay();    // Net_UserAgent_Mobile_Display
82 * if ($display->isColor()) {
83 *    ...
84 * }
85 * </code>
86 *
87 * @category   Networking
88 * @package    Net_UserAgent_Mobile
89 * @author     KUBO Atsuhiro <iteman@users.sourceforge.net>
90 * @copyright  2003-2008 KUBO Atsuhiro <iteman@users.sourceforge.net>
91 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
92 * @version    Release: 0.31.0
93 * @since      Class available since Release 0.1
94 */
95class Net_UserAgent_Mobile
96{
97
98    // {{{ properties
99
100    /**#@+
101     * @access public
102     */
103
104    /**#@-*/
105
106    /**#@+
107     * @access private
108     */
109
110    /**#@-*/
111
112    /**#@+
113     * @access public
114     * @static
115     */
116
117    // }}}
118    // {{{ factory()
119
120    /**
121     * create a new {@link Net_UserAgent_Mobile_Common} subclass instance
122     *
123     * parses HTTP headers and constructs {@link Net_UserAgent_Mobile_Common}
124     * subclass instance.
125     * If no argument is supplied, $_SERVER{'HTTP_*'} is used.
126     *
127     * @param string $userAgent User-Agent string
128     * @return mixed a newly created Net_UserAgent_Mobile object, or a PEAR
129     *     error object on error
130     */
131    function &factory($userAgent = null)
132    {
133        if (is_null($userAgent)) {
134            $userAgent = $_SERVER['HTTP_USER_AGENT'];
135        }
136
137        // parse User-Agent string
138        if (Net_UserAgent_Mobile::isDoCoMo($userAgent)) {
139            $driver = 'DoCoMo';
140        } elseif (Net_UserAgent_Mobile::isEZweb($userAgent)) {
141            $driver = 'EZweb';
142        } elseif (Net_UserAgent_Mobile::isSoftBank($userAgent)) {
143            $driver = 'SoftBank';
144        } elseif (Net_UserAgent_Mobile::isWillcom($userAgent)) {
145            $driver = 'Willcom';
146        } else {
147            $driver = 'NonMobile';
148        }
149
150        $class = "Net_UserAgent_Mobile_$driver";
151
152        if (!class_exists($class)) {
153            $file = str_replace('_', '/', $class) . '.php';
154            if (!include_once $file) {
155                return PEAR::raiseError(null,
156                                        NET_USERAGENT_MOBILE_ERROR_NOT_FOUND,
157                                        null, null,
158                                        "Unable to include the $file file",
159                                        'Net_UserAgent_Mobile_Error', true
160                                        );
161            }
162        }
163
164        $instance = &new $class($userAgent);
165        $error = &$instance->isError();
166        if (Net_UserAgent_Mobile::isError($error)) {
167            if ($GLOBALS['_NET_USERAGENT_MOBILE_FALLBACK_ON_NOMATCH']
168                && $error->getCode() == NET_USERAGENT_MOBILE_ERROR_NOMATCH
169                ) {
170                $instance = &Net_UserAgent_Mobile::factory('Net_UserAgent_Mobile_Fallback_On_NoMatch');
171                return $instance;
172            }
173
174            $instance = &$error;
175        }
176
177        return $instance;
178    }
179
180    // }}}
181    // {{{ singleton()
182
183    /**
184     * creates a new {@link Net_UserAgent_Mobile_Common} subclass instance or
185     * returns a instance from existent ones
186     *
187     * @param string $userAgent User-Agent string
188     * @return mixed a newly created or a existent Net_UserAgent_Mobile
189     *     object, or a PEAR error object on error
190     * @see Net_UserAgent_Mobile::factory()
191     */
192    function &singleton($userAgent = null)
193    {
194        static $instances;
195
196        if (!isset($instances)) {
197            $instances = array();
198        }
199
200        if (is_null($userAgent)) {
201            $userAgent = $_SERVER['HTTP_USER_AGENT'];
202        }
203
204        if (!array_key_exists($userAgent, $instances)) {
205            $instances[$userAgent] = Net_UserAgent_Mobile::factory($userAgent);
206        }
207
208        return $instances[$userAgent];
209    }
210
211    // }}}
212    // {{{ isError()
213
214    /**
215     * tell whether a result code from a Net_UserAgent_Mobile method
216     * is an error
217     *
218     * @param integer $value result code
219     * @return boolean whether $value is an {@link Net_UserAgent_Mobile_Error}
220     */
221    function isError($value)
222    {
223        return is_a($value, 'Net_UserAgent_Mobile_Error');
224    }
225
226    // }}}
227    // {{{ errorMessage()
228
229    /**
230     * return a textual error message for a Net_UserAgent_Mobile error code
231     *
232     * @param integer $value error code
233     * @return string error message, or false if the error code was not
234     *     recognized
235     */
236    function errorMessage($value)
237    {
238        static $errorMessages;
239        if (!isset($errorMessages)) {
240            $errorMessages = array(
241                                   NET_USERAGENT_MOBILE_ERROR           => 'unknown error',
242                                   NET_USERAGENT_MOBILE_ERROR_NOMATCH   => 'no match',
243                                   NET_USERAGENT_MOBILE_ERROR_NOT_FOUND => 'not found',
244                                   NET_USERAGENT_MOBILE_OK              => 'no error'
245                                   );
246        }
247
248        if (Net_UserAgent_Mobile::isError($value)) {
249            $value = $value->getCode();
250        }
251
252        return isset($errorMessages[$value]) ?
253            $errorMessages[$value] :
254            $errorMessages[NET_USERAGENT_MOBILE_ERROR];
255    }
256
257    // }}}
258    // {{{ isMobile()
259
260    /**
261     * Checks whether or not the user agent is mobile by a given user agent
262     * string.
263     *
264     * @param string $userAgent
265     * @return boolean
266     * @since Method available since Release 0.31.0
267     */
268    function isMobile($userAgent = null)
269    {
270        if (Net_UserAgent_Mobile::isDoCoMo($userAgent)) {
271            return true;
272        } elseif (Net_UserAgent_Mobile::isEZweb($userAgent)) {
273            return true;
274        } elseif (Net_UserAgent_Mobile::isSoftBank($userAgent)) {
275            return true;
276        } elseif (Net_UserAgent_Mobile::isWillcom($userAgent)) {
277            return true;
278        }
279
280        return false;
281    }
282
283    // }}}
284    // {{{ isDoCoMo()
285
286    /**
287     * Checks whether or not the user agent is DoCoMo by a given user agent
288     * string.
289     *
290     * @param string $userAgent
291     * @return boolean
292     * @since Method available since Release 0.31.0
293     */
294    function isDoCoMo($userAgent = null)
295    {
296        if (is_null($userAgent)) {
297            $userAgent = $_SERVER['HTTP_USER_AGENT'];
298        }
299
300        if (preg_match('!^DoCoMo!', $userAgent)) {
301            return true;
302        }
303
304        return false;
305    }
306
307    // }}}
308    // {{{ isEZweb()
309
310    /**
311     * Checks whether or not the user agent is EZweb by a given user agent
312     * string.
313     *
314     * @param string $userAgent
315     * @return boolean
316     * @since Method available since Release 0.31.0
317     */
318    function isEZweb($userAgent = null)
319    {
320        if (is_null($userAgent)) {
321            $userAgent = $_SERVER['HTTP_USER_AGENT'];
322        }
323
324        if (preg_match('!^KDDI-!', $userAgent)) {
325            return true;
326        } elseif (preg_match('!^UP\.Browser!', $userAgent)) {
327            return true;
328        }
329
330        return false;
331    }
332
333    // }}}
334    // {{{ isSoftBank()
335
336    /**
337     * Checks whether or not the user agent is SoftBank by a given user agent
338     * string.
339     *
340     * @param string $userAgent
341     * @return boolean
342     * @since Method available since Release 0.31.0
343     */
344    function isSoftBank($userAgent = null)
345    {
346        if (is_null($userAgent)) {
347            $userAgent = $_SERVER['HTTP_USER_AGENT'];
348        }
349
350        if (preg_match('!^SoftBank!', $userAgent)) {
351            return true;
352        } elseif (preg_match('!^Semulator!', $userAgent)) {
353            return true;
354        } elseif (preg_match('!^Vodafone!', $userAgent)) {
355            return true;
356        } elseif (preg_match('!^Vemulator!', $userAgent)) {
357            return true;
358        } elseif (preg_match('!^MOT-!', $userAgent)) {
359            return true;
360        } elseif (preg_match('!^MOTEMULATOR!', $userAgent)) {
361            return true;
362        } elseif (preg_match('!^J-PHONE!', $userAgent)) {
363            return true;
364        } elseif (preg_match('!^J-EMULATOR!', $userAgent)) {
365            return true;
366        }
367
368        return false;
369    }
370
371    // }}}
372    // {{{ isWillcom()
373
374    /**
375     * Checks whether or not the user agent is Willcom by a given user agent
376     * string.
377     *
378     * @param string $userAgent
379     * @return boolean
380     * @since Method available since Release 0.31.0
381     */
382    function isWillcom($userAgent = null)
383    {
384        if (is_null($userAgent)) {
385            $userAgent = $_SERVER['HTTP_USER_AGENT'];
386        }
387
388        if (preg_match('!^Mozilla/3\.0\((?:DDIPOCKET|WILLCOM);!', $userAgent)) {
389            return true;
390        }
391
392        return false;
393    }
394
395    /**#@-*/
396
397    /**#@+
398     * @access private
399     */
400
401    /**#@-*/
402
403    // }}}
404}
405
406// }}}
407// {{{ Net_UserAgent_Mobile_Error
408
409/**
410 * Net_UserAgent_Mobile_Error implements a class for reporting user
411 * agent error messages
412 *
413 * @category   Networking
414 * @package    Net_UserAgent_Mobile
415 * @author     KUBO Atsuhiro <iteman@users.sourceforge.net>
416 * @copyright  2003-2007 KUBO Atsuhiro <iteman@users.sourceforge.net>
417 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
418 * @version    Release: 0.31.0
419 * @since      Class available since Release 0.1
420 */
421class Net_UserAgent_Mobile_Error extends PEAR_Error
422{
423
424    // {{{ properties
425
426    /**#@+
427     * @access public
428     */
429
430    /**#@-*/
431
432    /**#@+
433     * @access private
434     */
435
436    /**#@-*/
437
438    /**#@+
439     * @access public
440     */
441
442    // }}}
443    // {{{ constructor
444
445    /**
446     * constructor
447     *
448     * @param mixed   $code     Net_UserAgent_Mobile error code, or string
449     *     with error message.
450     * @param integer $mode     what 'error mode' to operate in
451     * @param integer $level    what error level to use for $mode and
452     *     PEAR_ERROR_TRIGGER
453     * @param mixed   $userinfo additional user/debug info
454     * @access public
455     */
456    function Net_UserAgent_Mobile_Error($code = NET_USERAGENT_MOBILE_ERROR,
457                                        $mode = PEAR_ERROR_RETURN,
458                                        $level = E_USER_NOTICE,
459                                        $userinfo = null
460                                        )
461    {
462        if (is_int($code)) {
463            $this->PEAR_Error('Net_UserAgent_Mobile Error: ' .
464                              Net_UserAgent_Mobile::errorMessage($code),
465                              $code, $mode, $level, $userinfo
466                              );
467        } else {
468            $this->PEAR_Error("Net_UserAgent_Mobile Error: $code",
469                              NET_USERAGENT_MOBILE_ERROR, $mode, $level,
470                              $userinfo
471                              );
472        }
473    }
474
475    /**#@-*/
476
477    /**#@+
478     * @access private
479     */
480
481    /**#@-*/
482
483    // }}}
484}
485
486// }}}
487
488/*
489 * Local Variables:
490 * mode: php
491 * coding: iso-8859-1
492 * tab-width: 4
493 * c-basic-offset: 4
494 * c-hanging-comment-ender-p: nil
495 * indent-tabs-mode: nil
496 * End:
497 */
Note: See TracBrowser for help on using the repository browser.