/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/
/*
 *
 * CEE configuration records and constants.
 *
 */


module CEECFG {

//
// The following types are used for SKI configuration.
//

//
// !MemoryDebug
//
// If set to true then a number of memory debugging features are enabled.
// Not recommended if high performance is required.
//
// Default is false. (Use CMU -c for current values).
//

   typedef boolean MemoryDebug;



//
// !MaxConfiguredObjects
//
// Maximum number of objects that can be configured with
// CEE_OBJECT_CONFIGURE.
//
// Default is 1024.
//

   typedef unsigned long MaxConfiguredObjects;



//
// !MaxInterfaces
//
// Maximum number of interfaces that can be created with
// CEE_INTERFACE_CREATE.
//
// Default is 256.
//

   typedef unsigned long MaxInterfaces;



//
// !MaxImplementations
//
// Maximum number of implementations that can be created with
// CEE_IMPLEMENTATION_CREATE.
//
// Default is 256.
//

   typedef unsigned long MaxImplementations;



//
// !MaxAsynchIOs
//
// Maximum number of asynchrononous I/O's that can be outstanding
// at any time.
//
// Default is 1024.
//

   typedef unsigned long MaxAsynchIOs;



//
// !MaxObjrefSize
//
// Maximum number of bytes (characters) in an object reference including the
// terminating null.
//
// Default is 128.
//

   typedef unsigned long MaxObjrefSize;



//
// !MaxProxies
//
// Maximum number of proxies that can be created with CEE_PROXY_CREATE.
//
// Default is 10000.
//

   typedef unsigned long MaxProxies;



//
// !MaxObjects
//
// Maximum number of objects. Sum of configured objects and dynamic
// objects created with CEE_OBJECT_CREATE.
//
// Default is 10000.
//

   typedef unsigned long MaxObjects;



//
// !MaxSignalHandlers
//
// Maximum number of signal handlers that can be registered with
// CEE_SIGNAL_HANDLER_REGISTER.
//
// Default is 1024.
//

   typedef unsigned long MaxSignalHandlers;



//
// !MaxCalls
//
// Maximum number of concurrently active object calls.
//
// Default is 10000.
//

   typedef unsigned long MaxCalls;



//
// !MaxServiceContextListLength
//
// Maximum number of elements in a service context list (send or receive).
//
// Default is 2.
//

   typedef unsigned long MaxServiceContextListLength;



//
// !MaxTimers
//
// Maximum number of pending timers.
//
// Default is 10000.
//

   typedef unsigned long MaxTimers;



//
// !MaxTasks
//
// Maximum number of CEE tasks.
//
// Default is 1024.
//

   typedef unsigned long MaxTasks;



//
// !MaxTitaniumSignalTags
//
// Maximum number of Titanium signal tags that can be created with
// CEE_TI_SIGNAL_TAG_CREATE.
//
// Default is 2048.
//

   typedef unsigned long MaxTiSignalTags;



//
// !PoolExtentSizeDivisor
//
// PoolExtentSizeDivisor is used to compute the size of the "chunks"
// the CEE uses to extned its internal memory pools.  Most of the
// "Max*" configuration values define the upper limit on the size of
// the pools.  The initial size of a pool is the "Max*" divided by
// "PoolExtentSizeDivisor". If "PoolExtentSizeDivisor" is 0 or 1, the
// entire pool is allocated at initialization.  If "PoolExtentSizeDivisor"
// is negative, the pool is "grown" in single unit chunks (e.g. one call
// or one proxy).  If "PoolExtentSizeDivisor" is 2, the pool is initially
// half of "Max*" and the other half will be allocated on demand.  If
// "PoolExtentSizeDivisor" is 3, one third is allocated initially and
// the rest on demand.  And so on.
//
// Default is 100.
// 

   typedef unsigned long PoolExtentSizeDivisor;



//
// !Transport
//
// Transport to be used to receive object calls.
//
// Can be:
//
// - CEE_TRANSPORT_NULL (= 1): receive no external object calls
//
// - CEE_TRANSPORT_FSP  (= 2): receive object calls on $RECEIVE
//                             (WRITEREAD or PATHSEND). For Pathway
//                             servers "ServerclassName" must be set.
//                             For associative servers "PathmonName"
//                             must be set.
//
// - CEE_TRANSPORT_TCP  (= 3): receive object calls on socket specified
//                             by "TcpSocketNumber".
//
// - CEE_TRANSPORT_TI   (= 4): receive object calls via Titanium on the
//                             SNOR's derived from "TitaniumServerCapsule".
//
// - CEE_TRANSPORT_SRT  (= 5): pseudo-transport which enables switching
//                             calls between a series of object references
//
// Default is CEE_TRANSPORT_NULL.
//

