/*
 *    @(#) 2.37 src/somd/somdobj.idl, somd, som3.0 9/26/96 14:02:18 [12/22/96 21:11:55]
 */
//
//   COMPONENT_NAME: somd
//
//   ORIGINS: 27
//
//    25H7912  (C)  COPYRIGHT International Business Machines Corp. 1992,1994,1996 
//   All Rights Reserved
//   Licensed Materials - Property of IBM
//   US Government Users Restricted Rights - Use, duplication or
//   disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
//

//#  SOMDObject is a PUBLIC class derived from SOMObject.
//
//   This is the class that implements the behavior of CORBA object references,
//   e.g., get_implementation, get_interface, duplicate, release, etc.
//
//   In DSOM, there is also another derivation of this class:  SOMDClientProxy.
//   This subclass inherits the implementation of this class, but extends it
//   by overriding sommProxyDispatch with a "remote dispatch" method, and
//   caches the binding to the server process.  Whenever a remote object is
//   accessed, it is represented in the client process by a SOMDClientProxy
//   object.


#ifndef somdobj_idl
#define somdobj_idl

#include <somobj.idl>

#include <unotypes.idl>

interface ImplementationDef;
interface InterfaceDef;
interface NVList;
interface Context;
interface Request;


interface SOMDObject : SOMObject
{

  boolean is_nil();

  // Tests to see if the target object is nil.  This is a procedure
  // method.  Therefore, it can be invoked on OBJECT_NIL (a null pointer),
  // but it cannot be overridden.

  boolean is_SOM_ref();

  // Returns TRUE if target object was created by SOMOA::create_SOM_ref.
  // This method can only be called from a server. 
  // SOM extension.

  boolean is_constant();

  // Returns TRUE if target object was created by SOMOA::create_SOM_ref or
  // SOMOA::create_constant.  Indicates ReferenceData cannot be changed.
  // This method can only be called from a server. 
  // SOM extension.

 
  ImplementationDef get_implementation();

  // Returns the implementation definition of the target object.

  InterfaceDef get_interface();

  // Returns the interface definition of the target object.

  boolean is_proxy();

  // Returns TRUE if target object is a proxy object (i.e., the target object
  // is remote).  The default implementation returns FALSE.  Proxy classes
  // which are subclasses of SOMDObject (e.g. SOMDClientProxy) should override
  // this method to return TRUE.
  // SOM extension.

  SOMObject duplicate();

  // Returns a double of the target object.
  // OWNERSHIP of returned object is transferred to the caller.

  void release();

  // Frees the memory associated with the target object.

  ORBStatus create_request(in Context ctx, in Identifier operation, 
			   in NVList arg_list, inout NamedValue result, 
			   out Request request, in Flags req_flags);

  // Creates a request to execute a particular operation on the target
  // object.  CORBA introduces this method in this class, but DSOM actually
  // implements this method in the SOMDClientProxy subclass.

  ORBStatus create_request_args(in Identifier operation, out NVList arg_list,
                                out NamedValue result);

  // Creates the appropriate NVList for the specified operation and creates a
  // NamedValue to hold the result.  (Similar in function to
  // ORB::create_operation_list.)  This method is defined in this class as a
  // companion to "create_request", but DSOM implements this method in the 
  // SOMDClientProxy subclass.


  attribute string type_id;
  // IDL-format repository ID.  Format defined by OMG Interface
  // Repository Specificiation.

#ifdef __SOMIDL__

// D21205: Move _get_somd_id, _set_somd_id, _get_tagged_profiles,
//         _set_tagged_profiles to private. 
  implementation
  {
    releaseorder: get_implementation, get_interface, unused1,
		  is_nil, is_SOM_ref, is_constant, is_proxy,
		  duplicate, release, create_request, create_request_args,

		  private1,
		  private2, private3, 
		  private4, private5,
		  private6, private7,
                  private8, private9,
                  private10, private11,

		  _get_type_id, _set_type_id;

    //# class modifiers
    callstyle = idl;
    dllname = "somd.dll";
    majorversion = 2;
    minorversion = 2;

    //# method modifiers
    somDefaultInit: override;
    somDestruct: override;
    somDumpSelfInt: override;
    is_nil: procedure;


    passthru C_h_before = ""
      "#include <somdtype.h>"
      "#ifndef SOM_DONT_USE_SHORT_NAMES"
      "#define SOM_DONT_USE_SHORT_NAMES"
      "#include <unotypes.h>"
      "#undef SOM_DONT_USE_SHORT_NAMES"
      "#else"
      "#include <unotypes.h>"
      "#endif"
      "";

    passthru C_xh_before =  ""
      "#include <somdtype.xh>"
      "#ifndef SOM_DONT_USE_SHORT_NAMES"
      "#define SOM_DONT_USE_SHORT_NAMES"
      "#include <unotypes.xh>"
      "#undef SOM_DONT_USE_SHORT_NAMES"
      "#else"
      "#include <unotypes.xh>"
      "#endif"
      "";
  };

#endif /* __SOMIDL__ */

};

#endif  /* somdobj_idl */

