Blame lib/Mrm/Mrmhier.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: Mrmhier.c /main/17 1996/11/13 14:01:19 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/* (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
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
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * This file contains routines which assist in managing URM hierarchies
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
Packit b099d7
#include <Xm/XmosI.h>		/* for _XmOSInitPath() */
Packit b099d7
#include <Xm/XmI.h>		/* for _XmGetDefaultDisplay() */
Packit b099d7
Packit b099d7
#include "MrmMsgI.h"
Packit b099d7
Packit b099d7
#ifndef NO_MESSAGE_CATALOG
Packit b099d7
#if !defined(NL_CAT_LOCALE)
Packit b099d7
#define NL_CAT_LOCALE	0
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  TABLE OF CONTENTS
Packit b099d7
 *
Packit b099d7
 *	Urm__OpenHierarchy		Open hierarchy (internal version)
Packit b099d7
 *
Packit b099d7
 *	Urm__CloseHierarchy		Close hierarchy (internal version)
Packit b099d7
 *
Packit b099d7
 *	UrmHGetIndexedResource		Get resource from hierarchy
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  DEFINE and MACRO DEFINITIONS
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Cardinal I18NOpenFile (Display		 *display, 
Packit b099d7
			      String		 name , 
Packit b099d7
			      MrmOsOpenParamPtr	 os_ext ,
Packit b099d7
			      IDBFile		 *file_id_return );
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  OWN VARIABLE DECLARATIONS
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
static char		*uidPath;
Packit b099d7
static SubstitutionRec	uidSubs[1];
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine allocates a hierarchy descriptor, and opens
Packit b099d7
 *	all the IDB files in the hierarchy. It initializes the
Packit b099d7
 *	optimized search lists in the hierarchy from the open files.
Packit b099d7
 *	All files are closed if there are any errors.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	num_files		The number of files in the name list
Packit b099d7
 *	name_list		A list of the file names
Packit b099d7
 *	os_ext_list		A list of system-dependent ancillary
Packit b099d7
 *				structures corresponding to the files.
Packit b099d7
 *				This parameter may be NULL.
Packit b099d7
 *	hierarchy_id_return	To return the hierarchy id
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
 *	MrmFAILURE		allocation or other failure
Packit b099d7
 *	MrmDISPLAY_NOT_OPENED	Display hasn't been opened yet
Packit b099d7
 *	Others			see UrmIdbOpenFileRead
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__OpenHierarchy (MrmCount			num_files,
Packit b099d7
		    String			*name_list,
Packit b099d7
		    MrmOsOpenParamPtr		*os_ext_list,
Packit b099d7
		    MrmHierarchy		*hierarchy_id_return,
Packit b099d7
		    MrmFlag			in_memory,
Packit b099d7
		    unsigned char		*uid_buffer)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result ;	/* function result */
Packit b099d7
  MrmHierarchy		hiptr ;		/* hierarchy descriptor */
Packit b099d7
  MrmCount		list_size ;	/* # bytes for file lists */
Packit b099d7
  int			ndx ;		/* loop index */
Packit b099d7
  IDBFile		*idvec ;	/* current file id vector */
Packit b099d7
  int			file_ndx ;	/* file loop index */
Packit b099d7
  IDBFile		cur_file ;	/* current IDB file */
Packit b099d7
  URMResourceContextPtr	class_ctx;	/* for class compression table */
Packit b099d7
  URMResourceContextPtr	resource_ctx;	/* for resource compression table */
Packit b099d7
  Display		*display;	/* display for XtResolvePathNames */
Packit b099d7
  char                 	err_stg[300];
Packit b099d7
Packit b099d7
#ifndef NO_MESSAGE_CATALOG
Packit b099d7
  static Boolean first = True;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * We open the message catalog from MrmOpenHierarchy... routines.
Packit b099d7
   * We cannot open it from MrmInitialize, since this call can be done 
Packit b099d7
   * before Xt has been initialized, so at that time the locale could
Packit b099d7
   * be wrong.
Packit b099d7
   */
Packit b099d7
Packit b099d7
  /* We only want to open the message catalog once. */
Packit b099d7
Packit b099d7
  if (first) 
Packit b099d7
    {
Packit b099d7
      Mrm_catd = catopen("Mrm", NL_CAT_LOCALE);    
Packit b099d7
      first = False;
Packit b099d7
    }
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  if ( os_ext_list == NULL )
Packit b099d7
    {
Packit b099d7
      display = NULL;
Packit b099d7
    }