   typedef unsigned long Transport;



//
// !TcpPortNumber
//
// Port number on which to listen. Used only by servers with the TCP
// transport.
// 
// Default is zero (= use any socket).
//

   typedef unsigned short TcpPortNumber;



//
// !TcpReuseAddress
//
// 
// "TcpReuseAddress" enables or disables the ability to reuse a local
// socket name on more than one socket. If this option is set to true
// (a non-zero value), then it will allow the CEE to listen on a port
// even if this port is already in use. You should avoid using this
// option if possible since its use can have unexpected results. Used
// only by servers with the TCP transport.
// 
// Default is false 
//

   typedef boolean TcpReuseAddress;



//
// !TcpProcessName
//
// TCP process to use for accepting/posting object calls over TCP.
// Used by servers and clients on NSK platforms with the TCP transport.
// 
// Default is $ZTC0 
//

   typedef string TcpProcessName;


//
// !TcpNetwork
//
// Similar to TcpProcessName, on NT and UNIXs "TcpNetwork" contains 
// an Internet address in standard (dot) notation which allows the user
// to configure the network stack on a multihomed system. 
//
// Default is "0.0.0.0" (INADDR_ANY)
//

   typedef string TcpNetwork;

//
// !ServerclassName
//
// Pathway serverclass name. Used only by servers with the FSP transport
// if they are running as Pathway servers.
// 
// Default is empty string (implies server is not a Pathway server).
//
// Example: MY-SERVER
//

   typedef string<15> ServerclassName;



//
// !PathmonName
//
// Pathmon process name under which the server is running. Used only
// by servers with the FSP transport if they are running as Pathway
// servers. If Pathmon process name does not include a node name it is
// assumed to be on the local node.
// 
// Default is process ancestor (implies server is not an associative
// server).
//
// Examples: $MYPM, \MYHOST.$PMON
//

   typedef string<15> PathmonName;




//
// !TitaniumServerCapsule
//
// Used only by servers with the Titanium transport.
//
// Must be specified if "Transport" is set to CEE_TRANSPORT_TI (= 4).
//
// Format is manufacturer-id/object-id. The local site-id, manufacturer-id
// and object-id are used to create a SNOR (site native object reference) 
// for the server capsule's queue.
//
// No default.
//
// Example: 12/4
//

   typedef string TitaniumServerCapsule;




//  
// !TitaniumServerConcurrency
//
// Used only by servers with the Titanium transport. Specifies how many
// outstanding replies a capsule can have. This influences how many
// Titanium server ports are created.
// 
// Default is one.
//
// Example: 100
//

   typedef unsigned long TitaniumServerConcurrency;

   const unsigned long MAX_LIBRARY_NAME_SIZE       =  256;
   const unsigned long MAX_ENTRY_POINT_NAME_SIZE   =   64;
   const unsigned long MAX_PARAM_SIZE              = 1024;
   const unsigned long MIN_OBJREF_SIZE             =   64;



//
// !ObjectConfigTag
//
// Is an entry in the configured object table (see next section). Each
// entry describes one configured object.
//
// <oid>            Object ID.
//
// <vendorID>       Vendor ID (qualifies component ID)
//
// <componentID>    Identifies the implementation library (component)
//                  for alerts etc.
//
// <libraryName>    Name of library containing the objects implementation
//                  and initialization function.
//
// <entrypointName> Name of the object initialization function.
//
// <param>          A parameter that will be passed to the
//                  object initialization function (not used
//                  by the CEE).
//
//

   struct ObjectConfigTag {
      sequence<char>                              oid;
      sequence<char, MAX_LIBRARY_NAME_SIZE>       libraryName;
      sequence<char, MAX_ENTRY_POINT_NAME_SIZE>   entrypointName;
      sequence<char, MAX_PARAM_SIZE>              param;   
   };



//
// !ConfiguredObjectTable
//
// Contains a list of configured objects.
//

   typedef sequence<ObjectConfigTag> ConfiguredObjectTable;



//         
// ! UseBootstrapAlertObject
//
// If set to true (the default) then "ALF_AlertRaise"  will try to
// write a primitive message to "stderr" if the alert object specified
// by "AlertObjref" cannot be called.
//
// If false then "ALF_AlertRaise" has no effect if the alert object is
// unreachable.
//
// Default is "true".
//

