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; } } Rob Gillam, Author at Smart Office https://smartoffice.com.au/author/rob-gillam/ Tue, 04 Jul 2017 10:00:00 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 Sony Camcorder Hits 1080i High Def https://smartoffice.com.au/sony-camcorder-hits-1080i-high-def/ https://smartoffice.com.au/sony-camcorder-hits-1080i-high-def/#respond Tue, 04 Jul 2017 10:00:00 +0000 http://smartoffice.com.au/sony-camcorder-hits-1080i-high-def/ Sony's tags its latest 1080i camcorder, the HC3, as the world's smallest and lightest.

    The post Sony Camcorder Hits 1080i High Def appeared first on Smart Office.

    ]]>
    Sony’s tags its latest 1080i camcorder, the HC3, as the world’s smallest and lightest.

    Weighing 500 grams, ($2299) fits comfortably in the palm and captures in high definition or, should you want it, standard DV format. It also doubles as a 4.0 megapixel still camera.

    “Sony is furthering the acceptance of high definition as the superior format for video capture, as
    well as for playback and display. It is a significant growth area for camcorders and TVs alike, as
    consumers increasingly appreciate the benefits of exceptional image and sound reproduction,” said Sony’s Di Shepherd.

    Sporting a 2.7 inch touch-controllable LCD that Sony says is easily viewable in virtually any environment or angle, the HC3 provides single-button access to its basic recording and operation settings.

    Movies recorded in HDV can of course be viewed directly on a HD compatible TV and a down-conversion function automatically converts HD movies for standard definition playback.

    See www.sony.com.au

    The HC3 captures high-definition video and a small, smart package.

    The post Sony Camcorder Hits 1080i High Def appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/sony-camcorder-hits-1080i-high-def/feed/ 0
    Western Digital Throws The Book At Storage https://smartoffice.com.au/western-digital-throws-the-book-at-storage/ https://smartoffice.com.au/western-digital-throws-the-book-at-storage/#respond Tue, 04 Jul 2017 07:00:00 +0000 http://smartoffice.com.au/western-digital-throws-the-book-at-storage/ Western Digital has launched a new line of external hard drive storage systems called My Book. Designed to be as easy to use as common household appliances, the My Book Essential Edition is available in capacities from 250 GB ($299) to 500 GB ($559).

    The post Western Digital Throws The Book At Storage appeared first on Smart Office.

    ]]>
    Western Digital has launched a new line of external hard drive storage systems called My Book. Designed to be as easy to use as common household appliances, the My Book Essential Edition is available in capacities from 250 GB ($299) to 500 GB ($559).

    My Book’s book-shaped enclosure stands vertically, leaving a small footprint and sits naturally in a living room, study or on a book shelve. It features vents around the book’s ‘page ends’, keeping the hard drive inside cool for long-term reliability. Western Digital says the My Book experience begins when owners plug it into their computer (via USB 2.0). It self-starts, requiring no CDs to insert or separate software to install. Photos, music, video and other content is managed from included software and the My Book powers down and restarts with the PC it’s linked to.

    “The My Book family is the next generation in external storage,” said Western Digital’s Jim Welsh. “Consumers of digital media today are a much broader set of the population than in the past, and they want external storage that is easy to use and has an appealing design.”

    The My Book is sold at Officeworks.

    See www.wdexternal.com.au


    The post Western Digital Throws The Book At Storage appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/western-digital-throws-the-book-at-storage/feed/ 0
    NVIDA Quadro FX Graphics Cards For Imaging Pros https://smartoffice.com.au/nvida-quadro-fx-graphics-cards-for-imaging-pros/ https://smartoffice.com.au/nvida-quadro-fx-graphics-cards-for-imaging-pros/#respond Tue, 04 Jul 2017 07:00:00 +0000 http://smartoffice.com.au/nvida-quadro-fx-graphics-cards-for-imaging-pros/ NVIDIA has released its next-generation graphics solutions for imaging professionals, the Quadro FX graphics cards.

    The post NVIDA Quadro FX Graphics Cards For Imaging Pros appeared first on Smart Office.

    ]]>
    NVIDIA has released its next-generation graphics solutions for imaging professionals, the Quadro FX graphics cards.

    NVIDIA says its Quadro FX graphics solutions offer customers next-generation architecture, High-Precision Dynamic Range (HDPR) technology and refined vertex and pixel programmability for advanced graphics. They are now being integrated into many of the newest mobile and desktop workstations from companies such as Hewlett-Packard.

    “Industry-leading NVIDIA Quadro FX graphics are being adopted across a variety of workstation configurations, providing customers with the power, flexibility, and features they need to get the job done,” said NVIDIA’s Dan Vivoli. “Companies, such as HP, with proven track records of delivering high-performance mobile and desktop workstations, continue to redefine performance for customers by offering the latest NVIDIA Quadro FX solutions for professional graphics.”

    The Quadro FX range:

    NVIDIA Quadro FX 4500 – Delivers up to 33.6GB/sec. memory bandwidth, 512MB GDDR2 frame buffer memory, 256-bit memory interface and support for 2 ultra-high resolution (3840 x 2400) digital panels

    NVIDIA Quadro FX 3500 – Offers a new level of graphics performance and is fast becoming a standard high-end configuration for major OEMs and enterprise customers worldwide

    NVIDIA Quadro FX 1500 – The first mid-range solution to offer high-performance coupled with two dual-link DVI connectors, 256MB GDDR3 frame buffer memory and HD video output

    NVIDIA Quadro FX 560 – Introduces dual-link DVI, fast DDR3 128MB graphics memory and HD video output

    See www.nvidia.com/quadro


    Click to enlarge


     

    The post NVIDA Quadro FX Graphics Cards For Imaging Pros appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/nvida-quadro-fx-graphics-cards-for-imaging-pros/feed/ 0
    EC-Asia Lands Down Under https://smartoffice.com.au/ec-asia-lands-down-under/ https://smartoffice.com.au/ec-asia-lands-down-under/#respond Tue, 04 Jul 2017 05:45:52 +0000 http://smartoffice.com.au/ec-asia-lands-down-under/ Memory product manufacturer and distributor, EC-Asia, has opened a Sydney office, from which it will enter the market with its ACEplus-branded DRAM and flash memory products (from July 2006).

    The post EC-Asia Lands Down Under appeared first on Smart Office.

    ]]>
    Memory product manufacturer and distributor, EC-Asia, has opened a Sydney office, from which it will enter the market with its ACEplus-branded DRAM and flash memory products (from July 2006).

    Products include DDR/DDR2 DIMM/SODIMM, SD and MMC series memory.

    Founded in 1993, EC-Asia International Limited (ASX:ECI) has grown from being a distributor of computer components to a leading manufacturer of memory products with comprehensive testing capabilities. The strong growth in demand for memory products such as expandable memory cards and DDR2 memory modules for PCs and desktops in Asia Pacific has prompted EC-Asia to extend its range of ACEplus products to Australia.

    EC-Asia will partner with its authorised distributor AsiaPac Distribution to extend the distribution reach to Australia. It is also looking to expand its distribution network in Australia via local channel partners.

    Commenting on the foray into the Australian market, Kelvin Ang, CEO and Managing Director of EC-Asia International said, “We are confident in meeting the needs of consumers in Australia given our strong design and manufacturing capabilities. The range of memory products on offer will be comprehensive and value-for-money without compromising on quality. We will also seek to educate consumers in Australia on selecting the right type of memory products for them to optimise the usage of their digital devices such as digital cameras, mobile phones and digital music players.”

    EC-Asia’s Australian offices are located at:

    North Sydney, NSW, telephone +61 2 9928 6088

    Hobart, Tasmania, telephone +61 3 6234 1823

    See www.ecasiasg.com

     

    The post EC-Asia Lands Down Under appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/ec-asia-lands-down-under/feed/ 0
    HP Printers Most ‘Fuel Efficient’ https://smartoffice.com.au/hp-printers-most-fuel-efficient/ https://smartoffice.com.au/hp-printers-most-fuel-efficient/#respond Tue, 04 Jul 2017 05:45:52 +0000 http://smartoffice.com.au/hp-printers-most-fuel-efficient/ Hewlett-Packard has made a big call in claiming its most recent printers produce up to twice as many prints from the same amount of ink as competitive brands.

    The post HP Printers Most ‘Fuel Efficient’ appeared first on Smart Office.

    ]]>
    Hewlett-Packard has made a big call in claiming its most recent printers produce up to twice as many prints from the same amount of ink as competitive brands.

    It founds the claim on research conducted by independent third party, SpencerLab Digital Colour Laboratory – the rigorous and thorough testing procedures of which were explained by David Spencer to the media today.

    Hewlett-Packard’s John Solomon said “It’s not often our company takes on a controversial topic because you get targeted when you come out and talk about such things, but we believe we have a very good story to tell. We believe that consumers need to better understand printing costs and we take this very seriously.

    “The cost of printing needs to be based on real-life situations and determining costs includes the price of cartridges, but isn’t limited to that cost. Customers need to be aware of variables. We would like our customers to examine page yield and consider reliability and efficiency. We have a responsibility to our consumer to enable them to make an informed buying decision and wish to provide them the tools to do so.”

    Hewlett-Packard’s Christoph Schell said “We should always ask ourselves what the running cost of a printer is. It is not the sum of the purchasing price of the printer, ink and paper, but the printing efficiency.

    Much like the car industry, printer brands use different technologies. We are here to present to you the most efficient printing system on the market.”

    HP says its latest printers achieve printing efficiency by flushing air from the print head and recirculating this ink back into the system for printing use. It says its wiper blade technology helps clean print nozzles without the need for flushing the print head with ink.

    HP said most ink cartridges waste up to around 50 percent of their ink capacity on cleaning, servicing and changing – whereas its new range of systems in comparison wastes around 25 percent. “What many consumers do not know is that all inkjet printers are designed to periodically clean and maintain themselves,” it said. “This is to ensure consistent print quality and reliability. SpencerLab research has proven that other printing vendors use larger amounts of ink to flush (clean) the system, which wastes valuable ink that could be used for printing.

    “The research found that customers, when printing intermittently on HP printing solutions, had the highest average printing efficiency, giving end-users up to twice as many prints from the same amount of ink as competitive brands.”

    “HP printing technology was the most efficient we tested,” said SpencerLab’s David Spencer.

    See www.hp.com.au


    Click to enlarge

    The post HP Printers Most ‘Fuel Efficient’ appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/hp-printers-most-fuel-efficient/feed/ 0
    Philips Launches New AV Range https://smartoffice.com.au/philips-launches-new-av-range/ https://smartoffice.com.au/philips-launches-new-av-range/#respond Tue, 04 Jul 2017 05:45:52 +0000 http://smartoffice.com.au/philips-launches-new-av-range/ Philips today launched its range of new LCDs, plasmas, audio systems and hard disk video recorders.

    The post Philips Launches New AV Range appeared first on Smart Office.

    ]]>
    Philips today launched its range of new LCDs, plasmas, audio systems and hard disk video recorders.

    At the forefront of its product range presentation were its latest LCD TVs, which sport up to four Ambilight surrounds and its impressive ClearLCD and Pixel Plus 3HD image processing technology.

    Comparisons with the latest similar-sized LCD models from competitors were performed and the Philips sets displayed noticeably reduced juddering in panning scenes than the competitor products. Also noticeably better rendered were skin tones.

    Ambilight is claimed to reduce eyestrain (by reducing sudden changes from darkness to intense light) and provide a more immersive viewing experience. The backlighting around the display frame automatically adjusts in real time to generally match the colours being displayed on the screen. There’s no doubt the demonstration of the LCD Ambilight sets was ‘immersive’ (probably also thanks to some seriously beefy sound reproduction) and picture quality was excellent, but a lot more time would be needed to decide conclusively whether it lives up to Philips’ claims about it. Certainly, it’s by no means distracting but likewise this writer barely noticed when it had been briefly turned off to demonstrate life without it.

    More convincing was the demonstration of the ClearLCD and Pixel Plus 3HD image processing technology, which provides a realistic, smooth and, yes, clear image when employed – especially in standard definition. Philips says the technologies were specifically designed to overcome LCD’s traditional weaknesses: motion artifacts and low contrast.

    Matt Moran, Marketing and Sales Manager, said “We see LCD as the dominant technology over plasma. Its strengths are light output, resolution and power efficiency. Its weakness, though, is light leakage through the panel due to it being back-lit, which doesn’t give you blacks that are quite as black as you could want – such as provided by plasma. Motion is also an issue. The liquid crystals in LCDs are getting faster, but they’re still not quick enough to be beat the human eye. With ClearLCD we basically eliminated those weaknesses and take LCD up to the same quality levels as CRT and plasma in these areas, which maximising its present strengths.

    “Clear LCD works on three different technologies. The first is dimming backlight, which detects light and dark areas on the screen and communicates accordingly with the backlight.

    The second addresses motion blur. LCDs move when there’s a voltage put through them. Our Overdrive technology basically puts extra voltage into each crystal to give it a good kick and make it move faster, resulting in smoother reproduction and less blur.

    The other technology is scanning backlight, which is probably the most fundamental Clear LCD technology. The scanning backlight provides a backlight that is flickering at 75 times per second. Anything over 60 hertz is too fast for the human eye to see. The flickering provides 75 frames per second with nice, crisp breaks in between, instead of one frame that is gradually changing. You have one frame, the voltage to the crystals goes off, the crystals move, then the backlight comes on. This greatly reduces the blurring effect. Also, we use hot carbon fluorocarbons, which provide 300 percent more light output than the traditionally used cold carbon fluorocarbons.”

    Philips claimed its competitors sets were, along with its sets, set to factory defaults for the comparison. In the comparison, skin tones were overblown in the competitors’ sets, and detail was in some instances lacking. When the image processing was employed in high-definition, the non-Philips sets definitely caught up.

    Most drastic of all was the stabilising effect of ClearLCD and Pixel Plus 3HD during video panning sequences. The Philips sets were obviously more realistic and stable than the competitor sets displaying the same video images.

    Whether a completely level playing field was employed, only Philips will really know but we expect the comparison was mostly fair. We were impressed enough to recommend considering in purchasing decisions but, as always, suggest you judge with your eyes.

    The features are limited to the 37 inch 37PF9731 ($TBC) and 42 inch 42PF9831 ($6900), which features full Ambilight surround and is available from July 2006.

    In his address, Philips CEO, Harry van Dyk, said “We think our new range for 2006 will make a qualitative impact which will separate us from other brands. Last year, prices in the LCD market dropped about 40 percent. In such a market, Philips had two choices: either to murder its cost base and operate on a very lean business model, or differentiate.

    Our conclusion was that Philips is a differentiated product/brand company and that is reflected in our latest innovations. If you can find a better television in the world than our ClearLCD products, you better tell me what it is.”

    “Differentiation is defiantly the way Philips wants to go,” added Matt Moran. “Prices are getting crazy but what we want to do is add value to the offer by giving consumers a real reason to spend money on our electronic products beyond the same old picture and sound stuff announced when someone launches a TV. As well as providing the best picture and sound, Philips is taking the whole package to market by enhancing the entire viewing experience and improving the viewer’s atmosphere.”

    See www.philips.com.au


    Click to enlarge
    The 42 inch 42PF9831 ($6900), features ClearLCD and Pixel Plus 3HD processing, full Ambilight surround and is available from July 2006.

     

    The post Philips Launches New AV Range appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/philips-launches-new-av-range/feed/ 0
    Reality 46 Inch LCD for $4000 https://smartoffice.com.au/reality-46-inch-lcd-for-4000/ https://smartoffice.com.au/reality-46-inch-lcd-for-4000/#respond Tue, 04 Jul 2017 05:44:34 +0000 http://smartoffice.com.au/reality-46-inch-lcd-for-4000/ Reality has added an even larger LCD to its range, a 46 inch (117 cm) it's selling for $4000.

    The post Reality 46 Inch LCD for $4000 appeared first on Smart Office.

    ]]>
    Reality has added an even larger LCD to its range, a 46 inch (117 cm) it’s selling for $4000.

    Reality’s Andrew Wymer said the 46 incher features Samsung’s current seventh-generation A-Grade panel. “The panels we use are the latest generation Samsung panels. The same ones they use. Samsung Korea doesn’t hold back its latest generation panels for itself,” he said.

    Displaying a DVD source being up-scaled to 1080i, the 46 inch LCD was demonstrated to SmartHouse in full daylight and with strong overhead fluorescent lighting. We must say, the unit is impressive. It had strong, yet balanced colour and excellent brightness. Depth-of-field and detail was fantastic.

    The size of the set is impressive, but not imposing. Does Reality find there is any corresponding drop off in quality compared with the 40 inch model? “No. Quality hasn’t diminished compared with the 40 inch. It’s easy to see that the 46 inch is a great screen, even when viewing non-high-def’ material. We’re really happy with its quality.

    Native resolution is 1366 x 768, which Reality says is “True 16:9 aspect ratio”. Other specs include a claimed 1000:1 contrast ratio and 500 cd/m2 dynamic contrast ratio. Pixel response time is a claimed 8 milliseconds.

    So what’s next in the wings for Reality? Can they move even further into the larger screen sizes traditionally dominated by plasma? “Well, we’re looking at a 55 inch model, but we haven’t had a sample to test yet,” says Wymer. “We’re hoping that will happen in July. We’re not able to confirm a price at this stage but we hope to be able to sell it for $5000.” And will is sport any new features over the current range? “Yes, they next 40 and 46 inch models will feature an automatic brightness function. Ostensibly, a light sensor at the front of the screen will detect the ambient light in the room and automatically adjust the brightness of the screen to suit, which is also great for power saving.”

    See www.reality.net.au



     

    The post Reality 46 Inch LCD for $4000 appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/reality-46-inch-lcd-for-4000/feed/ 0
    Seagate Rolls Out New HDD Range https://smartoffice.com.au/seagate-rolls-out-new-hdd-range/ https://smartoffice.com.au/seagate-rolls-out-new-hdd-range/#respond Tue, 04 Jul 2017 05:44:34 +0000 http://smartoffice.com.au/seagate-rolls-out-new-hdd-range/ Seagate announced several new HDD products today that it expects will drive its revenue growth to $10 billion this year.

    The post Seagate Rolls Out New HDD Range appeared first on Smart Office.

    ]]>
    Seagate announced several new HDD products today that it expects will drive its revenue growth to $10 billion this year.

    Amongst the products announced were:

    · A 60 GB 1.8 inch perpendicular drive for handheld devices
    · A 2.5 inch notebook hybrid drive that combines rotating disc and flash memory
    · 3.5 inch HDDs up to 750GB which are optimised for personal video recorders (PVRs)
    · An enterprise drive, Savvio, with low power requirements
    · The next-generation Mirra Server that syncs data between PC and Mac platforms
    · An 8 GB pocket drive
     
    Seagate’s Managing Director of Channel Sales and Marketing, Kevin Lee, said at the launch:

    “The world is moving to digital and the main driver of this is the availability of high-capacity rotating storage, combined with the availability of affordable, fast, processing and ubiquitous broadband and wireless connectivity.

    The World is now really connected. Users of electronics, mobile and desktop computing are no longer now just users of digital information, but creators of digital information. The capacity required for recording movies, TV, and digital video footage, will increase tremendously. For example, over 200 billion digital photos will be taken this year alone.

    Not only enterprise content, but personally created content will proliferate. Moving forward, we will have video blogs, video created by billions of people worldwide. This content needs to be shaped, edited and stored. The translation is storage demand.

    Seagate is positioned to take advantage of this phenomenon. Seagate is growing units and revenue in all markets. Our numbers from IDC in the DVR/STB segment, for example, show that Seagate sold 9.9 million units in 2003, 40 million in 2006 and by 2009 we expect to sell 68 million in that category alone. Our new products will help catapult Seagate into a leading market position. I’m very excited. These products are truly breakthrough.”

    An example of its new products is the DB35 series, which has been designed to meet the demands of PVR devices in terms of its high (up to 750 GB) capacity, power consumption and operating volume. “This product will be very important to us, due to the increased uptake of high-definition content in the home,” said Mr Lee. “Our DB35 Series products allow up to 750 hours of standard definition TV recording or 125 hours of high-definition video.

    “For PVRs, the continual streaming of data is more important than for, say, security-oriented products. Other considerations and advantages of the range for PVR applications include power consumption. In a PC you have a lot of power and pooling devices, but in PVRs, a drive is in a very small enclosure, therefore you need lower power consumption and lower start-up current.  Also, in terms of noise, PVRs are used in living rooms. Consumers don’t want noisy drives in those environments. These are some of the key differences over our other new products, such as the Barracuda drives.”

    It’s clear that the next storage goal to kick will be the one terabyte mark. When does Mr Lee see this as likely to occur? “I can’t put a specific date on that, but with our perpendicular drives we are pushing the envelope of technology that allows us to do that. I believe that Seagate is in a very good position to continuously lead in terms of capacity.”

    And are there any new technologies on the horizon Seagate is investing in? Asked if Seagate has any plans to move towards holographic storage, Mr Lee responded by saying “Seagate is committed to a leadership position in the storage category and is aggressively pursuing different innovative storage technologies. There aren’t any (new technologies) we can announce right now, but what I can tell you is that we are putting a lot of money and effort into examining the feasibility of the new technologies.”

    See www.seagate.com

     

     

    The post Seagate Rolls Out New HDD Range appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/seagate-rolls-out-new-hdd-range/feed/ 0
    First Core 2 Duo Notebook https://smartoffice.com.au/first-core-2-duo-notebook/ https://smartoffice.com.au/first-core-2-duo-notebook/#respond Tue, 04 Jul 2017 05:44:34 +0000 http://smartoffice.com.au/first-core-2-duo-notebook/ Australia's first Intel Core 2 Duo Notebook has been unveiled by Pioneer Computers Australia, it claims.

    The post First Core 2 Duo Notebook appeared first on Smart Office.

    ]]>
    Australia’s first Intel Core 2 Duo Notebook has been unveiled by Pioneer Computers Australia, it claims.

    Three models are available: The Dreambook Power M57U, Light 822 and Slim 825. All can support the Intel Core 2 Duo 2.0GHz Processor T 7200, the Intel Core 2 Duo 2.16GHz Processor T 7400 and the Intel Core 2 Duo 2.33GHz Processor T 7600.

    Dreambook Light 822 is light, stylish and powerful, with a 14.1 inch widescreen WXGA (1280 x 800) TFT. The high-performance Dreambook Slim 825 features a 15.4 inch widescreen XGA (1280 x 800) TFT Screen. Both models offer a choice of up to 128MB Intel 950 Graphics or ATI Radeon X1600 256MB DDR2 PCI Express Graphics and built-in sound system with Azalia I/F (HD Audio codec), AC-3 support, built-in stereo speaker, woofer, microphone and feature volume control by hot keys.

    Pioneer’s Dreambook Power 57U is the ultimate gaming and super-power application machine. It features an expansive 17 inch WSXGA+ widescreen with 1680 x 1050 resolution, or an upgrade to 17 inch WUXGA widescreen with 1920 X 1200 resolution, the latter being perfect for movie-watching. With immense multimedia capabilities, the Power 57U comes with an Nvidia 7900 high performance graphic chip, 256MB DDRII Video RAM on board, 256-bit video memory interface, SATA IDE Raid, PCI Express 16X, WFG 1.0 Support and a modular design. The audio system consists of an Azalia high-definition Audio Interface, S/PDIF Digital output, Virtual 7.1 channel output, a built-in microphone, speakers and woofer and Audio DJ Console. It features SRS and WOW 3D sound technology, and is Sound-Blaster PRO Compatible.

    The Dreambook Power 57U comes with an embedded 7-in-1 card reader (MS/MS PRO//MS DUO/MMC/RSMMC/SD/Mini SD) and also an Express Card 54(34) slot.

    Offered on a build-to-order basis, prices start from $3199.

    See www.pioneer.net.au


    Click to enlarge
    Pioneer’s Dreambook Notebook’s now sport the racy Intel Core 2 Duo processors.

    The post First Core 2 Duo Notebook appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/first-core-2-duo-notebook/feed/ 0
    Infocus Gets To Work – Big Time https://smartoffice.com.au/infocus-gets-to-work-big-time/ https://smartoffice.com.au/infocus-gets-to-work-big-time/#respond Tue, 04 Jul 2017 05:44:34 +0000 http://smartoffice.com.au/infocus-gets-to-work-big-time/ Infocus today announced its Work Big IN24 ($1350) and IN26 ($1,699) projectors, which it says offer complete presentation solutions. Based on the reliability of Infocus’ award-winning X2 and X3 projectors, the new InFocus Work Big IN24 and IN26 are, it says, long-lasting and dependable products that fill a wall or screen, with bright, vivid and ... Read more

    The post Infocus Gets To Work – Big Time appeared first on Smart Office.

    ]]>

    Infocus today announced its Work Big IN24 ($1350) and IN26 ($1,699) projectors, which it says offer complete presentation solutions.

    Based on the reliability of Infocus’ award-winning X2 and X3 projectors, the new InFocus Work Big IN24 and IN26 are, it says, long-lasting and dependable products that fill a wall or screen, with bright, vivid and crisp images – capturing every detail in a Power Point sales presentation, a graph comparison of annual budgets or a presentation to provoke interactive brainstorming sessions. For business professionals looking for their first business projection system, the Infocus Work Big IN24 is an affordable SVGA resolution projector and the IN26 features XGA resolution. 

    Weighing 2.6 kilograms, both models present value and quality for businesses, providing excellent video quality with 2000:1 contrast ratio, a computer input, quiet operation, an industry-leading 3000-hour lamp life, digital keystone correction and a compact and light-weight design. Both the IN24 and IN26 feature the sleeve bearing colour wheel for quieter performance, and a newly designed remote control to meet customer’s primary needs. In addition, InFocus Work Big projectors include the latest Texas Instruments DLP (Digital Light Processing) chip is claimed to provide sharp, colourful images that won’t deteriorate over time and provide amazing picture-quality.  Both projectors feature 1700 lumens, for excellent picture brightness and quality to small businesses at an affordable price.

    “Infocus is continuing to set the standards in business projection with the Work Big portfolio,” said Infocus’ Scott Ballantyne. “A great picture, amazing value, dependability and ease-of-use are what consumers get with these projectors.  Factor in the increase in your businesses’ professional image, improved new business pitches and increased productivity, and projection should be viewed as a key investment, especially for small businesses.”

    See www.idt.com.au


    Click to enlarge
    The Work Big range provides excellent picture brightness and quality to small businesses at an affordable price.

    The post Infocus Gets To Work – Big Time appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/infocus-gets-to-work-big-time/feed/ 0