<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.zarafa.com/wiki/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.zarafa.com/wiki/index.php?title=Zarafa_Alert_Script_:_Recurrent_Meeting&amp;feed=atom&amp;action=history</id>
		<title>Zarafa Alert Script : Recurrent Meeting - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.zarafa.com/wiki/index.php?title=Zarafa_Alert_Script_:_Recurrent_Meeting&amp;feed=atom&amp;action=history"/>
		<link rel="alternate" type="text/html" href="http://www.zarafa.com/wiki/index.php?title=Zarafa_Alert_Script_:_Recurrent_Meeting&amp;action=history"/>
		<updated>2013-05-22T01:45:41Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.16.0</generator>

	<entry>
		<id>http://www.zarafa.com/wiki/index.php?title=Zarafa_Alert_Script_:_Recurrent_Meeting&amp;diff=1016&amp;oldid=prev</id>
		<title>Zkaat at 14:37, 27 October 2010</title>
		<link rel="alternate" type="text/html" href="http://www.zarafa.com/wiki/index.php?title=Zarafa_Alert_Script_:_Recurrent_Meeting&amp;diff=1016&amp;oldid=prev"/>
				<updated>2010-10-27T14:37:02Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Older revision&lt;/td&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 14:37, 27 October 2010&lt;/td&gt;
		&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;#!/usr/bin/php&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;#!/usr/bin/php&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;?&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 290:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 291:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;?&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;?&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Zkaat</name></author>	</entry>

	<entry>
		<id>http://www.zarafa.com/wiki/index.php?title=Zarafa_Alert_Script_:_Recurrent_Meeting&amp;diff=1015&amp;oldid=prev</id>
		<title>Zkaat: New page: #!/usr/bin/php &lt;? /**  * This script can be used to fix all recurring items in Calendar which fall between 25oct to 31oct  * When calling from command line you have to pass usernames in sp...</title>
		<link rel="alternate" type="text/html" href="http://www.zarafa.com/wiki/index.php?title=Zarafa_Alert_Script_:_Recurrent_Meeting&amp;diff=1015&amp;oldid=prev"/>
				<updated>2010-10-27T14:32:53Z</updated>
		
		<summary type="html">&lt;p&gt;New page: #!/usr/bin/php &amp;lt;? /**  * This script can be used to fix all recurring items in Calendar which fall between 25oct to 31oct  * When calling from command line you have to pass usernames in sp...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;#!/usr/bin/php&lt;br /&gt;
