Commit 08b80723 authored by mku's avatar mku

ZP-254 #comment Sending a email with multiple pictures results in errors when...

ZP-254 #comment Sending a email with multiple pictures results in errors when fetching the pictures on WM 7.5  #time 2h

git-svn-id: https://z-push.org/svn/z-push/trunk@1477 b7dd7b3b-3a3c-0410-9da9-bee62a6cc5b5
parent 82f0ae8d
...@@ -57,149 +57,165 @@ class ItemOperations extends RequestProcessor { ...@@ -57,149 +57,165 @@ class ItemOperations extends RequestProcessor {
if(!self::$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_ITEMOPERATIONS)) if(!self::$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_ITEMOPERATIONS))
return false; return false;
//TODO check if multiple item operations are possible in one request $itemoperations = array();
$el = self::$decoder->getElement();
if($el[EN_TYPE] != EN_TYPE_STARTTAG)
return false;
//ItemOperations can either be Fetch, EmptyFolderContents or Move //ItemOperations can either be Fetch, EmptyFolderContents or Move
$fetch = $efc = $move = false; while (1) {
if($el[EN_TAG] == SYNC_ITEMOPERATIONS_FETCH) { //TODO check if multiple item operations are possible in one request
$fetch = true; $el = self::$decoder->getElement();
self::$topCollector->AnnounceInformation("Fetch", true);
}
else if($el[EN_TAG] == SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS) {
$efc = true;
self::$topCollector->AnnounceInformation("Empty Folder", true);
}
else if($el[EN_TAG] == SYNC_ITEMOPERATIONS_MOVE) {
$move = true;
self::$topCollector->AnnounceInformation("Move", true);
}
if(!$fetch && !$efc && !$move) { if($el[EN_TYPE] != EN_TYPE_STARTTAG)
ZLog::Write(LOGLEVEL_DEBUG, "Unknown item operation:".print_r($el, 1));
self::$topCollector->AnnounceInformation("Unknown operation", true);
return false;
}
if ($fetch) {
if(!self::$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_STORE))
return false; return false;
$store = self::$decoder->getElementContent();
if(!self::$decoder->getElementEndTag())
return false;//SYNC_ITEMOPERATIONS_STORE
if(self::$decoder->getElementStartTag(SYNC_SEARCH_LONGID)) { $fetch = $efc = $move = false;
$longid = self::$decoder->getElementContent(); $operation = array();
if(!self::$decoder->getElementEndTag()) if($el[EN_TAG] == SYNC_ITEMOPERATIONS_FETCH) {
return false;//SYNC_SEARCH_LONGID $fetch = true;
$operation['operation'] = SYNC_ITEMOPERATIONS_FETCH;
self::$topCollector->AnnounceInformation("Fetch", true);
} }
else if($el[EN_TAG] == SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS) {
if(self::$decoder->getElementStartTag(SYNC_FOLDERID)) { $efc = true;
$folderid = self::$decoder->getElementContent(); $operation['operation'] = SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS;
if(!self::$decoder->getElementEndTag()) self::$topCollector->AnnounceInformation("Empty Folder", true);
return false;//SYNC_FOLDERID }
else if($el[EN_TAG] == SYNC_ITEMOPERATIONS_MOVE) {
$move = true;
$operation['operation'] = SYNC_ITEMOPERATIONS_MOVE;
self::$topCollector->AnnounceInformation("Move", true);
} }
if(self::$decoder->getElementStartTag(SYNC_SERVERENTRYID)) { if(!$fetch && !$efc && !$move) {
$serverid = self::$decoder->getElementContent(); ZLog::Write(LOGLEVEL_DEBUG, "Unknown item operation:".print_r($el, 1));
if(!self::$decoder->getElementEndTag()) self::$topCollector->AnnounceInformation("Unknown operation", true);
return false;//SYNC_SERVERENTRYID return false;
} }
if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_FILEREFERENCE)) { if ($fetch) {
$filereference = self::$decoder->getElementContent(); if(!self::$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_STORE))
return false;
$operation['store'] = self::$decoder->getElementContent();
if(!self::$decoder->getElementEndTag()) if(!self::$decoder->getElementEndTag())
return false;//SYNC_AIRSYNCBASE_FILEREFERENCE return false;//SYNC_ITEMOPERATIONS_STORE
}
if(self::$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_OPTIONS)) { if(self::$decoder->getElementStartTag(SYNC_SEARCH_LONGID)) {
//TODO other options $operation['longid'] = self::$decoder->getElementContent();
//schema if(!self::$decoder->getElementEndTag())
//range return false;//SYNC_SEARCH_LONGID
//username }
//password
//bodypartpreference if(self::$decoder->getElementStartTag(SYNC_FOLDERID)) {
//rm:RightsManagementSupport $operation['folderid'] = self::$decoder->getElementContent();
if(!self::$decoder->getElementEndTag())
// Save all OPTIONS into a ContentParameters object return false;//SYNC_FOLDERID
$collection["cpo"] = new ContentParameters(); }
while(1) {
while (self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_BODYPREFERENCE)) { if(self::$decoder->getElementStartTag(SYNC_SERVERENTRYID)) {
if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_TYPE)) { $operation['serverid'] = self::$decoder->getElementContent();
$bptype = self::$decoder->getElementContent(); if(!self::$decoder->getElementEndTag())
$collection["cpo"]->BodyPreference($bptype); return false;//SYNC_SERVERENTRYID
if(!self::$decoder->getElementEndTag()) { }
return false;
if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_FILEREFERENCE)) {
$operation['filereference'] = self::$decoder->getElementContent();
if(!self::$decoder->getElementEndTag())
return false;//SYNC_AIRSYNCBASE_FILEREFERENCE
}
if(self::$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_OPTIONS)) {
//TODO other options
//schema
//range
//username
//password
//bodypartpreference
//rm:RightsManagementSupport
// Save all OPTIONS into a ContentParameters object
$operation["cpo"] = new ContentParameters();
while(1) {
while (self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_BODYPREFERENCE)) {
if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_TYPE)) {
$bptype = self::$decoder->getElementContent();
$operation["cpo"]->BodyPreference($bptype);
if(!self::$decoder->getElementEndTag()) {
return false;
}
} }
}
if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_TRUNCATIONSIZE)) { if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_TRUNCATIONSIZE)) {
$collection["cpo"]->BodyPreference($bptype)->SetTruncationSize(self::$decoder->getElementContent()); $operation["cpo"]->BodyPreference($bptype)->SetTruncationSize(self::$decoder->getElementContent());
if(!self::$decoder->getElementEndTag()) if(!self::$decoder->getElementEndTag())
return false; return false;
} }
if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_ALLORNONE)) {
$operation["cpo"]->BodyPreference($bptype)->SetAllOrNone(self::$decoder->getElementContent());
if(!self::$decoder->getElementEndTag())
return false;
}
if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_PREVIEW)) {
$operation["cpo"]->BodyPreference($bptype)->SetPreview(self::$decoder->getElementContent());
if(!self::$decoder->getElementEndTag())
return false;
}
if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_ALLORNONE)) {
$collection["cpo"]->BodyPreference($bptype)->SetAllOrNone(self::$decoder->getElementContent());
if(!self::$decoder->getElementEndTag()) if(!self::$decoder->getElementEndTag())
return false; return false;//SYNC_AIRSYNCBASE_BODYPREFERENCE
} }
if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_PREVIEW)) { if(self::$decoder->getElementStartTag(SYNC_MIMESUPPORT)) {
$collection["cpo"]->BodyPreference($bptype)->SetPreview(self::$decoder->getElementContent()); $operation["cpo"]->SetMimeSupport(self::$decoder->getElementContent());
if(!self::$decoder->getElementEndTag()) if(!self::$decoder->getElementEndTag())
return false; return false;
} }
if(!self::$decoder->getElementEndTag()) //break if it reached the endtag
return false;//SYNC_AIRSYNCBASE_BODYPREFERENCE $e = self::$decoder->peek();
} if($e[EN_TYPE] == EN_TYPE_ENDTAG) {
self::$decoder->getElementEndTag();
if(self::$decoder->getElementStartTag(SYNC_MIMESUPPORT)) { break;
$collection["cpo"]->SetMimeSupport(self::$decoder->getElementContent()); }
if(!self::$decoder->getElementEndTag())
return false;
}
//break if it reached the endtag
$e = self::$decoder->peek();
if($e[EN_TYPE] == EN_TYPE_ENDTAG) {
self::$decoder->getElementEndTag();
break;
} }
} }
} }
}
if ($efc) { if ($efc) {
if(self::$decoder->getElementStartTag(SYNC_FOLDERID)) { if(self::$decoder->getElementStartTag(SYNC_FOLDERID)) {
$folderid = self::$decoder->getElementContent(); $operation['folderid'] = self::$decoder->getElementContent();
if(!self::$decoder->getElementEndTag()) if(!self::$decoder->getElementEndTag())
return false;//SYNC_FOLDERID return false;//SYNC_FOLDERID
} }
if(self::$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_OPTIONS)) { if(self::$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_OPTIONS)) {
if(self::$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_DELETESUBFOLDERS)) { if(self::$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_DELETESUBFOLDERS)) {
$deletesubfolders = true; $operation['deletesubfolders'] = true;
if (($dsf = self::$decoder->getElementContent()) !== false) { if (($dsf = self::$decoder->getElementContent()) !== false) {
$deletesubfolders = (boolean)$dsf; $operation['deletesubfolders'] = (boolean)$dsf;
if(!self::$decoder->getElementEndTag()) if(!self::$decoder->getElementEndTag())
return false; return false;
}
} }
self::$decoder->getElementEndTag();
} }
self::$decoder->getElementEndTag();
} }
}
//TODO EmptyFolderContents //TODO move
//TODO move
if(!self::$decoder->getElementEndTag()) if(!self::$decoder->getElementEndTag())
return false; //SYNC_ITEMOPERATIONS_FETCH or SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS or SYNC_ITEMOPERATIONS_MOVE return false; //SYNC_ITEMOPERATIONS_FETCH or SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS or SYNC_ITEMOPERATIONS_MOVE
$itemoperations[] = $operation;
//break if it reached the endtag
$e = self::$decoder->peek();
if($e[EN_TYPE] == EN_TYPE_ENDTAG) {
self::$decoder->getElementEndTag(); //SYNC_ITEMOPERATIONS_ITEMOPERATIONS
break;
}
if(!self::$decoder->getElementEndTag()) }
return false;//SYNC_ITEMOPERATIONS_ITEMOPERATIONS
// if(!self::$decoder->getElementEndTag())
// return false;//SYNC_ITEMOPERATIONS_ITEMOPERATIONS
$status = SYNC_ITEMOPERATIONSSTATUS_SUCCESS; $status = SYNC_ITEMOPERATIONSSTATUS_SUCCESS;
//TODO status handling //TODO status handling
...@@ -214,107 +230,109 @@ class ItemOperations extends RequestProcessor { ...@@ -214,107 +230,109 @@ class ItemOperations extends RequestProcessor {
self::$encoder->startTag(SYNC_ITEMOPERATIONS_RESPONSE); self::$encoder->startTag(SYNC_ITEMOPERATIONS_RESPONSE);
// fetch response foreach ($itemoperations as $operation) {
if ($fetch) { // fetch response
self::$encoder->startTag(SYNC_ITEMOPERATIONS_FETCH); if ($operation['operation'] == SYNC_ITEMOPERATIONS_FETCH) {
self::$encoder->startTag(SYNC_ITEMOPERATIONS_FETCH);
self::$encoder->startTag(SYNC_ITEMOPERATIONS_STATUS); self::$encoder->startTag(SYNC_ITEMOPERATIONS_STATUS);
self::$encoder->content($status); self::$encoder->content($status);
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_STATUS self::$encoder->endTag();//SYNC_ITEMOPERATIONS_STATUS
if (isset($folderid) && isset($serverid)) { if (isset($operation['folderid']) && isset($operation['serverid'])) {
self::$encoder->startTag(SYNC_FOLDERID); self::$encoder->startTag(SYNC_FOLDERID);
self::$encoder->content($folderid); self::$encoder->content($operation['folderid']);
self::$encoder->endTag(); // end SYNC_FOLDERID self::$encoder->endTag(); // end SYNC_FOLDERID
self::$encoder->startTag(SYNC_SERVERENTRYID); self::$encoder->startTag(SYNC_SERVERENTRYID);
self::$encoder->content($serverid); self::$encoder->content($operation['serverid']);
self::$encoder->endTag(); // end SYNC_SERVERENTRYID self::$encoder->endTag(); // end SYNC_SERVERENTRYID
self::$encoder->startTag(SYNC_FOLDERTYPE); self::$encoder->startTag(SYNC_FOLDERTYPE);
self::$encoder->content("Email"); self::$encoder->content("Email");
self::$encoder->endTag(); self::$encoder->endTag();
self::$topCollector->AnnounceInformation("Fetching data from backend with item and folder id"); self::$topCollector->AnnounceInformation("Fetching data from backend with item and folder id");
$data = self::$backend->Fetch($folderid, $serverid, $collection["cpo"]); $data = self::$backend->Fetch($operation['folderid'], $operation['serverid'], $operation["cpo"]);
} }
if (isset($longid)) { if (isset($longid)) {
self::$encoder->startTag(SYNC_SEARCH_LONGID); self::$encoder->startTag(SYNC_SEARCH_LONGID);
self::$encoder->content($longid); self::$encoder->content($operation['longid']);
self::$encoder->endTag(); // end SYNC_FOLDERID self::$encoder->endTag(); // end SYNC_FOLDERID
self::$encoder->startTag(SYNC_FOLDERTYPE); self::$encoder->startTag(SYNC_FOLDERTYPE);
self::$encoder->content("Email"); self::$encoder->content("Email");
self::$encoder->endTag(); self::$encoder->endTag();
$tmp = explode(":", $longid); $tmp = explode(":", $operation['longid']);
self::$topCollector->AnnounceInformation("Fetching data from backend with long id"); self::$topCollector->AnnounceInformation("Fetching data from backend with long id");
$data = self::$backend->Fetch($tmp[0], $tmp[1], $collection["cpo"]); $data = self::$backend->Fetch($tmp[0], $tmp[1], $operation["cpo"]);
} }
if (isset($filereference)) { if (isset($operation['filereference'])) {
self::$encoder->startTag(SYNC_AIRSYNCBASE_FILEREFERENCE); self::$encoder->startTag(SYNC_AIRSYNCBASE_FILEREFERENCE);
self::$encoder->content($filereference); self::$encoder->content($operation['filereference']);
self::$encoder->endTag(); // end SYNC_AIRSYNCBASE_FILEREFERENCE self::$encoder->endTag(); // end SYNC_AIRSYNCBASE_FILEREFERENCE
self::$topCollector->AnnounceInformation("Get attachment data from backend with file reference"); self::$topCollector->AnnounceInformation("Get attachment data from backend with file reference");
$data = self::$backend->GetAttachmentData($filereference); $data = self::$backend->GetAttachmentData($operation['filereference']);
} }
//TODO put it in try catch block //TODO put it in try catch block
if (isset($data)) { if (isset($data)) {
self::$topCollector->AnnounceInformation("Streaming data"); self::$topCollector->AnnounceInformation("Streaming data");
self::$encoder->startTag(SYNC_ITEMOPERATIONS_PROPERTIES); self::$encoder->startTag(SYNC_ITEMOPERATIONS_PROPERTIES);
$data->Encode(self::$encoder); $data->Encode(self::$encoder);
self::$encoder->endTag(); //SYNC_ITEMOPERATIONS_PROPERTIES self::$encoder->endTag(); //SYNC_ITEMOPERATIONS_PROPERTIES
}
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_FETCH
}
// empty folder contents operation
else if ($operation['operation'] == SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS) {
try {
self::$topCollector->AnnounceInformation("Emptying folder");
// send request to backend
self::$backend->EmptyFolder($operation['folderid'], $operation['deletesubfolders']);
}
catch (StatusException $stex) {
$status = $stex->getCode();
} }
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_FETCH self::$encoder->startTag(SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS);
}
// empty folder contents operation self::$encoder->startTag(SYNC_ITEMOPERATIONS_STATUS);
else if ($efc) { self::$encoder->content($status);
try { self::$encoder->endTag();//SYNC_ITEMOPERATIONS_STATUS
self::$topCollector->AnnounceInformation("Emptying folder");
// send request to backend if (isset($operation['folderid'])) {
self::$backend->EmptyFolder($folderid, $deletesubfolders); self::$encoder->startTag(SYNC_FOLDERID);
self::$encoder->content($operation['folderid']);
self::$encoder->endTag(); // end SYNC_FOLDERID
}
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS
} }
catch (StatusException $stex) { // TODO implement ItemOperations Move
$status = $stex->getCode(); // move operation
else {
self::$topCollector->AnnounceInformation("not implemented", true);
self::$encoder->startTag(SYNC_ITEMOPERATIONS_MOVE);
self::$encoder->startTag(SYNC_ITEMOPERATIONS_STATUS);
self::$encoder->content($status);
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_STATUS
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_MOVE
} }
self::$encoder->startTag(SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS);
self::$encoder->startTag(SYNC_ITEMOPERATIONS_STATUS);
self::$encoder->content($status);
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_STATUS
if (isset($folderid)) {
self::$encoder->startTag(SYNC_FOLDERID);
self::$encoder->content($folderid);
self::$encoder->endTag(); // end SYNC_FOLDERID
}
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS
} }
// TODO implement ItemOperations Move
// move operation
else {
self::$topCollector->AnnounceInformation("not implemented", true);
self::$encoder->startTag(SYNC_ITEMOPERATIONS_MOVE);
self::$encoder->startTag(SYNC_ITEMOPERATIONS_STATUS);
self::$encoder->content($status);
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_STATUS
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_MOVE
}
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_RESPONSE self::$encoder->endTag();//SYNC_ITEMOPERATIONS_RESPONSE
self::$encoder->endTag();//SYNC_ITEMOPERATIONS_ITEMOPERATIONS self::$encoder->endTag();//SYNC_ITEMOPERATIONS_ITEMOPERATIONS
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment