/** * * @param <type> $account * @param <type> $settings * @return <type> */ public function performSync() { $user_id = $this->_account->IdUser; $fnUserId = $this->_account->Email; $this->log("-----sync calendars for user_id={$user_id} fnUserId={$fnUserId}"); $wmCalendarManager = new CalendarManager($user_id); $fnCalendarManager = new FunambolCalendarManager($user_id); if (!$wmCalendarManager->InitManager() || !$fnCalendarManager->InitManager()) { return false; } $wmCalendarManager->InitAccount($this->_account); // in minutes. with dayLightSavingTime adjustment // WARNING // this is different from contacts $accountOffset = $this->_settings->AllowUsersChangeTimeZone ? $this->_account->GetDefaultTimeOffset() : $this->_account->GetDefaultTimeOffset($this->_settings->DefaultTimeZone); // - (int)date('I')*60; // get full list of calendars from account $wmCalendars = $wmCalendarManager->GetCalendarsList(true, true); $funambolEventIds = array(); $minCalendarId = NULL; foreach ($wmCalendars as $wmCalendar) { $wmEvents = $wmCalendar->GetValue('calendarEvents'); //echo "<pre>"; //var_dump( $wmEvents ); //echo "</pre>"; //continue; if ($minCalendarId == NULL) { $minCalendarId = $wmCalendar->GetValue('calendarId', 'int'); } if ($wmCalendar->GetValue('calendarId', 'int') < $minCalendarId) { $minCalendarId = $wmCalendar->GetValue('calendarId', 'int'); } foreach ($wmEvents as $wmEvent) { /* if($wmEvent->IsEventRepeat() ) { $internalRepeatForm = $wmEvent->GetInternalRepeatForm(); if(!is_null($internalRepeatForm)) { echo "<br/> RepeatContainer"; echo "<br/> eventTimeFrom=".$internalRepeatForm->GetValue('eventTimeFrom'); echo "<br/> repeatPeriod=".$internalRepeatForm->GetValue('repeatPeriod'); echo "<br/> repeatOrder=".$internalRepeatForm->GetValue('repeatOrder'); echo "<br/> repeatNum=".$internalRepeatForm->GetValue('repeatNum'); echo "<br/> repeatUntil=".$internalRepeatForm->GetValue('repeatUntil'); echo "<br/> repeatWeekNumber=".$internalRepeatForm->GetValue('repeatWeekNumber'); echo "<br/> repeatEnd=".$internalRepeatForm->GetValue('repeatEnd'); echo "<br/> repeatSun=".$internalRepeatForm->GetValue('repeatSun'); echo "<br/> repeatMon=".$internalRepeatForm->GetValue('repeatMon'); echo "<br/> repeatTue=".$internalRepeatForm->GetValue('repeatTue'); echo "<br/> repeatWed=".$internalRepeatForm->GetValue('repeatWed'); echo "<br/> repeatThu=".$internalRepeatForm->GetValue('repeatThu'); echo "<br/> repeatFri=".$internalRepeatForm->GetValue('repeatFri'); echo "<br/> repeatSat=".$internalRepeatForm->GetValue('repeatSat'); echo "<br/> excluded=".$internalRepeatForm->GetValue('excluded'); } } */ if ($wmEvent->GetValue('FunambolEventId', 'int') == NULL) { // new event in WM, push event to FN // FIXME, calendar name $fnEventContainer = $this->ConvertWMToFunambolEventContainer($fnUserId, "", $wmEvent, TRUE, $accountOffset); $funambolEventId = $fnCalendarManager->ReplaceEvent($fnEventContainer); $wmCalendarManager->SetEventFunambolId($wmEvent, $funambolEventId); array_push($funambolEventIds, $funambolEventId); $this->log("new event in WM. wmEventId=" . $wmEvent->GetValue('eventId') . " fnEventId={$funambolEventId}"); } else { // this event was already synchronized with FN $fnEvent = $fnCalendarManager->GetEvent($wmEvent->GetValue('FunambolEventId', 'int')); // if wmEvent is updated lately - overwrite it in FN $this->log("known event in WM. wmEventId=" . $wmEvent->GetValue('eventId') . " fnEventId=" . $fnEvent->GetValue('id')); // GMT modification date as 2000-12-31 23:59:59 $wmDateModified = $wmEvent->GetValue('eventLastModified'); // seconds from Epoch for this date $wmTimestampModified = strtotime($wmDateModified); // local server's timestamp - offset to get GMT as seconds from Epoch $fnTimestampModified = $this->ConvertFNtoWMTimestamp($fnEvent->GetValue('last_update'), TRUE); if ($wmTimestampModified == $fnTimestampModified) { $this->log("known event -- unmodified"); array_push($funambolEventIds, $wmEvent->GetValue('FunambolEventId', 'int')); } else { if ($wmTimestampModified > $fnTimestampModified) { // push event to FN // FIXME, calendar name $this->log("known event -- push from WM to FN"); $fnEventContainer = $this->ConvertWMToFunambolEventContainer($fnUserId, "", $wmEvent, TRUE, $accountOffset); $fnCalendarManager->ReplaceEvent($fnEventContainer); array_push($funambolEventIds, $wmEvent->GetValue('FunambolEventId', 'int')); } else { // TODO $this->log("known event -- pull from FN to WM"); // the simplest way - delete event and create new one; $wmCalendarManager->DeleteEvent($wmEvent, TRUE, TRUE); } } } // if(new or old event) } // foreach ($wmEvents) } // foreach( $wmCalendars ) // $funambolEventIds contains all events that are in WM // pull data from FN which are not in WM already $fnCalendarManager->SetUserAccount($fnUserId); $this->log("Pulling events from FN to WM. funambolEventIds=" . join(',', $funambolEventIds)); $fnEvents = $fnCalendarManager->GetEventsListExcluded($funambolEventIds); foreach ($fnEvents as $fnEvent) { $this->log("adding new event from FN to WM subj=" . $fnEvent->GetValue('subject') . " id=" . $fnEvent->GetValue('id')); $this->log("status of FN event:" . $fnEvent->GetValue('status')); $this->log("adding to calendar:" . $minCalendarId); $wmEvent = $this->ConvertFunambolToWMEventContainer($fnEvent, TRUE, $accountOffset); // FIXME, calendar id $wmEvent->SetValue('calendarId', $minCalendarId); $wmEvent->ConvertToRRule(); // echo "<pre>"; // var_dump($wmEvent); // echo "</pre>"; if ($fnEvent->GetValue('status') != FUNAMBOL_STATUS_DELETED) { $wmCalendarManager->CreateEvent($wmEvent); } } // foreach($fnEvents) return true; }