fix #8131 - chinese translations
[Pman.Core] / GnumericToExcel.php
index f53c8bc..feb940c 100644 (file)
@@ -28,13 +28,13 @@ class Pman_Core_GnumericToExcel extends Pman
         return true;
     }
 
-    function get()
+    function get($v, $opts=array())
     {
-        
+         
     }
     function post($fname) {
         
-          $ml = (int) ini_get('suhosin.post.max_value_length');
+        $ml = (int) ini_get('suhosin.post.max_value_length');
         if (empty($_POST['xml'])) {
             header("HTTP/1.0 400 Internal Server Error");
             die(  $ml ? "Suhosin Patch enabled - try and disable it!!!" : 'no XML sent');
@@ -48,9 +48,9 @@ class Pman_Core_GnumericToExcel extends Pman
         
         $xml = iconv("UTF-8", "UTF-8//IGNORE",  $xml);
         
-        //$xml = str_replace('é', 'e', $xml);
+        //$xml = str_replace('', 'e', $xml);
         //$xml = str_replace("\xA0", ' ', $xml);
-        //$xml = str_replace("Ø", 'dia.',$xml);
+        //$xml = str_replace("", 'dia.',$xml);
         
         //$this->addEvent("DOWNLOAD", false, isset($_REQUEST['title']) ? $_REQUEST['title'] : '???');
         
@@ -58,14 +58,31 @@ class Pman_Core_GnumericToExcel extends Pman
         if (!empty($_POST['format']) && $_POST['format']=='gnumeric') {
             if (empty($_POST['debug'])) {
                 header('Content-type: application/x-gnumeric');
+                header('Content-Disposition: attachment; filename="' .addslashes($fname). '.gnumeric"');
             } else {
                 header('Content-type: text/xml');
             }
             echo $xml; 
             exit;
         }
-        $srcTmp = ini_get('session.save_path') . '/' .uniqid('gnumeric_').'.gnumeric';
-        $targetTmp = ini_get('session.save_path') . '/' .uniqid('gnumeric_').'.xls';
+        
+        $ext = 'xls';
+        $outfmt = 'Gnumeric_Excel:excel_biff8';
+        $mime = 'application/vnd.ms-excel';
+        
+        /*
+         // ssconvert results in bad images 
+         if (!empty($_POST['format']) && $_POST['format']=='xlsx') {
+            $outfmt = 'Gnumeric_Excel:xlsx';
+            $ext = 'xlsx';
+            $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
+        }
+        */
+        
+        
+        
+        $srcTmp = $this->tempName('gnumeric');
+        $targetTmp = $this->tempName($ext);
         // write the gnumeric file...
         $fh = fopen($srcTmp,'w');
         fwrite($fh, $xml);
@@ -73,13 +90,15 @@ class Pman_Core_GnumericToExcel extends Pman
         
         
         require_once 'System.php';
+        $xvfb = System::which('xvfb-run');
+        
         $ss = System::which('ssconvert');
-        $cmd =  $ss. 
+        $cmd = $xvfb . " -a " . $ss. 
                 " --import-encoding=Gnumeric_XmlIO:sax" .
-                " --export-type=Gnumeric_Excel:excel_biff8 " . 
+                " --export-type={$outfmt} " . 
                 $srcTmp . ' ' . $targetTmp . ' 2>&1';
         // echo $cmd;
-        //passthru($cmd);exit;
+        //passthru($cmd);exit; 
         //exit;
         $out = `$cmd`;
         clearstatcache(); 
@@ -88,19 +107,51 @@ class Pman_Core_GnumericToExcel extends Pman
             header("HTTP/1.0 400 Internal Server Error - Convert error");
             die("ERROR CONVERTING?:" . $cmd ."\n<BR><BR> OUTPUT:". htmlspecialchars($out));
         }
-       // unlink($srcTmp);
-        $fname .= preg_match('/\.xls/i', $fname) ? '' :  '.xls'; // make sure it ends in xls..
+        
+        if (!empty($_POST['format']) && $_POST['format']=='xlsx') {
+            require_once 'File/Convert.php';
+            $cc = new File_Convert($targetTmp,'application/vnd.ms-excel');
+            $targetTmp = $cc->convert('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+            if (empty($targetTmp)) {
+                $this->jerr("convert to xlsx failed");
+            }
+            
+            $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
+            $ext = "xlsx";
+         }
+        if (empty($fname)) {
+           $fname = basename($targetTmp);
+        }
+        $fname .= preg_match('/\.' . $ext . '/i', $fname) ? '' :  ('.' . $ext); // make sure it ends in xls..
        
-        header('Content-type: application/vnd.ms-excel');
+        
+        DB_DataObject::factory('Events')->addFile(array(
+            'tmp_name' => $targetTmp,
+            'name' => $fname,
+            'type' => $mime,
+            'size' => filesize($targetTmp)
+        ));
+        
+        $this->addEvent("DOWNLOAD",  false, $fname  );
+        
+       // unlink($srcTmp);
+        
+        header('Content-type: ' . $mime);
         header('Content-Disposition: attachment; filename="' .addslashes($fname). '"');
-        header('Content-length: '. filesize($targetTmp));
-        $fh = fopen($targetTmp, 'r');
-        // will not work on IE... - needs while/fget..
-        fpassthru($fh);
+        header('Content-length: '. filesize($targetTmp));   
+        header("Content-Transfer-Encoding: binary");
+        if ($file = fopen($targetTmp, 'rb')) {
+            while(!feof($file) and (connection_status()==0)) {
+                print(fread($file, 1024*8));
+                flush();
+            }
+            fclose($file);
+        }
+       
         unlink($targetTmp);
         exit;
         
     }
     
-    
+     
 }