Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
Added comments to functions in carddav/carddav.cpp
[xestiaab/.git] / source / carddav / carddav.cpp
1 // carddav.cpp - Main CardDAV Object file.\r
2 //\r
3 // (c) 2012-2015 Xestia Software Development.\r
4 //\r
5 // This file is part of Xestia Address Book.\r
6 //\r
7 // Xestia Address Book is free software: you can redistribute it and/or modify\r
8 // it under the terms of the GNU General Public License as published by the\r
9 // Free Software Foundation, version 3 of the license.\r
10 //\r
11 // Xestia Address Book is distributed in the hope that it will be useful,\r
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
14 // GNU General Public License for more details.\r
15 //\r
16 // You should have received a copy of the GNU General Public License along\r
17 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>\r
18 \r
19 #include "carddav.h"\r
20 #include "../version.h"\r
21 #include <wx/wx.h>\r
22 #include <wx/tokenzr.h>\r
23 #include <wx/ffile.h>\r
24 #include <libxml/parser.h>\r
25 #include <libxml/tree.h>\r
26 #include <map>\r
27 #include <thread>\r
28 #include "../vcard/vcard.h"\r
29 #include "../common/dirs.h"\r
30 \r
31 size_t WritebackFunc(char *ptr, size_t size, size_t nmemb, wxString *stream){\r
32         \r
33         // Writeback function for the CardDAV object.\r
34         \r
35         wxString Data;\r
36         Data = wxString::FromUTF8((char *)ptr);\r
37         \r
38         stream->Append(Data);\r
39         \r
40         return size * nmemb;\r
41 \r
42 }\r
43 \r
44 int ProgressFunc(void *clientdata, double TTDown, double NDown, double TTUp, double NUp){\r
45 \r
46         // Progress function for the CardDAV object.\r
47         \r
48         int ProgressRet;\r
49         \r
50         CardDAV *IncCardDAV = static_cast<CardDAV*>(clientdata);\r
51         ProgressRet = IncCardDAV->ProgressFuncProc(clientdata, TTDown, NDown, TTUp, NUp);\r
52         if (ProgressRet != 0){\r
53                 return 1;\r
54         }\r
55         return 0;\r
56 \r
57 }\r
58 \r
59 wxString CardDAV::ServerAddress;\r
60 int CardDAV::ServerPort;\r
61 wxString CardDAV::ServerUser;\r
62 wxString CardDAV::ServerPass;\r
63 wxString CardDAV::ServerPrefix;\r
64 wxString CardDAV::ServerAccount;\r
65 bool CardDAV::ServerSSL;\r
66 bool *CardDAV::ServerResult;\r
67 bool *CardDAV::ServerMonitor;\r
68 bool CardDAV::SSLStatus;\r
69 bool CardDAV::SSLVerified;\r
70 bool CardDAV::ValidResponse;\r
71 bool CardDAV::AuthPassed;\r
72 bool CardDAV::HasCalDAVSupport;\r
73 bool CardDAV::AbortConnection;\r
74 wxString CardDAV::ServerResponse;\r
75 wxString CardDAV::ServerMethod;\r
76 wxString CardDAV::ServerFilenameLocation;\r
77 wxString CardDAV::ServerUploadData;\r
78 wxString CardDAV::ETagData;\r
79 wxString CardDAV::ETagResult;\r
80 bool CardDAV::UploadMode;\r
81 bool CardDAV::EditMode;\r
82 long CardDAV::ItemIndex;\r
83 std::map<int, int> *CardDAV::ActivityListPtr;\r
84 char CardDAV::curlerrbuffer[CURL_ERROR_SIZE];\r
85 SSLCertCollection CardDAV::SSLCertCol;\r
86 int CardDAV::SSLErrorCode;\r
87 int CardDAV::ConnectionErrorCode;\r
88 wxString CardDAV::PageHeader;\r
89 wxString CardDAV::PageData;\r
90 CURLcode CardDAV::claconncode;\r
91 int CardDAV::HTTPErrorCode;\r
92 wxString CardDAV::ErrorMessage;\r
93 SSLCertCollection CardDAV::VerifyCertCollection;\r
94 bool CardDAV::AllowSelfSign;\r
95 \r
96 CardDAV::CardDAV(){\r
97         \r
98         // Setup the CardDAV object.\r
99         \r
100         ServerPort = 8080;\r
101         SSLStatus = FALSE;\r
102         SSLVerified = FALSE;\r
103         AuthPassed = FALSE;\r
104         ValidResponse = FALSE;\r
105         HasCalDAVSupport = FALSE;\r
106         SSLCertCol.SuccessCode = 0;\r
107         AllowSelfSign = FALSE;\r
108 \r
109         AbortConnection = FALSE;\r
110         UploadMode = FALSE;\r
111         EditMode = FALSE;\r
112         HTTPErrorCode = 0;\r
113         \r
114 }\r
115 \r
116 CardDAV::~CardDAV(){\r
117 \r
118         // Destroy the CardDAV object.\r
119         \r
120 }\r
121 \r
122 size_t UploadReadFunc(void *ptr, size_t size, size_t nmemb, void *userdata){\r
123 \r
124         \r
125         // Upload function for the CardDAV object.\r
126         \r
127         struct UploadDataStruc *UploadPtr = (struct UploadDataStruc *)userdata;\r
128 \r
129         if (UploadPtr->sizeleft){\r
130 \r
131                 //MeepMoop->sizeleft--;\r
132                 //return 1;\r
133 \r
134                 UploadPtr->sizeleft--;\r
135                 wxString wxSChar;\r
136 \r
137                 wxSChar = UploadPtr->readptr->Mid(UploadPtr->seek,1);\r
138 \r
139                 //*(char *)ptr = (char)wxSChar.mb_str();\r
140 \r
141                 strncpy((char *)ptr, (const char*)wxSChar.mb_str(wxConvUTF8), 1);\r
142 \r
143                 UploadPtr->seek++;\r
144 \r
145                 return 1;\r
146 \r
147         }\r
148 \r
149         return 0;\r
150 \r
151 }\r
152 \r
153 bool CardDAV::SetupConnection(wxString SvrAddress, int SvrPort, wxString SvrUser, wxString SvrPass, bool SvrSSL){\r
154 \r
155         // Setup the CardDAV connection without the prefix/account.\r
156         \r
157         ServerAddress = SvrAddress;\r
158         ServerPort = SvrPort;\r
159         ServerUser = SvrUser;\r
160         ServerPass = SvrPass;\r
161         ServerSSL = SvrSSL;\r
162         \r
163         return TRUE;\r
164 \r
165 }\r
166 \r
167 bool CardDAV::SetupConnection(wxString SvrAddress, int SvrPort, wxString SvrUser, wxString SvrPass, bool SvrSSL, wxString SvrPrefix, wxString SvrAccount){\r
168 \r
169         // Setup the CardDAV connection with the prefix/account.\r
170         \r
171         ServerAddress = SvrAddress;\r
172         ServerPort = SvrPort;\r
173         ServerUser = SvrUser;\r
174         ServerPass = SvrPass;\r
175         ServerSSL = SvrSSL;\r
176         ServerPrefix = SvrPrefix;\r
177         ServerAccount = SvrAccount;\r
178 \r
179         return TRUE;\r
180 \r
181 }\r
182 \r
183 bool CardDAV::SetupResultBools(bool *SvrResult, bool *SvrMonitor){\r
184 \r
185         // Setup the result booleans.\r
186         \r
187         ServerResult = SvrResult;\r
188         ServerMonitor = SvrMonitor;\r
189 \r
190         return TRUE;\r
191 \r
192 }\r
193 \r
194 bool CardDAV::HasValidResponse(){\r
195 \r
196         // Check that CardDAV server gave a valid response.\r
197         \r
198         return ValidResponse;\r
199 \r
200 }\r
201 \r
202 bool CardDAV::CanDoCardDAV(){\r
203 \r
204         // Check that the server has CardDAV support.\r
205         \r
206         return HasCalDAVSupport;\r
207 \r
208 }\r
209 \r
210 bool CardDAV::CanDoSSL(){\r
211 \r
212         // Check that the server can do SSL.\r
213         \r
214         return SSLStatus;\r
215 \r
216 }\r
217 \r
218 bool CardDAV::SSLVerify(){\r
219 \r
220         // Check that the server can verify SSL.\r
221         \r
222         return SSLVerified;\r
223 \r
224 }\r
225 \r
226 bool CardDAV::AbleToLogin(){\r
227 \r
228         // Check that the user is able to login.\r
229         \r
230         return AuthPassed;\r
231 \r
232 }\r
233 \r
234 bool CardDAV::IsSelfSigned(){\r
235 \r
236         // Check that self-signed certificates are allowed.\r
237         \r
238         return AllowSelfSign;\r
239 \r
240 }\r
241 \r
242 /*\r
243 \r
244 size_t CardDAV::WritebackFunc(char *ptr, size_t size, size_t nmemb, FILE *stream){\r
245 \r
246         wxString Data;\r
247         Data = wxString::FromUTF8((char *)ptr);\r
248         if ((bool)stream == TRUE){\r
249                 PageHeader.Append(Data);\r
250         } else {\r
251                 PageData.Append(Data);\r
252         }\r
253         return size * nmemb;\r
254 \r
255 }\r
256 \r
257 */\r
258 \r
259 int CardDAV::ProgressFuncProc(void *clientdata, double TTUp, double NUp, double TTDown, double NDown){\r
260 \r
261         // Progress function processing.\r
262         \r
263         if (AbortConnection == TRUE){\r
264         \r
265                 return -1;\r
266         \r
267         } else {\r
268         \r
269                 return 0;\r
270         \r
271         }\r
272 \r
273 }\r
274 \r
275 void CardDAV::Abort(){\r
276 \r
277         // Abort (close) the connection.\r
278         \r
279         AbortConnection = TRUE;\r
280 \r
281 }\r
282 \r
283 SSLCertCollection CardDAV::GetSSLVerifyResults(){\r
284         \r
285         // Get the SSL verification results.\r
286         \r
287         return VerifyCertCollection;\r
288         \r
289 }\r
290 \r
291 void CardDAV::AllowSelfSignTest(bool AllowSelfSignIn){\r
292         \r
293         // Set the value to enable/disable SSL self-signed certificates.\r
294         \r
295         AllowSelfSign = AllowSelfSignIn;\r
296 }\r
297 \r
298 void CardDAV::GetSSLResults(){\r
299 \r
300         // Get the SSL results.\r
301 \r
302 }\r
303 \r
304 void CardDAV::SetServerFilename(wxString Filename){\r
305 \r
306         // Set the server filename.\r
307         \r
308         ServerFilenameLocation = Filename;\r
309 \r
310 }\r
311 \r
312 wxString CardDAV::GetPageData()\r
313 {\r
314 \r
315         // Get the server page data.\r
316         \r
317         return PageData;\r
318 \r
319 }\r
320 \r
321 wxString CardDAV::ETagValueResult(){\r
322 \r
323         // Get the ETag Result value.\r
324         \r
325         return ETagResult;\r
326 \r
327 }\r
328 \r
329 void CardDAV::SetupData(wxString Method, wxString FilenameLocation, wxString UploadData){\r
330 \r
331         // Setup the data to use with the CardDAV connection.\r
332         \r
333         ServerMethod = Method;\r
334         ServerFilenameLocation = FilenameLocation;\r
335         ServerUploadData = UploadData;\r
336 \r
337         // Check if ServerFilenameLocation has a / at \r
338         // the start and if not then append it.\r
339         \r
340         if (ServerFilenameLocation.Left(1) != wxT("/")){\r
341         \r
342                 // Not there so insert.\r
343                 \r
344                 ServerFilenameLocation = wxT("/") + ServerFilenameLocation;\r
345         \r
346         }\r
347 \r
348 }\r
349 \r
350 void CardDAV::SetupVariables(std::map<int, int> *actlist, int actindex){\r
351 \r
352         // Setup the variable pointers.\r
353         \r
354         ActivityListPtr = actlist;\r
355         ItemIndex = actindex;\r
356 \r
357 }\r
358 \r
359 wxString CardDAV::GetETagData(){\r
360 \r
361         // Get the ETag data.\r
362         \r
363         return ETagData;\r
364 \r
365 }\r
366 \r
367 void CardDAV::SetUploadMode(bool IncMode){\r
368 \r
369         // Set the upload mode.\r
370         \r
371         UploadMode = IncMode;\r
372 \r
373 }\r
374 \r
375 void CardDAV::SetEditMode(bool EditModeInc){\r
376 \r
377         // Set the edit mode.\r
378         \r
379         EditMode = EditModeInc;\r
380 \r
381 }\r
382 \r
383 int CardDAV::GetResultCode(){\r
384 \r
385         // Get the result code.\r
386         \r
387         return (int)claconncode;\r
388 \r
389 }\r
390 \r
391 int CardDAV::GetHTTPCode(){\r
392 \r
393         // Get the HTTP error code.\r
394         \r
395         return HTTPErrorCode;\r
396 \r
397 }\r
398 \r
399 wxString CardDAV::GetErrorBuffer(){\r
400 \r
401         // Get the error buffer.\r
402         \r
403         wxString ErrorBuffer = wxString::FromUTF8(curlerrbuffer);\r
404 \r
405         return ErrorBuffer;\r
406 \r
407 }\r
408 \r
409 SSLCertCollection CardDAV::BuildSSLCollection(CURL *conn){\r
410 \r
411         // Build and return the SSL collection.\r
412         \r
413         SSLCertCollection SSLCertInfo;\r
414 \r
415         // Grab the certificate data.\r
416 \r
417         union {\r
418                 struct curl_slist *certdata;\r
419                 struct curl_certinfo *certinfo;\r
420         } certptr;\r
421 \r
422         certptr.certdata = NULL;\r
423         \r
424         curl_easy_getinfo(conn, CURLINFO_CERTINFO, &certptr.certinfo);\r
425 \r
426         wxString CertPropName;\r
427         wxString CertPropValue;\r
428 \r
429         for (int i = 0; i < certptr.certinfo->num_of_certs; i++){\r
430 \r
431                 struct curl_slist *slist;\r
432                 SSLCertData SSLCertDataInc;\r
433                 \r
434                 for (slist = certptr.certinfo->certinfo[i]; slist; slist = slist->next){\r
435                         \r
436                         wxStringTokenizer CertDataInc(wxString::FromUTF8(slist->data), ":");\r
437                         \r
438                         // Get first token as the property name.\r
439                         \r
440                         CertPropName = CertDataInc.GetNextToken();\r
441                         \r
442                         // Get remaining tokens as the property value.\r
443                         \r
444                         while(CertDataInc.HasMoreTokens()){\r
445                         \r
446                                 CertPropValue.Append(CertDataInc.GetNextToken());\r
447                         \r
448                         }\r
449                         \r
450                         SSLCertDataInc.CertData.insert(std::make_pair(CertPropName, CertPropValue));\r
451                         CertPropName.clear();\r
452                         CertPropValue.clear();\r
453                         \r
454                 }\r
455         \r
456                 SSLCertInfo.SSLCollection.insert(std::make_pair(i, SSLCertDataInc));\r
457         \r
458         }\r
459         \r
460         return SSLCertInfo;\r
461 \r
462 }\r
463 \r
464 SSLCertCollection CardDAV::GetCertificateData(){\r
465 \r
466         // Pass on the collected certificate data.\r
467 \r
468         return SSLCertCol;\r
469 \r
470 }\r
471 \r
472 wxString CardDAV::GetErrorMessage(){\r
473 \r
474         // Get the error message.\r
475         \r
476         return ErrorMessage;\r
477 \r
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