summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/PSS/PSDL_Exception_Visitor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/PSS/PSDL_Exception_Visitor.cpp')
-rw-r--r--TAO/orbsvcs/PSS/PSDL_Exception_Visitor.cpp221
1 files changed, 221 insertions, 0 deletions
diff --git a/TAO/orbsvcs/PSS/PSDL_Exception_Visitor.cpp b/TAO/orbsvcs/PSS/PSDL_Exception_Visitor.cpp
new file mode 100644
index 00000000000..65932b082f1
--- /dev/null
+++ b/TAO/orbsvcs/PSS/PSDL_Exception_Visitor.cpp
@@ -0,0 +1,221 @@
+// -*- C++ -*-
+// $Id$
+
+#include "PSDL_Exception_Visitor.h"
+#include "PSDL_Stream.h"
+
+ACE_RCSID (PSS, PSDL_Exception_Visitor, "$Id$")
+
+TAO_PSDL_Exception_Visitor::TAO_PSDL_Exception_Visitor (void)
+ : exception_name_ ()
+{
+ // Constructor
+}
+
+TAO_PSDL_Exception_Visitor::~TAO_PSDL_Exception_Visitor (void)
+{
+ // Destructor
+}
+
+int
+TAO_PSDL_Exception_Visitor::visit_identifier (TAO_PSDL_Identifier *identifier)
+{
+ // Save the identifiers for future use.
+ this->identifiers_.size (this->count_ +1);
+
+ this->identifiers_ [this->count_] = identifier->value ();
+
+ // Increment the count..for future purposes.
+ ++this->count_;
+
+ return 0;
+}
+
+int
+TAO_PSDL_Exception_Visitor::visit_except_dcl (TAO_PSDL_Except_Dcl *except_dcl)
+{
+ // This is where the control first comes to this class. Set the
+ // initial size of this->identifiers_
+ this->identifiers_.size (1);
+
+ if (except_dcl->identifier ()->accept (this) == -1)
+ return -1;
+
+ // Save the exception name.
+ this->exception_name_ = this->identifiers_ [this->count_ - 1];
+
+ if (except_dcl->member_list () != 0)
+ if (except_dcl->member_list ()->accept (this) == -1)
+ return -1;
+
+ // Print the code that should go into the generated header file.
+ // @@ Update this method to get the code that should go to
+ // implementation method (as applies).
+ this->print_class_for_exception ();
+
+ return 0;
+}
+
+int
+TAO_PSDL_Exception_Visitor::visit_member_list (TAO_PSDL_Member_List *member_list)
+{
+ if (member_list->member ()->accept (this) == -1)
+ return -1;
+
+ if (member_list->member_list () != 0)
+ {
+ if (member_list->member_list ()->accept (this) == -1)
+ return -1;
+ }
+ return 0;
+}
+
+int
+TAO_PSDL_Exception_Visitor::visit_predefined_type (TAO_PSDL_Predefined_Type *predefined_type)
+{
+ if (predefined_type->type_one () != 0)
+ {
+ this->identifiers_.size (this->count_ +1);
+
+ // Save the type of the identifier.
+ this->identifiers_ [this->count_] =
+ TAO_PSDL_Scope::instance ()->convert_str (predefined_type->type_one ());
+ ++this->count_;
+ }
+ return 0;
+}
+
+void
+TAO_PSDL_Exception_Visitor::print_class_for_exception (void)
+{
+ // Get a pointer to PSDL_Stream of the stub header.
+ TAO_PSDL_Stream *ps_sh = TAO_PSDL_Scope::instance ()->get_sh ();
+
+ // Code that should be generated to the stub (idlC.h) according to
+ // the specification.
+ ps_sh->nl ();
+ ps_sh->nl ();
+
+ ACE_CString name_space =
+ TAO_PSDL_Scope::instance ()->get_name_space ();
+
+ ACE_CString interface_name =
+ TAO_PSDL_Scope::instance ()->get_interface_name ();
+
+ *ps_sh << "#if !defined (_" << name_space << "_"
+ << interface_name << "_" << this->exception_name_ << "_CH_)\n";
+ *ps_sh << "#define _" << name_space << "_" << interface_name
+ << "_" << this->exception_name_ << "_CH_\n";
+ ps_sh->nl ();
+ *ps_sh << " class " << this->exception_name_
+ << " : public CORBA::UserException\n";
+ *ps_sh << " {\n";
+
+ *ps_sh << " public:\n";
+
+ ACE_CString type;
+ for (unsigned int i = 1; i < this->count_; ++i)
+ {
+ if (this->base_type (this->identifiers_[i], type))
+ {
+ if (ACE_OS::strcmp (type.c_str (), "char *") == 0)
+ {
+ *ps_sh << " " << "TAO::String_Manager"
+ << " " << this->identifiers_[i+1]
+ << ";\n";
+ }
+ else
+ {
+ *ps_sh << " " << this->version_for_stub (type)
+ << " " << this->identifiers_[i+1]
+ << ";\n";
+ }
+ }
+ else
+ {
+ // Types defined previously in the idl.
+ *ps_sh << " ACE_NESTED_CLASS ("
+ //@@@deal << base_node_info.module_name << "::"
+ //@@@deal << base_node_info.interface_name
+ << ", " << this->identifiers_[i]
+ << ") " << this->identifiers_[i+1]
+ << ";\n";
+ }
+ ++i;
+ }
+
+ *ps_sh << " " << this->exception_name_
+ << " (void);\n";
+ *ps_sh << " " << this->exception_name_
+ << " (const " << this->exception_name_ << " &);\n";
+ *ps_sh << " ~" << this->exception_name_ << " (void);\n";
+ *ps_sh << "\n";
+ *ps_sh << " " << this->exception_name_
+ << " &operator= (const " << this->exception_name_ << " &);\n";
+ *ps_sh << "\n";
+ *ps_sh << " static void _tao_any_destructor (void*);\n";
+ *ps_sh << "\n";
+ *ps_sh << " static " << this->exception_name_
+ << " *_downcast (CORBA::Exception *);\n";
+ *ps_sh << " static CORBA::Exception *_alloc (void);\n";
+ *ps_sh << "\n";
+ *ps_sh << " virtual CORBA::Exception *_tao_duplicate (void) const;\n";
+ *ps_sh << "\n";
+ *ps_sh << " virtual void _raise (void);\n";
+ *ps_sh << "\n";
+ *ps_sh << " virtual void _tao_encode (\n";
+ *ps_sh << " TAO_OutputCDR &\n";
+ *ps_sh << "\n";
+ *ps_sh << " ) const;\n";
+ *ps_sh << " \n";
+ *ps_sh << " virtual void _tao_decode (\n";
+ *ps_sh << " TAO_InputCDR &\n";
+ *ps_sh << "\n";
+ *ps_sh << " );\n";
+ *ps_sh << " \n";
+
+ if (this->identifiers_.size () > 1)
+ {
+ *ps_sh << " " << this->exception_name_ << " (\n";
+
+ for (unsigned int i = 1; i < this->count_; ++i)
+ {
+ if (this->base_type (this->identifiers_[i], type))
+ {
+ if (ACE_OS::strcmp (type.c_str (), "char *") == 0)
+ {
+ *ps_sh << " " << "const char *"
+ << " " << this->identifiers_[i+1]
+ << ";\n";
+ }
+ else
+ {
+ *ps_sh << " " << this->version_for_stub (type)
+ << " " << this->identifiers_[i+1]
+ << ";\n";
+ }
+ }
+ else
+ {
+ // Types defined previously in the idl.
+ *ps_sh << " ACE_NESTED_CLASS ("
+ << name_space << "::" << interface_name
+ << ", " << this->identifiers_[i]
+ << ") " << this->identifiers_[i+1]
+ << ";\n";
+ }
+ ++i;
+ }
+ }
+
+ *ps_sh << " \n";
+ *ps_sh << " virtual CORBA::TypeCode_ptr _type (void) const;\n";
+ *ps_sh << " };\n";
+ *ps_sh << "\n";
+ *ps_sh << "static ::CORBA::TypeCode_ptr _tc_"
+ << this->exception_name_ << ";\n";
+ *ps_sh << " \n";
+ *ps_sh << " \n";
+ *ps_sh << "#endif /* end #if !defined */\n";
+ *ps_sh << " \n";
+}