index aa8cdcbd042ea82b8f7c62ad8ac33a9b03503ef9..7e416556d036bcf13f8aa23af19f69c783d3b019 100644 (file)
function ppdManager($path)
{
+ if(is_dir($path)){
$this->path= $path;
- echo "Path set to $path<br>";
+ }else{
+ print_red(sprintf(_("PPD manager : The specified path '%s' doesn't exists."),$path));
+ return (false);
+ }
}
}
+ function updateAttribute($file, $section, $attribute, $value)
+ {
+ $fsection= false;
+ $fattribute= false;
+ $section= preg_replace('/^\*/', '', $section);
+ $attribute= preg_replace('/^\*/', '', $attribute);
+
+ $rp= @fopen($file, "r");
+ $wp= @fopen("$file.tmp", "w");
+
+
+
+ while (!feof($rp)){
+ $lines[]= fgets($rp, 1024);
+ }
+
+ $ret = "";
+ $done =false;
+ foreach($lines as $nr => $line){
+
+ if (preg_match("/\*OpenGroup:*\s+\**$section\/*/", $line)){
+ $fsection= true;
+ $ret .=$line;
+ continue;
+ }
+
+ /* Change model name .. */
+ if ((preg_match("/^\*".$attribute.":*\s+/",$line)) && ($attribute == "ModelName")){
+ $line= "*$attribute: \"$value\"\n";
+ $done =true;
+ }
+
+ if (($fsection) && ($section != "NO_SECTION")){
+ if (preg_match("/^\*CloseGroup:*\s+\**$section\/*/", $line)){
+ $fsection= false;
+ $ret .=$line;
+ continue;
+ }
+
+
+ if (preg_match("/^\*OpenUI:*\s+\**$attribute\/*/", $line)){
+ $fattribute= true;
+ $ret .= $line;
+ continue;
+ }
+
+ if ($fattribute){
+ if (preg_match("/^\*CloseUI:*\s+\**$attribute\/*/", $line)){
+ $fattribute= false;
+ $ret .= $line;
+ continue;
+ }
+
+ if (preg_match("/^\*Default$attribute:*\s+/", $line)){
+ $line= "*Default$attribute: $value\n";
+ $done =true;
+ }
+ }
+ }else{
+ if (preg_match("/^\*OpenUI:*\s+\**$attribute\/*/", $line)){
+ $fattribute= true;
+ $ret .= $line;
+ continue;
+ }
+
+ if ($fattribute){
+ if (preg_match("/^\*CloseUI:*\s+\**$attribute\/*/", $line)){
+ $fattribute= false;
+ $ret .= $line;
+ continue;
+ }
+
+ if (preg_match("/^\*Default$attribute:*\s+/", $line)){
+ $line= "*Default$attribute: $value\n";
+ $done =true;
+ }
+ }
+ }
+ $ret .=$line;
+ }
+
+ fwrite($wp,$ret);
+
+ fclose($wp);
+ fclose($rp);
+
+ copy("$file.tmp", "$file");
+ unlink("$file.tmp");
+ }
+
+
+ function saveProperties($ppdFile, $properties)
+ {
+ if(!is_readable($ppdFile)){
+ print_red(sprintf(_("Specified ppd file '%s' can't be opened for reading."),$ppdFile));
+ }elseif(!is_writeable(preg_replace("#(^.*/).*$#","\\1",$ppdFile.".tmp"))){
+ print_red(sprintf(_("The required tmp file file '%s' can't be opened for writing."),$ppdFile.".tmp"));
+ }else{
+ foreach ($properties as $name => $section){
+ foreach ($section as $attribute => $value){
+ if (is_array($value)){
+ $this->updateAttribute($ppdFile, $name, $attribute, $value['_default']);
+ }
+ }
+ }
+ }
+ }
+
+ function loadProperties($ppdFile)
+ {
+ $group= "";
+ $option= "";
+ $properties= array();
+
+ $fh= fopen ($ppdFile, 'r');
+ while (!feof($fh)) {
+
+ /* Read line */
+ $line= fgets($fh, 256);
+ if (strlen($line) >= 256){
+ trigger_error(_('Parsing PPD file %s failed - line too long. Trailing characters have been ignored'), E_USER_WARNING);
+ }
+
+ /* Trigger for option groups */
+ if (preg_match('/^\*OpenGroup:/i', $line)){
+
+ /* Sanity checks */
+ if ($group != ""){
+ trigger_error(_('Nested groups are not supported!'), E_USER_WARNING);
+ continue;
+ }
+ if (in_array($group, $properties)){
+ trigger_error(_('Group name not unique!'), E_USER_WARNING);
+ continue;
+ }
+
+ // TODO: Symbol values are not supported yet!
+ if (preg_match('/\^/', $line)){
+ trigger_error(_('Symbol values are not supported yet!'), E_USER_WARNING);
+ }
+ $complete= preg_replace('@^\*OpenGroup:\s+(.*)$@i', '\1', $line);
+ $complete= trim($complete, '"');
+ if (preg_match('@/@', $complete)){
+ $group= trim(preg_replace('@^\*OpenGroup:\s+"?([^/]+)/.*$@i', '\1', $line));
+ $name = preg_replace('@^\*OpenGroup:\s+"?[^/]+/([^/]+).*$@i', '\1', $line);
+ } else {
+ $group= $complete;
+ $name = $complete;
+ }
+ $properties[$group]= array('_name' => $name);
+ continue;
+ }
+ if (preg_match("/^\*CloseGroup:\s+\"?$group\"?/i", $line)){
+ $group= "";
+ continue;
+ }
+
+ /* Trigger for options */
+ if (preg_match('/^\*OpenUI\s+/i', $line)){
+
+ /* Sanity check */
+ if ($option != ""){
+ trigger_error(_('Nested options are not supported!'), E_USER_WARNING);
+ continue;
+ }
+
+ // TODO: Symbol values are not supported yet!
+ if (preg_match('/\^/', $line)){
+ trigger_error(_('Symbol values are not supported yet!'), E_USER_WARNING);
+ }
+ $complete= preg_replace('@^\*OpenUI\s+(.*)$@i', '\1', $line);
+ $complete= trim($complete, '"');
+ if (preg_match('@/@', $complete)){
+ $option= trim(preg_replace('@^\*OpenUI\s+([^/]+)/.*$@i', '\1', $line));
+ $name = trim(preg_replace('@^\*OpenUI\s+[^/]+/([^/]+).*$@i', '\1', $line));
+ } else {
+ $option= trim($complete);
+ $name = trim($complete);
+ }
+
+ /* Extract option type */
+ $type= trim(preg_replace('/^[^:]+:\s+/', '', $line));
+ $name= preg_replace('/:.*$/', '', $name);
+ $option= preg_replace('/:.*$/', '', $option);
+
+ // TODO: PickMany is not supported yet!
+ if (preg_match('/PickMany/i', $type)){
+ trigger_error(_('PickMany is not supported yet!'), E_USER_WARNING);
+ }
+ if(empty($group)){
+ $properties["NO_SECTION"][$option]= array('_name' => $name, '_type' => $type);
+ }else{
+ $properties[$group][$option]= array('_name' => $name, '_type' => $type);
+ }
+ continue;
+ }
+ /* Show interest for option parsing */
+ if ($option != ""){
+
+ $eoption= preg_replace('@\*@', '', $option);
+
+ /* Close section? */
+ if (preg_match("@^\*CloseUI:\s+\*$eoption@i", $line)){
+ $option= "";
+ continue;
+ }
+
+ /* Default value? */
+ if (preg_match("@^\*Default$eoption:@", $line)){
+ $c= preg_replace("@^\*Default$eoption:\s+@", "", $line);
+ if(empty($group)){
+ $properties["NO_SECTION"][$option]['_default']= trim(trim($c, '"'));
+ }else{
+ $properties[$group][$option]['_default']= trim(trim($c, '"'));
+ }
+ continue;
+ }
+
+ /* Possible value? */
+ if (preg_match("@^\*$eoption\s+@", $line)){
+#*PageSize Letter/US Letter: "<>setpagedevice"
+ $c= preg_replace("@^\*$eoption\s+([^/]+).*$@", "$1", $line);
+ $d= preg_replace("@^\*$eoption\s+[^/]+/([^:]+).*$@", "$1", $line);
+ if(empty($group)){
+ $properties["NO_SECTION"][$option][trim($c)]= trim($d);
+ }else{
+ $properties[$group][$option][trim($c)]= trim($d);
+ }
+ continue;
+ }
+ }
+ }
+ fclose ($fh);
+ return ($properties);
+ }
+
function loadDescription($ppdFile)
{
$model= "";
$manufacturer= "";
-
+
$fh= fopen ($ppdFile, 'r');
- while (!feof($fh)) {
+ while ((!feof($fh))&&($fh)) {
/* Read line */
- $line= fgets($fh, 4096);
- if (strlen($line) >= 4095){
- trigger_error(_('Parsing PPD file %s faild - line too long. Trailing characters have been ignored'), E_USER_WARNING);
+ $line= fgets($fh, 256);
+ if (strlen($line) >= 256){
+ trigger_error(_('Parsing PPD file %s failed - line too long. Trailing characters have been ignored'), E_USER_WARNING);
}
-
+
/* Extract interesting informations */
if (preg_match('/^\*Manufacturer:/i', $line)){
- $manufacturer= preg_replace('/^\*Manufacturer:\s+"([^"]+)".*$/i', '\1', $line);
+ $manufacturer= preg_replace('/^\*Manufacturer:\s+"?([^"]+)"?.*$/i', '\1', $line);
}
if (preg_match('/^\*ModelName:/i', $line)){
- $model= preg_replace('/^\*ModelName:\s+"([^"]+)".*$/i', '\1', $line);
+ $model= preg_replace('/^\*ModelName:\s+"?([^"]+)"?.*$/i', '\1', $line);
}
/* Got everything we need? Skip rest for speed reasons... */
return ($this->cachedList);
}
-
+
}
?>