00001 //============================================================================= 00002 /** 00003 * @file DynAnyFactory.cpp 00004 * 00005 * $Id: DynAnyFactory.cpp 76995 2007-02-11 12:51:42Z johnnyw $ 00006 * 00007 * @author Carlos O'Ryan <coryan@uci.edu> 00008 */ 00009 //============================================================================= 00010 00011 00012 #include "tao/AnyTypeCode/AnyTypeCode_methods.h" 00013 00014 #include "tao/DynamicAny/DynAnyFactory.h" 00015 00016 #include "tao/DynamicAny/DynAny_i.h" 00017 #include "tao/DynamicAny/DynStruct_i.h" 00018 #include "tao/DynamicAny/DynSequence_i.h" 00019 #include "tao/DynamicAny/DynEnum_i.h" 00020 #include "tao/DynamicAny/DynArray_i.h" 00021 #include "tao/DynamicAny/DynUnion_i.h" 00022 #include "tao/DynamicAny/DynAnyUtils_T.h" 00023 00024 #include "ace/Auto_Ptr.h" 00025 00026 ACE_RCSID (DynamicAny, 00027 DynAnyFactory, 00028 "$Id: DynAnyFactory.cpp 76995 2007-02-11 12:51:42Z johnnyw $") 00029 00030 TAO_BEGIN_VERSIONED_NAMESPACE_DECL 00031 00032 // Constructor from typecode 00033 TAO_DynAnyFactory::TAO_DynAnyFactory (void) 00034 { 00035 } 00036 00037 DynamicAny::DynAny_ptr 00038 TAO_DynAnyFactory::create_dyn_any (const CORBA::Any & value) 00039 { 00040 return 00041 TAO::MakeDynAnyUtils::make_dyn_any_t<const CORBA::Any&> ( 00042 value._tao_get_typecode (), 00043 value); 00044 } 00045 00046 DynamicAny::DynAny_ptr 00047 TAO_DynAnyFactory::create_dyn_any_from_type_code (CORBA::TypeCode_ptr type) 00048 { 00049 // Second arg is typed in the template parameter, repeating it 00050 // this way allows cleaner template code. 00051 return 00052 TAO::MakeDynAnyUtils::make_dyn_any_t<CORBA::TypeCode_ptr> ( 00053 type, 00054 type); 00055 } 00056 00057 DynamicAny::DynAny_ptr 00058 TAO_DynAnyFactory::create_dyn_any_without_truncation ( 00059 const CORBA::Any & /* value */) 00060 { 00061 throw ::CORBA::NO_IMPLEMENT (); 00062 } 00063 00064 DynamicAny::DynAnySeq * 00065 TAO_DynAnyFactory::create_multiple_dyn_anys ( 00066 const DynamicAny::AnySeq & /* values */, 00067 ::CORBA::Boolean /* allow_truncate */) 00068 { 00069 throw ::CORBA::NO_IMPLEMENT (); 00070 } 00071 00072 DynamicAny::AnySeq * 00073 TAO_DynAnyFactory::create_multiple_anys ( 00074 const DynamicAny::DynAnySeq & /* values */) 00075 { 00076 throw ::CORBA::NO_IMPLEMENT (); 00077 } 00078 00079 // Utility function called by all the DynAny classes 00080 // to extract the TCKind of possibly aliased types. 00081 CORBA::TCKind 00082 TAO_DynAnyFactory::unalias (CORBA::TypeCode_ptr tc) 00083 { 00084 CORBA::TCKind tck = tc->kind (); 00085 00086 while (tck == CORBA::tk_alias) 00087 { 00088 CORBA::TypeCode_var temp = tc->content_type (); 00089 00090 tck = TAO_DynAnyFactory::unalias (temp.in ()); 00091 } 00092 00093 return tck; 00094 } 00095 00096 // Same as above, but returns the type code. 00097 CORBA::TypeCode_ptr 00098 TAO_DynAnyFactory::strip_alias (CORBA::TypeCode_ptr tc) 00099 { 00100 CORBA::TypeCode_var retval = CORBA::TypeCode::_duplicate (tc); 00101 CORBA::TCKind tck = retval->kind (); 00102 00103 while (tck == CORBA::tk_alias) 00104 { 00105 retval = retval->content_type (); 00106 00107 tck = retval->kind (); 00108 } 00109 00110 return retval._retn (); 00111 } 00112 00113 TAO_END_VERSIONED_NAMESPACE_DECL