/** * Function log any own error */ public static function write($message, $err_file, $err_line) { $err_message = "[" . date('r') . "] {$message} ({$err_file}:{$err_line})\n"; if (qpimg_config::get_option('log_file')) { if (@file_put_contents(qpimg_config::get_option('log_file'), $err_message, FILE_APPEND)) { return true; } } print "<div><strong>qpimg message:</strong><br />{$err_message}</div>"; return true; }
/** * Base generate function. Detect all using maps (incoming map_id & it's attach * and sub-sub-...-attach maps). Check validate of cache files. Then if need * generate data and make redirect to CSS-file. * If $get_link is true then return path to file * * @param string $map_id * * @param bool $get_link * * @return bool global execute status */ public static function execute($map_id, $get_link = FALSE) { list($map_id) = explode(':', $map_id); $need_get_maps_stack = array($map_id); $valid_maps_stack = array(); $invalid_maps_stack = array(); while (count($need_get_maps_stack) > 0) { $one_map_id = array_shift($need_get_maps_stack); $one_map_cfg = qpimg_config::get_map($one_map_id); if ($one_map_cfg === false) { return false; } if (isset($one_map_cfg['attach']) === true) { if (is_array($one_map_cfg['attach']) === false) { $one_map_cfg['attach'] = array($one_map_cfg['attach']); } foreach ($one_map_cfg['attach'] as $attach_map_id) { if (isset($valid_maps_stack[$attach_map_id]) === false && isset($invalid_maps_stack[$attach_map_id]) === false) { $need_get_maps_stack[] = $attach_map_id; } } } //--------------------------------------------------------------------- // Check for data in cache if (qpimg_cache::validate($one_map_cfg) === true) { $valid_maps_stack[$one_map_id] = $one_map_cfg; } else { if (qpimg_cache::clean($one_map_cfg) === false) { return false; } $invalid_maps_stack[$one_map_id] = $one_map_cfg; } if ($map_id == $one_map_id) { $map_cfg = $one_map_cfg; } } if (count($invalid_maps_stack) > 0) { if (isset($invalid_maps_stack[$map_id]) === false) { $invalid_maps_stack[$map_id] = $valid_maps_stack[$map_id]; unset($valid_maps_stack[$map_id]); } //--------------------------------------------------------------------- // Generate data foreach ($invalid_maps_stack as $one_map_id => $one_map_cfg) { if (qpimg_media::pack($one_map_cfg) === false) { return false; } $valid_maps_stack[$one_map_id] = $invalid_maps_stack[$one_map_id]; } qpimg_cache::clean($one_map_cfg, true); if (qpimg_media::pack_grouper_css($map_cfg, $valid_maps_stack) === false) { return false; } //--------------------------------------------------------------------- } return $get_link ? qpimg_cache::get_valid_css_source($map_cfg, isset($map_cfg['attach'])) : qpimg_cache::redirect($map_cfg); }
/** * Redirect (mean read from file and output) to CSS-file of current map. * Almost generate header-values. * * @param array $map_cfg map-config array * * @return bool is redirect done */ public static function redirect($map_cfg) { $filename = self::get_valid_css_source($map_cfg, isset($map_cfg['attach'])); if ($filename === false) { return false; } //--------------------------------------------------------------------- $cache_timeout = qpimg_config::get_option('cache_time_expire'); $headers = array(); $headers['Expires'] = gmdate('D, d M Y H:i:s \\G\\M\\T', time() + $cache_timeout); $headers['Last-Modified'] = gmdate('D, d M Y H:i:s \\G\\M\\T', filemtime($filename)); $headers['ETag'] = "\"qpimg-{$map_cfg['id']}-{$map_cfg['hash']}\""; //--------------------------------------------------------------------- $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : false; $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : false; if ($if_none_match && $if_none_match == $headers['ETag']) { $headers[':Response-Code'] = 304; $filename = false; } elseif ($if_modified_since && $if_modified_since == $headers['Last-Modified']) { $headers[':Response-Code'] = 304; $filename = false; } else { $headers['Content-Type'] = 'text/css'; $headers['Cache-Control'] = "max-age={$cache_timeout}, public, must-revalidate"; } qpimg_utils::send_headers($headers); if ($filename !== false) { @readfile($filename); } return true; }
/** * Prepare media-items array by map-config array. * Make media-items objects & detect count of data:URI objects. * * @param array & $map_cfg map-config array (save result in it) * * @return bool true */ private static function prepare_media_items(&$map_cfg) { $media_items = array(); $dataURI_files_count = 0; //---------------------------------------------------------------------- // Prepare map-default presets array $default_presets = array('@'); if (isset($map_cfg['default_presets']) === true) { $tmp_default_presets = explode('@', $map_cfg['default_presets']); foreach ($tmp_default_presets as $tmp_default_preset) { if ($tmp_default_preset == '' || $tmp_default_preset[0] == '~') { continue; } $default_presets[] = $tmp_default_preset; } unset($tmp_default_presets, $tmp_default_preset); } //---------------------------------------------------------------------- foreach ($map_cfg['objects'] as $media_id => $media_cfg) { list($media_id, $presets, $media_source, $media_cfg) = self::parse_media_values($media_id, $media_cfg); $safe_media_source = self::parse_media_source($media_source, $map_cfg['id']); if ($safe_media_source === false) { $media_items[$media_id] = new media_item_crash(); qpimg_logger::write("QPIMG_NOTICE: Failed on get file '{$media_source}' (map_id - '{$map_cfg['id']}'; media_id - '{$media_id}')", __FILE__, __LINE__); continue; } $img_attrs = getimagesize($safe_media_source); if ($img_attrs === false) { $media_items[$media_id] = new media_item_crash(); qpimg_logger::write("QPIMG_NOTICE: Failed on get image size '{$media_source}' (map_id - '{$map_cfg['id']}'; media_id - '{$media_id}')", __FILE__, __LINE__); continue; } list($img_width, $img_height, $img_imagetype) = $img_attrs; $media_item = new media_item_cfg($media_source, $img_width, $img_height, $img_imagetype); //----------------------------------------------------------------- if (filesize($safe_media_source) > qpimg_config::get_option('dataURI_filesize_limit')) { $media_item->set('data:URI', false); } elseif ($map_cfg['data:URI'] === true) { $media_item->set('data:URI', true); } //---[1] Apply presets config attributes--- $set_presets = array_merge($default_presets, $presets['set']); foreach ($set_presets as $preset_id) { $preset_id = trim($preset_id); if ($preset_id == '') { continue; } if (in_array($preset_id, $presets['unset']) === true) { continue; } $preset_attrs = qpimg_config::get_preset($preset_id); if ($preset_attrs === false) { qpimg_logger::write("QPIMG_NOTICE: Undefined preset id '{$preset_id}' (map_id - '{$map_cfg['id']}'; media_id - '{$media_id}')", __FILE__, __LINE__); continue; } foreach ($preset_attrs as $cfg_key => $cfg_value) { $media_item->set($cfg_key, $cfg_value); } } //---[2] Apply own config attributes--- foreach ($media_cfg as $cfg_key => $cfg_value) { $media_item->set($cfg_key, $cfg_value); } if ($media_item->get('data:URI') === true) { $dataURI_files_count++; } $media_items[$media_id] = $media_item; } $map_cfg['objects:items'] = $media_items; $map_cfg['objects:dataURI_files_count'] = $dataURI_files_count; return true; }