Packit b099d7
  else 
Packit b099d7
    {
Packit b099d7
      MrmOsOpenParamPtr os_data;
Packit b099d7
      os_data = *os_ext_list;
Packit b099d7
      if (os_data->display == NULL)
Packit b099d7
	{
Packit b099d7
	  display = NULL;
Packit b099d7
	}
Packit b099d7
      else
Packit b099d7
	{
Packit b099d7
	  display = os_data->display;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (display == NULL)
Packit b099d7
    {
Packit b099d7
      display = _XmGetDefaultDisplay();
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (display == NULL)
Packit b099d7
    {
Packit b099d7
      return Urm__UT_Error ("Urm__OpenHierarchy", _MrmMMsg_0030,
Packit b099d7
			    NULL, NULL, MrmDISPLAY_NOT_OPENED);
Packit b099d7
    };
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * If the uidPath was previously set, XtFree it so we can try any
Packit b099d7
   * new paths that may have been setup.
Packit b099d7
   */
Packit b099d7
  if (uidPath != 0) 
Packit b099d7
    {
Packit b099d7
      XtFree (uidPath);
Packit b099d7
      uidPath = 0;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Allocate a hierarchy, and allocate all file lists.
Packit b099d7
   */
Packit b099d7
  hiptr = (MrmHierarchy) XtMalloc (sizeof(MrmHierarchyDesc)) ;
Packit b099d7
  if ( hiptr == NULL ) return MrmFAILURE ;
Packit b099d7
Packit b099d7
  hiptr->validation = MrmHIERARCHY_VALID;
Packit b099d7
  hiptr->num_file = 0 ;
Packit b099d7
Packit b099d7
  list_size = num_files * sizeof(IDBFile) ;
Packit b099d7
  hiptr->file_list = (IDBFile *) XtMalloc (list_size) ;
Packit b099d7
  if ( hiptr->file_list == NULL ) return MrmFAILURE ;
Packit b099d7
Packit b099d7
  for ( ndx=URMgMin ; ndx<=URMgMax ; ndx++ )
Packit b099d7
    {
Packit b099d7
      hiptr->grp_num[ndx] = 0 ;
Packit b099d7
      idvec = (IDBFile *) XtMalloc (list_size) ;
Packit b099d7
      if ( idvec == NULL ) return MrmFAILURE ;
Packit b099d7
      hiptr->grp_ids[ndx] = idvec ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  hiptr->name_registry = NULL;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Now open each file. Any failure causes an error return, with any
Packit b099d7
   * open files closed and the descriptor and lists freed.
Packit b099d7
   */
Packit b099d7
  for ( file_ndx=0 ; file_ndx
Packit b099d7
    {
Packit b099d7
      if ( in_memory == TRUE ) 
Packit b099d7
	{
Packit b099d7
	  result = UrmIdbOpenBuffer(uid_buffer, &cur_file) ;
Packit b099d7
	  switch ( result )
Packit b099d7
	    {
Packit b099d7
	    case MrmSUCCESS:
Packit b099d7
	      break;
Packit b099d7
	    case MrmNOT_VALID:
Packit Service 4d6e9e
	      sprintf (err_stg, "%s", _MrmMMsg_0113);
Packit b099d7
	      break;
Packit b099d7
	    default:
Packit Service 4d6e9e
	      sprintf (err_stg, "%s", _MrmMMsg_0114);
Packit b099d7
	      break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
      else if ( os_ext_list == NULL )
Packit b099d7
	result = I18NOpenFile (display, name_list[file_ndx], NULL, &cur_file) ;
Packit b099d7
      else
Packit b099d7
        result = I18NOpenFile (display, name_list[file_ndx], 
Packit b099d7
			       os_ext_list[file_ndx], &cur_file) ;
Packit b099d7
      if ( result != MrmSUCCESS )
Packit b099d7
        {
Packit b099d7
	  XtFree (uidPath);
Packit b099d7
	  uidPath = 0;
Packit b099d7
	  Urm__CloseHierarchy (hiptr) ;
Packit b099d7
	  return result;
Packit b099d7
        }
Packit b099d7
Packit b099d7
      hiptr->file_list[hiptr->num_file] = cur_file ;
Packit b099d7
      hiptr->num_file++ ;
Packit b099d7
      for ( ndx=URMgMin ; ndx<=URMgMax ; ndx++ )
Packit b099d7
        if ( cur_file->group_counts[ndx] > 0 )
Packit b099d7
	  {
Packit b099d7
            idvec = hiptr->grp_ids[ndx] ;
Packit b099d7
            idvec[hiptr->grp_num[ndx]] = cur_file ;
Packit b099d7
            hiptr->grp_num[ndx]++ ;
Packit b099d7
	  }
Packit b099d7
Packit b099d7
      /*
Packit b099d7
       * Attempt to read in compression tables for this UID file.
Packit b099d7
       * Retain and fixup the tables if they are found.
Packit b099d7
       */
Packit b099d7
      cur_file->class_ctable = NULL;
Packit b099d7
      cur_file->resource_ctable = NULL;
Packit b099d7
      result = UrmGetResourceContext ((char *(*)())NULL, (void(*)())NULL,
Packit b099d7
				      0, &class_ctx);
Packit b099d7
      if ( result != MrmSUCCESS ) return result;
Packit b099d7
      result = UrmGetResourceContext ((char *(*)())NULL, (void(*)())NULL,
Packit b099d7
				      0, &resource_ctx);
Packit b099d7
      if ( result != MrmSUCCESS ) return result;
Packit b099d7
      result = UrmGetIndexedLiteral (cur_file, UilMrmClassTableIndex, 
Packit b099d7
				     class_ctx);
Packit b099d7
      if ( result != MrmSUCCESS ) continue;
Packit b099d7
      result = UrmGetIndexedLiteral (cur_file, UilMrmResourceTableIndex, 
Packit b099d7
				     resource_ctx);
Packit b099d7
      if ( result != MrmSUCCESS ) continue;
Packit b099d7
Packit b099d7
      /*
Packit b099d7
       * Retain the buffers from the contexts, but free the contexts
Packit b099d7
       * themselves. Fixup the tables.
Packit b099d7
       */
Packit b099d7
      cur_file->class_ctable =  (UidCompressionTablePtr)
Packit b099d7
	UrmRCBuffer (class_ctx);
Packit b099d7
      UrmRCSetBuffer (class_ctx, NULL);
Packit b099d7
      UrmFreeResourceContext (class_ctx);
Packit b099d7
      Urm__FixupCompressionTable (cur_file->class_ctable, TRUE, 
Packit b099d7
				  cur_file->byte_swapped);
Packit b099d7
      cur_file->resource_ctable = (UidCompressionTablePtr)
Packit b099d7
	UrmRCBuffer (resource_ctx);
Packit b099d7
      UrmRCSetBuffer (resource_ctx, NULL);
Packit b099d7
      UrmFreeResourceContext (resource_ctx);
Packit b099d7
      Urm__FixupCompressionTable (cur_file->resource_ctable, FALSE, 
Packit b099d7
				  cur_file->byte_swapped);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * successfully opened. Free the uidPath at this point
Packit b099d7
   */
Packit b099d7
  XtFree (uidPath);
Packit b099d7
  uidPath = 0;
Packit b099d7
  *hierarchy_id_return = hiptr ;
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 is the internal routine which closes a URM search hierarchy
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	ID of an open URM database hierarchy
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_HIERARCHY	invalid URM hierarchy
Packit b099d7
 *	MrmFAILURE	operation failed, no further reason
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__CloseHierarchy (MrmHierarchy	hierarchy_id)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  int			ndx ;		/* loop index */
Packit b099d7
  URMHashTableEntryPtr	cp, np;         /* for fixing 7303 */
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * validity check the hierarchy, then close all files, deallocate all
Packit b099d7
   * lists, and deallocate the descriptor
Packit b099d7
   */
Packit b099d7
  if ( hierarchy_id == NULL )
Packit b099d7
    return Urm__UT_Error ("Urm__CloseHierarchy", _MrmMMsg_0023,
Packit b099d7
			  NULL, NULL, MrmBAD_HIERARCHY) ;
Packit b099d7
  if ( ! MrmHierarchyValid(hierarchy_id) )
Packit b099d7
    return Urm__UT_Error ("Urm__CloseHierarchy", _MrmMMsg_0024,
Packit b099d7
			  NULL, NULL, MrmBAD_HIERARCHY) ;
Packit b099d7
Packit b099d7
  for ( ndx=0 ; ndx<hierarchy_id->num_file ; ndx++ )
Packit b099d7
    if (hierarchy_id->file_list[ndx]->in_memory == FALSE )
Packit b099d7
      UrmIdbCloseFile (hierarchy_id->file_list[ndx], FALSE) ;
Packit b099d7
Packit b099d7
  /* Begin fixing DTS 7303 */
Packit b099d7
  if(hierarchy_id->name_registry){
Packit b099d7
    for ( ndx=0 ; ndx
Packit b099d7
      if((cp = hierarchy_id->name_registry[ndx]) != NULL)
Packit b099d7
	while(cp){
Packit b099d7
	  np = cp->az_next_entry;
Packit b099d7
	  XtFree((char*)cp);
Packit b099d7
	  cp = np;
Packit b099d7
	};
Packit b099d7
    XtFree ((char*)hierarchy_id->name_registry);
Packit b099d7
  }
Packit b099d7
  /* End fixing DTS 7303 */
Packit b099d7
 
Packit b099d7
  XtFree ((char*)hierarchy_id->file_list);
Packit b099d7
Packit b099d7
  for ( ndx=URMgMin ; ndx<=URMgMax ; ndx++ )
Packit b099d7
    XtFree ((char*)hierarchy_id->grp_ids[ndx]) ;
Packit b099d7
Packit b099d7
  hierarchy_id->validation = 0;
Packit b099d7
  XtFree ((char*)hierarchy_id) ;
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
 *	UrmHGetIndexedResource attempts to retrieve a resource
Packit b099d7
 *	from an open URM hierarchy. It functions exactly like
Packit b099d7
 *	UrmIdbGetIndexedResource except that it queries each file
Packit b099d7
 *	in the hierarchy in turn. It uses the optimized search lists
Packit b099d7
 *	where possible.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id		open URM hierarchy to search
Packit b099d7
 *	index			case-sensitive index for the entry to match
Packit b099d7
 *	group_filter		if not null, entry found must match this group
Packit b099d7
 *	type_filter		if not null, entry found must match this type
Packit b099d7
 *	context_id		URM resource context to receieve data block
Packit b099d7
 *	file_id_return		to return file in which resource 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_HIERARCHY	invalid URM hierarchy
Packit b099d7
 *	MrmNOT_FOUND	entry not found
Packit b099d7
 *	MrmWRONG_GROUP	entry didn't match group filter
Packit b099d7
 *	MrmWRONG_TYPE	entry didn't match type filter
Packit b099d7
 *	MrmFAILURE	operation failed, no further reason
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmHGetIndexedResource (MrmHierarchy		hierarchy_id,
Packit b099d7
			String			index ,
Packit b099d7
			MrmGroup			group_filter, 
Packit b099d7
			MrmType			type_filter,
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
  Cardinal		result ;	/* function results */
Packit b099d7
  IDBFile		*file_ids ;	/* list of files to search */
Packit b099d7
  int			num_ids ;	/* number of entries in file_ids */
Packit b099d7
  int			ndx ;		/* loop index */
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Validate hierarchy. Then loop through the files which define the resource,
Packit b099d7
   * searching for the desired resource.
Packit b099d7
   */
Packit b099d7
  if ( hierarchy_id == NULL )
Packit b099d7
    return Urm__UT_Error ("UrmHGetIndexedResource", _MrmMMsg_0023,
Packit b099d7
			  NULL, NULL, MrmBAD_HIERARCHY) ;
Packit b099d7
  if ( ! MrmHierarchyValid(hierarchy_id) )
Packit b099d7
    return Urm__UT_Error ("UrmHGetIndexedResource", _MrmMMsg_0024,
Packit b099d7
			  NULL, context_id, MrmBAD_HIERARCHY) ;
Packit b099d7
Packit b099d7
  if ( group_filter>=URMgMin && group_filter<=URMgMax)
Packit b099d7
    {
Packit b099d7
      file_ids = hierarchy_id->grp_ids[group_filter] ;
Packit b099d7
      num_ids = hierarchy_id->grp_num[group_filter] ;
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      file_ids = hierarchy_id->file_list ;
Packit b099d7
      num_ids = hierarchy_id->num_file ;
Packit b099d7
    }
Packit b099d7
  for ( ndx=0 ; ndx
Packit b099d7
    {
Packit b099d7
      *file_id_return = file_ids[ndx] ;
Packit b099d7
      result = UrmIdbGetIndexedResource
Packit b099d7
        (*file_id_return, index, group_filter, type_filter, context_id) ;
Packit b099d7
      if ( result == MrmSUCCESS ) return result ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Not found
Packit b099d7
   */
Packit b099d7
  return MrmNOT_FOUND ;
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 inserts the names and their associated values into
Packit b099d7
 *	the hierarchy's name registration hash table (which is constructed
Packit b099d7
 *	if needed). In all respects it functions like Urm__WCI_RegisterNames.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	open URM hierarchy in which to register names.
Packit b099d7
 *	names		A vector of case-sensitive callback routine names.
Packit b099d7
 *	values		A vector of the corresponding routine addresses
Packit b099d7
 *	num_cb		The number of entries in names and values.
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
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
Urm__RegisterNamesInHierarchy (MrmHierarchy		hierarchy_id, 
Packit b099d7
			       String			*names,
Packit b099d7
			       XtPointer			*values,
Packit b099d7
			       MrmCount			num_cb)
Packit b099d7
{
Packit b099d7
Packit b099d7
  URMHashTableEntryPtr	*name_table;
Packit b099d7
  Boolean		inited = FALSE;
Packit b099d7
  int			ndx;
Packit b099d7
  URMHashTableEntryPtr	hash_entry;
Packit b099d7
  char			*current_name;
Packit b099d7
  char			*current_value;
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Make sure the hash table is initialized
Packit b099d7
   */
Packit b099d7
  name_table = hierarchy_id->name_registry;
Packit b099d7
  if ( name_table == NULL )
Packit b099d7
    {
Packit b099d7
      name_table = (URMHashTableEntryPtr *)
Packit b099d7
	XtMalloc(sizeof(URMHashTableEntryPtr)*k_hash_table_size);
Packit b099d7
      /* Begin fixing DTS 7303 */
Packit b099d7
      for ( ndx=0 ; ndx
Packit b099d7
	name_table[ndx] = NULL;
Packit b099d7
      /* End fixing DTS 7303 */
Packit b099d7
      hierarchy_id->name_registry = name_table;
Packit b099d7
      hash_initialize (name_table, &inited);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Store each name-value pair in the hash table.
Packit b099d7
   */
Packit b099d7
  for (ndx = 0 ; ndx < num_cb ; ndx++)
Packit b099d7
    {
Packit b099d7
      current_name = names [ndx];
Packit b099d7
      current_value = values [ndx];
Packit b099d7
      hash_entry = (URMHashTableEntryPtr)
Packit b099d7
	hash_insert_name (name_table, current_name);
Packit b099d7
      hash_entry->az_value = current_value;
Packit b099d7
    }
Packit b099d7
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 returns the value registered for a name. It first
Packit b099d7
 *	attempts to look up the name in the hierarchy's name registry.
Packit b099d7
 *	If that fails, or their is no registry, then a global lookup is
Packit b099d7
 *	attempted.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	open URM hierarchy to search.
Packit b099d7
 *	name		case-sensitive name to be matched
Packit b099d7
 *	value_return	to return value.
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	no match found
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal
Packit b099d7
Urm__LookupNameInHierarchy (MrmHierarchy	hierarchy_id,
Packit b099d7
			    String		name,
Packit b099d7
			    XtPointer		*value_return)
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
  URMHashTableEntryPtr	*name_table;
Packit b099d7
  URMHashTableEntryPtr	hash_entry;
Packit b099d7
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Look up in hierarchy first (if there is a registry)
Packit b099d7
   */
Packit b099d7
  name_table = hierarchy_id->name_registry;
Packit b099d7
  if ( name_table != NULL )
Packit b099d7
    {
Packit b099d7
      hash_entry = (URMHashTableEntryPtr) hash_find_name (name_table, name);
Packit b099d7
      if (hash_entry != NULL)
Packit b099d7
	{
Packit b099d7
	  *value_return = hash_entry->az_value;
Packit b099d7
	  return MrmSUCCESS;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Fall back on global table
Packit b099d7
   */
Packit b099d7
  return Urm__WCI_LookupRegisteredName (name, value_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
 *	This routine opens a single UID file in a platform-dependent way,
Packit b099d7
 *	performing i18n language switching in order to do so.
Packit b099d7
 *
Packit b099d7
 *	Per the latest agreement on semantics, this routine does:
Packit b099d7
 *		- first, try to open in the local directory (that is, with
Packit b099d7
 *		  no switching).
Packit b099d7
 *		- second, try language switching and open
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	name		A system-dependent string specifying the IDB file
Packit b099d7
 *			to be opened.
Packit b099d7
 *	os_ext		An operating-system specific structure which
Packit b099d7
 *			supports using specific file system features
Packit b099d7
 *	file_id_return	returns the IDB file id used in all other IDB routines
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
static Cardinal 
Packit b099d7
I18NOpenFile (Display			*display,
Packit b099d7
	      String			name,
Packit b099d7
	      MrmOsOpenParamPtr		os_ext,
Packit b099d7
	      IDBFile			*file_id_return)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function results */
Packit b099d7
  char			dummy[300];	/* file name (unused) */
Packit b099d7
  char			err_stg[300];
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Use XtResolvePathName.  If the last 4 characters of the file name
Packit b099d7
   * are not .uid then pass in the suffix of .uid.  If a file is not
Packit b099d7
   * found with the suffix passed in then try without the suffix.
Packit b099d7
   */
Packit b099d7
  char			*resolvedname; /* current resolved name */
Packit b099d7
  Boolean		user_path ;
Packit b099d7
Packit b099d7
  uidSubs[0].substitution = name;
Packit b099d7
Packit b099d7
  if (uidPath == 0)
Packit b099d7
    {
Packit b099d7
      uidPath = _XmOSInitPath(name, "UIDPATH", &user_path);
Packit b099d7
      if (user_path) uidSubs[0].match = 'U';
Packit b099d7
      else           uidSubs[0].match = MATCH_CHAR ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  resolvedname = 0;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Check and see if the .uid suffix is already on the file. If not then try to
Packit b099d7
   * resolve the pathname with .uid suffix first. If that fails or the suffix is
Packit b099d7
   * already on the file then just try to resolve the pathname.
Packit b099d7
   */
Packit b099d7
  if ( strcmp (&name[strlen(name)-4],".uid") != 0 ) 
Packit b099d7
    resolvedname = XtResolvePathname (display,
Packit b099d7
				      "uid",
Packit b099d7
				      NULL,
Packit b099d7
				      ".uid",
Packit b099d7
				      uidPath,
Packit b099d7
				      uidSubs,
Packit b099d7
				      XtNumber(uidSubs),
Packit b099d7
				      (XtFilePredicate)NULL);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * No .uid suffix or a failure to resolve the pathname with the .uid suffix
Packit b099d7
   */
Packit b099d7
  if (resolvedname == 0) 
Packit b099d7
    resolvedname = XtResolvePathname (display,
Packit b099d7
				      "uid",
Packit b099d7
				      NULL,
Packit b099d7
				      NULL,
Packit b099d7
				      uidPath,
Packit b099d7
				      uidSubs,
Packit b099d7
				      XtNumber(uidSubs),
Packit b099d7
				      (XtFilePredicate)NULL);
Packit b099d7
Packit b099d7
  if (resolvedname == 0)
Packit b099d7
    {
Packit b099d7
      sprintf (err_stg, _MrmMMsg_0031, name) ;
Packit b099d7
      return Urm__UT_Error ("I18NOpenFile", err_stg, NULL, NULL, MrmNOT_FOUND);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  result = UrmIdbOpenFileRead (resolvedname, os_ext, file_id_return, dummy) ;
Packit b099d7
  switch ( result )
Packit b099d7
    {
Packit b099d7
    case MrmSUCCESS:
Packit b099d7
      break;
Packit b099d7
    case MrmNOT_VALID:
Packit b099d7
      sprintf (err_stg, _MrmMMsg_0032, resolvedname) ;
Packit b099d7
      break;
Packit b099d7
    case MrmNOT_FOUND:
Packit b099d7
    default:
Packit b099d7
      sprintf (err_stg, _MrmMMsg_0031, resolvedname) ;
Packit b099d7
      break;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  XtFree(resolvedname); /* allocated in XtResolvePathName() */
Packit b099d7
Packit b099d7
  if (result == MrmSUCCESS)
Packit b099d7
    return result;
Packit b099d7
  else
Packit b099d7
    return Urm__UT_Error ("I18NOpenFile", err_stg, NULL, NULL, result);
Packit b099d7
}
Packit b099d7