3 commits - plugins/libkolab

Aleksander Machniak machniak at kolabsys.com
Thu Nov 15 12:44:50 CET 2012


 plugins/libkolab/lib/kolab_format_file.php    |  174 ++++++++++++++++++++++++++
 plugins/libkolab/lib/kolab_storage_cache.php  |    9 +
 plugins/libkolab/lib/kolab_storage_folder.php |   16 +-
 3 files changed, 193 insertions(+), 6 deletions(-)

New commits:
commit 9a4c0cd793e774f376bbc545993d8b806ba90a4a
Author: Aleksander Machniak <machniak at kolabsys.com>
Date:   Thu Nov 15 12:44:25 2012 +0100

    Support objects of type File

diff --git a/plugins/libkolab/lib/kolab_format_file.php b/plugins/libkolab/lib/kolab_format_file.php
new file mode 100644
index 0000000..1560c46
--- /dev/null
+++ b/plugins/libkolab/lib/kolab_format_file.php
@@ -0,0 +1,174 @@
+<?php
+
+/**
+ * Kolab File model class
+ *
+ * @version @package_version@
+ * @author Thomas Bruederli <bruederli at kolabsys.com>
+ * @author Aleksander Machniak <machniak at kolabsys.com>
+ *
+ * Copyright (C) 2012, Kolab Systems AG <contact at kolabsys.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+class kolab_format_file extends kolab_format
+{
+    public $CTYPE = 'application/x-vnd.kolab.file';
+
+    protected $read_func = 'kolabformat::readKolabFile';
+    protected $write_func = 'kolabformat::writeKolabFile';
+
+    protected $sensitivity_map = array(
+        'public'       => kolabformat::ClassPublic,
+        'private'      => kolabformat::ClassPrivate,
+        'confidential' => kolabformat::ClassConfidential,
+    );
+
+    function __construct($xmldata = null)
+    {
+        $this->obj = new File;
+        $this->xmldata = $xmldata;
+    }
+
+    /**
+     * Set properties to the kolabformat object
+     *
+     * @param array  Object data as hash array
+     */
+    public function set(&$object)
+    {
+        $this->init();
+
+        // set some automatic values if missing
+        if (!empty($object['uid']))
+            $this->obj->setUid($object['uid']);
+
+        $object['changed'] = new DateTime('now', self::$timezone);
+        $this->obj->setLastModified(self::get_datetime($object['changed'], new DateTimeZone('UTC')));
+        $this->obj->setClassification($this->sensitivity_map[$object['sensitivity']]);
+        $this->obj->setCategories(self::array2vector($object['categories']));
+
+        if (isset($object['notes'])) {
+            $this->obj->setNote($object['notes']);
+        }
+
+        // Add file attachment
+        if (!empty($object['_attachments'])) {
+            $cid         = key($object['_attachments']);
+            $attach_attr = $object['_attachments'][$cid];
+            $attach      = new Attachment;
+
+            $attach->setLabel((string)$attach_attr['name']);
+            $attach->setUri('cid:' . $cid, $attach_attr['mimetype']);
+            $this->obj->setFile($attach);
+
+            // make sure size is set, so object saved in cache contains this info
+            if (!isset($attach_attr['size'])) {
+                if (isset($attach_attr['content'])) {
+                    $object['_attachments'][$cid]['size'] = strlen($attach_attr['content']);
+                }
+                else if (isset($attach_attr['path'])) {
+                    $object['_attachments'][$cid]['size'] = @filesize($attach_attr['path']);
+                }
+            }
+        }
+
+        // cache this data
+        $this->data = $object;
+        unset($this->data['_formatobj']);
+    }
+
+    /**
+     *
+     */
+    public function is_valid()
+    {
+        return $this->data || (is_object($this->obj) && $this->obj->isValid());
+    }
+
+    /**
+     * Load data from old Kolab2 format
+     */
+    public function fromkolab2($record)
+    {
+        $object = array(
+            'uid'     => $record['uid'],
+            'changed' => $record['last-modification-date'],
+        );
+
+        $this->data = $object;
+    }
+
+    /**
+     * Convert the Configuration object into a hash array data structure
+     *
+     * @return array  Config object data as hash array
+     */
+    public function to_array()
+    {
+        // return cached result
+        if (!empty($this->data))
+            return $this->data;
+
+        $this->init();
+
+        $sensitivity_map = array_flip($this->sensitivity_map);
+
+        // read object properties
+        $object = array(
+            'uid'         => $this->obj->uid(),
+            'created'     => self::php_datetime($this->obj->created()),
+            'changed'     => self::php_datetime($this->obj->lastModified()),
+            'sensitivity' => $sensitivity_map[$this->obj->classification()],
+            'categories'  => self::vector2array($this->obj->categories()),
+            'notes'       => $this->obj->note(),
+        );
+
+        // attachments are mime message parts handled by kolab_storage_folder
+        // @TODO: handle inline attachments
+
+        $this->data = $object;
+
+        return $this->data;
+    }
+
+    /**
+     * Callback for kolab_storage_cache to get object specific tags to cache
+     *
+     * @return array List of tags to save in cache
+     */
+    public function get_tags()
+    {
+        $tags = array();
+
+        foreach ((array)$this->data['categories'] as $cat) {
+            $tags[] = rcube_utils::normalize_string($cat);
+        }
+
+        return $tags;
+    }
+
+    /**
+     * Callback for kolab_storage_cache to get words to index for fulltext search
+     *
+     * @return array List of words to save in cache
+     */
+    public function get_words()
+    {
+        // Store filename in 'words' for fast access to file by name
+        $attachment = array_shift($this->data['_attachments']);
+        return array($attachment['name']);
+    }
+}


