예제 #1
0
function HandleMeetingResponse($backend, $protocolversion)
{
    global $zpushdtd;
    global $output, $input;
    $response = false;
    $folderid = false;
    $requestid = false;
    $decoder = new WBXMLDecoder($input, $zpushdtd);
    $encoder = new WBXMLEncoder($output, $zpushdtd);
    if (!$decoder->getElementStartTag(SYNC_MEETINGRESPONSE_MEETINGRESPONSE)) {
        return false;
    }
    if (!$decoder->getElementStartTag(SYNC_MEETINGRESPONSE_REQUEST)) {
        return false;
    }
    if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_USERRESPONSE)) {
        $response = $decoder->getElementContent();
        if (!$decoder->getElementEndTag()) {
            return false;
        }
    }
    if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_FOLDERID)) {
        $folderid = $decoder->getElementContent();
        if (!$decoder->getElementEndTag()) {
            return false;
        }
    }
    if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_REQUESTID)) {
        $requestid = $decoder->getElementContent();
        if (!$decoder->getElementEndTag()) {
            return false;
        }
    }
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    $calendarid = "";
    $ok = $backend->MeetingResponse($requestid, $folderid, $response, $calendarid);
    // Start output, simply the error code
    $encoder->StartWBXML();
    $encoder->startTag(SYNC_MEETINGRESPONSE_MEETINGRESPONSE);
    $encoder->startTag(SYNC_MEETINGRESPONSE_RESULT);
    $encoder->startTag(SYNC_MEETINGRESPONSE_REQUESTID);
    $encoder->content($requestid);
    $encoder->endTag();
    $encoder->startTag(SYNC_MEETINGRESPONSE_ERROR);
    $encoder->content($ok ? 1 : 2);
    $encoder->endTag();
    if ($ok) {
        $encoder->startTag(SYNC_MEETINGRESPONSE_CALENDARID);
        $encoder->content($calendarid);
        $encoder->endTag();
    }
    $encoder->endTag();
    $encoder->endTag();
    return true;
}
예제 #2
0
function HandleSearch($backend, $devid, $protocolversion)
{
    global $zpushdtd;
    global $input, $output;
    $searchrange = '0';
    $decoder = new WBXMLDecoder($input, $zpushdtd);
    $encoder = new WBXMLEncoder($output, $zpushdtd);
    if (!$decoder->getElementStartTag(SYNC_SEARCH_SEARCH)) {
        return false;
    }
    if (!$decoder->getElementStartTag(SYNC_SEARCH_STORE)) {
        return false;
    }
    if (!$decoder->getElementStartTag(SYNC_SEARCH_NAME)) {
        return false;
    }
    $searchname = $decoder->getElementContent();
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    if (!$decoder->getElementStartTag(SYNC_SEARCH_QUERY)) {
        return false;
    }
    $searchquery = $decoder->getElementContent();
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    if ($decoder->getElementStartTag(SYNC_SEARCH_OPTIONS)) {
        while (1) {
            if ($decoder->getElementStartTag(SYNC_SEARCH_RANGE)) {
                $searchrange = $decoder->getElementContent();
                if (!$decoder->getElementEndTag()) {
                    return false;
                }
            }
            $e = $decoder->peek();
            if ($e[EN_TYPE] == EN_TYPE_ENDTAG) {
                $decoder->getElementEndTag();
                break;
            }
        }
        //if(!$decoder->getElementEndTag())
        //return false;
    }
    if (!$decoder->getElementEndTag()) {
        //store
        return false;
    }
    if (!$decoder->getElementEndTag()) {
        //search
        return false;
    }
    if (strtoupper($searchname) != "GAL") {
        debugLog("Searchtype {$searchname} is not supported");
        return false;
    }
    //get search results from backend
    $rows = $backend->getSearchResults($searchquery, $searchrange);
    $encoder->startWBXML();
    $encoder->startTag(SYNC_SEARCH_SEARCH);
    $encoder->startTag(SYNC_SEARCH_STATUS);
    $encoder->content(1);
    $encoder->endTag();
    $encoder->startTag(SYNC_SEARCH_RESPONSE);
    $encoder->startTag(SYNC_SEARCH_STORE);
    $encoder->startTag(SYNC_SEARCH_STATUS);
    $encoder->content(1);
    $encoder->endTag();
    if (is_array($rows) && !empty($rows)) {
        $searchrange = $rows['range'];
        unset($rows['range']);
        foreach ($rows as $u) {
            $encoder->startTag(SYNC_SEARCH_RESULT);
            $encoder->startTag(SYNC_SEARCH_PROPERTIES);
            $encoder->startTag(SYNC_GAL_DISPLAYNAME);
            $encoder->content($u["fullname"]);
            $encoder->endTag();
            $encoder->startTag(SYNC_GAL_PHONE);
            $encoder->content($u["businessphone"]);
            $encoder->endTag();
            $encoder->startTag(SYNC_GAL_ALIAS);
            $encoder->content($u["username"]);
            $encoder->endTag();
            //it's not possible not get first and last name of an user
            //from the gab and user functions, so we just set fullname
            //to lastname and leave firstname empty because nokia needs
            //first and lastname in order to display the search result
            $encoder->startTag(SYNC_GAL_FIRSTNAME);
            $encoder->content("");
            $encoder->endTag();
            $encoder->startTag(SYNC_GAL_LASTNAME);
            $encoder->content($u["fullname"]);
            $encoder->endTag();
            $encoder->startTag(SYNC_GAL_EMAILADDRESS);
            $encoder->content($u["emailaddress"]);
            $encoder->endTag();
            $encoder->endTag();
            //result
            $encoder->endTag();
            //properties
        }
        $encoder->startTag(SYNC_SEARCH_RANGE);
        $encoder->content($searchrange);
        $encoder->endTag();
        $encoder->startTag(SYNC_SEARCH_TOTAL);
        $encoder->content(count($rows));
        $encoder->endTag();
    }
    $encoder->endTag();
    //store
    $encoder->endTag();
    //response
    $encoder->endTag();
    //search
    return true;
}
예제 #3
0
function HandleResolveRecipients($backend, $devid, $protocolversion)
{
    global $zpushdtd;
    global $input, $output;
    //	define ('OVERRIDE_GZIP',true);
    $decoder = new WBXMLDecoder($input, $zpushdtd);
    $encoder = new WBXMLEncoder($output, $zpushdtd);
    if (!$decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_RESOLVERECIPIENTS)) {
        return false;
    }
    $status = 1;
    while ($status == 1 && ($field = $decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_TO) ? SYNC_RESOLVERECIPIENTS_TO : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_OPTIONS) ? SYNC_RESOLVERECIPIENTS_OPTIONS : -1)) != -1) {
        if ($field == SYNC_RESOLVERECIPIENTS_OPTIONS) {
            while ($status == 1 && ($option = $decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL) ? SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_MAXCERTIFICATES) ? SYNC_RESOLVERECIPIENTS_MAXCERTIFICATES : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_MAXAMBIGUOUSRECIPIENTS) ? SYNC_RESOLVERECIPIENTS_MAXAMBIGUOUSRECIPIENTS : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_AVAILABILITY) ? SYNC_RESOLVERECIPIENTS_AVAILABILITY : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_PICTURE) ? SYNC_RESOLVERECIPIENTS_PICTURE : -1))))) != -1) {
                switch ($option) {
                    case SYNC_RESOLVERECIPIENTS_AVAILABILITY:
                        while (($suboption = $decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_STARTTIME) ? SYNC_RESOLVERECIPIENTS_STARTTIME : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_ENDTIME) ? SYNC_RESOLVERECIPIENTS_ENDTIME : -1)) != -1) {
                            $ts = $decoder->getElementContent();
                            if (preg_match("/(\\d{4})[^0-9]*(\\d{2})[^0-9]*(\\d{2})T(\\d{2})[^0-9]*(\\d{2})[^0-9]*(\\d{2})(.\\d+)?Z/", $ts, $matches)) {
                                if ($matches[1] >= 2038) {
                                    $matches[1] = 2038;
                                    $matches[2] = 1;
                                    $matches[3] = 18;
                                    $matches[4] = $matches[5] = $matches[6] = 0;
                                }
                                $ts = gmmktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
                            } else {
                                $ts = 0;
                            }
                            $options[$option][$suboption] = $ts;
                            if (!$decoder->getElementEndTag()) {
                                $status = 5;
                            }
                        }
                        if (!$decoder->getElementEndTag()) {
                            $status = 5;
                        }
                        break;
                    case SYNC_RESOLVERECIPIENTS_PICTURE:
                        while (($suboption = $decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_MAXSIZE) ? SYNC_RESOLVERECIPIENTS_MAXSIZE : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_MAXPICTURES) ? SYNC_RESOLVERECIPIENTS_MAXPICTURES : -1)) != -1) {
                            $options[$option][$suboption] = $decoder->getElementContent();
                            if (!$decoder->getElementEndTag()) {
                                $status = 5;
                            }
                        }
                        if (!$decoder->getElementEndTag()) {
                            $status = 5;
                        }
                        break;
                    default:
                        $options[$option] = $decoder->getElementContent();
                        if (!$decoder->getElementEndTag()) {
                            $status = 5;
                        }
                }
            }
            if (!$decoder->getElementEndTag()) {
                $status = 5;
            }
        } else {
            if ($field == SYNC_RESOLVERECIPIENTS_TO) {
                $to[] = $decoder->getElementContent();
                if (!$decoder->getElementEndTag()) {
                    $status = 5;
                }
            }
        }
    }
    $results = '';
    foreach ($to as $item) {
        if (isset($options[SYNC_RESOLVERECIPIENTS_AVAILABILITY])) {
            $result = $backend->resolveRecipient('availability', $item, array('starttime' => $options[SYNC_RESOLVERECIPIENTS_AVAILABILITY][SYNC_RESOLVERECIPIENTS_STARTTIME], 'endtime' => $options[SYNC_RESOLVERECIPIENTS_AVAILABILITY][SYNC_RESOLVERECIPIENTS_ENDTIME]));
            $results[$item] = $result[$item];
        }
        if (isset($options[SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL])) {
            $result = $backend->resolveRecipient('certificate', $item, array('maxcerts' => $options[SYNC_RESOLVERECIPIENTS_MAXCERTIFICATES], 'maxambigious' => $options[SYNC_RESOLVERECIPIENTS_MAXAMBIGUOUSRECIPIENTS]));
            $results[$item] = $result[$item];
        }
    }
    debugLog("Results returned" . print_r($results, true));
    $encoder->startWBXML();
    $encoder->startTag(SYNC_RESOLVERECIPIENTS_RESOLVERECIPIENTS);
    $encoder->startTag(SYNC_RESOLVERECIPIENTS_STATUS);
    $encoder->content($status);
    $encoder->endTag();
    // end SYNC_RESOLVERECIPIENTS_STATUS
    foreach ($to as $item) {
        $encoder->startTag(SYNC_RESOLVERECIPIENTS_RESPONSE);
        $encoder->startTag(SYNC_RESOLVERECIPIENTS_TO);
        $encoder->content($item);
        $encoder->endTag();
        // end SYNC_RESOLVERECIPIENTS_TO
        $encoder->startTag(SYNC_RESOLVERECIPIENTS_STATUS);
        $encoder->content(sizeof($results[$item]) > 1 ? 2 : (sizeof($results[$item]) == 0 ? 4 : (sizeof($results[$item]) == 1 ? 1 : 3)));
        $encoder->endTag();
        // end SYNC_RESOLVERECIPIENTS_STATUS
        $encoder->startTag(SYNC_RESOLVERECIPIENTS_RECIPIENTCOUNT);
        $encoder->content(sizeof($results[$item]));
        $encoder->endTag();
        // end SYNC_RESOLVERECIPIENTS_RECIPIENTCOUNT
        foreach ($results[$item] as $value) {
            $encoder->startTag(SYNC_RESOLVERECIPIENTS_RECIPIENT);
            $encoder->startTag(SYNC_RESOLVERECIPIENTS_TYPE);
            $encoder->content($value['type']);
            $encoder->endTag();
            // end SYNC_RESOLVERECIPIENTS_TYPE
            $encoder->startTag(SYNC_RESOLVERECIPIENTS_DISPLAYNAME);
            $encoder->content($value['displayname']);
            $encoder->endTag();
            // end SYNC_RESOLVERECIPIENTS_DISPLAYNAME
            $encoder->startTag(SYNC_RESOLVERECIPIENTS_EMAILADDRESS);
            $encoder->content($value['emailaddress']);
            $encoder->endTag();
            // end SYNC_RESOLVERECIPIENTS_EMAILADDRESS
            if (isset($options[SYNC_RESOLVERECIPIENTS_AVAILABILITY])) {
                $encoder->startTag(SYNC_RESOLVERECIPIENTS_AVAILABILITY);
                $encoder->startTag(SYNC_RESOLVERECIPIENTS_STATUS);
                $encoder->content(1);
                $encoder->endTag();
                // end SYNC_RESOLVERECIPIENTS_STATUS
                $encoder->startTag(SYNC_RESOLVERECIPIENTS_MERGEDFREEBUSY);
                $encoder->content($value['mergedfb']);
                $encoder->endTag();
                // end SYNC_RESOLVERECIPIENTS_MERGEDFREEBUSY
                $encoder->endTag();
                // end SYNC_RESOLVERECIPIENTS_AVAILABILITY
            }
            if (isset($options[SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL]) && $options[SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL] > 1) {
                $encoder->startTag(SYNC_RESOLVERECIPIENTS_CERTIFICATES);
                $encoder->startTag(SYNC_RESOLVERECIPIENTS_STATUS);
                $encoder->content(sizeof($value['entries']) == 0 ? 7 : 1);
                $encoder->endTag();
                // end SYNC_RESOLVERECIPIENTS_STATUS
                $encoder->startTag(SYNC_RESOLVERECIPIENTS_CERTIFICATECOUNT);
                $encoder->content(sizeof($value['entries']));
                $encoder->endTag();
                // end SYNC_RESOLVERECIPIENTS_CERTIFICATECOUNT
                $encoder->startTag(SYNC_RESOLVERECIPIENTS_RECIPIENTCOUNT);
                $encoder->content(sizeof($results[$item]));
                $encoder->endTag();
                // end SYNC_RESOLVERECIPIENTS_RECIPIENTCOUNT
                switch ($options[SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL]) {
                    case '2':
                        foreach ($value['entries'] as $cert) {
                            $encoder->startTag(SYNC_RESOLVERECIPIENTS_CERTIFICATE);
                            $encoder->content($cert);
                            $encoder->endTag();
                            // end SYNC_RESOLVERECIPIENTS_CERTIFICATE
                        }
                        break;
                    case '3':
                        foreach ($value['entries'] as $cert) {
                            $encoder->startTag(SYNC_RESOLVERECIPIENTS_MINICERTIFICATE);
                            $encoder->content($cert);
                            $encoder->endTag();
                            // end SYNC_RESOLVERECIPIENTS_MINICERTIFICATE
                        }
                        break;
                }
                $encoder->endTag();
                // end SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL
            }
            /*		if (isset($item['options'][SYNC_RESOLVERECIPIENTS_PICTURE])) {
            			$encoder->startTag(SYNC_RESOLVERECIPIENTS_PICTURE);
            			$encoder->startTag(SYNC_RESOLVERECIPIENTS_STATUS);
            		    $encoder->content();
            		 	$encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_STATUS
            			$encoder->startTag(SYNC_RESOLVERECIPIENTS_DATA);
            		    $encoder->content();
            		 	$encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_DATA
            		    $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_PICTURE
            		}
            */
            $encoder->endTag();
            // end SYNC_RESOLVERECIPIENTS_RECIPIENT
        }
        $encoder->endTag();
        // end SYNC_RESOLVERECIPIENTS_RESPONSE
    }
    $encoder->endTag();
    // end SYNC_RESOLVERECIPIENTS_RESOLVERECIPIENTS
    return true;
}
예제 #4
0
 /**
  * Encodes this object and any subobjects - output is ordered according to mapping
  *
  * @param WBXMLEncoder  $encoder
  *
  * @access public
  */
 public function Encode(&$encoder)
 {
     // A return value if anything was streamed. We need for empty tags.
     $streamed = false;
     foreach ($this->mapping as $tag => $map) {
         if (isset($this->{$map}[self::STREAMER_VAR])) {
             // Variable is available
             if (is_object($this->{$map}[self::STREAMER_VAR])) {
                 // Subobjects can do their own encoding
                 if ($this->{$map}[self::STREAMER_VAR] instanceof Streamer) {
                     $encoder->startTag($tag);
                     $res = $this->{$map}[self::STREAMER_VAR]->Encode($encoder);
                     $encoder->endTag();
                     // nothing was streamed in previous encode but it should be streamed empty anyway
                     if (!$res && isset($map[self::STREAMER_PROP]) && $map[self::STREAMER_PROP] == self::STREAMER_TYPE_SEND_EMPTY) {
                         $encoder->startTag($tag, false, true);
                     }
                 } else {
                     ZLog::Write(LOGLEVEL_ERROR, sprintf("Streamer->Encode(): parameter '%s' of object %s is not of type Streamer", $map[self::STREAMER_VAR], get_class($this)));
                 }
             } else {
                 if (isset($map[self::STREAMER_ARRAY])) {
                     if (empty($this->{$map}[self::STREAMER_VAR]) && isset($map[self::STREAMER_PROP]) && $map[self::STREAMER_PROP] == self::STREAMER_TYPE_SEND_EMPTY) {
                         $encoder->startTag($tag, false, true);
                     } else {
                         // Outputs array container (eg Attachments)
                         // Do not output start and end tag when type is STREAMER_TYPE_NO_CONTAINER
                         if (!isset($map[self::STREAMER_PROP]) || $map[self::STREAMER_PROP] != self::STREAMER_TYPE_NO_CONTAINER) {
                             $encoder->startTag($tag);
                         }
                         foreach ($this->{$map}[self::STREAMER_VAR] as $element) {
                             if (is_object($element)) {
                                 $encoder->startTag($map[self::STREAMER_ARRAY]);
                                 // Outputs object container (eg Attachment)
                                 $element->Encode($encoder);
                                 $encoder->endTag();
                             } else {
                                 if (strlen($element) == 0) {
                                     // Do not output empty items. Not sure if we should output an empty tag with $encoder->startTag($map[self::STREAMER_ARRAY], false, true);
                                 } else {
                                     $encoder->startTag($map[self::STREAMER_ARRAY]);
                                     $encoder->content($element);
                                     $encoder->endTag();
                                     $streamed = true;
                                 }
                             }
                         }
                         if (!isset($map[self::STREAMER_PROP]) || $map[self::STREAMER_PROP] != self::STREAMER_TYPE_NO_CONTAINER) {
                             $encoder->endTag();
                         }
                     }
                 } else {
                     if (isset($map[self::STREAMER_TYPE]) && $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_IGNORE) {
                         continue;
                     }
                     if ($encoder->getMultipart() && isset($map[self::STREAMER_PROP]) && $map[self::STREAMER_PROP] == self::STREAMER_TYPE_MULTIPART) {
                         $encoder->addBodypartStream($this->{$map}[self::STREAMER_VAR]);
                         $encoder->startTag(SYNC_ITEMOPERATIONS_PART);
                         $encoder->content(count($encoder->getBodypartsCount()));
                         $encoder->endTag();
                         continue;
                     }
                     // Simple type
                     if (!isset($map[self::STREAMER_TYPE]) && strlen($this->{$map}[self::STREAMER_VAR]) == 0) {
                         // send empty tags
                         if (isset($map[self::STREAMER_PROP]) && $map[self::STREAMER_PROP] == self::STREAMER_TYPE_SEND_EMPTY) {
                             $encoder->startTag($tag, false, true);
                         }
                         // Do not output empty items. See above: $encoder->startTag($tag, false, true);
                         continue;
                     } else {
                         $encoder->startTag($tag);
                     }
                     if (isset($map[self::STREAMER_TYPE]) && ($map[self::STREAMER_TYPE] == self::STREAMER_TYPE_DATE || $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_DATE_DASHES)) {
                         if ($this->{$map}[self::STREAMER_VAR] != 0) {
                             // don't output 1-1-1970
                             $encoder->content($this->formatDate($this->{$map}[self::STREAMER_VAR], $map[self::STREAMER_TYPE]));
                         }
                     } else {
                         if (isset($map[self::STREAMER_TYPE]) && $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_HEX) {
                             $encoder->content(strtoupper(bin2hex($this->{$map}[self::STREAMER_VAR])));
                         } else {
                             if (isset($map[self::STREAMER_TYPE]) && $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_STREAM) {
                                 //encode stream with base64
                                 $stream = $this->{$map}[self::STREAMER_VAR];
                                 $stat = fstat($stream);
                                 // the padding size muss be calculated for the entire stream,
                                 // the base64 filter seems to process 8192 byte chunks correctly itself
                                 $padding = isset($stat['size']) && $stat['size'] > 8192 ? $stat['size'] % 3 : 0;
                                 $paddingfilter = stream_filter_append($stream, 'padding.' . $padding);
                                 $base64filter = stream_filter_append($stream, 'convert.base64-encode');
                                 $d = "";
                                 while (!feof($stream)) {
                                     $d .= fgets($stream, 4096);
                                 }
                                 $encoder->content($d);
                                 stream_filter_remove($base64filter);
                                 stream_filter_remove($paddingfilter);
                             } else {
                                 if (isset($map[self::STREAMER_TYPE]) && is_array($this->{$map}[self::STREAMER_VAR]) && ($map[self::STREAMER_TYPE] == self::STREAMER_TYPE_COMMA_SEPARATED || $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_SEMICOLON_SEPARATED)) {
                                     $glue = $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_COMMA_SEPARATED ? ", " : "; ";
                                     $encoder->content(implode($glue, $this->{$map}[self::STREAMER_VAR]));
                                 } else {
                                     $encoder->content($this->{$map}[self::STREAMER_VAR]);
                                 }
                             }
                         }
                     }
                     $encoder->endTag();
                     $streamed = true;
                 }
             }
         }
     }
     // Output our own content
     if (isset($this->content)) {
         $encoder->content($this->content);
     }
     return $streamed;
 }
