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; } } IT Hardware Archives - Smart Office https://smartoffice.com.au/category/it-hardware/ Mon, 20 Jul 2020 00:42:38 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 Lenovo Launch ThinkStation P620, First AMD Ryzen Threadripper PRO Workstation https://smartoffice.com.au/lenovo-launch-thinkstation-p620-first-amd-ryzen-threadripper-pro-workstation/ https://smartoffice.com.au/lenovo-launch-thinkstation-p620-first-amd-ryzen-threadripper-pro-workstation/#respond Mon, 20 Jul 2020 00:42:38 +0000 http://smartoffice.com.au/?p=97884 Lenovo have launched the ThinkStation P620 in Australia, marking a new generation of workstation computing. The ThinkStation P620 features AMD’s new Ryzen Threadripper PRO processor to deliver the only 64 core workstation platform. The Ryzen Threadripper PRO processor offers clock speeds of up to 4.0GHz, 128 lanes of PCIe 4.0 bandwidth and 8-channel memory support. ... Read more

    The post Lenovo Launch ThinkStation P620, First AMD Ryzen Threadripper PRO Workstation appeared first on Smart Office.

    ]]>
    Lenovo have launched the ThinkStation P620 in Australia, marking a new generation of workstation computing.

    The ThinkStation P620 features AMD’s new Ryzen Threadripper PRO processor to deliver the only 64 core workstation platform.

    The Ryzen Threadripper PRO processor offers clock speeds of up to 4.0GHz, 128 lanes of PCIe 4.0 bandwidth and 8-channel memory support. Previously, the max core count that a single-CPU system could handle was 18 cores, and the highest a dual-processor system could support was 56.

    With the ThinkStation P260, users can stream 8K in real-time, have reduced render times, and have smooth interactivity with 3D assets. It also offers advanced security features.

    “Our customers rely on us to deliver professional-grade solutions that are powerful, but nimble enough to be customised as their needs change and evolve,” said Rob Herman, General Manager, Workstation and Client AI Business Unit, Lenovo.

    “One of the challenges for IT departments we’ve seen is the push to try new technologies before they’ve been vetted – lacking enterprise-grade features, certifications and security, and support. We’ve worked closely with AMD, ensuring the ThinkStation P620 removes all these barriers and gives users the support they need.”

    The device will be available in Australia from mid- to late October.

    The post Lenovo Launch ThinkStation P620, First AMD Ryzen Threadripper PRO Workstation appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/lenovo-launch-thinkstation-p620-first-amd-ryzen-threadripper-pro-workstation/feed/ 0
    While Canton Fair Goes Online, COMPUTEX 2020 Is Cancelled https://smartoffice.com.au/canton-fair-goes-online-computex-2020-cancelled/ https://smartoffice.com.au/canton-fair-goes-online-computex-2020-cancelled/#respond Mon, 15 Jun 2020 04:10:49 +0000 http://smartoffice.com.au/?p=97802 One of the largest annual trade events on the ICT and IoT industry, COMPUTEX 2020 has been cancelled, with event organisers postponing the trade fair until 2021. COMPUTEX organisers Taiwan External Trade Development Council (TAITRA) and Taipei Computer Association (TCA) cited the ongoing COVID-19 crisis as the cause for the cancellation. Previously, at the start ... Read more

    The post While Canton Fair Goes Online, COMPUTEX 2020 Is Cancelled appeared first on Smart Office.

    ]]>
    One of the largest annual trade events on the ICT and IoT industry, COMPUTEX 2020 has been cancelled, with event organisers postponing the trade fair until 2021.

    COMPUTEX organisers Taiwan External Trade Development Council (TAITRA) and Taipei Computer Association (TCA) cited the ongoing COVID-19 crisis as the cause for the cancellation.

    Previously, at the start of the COVID-19 pandemic, organisers had pushed COMPUTEX back to 28th-30th September 2020, from early June 2020. The next COMPUTEX fair is now scheduled to take place on 1st-5th June 2021 in Taipei.

    Last year COMPUTEX hosted 1,685 exhibitors and attracted 42,495 attendees from 171 countries.

    In the meantime, TAITRA has launched a series of online events, including #COMPUTEX Online Talks, where key executives from Intel, NVIDIA, Qualcomm, Supermicro, Deltra Electronics and more shared tech trends on AI and 5G (the livestream was watched by more than 400,000).

    [wpdevart_youtube]X9cXNS5AaYY[/wpdevart_youtube]

     

    On 29th June Taiwan Trade Show’s YouTube channel will host #InnoVEXOnlineDemo, where start-ups will showcase their new products and technologies. In September organises will launch the COMPUTEX Online 2D Exhibition, which will display exhibitors’ products and services online.

    Meanwhile, the 2020 China Import and Export Fair (Canton Fair) will be hosted online only, from today until the 24th June. As part of its virtual event, Canton Fair is running 24-hour livestreams of 1,779 exhibitors.

    The post While Canton Fair Goes Online, COMPUTEX 2020 Is Cancelled appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/canton-fair-goes-online-computex-2020-cancelled/feed/ 0
    Epson Annouce New Ultra-Efficient WorkForce Pro Inkjet Printers https://smartoffice.com.au/epson-annouce-new-ultra-efficient-workforce-pro-inkjet-printers/ https://smartoffice.com.au/epson-annouce-new-ultra-efficient-workforce-pro-inkjet-printers/#respond Thu, 11 Oct 2018 01:36:33 +0000 http://smartoffice.com.au/?p=96192 Epson Australia has introduced four new and ultra-efficient printers built specifically for businesses which they claim has an ink yield of up to 50,000 pages while using up to 87% less energy than comparable printers as well as providing a suite of software solutions and work-flow tools. The new WorkForce Pro printers are specifically designed ... Read more

    The post Epson Annouce New Ultra-Efficient WorkForce Pro Inkjet Printers appeared first on Smart Office.

    ]]>
    Epson Australia has introduced four new and ultra-efficient printers built specifically for businesses which they claim has an ink yield of up to 50,000 pages while using up to 87% less energy than comparable printers as well as providing a suite of software solutions and work-flow tools.

    The new WorkForce Pro printers are specifically designed for busy offices that require fast, reliable and high yield printing and bring both Epson’s signature inkjet technology, as well as offering a low environmental impact, low intervention and high productivity

    The range includes two A4 mono devices: The multi-function WF-M5799 and single-function WF-M5299; and two A4 colour devices: The WF-C579R and WF-C529R.

    The multi-function WF-M5799 and single-function WF-M5299 printers offer an impressive ink yield of up to 40,000 pages. Whereas the multi-function WF-C579R and single-function WF-C529R colour printers boast a significantly higher ink yield of up to 50,000 pages for black and 20,000 pages for each of the colours.

    Both rates are among the highest in the market today.

    Each of the four models Epson claim uses up to 87% less energy than comparable printers, helping to reduce environmental impact and lowering users’ energy bills.

    Epson is also providing software solutions with support for Google Cloud Print and Apple AirPrint to keep a mobile workforce on the move, along with Epson’s Print and Device Admin software.

    Epson’s Open Platform supports third-party cost recovery and follow-me print solutions such as PaperCut, whilst Epson’s Document Capture Pro6 software enables intuitive document management of scanned invoices, contracts and other important business documentation.

    For more information on Epson WorkForce Pro printers click through to their website.

    The post Epson Annouce New Ultra-Efficient WorkForce Pro Inkjet Printers appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/epson-annouce-new-ultra-efficient-workforce-pro-inkjet-printers/feed/ 0
    Aussie IoT Set To Drive New $120bn Market: Report https://smartoffice.com.au/aussie-iot-set-to-drive-new-120bn-market-report/ https://smartoffice.com.au/aussie-iot-set-to-drive-new-120bn-market-report/#respond Sun, 12 Nov 2017 22:54:48 +0000 http://smartoffice.com.au/?p=95747 SYDNEY – Widescale use of Internet-connected devices could drive up to A$120 billion of new economic activity in Australia over the next decade, according to a report published by the Internet of Things Alliance Australia (IoTAA). The main industries to benefit from the deployment of IoT will be logistics, public health, retail, transportation, and worksite automation, the ... Read more

    The post Aussie IoT Set To Drive New $120bn Market: Report appeared first on Smart Office.

    ]]>
    SYDNEY – Widescale use of Internet-connected devices could drive up to A$120 billion of new economic activity in Australia over the next decade, according to a report published by the Internet of Things Alliance Australia (IoTAA).

    The main industries to benefit from the deployment of IoT will be logistics, public health, retail, transportation, and worksite automation, the alliance says, noting that IoT devices include everything from connected vehicles to smartphones, thermostats, kettles, swimming pools, washing machines, headphones, lamps and wearable devices.

    The conclusions are published in Good Data Practice: A Guide for Business to Consumer IoT Services for Australia. In it, IoTAA recommends that would-be IoT providers incorporate privacy and security into the core design of their systems and that information be provided to consumers on collection, uses and disclosures of data.

    The post Aussie IoT Set To Drive New $120bn Market: Report appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/aussie-iot-set-to-drive-new-120bn-market-report/feed/ 0
    Review: New Lexmark S815 MFP Design Icon or Good Printer? https://smartoffice.com.au/review-new-lexmark-s815-mfp-design-icon-or-good-printer-2/ https://smartoffice.com.au/review-new-lexmark-s815-mfp-design-icon-or-good-printer-2/#respond Thu, 06 Jul 2017 13:00:00 +0000 http://smartoffice.com.au/review-new-lexmark-s815-mfp-design-icon-or-good-printer-2/ Laser printers are in big demand and as sizes shrink and functions grow, Lexmark has gone one step further with a printer that is very much a design statement for the desk. But the big question is does the S815 stack up as a good all round printer?

    The post Review: New Lexmark S815 MFP Design Icon or Good Printer? appeared first on Smart Office.

    ]]>
    Laser printers are in big demand and as sizes shrink and functions grow, Lexmark has gone one step further with a printer that is very much a design statement for the desk. But the big question is does the S815 stack up as a good all round printer?

    When you open up the box of this all new Lexmark Genesis printer, you’re either going to love it or hate it. There’s no in-between on this clash of interests between design and practicality. The functionality and inventiveness is all there in more ways than one, but everything from the unconventional shape to the subverted angles show that Lexmark must have put more time into pushing design limits than supporting functionality.

    The Genesis S815 features scanning times as quick as three seconds through an ingeniously simple idea that dramatically speeds up the everyday scanning process, while still retaining vivid colour and picture quality. Scanning and printing on the fly will reproduce near-perfect copies on the right kind of paper, with high resolution detail clearly visible. Colours on plain paper are washed out from absorption while text is only less sharp if you look obsessively close at the page. Images come out pretty saturated but still high quality for anyone with an eye for detail. Wireless capabilities provide online interaction that lets users send these images they scan straight off to sites like Evernote and Photobucket without using the computer as a middleman.

     

    This is one part of the multi-faceted online capability of SmartSolutions, Lexmark’s customisation tool for the Genesis. Working like an App Store, the Lexmark website offers a Solution Library which pulls up a list of shortcuts and applications to run on the printer’s touch screen. Once you sign up to SmartSolutions, simply touching any ‘+’ symbol will launch the Library on your web browser where users can choose everything from sheet music templates to clock and calculator widgets to give their Genesis the personal touch for whatever they use most.

    On that note, the capacitive touch screen is a gorgeously smooth addition compared to the usually resistive and unresponsive screen retrofitted into most older printers, now joining the ranks of printing powerhouses like HP – only that with Lexmark, menu customisation, fluid menu control and extreme simplicity and ease-of-use push it a step ahead of the game (or on par with HP’s Photosmart eStation).

    The multifunction centre also features USB and SD/MS/xD/MMC connections alongside Wi-Fi and TCP/IP connectivity, along with fax machine integration.

     

    Earlier last month, Lexmark’s Director of Worldwide Product and Solutions Marketing, Bill Lucas told SmartHouse that “instead of looking at a piece of technology and asking ourselves what we could do with it, we ask users what they want on their printers.”

    Apparently users want their printers looking more like their old CRT TV than an actual printer.

    Fair enough, the design comes very subjectively and many may like monolithic stature that defies the typically boring, eggshell/grey-white box printer, but some of the design elements impede on practicality. Take the scanner, for example: the front panel that features the touch screen doubles as the lid of the scanner. Not a problem for scanning photos, cards and documents, but a major problem if you’re trying to scan anything as large as an encyclopaedia or bigger. The lid opens from near vertical alignment to around 45 degrees with a few centimetres of give for thicker documents, but thick books or boxes can’t always fit flush against the scanning screen as they would on a face-down flatbed scanner.

    If you do manage to fit your larger items into the scanner with the lid open, you’ll then come across the wonder of bending down to use the absentmindedly-placed touch screen that is now facing the floor rather than the user. Even though scanning pages and documents is a breeze, the design compromises any further love for this misunderstood device.

    The Lexmark Genesis S815 runs at $449 from participating Harvey Norman, Domayne & Joyce Mayne outlets.

    The post Review: New Lexmark S815 MFP Design Icon or Good Printer? appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/review-new-lexmark-s815-mfp-design-icon-or-good-printer-2/feed/ 0
    HP Notebook A Multimedia Powerhouse https://smartoffice.com.au/hp-notebook-a-multimedia-powerhouse-2/ https://smartoffice.com.au/hp-notebook-a-multimedia-powerhouse-2/#respond Thu, 06 Jul 2017 11:00:00 +0000 http://smartoffice.com.au/hp-notebook-a-multimedia-powerhouse-2/ The new HP Pavilion dv7 promises faster running programs, noteworthy graphics, quality audio, and even has enough hard drive space to store your music, videos, photos, and games. Just make sure you are prepared to lug a notebook that weighs 3.52kg.

    The post HP Notebook A Multimedia Powerhouse appeared first on Smart Office.

    ]]>
    The new HP Pavilion dv7 promises faster running programs, noteworthy graphics, quality audio, and even has enough hard drive space to store your music, videos, photos, and games. Just make sure you are prepared to lug a notebook that weighs 3.52kg.

    Spending $2299 for a 17.3-inch notebook seems steep, but HP is promising good hardware specifications on the dv7. The system features a 2.66 Ghz Intel Core i7 processor, 4GB of RAM, an Nvidia GeForce GT 230M graphics card with 1GB memory, and 1TB of storage (two 500GB drives). Also included are Altec Lansing speakers with an integrated subwoofer.

    This means that you can edit photos and videos, play games, or watch movies in HD without experiencing slowdowns. The 17.3-inch BrightView widescreen display has a native resolution of 1600×900, although it could have been better if HP used a Full HD panel. The Altec Lansing speakers were loud, but those who want to enjoy movies or music in peace can connect their favourite headphones in the jack located up front.

    The shiny black finish looks good but is a fingerprint magnet. The touch pad is large, while the keyboard is well-spaced and responsive. Users can find touch-sensitive media controls above the keyboard that allows a user to adjust the volume, put audio on mute, and even play or pause an audio file or movie. It also comes with a Wi-Fi button that changes colour depending on status (connected = blue, disconnected = orange).

     

    The dv7 garnered a score of 6961 in 3DMark06 and lasted for 158 minutes in our movie playback test.

    Connectivity is not an issue with the dv7 as it has a lot of input/output ports. It comes with four USB ports (one shared with eSATA), D-Sub, HDMI, Firewire, Ethernet, Modem, two headphone out, microphone out, IR, expansion port, and Expresscard slot, and 5-in-1 digital media reader. A built-in web camera and microphone are also onboard that can be used for Skype or other video conferencing software.

    Overall, the HP Pavilion dv7 is a powerful multimedia notebook that performs well under most circumstances. Whether it is playing games, working on spreadsheets, or watching movies, this notebook will not slow you down. It may be heavy and hard to bring around, but it won’t certainly be an issue for those who do not want to sacrifice productivity. 

    The post HP Notebook A Multimedia Powerhouse appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/hp-notebook-a-multimedia-powerhouse-2/feed/ 0
    AOC Monitor Provides Wide Viewing Angles https://smartoffice.com.au/aoc-monitor-provides-wide-viewing-angles-2/ https://smartoffice.com.au/aoc-monitor-provides-wide-viewing-angles-2/#respond Thu, 06 Jul 2017 07:00:00 +0000 http://smartoffice.com.au/aoc-monitor-provides-wide-viewing-angles-2/ The AOC IF23 is aimed at professional graphic artists or enthusiasts who want a bright and crisp display that has wide viewing angles.

    The post AOC Monitor Provides Wide Viewing Angles appeared first on Smart Office.

    ]]>
    The AOC IF23 is aimed at professional graphic artists or enthusiasts who want a bright and crisp display that has wide viewing angles.


    Click to enlarge

    Specifications-wise the IF23 sports a 23-inch widescreen, promises a dynamic contrast ratio of 100000:1, a brightness of 250 cd/m2, a response time of 6ms, and a viewing angle of 178. It has a native resolution of 1920×1080 but only has a D-Sub and DVI-D port. It could have been better if AOC included a HDMI port on the device.

     The IF23 sports a photo-frame design with a glossy blue front and a white back. Unlike other monitors, the cabinet is supported by a single-post stand that can be rotated to change the monitor’s angle (3 to 12 degrees).

    This unconventional design may be ‘refreshing’ for some, but others would definitely want it in just plain black. Another thing that could put off users is its build quality – the monitor feels flimsy and the plastic just feels cheap.

     

    Click to enlarge

    We connected the unit to a Windows PC (via DVI-D) and adjusted the monitor’s contrast and brightness to improve the image quality. The IPS (In Plane Switching) panel allowed us to see a photo at an angle without colour degradation. The colours were crisp and it was able to show more image depth, especially in dark photos and video clips. Static images were sharp and games played on the monitor showed minimal ghosting.

    The directional keys found below the device also function as Hotkeys to adjust contrast, viewing mode, image ratio, and source. Pressing the power button displays various commands that allows a user to adjust luminance and colour temperature, turn on colour boost (full enhance, nature skin, green field, sky blue, auto detect) or colour boost (frame size, brightness, contrast, H. position, V. position, and bright frame on/off), adjust the OSD settings, or reset the monitor to default.

    The unit also comes with six eco modes that automatically adjust the settings according to the source. This includes Standard, Text, Internet, Game, Movie, and Sports. The IF23’s DCR (Dynamic Contrast Ratio) can also be enabled or disabled.

    For $399 you get a great monitor that produces great image quality at any viewing angle. The only problem is if you do not like how it looks – the IF23 is only available in glossy blue and sports a picture frame design. It tries its best to stand out from the crowd, but has a hard time convincing people otherwise. 

    The post AOC Monitor Provides Wide Viewing Angles appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/aoc-monitor-provides-wide-viewing-angles-2/feed/ 0
    $799 Medion Notebook Perfect For The Home Office https://smartoffice.com.au/799-medion-notebook-perfect-for-the-home-office-2/ https://smartoffice.com.au/799-medion-notebook-perfect-for-the-home-office-2/#respond Thu, 06 Jul 2017 05:43:04 +0000 http://smartoffice.com.au/799-medion-notebook-perfect-for-the-home-office-2/ Aldi and Medion have started 2010 with a bang as they launch a 17.3-inch notebook that is perfect for home offices. It can handle office applications without slowing down and can even entertain you with its large screen and loud speakers.

    The post $799 Medion Notebook Perfect For The Home Office appeared first on Smart Office.

    ]]>
    Aldi and Medion have started 2010 with a bang as they launch a 17.3-inch notebook that is perfect for home offices. It can handle office applications without slowing down and can even entertain you with its large screen and loud speakers.The E7212 does not look like its predecessors, with the unit sporting a brushed grey lid and piano black interior (the older models sport a piano black lid with matte silver interior). While the interior looks great, it is very prone to fingerprint marks and smudges, putting off users who want a clean computer.

    Various ports are located on the side of the computer including three USB ports, a microphone, headphone, and audio-in jack, an E-SATA, Ethernet, and Display Port, as well as a 4-in-1 card reader. The unit also has a 1.3-megapixel webcam, microphone, and Wi-Fi built-in. In terms of hardware, the E7212 has an Intel Pentium processor (T4500 @ 2.3Ghz), 4GB of RAM, 320GB of storage, and a DVD/CD drive with burning capabilities.

    Medion has also pre-installed Windows 7 Home Premium (32-bit), Microsoft Works 9.0, Windows Live Essentials, a trial version of Microsoft Office Home and Student 2007, PowerDirector 8, PowerProducer 5, PowerDVD9, Media Show 4, Cyberlink Power2Go 6, CyberLink YouCam, CorelDraw Essentials 3 + MediaOne, and Bullguard Internet Security.

     


    Click to enlarge
    The 17.3-inch LED backlit display has a native resolution of 1600 x 900, giving users a wider view of documents. Movies were displayed in 16:9 widescreen and looked sharp and rich. Audio quality was good too, thanks to its speakers and subwoofer that are Dolby Home Theatre v3 certified.

    Despite the good specifications, users must remember that it is not built for 3D extensive applications and high-end gaming. The E7212 does not have a dedicated graphics card and only uses an Intel Graphics Media Accelerator for mobile. The notebook scored 2494 on 3DMark 03 and received a rating of 3.4 on Windows Experience Index (it got a 3.4 on gaming graphics).

    The E7212 lasted 145 minutes on our battery drain test (playing a movie with brightness and audio set to maximum), thanks to its 8-cell battery. This means that you can watch a movie and work on your documents for a couple of hours before charging the notebook.

    For $799, this computer is worth every dollar. It will definitely not suit those who want to play games or run graphic-intensive applications, but can satisfy the needs of a home office worker. This notebook will be available starting next Thursday, 28 January 2010.

    The post $799 Medion Notebook Perfect For The Home Office appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/799-medion-notebook-perfect-for-the-home-office-2/feed/ 0
    Olin Wireless Charger Very Limited https://smartoffice.com.au/olin-wireless-charger-very-limited-2/ https://smartoffice.com.au/olin-wireless-charger-very-limited-2/#respond Thu, 06 Jul 2017 05:42:15 +0000 http://smartoffice.com.au/olin-wireless-charger-very-limited-2/ Following our review on the new Uniden Power Pad last week, we were curious to see how the new Olin Wireless Charger For iPhone would compare.

    The post Olin Wireless Charger Very Limited appeared first on Smart Office.

    ]]>
    Following our review on the new Uniden Power Pad last week, we were curious to see how the new Olin Wireless Charger For iPhone would compare.


    Click to enlarge

    Like the Uniden Power Pad, the Olin Wireless Charger is easy to use. Every time we needed to charge the unit, we simply had to drop it on the mat. Out of the box you get an AC adaptor, charging pad, and a receiver sleeve for the iPhone.

    Once the iPhone in placed in the receiver sleeve, a user can place it onto the charging pad for charging. The blue light will illuminate during the charging process and will switch off as soon as the charging is done. Olin says that the wireless charger comes with over/under voltage protection, short circuit protection and overcharge protection.

    Since the package only comes with one sleeve, you can only charge your iPhone out of the box. In addition, the pad only has enough space for the iPhone, making it very limited. It could have been better if Olin added an accessory similar to Uniden’s Power Disc to charge other products, but as of this time of writing, it seems that there isn’t any.

    It took about two hours to fully charge our iPhone. During our test, we heard a faint but annoying ticking sound coming from the unit. It is only by turning up our digital radio that we were able to drown the sound.

    Overall, we found the Olin Wireless Charger For iPhone to be very limited. Sure it charges your iPhone, but for $149, we were expecting more from this product. If you want a wireless mat that can charge more than your iPhone, then we recommend the Uniden Power Pad Deluxe Kit that comes with the pad, an iPhone sleeve and a power disc with 8 interchangeable tips for $179.95.
     

    The post Olin Wireless Charger Very Limited appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/olin-wireless-charger-very-limited-2/feed/ 0
    New Samsung LED Notebook Delivers https://smartoffice.com.au/new-samsung-led-notebook-delivers-2/ https://smartoffice.com.au/new-samsung-led-notebook-delivers-2/#respond Thu, 06 Jul 2017 05:42:15 +0000 http://smartoffice.com.au/new-samsung-led-notebook-delivers-2/ The Samsung R580 is a stylish notebook that uses the latest hardware, comes with a lot of support-based software, and will last for hours with its battery-saving features.

    The post New Samsung LED Notebook Delivers appeared first on Smart Office.

    ]]>
    The Samsung R580 is a stylish notebook that uses the latest hardware, comes with a lot of support-based software, and will last for hours with its battery-saving features.


    Click to enlarge

    The lid’s ‘red infused crystal finish’ and distinctive S-pattern gives it a sophisticated look. The durable casing helps minimise scratches, while the black-red gradation and finish masks fingerprints and smudges.

    Samsung has included quite a number of ports on the R580. It has four USB ports (one with a chargeable USB function and one eSATA + USB), an ExpressCard slot, HDMI out, D-Sub, Gigabit LAN, microphone and headphone port, and a DVD burner. It also comes with Wi-Fi (802.11 b/g/n), Bluetooth, a 1.3-megapixel camera, and a built-in microphone.

    The island-style keyboard is well-spaced and made it easy for us to type. The touchpad is integrated onto the casing but can still be felt (and seen) as the scroll area is rough and the corners are LED-lit. The touchpad also supports gesture functions, allowing us to scroll, zoom in/out, or rotate photos. The 15.6-inch LED screen (with 1366 x 768 resolution) is bright and produced good colours during our video test.

    The unit is powered by Intel’s new Core i5 processor (520M at 2.4Ghz), uses Nvidia’s GeForce GT 330M (1GHz) video card, and has 4GB of RAM. This fairly powerful hardware allowed us to run multiple programs without experiencing massive slowdowns. Running 3DMark revealed that it can play some of the latest games, with the R580 gaining a score of 16524 on the 03 version and 7448 on the 06 version.

     

    Click to enlarge

    Besides being pre-installed with Windows 7 Home Premium (32-bit), McAfee Security Center [sic], Cyberlink DVD Suite and Microsoft Office (60-day trial), Samsung has also included a couple of security and support software to help users get the most out of the notebook.

    One pre-installed program that we found useful is FailSafe, a program that can track, retrieve and delete data from the notebook remotely. The Samsung Recovery Solution backs up important data and restores it when a problem occurs, while the Samsung Update Plus automatically searches, downloads, and installs the “most optimal versions of pre-installed Samsung software and drivers for your system”.

    Whether or not these tools are useful for users is another question, but we’d rather have a couple of programs that can help us get things done than doing it by ourselves.

    The R580’s 6-cell battery lasted for 136 minutes in our DVD test, but users can definitely extend its life by turning on the power-saving functions.

    The Samsung R580 (with i5 processor, GeForce GT330M video card) is available now for $1399.

    The post New Samsung LED Notebook Delivers appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/new-samsung-led-notebook-delivers-2/feed/ 0