Blame lib/Mrm/Mrmlread.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
 */ 
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: Mrmlread.c /main/16 1996/11/13 14:02:28 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/*                                                                      *
Packit b099d7
 * (c) Copyright 1996 Hewlett-Packard Company                           *
Packit b099d7
 * (c) Copyright 1996 International Business Machines Corp.             *
Packit b099d7
 * (c) Copyright 1996 Sun Microsystems, Inc.                            *
Packit b099d7
 * (c) Copyright 1996 Novell, Inc.                                      *
Packit b099d7
 * (c) Copyright 1989, 1990, 1996 Digital Equipment Corporation.	*
Packit b099d7
 * (c) Copyright 1996 FUJITSU LIMITED.					*
Packit b099d7
 * (c) Copyright 1996 Hitachi.						*
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *  FACILITY:
Packit b099d7
 *
Packit b099d7
 *      UIL Resource Manager (URM):
Packit b099d7
 *
Packit b099d7
 *  ABSTRACT:
Packit b099d7
 *
Packit b099d7
 *	This module contains the literal read routines. All these routines
Packit b099d7
 *	read a literal from a hierarchy or IDB file into a resource context.
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  INCLUDE FILES
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <Mrm/MrmAppl.h>
Packit b099d7
#include <Mrm/Mrm.h>
Packit b099d7
#include "MrmosI.h"
Packit b099d7
#include "MrmMsgI.h"
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  TABLE OF CONTENTS
Packit b099d7
 *
Packit b099d7
 *	UrmGetIndexedLiteral		Read indexed literal from IDB file
Packit b099d7
 *
Packit b099d7
 *	UrmGetRIDLiteral		Read RID literal from IDB file
Packit b099d7
 *
Packit b099d7
 *	UrmHGetIndexedLiteral		Read indexed literal from hierarchy
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine is a service routine for the various XmFetch...Literal
Packit b099d7
 *	routine. It fetches a literal into a context. It also fetches any
Packit b099d7
 *	other literals which are referenced.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	id of an open hierarchy containing the literal
Packit b099d7
 *	index		index of the desired literal
Packit b099d7
 *	context_id	context in which to return literal. Literal will
Packit b099d7
 *			be fixed up.
Packit b099d7
 *	ctxlist		list of other contexts created (if needed)
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__FetchLiteral (MrmHierarchy			hierarchy_id,
Packit b099d7
		   String			index,
Packit b099d7
		   URMResourceContextPtr	context_id,
Packit b099d7
		   URMPointerListPtr		*ctxlist)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function results */
Packit b099d7
  IDBFile		file_id = NULL;	/* file containing literal */
Packit b099d7
  long			val;		/* literal value */
Packit b099d7
  MrmType		type;		/* literal type */
Packit b099d7
  char			err_msg[300];	/* for error messages */
Packit b099d7
  Boolean		swap_needed = FALSE ;
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * read the literal into the context
Packit b099d7
   */
Packit b099d7
  result = Urm__HGetIndexedLiteral (hierarchy_id, index, context_id, &file_id);
Packit b099d7
  if ( result != MrmSUCCESS )
