summaryrefslogtreecommitdiff
path: root/TAO/tao/request.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/request.cpp')
-rw-r--r--TAO/tao/request.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/TAO/tao/request.cpp b/TAO/tao/request.cpp
new file mode 100644
index 00000000000..76ee103e23e
--- /dev/null
+++ b/TAO/tao/request.cpp
@@ -0,0 +1,122 @@
+// @(#)request.cpp 1.6 95/09/24
+// Copyright 1994-1995 by Sun Microsystems Inc.
+// All Rights Reserved
+//
+// Implementation of Dynamic Invocation Interface
+
+#include "tao/corba.h"
+
+CORBA::ULong
+CORBA_Request::AddRef (void)
+{
+ return refcount_++;
+}
+
+CORBA::ULong
+CORBA_Request::Release (void)
+{
+ {
+ ACE_ASSERT (this != 0);
+
+ if (--refcount_ != 0)
+ return refcount_;
+ }
+
+ delete this;
+ return 0;
+}
+
+// Reference counting for DII Request object
+
+void
+CORBA::release (CORBA::Request_ptr req)
+{
+ if (req)
+ req->Release ();
+}
+
+CORBA::Boolean
+CORBA::is_nil (CORBA::Request_ptr req)
+{
+ return (CORBA::Boolean) (req == 0);
+}
+
+
+// DII Request class implementation
+
+CORBA_Request::CORBA_Request (CORBA::Object_ptr obj,
+ const CORBA::Char *op,
+ CORBA::NVList_ptr args,
+ CORBA::NamedValue_ptr result,
+ CORBA::Flags flags)
+ : args_ (args),
+ result_ (result),
+ flags_ (flags),
+ refcount_ (1)
+{
+ target_ = CORBA::Object::_duplicate (obj);
+ opname_ = CORBA::string_copy (op);
+}
+
+CORBA_Request::CORBA_Request (CORBA::Object_ptr obj,
+ const CORBA::Char *op)
+ : flags_ (0),
+ refcount_ (1)
+{
+ target_ = CORBA::Object::_duplicate (obj);
+ opname_ = CORBA::string_copy (op);
+
+ args_ = new CORBA::NVList;
+ result_ = new CORBA::NamedValue;
+ result_->AddRef();
+}
+
+CORBA_Request::~CORBA_Request (void)
+{
+ assert (refcount_ == 0);
+
+ CORBA::release (this->target_);
+ CORBA::string_free ((CORBA::String) this->opname_);
+ this->opname_ = 0;
+ CORBA::release (this->args_);
+ CORBA::release (this->result_);
+}
+
+// The public DII interfaces: normal and oneway calls.
+//
+// NOTE that using DII, programmers can get the special behaviour of
+// discarding the response for normal calls. This doesn't change the
+// semantics of any OMG-IDL interface, it just streamlines control
+// flow in some exotic situations.
+
+void
+CORBA_Request::invoke (void)
+{
+ STUB_Object *stub = this->target_->_get_parent ();
+ stub->AddRef ();
+
+ stub->do_dynamic_call ((char *) opname_,
+ CORBA::B_TRUE,
+ args_,
+ result_,
+ flags_,
+ exceptions_,
+ env_);
+ stub->Release ();
+}
+
+void
+CORBA_Request::send_oneway (void)
+{
+ STUB_Object *stub = this->target_->_get_parent ();
+ stub->AddRef ();
+
+ stub->do_dynamic_call ((char *) opname_,
+ CORBA::B_TRUE,
+ args_,
+ result_,
+ flags_,
+ exceptions_,
+ env_);
+ stub->Release ();
+}