Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
Added the GetEntryList functions for the CalDAV object.
authorSteve Brokenshire <sbrokenshire@xestia.co.uk>
Sun, 29 May 2016 19:26:29 +0000 (20:26 +0100)
committerSteve Brokenshire <sbrokenshire@xestia.co.uk>
Sun, 29 May 2016 19:26:29 +0000 (20:26 +0100)
source/objects/CalDAV/CalDAV.cpp
source/objects/CalDAV/CalDAV.h

index 38c5bdb..4e476df 100644 (file)
@@ -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 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+       
+       /*if (CalendarTag == nullptr){*/
+               
+       EntryListRequest += "<c:calendar-query xmlns:d=\"DAV:\" xmlns:cs=\"http://calendarserver.org/ns/\""
+       " xmlns:c=\"urn:ietf:params:xml:ns:caldav\" xmlns:x0=\"http://apple.com/ns/ical/\">\n"
+       " <d:prop>\n"
+       "  <d:getetag />\n"
+       "  <c:calendar-data />\n"
+       " </d:prop>\n"
+       " <c:filter>\n"
+       "  <c:comp-filter name=\"VCALENDAR\" />\n"
+       " </c:filter>\n"
+       "</c:calendar-query>";
+               
+       /*} else {
+
+               EntryListRequest += "<d:sync-collection xmlns:d=\"DAV:\" xmlns:cs=\"http://calendarserver.org/ns/\""
+               " xmlns:c=\"urn:ietf:params:xml:ns:caldav\" xmlns:x0=\"http://apple.com/ns/ical/\">\n"          
+               " <d:sync-token>";
+               EntryListRequest += *CalendarTag;
+               EntryListRequest += "</d:sync-token>\n"
+               " <d:sync-level>1</d:sync-level>\n"
+               " <d:prop>\n"
+               "  <d:getetag />\n"
+               "  <c:calendar-data />\n"
+               " </d:prop>\n"
+               "</d:sync-collection>";
+               
+       }*/
+       
+       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 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+
+       EntryListRequest += "<d:sync-collection xmlns:d=\"DAV:\" xmlns:cs=\"http://calendarserver.org/ns/\""
+       " xmlns:c=\"urn:ietf:params:xml:ns:caldav\" xmlns:x0=\"http://apple.com/ns/ical/\">\n"
+       " <d:sync-token>";
+       
+       if (CalendarTag != nullptr){
+       
+               EntryListRequest += *CalendarTag;
+               
+       } else {
+       
+               EntryListRequest += "";
+               
+       }
+
+       EntryListRequest += "</d:sync-token>\n"
+       " <d:sync-level>1</d:sync-level>\n"
+       " <d:prop>\n"
+       "  <d:getetag />\n"
+       " </d:prop>\n"
+       "</d:sync-collection>";
+       
+       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 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+
+       EntryListRequest += "<c:calendar-multiget xmlns:d=\"DAV:\" "
+       " xmlns:c=\"urn:ietf:params:xml:ns:caldav\">\n"
+       " <d:prop>\n"
+       "  <d:getetag />\n"
+       "  <c:calendar-data />\n"
+       " </d:prop>\n";
+       
+       for (std::map<int,string>::iterator HREFIter = EntryList.HREF.begin(); 
+               HREFIter != EntryList.HREF.end(); HREFIter++){
+               
+               string EntryListHREFString = HREFIter->second;
+                       
+               EntryListRequest += " <d:href>";
+               EntryListRequest += EntryListHREFString;
+               EntryListRequest += "</d:href>\n";
+                       
+       }
+       
+       EntryListRequest += "</c:calendar-multiget>";
+       
+       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;
index 86e554b..0b45ae6 100644 (file)
@@ -54,6 +54,12 @@ struct CalDAVCalendarList {
        map<int,string> TagURL;
        
 };
+
+struct CalDAVEntryList {
+       
+       map<int,string> HREF;
+       map<int,string> Data;
+       map<int,string> 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);
Xestia Software Development
Yn Maystri
© 2006 - 2019 Xestia Software Development
Software

Xestia Address Book
Xestia Calendar
Development

Xestia Gelforn
Everything else

About
News
Privacy Policy