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 librararies 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: v5ops.c /main/4 1995/11/09 12:55:44 rswiston $ */
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>
39 #include "updateattrs.h"
44 /*****************************************************************************
45 * extern functions used in the library
46 *****************************************************************************/
48 extern _DtCmsComparisonResult
49 _DtCmsCompareEntry(cms_key *key, caddr_t data)
51 cms_entry *entry = (cms_entry *)data;
53 /* check the time only if it's not zero */
54 if (key->time < entry->key.time)
55 return (_DtCmsIsLess);
56 if (key->time > entry->key.time)
57 return (_DtCmsIsGreater);
59 /* tick's are _DtCmsIsEqual */
60 if (key->id < entry->key.id)
61 return (_DtCmsIsLess);
62 if (key->id > entry->key.id)
63 return (_DtCmsIsGreater);
65 return (_DtCmsIsEqual);
68 extern _DtCmsComparisonResult
69 _DtCmsCompareRptEntry(cms_key *key, caddr_t data)
71 cms_entry *entry = (cms_entry *)data;
73 if (key->id < entry->key.id)
74 return (_DtCmsIsLess);
75 if (key->id > entry->key.id)
76 return (_DtCmsIsGreater);
77 return (_DtCmsIsEqual);
81 _DtCmsGetEntryKey(caddr_t data)
83 return ((caddr_t) &(((cms_entry *)data)->key));
86 extern CSA_return_code
87 _DtCmsSetLastUpdate(cms_entry *entry)
90 cms_attribute_value val;
92 _csa_tick_to_iso8601(time(0), datestr);
94 val.type = CSA_VALUE_DATE_TIME;
95 val.item.date_time_value = datestr;
97 /* CSA_ENTRY_ATTR_LAST_UPDATE_I */
98 return (_DtCmUpdateStringAttrVal(&val,
99 &entry->attrs[CSA_ENTRY_ATTR_LAST_UPDATE_I].value));
103 _DtCmsConvertToOnetime(cms_entry *entry, RepeatEvent *re)
105 time_t ctick, lasttick, diff = 0;
106 RepeatEventState *res;
108 lasttick = LastTick(entry->key.time, re);
109 for (ctick = ClosestTick(entry->key.time, entry->key.time, re, &res);
111 ctick = NextTick(ctick, entry->key.time, re, res))
113 if (ctick <= 0 || !_DtCmsInExceptionList(entry, ctick))
117 if (ctick != entry->key.time) {
118 if (entry->attrs[CSA_ENTRY_ATTR_END_DATE_I].value) {
119 _csa_iso8601_to_tick(entry->attrs\
120 [CSA_ENTRY_ATTR_END_DATE_I].value->item.\
121 date_time_value, &diff);
122 diff = diff - entry->key.time;
125 entry->key.time = ctick;
126 _csa_tick_to_iso8601(ctick, entry->attrs\
127 [CSA_ENTRY_ATTR_START_DATE_I].value->item.\
130 if (entry->attrs[CSA_ENTRY_ATTR_END_DATE_I].value)
131 _csa_tick_to_iso8601(ctick+diff, entry->attrs\
132 [CSA_ENTRY_ATTR_END_DATE_I].value->item.\
136 if (entry->attrs[CSA_X_DT_ENTRY_ATTR_REPEAT_TYPE_I].value)
137 entry->attrs[CSA_X_DT_ENTRY_ATTR_REPEAT_TYPE_I].value->item.\
138 sint32_value = CSA_X_DT_REPEAT_ONETIME;
140 _DtCm_set_sint32_attrval(CSA_X_DT_REPEAT_ONETIME,
141 &entry->attrs[CSA_X_DT_ENTRY_ATTR_REPEAT_TYPE_I].value);
143 _DtCmUpdateDateTimeListAttrVal(NULL, &entry->attrs\
144 [CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value);
146 _DtCmUpdateSint32AttrVal(NULL, &entry->attrs\
147 [CSA_ENTRY_ATTR_NUMBER_RECURRENCES_I].value);
149 _DtCmUpdateStringAttrVal(NULL, &entry->attrs\
150 [CSA_ENTRY_ATTR_RECURRENCE_RULE_I].value);
152 _DtCmUpdateSint32AttrVal(NULL, &entry->attrs\
153 [CSA_X_DT_ENTRY_ATTR_REPEAT_TIMES_I].value);
155 _DtCmUpdateSint32AttrVal(NULL, &entry->attrs\
156 [CSA_X_DT_ENTRY_ATTR_REPEAT_INTERVAL_I].value);
158 _DtCmUpdateSint32AttrVal(NULL, &entry->attrs\
159 [CSA_X_DT_ENTRY_ATTR_REPEAT_OCCURRENCE_NUM_I].value);
161 _DtCmUpdateStringAttrVal(NULL, &entry->attrs\
162 [CSA_X_DT_ENTRY_ATTR_SEQUENCE_END_DATE_I].value);
166 _DtCmsGetDuration(cms_entry *eptr)
170 if (eptr->attrs[CSA_ENTRY_ATTR_END_DATE_I].value) {
171 _csa_iso8601_to_tick(eptr->attrs[CSA_ENTRY_ATTR_END_DATE_I].\
172 value->item.date_time_value, &etime);
174 _csa_iso8601_to_tick(eptr->attrs[CSA_ENTRY_ATTR_START_DATE_I].\
175 value->item.date_time_value, &stime);
177 return (etime - stime);
182 extern CSA_return_code
183 _DtCmsCheckInitialAttributes(cms_entry *entry)
185 CSA_return_code stat;
186 cms_attribute *attrs;
190 return (CSA_E_INVALID_PARAMETER);
192 attrs = entry->attrs;
194 /* fill in server generated value */
196 /* CSA_ENTRY_ATTR_DATE_CREATED_I */
197 _csa_tick_to_iso8601(time(0), datestr);
198 if ((stat = _DtCm_set_string_attrval(datestr,
199 &attrs[CSA_ENTRY_ATTR_DATE_CREATED_I].value, CSA_VALUE_DATE_TIME))
203 /* CSA_ENTRY_ATTR_LAST_UPDATE_I */
204 if ((stat = _DtCm_set_string_attrval(datestr,
205 &attrs[CSA_ENTRY_ATTR_LAST_UPDATE_I].value, CSA_VALUE_DATE_TIME))
209 /* fill in default values when not specified */
210 if (attrs[CSA_ENTRY_ATTR_SUMMARY_I].value == NULL &&
211 (stat = _DtCm_set_string_attrval("",
212 &attrs[CSA_ENTRY_ATTR_SUMMARY_I].value, CSA_VALUE_STRING))
216 if (attrs[CSA_X_DT_ENTRY_ATTR_SHOWTIME_I].value == NULL &&
217 (stat = _DtCm_set_sint32_attrval(1,
218 &attrs[CSA_X_DT_ENTRY_ATTR_SHOWTIME_I].value)) != CSA_SUCCESS)
221 if (attrs[CSA_ENTRY_ATTR_CLASSIFICATION_I].value == NULL &&
222 (stat = _DtCm_set_uint32_attrval(CSA_CLASS_PUBLIC,
223 &attrs[CSA_ENTRY_ATTR_CLASSIFICATION_I].value)) != CSA_SUCCESS)
226 if (attrs[CSA_ENTRY_ATTR_STATUS_I].value == NULL &&
227 (stat = _DtCm_set_uint32_attrval(CSA_X_DT_STATUS_ACTIVE,
228 &attrs[CSA_ENTRY_ATTR_STATUS_I].value)) != CSA_SUCCESS)
231 if (attrs[CSA_ENTRY_ATTR_SUBTYPE_I].value == NULL &&
232 attrs[CSA_ENTRY_ATTR_TYPE_I].value->item.uint32_value ==
234 (stat = _DtCm_set_string_attrval(CSA_SUBTYPE_APPOINTMENT,
235 &attrs[CSA_ENTRY_ATTR_SUBTYPE_I].value, CSA_VALUE_STRING))
239 return (CSA_SUCCESS);
242 extern CSA_return_code
243 _DtCmsCheckStartEndTime(cms_entry *entry)
247 if (entry->attrs[CSA_ENTRY_ATTR_END_DATE_I].value) {
248 _csa_iso8601_to_tick(entry->attrs[CSA_ENTRY_ATTR_END_DATE_I].\
249 value->item.date_time_value, &endtime);
250 if (endtime < entry->key.time)
251 return (CSA_E_INVALID_ATTRIBUTE_VALUE);
253 return (CSA_SUCCESS);
255 return (CSA_SUCCESS);
259 _DtCmsCleanupExceptionDates(cms_entry *entry, long ftick)
262 CSA_date_time_list dt, prev, head;
264 if (entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value == NULL ||
265 entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value->item.\
266 date_time_list_value == NULL)
269 head = entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value->item.\
270 date_time_list_value;
272 for (dt = head, prev = NULL; dt != NULL; prev = dt, dt = dt->next) {
273 _csa_iso8601_to_tick(dt->date_time, &tick);
277 _DtCm_free_date_time_list(head);
284 free(entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value);
285 entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value = NULL;
287 entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value->item.\
288 date_time_list_value = dt;
292 _DtCmsNumberExceptionDates(cms_entry *entry)
294 cms_attribute_value *vptr;
295 CSA_date_time_list dt;
298 if ((vptr = entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value)
303 for (dt = vptr->item.date_time_list_value; dt != NULL; dt = dt->next)
309 extern CSA_return_code
310 _DtCmsUpdateDurationInRule(cms_entry *entry, uint remain)
314 cms_attribute_value *vptr;
316 vptr = entry->attrs[CSA_ENTRY_ATTR_RECURRENCE_RULE_I].value;
317 if ((newrule = malloc(strlen(vptr->item.string_value) + 20)) == NULL)
318 return (CSA_E_INSUFFICIENT_MEMORY);
320 sprintf(buf, "#%d", remain);
321 if (ptr = strchr(vptr->item.string_value, '#')) {
323 strcpy(newrule, vptr->item.string_value);
324 strcat(newrule, buf);
325 if (ptr = strchr(ptr + 1, ' '))
326 strcat(newrule, ptr);
328 if (ptr = strchr(vptr->item.string_value, ' ')) {
330 sprintf(newrule, "%s %s %s", vptr->item.string_value,
333 sprintf(newrule, "%s %s", vptr->item.string_value, buf);
336 free (vptr->item.string_value);
337 entry->attrs[CSA_ENTRY_ATTR_RECURRENCE_RULE_I].value->item.string_value
340 entry->attrs[CSA_ENTRY_ATTR_NUMBER_RECURRENCES_I].value->\
341 item.uint32_value = remain;
343 return (CSA_SUCCESS);
346 extern CSA_return_code
347 _DtCmsAddEndDateToRule(cms_attribute *attr, RepeatEvent *re, long time)
352 if (_csa_tick_to_iso8601(time, buf))
353 return (CSA_E_INVALID_DATE_TIME);
355 if ((newrule = malloc(strlen(attr->value->item.string_value)+20))
357 return (CSA_E_INSUFFICIENT_MEMORY);
359 if (re->re_end_date == 0) {
360 sprintf(newrule, "%s %s", attr->value->item.string_value, buf);
362 /* end date is always at the end of the rule */
363 strcpy(newrule, attr->value->item.string_value);
364 ptr = strrchr(newrule, ' ');
365 sprintf(ptr, " %s", buf);
368 free(attr->value->item.string_value);
369 attr->value->item.string_value = newrule;
371 return (CSA_SUCCESS);