/**
* Based on the printer's connector, compute (or load a cached copy of) maps
* of UTF character to unicode characters for later use.
*/
private function loadAvailableCharacters()
{
$profile = $this->printer->getPrinterCapabilityProfile();
$supportedCodePages = $profile->getCodePages();
$profileName = $profile->getId();
$cacheFile = dirname(__FILE__) . "/cache/Characters-" . $profileName . ".ser" . (self::COMPRESS_CACHE ? ".z" : "");
$cacheKey = $profile->getCodePageCacheKey();
/* Check for pre-generated file */
if (file_exists($cacheFile)) {
$cacheData = file_get_contents($cacheFile);
if (self::COMPRESS_CACHE) {
$cacheData = gzuncompress($cacheData);
}
if ($cacheData) {
$dataArray = unserialize($cacheData);
if (isset($dataArray["key"]) && isset($dataArray["available"]) && isset($dataArray["encode"]) && $dataArray["key"] == $cacheKey) {
$this->available = $dataArray["available"];
$this->encode = $dataArray["encode"];
return;
}
}
}
/* Generate conversion tables */
$encode = array();
$available = array();
foreach ($supportedCodePages as $num => $codePage) {
$encode[$num] = array();
if (!$codePage->isEncodable()) {
continue;
}
$map = $codePage->getData();
for ($char = 128; $char <= 255; $char++) {
$utf8 = mb_substr($map, $char - 128, 1, self::INPUT_ENCODING);
if ($utf8 == " ") {
// Skip placeholders
continue;
}
if (!isset($available[$utf8])) {
$available[$utf8] = array();
}
$available[$utf8][$num] = true;
$encode[$num][$utf8] = chr($char);
}
}
/* Use generated data */
$dataArray = array("available" => $available, "encode" => $encode, "key" => $cacheKey);
$this->available = $dataArray["available"];
$this->encode = $dataArray["encode"];
$cacheData = serialize($dataArray);
if (self::COMPRESS_CACHE) {
$cacheData = gzcompress($cacheData);
}
/* Attempt to cache, but don't worry if we can't */
@file_put_contents($cacheFile, $cacheData);
}