cdesktopenv/cde/programs/dtcm/server/cmsconvert.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);
}