client: split main() function and helper functions
[libisds.git] / client / isdsclient.c
blob9517589c28fc3da4a5826c6dfa43f21fcbcf4250
1 #define _XOPEN_SOURCE 500
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <locale.h>
5 #include <time.h>
6 #include <string.h>
7 #include <isds.h>
8 #include "common.h"
11 int main(int argc, char **argv) {
12 struct isds_ctx *ctx = NULL;
13 isds_error err;
14 struct isds_DbOwnerInfo *db_owner_info = NULL;
15 char *recipient = NULL;
17 setlocale(LC_ALL, "");
19 err = isds_init();
20 if (err) {
21 printf("isds_init() failed: %s\n", isds_strerror(err));
24 isds_set_logging(ILF_ALL & ~ILF_HTTP, ILL_ALL);
26 ctx = isds_ctx_create();
27 if (!ctx) {
28 printf("isds_ctx_create() failed");
31 err = isds_set_timeout(ctx, 10000);
32 if (err) {
33 printf("isds_set_timeout() failed: %s\n", isds_strerror(err));
36 /* err = isds_set_tls(ctx, ITLS_VERIFY_SERVER, 0);
37 if (err) {
38 printf("isds_set_tls(ITLS_VERIFY_SERVER) failed: %s\n",
39 isds_strerror(err));
42 err = isds_set_tls(ctx, ITLS_CA_FILE, "/etc/ssl/certs/ca-certificates.crt");
43 if (err) {
44 printf("isds_set_tls(ITLS_CA_FILE) failed: %s\n",
45 isds_strerror(err));
46 }*/
48 err = isds_login(ctx, url, username, password, NULL, NULL);
49 if (err) {
50 printf("isds_login() failed: %s: %s\n", isds_strerror(err),
51 isds_long_message(ctx));
52 } else {
53 printf("Logged in :)\n");
56 err = isds_ping(ctx);
57 if (err) {
58 printf("isds_ping() failed: %s\n", isds_strerror(err));
59 } else {
60 printf("isds_ping() succeeded\n");
63 printf("Sending bogus request\n");
64 err = isds_bogus_request(ctx);
65 if (err) {
66 printf("isds_bogus_request() failed: %s: %s\n", isds_strerror(err),
67 isds_long_message(ctx));
68 } else {
69 printf("isds_bogus_request() succeeded\n");
73 printf("Getting info about my box:\n");
74 err = isds_GetOwnerInfoFromLogin(ctx, &db_owner_info);
75 if (err) {
76 printf("isds_GetOwnerInfoFromLogin() failed: %s: %s\n",
77 isds_strerror(err), isds_long_message(ctx));
78 } else {
79 printf("isds_GetOwnerInfoFromLogin() succeeded\n");
81 print_DbOwnerInfo(db_owner_info);
86 /* Current server implementation (2009-11-17) does not allow to find
87 * myself. Previous version allowed it. */
88 struct isds_list *boxes = NULL, *item;
90 printf("Searching for my own box:\n");
91 err = isds_FindDataBox(ctx, db_owner_info, &boxes);
92 if (err == IE_SUCCESS || err == IE_2BIG) {
93 if (err == IE_2BIG)
94 printf("isds_FindDataBox() results truncated\n");
95 printf("isds_FindDataBox() succeeded:\n");
97 for(item = boxes; item; item = item->next) {
98 printf("List item:\n");
99 print_DbOwnerInfo(item->data);
101 } else {
102 printf("isds_FindDataBox() failed: %s: %s\n",
103 isds_strerror(err), isds_long_message(ctx));
106 isds_list_free(&boxes);
110 struct isds_list *boxes = NULL, *item;
111 struct isds_DbOwnerInfo *criteria = calloc(1, sizeof(*criteria));
112 if (!criteria) {
113 printf("Not enough memory for struct isds_DbOwnerInfo criteria\n");
114 exit(-1);
116 criteria->firmName = strdup("Obec");
117 if (!criteria->firmName) {
118 printf("Not enough memory for criteria->firmName\n");
119 exit(-1);
121 criteria->dbType = malloc(sizeof(*(criteria->dbType)));
122 if (!criteria->dbType) {
123 printf("Not enough memory for criteria->dbType\n");
124 exit(-1);
126 *(criteria->dbType) = DBTYPE_OVM;
128 printf("Searching box with firm name `%s':\n", criteria->firmName);
129 err = isds_FindDataBox(ctx, criteria, &boxes);
130 if (err == IE_SUCCESS || err == IE_2BIG) {
131 printf("isds_FindDataBox() succeeded:\n");
133 int n;
134 for(item = boxes, n = 1; item; item = item->next, n++) {
135 if (err != IE_2BIG) {
136 printf("List item #%d:\n", n);
137 print_DbOwnerInfo(item->data);
140 if (err == IE_2BIG)
141 printf("isds_FindDataBox() results truncated to %d boxes\n",
142 --n);
143 } else {
144 printf("isds_FindDataBox() failed: %s: %s\n",
145 isds_strerror(err), isds_long_message(ctx));
148 isds_list_free(&boxes);
149 isds_DbOwnerInfo_free(&criteria);
153 struct isds_list *boxes = NULL, *item;
154 struct isds_DbOwnerInfo criteria;
155 isds_DbType criteria_db_type = DBTYPE_OVM;
156 memset(&criteria, 0, sizeof(criteria));
157 criteria.dbType = &criteria_db_type;
158 criteria.dbID = "vqbab52";
160 printf("Searching for exact box by ID `%s' and type:\n", criteria.dbID);
161 err = isds_FindDataBox(ctx, &criteria, &boxes);
162 if (err == IE_SUCCESS || err == IE_2BIG) {
163 printf("isds_FindDataBox() succeeded:\n");
165 int n;
166 for(item = boxes, n = 1; item; item = item->next, n++) {
167 if (err != IE_2BIG) {
168 printf("List item #%d:\n", n);
169 print_DbOwnerInfo(item->data);
171 if (n == 1) recipient = strdup(
172 ((struct isds_DbOwnerInfo *)(item->data))->dbID);
174 if (err == IE_2BIG)
175 printf("isds_FindDataBox() results truncated to %d boxes\n",
176 --n);
177 } else {
178 printf("isds_FindDataBox() failed: %s: %s\n",
179 isds_strerror(err), isds_long_message(ctx));
182 isds_list_free(&boxes);
187 struct isds_list *boxes = NULL, *item;
188 struct isds_DbOwnerInfo criteria;
189 isds_DbType criteria_db_type = DBTYPE_OVM;
190 memset(&criteria, 0, sizeof(criteria));
191 criteria.firmName = "Místní";
192 criteria.dbType = &criteria_db_type;
194 printf("Searching box with firm name `%s':\n", criteria.firmName);
195 err = isds_FindDataBox(ctx, &criteria, &boxes);
196 if (err == IE_SUCCESS || err == IE_2BIG) {
197 printf("isds_FindDataBox() succeeded:\n");
199 int n;
200 for(item = boxes, n = 1; item; item = item->next, n++) {
201 if (err != IE_2BIG) {
202 printf("List item #%d:\n", n);
203 print_DbOwnerInfo(item->data);
205 if (n == 1) recipient = strdup(
206 ((struct isds_DbOwnerInfo *)(item->data))->dbID);
208 if (err == IE_2BIG)
209 printf("isds_FindDataBox() results truncated to %d boxes\n",
210 --n);
211 } else {
212 printf("isds_FindDataBox() failed: %s: %s\n",
213 isds_strerror(err), isds_long_message(ctx));
216 isds_list_free(&boxes);
220 if (db_owner_info) {
221 long int box_status = 0;
222 printf("Getting status of my box with ID `%s'\n", db_owner_info->dbID);
223 err = isds_CheckDataBox(ctx, db_owner_info->dbID, &box_status);
224 if (err)
225 printf("isds_CheckDataBox() failed: %s: %s\n",
226 isds_strerror(err), isds_long_message(ctx));
227 else {
228 printf("isds_CheckDataBox() succeeded: status = ");
229 print_DbState(box_status);
233 isds_DbOwnerInfo_free(&db_owner_info);
236 char *box_id = "7777777";
237 long int box_status = 0;
238 printf("Getting status of non existing box with ID `%s'\n", box_id);
239 err = isds_CheckDataBox(ctx, box_id, &box_status);
240 if (err)
241 printf("isds_CheckDataBox() failed: %s: %s\n",
242 isds_strerror(err), isds_long_message(ctx));
243 else {
244 printf("isds_CheckDataBox() succeeded: status = ");
245 print_DbState(box_status);
250 /* Send message */
252 struct isds_message message;
253 memset(&message, 0, sizeof(message));
255 struct isds_envelope envelope;
256 memset(&envelope, 0, sizeof(envelope));
257 message.envelope = &envelope;
258 envelope.dbIDRecipient = recipient;
259 long int dmSenderOrgUnitNum = 42;
260 envelope.dmSenderOrgUnitNum = &dmSenderOrgUnitNum;
261 envelope.dmAnnotation = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
262 /* "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
263 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
264 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
265 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
266 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
267 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
268 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
269 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
270 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
271 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
272 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
273 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
274 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
275 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
276 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
277 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
278 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
279 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
280 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"*/
281 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
283 struct isds_document minor_document;
284 memset(&minor_document, 0, sizeof(minor_document));
285 minor_document.data = "hello world?";
286 minor_document.data_length = strlen(minor_document.data);
287 minor_document.dmMimeType = "text/plain";
288 /* XXX: This should fail
289 minor_document.dmFileMetaType = FILEMETATYPE_MAIN; */
290 minor_document.dmFileMetaType = FILEMETATYPE_ENCLOSURE;
291 /* Server implementation demands dmFileDescr to be valid file name */
292 /*minor_document.dmFileDescr = "Standard text.txt";*/
293 minor_document.dmFileDescr = "minor_standard_text.txt";
294 minor_document.dmFileGuid = "2";
295 minor_document.dmUpFileGuid = "1";
297 struct isds_document main_document;
298 memset(&main_document, 0, sizeof(main_document));
299 main_document.data = "Hello World!";
300 main_document.data_length = strlen(main_document.data);
301 /* Server implementation sais text is not text file
302 * See <http://www.abclinuxu.cz/forum/show/284940> */
303 main_document.dmMimeType = "text/plain";
304 /* XXX: This should fail */
305 /*main_document.dmFileMetaType = FILEMETATYPE_ENCLOSURE;*/
306 main_document.dmFileMetaType = FILEMETATYPE_MAIN;
307 /* Server implementation demands dmFileDescr to be valid file name */
308 /*main_document.dmFileDescr = "Standard text.txt";*/
309 main_document.dmFileDescr = "standard_text.txt";
310 main_document.dmFileGuid = "1";
312 struct isds_list documents_main_item = {
313 .data = &main_document,
314 .next = NULL,
315 .destructor = NULL
317 struct isds_list documents_minor_item = {
318 .data = &minor_document,
319 .next = &documents_main_item,
320 .destructor = NULL
322 message.documents = &documents_minor_item;
325 printf("Sending message to box ID `%s'\n",
326 message.envelope->dbIDRecipient);
327 err = isds_send_message(ctx, &message);
328 if (err)
329 printf("isds_send_message() failed: %s: %s\n",
330 isds_strerror(err), isds_long_message(ctx));
331 else {
332 printf("isds_send_message() succeeded: assigned message ID = %s\n",
333 message.envelope->dmID);
336 free(message.envelope->dmID);
340 /* Get list of sent messages */
342 struct tm from_time_tm = {
343 .tm_year = 2000 - 1900,
344 .tm_mon = 1 - 1,
345 .tm_mday = 1,
346 .tm_hour = 1,
347 .tm_min = 2,
348 .tm_sec = 3,
349 .tm_isdst = -1
351 time_t from_time_t = mktime(&from_time_tm);
352 struct timeval from_time = {
353 .tv_sec = from_time_t,
354 .tv_usec = 4000
356 unsigned long int number = 0;
357 struct isds_list *messages = NULL, *item;
359 /* TODO: Try different criteria */
360 printf("Getting list of sent messages\n");
361 err = isds_get_list_of_sent_messages(ctx, &from_time, NULL, NULL,
362 MESSAGESTATE_ANY, 0, &number, &messages);
363 if (err)
364 printf("isds_isds_get_list_of_sent_messages() failed: %s: %s\n",
365 isds_strerror(err), isds_long_message(ctx));
366 else {
367 printf("isds_isds_get_list_of_sent_messages() succeeded: "
368 "number of messages = %lu:\n", number);
369 for(item = messages; item; item = item->next) {
370 printf("List item:\n");
371 print_message(item->data);
375 isds_list_free(&messages);
379 err = isds_logout(ctx);
380 if (err) {
381 printf("isds_logout() failed: %s\n", isds_strerror(err));
384 printf("Ping after logout should fail\n");
385 err = isds_ping(ctx);
386 if (err) {
387 printf("isds_ping() failed: %s\n", isds_strerror(err));
388 } else {
389 printf("isds_ping() succeeded\n");
392 printf("Sending bogus request after logout\n");
393 err = isds_bogus_request(ctx);
394 if (err) {
395 printf("isds_bogus_request() failed: %s: %s\n", isds_strerror(err),
396 isds_long_message(ctx));
397 } else {
398 printf("isds_bogus_request() succeeded\n");
401 err = isds_ctx_free(&ctx);
402 if (err) {
403 printf("isds_ctx_free() failed: %s\n", isds_strerror(err));
407 err = isds_cleanup();
408 if (err) {
409 printf("isds_cleanup() failed: %s\n", isds_strerror(err));
412 exit (EXIT_SUCCESS);