/** * 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); }