commit f210104dda9a1b7d59512586d7bf02e3846e78e9
Author: Aleksander Machniak <machniak at kolabsys.com>
Date:   Thu Nov 15 12:40:27 2012 +0100

    Cache in-memory objects returned by select()

diff --git a/plugins/libkolab/lib/kolab_storage_cache.php b/plugins/libkolab/lib/kolab_storage_cache.php
index 9eac164..6f6e16e 100644
--- a/plugins/libkolab/lib/kolab_storage_cache.php
+++ b/plugins/libkolab/lib/kolab_storage_cache.php
@@ -363,6 +363,15 @@ class kolab_storage_cache
             // TODO: post-filter result according to query
         }
 
+        // We don't want to cache big results in-memory, however
+        // if we select only one object here, there's a big chance we will need it later
+        if (!$uids && count($result) == 1) {
+            if ($msguid = $result[0]['_msguid']) {
+                $this->uid2msg[$result[0]['uid']] = $msguid;
+                $this->objects[$msguid] = $result[0];
+            }
+        }
+
         return $result;
     }
 


commit d2add5242438b72a4cb228a511c59d3199f9e355
Author: Aleksander Machniak <machniak at kolabsys.com>
Date:   Thu Nov 15 12:37:56 2012 +0100

    Extend get_attachment() with arguments available in rcube_imap::get_message_part()

diff --git a/plugins/libkolab/lib/kolab_storage_folder.php b/plugins/libkolab/lib/kolab_storage_folder.php
index 302efd6..2c58973 100644
--- a/plugins/libkolab/lib/kolab_storage_folder.php
+++ b/plugins/libkolab/lib/kolab_storage_folder.php
@@ -389,17 +389,21 @@ class kolab_storage_folder
      * Fetch a Kolab object attachment which is stored in a separate part
      * of the mail MIME message that represents the Kolab record.
      *
-     * @param string  Object's UID
-     * @param string  The attachment's mime number
-     * @param string  IMAP folder where message is stored;
-     *                If set, that also implies that the given UID is an IMAP UID
+     * @param string   Object's UID
+     * @param string   The attachment's mime number
+     * @param string   IMAP folder where message is stored;
+     *                 If set, that also implies that the given UID is an IMAP UID
+     * @param bool     True to print the part content
+     * @param resource File pointer to save the message part
+     * @param boolean  Disables charset conversion
+     *
      * @return mixed  The attachment content as binary string
      */
-    public function get_attachment($uid, $part, $mailbox = null)
+    public function get_attachment($uid, $part, $mailbox = null, $print = false, $fp = null, $skip_charset_conv = false)
     {
         if ($msguid = ($mailbox ? $uid : $this->cache->uid2msguid($uid))) {
             $this->imap->set_folder($mailbox ? $mailbox : $this->name);
-            return $this->imap->get_message_part($msguid, $part);
+            return $this->imap->get_message_part($msguid, $part, null, $print, $fp, $skip_charset_conv);
         }
 
         return null;





More information about the commits mailing list