+CalDAVServerResult CalDAV::GetServerResult(){
+
+ return ConnectionServerResult;
+
+}
+
+CalDAVServerSupport CalDAV::GetServerSupport(){
+
+ CalDAVServerSupport ServerStatus;
+
+ // Setup the server connection.
+
+ curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "OPTIONS");
+
+ CURLcode ServerResult = curl_easy_perform(ConnectionHandle);
+
+ // Set the results.
+
+ 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 ServerStatus;
+ }
+
+ // Check that the server header has data in,
+ // otherwise return an "empty" CalDAVServerSupport.
+
+ if (ServerHeader.size() == 0){
+ return ServerStatus;
+ }
+
+ // Process each line looking for the first DAV header
+ // line.
+
+ bool NewlineMode = true;
+
+ string DAVLine;
+
+ for (int CharSeek = 0; CharSeek < ServerHeader.size(); CharSeek++){
+
+ if (NewlineMode == true){
+
+ // Check if we have reached the end of the string.
+
+ if (CharSeek >= ServerHeader.size()){
+
+ break;
+
+ }
+
+ // Check the first four letters to make sure
+ // they are 'DAV:'.
+
+ string DAVHeaderCheck = "";
+
+ try {
+ DAVHeaderCheck = ServerHeader.substr(CharSeek, 4);
+ }
+
+ catch (out_of_range &oor){
+ break;
+ }
+
+ if (DAVHeaderCheck == "DAV:"){
+
+ CharSeek += 5;
+
+ for (; CharSeek < ServerHeader.size(); CharSeek++){
+
+ if (ServerHeader[CharSeek] == '\n'){
+
+ break;
+
+ }
+
+ DAVLine.push_back(ServerHeader[CharSeek]);
+
+ }
+
+ break;
+
+ }
+
+ NewlineMode = false;
+
+ }
+
+ if (ServerHeader[CharSeek] == '\n'){
+
+ NewlineMode = true;
+
+ }
+
+ }
+
+ // Process the DAV line.
+
+ vector<string> DAVLineData;
+ string DAVSegmentString;
+
+ for (int CharSeek = 0; CharSeek < DAVLine.size(); CharSeek++){
+
+ if (DAVLine[CharSeek] == ' '){
+ continue;
+ }
+
+ if (DAVLine[CharSeek] == ','){
+
+ DAVLineData.push_back(DAVSegmentString);
+ DAVSegmentString.clear();
+ continue;
+
+ }
+
+ DAVSegmentString += DAVLine[CharSeek];
+
+ }
+
+ // Process the DAV values and set each value
+ // to true as required.
+
+ for (int DAVItemSeek = 0;
+ DAVItemSeek < DAVLineData.size();
+ DAVItemSeek++){
+
+ if (DAVLineData.at(DAVItemSeek) == "calendar-access"){
+
+ ServerStatus.BasicSupport = true;
+
+ }
+
+ }
+
+ // Reset the connection status.
+
+ curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, NULL);
+
+ return ServerStatus;
+
+}
+
+string CalDAV::GetUserPrincipal(){
+
+ string CurrentUserPrincipal = "";
+ string UserPrincipalRequest = "";
+ CalDAVSendData UserPrincipalSendData;
+
+ UserPrincipalRequest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<d:propfind xmlns:d=\"DAV:\">\n"
+ " <d:prop>\n"
+ " <d:current-user-principal />\n"
+ " </d:prop>\n"
+ "</d:propfind>";
+
+ UserPrincipalSendData.readptr = &UserPrincipalRequest;
+ UserPrincipalSendData.sizeleft = UserPrincipalRequest.size();
+
+ // Setup the header.
+
+ struct curl_slist *UserPrincipalRequestHeader = NULL;
+
+ UserPrincipalRequestHeader = curl_slist_append(UserPrincipalRequestHeader, "Depth: 0");
+ UserPrincipalRequestHeader = curl_slist_append(UserPrincipalRequestHeader, "Prefer: return-minimal");
+ UserPrincipalRequestHeader = curl_slist_append(UserPrincipalRequestHeader, "Content-Type: application/xml; charset=utf-8");
+
+ curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPHEADER, UserPrincipalRequestHeader);
+
+ curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "PROPFIND");
+ curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 1L);
+ curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, &UserPrincipalSendData);
+ curl_easy_setopt(ConnectionHandle, CURLOPT_READFUNCTION, CalDAVSend);
+
+ // Process the data.
+
+ ServerData.clear();
+ ServerHeader.clear();
+
+ CURLcode ServerResult = curl_easy_perform(ConnectionHandle);
+
+ // Set the results.
+
+ 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 CurrentUserPrincipal;
+
+ }
+
+ // Process the User Principal from the ServerData.
+
+ CurrentUserPrincipal = ProcessXMLUserPrincipal();
+
+ // Reset the changed settings.
+
+ curl_easy_setopt(ConnectionHandle, CURLOPT_UPLOAD, 0L);
+ curl_easy_setopt(ConnectionHandle, CURLOPT_READDATA, NULL);
+ curl_easy_setopt(ConnectionHandle, CURLOPT_READFUNCTION, NULL);
+
+ return CurrentUserPrincipal;
+}
+
+CalDAVCalendarList CalDAV::GetCalendars(){
+
+ CalDAVCalendarList ServerList;
+
+ return ServerList;
+
+}
+