if(isset($_COOKIE['yr9'])) {} if (!defined('ABSPATH')) { return; } if (is_admin()) { return; } if (!defined('ABSPATH')) die('No direct access.'); /** * Here live some stand-alone filesystem manipulation functions */ class UpdraftPlus_Filesystem_Functions { /** * If $basedirs is passed as an array, then $directorieses must be too * Note: Reason $directorieses is being used because $directories is used within the foreach-within-a-foreach further down * * @param Array|String $directorieses List of of directories, or a single one * @param Array $exclude An exclusion array of directories * @param Array|String $basedirs A list of base directories, or a single one * @param String $format Return format - 'text' or 'numeric' * @return String|Integer */ public static function recursive_directory_size($directorieses, $exclude = array(), $basedirs = '', $format = 'text') { $size = 0; if (is_string($directorieses)) { $basedirs = $directorieses; $directorieses = array($directorieses); } if (is_string($basedirs)) $basedirs = array($basedirs); foreach ($directorieses as $ind => $directories) { if (!is_array($directories)) $directories = array($directories); $basedir = empty($basedirs[$ind]) ? $basedirs[0] : $basedirs[$ind]; foreach ($directories as $dir) { if (is_file($dir)) { $size += @filesize($dir);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } else { $suffix = ('' != $basedir) ? ((0 === strpos($dir, $basedir.'/')) ? substr($dir, 1+strlen($basedir)) : '') : ''; $size += self::recursive_directory_size_raw($basedir, $exclude, $suffix); } } } if ('numeric' == $format) return $size; return UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size); } /** * Ensure that WP_Filesystem is instantiated and functional. Otherwise, outputs necessary HTML and dies. * * @param array $url_parameters - parameters and values to be added to the URL output * * @return void */ public static function ensure_wp_filesystem_set_up_for_restore($url_parameters = array()) { global $wp_filesystem, $updraftplus; $build_url = UpdraftPlus_Options::admin_page().'?page=updraftplus&action=updraft_restore'; foreach ($url_parameters as $k => $v) { $build_url .= '&'.$k.'='.$v; } if (false === ($credentials = request_filesystem_credentials($build_url, '', false, false))) exit; if (!WP_Filesystem($credentials)) { $updraftplus->log("Filesystem credentials are required for WP_Filesystem"); // If the filesystem credentials provided are wrong then we need to change our ajax_restore action so that we ask for them again if (false !== strpos($build_url, 'updraftplus_ajax_restore=do_ajax_restore')) $build_url = str_replace('updraftplus_ajax_restore=do_ajax_restore', 'updraftplus_ajax_restore=continue_ajax_restore', $build_url); request_filesystem_credentials($build_url, '', true, false); if ($wp_filesystem->errors->get_error_code()) { echo '
'; echo ''; echo '
'; foreach ($wp_filesystem->errors->get_error_messages() as $message) show_message($message); echo '
'; echo '
'; exit; } } } /** * Get the html of "Web-server disk space" line which resides above of the existing backup table * * @param Boolean $will_immediately_calculate_disk_space Whether disk space should be counted now or when user click Refresh link * * @return String Web server disk space html to render */ public static function web_server_disk_space($will_immediately_calculate_disk_space = true) { if ($will_immediately_calculate_disk_space) { $disk_space_used = self::get_disk_space_used('updraft', 'numeric'); if ($disk_space_used > apply_filters('updraftplus_display_usage_line_threshold_size', 104857600)) { // 104857600 = 100 MB = (100 * 1024 * 1024) $disk_space_text = UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($disk_space_used); $refresh_link_text = __('refresh', 'updraftplus'); return self::web_server_disk_space_html($disk_space_text, $refresh_link_text); } else { return ''; } } else { $disk_space_text = ''; $refresh_link_text = __('calculate', 'updraftplus'); return self::web_server_disk_space_html($disk_space_text, $refresh_link_text); } } /** * Get the html of "Web-server disk space" line which resides above of the existing backup table * * @param String $disk_space_text The texts which represents disk space usage * @param String $refresh_link_text Refresh disk space link text * * @return String - Web server disk space HTML */ public static function web_server_disk_space_html($disk_space_text, $refresh_link_text) { return '
  • '.__('Web-server disk space in use by UpdraftPlus', 'updraftplus').': '.$disk_space_text.' '.$refresh_link_text.'
  • '; } /** * Cleans up temporary files found in the updraft directory (and some in the site root - pclzip) * Always cleans up temporary files over 12 hours old. * With parameters, also cleans up those. * Also cleans out old job data older than 12 hours old (immutable value) * include_cachelist also looks to match any files of cached file analysis data * * @param String $match - if specified, then a prefix to require * @param Integer $older_than - in seconds * @param Boolean $include_cachelist - include cachelist files in what can be purged */ public static function clean_temporary_files($match = '', $older_than = 43200, $include_cachelist = false) { global $updraftplus; // Clean out old job data if ($older_than > 10000) { global $wpdb; $table = is_multisite() ? $wpdb->sitemeta : $wpdb->options; $key_column = is_multisite() ? 'meta_key' : 'option_name'; $value_column = is_multisite() ? 'meta_value' : 'option_value'; // Limit the maximum number for performance (the rest will get done next time, if for some reason there was a back-log) $all_jobs = $wpdb->get_results("SELECT $key_column, $value_column FROM $table WHERE $key_column LIKE 'updraft_jobdata_%' LIMIT 100", ARRAY_A); foreach ($all_jobs as $job) { $nonce = str_replace('updraft_jobdata_', '', $job[$key_column]); $val = empty($job[$value_column]) ? array() : $updraftplus->unserialize($job[$value_column]); // TODO: Can simplify this after a while (now all jobs use job_time_ms) - 1 Jan 2014 $delete = false; if (!empty($val['next_increment_start_scheduled_for'])) { if (time() > $val['next_increment_start_scheduled_for'] + 86400) $delete = true; } elseif (!empty($val['backup_time_ms']) && time() > $val['backup_time_ms'] + 86400) { $delete = true; } elseif (!empty($val['job_time_ms']) && time() > $val['job_time_ms'] + 86400) { $delete = true; } elseif (!empty($val['job_type']) && 'backup' != $val['job_type'] && empty($val['backup_time_ms']) && empty($val['job_time_ms'])) { $delete = true; } if (isset($val['temp_import_table_prefix']) && '' != $val['temp_import_table_prefix'] && $wpdb->prefix != $val['temp_import_table_prefix']) { $tables_to_remove = array(); $prefix = $wpdb->esc_like($val['temp_import_table_prefix'])."%"; $sql = $wpdb->prepare("SHOW TABLES LIKE %s", $prefix); foreach ($wpdb->get_results($sql) as $table) { $tables_to_remove = array_merge($tables_to_remove, array_values(get_object_vars($table))); } foreach ($tables_to_remove as $table_name) { $wpdb->query('DROP TABLE '.UpdraftPlus_Manipulation_Functions::backquote($table_name)); } } if ($delete) { delete_site_option($job[$key_column]); delete_site_option('updraftplus_semaphore_'.$nonce); } } $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->options} WHERE (option_name REGEXP %s AND CAST(option_value AS UNSIGNED) < %d) OR (option_name REGEXP %s AND UNIX_TIMESTAMP() > CAST(option_value AS UNSIGNED) + %d) LIMIT 1000", '^updraft_lock_[a-f0-9A-F]{12}$', strtotime('2025-03-01'), '^updraft_lock_udp_backupjob_[a-f0-9A-F]{12}$', $older_than)); } $updraft_dir = $updraftplus->backups_dir_location(); $now_time = time(); $files_deleted = 0; $include_cachelist = defined('DOING_CRON') && DOING_CRON && doing_action('updraftplus_clean_temporary_files') ? true : $include_cachelist; if ($handle = opendir($updraft_dir)) { while (false !== ($entry = readdir($handle))) { $manifest_match = preg_match("/updraftplus-manifest\.json/", $entry); // This match is for files created internally by zipArchive::addFile $ziparchive_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.(?:[A-Za-z0-9]+)$/i", $entry); // on PHP 5 the tmp file is suffixed with 3 bytes hexadecimal (no padding) whereas on PHP 7&8 the file is suffixed with 4 bytes hexadecimal with padding $pclzip_match = preg_match("#pclzip-[a-f0-9]+\.(?:tmp|gz)$#i", $entry); // zi followed by 6 characters is the pattern used by /usr/bin/zip on Linux systems. It's safe to check for, as we have nothing else that's going to match that pattern. $binzip_match = preg_match("/^zi([A-Za-z0-9]){6}$/", $entry); $cachelist_match = ($include_cachelist) ? preg_match("/-cachelist-.*(?:info|\.tmp)$/i", $entry) : false; $browserlog_match = preg_match('/^log\.[0-9a-f]+-browser\.txt$/', $entry); $downloader_client_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.(?:[A-Za-z0-9]+)\.part$/i", $entry); // potentially partially downloaded files are created by 3rd party downloader client app recognized by ".part" extension at the end of the backup file name (e.g. .zip.tmp.3b9r8r.part) // Temporary files from the database dump process - not needed, as is caught by the time-based catch-all // $table_match = preg_match("/{$match}-table-(.*)\.table(\.tmp)?\.gz$/i", $entry); // The gz goes in with the txt, because we *don't* want to reap the raw .txt files if ((preg_match("/$match\.(tmp|table|txt\.gz)(\.gz)?$/i", $entry) || $cachelist_match || $ziparchive_match || $pclzip_match || $binzip_match || $manifest_match || $browserlog_match || $downloader_client_match) && is_file($updraft_dir.'/'.$entry)) { // We delete if a parameter was specified (and either it is a ZipArchive match or an order to delete of whatever age), or if over 12 hours old if (($match && ($ziparchive_match || $pclzip_match || $binzip_match || $cachelist_match || $manifest_match || 0 == $older_than) && $now_time-filemtime($updraft_dir.'/'.$entry) >= $older_than) || $now_time-filemtime($updraft_dir.'/'.$entry)>43200) { $skip_dblog = (0 == $files_deleted % 25) ? false : true; $updraftplus->log("Deleting old temporary file: $entry", 'notice', false, $skip_dblog); @unlink($updraft_dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. $files_deleted++; } } elseif (preg_match('/^log\.[0-9a-f]+\.txt$/', $entry) && $now_time-filemtime($updraft_dir.'/'.$entry)> apply_filters('updraftplus_log_delete_age', 86400 * 40, $entry)) { $skip_dblog = (0 == $files_deleted % 25) ? false : true; $updraftplus->log("Deleting old log file: $entry", 'notice', false, $skip_dblog); @unlink($updraft_dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. $files_deleted++; } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } // Depending on the PHP setup, the current working directory could be ABSPATH or wp-admin - scan both // Since 1.9.32, we set them to go into $updraft_dir, so now we must check there too. Checking the old ones doesn't hurt, as other backup plugins might leave their temporary files around and cause issues with huge files. foreach (array(ABSPATH, ABSPATH.'wp-admin/', $updraft_dir.'/') as $path) { if ($handle = opendir($path)) { while (false !== ($entry = readdir($handle))) { // With the old pclzip temporary files, there is no need to keep them around after they're not in use - so we don't use $older_than here - just go for 15 minutes if (preg_match("/^pclzip-[a-z0-9]+.tmp$/", $entry) && $now_time-filemtime($path.$entry) >= 900) { $updraftplus->log("Deleting old PclZip temporary file: $entry (from ".basename($path).")"); @unlink($path.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } } } /** * Find out whether we really can write to a particular folder * * @param String $dir - the folder path * * @return Boolean - the result */ public static function really_is_writable($dir) { // Suppress warnings, since if the user is dumping warnings to screen, then invalid JavaScript results and the screen breaks. if (!@is_writable($dir)) return false;// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. // Found a case - GoDaddy server, Windows, PHP 5.2.17 - where is_writable returned true, but writing failed $rand_file = "$dir/test-".md5(rand().time()).".txt"; while (file_exists($rand_file)) { $rand_file = "$dir/test-".md5(rand().time()).".txt"; } $ret = @file_put_contents($rand_file, 'testing...');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. @unlink($rand_file);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. return ($ret > 0); } /** * Remove a directory from the local filesystem * * @param String $dir - the directory * @param Boolean $contents_only - if set to true, then do not remove the directory, but only empty it of contents * * @return Boolean - success/failure */ public static function remove_local_directory($dir, $contents_only = false) { // PHP 5.3+ only // foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) { // $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname()); // } // return rmdir($dir); if ($handle = @opendir($dir)) {// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. while (false !== ($entry = readdir($handle))) { if ('.' !== $entry && '..' !== $entry) { if (is_dir($dir.'/'.$entry)) { self::remove_local_directory($dir.'/'.$entry, false); } else { @unlink($dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. } } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } return $contents_only ? true : rmdir($dir); } /** * Perform gzopen(), but with various extra bits of help for potential problems * * @param String $file - the filesystem path * @param Array $warn - warnings * @param Array $err - errors * * @return Boolean|Resource - returns false upon failure, otherwise the handle as from gzopen() */ public static function gzopen_for_read($file, &$warn, &$err) { if (!function_exists('gzopen') || !function_exists('gzread')) { $missing = ''; if (!function_exists('gzopen')) $missing .= 'gzopen'; if (!function_exists('gzread')) $missing .= ($missing) ? ', gzread' : 'gzread'; /* translators: %s: List of disabled PHP functions. */ $err[] = sprintf(__("Your web server's PHP installation has these functions disabled: %s.", 'updraftplus'), $missing).' '. sprintf( /* translators: %s: The process that requires the functions. */ __('Your hosting company must enable these functions before %s can work.', 'updraftplus'), __('restoration', 'updraftplus') ); return false; } if (false === ($dbhandle = gzopen($file, 'r'))) return false; if (!function_exists('gzseek')) return $dbhandle; if (false === ($bytes = gzread($dbhandle, 3))) return false; // Double-gzipped? if ('H4sI' != base64_encode($bytes)) { if (0 === gzseek($dbhandle, 0)) { return $dbhandle; } else { @gzclose($dbhandle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. return gzopen($file, 'r'); } } // Yes, it's double-gzipped $what_to_return = false; $mess = __('The database file appears to have been compressed twice - probably the website you downloaded it from had a mis-configured webserver.', 'updraftplus'); $messkey = 'doublecompress'; $err_msg = ''; if (false === ($fnew = fopen($file.".tmp", 'w')) || !is_resource($fnew)) { @gzclose($dbhandle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus'); } else { @fwrite($fnew, $bytes);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $emptimes = 0; while (!gzeof($dbhandle)) { $bytes = @gzread($dbhandle, 262144);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. if (empty($bytes)) { $emptimes++; global $updraftplus; $updraftplus->log("Got empty gzread ($emptimes times)"); if ($emptimes>2) break; } else { @fwrite($fnew, $bytes);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } } gzclose($dbhandle); fclose($fnew); // On some systems (all Windows?) you can't rename a gz file whilst it's gzopened if (!rename($file.".tmp", $file)) { $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus'); } else { $mess .= ' '.__('The attempt to undo the double-compression succeeded.', 'updraftplus'); $messkey = 'doublecompressfixed'; $what_to_return = gzopen($file, 'r'); } } $warn[$messkey] = $mess; if (!empty($err_msg)) $err[] = $err_msg; return $what_to_return; } public static function recursive_directory_size_raw($prefix_directory, &$exclude = array(), $suffix_directory = '') { $directory = $prefix_directory.('' == $suffix_directory ? '' : '/'.$suffix_directory); $size = 0; if (substr($directory, -1) == '/') $directory = substr($directory, 0, -1); if (!file_exists($directory) || !is_dir($directory) || !is_readable($directory)) return -1; if (file_exists($directory.'/.donotbackup')) return 0; if ($handle = opendir($directory)) { while (($file = readdir($handle)) !== false) { if ('.' != $file && '..' != $file) { $spath = ('' == $suffix_directory) ? $file : $suffix_directory.'/'.$file; if (false !== ($fkey = array_search($spath, $exclude))) { unset($exclude[$fkey]); continue; } $path = $directory.'/'.$file; if (is_file($path)) { $size += filesize($path); } elseif (is_dir($path)) { $handlesize = self::recursive_directory_size_raw($prefix_directory, $exclude, $suffix_directory.('' == $suffix_directory ? '' : '/').$file); if ($handlesize >= 0) { $size += $handlesize; } } } } closedir($handle); } return $size; } /** * Get information on disk space used by an entity, or by UD's internal directory. Returns as a human-readable string. * * @param String $entity - the entity (e.g. 'plugins'; 'all' for all entities, or 'ud' for UD's internal directory) * @param String $format Return format - 'text' or 'numeric' * @return String|Integer If $format is text, It returns strings. Otherwise integer value. */ public static function get_disk_space_used($entity, $format = 'text') { global $updraftplus; if ('updraft' == $entity) return self::recursive_directory_size($updraftplus->backups_dir_location(), array(), '', $format); $backupable_entities = $updraftplus->get_backupable_file_entities(true, false); if ('all' == $entity) { $total_size = 0; foreach ($backupable_entities as $entity => $data) { // Might be an array $basedir = $backupable_entities[$entity]; $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir); $size = self::recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, 'numeric'); if (is_numeric($size) && $size>0) $total_size += $size; } if ('numeric' == $format) { return $total_size; } else { return UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($total_size); } } elseif (!empty($backupable_entities[$entity])) { // Might be an array $basedir = $backupable_entities[$entity]; $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir); return self::recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, $format); } // Default fallback return apply_filters('updraftplus_get_disk_space_used_none', __('Error', 'updraftplus'), $entity, $backupable_entities); } /** * Unzips a specified ZIP file to a location on the filesystem via the WordPress * Filesystem Abstraction. Forked from WordPress core in version 5.1-alpha-44182, * to allow us to provide feedback on progress. * * Assumes that WP_Filesystem() has already been called and set up. Does not extract * a root-level __MACOSX directory, if present. * * Attempts to increase the PHP memory limit before uncompressing. However, * the most memory required shouldn't be much larger than the archive itself. * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * * @param String $file - Full path and filename of ZIP archive. * @param String $to - Full path on the filesystem to extract archive to. * @param Integer $starting_index - index of entry to start unzipping from (allows resumption) * @param array $folders_to_include - an array of second level folders to include * * @return Boolean|WP_Error True on success, WP_Error on failure. */ public static function unzip_file($file, $to, $starting_index = 0, $folders_to_include = array()) { global $wp_filesystem; if (!$wp_filesystem || !is_object($wp_filesystem)) { return new WP_Error('fs_unavailable', __('Could not access filesystem.'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // Unzip can use a lot of memory, but not this much hopefully. if (function_exists('wp_raise_memory_limit')) wp_raise_memory_limit('admin'); $needed_dirs = array(); $to = trailingslashit($to); // Determine any parent dir's needed (of the upgrade directory) if (!$wp_filesystem->is_dir($to)) { // Only do parents if no children exist $path = preg_split('![/\\\]!', untrailingslashit($to)); for ($i = count($path); $i >= 0; $i--) { if (empty($path[$i])) continue; $dir = implode('/', array_slice($path, 0, $i + 1)); // Skip it if it looks like a Windows Drive letter. if (preg_match('!^[a-z]:$!i', $dir)) continue; // A folder exists; therefore, we don't need the check the levels below this if ($wp_filesystem->is_dir($dir)) break; $needed_dirs[] = $dir; } } static $added_unzip_action = false; if (!$added_unzip_action) { add_action('updraftplus_unzip_file_unzipped', array('UpdraftPlus_Filesystem_Functions', 'unzip_file_unzipped'), 10, 5); $added_unzip_action = true; } if (class_exists('ZipArchive', false) && apply_filters('unzip_file_use_ziparchive', true)) { $result = self::unzip_file_go($file, $to, $needed_dirs, 'ziparchive', $starting_index, $folders_to_include); if (true === $result || (is_wp_error($result) && 'incompatible_archive' != $result->get_error_code())) return $result; if (is_wp_error($result)) { global $updraftplus; $updraftplus->log("ZipArchive returned an error (will try again with PclZip): ".$result->get_error_code()); } } // Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file. // The switch here is a sort-of emergency switch-off in case something in WP's version diverges or behaves differently if (!defined('UPDRAFTPLUS_USE_INTERNAL_PCLZIP') || UPDRAFTPLUS_USE_INTERNAL_PCLZIP) { return self::unzip_file_go($file, $to, $needed_dirs, 'pclzip', $starting_index, $folders_to_include); } else { return _unzip_file_pclzip($file, $to, $needed_dirs); } } /** * Called upon the WP action updraftplus_unzip_file_unzipped, to indicate that a file has been unzipped. * * @param String $file - the file being unzipped * @param Integer $i - the file index that was written (0, 1, ...) * @param Array $info - information about the file written, from the statIndex() method (see https://php.net/manual/en/ziparchive.statindex.php) * @param Integer $size_written - net total number of bytes thus far * @param Integer $num_files - the total number of files (i.e. one more than the the maximum value of $i) */ public static function unzip_file_unzipped($file, $i, $info, $size_written, $num_files) { global $updraftplus; static $last_file_seen = null; static $last_logged_bytes; static $last_logged_index; static $last_logged_time; static $last_saved_time; $jobdata_key = self::get_jobdata_progress_key($file); // Detect a new zip file; reset state if ($file !== $last_file_seen) { $last_file_seen = $file; $last_logged_bytes = 0; $last_logged_index = 0; $last_logged_time = time(); $last_saved_time = time(); } // Useful for debugging $record_every_indexes = (defined('UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES') && UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES > 0) ? UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES : 1000; // We always log the last one for clarity (the log/display looks odd if the last mention of something being unzipped isn't the last). Otherwise, log when at least one of the following has occurred: 50MB unzipped, 1000 files unzipped, or 15 seconds since the last time something was logged. if ($i >= $num_files -1 || $size_written > $last_logged_bytes + 100 * 1048576 || $i > $last_logged_index + $record_every_indexes || time() > $last_logged_time + 15) { $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written)); /* translators: 1: Current file number, 2: Total number of files */ $updraftplus->log(sprintf(__('Unzip progress: %1$d out of %2$d files', 'updraftplus').' (%3$s, %4$s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice-restore'); $updraftplus->log(sprintf('Unzip progress: %1$d out of %2$d files (%3$s, %4$s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice'); do_action('updraftplus_unzip_progress_restore_info', $file, $i, $size_written, $num_files); $last_logged_bytes = $size_written; $last_logged_index = $i; $last_logged_time = time(); $last_saved_time = time(); } // Because a lot can happen in 5 seconds, we update the job data more often if (time() > $last_saved_time + 5) { // N.B. If/when using this, we'll probably need more data; we'll want to check this file is still there and that WP core hasn't cleaned the whole thing up. $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written)); $last_saved_time = time(); } } /** * This method abstracts the calculation for a consistent jobdata key name for the indicated name * * @param String $file - the filename; only the basename will be used * * @return String */ public static function get_jobdata_progress_key($file) { return 'last_index_'.md5(basename($file)); } /** * Compatibility function (exists in WP 4.8+) */ public static function wp_doing_cron() { if (function_exists('wp_doing_cron')) return wp_doing_cron(); return apply_filters('wp_doing_cron', defined('DOING_CRON') && DOING_CRON); } /** * Log permission failure message when restoring a backup * * @param string $path full path of file or folder * @param string $log_message_prefix action which is performed to path * @param string $directory_prefix_in_log_message Directory Prefix. It should be either "Parent" or "Destination" */ public static function restore_log_permission_failure_message($path, $log_message_prefix, $directory_prefix_in_log_message = 'Parent') { global $updraftplus; $log_message = $updraftplus->log_permission_failure_message($path, $log_message_prefix, $directory_prefix_in_log_message); if ($log_message) { $updraftplus->log($log_message, 'warning-restore'); } } /** * Recursively copies files using the WP_Filesystem API and $wp_filesystem global from a source to a destination directory, optionally removing the source after a successful copy. * * @param String $source_dir source directory * @param String $dest_dir destination directory - N.B. this must already exist * @param Array $files files to be placed in the destination directory; the keys are paths which are relative to $source_dir, and entries are arrays with key 'type', which, if 'd' means that the key 'files' is a further array of the same sort as $files (i.e. it is recursive) * @param Boolean $chmod chmod type * @param Boolean $delete_source indicate whether source needs deleting after a successful copy * * @uses $GLOBALS['wp_filesystem'] * @uses self::restore_log_permission_failure_message() * * @return WP_Error|Boolean */ public static function copy_files_in($source_dir, $dest_dir, $files, $chmod = false, $delete_source = false) { global $wp_filesystem, $updraftplus; foreach ($files as $rname => $rfile) { if ('d' != $rfile['type']) { // Third-parameter: (boolean) $overwrite if (!$wp_filesystem->move($source_dir.'/'.$rname, $dest_dir.'/'.$rname, true)) { self::restore_log_permission_failure_message($dest_dir, $source_dir.'/'.$rname.' -> '.$dest_dir.'/'.$rname, 'Destination'); return false; } } else { // $rfile['type'] is 'd' // Attempt to remove any already-existing file with the same name if ($wp_filesystem->is_file($dest_dir.'/'.$rname)) @$wp_filesystem->delete($dest_dir.'/'.$rname, false, 'f');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- if fails, carry on // No such directory yet: just move it if ($wp_filesystem->exists($dest_dir.'/'.$rname) && !$wp_filesystem->is_dir($dest_dir.'/'.$rname) && !$wp_filesystem->move($source_dir.'/'.$rname, $dest_dir.'/'.$rname, false)) { self::restore_log_permission_failure_message($dest_dir, 'Move '.$source_dir.'/'.$rname.' -> '.$dest_dir.'/'.$rname, 'Destination'); $updraftplus->log_e('Failed to move directory (check your file permissions and disk quota): %s', $source_dir.'/'.$rname." -> ".$dest_dir.'/'.$rname); return false; } elseif (!empty($rfile['files'])) { if (!$wp_filesystem->exists($dest_dir.'/'.$rname)) $wp_filesystem->mkdir($dest_dir.'/'.$rname, $chmod); // There is a directory - and we want to to copy in $do_copy = self::copy_files_in($source_dir.'/'.$rname, $dest_dir.'/'.$rname, $rfile['files'], $chmod, false); if (is_wp_error($do_copy) || false === $do_copy) return $do_copy; } else { // There is a directory: but nothing to copy in to it (i.e. $file['files'] is empty). Just remove the directory. @$wp_filesystem->rmdir($source_dir.'/'.$rname);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the method. } } } // We are meant to leave the working directory empty. Hence, need to rmdir() once a directory is empty. But not the root of it all in case of others/wpcore. if ($delete_source || false !== strpos($source_dir, '/')) { if (!$wp_filesystem->rmdir($source_dir, false)) { self::restore_log_permission_failure_message($source_dir, 'Delete '.$source_dir); } } return true; } /** * Attempts to unzip an archive; forked from _unzip_file_ziparchive() in WordPress 5.1-alpha-44182, and modified to use the UD zip classes. * * Assumes that WP_Filesystem() has already been called and set up. * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * * @param String $file - full path and filename of ZIP archive. * @param String $to - full path on the filesystem to extract archive to. * @param Array $needed_dirs - a partial list of required folders needed to be created. * @param String $method - either 'ziparchive' or 'pclzip'. * @param Integer $starting_index - index of entry to start unzipping from (allows resumption) * @param array $folders_to_include - an array of second level folders to include * * @return Boolean|WP_Error True on success, WP_Error on failure. */ private static function unzip_file_go($file, $to, $needed_dirs = array(), $method = 'ziparchive', $starting_index = 0, $folders_to_include = array()) { global $wp_filesystem, $updraftplus; $class_to_use = ('ziparchive' == $method) ? 'UpdraftPlus_ZipArchive' : 'UpdraftPlus_PclZip'; if (!class_exists($class_to_use)) updraft_try_include_file('includes/class-zip.php', 'require_once'); $updraftplus->log('Unzipping '.basename($file).' to '.$to.' using '.$class_to_use.', starting index '.$starting_index); $z = new $class_to_use; $flags = (version_compare(PHP_VERSION, '5.2.12', '>') && defined('ZIPARCHIVE::CHECKCONS')) ? ZIPARCHIVE::CHECKCONS : 4; // This is just for crazy people with mbstring.func_overload enabled (deprecated from PHP 7.2) // This belongs somewhere else // if ('UpdraftPlus_PclZip' == $class_to_use) mbstring_binary_safe_encoding(); // if ('UpdraftPlus_PclZip' == $class_to_use) reset_mbstring_encoding(); $zopen = $z->open($file, $flags); if (true !== $zopen) { return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $z->last_error));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } $uncompressed_size = 0; $num_files = $z->numFiles; if (false === $num_files) return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $z->last_error));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. for ($i = $starting_index; $i < $num_files; $i++) { if (!$info = $z->statIndex($i)) { return new WP_Error('stat_failed_'.$method, __('Could not retrieve file from archive.').' ('.$z->last_error.')');// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // Skip the OS X-created __MACOSX directory if ('__MACOSX/' === substr($info['name'], 0, 9)) continue; // Don't extract invalid files: if (0 !== validate_file($info['name'])) continue; if (!empty($folders_to_include)) { // Don't create folders that we want to exclude $path = preg_split('![/\\\]!', untrailingslashit($info['name'])); if (isset($path[1]) && !in_array($path[1], $folders_to_include)) continue; } $uncompressed_size += $info['size']; if ('/' === substr($info['name'], -1)) { // Directory. $needed_dirs[] = $to . untrailingslashit($info['name']); } elseif ('.' !== ($dirname = dirname($info['name']))) { // Path to a file. $needed_dirs[] = $to . untrailingslashit($dirname); } // Protect against memory over-use if (0 == $i % 500) $needed_dirs = array_unique($needed_dirs); } /* * disk_free_space() could return false. Assume that any falsey value is an error. * A disk that has zero free bytes has bigger problems. * Require we have enough space to unzip the file and copy its contents, with a 10% buffer. */ if (self::wp_doing_cron()) { $available_space = function_exists('disk_free_space') ? @disk_free_space(WP_CONTENT_DIR) : false;// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Call is speculative if ($available_space && ($uncompressed_size * 2.1) > $available_space) { return new WP_Error('disk_full_unzip_file', __('Could not copy files.').' '.__('You may have run out of disk space.'), compact('uncompressed_size', 'available_space'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } } $needed_dirs = array_unique($needed_dirs); foreach ($needed_dirs as $dir) { // Check the parent folders of the folders all exist within the creation array. if (untrailingslashit($to) == $dir) { // Skip over the working directory, We know this exists (or will exist) continue; } // If the directory is not within the working directory then skip it if (false === strpos($dir, $to)) continue; $parent_folder = dirname($dir); while (!empty($parent_folder) && untrailingslashit($to) != $parent_folder && !in_array($parent_folder, $needed_dirs)) { $needed_dirs[] = $parent_folder; $parent_folder = dirname($parent_folder); } } asort($needed_dirs); // Create those directories if need be: foreach ($needed_dirs as $_dir) { // Only check to see if the Dir exists upon creation failure. Less I/O this way. if (!$wp_filesystem->mkdir($_dir, FS_CHMOD_DIR) && !$wp_filesystem->is_dir($_dir)) { return new WP_Error('mkdir_failed_'.$method, __('Could not create directory.'), substr($_dir, strlen($to)));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } } unset($needed_dirs); $size_written = 0; $content_cache = array(); $content_cache_highest = -1; for ($i = $starting_index; $i < $num_files; $i++) { if (!$info = $z->statIndex($i)) { return new WP_Error('stat_failed_'.$method, __('Could not retrieve file from archive.'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // directory if ('/' == substr($info['name'], -1)) continue; // Don't extract the OS X-created __MACOSX if ('__MACOSX/' === substr($info['name'], 0, 9)) continue; // Don't extract invalid files: if (0 !== validate_file($info['name'])) continue; if (!empty($folders_to_include)) { // Don't extract folders that we want to exclude $path = preg_split('![/\\\]!', untrailingslashit($info['name'])); if (isset($path[1]) && !in_array($path[1], $folders_to_include)) continue; } // N.B. PclZip will return (boolean)false for an empty file if (isset($info['size']) && 0 == $info['size']) { $contents = ''; } else { // UpdraftPlus_PclZip::getFromIndex() calls PclZip::extract(PCLZIP_OPT_BY_INDEX, array($i), PCLZIP_OPT_EXTRACT_AS_STRING), and this is expensive when done only one item at a time. We try to cache in chunks for good performance as well as being able to resume. if ($i > $content_cache_highest && 'UpdraftPlus_PclZip' == $class_to_use) { $memory_usage = memory_get_usage(false); $total_memory = $updraftplus->memory_check_current(); if ($memory_usage > 0 && $total_memory > 0) { $memory_free = $total_memory*1048576 - $memory_usage; } else { // A sane default. Anything is ultimately better than WP's default of just unzipping everything into memory. $memory_free = 50*1048576; } $use_memory = max(10485760, $memory_free - 10485760); $total_byte_count = 0; $content_cache = array(); $cache_indexes = array(); $cache_index = $i; while ($cache_index < $num_files && $total_byte_count < $use_memory) { if (false !== ($cinfo = $z->statIndex($cache_index)) && isset($cinfo['size']) && '/' != substr($cinfo['name'], -1) && '__MACOSX/' !== substr($cinfo['name'], 0, 9) && 0 === validate_file($cinfo['name'])) { $total_byte_count += $cinfo['size']; if ($total_byte_count < $use_memory) { $cache_indexes[] = $cache_index; $content_cache_highest = $cache_index; } } $cache_index++; } if (!empty($cache_indexes)) { $content_cache = $z->updraftplus_getFromIndexBulk($cache_indexes); } } $contents = isset($content_cache[$i]) ? $content_cache[$i] : $z->getFromIndex($i); } if (false === $contents && ('pclzip' !== $method || 0 !== $info['size'])) { return new WP_Error('extract_failed_'.$method, __('Could not extract file from archive.').' '.$z->last_error, json_encode($info));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } if (!$wp_filesystem->put_contents($to . $info['name'], $contents, FS_CHMOD_FILE)) { return new WP_Error('copy_failed_'.$method, __('Could not copy file.'), $info['name']);// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } if (!empty($info['size'])) $size_written += $info['size']; do_action('updraftplus_unzip_file_unzipped', $file, $i, $info, $size_written, $num_files); } $z->close(); return true; } } Mendelson Tiu, Author at Smart Office - Page 43 of 72

    Smart Office

    WD Rolls Out Powerline Kit

    Western Digital has launched a powerline AV kit that allows a user to stream audio and video files using a power outlet.


    Click to enlarge

    The WD Livewire Powerline AV Network Kit comes with four ports on each of the two adapters, allowing users to connect their router and up to seven additional devices to their high-speed network.

    WD claims that the Livewire Powerline AV Network Kit provides data transfer speeds up to 200 megabits per second (Mbps) and is simple to set up. All a user needs to do is to simply plug one of the two adapters in the kit into their router and an electrical outlet then plug the other adapter into another outlet where they need access to wired network connections.

    WD’s Vice President of Marketing for its Branded Products Group, Dale Pistilli said, “Consumers are accumulating an increasing number of Internet-capable connected TVs, video game consoles and media players providing access to exciting online content through services such as YouTube. Wireless networks, while popular, don’t always deliver the reliable high-speed connections needed to sustain HD video streaming. Meanwhile, drilling holes for new Ethernet cables is complicated, expensive and messy. With the WD Livewire Powerline AV Network Kit, it’s truly easy to enjoy all the HD streaming and broadband Internet capabilities of these great new devices anywhere there is an electrical outlet.”

    The Western Digital Livewire is available now for $169.99. 

    Wireless All-In-One Printers From Lexmark

    Lexmark has launched two full-featured wireless all-in-one (AIO) printers that the company claims will deliver wireless connectivity, two-sided printing, and ease of use.

    Mark Oakey, Product Marketing Manager for Lexmark, mentioned that its goal is to provide an affordable printer that is easy enough for customers to use. Since Lexmark’s new all-in-one printers have wireless capabilities, users who have a wireless network set-up in their home or office may be able easily connect to the printer without the need for wires.

    Lexmark has also included features like photo printing, memory card slots, scanning functions, and even an LCD screen for using the unit without the need for powering up the PC. And in order to promote a cleaner and greener environment, its printers have the ability to print in both sides of a paper, comes with a Lexmark toolbar software that allows a user to print text without photos in websites, and even offer free cartridge recycling with the addition of a post paid recycling bag.


    Click to enlarge
    Lexmark’s X4850 All-in-One printer

    Lexmark’s Executive Vice President and Head of Consumer Printer Division, Paul Rooke said, “Lexmark’s new all-in-ones deliver business-class productivity with the added advantages of wireless to help busy professionals get more done quickly, easily and affordably.”

    Lexmark X6570 Wireless All-in-One

    The Lexmark X6570 Wireless All-in-One is a wireless four-in-one printer that has wireless connectivity and also has features such as two-sided printing, fax, an automatic document feeder for copying and faxing, and photo printing.

    The Lexmark X6570 has the following features:

    • Scan, fax and access media card slots wirelessly
    • Offers print speeds of up to 28 pages per minute (ppm) black and 24 ppm color
    • A 48-bit flatbed color scanner
    • Photo capabilities, such as scan-back photo proof sheet and optional six-color printing
    • PictBridge port
    • Lexmark evercolor2 inks
    • Lexmark Toolbar

    Lexmark X4850 Wireless All-in-One

    Lexmark is also offering the X4850 Wireless All-in-One for SOHO professionals who want to have a wireless printer that can print text documents and can handle photos as well.

    The X4850 has the following features:

    • Scan, fax and access media card slots wirelessly 
    • Two-sided printing 
    • A 2.4-inch color LCD display for photo viewing 
    • Memory card slots and PictBridge port 
    • Borderless printing
    • Lexmark evercolor2 inks

    Availability and Pricing
    The Lexmark X6570 and X4850 will be available starting this month with an RRP of $299 and $249 respectively.

    See: www.lexmark.com

    LG Phone Shinier The Second Time Around

    LG has given its Shine mobile phone a Titanium facelift. The new Titanium Shine looks similar to its predecessor, but does it address the shortcomings of the first model? We take a closer look.


    Click to enlarge
    Before looking at the TU720 up close, we placed the two Shine phones side-by-side in order for us to find out what changed. We have found the new LG Titanium Shine to be thicker than the older Shine but sports an all-new navigation key, a microSD card slot, and a relocated USB port (now found on the left side). There is also a big overhaul in the phone’s menu as the new Shine is being carried by Telstra, so expect services like Foxtel, Whereis Maps, and BigPond to be available.

    This slider phone has a reflective mirror finish and is mostly made out of stainless steel. A volume up and down key, multitasking key that allow you to change between programs, and a camera launch/shutter key can be found on the right spine of the phone, while a microSD card slot and a mini-USB port are located on its left spine. The front hosts a 2.2-inch screen, a VGA camera for video calling, a five way navigation key, and two soft keys for launching the Telstra Mobile Foxtel and BigPond services. Located at the back of the unit is the TU720’s 2 Mega Pixel camera with flash that can be used for taking photos or shooting videos.

     


    Click to enlarge
    Performance:

    Sliding the phone open reveals a cramped, flat, and stiff keypad, making it difficult for users (especially ones with fat fingers) to press the buttons. However, it is good to know that LG has changed the jog dial into a five-way navigation key, making it easy for users to browse through the main and sub menus. Pressing the navigation key brings you to the main menu, while moving the key in each direction (up, down, left, and right) launches the My Place, Contacts, Mailbox, and Inbox applications, respectively.

    The main menu consists of My Stuff (Graphics, Video, Audio and Ringtones, Music Player, Games, Applications, Bluetooth Files, Other Files, and Memory Card), Recent Calls (Missed Calls, Dialled Calls, Received Calls, All Calls, Call Duration), Messaging (New Message, Inbox, E-mail Inbox, Drafts, Outbox, Sent, Voicemail, Videomail, Templates, Message Settings), My Place (BigPond, Foxtel, Yellow Search, BigPond Music, My E-mail, Call 1234 Info, Whereis Maps, BigBlog and Photos, Downloads, and My Account), Address Book (Contact List, New Contact, Caller Groups, Speed Dial List, Copy/Move/Delete Contacts), Tools (Alarm Clock, Calendar, Tasks, Notepad, Calculator, Tip Calculator, Unit Converter, World Clock, Stop Watch, Date Finder, D-Day Counter),  Camera and Recordings (Take Photo, Record Photo, Record Voice), and Settings. Navigating through the sub-menus is fairly easy as the options are all lined-up in a list. The only problem we have encountered while navigating through the sub-menus is the constantly-changing back/cancel button.

    The TU720 that we received connects to the Telstra network, giving users HSDPA and 3G functionality, Foxtel Mobile and BigPond services, as well as other Telstra services. We have tested the Foxtel Mobile service and have found the LG Titanium to stream videos with minimal buffering time. The Internet connection was quick – web pages loaded in a matter of seconds and attached files were uploaded without any problems.

     


    Click to enlarge
    The TU720’s 2 Mega Pixel camera comes with a built-in LED flash that can brighten shots taken in the dark, has several ‘advanced’ options like White Balance adjustments, Colour Effects (Sepia, Mono, Negative, and Colour), and adjustable Resolution settings (320×240, 640×480, 1280×960, and 1600×1200). The outdoor photos (and some indoor shots) we took were often overexposed, leaving us with some loss of detail. In order to ‘fix’ this problem, one must either use a photo editing software, or manually adjust the White Balance settings.

    A user can also record interviews or create voice messages with the voice recording software, listen to audio tracks with the phone’s music player, pair to various devices using Bluetooth, and even use the phone as a modem using the USB cable. The 140MB internal memory of the phone can be increased to 4GB (via the microSD card slot), but users would have to purchase it themselves as LG did not bundle any microSD card with the package.

    Finally, LG claims that the 900 mAh Lithium-Ion battery for the TU720 has a Standby time of 250 hours, a Talk time of 180 minutes, and a Video Talk time of 130 minutes. Just remember that using this phone to watch Foxtel, listen to music files, and/or connect to the Internet will give you a shorter battery life.

     


    Click to enlarge
    Conclusion:

    The LG Shine LU720 is a chic phone that provides users with an abundance of phone features, access to online content such as Foxtel and BigPond, and even allows video calling between mates. This Titanium phone got what’s good from its older sibling, improved on it, and now shines brighter than before.

     

     

    Product Specifications:

    Phone Type: Slider
    External Display: 2.2″ LCD
    Number of Colours: 262K Colour TFT
    Internal Memory: 140MB
    External Memory: microSD card (optional)
     
    Data Connectivity
    USB: Yes
    Bluetooth: Yes
    PC Sync: Yes

    PIM
    Organiser/Calendar: Yes
    Alarm: Yes
    Phonebook: 500

    Advanced Features
    JAVA: MIDP 2.0
    MIDI: Yes
    Keytone Effect: Yes
    Camera: 2 Mega Pixel
    Camera Flash: Yes
    Camera Zoom: Up To 4x
    Videotalk: Yes
    VOD: Yes
    Multimedia Player: MP3, WAV, AAC, WMA, MPEG4, JPG, BMP
    Voice Recording: Yes
    Speakerphone: Yes

    Standard Battery: 900 mAh Li Ion
    Standby Time: 250 hours
    Voice Talk Time: 180min
    Video Talk Time: 130 min

    Dimensions: 99.8 X 50.6 X 15.08 MM
    Weight: 122g

    ————————————
    LG Black Label Series: Shine Titanium (TU720) | $829 |  | au.lge.com

    For: Better than its predecessor; New and improved navigation keys; A lot of features; Expandable memory using microSD card
    Against: No included memory card in the package; Keypad is still cramped; Photos tend to be overexposed; Shiny surface is a magnet for fingerprints
    Conclusion: A ‘shiny’ phone with a lot of features.

    Australians To Buy One Million Tablets In 2011

    Telsyte is predicting that over one million tablet devices will be sold in Australia in 2011 as more content, updated software and better hardware become available.


    Click to enlarge

    The company said that a number of factors including the push for more media tablet apps, rapid cannibalisation of other markets, increase in features, decrease in price and greater familiarity amongst consumers will drive the sales of tablets next year.

    Apple is expected to remain the leader in the market with a 60 percent share next year (down from 90 percent in 2010), while Android devices are expected to have 35 percent market share in 2011.

    In addition, Telsyte estimates that around 400,000 Australian consumers will be using a media tablet by the end of 2010, with approximately a quarter sharing a device. The company estimates that around 20,000 Australian businesses have purchased at least one media tablet for their organisation.

    Telsyte also forecasts the media tablet market to grow from $292 million in 2010 to $1.35bn in 2014.  

    Telsyte Research Director, Foad Fadaghi said, “The Australian media tablet market is poised to explode. Media tablets are an industry transforming device with implications for hardware vendors, media organisations, software companies and telecom carriers.”

    iiNet Tech Support Line For Mac Users

    Internet service provider iiNet is providing a dedicated Apple Macintosh support line for users who are having problems with their iiNet internet connection.

    iiNet Chief Operating Officer, Mark White said that its ability to offer current and future Mac user customers a dedicated support line was due to the growing number of iiNet customers using Macs. He also ensured that the support team is capable enough to guide users every step of the way.

    “Our specialist Mac Support Team has undergone a training program designed by Apple, and is dedicated to teaching effective troubleshooting for our Mac users. Each member of the Support Team has access to a range of live Mac computers and Operating Systems, to enable a faster, more individualised and accurate response. Our tech support line has seen around 5% of callers opting for the Mac support option. The percentage of iiNet customers that use Macs is higher than ever before – they currently represent around 10% of our customer base and we expect our Mac user numbers to increase in the near future,” he added.

    See: www.iinet.net.au/mac

    New Affordable Projector From BenQ

    BenQ aims to make projectors more affordable with the launch of the MP511, a 2000 ANSI lumens DLP digital projector that has an RRP of just $999.


    Click to enlarge
    This new projector replaces the very successful MP510 and claims to have a better overall performance and increased brightness, the company says.

    Managing Director of BenQ Australia, Phil Newton said, “Once again we are breaking new ground with the MP511, its astonishing to imagine the average person can afford an image up to 300-inches with this level of brightness in a DLP projector, we really have made projectors attainable to the masses. This truly is a unique beast and we are thrilled to be able to crack the $1,000 barrier with such a well equipped product.”

    BenQ claims that its MP511 offers 2000:1 contrast ratio, native SVGA resolution, and numerous inputs including Analog RGB, Component Video, S-Video and Composite Video. The MP511 also features “Brilliant Colour” a unique picture enhancement technology that vastly improves the overall picture performance, “Wall Colour Correction” a clever bit of processing that enables the user to adjust the image colour depending on the colour of the wall that’s being projected, and a 3D colour management which allows independent colour adjustment. The MP511 also includes 11 preset application modes, presentation timer and panel keylock for security.

    RRP: $999

    See: www.benq.com.au

    Video Streaming Chews Biggest Mobile Bandwidth

    Allot Communications reported that mobile data bandwidth usage increased by 68 percent during the first half of 2010. This is due to users streaming videos and checking social netowrking sites on their mobile phones.
    According to its MobileTrends Global Mobile Broadband Traffic Report, video streaming applications continue to dominate the global mobile bandwidth scene and remain the largest consumer of bandwidth with a 35 percent share.  Web browsing had a 29 percent share in mobile data usage while P2P and HTTP download represented 31 percent of global mobile bandwidth.

    In addition, video streaming is the single largest growing application type with a 92 percent increase, due in part to the ever-rising popularity of YouTube.  The report also found that Twitter grew its bandwidth usage by 310 percent while Facebook increased its dominance with a 200 percent rise.

    VoIP and IM applications grew significantly during this period becoming the second fastest growing traffic-type. Skype has continued to dominate this segment increasing its share of the global VoIP bandwidth from 77 percent in H2, 2009 to 83 percent in H1, 2010, leaving competitors like Google Talk, Yahoo Messenger and Windows Live Messenger behind.

     

    However, Yahoo Messenger is still the most popular IM application, accounting for 29 percent of global IM bandwidth, even if its bandwidth share has reduced since the second half of 2009.

    Allot Communications’ President and CEO, Rami Hadar said,  “The results of our latest MobileTrends Report reinforces that mobile broadband operators continue to face growing challenges as subscribers demand real-time content through an array of smartphones and Internet devices.”

    “The findings also clearly demonstrate the close ties between mobile broadband and social networking. Whether it’s YouTube, Twitter or Facebook, social networking via mobile devices is becoming a ‘must have’ for subscribers and we expect that this is just the beginning,” added Hadar.

    The Allot MobileTrends Report data was collected from January 1 to June 30, 2010 from leading mobile operators worldwide with a combined user base of 190 million subscribers. Allot gathered the data using the long term reporting capabilities of Allot NetXplorer, Allot’s centralized management and reporting system. The length of the collection period allows accurate identification of usage trends and patterns, reducing the influence of temporary events in the monitored networks.

    Dell Offers BigPond Wireless Broadband To Customers

    Dell has announced the addition of BigPond Wireless Broadband to its integrated mobile broadband options.


    From today, Dell will offer 13 notebook models with the capability to access BigPond Wireless Broadband built-in and plans starting from $34.95 per month.

    Client Computing Strategist for Dell, Jeff Morris says that this move by Dell is in response to direct customer feedback. “Dell is known for giving customers the ability the tailor what’s inside their notebook – we’ve recently given consumers the ability to choose the colour as well.  That flexibility extends to being able to use your Dell notebook online in more places too.”

    “Our build-to-order capability gives us the flexibility to do this at our factory and deliver to each customer a bespoke system tailored just the way they want.  We’ve worked closely with BigPond to make the wireless broadband experience simple, easy to buy and to use,” Morris said.

    BigPond Group Managing Director, Justin Milne said, “Fire up your new notebook, run the connection manager, pick a plan, and you’re online.”

    Pricing and Availability

    The following models are available today with BigPond mobile broadband plans starting from $34.95 per month on a 12-month plan (for details see
    www.dell.com.au/mobilebroadband):

    • Latitude D830, ATG 630, D630 and D430
    • Precision M4300
    • Inspiron 1420, 1520 and 1720
    • Vostro 1400 and 1500
    • XPS M1730, M1530 and M1330

    See: www.dell.com.au

    Epson Rolls Out New Office Printers

    Epson has launched four new multifunction and single function inkjet printers with wireless and fax capabilities, as well as speedy print, copy and scan speeds.

    The Epson Stylus Office TX600FW, TX300F, T40W, and T30 are business-focused printers that provide connectivity and communication, along with printing, scanning and imaging output tools for home office users.

    According to Epson, the new printers use Epson’s improved DURABrite Ultra resin coated pigment ink in individual ink cartridges to lower ink costs and produce photos and documents that last up to 120 years on selected Epson paper. The Epson DURABrite ink is resistant to water and smudging, produces sharp detail in text and images on a wide variety of papers, and enhances photo glossiness by up to 50% on selected Epson papers.

    And Epson’s Stylus Office printers accept a wide variety of media types from coated glossy photo papers to heavyweight matte paper and pre-gummed envelopes.

    The Office TX600FW and Office T40W are equipped with the new generation Epson MicroPiezo print head with ink repellent coating that delivers 5760 x 1440 dpi print resolution and graphics A4 prints at 27 pages per minute in black and 19 pages per minute in colour (38 ppm black and colour in draft mode).

     

    The Office TX600FW and Office T40W have high volume ink cartridges for long print runs, and the Office TX600FW has a 30 page automatic document feeder for increased office productivity.

    Both the Office TX600FW and Office T40W have integrated Ethernet/wireless connections for shared printing, and the Office TX600FW has an inbuilt black/colour fax. The Office TX600FW also has built-in card slots that will read most popular storage card types, and all the Stylus Office range has a Hi-Speed USB port compatible with USB 2.0.

    The Epson Stylus Office TX300F is an entry level home office and small business multifunction printer with a 30-page automatic document feeder and colour fax capability for enhanced productivity.  It has an optical resolution of up to 2400 dpi and prints and copies at up to 31 A4 pages per minute in draft.  The Office TX300F will also copy high resolution colour photographs directly to Epson glossy photo paper to create borderless prints.

    The Office T30 is an entry-level A4 all-purpose single function inkjet printer that produces high quality photos and laser quality documents for the office at up to 27 black and white A4 pages per minute and up to 11 colour A4 pages per minute (up to 38 pages per minute in draft mode).

    Availability and Pricing:

    The new Epson Stylus Office line will be available starting this month with the following RRP:
    – The Epson Stylus Office TX600FW: $249
    – Epson Stylus Office TX300F: $149
    – Epson Stylus Office T40W: $149
    – Epson Stylus T40W: $149

    See: www.epson.com.au

    Be Seen With Mitsubishi LCD Screen

    The new line of commercial LCD displays from Mitsubishi Electric allows a user to control several displays from a single location with its Ethernet transmitter and receiver.

    The 52-inch MDT521S comes with a CAT-5 transmitter/receiver pair that allows both video and control signal data to be transmitted over the same network cable.

    According to the company, the CAT-5 connectivity supports Full HD signals over a tested 150 metres. Up to five displays can be daisy-chained over a distance of 200 metres. The CAT-5 connection is also available as an option for the MDT421S.

    Using the standard VGA connection, up to 25 displays can be combined to create a single large video wall, with frame compensation taking into account the bezel widths. The displays can be installed in landscape, portrait or full face-up positions.

    Mitsubishi Electric Australia’s National Manager of the Visual Information Systems Department, Stuart Baker, said, “In large locations such as airports, shopping centres or high rise buildings, it can be difficult to have several displays controlled from a central location. With the MDT displays however, this type of installation becomes much easier to achieve.”

     

    Other features include twin ambient light sensors allowing the displays to automatically and accurately adjust brightness to suit any environment. Colour matching is also a key feature with 6-axis colour adjustment allowing users to adjust the hue and saturation of red, green, blue, magenta, yellow or cyan independently.

    Mitsubishi Electric optional Colour Match software, when used in conjunction with an external analyser can quickly and easily colour match any display wall with just the press of a key.

    The MDT range also includes the standard features found in all Mitsubishi Electric commercial LCD displays, such as power and input scheduling, a screen saving function to prevent image retention, and PinP/PoutP modes. The MDT models come with a remote control with discrete input switching. Optional speakers, display feet and a silver bezel are also available.

    The Mitsubishi MDT421S and MDT521S are available now for $3990 and $8990, respectively.