From 1bb1f956d01e3e34c1a620658a6adcb57ebe942e Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Sun, 23 Jun 2013 10:13:22 +0000 Subject: [PATCH] calendarimporter 2.0.3: - fixed all day eventsvcf importer pre alpha. Import working but contact pictures are not saved. TODO: rewrite import functionality in php --- js/dialogs/ImportPanel.js | 9 ++-- php/module.contact.php | 108 ++++++++++++++++++++++++++++++-------- 2 files changed, 90 insertions(+), 27 deletions(-) diff --git a/js/dialogs/ImportPanel.js b/js/dialogs/ImportPanel.js index bbea271..496e6ce 100644 --- a/js/dialogs/ImportPanel.js +++ b/js/dialogs/ImportPanel.js @@ -500,13 +500,10 @@ Zarafa.plugins.contactimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, { * Store the attachment/contact pictures */ storeImages : function (store, action, result, res, records) { - - var attachStores = new Array(); Ext.each(records, function(record) { - var attachstore = record.createAttachmentStore(); + record.createAttachmentStore(); record.save(); - attachStores[attachstore.getId()] = attachstore; var responseHandler = new Zarafa.plugins.contactimporter.data.ResponseHandler({ successCallback: function (response) { @@ -532,8 +529,8 @@ Zarafa.plugins.contactimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, { 'contactmodule', 'addattachment', { - storeid: attachstore.getId(), - entryid: record.id, + storeid: record.get("store_entryid"), + entryid: record.get("entryid"), tmpfile: record.get("x_photo_path") }, responseHandler diff --git a/php/module.contact.php b/php/module.contact.php index 00e5939..f408355 100644 --- a/php/module.contact.php +++ b/php/module.contact.php @@ -22,6 +22,7 @@ */ include_once('vcf/class.vCard.php'); +require_once('mapi/mapitags.php' ); class ContactModule extends Module { @@ -136,32 +137,97 @@ class ContactModule extends Module { * @param $actionData */ private function addAttachment($actionType, $actionData) { - // Get Attachment data from state - $attachment_state = new AttachmentState(); - $attachment_state->open(); + - $filename = "ContactPicture.jpg"; - $tmppath = $actionData["tmpfile"]; - $filesize = filesize($tmppath); - $f = getimagesize($tmppath); - $filetype = $f["mime"]; - // Move the uploaded file into the attachment state - $attachid = $attachment_state->addProvidedAttachmentFile($actionData["storeid"], $filename, $tmppath, array( - "name" => $filename, - "size" => $filesize, - "type" => $filetype, - "sourcetype" => 'default' - )); + // Get store id + $storeid = false; + if(isset($actionData["storeid"])) { + $storeid = $actionData["storeid"]; + } + + // Get message entryid + $entryid = false; + if(isset($actionData["entryid"])) { + $entryid = $actionData["entryid"]; + } - $attachment_state->close(); + $tmpimage = $actionData["tmpfile"]; + $contactPicture = file_get_contents ($tmpimage); + + error_log($tmpdata); + + + error_log("opening store"); + $store = $GLOBALS["mapisession"]->openMessageStore(hex2bin($storeid)); + + error_log("opening message"); + // Open a message from the store + try { + $message = mapi_msgstore_openentry($store, hex2bin($entryid)); + } catch (MAPIException $e) { + $e->setHandled(); + error_log($e->getCode()); + error_log(mapi_last_hresult()); + } + + error_log("opening attachment"); + // Open attachment number 0 + $attach = mapi_message_createattach($message); + + // Set properties of the attachment + $properties = array( + //PR_ATTACH_SIZE => strlen($contactPicture), + PR_ATTACH_LONG_FILENAME => 'ContactPicture.jpg', + PR_ATTACHMENT_HIDDEN => false, + PR_DISPLAY_NAME => 'ContactPicture.jpg', + PR_ATTACH_METHOD => ATTACH_BY_VALUE, + PR_ATTACH_MIME_TAG => 'image/jpeg', + PR_ATTACHMENT_CONTACTPHOTO => true, + PR_ATTACH_DATA_BIN => "", + PR_ATTACHMENT_FLAGS => 1, + PR_ATTACH_EXTENSION_A => '.jpg', + PR_ATTACH_NUM => 1 + ); + + error_log("setting props"); + mapi_setprops($attach, $properties); + + // Stream the file to the PR_ATTACH_DATA_BIN property + error_log("streaming file"); + $stream = mapi_openproperty($attach, PR_ATTACH_DATA_BIN, IID_IStream, 0, MAPI_CREATE | MAPI_MODIFY); + $handle = fopen($tmpimage, "r"); + while (!feof($handle)) { + $contents = fread($handle, BLOCK_SIZE); + mapi_stream_write($stream, $contents); + } + + // Commit the stream and save changes + mapi_stream_commit($stream); + + error_log("saving attachment"); + mapi_savechanges($attach); + + if (mapi_last_hresult() > 0) { + error_log("Error saving attach to contact: " . get_mapi_error_name()); + } + + error_log("saving message"); + mapi_savechanges($message); + + if (mapi_last_hresult() > 0) { + error_log("Error saving contact: " . get_mapi_error_name()); + } + + // Open attachment number 0 + error_log("final tests attachment"); + $testattach = mapi_message_openattach ($message, 0); + error_log(print_r(mapi_attach_getprops($testattach),true)); + $response['status'] = true; - $response['storeid'] = $actionData["storeid"]; - $response['tmpname'] = $attachid; - $response['name'] = $filename; - $response['size'] = $filesize; - $response['type'] = $filetype; + $response['storeid'] = $storeid; + $response['entryid'] = $entryid; $this->addActionData($actionType, $response); $GLOBALS["bus"]->addData($this->getResponseData());