예제 #1
0
 /**
  *
  */
 public function import($csv)
 {
     // convert to UTF-8
     $head = substr($csv, 0, 4096);
     $fallback = rcube::get_instance()->config->get('default_charset', 'ISO-8859-1');
     // fallback to Latin-1?
     $charset = rcube_charset::detect($head, RCUBE_CHARSET);
     $csv = rcube_charset::convert($csv, $charset);
     $head = '';
     $this->map = array();
     // Parse file
     foreach (preg_split("/[\r\n]+/", $csv) as $i => $line) {
         $elements = $this->parse_line($line);
         if (empty($elements)) {
             continue;
         }
         // Parse header
         if (empty($this->map)) {
             $this->parse_header($elements);
             if (empty($this->map)) {
                 break;
             }
         } else {
             $this->csv_to_vcard($elements);
         }
     }
 }
예제 #2
0
 /**
  *
  */
 public function import($csv)
 {
     // convert to UTF-8
     $head = substr($csv, 0, 4096);
     $charset = rcube_charset::detect($head, RCUBE_CHARSET);
     $csv = rcube_charset::convert($csv, $charset);
     $head = '';
     $this->map = array();
     // Parse file
     foreach (preg_split("/[\r\n]+/", $csv) as $line) {
         $elements = $this->parse_line($line);
         if (empty($elements)) {
             continue;
         }
         // Parse header
         if (empty($this->map)) {
             $this->parse_header($elements);
             if (empty($this->map)) {
                 break;
             }
         } else {
             $this->csv_to_vcard($elements);
         }
     }
 }
예제 #3
0
 /**
  *
  */
 public function import($csv)
 {
     // convert to UTF-8
     $head = substr($csv, 0, 4096);
     $charset = rcube_charset::detect($head, RCUBE_CHARSET);
     $csv = rcube_charset::convert($csv, $charset);
     $csv = preg_replace(array('/^[\\xFE\\xFF]{2}/', '/^\\xEF\\xBB\\xBF/', '/^\\x00+/'), '', $csv);
     // also remove BOM
     $head = '';
     $prev_line = false;
     $this->map = array();
     $this->gmail_map = array();
     // Parse file
     foreach (preg_split("/[\r\n]+/", $csv) as $line) {
         if (!empty($prev_line)) {
             $line = '"' . $line;
         }
         $elements = $this->parse_line($line);
         if (empty($elements)) {
             continue;
         }
         // Parse header
         if (empty($this->map)) {
             $this->parse_header($elements);
             if (empty($this->map)) {
                 break;
             }
         } else {
             // handle multiline elements (e.g. Gmail)
             if (!empty($prev_line)) {
                 $first = array_shift($elements);
                 if ($first[0] == '"') {
                     $prev_line[count($prev_line) - 1] = '"' . $prev_line[count($prev_line) - 1] . "\n" . substr($first, 1);
                 } else {
                     $prev_line[count($prev_line) - 1] .= "\n" . $first;
                 }
                 $elements = array_merge($prev_line, $elements);
             }
             $last_element = $elements[count($elements) - 1];
             if ($last_element[0] == '"') {
                 $elements[count($elements) - 1] = substr($last_element, 1);
                 $prev_line = $elements;
                 continue;
             }
             $this->csv_to_vcard($elements);
             $prev_line = false;
         }
     }
 }
