// 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
#include "CalDAV.h"
#include
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){
// Check if the passed CalDAV Connection Data is has
// an address set. Return false if nullptr is used.
if (ConnData == nullptr){
return false;
}
// Check the server hostname. Return false
// if no value has been set.
if (ConnData->Hostname.size() == 0){
return false;
}
// Check the server port. Return false if
// no value has been set or the port number
// is less than 1 or higher than 65535.
if (ConnData->Port < 1 || ConnData->Port > 65535){
return false;
}
// Check the server username. Return false
// if no value has been set.
if (ConnData->Username.size() == 0){
return false;
}
// Check the server password. Return false
// if no value has been set.
if (ConnData->Password.size() == 0){
return false;
}
// Cannot check UseSSL: It is either true
// or false.
// Cannot check Prefix: The prefix may need
// to be worked out first.
// No errors were found whilst checking so
// return true.
return true;
}