Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Static Private Member Functions | Friends

CORBA::ValueBase Class Reference

Abstract baseclass for Valuetypes. More...

#include <ValueBase.h>

Inheritance diagram for CORBA::ValueBase:
Inheritance graph
[legend]

List of all members.

Public Types

typedef ValueBase_ptr_type
typedef ValueBase_var _var_type
typedef ValueBase_out _out_type
typedef ACE_Vector< ACE_CStringRepository_Id_List

Public Member Functions

virtual void _add_ref (void)=0
 ! virtual CORBA::ValueBase* _copy_value (void) = 0;
virtual void _remove_ref (void)=0
virtual CORBA::ULong _refcount_value (void)=0
virtual CORBA::TypeCode_ptr _tao_type (void) const =0
virtual const char * _tao_obv_repository_id (void) const =0
 Return the repository id of this valuetype.
virtual void _tao_obv_truncatable_repo_ids (Repository_Id_List &) const =0
CORBA::Boolean _tao_unmarshal_post (TAO_InputCDR &strm)
virtual CORBA::Boolean _tao_marshal_v (TAO_OutputCDR &) const =0
 During marshal jump to the most derived part.
virtual CORBA::Boolean _tao_unmarshal_v (TAO_InputCDR &)=0
 Called after obtaining the fresh object from create_for_unmarshal ().
virtual void truncation_hook ()

Static Public Member Functions

static CORBA::ValueBase_downcast (CORBA::ValueBase *)
static void _tao_any_destructor (void *)
 TAO extension.
static CORBA::Boolean _tao_marshal (TAO_OutputCDR &strm, const ValueBase *_this, ptrdiff_t formal_type_id=0)
static CORBA::Boolean _tao_unmarshal (TAO_InputCDR &strm, ValueBase *&new_object)
static CORBA::Boolean _tao_unmarshal_pre (TAO_InputCDR &strm, CORBA::ValueBase *&valuetype, const char *const repo_id, CORBA::Boolean &is_null_object, CORBA::Boolean &is_indirected)
 Both used internally and are called from T::_tao_unmarshal ().
static CORBA::Boolean _tao_validate_box_type (TAO_InputCDR &strm, TAO_InputCDR &indirected_strm, const char *const repo_id_expected, CORBA::Boolean &null_object, CORBA::Boolean &is_indirected)

Protected Member Functions

 ValueBase (void)
 ValueBase (const ValueBase &)
virtual ~ValueBase (void)
virtual CORBA::Boolean _tao_match_formal_type (ptrdiff_t) const =0

Protected Attributes

CORBA::Boolean is_truncatable_
CORBA::Boolean chunking_

Private Member Functions

CORBA::Boolean _tao_write_value_header (TAO_OutputCDR &strm, ptrdiff_t formal_type_id) const
ValueBaseoperator= (const ValueBase &)

Static Private Member Functions

static CORBA::Boolean _tao_unmarshal_value_indirection_pre (TAO_InputCDR &strm, TAO_InputCDR &indirected_strm)
static CORBA::Boolean _tao_unmarshal_value_indirection (TAO_InputCDR &strm, CORBA::ValueBase *&value)
static CORBA::Boolean _tao_unmarshal_repo_id_indirection (TAO_InputCDR &strm, ACE_CString &repo_id)
static CORBA::Boolean _tao_unmarshal_codebase_url_indirection (TAO_InputCDR &strm, ACE_CString &codebase_url)
static CORBA::Boolean _tao_write_repository_id (TAO_OutputCDR &strm, ACE_CString &id)
static CORBA::Boolean _tao_write_special_value (TAO_OutputCDR &strm, const CORBA::ValueBase *value)
 Write some special values such as null value or indirection value.
static CORBA::Boolean _tao_write_value (TAO_OutputCDR &strm, const CORBA::ValueBase *value, ptrdiff_t formal_type_id)
 Write whole value.
static CORBA::Boolean _tao_read_repository_id (TAO_InputCDR &strm, ACE_CString &id)
static CORBA::Boolean _tao_read_repository_id_list (TAO_InputCDR &strm, Repository_Id_List &ids)
static CORBA::Boolean _tao_read_codebase_url (TAO_InputCDR &strm, ACE_CString &codebase_url)

Friends

class TAO_ChunkInfo

Detailed Description

Abstract baseclass for Valuetypes.

See also:
CORBA 2.3 - Section 20.17.5

Definition at line 124 of file ValueBase.h.


Member Typedef Documentation

Definition at line 131 of file ValueBase.h.

Definition at line 129 of file ValueBase.h.

Reimplemented in TAO_AMH_DSI_Exception_Holder.

Definition at line 130 of file ValueBase.h.

Definition at line 133 of file ValueBase.h.