예제 #4
0
 /**
  * Set attachment filename from message part structure
  *
  * @param rcube_message_part $part    Part object
  * @param string             $headers Part's raw headers
  */
 protected function set_part_filename(&$part, $headers = null)
 {
     if (!empty($part->d_parameters['filename'])) {
         $filename_mime = $part->d_parameters['filename'];
     } else {
         if (!empty($part->d_parameters['filename*'])) {
             $filename_encoded = $part->d_parameters['filename*'];
         } else {
             if (!empty($part->ctype_parameters['name*'])) {
                 $filename_encoded = $part->ctype_parameters['name*'];
             } else {
                 if (!empty($part->d_parameters['filename*0'])) {
                     $i = 0;
                     while (isset($part->d_parameters['filename*' . $i])) {
                         $filename_mime .= $part->d_parameters['filename*' . $i];
                         $i++;
                     }
                     // some servers (eg. dovecot-1.x) have no support for parameter value continuations
                     // we must fetch and parse headers "manually"
                     if ($i < 2) {
                         if (!$headers) {
                             $headers = $this->conn->fetchPartHeader($this->folder, $this->msg_uid, true, $part->mime_id);
                         }
                         $filename_mime = '';
                         $i = 0;
                         while (preg_match('/filename\\*' . $i . '\\s*=\\s*"*([^"\\n;]+)[";]*/', $headers, $matches)) {
                             $filename_mime .= $matches[1];
                             $i++;
                         }
                     }
                 } else {
                     if (!empty($part->d_parameters['filename*0*'])) {
                         $i = 0;
                         while (isset($part->d_parameters['filename*' . $i . '*'])) {
                             $filename_encoded .= $part->d_parameters['filename*' . $i . '*'];
                             $i++;
                         }
                         if ($i < 2) {
                             if (!$headers) {
                                 $headers = $this->conn->fetchPartHeader($this->folder, $this->msg_uid, true, $part->mime_id);
                             }
                             $filename_encoded = '';
                             $i = 0;
                             $matches = array();
                             while (preg_match('/filename\\*' . $i . '\\*\\s*=\\s*"*([^"\\n;]+)[";]*/', $headers, $matches)) {
                                 $filename_encoded .= $matches[1];
                                 $i++;
                             }
                         }
                     } else {
                         if (!empty($part->ctype_parameters['name*0'])) {
                             $i = 0;
                             while (isset($part->ctype_parameters['name*' . $i])) {
                                 $filename_mime .= $part->ctype_parameters['name*' . $i];
                                 $i++;
                             }
                             if ($i < 2) {
                                 if (!$headers) {
                                     $headers = $this->conn->fetchPartHeader($this->folder, $this->msg_uid, true, $part->mime_id);
                                 }
                                 $filename_mime = '';
                                 $i = 0;
                                 $matches = array();
                                 while (preg_match('/\\s+name\\*' . $i . '\\s*=\\s*"*([^"\\n;]+)[";]*/', $headers, $matches)) {
                                     $filename_mime .= $matches[1];
                                     $i++;
                                 }
                             }
                         } else {
                             if (!empty($part->ctype_parameters['name*0*'])) {
                                 $i = 0;
                                 while (isset($part->ctype_parameters['name*' . $i . '*'])) {
                                     $filename_encoded .= $part->ctype_parameters['name*' . $i . '*'];
                                     $i++;
                                 }
                                 if ($i < 2) {
                                     if (!$headers) {
                                         $headers = $this->conn->fetchPartHeader($this->folder, $this->msg_uid, true, $part->mime_id);
                                     }
                                     $filename_encoded = '';
                                     $i = 0;
                                     $matches = array();
                                     while (preg_match('/\\s+name\\*' . $i . '\\*\\s*=\\s*"*([^"\\n;]+)[";]*/', $headers, $matches)) {
                                         $filename_encoded .= $matches[1];
                                         $i++;
                                     }
                                 }
                             } else {
                                 if (!empty($part->ctype_parameters['name'])) {
                                     $filename_mime = $part->ctype_parameters['name'];
                                 } else {
                                     if (!empty($part->headers['content-description'])) {
                                         $filename_mime = $part->headers['content-description'];
                                     } else {
                                         return;
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     // decode filename
     if (!empty($filename_mime)) {
         if (!empty($part->charset)) {
             $charset = $part->charset;
         } else {
             if (!empty($this->struct_charset)) {
                 $charset = $this->struct_charset;
             } else {
                 $charset = rcube_charset::detect($filename_mime, $this->default_charset);
             }
         }
         $part->filename = rcube_mime::decode_mime_string($filename_mime, $charset);
     } else {
         if (!empty($filename_encoded)) {
             // decode filename according to RFC 2231, Section 4
             if (preg_match("/^([^']*)'[^']*'(.*)\$/", $filename_encoded, $fmatches)) {
                 $filename_charset = $fmatches[1];
                 $filename_encoded = $fmatches[2];
             }
             $part->filename = rcube_charset::convert(urldecode($filename_encoded), $filename_charset);
         }
     }
 }
예제 #5
0
 /**
  * Fix attachment name encoding if needed/possible
  */
 protected function fix_attachment_name($name, $part)
 {
     if ($name == rcube_charset::clean($name)) {
         return $name;
     }
     // find charset from part or its parent(s)
     if ($part->charset) {
         $charsets[] = $part->charset;
     } else {
         // check first part (common case)
         $n = strpos($part->mime_id, '.') ? preg_replace('/\\.[0-9]+$/', '', $part->mime_id) . '.1' : 1;
         if (($_part = $this->mime_parts[$n]) && $_part->charset) {
             $charsets[] = $_part->charset;
         }
         // check parents' charset
         $items = explode('.', $part->mime_id);
         for ($i = count($items) - 1; $i > 0; $i--) {
             $last = array_pop($items);
             $parent = $this->mime_parts[join('.', $items)];
             if ($parent && $parent->charset) {
                 $charsets[] = $parent->charset;
             }
         }
     }
     if ($this->headers->charset) {
         $charsets[] = $this->headers->charset;
     }
     if (empty($charsets)) {
         $rcube = rcube::get_instance();
         $charsets[] = rcube_charset::detect($name, $rcube->config->get('default_charset', RCUBE_CHARSET));
     }
     foreach (array_unique($charsets) as $charset) {
         $_name = rcube_charset::convert($name, $charset);
         if ($_name == rcube_charset::clean($_name)) {
             if (!$part->charset) {
                 $part->charset = $charset;
             }
             return $_name;
         }
     }
     return $name;
 }
예제 #6
0
 /**
  * Returns UNICODE type based on BOM (Byte Order Mark)
  *
  * @param string Input string to test
  * @return string Detected encoding
  */
 private static function detect_encoding($string)
 {
     $fallback = rcube::get_instance()->config->get('default_charset', 'ISO-8859-1');
     // fallback to Latin-1
     return rcube_charset::detect($string, $fallback);
 }
예제 #7
0
파일: bc.php 프로젝트: noikiy/roundcubemail
function rc_detect_encoding($string, $failover = '')
{
    return rcube_charset::detect($string, $failover);
}
예제 #8
0
 /**
  * @dataProvider data_detect
  */
 function test_detect($input, $fallback, $output)
 {
     $this->assertEquals($output, rcube_charset::detect($input, $fallback));
 }
예제 #9
0
function rc_detect_encoding($string, $failover = '')
{
    _deprecation_warning(__FUNCTION__);
    return rcube_charset::detect($string, $failover);
}