+// CalDAV.cpp - CalDAV Connection Object.
+//
+// (c) 2016 Xestia Software Development.
+//
+// This file is part of Xestia Calendar.
+//
+// Xestia Address Book 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,
+// 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.
+//
+// You should have received a copy of the GNU General Public License along
+// 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 = "";
+ 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/";
+
+ // 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);
+ curl_easy_setopt(ConnectionHandle, CURLOPT_WRITEFUNCTION, CalDAVOutput);
+ curl_easy_setopt(ConnectionHandle, CURLOPT_WRITEDATA, &ServerData);
+ curl_easy_setopt(ConnectionHandle, CURLOPT_WRITEHEADER, &ServerHeader);
+
+ // 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){
// Check the server hostname. Return false
// if no value has been set.
- if (ConnData->Hostname.size() > 0){
+ if (ConnData->Hostname.size() == 0){
return false;
// Check the server username. Return false
// if no value has been set.
-
- if (ConnData->Username.size() > 0){
+
+ if (ConnData->Username.size() == 0){
+
return false;
- }
-
+
+ }
+
// Check the server password. Return false
// if no value has been set.
-
- if (ConnData->Password.size() > 0){
+
+ if (ConnData->Password.size() == 0){
+
return false;
+
}
// Cannot check UseSSL: It is either true