Packit b099d7
    {
Packit b099d7
      sprintf (err_msg, _MrmMMsg_0042, index);
Packit b099d7
      return Urm__UT_Error ("Urm__FetchLiteral", err_msg, NULL, NULL, result);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  swap_needed = UrmRCByteSwap(context_id) ;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Acquire the literal type and value, and do any fixups which are required.
Packit b099d7
   */
Packit b099d7
  val = (long) UrmRCBuffer (context_id);
Packit b099d7
  type = UrmRCType (context_id);
Packit b099d7
  switch ( type )
Packit b099d7
    {
Packit b099d7
    case MrmRtypeIconImage:
Packit b099d7
      UrmPlistInit (10, ctxlist);
Packit b099d7
      result = Urm__CW_LoadIconImage ((RGMIconImagePtr)val, (XtPointer)val,
Packit b099d7
				      hierarchy_id, file_id, *ctxlist);
Packit b099d7
      /* LoadIconImage checks validations and handle swapping */
Packit b099d7
      swap_needed = FALSE ;
Packit b099d7
      break;
Packit b099d7
    case MrmRtypeFontList:
Packit b099d7
      /* Check for old style font list, allocate new value if necessary. */
Packit b099d7
      if (strcmp(file_id->db_version, URM1_1version) <= 0)
Packit b099d7
	{
Packit b099d7
	  int count = ((OldRGMFontListPtr)val)->count;
Packit b099d7
	  RGMFontListPtr fontlist = (RGMFontListPtr)
Packit b099d7
	    XtMalloc(sizeof(RGMFontList) + (sizeof(RGMFontItem) * (count - 1)));
Packit b099d7
	  Urm__CW_FixupValue ((long)fontlist, type, (XtPointer)val, file_id,
Packit b099d7
			      &swap_needed);
Packit b099d7
	  XtFree((char *)val);
Packit b099d7
	  UrmRCBuffer(context_id) = (char *)fontlist;
Packit b099d7
	}
Packit b099d7
      else 
Packit b099d7
	Urm__CW_FixupValue (val, type, (XtPointer)val, file_id, &swap_needed); 
Packit b099d7
      break; 
Packit b099d7
    case MrmRtypeInteger:
Packit b099d7
    case MrmRtypeBoolean:
Packit b099d7
      if ( swap_needed )
Packit b099d7
	{
Packit b099d7
	  swapbytes( (*(int *)UrmRCBuffer (context_id)) );
Packit b099d7
	  swap_needed = FALSE ;
Packit b099d7
	}
Packit b099d7
      break; 
Packit b099d7
    case MrmRtypeSingleFloat:
Packit b099d7
      if ( swap_needed )
Packit b099d7
	{
Packit b099d7
	  swapbytes( (*(int *)UrmRCBuffer (context_id)) );
Packit b099d7
	  swap_needed = FALSE ;
Packit b099d7
	}
Packit b099d7
      _MrmOSIEEEFloatToHost( (float *)UrmRCBuffer (context_id));
Packit b099d7
      break; 
Packit b099d7
    case MrmRtypeFloat:
Packit b099d7
      if ( swap_needed )
Packit b099d7
	{
Packit b099d7
	  swapdouble( (*(double *)UrmRCBuffer (context_id)) );
Packit b099d7
	  swap_needed = FALSE ;
Packit b099d7
	}
Packit b099d7
      _MrmOSIEEEDoubleToHost( (double *)UrmRCBuffer (context_id));
Packit b099d7
      break; 
Packit b099d7
Packit b099d7
    default:
Packit b099d7
      Urm__CW_FixupValue (val, type, (XtPointer)val, file_id, &swap_needed);
Packit b099d7
      break;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  UrmRCSetByteSwap(context_id, swap_needed);
Packit b099d7
  return MrmSUCCESS;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine reads and returns the value of a literal (named value)
Packit b099d7
 *	stored as a public resource in a single UID file. It returns a
Packit b099d7
 *	pointer to value of the literal, fixed up and converted for
Packit b099d7
 *	use as a toolkit argument. The return is always a pointer -- an
Packit b099d7
 *	integer is returned as a pointer to an integer, and a string is
Packit b099d7
 *	returned as a pointer to a string. The caller is responsible for
Packit b099d7
 *	freeing the literal's storage, which was acquired with XtMalloc.
Packit b099d7
 *
Packit b099d7
 *	This routine should not be used for fetching icon or color literals,
Packit b099d7
 *	as more information is required for converting them. If fetched,
Packit b099d7
 *	an error is returned.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	id of an open hierarchy containing the literal
Packit b099d7
 *	index		index of the desired literal
Packit b099d7
 *	value_return	to return pointer to literal value
Packit b099d7
 *	type_return	will be set to the literal data type, from RGMrType...
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	- literal found and returned
Packit b099d7
 *	MrmWRONG_TYPE	- unsupported literal type encountered
Packit b099d7
 *	MrmNOT_FOUND	- literal not found
Packit b099d7
 *	MrmFAILURE	- file system error
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal
Packit b099d7
MrmFetchLiteral (MrmHierarchy		hierarchy_id,
Packit b099d7
		 String			index,
Packit b099d7
		 Display		*display,
Packit b099d7
		 XtPointer		*value_return,
Packit b099d7
		 MrmCode		*type_return)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function results */
Packit b099d7
  URMResourceContextPtr	context_id;	/* for the literal */
Packit b099d7
  URMPointerListPtr	ctxlist = NULL;	/* save added contexts */
Packit b099d7
  Cardinal		ndx;		/* loop index */
Packit b099d7
  int			vec_size = 0;
Packit b099d7
  int			vec_count = 0;
Packit b099d7
  _MrmDisplayToAppContext(display);
Packit b099d7
Packit b099d7
  _MrmAppLock(app);
Packit b099d7
  _MrmProcessLock();
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Read the literal, discard the context, and return.
Packit b099d7
   */
Packit b099d7
  UrmGetResourceContext ((char *(*)())NULL, (void(*)())NULL, 0, &context_id);
Packit b099d7
  result = Urm__FetchLiteral (hierarchy_id, index, context_id, &ctxlist);
Packit b099d7
  if ( result == MrmSUCCESS )
Packit b099d7
    {
Packit b099d7
      *value_return = (XtPointer) UrmRCBuffer (context_id);
Packit b099d7
      (*type_return) = (MrmCode) UrmRCType (context_id);
Packit b099d7
      vec_size = UrmRCSize (context_id);
Packit b099d7
      switch ( *type_return )
Packit b099d7
	{
Packit b099d7
	case MrmRtypeIconImage:
Packit b099d7
	case MrmRtypeColor:
Packit b099d7
	case MrmRtypeColorTable:
Packit b099d7
	case MrmRtypeXBitmapFile:
Packit b099d7
	  if ( ctxlist != NULL )
Packit b099d7
	    {
Packit b099d7
	      for ( ndx=0 ; ndx
Packit b099d7
		UrmFreeResourceContext
Packit b099d7
		  ((URMResourceContextPtr) UrmPlistPtrN(ctxlist,ndx)) ;
Packit b099d7
	      UrmPlistFree (ctxlist) ;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	  UrmFreeResourceContext (context_id);
Packit b099d7
	  _MrmAppUnlock(app);
Packit b099d7
	  _MrmProcessUnlock();
Packit b099d7
	  return MrmWRONG_TYPE;
Packit b099d7
Packit b099d7
	case MrmRtypeChar8Vector:
Packit b099d7
	case MrmRtypeCStringVector:
Packit b099d7
	  /*
Packit b099d7
	  ** Do necessary conversions (Fixups were done by Urm__FetchLiteral)
Packit b099d7
	  */
Packit b099d7
	  vec_size -= (sizeof ( RGMTextVector ) - sizeof ( RGMTextEntry ));
Packit b099d7
	  vec_count = ((RGMTextVectorPtr)*value_return)->count;
Packit b099d7
	  result = Urm__CW_ConvertValue (NULL, (long*)value_return, 
Packit b099d7
					 (MrmType)*type_return, 0, display,
Packit b099d7
					 hierarchy_id, NULL) ;
Packit b099d7
	  if ( result != MrmSUCCESS ) 
Packit b099d7
	    {
Packit b099d7
	      _MrmAppUnlock(app);
Packit b099d7
	      _MrmProcessUnlock();
Packit b099d7
	      return MrmFAILURE;
Packit b099d7
	    }
Packit b099d7
	  Urm__CW_SafeCopyValue ((long *)value_return, (MrmType)*type_return,
Packit b099d7
				 NULL, vec_count, vec_size);
Packit b099d7
	  UrmFreeResourceContext (context_id);
Packit b099d7
	  break;
Packit b099d7
Packit b099d7
	case MrmRtypeIntegerVector:
Packit b099d7
	  /*
Packit b099d7
	  **  Do necessary conversions (Fixups were done by Urm__FetchLiteral)
Packit b099d7
	  */
Packit b099d7
	  vec_count = ((RGMIntegerVectorPtr)*value_return)->count;
Packit b099d7
	  vec_size  = vec_count * sizeof ( int * );
Packit b099d7
	  result = Urm__CW_ConvertValue (NULL, (long*)value_return, 
Packit b099d7
					 (MrmType)*type_return, 0, display,
Packit b099d7
					 hierarchy_id, NULL) ;
Packit b099d7
	  if ( result != MrmSUCCESS )
Packit b099d7
	    {
Packit b099d7
	      _MrmAppUnlock(app);
Packit b099d7
	      _MrmProcessUnlock();
Packit b099d7
	      return MrmFAILURE;
Packit b099d7
	    }
Packit b099d7
	  Urm__CW_SafeCopyValue ((long *)value_return, (MrmType)*type_return,
Packit b099d7
				 NULL, vec_count, vec_size);
Packit b099d7
	  UrmFreeResourceContext (context_id);
Packit b099d7
	  break;
Packit b099d7
Packit b099d7
	default :
Packit b099d7
	  /*
Packit b099d7
	  **  Do necessary conversions (Fixups were done by Urm__FetchLiteral)
Packit b099d7
	  */
Packit b099d7
	  result = Urm__CW_ConvertValue (NULL, (long*)value_return, 
Packit b099d7
					 (MrmType)*type_return, 0, display,
Packit b099d7
					 hierarchy_id, NULL) ;
Packit b099d7
Packit b099d7
	  switch ( *type_return )
Packit b099d7
	    {
Packit b099d7
	      /*
Packit b099d7
	       * Free the context id AND the buffer in these cases
Packit b099d7
	       */
Packit b099d7
	    case MrmRtypeTransTable:
Packit b099d7
	    case MrmRtypeClassRecName:
Packit b099d7
	    case MrmRtypeKeysym:
Packit b099d7
	      UrmFreeResourceContext (context_id);
Packit b099d7
	      break;
Packit b099d7
Packit b099d7
	    default:
Packit b099d7
	      /*
Packit b099d7
	       * Only free the context id in all other cases
Packit b099d7
	       */
Packit b099d7
	      (*(context_id->free_func)) (context_id) ;
Packit b099d7
	      break;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	  if ( result != MrmSUCCESS )
Packit b099d7
	    {
Packit b099d7
	      _MrmAppUnlock(app);
Packit b099d7
	      _MrmProcessUnlock();
Packit b099d7
	      return MrmFAILURE;
Packit b099d7
	    }
Packit b099d7
	  break;
Packit b099d7
	}
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      return MrmSUCCESS;
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      (*(context_id->free_func)) (context_id) ;
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine fetches an icon literal from a hierarchy. It converts
Packit b099d7
 *	the icon to an X pixmap.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	id of an open hierarchy containing the literal
Packit b099d7
 *	index		index of the desired literal
Packit b099d7
 *	screen		screen to use for pixmap
Packit b099d7
 *	display		display to use for pixmap
Packit b099d7
 *	fgpix		foreground color for pixmap
Packit b099d7
 *	bgpix		background color for pixmap
Packit b099d7
 *	pixmap_return	to return resulting X pixmap
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
MrmFetchIconLiteral (MrmHierarchy                hierarchy_id,
Packit b099d7
		     String                      index,
Packit b099d7
		     Screen                      *screen,
Packit b099d7
		     Display                     *display,
Packit b099d7
		     Pixel                       fgpix,
Packit b099d7
		     Pixel                       bgpix,
Packit b099d7
		     Pixmap                      *pixmap_return)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function results */
Packit b099d7
  URMResourceContextPtr	context_id;	/* for the literal */
Packit b099d7
  URMPointerListPtr	ctxlist = NULL;	/* save added contexts */
Packit b099d7
  Cardinal		ndx;		/* loop index */
Packit b099d7
  MrmType		type;
Packit b099d7
  _MrmDisplayToAppContext(display);
Packit b099d7
Packit b099d7
  _MrmAppLock(app);
Packit b099d7
  _MrmProcessLock();
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Read the literal, and deal with errors
Packit b099d7
   */
Packit b099d7
  UrmGetResourceContext ((char *(*)())NULL, (void(*)())NULL, 0, &context_id);
Packit b099d7
  result = Urm__FetchLiteral (hierarchy_id, index, context_id, &ctxlist);
Packit b099d7
  if ( result == MrmSUCCESS ) {
Packit b099d7
    type = UrmRCType(context_id);
Packit b099d7
  }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      if ( ctxlist != NULL )
Packit b099d7
	{
Packit b099d7
	  for ( ndx=0 ; ndx
Packit b099d7
	    UrmFreeResourceContext
Packit b099d7
	      ((URMResourceContextPtr)UrmPlistPtrN(ctxlist,ndx)) ;
Packit b099d7
	  UrmPlistFree (ctxlist) ;
Packit b099d7
	}
Packit b099d7
      UrmFreeResourceContext (context_id);
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Convert to X pixmap, and free resources
Packit b099d7
   */
Packit b099d7
  switch (type) {
Packit b099d7
  case MrmRtypeIconImage:
Packit b099d7
    result = UrmCreatePixmap
Packit b099d7
      ((RGMIconImagePtr)UrmRCBuffer(context_id), screen, display,
Packit b099d7
       fgpix, bgpix, pixmap_return, (Widget)NULL);
Packit b099d7
    break;
Packit b099d7
  case MrmRtypeXBitmapFile:
Packit b099d7
    result = Urm__CW_ReadBitmapFile (UrmRCBuffer(context_id), screen, 
Packit b099d7
				     fgpix, bgpix, pixmap_return, (Widget)NULL);
Packit b099d7
    break;
Packit b099d7
  default:
Packit b099d7
    result = MrmWRONG_TYPE;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  if ( ctxlist != NULL )
Packit b099d7
    {
Packit b099d7
      for ( ndx=0 ; ndx
Packit b099d7
	UrmFreeResourceContext 
Packit b099d7
	  ((URMResourceContextPtr)UrmPlistPtrN(ctxlist,ndx)) ;
Packit b099d7
      UrmPlistFree (ctxlist) ;
Packit b099d7
    }
Packit b099d7
  UrmFreeResourceContext (context_id);
Packit b099d7
  _MrmAppUnlock(app);
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
  return result;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine fetches an icon literal from a hierarchy. It converts
Packit b099d7
 *	the icon to an X pixmap OF DEPTH 1.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	id of an open hierarchy containing the literal
Packit b099d7
 *	index		index of the desired literal
Packit b099d7
 *	screen		screen to use for pixmap
Packit b099d7
 *	display		display to use for pixmap
Packit b099d7
 *	pixmap_return	to return resulting X pixmap
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
MrmFetchBitmapLiteral (MrmHierarchy                hierarchy_id,
Packit b099d7
		       String                      index,
Packit b099d7
		       Screen                      *screen,
Packit b099d7
		       Display                     *display,
Packit b099d7
		       Pixmap                      *pixmap_return,
Packit b099d7
		       Dimension			*width,
Packit b099d7
		       Dimension			*height)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function results */
Packit b099d7
  URMResourceContextPtr	context_id;	/* for the literal */
Packit b099d7
  URMPointerListPtr	ctxlist = NULL;	/* save added contexts */
Packit b099d7
  Cardinal		ndx;		/* loop index */
Packit b099d7
  MrmType		type;
Packit b099d7
  RGMIconImagePtr	icon;
Packit b099d7
  _MrmDisplayToAppContext(display);
Packit b099d7
Packit b099d7
  _MrmAppLock(app);
Packit b099d7
  _MrmProcessLock();
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Read the literal, and deal with errors
Packit b099d7
   */
Packit b099d7
  UrmGetResourceContext ((char *(*)())NULL, (void(*)())NULL, 0, &context_id);
Packit b099d7
  result = Urm__FetchLiteral (hierarchy_id, index, context_id, &ctxlist);
Packit b099d7
  if ( result == MrmSUCCESS ) {
Packit b099d7
    type = UrmRCType(context_id);
Packit b099d7
  }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      if ( ctxlist != NULL )
Packit b099d7
	{
Packit b099d7
	  for ( ndx=0 ; ndx
Packit b099d7
	    UrmFreeResourceContext 
Packit b099d7
	      ((URMResourceContextPtr)UrmPlistPtrN(ctxlist,ndx)) ;
Packit b099d7
	  UrmPlistFree (ctxlist) ;
Packit b099d7
	}
Packit b099d7
      UrmFreeResourceContext (context_id);
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Convert to X pixmap, and free resources
Packit b099d7
   */
Packit b099d7
  switch (type) {
Packit b099d7
  case MrmRtypeIconImage:
Packit b099d7
    icon = (RGMIconImagePtr)UrmRCBuffer(context_id);
Packit b099d7
    result = UrmCreateBitmap 
Packit b099d7
      (icon, screen, display,
Packit b099d7
       pixmap_return);
Packit b099d7
    *width = icon->width;
Packit b099d7
    *height = icon->height;
Packit b099d7
    break;
Packit b099d7
    /*
Packit b099d7
      >>> Andy research here if we can do this for a depth of 1
Packit b099d7
      case MrmRtypeXBitmapFile:
Packit b099d7
      result = Urm__CW_ReadBitmapFile (UrmRCBuffer(context_id), screen, 
Packit b099d7
      fgpix, bgpix, pixmap_return);
Packit b099d7
      break;
Packit b099d7
      */
Packit b099d7
  default:
Packit b099d7
    result = MrmWRONG_TYPE;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  if ( ctxlist != NULL )
Packit b099d7
    {
Packit b099d7
      for ( ndx=0 ; ndx
Packit b099d7
	UrmFreeResourceContext 
Packit b099d7
	  ((URMResourceContextPtr)UrmPlistPtrN(ctxlist,ndx)) ;
Packit b099d7
      UrmPlistFree (ctxlist) ;
Packit b099d7
    }
Packit b099d7
  UrmFreeResourceContext (context_id);
Packit b099d7
  _MrmAppUnlock(app);
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
  return result;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine fetches a named color literal from a UID file, and
Packit b099d7
 *	converts it to a pixel value.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	id of an open hierarchy containing the literal
Packit b099d7
 *	index		index of the desired literal
Packit b099d7
 *	display		display to use for pixmap
Packit b099d7
 *	cmap		color map ID. If NULL, the default color map is used
Packit b099d7
 *	pixel_return	to return the pixel value for the color
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
MrmFetchColorLiteral (MrmHierarchy                hierarchy_id,
Packit b099d7
		      String                      index,
Packit b099d7
		      Display                     *display,
Packit b099d7
		      Colormap                    cmap,
Packit b099d7
		      Pixel                       *pixel_return)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function results */
Packit b099d7
  URMResourceContextPtr	context_id;	/* for the literal */
Packit b099d7
  URMPointerListPtr	ctxlist = NULL;	/* save added contexts */
Packit b099d7
  Cardinal		ndx;		/* loop index */
Packit b099d7
  RGMColorDescPtr	colorptr;
Packit b099d7
  char			err_msg[300] ;
Packit b099d7
  _MrmDisplayToAppContext(display);
Packit b099d7
Packit b099d7
  _MrmAppLock(app);
Packit b099d7
  _MrmProcessLock();
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Read the literal, and deal with errors.
Packit b099d7
   */
Packit b099d7
  UrmGetResourceContext ((char *(*)())NULL, (void(*)())NULL, 0, &context_id);
Packit b099d7
  result = Urm__FetchLiteral (hierarchy_id, index, context_id, &ctxlist);
Packit b099d7
  if ( result == MrmSUCCESS )
Packit b099d7
    if (UrmRCType(context_id) != MrmRtypeColor)
Packit b099d7
      result = MrmWRONG_TYPE;
Packit b099d7
  if ( result != MrmSUCCESS)
Packit b099d7
    {
Packit b099d7
      if ( ctxlist != NULL )
Packit b099d7
	{
Packit b099d7
	  for ( ndx=0 ; ndx
Packit b099d7
	    UrmFreeResourceContext 
Packit b099d7
	      ((URMResourceContextPtr)UrmPlistPtrN(ctxlist,ndx)) ;
Packit b099d7
	  UrmPlistFree (ctxlist) ;
Packit b099d7
	}
Packit b099d7
      UrmFreeResourceContext (context_id);
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Convert to X named color, and free resources
Packit b099d7
   */
Packit b099d7
  colorptr = (RGMColorDescPtr) UrmRCBuffer(context_id);
Packit b099d7
Packit b099d7
  switch (colorptr->desc_type)
Packit b099d7
    {
Packit b099d7
    case URMColorDescTypeName:
Packit b099d7
      result = Urm__UT_GetNamedColorPixel
Packit b099d7
	(display, cmap, colorptr, pixel_return, 
Packit b099d7
	 XBlackPixelOfScreen(XDefaultScreenOfDisplay(display)));
Packit b099d7
      break;
Packit b099d7
    case URMColorDescTypeRGB:
Packit b099d7
      result = Urm__UT_GetColorPixel
Packit b099d7
	(display, cmap, colorptr, pixel_return,
Packit b099d7
	 XBlackPixelOfScreen(XDefaultScreenOfDisplay(display)));
Packit b099d7
      break;
Packit b099d7
    default:
Packit Service 1f15c3
      sprintf(err_msg, _MrmMMsg_0040);
Packit b099d7
      result = Urm__UT_Error ("MrmFetchColorLiteral",
Packit b099d7
			      err_msg, NULL, NULL, MrmFAILURE) ;
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      return result;
Packit b099d7
    };
Packit b099d7
  UrmFreeResourceContext (context_id);
Packit b099d7
Packit b099d7
  /* partial success only returned when a color allocation fails, but
Packit b099d7
     we've tried to make a reasonable substitution */
Packit b099d7
  if (result == MrmPARTIAL_SUCCESS) result = MrmSUCCESS;
Packit b099d7
  _MrmAppUnlock(app);
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
  return result;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	UrmGetIndexedLiteral searches a single database file for a literal
Packit b099d7
 *	given its index (i.e. it gets a public literal from a single file).
Packit b099d7
 *	It returns the literal as the contents of the context buffer. The
Packit b099d7
 *	group which is fetched is always URMgLiteral. The literal type
Packit b099d7
 *	filter is taken from the context; if unmodified in the context
Packit b099d7
 *	as obtained from UrmGetResourceContext, there is no filtering
Packit b099d7
 *	(type=RGMtNul).
Packit b099d7
 *
Packit b099d7
 *	The buffer contents will be as follows for some common literal
Packit b099d7
 *	types obtained from a .UID file. Note that in some cases that
Packit b099d7
 *	the caller must fix up offsets to be memory pointers.
Packit b099d7
 *
Packit b099d7
 *	UrmRCType(context_id) == MrmRtypeChar8:
Packit b099d7
 *		UrmRCBuffer(context_id) contains a nul-terminated
Packit b099d7
 *		ASCII string
Packit b099d7
 *
Packit b099d7
 *	UrmRCType(context_id) == MrmRtypeCString:
Packit b099d7
 *		UrmRCBuffer(context_id) contains a compound string
Packit b099d7
 *
Packit b099d7
 *	UrmRCType(context_id) == MrmRtypeChar8Vector:
Packit b099d7
 *	UrmRCType(context_id) == MrmRtypeCStringVector:
Packit b099d7
 *		UrmRCBuffer(context_id) contains an RGM text vector
Packit b099d7
 *		or stringtable (RGMTextVector). The items in the
Packit b099d7
 *		text vector contain offsets into the buffer which
Packit b099d7
 *		locate either nul-terminated ASCII strings or compound
Packit b099d7
 *		compound strings. These may be relocated to memory
Packit b099d7
 *		pointers by adding the buffer address to the offset, i.e.
Packit b099d7
 *		item[n].text_item.pointer = item[n].text_item.offset+bufadr
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	file_id		id of an open URM database file (IDB file)
Packit b099d7
 *	index		index of the desired literal
Packit b099d7
 *	context_id	resource context into which to read the literal
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmBAD_CONTEXT	invalid resource context
Packit b099d7
 *	Other		See UrmIdbGetIndexedResource
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmGetIndexedLiteral (IDBFile			file_id ,
Packit b099d7
		      String			index ,
Packit b099d7
		      URMResourceContextPtr	context_id )
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  MrmType		lit_type ;	/* the type of the literal */
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Validate context, then attempt the read.
Packit b099d7
   */
Packit b099d7
  if ( ! UrmRCValid(context_id) )
Packit b099d7
    return Urm__UT_Error ("UrmGetIndexedLiteral", _MrmMMsg_0043,
Packit b099d7
			  file_id, context_id, MrmBAD_CONTEXT) ;
Packit b099d7
Packit b099d7
  lit_type = UrmRCType (context_id) ;
Packit b099d7
  return UrmIdbGetIndexedResource
Packit b099d7
    (file_id, index, URMgLiteral, lit_type, context_id) ;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	UrmGetRIDLiteral retrieves a literal from a single database file
Packit b099d7
 *	given its resource id as an accessor. It returns the literal record.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	file_id		id of an open URM database file (IDB file)
Packit b099d7
 *	resource_id	resource id for literal
Packit b099d7
 *	context_id	literal context in which to return record read in
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmNOT_FOUND	literal not found
Packit b099d7
 *	MrmFAILURE	operation failed, further reason not given.
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmGetRIDLiteral (IDBFile			file_id ,
Packit b099d7
		  MrmResource_id		resource_id ,
Packit b099d7
		  URMResourceContextPtr	context_id )
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  MrmType		lit_type ;	/* the type of the literal */
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Validate context, then attempt the read.
Packit b099d7
   */
Packit b099d7
  if ( ! UrmRCValid(context_id) )
Packit b099d7
    return Urm__UT_Error ("UrmGetRIDLiteral", _MrmMMsg_0043,
Packit b099d7
			  file_id, context_id, MrmBAD_CONTEXT) ;
Packit b099d7
Packit b099d7
  lit_type = UrmRCType (context_id) ;
Packit b099d7
  return UrmIdbGetRIDResource
Packit b099d7
    (file_id, resource_id, URMgLiteral, lit_type, context_id) ;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	Urm__HGetIndexedLiteral is exactly like UrmGetLiteral except
Packit b099d7
 *	that it searches a hierarchy for the literal rather than reading
Packit b099d7
 *	from a single file.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	hierarchy to be searched
Packit b099d7
 *	index		index of the desired literal
Packit b099d7
 *	context_id	resource context into which to read the literal
Packit b099d7
 *	file_id_return	to return IDB file in which literal was found
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmBAD_CONTEXT	invalid resource context
Packit b099d7
 *	Other		See UrmIdbGetIndexedResource
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__HGetIndexedLiteral (MrmHierarchy		hierarchy_id ,
Packit b099d7
			 String			index ,
Packit b099d7
			 URMResourceContextPtr	context_id ,
Packit b099d7
			 IDBFile		*file_id_return )
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  MrmType			lit_type ;	/* the type of the literal */
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Validate hierarchy and context, then attempt the read.
Packit b099d7
   */
Packit b099d7
  if ( hierarchy_id == NULL )
Packit b099d7
    return Urm__UT_Error ("Urm__HGetIndexedLiteral", _MrmMMsg_0023,
Packit b099d7
			  NULL, NULL, MrmBAD_HIERARCHY) ;
Packit b099d7
  if ( ! MrmHierarchyValid(hierarchy_id) )
Packit b099d7
    return Urm__UT_Error ("Urm__HGetIndexedLiteral", _MrmMMsg_0024,
Packit b099d7
			  NULL, NULL, MrmBAD_HIERARCHY) ;
Packit b099d7
  if ( ! UrmRCValid(context_id) )
Packit b099d7
    return Urm__UT_Error ("Urm__HGetIndexedLiteral", _MrmMMsg_0043,
Packit b099d7
			  NULL, context_id, MrmBAD_CONTEXT) ;
Packit b099d7
Packit b099d7
  lit_type = UrmRCType (context_id) ;
Packit b099d7
  return UrmHGetIndexedResource
Packit b099d7
    (hierarchy_id, index, URMgLiteral, lit_type, context_id, file_id_return) ;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	UrmHGetIndexedLiteral is exactly like UrmGetLiteral except
Packit b099d7
 *	that it searches a hierarchy for the literal rather than reading
Packit b099d7
 *	from a single file.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	hierarchy to be searched
Packit b099d7
 *	index		index of the desired literal
Packit b099d7
 *	context_id	resource context into which to read the literal
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmBAD_CONTEXT	invalid resource context
Packit b099d7
 *	Other		See UrmIdbGetIndexedResource
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmHGetIndexedLiteral (MrmHierarchy		hierarchy_id ,
Packit b099d7
		       String			index ,
Packit b099d7
		       URMResourceContextPtr	context_id )
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  IDBFile			dummy ;		/* unused file return */
Packit b099d7
Packit b099d7
  return Urm__HGetIndexedLiteral (hierarchy_id, index, context_id, &dummy) ;
Packit b099d7
}
Packit b099d7