1 /* $XConsortium: v5ops.c /main/4 1995/11/09 12:55:44 rswiston $ */
3 * (c) Copyright 1993, 1994 Hewlett-Packard Company
4 * (c) Copyright 1993, 1994 International Business Machines Corp.
5 * (c) Copyright 1993, 1994 Novell, Inc.
6 * (c) Copyright 1993, 1994 Sun Microsystems, Inc.
17 #include "updateattrs.h"
22 /*****************************************************************************
23 * extern functions used in the library
24 *****************************************************************************/
26 extern _DtCmsComparisonResult
27 _DtCmsCompareEntry(cms_key *key, caddr_t data)
29 cms_entry *entry = (cms_entry *)data;
31 /* check the time only if it's not zero */
32 if (key->time < entry->key.time)
33 return (_DtCmsIsLess);
34 if (key->time > entry->key.time)
35 return (_DtCmsIsGreater);
37 /* tick's are _DtCmsIsEqual */
38 if (key->id < entry->key.id)
39 return (_DtCmsIsLess);
40 if (key->id > entry->key.id)
41 return (_DtCmsIsGreater);
43 return (_DtCmsIsEqual);
46 extern _DtCmsComparisonResult
47 _DtCmsCompareRptEntry(cms_key *key, caddr_t data)
49 cms_entry *entry = (cms_entry *)data;
51 if (key->id < entry->key.id)
52 return (_DtCmsIsLess);
53 if (key->id > entry->key.id)
54 return (_DtCmsIsGreater);
55 return (_DtCmsIsEqual);
59 _DtCmsGetEntryKey(caddr_t data)
61 return ((caddr_t) &(((cms_entry *)data)->key));
64 extern CSA_return_code
65 _DtCmsSetLastUpdate(cms_entry *entry)
68 cms_attribute_value val;
70 _csa_tick_to_iso8601(time(0), datestr);
72 val.type = CSA_VALUE_DATE_TIME;
73 val.item.date_time_value = datestr;
75 /* CSA_ENTRY_ATTR_LAST_UPDATE_I */
76 return (_DtCmUpdateStringAttrVal(&val,
77 &entry->attrs[CSA_ENTRY_ATTR_LAST_UPDATE_I].value));
81 _DtCmsConvertToOnetime(cms_entry *entry, RepeatEvent *re)
83 time_t ctick, lasttick, diff = 0;
84 RepeatEventState *res;
86 lasttick = LastTick(entry->key.time, re);
87 for (ctick = ClosestTick(entry->key.time, entry->key.time, re, &res);
89 ctick = NextTick(ctick, entry->key.time, re, res))
91 if (ctick <= 0 || !_DtCmsInExceptionList(entry, ctick))
95 if (ctick != entry->key.time) {
96 if (entry->attrs[CSA_ENTRY_ATTR_END_DATE_I].value) {
97 _csa_iso8601_to_tick(entry->attrs\
98 [CSA_ENTRY_ATTR_END_DATE_I].value->item.\
99 date_time_value, &diff);
100 diff = diff - entry->key.time;
103 entry->key.time = ctick;
104 _csa_tick_to_iso8601(ctick, entry->attrs\
105 [CSA_ENTRY_ATTR_START_DATE_I].value->item.\
108 if (entry->attrs[CSA_ENTRY_ATTR_END_DATE_I].value)
109 _csa_tick_to_iso8601(ctick+diff, entry->attrs\
110 [CSA_ENTRY_ATTR_END_DATE_I].value->item.\
114 if (entry->attrs[CSA_X_DT_ENTRY_ATTR_REPEAT_TYPE_I].value)
115 entry->attrs[CSA_X_DT_ENTRY_ATTR_REPEAT_TYPE_I].value->item.\
116 sint32_value = CSA_X_DT_REPEAT_ONETIME;
118 _DtCm_set_sint32_attrval(CSA_X_DT_REPEAT_ONETIME,
119 &entry->attrs[CSA_X_DT_ENTRY_ATTR_REPEAT_TYPE_I].value);
121 _DtCmUpdateDateTimeListAttrVal(NULL, &entry->attrs\
122 [CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value);
124 _DtCmUpdateSint32AttrVal(NULL, &entry->attrs\
125 [CSA_ENTRY_ATTR_NUMBER_RECURRENCES_I].value);
127 _DtCmUpdateStringAttrVal(NULL, &entry->attrs\
128 [CSA_ENTRY_ATTR_RECURRENCE_RULE_I].value);
130 _DtCmUpdateSint32AttrVal(NULL, &entry->attrs\
131 [CSA_X_DT_ENTRY_ATTR_REPEAT_TIMES_I].value);
133 _DtCmUpdateSint32AttrVal(NULL, &entry->attrs\
134 [CSA_X_DT_ENTRY_ATTR_REPEAT_INTERVAL_I].value);
136 _DtCmUpdateSint32AttrVal(NULL, &entry->attrs\
137 [CSA_X_DT_ENTRY_ATTR_REPEAT_OCCURRENCE_NUM_I].value);
139 _DtCmUpdateStringAttrVal(NULL, &entry->attrs\
140 [CSA_X_DT_ENTRY_ATTR_SEQUENCE_END_DATE_I].value);
144 _DtCmsGetDuration(cms_entry *eptr)
148 if (eptr->attrs[CSA_ENTRY_ATTR_END_DATE_I].value) {
149 _csa_iso8601_to_tick(eptr->attrs[CSA_ENTRY_ATTR_END_DATE_I].\
150 value->item.date_time_value, &etime);
152 _csa_iso8601_to_tick(eptr->attrs[CSA_ENTRY_ATTR_START_DATE_I].\
153 value->item.date_time_value, &stime);
155 return (etime - stime);
160 extern CSA_return_code
161 _DtCmsCheckInitialAttributes(cms_entry *entry)
163 CSA_return_code stat;
164 cms_attribute *attrs;
168 return (CSA_E_INVALID_PARAMETER);
170 attrs = entry->attrs;
172 /* fill in server generated value */
174 /* CSA_ENTRY_ATTR_DATE_CREATED_I */
175 _csa_tick_to_iso8601(time(0), datestr);
176 if ((stat = _DtCm_set_string_attrval(datestr,
177 &attrs[CSA_ENTRY_ATTR_DATE_CREATED_I].value, CSA_VALUE_DATE_TIME))
181 /* CSA_ENTRY_ATTR_LAST_UPDATE_I */
182 if ((stat = _DtCm_set_string_attrval(datestr,
183 &attrs[CSA_ENTRY_ATTR_LAST_UPDATE_I].value, CSA_VALUE_DATE_TIME))
187 /* fill in default values when not specified */
188 if (attrs[CSA_ENTRY_ATTR_SUMMARY_I].value == NULL &&
189 (stat = _DtCm_set_string_attrval("",
190 &attrs[CSA_ENTRY_ATTR_SUMMARY_I].value, CSA_VALUE_STRING))
194 if (attrs[CSA_X_DT_ENTRY_ATTR_SHOWTIME_I].value == NULL &&
195 (stat = _DtCm_set_sint32_attrval(1,
196 &attrs[CSA_X_DT_ENTRY_ATTR_SHOWTIME_I].value)) != CSA_SUCCESS)
199 if (attrs[CSA_ENTRY_ATTR_CLASSIFICATION_I].value == NULL &&
200 (stat = _DtCm_set_uint32_attrval(CSA_CLASS_PUBLIC,
201 &attrs[CSA_ENTRY_ATTR_CLASSIFICATION_I].value)) != CSA_SUCCESS)
204 if (attrs[CSA_ENTRY_ATTR_STATUS_I].value == NULL &&
205 (stat = _DtCm_set_uint32_attrval(CSA_X_DT_STATUS_ACTIVE,
206 &attrs[CSA_ENTRY_ATTR_STATUS_I].value)) != CSA_SUCCESS)
209 if (attrs[CSA_ENTRY_ATTR_SUBTYPE_I].value == NULL &&
210 attrs[CSA_ENTRY_ATTR_TYPE_I].value->item.uint32_value ==
212 (stat = _DtCm_set_string_attrval(CSA_SUBTYPE_APPOINTMENT,
213 &attrs[CSA_ENTRY_ATTR_SUBTYPE_I].value, CSA_VALUE_STRING))
217 return (CSA_SUCCESS);
220 extern CSA_return_code
221 _DtCmsCheckStartEndTime(cms_entry *entry)
225 if (entry->attrs[CSA_ENTRY_ATTR_END_DATE_I].value) {
226 _csa_iso8601_to_tick(entry->attrs[CSA_ENTRY_ATTR_END_DATE_I].\
227 value->item.date_time_value, &endtime);
228 if (endtime < entry->key.time)
229 return (CSA_E_INVALID_ATTRIBUTE_VALUE);
231 return (CSA_SUCCESS);
233 return (CSA_SUCCESS);
237 _DtCmsCleanupExceptionDates(cms_entry *entry, long ftick)
240 CSA_date_time_list dt, prev, head;
242 if (entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value == NULL ||
243 entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value->item.\
244 date_time_list_value == NULL)
247 head = entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value->item.\
248 date_time_list_value;
250 for (dt = head, prev = NULL; dt != NULL; prev = dt, dt = dt->next) {
251 _csa_iso8601_to_tick(dt->date_time, &tick);
255 _DtCm_free_date_time_list(head);
262 free(entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value);
263 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 = dt;
270 _DtCmsNumberExceptionDates(cms_entry *entry)
272 cms_attribute_value *vptr;
273 CSA_date_time_list dt;
276 if ((vptr = entry->attrs[CSA_ENTRY_ATTR_EXCEPTION_DATES_I].value)
281 for (dt = vptr->item.date_time_list_value; dt != NULL; dt = dt->next)
287 extern CSA_return_code
288 _DtCmsUpdateDurationInRule(cms_entry *entry, uint remain)
292 cms_attribute_value *vptr;
294 vptr = entry->attrs[CSA_ENTRY_ATTR_RECURRENCE_RULE_I].value;
295 if ((newrule = malloc(strlen(vptr->item.string_value) + 20)) == NULL)
296 return (CSA_E_INSUFFICIENT_MEMORY);
298 sprintf(buf, "#%d", remain);
299 if (ptr = strchr(vptr->item.string_value, '#')) {
301 strcpy(newrule, vptr->item.string_value);
302 strcat(newrule, buf);
303 if (ptr = strchr(ptr + 1, ' '))
304 strcat(newrule, ptr);
306 if (ptr = strchr(vptr->item.string_value, ' ')) {
308 sprintf(newrule, "%s %s %s", vptr->item.string_value,
311 sprintf(newrule, "%s %s", vptr->item.string_value, buf);
314 free (vptr->item.string_value);
315 entry->attrs[CSA_ENTRY_ATTR_RECURRENCE_RULE_I].value->item.string_value
318 entry->attrs[CSA_ENTRY_ATTR_NUMBER_RECURRENCES_I].value->\
319 item.uint32_value = remain;
321 return (CSA_SUCCESS);
324 extern CSA_return_code
325 _DtCmsAddEndDateToRule(cms_attribute *attr, RepeatEvent *re, long time)
330 if (_csa_tick_to_iso8601(time, buf))
331 return (CSA_E_INVALID_DATE_TIME);
333 if ((newrule = malloc(strlen(attr->value->item.string_value)+20))
335 return (CSA_E_INSUFFICIENT_MEMORY);
337 if (re->re_end_date == 0) {
338 sprintf(newrule, "%s %s", attr->value->item.string_value, buf);
340 /* end date is always at the end of the rule */
341 strcpy(newrule, attr->value->item.string_value);
342 ptr = strrchr(newrule, ' ');
343 sprintf(ptr, " %s", buf);
346 free(attr->value->item.string_value);
347 attr->value->item.string_value = newrule;
349 return (CSA_SUCCESS);