lib/kolab_sync_data_calendar.php lib/kolab_sync_data_contacts.php lib/kolab_sync_data_notes.php lib/kolab_sync_data.php lib/kolab_sync_data_tasks.php

Aleksander Machniak machniak at kolabsys.com
Mon May 12 11:44:37 CEST 2014


 lib/kolab_sync_data.php          |   63 +++++++++++++++++++++++++++++++++++++--
 lib/kolab_sync_data_calendar.php |    2 -
 lib/kolab_sync_data_contacts.php |    2 -
 lib/kolab_sync_data_notes.php    |    9 ++++-
 lib/kolab_sync_data_tasks.php    |    2 -
 5 files changed, 70 insertions(+), 8 deletions(-)

New commits:
commit f6985b56305a1ecb845ee758579fb8e2bb51f15f
Author: Aleksander Machniak <machniak at kolabsys.com>
Date:   Mon May 12 11:44:16 2014 +0200

    Support notes in HTML format

diff --git a/lib/kolab_sync_data.php b/lib/kolab_sync_data.php
index 8f0bfef..9c7a4a7 100644
--- a/lib/kolab_sync_data.php
+++ b/lib/kolab_sync_data.php
@@ -1146,7 +1146,7 @@ abstract class kolab_sync_data implements Syncroton_Data_IData
      *
      * @param mixed $body Body element
      * @param int   $type Result data type (to which the body will be converted, if specified).
-     *                    One of Syncroton_Model_EmailBody constants.
+     *                    One or array of Syncroton_Model_EmailBody constants.
      *
      * @return string Body value
      */
@@ -1156,16 +1156,73 @@ abstract class kolab_sync_data implements Syncroton_Data_IData
             $data = $body->data;
         }
 
+        if (!$data || empty($type)) {
+            return;
+        }
+
+        $type = (array) $type;
+
         // Convert to specified type
-        if ($data && $type && $body->type != $type) {
+        if (!in_array($body->type, $type)) {
             $converter = new kolab_sync_body_converter($data, $body->type);
-            $data      = $converter->convert($type);
+            $data      = $converter->convert($type[0]);
         }
 
         return $data;
     }
 
     /**
+     * Converts text (plain or html) into ActiveSync Body element.
+     * Takes bodyPreferences into account and detects if the text is plain or html.
+     */
+    protected function body_from_kolab($body, $collection)
+    {
+        if (empty($body)) {
+            return;
+        }
+
+        $opts      = $collection->options;
+        $prefs     = $opts['bodyPreferences'];
+        $html_type = Syncroton_Command_Sync::BODY_TYPE_HTML;
+        $type      = Syncroton_Command_Sync::BODY_TYPE_PLAIN_TEXT;
+        $params    = array();
+
+        // HTML? check for opening and closing <html> or <body> tags
+        $is_html = preg_match('/<(html|body)(\s+[a-z]|>)/', $body, $m) && strpos($body, '</'.$m[1].'>') > 0;
+
+        // here we assume that all devices support plain text
+        if ($is_html) {
+            // device supports HTML...
+            if (!empty($prefs[$html_type])) {
+                $type = $html_type;
+            }
+            // ...else convert to plain text
+            else {
+                $txt  = new rcube_html2text($body, false, true);
+                $body = $txt->get_text();
+            }
+        }
+
+        // strip out any non utf-8 characters
+        $body        = rcube_charset::clean($body);
+        $real_length = $body_length = strlen($body);
+
+        // truncate the body if needed
+        if (($trucateAt = $prefs[$type]['truncationSize']) && $body_length > $truncateAt) {
+            $body        = mb_strcut($body, 0, $truncateAt);
+            $body_length = strlen($body);
+
+            $params['truncated']         = 1;
+            $params['estimatedDataSize'] = $real_length;
+        }
+
+        $params['type'] = $type;
+
+        return $this->setBody($body, $params);
+    }
+
+
+    /**
      * Converts PHP DateTime, date (YYYY-MM-DD) or unixtimestamp into PHP DateTime in UTC
      *
      * @param DateTime|int|string $date Unix timestamp, date (YYYY-MM-DD) or PHP DateTime object
diff --git a/lib/kolab_sync_data_calendar.php b/lib/kolab_sync_data_calendar.php
index 14b379a..a762356 100644
--- a/lib/kolab_sync_data_calendar.php
+++ b/lib/kolab_sync_data_calendar.php
@@ -242,7 +242,7 @@ class kolab_sync_data_calendar extends kolab_sync_data implements Syncroton_Data
                 break;
 
             case 'description':
-                $value = $this->setBody($value);
+                $value = $this->body_from_kolab($value, $collection);
                 break;
             }
 
diff --git a/lib/kolab_sync_data_contacts.php b/lib/kolab_sync_data_contacts.php
index 02a77bc..97fefdf 100644
--- a/lib/kolab_sync_data_contacts.php
+++ b/lib/kolab_sync_data_contacts.php
@@ -156,7 +156,7 @@ class kolab_sync_data_contacts extends kolab_sync_data
                 break;
 
             case 'notes':
-                $value = $this->setBody($value);
+                $value = $this->body_from_kolab($value, $collection);
                 break;
             }
 
diff --git a/lib/kolab_sync_data_notes.php b/lib/kolab_sync_data_notes.php
index 1bc151f..2e442be 100644
--- a/lib/kolab_sync_data_notes.php
+++ b/lib/kolab_sync_data_notes.php
@@ -95,7 +95,7 @@ class kolab_sync_data_notes extends kolab_sync_data
                 break;
 
             case 'description':
-                $value = $this->setBody($value);
+                $value = $this->body_from_kolab($value, $collection);
                 break;
             }
 
@@ -132,7 +132,12 @@ class kolab_sync_data_notes extends kolab_sync_data
 
             switch ($name) {
             case 'description':
-                $value = $this->getBody($value, Syncroton_Model_EmailBody::TYPE_PLAINTEXT);
+                $supported_body_types = array(
+                    Syncroton_Model_EmailBody::TYPE_HTML,
+                    Syncroton_Model_EmailBody::TYPE_PLAINTEXT,
+                );
+                $value = $this->getBody($value, $supported_body_types);
+
                 // If description isn't specified keep old description
                 if ($value === null) {
                     continue 2;
diff --git a/lib/kolab_sync_data_tasks.php b/lib/kolab_sync_data_tasks.php
index d43df66..e524c00 100644
--- a/lib/kolab_sync_data_tasks.php
+++ b/lib/kolab_sync_data_tasks.php
@@ -132,7 +132,7 @@ class kolab_sync_data_tasks extends kolab_sync_data
                 break;
 
             case 'description':
-                $value = $this->setBody($value);
+                $value = $this->body_from_kolab($value, $collection);
                 break;
 
             case 'sensitivity':




More information about the commits mailing list