&amp;lt;?&lt;br /&gt;
/**&lt;br /&gt;
 * This script can be used to fix all recurring items in Calendar which fall between 25oct to 31oct&lt;br /&gt;
 * When calling from command line you have to pass usernames in space separated list to the script,&lt;br /&gt;
 * if you want to fix recurring items for all users then pass &amp;quot;-a&amp;quot; as argument to the script&lt;br /&gt;
 * &lt;br /&gt;
 * Usage:&lt;br /&gt;
 * 		for selected users&lt;br /&gt;
 * 				php fix_recurring_items.php -u &amp;lt;username1&amp;gt; &amp;lt;username2&amp;gt; ...&lt;br /&gt;
 * 		for all users&lt;br /&gt;
 * 				php fix_recurring_items.php -a&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// comment this line for debugging&lt;br /&gt;
error_reporting(0);&lt;br /&gt;
&lt;br /&gt;
// mapi include files&lt;br /&gt;
include('/usr/share/php/mapi/mapi.util.php');&lt;br /&gt;
include('/usr/share/php/mapi/mapidefs.php');&lt;br /&gt;
include('/usr/share/php/mapi/mapicode.php');&lt;br /&gt;
include('/usr/share/php/mapi/mapitags.php');&lt;br /&gt;
include('/usr/share/php/mapi/mapiguid.php');&lt;br /&gt;
include('/usr/share/php/mapi/class.recurrence.php');&lt;br /&gt;
&lt;br /&gt;
// config options&lt;br /&gt;
$ADMINUSERNAME = &amp;quot;SYSTEM&amp;quot;;&lt;br /&gt;
$ADMINPASSWORD = &amp;quot;&amp;quot;;&lt;br /&gt;
$SERVER = &amp;quot;file:///var/run/zarafa&amp;quot;;&lt;br /&gt;
$USAGEMESSAGE = &amp;quot;Usage:\n\tfor selected users \n\t\tphp fix_recurring_items.php -u &amp;lt;username1&amp;gt; &amp;lt;username2&amp;gt; ...\n\tfor all users \n\t\tphp fix_recurring_items.php -a\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// properties&lt;br /&gt;
$proptags = Array();&lt;br /&gt;
$proptags[&amp;quot;entryid&amp;quot;] = PR_ENTRYID;&lt;br /&gt;
$proptags[&amp;quot;subject&amp;quot;] = PR_SUBJECT;&lt;br /&gt;
$proptags[&amp;quot;meetingstatus&amp;quot;] = &amp;quot;PT_LONG:PSETID_Appointment:0x8217&amp;quot;;&lt;br /&gt;
$proptags[&amp;quot;commonstart&amp;quot;] = &amp;quot;PT_SYSTIME:PSETID_Common:0x8516&amp;quot;;&lt;br /&gt;
$proptags[&amp;quot;commonend&amp;quot;] = &amp;quot;PT_SYSTIME:PSETID_Common:0x8517&amp;quot;;&lt;br /&gt;
$proptags[&amp;quot;recurring&amp;quot;] = &amp;quot;PT_BOOLEAN:PSETID_Appointment:0x8223&amp;quot;;&lt;br /&gt;
$proptags[&amp;quot;timezone_data&amp;quot;] = &amp;quot;PT_BINARY:PSETID_Appointment:0x8233&amp;quot;;&lt;br /&gt;
$proptags[&amp;quot;clipstart&amp;quot;] = &amp;quot;PT_SYSTIME:PSETID_Appointment:0x8235&amp;quot;;&lt;br /&gt;
$proptags[&amp;quot;clipend&amp;quot;] = &amp;quot;PT_SYSTIME:PSETID_Appointment:0x8236&amp;quot;;&lt;br /&gt;
$proptags[&amp;quot;startrecurdate&amp;quot;] = &amp;quot;PT_LONG:PSETID_Meeting:0xD&amp;quot;;&lt;br /&gt;
$proptags[&amp;quot;startrecurtime&amp;quot;] = &amp;quot;PT_LONG:PSETID_Meeting:0xE&amp;quot;;&lt;br /&gt;
$proptags[&amp;quot;endrecurdate&amp;quot;] = &amp;quot;PT_LONG:PSETID_Meeting:0xF&amp;quot;;&lt;br /&gt;
$proptags[&amp;quot;endrecurtime&amp;quot;] = &amp;quot;PT_LONG:PSETID_Meeting:0x10&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if($argc &amp;lt; 2) {&lt;br /&gt;
	exit($USAGEMESSAGE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// use SYSTEM account for login&lt;br /&gt;
$session = mapi_logon_zarafa($ADMINUSERNAME, $ADMINPASSWORD, $SERVER);&lt;br /&gt;
if(!$session) {&lt;br /&gt;
	exit(&amp;quot;Can't login into zarafa server\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// get all stores of SYSTEM account&lt;br /&gt;
$msgStoresTable = mapi_getmsgstorestable($session);&lt;br /&gt;
$msgStores = mapi_table_queryallrows($msgStoresTable, array(PR_DEFAULT_STORE, PR_ENTRYID));&lt;br /&gt;
&lt;br /&gt;
// get default store&lt;br /&gt;
foreach ($msgStores as $row) {&lt;br /&gt;
	if($row[PR_DEFAULT_STORE]) {&lt;br /&gt;
		$storeEntryid = $row[PR_ENTRYID];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!$storeEntryid) {&lt;br /&gt;
	exit(&amp;quot;Can't find default store\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// open default store&lt;br /&gt;
$store = mapi_openmsgstore($session, $storeEntryid);&lt;br /&gt;
if(!$store) {&lt;br /&gt;
	exit(&amp;quot;Unable to open system store\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// set named properties&lt;br /&gt;
$GLOBALS['proptags'] = getPropIdsFromStrings($store, $proptags);&lt;br /&gt;
&lt;br /&gt;
if(strcasecmp($argv[1], &amp;quot;-a&amp;quot;) == 0) {&lt;br /&gt;
	// get all zarafa users and remove property data&lt;br /&gt;
	$userList = array();&lt;br /&gt;
&lt;br /&gt;
	// for multi company setup&lt;br /&gt;
	$companyList = mapi_zarafa_getcompanylist($store);&lt;br /&gt;
	if(mapi_last_hresult() == NOERROR &amp;amp;&amp;amp; is_array($companyList)) {&lt;br /&gt;
		// multi company setup, get all users from all companies&lt;br /&gt;
		foreach($companyList as $companyName =&amp;gt; $companyData) {&lt;br /&gt;
			$userList = array_merge($userList, mapi_zarafa_getuserlist($store, $companyData[&amp;quot;companyid&amp;quot;]));&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		// single company setup, get list of all zarafa users&lt;br /&gt;
		$userList = mapi_zarafa_getuserlist($store);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(count($userList) &amp;lt;= 0) {&lt;br /&gt;
		exit(&amp;quot;Unable to get user list\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	foreach($userList as $userName =&amp;gt; $userData) {&lt;br /&gt;
		// check for valid users&lt;br /&gt;
		if($userName == &amp;quot;SYSTEM&amp;quot;) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		print &amp;quot;Searching recurring items for user - &amp;quot;. $userName . &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		$result = findRecurringItems($session, $store, $userName);&lt;br /&gt;
&lt;br /&gt;
		if($result) {&lt;br /&gt;
			print $result .&amp;quot; recurring item are fixed for user - &amp;quot; . $userName . &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			print &amp;quot;No defective recurring items found for user - &amp;quot; . $userName . &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
} else if(strcasecmp($argv[1], &amp;quot;-u&amp;quot;) == 0) {&lt;br /&gt;
	// only clear properties for selected users&lt;br /&gt;
	if($argc == 2) {&lt;br /&gt;
		exit(&amp;quot;No user specified\n\n&amp;quot; . $USAGEMESSAGE);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for($index = 2; $index &amp;lt; $argc; $index++) {		// start with argv[2]&lt;br /&gt;
		print &amp;quot;Searching recurring items for user - &amp;quot;. $argv[$index] . &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		$result = findRecurringItems($session, $store, $argv[$index]);&lt;br /&gt;
		if($result) {&lt;br /&gt;
			print $result .&amp;quot; recurring item are fixed for user - &amp;quot; . $argv[$index] . &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			print &amp;quot;No defective recurring items found for user - &amp;quot; . $argv[$index] . &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
} else {&lt;br /&gt;
	exit(&amp;quot;Unknown option specified\n\n&amp;quot; . $USAGEMESSAGE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************** Internal Functions ******************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * findRecurringItems&lt;br /&gt;
 *&lt;br /&gt;
 * Finds recurring items between 25 Oct to 31 Oct for specified username and store&lt;br /&gt;
 * @param session mapi session&lt;br /&gt;
 * @param resource store mapi store of given username&lt;br /&gt;
 * @param string userName username of user to search for.&lt;br /&gt;
 * @returns boolean/number false if no recurring item is fixed else no. of recurring items fixed&lt;br /&gt;
 */&lt;br /&gt;
