// with Xestia Calendar. If not, see <http://www.gnu.org/licenses/>
#include "CalDAV.h"
+#include <iostream>
+
+using namespace std;
+
+CalDAV::CalDAV(){
+
+ // Setup the objects within the CalDAV connection
+ // object.
+
+ ConnectionHandle = curl_easy_init();
+
+}
+
+CalDAV::~CalDAV(){
+
+ // Destory the objects within the CalDAV connection
+ // object.
+
+ curl_easy_cleanup(ConnectionHandle);
+ ConnectionHandle = nullptr;
+
+}
+
+void CalDAV::SetupConnectionData(CalDAVConnectionData *ConnData){
+
+ // Check if ConnData is a nullptr, return if it is.
+
+ if (ConnData == nullptr){
+ return;
+ }
+
+ // Set the connection settings to the values from ConnData.
+
+ ConnectionData = (*ConnData);
+
+}
+
+CalDAVStatus CalDAV::GetConnectionData(){
+
+ // Get the current connection settings for the CalDAV
+ // connection object and return a CalDAVStatus object.
+
+ CalDAVStatus ConnectionStatus;
+
+ ConnectionStatus.Hostname = ConnectionData.Hostname;
+ ConnectionStatus.Port = ConnectionData.Port;
+ ConnectionStatus.Username = ConnectionData.Username;
+ ConnectionStatus.Prefix = ConnectionData.Prefix;
+ ConnectionStatus.UseSSL = ConnectionData.UseSSL;
+
+ return ConnectionStatus;
+
+}
+
+CalDAVServerResult CalDAV::Connect(){
+
+ CalDAVServerResult ServerResult;
+
+ string ServerAddress = "";
+ string ServerUserPass = "";
+
+ // 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/";
+
+ // Setup the server password.
+
+ ServerUserPass += ConnectionData.Username;
+ ServerUserPass += ":";
+ ServerUserPass += ConnectionData.Password;
+
+ curl_easy_setopt(ConnectionHandle, CURLOPT_URL, ServerAddress.c_str());
+ curl_easy_setopt(ConnectionHandle, CURLOPT_USERPWD, ServerUserPass.c_str());
+ curl_easy_setopt(ConnectionHandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
+ curl_easy_setopt(ConnectionHandle, CURLOPT_FAILONERROR, 1L);
+
+ // Connect to the CalDAV server.
+
+ ServerResult.Code = curl_easy_perform(ConnectionHandle);
+
+ // Process the result received from the server.
+
+ if (ServerResult.Code != CURLE_OK){
+
+ ServerResult.Result = CALDAVQUERYRESULT_SERVERERROR;
+
+ } else {
+
+ ServerResult.Result = CALDAVQUERYRESULT_OK;
+
+ }
+
+ // Get the HTTP code.
+
+ curl_easy_getinfo(ConnectionHandle, CURLINFO_RESPONSE_CODE, &ServerResult.HTTPCode);
+
+ return ServerResult;
+
+}
bool CalDAVObjectValidSettings(CalDAVConnectionData *ConnData){
enum CalDAVQueryResult {
CALDAVQUERYRESULT_UNITTESTFAIL = -1,
- CALDAVQUERYRESULT_OK
+ CALDAVQUERYRESULT_OK,
+ CALDAVQUERYRESULT_NOTRUN,
+ CALDAVQUERYRESULT_SERVERERROR
};
struct CalDAVConnectionData{
- string Hostname;
- int Port;
- string Username;
- string Password;
- string Prefix;
- bool UseSSL;
+ string Hostname = "";
+ int Port = 8008;
+ string Username = "";
+ string Password = "";
+ string Prefix = "";
+ bool UseSSL = true;
};
struct CalDAVServerResult{
+ CalDAVQueryResult Result = CALDAVQUERYRESULT_NOTRUN;
+ CURLcode Code = CURLE_OK;
+ long HTTPCode = 0;
-
};
class CalDAV{
+ private:
+ CalDAVConnectionData ConnectionData;
+ CURL *ConnectionHandle = nullptr;
+ public:
+ void SetupConnectionData(CalDAVConnectionData *ConnData);
+ CalDAVStatus GetConnectionData();
+ CalDAVServerResult Connect();
+ CalDAV();
+ ~CalDAV();
};