Constructor & Destructor Documentation

CORBA::ValueBase::ValueBase ( void   )  [protected]

Definition at line 71 of file ValueBase.cpp.

  : is_truncatable_(0),
    chunking_(0)
{
}

CORBA::ValueBase::ValueBase ( const ValueBase val  )  [protected]

Definition at line 77 of file ValueBase.cpp.

  : is_truncatable_ (val.is_truncatable_),
    chunking_ (val.chunking_)
{
}

CORBA::ValueBase::~ValueBase ( void   )  [protected, virtual]

Definition at line 83 of file ValueBase.cpp.

{
}


Member Function Documentation

virtual void CORBA::ValueBase::_add_ref ( void   )  [pure virtual]

! virtual CORBA::ValueBase* _copy_value (void) = 0;

Implemented in CORBA::DefaultValueRefCountBase.

CORBA::ValueBase * CORBA::ValueBase::_downcast ( CORBA::ValueBase vt  )  [static]

Reimplemented in TAO_AMH_DSI_Exception_Holder.

Definition at line 88 of file ValueBase.cpp.

{
  // Every vt is a CORBA::ValueBase :-).
  return vt;
}

virtual CORBA::ULong CORBA::ValueBase::_refcount_value ( void   )  [pure virtual]
virtual void CORBA::ValueBase::_remove_ref ( void   )  [pure virtual]
void CORBA::ValueBase::_tao_any_destructor ( void *  x  )  [static]

TAO extension.

Used in the implementation of CORBA::Any

Reimplemented in TAO_AMH_DSI_Exception_Holder.

Definition at line 95 of file ValueBase.cpp.

{
  CORBA::ValueBase *tmp = static_cast<CORBA::ValueBase *> (x);
  CORBA::remove_ref (tmp);
}

CORBA::Boolean CORBA::ValueBase::_tao_marshal ( TAO_OutputCDR strm,
const ValueBase _this,
ptrdiff_t  formal_type_id = 0 
) [static]

Marshal a valuetype (see operator<< in tao_idl generated file how it is called)

Definition at line 152 of file ValueBase.cpp.

{
  if ( ! _tao_write_special_value (strm, this_))
  {
    return _tao_write_value (strm, this_, formal_type_id);
  }
  else
    return 1;
}

virtual CORBA::Boolean CORBA::ValueBase::_tao_marshal_v ( TAO_OutputCDR  )  const [pure virtual]

During marshal jump to the most derived part.

Implemented in TAO_AMH_DSI_Exception_Holder.

virtual CORBA::Boolean CORBA::ValueBase::_tao_match_formal_type ( ptrdiff_t   )  const [protected, pure virtual]

Compare the supplied formal type identifier with our actual type. This is used during marshaling of valuetypes to detect when it is appropriate to not explicitly marshal the typecode for the value.

Implemented in TAO_AMH_DSI_Exception_Holder.

virtual const char* CORBA::ValueBase::_tao_obv_repository_id ( void   )  const [pure virtual]

Return the repository id of this valuetype.

Implemented in TAO_AMH_DSI_Exception_Holder.

virtual void CORBA::ValueBase::_tao_obv_truncatable_repo_ids ( Repository_Id_List  )  const [pure virtual]

Give the list of the RepositoryIds in the valuetype "truncatable" inheritance hierarchy. List the id of this valuetype as first RepositoryID and go up the "truncatable" derivation hierarchy. Note the truncatable repo ids only list the truncatable base types to which this type is safe to truncate, not all its parents.

Implemented in TAO_AMH_DSI_Exception_Holder.

CORBA::Boolean CORBA::ValueBase::_tao_read_codebase_url ( TAO_InputCDR strm,
ACE_CString codebase_url 
) [static, private]

Read a codebase url from the CDR input stream, accounting for indirection.

Definition at line 1203 of file ValueBase.cpp.

