diff --git a/build.xml b/build.xml index 12d2292..fe7db62 100644 --- a/build.xml +++ b/build.xml @@ -1,6 +1,6 @@ - + diff --git a/changelog.txt b/changelog.txt index f6fec2b..d377021 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +v1.0.2: 06.11.2013 + - fixed: importing attachments + - fixed: plugin not enabled bug + - fixed: importing website bug + - fixed: some other bugs + v1.0.1: 03.10.2013 - compatible with WebApp 1.4 diff --git a/js/data/ResponseHandler.js b/js/data/ResponseHandler.js index cf43f52..6b38745 100644 --- a/js/data/ResponseHandler.js +++ b/js/data/ResponseHandler.js @@ -55,6 +55,14 @@ Zarafa.plugins.contactimporter.data.ResponseHandler = Ext.extend(Zarafa.core.dat doImport : function(response) { this.successCallback(response); }, + + /** + * Call the successCallback callback function. + * @param {Object} response Object contained the response data. + */ + doImportattachment : function(response) { + this.successCallback(response); + }, /** * In case exception happened on server, server will return diff --git a/js/plugin.contactimporter.js b/js/plugin.contactimporter.js index ae4e310..ae091b7 100644 --- a/js/plugin.contactimporter.js +++ b/js/plugin.contactimporter.js @@ -1,5 +1,5 @@ /** - * plugin.contactimporter.js zarafa calender to ics im/exporter + * plugin.contactimporter.js zarafa contactimporter * * Author: Christoph Haas * Copyright (C) 2012-2013 Christoph Haas @@ -165,8 +165,8 @@ Zarafa.plugins.contactimporter.ImportPlugin = Ext.extend(Zarafa.core.Plugin, { // request attachment preperation container.getRequest().singleRequest( - 'calendarmodule', - 'attachmentpath', + 'contactmodule', + 'importattachment', { entryid : entryid, store: store, diff --git a/php/module.contact.php b/php/module.contact.php index 6802750..d7eefd3 100644 --- a/php/module.contact.php +++ b/php/module.contact.php @@ -63,6 +63,9 @@ class ContactModule extends Module { case "import": $result = $this->importContacts($actionType, $actionData); break; + case "importattachment": + $result = $this->getAttachmentPath($actionType, $actionData); + break; default: $this->handleUnknownActionType($actionType); } @@ -574,10 +577,12 @@ class ContactModule extends Module { } } if ($vCard -> TITLE) { - $properties["title"] = $vCard -> TITLE[0]; + $title = $vCard -> TITLE[0]; + $properties["title"] = is_array($title) ? $title["Value"] : $title; } if ($vCard -> URL) { - $properties["webpage"] = $vCard -> URL[0]; + $url = $vCard -> URL[0]; // only 1 webaddress + $properties["webpage"] = is_array($url) ? $url["Value"] : $url; } if ($vCard -> IMPP) { foreach ($vCard -> IMPP as $IMPP) { @@ -671,6 +676,145 @@ class ContactModule extends Module { return $out; } + + /** + * Store the file to a temporary directory + * @param $actionType + * @param $actionData + * @private + */ + private function getAttachmentPath($actionType, $actionData) { + // Get store id + $storeid = false; + if(isset($actionData["store"])) { + $storeid = $actionData["store"]; + } + + // Get message entryid + $entryid = false; + if(isset($actionData["entryid"])) { + $entryid = $actionData["entryid"]; + } + + // Check which type isset + $openType = "attachment"; + + // Get number of attachment which should be opened. + $attachNum = false; + if(isset($actionData["attachNum"])) { + $attachNum = $actionData["attachNum"]; + } + + // Check if storeid and entryid isset + if($storeid && $entryid) { + // Open the store + $store = $GLOBALS["mapisession"]->openMessageStore(hex2bin($storeid)); + + if($store) { + // Open the message + $message = mapi_msgstore_openentry($store, hex2bin($entryid)); + + if($message) { + $attachment = false; + + // Check if attachNum isset + if($attachNum) { + // Loop through the attachNums, message in message in message ... + for($i = 0; $i < (count($attachNum) - 1); $i++) + { + // Open the attachment + $tempattach = mapi_message_openattach($message, (int) $attachNum[$i]); + if($tempattach) { + // Open the object in the attachment + $message = mapi_attach_openobj($tempattach); + } + } + + // Open the attachment + $attachment = mapi_message_openattach($message, (int) $attachNum[(count($attachNum) - 1)]); + } + + // Check if the attachment is opened + if($attachment) { + + // Get the props of the attachment + $props = mapi_attach_getprops($attachment, array(PR_ATTACH_LONG_FILENAME, PR_ATTACH_MIME_TAG, PR_DISPLAY_NAME, PR_ATTACH_METHOD)); + // Content Type + $contentType = "application/octet-stream"; + // Filename + $filename = "ERROR"; + + // Set filename + if(isset($props[PR_ATTACH_LONG_FILENAME])) { + $filename = $props[PR_ATTACH_LONG_FILENAME]; + } else if(isset($props[PR_ATTACH_FILENAME])) { + $filename = $props[PR_ATTACH_FILENAME]; + } else if(isset($props[PR_DISPLAY_NAME])) { + $filename = $props[PR_DISPLAY_NAME]; + } + + // Set content type + if(isset($props[PR_ATTACH_MIME_TAG])) { + $contentType = $props[PR_ATTACH_MIME_TAG]; + } else { + // Parse the extension of the filename to get the content type + if(strrpos($filename, ".") !== false) { + $extension = strtolower(substr($filename, strrpos($filename, "."))); + $contentType = "application/octet-stream"; + if (is_readable("mimetypes.dat")){ + $fh = fopen("mimetypes.dat","r"); + $ext_found = false; + while (!feof($fh) && !$ext_found){ + $line = fgets($fh); + preg_match("/(\.[a-z0-9]+)[ \t]+([^ \t\n\r]*)/i", $line, $result); + if ($extension == $result[1]){ + $ext_found = true; + $contentType = $result[2]; + } + } + fclose($fh); + } + } + } + + + $tmpname = tempnam(TMP_PATH, stripslashes($filename)); + + // Open a stream to get the attachment data + $stream = mapi_openpropertytostream($attachment, PR_ATTACH_DATA_BIN); + $stat = mapi_stream_stat($stream); + // File length = $stat["cb"] + + $fhandle = fopen($tmpname,'w'); + $buffer = null; + for($i = 0; $i < $stat["cb"]; $i += BLOCK_SIZE) { + // Write stream + $buffer = mapi_stream_read($stream, BLOCK_SIZE); + fwrite($fhandle,$buffer,strlen($buffer)); + } + fclose($fhandle); + + $response = array(); + $response['tmpname'] = $tmpname; + $response['filename'] = $filename; + $response['status'] = true; + $this->addActionData($actionType, $response); + $GLOBALS["bus"]->addData($this->getResponseData()); + } + } + } else { + $response['status'] = false; + $response['message'] = "Store could not be opened!"; + $this->addActionData($actionType, $response); + $GLOBALS["bus"]->addData($this->getResponseData()); + } + } else { + $response['status'] = false; + $response['message'] = "Wrong call, store and entryid have to be set!"; + $this->addActionData($actionType, $response); + $GLOBALS["bus"]->addData($this->getResponseData()); + } + } }; ?>