Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
Added support to add a calendar using a shortname.
[xestiacalendar/.git] / source / objects / CalDAV / CalDAV.cpp
index a34ca07..38c5bdb 100644 (file)
@@ -437,12 +437,13 @@ string CalDAV::GetCalendarHome(string UserPrincipalURI){
        
        // Reset the changed 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_UPLOAD, 0L);
        curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, NULL);
        curl_easy_setopt(ConnectionHandle, CURLOPT_READFUNCTION, NULL);
+       curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, NULL);
        
        return CalendarHomeURI;
        
@@ -467,22 +468,20 @@ CalDAVCalendarList CalDAV::GetCalendars(){
        string CalendarHomeURI = "";
        CalendarHomeURI = GetCalendarHome(UserPrincipalURI);
        
-       cout << ServerData << endl;
-       
        string CalendarListURLAddress = BuildServerAddress(&ConnectionData, CalendarHomeURI);
        
-       cout << CalendarListURLAddress << endl;
-       
        string CalendarListRequest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
        "<d:propfind 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:resourcetype />\n"
        "  <d:displayname />\n"
+       "  <d:sync-token />\n"
        "  <x0:calendar-color />\n"
        "  <x0:calendar-order />\n"
        "  <cs:getctag />\n"
        "  <c:supported-calendar-component-set />\n"
+       "  <c:calendar-description />\n"
        " </d:prop>\n"
        "</d:propfind>";
        
@@ -511,13 +510,31 @@ CalDAVCalendarList CalDAV::GetCalendars(){
        
        CURLcode ServerResult = curl_easy_perform(ConnectionHandle);
        
-       cout << ServerData << endl;
-       
        //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);
@@ -528,6 +545,643 @@ CalDAVCalendarList CalDAV::GetCalendars(){
        
 }
 
+CalDAVServerResult CalDAV::AddCalendar(string CalendarName){
+       
+       CalDAVServerResult ServerResult;
+       
+       AddCalendar(&CalendarName, nullptr);
+       
+       return ServerResult;
+       
+}
+
+CalDAVServerResult CalDAV::AddCalendar(string *CalendarName, string *CalendarShortName){
+       
+       CalDAVServerResult ServerResult;
+       CalDAVSendData CalendarAddSendData;
+       
+       // Build the server address.
+       
+       string UserPrincipalURI = "";
+       UserPrincipalURI = GetUserPrincipal();
+       
+       if (UserPrincipalURI.size() == 0){
+               
+               return ServerResult;
+               
+       }
+       
+       string CalendarHomeURI = "";
+       CalendarHomeURI = GetCalendarHome(UserPrincipalURI);
+       
+       // Generate the UUID.
+       
+       string UUIDValue = "";
+       
+       if (CalendarShortName == nullptr){
+       
+               UUIDValue = GenerateUUID();
+               UUIDValue.erase(UUIDValue.end()-1);
+
+       } else {
+       
+               UUIDValue = *CalendarShortName;
+               
+       }
+               
+       string CalendarHomeURL = CalendarHomeURI;
+       CalendarHomeURL.append(UUIDValue);
+       CalendarHomeURL.append("/");
+       
+       // Build the calendar list address.
+       
+       string CalendarListURLAddress = BuildServerAddress(&ConnectionData, CalendarHomeURL);
+       
+       string CalendarAddRequest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+       "<c:mkcalendar xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\">\n"
+       " <d:set>\n"
+       "  <d:prop>\n"
+       "   <d:displayname>";
+       CalendarAddRequest += *CalendarName;
+       CalendarAddRequest += "</d:displayname>\n"
+       "   <c:supported-calendar-component-set>\n"
+       "    <c:comp name=\"VTODO\"/>\n"
+       "    <c:comp name=\"VEVENT\"/>\n"
+       "   </c:supported-calendar-component-set>\n"
+       "  </d:prop>\n"
+       " </d:set>\n"
+       "</c:mkcalendar>";
+       
+       CalendarAddSendData.readptr = &CalendarAddRequest;
+       CalendarAddSendData.sizeleft = CalendarAddRequest.size();
+       
+       // Setup the header.
+       
+       struct curl_slist *CalendarRequestHeader = NULL;
+       
+       //curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, CalendarRequestHeader);
+       curl_easy_setopt(ConnectionHandle, CURLOPT_URL, CalendarListURLAddress.c_str());
+       curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "MKCALENDAR");
+       curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 1L);
+       curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, &CalendarAddSendData);
+       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);
+       
+       return ServerResult;
+       
+}
+
+CalDAVServerResult CalDAV::EditCalendarProcess(string *CalendarHREF,
+                       string *CalendarName,
+                       Colour *CalendarColour,
+                       string *CalendarDescription,
+                       int *CalendarOrder){
+
+       CalDAVServerResult ServerResult;
+       CalDAVSendData CalendarEditSendData;
+       
+       // 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.
+       
+       string CalendarEditURLAddress = BuildServerAddress(&ConnectionData, (*CalendarHREF));
+       
+       string CalendarEditRequest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+       "<d:propertyupdate xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\"\n"
+       "       xmlns:x0=\"http://apple.com/ns/ical/\">\n"
+       " <d:set>\n"
+       "  <d:prop>\n";
+       
+       // Update the calendar name.
+       
+       if (CalendarName != nullptr){
+       
+               CalendarEditRequest += "<d:displayname>";
+               CalendarEditRequest += (*CalendarName);
+               CalendarEditRequest += "</d:displayname>\n";
+               
+       }
+       
+       // Update the calendar colour.
+       
+       if (CalendarColour != nullptr){
+               
+               CalendarEditRequest += "<x0:calendar-color>";
+               CalendarEditRequest += (*CalendarColour);
+               CalendarEditRequest += "</x0:calendar-color>\n";
+               
+       }
+       
+       // Update the calendar description.
+       
+       if (CalendarDescription != nullptr){
+               
+               CalendarEditRequest += "<c:calendar-description>";
+               CalendarEditRequest += (*CalendarDescription);
+               CalendarEditRequest += "</c:calendar-description>\n";           
+               
+       }
+       
+       // Update the calendar order.
+       
+       if (CalendarOrder != nullptr){
+               
+               CalendarEditRequest += "<x0:calendar-order>";
+               CalendarEditRequest += to_string((*CalendarOrder));
+               CalendarEditRequest += "</x0:calendar-order>\n";
+               
+       }
+       
+       CalendarEditRequest += "  </d:prop>\n"
+       " </d:set>\n"
+       "</d:propertyupdate>";
+       
+       CalendarEditSendData.readptr = &CalendarEditRequest;
+       CalendarEditSendData.sizeleft = CalendarEditRequest.size();
+       
+       // Setup the header.
+       
+       struct curl_slist *CalendarRequestHeader = NULL;
+       
+       //curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, CalendarRequestHeader);
+       curl_easy_setopt(ConnectionHandle, CURLOPT_URL, CalendarEditURLAddress.c_str());
+       curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "PROPPATCH");
+       curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 1L);
+       curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, &CalendarEditSendData);
+       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);
+       
+       return ServerResult;
+
+}
+
+CalDAVServerResult CalDAV::EditCalendar(string *CalendarHREF,
+                       string *CalendarName,
+                       Colour *CalendarColour,
+                       string *CalendarDescription,
+                       int *CalendarOrder){
+       
+       CalDAVServerResult ServerResult;
+       
+       ServerResult = EditCalendarProcess(CalendarHREF,
+               CalendarName,
+               CalendarColour,
+               CalendarDescription,
+               CalendarOrder);
+                               
+       return ServerResult;
+       
+}
+
+CalDAVServerResult CalDAV::EditCalendar(string *CalendarHREF,
+                       Colour *CalendarColour){
+       
+
+       CalDAVServerResult ServerResult;
+
+       ServerResult = EditCalendarProcess(CalendarHREF,
+               nullptr,
+               CalendarColour,
+               nullptr,
+               nullptr);
+                               
+       return ServerResult;    
+       
+}
+
+CalDAVServerResult CalDAV::EditCalendar(string *CalendarHREF,
+                       string *CalendarName){
+       
+       CalDAVServerResult ServerResult;
+       
+       ServerResult = EditCalendarProcess(CalendarHREF,
+               CalendarName,
+               nullptr,
+               nullptr,
+               nullptr);       
+       
+       return ServerResult;
+       
+}
+
+CalDAVServerResult CalDAV::EditCalendar(string *CalendarHREF,
+                       int *CalendarOrder){
+       
+       CalDAVServerResult ServerResult;
+       
+       ServerResult = EditCalendarProcess(CalendarHREF,
+               nullptr,
+               nullptr,
+               nullptr,
+               CalendarOrder);
+       
+       return ServerResult;
+       
+}
+
+CalDAVServerResult CalDAV::EditCalendarDescription(string *CalendarHREF,
+                       string *CalendarDescription){
+       
+       CalDAVServerResult ServerResult;
+       
+       ServerResult = EditCalendarProcess(CalendarHREF,
+               nullptr,
+               nullptr,
+               CalendarDescription,
+               nullptr);
+       
+       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 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+       "<c:calendar-multiget xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\">\n"
+       " <d:prop>\n"
+       "  <d:getetag />\n"
+       " </d:prop>\n"
+       " <d:href>";
+       EntryETagRequest += (*CalendarEntryHREF);
+       EntryETagRequest += "</d:href>\n"
+       "</c:calendar-multiget>";
+       
+       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
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