{
  CORBA::ULong length = 0;

  size_t buffer_size = strm.length();

  if (!strm.read_ulong (length))
    {
      return 0;
    }

  VERIFY_MAP(TAO_InputCDR, codebase_url_map, Codebase_URL_Map)

  char * pos = strm.rd_ptr();

  // 'length' may not be the codebase url length - it could be the
  // FFFFFFF indirection marker instead. If it is an indirection marker, we
  // get the offset following the indirection marker, otherwise we can follow
  // the same logic using the offset to simply rewind to the start of length
  // and re-read the length as part of the string
  if (TAO_OBV_GIOP_Flags::is_indirection_tag (length))
    {
      return _tao_unmarshal_codebase_url_indirection (strm, codebase_url);
    }

  pos -= sizeof (CORBA::ULong);

  // Cribbed from tc_demarshal_indirection in Typecode_CDR_Extraction.cpp
  TAO_InputCDR url_stream (pos,
                          buffer_size,
                          strm.byte_order ());

  if (!url_stream.good_bit ())
    {
      return 0;
    }

  if (! url_stream.read_string (codebase_url))
    return 0;

  // It's possible the codebase url is read again from an indirection stream,
  // so make sure the codebase url is the same.
  ACE_CString mapped_url;
  if (strm.get_codebase_url_map ()->get()->find (pos, mapped_url) == 0)
  {
    if (TAO_debug_level > 0)
    {
      ACE_DEBUG ((LM_DEBUG,
        ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_read_codebase_url, found %X - %C\n"),
        pos, mapped_url.c_str ()));
    }
    if (ACE_OS::strcmp (mapped_url.c_str (), codebase_url.c_str ()) != 0)
      throw CORBA::INTERNAL ();
  }
  else if (strm.get_codebase_url_map ()->get()->bind (pos, codebase_url) != 0)
  {
    throw CORBA::INTERNAL ();
  }
  else
  {
    if (TAO_debug_level > 0)
    {
      ACE_DEBUG ((LM_DEBUG,
        ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_read_codebase_url, bound %X - %C\n"),
        pos, codebase_url.c_str ()));
    }
  }

  // Since the codebase url is always read from the indirection cdr we have to skip
  // the main CDR forward if we were in fact reading from the current
  // location and not rewinding back some offset.

  strm.skip_bytes (length);

  return 1;
}

CORBA::Boolean CORBA::ValueBase::_tao_read_repository_id ( TAO_InputCDR strm,
ACE_CString id 
) [static, private]

Read a single repository id from the CDR input stream, accounting for indirection.

Definition at line 1122 of file ValueBase.cpp.

{
  CORBA::ULong length = 0;

  size_t buffer_size = strm.length();

  if (!strm.read_ulong (length))
    {
      return 0;
    }

  VERIFY_MAP(TAO_InputCDR, repo_id_map, Repo_Id_Map)

  if (strm.get_repo_id_map ().is_nil ())
    throw CORBA::INTERNAL ();

  char * pos = strm.rd_ptr();

  // 'length' may not be the repo id length - it could be the
  // FFFFFFF indirection marker instead. If it is an indirection marker, we
  // get the offset following the indirection marker, otherwise we can follow
  // the same logic using the offset to simply rewind to the start of length
  // and re-read the length as part of the string
  if (TAO_OBV_GIOP_Flags::is_indirection_tag (length))
    {
      return _tao_unmarshal_repo_id_indirection (strm, id);
    }

  pos -= sizeof (CORBA::ULong);

  // Cribbed from tc_demarshal_indirection in Typecode_CDR_Extraction.cpp
  TAO_InputCDR id_stream (pos,
                          buffer_size,
                          strm.byte_order ());

  if (!id_stream.good_bit ())
    {
      return 0;
    }

  if (! id_stream.read_string (id))
    return 0;

  // It's possible the id is read again from an indirection stream,
  // so make sure the id is the same.
  ACE_CString mapped_id;
  if (strm.get_repo_id_map ()->get()->find (pos, mapped_id) == 0)
  {
    if (TAO_debug_level > 0)
    {
      ACE_DEBUG ((LM_DEBUG,
        ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_read_repository_id, found %X - %C\n"),
        pos, mapped_id.c_str ()));
    }

    if (ACE_OS::strcmp (mapped_id.c_str (), id.c_str ()) != 0)
      throw CORBA::INTERNAL ();
  }
  else if (strm.get_repo_id_map ()->get ()->bind (pos, id) != 0)
  {
    throw CORBA::INTERNAL ();
  }
  else if (TAO_debug_level > 0)
  {
    ACE_DEBUG ((LM_DEBUG,
      ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_read_repository_id, bound %X - %C\n"),
      pos, id.c_str ()));
  }

  // Since the ID is always read from the indirection cdr we have to skip
  // the main CDR forward if we were in fact reading from the current
  // location and not rewinding back some offset.

  strm.skip_bytes (length);

  return 1;
}

CORBA::Boolean CORBA::ValueBase::_tao_read_repository_id_list ( TAO_InputCDR strm,
Repository_Id_List ids 
) [static, private]

Read a list of repository ids from the CDR input stream, accounting for indirection

Definition at line 1090 of file ValueBase.cpp.

{
  CORBA::Long num_ids = 0;

  if (!strm.read_long (num_ids))
    {
      return 0;
    }

  if (num_ids == TAO_OBV_GIOP_Flags::Indirection_tag)
    {
      // Multiple repo id is not indirected.
      return 0;
    }
  else
    {
      for (CORBA::Long i = 0; i < num_ids; ++i)
        {
          ACE_CString id;
          if (!_tao_read_repository_id (strm, id))
            {
              return 0;
            }
          ids.push_back (id);
        }
    }

  return 1;
}