   typedef boolean UseBootstrapAlertObject;



//         
// ! AlertObjref
//
// Object reference of the Alert Object to which all alerts are to be sent.
//
// Default is "".
//

   typedef Object AlertObjref;



//
// ! UseTitanium
//
// If set to true the process will attempt to register as a Titanium
// capsule. If this succeeds then it will be possible to make object
// calls using the Titanium transport.
//
// Default is CEE_FALSE.
//

   typedef boolean UseTitanium;



//
// ! ProxyCachingEnabled
//
// If set to true, then on a proxy destroy request an attempt will be
// made to cache the resources associated with the given proxy such
// that they could potentially be reused on a subsequent proxy create
// request.
//
// Default is CEE_TRUE.
//

   typedef boolean ProxyCachingEnabled;



//
// ! MaxProxiesToCache
//
// Defines the maximum number of proxies that the proxy cache may
// hold.
//
// Default is 20.
//

   typedef boolean MaxProxiesToCache;



//         
// ! Trace configuration
//
// The following parameters can be used to override the setting of the
// TRACEINFO, TRACEWARN, TRACEFAIL and TRACEFORMAT environment variables
// so that tracing can also be controlled with SAM.
//

   typedef string TraceInfo;
   typedef string TraceWarn;
   typedef string TraceFail;
   typedef string TraceFormat;
  


//
// !Stub Trace: Client
//
// Enables tracing for client capsules. This parameter is disabled by
// default. If this parameter is set to false then no trace output is
// produced for CEE clients even if TRACEINFO is set to "STUB".
//
// Note that for stubs tracing, TRACEINFO must be set to "STUB".
//
// Default is IDL_FALSE.
//

   typedef boolean TraceClient;



//
// !Stub Trace: Server
//
// Enables tracing for server capsules. This parameter is disabled by
// default. If this parameter is set to false then no trace output is
// produced for CEE servers even if TRACEINFO is set to "STUB".
//
// Note that for stubs tracing, TRACEINFO must be set to "STUB".
//
// Default is IDL_FALSE.
//

   typedef boolean TraceServer;
  

//
// !Stub Trace: ParamDumpLength
//
// This parameter sets the approximate length of operation argument value
// strings which are displayed in trace messages. Parameter Data conversion
// is limited by the "ParamDumpLength" parameter. If this parameter
// equals 0, then no operation arguments are dumped. This parameter is
// set to 200 by default. Note that the maximal trace message is limited
// to 2048 characters.
//

   typedef unsigned long ParamDumpLength;




//
// !Stub Trace: InsertLineBreaks
//
// If true line breaks are inserted in an argument value string for better
// readability. This is advisable when analysing deeply nested data types.
// This parameter is set to false by default.
  
   typedef boolean InsertLineBreaks;



//
// ! StderrFile
//
// The file to which stderr should be redirected.  Trace output is 
// written to stderr and so are bootstrap alerts.
//
// Default is NULL.
//
  typedef string StderrFile;



//         
// ! ServiceResourceEntry
//
// Is an entry in the Service Resource Block (see
// ServiceResourceBlock). Entries have the form:
//
// <type>      defines whether the entry refers to an
//             IMPLEMENTER or a PROVIDER
//
// <objref>    the object reference of the resource
//

  struct ServiceResourceEntry {
    sequence<char>  type;
    sequence<char>  objref;
  };



//         
// ! ServiceResourceBlock
//
// Associates a name with a list of service resource entries.
// The name is then referenced in a statically configured
// SRT (Service Resource Transport) objref. Entries have the
// form:
//
// <name>      service name
//
// <policy>    the name of the policy which governs how
//             object calls are switched between service
//             implementers
//
// <list>      a sequence of service resource entries
//

  struct ServiceResourceBlock {
    sequence<char>                     name;
    sequence<char>                     policy;
    sequence<ServiceResourceEntry>     list;
  };



//
// !ServiceResourceTable
//
// Contains a list of service resource blocks.
//

   typedef sequence<ServiceResourceBlock> ServiceResourceTable;



//
// !Default Asynch Call mode
//
// Default asynch call mode (unsupported)
//
// Default is CEE_CALL_MODE_QUEUE.
//

typedef unsigned long AsynchCallMode;



//
// !Default Asynch Response mode
//
// Default asynch response mode (unsupported)
//
// Default is CEE_RESPONSE_MODE_QUEUE.
//

typedef unsigned long AsynchResponseMode;



//
// !TransactionFactory
//
// The object reference that should be used to create transactions.
//
  typedef Object TransactionFactory;


}; // module CEECFG