예제 #5
0
function HandleMeetingResponse($backend, $protocolversion)
{
    global $zpushdtd;
    global $output, $input;
    $requests = array();
    $decoder = new WBXMLDecoder($input, $zpushdtd);
    $encoder = new WBXMLEncoder($output, $zpushdtd);
    if (!$decoder->getElementStartTag(SYNC_MEETINGRESPONSE_MEETINGRESPONSE)) {
        return false;
    }
    while ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_REQUEST)) {
        $req = array();
        if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_USERRESPONSE)) {
            $req["response"] = $decoder->getElementContent();
            if (!$decoder->getElementEndTag()) {
                return false;
            }
        }
        if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_FOLDERID)) {
            $req["folderid"] = $decoder->getElementContent();
            if (!$decoder->getElementEndTag()) {
                return false;
            }
        }
        if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_REQUESTID)) {
            $req["requestid"] = $decoder->getElementContent();
            if (!$decoder->getElementEndTag()) {
                return false;
            }
        }
        if (!$decoder->getElementEndTag()) {
            return false;
        }
        array_push($requests, $req);
    }
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    // Start output, simply the error code, plus the ID of the calendar item that was generated by the
    // accept of the meeting response
    $encoder->StartWBXML();
    $encoder->startTag(SYNC_MEETINGRESPONSE_MEETINGRESPONSE);
    foreach ($requests as $req) {
        $calendarid = "";
        $ok = $backend->MeetingResponse($req["requestid"], $req["folderid"], $req["response"], $calendarid);
        $encoder->startTag(SYNC_MEETINGRESPONSE_RESULT);
        $encoder->startTag(SYNC_MEETINGRESPONSE_REQUESTID);
        $encoder->content($req["requestid"]);
        $encoder->endTag();
        $encoder->startTag(SYNC_MEETINGRESPONSE_ERROR);
        $encoder->content($ok ? 1 : 2);
        $encoder->endTag();
        if ($ok) {
            $encoder->startTag(SYNC_MEETINGRESPONSE_CALENDARID);
            $encoder->content($calendarid);
            $encoder->endTag();
        }
        $encoder->endTag();
    }
    $encoder->endTag();
    return true;
}
예제 #6
0
파일: request.php 프로젝트: nnaannoo/paskot
function HandleSearch($backend, $devid, $protocolversion)
{
    global $zpushdtd;
    global $input, $output;
    $searchrange = '0';
    $decoder = new WBXMLDecoder($input, $zpushdtd);
    $encoder = new WBXMLEncoder($output, $zpushdtd);
    if (!$decoder->getElementStartTag(SYNC_SEARCH_SEARCH)) {
        return false;
    }
    if (!$decoder->getElementStartTag(SYNC_SEARCH_STORE)) {
        return false;
    }
    if (!$decoder->getElementStartTag(SYNC_SEARCH_NAME)) {
        return false;
    }
    $searchname = $decoder->getElementContent();
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    if (!$decoder->getElementStartTag(SYNC_SEARCH_QUERY)) {
        return false;
    }
    $searchquery = $decoder->getElementContent();
    if (!$decoder->getElementEndTag()) {
        return false;
    }
    if ($decoder->getElementStartTag(SYNC_SEARCH_OPTIONS)) {
        while (1) {
            if ($decoder->getElementStartTag(SYNC_SEARCH_RANGE)) {
                $searchrange = $decoder->getElementContent();
                if (!$decoder->getElementEndTag()) {
                    return false;
                }
            }
            $e = $decoder->peek();
            if ($e[EN_TYPE] == EN_TYPE_ENDTAG) {
                $decoder->getElementEndTag();
                break;
            }
        }
        //if(!$decoder->getElementEndTag())
        //return false;
    }
    if (!$decoder->getElementEndTag()) {
        //store
        return false;
    }
    if (!$decoder->getElementEndTag()) {
        //search
        return false;
    }
    if (strtoupper($searchname) != "GAL") {
        debugLog("Searchtype {$searchname} is not supported");
        return false;
    }
    //get search results from backend
    if (defined('SEARCH_PROVIDER') && @constant('SEARCH_PROVIDER') != "" && class_exists(SEARCH_PROVIDER)) {
        $searchClass = constant('SEARCH_PROVIDER');
        $searchbackend = new $searchClass();
        $searchbackend->initialize($backend);
        $rows = $searchbackend->getSearchResults($searchquery, $searchrange);
        $searchbackend->disconnect();
    } else {
        $rows = $backend->getSearchResults($searchquery, $searchrange);
    }
    $encoder->startWBXML();
    $encoder->startTag(SYNC_SEARCH_SEARCH);
    $encoder->startTag(SYNC_SEARCH_STATUS);
    $encoder->content(1);
    $encoder->endTag();
    $encoder->startTag(SYNC_SEARCH_RESPONSE);
    $encoder->startTag(SYNC_SEARCH_STORE);
    $encoder->startTag(SYNC_SEARCH_STATUS);
    $encoder->content(1);
    $encoder->endTag();
    if (is_array($rows) && !empty($rows)) {
        $searchrange = $rows['range'];
        unset($rows['range']);
        $searchtotal = $rows['searchtotal'];
        unset($rows['searchtotal']);
        foreach ($rows as $u) {
            $encoder->startTag(SYNC_SEARCH_RESULT);
            $encoder->startTag(SYNC_SEARCH_PROPERTIES);
            $encoder->startTag(SYNC_GAL_DISPLAYNAME);
            $encoder->content(isset($u[SYNC_GAL_DISPLAYNAME]) ? $u[SYNC_GAL_DISPLAYNAME] : "No name");
            $encoder->endTag();
            if (isset($u[SYNC_GAL_PHONE])) {
                $encoder->startTag(SYNC_GAL_PHONE);
                $encoder->content($u[SYNC_GAL_PHONE]);
                $encoder->endTag();
            }
            if (isset($u[SYNC_GAL_OFFICE])) {
                $encoder->startTag(SYNC_GAL_OFFICE);
                $encoder->content($u[SYNC_GAL_OFFICE]);
                $encoder->endTag();
            }
            if (isset($u[SYNC_GAL_TITLE])) {
                $encoder->startTag(SYNC_GAL_TITLE);
                $encoder->content($u[SYNC_GAL_TITLE]);
                $encoder->endTag();
            }
            if (isset($u[SYNC_GAL_COMPANY])) {
                $encoder->startTag(SYNC_GAL_COMPANY);
                $encoder->content($u[SYNC_GAL_COMPANY]);
                $encoder->endTag();
            }
            if (isset($u[SYNC_GAL_ALIAS])) {
                $encoder->startTag(SYNC_GAL_ALIAS);
                $encoder->content($u[SYNC_GAL_ALIAS]);
                $encoder->endTag();
            }
            // Always send the firstname, even empty. Nokia needs this to display the entry
            $encoder->startTag(SYNC_GAL_FIRSTNAME);
            $encoder->content(isset($u[SYNC_GAL_FIRSTNAME]) ? $u[SYNC_GAL_FIRSTNAME] : "");
            $encoder->endTag();
            $encoder->startTag(SYNC_GAL_LASTNAME);
            $encoder->content(isset($u[SYNC_GAL_LASTNAME]) ? $u[SYNC_GAL_LASTNAME] : "No name");
            $encoder->endTag();
            if (isset($u[SYNC_GAL_HOMEPHONE])) {
                $encoder->startTag(SYNC_GAL_HOMEPHONE);
                $encoder->content($u[SYNC_GAL_HOMEPHONE]);
                $encoder->endTag();
            }
            if (isset($u[SYNC_GAL_MOBILEPHONE])) {
                $encoder->startTag(SYNC_GAL_MOBILEPHONE);
                $encoder->content($u[SYNC_GAL_MOBILEPHONE]);
                $encoder->endTag();
            }
            $encoder->startTag(SYNC_GAL_EMAILADDRESS);
            $encoder->content(isset($u[SYNC_GAL_EMAILADDRESS]) ? $u[SYNC_GAL_EMAILADDRESS] : "");
            $encoder->endTag();
            $encoder->endTag();
            //result
            $encoder->endTag();
            //properties
        }
        if ($searchtotal > 0) {
            $encoder->startTag(SYNC_SEARCH_RANGE);
            $encoder->content($searchrange);
            $encoder->endTag();
            $encoder->startTag(SYNC_SEARCH_TOTAL);
            $encoder->content($searchtotal);
            $encoder->endTag();
        }
    }
    $encoder->endTag();
    //store
    $encoder->endTag();
    //response
    $encoder->endTag();
    //search
    return true;
}
예제 #7
0
function HandleItemOperations($backend, $devid, $protocolversion, $multipart)
{
    global $zpushdtd;
    global $input, $output;
    global $auth_user, $auth_domain, $auth_pw;
    $decoder = new WBXMLDecoder($input, $zpushdtd);
    $encoder = new WBXMLEncoder($output, $zpushdtd);
    if (!$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_ITEMOPERATIONS)) {
        return false;
    }
    $request = array();
    while (($reqtype = $decoder->getElementStartTag(SYNC_ITEMOPERATIONS_FETCH) ? SYNC_ITEMOPERATIONS_FETCH : ($decoder->getElementStartTag(SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENT) ? SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS : -1)) != -1) {
        if ($reqtype == SYNC_ITEMOPERATIONS_FETCH) {
            $thisio["type"] = "fetch";
            while (($reqtag = $decoder->getElementStartTag(SYNC_ITEMOPERATIONS_STORE) ? SYNC_ITEMOPERATIONS_STORE : ($decoder->getElementStartTag(SYNC_ITEMOPERATIONS_OPTIONS) ? SYNC_ITEMOPERATIONS_OPTIONS : ($decoder->getElementStartTag(SYNC_SERVERENTRYID) ? SYNC_SERVERENTRYID : ($decoder->getElementStartTag(SYNC_FOLDERID) ? SYNC_FOLDERID : ($decoder->getElementStartTag(SYNC_DOCUMENTLIBRARY_LINKID) ? SYNC_DOCUMENTLIBRARY_LINKID : ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_FILEREFERENCE) ? SYNC_AIRSYNCBASE_FILEREFERENCE : ($decoder->getElementStartTag(SYNC_ITEMOPERATIONS_USERNAME) ? SYNC_ITEMOPERATIONS_USERNAME : ($decoder->getElementStartTag(SYNC_ITEMOPERATIONS_PASSWORD) ? SYNC_ITEMOPERATIONS_PASSWORD : ($decoder->getElementStartTag(SYNC_SEARCH_LONGID) ? SYNC_SEARCH_LONGID : -1))))))))) != -1) {
                if ($reqtag == SYNC_ITEMOPERATIONS_OPTIONS) {
                    if ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_BODYPREFERENCE)) {
                        $bodypreference = array();
                        while (1) {
                            if ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_TYPE)) {
                                $bodypreference["Type"] = $decoder->getElementContent();
                                if (!$decoder->getElementEndTag()) {
                                    return false;
                                }
                            }
                            if ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_TRUNCATIONSIZE)) {
                                $bodypreference["TruncationSize"] = $decoder->getElementContent();
                                if (!$decoder->getElementEndTag()) {
                                    return false;
                                }
                            }
                            if ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_ALLORNONE)) {
                                $bodypreference["AllOrNone"] = $decoder->getElementContent();
                                if (!$decoder->getElementEndTag()) {
                                    return false;
                                }
                            }
                            $e = $decoder->peek();
                            if ($e[EN_TYPE] == EN_TYPE_ENDTAG) {
                                $decoder->getElementEndTag();
                                if (!isset($thisio["bodypreference"]["wanted"])) {
                                    $thisio["bodypreference"]["wanted"] = $bodypreference["Type"];
                                }
                                if (isset($bodypreference["Type"])) {
                                    $thisio["bodypreference"][$bodypreference["Type"]] = $bodypreference;
                                }
                                break;
                            }
                        }
                    }
                } elseif ($reqtag == SYNC_ITEMOPERATIONS_STORE) {
                    $thisio["store"] = $decoder->getElementContent();
                } elseif ($reqtag == SYNC_ITEMOPERATIONS_USERNAME) {
                    $thisio["username"] = $decoder->getElementContent();
                } elseif ($reqtag == SYNC_ITEMOPERATIONS_PASSWORD) {
                    $thisio["password"] = $decoder->getElementContent();
                } elseif ($reqtag == SYNC_SEARCH_LONGID) {
                    $thisio["searchlongid"] = $decoder->getElementContent();
                } elseif ($reqtag == SYNC_AIRSYNCBASE_FILEREFERENCE) {
                    $thisio["airsyncbasefilereference"] = $decoder->getElementContent();
                } elseif ($reqtag == SYNC_SERVERENTRYID) {
                    $thisio["serverentryid"] = $decoder->getElementContent();
                } elseif ($reqtag == SYNC_FOLDERID) {
                    $thisio["folderid"] = $decoder->getElementContent();
                } elseif ($reqtag == SYNC_DOCUMENTLIBRARY_LINKID) {
                    $thisio["documentlibrarylinkid"] = $decoder->getElementContent();
                }
                $e = $decoder->peek();
                if ($e[EN_TYPE] == EN_TYPE_ENDTAG) {
                    $decoder->getElementEndTag();
                }
            }
            $itemoperations[] = $thisio;
            $decoder->getElementEndTag();
            // end SYNC_ITEMOPERATIONS_FETCH
        }
    }
    $decoder->getElementEndTag();
    // end SYNC_ITEMOPERATIONS_ITEMOPERATIONS
    if ($multipart == true) {
        $encoder->startWBXML(true);
    } else {
        $encoder->startWBXML(false);
    }
    $encoder->startTag(SYNC_ITEMOPERATIONS_ITEMOPERATIONS);
    $encoder->startTag(SYNC_ITEMOPERATIONS_STATUS);
    $encoder->content(1);
    $encoder->endTag();
    // end SYNC_ITEMOPERATIONS_STATUS
    $encoder->startTag(SYNC_ITEMOPERATIONS_RESPONSE);
    foreach ($itemoperations as $value) {
        switch ($value["type"]) {
            case "fetch":
                switch (strtolower($value["store"])) {
                    case "mailbox":
                        $encoder->startTag(SYNC_ITEMOPERATIONS_FETCH);
                        $encoder->startTag(SYNC_ITEMOPERATIONS_STATUS);
                        $encoder->content(1);
                        $encoder->endTag();
                        // end SYNC_ITEMOPERATIONS_STATUS
                        if (isset($value["airsyncbasefilereference"])) {
                            $encoder->startTag(SYNC_AIRSYNCBASE_FILEREFERENCE);
                            $encoder->content($value["airsyncbasefilereference"]);
                            $encoder->endTag();
                            // end SYNC_SERVERENTRYID
                        } else {
                            if (isset($value["folderid"])) {
                                $encoder->startTag(SYNC_FOLDERID);
                                $encoder->content($value["folderid"]);
                                $encoder->endTag();
                                // end SYNC_FOLDERID
                            }
                            if (isset($value["serverentryid"])) {
                                $encoder->startTag(SYNC_SERVERENTRYID);
                                $encoder->content($value["serverentryid"]);
                                $encoder->endTag();
                                // end SYNC_SERVERENTRYID
                            }
                            if (isset($value["searchlongid"])) {
                                $ids = $backend->ItemOperationsGetIDs($value['searchlongid']);
                                $encoder->startTag(SYNC_FOLDERID);
                                $encoder->content($ids["folderid"]);
                                $encoder->endTag();
                                // end SYNC_FOLDERID
                                $encoder->startTag(SYNC_SERVERENTRYID);
                                $encoder->content($ids["serverentryid"]);
                                $encoder->endTag();
                                // end SYNC_SERVERENTRYID
                            }
                            $encoder->startTag(SYNC_FOLDERTYPE);
                            $encoder->content("Email");
                            $encoder->endTag();
                        }
                        $encoder->startTag(SYNC_ITEMOPERATIONS_PROPERTIES);
                        if (isset($value['bodypreference'])) {
                            $encoder->_bodypreference = $value['bodypreference'];
                        }
                        if (isset($value["searchlongid"])) {
                            $msg = $backend->ItemOperationsFetchMailbox($value['searchlongid'], $value['bodypreference']);
                        } else {
                            if (isset($value["airsyncbasefilereference"])) {
                                $msg = $backend->ItemOperationsGetAttachmentData($value["airsyncbasefilereference"]);
                            } else {
                                $msg = $backend->Fetch($value['folderid'], $value['serverentryid'], $value['bodypreference']);
                            }
                        }
                        $msg->encode($encoder);
                        $encoder->endTag();
                        // end SYNC_ITEMOPERATIONS_PROPERTIES
                        $encoder->endTag();
                        // end SYNC_ITEMOPERATIONS_FETCH
                        break;
                    case "documentlibrary":
                        if (isset($value['username'])) {
                            if (strpos($value['username'], "\\")) {
                                list($cred['username']['domain'], $cred['username']['username']) = explode("\\", $value['username']);
                            } else {
                                $cred['username'] = array('domain' => "", 'username' => $value['username']);
                            }
                        } else {
                            $cred['username']['domain'] = $auth_domain;
                            $cred['username']['username'] = $auth_user;
                        }
                        $cred['password'] = isset($value['password']) ? $value['password'] : $auth_pw;
                        $result = $backend->ItemOperationsGetDocumentLibraryLink($value["documentlibrarylinkid"], $cred);
                        $encoder->startTag(SYNC_ITEMOPERATIONS_FETCH);
                        $encoder->startTag(SYNC_ITEMOPERATIONS_STATUS);
                        $encoder->content($result['status']);
                        // $encoder->content(1);
                        $encoder->endTag();
                        // end SYNC_ITEMOPERATIONS_STATUS
                        $encoder->startTag(SYNC_DOCUMENTLIBRARY_LINKID);
                        $encoder->content($value["documentlibrarylinkid"]);
                        $encoder->endTag();
                        // end SYNC_DOCUMENTLIBRARY_LINKID
                        if ($result['status'] == 1) {
                            $encoder->startTag(SYNC_ITEMOPERATIONS_PROPERTIES);
                            if ($multipart == true) {
                                $encoder->_bodyparts[] = $result['data'];
                                $encoder->startTag(SYNC_ITEMOPERATIONS_PART);
                                $encoder->content("" . sizeof($encoder->_bodyparts) . "");
                                $encoder->endTag();
                            } else {
                                $encoder->startTag(SYNC_ITEMOPERATIONS_DATA);
                                $encoder->content($result['data']);
                                $encoder->endTag();
                                // end SYNC_ITEMOPERATIONS_DATA
                            }
                            $encoder->startTag(SYNC_ITEMOPERATIONS_VERSION);
                            $encoder->content(gmstrftime("%Y-%m-%dT%H:%M:%S.000Z", $result['version']));
                            $encoder->endTag();
                            // end SYNC_ITEMOPERATIONS_VERSION
                            $encoder->endTag();
                            // end SYNC_ITEMOPERATIONS_PROPERTIES
                        } else {
                            $encoder->_bodyparts = array();
                        }
                        $encoder->endTag();
                        // end SYNC_ITEMOPERATIONS_FETCH
                        break;
                    default:
                        debugLog("Store " . $value["type"] . " not supported by HandleItemOperations");
                        break;
                }
                break;
            default:
                debugLog("Operations " . $value["type"] . " not supported by HandleItemOperations");
                break;
        }
    }
    $encoder->endTag();
    //end SYNC_ITEMOPERATIONS_RESPONSE
    $encoder->endTag();
    //end SYNC_ITEMOPERATIONS_ITEMOPERATIONS
    return true;
}
예제 #8
0
 /**
  * Encodes this object and any subobjects - output is ordered according to mapping
  *
  * @param WBXMLEncoder  $encoder
  *
  * @access public
  */
 public function Encode(&$encoder)
 {
     // A return value if anything was streamed. We need for empty tags.
     $streamed = false;
     foreach ($this->mapping as $tag => $map) {
         if (isset($this->{$map[self::STREAMER_VAR]})) {
             // Variable is available
             if (is_object($this->{$map[self::STREAMER_VAR]})) {
                 // Subobjects can do their own encoding
                 if ($this->{$map[self::STREAMER_VAR]} instanceof Streamer) {
                     $encoder->startTag($tag);
                     $res = $this->{$map[self::STREAMER_VAR]}->Encode($encoder);
                     $encoder->endTag();
                     // nothing was streamed in previous encode but it should be streamed empty anyway
                     if (!$res && isset($map[self::STREAMER_PROP]) && $map[self::STREAMER_PROP] == self::STREAMER_TYPE_SEND_EMPTY) {
                         $encoder->startTag($tag, false, true);
                     }
                 } else {
                     ZLog::Write(LOGLEVEL_ERROR, sprintf("Streamer->Encode(): parameter '%s' of object %s is not of type Streamer", $map[self::STREAMER_VAR], get_class($this)));
                 }
             } else {
                 if (isset($map[self::STREAMER_ARRAY])) {
                     if (empty($this->{$map[self::STREAMER_VAR]}) && isset($map[self::STREAMER_PROP]) && $map[self::STREAMER_PROP] == self::STREAMER_TYPE_SEND_EMPTY) {
                         $encoder->startTag($tag, false, true);
                     } else {
                         // Outputs array container (eg Attachments)
                         // Do not output start and end tag when type is STREAMER_TYPE_NO_CONTAINER
                         if (!isset($map[self::STREAMER_PROP]) || $map[self::STREAMER_PROP] != self::STREAMER_TYPE_NO_CONTAINER) {
                             $encoder->startTag($tag);
                         }
                         foreach ($this->{$map[self::STREAMER_VAR]} as $element) {
                             if (is_object($element)) {
                                 $encoder->startTag($map[self::STREAMER_ARRAY]);
                                 // Outputs object container (eg Attachment)
                                 $element->Encode($encoder);
                                 $encoder->endTag();
                             } else {
                                 if (strlen($element) == 0) {
                                     // Do not output empty items. Not sure if we should output an empty tag with $encoder->startTag($map[self::STREAMER_ARRAY], false, true);
                                 } else {
                                     $encoder->startTag($map[self::STREAMER_ARRAY]);
                                     $encoder->content($element);
                                     $encoder->endTag();
                                     $streamed = true;
                                 }
                             }
                         }
                         if (!isset($map[self::STREAMER_PROP]) || $map[self::STREAMER_PROP] != self::STREAMER_TYPE_NO_CONTAINER) {
                             $encoder->endTag();
                         }
                     }
                 } else {
                     if (isset($map[self::STREAMER_TYPE]) && $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_IGNORE) {
                         continue;
                     }
                     if ($encoder->getMultipart() && isset($map[self::STREAMER_PROP]) && $map[self::STREAMER_PROP] == self::STREAMER_TYPE_MULTIPART) {
                         $encoder->addBodypartStream($this->{$map[self::STREAMER_VAR]});
                         $encoder->startTag(SYNC_ITEMOPERATIONS_PART);
                         $encoder->content($encoder->getBodypartsCount());
                         $encoder->endTag();
                         continue;
                     }
                     // Simple type
                     if (!isset($map[self::STREAMER_TYPE]) && strlen($this->{$map[self::STREAMER_VAR]}) == 0) {
                         // send empty tags
                         if (isset($map[self::STREAMER_PROP]) && $map[self::STREAMER_PROP] == self::STREAMER_TYPE_SEND_EMPTY) {
                             $encoder->startTag($tag, false, true);
                         }
                         // Do not output empty items. See above: $encoder->startTag($tag, false, true);
                         continue;
                     } else {
                         $encoder->startTag($tag);
                     }
                     if (isset($map[self::STREAMER_TYPE]) && ($map[self::STREAMER_TYPE] == self::STREAMER_TYPE_DATE || $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_DATE_DASHES)) {
                         if ($this->{$map[self::STREAMER_VAR]} != 0) {
                             // don't output 1-1-1970
                             $encoder->content($this->formatDate($this->{$map[self::STREAMER_VAR]}, $map[self::STREAMER_TYPE]));
                         }
                     } else {
                         if (isset($map[self::STREAMER_TYPE]) && $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_HEX) {
                             $encoder->content(strtoupper(bin2hex($this->{$map[self::STREAMER_VAR]})));
                         } else {
                             if (isset($map[self::STREAMER_TYPE]) && $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_STREAM_ASPLAIN) {
                                 $encoder->contentStream($this->{$map[self::STREAMER_VAR]}, false);
                             } else {
                                 if (isset($map[self::STREAMER_TYPE]) && ($map[self::STREAMER_TYPE] == self::STREAMER_TYPE_STREAM_ASBASE64 || $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_STREAM)) {
                                     $encoder->contentStream($this->{$map[self::STREAMER_VAR]}, true);
                                 } else {
                                     if (isset($map[self::STREAMER_TYPE]) && is_array($this->{$map[self::STREAMER_VAR]}) && ($map[self::STREAMER_TYPE] == self::STREAMER_TYPE_COMMA_SEPARATED || $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_SEMICOLON_SEPARATED)) {
                                         $glue = $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_COMMA_SEPARATED ? ", " : "; ";
                                         $encoder->content(implode($glue, $this->{$map[self::STREAMER_VAR]}));
                                     } else {
                                         $encoder->content($this->{$map[self::STREAMER_VAR]});
                                     }
                                 }
                             }
                         }
                     }
                     $encoder->endTag();
                     $streamed = true;
                 }
             }
         }
     }
     // Output our own content
     if (isset($this->content)) {
         $encoder->content($this->content);
     }
     return $streamed;
 }