virtual CORBA::TypeCode_ptr CORBA::ValueBase::_tao_type ( void   )  const [pure virtual]
CORBA::Boolean CORBA::ValueBase::_tao_unmarshal ( TAO_InputCDR strm,
CORBA::ValueBase *&  new_object 
) [static]

Unmarshal a valuetype, if formal type is a pointer to ValueBase

Definition at line 166 of file ValueBase.cpp.

{
  // This is for the special case only that one unmarshals in order
  // to assign the newly created object directly to a ValueBase pointer.
  // Implementation is like a specialized one (in TC.cpp, if T.idl is source).
  // basically do:
  //  ValueBase::_tao_unmarshal_pre ()
  //    (Gets factory or possible a null or an existing object.
  //     Then the job is done. On an existing (backreferenced) object
  //     do a cast and a type check)
  //  new_object = factory->create_for_unmarshal ()
  //     (with apropriate cast)
  //  new_object->_tao_unmarshal_v ()
  //  new_object->_tao_unmarshal_post ()

  CORBA::Boolean is_null_object = false;
  CORBA::Boolean is_indirected = false;
  CORBA::Boolean const retval =
    CORBA::ValueBase::_tao_unmarshal_pre (strm,
                                          new_object,
                                          0,
                                          is_null_object,
                                          is_indirected);

  if (!retval)
    {
      return false;
    }

  if (is_null_object || is_indirected)
  {
    return true;
  }

  // In this case, the codebase url and repo id is read,
  // so continue unmarshal values.
  if (new_object && ! new_object->_tao_unmarshal_v (strm))
    {
      return false;
    }

  return retval;
}

CORBA::Boolean CORBA::ValueBase::_tao_unmarshal_codebase_url_indirection ( TAO_InputCDR strm,
ACE_CString codebase_url 
) [static, private]

Definition at line 585 of file ValueBase.cpp.

{
  CORBA::Long offset = 0;
  if (!strm.read_long (offset) ||  offset >= 0)
  {
    return false;
  }

  void* pos = strm.rd_ptr () + offset - sizeof (CORBA::Long);

  if (strm.get_codebase_url_map()->get()->find (pos, codebase_url) != 0)
    {
      throw CORBA::INTERNAL ();
    }
  else if (TAO_debug_level > 0)
    {
      ACE_DEBUG ((LM_DEBUG,
        ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_unmarshal_codebase_url_indirection, found %X - %C\n"),
        pos, codebase_url.c_str ()));
    }

  return 1;
}

CORBA::Boolean CORBA::ValueBase::_tao_unmarshal_post ( TAO_InputCDR strm  ) 

Definition at line 396 of file ValueBase.cpp.

{
  // (... called from T::_tao_unmarshal)
  // 7. if (chunking) check the last blocksize tag for correct value.  +++
  //    And if we're gonna to truncate, skip all the state of the more
  //    derived classes. (But it might need to be accessed again,
  //    if there are embedded objects which are referenced later
  //    in this CDR encoding stream.)

  // 8. if (chunking) there must be some end tag. Let the CDR stream deal
  //    with this (and decrease the nesting level of valuetypes).
  //    Also the CDR stream must check for eventually outstanding end tags
  //    at the end of the stream which have to cause a marshal
  //    exception there.

  return true;
}

CORBA::Boolean CORBA::ValueBase::_tao_unmarshal_pre ( TAO_InputCDR strm,
CORBA::ValueBase *&  valuetype,
const char *const   repo_id,
CORBA::Boolean is_null_object,
CORBA::Boolean is_indirected 
) [static]

Both used internally and are called from T::_tao_unmarshal ().

Definition at line 213 of file ValueBase.cpp.

