X-Git-Url: http://Server1/repobrowser/?a=blobdiff_plain;f=source%2Fobjects%2FCalDAV%2FCalDAV.cpp;h=7f268b05568736cc94008932f7f51107829f275f;hb=cba151c4b833a26c63984769f921bab5e755decd;hp=55ee65a983c25fa6825a1a1b0a19eed515f8dd0c;hpb=8916c05c5281bf0c97419df6e7ce6d641c56fb3e;p=xestiacalendar%2F.git diff --git a/source/objects/CalDAV/CalDAV.cpp b/source/objects/CalDAV/CalDAV.cpp index 55ee65a..7f268b0 100644 --- a/source/objects/CalDAV/CalDAV.cpp +++ b/source/objects/CalDAV/CalDAV.cpp @@ -1,14 +1,14 @@ // CalDAV.cpp - CalDAV Connection Object. // -// (c) 2016 Xestia Software Development. +// (c) 2016-2017 Xestia Software Development. // // This file is part of Xestia Calendar. // -// Xestia Address Book is free software: you can redistribute it and/or modify +// Xestia Calendar is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by the // Free Software Foundation, version 3 of the license. // -// Xestia Address Book is distributed in the hope that it will be useful, +// Xestia Calendar is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. @@ -23,10 +23,7 @@ using namespace std; size_t CalDAVReceive(char *ReceivedBuffer, size_t Size, size_t NewMemoryBytes, string *StringPointer) { - string ReceivedBufferString = ""; - ReceivedBufferString.append(ReceivedBuffer, NewMemoryBytes); - - StringPointer->append(ReceivedBufferString); + StringPointer->append(ReceivedBuffer, NewMemoryBytes); return Size * NewMemoryBytes; @@ -476,6 +473,7 @@ CalDAVCalendarList CalDAV::GetCalendars(){ " \n" " \n" " \n" + " \n" " \n" " \n" " \n" @@ -511,32 +509,333 @@ CalDAVCalendarList CalDAV::GetCalendars(){ //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 ServerList; + + } + + // Process the received XML data into a list of calendars + // and locations. + + ServerList = ProcessXMLCalendarList(); + // Restore the original settings. - string OriginalServerAddress = BuildServerAddress(&ConnectionData, "/principals"); + 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 ServerList; + +} + +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 ServerList; + return EntryList; } - ServerList = ProcessXMLCalendarList(); + EntryList = ProcessXMLSyncTokenList(); - return ServerList; + // 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; + + AddCalendar(&CalendarName, nullptr); + + return ServerResult; + +} + +CalDAVServerResult CalDAV::AddCalendar(string *CalendarName, string *CalendarShortName){ + CalDAVServerResult ServerResult; CalDAVSendData CalendarAddSendData; @@ -556,9 +855,19 @@ CalDAVServerResult CalDAV::AddCalendar(string CalendarName){ // Generate the UUID. - string UUIDValue = GenerateUUID(); - UUIDValue.erase(UUIDValue.end()-1); + string UUIDValue = ""; + + if (CalendarShortName == nullptr){ + + UUIDValue = GenerateUUID(); + UUIDValue.erase(UUIDValue.end()-1); + + } else { + UUIDValue = *CalendarShortName; + + } + string CalendarHomeURL = CalendarHomeURI; CalendarHomeURL.append(UUIDValue); CalendarHomeURL.append("/"); @@ -572,7 +881,7 @@ CalDAVServerResult CalDAV::AddCalendar(string CalendarName){ " \n" " \n" " "; - CalendarAddRequest += CalendarName; + CalendarAddRequest += *CalendarName; CalendarAddRequest += "\n" " \n" " \n" @@ -830,6 +1139,328 @@ CalDAVServerResult CalDAV::EditCalendarDescription(string *CalendarHREF, return ServerResult; } + +CalDAVServerResult CalDAV::DeleteCalendar(string *CalendarHREF){ + + CalDAVServerResult ServerResult; + + // Build the server address. + + string UserPrincipalURI = ""; + UserPrincipalURI = GetUserPrincipal(); + + if (UserPrincipalURI.size() == 0){ + + return ServerResult; + + } + + string CalendarHomeURI = ""; + CalendarHomeURI = GetCalendarHome(UserPrincipalURI); + + // Generate the UUID. + + string UUIDValue = GenerateUUID(); + UUIDValue.erase(UUIDValue.end()-1); + + string CalendarHomeURL = CalendarHomeURI; + CalendarHomeURL.append(UUIDValue); + CalendarHomeURL.append("/"); + + // Build the calendar list address. + + struct curl_slist *DeleteRequestHeader = NULL; + + DeleteRequestHeader = curl_slist_append(DeleteRequestHeader, "Depth: infinity"); + + string CalendarDeleteURLAddress = BuildServerAddress(&ConnectionData, (*CalendarHREF)); + + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, DeleteRequestHeader); + curl_easy_setopt(ConnectionHandle, CURLOPT_URL, CalendarDeleteURLAddress.c_str()); + curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "DELETE"); + + // Delete the calendar. + + ServerData.clear(); + ServerHeader.clear(); + + CURLcode ServerConnectionResult = curl_easy_perform(ConnectionHandle); + + if (ServerConnectionResult == CURLE_OK){ + ServerResult.Result = CALDAVQUERYRESULT_OK; + } else { + ServerResult.Result = CALDAVQUERYRESULT_SERVERERROR; + } + ServerResult.Code = ServerConnectionResult; + curl_easy_getinfo(ConnectionHandle, CURLINFO_RESPONSE_CODE, &ServerResult.HTTPCode); + + // 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); + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, NULL); + + return ServerResult; + +} + +CalDAVServerResult CalDAV::GetEntryETag(string *CalendarEntryHREF, string *ETagValue){ + + CalDAVServerResult ServerResult; + CalDAVSendData EntryETagGetData; + + // Build the server address. + + string UserPrincipalURI = ""; + UserPrincipalURI = GetUserPrincipal(); + + if (UserPrincipalURI.size() == 0){ + + return ServerResult; + + } + + string CalendarHomeURI = ""; + CalendarHomeURI = GetCalendarHome(UserPrincipalURI); + + // Split the path and filename. + + string EntryURIPath; + string EntryFilename; + + SplitPathFilename(CalendarEntryHREF, &EntryURIPath, &EntryFilename); + + // Build the request for the server. + + string EntryETagRequest = "\n" + "\n" + " \n" + " \n" + " \n" + " "; + EntryETagRequest += (*CalendarEntryHREF); + EntryETagRequest += "\n" + ""; + + EntryETagGetData.readptr = &EntryETagRequest; + EntryETagGetData.sizeleft = EntryETagRequest.size(); + + // Build the calendar list address. + + struct curl_slist *GetETagRequestHeader = NULL; + + GetETagRequestHeader = curl_slist_append(GetETagRequestHeader, "Depth: 1"); + GetETagRequestHeader = curl_slist_append(GetETagRequestHeader, "Prefer: return-minimal"); + GetETagRequestHeader = curl_slist_append(GetETagRequestHeader, "Content-Type: application/xml; charset=utf-8"); + + string GetETagURLAddress = BuildServerAddress(&ConnectionData, EntryURIPath); + + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, GetETagRequestHeader); + curl_easy_setopt(ConnectionHandle, CURLOPT_URL, GetETagURLAddress.c_str()); + curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "REPORT"); + curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 1L); + curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, &EntryETagGetData); + curl_easy_setopt(ConnectionHandle, CURLOPT_READFUNCTION, CalDAVSend); + + // Attempt to get the entity tag. + + ServerData.clear(); + ServerHeader.clear(); + + CURLcode ServerConnectionResult = curl_easy_perform(ConnectionHandle); + + if (ServerConnectionResult == CURLE_OK){ + ServerResult.Result = CALDAVQUERYRESULT_OK; + } else { + ServerResult.Result = CALDAVQUERYRESULT_SERVERERROR; + } + ServerResult.Code = ServerConnectionResult; + curl_easy_getinfo(ConnectionHandle, CURLINFO_RESPONSE_CODE, &ServerResult.HTTPCode); + + if (ServerConnectionResult != CURLE_OK){ + return ServerResult; + } + + // Get the entity tag from the result. + + *ETagValue = ProcessXMLEntryETag(); + + // 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); + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, NULL); + + return ServerResult; + +} + +CalDAVServerResult CalDAV::AddEntry(string *CalendarEntryHREF, string *EntryData){ + + // Add an entry to the calendar collection. + + CalDAVServerResult ServerResult; + CalDAVSendData EntryAddSendData; + + // Build the calendar list address. + + string EntryAddURLAddress = BuildServerAddress(&ConnectionData, (*CalendarEntryHREF)); + + EntryAddSendData.readptr = EntryData; + EntryAddSendData.sizeleft = EntryData->size(); + + struct curl_slist *CalendarRequestHeader = NULL; + + CalendarRequestHeader = curl_slist_append(CalendarRequestHeader, "Content-Type: text/calendar; charset=utf-8"); + + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, CalendarRequestHeader); + curl_easy_setopt(ConnectionHandle, CURLOPT_URL, EntryAddURLAddress.c_str()); + curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "PUT"); + curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 1L); + curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, &EntryAddSendData); + curl_easy_setopt(ConnectionHandle, CURLOPT_READFUNCTION, CalDAVSend); + + // Process the data. + + ServerData.clear(); + ServerHeader.clear(); + + CURLcode ServerConnectionResult = curl_easy_perform(ConnectionHandle); + + if (ServerConnectionResult == CURLE_OK){ + ServerResult.Result = CALDAVQUERYRESULT_OK; + } else { + ServerResult.Result = CALDAVQUERYRESULT_SERVERERROR; + } + ServerResult.Code = ServerConnectionResult; + curl_easy_getinfo(ConnectionHandle, CURLINFO_RESPONSE_CODE, &ServerResult.HTTPCode); + + // 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); + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, NULL); + + return ServerResult; + +} + +CalDAVServerResult CalDAV::EditEntry(string *CalendarEntryHREF, string *EntryData, string *EntryETag){ + + // Edit an entry in the calendar collection. + + // Add an entry to the calendar collection. + + CalDAVServerResult ServerResult; + CalDAVSendData EntryAddSendData; + + // Build the calendar list address. + + string EntryAddURLAddress = BuildServerAddress(&ConnectionData, (*CalendarEntryHREF)); + + EntryAddSendData.readptr = EntryData; + EntryAddSendData.sizeleft = EntryData->size(); + + string IfMatchHeader = "If-Match: \""; + IfMatchHeader.append(*EntryETag); + IfMatchHeader.append("\""); + + struct curl_slist *CalendarRequestHeader = NULL; + + CalendarRequestHeader = curl_slist_append(CalendarRequestHeader, "Content-Type: text/calendar; charset=utf-8"); + CalendarRequestHeader = curl_slist_append(CalendarRequestHeader, IfMatchHeader.c_str()); + + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, CalendarRequestHeader); + curl_easy_setopt(ConnectionHandle, CURLOPT_URL, EntryAddURLAddress.c_str()); + curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "PUT"); + curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 1L); + curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, &EntryAddSendData); + curl_easy_setopt(ConnectionHandle, CURLOPT_READFUNCTION, CalDAVSend); + + // Process the data. + + ServerData.clear(); + ServerHeader.clear(); + + CURLcode ServerConnectionResult = curl_easy_perform(ConnectionHandle); + + if (ServerConnectionResult == CURLE_OK){ + ServerResult.Result = CALDAVQUERYRESULT_OK; + } else { + ServerResult.Result = CALDAVQUERYRESULT_SERVERERROR; + } + ServerResult.Code = ServerConnectionResult; + curl_easy_getinfo(ConnectionHandle, CURLINFO_RESPONSE_CODE, &ServerResult.HTTPCode); + + // 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); + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, NULL); + + return ServerResult; + +} + +CalDAVServerResult CalDAV::DeleteEntry(string *CalendarEntryHREF){ + + // Delete an entry in the calendar collection. + + CalDAVServerResult ServerResult; + + // Build the calendar list address. + + string EntryDeleteURLAddress = BuildServerAddress(&ConnectionData, (*CalendarEntryHREF)); + + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, NULL); + curl_easy_setopt(ConnectionHandle, CURLOPT_URL, EntryDeleteURLAddress.c_str()); + curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "DELETE"); + + // Delete the calendar. + + ServerData.clear(); + ServerHeader.clear(); + + CURLcode ServerConnectionResult = curl_easy_perform(ConnectionHandle); + + if (ServerConnectionResult == CURLE_OK){ + ServerResult.Result = CALDAVQUERYRESULT_OK; + } else { + ServerResult.Result = CALDAVQUERYRESULT_SERVERERROR; + } + ServerResult.Code = ServerConnectionResult; + curl_easy_getinfo(ConnectionHandle, CURLINFO_RESPONSE_CODE, &ServerResult.HTTPCode); + + // 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); + curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, NULL); + + return ServerResult; + +} + bool CalDAVObjectValidSettings(CalDAVConnectionData *ConnData){ // Check if the passed CalDAV Connection Data is has