function findRecurringItems($session, $store, $userName)&lt;br /&gt;
{&lt;br /&gt;
	$result = false;&lt;br /&gt;
	$itemCount = 0;&lt;br /&gt;
&lt;br /&gt;
	// create entryid of user's store&lt;br /&gt;
	$userStoreEntryId = mapi_msgstore_createentryid($store, $userName);&lt;br /&gt;
	if(!$userStoreEntryId) {&lt;br /&gt;
		print &amp;quot;\tError in creating entryid for user's store - &amp;quot; . $userName . &amp;quot;\n&amp;quot;;&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// open user's store&lt;br /&gt;
	$userStore = mapi_openmsgstore($session, $userStoreEntryId);&lt;br /&gt;
	if(!$userStore) {&lt;br /&gt;
		print &amp;quot;\tError in opening user's store - &amp;quot; . $userName . &amp;quot;\n&amp;quot;;&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// get user's root store&lt;br /&gt;
	$userRootStore = mapi_msgstore_openentry($userStore, null);&lt;br /&gt;
	$userRootStoreProps = mapi_getprops($userRootStore, array(PR_IPM_APPOINTMENT_ENTRYID));&lt;br /&gt;
&lt;br /&gt;
	// Open the user's calendar Folder&lt;br /&gt;
	$userCalendar = mapi_msgstore_openentry($userStore, $userRootStoreProps[PR_IPM_APPOINTMENT_ENTRYID]);&lt;br /&gt;
&lt;br /&gt;
	// get rows&lt;br /&gt;
	$calContentTable = mapi_folder_getcontentstable($userCalendar);&lt;br /&gt;
&lt;br /&gt;
	// Restriction to find all recurrings items&lt;br /&gt;
	$res = Array(RES_AND,&lt;br /&gt;
			Array(&lt;br /&gt;
				Array(RES_PROPERTY,&lt;br /&gt;
					Array(RELOP =&amp;gt; RELOP_EQ,&lt;br /&gt;
						  ULPROPTAG =&amp;gt; $GLOBALS['proptags']['recurring'],&lt;br /&gt;
						  VALUE =&amp;gt; true										// Item should be recurring&lt;br /&gt;
					)&lt;br /&gt;
				),&lt;br /&gt;
				Array(RES_PROPERTY,&lt;br /&gt;
					Array(RELOP =&amp;gt; RELOP_GE,&lt;br /&gt;
						  ULPROPTAG =&amp;gt; $GLOBALS['proptags']['commonstart'],&lt;br /&gt;
						  VALUE =&amp;gt; gmmktime(0, 0, 0, 10, 25, 2010)&lt;br /&gt;
					)&lt;br /&gt;
				),&lt;br /&gt;
				Array(RES_PROPERTY,&lt;br /&gt;
					Array(RELOP =&amp;gt; RELOP_LE,&lt;br /&gt;
						  ULPROPTAG =&amp;gt; $GLOBALS['proptags']['commonstart'],&lt;br /&gt;
						  VALUE =&amp;gt; gmmktime(0, 0, 0, 11, 1, 2010)&lt;br /&gt;
					)&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
	$rows = mapi_table_queryallrows($calContentTable, $GLOBALS['proptags'], $res);&lt;br /&gt;
&lt;br /&gt;
	// Now loop through each recurring item and find which one is falling in 25 - 31 OCT daterange.&lt;br /&gt;
	foreach ($rows as $row) {&lt;br /&gt;
		$result = processRecurringItem($userStore, $row);&lt;br /&gt;
		if ($result) $itemCount++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return $itemCount ? $itemCount : $result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * processRecurringItem&lt;br /&gt;
 *&lt;br /&gt;
 * Checks if given message is broken, if broken then fixes borken properties on message as well as in recurrence blob&lt;br /&gt;
 * @param resource store mapi store of given username&lt;br /&gt;
 * @param array itemProps message properties of recurring item&lt;br /&gt;
 * @return boolean returns true if found broken and fixed else false.&lt;br /&gt;
 */&lt;br /&gt;
function processRecurringItem($userStore, $itemProps)&lt;br /&gt;
{&lt;br /&gt;
	print &amp;quot;\tProcessing item - '&amp;quot;. $itemProps[PR_SUBJECT] .&amp;quot;' \n&amp;quot;;&lt;br /&gt;
	// Open message&lt;br /&gt;
	$message = mapi_msgstore_openentry($userStore, $itemProps[PR_ENTRYID]);&lt;br /&gt;
&lt;br /&gt;
	$recurr = new Recurrence($userStore, $message);&lt;br /&gt;
	$tz = $recurr-&amp;gt;parseTimezone($itemProps[$GLOBALS['proptags']['timezone_data']]);&lt;br /&gt;
&lt;br /&gt;
	// Calculate 'ClipStart' based on 'CommonStart'&lt;br /&gt;
	$localCommonStart = $recurr-&amp;gt;fromGMT($tz, $itemProps[$GLOBALS['proptags']['commonstart']]);	//Get commonStart in LOCAL time&lt;br /&gt;
	$clipStart = $recurr-&amp;gt;dayStartOf($localCommonStart);										//Get start of day of localtime&lt;br /&gt;
	$clipStart = $recurr-&amp;gt;toGMT($tz, $clipStart);												//Convert back to GMT time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if ($clipStart != $itemProps[$GLOBALS['proptags']['clipstart']]) {&lt;br /&gt;
		print &amp;quot;\t\tRecurring item - '&amp;quot;. $itemProps[PR_SUBJECT] .&amp;quot;' found broken.\n\t\tFixing - '&amp;quot;. $itemProps[PR_SUBJECT] .&amp;quot;'\n&amp;quot;;&lt;br /&gt;
		//This recurring item is broken&lt;br /&gt;
&lt;br /&gt;
		$props = Array();&lt;br /&gt;
		$props[$GLOBALS['proptags']['clipstart']] = $clipStart;&lt;br /&gt;
&lt;br /&gt;
		// Calculate 'StartRecurDate' and 'StartRecurTime'&lt;br /&gt;
		$gmStartDate = $recurr-&amp;gt;gmtime($localCommonStart);&lt;br /&gt;
		$props[$GLOBALS['proptags']['startrecurdate']] = ((intval($gmStartDate['tm_year'], 10)+1900) * 512) + ((intval($gmStartDate['tm_mon'], 10)+1) * 32) + intval($gmStartDate['tm_mday'], 10);&lt;br /&gt;
		$props[$GLOBALS['proptags']['startrecurtime']] = (intval($gmStartDate['tm_hour'], 10) * 4096) + (intval($gmStartDate['tm_min'], 10) * 64) + intval($gmStartDate['tm_sec'], 10);&lt;br /&gt;
&lt;br /&gt;
		// Calculate 'EndRecurDate' and 'EndRecurTime'&lt;br /&gt;
		$localCommonEnd = $recurr-&amp;gt;fromGMT($tz, $itemProps[$GLOBALS['proptags']['commonend']]);&lt;br /&gt;
		$gmEndDate = $recurr-&amp;gt;gmtime($localCommonEnd);&lt;br /&gt;
		$props[$GLOBALS['proptags']['endrecurdate']] = ((intval($gmEndDate['tm_year'], 10)+1900) * 512) + ((intval($gmEndDate['tm_mon'], 10)+1) * 32) + intval($gmEndDate['tm_mday'], 10);&lt;br /&gt;
		$props[$GLOBALS['proptags']['endrecurtime']] = (intval($gmEndDate['tm_hour'], 10) * 4096) + (intval($gmEndDate['tm_min'], 10) * 64) + intval($gmEndDate['tm_sec'], 10);&lt;br /&gt;
&lt;br /&gt;
		// Calculate Duration&lt;br /&gt;
		$duration = $localCommonEnd - $localCommonStart;&lt;br /&gt;
&lt;br /&gt;
		// Fix 'StartOcc' and 'EndOcc' in recurrence blob&lt;br /&gt;
		$recurr-&amp;gt;recur['startocc'] = ($gmStartDate['tm_hour'] * 60) + ($gmStartDate['tm_min']);&lt;br /&gt;
		$recurr-&amp;gt;recur['endocc'] = $recurr-&amp;gt;recur['startocc'] + ($duration / 60);&lt;br /&gt;
&lt;br /&gt;
		// Save recurrence&lt;br /&gt;
		$recurr-&amp;gt;saveRecurrence();&lt;br /&gt;
&lt;br /&gt;
		// Calculate 'ClipEnd' with the help of 'RecurEnd' and 'EndOcc' from recurr blob.&lt;br /&gt;
		if ($recurr-&amp;gt;recur['term'] != 0x23) {		// Do nothing if recurrence doesn' end&lt;br /&gt;
			$clipEnd = $recurr-&amp;gt;recur['end'] + ($recurr-&amp;gt;recur['endocc'] * 60);&lt;br /&gt;
			$clipEnd = $recurr-&amp;gt;fromGMT($tz, $clipEnd);&lt;br /&gt;
			$clipEnd = $recurr-&amp;gt;dayStartOf($clipEnd);&lt;br /&gt;
			$clipEnd = $recurr-&amp;gt;toGMT($tz, $clipEnd);&lt;br /&gt;
&lt;br /&gt;
			$props[$GLOBALS['proptags']['clipend']] = $clipEnd;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Commit changes&lt;br /&gt;
		mapi_setprops($message, $props);&lt;br /&gt;
		mapi_savechanges($message);&lt;br /&gt;
&lt;br /&gt;
		print &amp;quot;\t\tRecurring item - '&amp;quot;. $itemProps[PR_SUBJECT] .&amp;quot;' is now fixed.\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	print &amp;quot;\t\tRecurring item - '&amp;quot;. $itemProps[PR_SUBJECT] .&amp;quot;' seems good do not need any processing.\n&amp;quot;;&lt;br /&gt;
	print &amp;quot;\n&amp;quot;;&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zkaat</name></author>	</entry>

	</feed>