00001
00002
00003
00004 #include "PSDL_Exception_Visitor.h"
00005 #include "PSDL_Stream.h"
00006
00007 ACE_RCSID (PSS, PSDL_Exception_Visitor, "PSDL_Exception_Visitor.cpp,v 1.2 2006/04/19 10:21:13 jwillemsen Exp")
00008
00009 TAO_PSDL_Exception_Visitor::TAO_PSDL_Exception_Visitor (void)
00010 : exception_name_ ()
00011 {
00012
00013 }
00014
00015 TAO_PSDL_Exception_Visitor::~TAO_PSDL_Exception_Visitor (void)
00016 {
00017
00018 }
00019
00020 int
00021 TAO_PSDL_Exception_Visitor::visit_identifier (TAO_PSDL_Identifier *identifier)
00022 {
00023
00024 this->identifiers_.size (this->count_ +1);
00025
00026 this->identifiers_ [this->count_] = identifier->value ();
00027
00028
00029 ++this->count_;
00030
00031 return 0;
00032 }
00033
00034 int
00035 TAO_PSDL_Exception_Visitor::visit_except_dcl (TAO_PSDL_Except_Dcl *except_dcl)
00036 {
00037
00038
00039 this->identifiers_.size (1);
00040
00041 if (except_dcl->identifier ()->accept (this) == -1)
00042 return -1;
00043
00044
00045 this->exception_name_ = this->identifiers_ [this->count_ - 1];
00046
00047 if (except_dcl->member_list () != 0)
00048 if (except_dcl->member_list ()->accept (this) == -1)
00049 return -1;
00050
00051
00052
00053
00054 this->print_class_for_exception ();
00055
00056 return 0;
00057 }
00058
00059 int
00060 TAO_PSDL_Exception_Visitor::visit_member_list (TAO_PSDL_Member_List *member_list)
00061 {
00062 if (member_list->member ()->accept (this) == -1)
00063 return -1;
00064
00065 if (member_list->member_list () != 0)
00066 {
00067 if (member_list->member_list ()->accept (this) == -1)
00068 return -1;
00069 }
00070 return 0;
00071 }
00072
00073 int
00074 TAO_PSDL_Exception_Visitor::visit_predefined_type (TAO_PSDL_Predefined_Type *predefined_type)
00075 {
00076 if (predefined_type->type_one () != 0)
00077 {
00078 this->identifiers_.size (this->count_ +1);
00079
00080
00081 this->identifiers_ [this->count_] =
00082 TAO_PSDL_Scope::instance ()->convert_str (predefined_type->type_one ());
00083 ++this->count_;
00084 }
00085 return 0;
00086 }
00087
00088 void
00089 TAO_PSDL_Exception_Visitor::print_class_for_exception (void)
00090 {
00091
00092 TAO_PSDL_Stream *ps_sh = TAO_PSDL_Scope::instance ()->get_sh ();
00093
00094
00095
00096 ps_sh->nl ();
00097 ps_sh->nl ();
00098
00099 ACE_CString name_space =
00100 TAO_PSDL_Scope::instance ()->get_name_space ();
00101
00102 ACE_CString interface_name =
00103 TAO_PSDL_Scope::instance ()->get_interface_name ();
00104
00105 *ps_sh << "#if !defined (_" << name_space << "_"
00106 << interface_name << "_" << this->exception_name_ << "_CH_)\n";
00107 *ps_sh << "#define _" << name_space << "_" << interface_name
00108 << "_" << this->exception_name_ << "_CH_\n";
00109 ps_sh->nl ();
00110 *ps_sh << " class " << this->exception_name_
00111 << " : public CORBA::UserException\n";
00112 *ps_sh << " {\n";
00113
00114 *ps_sh << " public:\n";
00115
00116 ACE_CString type;
00117 for (unsigned int i = 1; i < this->count_; ++i)
00118 {
00119 if (this->base_type (this->identifiers_[i], type))
00120 {
00121 if (ACE_OS::strcmp (type.c_str (), "char *") == 0)
00122 {
00123 *ps_sh << " " << "TAO::String_Manager"
00124 << " " << this->identifiers_[i+1]
00125 << ";\n";
00126 }
00127 else
00128 {
00129 *ps_sh << " " << this->version_for_stub (type)
00130 << " " << this->identifiers_[i+1]
00131 << ";\n";
00132 }
00133 }
00134 else
00135 {
00136
00137 *ps_sh << " ACE_NESTED_CLASS ("
00138
00139
00140 << ", " << this->identifiers_[i]
00141 << ") " << this->identifiers_[i+1]
00142 << ";\n";
00143 }
00144 ++i;
00145 }
00146
00147 *ps_sh << " " << this->exception_name_
00148 << " (void);\n";
00149 *ps_sh << " " << this->exception_name_
00150 << " (const " << this->exception_name_ << " &);\n";
00151 *ps_sh << " ~" << this->exception_name_ << " (void);\n";
00152 *ps_sh << "\n";
00153 *ps_sh << " " << this->exception_name_
00154 << " &operator= (const " << this->exception_name_ << " &);\n";
00155 *ps_sh << "\n";
00156 *ps_sh << " static void _tao_any_destructor (void*);\n";
00157 *ps_sh << "\n";
00158 *ps_sh << " static " << this->exception_name_
00159 << " *_downcast (CORBA::Exception *);\n";
00160 *ps_sh << " static CORBA::Exception *_alloc (void);\n";
00161 *ps_sh << "\n";
00162 *ps_sh << " virtual CORBA::Exception *_tao_duplicate (void) const;\n";
00163 *ps_sh << "\n";
00164 *ps_sh << " virtual void _raise (void);\n";
00165 *ps_sh << "\n";
00166 *ps_sh << " virtual void _tao_encode (\n";
00167 *ps_sh << " TAO_OutputCDR &\n";
00168 *ps_sh << " ACE_ENV_ARG_DECL_NOT_USED\n";
00169 *ps_sh << " ) const;\n";
00170 *ps_sh << " \n";
00171 *ps_sh << " virtual void _tao_decode (\n";
00172 *ps_sh << " TAO_InputCDR &\n";
00173 *ps_sh << " ACE_ENV_ARG_DECL_NOT_USED\n";
00174 *ps_sh << " );\n";
00175 *ps_sh << " \n";
00176
00177 if (this->identifiers_.size () > 1)
00178 {
00179 *ps_sh << " " << this->exception_name_ << " (\n";
00180
00181 for (unsigned int i = 1; i < this->count_; ++i)
00182 {
00183 if (this->base_type (this->identifiers_[i], type))
00184 {
00185 if (ACE_OS::strcmp (type.c_str (), "char *") == 0)
00186 {
00187 *ps_sh << " " << "const char *"
00188 << " " << this->identifiers_[i+1]
00189 << ";\n";
00190 }
00191 else
00192 {
00193 *ps_sh << " " << this->version_for_stub (type)
00194 << " " << this->identifiers_[i+1]
00195 << ";\n";
00196 }
00197 }
00198 else
00199 {
00200
00201 *ps_sh << " ACE_NESTED_CLASS ("
00202 << name_space << "::" << interface_name
00203 << ", " << this->identifiers_[i]
00204 << ") " << this->identifiers_[i+1]
00205 << ";\n";
00206 }
00207 ++i;
00208 }
00209 }
00210
00211 *ps_sh << " \n";
00212 *ps_sh << " virtual CORBA::TypeCode_ptr _type (void) const;\n";
00213 *ps_sh << " };\n";
00214 *ps_sh << "\n";
00215 *ps_sh << "static ::CORBA::TypeCode_ptr _tc_"
00216 << this->exception_name_ << ";\n";
00217 *ps_sh << " \n";
00218 *ps_sh << " \n";
00219 *ps_sh << "#endif /* end #if !defined */\n";
00220 *ps_sh << " \n";
00221 }