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

    Smart Office

    Samsung Launches Widescreen Phone

    Samsung Mobile aims to make mobile TV bigger than ever before with the unveiling of the new Samsung Widescreen mobile phone.


    Click to enlarge
    Samsung claims that its new Widescreen phone features the ‘world’s best mobile display and top-of-the-range sound quality’ for sheer viewing pleasure. The Samsung Widescreen sports a 2.3-inch LCD display that can be opened sideways and dual speakers, giving consumers the ability to watch their favourite programs in stereo sound and maximise their overall viewing pleasure

    The Director of Samsung Mobile, Josh Delgado said, “Every so often we are lucky enough to witness a revolution in mobile phone technology and the Samsung Widescreen is right at the forefront of this revolution. As a leader in mobile phone design and technology, Samsung continues to push boundaries and improve services to bring consumers real benefits. The Samsung Widescreen mobile is just what consumers are looking for in a Mobile TV and entertainment device.”

    With a unique dual flip action, the Samsung Widescreen mobile allows consumers to make standard calls with the traditional flip action. Opening the phone sideways and consumers will have a mini-laptop with a full QWERTY keyboard and broadband speeds of up to 7.2Mbps across 98 percent of Australia’s population. Consumers can also access the new Mobile FOXTEL electronic programming guide (EPG) and surf 33 channels, as well as program their Foxtel iQ set-top box to record their favourite programs, even when they’re away from home.

    “The Samsung Widescreen mobile phone lets consumers maximise their time or simply enjoy a moment of downtime. Internet and Mobile TV have never been more accessible. Consumers can now enjoy Mobile TV with a twist,” added Delgado.

    In addition to the fastest mobile internet and Mobile TV, the Samsung Widescreen offers a range of additional features like a 2-megapixel camera, stereo MP3 player, and Bluetooth capability.

    RRP: $899

    See: www.samsung.com.au/mobile

    Navman Makes GPS Navigation Easier Than Ever

    The latest in-car GPS navigation device from Navman has a large, bright touch-screen display for easy map and menu viewing coupled with great new software, making it one of the best GPS navigation devices today.

    Click to enlarge
    And while there are a lot of portable in-car navigators in the market today, some ‘affordable’ units do not have enough functions and/or features that help users on their journey. Navman’s S90i may be expensive, but it promises a lot of features that makes it a navigator worth purchasing.

    Out of the box, the Navman S90i comes with the following items: the navigation unit, a leather casing, car charger, USB cable, users manual, IR remote control, mounting bracket, and a DVD that contains NavDesk and Global Map Data. It also comes with a traffic receiver, making it ready for the Suna Traffic service in early 2008.

    The power button and the camera button are the only two buttons found on the Navman S90i, which means that users will have to use the touch screen to navigate through the menu. An external antenna jack, microphone jack, and headphone jack can be found on the left spine of the unit, while a lanyard loop can be found on its right spine. The memory card slot is located at the bottom of the unit and is right beside the charging / USB connection port. The unit also comes with a 2 mega pixel camera (for use with NavPix) and built-in speakers for audio / speech output.

     

    Performance:

    We suggest users to read the Quick Start Guide before turning the unit on for the first time to have an idea of how to get started. This is due to the fact that the main menu has a lot of options (My Home, Favourites, Recents, Map, Address, POIs (Point-of-Interests), navPix, Traffic, Fuel, Preferences, Phone, Parking, Food, SOS, Tripmeter, Tourist, and Cash) and can be overwhelming at times, especially for the first-time user.

    Planning your first trip with the S90i is quick and simple. All one has to do is to tap the Address icon, enter the city/area, the street address, the house number, and press the “go” arrow key for the unit to start calculating the route. The unit also has an ‘Intersection’ mode that will lead a user to the intersection of two roads. The unit was able to pick up a GPS signal in less than a minute and was able to provide the fastest route from our SmartHouse office to my house in an instant.

    The screen was bright and various points of interest (POIs) were clearly displayed on the unit. Tapping on any POI allows a user to navigate to that POI, check out its details, view other POIs close to it, avoid that area, add to the trip/itinerary, or set that particular POI as the starting point for the trip. Other visual icons include the next instruction (Right: George St), the direction and distance of the next turn, a next turn arrow, a speed indicator, a status bar, a distance and time information, as well as the main menu button (found on the lower left side of the display), cancel route button, zoom options, and map button (found on the right side of the screen). There is also an expandable icon located on the lower right side of the display that brings up other options like Mute/Unmute, TMC, Bluetooth, Battery indicator, and GPS information.

    Users can also place their home address and save it on the unit’s My Home option, view recent trips, view various points-of-interests (POI), and adjust various settings like route options, volume, screen display, Bluetooth functions, and POI alerts.

     


    Click to enlarge
    The NavDesk software that comes with the S90i
    In addition, users can find the nearest petrol station, parking area, restaurant, tourist spot, emergency buildings like police stations or hospitals, and even the nearest ATM machine by pressing the said icons on the main menu. These options are handy especially for users who are travelling in an unfamiliar place, as the Navman S90i can instantly take you to any key POIs.

    The Navman S90i can also pair with your mobile phone via Bluetooth connection. The Navman S90i was able to synchronise with the phone and automatically imported the contacts. Calling people can be done by either clicking on the list (phonebook) or by manually dialling the number (phone dialler). We were able to talk to the person on the other line without much of a problem, with conversations being loud and clear.

    Finally, the Navman S90i has a clever way of taking you to various places without the need to remember its exact address with its NavPix technology. The camera automatically launches when the camera cover is slid open and any photos taken will automatically be tagged and stored in the Navman. Users can also visit the Navman NavPix website to upload, download, and share images to other owners, increasing your photo database. So the next time you want to go to a tourist spot (like the Sydney Opera House), all one has to do is to click on the NavPix option, select the Sydney Opera house photo, and just press the Go arrow key.

    The Navman S90i gave us a little more than five hours with a single charge, but will last shorter if paired up to a phone and is used for its handsfree function. Charging the unit requires a user to hook up the unit to the computer (via USB) or inside the car (in-vehicle charger), as there is no AC adaptor included in the package.

     

    Conclusion:

    The new Navman S90i is one of the best in-car navigation systems we have seen to date. Its widescreen display makes it easy to view, while its features (POIs, Text-To-Speech, Navpix, Bluetooth, and shortcuts to Petrol, Parking & Emergency Services (SOS)) are accessible with a touch of a button. And with a traffic antenna included in the box for the upcoming Suna traffic service, the Navman S90i is a step ahead of the competition.

    Specifications:

    Hardware
    Weight: 200g
    Size (mm): 79 (H) x 139 (W) x 20 (D)
    Processor: Samsung 2443 / 400 MHz
    Memory: 2GB internal Flash memory 96 MB SDRAM
    Memory Expansion: SD/MMC
    GPS receiver: SiRFstarIII
    Battery: Rechargeable integrated Li-ION battery-up to 5 hrs life (depending on usage)
    Display Size & Type: 4.3″ touch screen
    Display Resolution WxH: 480 x 272 pixels
    Integrated NavPix Camera: 2 Megapixel

    Software features
    Software: SmartST 2008 navigation software
    Pre-installed Speed and red light camera alerts
    Integrated Bluetooth: Hands-free calling
    NavPix: Navigate to pictures
    Navman Desktop Manager: Mileage Reporter, NavPix album
    Over 500,000 POIs (Places of Interest)
    Voice-guided instructions
    Text-to-Speech: Spoken ‘next turn’ road names
    Multiple route options
    Easy to use address searching  

    Navigation views
    Turn-by-Turn
    Route Summary
    3D moving map
    2D map view  

    Mapping
    Sensis Whereis 2007 (R14)

    ————————————
    Navman S90i | $799 |  | www.navman.com.au

    For: The Navman S90i’s widescreen, camera (for NavPix), navigation software, POIs, easily accessible hotkeys, fast route calculation and recalculation, mobile phone hands-free functions, and TMC compatibility is what sets this unit apart from other navigators.
    Against: Users must connect the unit to the PC or charge it inside the car as Navman did not provide an AC adaptor
    Conclusion: One of the best in-car navigation systems we have seen this year.

    Pioneer Keeps Track Of Employee Attendance

    Pioneer Computers has launched a time and attendance recorder that aims to keep track of an employees time records.


    Click to enlarge
    The DreamVision Finger Print Time and Attendance Recorder is an affordable, consistent and user friendly solution to replace traditional card units. With several verification modes including ID + password, ID + fingerprint or fingerprint only, it is reliable and tamper-proof. No more logging in for someone else to avoid being found late for work, or phantom employees who don’t even turn up and claim attendance, the company says.

    The unit is small and smart looking, measures 160 x 130 x 90 mm and is easy to install, maintain and operate. It can also recognize and store up to 512 fingerprints and keeps records of up to 32000.  Its low cost makes it economical for small business and it also has the capacity to cater for larger corporations.

    The DreamVision Finger Print Time and Attendance Recorder will have an RRP of $299 and is available from Pioneer Computers Australia Pty Ltd.

    See: www.pioneer.net.au

    Sony Expands Vaio Line-Up

    Sony Australia is expanding its Vaio line-up by launching the LM and NR series, as well as adding a new colour to its existing CR series.

    Sony Australia’s Senior Product Manager for Vaio, Hiro Ishikawa said, “Sony is proud to introduce these new notebooks to the popular VAIO line-up. The LM series carries the hallmarks of the innovation and style Sony is known for. The VAIO NR series is a functional and easy to use home notebook, and the Premium Gold notebook is sure to lead the next fashion trend!”

    Sony Australia’s Senior Product Manager for Vaio, Hiro Ishikawa said, “Sony is proud to introduce these new notebooks to the popular VAIO line-up. The LM series carries the hallmarks of the innovation and style Sony is known for. The VAIO NR series is a functional and easy to use home notebook, and the Premium Gold notebook is sure to lead the next fashion trend!”

    Vaio LM series

    Sony has now turned the home PC into an elegantly designed entertainment centre with the Vaio LM series notebook. This new notebook features a style reminiscent of Sony’s Bravia LCD TVs, with the Vaio LM sporting a 19-inch screen that is framed by a transparent bezel to blend into the surrounding environment. For ultimate integration, the Vaio LM series can be wall-mounted and features wireless keyboard, mouse and remote control, Sony says.

    The Vaio LM series is designed to be a stylish entertainment hub that doubles as a TV, with an in-built TV tuner, high quality speakers, and sound output with a built-in subwoofer. The LM also comes with a 1.3 Mega Pixel that can be used for video conference calls where the whole family can join in.

     

    Vaio NR series

    According to Sony, it has retained the popular features of the Vaio N series and added a number of style and specification upgrades to create a notebook with neat, compact design, easy-to-use layout and simple functionality.

    The Vaio NR series is perfect for students or frequent home users with a 15.4-inch LCD screen, full-pitched keyboard and high performance Core 2 Duo processor. However, this notebook is also designed for fun, with new AV Mode buttons for quick access to entertainment programs and original VAIO software – VAIO Movie Story and VAIO Music Box, the company says.

    VAIO CR series
    With metallic accessories a hot item this summer, Sony has decided to add a Premium Gold notebook to the colourful Vaio CR series. With the VAIO CR series, you can express yourself with a colour that matches your unique personal style:

    Premium Gold – the latest hot metallic to join the CR series
    Blazing Red – with black interior, designed for those who want people to look twice
    Indigo Blue – bang on trend, this notebook comes in one of the hottest runway colours this season
    Pure White – offering a modern take on the classic look
    Luxury Pink – mixed three pink shades to give a soft luminous glow
    Aroma Black – a sophisticated take on this style-led model

    Pricing and Availability:
    The Sony Vaio LM (VGC-LM18G), Vaio NR (VGN-NR17G), and Vaio CR Premium Gold (VGN-CR25G) series will all be available starting mid-November 2007 and will have an RRP of $3,499, $1,599, and $1,899 respectively.

    See: www.sony.com.au

    Back Up Your Digital Life With OneTouch From Maxtor

    With the advent of digital camera, camcorders and music, data back up has become even more important. The new Maxtor OneTouch external storage device will help you back up your digital life, and let small businesses do a bit more besides.

    Maxtor’s OneTouch 4 Plus brings more than just back up storage to the table – it also has other programs like encryption, synchronisation, and a system recovery function to make it an all-round storage device.


    Click to enlarge
    As we save our photos, videos, documents and other files unto our hard disk drives, we are at the risk of losing them all should our hard drive fail. Luckily for us, there are a lot of companies out there that offer external hard drives with backup softwares to store and safeguard files. Maxtor’s OneTouch 4 Plus is one of those external drives that can store music, photos, videos, and games and comes with a OneTouch button that backs up important data.

    The OneTouch 4 Plus comes with a USB and FireWire cable, an AC power adaptor, and the OneTouch Plus device. The device is lightweight because of its hard plastic construction, while its black and aluminium finish gives it a ‘tough’ look. The OneTouch button is cleverly placed at the front of the unit and emits a light as soon as it is plugged, letting users know that the unit is functional.

     

    Performance:

    Hooking up the OneTouch to the PC for the first time will install the Maxtor Manager software, an application that has various programs like My Drives, Backup, Sync, and SafetyDrill (for Windows only) to maximise the OneTouch 4 Plus.

    Under My Drives, one may be able to customise the OneTouch button to back up (which is the default), Synchronise, or open any executable program in the PC. Power settings can also be adjusted, putting the OneTouch drive into power-saving mode after being inactive for a set number of minutes. There is also a function called Test My Drive that does a quick test to make sure that the device is working properly, as well as a Check for Software Update function that checks for new versions of the Maxtor Software.


    Click to enlarge
    The OneTouch 4 Plus OneTouch button
    By default, pressing the OneTouch button will launch the Backup software that does a simple backup for the “My Documents” folder at a set time. In addition, advanced options like manually setting the folders (e.g. Backing up the “My Documents” folder, a music folder located in the main drive, as well as other folders from a slave drive), file extensions, and the day and exact time when the unit will do a backup is also available, giving users with a lot of customisation options.

    The OneTouch can also keep the latest files in sync between two computers with its Sync function. The Simple Sync automatically syncs the “My Documents” folder, while the Custom Sync provides the option to select different folders that will be synchronised. After synchronising your folders from the first computer, the only thing a user has to do is to connect the OneTouch to the other computer to complete the synchronisation.

    The Maxtor OneTouch 4 Plus also has a DrivePass function that protects your drive with the help of a password, as well as an encrypted folder to protect your office files and documents from unauthorised access. Passwords are required for both functions so users must always remember their passwords to avoid data loss.

     


    Click to enlarge
    Maxtor Manager’s SafetyDrill Program
    What’s great about the OneTouch 4 Plus is its SafetyDrill program: a function that mirrors your hard drive to the OneTouch, allowing anyone to restore the whole system in an event of a system crash. By creating a SafetyDrill copy, users only have to boot up the Maxtor SafetyDrill Recovery CD (with the Maxtor OneTouch connected), select the SafetyDrill copy that will be restored, and click the Restore button. Do take note that the SafetyDrill function only works with Windows and is not compatible with the Mac OS.

    Conclusion:

    If you need a simple backup and storage solution for your home or small business, then the Maxtor OneTouch 4 Plus is definitely a product worth looking at. It has an easy-to-use backup and sync software, has an encryption and password functions that will protect your confidential files, and can fully restore your system with ease thanks to its SafetyDrill feature.

    Product Specifications:

    Requirements:

    PC
    – Pentium III, 500Mhz equivalent processor or higher
    – Microsoft Windows Vista or XP
    – 256MB RAM or more
    – Internet connection for software updates
    – CD ROM drive from SafetyDrill Disc

    Mac
    – Max OS X 10.4.7-10.4.9
    – 256MB RAM or more
    – Internet connection for software updates

    Performance Specs:
    – USB 2.0 and FireWire 400/1394a compliant
    – Spindle speed 7200 RPM
    – AES 256-bit software encryption

    Package Contents:
    – External hard drive with pre-loaded installation software
    – Quick start guide
    – Power adaptor
    – USB 2.0 cable
    – FireWire 400/1394a cable
    – Maxtor SafetyDrill Recovery CD

    Product Dimensions: 63.5 x 152.4 x 171.45mm
    Weight: 1.11 kg

    ————————————
    Maxtor OneTouch 4 Plus (750GB) | $449 |  | www.maxtorsolutions.com

    For: USB and FireWire connectivity; Ease of use; Sync, Backup, Encyption, and SafetyDrill functions; Warranty
    Against: No Ethernet connection
    Conclusion: A simple to use product but is packed with features to keep all your files safe.

    Vista-Supported Projectors From NEC

    NEC’s new LCD projectors (NP1150, NP2150, and MP3150) not only has a Reon-VX video processor, picture-in-picture functionality, and support for wired and wireless LAN, the company also claims that it is compatible with Windows Vista’s “Windows Network Projector” function.


    Click to enlarge
    NEC’s National Sales Manager of Visual Display, Steven Macdonald said, “NEC invests heavily in research and development pioneering new display technologies based upon the requests and needs of our customers.  We offer our customers simply the best innovation, providing projection systems that deliver additional features guaranteeing optimal image quality. We pride ourselves on being able to predict our customers’ needs and bring products to market early leading the way in projector technologies.  Many of our university customers are now expressing interest in Vista compliant projectors and we are happy to offer the NP1150, NP2150 and NP3150 ready as of today.”

    According to NEC, the new projectors are powered by the Reon VX Video processor, which uses Silicon Optix’s Hollywood Quality Video (HQV) technology. The chip uses full 10-bit signal processing, per-pixel motion-adaptive algorithms and a multidirectional diagonal filter that ensures the sharpest and most detailed images possible, the company says.

    The new projectors also support Windows Vista’s “Windows Network Projector” function, allowing a user to run presentations via any network-connected Windows Vista PC by connecting the projector into a wired LAN. Additionally, users can plug a USB mouse and keyboard into the projector and remotely operate any networked PC through the projector using the Windows Remote Desktop function.
     
    The new NP projectors also have a manual lens shift mechanism that allows an image to be projected both vertically and horizontally. NEC also says that the projectors will have five types of optional lenses (in addition to the standard lens) to accommodate a variety of environments, including conference rooms, halls and exhibitions.

    Pricing and Availability

    The NEC NP1150, NP2150 and NP3150 projectors are now available and will have an RRP of $5299, $6699, and $7799 respectively.

    See: www.nec.com.au

    Nokia E51 Launches On Telstra Network

    Nokia has announced that its E51, a mobile phone for the business-oriented user, will be available on Telstra’s Next G Network starting this month.


    Click to enlarge
    The E51 will have features like ‘one touch’ keys for easy access to contacts, calendar and messages, includes an FM Radio tuner, music and multimedia players, and comes with a 2 mega pixel camera. Users can also watch various programs from channels like CNN and Sky News on the go as Telstra has included its Foxtel Mobile service on the E51. In addition, the E51 will also have a ‘dual-mode’ handset function that claims to deliver desk phone calling features such as extension dialling, hold, transfer and conferencing, all on a mobile device, the company says.

    Nokia’s General Manager for Australia and New Zealand, Shaun Colligan said, “This is our third Nokia handset on the Telstra Next G network in recent months. Together with Nokia 6120 and the Next G Nokia N95, the Nokia E51 offers a range of choice for consumers looking for the Nokia that suits them on the Next G network.”

    Other features of the Nokia N51 include:

    • A home screen including user-selected icons to the most used applications
    • One Touch keys with one-click access to key functionalities including email, contacts, calendar and the home screen
    • Set-up wizard offering step-by-step guidance for setting up email accounts.
    • Integration with a wide range of business email solutions, including Nokia Intellisync Wireless, Blackberry Connect as well as Mail for Exchange to communicate with Microsoft Exchange Server, and consumer email
    • Streamlined email reading experience with easy access to attachments
    • Dedicated Email key on the front cover, indicator light for new email, and a preview window to the latest email on the home screen to help keep up with email when on the move

    RRP: $679

    See: www.nokia.com.au

    Lexmark Wireless All-In-One Printer Put To The Test

    All-in-one printers can do everything from printing documents to scanning, faxing, copying, and even printing photos from memory cards. We see whether the new Lexmark all-in-one printer with WiFi will be a worthy addition to your small office or home office.

    Instead of purchasing a fax machine, a scanner, and a printer separately, businesses often purchase an all-in-one printer to save money. Companies like Lexmark have been providing consumers with affordable all-in-one printers that can print a lot of pages per minute and provide various ‘services’ that give users an edge. Lexmark’s X6570 is an all-in-one printer that not only provides a complete office solution for users, but also has a wireless printing function for easy printer sharing inside the home or office.


    Click to enlarge
    The X6570’s main control panel
    The Lexmark X6570 is a white and grey printer that sports a small profile. The main control panel with a 2-line display is located up front, hosting various keys like 2-sided printing, menu, power, copy mode, scan mode, fax mode, photo card mode, and a number keypad for fax functions. Users can also find an SD/MMC/xD/MS memory card slot, a CF card slot, and a USB port (for Pictbridge) on the right side of the unit, allowing users to print photos without turning on the computer. Users can find the duplex cover (for printing on both sides of the paper), USB port, power supply with port, line-in and extension out telephone jack (for fax functions), and a Wi-Fi adaptor at the back of the unit.

    The printer has a lot of functions that make it a good addition to any home office. It can print photos and files, scan images, fax important papers, copy documents, and can even print back-to-back with its 2-sided mode. It can also connect wirelessly to a network for wireless printing, allowing users to print anywhere in the home.

     


    Click to enlarge
    Performance:

    After taking all the contents out of the box, getting the printer to work is as simple as following instructions. It took us less than 10 minutes to put the ink cartridges in, connect the phone jacks, install the software, and make the printer run via USB connection. Users can also opt to connect the printer to the wireless network, allowing anyone with a Wi-Fi connection to print their documents anywhere in the network’s vicinity. The setup for this is simple as well, with users only having to connect the printer to the computer in order for it to automatically locate and connect to the network. A Wi-Fi indicator light in front of the printer will show users if the printer is connected to the network (green), if it is not connected to the wireless network (orange), or if there is no wireless card present (no colour).

    At default settings, we were able to print 10 text-filled pages in a minute, although we were able to reach the claimed print output of 28 pages per minute when adjusted to quick print mode. We were also able to print a coloured 4 x 6-inch photo in 1.5 minutes, while an A4-sized photo took about 4 minutes to finish.

    While the text printouts were clear, we could not say the same for its photo printouts. Photos were not as sharp as we expected it to be, with colours being dull and dark. The only way to go around this is to purchase a separate photo cartridge when printing photos as it significantly improves the quality of prints. When using the Photo Card function (where you put your memory card, CF card, or PictBridge-enabled phones), users will have to print a proof sheet first to see the photos stored in the card. From there, one can choose to print all the photos, the last 20 photos, photos from a date range, or a specific photo.

    The scanning, fax, and copy functions of the X6570 were easy to use as the instructions were all displayed on the X6570’s screen. We have also found the 2-sided print button to be handy when printing documents as it automatically prints on both sides of the paper. This gives the printer a ‘greener’ approach, saving paper and the environment as well.

     


    Click to enlarge
    Lexmark’s Productivity Studio
    Lexmark has also included a Productivity Studio that includes functions like scan photos, copy photos or documents, send a fax, scan and e-mail a document, and create a poster or greeting cards. Users can also setup and diagnose the printer from this software and also setup and manage faxes. Other document management programs such as converting documents to PDF and converting documents to text for editing are also available, making it a program worth using most of the time.

    Finally, the installation software comes with a Lexmark toolbar for Internet Explorer (a Firefox version is also available and can be downloaded at the Lexmark website) that allows a user to print a web page normally, in black and white, plain text (with pictures removed), or print the photos found on the webpage.

    Conclusion:

    Considering its RRP of $299, the Lexmark X6570 is an all-in-one printer worth recommending for its ability to print, scan, fax, copy, wirelessly connectivity, as well as its two-sided printing functions, productivity software, and Internet Explorer toolbar. Just remember to purchase a Lexmark Photo cartridge ($42.99) when you are planning to print photos to get the most out of this printer and you will be just fine.

    Product Specifications:

    Print Technology Thermal Inkjet
    Color Technology 4 Color Inkjet – Cyan, Magenta, Yellow, Black
    Optional 6-Color Photo Printing

    Function:
    Color Copying
    Color Printing
    Color Scanning
    Faxing

    Maximum Print Speed (Draft, Black): Up to 28 ppm
    Maximum Print Speed (Draft, Color): Up to 24 ppm
    Maximum Print Speed (Normal, Black): Up to 10 ppm
    Maximum Print Speed (Normal, Color): Up to 4 ppm
    Maximum Copy Speed (Draft, Black): Up to 24 cpm
    Maximum Copy Speed (Draft, Color): Up to 23 cpm
    Print Resolution, Black Up to 1200 x 1200 dpi
    Print Resolution, Color Up to 4800 x 1200 dpi
    Scan Resolution, Enhanced Up to 19,200 dpi
    Scan Resolution, Optical 600 x 1200 dpi

    Operating Systems Supported

    Microsoft Windows XP
    Microsoft Windows XP Professional x64
    Microsoft Windows Vista
    Apple Mac OS X (10.4.4-10.4.x Intel)
    Apple Mac OS X (10.3.x-10.4.x Power PC)
    Microsoft Windows 2000 5.00.2195 or later
    Microsoft Windows Vista x64

    Standard Ports

    USB 2.0 Specification Hi-Speed Certified
    PictBridge Certified Port
    USB pass-through via PictBridge port
    802.11g/b Wireless

    PictBridge Certified USB Port

    Digital Media Memory Card Compatibility

    CompactFlash I & II
    Sony Memory Stick, Memory Stick PRO
    Secure Digital (SD) Card
    MultiMediaCard (MMC)
    Microdrive
    xD Card
    Sony Memory Stick Duo (with adapter)
    Mini Secure Digital (Mini SD) Card (with adapter)
    Sony Memory Stick PRO Duo (with adapter)
    SanDisk TransFlash Memory Module (with adapter)
    RS-MMC (with adapter)
    xD Card Type M, Type H
    MultiMediaCard (MMC) Mobile (with adapter)
    Micro Secure Digital (Micro SD) Card (with adapter)

    Size (H x W x D): 202 x 454 x 350 mm

    Weight (kg): 8.0 kg

    Product Warranty: One Year Replacement

    ————————————
    Lexmark X6570 Wireless All-In-One | $299 |  | www.lexmark.com

    For: Multi-functionality; Easy set-up; Wireless printing function; Can be used without turning on the PC; Memory card ports and PictBridge; Price of printer; Price and variety of ink cartridges
    Against: To have better quality photo prints, users must purchase Lexmark’s Photo cartridge which costs $42.99.
    Conclusion: The Lexmark X6570 is a printer that can handle most home/office tasks without the need for wires.