1164 lines
28 KiB
C
1164 lines
28 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/* $XConsortium: cmsconvert.c /main/5 1996/10/03 10:38:06 drk $ */
|
|
/*
|
|
* (c) Copyright 1993, 1994 Hewlett-Packard Company
|
|
* (c) Copyright 1993, 1994 International Business Machines Corp.
|
|
* (c) Copyright 1993, 1994 Novell, Inc.
|
|
* (c) Copyright 1993, 1994 Sun Microsystems, Inc.
|
|
*/
|
|
|
|
#include <EUSCompat.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include "cmsconvert.h"
|
|
#include "convert5-4.h"
|
|
#include "convert4-5.h"
|
|
#include "attr.h"
|
|
#include "appt4.h"
|
|
#include "iso8601.h"
|
|
#include "lutil.h"
|
|
#include "cmsdata.h"
|
|
|
|
/*
|
|
* Routines to convert data types used in version 5 to version 4.
|
|
*/
|
|
|
|
/*
|
|
* forward declaration of functions used in the file
|
|
*/
|
|
static Abb_Appt_4 * _MakeAbbrAppt();
|
|
|
|
static CSA_return_code _AttrsToAbbrAppt(uint size, cms_attribute *attrs,
|
|
Abb_Appt_4 *appt);
|
|
|
|
static uint _ConvertV5Access(uint v5rights, boolean_t strictmode);
|
|
|
|
static uint _ConvertV4Access(uint v4rights);
|
|
|
|
static char * _ConvertReminderName(char *rname);
|
|
|
|
static CSA_return_code _Appt4ToCmsentryAttrs(char *calname, Appt_4 *a4,
|
|
uint *num_attrs, cms_attribute **attrs_r);
|
|
/*****************************************************************************
|
|
* extern functions
|
|
*****************************************************************************/
|
|
|
|
extern CSA_return_code
|
|
_DtCmsCmsentriesToAppt4ForClient(cms_entry *entries, Appt_4 **appt)
|
|
{
|
|
CSA_return_code stat = CSA_SUCCESS;
|
|
Appt_4 *newappt, *prev, *head;
|
|
|
|
if (appt == NULL)
|
|
return (CSA_E_INVALID_PARAMETER);
|
|
|
|
head = prev = NULL;
|
|
while (entries != NULL) {
|
|
if ((newappt = _DtCm_make_appt4(B_TRUE)) == NULL)
|
|
break;
|
|
|
|
if ((stat = _DtCmsAttrsToAppt4(entries->num_attrs + 1,
|
|
entries->attrs, newappt, B_FALSE)) != CSA_SUCCESS) {
|
|
_DtCm_free_appt4(newappt);
|
|
break;
|
|
} else
|
|
newappt->appt_id.key = entries->key.id;
|
|
|
|
if (head == NULL)
|
|
head = newappt;
|
|
else
|
|
prev->next = newappt;
|
|
|
|
prev = newappt;
|
|
entries = entries->next;
|
|
}
|
|
|
|
if (stat != CSA_SUCCESS) {
|
|
_DtCm_free_appt4(head);
|
|
head = NULL;
|
|
}
|
|
|
|
*appt = head;
|
|
return (stat);
|
|
}
|
|
|
|
extern CSA_return_code
|
|
_DtCmsCmsentriesToAbbrAppt4ForClient(cms_entry *entries, Abb_Appt_4 **abbr)
|
|
{
|
|
CSA_return_code stat = CSA_SUCCESS;
|
|
Abb_Appt_4 *newabbr, *prev, *head;
|
|
|
|
if (abbr == NULL)
|
|
return (CSA_E_INVALID_PARAMETER);
|
|
|
|
head = prev = NULL;
|
|
while (entries != NULL) {
|
|
if ((newabbr = _MakeAbbrAppt()) == NULL)
|
|
break;
|
|
|
|
if ((stat = _AttrsToAbbrAppt(entries->num_attrs, entries->attrs,
|
|
newabbr)) != CSA_SUCCESS) {
|
|
_DtCm_free_abbrev_appt4(newabbr);
|
|
break;
|
|
} else
|
|
newabbr->appt_id.key = entries->key.id;
|
|
|
|
if (head == NULL)
|
|
head = newabbr;
|
|
else
|
|
prev->next = newabbr;
|
|
|
|
prev = newabbr;
|
|
entries = entries->next;
|
|
}
|
|
|
|
if (stat != CSA_SUCCESS) {
|
|
_DtCm_free_abbrev_appt4(head);
|
|
head = NULL;
|
|
}
|
|
|
|
*abbr = head;
|
|
return (stat);
|
|
}
|
|
|
|
extern Access_Entry_4 *
|
|
_DtCmsConvertV5AccessList(cms_access_entry *cmslist, boolean_t strictmode)
|
|
{
|
|
Access_Entry_4 *l, *head, *prev;
|
|
boolean_t cleanup = B_FALSE;
|
|
|
|
prev = head = NULL;
|
|
while (cmslist != NULL) {
|
|
if ((l = (Access_Entry_4 *)calloc(1, sizeof(Access_Entry_4)))
|
|
== NULL) {
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
if ((l->who = strdup(cmslist->user)) == NULL) {
|
|
free(l);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
l->access_type = _ConvertV5Access(cmslist->rights, strictmode);
|
|
|
|
if (head == NULL)
|
|
head = l;
|
|
else
|
|
prev->next = l;
|
|
prev = l;
|
|
|
|
cmslist = cmslist->next;
|
|
}
|
|
|
|
if (cleanup == B_TRUE) {
|
|
_DtCm_free_access_list4(head);
|
|
head = NULL;
|
|
}
|
|
return (head);
|
|
}
|
|
|
|
extern cms_access_entry *
|
|
_DtCmsConvertV4AccessList(Access_Entry_4 *alist)
|
|
{
|
|
cms_access_entry *l, *head, *prev;
|
|
boolean_t cleanup = B_FALSE;
|
|
|
|
prev = head = NULL;
|
|
while (alist != NULL) {
|
|
if ((l = (cms_access_entry *)calloc(1,
|
|
sizeof(cms_access_entry))) == NULL) {
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
if ((l->user = strdup(alist->who)) == NULL) {
|
|
free(l);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
l->rights = _ConvertV4Access(alist->access_type);
|
|
|
|
if (head == NULL)
|
|
head = l;
|
|
else
|
|
prev->next = l;
|
|
prev = l;
|
|
|
|
alist = alist->next;
|
|
}
|
|
|
|
if (cleanup == B_TRUE) {
|
|
_DtCm_free_cms_access_entry(head);
|
|
head = NULL;
|
|
}
|
|
return (head);
|
|
}
|
|
|
|
extern CSA_return_code
|
|
_DtCmsReminderRefToReminder(
|
|
cms_reminder_ref *rems,
|
|
Reminder_4 **r4)
|
|
{
|
|
CSA_return_code stat = CSA_SUCCESS;
|
|
Reminder_4 *head, *prev, *rptr;
|
|
char buf[30];
|
|
|
|
prev = head = NULL;
|
|
while (rems != NULL) {
|
|
|
|
if ((rptr = (Reminder_4 *)calloc(1, sizeof(Reminder_4)))
|
|
== NULL) {
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
break;
|
|
}
|
|
|
|
rptr->appt_id.tick = rems->key.time;
|
|
rptr->appt_id.key = rems->key.id;
|
|
rptr->tick = rems->runtime;
|
|
|
|
if ((rptr->attr.attr=_ConvertReminderName(rems->reminder_name))
|
|
== NULL) {
|
|
free(rptr);
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
break;
|
|
}
|
|
|
|
if ((rptr->attr.value = calloc(1,1)) == NULL) {
|
|
free(rptr->attr.attr);
|
|
free(rptr);
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
break;
|
|
}
|
|
|
|
if ((rptr->attr.clientdata = calloc(1,1)) == NULL) {
|
|
free(rptr->attr.value);
|
|
free(rptr->attr.attr);
|
|
free(rptr);
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
break;
|
|
}
|
|
|
|
if (head == NULL)
|
|
head = rptr;
|
|
else
|
|
prev->next = rptr;
|
|
prev = rptr;
|
|
|
|
rems = rems->next;
|
|
}
|
|
|
|
if (stat != CSA_SUCCESS) {
|
|
_DtCm_free_reminder4(head);
|
|
head = NULL;
|
|
}
|
|
|
|
*r4 = head;
|
|
|
|
return(stat);
|
|
}
|
|
|
|
extern CSA_return_code
|
|
_DtCmsV4ReminderToReminderRef(
|
|
char *calname,
|
|
Reminder_4 *r4,
|
|
_DtCmsEntryId *ids,
|
|
cms_reminder_ref **rems)
|
|
{
|
|
CSA_return_code stat = CSA_SUCCESS;
|
|
cms_reminder_ref *head, *prev, *rptr;
|
|
char buf[BUFSIZ];
|
|
|
|
prev = head = NULL;
|
|
while (r4 != NULL) {
|
|
|
|
if ((rptr = (cms_reminder_ref *)calloc(1,
|
|
sizeof(cms_reminder_ref))) == NULL) {
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
break;
|
|
}
|
|
|
|
rptr->key.time = r4->appt_id.tick;
|
|
rptr->key.id = r4->appt_id.key;
|
|
rptr->runtime = r4->tick;
|
|
|
|
if ((rptr->reminder_name = strdup(
|
|
_DtCm_old_reminder_name_to_name(r4->attr.attr)))
|
|
== NULL) {
|
|
free(rptr);
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
break;
|
|
}
|
|
|
|
sprintf(buf, "%ld:%s@%s", ids->id, calname,
|
|
_DtCmGetHostAtDomain());
|
|
|
|
if ((rptr->entryid = strdup(buf)) == NULL) {
|
|
free(rptr->reminder_name);
|
|
free(rptr);
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
break;
|
|
}
|
|
|
|
if (head == NULL)
|
|
head = rptr;
|
|
else
|
|
prev->next = rptr;
|
|
prev = rptr;
|
|
|
|
r4 = r4->next;
|
|
ids = ids->next;
|
|
}
|
|
|
|
if (stat != CSA_SUCCESS) {
|
|
_DtCmsFreeReminderRef(head);
|
|
head = NULL;
|
|
}
|
|
|
|
*rems = head;
|
|
|
|
return(stat);
|
|
}
|
|
|
|
extern CSA_return_code
|
|
_DtCmsCmsAccessToV4Access(cms_access_entry *alist, Access_Entry_4 **a4)
|
|
{
|
|
CSA_return_code stat = CSA_SUCCESS;
|
|
Access_Entry_4 *to, *prev, *head;
|
|
|
|
head = prev = NULL;
|
|
while (alist != NULL) {
|
|
if ((to = (Access_Entry_4 *)calloc(1, sizeof(Access_Entry_4)))
|
|
== NULL) {
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
break;
|
|
}
|
|
|
|
if ((to->access_type = _DtCmAccessRightToV4AccessType(
|
|
alist->rights)) < 0) {
|
|
stat = CSA_E_INVALID_FLAG;
|
|
break;
|
|
}
|
|
|
|
if (alist->user == NULL) {
|
|
stat = CSA_E_INVALID_ATTRIBUTE_VALUE;
|
|
break;
|
|
}
|
|
|
|
if ((to->who = strdup(alist->user)) == NULL) {
|
|
free(to);
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
break;
|
|
}
|
|
|
|
if (head == NULL)
|
|
head = to;
|
|
else
|
|
prev->next = to;
|
|
|
|
prev = to;
|
|
|
|
alist = alist->next;
|
|
}
|
|
|
|
if (stat != CSA_SUCCESS) {
|
|
_DtCm_free_access_list4(head);
|
|
head = NULL;
|
|
}
|
|
|
|
*a4 = head;
|
|
return (stat);
|
|
}
|
|
|
|
extern CSA_return_code
|
|
_DtCmsAppt4ToCmsentriesForClient(
|
|
char *calname,
|
|
Appt_4 *appt,
|
|
cms_entry **e_r)
|
|
{
|
|
CSA_return_code stat = CSA_SUCCESS;
|
|
cms_entry *entry, *head, *prev;
|
|
|
|
if (e_r == NULL)
|
|
return(CSA_E_INVALID_PARAMETER);
|
|
|
|
prev = head = NULL;
|
|
while (appt != NULL) {
|
|
|
|
if ((entry = (cms_entry *)calloc(1, sizeof(cms_entry))) == NULL)
|
|
break;
|
|
|
|
if ((stat = _Appt4ToCmsentryAttrs(calname, appt,
|
|
&entry->num_attrs, &entry->attrs)) == CSA_SUCCESS) {
|
|
entry->key.time = appt->appt_id.tick;
|
|
entry->key.id = appt->appt_id.key;
|
|
} else {
|
|
free(entry);
|
|
break;
|
|
}
|
|
|
|
if (head == NULL)
|
|
head = entry;
|
|
else
|
|
prev->next = entry;
|
|
|
|
prev = entry;
|
|
|
|
appt = appt->next;
|
|
}
|
|
|
|
if (stat != CSA_SUCCESS) {
|
|
_DtCm_free_cms_entries(head);
|
|
head = NULL;
|
|
}
|
|
|
|
*e_r = head;
|
|
return(stat);
|
|
}
|
|
|
|
extern CSA_return_code
|
|
_DtCmsAppt4ToCmsentry(
|
|
char *calname,
|
|
Appt_4 *a4,
|
|
cms_entry **entry_r,
|
|
boolean_t rerule)
|
|
{
|
|
CSA_return_code stat;
|
|
cms_entry *entry;
|
|
|
|
if (a4 == NULL)
|
|
return(CSA_E_INVALID_PARAMETER);
|
|
|
|
if ((entry = _DtCm_make_cms_entry(_DtCm_entry_name_tbl)) == NULL)
|
|
return (CSA_E_INSUFFICIENT_MEMORY);
|
|
|
|
entry->key.time = a4->appt_id.tick;
|
|
entry->key.id = a4->appt_id.key;
|
|
|
|
if ((stat = _DtCm_appt4_to_attrs(calname, a4, entry->num_attrs,
|
|
entry->attrs, rerule)) != CSA_SUCCESS) {
|
|
_DtCm_free_cms_entry(entry);
|
|
return (stat);
|
|
}
|
|
|
|
*entry_r = entry;
|
|
return (CSA_SUCCESS);
|
|
}
|
|
|
|
/*
|
|
* This routine is used either to convert attrs from clients for insert
|
|
* or update; or to convert appts for sending to clients
|
|
* Note: the reference id is not converted
|
|
*/
|
|
extern CSA_return_code
|
|
_DtCmsAttrsToAppt4(
|
|
uint size,
|
|
cms_attribute *attrs,
|
|
Appt_4 *appt,
|
|
boolean_t check)
|
|
{
|
|
CSA_return_code stat = CSA_SUCCESS;
|
|
char *string;
|
|
time_t endtick;
|
|
int i, enddateindex = -1, interval = -1, wknum;
|
|
int typeindex = -1, stypeindex = -1;
|
|
boolean_t set_wknum = B_FALSE;
|
|
|
|
/*
|
|
* this routine is called to convert valid v2 to v4 attributes
|
|
* so no checking of CSA_E_INVALID_ATTRIBUTE and
|
|
* CSA_E_UNSUPPORTED_ATTRIBUTE is necessary
|
|
*/
|
|
|
|
for (i = 0; i < size && stat == CSA_SUCCESS; i++) {
|
|
switch (attrs[i].name.num) {
|
|
case CSA_ENTRY_ATTR_START_DATE_I:
|
|
if (check == B_TRUE && attrs[i].value == NULL)
|
|
stat = CSA_E_INVALID_ATTRIBUTE_VALUE;
|
|
else if (_csa_iso8601_to_tick(attrs[i].value->\
|
|
item.date_time_value, &appt->appt_id.tick))
|
|
stat = CSA_E_INVALID_DATE_TIME;
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_END_DATE_I:
|
|
enddateindex = i;
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_TYPE_I:
|
|
typeindex = i;
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_SUBTYPE_I:
|
|
stypeindex = i;
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_SUMMARY_I:
|
|
|
|
if (attrs[i].value->item.string_value) {
|
|
if ((string = strdup(attrs[i].value->item.\
|
|
string_value)) == NULL)
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
else {
|
|
if (appt->what)
|
|
free(appt->what);
|
|
appt->what = string;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_ORGANIZER_I:
|
|
free(appt->author);
|
|
if ((appt->author = strdup(attrs[i].value->\
|
|
item.calendar_user_value)) == NULL)
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_AUDIO_REMINDER_I:
|
|
|
|
if (attrs[i].value == NULL)
|
|
stat = _DtCm_remove_reminder(
|
|
_DtCM_OLD_ATTR_BEEP_REMINDER, appt);
|
|
else if (attrs[i].value->item.reminder_value == NULL)
|
|
stat = CSA_E_INVALID_ATTRIBUTE_VALUE;
|
|
else
|
|
stat = _DtCm_add_reminder(
|
|
_DtCM_OLD_ATTR_BEEP_REMINDER,
|
|
attrs[i].value->item.reminder_value,
|
|
appt);
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_FLASHING_REMINDER_I:
|
|
|
|
if (attrs[i].value == NULL)
|
|
stat = _DtCm_remove_reminder(
|
|
_DtCM_OLD_ATTR_FLASH_REMINDER, appt);
|
|
else if (attrs[i].value->item.reminder_value == NULL)
|
|
stat = CSA_E_INVALID_ATTRIBUTE_VALUE;
|
|
else
|
|
stat = _DtCm_add_reminder(
|
|
_DtCM_OLD_ATTR_FLASH_REMINDER,
|
|
attrs[i].value->item.reminder_value,
|
|
appt);
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_MAIL_REMINDER_I:
|
|
|
|
if (attrs[i].value == NULL)
|
|
stat = _DtCm_remove_reminder(
|
|
_DtCM_OLD_ATTR_MAIL_REMINDER, appt);
|
|
else if (attrs[i].value->item.reminder_value == NULL)
|
|
stat = CSA_E_INVALID_ATTRIBUTE_VALUE;
|
|
else
|
|
stat = _DtCm_add_reminder(
|
|
_DtCM_OLD_ATTR_MAIL_REMINDER,
|
|
attrs[i].value->item.reminder_value,
|
|
appt);
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_POPUP_REMINDER_I:
|
|
|
|
if (attrs[i].value == NULL)
|
|
stat = _DtCm_remove_reminder(
|
|
_DtCM_OLD_ATTR_POPUP_REMINDER, appt);
|
|
else if (attrs[i].value->item.reminder_value == NULL)
|
|
stat = CSA_E_INVALID_ATTRIBUTE_VALUE;
|
|
else
|
|
stat = _DtCm_add_reminder(
|
|
_DtCM_OLD_ATTR_POPUP_REMINDER,
|
|
attrs[i].value->item.reminder_value,
|
|
appt);
|
|
break;
|
|
|
|
case CSA_X_DT_ENTRY_ATTR_REPEAT_TYPE_I:
|
|
|
|
if (_DtCm_rtype_to_interval4(
|
|
attrs[i].value->item.sint32_value,
|
|
&appt->period.period)) {
|
|
if (check == B_TRUE)
|
|
stat = CSA_E_INVALID_ATTRIBUTE_VALUE;
|
|
else
|
|
appt->period.period = otherPeriod_4;
|
|
}
|
|
break;
|
|
|
|
case CSA_X_DT_ENTRY_ATTR_REPEAT_TIMES_I:
|
|
|
|
if (attrs[i].value) {
|
|
appt->ntimes =
|
|
attrs[i].value->item.uint32_value;
|
|
if (appt->ntimes == CSA_X_DT_DT_REPEAT_FOREVER)
|
|
appt->ntimes = _DtCM_OLD_REPEAT_FOREVER;
|
|
}
|
|
break;
|
|
|
|
case CSA_X_DT_ENTRY_ATTR_SHOWTIME_I:
|
|
|
|
if (attrs[i].value)
|
|
appt->tag->showtime =
|
|
attrs[i].value->item.sint32_value;
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_STATUS_I:
|
|
|
|
if (_DtCm_status_to_apptstatus4(
|
|
attrs[i].value->item.uint32_value,
|
|
&appt->appt_status)) {
|
|
if (check == B_TRUE)
|
|
stat = CSA_E_INVALID_ATTRIBUTE_VALUE;
|
|
else
|
|
appt->appt_status = active_4;
|
|
}
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_CLASSIFICATION_I:
|
|
|
|
if (_DtCm_classification_to_privacy4(
|
|
attrs[i].value->item.uint32_value, &appt->privacy))
|
|
{
|
|
if (check == B_TRUE)
|
|
stat = CSA_E_INVALID_ATTRIBUTE_VALUE;
|
|
else
|
|
appt->privacy = public_4;
|
|
}
|
|
break;
|
|
|
|
case CSA_X_DT_ENTRY_ATTR_SEQUENCE_END_DATE_I:
|
|
|
|
if (attrs[i].value &&
|
|
attrs[i].value->item.date_time_value &&
|
|
*(attrs[i].value->item.date_time_value))
|
|
{
|
|
if (_csa_iso8601_to_tick(
|
|
attrs[i].value->item.date_time_value,
|
|
&appt->period.enddate))
|
|
stat = CSA_E_INVALID_DATE_TIME;
|
|
}
|
|
break;
|
|
|
|
case CSA_X_DT_ENTRY_ATTR_REPEAT_INTERVAL_I:
|
|
if (attrs[i].value)
|
|
interval = attrs[i].value->item.uint32_value;
|
|
break;
|
|
|
|
case CSA_X_DT_ENTRY_ATTR_REPEAT_OCCURRENCE_NUM_I:
|
|
if (attrs[i].value) {
|
|
set_wknum = B_TRUE;
|
|
wknum = attrs[i].value->item.sint32_value;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (stat == CSA_SUCCESS && enddateindex >= 0) {
|
|
if (attrs[enddateindex].value == NULL ||
|
|
attrs[enddateindex].value->item.date_time_value == NULL) {
|
|
appt->duration = 0;
|
|
} else if (_csa_iso8601_to_tick(attrs[enddateindex].value->\
|
|
item.date_time_value, &endtick)) {
|
|
stat = CSA_E_INVALID_DATE_TIME;
|
|
} else {
|
|
appt->duration = endtick - appt->appt_id.tick;
|
|
}
|
|
}
|
|
|
|
if (stat == CSA_SUCCESS && (typeindex >= 0 || typeindex >= 0)) {
|
|
if (typeindex >= 0) {
|
|
if (stat = _DtCm_attrs_to_eventtype4(
|
|
attrs[typeindex].value,
|
|
(stypeindex >= 0 ? attrs[stypeindex].value : NULL),
|
|
appt->tag)) {
|
|
if (check == B_FALSE) {
|
|
/* this is the case where we are
|
|
* converting appt for clients
|
|
*/
|
|
appt->tag->tag = otherTag_4;
|
|
stat = CSA_SUCCESS;
|
|
}
|
|
}
|
|
} else if (stypeindex >= 0) {
|
|
if (attrs[stypeindex].value &&
|
|
attrs[stypeindex].value->item.string_value)
|
|
{
|
|
if (strcmp(attrs[stypeindex].value->item.\
|
|
string_value, CSA_SUBTYPE_APPOINTMENT) == 0)
|
|
appt->tag->tag = appointment_4;
|
|
else if (strcmp(attrs[stypeindex].value->item.\
|
|
string_value, CSA_SUBTYPE_HOLIDAY) == 0)
|
|
appt->tag->tag = holiday_4;
|
|
else
|
|
stat = CSA_E_INVALID_ATTRIBUTE_VALUE;
|
|
} else
|
|
stat = CSA_E_INVALID_ATTRIBUTE_VALUE;
|
|
}
|
|
}
|
|
|
|
if (stat == CSA_SUCCESS) {
|
|
switch (appt->period.period) {
|
|
case nthWeekday_4:
|
|
if (set_wknum == B_TRUE)
|
|
appt->period.nth = wknum;
|
|
break;
|
|
case everyNthDay_4:
|
|
case everyNthWeek_4:
|
|
case everyNthMonth_4:
|
|
if (interval >= 0)
|
|
appt->period.nth = interval;
|
|
break;
|
|
default:
|
|
appt->period.nth = 0;
|
|
}
|
|
|
|
if (appt->period.period == single_4)
|
|
appt->ntimes = 0;
|
|
}
|
|
return (stat);
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
* static functions used within the file
|
|
******************************************************************************/
|
|
|
|
/*
|
|
* attributes are hashed
|
|
* we are converting v4 events to v3 appts, so attributes are
|
|
* assumed to be good and all mandatory ones are present
|
|
*/
|
|
static CSA_return_code
|
|
_AttrsToAbbrAppt(uint size, cms_attribute *attrs, Abb_Appt_4 *appt)
|
|
{
|
|
CSA_return_code stat = CSA_SUCCESS;
|
|
char *ptr;
|
|
time_t endtick;
|
|
int i, typeindex = 0, stypeindex = -1, enddateindex = -1;
|
|
char buf[BUFSIZ];
|
|
|
|
for (i = 0; i < size && stat == CSA_SUCCESS; i++) {
|
|
switch (attrs[i].name.num) {
|
|
case CSA_ENTRY_ATTR_START_DATE_I:
|
|
_csa_iso8601_to_tick(attrs[i].value->\
|
|
item.date_time_value, &appt->appt_id.tick);
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_END_DATE_I:
|
|
enddateindex = i;
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_TYPE_I:
|
|
typeindex = i;
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_SUBTYPE_I:
|
|
stypeindex = i;
|
|
break;
|
|
|
|
case CSA_X_DT_ENTRY_ATTR_SHOWTIME_I:
|
|
appt->tag->showtime = attrs[i].value->item.sint32_value;
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_SUMMARY_I:
|
|
if (attrs[i].value && attrs[i].value->item.string_value)
|
|
{
|
|
free(appt->what);
|
|
if ((appt->what = strdup(attrs[i].value->\
|
|
item.string_value)) == NULL)
|
|
stat = CSA_E_INSUFFICIENT_MEMORY;
|
|
}
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_STATUS_I:
|
|
if (_DtCm_status_to_apptstatus4(attrs[i].value->item.\
|
|
uint32_value, &appt->appt_status))
|
|
appt->appt_status = active_4;
|
|
break;
|
|
|
|
case CSA_ENTRY_ATTR_CLASSIFICATION_I:
|
|
if (_DtCm_classification_to_privacy4(attrs[i].value->\
|
|
item.uint32_value, &appt->privacy))
|
|
appt->privacy = public_4;
|
|
break;
|
|
|
|
case CSA_X_DT_ENTRY_ATTR_REPEAT_TYPE_I:
|
|
if (_DtCm_rtype_to_interval4(attrs[i].value->\
|
|
item.sint32_value, &appt->period.period))
|
|
appt->period.period = otherPeriod_4;
|
|
break;
|
|
|
|
case CSA_X_DT_ENTRY_ATTR_REPEAT_OCCURRENCE_NUM_I:
|
|
appt->period.nth = attrs[i].value->item.sint32_value;
|
|
break;
|
|
|
|
case CSA_X_DT_ENTRY_ATTR_REPEAT_INTERVAL_I:
|
|
appt->period.nth = attrs[i].value->item.uint32_value;
|
|
break;
|
|
|
|
case CSA_X_DT_ENTRY_ATTR_SEQUENCE_END_DATE_I:
|
|
_csa_iso8601_to_tick(attrs[i].value->item.\
|
|
date_time_value, &appt->period.enddate);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (stat != CSA_SUCCESS)
|
|
return (stat);
|
|
|
|
if (enddateindex >= 0) {
|
|
_csa_iso8601_to_tick(attrs[enddateindex].value->item.\
|
|
date_time_value, &endtick);
|
|
appt->duration = endtick - appt->appt_id.tick;
|
|
} else
|
|
appt->duration = 0;
|
|
|
|
if (_DtCm_attrs_to_eventtype4(attrs[typeindex].value,
|
|
(stypeindex >= 0 ? attrs[stypeindex].value : NULL), appt->tag))
|
|
appt->tag->tag = otherTag_4;
|
|
|
|
return (CSA_SUCCESS);
|
|
}
|
|
|
|
static Abb_Appt_4 *
|
|
_MakeAbbrAppt(void)
|
|
{
|
|
Abb_Appt_4 *a;
|
|
|
|
if ((a = (Abb_Appt_4 *)calloc(1, sizeof(Abb_Appt_4))) == NULL)
|
|
return NULL;
|
|
|
|
if ((a->tag = (Tag_4 *)calloc(1, sizeof(Tag_4))) == NULL) {
|
|
free(a);
|
|
return NULL;
|
|
}
|
|
|
|
a->tag->tag = appointment_4;
|
|
a->tag->showtime = B_TRUE;
|
|
|
|
return(a);
|
|
}
|
|
|
|
static uint
|
|
_ConvertV5Access(uint v5rights, boolean_t strictmode)
|
|
{
|
|
uint access = 0;
|
|
|
|
if (v5rights & CSA_OWNER_RIGHTS)
|
|
return (access_read_4 | access_write_4 | access_delete_4);
|
|
|
|
if (v5rights & (CSA_VIEW_PUBLIC_ENTRIES|CSA_VIEW_CONFIDENTIAL_ENTRIES|
|
|
CSA_VIEW_PRIVATE_ENTRIES))
|
|
access = access_read_4;
|
|
|
|
if ((strictmode == B_TRUE &&
|
|
(v5rights & CSA_INSERT_PUBLIC_ENTRIES) &&
|
|
(v5rights & CSA_INSERT_PRIVATE_ENTRIES) &&
|
|
(v5rights & CSA_INSERT_CONFIDENTIAL_ENTRIES)) ||
|
|
(strictmode == B_FALSE &&
|
|
(v5rights & (CSA_INSERT_PUBLIC_ENTRIES |
|
|
CSA_INSERT_PRIVATE_ENTRIES | CSA_INSERT_CONFIDENTIAL_ENTRIES))))
|
|
access |= access_write_4;
|
|
|
|
if ((strictmode == B_TRUE &&
|
|
(v5rights & CSA_CHANGE_PUBLIC_ENTRIES) &&
|
|
(v5rights & CSA_CHANGE_PRIVATE_ENTRIES) &&
|
|
(v5rights & CSA_CHANGE_CONFIDENTIAL_ENTRIES)) ||
|
|
(strictmode == B_FALSE &&
|
|
(v5rights & (CSA_CHANGE_PUBLIC_ENTRIES |
|
|
CSA_CHANGE_PRIVATE_ENTRIES | CSA_CHANGE_CONFIDENTIAL_ENTRIES))))
|
|
access |= access_delete_4;
|
|
|
|
return (access);
|
|
}
|
|
|
|
static uint
|
|
_ConvertV4Access(uint v4rights)
|
|
{
|
|
uint access = 0;
|
|
|
|
if (v4rights & access_read_4)
|
|
access = CSA_VIEW_PUBLIC_ENTRIES;
|
|
|
|
if (v4rights & access_write_4)
|
|
access |= CSA_INSERT_PUBLIC_ENTRIES;
|
|
|
|
if (v4rights & (access_write_4 | access_delete_4))
|
|
access |= CSA_CHANGE_PUBLIC_ENTRIES;
|
|
|
|
return (access);
|
|
}
|
|
|
|
static char *
|
|
_ConvertReminderName(char *rname)
|
|
{
|
|
if (!strcmp(rname, CSA_ENTRY_ATTR_AUDIO_REMINDER))
|
|
return (strdup(_DtCM_OLD_ATTR_BEEP_REMINDER));
|
|
else if (!strcmp(rname, CSA_ENTRY_ATTR_FLASHING_REMINDER))
|
|
return (strdup(_DtCM_OLD_ATTR_FLASH_REMINDER));
|
|
else if (!strcmp(rname, CSA_ENTRY_ATTR_MAIL_REMINDER))
|
|
return (strdup(_DtCM_OLD_ATTR_MAIL_REMINDER));
|
|
else if (!strcmp(rname, CSA_ENTRY_ATTR_POPUP_REMINDER))
|
|
return (strdup(_DtCM_OLD_ATTR_POPUP_REMINDER));
|
|
else
|
|
return (strdup(rname));
|
|
}
|
|
|
|
static CSA_return_code
|
|
_Appt4ToCmsentryAttrs(
|
|
char *calname,
|
|
Appt_4 *a4,
|
|
uint *num_attrs,
|
|
cms_attribute **attrs_r)
|
|
{
|
|
CSA_return_code stat = CSA_SUCCESS;
|
|
cms_attribute *attrs;
|
|
cms_attribute tmpattr;
|
|
cms_attribute_value tmpval;
|
|
Attribute_4 *reminders = a4->attr;
|
|
char buf[BUFSIZ];
|
|
CSA_opaque_data opq;
|
|
int index, ntimes, count = 0;
|
|
char *ptr1, *ptr2;
|
|
|
|
if (num_attrs == NULL || attrs_r == NULL)
|
|
return (CSA_E_INVALID_PARAMETER);
|
|
|
|
if ((attrs = (cms_attribute *)calloc(1,
|
|
sizeof(cms_attribute) * (_DtCM_OLD_ENTRY_ATTR_SIZE+ 1))) == NULL)
|
|
return (CSA_E_INSUFFICIENT_MEMORY);
|
|
|
|
if (a4->period.period != single_4 &&
|
|
a4->ntimes == _DtCM_OLD_REPEAT_FOREVER)
|
|
ntimes = CSA_X_DT_DT_REPEAT_FOREVER;
|
|
else
|
|
ntimes = a4->ntimes;
|
|
|
|
tmpattr.value = &tmpval;
|
|
|
|
/* reference id */
|
|
tmpattr.name.name = CSA_ENTRY_ATTR_REFERENCE_IDENTIFIER;
|
|
tmpattr.name.num = CSA_ENTRY_ATTR_REFERENCE_IDENTIFIER_I;
|
|
tmpval.type = CSA_VALUE_OPAQUE_DATA;
|
|
tmpval.item.opaque_data_value = &opq;
|
|
ptr1 = strchr(calname, '@');
|
|
ptr2 = (ptr1 ? strchr(ptr1, '.') : NULL);
|
|
if (ptr1) {
|
|
sprintf(buf, "%ld:%s%s%s", a4->appt_id.key, calname,
|
|
(ptr2 == NULL ? "." : ""),
|
|
(ptr2 == NULL ? _DtCmGetLocalDomain(ptr1+1) : ""));
|
|
} else {
|
|
sprintf(buf, "%ld:%s@%s", a4->appt_id.key, calname,
|
|
_DtCmGetHostAtDomain());
|
|
}
|
|
opq.size = strlen(buf);
|
|
opq.data = (unsigned char *)buf;
|
|
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr, B_TRUE))
|
|
!= CSA_SUCCESS) {
|
|
free(attrs);
|
|
return (stat);
|
|
}
|
|
|
|
/* start date */
|
|
tmpattr.name.name = CSA_ENTRY_ATTR_START_DATE;
|
|
tmpattr.name.num = CSA_ENTRY_ATTR_START_DATE_I;
|
|
tmpval.type = CSA_VALUE_DATE_TIME;
|
|
tmpval.item.date_time_value = buf;
|
|
if ((stat = _csa_tick_to_iso8601(a4->appt_id.tick, buf) ?
|
|
CSA_E_INVALID_DATE_TIME : CSA_SUCCESS) ||
|
|
(stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr, B_TRUE))
|
|
!= CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
|
|
/* type */
|
|
tmpattr.name.name = CSA_ENTRY_ATTR_TYPE;
|
|
tmpattr.name.num = CSA_ENTRY_ATTR_TYPE_I;
|
|
tmpval.type = CSA_VALUE_UINT32;
|
|
tmpval.item.uint32_value = _DtCm_eventtype4_to_type(a4->tag->tag);
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr, B_TRUE))
|
|
!= CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
|
|
/* subtype */
|
|
tmpattr.name.name = CSA_ENTRY_ATTR_SUBTYPE;
|
|
tmpattr.name.num = CSA_ENTRY_ATTR_SUBTYPE_I;
|
|
tmpval.type = CSA_VALUE_STRING;
|
|
tmpval.item.string_value = _DtCm_eventtype4_to_subtype(a4->tag->tag);
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr, B_TRUE))
|
|
!= CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
|
|
/* showtime */
|
|
tmpattr.name.name = CSA_X_DT_ENTRY_ATTR_SHOWTIME;
|
|
tmpattr.name.num = CSA_X_DT_ENTRY_ATTR_SHOWTIME_I;
|
|
tmpval.type = CSA_VALUE_SINT32;
|
|
tmpval.item.sint32_value = a4->tag->showtime;
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr, B_TRUE))
|
|
!= CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
|
|
/* end date */
|
|
tmpattr.name.name = CSA_ENTRY_ATTR_END_DATE;
|
|
tmpattr.name.num = CSA_ENTRY_ATTR_END_DATE_I;
|
|
tmpval.type = CSA_VALUE_DATE_TIME;
|
|
tmpval.item.date_time_value = buf;
|
|
if ((stat = _csa_tick_to_iso8601(a4->appt_id.tick + a4->duration,
|
|
buf) ? CSA_E_INVALID_DATE_TIME : CSA_SUCCESS) != CSA_SUCCESS ||
|
|
(stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr, B_TRUE))
|
|
!= CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
|
|
/* summary */
|
|
tmpattr.name.name = CSA_ENTRY_ATTR_SUMMARY;
|
|
tmpattr.name.num = CSA_ENTRY_ATTR_SUMMARY_I;
|
|
tmpval.type = CSA_VALUE_STRING;
|
|
tmpval.item.string_value = a4->what;
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr, B_TRUE))
|
|
!= CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
|
|
/* organizer */
|
|
tmpattr.name.name = CSA_ENTRY_ATTR_ORGANIZER;
|
|
tmpattr.name.num = CSA_ENTRY_ATTR_ORGANIZER_I;
|
|
tmpval.type = CSA_VALUE_CALENDAR_USER;
|
|
tmpval.item.calendar_user_value = a4->author;
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr, B_TRUE))
|
|
!= CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
|
|
/* status */
|
|
tmpattr.name.name = CSA_ENTRY_ATTR_STATUS;
|
|
tmpattr.name.num = CSA_ENTRY_ATTR_STATUS_I;
|
|
tmpval.type = CSA_VALUE_UINT32;
|
|
tmpval.item.uint32_value = _DtCm_apptstatus4_to_status(a4->appt_status);
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr, B_TRUE))
|
|
!= CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
|
|
/* classification */
|
|
tmpattr.name.name = CSA_ENTRY_ATTR_CLASSIFICATION;
|
|
tmpattr.name.num = CSA_ENTRY_ATTR_CLASSIFICATION_I;
|
|
tmpval.type = CSA_VALUE_UINT32;
|
|
tmpval.item.uint32_value = _DtCm_privacy4_to_classification(a4->privacy);
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr, B_TRUE))
|
|
!= CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
|
|
/* repeat type */
|
|
tmpattr.name.name = CSA_X_DT_ENTRY_ATTR_REPEAT_TYPE;
|
|
tmpattr.name.num = CSA_X_DT_ENTRY_ATTR_REPEAT_TYPE_I;
|
|
tmpval.type = CSA_VALUE_SINT32;
|
|
tmpval.item.sint32_value = _DtCm_interval4_to_rtype(a4->period.period);
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr, B_TRUE))
|
|
!= CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
|
|
/* repeat times */
|
|
if (a4->period.period != single_4) {
|
|
tmpattr.name.name = CSA_X_DT_ENTRY_ATTR_REPEAT_TIMES;
|
|
tmpattr.name.num = CSA_X_DT_ENTRY_ATTR_REPEAT_TIMES_I;
|
|
tmpval.type = CSA_VALUE_UINT32;
|
|
tmpval.item.uint32_value = ntimes;
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr,
|
|
B_TRUE)) != CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
}
|
|
|
|
/* occurrence number */
|
|
if (a4->period.period == nthWeekday_4) {
|
|
tmpattr.name.name = CSA_X_DT_ENTRY_ATTR_REPEAT_OCCURRENCE_NUM;
|
|
tmpattr.name.num = CSA_X_DT_ENTRY_ATTR_REPEAT_OCCURRENCE_NUM_I;
|
|
tmpval.type = CSA_VALUE_SINT32;
|
|
tmpval.item.sint32_value = a4->period.nth;
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr,
|
|
B_TRUE)) != CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
}
|
|
|
|
/* repeat interval */
|
|
if (a4->period.period >= everyNthDay_4 &&
|
|
a4->period.period <= everyNthMonth_4) {
|
|
tmpattr.name.name = CSA_X_DT_ENTRY_ATTR_REPEAT_INTERVAL;
|
|
tmpattr.name.num = CSA_X_DT_ENTRY_ATTR_REPEAT_INTERVAL_I;
|
|
tmpval.type = CSA_VALUE_UINT32;
|
|
tmpval.item.uint32_value = a4->period.nth;
|
|
if ((stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr,
|
|
B_TRUE)) != CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
}
|
|
|
|
if (a4->period.enddate != 0) {
|
|
tmpattr.name.name = CSA_X_DT_ENTRY_ATTR_SEQUENCE_END_DATE;
|
|
tmpattr.name.num = CSA_X_DT_ENTRY_ATTR_SEQUENCE_END_DATE_I;
|
|
tmpval.type = CSA_VALUE_DATE_TIME;
|
|
tmpval.item.date_time_value = buf;
|
|
if ((stat = _csa_tick_to_iso8601(a4->period.enddate, buf) ?
|
|
CSA_E_INVALID_DATE_TIME : CSA_SUCCESS) != CSA_SUCCESS ||
|
|
(stat = _DtCm_copy_cms_attribute(&attrs[count++], &tmpattr,
|
|
B_TRUE)) != CSA_SUCCESS) {
|
|
goto error;
|
|
}
|
|
}
|
|
|
|
while (reminders != NULL) {
|
|
if ((attrs[count].name.num = _DtCm_old_reminder_name_to_index(
|
|
reminders->attr)) >= 0) {
|
|
if ((attrs[count].name.name =
|
|
strdup(_DtCm_old_reminder_name_to_name(
|
|
reminders->attr))) == NULL) {
|
|
count++;
|
|
goto error;
|
|
}
|
|
if ((stat = _DtCmAttr4ToReminderValue(reminders,
|
|
&attrs[count++].value)) != CSA_SUCCESS) {
|
|
count++;
|
|
goto error;
|
|
}
|
|
|
|
}
|
|
reminders = reminders->next;
|
|
}
|
|
|
|
*num_attrs = count;
|
|
*attrs_r = attrs;
|
|
return (CSA_SUCCESS);
|
|
|
|
error:
|
|
_DtCm_free_cms_attributes(count--, attrs);
|
|
free(attrs);
|
|
return (stat);
|
|
}
|
|
|