R33272 - /trunk/addressbook/inc/class.addressbook_activesync.inc.php

Author: p_herbert
New Revision: 33272

URL: http://www.egroupware.org/viewvc/egroupware?rev=33272&view=rev
Log:
initial commit of addressbook plugin for active sync

Added:
trunk/addressbook/inc/class.addressbook_activesync.inc.php (with props)

Added: trunk/addressbook/inc/class.addressbook_activesync.inc.php
URL: http://www.egroupware.org/viewvc/egroupware/trunk/addressbook/inc/class.addressbook_activesync.inc.php?rev=33272&view=auto

— trunk/addressbook/inc/class.addressbook_activesync.inc.php (added)
+++ trunk/addressbook/inc/class.addressbook_activesync.inc.php Thu Dec 2 09:46:20 2010
@@ -1,0 +1,545 @@
+<?php
+/**

+/**

    • Addressbook activesync plugin
  • */
    +class addressbook_activesync implements activesync_plugin_read, activesync_plugin_write
    +{
  • /**
    • var BackendEGW
  • */
  • private $backend;
  • /**
    • Instance of addressbook_bo
    • @var addressbook
  • */
  • private $addressbook;
  • /**
    • Constructor
    • @param BackendEGW $backend
  • */
  • public function __construct(BackendEGW $backend)
  • {
  •   $this->backend = $backend;
    
  • }
  • /**
    • This function is analogous to GetMessageList.
    • @ToDo implement preference, include own private calendar
  • */
  • public function GetFolderList()
  • {
  •   unset($GLOBALS['egw_info']['user']['preferences']['addressbook']['private_addressbook']);
    
  •   if (!isset($this->addressbook)) $this->addressbook = new addressbook_bo();
    
  •   // error_log(print_r($this->addressbook->get_addressbooks(EGW_ACL_READ),true));
    
  •   foreach ($this->addressbook->get_addressbooks(EGW_ACL_READ) as $label => $entry)
    
  •   {
    
  •   $folderlist[] = $f = array(
    
  •   		'id'	=>	$this->backend->createID('addressbook',$label),
    
  •   		'mod'	=>	$label,
    
  •   		'parent'=>	'0',
    
  •   	);
    
  •   };
    
  •   //error_log(__METHOD__."() returning ".array2string($folderlist));
    
  •   return $folderlist;
    
  • }
  • /**
    • Get Information about a folder
    • @param string $id
    • @return SyncFolder|boolean false on error
  • */
  • public function GetFolder($id)
  • {
  •   $this->backend->splitID($id, $type, $owner);
    
  •   $folderObj = new SyncFolder();
    
  •   $folderObj->serverid = $id;
    
  •   $folderObj->parentid = '0';
    
  •   $folderObj->displayname = $GLOBALS['egw']->accounts->id2name($owner,'account_fullname'); //@TODO: Name for owner == 0;
    
  •   if ($owner == $GLOBALS['egw_info']['user']['account_id'])
    
  •   {
    
  •   	$folderObj->type = SYNC_FOLDER_TYPE_CONTACT;
    
  •   }
    
  •   else
    
  •   {
    
  •   	$folderObj->type = SYNC_FOLDER_TYPE_USER_CONTACT;
    
  •   }
    
  •   // error_log(__METHOD__."('$id') folderObj=".array2string($folderObj));
    
  •   return $folderObj;
    
  • }
  • /**
    • Return folder stats. This means you must return an associative array with the
    • following properties:
    • “id” => The server ID that will be used to identify the folder. It must be unique, and not too long
    •   How long exactly is not known, but try keeping it under 20 chars or so. It must be a string.
      
    • “parent” => The server ID of the parent of the folder. Same restrictions as ‘id’ apply.
    • “mod” => This is the modification signature. It is any arbitrary string which is constant as long as
    •    the folder has not changed. In practice this means that 'mod' can be equal to the folder name
      
    •    as this is the only thing that ever changes in folders. (the type is normally constant)
      
    • @return array with values for keys ‘id’, ‘mod’ and ‘parent’
  • */
  • public function StatFolder($id)
  • {
  •   $folder = $this->GetFolder($id);
    
  •   $this->backend->splitID($id, $type, $owner);
    
  •   $stat = array(
    
  •   	'id'     => $id,
    
  •   	'mod'    => $GLOBALS['egw']->accounts->id2name($owner),
    
  •   	'parent' => '0',
    
  •   );
    
  •   // error_log(__METHOD__."('$id')");
    
  •   return $stat;
    
  • }
  • /**
    • Should return a list (array) of messages, each entry being an associative array
  • * with the same entries as StatMessage(). This function should return stable information; ie
    
  • * if nothing has changed, the items in the array must be exactly the same. The order of
    
  • * the items within the array is not important though.
    
  • *
    
  • * The cutoffdate is a date in the past, representing the date since which items should be shown.
    
  • * This cutoffdate is determined by the user's setting of getting 'Last 3 days' of e-mail, etc. If
    
  • * you ignore the cutoffdate, the user will not be able to select their own cutoffdate, but all
    
  • * will work OK apart from that.
    
  • *
    
  • * @param string $id folder id
    
  • * @param int $cutoffdate=null
    
  • * @return array
    
  • */
  • function GetMessageList($id, $cutoffdate=NULL)
  • {
  •   if (!isset($this->addressbook)) $this->addressbook = new addressbook_bo();
    
  •   $this->backend->splitID($id,$type,$user);
    
  •   $filter['owner'] = $user;
    
  •   $items = $this->addressbook->search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='');
    
  •   $messagelist = array();
    
  •   foreach ($items as $k => $event)
    
  •   {
    
  •   	$messagelist[] = $this->StatMessage($id, $event['id']);
    
  •   }
    
  •   //error_log(print_r($messagelist,true));
    
  •   return $messagelist;
    
  •   //return array();
    
  • }
  • /**
    • Get specified item from specified folder.
    • @param string $folderid
    • @param string $id
    • @param int $truncsize
    • @param int $bodypreference
    • @param bool $mimesupport
    • @return $messageobject|boolean false on error
  • */
  • public function GetMessage($folderid, $id, $truncsize, $bodypreference=false, $mimesupport = 0)
  • {
  •   $mapping = array(
    
  •   'anniversary'	=> '',
    
  •   'assistantname'	=> 'assistent',
    
  •   'assistnamephonenumber'	=> 'tel_assistent',
    
  •   'birthday'	=>	'bday',
    
  •   'body'	=> 'note',
    
  •   'bodysize'	=> '',
    
  •   'bodytruncated'	=> '',
    
  •   'business2phonenumber'	=> '',
    
  •   'businesscity'	=>	'adr_one_locality',
    
  •   'businesscountry'	=> 'adr_one_countryname',
    
  •   'businesspostalcode'	=> 'adr_one_postalcode',
    
  •   'businessstate'	=> '',
    
  •   'businessstreet'	=> 'adr_one_street',
    
  •   'businessfaxnumber'	=> 'tel_fax',
    
  •   'businessphonenumber'	=> 'tel_work',
    
  •   'carphonenumber'	=> 'tel_car',
    
  •   'categories'	=> '',
    
  •   'children'	=> '',
    
  •   'companyname'	=> 'org_name',
    
  •   'department'	=>	'org_unit',
    
  •   'email1address'	=> 'email',
    
  •   'email2address'	=> 'email_home',
    
  •   'email3address'	=> '',
    
  •   'fileas'	=>	'n_fileas',
    
  •   'firstname'	=>	'n_given',
    
  •   'home2phonenumber'	=> '',
    
  •   'homecity'	=> 'adr_two_locality',
    
  •   'homecountry'	=> 'adr_two_countryname',
    
  •   'homepostalcode'	=> 'adr_two_postalcode',
    
  •   'homestate'	=> '',
    
  •   'homestreet'	=>	'adr_two_street',
    
  •   'homefaxnumber'	=> 'tel_fax_home',
    
  •   'homephonenumber'	=>	'tel_home',
    
  •   'jobtitle'	=>	'role',
    
  •   'lastname'	=> 'n_family',
    
  •   'middlename'	=> 'n_middle',
    
  •   'mobilephonenumber'	=> 'tel_cell',
    
  •   'officelocation'	=> 'room',
    
  •   'othercity'	=> '',
    
  •   'othercountry'	=> '',
    
  •   'otherpostalcode'	=> '',
    
  •   'otherstate'	=> '',
    
  •   'otherstreet'	=> '',
    
  •   'pagernumber'	=> 'tel_pager',
    
  •   'radiophonenumber'	=> '',
    
  •   'spouse'	=> '',
    
  •   'suffix'	=>	'n_suffix',
    
  •   'title'	=> 'title',	// @TODO: check if n_prefix
    
  •   'webpage'	=> 'url',
    
  •   'yomicompanyname'	=> '',
    
  •   'yomifirstname'	=>	'',
    
  •   'yomilastname'	=>	'',
    
  •   'rtf'	=> '',
    
  •   'picture'	=> 'jpegphoto',
    
  •   'nickname'	=>	'',
    
  •   'airsyncbasebody'	=>	'' );
    
  •   if (!isset($this->addressbook)) $this->addressbook = new addressbook_bo();
    
  •   debugLog (__METHOD__."('$folderid', $id, truncsize=$truncsize, bodyprefence=$bodypreference, mimesupport=$mimesupport)");
    
  •   $this->backend->splitID($folderid, $type, $account);
    
  •   if ($type != 'addressbook' || !($contact = $this->addressbook->read($id)))
    
  •   {
    
  •   	debugLog(__METHOD__." Folder wrong or contact not existing");
    
  •   	return false;
    
  •   }
    
  •   $message = new SyncContact();
    
  •   foreach($mapping as $key => $attr)
    
  •   {
    
  •   	switch ($attr)
    
  •   	{
    
  •   		case 'note':
    
  •   			if (empty($contact[$attr])) break;
    
  •   			if ($bodypreference == false)
    
  •   			{
    
  •   		    	$message->body = $contact[$attr];
    
  •   	    		$message->bodysize = strlen($message->body);
    
  •    		    	$message->bodytruncated = 0;
    
  •   			}
    
  •   			else
    
  •   			{
    
  •   				$message->airsyncbasebody = new SyncAirSyncBaseBody();
    
  •   	    		debugLog("airsyncbasebody!");
    
  •   	    		$message->airsyncbasenativebodytype=1;
    
  •   	    		$message->airsyncbasebody = new SyncAirSyncBaseBody();
    
  •   				if (isset($bodypreference[2]))
    
  •   				{
    
  •   					//debugLog("HTML Body");
    
  •   					$message->airsyncbasebody->type = 2;
    
  •   					$html = '<html>'.
    
  •   							'<head>'.
    
  •   							'<meta name="Generator" content="Z-Push">'.
    
  •   							'<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'.
    
  •   							'</head>'.
    
  •   							'<body>'.
    
  •   							str_replace("\n","<BR>",str_replace("\r","<BR>", str_replace("\r\n","<BR>",$contact[$attr]))).
    
  •   							'</body>'.
    
  •   							'</html>';
    
  •   							if (isset($bodypreference[2]["TruncationSize"]) && strlen($html) > $bodypreference[2]["TruncationSize"])
    
  •   							{
    
  •    	        	    			$html = utf8_truncate($html,$bodypreference[2]["TruncationSize"]);
    
  •   								$message->airsyncbasebody->truncated = 1;
    
  •   							}
    
  •   							$message->airsyncbasebody->data = $html;
    
  •   							$message->airsyncbasebody->estimateddatasize = strlen($html);
    
  •   				}
    
  •   				else
    
  •   				{
    
  •   					// debugLog("Plaintext Body");
    
  •   					$note = str_replace("\n","\r\n",str_replace("\r","",$contact[$attr]));
    
  •   					$message->airsyncbasebody->type = 1;
    
  •   					if(isset($bodypreference[1]["TruncationSize"]) && strlen($note) > $bodypreference[1]["TruncationSize"])
    
  •   					{
    
  •   						$note = utf8_truncate($note, $bodypreference[1]["TruncationSize"]);
    
  •   						$message->airsyncbasebody->truncated = 1;
    
  •       		        }
    
  •   					$message->airsyncbasebody->estimateddatasize = strlen($note);
    
  •   					$message->airsyncbasebody->data = $note;
    
  •   				}
    
  •   				if ($message->airsyncbasebody->type != 3 && (!isset($message->airsyncbasebody->data) || strlen($message->airsyncbasebody->data) == 0))
    
  •   				{
    
  •    					$message->airsyncbasebody->data = " ";
    
  •   				}
    
  •   			break;
    
  •   			}
    
  •   		case 'jpegphoto':
    
  •   			{
    
  •   				if (!empty($contact[$attr])) $message->$key = base64_encode($contact[$attr]);
    
  •   				break;
    
  •   			}
    
  •   		default:
    
  •   			if (!empty($contact[$attr])) $message->$key = $contact[$attr];
    
  •   	}
    
  •   }
    
  •   //error_log("MessageObject exporting" . print_r($message,true));
    
  •   return $message;
    
  • }
  • /**
    • StatMessage should return message stats, analogous to the folder stats (StatFolder). Entries are:
  • * 'id'     => Server unique identifier for the message. Again, try to keep this short (under 20 chars)
    
  • * 'flags'     => simply '0' for unread, '1' for read
    
  • * 'mod'    => modification signature. As soon as this signature changes, the item is assumed to be completely
    
  • *             changed, and will be sent to the PDA as a whole. Normally you can use something like the modification
    
  • *             time for this field, which will change as soon as the contents have changed.
    
  • *
    
  • * @param string $folderid
    
  • * @param int|array $id event id or array
    
  • * @return array
    
  • */
    
  • public function StatMessage($folderid, $id)
  • {
  •   if (!isset($this->addressbook)) $this->addressbook = new addressbook_bo();
    
  •   if (!($data = $this->addressbook->read($id)))
    
  •   {
    
  •   	$stat = false;
    
  •   }
    
  •   else
    
  •   {
    
  •   	$stat = array(
    
  •   		'mod' => $data['etag'],
    
  •   		'id' => is_array($id) ? $id['id'] : $id,
    
  •   		'flags' => 1,
    
  •   	);
    
  •   }
    
  •   //debugLog (__METHOD__."('$folderid',".array2string($id).") returning ".array2string($stat));
    
  •   return $stat;
    
  • }
  • /**
    • Creates or modifies a folder
  • *
    
  • * @param $id of the parent folder
    
  • * @param $oldid => if empty -> new folder created, else folder is to be renamed
    
  • * @param $displayname => new folder name (to be created, or to be renamed to)
    
  • * @param type => folder type, ignored in IMAP
    
  • *
    
  • * @return stat | boolean false on error
    
  • *
    
  • */
    
  • public function ChangeFolder($id, $oldid, $displayname, $type)
  • {
  •   debugLog(__METHOD_." not implemented");
    
  • }
  • /**
  • * Deletes (really delete) a Folder
    
  • *
    
  • * @param $parentid of the folder to delete
    
  • * @param $id of the folder to delete
    
  • *
    
  • * @return
    
  • * @TODO check what is to be returned
    
  • *
    
  • */
    
  • public function DeleteFolder($parentid, $id)
  • {
  •   debugLog(__METHOD__." not implemented");
    
  • }
  • /**
  • * Changes or adds a message on the server
    
  • *
    
  • * @param $folderid
    
  • * @param $id for change | empty for create new
    
  • * @param $message object to SyncObject to create
    
  • *
    
  • * @return $stat whatever would be returned from StatMessage
    
  • *
    
  • * This function is called when a message has been changed on the PDA. You should parse the new
    
  • * message here and save the changes to disk. The return value must be whatever would be returned
    
  • * from StatMessage() after the message has been saved. This means that both the 'flags' and the 'mod'
    
  • * properties of the StatMessage() item may change via ChangeMessage().
    
  • * Note that this function will never be called on E-mail items as you can't change e-mail items, you
    
  • * can only set them as 'read'.
    
  • */
    
  • public function ChangeMessage($folderid, $id, $message)
  • {
  •   $mapping = array(
    
  •   'anniversary'	=> '',
    
  •   'assistantname'	=> 'assistent',
    
  •   'assistnamephonenumber'	=> 'tel_assistent',
    
  •   'birthday'	=>	'bday',
    
  •   'body'	=> 'note',
    
  •   'bodysize'	=> '',
    
  •   'bodytruncated'	=> '',
    
  •   'business2phonenumber'	=> '',
    
  •   'businesscity'	=>	'adr_one_locality',
    
  •   'businesscountry'	=> 'adr_one_countryname',
    
  •   'businesspostalcode'	=> 'adr_one_postalcode',
    
  •   'businessstate'	=> '',
    
  •   'businessstreet'	=> 'adr_one_street',
    
  •   'businessfaxnumber'	=> 'tel_fax',
    
  •   'businessphonenumber'	=> 'tel_work',
    
  •   'carphonenumber'	=> 'tel_car',
    
  •   'categories'	=> '',
    
  •   'children'	=> '',
    
  •   'companyname'	=> 'org_name',
    
  •   'department'	=>	'org_unit',
    
  •   'email1address'	=> 'email',
    
  •   'email2address'	=> 'email_home',
    
  •   'email3address'	=> '',
    
  •   'fileas'	=>	'n_fileas',
    
  •   'firstname'	=>	'n_given',
    
  •   'home2phonenumber'	=> '',
    
  •   'homecity'	=> 'adr_two_locality',
    
  •   'homecountry'	=> 'adr_two_countryname',
    
  •   'homepostalcode'	=> 'adr_two_postalcode',
    
  •   'homestate'	=> '',
    
  •   'homestreet'	=>	'adr_two_street',
    
  •   'homefaxnumber'	=> 'tel_fax_home',
    
  •   'homephonenumber'	=>	'tel_home',
    
  •   'jobtitle'	=>	'role',
    
  •   'lastname'	=> 'n_family',
    
  •   'middlename'	=> 'n_middle',
    
  •   'mobilephonenumber'	=> 'tel_cell',
    
  •   'officelocation'	=> 'room',
    
  •   'othercity'	=> '',
    
  •   'othercountry'	=> '',
    
  •   'otherpostalcode'	=> '',
    
  •   'otherstate'	=> '',
    
  •   'otherstreet'	=> '',
    
  •   'pagernumber'	=> 'tel_pager',
    
  •   'radiophonenumber'	=> '',
    
  •   'spouse'	=> '',
    
  •   'suffix'	=>	'n_suffix',
    
  •   'title'	=> 'title',	// @TODO: check if n_prefix
    
  •   'webpage'	=> 'url',
    
  •   'yomicompanyname'	=> '',
    
  •   'yomifirstname'	=>	'',
    
  •   'yomilastname'	=>	'',
    
  •   'rtf'	=> '',
    
  •   'picture'	=> 'jpegphoto',
    
  •   'nickname'	=>	'',
    
  •   'airsyncbasebody'	=>	'' );
    
  •   if (!isset($this->addressbook)) $this->addressbook = new addressbook_bo();
    
  •   $this->backend->splitID($folderid, $type, $account);
    
  •   // error_log(__METHOD__. " Id " .$id. " Account ". $account . " FolderID " . $folderid);
    
  •   if ($type != 'addressbook') // || !($contact = $this->addressbook->read($id)))
    
  •   {
    
  •   	debugLog(__METHOD__." Folder wrong or contact not existing");
    
  •   	return false;
    
  •   }
    
  •   if (empty($id))
    
  •   {
    
  •   	$contact = array();
    
  •   	debugLog (__METHOD__." creating new contact");
    
  •   	foreach ($mapping as $key => $attr)
    
  •   	{
    
  •   		switch ($attr)
    
  •   		{
    
  •   			case 'note':
    
  •   				{
    
  •   					error_log ("Note !");
    
  •   					break;
    
  •   				}
    
  •   			case 'jpegphoto':
    
  •   				{
    
  •   					error_log("jpegphoto");
    
  •   					if (!empty($message->$key) && (!empty($mapping[$key])) )  $contact[$attr] = base64_decode($message->$key);
    
  •   					break;
    
  •   				}
    
  •   			default:
    
  •   				{
    
  •   					if (!empty($message->$key) && (!empty($mapping[$key])) )  $contact[$attr] = $message->$key;
    
  •   					break;
    
  •   				}
    
  •   		}
    
  •   	}
    
  •   	$contact['owner'] = $account;
    
  •   	$this->addressbook->fixup_contact($contact);
    
  •   	error_log (print_r($contact,true));
    
  •   	//$this->addressbook->save($contact);
    
  •   }
    
  • }
  • /**
  • * Moves a message from one folder to another
    
  • *
    
  • * @param $folderid of the current folder
    
  • * @param $id of the message
    
  • * @param $newfolderid
    
  • *
    
  • * @return $newid as a string | boolean false on error
    
  • *
    
  • * After this call, StatMessage() and GetMessageList() should show the items
    
  • * to have a new parent. This means that it will disappear from GetMessageList() will not return the item
    
  • * at all on the source folder, and the destination folder will show the new message
    
  • *
    
  • */
    
  • public function MoveMessage($folderid, $id, $newfolderid)
  • {
  •   error_log(__METHOD__);
    
  • }
  • /**
  • * Delete (really delete) a message in a folder
    
  • *
    
  • * @param $folderid
    
  • * @param $id
    
  • *
    
  • * @TODO check what is to be returned
    
  • *
    
  • * @DESC After this call has succeeded, a call to
    
  • * GetMessageList() should no longer list the message. If it does, the message will be re-sent to the PDA
    
  • * as it will be seen as a 'new' item. This means that if you don't implement this function, you will
    
  • * be able to delete messages on the PDA, but as soon as you sync, you'll get the item back
    
  • */
    
  • public function DeleteMessage($folderid, $id)
  • {
  •   error_log (__METHOD__);
    
  • }
  • /**
    • @todo implement using ctag
  • */
  • function AlterPingChanges($folderid, &$syncstate)
  • {
  •   debugLog (__METHOD__." should not see this -not yet implemented");
    
  •   return false;
    
  • }
    +}

Propchange: trunk/addressbook/inc/class.addressbook_activesync.inc.php

svn:executable = *

Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
Tap into the largest installed PC base & get more eyes on your game by
optimizing for Intel® Graphics Technology. Get started today with the
Intel® Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev


eGroupWare-cvs mailing list
eGroupWare-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/egroupware-cvs