You are here

function _browscap_import in Browscap 6.2

Same name and namespace in other branches
  1. 8 import.inc \_browscap_import()
  2. 5 browscap.module \_browscap_import()
  3. 6 import.inc \_browscap_import()
  4. 7.2 import.inc \_browscap_import()
  5. 7 import.inc \_browscap_import()

Helper function to update the browscap data.

Parameters

boolean $cron: Optional import environment. If false, display status messages to the user in addition to logging information with the watchdog.

3 calls to _browscap_import()
browscap_cron in ./browscap.module
Implementation of hook_cron().
browscap_install in ./browscap.install
Implementation of hook_install.
browscap_refresh_submit in ./browscap.admin.inc
Submit handler for the refresh browscap button.

File

./import.inc, line 13
Browscap data import functions.

Code

function _browscap_import($cron = TRUE) {

  // Check the local browscap data version number
  $local_version = variable_get('browscap_version', 0);

  // Retrieve the current browscap data version number using HTTP
  $current_version = drupal_http_request('https://www.browscap.org/version-number');

  // Log an error if the browscap version number could not be retrieved
  if (isset($current_version->error)) {

    // Log a message with the watchdog
    watchdog('browscap', "Couldn't check version: %error", array(
      '%error' => $current_version->error,
    ), WATCHDOG_ERROR);

    // Display a message to the user if the update process was triggered manually
    if ($cron == FALSE) {
      drupal_set_message(t("Couldn't check version: %error", array(
        '%error' => $current_version->error,
      )), 'error');
    }
    return;
  }

  // Sanitize the returned version number
  $current_version = check_plain(trim($current_version->data));

  // Compare the current and local version numbers to determine if the browscap
  // data requires updating
  if ($current_version == $local_version) {

    // Log a message with the watchdog
    watchdog('browscap', 'No new version of browscap to import');

    // Display a message to the user if the update process was triggered manually
    if ($cron == FALSE) {
      drupal_set_message(t('No new version of browscap to import'));
    }
    return;
  }

  // Set options for downloading data with or without compression
  if (function_exists('gzdecode')) {
    $headers = array(
      'Accept-Encoding' => 'gzip',
    );
    $timeout = 30;
  }
  else {

    // The download takes over ten times longer without gzip, and may exceed
    // the default timeout of 30 seconds, so we increase the timeout
    $headers = array();
    $timeout = 600;
  }

  // Retrieve the browscap data using HTTP
  $browscap_data = drupal_http_request('https://www.browscap.org/stream?q=PHP_BrowsCapINI', $headers, 'GET', NULL, 3, $timeout);

  // Log an error if the browscap data could not be retrieved
  if (isset($browscap_data->error) || empty($browscap_data)) {

    // Log a message with the watchdog
    watchdog('browscap', "Couldn't retrieve updated browscap: %error", array(
      '%error' => $browscap_data->error,
    ), WATCHDOG_ERROR);

    // Display a message to the user if the update process was triggered manually
    if ($cron == FALSE) {
      drupal_set_message(t("Couldn't retrieve updated browscap: %error", array(
        '%error' => $browscap_data->error,
      )), 'error');
    }
    return;
  }

  // Decompress the downloaded data if it is compressed
  if (function_exists('gzdecode')) {
    $browscap_data->data = gzdecode($browscap_data->data);
  }

  // Parse the returned browscap data
  // The parse_ini_string function is preferred but only available in PHP 5.3.0
  if (version_compare(PHP_VERSION, '5.3.0', '>=')) {

    // Retrieve the browscap data
    $browscap_data = $browscap_data->data;

    // Replace 'true' and 'false' with '1' and '0'
    $browscap_data = strtr($browscap_data, array(
      "=true\r" => "=1\r",
      "=false\r" => "=0\r",
    ));

    // Parse the browscap data as a string
    $browscap_data = parse_ini_string($browscap_data, TRUE, INI_SCANNER_RAW);
  }
  else {

    // Create a path and filename
    $server = $_SERVER['SERVER_NAME'];
    $path = variable_get('file_directory_temp', '/tmp');
    $file = "{$path}/browscap_{$server}.ini";

    // Write the browscap data to a file
    $browscap_file = fopen($file, "w");
    fwrite($browscap_file, $browscap_data->data);
    fclose($browscap_file);

    // Parse the browscap data as a file
    $browscap_data = parse_ini_file($file, TRUE);
  }
  if ($browscap_data) {

    // Find the version information
    // The version information is the first entry in the array
    $version = array_shift($browscap_data);

    // Store the data available for each user agent
    foreach ($browscap_data as $key => $values) {

      // Store the current value
      $e = $values;

      // Create an array to hold the last parent
      $last_parent = array();

      // Recurse through the available user agent information
      while (isset($values['Parent']) && $values['Parent'] !== $last_parent) {
        $values = isset($browscap_data[$values['Parent']]) ? $browscap_data[$values['Parent']] : array();
        $e = array_merge($values, $e);
        $last_parent = $values;
      }

      // Replace '*?' with '%_'
      $user_agent = strtr($key, '*?', '%_');

      // Change all array keys to lowercase
      $e = array_change_key_case($e);

      // Delete all data about the current user agent from the database
      db_query("DELETE FROM {browscap} WHERE useragent = '%s'", $user_agent);

      // Insert all data about the current user agent into the database
      db_query("INSERT INTO {browscap} (useragent, data) VALUES ('%s', %b)", $user_agent, serialize($e));
    }

    // Clear the browscap data cache
    cache_clear_all('*', 'cache_browscap', TRUE);

    // Update the browscap version
    variable_set('browscap_version', $current_version);

    // Log a message with the watchdog
    watchdog('browscap', 'New version of browscap imported: %version', array(
      '%version' => $current_version,
    ));

    // Display a message to the user if the update process was triggered manually
    if ($cron == FALSE) {
      drupal_set_message(t('New version of browscap imported: %version', array(
        '%version' => $current_version,
      )));
    }
  }
}