{
  void* pos = strm.rd_ptr();

  // Value factories are reference counted.  When we get a new value
  // factory from the ORB, its reference count is increased.
  CORBA::ValueFactory_var factory;

  // %! yet much to do ... look for +++ !

  // 1. Get the <value-tag> (else it may be <indirection-tag> or <null-ref>).
  //    Is object yet unmarshalled (<indirection-tag> is set) ? (->1a)
  //    Is <null-ref> given ? Set 0 and return ok.
  // 1a. Lookup the real address in memory, which should be aligned +++
  //     to CORBA::ValueBase. Its possible at this point that worse
  //     type mismatch gets by undetected, if the CDR stream fakes.
  //     So the type should be checked ... +++

  // 2. Now at this point it must be a <value-tag> (error else).
  //    if (chunking) check that any last chunk ends with matching
  //    size. If not raise marshal exception.
  //    Increase the nesting level of valuetypes.

  // 3. if (chunking) read and record the blocksize-tag.

  // 4. Unmarshal type information and lookup factory.
  //    If no type information is given in the CDR encoding, as told
  //    from the <value-tag>, then use the repository id parameter
  //    (it _must_ be right).

  CORBA::Long valuetag;
  Repository_Id_List ids;
  ACE_CString codebase_url;

  is_indirected = false;
  is_null_object = false;

  if (! strm.read_long (valuetag))
    {
      return false;
    }

  if (TAO_OBV_GIOP_Flags::is_indirection_tag (valuetag))
    {
      is_indirected = true;

      // value is redirected
      return _tao_unmarshal_value_indirection (strm, valuetype);
    }

  if (TAO_OBV_GIOP_Flags::is_null_ref (valuetag))
    {
      // null reference is unmarshalled.
      valuetype = 0;
      is_null_object = true;
      return true;
    }

  if (TAO_OBV_GIOP_Flags::has_codebase_url (valuetag))
    {
      ACE_CString codebase_url;
      if (! _tao_read_codebase_url (strm, codebase_url))
        {
          return false;
        }
    }

  if (TAO_OBV_GIOP_Flags::has_single_type_info (valuetag))
    {
      ACE_CString id;
      if (! _tao_read_repository_id(strm, id))
        {
          return false;
        }

      ids.push_back (id);
    }
  else if (TAO_OBV_GIOP_Flags::has_list_type_info (valuetag))
    {
      if (! _tao_read_repository_id_list(strm, ids))
        {
          return false;
        }
    }
  else if (TAO_OBV_GIOP_Flags::has_no_type_info (valuetag))
    {
      ids.push_back (repo_id);
    }
  else
    {
      if (TAO_debug_level > 0)
        {
          ACE_ERROR ((LM_ERROR,
                      ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_unmarshal_pre, ")
                      ACE_TEXT ("unknown value tag: %x\n"),
                      valuetag));
        }

      return 0;
    }

  TAO_ORB_Core *orb_core = strm.orb_core ();

  if (orb_core == 0)
    {
      orb_core = TAO_ORB_Core_instance ();

      if (TAO_debug_level > 0)
        {
          ACE_DEBUG ((LM_WARNING,
                      ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_unmarshal_pre, ")
                      ACE_TEXT ("WARNING: extracting valuetype using ")
                      ACE_TEXT ("default ORB_Core\n")));
        }
    }

  CORBA::Boolean require_truncation = false;
  CORBA::Boolean const chunking =
    TAO_OBV_GIOP_Flags::is_chunked (valuetag);
  CORBA::ULong const num_ids = ids.size ();

  // Find the registered factory for this unmarshalling valuetype. If any
  // factory for the valuetype in its truncatable derivation hierarchy
  // is registered, the factory is used to create value for unmarshalling.
  for (CORBA::ULong i = 0; i < num_ids; ++i)
    {
      factory = orb_core->orb ()->lookup_value_factory (ids[i].c_str ());

      if (factory.in() != 0)
        {
          if (i != 0 && chunking)
            {
              require_truncation = true;
            }
          break;
        }
    }

  if (factory.in() == 0)
    {
      if (TAO_debug_level > 0)
        {
          ACE_ERROR ((LM_ERROR,
                      ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_unmarshal_pre, ")
                      ACE_TEXT ("OBV factory is null, id = %C\n"),
                      repo_id));
        }

      throw ::CORBA::MARSHAL (CORBA::OMGVMCID | 1, CORBA::COMPLETED_MAYBE);
    }

  valuetype = factory->create_for_unmarshal ();

  if (require_truncation)
    {
      valuetype->truncation_hook ();
    }

  if (valuetype == 0)
    {
      return 0;  // %! except.?
    }

  valuetype->chunking_ = chunking;

  VERIFY_MAP(TAO_InputCDR, value_map, Value_Map)

  if (strm.get_value_map ()->get()->bind (pos, valuetype ) != 0)
      throw CORBA::INTERNAL ();
  else if (TAO_debug_level > 0)
  {
    ACE_DEBUG ((LM_DEBUG,
      ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_unmarshal_pre, bound value %X - %X\n"),
      pos, valuetype));
  }
  return true;
}

CORBA::Boolean CORBA::ValueBase::_tao_unmarshal_repo_id_indirection ( TAO_InputCDR strm,
ACE_CString repo_id 
) [static, private]

Definition at line 560 of file ValueBase.cpp.

{
  CORBA::Long offset = 0;
  if (!strm.read_long (offset) ||  offset >= 0)
  {
    return false;
  }

  void* pos = strm.rd_ptr () + offset - sizeof (CORBA::Long);
  if (strm.get_repo_id_map()->get()->find (pos, id) != 0)
    {
      throw CORBA::INTERNAL ();
    }
  else if (TAO_debug_level > 0)
    {
      ACE_DEBUG ((LM_DEBUG,
        ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_unmarshal_repo_id_indirection, found %X - %C\n"),
        pos, id.c_str ()));
    }

  return 1;
}

