Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
Renamed CalDAVOutput to CalDAVReceive
[xestiacalendar/.git] / source / objects / CalDAV / CalDAV.cpp
index c781e94..256bc25 100644 (file)
@@ -20,7 +20,7 @@
 
 using namespace std;
 
-size_t CalDAVOutput(char *ReceivedBuffer, size_t Size, size_t NewMemoryBytes, string *StringPointer)
+size_t CalDAVReceive(char *ReceivedBuffer, size_t Size, size_t NewMemoryBytes, string *StringPointer)
 {
        
        string ReceivedBufferString = "";
@@ -77,6 +77,7 @@ CalDAVStatus CalDAV::GetConnectionData(){
        ConnectionStatus.Username = ConnectionData.Username;
        ConnectionStatus.Prefix = ConnectionData.Prefix;
        ConnectionStatus.UseSSL = ConnectionData.UseSSL;
+       ConnectionStatus.Timeout = ConnectionData.Timeout;
        
        return ConnectionStatus;
        
@@ -88,28 +89,10 @@ CalDAVServerResult CalDAV::Connect(){
 
        string ServerAddress = "";
        string ServerUserPass = "";
-       string ServerData = "";
-       string ServerHeader = "";
 
        // Setup the server address.
        
-       if (ConnectionData.UseSSL == true){
-               ServerAddress += "https://";
-       } else {
-               ServerAddress += "http://";
-       }
-       
-       ServerAddress += ConnectionData.Hostname;
-       
-       // Check if server port is 80, otherwise
-       // specifiy the port number in the address.
-       
-       if (ConnectionData.Port != 80){
-               ServerAddress += ":";
-               ServerAddress += to_string(ConnectionData.Port);
-       }
-       
-       ServerAddress += "/principals/";
+       ServerAddress = BuildServerAddress(&ConnectionData, "/principals/");
 
        // Setup the server password.
        
@@ -121,6 +104,7 @@ CalDAVServerResult CalDAV::Connect(){
        curl_easy_setopt(ConnectionHandle, CURLOPT_USERPWD, ServerUserPass.c_str());
        curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
        curl_easy_setopt(ConnectionHandle, CURLOPT_FAILONERROR, 1L);
+       curl_easy_setopt(ConnectionHandle, CURLOPT_TIMEOUT, ConnectionData.Timeout);
        curl_easy_setopt(ConnectionHandle, CURLOPT_WRITEFUNCTION, CalDAVOutput);
        curl_easy_setopt(ConnectionHandle, CURLOPT_WRITEDATA, &ServerData);
        curl_easy_setopt(ConnectionHandle, CURLOPT_WRITEHEADER, &ServerHeader);
@@ -149,6 +133,133 @@ CalDAVServerResult CalDAV::Connect(){
        
 }
 
+CalDAVServerSupport CalDAV::GetServerSupport(){
+
+       CalDAVServerSupport ServerStatus;
+       
+       // Setup the server connection.
+       
+       curl_easy_setopt(ConnectionHandle, CURLOPT_CUSTOMREQUEST, "OPTIONS");
+       
+       CURLcode ServerResult = curl_easy_perform(ConnectionHandle);
+       
+       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;
+               
+               }
+                       
+       }
+       
+       return ServerStatus;
+       
+}
+
 bool CalDAVObjectValidSettings(CalDAVConnectionData *ConnData){
 
        // Check if the passed CalDAV Connection Data is has
@@ -208,4 +319,32 @@ bool CalDAVObjectValidSettings(CalDAVConnectionData *ConnData){
        
        return true;
 
+}
+
+string BuildServerAddress(CalDAVConnectionData *ConnData, string URIAddress){
+       
+       string ServerAddress;
+       
+       // Setup the server address.
+       
+       if (ConnData->UseSSL == true){
+               ServerAddress += "https://";
+       } else {
+               ServerAddress += "http://";
+       }
+       
+       ServerAddress += ConnData->Hostname;
+       
+       // Check if server port is 80, otherwise
+       // specifiy the port number in the address.
+       
+       if (ConnData->Port != 80){
+               ServerAddress += ":";
+               ServerAddress += to_string(ConnData->Port);
+       }
+       
+       ServerAddress += URIAddress;
+       
+       return ServerAddress;
+       
 }
\ No newline at end of file
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