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 6 of 72

    Smart Office

    $999 Quad Core Beast Sold By Aldi

    Aldi is probably the last place you will go to if you are looking for a new workstation. Which is fair enough I suppose, as a lot of users only visit this supermarket to do their groceries. But Aldi’s latest offering, the Akoya MD8390 from Medion, is by far one of the best desktop PCs you can find for its price.


    Click to enlarge

    For $999, you get a well-specced PC with an abundance of connectivity ports that is ready for just about any home or office task. Although one may argue that a similar box with the same specifications can be built at a cheaper price, you would have to resort to purchasing the parts separately and building it yourself.  And for some people, that is just not going to happen.

    This box comes with an Intel Core 2 Quad processor, 2GB of RAM, an Nvidia graphics card, a 500GB drive, and comes with just about any computer port you can think of.

    Pressing the Connect.XL button up front reveals two USB ports, a headphone and microphone jack, Firewire, and three slots for all current flash memory cards (SD/MMC/MS, CF, SM/XD). The back of the unit hosts PS/2 ports for the mouse and keyboard, six USB ports, Firewire, Ethernet port, Line-in, Front line-out, back surround line-out, side surround line-out, centre/subwoofer line-out, S/PDIF out COAX and Optical, as well as an HDMI, DVI-I, and S-Video out. Medion has even included a wireless mouse and keyboard to the mix, allowing users to type freely.

     


    Click to enlarge

    Located on top of the case is an HDD bay designed for Medion’s HDDrive 2 Go Ultraspeed hard drive, which, as we said in one of our reviews before, could have been better if they just switched it with a generic port to use with other ‘portable’ hard drives.

    The MD8390 is powered by an Intel Core 2 Quad Q6600 processor running at 2.4Ghz, has 2GB of RAM, and uses Nvidia’s Geforce 8600 GS graphics card (256MB). It runs on Windows Vista Home Premium with Service Pack 1 pre-installed, saving users hundreds of megabytes on Vista downloads and updates.

    Medion has also pre-installed a Bullguard Internet Security Package (with 90-day update), Google desktop, Microsoft Office 2007 (60-day trial), Microsoft Works, Nero 8 Essentials (BackItUp 3, Burning ROM, ControlCenter, CoverDesigner, Express, MediaHome, Recode, ShowTime, StartSmart, Vision, and WaveEditor), and Ulead PhotoImpact12 on the MD8390.

     

    The MD8390 comes with an HDMI-out port that allows a user to connect the PC to any HD LCD or plasma screen and can display images to a resolution of up to 1920 x 1080. A DVI-I port is also available, should the monitor does not have any available HDMI port.

    A multi-format DVD/CD burner is also included, just in case users would want to burn files or backup data.

    The Intel Core 2 Quad processor found in the new Medion MD8390 workstation deliver a lot of processing grunt and use a lot less power. And with an RRP of $999, this is an unbelievable value for money. The MD8390 will hit Aldi stores on the 14th of August and comes with a two year warranty and a 60-day money back guarantee.

    See page over for full product specifications and final rating.

     

    Medion Akoya MD8390 Product Specifications:

    – Intel Core 2 Quad processor Q6600: 2.40 GHz, 8 MB L2 CACHE, 1066 MHz FSB
    – NVIDIA Geforce 8600 GS: 256 MB DDR2 SDRAM, DirectX 10 and HDCP support
    – 500GB hard drive
    – 2048 MB DDR2 SDRAM with 667 MHz at 64 Bit, Dual Channel Memory
    – Multiformat DVD/CD burner
    – Integrated Wireless LAN IEEE 802.11n draft
    – Network controller Ethernet LAN 10/100 Mbit/s on board
    – 8 Channel High Definition Audio

    Front connections:
    – 2 x USB 2.0
    – 1 x Firewire
    – 1 x Microphone
    – 1 x Headphone
    – Integrated USB 2.0 Flash memory card reader, reads and writes most flash memory cards

    Rear connections:
    – 2 x PS/2
    – 6 x USB 2.0
    – 1 x COM port
    – 1 x Firewire
    – 1 x LAN (RJ45)
    – 1 x Line-in
    – 1 x Front line-out
    – 1 x Back surround line-out
    – 1 x Side surround line-out
    – 1 x Centre/subwoofer line-out
    – 1 x S/PDIF out COAX
    – 1 x S/PDIF out Optical

    Video / TV connections:
    – 1 x DVI-I (incl. adaptor for D-Sub)
    – 1 x HDMI
    – 1 x TV out

    Software package include:
    – Windows Vista Home Premium with SP1
    – Nero 8
    – Microsoft Works 9
    – Microsoft Office Home and Student Edition Trial (60 day test version)
    – BullGuard Internet Security Package

    Accessories Included:
    – Wireless keyboard
    – Wireless Mouse

    ————————————
    Medion Akoya MD8390 | $999 |  | www.aldi.com.au

    For: Quad core processor; Noteworthy specs; Abundance of ports; HDMI out; Value for money
    Against: Better if Medion added more RAM to make the unit run faster
    Conclusion: A workstation well-worth your money

    Logitech Unveils Clip-On Mouse

    Logitech has launched a cordless laser mouse that lets you conveniently clip the mouse to your laptop with its Clip-and-Go dock.


    Click to enlarge
    The V550 Nano cordless laser mouse also comes with a Plug-and-Forget Nano-receiver that stays nearly flush against the side of the computer, so it doesn’t have to be unplugged when you stow your laptop.

    Logitech’s Senior Vice President and General Manager of the Control Devices Business Unit, Rory Dooley said, “Logitech research revealed that the vast majority of people who use a notebook PC are mobile both within and outside the home. To meet the demands associated with increased mobility, the V550 mouse offers a complete set of features to make it easier to use a mouse with a notebook when moving from the kitchen to the living room or from one’s desk to a meeting. Now, you won’t have to choose between grabbing your mouse or a cup of coffee.”

    The new V550 mouse claims to have up to 18 months of battery life and is the only Logitech cordless laser mouse currently offering this extended level of use. It also automatically turns off when it’s docked or when the Nano-receiver is stored inside the mouse.

    The V550 Nano is offered in two colours – grey with silver accents and silver with cool-blue accents. And with the purchase of the new Logitech mouse, you’ll receive two Clip-and-Go docks – one silver, one black. An included setup kit makes it easy to install the dock, and to remove it, if necessary.

    Pricing and Availability
    The Logitech V550 Nano cordless laser mouse for notebooks is expected to be available in Australia in late August with an RRP of $99.95.

    See: www.logitech.com

    BenQ Unveils World’s First Full HD Monitor Range

    BenQ has unveiled the world’s first Full HD range of displays. The T2200HD, E2200HD, M2200HD, E2400HD and M2400HD are the world’s first native Full HD 1080p16:9 LCD monitors featuring 100 percent mapping to 1080p content.

    With the release of these three 22″ (21.5″ viewable) and two 24″ 16:9 models BenQ is able to offer a traditional LCD Monitor that provides Full HD 1080p resolution and aspect ratio.  Spreading across BenQ’s T, E and M Series LCD displays, the new models will debut later in September, offering value performance and extreme multimedia capability.

    With 100% dot-for-dot matching to Full HD materials, BenQ’s new 16:9 large screens deliver 1080p content such as Blu-ray movies and PS3 games without distortion, blur or the need for resizing.  Viewable area is likewise optimized as black bars are totally eliminated.  

    BenQ Australia’s Managing Director, Phil Newton said, “Once again we are leading the world with lifestyle design and convergent display technologies. The new HD series of LCD monitors provide Full HD viewing capability and merges it perfectly with traditional and future computing and video platforms. Our upcoming Full HD lineup, in sleek LCD form, makes 1080p viewing luxury a convenient possibility for all aspects of daily life, reaffirming our core competency in display innovation and our relentless pursuit of bringing enjoyment and quality to life through seamless merging of work and play.”

     


    Click to enlarge
    The E2200HD and E2400HD
    T2200HD

    The T2200HD represents the most cost effective 22″ (21.5 viewable) ever produced with Full HD 1080p native resolution. The T2200HD has a 5ms response time, 10,000:1 DCR (Dynamic Contrast Ratio), D-Sub VGA and DVI (HDCP) inputs

    E2200HD & E2400HD

    The E2200HD and E2400HD deliver uncompromised visual enjoyment of high definition content with a native Full HD 1080p display. The 10,000:1 DCR and 300nit brightness render dark details in razor-sharp clarity along with a rich, vibrant display of 16.7M colors. Senseye+photo instantly optimizes viewing for all home and office applications, while gaming and video are enhanced by integrated speakers, headphone jack, and a fast 2ms response time.  Additionally the E2200HD & E2400HD features include HDMI, DVI-D (both with HDCP), D-Sub for VGA, 2ms GTG response time and Windows Vista Premium Certification. 

     


    Click to enlarge
    M2400HD and M2200HD Full HD monitors
    M2200HD & M2400HD

    Both the M2200HD 22″ (21.5″ viewable) and the M2400HD 24″ offer native Full HD 1080p for the ultimate home multimedia experience.  Internet chatting is made possible with a 2.0M webcam, integrated speakers, and microphone.  Future-proof HDMI and DVI-D (both with HDCP) deliver easy connection to HD gaming consoles, Blu-ray players and set-top boxes and a 3 port USB Hub makes interconnectivity seamless.

    Gamers and movie fans are catered for with a headphone jack, D-Sub, and super-smooth picture quality via the fast 2ms GTG response time.  Senseye+photo Human Vision Technology, a proprietary digital image enhancement engine, additionally fine-tunes depth, clarity, and boldness with five preset modes – Standard, Dynamic, Photo, Movie and sRGB.  Exceptional dark detail definition is afforded by a high 10,000:1 Dynamic Contrast Ratio, which automatically adjusts the display’s backlight to optimize light levels for every scene.

    The 22″ and 24″ range of 16:9 1080p Full HD LCD displays will be available throughout Australia in late September.

    See: www.benq.com.au

    Get ‘Moov’ing With Mio GPS

    Mio is set to launch a new range of portable navigation device designed to move users anywhere in Oz.


    Mio Moov 370: TMC Built-in
    The new Mio ‘Moov’ series (Moov 300, Moov 360, Moov 370) all sport a 4.3-inch anti-glare widescreen to make viewing and accessing information simple and easy, a sleek new design, and comes with a two year product warranty.

    The Moov range promises the most comprehensive map data available in Australia with its MioMap2008 feature, powered by Navteq On Board, giving users access to the most up to date map data, with 100 percent coverage of Australian roads.
     
    Mio also says that its Moov series is also the first device in the Australian market to feature Live Points of Interest (POI) search powered by TrueLocal. In addition to the 600,000 built-in points of interest (like restaurants and bars) included with MioMap2008 software, users can now connect to over a million business listings and venues via live search using a Bluetooth compatible mobile phone. Convenience is guaranteed with the feature working straight out of the box – no additional downloads required.
     
    National Sales Manager, Peter Ferrigno said, “The Mio Moov range delivers what consumers have come to expect from Mio – a product packed with more features but at a value for money price. The partnership between NAVTEQ and Mio also means our customers will have access to map features never before seen in Australia.”

     


    Click to enlarge
    Moov 300: Out of the box and into your car
    The new range also offers real time traffic updates via the Traffic Message Channel (TMC), provided by SUNA Traffic. Following on from being first in Australia to offer TMC in Melbourne, the Moov range extends coverage to include metropolitan Sydney and Brisbane. The Moov 370 is TMC enabled in-the-box while the Moov 300 and Moov 360 can be activated as an optional extra. With TMC technology, users can find out what’s causing a delay, approximate time of delay and a detour option to reach their destination on time.
     
    Mio has also included a new text-to-speech (TTS) function that will give users turn-by-turn guidance in clear Australian pronunciation and spoken street names. The Mio Moov will also alert drivers to the locations of over 11,000 fixed red light and speed cameras, school zones, blackspots and railway crossings. Visual and audio warnings will alert the user prior to the location, so they can concentrate more on the road.

    Users are also set to discover a whole new dimension to discovering new places with NavPix photo navigation. Drivers can choose to navigate to a destination using a photo, simply by downloading geo-tagged images from Flickr and the MioMore desktop software.

    A quick start up is also guaranteed with Mio Moov Instant Fix, allowing the Mio Moov to hook up with satellites up to five times faster. It also intuitively updates the data every three days without the need for a PC connection.

    In addition to the plethora of new features included as standard, the Mio Moov 360 and 370 include even more product features to offer the ultimate in convenience, with Bluetooth Hands-Free capabilities and 3D landmarks.

    By simply pairing a Bluetooth compatible phone with the Moov 360 or 370, users can make or receive phone calls – the Moov becoming a hands free device. It also comes with a 3D landmarks feature that will highlight prominent landmarks in 3D.

     

    Mio Moov 300 (RRP $349) – for the GPS beginner
    Ready to go straight from the box, it includes the easy-to-use MioMap2008, a 4.3″ antiglare widescreen, enhanced safety alerts, instant GPS Fix and the handy spoken street names, for greater accuracy and ease in reaching your destination. The unit comes with a 2 year manufacturer’s warranty.

    Mio Moov 360 (RRP $429) – for the intermediate user looking for added convenience
    In addition to the high quality Moov features included as standard, users will love being able to make and take calls using a Bluetooth compatible mobile phone or undertake a Live POI search by connecting to over a million business listings. And more for even more value, the Moov 360 features the intricate detail of Australian landmarks in 3D with the option to rotate the view 360 degrees.

    Mio Moov 370 (RRP $549) – for the advanced user who likes to get there on time, every time
    The Mio Moov 370 is the ultimate GPS unit packed with all the features including Live Traffic Updates activated in-the-box. Users can receive real time traffic information sent directly to the Moov 370, including updates on traffic congestions, accidents, road works and road closures (Sydney, Melbourne, and Brisbane). Live traffic Updates are also available optional with the Moov 300 and Moov 360.

    Availability

    The new Mio Moov series will be on shelf September 1 at Harvey Norman, Retravision, Myer and other national retailers

    See: www.mio.com.au

    Intel Unveils Core i7 Chip

    Intel has announced that its new processor, which was formerly known as Nehalem, will now be branded as Intel Core i7.


    Click to enlarge
    According to Intel, products based on the new microarchitecture will deliver high performance and energy efficiency. This “best of both worlds” approach is expected to extend Intel’s processor leadership in future mobile, desktop and server market segments.

    Intel’s Executive Vice President and General Manager, Sales and Marketing Group, Sean Maloney said, “The Core name is and will be our flagship PC processor brand going forward. Expect Intel to focus even more marketing resources around that name and the Core i7 products starting now.”

    The Intel Core processor brand name has gained broad awareness, preference, and market momentum over the past several years. The Intel Core name remains the logical choice for Intel’s latest family of processors. The Intel Core i7 processor brand logo will be available for high-performance desktop PCs with a separate black logo for Intel’s highest-end “Extreme Edition.” Intel will include processor model numbers to differentiate each chip.

    Initial products based on this microarchitecture are expected to be in production in the fourth quarter of this year. These processors will feature Intel Hyper-Threading Technology, also known as simultaneous multi-threading, and are capable of handling eight software “threads” on four processor cores.

    See: www.intel.com.au

    Lenovo Launches Thinnest And Lightest Notebook

    Lenovo has announced a notebook that is only 18.6 millimetres thin and weighs 1.33kg, making it the thinnest and lightest 13-inch notebook to date.

    The ThinkPad X301 notebook PC offers a storage capacity of either 64GB or 128GB solid state drive and claims to perform 20 percent better over the X300 due to the latest DDR3 memory and the latest Intel Core 2 Duo processor.

    Lenovo Australia and New Zealand’s Business Manager for Desktops and Notebooks, Otto Ruettinger said, “Lenovo continues to push the technology envelope by giving road warriors the latest enhancements in solid state drive storage and digital display technologies with the new ThinkPad X301 notebook PC. This announcement extends our commitment to blending ultraportability and functionality, and equipping today’s business users with the most advanced, highest-performing computing tools.”

    New support for DisplayPort makes viewing high definition content easy and ideal for models with the ultra-thin DVD burner. With support for both DisplayPort and VGA, users can even watch high definition content on multiple displays. Designed for maximum options for wireless connectivity, the ThinkPad X301 offers models with high-speed mobile broadband and Wi-Fi to connect wirelessly to the Internet and Bluetooth.

     

    The notebook also includes Lenovo’s ThinkVantage Technologies, unique hardware-software tools designed to maximise user productivity. With Lenovo’s improved Access Connections tool, users can navigate a user-friendly interface to easily find and access Internet and network connections. Also, Lenovo’s improved Power Manager gives users more control over notebook functions to enable longer battery life.

    The ThinkPad X301 notebook also continues Lenovo’s focus on environmentally-responsible design. Its 13.3-inch LED backlit display, solid state drive storage and other energy-efficient technologies help make it rated Gold by the Electronic Product Environmental Assessment Tool.

    This designation adds to Lenovo’s portfolio of Gold-rated ThinkPad notebook and ThinkCentre desktop PCs.

    Pricing and Availability

    Pricing for models of the ThinkPad X301 notebook start at AUD $3,699.00 and will be available starting September.

    See:  www.lenovo.com.au

    LG Unveils Phone For The Bush

    LG has released the KF390, a smartphone that features HSDPA connectivity and has Telstra’s Blue Tick of approval, making it an ideal mobile phone for wider coverage across Australia without the need for an external antenna.


    Click to enlarge
    According to LG, the KF390 sports an improved phone design, fast web browsing and data download speeds, and an optional car kit that provides maximum coverage on Telstra’s Next G network.
     
    Telstra Product Management, Executive Director, Mr Ross Fielding, said the KF390 gives users access to the world’s fastest 3GSM data download speeds when teamed with Telstra’s Next G network. “That capability translates to a faster experience for customers browsing the net, downloading content and using 3G applications like WhereIs mapping.”
     
    Carli Wilson, Marketing Manager Mobile Communications said, “The LG KF390 responds to this demand by offering customers strong coverage performance around Australia with the added benefit of smart technology and stylish design,. This further signifies LG and Telstra’s commitment to providing first-class mobile phones to rural and regional customers across Australia.” 

     

    Featuring a slim, black exterior, users navigate through menu options using a large, circular navigation key allowing for easy selection. Upon sliding open the sturdy handset, the hidden touch navigation buttons appear and the signature glowing icons appear completing the phone’s sophisticated look with a modern twist.
     
    Key features of the LG KF390 include:

    • Telstra Next G Blue Tick of Approval
    • Super-fast 7.2Mbps HSDPA 
    • 2.0 mega pixel camera & video calling 
    • 2-inch LCD screen 
    • Touch navigation and large tactile keys 
    • Speakerphone 
    • Bluetooth 
    • MP3 Functionality
    • Expandable 2MB Memory 
    • Optional compatible car kit 

    The LG KF390 is exclusive to Telstra and is available now for RRP $559.

    See: au.lge.com

    Canon Shoots Laser Printers To The Office

    Canon has just released three new mono laser printers and a coloured laser printer that caters to small and medium businesses.


    Click to enlarge
    The new mono Laser Shot range (LBP-3370, LBP-3310, and 3250) as well as the new coloured Laser Shot (LBP-5050N) claims to minimise paper and overall power consumption, saving money and environmental resources for your business in the process.

    Canon Australia’s Brand Manager for Consumer Imaging Product Group, Alyson Barden said, “Small and medium businesses can benefit greatly from the quality prints and stylish look of these new Laser Shot models. Each model is uniquely suited for different office sizes, but the one constant is the ability to create quality output quickly at a reasonable price.”

    LASER SHOT LBP-3370

    The LASER SHOT LBP-3370 is a mid-range mono printer that claims to offer high-quality prints at 9600 x 600 dpi resolution. It can be shared among small workgroups with its network capability and large print trays, which can hold 300 sheets at once. Canon’s High-speed “CAPT
    3.0″ printing technology delivers 26 pages per minute and the ability to print double-sided sheets.

    Canon’s On-Demand Fixing System saves power consumption with instant warm up, delivering the first print in only 6.5 seconds. The LASER SHOT LBP-3370 also comes with an All-in-One cartridge system, which combines the drum, toner and waste toner box all in one cartridge.

     

    LASER SHOT LBP-3310

    The LBP-3310 claims to print at a rapid speed of 26 pages per minute and offers double-sided prints at 13.3 ppm. It comes with Canon’s On-Demand Fixing System that instantly warms up that unit and delivers the first print in 6.5 seconds.

    A gradation control enables a high-definition print resolution of 9600 x 600 dpi, and also features efficient and hassle-free All-in-One toner cartridges and quick start-up for low power consumption.

    LASER SHOT LBP-3250

    Printing at a resolution of 1200 x 600 dpi and featuring the PC-processing “CAPT” technology, the LBP-3250 produces high-quality prints and allows any small business to work more efficiently in terms of both time and costs.

    Key Product Points for the LASER SHOT LBP-3310, LBP-3370 and LBP-3250

    • High-Performance Printing System – CAPT technology works with PC processing power
    • All-in-One Cartridges – combines consumables in one for hassle-free operation
    • Auto duplex (double sided) prints – reduced paper consumption
    • Instant Warm-Up – no waiting for prints, 0 seconds from stand-by mode
    • High-quality prints up to 9600 x 600 dpi – professional results
    • Low Power Consumption and Quick Start Up – saves energy, allows for immediate prints
    • Appealing design – easy to fit in small offices
     


    Click to enlarge
    Laser Shot LBP-5050N

    This printer will fit small office spaces as it sports a low design and easily to access paper tray. Network capability allows multiple employees to print at once from their work stations. An assortment of paper types, including heavy paper and envelopes, allow for a variety of print projects and creative applications in both colour and mono.

    The LBP-5050N claims to have a print speed of 8 pages per minute in colour and 12 ppm in mono, and is equipped to print with resolution of 9600 x 600 dpi.

    The LASER SHOT LBP-5050N consumes less energy and reduces carbon emissions by only using 4W power in stand-by mode and comes with an All-in-One cartridge system which combines the drum, toner and waster toner box all in one cartridge.

    Key Features of the LASER SHOT LBP-5050N

    • High-Performance Printing System – CAPT 3.0 technology works with PC processing power
    • All-in-One Cartridges – combines all consumables in one unit
    • High-quality prints up to 9600 x 600 dpi
    • Low Power Consumption and Quick Start Up – saves energy, allows for immediate prints
    • Appealing design – easy to fit in small offices

    Pricing and Availability

    The Laser Shot LBP-3370 (RRP $649), LBP-3310 (RRP $399) LBP-3250 (RRP $199), and LBP-5050N ($449) are available through Canon dealers now.

    See: www.canon.com.au

    Palm Unveils Slick New Smartphone

    Palm has officially launched its new smartphone aimed at business people and casual users who want to stay organized and connected 24/7.


    Click to enlarge
    The new Palm Treo Pro comes with the latest Windows Mobile 6.1 Professional, includes e-mail, Wi-Fi, and GPS capabilities, all in a sleek package.

    Palm’s President and Chief Executive Officer, Ed Colligan said, “Businesses want the control and savings that Windows Mobile affords, in an innovative and elegant package that keeps their users happy. That’s where Palm comes in. Everything about Treo Pro — from the hardware design to the packaging and accessories — embodies the elegant and simplified end-to-end experience that our customers expect from Palm.”

    According to Palm, the Treo Pro smartphone lets IT managers support an increasingly mobile work force with the ease of use and robust feature set business professionals demand. Besides the benefits of lower costs and increased productivity, Treo Pro can deliver the increased security, easier device management and access to information on the corporate network that Windows Mobile 6.1 provides.

     

    Users can quickly respond to business and personal email, access the web, stay on top of appointments and contacts, and use Wi-Fi or GPS on the go. The thin design blends a flush, high-resolution color touch screen and a full QWERTY keyboard with a removable battery that packs up to five hours of talk time.

    The Palm Treo Pro Includes the following features:

    •  Windows Mobile 6.1 Professional OS
    • One-touch Wi-Fi button (802.11b/g)
    • Today screen enhancements — Web search directly from the Today screen. 
    • Ringer switch — Silences the device immediately. 
    • Screen saver that notifies a user of the time, missed call, or SMS/MMS received
    • New voicemail indicator 
    • Dedicated email and calendar buttons — Fast one-button access. 
    • Microsoft Direct Push Technology — Direct connection to Microsoft Exchange Server 2003 SP2 or 2007 
    • Microsoft System Center Mobile Device Manager 2008 
    • UMTS/HSDPA network capabilities 
    • Integrated GPS — Users can access maps, turn-by-turn directions and point-of-interest (POI) searches.

    The Treo Pro smartphone comes with an international power charger, microUSB cable and a stereo headset (3.5mm). Other accessories designed exclusively for Treo Pro (sold separately) include a vehicle power charger, leather side case, travel microUSB cable, cradle, extra battery, TTY audio adapter, and replacement styli.

    Pricing and Availability

    The Palm Treo Pro will be available in September through Telstra (from free with contract), with exact RRP to be announced soon.

    See: www.palm.com/TreoPro

    Budget-Friendly Medion Notebook For Power Users

    For a consumer, specifications play an important role come decision time. Sure, a lot of people may decide to purchase a popular brand of notebook, but for someone who is cash-strapped, price does matter. As a consumer out there who is after the best bargains, I want to find the best deal for my hard-earned dollar.

    Fortunately, an Aldi store is just across the SmartHouse office, and that is the first place I went to.

    While retailers like Harvey Norman and Dick Smith sell notebooks for as low as $500, these only have minimum specifications and lack grunt to multi-task. Looking at the other end of the spectrum, there are those notebooks that are powerful enough to play games and do video editing without experiencing lags slowdowns. Unfortunately, it will cost you an arm and a leg, and that is what people don’t fancy doing.

    Aldi’s new offering, a 15.4-inch notebook from Medion, has a Core 2 Duo processor, an Nvidia video card with HDMI out, a 320GB hard drive, 3GB of memory, and will only have a retail price of $999. Not bad for a powerhouse that can help you take your work and play anywhere.

    The Medion MD96970 sports a classy piano black finish that gives it a ‘professional’ touch. It does not have any sort of latches and even comes with a fingerprint reader that recognises your identity in a swipe.

     


    Click to enlarge
    The unit has a line-in, microphone-in, and headphone-out jacks up front, with the speakers cleverly hidden on the sides. An ExpressCard slot, 4-in-1 card reader (SD, MMS, MS, MS Pro), HDMI-out, E-SATA port, Ethernet, S-Video out, D-Sub, power port, and Kensington port are located on the left side, while three USB ports and a DVD/CD optical drive can be found on its opposite side.

    Opening the notebook’s lid reveals a 15.4-inch notebook, a built-in webcamera and speakers, touch sensitive multimedia keys (Wi-Fi, Play/Pause, Stop, Previous, and Next), keyboard with a dedicated numeric keypad, touchpad, and a fingerprint reader. The keys have a matte finish, is well-spaced, and is tactile, which certainly makes typing easy and natural.

    Specifications-wise, the computer runs on an Intel Core 2 Duo T5750 processor running at 2.0 GHz, utilises Nvidia’s Geforce 9300M G video graphics card (128MB), has 3GB of RAM, 320GB of storage, and comes pre-installed with Windows Vista Premium Service Pack 1.

     

    Like any Medion PC that we have reviewed, this notebook comes with quite a number of software programs to get you started. A trial version of Bullguard and Microsoft Office 2007 is included, as well as Cyberlink’s Home Cinema suite (CyberLink Medi@, PowerDirector, Cyberlink YouCam), Microsoft Works, Nero 8 Essentials (BackItUp, Burning ROM, ControlCentre, CoverDesigner, Express, MediaHome, Recode, ShowTime, StartSmart, Vision, WaveEditor), and Ulead’s PhotoImpact12 software.

    A program well-worth mentioning is the Softex OmniPass, a fingerprint reader software that not only stores your personal Windows log-in data, but also manages all your username and password data when visiting secure websites. It also comes with a ‘File Protection’ feature that encrypts your files, which helps protect files and important folders.

    The stored usernames and passwords can be edited or deleted with a single swipe. In our tests, we found the OmniPass software to log our username and password on sites like Gmail and Yahoomail, although sometimes the software had issues inputting our account details.

    The encryption software worked without a hitch: it was able to encrypt files and folders and restore the file back with a single swipe. Just remember to decrypt all the OmniPass encrypted files and back them up to a removable media before uninstalling the OmniPass software or reformatting the hard drive.

     

    The unit lasted around 120 minutes when set to Windows’ High Performance mode, which would probably last longer if it is set to Power Saving mode and if a user does not use the optical drive. Nevertheless, this notebook has enough juice to last for a couple of presentations or a short movie. It takes almost the same time to get fully-charged.

    Medion’s MD96970 is one of those notebooks that offer great specifications for its attractive price. It may not be as flashy as rival notebooks, but relies on the simple fact that it can get the job done.

    This 15.4-incher will hit Aldi stores on September 4, 2008 and will have an RRP of $999. But if a 15-inch notebook is not enough, users can purchase the 17-inch Medion notebook that we have reviewed a couple of months back which costs $1,499. See www.aldi.com.au for more information.

    See page over for product specifications and final rating.

     

    Medion Akoya MD96970 Specifications:

    Processor: Intel Core 2 Duo processor T5750 (2.0Ghz)
    Video Card: Nvidia Geforce 9300M G (128MB)
    RAM: 3GB
    Hard Drive Capacity: 320GB
    Screen: 15.4-inch TFT WXGA (1280 x 800)
    Operating System: Windows Vista Home Premium with Service Pack 1
    Optical Drive: DVD Multi-Recorder
    Ports: 3 x USB, D-Sub out, S-Video out, Ethernet, E-SATA, HDMI, 4-in-1 card reader, ExpressCard, Line-in, Microphone-in, Audio-out
    Other Features: Webcamera, Built-in microphone, Fingerprint reader, dedicated numberic keypad, Touch-sensitive keys

    Included software:
    – Bullguard (Trial)
    – Home Cinema (CyberLink Medi@, PowerDirector, CyberLink YouCam)
    – Microsoft Office (Trial)
    – Microsoft Works
    – Nero 8 Essentials (BackItUp, Burning ROM, ControlCentre, CoverDesigner, Express, MediaHome, Recode, ShowTime, StartSmart, Vision, WaveEditor)
    – Softex OmniPass that can store all your personal data and fill up the username and password box with a swipe.
    – Ulead PhotoImpact12

    Medion Akoya MD96970 | $999 |  | www.aldi.com.au

    For: Piano black finish; Noteworthy specifications; Touch-sensitive keys; Fingerprint reader and encrypting software; Well-spaced keyboard and numeric keypad; Abundance of ports
    Against: Finish is prone to fingerprints; Screen is highly-reflective; Issues with fingerprint reader software
    Conclusion: An affordable notebook for users who want a powerhouse.