Initial import of the CDE 2.1.30 sources from the Open Group.
This commit is contained in:
451
cde/programs/dtsession/SmProp.c
Normal file
451
cde/programs/dtsession/SmProp.c
Normal file
@@ -0,0 +1,451 @@
|
||||
/*
|
||||
* (c) Copyright 1995 Digital Equipment Corporation.
|
||||
* (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
|
||||
* (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
|
||||
* (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
|
||||
* (c) Copyright 1993, 1994, 1995 Novell, Inc.
|
||||
* (c) Copyright 1995 FUJITSU LIMITED.
|
||||
* (c) Copyright 1995 Hitachi.
|
||||
*
|
||||
* $XConsortium: SmProp.c /main/4 1996/10/07 10:29:51 drk $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <X11/Intrinsic.h>
|
||||
#include <X11/SM/SMlib.h>
|
||||
#include "SmXSMP.h"
|
||||
|
||||
/*
|
||||
* Forward declarations
|
||||
*/
|
||||
static SmPropValue * CopyPropValues (
|
||||
int numPropValues,
|
||||
SmPropValue * thePropValues);
|
||||
|
||||
|
||||
void
|
||||
SetPropertiesProc (
|
||||
SmsConn smsConn,
|
||||
SmPointer managerData,
|
||||
int numProps,
|
||||
SmProp **theProps)
|
||||
{
|
||||
ClientRecPtr pClient = (ClientRecPtr) managerData;
|
||||
PropertyRecPtr pProp;
|
||||
int i, j;
|
||||
Boolean found;
|
||||
|
||||
#ifdef DEBUG
|
||||
(void) printf ("Received SET PROPERTIES [%p]\n", smsConn);
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (numProps == 0)
|
||||
return;
|
||||
|
||||
for (i = 0; i < numProps; i++) {
|
||||
|
||||
found = False;
|
||||
|
||||
if (theProps[i]->num_vals == 0)
|
||||
continue;
|
||||
|
||||
for (pProp = pClient->props;
|
||||
pProp != NULL;
|
||||
pProp = pProp->next) {
|
||||
|
||||
if (!strcmp (theProps[i]->name, pProp->prop.name) &&
|
||||
!strcmp (theProps[i]->type, pProp->prop.type)) {
|
||||
/*
|
||||
* Reuse this property but replace its
|
||||
* property values
|
||||
*/
|
||||
|
||||
for (j = 0; j < pProp->prop.num_vals; j++) {
|
||||
XtFree (pProp->prop.vals[j].value);
|
||||
}
|
||||
|
||||
if (pProp->prop.num_vals > 0)
|
||||
XtFree ((char *) pProp->prop.vals);
|
||||
|
||||
pProp->prop.vals = CopyPropValues (
|
||||
theProps[i]->num_vals,
|
||||
theProps[i]->vals);
|
||||
|
||||
pProp->prop.num_vals = theProps[i]->num_vals;
|
||||
|
||||
found = True;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
|
||||
/*
|
||||
* Put it at the end of the list (or the beginning
|
||||
* if this client has no properties)
|
||||
*/
|
||||
PropertyRecPtr trail = pClient->props;
|
||||
for (pProp = pClient->props;
|
||||
pProp != NULL;
|
||||
trail = pProp, pProp = pProp->next);
|
||||
|
||||
|
||||
pProp = (PropertyRecPtr)XtMalloc (sizeof (PropertyRec));
|
||||
if (!pProp)
|
||||
return;
|
||||
|
||||
if (trail)
|
||||
trail->next = pProp;
|
||||
else
|
||||
pClient->props = pProp;
|
||||
|
||||
pProp->prop.name = XtNewString (theProps[i]->name);
|
||||
pProp->prop.type = XtNewString (theProps[i]->type);
|
||||
pProp->prop.num_vals = theProps[i]->num_vals;
|
||||
pProp->next = NULL;
|
||||
|
||||
pProp->prop.vals = CopyPropValues (
|
||||
theProps[i]->num_vals, theProps[i]->vals);
|
||||
}
|
||||
|
||||
SmFreeProperty (theProps[i]);
|
||||
}
|
||||
|
||||
if (theProps)
|
||||
free ((char *) theProps);
|
||||
|
||||
#ifdef DEBUG
|
||||
for (i = 0, pProp = pClient->props;
|
||||
pProp != NULL;
|
||||
i++, pProp = pProp->next) {
|
||||
(void) printf ("\t[%2d] name = %s\n", i + 1,
|
||||
pProp->prop.name);
|
||||
(void) printf ("\t[%2d] type = %s\n", i + 1,
|
||||
pProp->prop.type);
|
||||
(void) printf ("\t[%2d] num props = %d\n", i + 1,
|
||||
pProp->prop.num_vals);
|
||||
for (j = 0; j < pProp->prop.num_vals; j++) {
|
||||
(void) printf ("\t\t [%2d] (%3d bytes) = %s\n", j + 1,
|
||||
pProp->prop.vals[j].length,
|
||||
pProp->prop.vals[j].value);
|
||||
}
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DeletePropertiesProc (
|
||||
SmsConn smsConn,
|
||||
SmPointer managerData,
|
||||
int numProps,
|
||||
char **propNames)
|
||||
{
|
||||
ClientRecPtr pClient = (ClientRecPtr) managerData;
|
||||
int i;
|
||||
|
||||
#ifdef DEBUG
|
||||
(void) printf ("Received DELETE PROPERTIES [%p] - %d properties\n",
|
||||
smsConn, numProps);
|
||||
for (i = 0; i < numProps; i++)
|
||||
(void) printf ("\t%s\n", propNames[i]);
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (numProps == 0)
|
||||
return;
|
||||
|
||||
for (i = 0; i < numProps; i++) {
|
||||
|
||||
PropertyRecPtr pProp;
|
||||
PropertyRecPtr tmp;
|
||||
PropertyRecPtr trail;
|
||||
|
||||
for (pProp = pClient->props, trail = pClient->props ;
|
||||
pProp != NULL;
|
||||
trail = pProp, pProp = pProp->next) {
|
||||
|
||||
if (!strcmp (pProp->prop.name, propNames[i])) {
|
||||
|
||||
int j;
|
||||
|
||||
XtFree (pProp->prop.name);
|
||||
XtFree (pProp->prop.type);
|
||||
|
||||
for (j = 0; j < pProp->prop.num_vals; j++) {
|
||||
XtFree (pProp->prop.vals[j].value);
|
||||
}
|
||||
|
||||
if (pProp->prop.num_vals > 0)
|
||||
XtFree ((char *) pProp->prop.vals);
|
||||
/*
|
||||
* Remove the record from the list and then
|
||||
* free the record
|
||||
*/
|
||||
trail->next = pProp->next;
|
||||
XtFree ((char *) pProp);
|
||||
pProp = trail;
|
||||
}
|
||||
}
|
||||
|
||||
free (propNames[i]);
|
||||
}
|
||||
|
||||
free ((char *) propNames);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
GetPropertiesProc (
|
||||
SmsConn smsConn,
|
||||
SmPointer managerData)
|
||||
{
|
||||
ClientRecPtr pClient = (ClientRecPtr) managerData;
|
||||
PropertyRecPtr pProp;
|
||||
PropertyRecPtr trail;
|
||||
int numProps;
|
||||
int i, j;
|
||||
SmProp **pPropsRet;
|
||||
|
||||
#ifdef DEBUG
|
||||
(void) printf ("Received GET PROPERTIES [%p]\n", smsConn);
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (!pClient->props) {
|
||||
SmsReturnProperties (smsConn, 0, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
for (pProp = pClient->props, numProps = 0;
|
||||
pProp != NULL;
|
||||
pProp = pProp->next, numProps++);
|
||||
|
||||
pPropsRet = (SmProp **) XtMalloc (numProps * sizeof (SmProp *));
|
||||
|
||||
if (!pPropsRet) {
|
||||
SmsReturnProperties (smsConn, 0, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function must return an array of pointers to SmProp
|
||||
* structures and since the properties are actually stored
|
||||
* in a linked list, a transformation is required.
|
||||
*/
|
||||
for (i=0, pProp = pClient->props;
|
||||
pProp != NULL;
|
||||
i++, pProp = pProp->next) {
|
||||
|
||||
pPropsRet[i] = (SmProp *) XtMalloc (sizeof (SmProp));
|
||||
if (!pPropsRet[i]) {
|
||||
SmsReturnProperties (smsConn, 0, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
pPropsRet[i]->name = XtNewString (pProp->prop.name);
|
||||
pPropsRet[i]->type = XtNewString (pProp->prop.type);
|
||||
pPropsRet[i]->num_vals = pProp->prop.num_vals;
|
||||
pPropsRet[i]->vals = (SmPropValue *) XtMalloc (
|
||||
pProp->prop.num_vals * sizeof (SmPropValue));
|
||||
|
||||
if (!pPropsRet[i]->vals) {
|
||||
SmsReturnProperties (smsConn, 0, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
for (j = 0; j < pProp->prop.num_vals; j++) {
|
||||
|
||||
pPropsRet[i]->vals[j].length =
|
||||
pProp->prop.vals[j].length;
|
||||
pPropsRet[i]->vals[j].value = (SmPointer)
|
||||
XtMalloc (pProp->prop.vals[j].length);
|
||||
|
||||
if (!pPropsRet[i]->vals[j].value) {
|
||||
SmsReturnProperties (smsConn, 0, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy (pPropsRet[i]->vals[j].value,
|
||||
pProp->prop.vals[j].value,
|
||||
pProp->prop.vals[j].length);
|
||||
}
|
||||
}
|
||||
|
||||
SmsReturnProperties (smsConn, numProps, pPropsRet);
|
||||
|
||||
#ifdef DEBUG
|
||||
for (i = 0; i < numProps; i++) {
|
||||
(void) printf ("\t[%2d] name = %s\n", i + 1,
|
||||
pPropsRet[i]->name);
|
||||
(void) printf ("\t[%2d] type = %s\n", i + 1,
|
||||
pPropsRet[i]->type);
|
||||
(void) printf ("\t[%2d] num props = %d\n", i + 1,
|
||||
pPropsRet[i]->num_vals);
|
||||
for (j = 0; j < pPropsRet[i]->num_vals; j++) {
|
||||
(void) printf ("\t\t [%2d] (%3d bytes) = %s\n", j + 1,
|
||||
pPropsRet[i]->vals[j].length,
|
||||
pPropsRet[i]->vals[j].value);
|
||||
}
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
for (i = 0; i < numProps; i++)
|
||||
SmFreeProperty (pPropsRet[i]);
|
||||
|
||||
XtFree ((char *) pPropsRet);
|
||||
}
|
||||
|
||||
|
||||
static SmPropValue *
|
||||
CopyPropValues (
|
||||
int numPropValues,
|
||||
SmPropValue * thePropValues)
|
||||
{
|
||||
SmPropValue * pPropValueRet;
|
||||
int i;
|
||||
|
||||
pPropValueRet = (SmPropValue *) XtMalloc (numPropValues *
|
||||
sizeof (SmPropValue));
|
||||
|
||||
if (!pPropValueRet)
|
||||
return (NULL);
|
||||
|
||||
for (i = 0; i < numPropValues; i++) {
|
||||
|
||||
pPropValueRet[i].length = thePropValues[i].length;
|
||||
pPropValueRet[i].value = (SmPointer)
|
||||
XtMalloc(thePropValues[i].length + 1);
|
||||
|
||||
if (!pPropValueRet[i].value)
|
||||
return (NULL);
|
||||
|
||||
memcpy (pPropValueRet[i].value,
|
||||
thePropValues[i].value,
|
||||
thePropValues[i].length);
|
||||
|
||||
((char *) pPropValueRet[i].value)[pPropValueRet[i].length]='\0';
|
||||
}
|
||||
|
||||
return (pPropValueRet);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns a ptr to the property record list for the given
|
||||
* property.
|
||||
*/
|
||||
PropertyRecPtr
|
||||
GetPropertyRec (
|
||||
ClientRecPtr pClientRec,
|
||||
char * propName)
|
||||
{
|
||||
PropertyRecPtr pPropRec;
|
||||
|
||||
for (pPropRec = pClientRec->props; pPropRec;
|
||||
pPropRec = pPropRec->next) {
|
||||
|
||||
if (!strcmp (propName, pPropRec->prop.name))
|
||||
return (pPropRec);
|
||||
|
||||
}
|
||||
|
||||
return (pPropRec);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* If the given property exists, it returns a ptr to the first
|
||||
* value of the property if the type of the property is SmARRAY8
|
||||
* (char *).
|
||||
*/
|
||||
char *
|
||||
GetArrayPropertyValue (
|
||||
ClientRecPtr pClientRec,
|
||||
char * propName)
|
||||
{
|
||||
PropertyRecPtr pPropRec;
|
||||
|
||||
if ((pPropRec = GetPropertyRec (pClientRec, propName)) == NULL)
|
||||
return (NULL);
|
||||
|
||||
if ((!strcmp (pPropRec->prop.type, SmARRAY8)) &&
|
||||
(pPropRec->prop.num_vals >= 1))
|
||||
return (pPropRec->prop.vals[0].value);
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*************************************<->*************************************
|
||||
*
|
||||
* GetListOfArrayPropertyValue -
|
||||
*
|
||||
* Description: If the specified property exits and its type is
|
||||
* a LISTofARRAY8, then a NULL-terminated array of pointers
|
||||
* to the values is returned.
|
||||
*
|
||||
* Returns: NULL-terminated array of values or NULL
|
||||
*
|
||||
* Comments: caller is responsible for using XtFree to free the returned
|
||||
* pointer if it is not NULL
|
||||
*
|
||||
*************************************<->***********************************/
|
||||
char **
|
||||
GetListOfArrayPropertyValue (
|
||||
ClientRecPtr pClientRec,
|
||||
char * propName)
|
||||
{
|
||||
PropertyRecPtr pPropRec;
|
||||
char ** ppchar;
|
||||
int i;
|
||||
|
||||
if ((pPropRec = GetPropertyRec (pClientRec, propName)) == NULL)
|
||||
return (NULL);
|
||||
|
||||
if ((strcmp (pPropRec->prop.type, SmLISTofARRAY8)) ||
|
||||
(pPropRec->prop.num_vals <= 0))
|
||||
return (NULL);
|
||||
|
||||
ppchar = (char **) XtMalloc ((pPropRec->prop.num_vals + 1) *
|
||||
sizeof (char *));
|
||||
if (!ppchar)
|
||||
return (NULL);
|
||||
|
||||
for (i = 0; i < pPropRec->prop.num_vals; i++)
|
||||
ppchar[i] = pPropRec->prop.vals[i].value;
|
||||
|
||||
ppchar[pPropRec->prop.num_vals] = NULL;
|
||||
|
||||
return (ppchar);
|
||||
}
|
||||
|
||||
|
||||
/*************************************<->*************************************
|
||||
*
|
||||
* GetCardPropertyValue -
|
||||
*
|
||||
* Description: If the specified property exits and its type is
|
||||
* a CARD8, then return its value.
|
||||
*
|
||||
* Returns: True if the property is found; False otherwise
|
||||
*
|
||||
*************************************<->***********************************/
|
||||
Boolean
|
||||
GetCardPropertyValue (
|
||||
ClientRecPtr pClientRec,
|
||||
char * propName,
|
||||
int * propValue) /* MODIFIED */
|
||||
{
|
||||
PropertyRecPtr pPropRec;
|
||||
|
||||
if ((pPropRec = GetPropertyRec (pClientRec, propName)) == NULL)
|
||||
return (False);
|
||||
|
||||
if ((!strcmp (pPropRec->prop.type, SmCARD8)) &&
|
||||
(pPropRec->prop.num_vals >= 1)) {
|
||||
int hint = (int) *((char *) (pPropRec->prop.vals[0].value));
|
||||
*propValue = hint;
|
||||
return (True);
|
||||
}
|
||||
|
||||
return (False);
|
||||
}
|
||||
Reference in New Issue
Block a user