virtual CORBA::Boolean CORBA::ValueBase::_tao_unmarshal_v ( TAO_InputCDR  )  [pure virtual]

Called after obtaining the fresh object from create_for_unmarshal ().

Implemented in TAO_AMH_DSI_Exception_Holder.

CORBA::Boolean CORBA::ValueBase::_tao_unmarshal_value_indirection ( TAO_InputCDR strm,
CORBA::ValueBase *&  value 
) [static, private]

Definition at line 518 of file ValueBase.cpp.

{
  if (strm.get_value_map().is_nil ())
    throw CORBA::INTERNAL ();

  CORBA::Long offset = 0;
  if (!strm.read_long (offset) ||  offset >= 0)
  {
    return 0;
  }

  void* pos = strm.rd_ptr () + offset - sizeof (CORBA::Long);

  if (TAO_debug_level > 9)
    {
      ACE_DEBUG ((LM_DEBUG,
        ACE_TEXT ("TAO (%P|%t) ValueBase::_tao_unmarshal_value_indirection, pos %X \n"), pos));
      TAO_InputCDR::Value_Map* map = strm.get_value_map()->get ();
      for (TAO_InputCDR::Value_Map::ITERATOR it = map->begin (); it != map->end (); ++ it)
        {
          ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) ValueBase::_tao_unmarshal_value_indirection, %X - %X \n"), it->ext_id_, it->int_id_));
        }
    }
  void * v = 0;
  if (strm.get_value_map()->get()->find (pos, v) != 0)
    {
      throw CORBA::INTERNAL ();
    }
  else if (TAO_debug_level > 0)
    {
      ACE_DEBUG ((LM_DEBUG,
        ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_unmarshal_value_indirection, found %X - %X\n"),
        pos,v));
    }

  value = reinterpret_cast<CORBA::ValueBase *>(v);
  return true;
}

CORBA::Boolean CORBA::ValueBase::_tao_unmarshal_value_indirection_pre ( TAO_InputCDR strm,
TAO_InputCDR indirected_strm 
) [static, private]

Definition at line 496 of file ValueBase.cpp.

{
  CORBA::Long offset = 0;
  if (!strm.read_long (offset) ||  offset >= 0)
    {
      return false;
    }

  size_t const buffer_size = -(offset) + sizeof (CORBA::Long);
  // Cribbed from tc_demarshal_indirection in Typecode_CDR_Extraction.cpp
  indirected_strm = TAO_InputCDR (strm.rd_ptr () + offset - sizeof (CORBA::Long),
    buffer_size,
    strm.byte_order ());

  indirected_strm.set_repo_id_map (strm.get_repo_id_map ());
  indirected_strm.set_codebase_url_map (strm.get_codebase_url_map ());
  indirected_strm.set_value_map (strm.get_value_map ());
  return indirected_strm.good_bit ();
}

CORBA::Boolean CORBA::ValueBase::_tao_validate_box_type ( TAO_InputCDR strm,
TAO_InputCDR indirected_strm,
const char *const   repo_id_expected,
CORBA::Boolean null_object,
CORBA::Boolean is_indirected 
) [static]

Check repository id for value box type against what is in the CDR stream.

Definition at line 416 of file ValueBase.cpp.

{
  CORBA::Long value_tag;
  null_object = false;
  is_indirected = false;

  if (!strm.read_long (value_tag))
    {
      return false;
    }

  if (TAO_OBV_GIOP_Flags::is_null_ref (value_tag))
    { // ok, null reference unmarshaled
      null_object = true;
      return true;
    }

  if (TAO_OBV_GIOP_Flags::is_indirection_tag (value_tag))
    {
      is_indirected = true;

      // box value is redirected.
      return _tao_unmarshal_value_indirection_pre (strm, indirected_strm);
    }

  if (!TAO_OBV_GIOP_Flags::is_value_tag (value_tag))
    {
      ACE_DEBUG ((LM_DEBUG,
                  ACE_TEXT ("TAO (%P|%t) - CORBA::ValueBase::_tao_validate_box_type, ")
                  ACE_TEXT ("not value_tag\n")));
      return false;
    }


  if (TAO_OBV_GIOP_Flags::has_codebase_url (value_tag))
    { // Demarshal the codebase url (but we won't be using it).

      ACE_CString codebase_url;
      if (! _tao_read_codebase_url (strm, codebase_url))
        {
          return false;
        }
    }

  if (TAO_OBV_GIOP_Flags::has_no_type_info (value_tag))
    {
      // No type information so assume it is the correct type.
      return true;
    }

  if (TAO_OBV_GIOP_Flags::has_single_type_info (value_tag))
    {
      // Demarshal the repository id and check if it is the expected one.
      ACE_CString id;
      if (! _tao_read_repository_id (strm, id))
        {
          return false;
        }

      if (!ACE_OS::strcmp (id.c_str(), repo_id_expected))
      {  // Repository ids matched as expected
        return true;
      }
    }

  if (TAO_OBV_GIOP_Flags::has_list_type_info (value_tag))
    {
      // Don't know how to handle a repository id list.  It does not
      // make sense for a value box anyway.
      return false;
    }

  return false;
}

