642 lines
14 KiB
C
642 lines
14 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: convert4-2.c /main/1 1996/04/21 19:22:37 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 <string.h>
|
|
#include <stdlib.h>
|
|
#include "rtable2.h"
|
|
#include "rtable4.h"
|
|
#include "convert4-2.h"
|
|
|
|
/*
|
|
* forward declaration of static functions
|
|
*/
|
|
static void free_excpt2(Except_2 *e);
|
|
static Buffer_2 buffer4_to_buffer2(Buffer_4 b);
|
|
static Period_2 period4_to_period2(Period_4 *p);
|
|
static Tag_2 tag4_to_tag2(Tag_4 *t);
|
|
static Attribute_2 * attr4_to_attr2(Attribute_4 *a4);
|
|
static Except_2 * except4_to_except2(Except_4 *e4);
|
|
static Abb_Appt_2 * abb4_to_abb2(Abb_Appt_4 *a4);
|
|
static Reminder_2 * reminder4_to_reminder2(Reminder_4 *r4);
|
|
static Table_Res_Type_2 tablerestype4_to_tablerestype2(Table_Res_Type_4 t);
|
|
static void tablereslist4_to_tablereslist2(Table_Res_List_4 *from,
|
|
Table_Res_List_2 *to);
|
|
static Table_Args_Type_2 argstag4_to_argstag2(Table_Args_Type_4 t);
|
|
static void args4_to_args2(Args_4 *from, Args_2 *to);
|
|
static Table_Args_2 * tableargs4_to_tableargs2(Table_Args_4 *a4);
|
|
static Registration_2 * reg4_to_reg2(Registration_4 *r4);
|
|
|
|
/**************** DATA TYPE (4->2) CONVERSION ROUTINES **************/
|
|
|
|
extern void
|
|
_DtCm_id4_to_id2(Id_4 *from, Id_2 *to)
|
|
{
|
|
if ((from==NULL) || (to==NULL)) return;
|
|
to->tick = from->tick;
|
|
to->key = from->key;
|
|
}
|
|
|
|
extern Uid_2 *
|
|
_DtCm_uid4_to_uid2(Uid_4 *ui4)
|
|
{
|
|
Uid_2 *ui2, *head, *prev;
|
|
|
|
prev = head = NULL;
|
|
while (ui4 != NULL) {
|
|
ui2 = (Uid_2 *)calloc(1, sizeof(Uid_2));
|
|
_DtCm_id4_to_id2(&(ui4->appt_id), &(ui2->appt_id));
|
|
ui2->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = ui2;
|
|
else
|
|
prev->next = ui2;
|
|
prev = ui2;
|
|
|
|
ui4 = ui4->next;
|
|
}
|
|
return(head);
|
|
}
|
|
|
|
extern Appt_2 *
|
|
_DtCm_appt4_to_appt2(Appt_4 *a4)
|
|
{
|
|
Appt_2 *a2, *head, *prev;
|
|
struct Attribute_4 *item;
|
|
|
|
prev = head = NULL;
|
|
while (a4 != NULL) {
|
|
a2 = (Appt_2 *)calloc(1, sizeof(Appt_2));
|
|
_DtCm_id4_to_id2(&(a4->appt_id), &(a2->appt_id));
|
|
a2->tag = tag4_to_tag2(a4->tag);
|
|
a2->duration = a4->duration;
|
|
a2->ntimes = a4->ntimes;
|
|
a2->what = buffer4_to_buffer2(a4->what);
|
|
a2->script = "";
|
|
a2->period = period4_to_period2(&(a4->period));
|
|
a2->author = buffer4_to_buffer2(a4->author);
|
|
a2->client_data = buffer4_to_buffer2(a4->client_data);
|
|
a2->attr = attr4_to_attr2(a4->attr);
|
|
|
|
/* Pick the mailto field out of the attribute list
|
|
client data field; put it back into the appt struct
|
|
proper.
|
|
*/
|
|
item = a4->attr;
|
|
while(item!=NULL) {
|
|
if (strcmp(item->attr, "ml")==0) {
|
|
a2->mailto=buffer4_to_buffer2(item->clientdata);
|
|
break;
|
|
}
|
|
item=item->next;
|
|
}
|
|
|
|
a2->exception = except4_to_except2(a4->exception);
|
|
a2->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = a2;
|
|
else
|
|
prev->next = a2;
|
|
prev = a2;
|
|
|
|
a4 = a4->next;
|
|
}
|
|
return(head);
|
|
}
|
|
|
|
extern Access_Status_2
|
|
_DtCm_accstat4_to_accstat2(Access_Status_4 s)
|
|
{
|
|
switch(s) {
|
|
case access_ok_4:
|
|
return(access_ok_2);
|
|
case access_added_4:
|
|
return(access_added_2);
|
|
case access_removed_4:
|
|
return(access_removed_2);
|
|
case access_failed_4:
|
|
return(access_failed_2);
|
|
case access_exists_4:
|
|
return(access_exists_2);
|
|
case access_partial_4:
|
|
return(access_partial_2);
|
|
case access_other_4:
|
|
default:
|
|
return(access_other_2);
|
|
}
|
|
}
|
|
|
|
extern Table_Res_2 *
|
|
_DtCm_tableres4_to_tableres2(Table_Res_4 *r4)
|
|
{
|
|
Table_Res_2 *r2;
|
|
|
|
if (r4==NULL) return((Table_Res_2 *)NULL);
|
|
r2 = (Table_Res_2 *)calloc(1, sizeof(Table_Res_2));
|
|
r2->status = _DtCm_accstat4_to_accstat2(r4->status);
|
|
tablereslist4_to_tablereslist2(&(r4->res), &(r2->res));
|
|
return(r2);
|
|
}
|
|
|
|
extern Access_Entry_2 *
|
|
_DtCm_acclist4_to_acclist2(Access_Entry_4 *l4)
|
|
{
|
|
Access_Entry_2 *l2, *head, *prev;
|
|
|
|
prev = head = NULL;
|
|
while (l4 != NULL) {
|
|
l2 = (Access_Entry_2 *)calloc(1, sizeof(Access_Entry_2));
|
|
l2->who = buffer4_to_buffer2(l4->who);
|
|
l2->access_type = l4->access_type;
|
|
l2->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = l2;
|
|
else
|
|
prev->next = l2;
|
|
prev = l2;
|
|
|
|
l4 = l4->next;
|
|
}
|
|
return(head);
|
|
}
|
|
|
|
extern Access_Args_2 *
|
|
_DtCm_accargs4_to_accargs2(Access_Args_4 *a4)
|
|
{
|
|
Access_Args_2 *a2;
|
|
|
|
if (a4==NULL) return((Access_Args_2 *)NULL);
|
|
a2 = (Access_Args_2 *)calloc(1, sizeof(Access_Args_2));
|
|
a2->target = buffer4_to_buffer2(a4->target);
|
|
a2->access_list = _DtCm_acclist4_to_acclist2(a4->access_list);
|
|
return(a2);
|
|
}
|
|
|
|
extern Range_2 *
|
|
_DtCm_range4_to_range2(Range_4 *r4)
|
|
{
|
|
Range_2 *r2, *head, *prev;
|
|
|
|
prev = head = NULL;
|
|
while (r4 != NULL) {
|
|
r2 = (Range_2 *)calloc(1, sizeof(Range_2));
|
|
r2->key1 = r4->key1;
|
|
r2->key2 = r4->key2;
|
|
r2->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = r2;
|
|
else
|
|
prev->next = r2;
|
|
prev = r2;
|
|
|
|
r4 = r4->next;
|
|
}
|
|
return(head);
|
|
}
|
|
|
|
extern Registration_Status_2
|
|
_DtCm_regstat4_to_regstat2(Registration_Status_4 s)
|
|
{
|
|
switch (s) {
|
|
case registered_4:
|
|
return(registered_2);
|
|
case failed_4:
|
|
return(failed_2);
|
|
case deregistered_4:
|
|
return(deregistered_2);
|
|
case confused_4:
|
|
return(confused_2);
|
|
case reg_notable_4:
|
|
default:
|
|
return(failed_2);
|
|
}
|
|
}
|
|
|
|
extern Table_Status_2
|
|
_DtCm_tablestat4_to_tablestat2(Table_Status_4 s)
|
|
{
|
|
switch(s) {
|
|
case ok_4:
|
|
return(ok_2);
|
|
case duplicate_4:
|
|
return(duplicate_2);
|
|
case badtable_4:
|
|
return(badtable_2);
|
|
case notable_4:
|
|
return(notable_2);
|
|
case denied_4:
|
|
return(denied_2);
|
|
case other_4:
|
|
default:
|
|
return(other_2);
|
|
}
|
|
}
|
|
|
|
extern Uid_2 *
|
|
_DtCm_uidopt4_to_uid2(Uidopt_4 *uidopt)
|
|
{
|
|
Uid_2 *uid2, *head, *prev;
|
|
|
|
prev = head = NULL;
|
|
while (uidopt != NULL) {
|
|
uid2 = (Uid_2 *)calloc(1, sizeof(Uid_2));
|
|
_DtCm_id4_to_id2(&(uidopt->appt_id), &(uid2->appt_id));
|
|
uid2->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = uid2;
|
|
else
|
|
prev->next = uid2;
|
|
prev = uid2;
|
|
|
|
uidopt = uidopt->next;
|
|
}
|
|
return(head);
|
|
}
|
|
|
|
extern void
|
|
_DtCm_free_attr2(Attribute_2 *a)
|
|
{
|
|
Attribute_2 *ptr;
|
|
|
|
while (a != NULL) {
|
|
ptr = a->next;
|
|
if (a->attr != NULL)
|
|
free(a->attr);
|
|
if (a->value != NULL)
|
|
free(a->value);
|
|
free(a);
|
|
|
|
a = ptr;
|
|
}
|
|
}
|
|
|
|
extern void
|
|
_DtCm_free_appt2(Appt_2 *a)
|
|
{
|
|
Appt_2 *ptr;
|
|
|
|
while (a != NULL) {
|
|
ptr = a->next;
|
|
|
|
if (a->what != NULL)
|
|
free(a->what);
|
|
|
|
if (a->mailto != NULL)
|
|
free(a->mailto);
|
|
|
|
if (a->script != NULL)
|
|
free(a->script);
|
|
|
|
if (a->author != NULL)
|
|
free(a->author);
|
|
|
|
if (a->client_data != NULL)
|
|
free(a->client_data);
|
|
|
|
if (a->attr != NULL)
|
|
_DtCm_free_attr2(a->attr);
|
|
|
|
if (a->exception != NULL)
|
|
free_excpt2(a->exception);
|
|
|
|
free(a);
|
|
|
|
a = ptr;
|
|
}
|
|
}
|
|
|
|
static void
|
|
free_excpt2(Except_2 *e)
|
|
{
|
|
Except_2 *ptr;
|
|
|
|
while (e != NULL) {
|
|
ptr = e->next;
|
|
free(e);
|
|
e = ptr;
|
|
}
|
|
}
|
|
|
|
static Buffer_2
|
|
buffer4_to_buffer2(Buffer_4 b)
|
|
{
|
|
Buffer_2 copy;
|
|
if (b!=NULL)
|
|
copy = strdup(b);
|
|
else
|
|
copy = calloc(1, 1);
|
|
return(copy);
|
|
}
|
|
|
|
/*
|
|
* Repeating event types beyond "yearly" are mapped to "single"
|
|
* because the old front end does not recognize any other types
|
|
* Worse yet it uses Period_2 to index into an array which
|
|
* contains strings up to "yearly", any period types beyond that
|
|
* would index beyond the array and cause the front end to dump core.
|
|
*/
|
|
static Period_2
|
|
period4_to_period2(Period_4 *p)
|
|
{
|
|
if (p==NULL) return(otherPeriod_2);
|
|
switch (p->period) {
|
|
case single_4:
|
|
return(single_2);
|
|
case daily_4:
|
|
return(daily_2);
|
|
case weekly_4:
|
|
return(weekly_2);
|
|
case biweekly_4:
|
|
return(biweekly_2);
|
|
case monthly_4:
|
|
return(monthly_2);
|
|
case yearly_4:
|
|
return(yearly_2);
|
|
default:
|
|
return(single_2);
|
|
}
|
|
}
|
|
|
|
static Tag_2
|
|
tag4_to_tag2(Tag_4 *t)
|
|
{
|
|
if (t==NULL) return(otherTag_2);
|
|
switch(t->tag) {
|
|
case appointment_4:
|
|
return(appointment_2);
|
|
case reminder_4:
|
|
return(reminder_2);
|
|
case otherTag_4:
|
|
case holiday_4:
|
|
case toDo_4:
|
|
default:
|
|
return(otherTag_2);
|
|
}
|
|
}
|
|
|
|
static Attribute_2 *
|
|
attr4_to_attr2(Attribute_4 *a4)
|
|
{
|
|
Attribute_2 *a2, *head, *prev;
|
|
|
|
prev = head = NULL;
|
|
while (a4 != NULL) {
|
|
a2 = (Attribute_2 *)calloc(1, sizeof(Attribute_2));
|
|
a2->next = NULL;
|
|
a2->attr = strdup(a4->attr);
|
|
a2->value = strdup(a4->value);
|
|
|
|
if (head == NULL)
|
|
head = a2;
|
|
else
|
|
prev->next = a2;
|
|
prev = a2;
|
|
|
|
a4 = a4->next;
|
|
}
|
|
return(head);
|
|
}
|
|
|
|
static Except_2 *
|
|
except4_to_except2(Except_4 *e4)
|
|
{
|
|
Except_2 *e2, *head, *prev;
|
|
|
|
prev = head = NULL;
|
|
while (e4 != NULL) {
|
|
e2 = (Except_2 *)calloc(1, sizeof(Except_2));
|
|
e2->ordinal = e4->ordinal;
|
|
e2->next=NULL;
|
|
|
|
if (head == NULL)
|
|
head = e2;
|
|
else
|
|
prev->next = e2;
|
|
prev = e2;
|
|
|
|
e4 = e4->next;
|
|
}
|
|
return(head);
|
|
}
|
|
|
|
static Abb_Appt_2 *
|
|
abb4_to_abb2(Abb_Appt_4 *a4)
|
|
{
|
|
Abb_Appt_2 *a2, *head, *prev;
|
|
|
|
prev = head = NULL;
|
|
while (a4 != NULL) {
|
|
a2 = (Abb_Appt_2 *)calloc(1, sizeof(Abb_Appt_2));
|
|
_DtCm_id4_to_id2(&(a4->appt_id), &(a2->appt_id));
|
|
a2->what = buffer4_to_buffer2(a4->what);
|
|
a2->duration = a4->duration;
|
|
a2->period = period4_to_period2(&(a4->period));
|
|
a2->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = a2;
|
|
else
|
|
prev->next = a2;
|
|
prev = a2;
|
|
|
|
a4 = a4->next;
|
|
}
|
|
return(head);
|
|
}
|
|
|
|
static void
|
|
apptid4_to_apptid2(Apptid_4 *from, Apptid_2 *to)
|
|
{
|
|
if (from==NULL || to==NULL) return;
|
|
_DtCm_id4_to_id2(from->oid, to->oid);
|
|
to->new_appt = _DtCm_appt4_to_appt2(from->new_appt);
|
|
}
|
|
|
|
static Reminder_2 *
|
|
reminder4_to_reminder2(Reminder_4 *r4)
|
|
{
|
|
Reminder_2 *r2, *head, *prev;
|
|
Attribute_2 *attr2;
|
|
|
|
prev = head = NULL;
|
|
while (r4 != NULL) {
|
|
r2 = (Reminder_2 *)calloc(1, sizeof(Reminder_2));
|
|
_DtCm_id4_to_id2(&(r4->appt_id), &(r2->appt_id));
|
|
r2->tick = r4->tick;
|
|
attr2 = attr4_to_attr2(&(r4->attr));
|
|
r2->attr = *attr2;
|
|
free(attr2);
|
|
r2->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = r2;
|
|
else
|
|
prev->next = r2;
|
|
prev = r2;
|
|
|
|
r4 = r4->next;
|
|
}
|
|
return(head);
|
|
}
|
|
|
|
static Table_Res_Type_2
|
|
tablerestype4_to_tablerestype2(Table_Res_Type_4 t)
|
|
{
|
|
switch(t) {
|
|
case AP_4:
|
|
return(AP_2);
|
|
case RM_4:
|
|
return(RM_2);
|
|
case AB_4:
|
|
return(AB_2);
|
|
case ID_4:
|
|
return(ID_2);
|
|
default:
|
|
return(AP_2);
|
|
}
|
|
}
|
|
|
|
static void
|
|
tablereslist4_to_tablereslist2(Table_Res_List_4 *from, Table_Res_List_2 *to)
|
|
{
|
|
if (from==NULL || to==NULL) return;
|
|
to->tag = tablerestype4_to_tablerestype2(from->tag);
|
|
switch (from->tag) {
|
|
case AP_4:
|
|
to->Table_Res_List_2_u.a = _DtCm_appt4_to_appt2(
|
|
from->Table_Res_List_4_u.a);
|
|
break;
|
|
case RM_4:
|
|
to->Table_Res_List_2_u.r = reminder4_to_reminder2(
|
|
from->Table_Res_List_4_u.r);
|
|
break;
|
|
case AB_4:
|
|
to->Table_Res_List_2_u.b = abb4_to_abb2(
|
|
from->Table_Res_List_4_u.b);
|
|
break;
|
|
case ID_4:
|
|
to->Table_Res_List_2_u.i = _DtCm_uid4_to_uid2(
|
|
from->Table_Res_List_4_u.i);
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
|
|
static Table_Args_Type_2
|
|
argstag4_to_argstag2(Table_Args_Type_4 t)
|
|
{
|
|
switch(t) {
|
|
case TICK_4:
|
|
return(TICK_2);
|
|
case APPTID_4:
|
|
return(APPTID_2);
|
|
case UID_4:
|
|
return(UID_2);
|
|
case APPT_4:
|
|
return(APPT_2);
|
|
case RANGE_4:
|
|
return(RANGE_2);
|
|
default:
|
|
return(TICK_2);
|
|
}
|
|
}
|
|
|
|
static void
|
|
args4_to_args2(Args_4 *from, Args_2 *to)
|
|
{
|
|
if (from==NULL || to==NULL) return;
|
|
to->tag = argstag4_to_argstag2(from->tag);
|
|
switch(from->tag) {
|
|
case TICK_4:
|
|
to->Args_2_u.tick = from->Args_4_u.tick;
|
|
break;
|
|
case APPTID_4:
|
|
to->Args_2_u.apptid.oid = (Id_2 *)calloc(1, sizeof(Id_2));
|
|
apptid4_to_apptid2(
|
|
&(from->Args_4_u.apptid),
|
|
&(to->Args_2_u.apptid));
|
|
break;
|
|
case UID_4:
|
|
to->Args_2_u.key = _DtCm_uid4_to_uid2(from->Args_4_u.key);
|
|
break;
|
|
case APPT_4:
|
|
to->Args_2_u.appt = _DtCm_appt4_to_appt2(from->Args_4_u.appt);
|
|
break;
|
|
case RANGE_4:
|
|
to->Args_2_u.range = _DtCm_range4_to_range2(from->Args_4_u.range);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static Table_Args_2 *
|
|
tableargs4_to_tableargs2(Table_Args_4 *a4)
|
|
{
|
|
Table_Args_2 *a2;
|
|
|
|
if (a4==NULL) return((Table_Args_2 *)NULL);
|
|
a2 = (Table_Args_2 *)calloc(1, sizeof(Table_Args_2));
|
|
a2->target = buffer4_to_buffer2(a4->target);
|
|
args4_to_args2(&(a4->args), &(a2->args));
|
|
return(a2);
|
|
}
|
|
|
|
static Registration_2 *
|
|
reg4_to_reg2(Registration_4 *r4)
|
|
{
|
|
Registration_2 *r2, *head, *prev;
|
|
|
|
prev = head = NULL;
|
|
while (r4 != NULL) {
|
|
r2 = (Registration_2 *)calloc(1, sizeof(Registration_2));
|
|
r2->target = buffer4_to_buffer2(r4->target);
|
|
r2->prognum = r4->prognum;
|
|
r2->versnum = r4->versnum;
|
|
r2->procnum = r4->procnum;
|
|
r2->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = r2;
|
|
else
|
|
prev->next = r2;
|
|
prev = r2;
|
|
|
|
r4 = r4->next;
|
|
}
|
|
return(head);
|
|
}
|
|
|