X-Git-Url: http://Server1/repobrowser/?a=blobdiff_plain;f=source%2Fobjects%2FCalDAV%2FCalDAV.cpp;h=7f268b05568736cc94008932f7f51107829f275f;hb=cba151c4b833a26c63984769f921bab5e755decd;hp=68def693b3c10982c8ed31a71759d2fccdaa41b2;hpb=8955c9583a4425152b4d4f0e8e1435e482c46df7;p=xestiacalendar%2F.git diff --git a/source/objects/CalDAV/CalDAV.cpp b/source/objects/CalDAV/CalDAV.cpp index 68def69..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; @@ -545,8 +542,300 @@ 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; + + AddCalendar(&CalendarName, nullptr); + + return ServerResult; + +} + +CalDAVServerResult CalDAV::AddCalendar(string *CalendarName, string *CalendarShortName){ + CalDAVServerResult ServerResult; CalDAVSendData CalendarAddSendData; @@ -566,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("/"); @@ -582,7 +881,7 @@ CalDAVServerResult CalDAV::AddCalendar(string CalendarName){ " \n" " \n" " "; - CalendarAddRequest += CalendarName; + CalendarAddRequest += *CalendarName; CalendarAddRequest += "\n" " \n" " \n"