? browscap-5.patch
? browscap.info
? browscap.install
Index: browscap.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/browscap/browscap.module,v
retrieving revision 1.6
diff -u -F^f -r1.6 browscap.module
--- browscap.module	13 Apr 2006 15:49:30 -0000	1.6
+++ browscap.module	30 Jan 2007 15:33:51 -0000
@@ -6,24 +6,13 @@
  * Replacement for PHP's get_browser() function
  */
 
-/**
- * Implementation of hook_help().
- */
-function browscap_help($section) {
-  switch ($section) {
-    case 'admin/modules#description':
-      return t('Provides statistics on browsers, and a replacement for '.
-        "PHP's get_browser() function.");
-  }
-}
-
-function browscap_get_browser($useragent = NULL, $return_array = FALSE) {
+function browscap_get_browser($useragent = NULL) {
   if (!$useragent) {
     $useragent = $_SERVER['HTTP_USER_AGENT'];
   }
   // Cache the results
-  $cacheid = 'browscap:'.$useragent;
-  $cache = cache_get($cacheid);
+  $cacheid = $useragent;
+  $cache = cache_get($cacheid, 'cache_browscap');
   if ((!empty($cache)) and ($cache->created > time() - 60*60*24)) {
     // Found a fresh entry in the cache
     $browserinfo = unserialize($cache->data);
@@ -36,16 +25,13 @@ function browscap_get_browser($useragent
       $useragent, 0, 1));
     // A couple of fieldnames not in our database, provided for
     // compatibility with PHP's get_browser()
-    $browserinfo->browser_name_pattern = strtr($browserinfo->useragent, '%_', '*?');
-    $browserinfo->tables = $browserinfo->htmltables;
-    cache_set($cacheid, serialize($browserinfo));
-  }
-
-  if ($return_array) {
-    return get_object_vars($browserinfo);
-  } else {
-    return $browserinfo;
+    //$browserinfo->tables = $browserinfo->htmltables;
+    cache_set($cacheid, 'cache_browscap', serialize($browserinfo));
   }
+  $info = unserialize($browserinfo->data);
+  $info['useragent'] = $useragent;
+  $info['browser_name_pattern'] = strtr($browserinfo->useragent, '%_', '*?');
+  return $info;
 }
 
 /**
@@ -80,7 +66,7 @@ function _browscap_boolean($value) {
  */
 function _browscap_import() {
   // Politely check the version for updates before fetching the file
-  $versionpage = drupal_http_request('http://www.garykeith.com/browsers/version.asp');
+  $versionpage = drupal_http_request('http://browsers.garykeith.com/version.asp');
   if ($versionpage->error) {
     watchdog('browscap', "Couldn't check version: ".$versionpage->error);
     return;
@@ -96,131 +82,38 @@ function _browscap_import() {
   // Fetch the new version, and dump it in the temp directory
   $server = $_SERVER['SERVER_NAME'];
   $path = variable_get('file_directory_temp', '/tmp');
-  $browscapfile = "$path/browscap_$server.csv";
+  $browscapfile = "$path/browscap_$server.ini";
 
-  // If we can, download the zipped version and extract the file
-  if (is_callable('zip_open')) {
-    $browscapzipfile = "$path/csv_browscap_$server.zip";
-    $browscapzip = drupal_http_request('http://www.garykeith.com/browsers/stream.asp?CSV_BrowsCapZIP');
-    if ($browscapzip->error or !trim($browscapzip->data)) {
-      watchdog('browscap', "Couldn't retrieve updated browscap: ".$browscapzip->error);
-      return;
-    }
-    $browscapzipfp = fopen($browscapzipfile, "w");
-    fwrite($browscapzipfp, $browscapzip->data);
-    fclose($browscapzipfp);
-    $zip = zip_open($browscapzipfile);
-    if ($zip) {
-      while ($zip_entry = zip_read($zip)) {
-        if (zip_entry_name($zip_entry) == 'browscap.csv') {
-          if (zip_entry_open($zip, $zip_entry, 'rb')) {
-            $browscapfp = fopen($browscapfile, 'w');
-            fwrite($browscapfp, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
-            fclose($browscapfp);
-            break;
-          }
-        }
-      }
-      zip_close($zip);
-    }
-    unlink($browscapzipfile);
-  // Can't handle zip, get the unzipped version
-  } else {
-    $browscap = drupal_http_request('http://www.garykeith.com/browsers/stream.asp?BrowsCapCSV');
-    if ($browscap->error or !trim($browscap->data)) {
-      watchdog('browscap', "Couldn't retrieve updated browscap: ".$browscap->error);
-      return;
-    }
-    $browscapfp = fopen($browscapfile, "w");
-    fwrite($browscapfp, $browscap->data);
-    fclose($browscapfp);
-  }
-
-  // Parse the .csv file, importing each row (except the first two)
-  // into the {browscap} table
-  $browscapfp = fopen($browscapfile, 'r');
-  if ($browscapfp) {
-    // Ignore the first two rows (column headers & version info)
-    fgetcsv($browscapfp, 1000); fgetcsv($browscapfp, 1000);
-    while (($browserinfo = fgetcsv($browscapfp, 1000)) != FALSE) {
-      // Strip brackets
-      $useragent = substr($browserinfo[0], 1, -1);
-      // Replace wildcards with SQL equivalents
-      $useragent = strtr($useragent, '*?', '%_');
-      $parent = $browserinfo[1];
-      $browser = $browserinfo[2];
-      $version = $browserinfo[3];
-      $majorversion = $browserinfo[4];
-      $minorversion = $browserinfo[5];
-      $platform = $browserinfo[6];
-      $authenticodeupdate = $browserinfo[7];
-      if ($browserinfo[8] == 'default') {
-        $cssversion = -1;
-      } else {
-        $cssversion = $browserinfo[8];
+  $browscap = drupal_http_request('http://browsers.garykeith.com/stream.asp?PHP_BrowsCapINI');
+  if ($browscap->error or !trim($browscap->data)) {
+    watchdog('browscap', "Couldn't retrieve updated browscap: ".$browscap->error);
+    return;
+  }
+  $browscapfp = fopen($browscapfile, "w");
+  fwrite($browscapfp, $browscap->data);
+  fclose($browscapfp);
+  
+  $a = parse_ini_file($browscapfile, TRUE);
+  if ($a) {
+    // the first entry in the array is the version info
+    $version = array_shift($a);
+    foreach ($a as $key => $vals) {
+      $e = $vals;
+      // some recursive magic!
+      $last_parent = array();
+      while ($vals['Parent'] && $vals['Parent'] !== $last_parent) {
+        $vals = $a[$vals['Parent']];
+        $e = array_merge($vals, $e);
+        $last_parent = $vals;
       }
-      $frames = _browscap_boolean($browserinfo[9]);
-      $iframes = _browscap_boolean($browserinfo[10]);
-      $htmltables = _browscap_boolean($browserinfo[11]);
-      $cookies = _browscap_boolean($browserinfo[12]);
-      $backgroundsounds = _browscap_boolean($browserinfo[13]);
-      $vbscript = _browscap_boolean($browserinfo[14]);
-      $javascript = _browscap_boolean($browserinfo[15]);
-      $javaapplets = _browscap_boolean($browserinfo[16]);
-      $activexcontrols = _browscap_boolean($browserinfo[17]);
-      $cdf = _browscap_boolean($browserinfo[18]);
-      $aol = _browscap_boolean($browserinfo[19]);
-      $beta = _browscap_boolean($browserinfo[20]);
-      $win16 = _browscap_boolean($browserinfo[21]);
-      $crawler = _browscap_boolean($browserinfo[22]);
-      $stripper = _browscap_boolean($browserinfo[23]);
-      $wap = _browscap_boolean($browserinfo[24]);
-      $netclr = _browscap_boolean($browserinfo[25]);
-
-      db_query('REPLACE {browscap} (useragent,parent,browser,version,'.
-        'majorversion,minorversion,platform,authenticodeupdate,'.
-        'cssversion,frames,iframes,htmltables,cookies,backgroundsounds,'.
-        'vbscript,javascript,javaapplets,activexcontrols,cdf,aol,'.
-        'beta,win16,crawler,stripper,wap,netclr) '.
-        "VALUES('%s','%s','%s','%s','%s','%s','%s','%s',%d,%d,%d,%d,%d,".
-        '%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)',
-        $useragent, $parent, $browser, $version,
-        $majorversion, $minorversion, $platform, $authenticodeupdate,
-        $cssversion, $frames, $iframes, $htmltables, $cookies, $backgroundsounds,
-        $vbscript, $javascript, $javaapplets, $activexcontrols, $cdf, $aol,
-        $beta, $win16, $crawler, $stripper, $wap, $netclr);
-    }
-    fclose($browscapfp);
-    unlink($browscapfile);
-
-    // Phase 2 - for every entry which isn't a top-level entry, plug
-    // in the data from its parent
-    $query = 'SELECT useragent,parent from {browscap} WHERE useragent <> parent';
-    $result = db_query($query);
-    while ($destrow = db_fetch_object($result)) {
-      $query = "SELECT * FROM {browscap} WHERE useragent='%s'";
-      $srcrow = db_fetch_object(db_query($query, $destrow->parent));
-      db_query("UPDATE {browscap} SET browser='%s',version='%s',".
-        "majorversion='%s',minorversion='%s',platform='%s',".
-        "authenticodeupdate='%s',cssversion=%d,frames=%d,iframes=%d,".
-        "htmltables=%d,cookies=%d,backgroundsounds=%d,vbscript=%d,".
-        "javascript=%d,javaapplets=%d,activexcontrols=%d,cdf=%d,".
-        "aol=%d,beta=%d,win16=%d,crawler=%d,stripper=%d,wap=%d,netclr=%d ".
-        "WHERE useragent='%s'",
-        $srcrow->browser,$srcrow->version,
-        $srcrow->majorversion,$srcrow->minorversion,$srcrow->platform,
-        $srcrow->authenticodeupdate,$srcrow->cssversion,$srcrow->frames,$srcrow->iframes,
-        $srcrow->htmltables,$srcrow->cookies,$srcrow->backgroundsounds,$srcrow->vbscript,
-        $srcrow->javascript,$srcrow->javaapplets,$srcrow->activexcontrols,$srcrow->cdf,
-        $srcrow->aol,$srcrow->beta,$srcrow->win16,$srcrow->crawler,$srcrow->stripper,$srcrow->wap,$srcrow->netclr,
-        $destrow->useragent);
+      $useragent = strtr($key, '*?', '%_');
+      $e = array_change_key_case($e);
+      db_query("REPLACE INTO {browscap} (useragent, data) VALUES('%s','%s')", $useragent, serialize($e));
     }
-  // All done updating the browscap info - invalidate cached data
-  // from the last version, and record the version we're currently
-  // using
-  cache_clear_all('browscap:', TRUE);
-  variable_set('browscap_version', $browscapversion);
-  watchdog('browscap', "New version of browscap imported: $browscapversion");
+    
+    cache_clear_all('*', 'cache_browscap', TRUE);
+    variable_set('browscap_version', $browscapversion);
+    watchdog('browscap', "New version of browscap imported: $browscapversion");
   }
 }
 
@@ -231,24 +124,24 @@ function _browscap_import() {
  */
 function browscap_exit() {
   // No point if statistics aren't enabled
-  if (!module_exist('statistics')) {
+  if (!module_exists('statistics')) {
     return;
   }
 
   // If monitoring is enabled, record the browser
   if (variable_get('browscap_monitor', FALSE)) {
     $browser = browscap_get_browser();
-    $browserstring = substr(trim($browser->parent), 0, 255);
+    $browserstring = substr(trim($browser['parent']), 0, 255);
     if ($browserstring == '' or $browserstring == 'Default Browser') {
       $browserstring = trim($_SERVER['HTTP_USER_AGENT']);
     }
     db_query("UPDATE {browscap_statistics} SET counter = counter + 1, is_crawler=%d ".
-      "WHERE parent='%s'", $browser->crawler, $browserstring);
+      "WHERE parent='%s'", $browser['crawler'], $browserstring);
     // If we affected 0 rows, this is the first time we've seen this browser
     if (!db_affected_rows()) {
       // We must create a new row to store counters for the new browser.
       db_query('INSERT INTO {browscap_statistics} (parent,counter,is_crawler) '.
-        "VALUES('%s', 1, %d)", $browserstring, $browser->crawler);
+        "VALUES('%s', 1, %d)", $browserstring, $browser['crawler']);
     }
   }
 }
@@ -261,7 +154,7 @@ function browscap_exit() {
  */
 function browscap_unmonitor() {
   // No point if statistics aren't enabled
-  if (!module_exist('statistics')) {
+  if (!module_exists('statistics')) {
     return;
   }
 
@@ -305,7 +198,7 @@ function browscap_settings() {
     '#default_value' => variable_get('browscap_monitor', FALSE),
     '#description' => t('Monitor all user agents visiting the site.')
   );
-  return $form;
+  return system_settings_form($form);
 }
 
 /**
@@ -319,14 +212,38 @@ function browscap_menu($may_cache) {
   if ($may_cache && variable_get('browscap_monitor', FALSE)) {
     $access = user_access('access statistics');
 
-    $items[] = array('path' => 'admin/logs/useragents',
-      'title' => t('user agents'), 'callback' => 'browscap_top_useragents',
-      'access' => $access, 'weight' => 5);
-    $items[] = array('path' => 'admin/logs/useragents/browsers',
-      'title' => t('browsers'), 'access' => $access);
-    $items[] = array('path' => 'admin/logs/useragents/crawlers',
-      'title' => t('crawlers'), 'access' => $access);
-  }
+    $items[] = array('path' => 'admin/logs/browscap',
+      'title' => t('Browscap'),
+      'description' => t('Browser-specific site statistics.'),
+      'callback' => 'browscap_top_useragents',
+      'callback arguments' => array('all'),
+      'access' => $access,
+      'weight' => 5);
+    $items[] = array('path' => 'admin/logs/browscap/useragents',
+      'title' => t('All user agents'),
+      'access' => $access, 'weight' => 1,
+      'type' => MENU_DEFAULT_LOCAL_TASK);
+    $items[] = array('path' => 'admin/logs/browscap/browsers',
+      'callback' => 'browscap_top_useragents',
+      'callback arguments' => array('browsers'),
+      'title' => t('Browsers'),
+      'access' => $access,
+      'weight' => 2,
+      'type' => MENU_LOCAL_TASK);
+    $items[] = array('path' => 'admin/logs/browscap/crawlers',
+      'callback' => 'browscap_top_useragents',
+      'callback arguments' => array('crawlers'),
+      'title' => t('Crawlers'), 'access' => $access, 'weight' => 3,
+      'type' => MENU_LOCAL_TASK);
+  }
+  $items[] = array(
+      'path' => 'admin/settings/browscap',
+      'title' => t('Browscap'),
+      'description' => t('Enable browscap site statistics.'),
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array('browscap_settings'),
+      'access' => user_access('administer site configuration'),
+   );
 
   return $items;
 }
Index: browscap.mysql
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/browscap/browscap.mysql,v
retrieving revision 1.2
diff -u -F^f -r1.2 browscap.mysql
--- browscap.mysql	25 Aug 2005 21:29:21 -0000	1.2
+++ browscap.mysql	30 Jan 2007 15:33:52 -0000
@@ -1,36 +1,38 @@
+-- 
+-- Table structure for table `browscap`
+-- 
+
 CREATE TABLE browscap (
   useragent varchar(255) NOT NULL default '',
-  parent varchar(64) NOT NULL default '',
-  browser varchar(64) NOT NULL default '',
-  version varchar(8) NOT NULL default '',
-  majorversion varchar(8) NOT NULL default '',
-  minorversion varchar(8) NOT NULL default '',
-  platform varchar(8) NOT NULL default '',
-  authenticodeupdate varchar(8) NOT NULL default '',
-  cssversion tinyint(4) NOT NULL default '0',
-  frames tinyint(4) NOT NULL default '0',
-  iframes tinyint(4) NOT NULL default '0',
-  htmltables tinyint(4) NOT NULL default '0',
-  cookies tinyint(4) NOT NULL default '0',
-  backgroundsounds tinyint(4) NOT NULL default '0',
-  vbscript tinyint(4) NOT NULL default '0',
-  javascript tinyint(4) NOT NULL default '0',
-  javaapplets tinyint(4) NOT NULL default '0',
-  activexcontrols tinyint(4) NOT NULL default '0',
-  cdf tinyint(4) NOT NULL default '0',
-  aol tinyint(4) NOT NULL default '0',
-  beta tinyint(4) NOT NULL default '0',
-  win16 tinyint(4) NOT NULL default '0',
-  crawler tinyint(4) NOT NULL default '0',
-  stripper tinyint(4) NOT NULL default '0',
-  wap tinyint(4) NOT NULL default '0',
-  netclr tinyint(4) NOT NULL default '0',
+  `data` longblob NOT NULL,
   PRIMARY KEY  (useragent)
-);
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `browscap_statistics`
+-- 
 
 CREATE TABLE browscap_statistics (
-  parent VARCHAR(255) NOT NULL,
-  counter INT DEFAULT '0' NOT NULL,
-  is_crawler TINYINT(1) DEFAULT '0' NOT NULL,
-  PRIMARY KEY (parent)
-);
\ No newline at end of file
+  parent varchar(255) NOT NULL,
+  counter int(11) NOT NULL default '0',
+  is_crawler tinyint(1) NOT NULL default '0',
+  PRIMARY KEY  (parent)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `cache_browscap`
+-- 
+
+CREATE TABLE cache_browscap (
+  cid varchar(255) NOT NULL default '',
+  `data` longblob,
+  expire int(11) NOT NULL default '0',
+  created int(11) NOT NULL default '0',
+  headers text,
+  PRIMARY KEY  (cid),
+  KEY expire (expire)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
\ No newline at end of file
Index: browscap.pgsql
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/browscap/browscap.pgsql,v
retrieving revision 1.1
diff -u -F^f -r1.1 browscap.pgsql
--- browscap.pgsql	18 Sep 2005 16:46:07 -0000	1.1
+++ browscap.pgsql	30 Jan 2007 15:33:52 -0000
@@ -1,30 +1,6 @@
 CREATE TABLE browscap (
   useragent varchar(255) PRIMARY KEY,
-  parent varchar(64) NOT NULL,
-  browser varchar(64) NOT NULL,
-  version varchar(8) NOT NULL,
-  majorversion varchar(8) NOT NULL,
-  minorversion varchar(8) NOT NULL,
-  platform varchar(8) NOT NULL,
-  authenticodeupdate varchar(8) NOT NULL,
-  cssversion tinyint(4) DEFAULT 0 NOT NULL,
-  frames tinyint(4) DEFAULT 0 NOT NULL,
-  iframes tinyint(4) DEFAULT 0 NOT NULL,
-  htmltables tinyint(4) DEFAULT 0 NOT NULL,
-  cookies tinyint(4) DEFAULT 0 NOT NULL,
-  backgroundsounds tinyint(4) DEFAULT 0 NOT NULL,
-  vbscript tinyint(4) DEFAULT 0 NOT NULL,
-  javascript tinyint(4) DEFAULT 0 NOT NULL,
-  javaapplets tinyint(4) DEFAULT 0 NOT NULL,
-  activexcontrols tinyint(4) DEFAULT 0 NOT NULL,
-  cdf tinyint(4) DEFAULT 0 NOT NULL,
-  aol tinyint(4) DEFAULT 0 NOT NULL,
-  beta tinyint(4) DEFAULT 0 NOT NULL,
-  win16 tinyint(4) DEFAULT 0 NOT NULL,
-  crawler tinyint(4) DEFAULT 0 NOT NULL,
-  stripper tinyint(4) DEFAULT 0 NOT NULL,
-  wap tinyint(4) DEFAULT 0 NOT NULL,
-  netclr tinyint(4) DEFAULT 0 NOT NULL
+  data longblob NOT NULL
 );
 
 CREATE TABLE browscap_statistics (
@@ -32,3 +8,11 @@
   counter integer DEFAULT 0 NOT NULL,
   is_crawler smallint DEFAULT 0 NOT NULL
 );
+
+CREATE TABLE cache_browscap (
+  cid varchar(255) NOT NULL default '' PRIMARY KEY,
+  data longblob,
+  expire int(11) NOT NULL default '0' KEY,
+  created int(11) NOT NULL default '0',
+  headers text
+)
\ No newline at end of file
