/** * Writes a SyncContact to MAPI * * @param mixed $mapimessage * @param SyncContact $contact * * @access private * @return boolean */ private function setContact($mapimessage, $contact) { mapi_setprops($mapimessage, array(PR_MESSAGE_CLASS => "IPM.Contact")); // normalize email addresses if (isset($contact->email1address) && ($contact->email1address = $this->extractEmailAddress($contact->email1address)) === false) { unset($contact->email1address); } if (isset($contact->email2address) && ($contact->email2address = $this->extractEmailAddress($contact->email2address)) === false) { unset($contact->email2address); } if (isset($contact->email3address) && ($contact->email3address = $this->extractEmailAddress($contact->email3address)) === false) { unset($contact->email3address); } $contactmapping = MAPIMapping::GetContactMapping(); $contactprops = MAPIMapping::GetContactProperties(); $this->setPropsInMAPI($mapimessage, $contact, $contactmapping); ///set display name from contact's properties $cname = $this->composeDisplayName($contact); //get contact specific mapi properties and merge them with the AS properties $contactprops = array_merge($this->getPropIdsFromStrings($contactmapping), $this->getPropIdsFromStrings($contactprops)); //contact specific properties to be set $props = array(); //need to be set in order to show contacts properly in outlook and wa $nremails = array(); $abprovidertype = 0; if (isset($contact->email1address)) { $this->setEmailAddress($contact->email1address, $cname, 1, $props, $contactprops, $nremails, $abprovidertype); } if (isset($contact->email2address)) { $this->setEmailAddress($contact->email2address, $cname, 2, $props, $contactprops, $nremails, $abprovidertype); } if (isset($contact->email3address)) { $this->setEmailAddress($contact->email3address, $cname, 3, $props, $contactprops, $nremails, $abprovidertype); } $props[$contactprops["addressbooklong"]] = $abprovidertype; $props[$contactprops["displayname"]] = $props[$contactprops["subject"]] = $cname; //pda multiple e-mail addresses bug fix for the contact if (!empty($nremails)) { $props[$contactprops["addressbookmv"]] = $nremails; } //set addresses $this->setAddress("home", $contact->homecity, $contact->homecountry, $contact->homepostalcode, $contact->homestate, $contact->homestreet, $props, $contactprops); $this->setAddress("business", $contact->businesscity, $contact->businesscountry, $contact->businesspostalcode, $contact->businessstate, $contact->businessstreet, $props, $contactprops); $this->setAddress("other", $contact->othercity, $contact->othercountry, $contact->otherpostalcode, $contact->otherstate, $contact->otherstreet, $props, $contactprops); //set the mailing address and its type if (isset($props[$contactprops["businessaddress"]])) { $props[$contactprops["mailingaddress"]] = 2; $this->setMailingAddress($contact->businesscity, $contact->businesscountry, $contact->businesspostalcode, $contact->businessstate, $contact->businessstreet, $props[$contactprops["businessaddress"]], $props, $contactprops); } elseif (isset($props[$contactprops["homeaddress"]])) { $props[$contactprops["mailingaddress"]] = 1; $this->setMailingAddress($contact->homecity, $contact->homecountry, $contact->homepostalcode, $contact->homestate, $contact->homestreet, $props[$contactprops["homeaddress"]], $props, $contactprops); } elseif (isset($props[$contactprops["otheraddress"]])) { $props[$contactprops["mailingaddress"]] = 3; $this->setMailingAddress($contact->othercity, $contact->othercountry, $contact->otherpostalcode, $contact->otherstate, $contact->otherstreet, $props[$contactprops["otheraddress"]], $props, $contactprops); } if (isset($contact->picture)) { $picbinary = base64_decode($contact->picture); $picsize = strlen($picbinary); if ($picsize < MAX_EMBEDDED_SIZE) { $props[$contactprops["haspic"]] = false; // TODO contact picture handling // check if contact has already got a picture. delete it first in that case // delete it also if it was removed on a mobile $picprops = mapi_getprops($mapimessage, array($props[$contactprops["haspic"]])); if (isset($picprops[$props[$contactprops["haspic"]]]) && $picprops[$props[$contactprops["haspic"]]]) { ZLog::Write(LOGLEVEL_DEBUG, "Contact already has a picture. Delete it"); $attachtable = mapi_message_getattachmenttable($mapimessage); mapi_table_restrict($attachtable, MAPIUtils::GetContactPicRestriction()); $rows = mapi_table_queryallrows($attachtable, array(PR_ATTACH_NUM)); if (isset($rows) && is_array($rows)) { foreach ($rows as $row) { mapi_message_deleteattach($mapimessage, $row[PR_ATTACH_NUM]); } } } // only set picture if there's data in the request if ($picbinary !== false && $picsize > 0) { $props[$contactprops["haspic"]] = true; $pic = mapi_message_createattach($mapimessage); // Set properties of the attachment $picprops = array(PR_ATTACH_LONG_FILENAME_A => "ContactPicture.jpg", PR_DISPLAY_NAME => "ContactPicture.jpg", 0x7fff000b => true, PR_ATTACHMENT_HIDDEN => false, PR_ATTACHMENT_FLAGS => 1, PR_ATTACH_METHOD => ATTACH_BY_VALUE, PR_ATTACH_EXTENSION_A => ".jpg", PR_ATTACH_NUM => 1, PR_ATTACH_SIZE => $picsize, PR_ATTACH_DATA_BIN => $picbinary); mapi_setprops($pic, $picprops); mapi_savechanges($pic); } } } if (isset($contact->asbody)) { $this->setASbody($contact->asbody, $props, $contactprops); } //set fileas if (defined('FILEAS_ORDER')) { $lastname = isset($contact->lastname) ? $contact->lastname : ""; $firstname = isset($contact->firstname) ? $contact->firstname : ""; $middlename = isset($contact->middlename) ? $contact->middlename : ""; $company = isset($contact->companyname) ? $contact->companyname : ""; $props[$contactprops["fileas"]] = Utils::BuildFileAs($lastname, $firstname, $middlename, $company); } else { ZLog::Write(LOGLEVEL_DEBUG, "FILEAS_ORDER not defined"); } mapi_setprops($mapimessage, $props); }
/** * Create a MAPI restriction for a certain email address * * @access public * * @param MAPIStore $store the MAPI store * @param string $query email address * * @return array */ public static function GetEmailAddressRestriction($store, $email) { $props = MAPIMapping::GetContactProperties(); $props = getPropIdsFromStrings($store, $props); return array(RES_OR, array(array(RES_PROPERTY, array(RELOP => RELOP_EQ, ULPROPTAG => $props['emailaddress1'], VALUE => array($props['emailaddress1'] => $email))), array(RES_PROPERTY, array(RELOP => RELOP_EQ, ULPROPTAG => $props['emailaddress2'], VALUE => array($props['emailaddress2'] => $email))), array(RES_PROPERTY, array(RELOP => RELOP_EQ, ULPROPTAG => $props['emailaddress3'], VALUE => array($props['emailaddress3'] => $email))))); }