public function __construct(TeraWurfl $wurfl) { parent::__construct($wurfl); }
/** * Determines which UserAgentMatcher is the best fit for the incoming user agent and returns it * @param TeraWurfl $wurfl * @param String $userAgent * @return UserAgentMatcher */ public static function createUserAgentMatcher(TeraWurfl $wurfl, $userAgent) { // $isMobile means it IS MOBILE, $isDesktop means it IS DESKTOP // $isMobile does NOT mean it IS DESKTOP and vica-versa $isMobile = UserAgentUtils::isMobileBrowser($userAgent); $isDesktop = UserAgentUtils::isDesktopBrowser($userAgent); $userAgent_lcase = strtolower($userAgent); // Process exceptions if (TeraWurflConfig::$SIMPLE_DESKTOP_ENGINE_ENABLE && $userAgent == WurflConstants::$SIMPLE_DESKTOP_UA) { // SimpleDesktopUserAgentMatcher is included via require_once realpath(dirname(__FILE__).'/in TeraWurfl.php return new SimpleDesktopUserAgentMatcher($wurfl); } // Process MOBILE user agents if (!$isDesktop) { // High workload UAMs go first // Nokia if (UserAgentMatcher::contains($userAgent_lcase, 'nokia')) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/NokiaUserAgentMatcher.php'); return new NokiaUserAgentMatcher($wurfl); } // Samsung if (UserAgentMatcher::contains($userAgent, array("Samsung/SGH", "SAMSUNG-SGH")) || UserAgentMatcher::startsWith($userAgent, array("SEC-", "Samsung", "SAMSUNG", "SPH", "SGH", "SCH")) || stripos($userAgent, 'samsung') !== false) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/SamsungUserAgentMatcher.php'); return new SamsungUserAgentMatcher($wurfl); } // Blackberry if (stripos($userAgent, "blackberry") !== false) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/BlackBerryUserAgentMatcher.php'); return new BlackBerryUserAgentMatcher($wurfl); } // SonyEricsson if (UserAgentMatcher::contains($userAgent, 'Sony')) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/SonyEricssonUserAgentMatcher.php'); return new SonyEricssonUserAgentMatcher($wurfl); } // Motorola if (UserAgentMatcher::startsWith($userAgent, array('Mot-', 'MOT-', 'MOTO', 'moto')) || UserAgentMatcher::contains($userAgent, 'Motorola')) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/MotorolaUserAgentMatcher.php'); return new MotorolaUserAgentMatcher($wurfl); } // Continue processing UAMs in alphabetical order // Alcatel if (UserAgentMatcher::startsWith($userAgent_lcase, "alcatel")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/AlcatelUserAgentMatcher.php'); return new AlcatelUserAgentMatcher($wurfl); } // Apple if (UserAgentMatcher::contains($userAgent, array("iPhone", "iPod", "iPad", "(iphone"))) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/AppleUserAgentMatcher.php'); return new AppleUserAgentMatcher($wurfl); } // BenQ if (UserAgentMatcher::startsWith($userAgent_lcase, "benq")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/BenQUserAgentMatcher.php'); return new BenQUserAgentMatcher($wurfl); } // DoCoMo if (UserAgentMatcher::startsWith($userAgent, "DoCoMo")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/DoCoMoUserAgentMatcher.php'); return new DoCoMoUserAgentMatcher($wurfl); } // Grundig if (UserAgentMatcher::startsWith($userAgent_lcase, "grundig")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/GrundigUserAgentMatcher.php'); return new GrundigUserAgentMatcher($wurfl); } // HTC if (UserAgentMatcher::contains($userAgent, array("HTC", "XV6875"))) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/HTCUserAgentMatcher.php'); return new HTCUserAgentMatcher($wurfl); } // KDDI if (UserAgentMatcher::contains($userAgent, "KDDI-")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/KddiUserAgentMatcher.php'); return new KddiUserAgentMatcher($wurfl); } // Kyocera if (UserAgentMatcher::startsWith($userAgent, array("kyocera", "QC-", "KWC-"))) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/KyoceraUserAgentMatcher.php'); return new KyoceraUserAgentMatcher($wurfl); } // LG if (UserAgentMatcher::startsWith($userAgent_lcase, "lg")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/LGUserAgentMatcher.php'); return new LGUserAgentMatcher($wurfl); } // Mitsubishi if (UserAgentMatcher::startsWith($userAgent, "Mitsu")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/MitsubishiUserAgentMatcher.php'); return new MitsubishiUserAgentMatcher($wurfl); } // NEC if (UserAgentMatcher::startsWith($userAgent, array("NEC-", "KGT"))) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/NecUserAgentMatcher.php'); return new NecUserAgentMatcher($wurfl); } // Nintendo if (UserAgentMatcher::contains($userAgent, "Nintendo") || UserAgentMatcher::startsWith($userAgent, 'Mozilla/') && UserAgentMatcher::contains($userAgent, "Nitro") && UserAgentMatcher::contains($userAgent, "Opera")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/NintendoUserAgentMatcher.php'); return new NintendoUserAgentMatcher($wurfl); } // Panasonic if (UserAgentMatcher::startsWith($userAgent, "Panasonic")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/PanasonicUserAgentMatcher.php'); return new PanasonicUserAgentMatcher($wurfl); } // Pantech if (UserAgentMatcher::startsWith($userAgent, array("Pantech", "PT-", "PANTECH", "PG-"))) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/PantechUserAgentMatcher.php'); return new PantechUserAgentMatcher($wurfl); } // Philips if (UserAgentMatcher::startsWith($userAgent_lcase, "philips")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/PhilipsUserAgentMatcher.php'); return new PhilipsUserAgentMatcher($wurfl); } // Portalmmm if (UserAgentMatcher::startsWith($userAgent, "portalmmm")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/PortalmmmUserAgentMatcher.php'); return new PortalmmmUserAgentMatcher($wurfl); } // Qtek if (UserAgentMatcher::startsWith($userAgent, "Qtek")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/QtekUserAgentMatcher.php'); return new QtekUserAgentMatcher($wurfl); } // Sagem if (UserAgentMatcher::startsWith($userAgent_lcase, "sagem")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/SagemUserAgentMatcher.php'); return new SagemUserAgentMatcher($wurfl); } // Sanyo if (UserAgentMatcher::startsWith($userAgent_lcase, "sanyo") || UserAgentMatcher::contains($userAgent, "MobilePhone")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/SanyoUserAgentMatcher.php'); return new SanyoUserAgentMatcher($wurfl); } // Sharp if (UserAgentMatcher::startsWith($userAgent_lcase, "sharp")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/SharpUserAgentMatcher.php'); return new SharpUserAgentMatcher($wurfl); } // Siemens if (UserAgentMatcher::startsWith($userAgent, "SIE-")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/SiemensUserAgentMatcher.php'); return new SiemensUserAgentMatcher($wurfl); } // SPV if (UserAgentMatcher::contains($userAgent, 'SPV')) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/SPVUserAgentMatcher.php'); return new SPVUserAgentMatcher($wurfl); } // Toshiba if (UserAgentMatcher::startsWith($userAgent, "Toshiba")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/ToshibaUserAgentMatcher.php'); return new ToshibaUserAgentMatcher($wurfl); } // Vodafone if (UserAgentMatcher::startsWith($userAgent, 'Vodafone')) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/VodafoneUserAgentMatcher.php'); return new VodafoneUserAgentMatcher($wurfl); } // Process mobile browsers after mobile devices // Android if (UserAgentMatcher::contains($userAgent, "Android")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/AndroidUserAgentMatcher.php'); return new AndroidUserAgentMatcher($wurfl); } // Opera Mini if (UserAgentMatcher::contains($userAgent, array('Opera Mini', 'Opera Mobi'))) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/OperaMiniUserAgentMatcher.php'); return new OperaMiniUserAgentMatcher($wurfl); } // Windows CE if (UserAgentMatcher::contains($userAgent, "Mozilla/") && UserAgentMatcher::contains($userAgent, "Windows CE")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/WindowsCEUserAgentMatcher.php'); return new WindowsCEUserAgentMatcher($wurfl); } } // End if(!$isDesktop) // Process Robots (Web Crawlers and the like) if (UserAgentUtils::isRobot($userAgent)) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/BotUserAgentMatcher.php'); return new BotUserAgentMatcher($wurfl); } // Process NON-MOBILE user agents if (!$isMobile) { // MSIE if (UserAgentMatcher::startsWith($userAgent, "Mozilla") && UserAgentMatcher::contains($userAgent, "MSIE") && !UserAgentMatcher::contains($userAgent, array("Opera", "armv", "MOTO", "BREW"))) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/MSIEUserAgentMatcher.php'); return new MSIEUserAgentMatcher($wurfl); } // Firefox if (UserAgentMatcher::contains($userAgent, "Firefox") && !UserAgentMatcher::contains($userAgent, array("Sony", "Novarra", "Opera"))) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/FirefoxUserAgentMatcher.php'); return new FirefoxUserAgentMatcher($wurfl); } // Chrome if (UserAgentMatcher::contains($userAgent, "Chrome")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/ChromeUserAgentMatcher.php'); return new ChromeUserAgentMatcher($wurfl); } // Konqueror if (UserAgentMatcher::contains($userAgent, "Konqueror")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/KonquerorUserAgentMatcher.php'); return new KonquerorUserAgentMatcher($wurfl); } // Opera if (UserAgentMatcher::contains($userAgent, "Opera")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/OperaUserAgentMatcher.php'); return new OperaUserAgentMatcher($wurfl); } // Safari if (UserAgentMatcher::startsWith($userAgent, "Mozilla") && UserAgentMatcher::contains($userAgent, "Safari")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/SafariUserAgentMatcher.php'); return new SafariUserAgentMatcher($wurfl); } // AOL if (UserAgentMatcher::contains($userAgent, array("AOL", "America Online")) || UserAgentMatcher::contains($userAgent_lcase, "aol 9")) { require_once realpath(dirname(__FILE__) . '/UserAgentMatchers/AOLUserAgentMatcher.php'); return new AOLUserAgentMatcher($wurfl); } } // Nothing has matched so we will have to use the CatchAllUserAgentMatcher return new CatchAllUserAgentMatcher($wurfl); }
public function getDeviceFromUA_RIS($userAgent, $tolerance, UserAgentMatcher &$matcher) { $this->numQueries++; $query = sprintf("CALL " . TeraWurflConfig::$TABLE_PREFIX . "_RIS(%s,%s,%s)", $this->SQLPrep($userAgent), $tolerance, $this->SQLPrep($matcher->tableSuffix())); $res = $this->dbcon->query($query); if (!$res) { throw new Exception(sprintf("Error in DB RIS Query: %s. \nQuery: %s\n", $this->dbcon->error, $query)); exit; } $data = $res->fetch_assoc(); $this->cleanConnection(); $wurflid = $data['DeviceID']; return $wurflid == 'NULL' || is_null($wurflid) ? WurflConstants::$GENERIC : $wurflid; }
public function getDeviceFromUA_RIS($userAgent, $tolerance, UserAgentMatcher &$matcher) { $this->numQueries++; $query = sprintf("EXEC " . TeraWurflConfig::$TABLE_PREFIX . "_RIS %s,%s,%s", $this->SQLPrep($userAgent), $tolerance, $this->SQLPrep($matcher->tableSuffix())); $result = sqlsrv_query($this->dbcon, $query); if (!$result) { throw new Exception(sprintf("Error in DB RIS Query: %s. \nQuery: %s\n", $this->lastDBError(), $query)); } $data = sqlsrv_fetch_array($result); sqlsrv_free_stmt($result); $wurflid = $data['DeviceID']; return $wurflid == 'NULL' || is_null($wurflid) ? WurflConstants::NO_MATCH : $wurflid; }
public function fullTableName() { return TeraWurflConfig::$TABLE_PREFIX . '_' . $this->userAgentMatcher->tableSuffix(); }
public function __construct(TeraWurfl $wurfl) { parent::__construct($wurfl); $this->matcher = $this->matcherName(); }
public function getDeviceFromUA_RIS($userAgent, $tolerance, UserAgentMatcher &$matcher) { $this->numQueries++; $stmt = $this->dbcon->prepare('CALL ' . TeraWurflConfig::$TABLE_PREFIX . '_RIS(?, ?, ?)'); if (!$stmt->execute(array($userAgent, $tolerance, $matcher->tableSuffix()))) { $error = $stmt->errorInfo(); throw new Exception(sprintf("Error in DB RIS Query: %s\n", $error[2])); } $data = $stmt->fetch(PDO::FETCH_ASSOC); $stmt = null; $wurflid = $data['DeviceID']; return $wurflid == 'NULL' || is_null($wurflid) ? WurflConstants::NO_MATCH : $wurflid; }
/** * RIS == Reduction in String (reduce string one char at a time) * * @param string $userAgent * @param int $tolerance * @param UserAgentMatcher $matcher * @return string A TW Device ID */ public function getDeviceFromUA_RIS($userAgent, $tolerance, UserAgentMatcher $matcher) { $toexec = 'function(ua, tolerance, matcher) { return performRis(ua, tolerance, matcher) }'; $args = array(utf8_encode($userAgent), $tolerance, $matcher->tableSuffix()); $this->numQueries++; $response = $this->dbcon->execute($toexec, $args); if (!empty($response['ok']) && $response['ok'] == 1 && !empty($response['retval'])) { return $response['retval']; } return WurflConstants::$GENERIC; }
/** * The given user agent is definitely from a mobile device * @param String User agent * @return Bool */ public static function isMobileBrowser($ua) { $lowerua = strtolower($ua); if (self::isDesktopBrowser($ua)) { return false; } if (UserAgentMatcher::contains($lowerua, WurflConstants::$MOBILE_BROWSERS)) { return true; } if (UserAgentMatcher::regexContains($ua, array('/[^\\d]\\d{3}x\\d{3}/'))) { return true; } return false; }
/** * Returns the matching WURFL ID for a given User Agent * @return string WURFL ID */ protected function getDeviceIDFromRequestLoose() { $this->matcherHistory = array(); // Return generic UA if userAgent is empty if (strlen($this->httpRequest->user_agent) == 0) { $this->matchData['matcher'] = "none"; $this->matchData['match_type'] = "none"; $this->matchData['match'] = false; $this->setMatcherHistory(); if ($this->httpRequest->uaprof instanceof TeraWurflUserAgentProfile && $this->httpRequest->uaprof->containsValidUrl()) { return WurflConstants::GENERIC_MOBILE; } else { return WurflConstants::NO_MATCH; } } // Check for exact match if (TeraWurflConfig::$SIMPLE_DESKTOP_ENGINE_ENABLE && $this->httpRequest->user_agent == WurflConstants::SIMPLE_DESKTOP_UA) { // SimpleDesktop UA Matching avoids querying the database here $this->matchData['matcher'] = $this->userAgentMatcher->matcherName(); $this->matchData['match_type'] = "high_performance"; $this->matchData['match'] = true; $this->matcherHistory[] = $this->matchData['matcher'] . "(high_performance)"; $this->setMatcherHistory(); return WurflConstants::GENERIC_WEB_BROWSER; } else { $deviceID = $this->db->getDeviceFromUA($this->httpRequest->user_agent->normalized); } $this->matcherHistory[] = $this->userAgentMatcher->matcherName() . "(exact)"; if ($deviceID !== false) { $this->matchData['matcher'] = $this->userAgentMatcher->matcherName(); $this->matchData['match_type'] = "exact"; $this->matchData['match'] = true; $this->setMatcherHistory(); return $deviceID; } // Check for a conclusive match $deviceID = $this->userAgentMatcher->applyConclusiveMatch($this->httpRequest); $this->matcherHistory[] = $this->userAgentMatcher->matcherName() . "(conclusive)"; if ($deviceID != WurflConstants::NO_MATCH) { $this->matchData['matcher'] = $this->userAgentMatcher->matcherName(); $this->matchData['match_type'] = "conclusive"; $this->matchData['match'] = true; $this->setMatcherHistory(); return $deviceID; } /* // Check for Vodafone magic if ($this->userAgentMatcher->matcherName()!="VodafoneUserAgentMatcher" && $this->httpRequest->user_agent->contains("Vodafone")) { @require_once realpath(dirname(__FILE__).'/UserAgentMatchers/VodafoneUserAgentMatcher.php'); $vodafoneUserAgentMatcher = new VodafoneUserAgentMatcher($this); $this->matcherHistory[] = $vodafoneUserAgentMatcher->matcherName() . "(conclusive)"; $deviceID = $vodafoneUserAgentMatcher->applyConclusiveMatch($this->httpRequest); if ($deviceID != WurflConstants::NO_MATCH) { $this->matchData['matcher'] = $vodafoneUserAgentMatcher->matcherName(); $this->matchData['match_type'] = "conclusive"; $this->matchData['match'] = true; $this->setMatcherHistory(); return $deviceID; } } */ // Check for recovery match $deviceID = $this->userAgentMatcher->applyRecoveryMatch($this->httpRequest); $this->matcherHistory[] = $this->userAgentMatcher->matcherName() . "(recovery)"; if ($deviceID != WurflConstants::NO_MATCH) { $this->matchData['matcher'] = $this->userAgentMatcher->matcherName(); $this->matchData['match_type'] = "recovery"; $this->matchData['match'] = false; $this->setMatcherHistory(); return $deviceID; } // Check CatchAll if it's not already in use if ($this->userAgentMatcher->matcherName() != "CatchAllUserAgentMatcher") { $catchAllUserAgentMatcher = new CatchAllUserAgentMatcher($this); $this->matcherHistory[] = $catchAllUserAgentMatcher->matcherName() . "(recovery)"; $deviceID = $catchAllUserAgentMatcher->applyRecoveryMatch($this->httpRequest); if ($deviceID != WurflConstants::NO_MATCH) { // The CatchAll matcher is intelligent enough to determine the match properties $this->matchData['matcher'] = $catchAllUserAgentMatcher->matcher; $this->matchData['match_type'] = $catchAllUserAgentMatcher->match_type; $this->matchData['match'] = $catchAllUserAgentMatcher->match; $this->setMatcherHistory(); return $deviceID; } } // A matching device still hasn't been found - check HTTP ACCEPT headers if ($this->httpRequest->accept->length() > 0) { $this->matcherHistory[] = 'http_accept'; if ($this->httpRequest->accept->contains('application/vnd.wap.xhtml+xml')) { $this->matchData['matcher'] = 'http_accept'; $this->matchData['match_type'] = 'recovery'; // This isn't really a match, it's a suggestion $this->matchData['match'] = false; $this->setMatcherHistory(); return WurflConstants::GENERIC_MOBILE; } } $this->matchData['matcher'] = "none"; $this->matchData['match_type'] = "none"; $this->matchData['match'] = false; $this->setMatcherHistory(); if ($this->httpRequest->uaprof instanceof TeraWurflUserAgentProfile && $this->httpRequest->uaprof->containsValidUrl()) { return WurflConstants::GENERIC_MOBILE; } if ($this->httpRequest->isMobileBrowser()) { return WurflConstants::GENERIC_MOBILE; } if ($this->httpRequest->isSmartTV()) { return WurflConstants::GENERIC_SMARTTV; } return WurflConstants::GENERIC; }