예제 #9
0
 /**
  * Encodes this object and any subobjects - output is ordered according to mapping
  *
  * @param WBXMLEncoder  $encoder
  *
  * @access public
  */
 public function Encode(&$encoder)
 {
     foreach ($this->mapping as $tag => $map) {
         if (isset($this->{$map}[self::STREAMER_VAR])) {
             // Variable is available
             if (is_object($this->{$map}[self::STREAMER_VAR])) {
                 // Subobjects can do their own encoding
                 if ($this->{$map}[self::STREAMER_VAR] instanceof Streamer) {
                     $encoder->startTag($tag);
                     $this->{$map}[self::STREAMER_VAR]->Encode($encoder);
                     $encoder->endTag();
                 } else {
                     ZLog::Write(LOGLEVEL_ERROR, sprintf("Streamer->Encode(): parameter '%s' of object %s is not of type Streamer", $map[self::STREAMER_VAR], get_class($this)));
                 }
             } else {
                 if (isset($map[self::STREAMER_ARRAY])) {
                     if (empty($this->{$map}[self::STREAMER_VAR]) && isset($map[self::STREAMER_TYPE]) && $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_SEND_EMPTY || isset($map[self::STREAMER_PROP]) && isset($map[self::STREAMER_PROP]) == self::STREAMER_TYPE_SEND_EMPTY) {
                         $encoder->startTag($tag, false, true);
                     } else {
                         // Outputs array container (eg Attachments)
                         // Do not output start and end tag when type is STREAMER_TYPE_NO_CONTAINER
                         if (!isset($map[self::STREAMER_PROP]) || $map[self::STREAMER_PROP] != self::STREAMER_TYPE_NO_CONTAINER) {
                             $encoder->startTag($tag);
                         }
                         foreach ($this->{$map}[self::STREAMER_VAR] as $element) {
                             if (is_object($element)) {
                                 $encoder->startTag($map[self::STREAMER_ARRAY]);
                                 // Outputs object container (eg Attachment)
                                 $element->Encode($encoder);
                                 $encoder->endTag();
                             } else {
                                 if (strlen($element) == 0) {
                                     // Do not output empty items. Not sure if we should output an empty tag with $encoder->startTag($map[self::STREAMER_ARRAY], false, true);
                                 } else {
                                     $encoder->startTag($map[self::STREAMER_ARRAY]);
                                     $encoder->content($element);
                                     $encoder->endTag();
                                 }
                             }
                         }
                         if (!isset($map[self::STREAMER_PROP]) || $map[self::STREAMER_PROP] != self::STREAMER_TYPE_NO_CONTAINER) {
                             $encoder->endTag();
                         }
                     }
                 } else {
                     if (isset($map[self::STREAMER_TYPE]) && $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_IGNORE) {
                         continue;
                     }
                     // Simple type
                     if (!isset($map[self::STREAMER_TYPE]) && strlen($this->{$map}[self::STREAMER_VAR]) == 0) {
                         if (isset($map[self::STREAMER_TYPE]) && $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_SEND_EMPTY || isset($map[self::STREAMER_PROP]) && isset($map[self::STREAMER_PROP]) == self::STREAMER_TYPE_SEND_EMPTY) {
                             $encoder->startTag($tag, false, true);
                         }
                         // Do not output empty items. See above: $encoder->startTag($tag, false, true);
                         continue;
                     } else {
                         $encoder->startTag($tag);
                     }
                     if (isset($map[self::STREAMER_TYPE]) && ($map[self::STREAMER_TYPE] == self::STREAMER_TYPE_DATE || $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_DATE_DASHES)) {
                         if ($this->{$map}[self::STREAMER_VAR] != 0) {
                             // don't output 1-1-1970
                             $encoder->content($this->formatDate($this->{$map}[self::STREAMER_VAR], $map[self::STREAMER_TYPE]));
                         }
                     } else {
                         if (isset($map[self::STREAMER_TYPE]) && $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_HEX) {
                             $encoder->content(strtoupper(bin2hex($this->{$map}[self::STREAMER_VAR])));
                         } else {
                             if (isset($map[self::STREAMER_TYPE]) && $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_STREAM) {
                                 //encode stream with base64
                                 //TODO stream chunked without loading the complete attachment into memory
                                 $stream = $this->{$map}[self::STREAMER_VAR];
                                 $base64filter = stream_filter_append($stream, 'convert.base64-encode');
                                 $d = "";
                                 while (!feof($stream)) {
                                     $d .= fgets($stream, 4096);
                                 }
                                 $encoder->content($d);
                                 stream_filter_remove($base64filter);
                             } else {
                                 if (isset($map[self::STREAMER_TYPE]) && is_array($this->{$map}[self::STREAMER_VAR]) && ($map[self::STREAMER_TYPE] == self::STREAMER_TYPE_COMMA_SEPARATED || $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_SEMICOLON_SEPARATED)) {
                                     $glue = $map[self::STREAMER_TYPE] == self::STREAMER_TYPE_COMMA_SEPARATED ? ", " : "; ";
                                     $encoder->content(implode($glue, $this->{$map}[self::STREAMER_VAR]));
                                 } else {
                                     $encoder->content($this->{$map}[self::STREAMER_VAR]);
                                 }
                             }
                         }
                     }
                     $encoder->endTag();
                 }
             }
         }
     }
     // Output our own content
     if (isset($this->content)) {
         $encoder->content($this->content);
     }
 }