@@ -257,12 +257,12 @@ void daysofweek_to_str(const uint32_t& weekrecur, std::string& daysofweek)
257257}
258258
259259/* *
260- * @brief Get the recurrence pattern structure
260+ * @brief Get the appointment recurrence pattern structure
261261 *
262262 * @param recurData Recurrence data
263263 * @return APPOINTMENT_RECUR_PAT Appointment recurrence pattern
264264 */
265- APPOINTMENT_RECUR_PAT getAppointmentRecur (const BINARY* recurData)
265+ APPOINTMENT_RECUR_PAT getAppointmentRecurPattern (const BINARY* recurData)
266266{
267267 EXT_PULL ext_pull;
268268 APPOINTMENT_RECUR_PAT apprecurr;
@@ -272,52 +272,84 @@ APPOINTMENT_RECUR_PAT getAppointmentRecur(const BINARY* recurData)
272272 return apprecurr;
273273}
274274
275+ /* *
276+ * @brief Get the recurrence pattern structure
277+ *
278+ * @param recurData Recurrence data
279+ * @return RECURRENCE_PATTERN Recurrence pattern
280+ */
281+ RECURRENCE_PATTERN getRecurPattern (const BINARY* recurData)
282+ {
283+ EXT_PULL ext_pull;
284+ RECURRENCE_PATTERN recurr;
285+ ext_pull.init (recurData->pb , recurData->cb , gromox::zalloc, EXT_FLAG_UTF16);
286+ if (ext_pull.g_recpat (&recurr) != EXT_ERR_SUCCESS)
287+ throw InputError (E3248 );
288+ return recurr;
289+ }
290+
275291/* *
276292 * @brief Get the Recurrence Pattern object
277293 *
278- * @param apprecurr Appointment recurrence pattern
294+ * @param recur_pat Recurrence pattern
279295 * @return tRecurrencePattern
280296 */
281- tRecurrencePattern get_recurrence_pattern (const APPOINTMENT_RECUR_PAT& apprecurr )
297+ tRecurrencePattern get_recurrence_pattern (const RECURRENCE_PATTERN& recur_pat )
282298{
283299 ICAL_TIME itime;
284300 std::string daysofweek (" " );
285- switch (apprecurr. recur_pat .patterntype )
301+ switch (recur_pat.patterntype )
286302 {
287303 case PATTERNTYPE_DAY:
288- return tDailyRecurrencePattern (apprecurr.recur_pat .period / 1440 );
304+ if (recur_pat.slidingflag )
305+ return tDailyRegeneratingPattern (recur_pat.period / 1440 );
306+ return tDailyRecurrencePattern (recur_pat.period / 1440 );
289307 case PATTERNTYPE_WEEK:
290308 {
291- daysofweek_to_str (apprecurr.recur_pat .pts .weekrecur , daysofweek);
292- return tWeeklyRecurrencePattern (apprecurr.recur_pat .period , daysofweek,
293- Enum::DayOfWeekType (uint8_t (apprecurr.recur_pat .firstdow )));
309+ daysofweek_to_str (recur_pat.pts .weekrecur , daysofweek);
310+ if (recur_pat.slidingflag )
311+ return tWeeklyRegeneratingPattern (recur_pat.period );
312+ return tWeeklyRecurrencePattern (recur_pat.period , daysofweek,
313+ Enum::DayOfWeekType (uint8_t (recur_pat.firstdow )));
294314 }
295315 case PATTERNTYPE_MONTH:
296316 case PATTERNTYPE_MONTHEND:
297317 case PATTERNTYPE_HJMONTH:
298318 case PATTERNTYPE_HJMONTHEND:
299319 {
300320 ical_get_itime_from_yearday (1601 ,
301- apprecurr.recur_pat .firstdatetime / 1440 + 1 , &itime);
302- if (apprecurr.recur_pat .period % 12 != 0 )
303- return tAbsoluteMonthlyRecurrencePattern (apprecurr.recur_pat .period ,
304- apprecurr.recur_pat .pts .dayofmonth );
305- return tAbsoluteYearlyRecurrencePattern (apprecurr.recur_pat .pts .dayofmonth ,
306- Enum::MonthNamesType (uint8_t (itime.month - 1 )));
321+ recur_pat.firstdatetime / 1440 + 1 , &itime);
322+ if (recur_pat.period % 12 != 0 )
323+ {
324+ if (recur_pat.slidingflag )
325+ return tMonthlyRegeneratingPattern (recur_pat.period );
326+ return tAbsoluteMonthlyRecurrencePattern (recur_pat.period ,
327+ recur_pat.pts .dayofmonth );
328+ }
329+ if (recur_pat.slidingflag )
330+ return tYearlyRegeneratingPattern (recur_pat.period );
331+ return tAbsoluteYearlyRecurrencePattern (recur_pat.pts .dayofmonth ,
332+ Enum::MonthNamesType (uint8_t (itime.month - 1 )));
307333 }
308334 case PATTERNTYPE_MONTHNTH:
309335 case PATTERNTYPE_HJMONTHNTH:
310336 {
311337 ical_get_itime_from_yearday (1601 ,
312- apprecurr. recur_pat .firstdatetime / 1440 + 1 , &itime);
313- daysofweek_to_str (apprecurr. recur_pat .pts .weekrecur , daysofweek);
338+ recur_pat.firstdatetime / 1440 + 1 , &itime);
339+ daysofweek_to_str (recur_pat.pts .weekrecur , daysofweek);
314340 Enum::DayOfWeekIndexType dayofweekindex (uint8_t (
315- apprecurr.recur_pat .pts .monthnth .recurnum - 1 ));
316- if (apprecurr.recur_pat .period % 12 != 0 )
317- return tRelativeMonthlyRecurrencePattern (apprecurr.recur_pat .period ,
318- daysofweek, dayofweekindex);
341+ recur_pat.pts .monthnth .recurnum - 1 ));
342+ if (recur_pat.period % 12 != 0 )
343+ {
344+ if (recur_pat.slidingflag )
345+ return tMonthlyRegeneratingPattern (recur_pat.period );
346+ return tRelativeMonthlyRecurrencePattern (recur_pat.period ,
347+ daysofweek, dayofweekindex);
348+ }
349+ if (recur_pat.slidingflag )
350+ return tYearlyRegeneratingPattern (recur_pat.period );
319351 return tRelativeYearlyRecurrencePattern (daysofweek, dayofweekindex,
320- Enum::MonthNamesType (uint8_t (itime.month - 1 )));
352+ Enum::MonthNamesType (uint8_t (itime.month - 1 )));
321353 }
322354 default :
323355 throw InputError (E3110 );
@@ -327,19 +359,19 @@ tRecurrencePattern get_recurrence_pattern(const APPOINTMENT_RECUR_PAT& apprecurr
327359/* *
328360 * @brief Get the Recurrence Range object
329361 *
330- * @param apprecurr Appointment recurrence pattern
362+ * @param recur_pat Recurrence pattern
331363 * @return tRecurrenceRange
332364 */
333- tRecurrenceRange get_recurrence_range (const APPOINTMENT_RECUR_PAT& apprecurr )
365+ tRecurrenceRange get_recurrence_range (const RECURRENCE_PATTERN& recur_pat )
334366{
335- auto startdate = rop_util_rtime_to_unix2 (apprecurr. recur_pat .startdate );
336- switch (apprecurr. recur_pat .endtype )
367+ auto startdate = rop_util_rtime_to_unix2 (recur_pat.startdate );
368+ switch (recur_pat.endtype )
337369 {
338370 case ENDTYPE_AFTER_N_OCCURRENCES:
339- return tNumberedRecurrenceRange (startdate, apprecurr. recur_pat .occurrencecount );
371+ return tNumberedRecurrenceRange (startdate, recur_pat.occurrencecount );
340372 case ENDTYPE_AFTER_DATE:
341373 return tEndDateRecurrenceRange (startdate,
342- rop_util_rtime_to_unix2 (apprecurr. recur_pat .enddate ));
374+ rop_util_rtime_to_unix2 (recur_pat.enddate ));
343375 default :
344376 return tNoEndRecurrenceRange (startdate);
345377 }
@@ -1318,6 +1350,17 @@ void tTask::update(const sShape& shape)
13181350 Status.emplace (statusType);
13191351 }
13201352 fromProp (shape.get (NtTaskEstimatedEffort), TotalWork);
1353+ if ((prop = shape.get (NtTaskRecurrence)))
1354+ {
1355+ const BINARY* recurData = static_cast <BINARY*>(prop->pvalue );
1356+ if (recurData->cb > 0 )
1357+ {
1358+ RECURRENCE_PATTERN recurr = getRecurPattern (recurData);
1359+ auto & rec = Recurrence.emplace ();
1360+ rec.TaskRecurrencePattern = get_recurrence_pattern (recurr);
1361+ rec.RecurrenceRange = get_recurrence_range (recurr);
1362+ }
1363+ }
13211364}
13221365
13231366// /////////////////////////////////////////////////////////////////////////////
@@ -1344,11 +1387,11 @@ void tCalendarItem::update(const sShape& shape)
13441387 CalendarItemType.emplace (Enum::RecurringMaster);
13451388 const BINARY* recurData = static_cast <BINARY*>(prop->pvalue );
13461389 if (recurData->cb > 0 ) {
1347- APPOINTMENT_RECUR_PAT apprecurr = getAppointmentRecur (recurData);
1390+ APPOINTMENT_RECUR_PAT apprecurr = getAppointmentRecurPattern (recurData);
13481391
13491392 auto & rec = Recurrence.emplace ();
1350- rec.RecurrencePattern = get_recurrence_pattern (apprecurr);
1351- rec.RecurrenceRange = get_recurrence_range (apprecurr);
1393+ rec.RecurrencePattern = get_recurrence_pattern (apprecurr. recur_pat );
1394+ rec.RecurrenceRange = get_recurrence_range (apprecurr. recur_pat );
13521395
13531396 // The count of the exceptions (modified and deleted occurrences)
13541397 // is summed in deletedinstancecount
@@ -2621,7 +2664,7 @@ decltype(tFieldURI::nameMap) tFieldURI::nameMap = {
26212664 {" task:Mileage" , {NtMileage, PT_UNICODE}},
26222665 {" task:Owner" , {NtTaskOwner, PT_UNICODE}},
26232666 {" task:PercentComplete" , {NtPercentComplete, PT_DOUBLE}},
2624- // {"task:Recurrence", {}},
2667+ {" task:Recurrence" , {NtTaskRecurrence, PT_BINARY }},
26252668 {" task:StartDate" , {NtTaskStartDate, PT_SYSTIME}},
26262669 {" task:Status" , {NtTaskStatus, PT_LONG}},
26272670 // {"task:StatusDescription", {}},
0 commit comments