2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: table.c /main/1 1996/04/21 19:24:46 drk $ */
25 * (c) Copyright 1993, 1994 Hewlett-Packard Company
26 * (c) Copyright 1993, 1994 International Business Machines Corp.
27 * (c) Copyright 1993, 1994 Novell, Inc.
28 * (c) Copyright 1993, 1994 Sun Microsystems, Inc.
31 #include <EUSCompat.h>
43 #include "convert4-2.h"
44 #include "convert2-4.h"
45 #include "convert4-3.h"
46 #include "convert3-4.h"
47 #include "convert4-5.h"
48 #include "convert5-4.h"
49 #include "connection.h"
57 extern u_long _DtCm_transient;
59 #define MAXDAY_LOOKUP 15
60 #define MAXDAY_LOOKUP_SECS ((DAYSEC*MAXDAY_LOOKUP)+1)
62 static char *errfmt = "cm: %s() unexpected return status %d.\n";
64 /*****************************************************************************
65 * forward declaration of static functions
66 *****************************************************************************/
67 static CSA_return_code tablestat_to_dtcmstat(
69 CSA_return_code *dtcmstat);
71 /*****************************************************************************
72 * extern functions used in the library
73 *****************************************************************************/
75 extern CSA_return_code
76 _DtCm_table_create(Calendar *cal)
79 Table_Status_4 *res = NULL;
80 _DtCm_Connection *conn;
82 DP(("table.c: _DtCm_table_create\n"));
85 return (CSA_E_INVALID_PARAMETER);
90 switch(conn->ci->vers_out) {
94 return(CSA_E_NOT_SUPPORTED);
96 a4.target = cal->name;
97 a4.new_target = calloc(1, 1);
98 res = _DtCm_rtable_create_4(&a4, conn);
102 return(CSA_E_FAILURE);
105 if (tablestat_to_dtcmstat(*res, &stat) != CSA_SUCCESS)
106 DP((errfmt, "table.c:", "_DtCm_table_create", *res));
108 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
109 _DtCm_clntstat_to_csastat(conn->stat);
115 extern CSA_return_code
116 _DtCm_table_get_access(Calendar *cal, cms_access_entry **alist)
118 CSA_return_code stat = CSA_SUCCESS;
119 Access_Args_4 *res = NULL;
120 _DtCm_Connection *conn;
122 DP(("table.c: _DtCm_table_get_access\n"));
124 if (cal == NULL || alist == NULL)
125 return (CSA_E_INVALID_PARAMETER);
131 switch(conn->ci->vers_out) {
138 a2.target = cal->name;
139 a2.access_list = NULL;
140 res2 = _DtCm_rtable_get_access_2(&a2, conn);
141 res = _DtCm_accargs2_to_accargs4(res2);
143 xdr_free((xdrproc_t)_DtCm_xdr_Access_Args_2, (char*)res2);
146 a3.target = cal->name;
147 a3.access_list = NULL;
148 res3 = _DtCm_rtable_get_access_3(&a3, conn);
149 res = _DtCm_accargs3_to_accargs4(res3);
151 xdr_free((xdrproc_t)_DtCm_xdr_Access_Args_3, (char*)res3);
154 a4.target = cal->name;
155 a4.access_list = NULL;
156 res = _DtCm_rtable_get_access_4(&a4, conn);
159 stat = CSA_E_FAILURE;
164 stat = _DtCm_accessentry4_to_cmsaccesslist(res->access_list, alist);
165 xdr_free ((xdrproc_t)_DtCm_xdr_Access_Args_4, (char*)res);
167 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
168 _DtCm_clntstat_to_csastat(conn->stat);
174 extern CSA_return_code
175 _DtCm_table_set_access(Calendar *cal, CSA_access_list alist)
177 CSA_return_code stat = CSA_SUCCESS;
178 Access_Status_4 s = access_other_4;
179 Access_Status_4 *res;
180 _DtCm_Connection *conn;
181 boolean_t nullreturned = B_FALSE;
182 Access_Entry_4 *alist4;
184 DP(("table.c: _DtCm_table_set_access\n"));
187 return (CSA_E_INVALID_PARAMETER);
189 if ((stat = _DtCm_csaaccesslist_toaccessentry4(alist, &alist4))
194 conn->retry = B_FALSE;
196 switch(conn->ci->vers_out) {
203 a2.target = cal->name;
204 a2.access_list = _DtCm_acclist4_to_acclist2(alist4);
205 s2 = _DtCm_rtable_set_access_2(&a2, conn);
207 s = _DtCm_accstat2_to_accstat4(*s2);
209 nullreturned = B_TRUE;
210 if (a2.access_list != NULL)
211 _DtCm_free_access_list4((Access_Entry_4 *)a2.access_list);
214 a3.target = cal->name;
215 a3.access_list = _DtCm_acclist4_to_acclist3(alist4);
216 s3 = _DtCm_rtable_set_access_3(&a3, conn);
218 s = _DtCm_accstat3_to_accstat4(*s3);
220 nullreturned = B_TRUE;
221 if (a3.access_list != NULL)
222 _DtCm_free_access_list4((Access_Entry_4 *)a3.access_list);
225 a4.target = cal->name;
226 a4.access_list = alist4;
227 res = _DtCm_rtable_set_access_4(&a4, conn);
231 nullreturned = B_TRUE;
234 stat = CSA_E_FAILURE;
239 _DtCm_free_access_list4(alist4);
242 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
243 _DtCm_clntstat_to_csastat(conn->stat);
249 case access_failed_4:
250 stat = CSA_E_NO_AUTHORITY;
252 case access_notable_4:
253 stat = CSA_E_CALENDAR_NOT_EXIST;
256 DP((errfmt, "table_set_access", s));
257 stat = CSA_E_FAILURE;
265 extern CSA_return_code
266 _DtCm_table_lookup(Calendar *cal, _DtCm_libentry *entry)
268 CSA_return_code stat = CSA_SUCCESS;
269 Table_Res_4 *res = NULL;
270 _DtCm_Connection *conn;
274 DP(("table.c: call to _DtCm_table_lookup\n"));
276 if ((cal == NULL) || entry == NULL)
277 return (CSA_E_INVALID_PARAMETER);
279 key.appt_id.tick = entry->e->key.time;
280 key.appt_id.key = entry->e->key.id;
284 conn->retry = B_TRUE;
286 switch(conn->ci->vers_out) {
293 a2.target = cal->name;
295 a2.args.Args_2_u.key = _DtCm_uid4_to_uid2(&key);
296 res2 = _DtCm_rtable_lookup_2(&a2, conn);
297 res = _DtCm_tableres2_to_tableres4(res2);
298 if (a2.args.Args_2_u.key != NULL)
299 free(a2.args.Args_2_u.key);
301 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_2, (char*)res2);
304 a3.target = cal->name;
306 a3.args.Args_3_u.key = _DtCm_uid4_to_uid3(&key);
308 res3 = _DtCm_rtable_lookup_3(&a3, conn);
309 res = _DtCm_tableres3_to_tableres4(res3);
310 if (a3.args.Args_3_u.key != NULL)
311 free(a3.args.Args_3_u.key);
313 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_3, (char*)res3);
316 a4.target = cal->name;
318 a4.args.Args_4_u.key = &key;
320 res = _DtCm_rtable_lookup_4(&a4, conn);
323 stat = CSA_E_FAILURE;
328 switch(res->status) {
330 case access_failed_4:
331 if ((appt = res->res.Table_Res_List_4_u.a) == NULL)
332 stat = CSA_X_DT_E_ENTRY_NOT_FOUND |
333 CSA_E_INVALID_ENTRY_HANDLE;
335 if (stat == CSA_SUCCESS) {
336 if (entry->filled == B_TRUE)
337 _DtCm_free_cms_attribute_values(
340 if ((stat = _DtCm_appt4_to_attrs(
343 entry->e->attrs, B_FALSE))
345 entry->filled = B_TRUE;
350 stat = CSA_E_FAILURE;
352 case access_notable_4:
353 stat = CSA_E_CALENDAR_NOT_EXIST;
356 /* remote system error */
357 DP((errfmt, "_DtCm_table_lookup", res->status));
358 stat = CSA_E_FAILURE;
361 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_4, (char*)res);
363 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
364 _DtCm_clntstat_to_csastat(conn->stat);
370 extern CSA_return_code
371 _DtCm_table_lookup_range(
375 boolean_t no_end_time_range,
380 cms_attribute *attrs,
382 _DtCm_libentry **entries)
384 CSA_return_code stat = CSA_SUCCESS;
385 Table_Res_4 *res = NULL;
386 _DtCm_Connection *conn;
387 Range_4 new_range, old_range;
388 Appt_4 *appts = NULL, *lptr = NULL, *tptr = NULL, *rptr = NULL;
390 DP(("table.c: _DtCm_table_lookup_range\n"));
392 if (cal == NULL || entries == NULL)
393 return (CSA_E_INVALID_PARAMETER);
397 old_range.key1 = start1;
398 old_range.key2 = start2;
400 new_range.key1 = old_range.key1;
401 new_range.key2 = old_range.key2;
402 new_range.next = NULL;
405 conn->retry = B_TRUE;
407 if (conn->use == udp_transport)
408 if ((new_range.key1 + MAXDAY_LOOKUP_SECS) < old_range.key2)
409 new_range.key2 = new_range.key1 + MAXDAY_LOOKUP_SECS;
412 switch(conn->ci->vers_out) {
419 a2.target = cal->name;
420 a2.args.tag = RANGE_2;
421 a2.args.Args_2_u.range = _DtCm_range4_to_range2(&new_range);
422 res2 = _DtCm_rtable_lookup_range_2(&a2, conn);
423 res = _DtCm_tableres2_to_tableres4(res2);
424 if (a2.args.Args_2_u.range != NULL)
425 free(a2.args.Args_2_u.range);
427 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_2, (char*)res2);
430 a3.target = cal->name;
431 a3.args.tag = RANGE_3;
432 a3.args.Args_3_u.range = _DtCm_range4_to_range3(&new_range);
434 res3 = _DtCm_rtable_lookup_range_3(&a3, conn);
435 res = _DtCm_tableres3_to_tableres4(res3);
436 if (a3.args.Args_3_u.range != NULL)
437 free(a3.args.Args_3_u.range);
439 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_3, (char*)res3);
442 a4.target = cal->name;
443 a4.args.tag = RANGE_4;
444 a4.args.Args_4_u.range = &new_range;
446 res = _DtCm_rtable_lookup_range_4(&a4, conn);
449 stat = CSA_E_FAILURE;
454 switch(res->status) {
456 case access_failed_4:
457 tptr = _DtCm_copy_appt4(res->res.Table_Res_List_4_u.a);
458 if (stat == CSA_SUCCESS) {
459 if (conn->use == tcp_transport)
461 else { /* udp transport */
465 /* traverse from the last res ptr */
466 for (rptr = lptr; rptr != NULL &&
467 rptr->next != NULL; rptr = rptr->next);
469 rptr->next = lptr = tptr;
477 stat = CSA_E_INVALID_PARAMETER;
479 case access_notable_4:
480 stat = CSA_E_CALENDAR_NOT_EXIST;
483 /* remote system error */
484 DP ((errfmt, "table_lookup_range", res->status));
485 stat = CSA_E_FAILURE;
488 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_4, (char*)res); res = NULL;
490 /* range must encompass interested ticks */
491 new_range.key1 = new_range.key2-1;
492 if ((new_range.key2 =
493 (new_range.key1+MAXDAY_LOOKUP_SECS)) >
495 new_range.key2 = old_range.key2;
496 } else { /* res == NULL */
497 stat = (conn->stat == RPC_SUCCESS) ?
498 CSA_E_SERVICE_UNAVAILABLE :
499 _DtCm_clntstat_to_csastat(conn->stat);
501 } while (stat == CSA_SUCCESS && new_range.key1 < old_range.key2 &&
502 (new_range.key1+1) != old_range.key2);
504 if (stat == CSA_SUCCESS) {
506 * if attrs are specified, return only those
507 * appts that matches the values
509 if (id > 0 || num_attrs > 0 || !no_end_time_range)
510 appts = _DtCm_match_appts(appts, id, no_end_time_range,
511 end1, end2, num_attrs, attrs, ops);
513 stat = _DtCm_appt4_to_libentries(cal->name, appts, entries);
514 _DtCm_free_appt4(appts);
516 } else if (appts != NULL) {
517 /* this happens if udp is used and some rpc calls succeeded */
518 _DtCm_free_appt4(appts);
525 * This routine looks up events of a repeating sequence.
526 * The caller either specifies entry and elist_r or
528 * If entry is specified, events are converted to cms_entry structures
529 * and returned in elist_r, otherwise; the caller is interested only
530 * in the key of the first entry which will be returned in the cms_key
531 * structure pointed to by key.
533 extern CSA_return_code
534 _DtCm_table_lookup_key_range(
536 _DtCm_libentry *entry,
541 _DtCm_libentry **elist_r)
543 CSA_return_code stat = CSA_SUCCESS;
544 Table_Res_4 *res=NULL;
545 _DtCm_Connection *conn;
548 _DtCm_libentry *head, *prev, *eptr;
550 DP(("table.c: _DtCm_table_lookup_key_range\n"));
552 if (cal == NULL || (entry == NULL && key == NULL) ||
553 (entry && elist_r == NULL))
554 return (CSA_E_INVALID_PARAMETER);
556 keyrange.next = NULL;
557 keyrange.key = (entry ? entry->e->key.id : id);
558 keyrange.tick1 = start;
559 keyrange.tick2 = end;
562 conn->retry = B_TRUE;
564 switch(conn->ci->vers_out) {
569 return (CSA_E_NOT_SUPPORTED);
572 a3.target = cal->name;
573 a3.args.tag = KEYRANGE_3;
574 a3.args.Args_3_u.keyrange = _DtCm_keyrange4_to_keyrange3(&keyrange);
576 res3 = _DtCm_rtable_abbreviated_lookup_key_range_3(&a3, conn);
577 res = _DtCm_tableres3_to_tableres4(res3);
578 if (a3.args.Args_3_u.keyrange != NULL)
579 free(a3.args.Args_3_u.keyrange);
581 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_3, (char*)res3);
584 a4.target = cal->name;
585 a4.args.tag = KEYRANGE_4;
586 a4.args.Args_4_u.keyrange = &keyrange;
588 res = _DtCm_rtable_abbreviated_lookup_key_range_4(&a4, conn);
591 return (CSA_E_FAILURE);
595 switch(res->status) {
597 case access_failed_4:
598 abbs = res->res.Table_Res_List_4_u.b;
600 /* caller is only interested in the first key */
602 key->id = abbs->appt_id.key;
603 key->time = abbs->appt_id.tick;
609 /* we just copy the time from the returned data */
611 while (abbs != NULL) {
612 if ((stat = _DtCm_make_libentry(entry->e,
613 &eptr)) != CSA_SUCCESS)
616 /* change time to the time of the instance */
617 eptr->e->key.time = abbs->appt_id.tick;
618 _csa_tick_to_iso8601(eptr->e->key.time,
620 attrs[CSA_ENTRY_ATTR_START_DATE_I].\
621 value->item.string_value);
633 if (stat == CSA_SUCCESS)
635 else if (head != NULL)
636 _DtCm_free_libentries(head);
640 stat = CSA_E_FAILURE;
642 case access_notable_4:
643 stat = CSA_E_CALENDAR_NOT_EXIST;
646 /* remote system error */
647 DP((errfmt, "_DtCm_table_lookup_key_range", res->status));
648 stat = CSA_E_FAILURE;
651 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_4, (char*)res);
653 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
654 _DtCm_clntstat_to_csastat(conn->stat);
660 extern CSA_return_code
664 CSA_attribute * attrs,
665 _DtCm_libentry **entry_r)
667 CSA_return_code stat = CSA_SUCCESS;
668 Table_Res_4 *res = NULL;
669 _DtCm_Connection *conn;
672 DP(("table.c: _DtCm_table_insert\n"));
674 if (cal == NULL || num_attrs == 0 || attrs == NULL || entry_r == NULL)
675 return (CSA_E_INVALID_PARAMETER);
677 if ((stat = _DtCm_attrs_to_appt4(num_attrs, attrs, &appt4)) != CSA_SUCCESS)
680 /* if the backend's version is less than 4, then it
681 * does not support repeating event types beyond yearly
684 if (conn->ci->vers_out < TABLEVERS_4 && appt4->period.period > yearly_4) {
685 _DtCm_free_appt4(appt4);
686 return (CSA_E_NOT_SUPPORTED);
689 /* for old backend, insert one appt at a time
690 * in order to match appointments with the new id
693 conn->retry = B_FALSE;
695 switch(conn->ci->vers_out) {
702 a2.target = cal->name;
703 a2.args.tag = APPT_2;
704 a2.args.Args_2_u.appt = _DtCm_appt4_to_appt2(appt4);
705 res2 = _DtCm_rtable_insert_2(&a2, conn);
706 res = _DtCm_tableres2_to_tableres4(res2);
707 if (a2.args.Args_2_u.appt != NULL)
708 _DtCm_free_appt2(a2.args.Args_2_u.appt);
710 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_2, (char*)res2);
713 a3.target = cal->name;
714 a3.args.tag = APPT_3;
715 a3.args.Args_3_u.appt = _DtCm_appt4_to_appt3(appt4);
717 res3 = _DtCm_rtable_insert_3(&a3, conn);
718 res = _DtCm_tableres3_to_tableres4(res3);
719 if (a3.args.Args_3_u.appt != NULL)
720 _DtCm_free_appt3(a3.args.Args_3_u.appt);
722 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_3, (char*)res3);
725 a4.target = cal->name;
726 a4.args.tag = APPT_4;
727 a4.args.Args_4_u.appt = appt4;
729 res = _DtCm_rtable_insert_4(&a4, conn);
732 stat = CSA_E_FAILURE;
737 switch(res->status) {
739 if (res->res.Table_Res_List_4_u.a) {
740 stat = _DtCm_appt4_to_libentries(cal->name,
741 res->res.Table_Res_List_4_u.a, entry_r);
744 case access_failed_4:
745 stat = CSA_E_NO_AUTHORITY;
748 stat = CSA_E_INVALID_PARAMETER;
750 case access_notable_4:
751 stat = CSA_E_CALENDAR_NOT_EXIST;
753 case access_partial_4:
754 case access_incomplete_4:
755 stat = CSA_E_FAILURE;
758 /* remote system error */
759 DP((errfmt, "table_insert_one", res->status));
760 stat = CSA_E_FAILURE;
763 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_4, (char*)res);
765 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
766 _DtCm_clntstat_to_csastat(conn->stat);
769 _DtCm_free_appt4(appt4);
774 extern CSA_return_code
777 _DtCm_libentry *oentry,
779 CSA_attribute * attrs,
781 _DtCm_libentry **nentry)
783 CSA_return_code stat = CSA_SUCCESS;
784 Table_Res_4 *res = NULL;
785 _DtCm_Connection *conn;
789 _DtCm_libentry *temp;
791 DP(("table.c: _DtCm_table_update_one\n"));
793 if (cal == NULL || oentry == NULL || nentry == NULL)
794 return (CSA_E_INVALID_PARAMETER);
796 /* convert scope to option */
797 if ((stat = _DtCm_scope_to_options4(scope, &opt)) != CSA_SUCCESS)
800 _csa_iso8601_to_tick(oentry->e->attrs[CSA_ENTRY_ATTR_START_DATE_I].\
801 value->item.string_value, &key.tick);
802 key.key = oentry->e->key.id;
804 /* create new appt4 from old entry and new attribute values */
807 stat = _DtCm_libentries_to_appt4(oentry, &appt4);
810 if (stat != CSA_SUCCESS)
813 /* use do_all for old backends */
814 if (appt4->period.period == single_4)
817 /* apply the new attribute values to the appointment */
818 if ((stat = _DtCm_attrs_to_apptdata(num_attrs, attrs, appt4))
820 _DtCm_free_appt4(appt4);
825 /* if the backend's version is less than 4, then it does
826 * not support repeating event types beyond yearly
827 * nor does it support do_forward
830 if (conn->ci->vers_out < TABLEVERS_4 &&
831 (appt4->period.period > yearly_4 || scope >= CSA_SCOPE_FORWARD)) {
832 _DtCm_free_appt4(appt4);
833 return (CSA_E_NOT_SUPPORTED);
836 conn->retry = B_FALSE;
837 switch(conn->ci->vers_out) {
844 a2.target = cal->name;
845 a2.args.tag = APPTID_2;
846 a2.args.Args_2_u.apptid.oid = (Id_2 *)calloc(1, sizeof(Id_2));
847 _DtCm_id4_to_id2(&key, a2.args.Args_2_u.apptid.oid);
848 a2.args.Args_2_u.apptid.new_appt = _DtCm_appt4_to_appt2(appt4);
851 res2 = _DtCm_rtable_change_2(&a2, conn);
853 res2 = _DtCm_rtable_change_instance_2(&a2, conn);
855 res = _DtCm_tableres2_to_tableres4(res2);
856 free(a2.args.Args_2_u.apptid.oid);
857 if (a2.args.Args_2_u.apptid.new_appt != NULL)
858 _DtCm_free_appt2(a2.args.Args_2_u.apptid.new_appt);
860 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_2, (char*)res2);
863 a3.target = cal->name;
864 a3.args.tag = APPTID_3;
865 a3.args.Args_3_u.apptid.oid = (Id_3 *)calloc(1, sizeof(Id_3));
866 _DtCm_id4_to_id3(&key, a3.args.Args_3_u.apptid.oid);
867 a3.args.Args_3_u.apptid.new_appt = _DtCm_appt4_to_appt3(appt4);
871 res3 = _DtCm_rtable_change_3(&a3, conn);
873 res3 = _DtCm_rtable_change_instance_3(&a3, conn);
875 res = _DtCm_tableres3_to_tableres4(res3);
876 free(a3.args.Args_3_u.apptid.oid);
877 if (a3.args.Args_3_u.apptid.new_appt != NULL)
878 _DtCm_free_appt3(a3.args.Args_3_u.apptid.new_appt);
880 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_3, (char*)res3);
883 a4.target = cal->name;
884 a4.args.tag = APPTID_4;
885 a4.args.Args_4_u.apptid.oid = &key;
886 a4.args.Args_4_u.apptid.new_appt = appt4;
887 a4.args.Args_4_u.apptid.option = opt;
889 res = _DtCm_rtable_change_4(&a4, conn);
892 stat = CSA_E_FAILURE;
895 _DtCm_free_appt4(appt4);
898 switch(res->status) {
900 if (res->res.Table_Res_List_4_u.a) {
901 stat = _DtCm_appt4_to_libentries(cal->name,
902 res->res.Table_Res_List_4_u.a, nentry);
905 case access_failed_4:
906 stat = CSA_E_NO_AUTHORITY;
908 case access_notable_4:
909 stat = CSA_E_CALENDAR_NOT_EXIST;
912 case access_partial_4:
913 case access_incomplete_4:
914 stat = CSA_E_FAILURE;
917 /* remote system error */
918 DP((errfmt, "_DtCm_table_update", res->status));
919 stat = CSA_E_FAILURE;
922 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_4, (char*)res);
924 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
925 _DtCm_clntstat_to_csastat(conn->stat);
931 extern CSA_return_code
934 _DtCm_libentry *entry,
937 CSA_return_code stat = CSA_SUCCESS;
938 Table_Res_4 *res = NULL;
939 _DtCm_Connection *conn;
941 cms_attribute *rtype;
943 DP(("table.c: _DtCm_table_delete\n"));
945 if (cal == NULL || entry == NULL)
946 return (CSA_E_INVALID_PARAMETER);
948 _csa_iso8601_to_tick(entry->e->attrs[CSA_ENTRY_ATTR_START_DATE_I].\
949 value->item.string_value, &key.appt_id.tick);
951 /* if this is an one-time appt, make sure the scope is do_all */
952 rtype = &entry->e->attrs[CSA_X_DT_ENTRY_ATTR_REPEAT_TYPE_I];
953 if (rtype->value == NULL ||
954 rtype->value->item.sint32_value == CSA_X_DT_REPEAT_ONETIME)
955 scope = CSA_SCOPE_ALL;
957 if ((stat = _DtCm_scope_to_options4(scope, &key.option)) != CSA_SUCCESS)
960 key.appt_id.key = entry->e->key.id;
964 if ((key.option == do_forward_4) && (conn->ci->vers_out < TABLEVERS_4))
965 return (CSA_E_NOT_SUPPORTED);
967 conn->retry = B_FALSE;
969 switch(conn->ci->vers_out) {
976 a2.target = cal->name;
978 a2.args.Args_2_u.key = _DtCm_uidopt4_to_uid2(&key);
980 if (key.option == do_all_4)
981 res2 = _DtCm_rtable_delete_2(&a2, conn);
983 res2 = _DtCm_rtable_delete_instance_2(&a2, conn);
985 res = _DtCm_tableres2_to_tableres4(res2);
986 if (a2.args.Args_2_u.key != NULL)
987 free(a2.args.Args_2_u.key);
989 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_2, (char*)res2);
992 a3.target = cal->name;
994 a3.args.Args_3_u.key = _DtCm_uidopt4_to_uid3(&key);
997 if (key.option == do_all_4)
998 res3 = _DtCm_rtable_delete_3(&a3, conn);
1000 res3 = _DtCm_rtable_delete_instance_3(&a3, conn);
1002 res = _DtCm_tableres3_to_tableres4(res3);
1003 if (a3.args.Args_3_u.key != NULL)
1004 free(a3.args.Args_3_u.key);
1006 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_3, (char*)res3);
1009 a4.target = cal->name;
1010 a4.args.tag = UIDOPT_4;
1011 a4.args.Args_4_u.uidopt = &key;
1013 res = _DtCm_rtable_delete_4(&a4, conn);
1016 stat = CSA_E_FAILURE;
1021 switch(res->status) {
1023 if (res->res.Table_Res_List_4_u.a == NULL)
1024 stat = CSA_X_DT_E_ENTRY_NOT_FOUND |
1025 CSA_E_INVALID_ENTRY_HANDLE;
1027 case access_failed_4:
1028 stat = CSA_E_NO_AUTHORITY;
1030 case access_other_4:
1031 stat = CSA_E_INVALID_PARAMETER;
1033 case access_notable_4:
1034 case access_partial_4:
1035 case access_incomplete_4:
1036 stat = CSA_E_FAILURE;
1039 /* remote system error */
1040 DP((errfmt, "table_delete", res->status));
1041 stat = CSA_E_FAILURE;
1044 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_4, (char*)res);
1047 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
1048 _DtCm_clntstat_to_csastat(conn->stat);
1054 extern CSA_return_code
1055 _DtCm_table_size(Calendar *cal, int *size)
1058 CSA_return_code stat = CSA_SUCCESS;
1059 _DtCm_Connection *conn;
1061 DP(("table.c: _DtCm_table_size\n"));
1063 if (cal == NULL || size == NULL)
1064 return (CSA_E_INVALID_PARAMETER);
1067 conn->retry = B_TRUE;
1069 switch(conn->ci->vers_out) {
1074 a2.target = cal->name;
1075 a2.args.tag = TICK_2;
1076 a2.args.Args_2_u.tick = 0;
1077 res = _DtCm_rtable_size_2(&a2, conn);
1080 a3.target = cal->name;
1081 a3.args.tag = TICK_3;
1082 a3.args.Args_3_u.tick = 0;
1084 res = _DtCm_rtable_size_3(&a3, conn);
1087 a4.target = cal->name;
1088 a4.args.tag = TICK_4;
1089 a4.args.Args_4_u.tick = 0;
1091 res = _DtCm_rtable_size_4(&a4, conn);
1094 stat = CSA_E_FAILURE;
1101 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
1102 _DtCm_clntstat_to_csastat(conn->stat);
1108 extern CSA_return_code
1109 _DtCm_table_lookup_reminder(
1111 CSA_uint32 num_names,
1112 char **reminder_names,
1113 CSA_uint32 *num_rems,
1114 CSA_reminder_reference **rems)
1116 CSA_return_code stat = CSA_SUCCESS;
1117 Table_Res_4 *res = NULL;
1118 _DtCm_Connection *conn;
1122 DP(("table.c: _DtCm_table_lookup_reminder\n"));
1124 if (cal == NULL || num_rems == 0 || rems == NULL)
1125 return (CSA_E_INVALID_PARAMETER);
1128 * Due to the implementation of existing backends which
1129 * will unmanage any reminders that happens before the
1130 * the given tick, the user specified tick is ignore and
1131 * we will pass in the current time.
1136 conn->retry = B_TRUE;
1138 switch(conn->ci->vers_out) {
1145 a2.target = cal->name;
1146 a2.args.tag = TICK_2;
1147 a2.args.Args_2_u.tick = tick;
1148 res2 = _DtCm_rtable_lookup_next_reminder_2(&a2, conn);
1149 res = _DtCm_tableres2_to_tableres4(res2);
1151 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_2, (char*)res2);
1154 a3.target = cal->name;
1155 a3.args.tag = TICK_3;
1156 a3.args.Args_3_u.tick = tick;
1158 res3 = _DtCm_rtable_lookup_next_reminder_3(&a3, conn);
1159 res = _DtCm_tableres3_to_tableres4(res3);
1161 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_3, (char*)res3);
1164 a4.target = cal->name;
1165 a4.args.tag = TICK_4;
1166 a4.args.Args_4_u.tick = tick;
1168 res = _DtCm_rtable_lookup_next_reminder_4(&a4, conn);
1171 stat = CSA_E_FAILURE;
1176 switch(res->status) {
1179 * if reminder names are specified,
1180 * return only those that match
1182 rptr = _DtCm_copy_reminder4(res->res.Table_Res_List_4_u.r);
1183 xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_4, (char*)res);
1185 if (num_names > 0 && reminder_names != NULL) {
1186 rptr = _DtCm_match_reminders(rptr, num_names,
1190 stat = _DtCm_reminder4_to_csareminder(rptr, num_rems,
1194 _DtCm_free_reminder4(rptr);
1196 case access_notable_4:
1197 stat = CSA_E_CALENDAR_NOT_EXIST;
1199 case access_failed_4:
1200 case access_other_4:
1201 stat = CSA_E_FAILURE;
1204 /* remote system error */
1205 DP ((errfmt, "_DtCm_table_lookup_reminder", res->status));
1206 stat = CSA_E_FAILURE;
1210 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
1211 _DtCm_clntstat_to_csastat(conn->stat);
1217 extern CSA_return_code
1218 _DtCm_table_unregister_target(
1219 _DtCm_Connection *conn,
1222 CSA_return_code stat;
1223 Registration_Status_4 res;
1224 boolean_t nullreturned = B_FALSE;
1226 DP(("table.c: _DtCm_table_unregister_target\n"));
1228 switch(conn->ci->vers_out) {
1232 Registration_Status_2 *stat2;
1233 Registration_Status_3 *stat3;
1234 Registration_Status_4 *stat4;
1237 r2.target = calendar;
1238 r2.prognum = _DtCm_transient;
1239 r2.versnum = AGENTVERS;
1240 r2.procnum = update_callback;
1242 stat2 = _DtCm_deregister_callback_2(&r2, conn);
1244 res = _DtCm_regstat2_to_regstat4(*stat2);
1246 nullreturned = B_TRUE;
1250 r3.target = calendar;
1251 r3.prognum = _DtCm_transient;
1252 r3.versnum = AGENTVERS;
1253 r3.procnum = update_callback;
1256 stat3 = _DtCm_deregister_callback_3(&r3, conn);
1258 res = _DtCm_regstat3_to_regstat4(*stat3);
1260 nullreturned = B_TRUE;
1264 r4.target = calendar;
1265 r4.prognum = _DtCm_transient;
1266 r4.versnum = AGENTVERS;
1267 r4.procnum = update_callback;
1270 stat4 = _DtCm_deregister_callback_4(&r4, conn);
1274 nullreturned = B_TRUE;
1277 stat = CSA_E_FAILURE;
1281 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
1282 _DtCm_clntstat_to_csastat(conn->stat);
1285 case deregistered_4:
1290 stat = CSA_E_CALENDAR_NOT_EXIST;
1294 stat = CSA_E_FAILURE;
1302 extern CSA_return_code
1303 _DtCm_table_register_target(
1304 _DtCm_Connection *conn,
1307 CSA_return_code stat;
1308 Registration_Status_4 res;
1309 boolean_t nullreturned = B_FALSE;
1311 DP(("table.c: _DtCm_table_register_target\n"));
1313 switch(conn->ci->vers_out) {
1317 Registration_Status_2 *stat2;
1318 Registration_Status_3 *stat3;
1319 Registration_Status_4 *stat4;
1322 r2.target = calendar;
1323 r2.prognum = _DtCm_transient;
1324 r2.versnum = AGENTVERS;
1325 r2.procnum = update_callback;
1327 stat2 = _DtCm_register_callback_2(&r2, conn);
1329 res = _DtCm_regstat2_to_regstat4(*stat2);
1331 nullreturned = B_TRUE;
1335 r3.target = calendar;
1336 r3.prognum = _DtCm_transient;
1337 r3.versnum = AGENTVERS;
1338 r3.procnum = update_callback;
1341 stat3 = _DtCm_register_callback_3(&r3, conn);
1343 res = _DtCm_regstat3_to_regstat4(*stat3);
1345 nullreturned = B_TRUE;
1349 r4.target = calendar;
1350 r4.prognum = _DtCm_transient;
1351 r4.versnum = AGENTVERS;
1352 r4.procnum = update_callback;
1355 stat4 = _DtCm_register_callback_4(&r4, conn);
1359 nullreturned = B_TRUE;
1362 stat = CSA_E_FAILURE;
1366 stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE :
1367 _DtCm_clntstat_to_csastat(conn->stat);
1375 stat = CSA_E_CALENDAR_NOT_EXIST;
1379 stat = CSA_E_FAILURE;
1386 /*****************************************************************************
1387 * static functions used within the file
1388 *****************************************************************************/
1391 * Returns 1 if stat contains an invalid status
1393 static CSA_return_code
1394 tablestat_to_dtcmstat(Table_Status_4 stat, CSA_return_code *dtcmstat)
1398 *dtcmstat = CSA_SUCCESS;
1401 *dtcmstat = CSA_E_CALENDAR_EXISTS;
1404 *dtcmstat = CSA_E_CALENDAR_NOT_EXIST;
1407 *dtcmstat = CSA_E_NO_AUTHORITY;
1411 *dtcmstat = CSA_E_FAILURE;
1413 case tbl_not_owner_4:
1414 *dtcmstat = CSA_E_NO_AUTHORITY;
1417 *dtcmstat = CSA_E_CALENDAR_EXISTS;
1419 case tbl_notsupported_4:
1420 *dtcmstat = CSA_E_NOT_SUPPORTED;
1423 *dtcmstat = CSA_E_FAILURE;
1424 return (CSA_E_FAILURE);
1427 return (CSA_SUCCESS);