CORBA::Boolean CORBA::ValueBase::_tao_write_repository_id ( TAO_OutputCDR strm,
ACE_CString id 
) [static, private]

Definition at line 799 of file ValueBase.cpp.

{
#ifdef TAO_HAS_VALUETYPE_OUT_INDIRECTION

  VERIFY_MAP(TAO_OutputCDR, repo_id_map, Repo_Id_Map)

  if (strm.get_repo_id_map().is_nil ())
    {
      throw CORBA::INTERNAL ();
    }

  char* pos = 0;
  if (strm.get_repo_id_map ()->get()->find (id, pos) == 0)
  {
    if (! strm.write_long (TAO_OBV_GIOP_Flags::Indirection_tag))
      return 0;

    CORBA::Long offset = - strm.offset (pos);

    if (TAO_debug_level > 0)
    {
      ACE_DEBUG ((LM_DEBUG,
        ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_write_repository_id,  id %C indirection %d\n"),
        id.c_str(), offset));
    }

    if (! strm.write_long (offset))
      return false;
  }
  else
  {
    if (strm.align_write_ptr (ACE_CDR::LONG_SIZE) != 0)
      {
        throw CORBA::INTERNAL ();
      }

    if (strm.get_repo_id_map ()->get ()->bind (id, strm.current()->wr_ptr ()) != 0)
      {
        throw CORBA::INTERNAL ();
      }
    else if (TAO_debug_level > 0)
      {
        ACE_DEBUG ((LM_DEBUG,
          ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_write_repository_id, bound %C - %X\n"),
          id.c_str (), strm.current()->wr_ptr ()));
      }
    if (! strm.write_string (id.c_str ()))
      return false;
  }
#else
  if (! strm.write_string (id.c_str ()))
    return 0;
#endif

  return 1;
}

CORBA::Boolean CORBA::ValueBase::_tao_write_special_value ( TAO_OutputCDR strm,
const CORBA::ValueBase value 
) [static, private]

Write some special values such as null value or indirection value.

Definition at line 632 of file ValueBase.cpp.

{
  // If the 'value' is null then write the null value to the stream.
  if (value == 0)
  {
    return strm.write_long (TAO_OBV_GIOP_Flags::Null_tag);
  }
  else
  {
#ifdef TAO_HAS_VALUETYPE_OUT_INDIRECTION
    // value indirection

    VERIFY_MAP(TAO_OutputCDR, value_map, Value_Map)

    char* pos = 0;
    if (strm.get_value_map ()->get()->find (
      reinterpret_cast<void*>(const_cast <CORBA::ValueBase *> (value)), pos) == 0)
    {
      if (TAO_debug_level > 0)
        {
          ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT ("(%P|%t)ValueBase::_tao_write_special_value found value %X - %X\n"),
            value, pos));
        }

      if (! strm.write_long (TAO_OBV_GIOP_Flags::Indirection_tag))
        {
          return false;
        }

      CORBA::Long const offset = - strm.offset (pos);
      if (TAO_debug_level > 0)
        {
          ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT ("TAO (%P|%t) - ValueBase::_tao_write_special_value value, indirection %d\n"), offset));
        }

      return strm.write_long (offset);
    }
    else {
      if (strm.align_write_ptr (ACE_CDR::LONG_SIZE) != 0)
        {
          throw CORBA::INTERNAL ();
        }
      if (strm.get_value_map ()->get()->bind (
        reinterpret_cast<void*>(const_cast <CORBA::ValueBase *> (value)),
        strm.current()->wr_ptr() ) != 0)
        {
          throw CORBA::INTERNAL ();
        }
      else if (TAO_debug_level > 0)
        {
          ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT ("(%P|%t)ValueBase::_tao_marshal bound value %X - %X \n"),
            value, strm.current()->wr_ptr()));
        }

      return false;
    }
#endif

    return false;
  }
}

CORBA::Boolean CORBA::ValueBase::_tao_write_value ( TAO_OutputCDR strm,
const CORBA::ValueBase value,
ptrdiff_t  formal_type_id 
) [static, private]

