winrecurrence.cpp
来自「funambol window mobile客户端源代码」· C++ 代码 · 共 440 行 · 第 1/2 页
CPP
440 行
if (!token) {
goto error;
}
//
// First token will be: "D|W|MP|MD|YM|YD<interval>"
//
if(token[0] == TEXT('D')) {
recType = winRecursDaily;
token ++;
}
else if(token[0] == TEXT('W')) {
recType = winRecursWeekly;
token ++;
}
else if(token[0] == TEXT('M') && token[1] == TEXT('D')) {
recType = winRecursMonthly;
token += 2;
}
else if(token[0] == TEXT('M') && token[1] == TEXT('P')) {
recType = winRecursMonthNth;
token += 2;
}
else if(token[0] == TEXT('Y') && token[1] == TEXT('D')) {
// "YD" Not supported!!
LOG.info("WinRecurrence::parse - Warning: RecurrenceType 'YD' not supported: \"%ls\"", dataString.c_str());
goto finally;
}
else if(token[0] == TEXT('Y') && token[1] == TEXT('M')) {
recType = winRecursYearly;
token += 2;
}
interval = _wtoi(token);
if(!interval || recType == -1) {
goto error;
}
WCHAR* days = new WCHAR[30];
wcscpy(days, L"");
WCHAR* mOfYear = new WCHAR[20];
wcscpy(mOfYear, L"");
token = wcstok(NULL, seps);
while (token) {
//
// Daily = 0
//
if(recType == winRecursDaily) {
if(wcschr(token, TEXT('#'))) {
setIntProperty(L"RecurrenceType", recType);
setIntProperty(L"Interval", interval);
occurences = _wtoi(token+1);
if(occurences == 0) setIntProperty(L"NoEndDate", 1);
else setIntProperty(L"Occurrences", occurences);
token ++;
}
else if(token[8] == TEXT('T')) {
setIntProperty(L"RecurrenceType", recType);
setProperty(L"PatternEndDate", token);
setIntProperty(L"Interval", interval);
}
}
//
// Weekly = 1
//
else if(recType == winRecursWeekly) {
if(wcschr(token, TEXT('#'))) {
setIntProperty(L"RecurrenceType", recType);
setIntProperty(L"Interval", interval);
occurences = _wtoi(token+1);
if(occurences == 0) setIntProperty(L"NoEndDate", 1);
else setIntProperty(L"Occurrences", occurences);
if(wcscmp(days, L"")) setIntProperty(L"DayOfWeekMask", stringToDaysOfWeek(days));
else setIntProperty(L"DayOfWeekMask", getWeekDayFromDate(startDate));
token++;
}
else if(token[8] == TEXT('T')) {
setIntProperty(L"RecurrenceType", recType);
setProperty(L"PatternEndDate", token);
setIntProperty(L"Interval", interval);
if(wcscmp(days, L"")) setIntProperty(L"DayOfWeekMask", stringToDaysOfWeek(days));
else setIntProperty(L"DayOfWeekMask", getWeekDayFromDate(startDate));
}
else if(isWeekDay(token)) {
wcscat(days, token);
wcscat(days, TEXT(" "));
}
}
//
// Monthly = 2
//
else if(recType == winRecursMonthly) {
// VCalendar supports as Monthly by day rules: MD<interval> listofdates|listofdates(from end of month) <end tag>
// On Outlook recurrence pattern only MD<interval> day <end tag> can be represented
if(wcschr(token, TEXT('#'))) {
setIntProperty(L"RecurrenceType", recType);
setIntProperty(L"DayOfMonth", dayOfMonth);
setIntProperty(L"Interval", interval);
occurences = _wtoi(token+1);
if(occurences == 0) setIntProperty(L"NoEndDate", 1);
else setIntProperty(L"Occurrences", occurences);
token++;
}
else if(token[8] == TEXT('T')) {
setIntProperty(L"RecurrenceType", recType);
setProperty(L"PatternEndDate", token);
setIntProperty(L"Interval", interval);
setIntProperty(L"DayOfMonth", dayOfMonth);
}
else {
if(dayOfMonth != -1) {
goto error;
}
dayOfMonth = _wtoi(token);
if(dayOfMonth == 0) {
goto error;
}
}
}
//
// MonthNth = 3
//
else if(recType == winRecursMonthNth) {
if(wcschr(token, TEXT('#'))) {
setIntProperty(L"RecurrenceType", recType);
setIntProperty(L"Interval", interval);
setIntProperty(L"Instance", weekOfMonth);
setIntProperty(L"DayOfWeekMask", stringToDaysOfWeek(days));
occurences = _wtoi(token+1);
if(occurences == 0) setIntProperty(L"NoEndDate", 1);
else setIntProperty(L"Occurrences", occurences);
token++;
}
else if(token[8] == TEXT('T')) {
setIntProperty(L"RecurrenceType", recType);
setProperty(L"PatternEndDate", token);
setIntProperty(L"Interval", interval);
setIntProperty(L"Instance", weekOfMonth);
setIntProperty(L"DayOfWeekMask", stringToDaysOfWeek(days));
}
else if(isWeekDay(token)) {
wcscat(days, token);
wcscat(days, TEXT(" "));
}
else {
if(token[1] != TEXT('+') && token[1] != TEXT('-')) {
goto error;
}
WCHAR sWeek[] = TEXT("\0\0");
sWeek[0] = token[0];
weekOfMonth = _wtoi(sWeek);
if(token[1] == TEXT('-')) {
// it's the # of weeks to the end of month...
weekOfMonth = 5 - weekOfMonth;
}
if(weekOfMonth > 5 || weekOfMonth < 1) {
goto error;
}
}
}
//
// Yearly = 5
//
else if(recType == winRecursYearly) {
// Expected sequence will be YM1 month <end tag>
if(wcschr(token, TEXT('#'))) {
setIntProperty(L"RecurrenceType", recType);
setIntProperty(L"Interval", interval);
setIntProperty(L"MonthOfYear",monthOfYear);
setIntProperty(L"DayOfMonth", dayOfMonth);
occurences = _wtoi(token+1);
if(occurences == 0) setIntProperty(L"NoEndDate", 1);
else setIntProperty(L"Occurrences", occurences);
token++;
}
else if(token[8] == TEXT('T')) {
setIntProperty(L"RecurrenceType", recType);
setProperty(L"PatternEndDate", token);
setIntProperty(L"Interval", interval);
setIntProperty(L"MonthOfYear",monthOfYear);
setIntProperty(L"DayOfMonth", dayOfMonth);
}
else {
if(wcscmp(mOfYear, L"")) {
goto error;
}
wcscat(mOfYear, token);
monthOfYear = _wtoi(mOfYear);
SYSTEMTIME st;
VariantTimeToSystemTime(startDate, &st);
dayOfMonth = st.wDay;
setIntProperty(L"RecurrenceType", recType);
setIntProperty(L"Interval", interval);
setIntProperty(L"MonthOfYear",monthOfYear);
setIntProperty(L"DayOfMonth", dayOfMonth);
}
}
token = wcstok(NULL, seps);
}
ret = 0;
goto finally;
error:
LOG.error("WinRecurrence::parse error, bad RRULE format: %ls", dataString.c_str());
ret = 1;
goto finally;
finally:
if (str) delete [] str;
if (days) delete [] days;
if (mOfYear) delete [] mOfYear;
return ret;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?