From: Steve Brokenshire Date: Sun, 29 May 2016 19:26:29 +0000 (+0100) Subject: Added the GetEntryList functions for the CalDAV object. X-Git-Tag: release-0.02~269 X-Git-Url: http://Server1/repobrowser/?a=commitdiff_plain;h=9e423b13c59f59cf6fa7dffa04b99f7307891775;p=xestiacalendar%2F.git Added the GetEntryList functions for the CalDAV object. --- diff --git a/source/objects/CalDAV/CalDAV.cpp b/source/objects/CalDAV/CalDAV.cpp index 38c5bdb..4e476df 100644 --- a/source/objects/CalDAV/CalDAV.cpp +++ b/source/objects/CalDAV/CalDAV.cpp @@ -545,6 +545,288 @@ CalDAVCalendarList CalDAV::GetCalendars(){ } +CalDAVEntryList CalDAV::GetEntryList(string *CalendarHREF){ + + CalDAVEntryList EntryList; + CalDAVSendData EntryListSendData; + + if (CalendarHREF->size() == 0){ + + return EntryList; + + } + + string EntryListURLAddress = BuildServerAddress(&ConnectionData, *CalendarHREF); + + string EntryListRequest = "\n"; + + /*if (CalendarTag == nullptr){*/ + + EntryListRequest += "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + ""; + + /*} else { + + EntryListRequest += "\n" + " "; + EntryListRequest += *CalendarTag; + EntryListRequest += "\n" + " 1\n" + " \n" + " \n" + " \n" + " \n" + ""; + + }*/ + + EntryListSendData.readptr = &EntryListRequest; + EntryListSendData.sizeleft = EntryListRequest.size(); + + struct curl_slist *EntryListRequestHeader = NULL; + + EntryListRequestHeader = curl_slist_append(EntryListRequestHeader, "Content-Type: application/xml; charset=utf-8"); + + /*if (CalendarTag != nullptr){ + + EntryListRequestHeader = curl_slist_append(EntryListRequestHeader, "Content-Type: application/xml; charset=utf-8"); + EntryListRequestHeader = curl_slist_append(EntryListRequestHeader, "Content-Type: application/xml; charset=utf-8"); + + }*/ + + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, EntryListRequestHeader); + curl_easy_setopt(ConnectionHandle, CURLOPT_URL, EntryListURLAddress.c_str()); + curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 1L); + curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, &EntryListSendData); + curl_easy_setopt(ConnectionHandle, CURLOPT_READFUNCTION, CalDAVSend); + + // Process the data. + + ServerData.clear(); + ServerHeader.clear(); + + CURLcode ServerResult = curl_easy_perform(ConnectionHandle); + + //ServerList = ProcessXMLCalendarList(); + + if (ServerResult == CURLE_OK){ + ConnectionServerResult.Result = CALDAVQUERYRESULT_OK; + } else { + ConnectionServerResult.Result = CALDAVQUERYRESULT_SERVERERROR; + } + ConnectionServerResult.Code = ServerResult; + curl_easy_getinfo(ConnectionHandle, CURLINFO_RESPONSE_CODE, &ConnectionServerResult.HTTPCode); + + if (ServerResult != CURLE_OK){ + + return EntryList; + + } + + // Process the received XML data into a list of calendars + // and locations. + + EntryList = ProcessXMLEntryList(); + + // Restore the original settings. + + string OriginalServerAddress = BuildServerAddress(&ConnectionData, "/principals/"); + + curl_easy_setopt(ConnectionHandle, CURLOPT_URL, OriginalServerAddress.c_str()); + curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, NULL); + curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 0L); + curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, NULL); + curl_easy_setopt(ConnectionHandle, CURLOPT_READFUNCTION, NULL); + + return EntryList; + +} + +CalDAVEntryList CalDAV::GetEntryList(string *CalendarHREF, string *CalendarTag){ + + CalDAVEntryList EntryList; + CalDAVSendData EntryListSendData; + + if (CalendarHREF->size() == 0){ + + return EntryList; + + } + + string EntryListURLAddress = BuildServerAddress(&ConnectionData, *CalendarHREF); + + // First query: Get the list of contacts that need to be updated. + + string EntryListRequest = "\n"; + + EntryListRequest += "\n" + " "; + + if (CalendarTag != nullptr){ + + EntryListRequest += *CalendarTag; + + } else { + + EntryListRequest += ""; + + } + + EntryListRequest += "\n" + " 1\n" + " \n" + " \n" + " \n" + ""; + + EntryListSendData.readptr = &EntryListRequest; + EntryListSendData.sizeleft = EntryListRequest.size(); + + struct curl_slist *EntryListRequestHeader = NULL; + + EntryListRequestHeader = curl_slist_append(EntryListRequestHeader, "Content-Type: application/xml; charset=utf-8"); + + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, EntryListRequestHeader); + curl_easy_setopt(ConnectionHandle, CURLOPT_URL, EntryListURLAddress.c_str()); + curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 1L); + curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, &EntryListSendData); + curl_easy_setopt(ConnectionHandle, CURLOPT_READFUNCTION, CalDAVSend); + + // Process the data. + + ServerData.clear(); + ServerHeader.clear(); + + CURLcode ServerResult = curl_easy_perform(ConnectionHandle); + + if (ServerResult == CURLE_OK){ + ConnectionServerResult.Result = CALDAVQUERYRESULT_OK; + } else { + ConnectionServerResult.Result = CALDAVQUERYRESULT_SERVERERROR; + } + ConnectionServerResult.Code = ServerResult; + curl_easy_getinfo(ConnectionHandle, CURLINFO_RESPONSE_CODE, &ConnectionServerResult.HTTPCode); + + if (ServerResult != CURLE_OK){ + + return EntryList; + + } + + EntryList = ProcessXMLSyncTokenList(); + + // Check the last entry matches the HREF and if it + // does then delete it. + + if (EntryList.HREF.size() > 0) { + + if (EntryList.HREF.rbegin()->second == *CalendarHREF){ + + EntryList.HREF.erase((EntryList.HREF.size() - 1)); + EntryList.Tag.erase((EntryList.HREF.size() - 1)); + EntryList.Data.erase((EntryList.HREF.size() - 1)); + + } + + } + + // Build the list into a new list for getting the new + // calendar data with. + + EntryListRequest.clear(); + + EntryListRequest = "\n"; + + EntryListRequest += "\n" + " \n" + " \n" + " \n" + " \n"; + + for (std::map::iterator HREFIter = EntryList.HREF.begin(); + HREFIter != EntryList.HREF.end(); HREFIter++){ + + string EntryListHREFString = HREFIter->second; + + EntryListRequest += " "; + EntryListRequest += EntryListHREFString; + EntryListRequest += "\n"; + + } + + EntryListRequest += ""; + + CalDAVSendData UpdatedEntryListSendData; + + UpdatedEntryListSendData.readptr = &EntryListRequest; + UpdatedEntryListSendData.sizeleft = EntryListRequest.size(); + + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, EntryListRequestHeader); + curl_easy_setopt(ConnectionHandle, CURLOPT_URL, EntryListURLAddress.c_str()); + curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 1L); + curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, &UpdatedEntryListSendData); + curl_easy_setopt(ConnectionHandle, CURLOPT_READFUNCTION, CalDAVSend); + + // Get the updated calendar data. + + ServerData.clear(); + ServerHeader.clear(); + EntryList.HREF.clear(); + EntryList.Tag.clear(); + EntryList.Data.clear(); + + ServerResult = curl_easy_perform(ConnectionHandle); + + // Check the last entry matches the HREF and if it + // does then delete it. + + if (ServerResult == CURLE_OK){ + ConnectionServerResult.Result = CALDAVQUERYRESULT_OK; + } else { + ConnectionServerResult.Result = CALDAVQUERYRESULT_SERVERERROR; + } + ConnectionServerResult.Code = ServerResult; + curl_easy_getinfo(ConnectionHandle, CURLINFO_RESPONSE_CODE, &ConnectionServerResult.HTTPCode); + + if (ServerResult != CURLE_OK){ + + return EntryList; + + } + + EntryList = ProcessXMLEntryList(); + + // Second query: Get the list of contact data for the contacts that have + // beenchanged. + + // Restore the original settings. + + string OriginalServerAddress = BuildServerAddress(&ConnectionData, "/principals/"); + + curl_easy_setopt(ConnectionHandle, CURLOPT_URL, OriginalServerAddress.c_str()); + curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, NULL); + curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 0L); + curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, NULL); + curl_easy_setopt(ConnectionHandle, CURLOPT_READFUNCTION, NULL); + + return EntryList; + +} + CalDAVServerResult CalDAV::AddCalendar(string CalendarName){ CalDAVServerResult ServerResult; diff --git a/source/objects/CalDAV/CalDAV.h b/source/objects/CalDAV/CalDAV.h index 86e554b..0b45ae6 100644 --- a/source/objects/CalDAV/CalDAV.h +++ b/source/objects/CalDAV/CalDAV.h @@ -54,6 +54,12 @@ struct CalDAVCalendarList { map TagURL; }; + +struct CalDAVEntryList { + + map HREF; + map Data; + map Tag; }; @@ -151,6 +157,8 @@ class CalDAV{ CalDAVServerResult GetServerResult(); CalDAVServerSupport GetServerSupport(); CalDAVCalendarList GetCalendars(); + CalDAVEntryList GetEntryList(string *CalendarHREF); + CalDAVEntryList GetEntryList(string *CalendarHREF, string *CalendarTag); CalDAVServerResult AddCalendar(string CalendarName); CalDAVServerResult AddCalendar(string *CalendarName, string *CalendarShortName);