Write whole value.

Definition at line 700 of file ValueBase.cpp.

{
  if (! value->_tao_write_value_header (strm, formal_type_id))
    {
      return false;
    }

  if (! value->_tao_marshal_v (strm))
    {
      return false;
    }

  return true;
}

CORBA::Boolean CORBA::ValueBase::_tao_write_value_header ( TAO_OutputCDR strm,
ptrdiff_t  formal_type_id 
) const [private]

Write the header of the value which includes the valuetag, number of repository ids and list of repository ids.

Definition at line 719 of file ValueBase.cpp.

{
#ifdef TAO_HAS_OPTIMIZED_VALUETYPE_MARSHALING
  // this case allows TAO to avoid marshaling the typeID for values
  // where the actual type matches the formal type (ie not a derived
  // type).
  //
  // I would much prefer that there be a way to have a -ORB option to
  // control this behavior, but for now there is no reference to the
  // ORB Core available during marshaling (there is during unmarshaling)
  // and no other way to communicate such configuration values.

  CORBA::Boolean const is_formal_type =
    this->_tao_match_formal_type (formal_type_id);
#else
  // Unfortunately, all versions of tao prior to TAO 1.5.2 did not
  // support unmarshaling of valuetypes that did not explicitly
  // marshal the type id. At least it is benign to always encode the
  // typecode value, even if it can be a little verbose.
  CORBA::Boolean const is_formal_type = 0;
  ACE_UNUSED_ARG (formal_type_id);
#endif /* TAO_HAS_OPTIMIZED_VALUETYPE_MARSHALING */

  // Get the list of repository ids for this valuetype.
  Repository_Id_List repository_ids;
  this->_tao_obv_truncatable_repo_ids (repository_ids);
  CORBA::Long const num_ids =
    static_cast <CORBA::Long> (repository_ids.size ());

  // Build <value-tag>, which states if chunking is used
  // and if type information ((list of) repository id(s))
  // is provided. The latter is necessary if the formal_type_id
  // is unequal the 'true derived' type of this object.
  CORBA::Long valuetag = TAO_OBV_GIOP_Flags::Value_tag_base;

  // Truncatable value type, must use chunking and list all repository
  // ids in its "truncatable" derivation hierarchy.
  if (this->is_truncatable_ || this->chunking_)
    valuetag |= TAO_OBV_GIOP_Flags::Chunking_tag_sigbits;

  if (!is_formal_type || this->is_truncatable_)
    valuetag |= TAO_OBV_GIOP_Flags::Type_info_single;

  if (num_ids > 1)
    {
      valuetag |= TAO_OBV_GIOP_Flags::Type_info_list;
    }

  if (! strm.write_long (valuetag)                    // Write <value-tag>.
      || (num_ids > 1 && !strm.write_long (num_ids))) // Write <num-ids>.
    {
      return false;
    }

#ifndef TAO_HAS_OPTIMIMIZED_VALUETYPE_MARSHALING
  if (this->is_truncatable_
      || !is_formal_type  /* Always evaluates to 1 in the
                             !TAO_HAS_OPTIMIMIZED_VALUETYPE_MARSHALING
                             case */
      || num_ids > 1)
    {
#endif  /* !TAO_HAS_OPTIMIMIZED_VALUETYPE_MARSHALING */
      // Marshal type information.
      for (CORBA::Long i = 0; i < num_ids; ++i )
        {
          if (! _tao_write_repository_id (strm, repository_ids[i]))
            {
              return false;
            }
        }
#ifndef TAO_HAS_OPTIMIMIZED_VALUETYPE_MARSHALING
    }
#endif  /* !TAO_HAS_OPTIMIMIZED_VALUETYPE_MARSHALING */

  return true;
}

ValueBase& CORBA::ValueBase::operator= ( const ValueBase  )  [private]
void CORBA::ValueBase::truncation_hook (  )  [virtual]

Notify the truncated parent valuetype to skip the rest of the chunks when unmarshalling a value from its derived valuetype. This is called when the factory for the most derived valuetype (in the repository id list) does not exist and a truncated parent factory is registered.

Definition at line 1283 of file ValueBase.cpp.

{
  throw ::CORBA::INTERNAL ();
}


Friends And Related Function Documentation

friend class TAO_ChunkInfo [friend]

Definition at line 127 of file ValueBase.h.


Member Data Documentation

This flag is set to be true when marshalling uses chunking. According to spec, the truncatable valuetype should use chunking and it can be used for marshalling large valuetype. In current implementation, we just use chunking for the truncatable valuetype.

Definition at line 234 of file ValueBase.h.

This flag is set to be true when the valuetype defined in the idl has the truncatable parent.

Definition at line 228 of file ValueBase.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines