Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
Removed the WritebackFunc function from the CardDAV object.
[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 int CardDAV::ProgressFuncProc(void *clientdata, double TTUp, double NUp, double TTDown, double NDown){\r
243 \r
244         // Progress function processing.\r
245         \r
246         if (AbortConnection == TRUE){\r
247         \r
248                 return -1;\r
249         \r
250         } else {\r
251         \r
252                 return 0;\r
253         \r
254         }\r
255 \r
256 }\r
257 \r
258 void CardDAV::Abort(){\r
259 \r
260         // Abort (close) the connection.\r
261         \r
262         AbortConnection = TRUE;\r
263 \r
264 }\r
265 \r
266 SSLCertCollection CardDAV::GetSSLVerifyResults(){\r
267         \r
268         // Get the SSL verification results.\r
269         \r
270         return VerifyCertCollection;\r
271         \r
272 }\r
273 \r
274 void CardDAV::AllowSelfSignTest(bool AllowSelfSignIn){\r
275         \r
276         // Set the value to enable/disable SSL self-signed certificates.\r
277         \r
278         AllowSelfSign = AllowSelfSignIn;\r
279 }\r
280 \r
281 void CardDAV::GetSSLResults(){\r
282 \r
283         // Get the SSL results.\r
284 \r
285 }\r
286 \r
287 void CardDAV::SetServerFilename(wxString Filename){\r
288 \r
289         // Set the server filename.\r
290         \r
291         ServerFilenameLocation = Filename;\r
292 \r
293 }\r
294 \r
295 wxString CardDAV::GetPageData()\r
296 {\r
297 \r
298         // Get the server page data.\r
299         \r
300         return PageData;\r
301 \r
302 }\r
303 \r
304 wxString CardDAV::ETagValueResult(){\r
305 \r
306         // Get the ETag Result value.\r
307         \r
308         return ETagResult;\r
309 \r
310 }\r
311 \r
312 void CardDAV::SetupData(wxString Method, wxString FilenameLocation, wxString UploadData){\r
313 \r
314         // Setup the data to use with the CardDAV connection.\r
315         \r
316         ServerMethod = Method;\r
317         ServerFilenameLocation = FilenameLocation;\r
318         ServerUploadData = UploadData;\r
319 \r
320         // Check if ServerFilenameLocation has a / at \r
321         // the start and if not then append it.\r
322         \r
323         if (ServerFilenameLocation.Left(1) != wxT("/")){\r
324         \r
325                 // Not there so insert.\r
326                 \r
327                 ServerFilenameLocation = wxT("/") + ServerFilenameLocation;\r
328         \r
329         }\r
330 \r
331 }\r
332 \r
333 void CardDAV::SetupVariables(std::map<int, int> *actlist, int actindex){\r
334 \r
335         // Setup the variable pointers.\r
336         \r
337         ActivityListPtr = actlist;\r
338         ItemIndex = actindex;\r
339 \r
340 }\r
341 \r
342 wxString CardDAV::GetETagData(){\r
343 \r
344         // Get the ETag data.\r
345         \r
346         return ETagData;\r
347 \r
348 }\r
349 \r
350 void CardDAV::SetUploadMode(bool IncMode){\r
351 \r
352         // Set the upload mode.\r
353         \r
354         UploadMode = IncMode;\r
355 \r
356 }\r
357 \r
358 void CardDAV::SetEditMode(bool EditModeInc){\r
359 \r
360         // Set the edit mode.\r
361         \r
362         EditMode = EditModeInc;\r
363 \r
364 }\r
365 \r
366 int CardDAV::GetResultCode(){\r
367 \r
368         // Get the result code.\r
369         \r
370         return (int)claconncode;\r
371 \r
372 }\r
373 \r
374 int CardDAV::GetHTTPCode(){\r
375 \r
376         // Get the HTTP error code.\r
377         \r
378         return HTTPErrorCode;\r
379 \r
380 }\r
381 \r
382 wxString CardDAV::GetErrorBuffer(){\r
383 \r
384         // Get the error buffer.\r
385         \r
386         wxString ErrorBuffer = wxString::FromUTF8(curlerrbuffer);\r
387 \r
388         return ErrorBuffer;\r
389 \r
390 }\r
391 \r
392 SSLCertCollection CardDAV::BuildSSLCollection(CURL *conn){\r
393 \r
394         // Build and return the SSL collection.\r
395         \r
396         SSLCertCollection SSLCertInfo;\r
397 \r
398         // Grab the certificate data.\r
399 \r
400         union {\r
401                 struct curl_slist *certdata;\r
402                 struct curl_certinfo *certinfo;\r
403         } certptr;\r
404 \r
405         certptr.certdata = NULL;\r
406         \r
407         curl_easy_getinfo(conn, CURLINFO_CERTINFO, &certptr.certinfo);\r
408 \r
409         wxString CertPropName;\r
410         wxString CertPropValue;\r
411 \r
412         for (int i = 0; i < certptr.certinfo->num_of_certs; i++){\r
413 \r
414                 struct curl_slist *slist;\r
415                 SSLCertData SSLCertDataInc;\r
416                 \r
417                 for (slist = certptr.certinfo->certinfo[i]; slist; slist = slist->next){\r
418                         \r
419                         wxStringTokenizer CertDataInc(wxString::FromUTF8(slist->data), ":");\r
420                         \r
421                         // Get first token as the property name.\r
422                         \r
423                         CertPropName = CertDataInc.GetNextToken();\r
424                         \r
425                         // Get remaining tokens as the property value.\r
426                         \r
427                         while(CertDataInc.HasMoreTokens()){\r
428                         \r
429                                 CertPropValue.Append(CertDataInc.GetNextToken());\r
430                         \r
431                         }\r
432                         \r
433                         SSLCertDataInc.CertData.insert(std::make_pair(CertPropName, CertPropValue));\r
434                         CertPropName.clear();\r
435                         CertPropValue.clear();\r
436                         \r
437                 }\r
438         \r
439                 SSLCertInfo.SSLCollection.insert(std::make_pair(i, SSLCertDataInc));\r
440         \r
441         }\r
442         \r
443         return SSLCertInfo;\r
444 \r
445 }\r
446 \r
447 SSLCertCollection CardDAV::GetCertificateData(){\r
448 \r
449         // Pass on the collected certificate data.\r
450 \r
451         return SSLCertCol;\r
452 \r
453 }\r
454 \r
455 wxString CardDAV::GetErrorMessage(){\r
456 \r
457         // Get the error message.\r
458         \r
459         return ErrorMessage;\r
460 \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