Code

Used divlist instead of ldapserach
[gosa.git] / include / class_ppdManager.inc
index aa8cdcbd042ea82b8f7c62ad8ac33a9b03503ef9..7e416556d036bcf13f8aa23af19f69c783d3b019 100644 (file)
@@ -7,8 +7,12 @@ class ppdManager
 
        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);
+               }
        }
 
 
@@ -43,26 +47,262 @@ class ppdManager
        }
 
 
+       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... */
@@ -98,7 +338,7 @@ class ppdManager
 
                return ($this->cachedList);
        }
-       
+
 }
 
 ?>