summaryrefslogtreecommitdiff
path: root/trunk/TAO/examples/POA/Default_Servant/File_i.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/examples/POA/Default_Servant/File_i.cpp')
-rw-r--r--trunk/TAO/examples/POA/Default_Servant/File_i.cpp239
1 files changed, 239 insertions, 0 deletions
diff --git a/trunk/TAO/examples/POA/Default_Servant/File_i.cpp b/trunk/TAO/examples/POA/Default_Servant/File_i.cpp
new file mode 100644
index 00000000000..d471e1b9ee7
--- /dev/null
+++ b/trunk/TAO/examples/POA/Default_Servant/File_i.cpp
@@ -0,0 +1,239 @@
+// $Id$
+
+//===================================================================
+//
+// = FILENAME
+// File_i.cpp
+//
+// = DESCRIPTION
+// Implementation of the File IDL module and the interfaces
+// Descriptor and System in it.
+//
+// = AUTHOR
+// Irfan Pyarali
+//
+//====================================================================
+
+#include "File_i.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_fcntl.h"
+#include "ace/OS_NS_unistd.h"
+#include "tao/PortableServer/PortableServer.h"
+
+ACE_RCSID(Default_Servant, File_i, "$Id$")
+
+// IDL File::System constructor
+FileImpl::System::System (PortableServer::POA_ptr poa)
+ : poa_ (PortableServer::POA::_duplicate (poa)),
+ // Create the Default Descriptor Servant
+ fd_servant_ (poa)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ // set the default servant of the POA
+ poa->set_servant (&this->fd_servant_ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+FileImpl::System::~System (void)
+{
+}
+
+PortableServer::POA_ptr
+FileImpl::System::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+}
+
+File::Descriptor_ptr
+FileImpl::System::open (const char *file_name,
+ CORBA::Long flags
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ File::IOError))
+{
+ // Do an ACE_OS::open
+ ACE_HANDLE file_descriptor = ACE_OS::open (file_name,
+ flags,
+ ACE_DEFAULT_FILE_PERMS);
+
+ if (file_descriptor == ACE_INVALID_HANDLE)
+ {
+ ACE_THROW_RETURN (File::IOError (), 0);
+ }
+
+ char file_descriptor_buffer[BUFSIZ];
+
+ // convert ACE_HANDLE to a string
+ ACE_OS::sprintf (file_descriptor_buffer,
+ "%ld",
+ (long int) file_descriptor);
+
+ //Create an objectID from the ACE_HANDLE string
+ PortableServer::ObjectId_var oid =
+ PortableServer::string_to_ObjectId (file_descriptor_buffer);
+
+ // create an object reference with the specified ObjectID got
+ // from ACE_HANDLE string
+ CORBA::Object_var obj =
+ this->poa_->create_reference_with_id (oid.in (),
+ "IDL:File/Descriptor:1.0"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (File::Descriptor::_nil ());
+
+ // Narrow the object reference to a File Descriptor
+ File::Descriptor_var fd =
+ File::Descriptor::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK_RETURN (File::Descriptor::_nil ());
+
+ return fd._retn ();
+}
+
+// IDL File::Descriptor constructor
+FileImpl::Descriptor::Descriptor (PortableServer::POA_ptr poa)
+ : poa_ (PortableServer::POA::_duplicate (poa))
+{
+}
+
+FileImpl::Descriptor::~Descriptor (void)
+{
+}
+
+PortableServer::POA_ptr
+FileImpl::Descriptor::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+{
+ return PortableServer::POA::_duplicate (this->poa_.in ());
+}
+
+//Extracts the ACE_HANDLE from the passed object reference
+ACE_HANDLE
+FileImpl::Descriptor::fd (ACE_ENV_SINGLE_ARG_DECL)
+{
+ //
+ // One way of getting our id.
+ //
+
+ // Get a reference to myself
+ File::Descriptor_var me = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ACE_INVALID_HANDLE);
+
+ // Get the ObjectId from the reference
+ PortableServer::ObjectId_var oid1 =
+ this->poa_->reference_to_id (me.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ACE_INVALID_HANDLE);
+
+ //
+ // Another way of getting our id.
+ //
+
+ PortableServer::ObjectId_var oid2 =
+ this->poa_->servant_to_id (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ACE_INVALID_HANDLE);
+
+ //
+ // Yet another way of getting our id.
+ //
+
+ int argc = 0;
+ CORBA::ORB_var orb = CORBA::ORB_init (argc, 0, 0 ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ACE_INVALID_HANDLE);
+
+ // Get the POA Current object reference
+ CORBA::Object_var obj =
+ orb->resolve_initial_references ("POACurrent"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ACE_INVALID_HANDLE);
+
+ // Narrow the object reference to a POA Current reference
+ PortableServer::Current_var poa_current =
+ PortableServer::Current::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ACE_INVALID_HANDLE);
+
+ PortableServer::ObjectId_var oid3 =
+ poa_current->get_object_id (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (ACE_INVALID_HANDLE);
+
+ ACE_ASSERT (oid1.in () == oid2.in ());
+ ACE_ASSERT (oid2.in () == oid3.in ());
+
+ // Convert the ObjectId to a string
+ CORBA::String_var s =
+ PortableServer::ObjectId_to_string (oid1.in ());
+
+ // Get the ACE_HANDLE from the string
+ return (ACE_HANDLE) ::atol (s.in ());
+}
+
+CORBA::Long
+FileImpl::Descriptor::write (const File::Descriptor::DataBuffer &buffer
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ File::IOError))
+{
+ ACE_HANDLE file_descriptor = this->fd (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ const CORBA::Octet *data = &buffer[0];
+
+ ssize_t len = ACE_OS::write (file_descriptor,
+ data,
+ buffer.length ());
+ if (len > 0)
+ return len;
+
+ ACE_THROW_RETURN (File::IOError (), 0);
+}
+
+File::Descriptor::DataBuffer *
+FileImpl::Descriptor::read (CORBA::Long num_bytes
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ File::IOError))
+{
+ ACE_HANDLE file_descriptor = this->fd (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Octet *buffer = File::Descriptor::DataBuffer::allocbuf (num_bytes);
+ int length = ACE_OS::read (file_descriptor, buffer, num_bytes);
+
+ if (length > 0)
+ return new File::Descriptor::DataBuffer (length,
+ length,
+ buffer,
+ 1);
+
+ File::Descriptor::DataBuffer::freebuf (buffer);
+ ACE_THROW_RETURN (File::IOError (), 0);
+}
+
+CORBA::ULong
+FileImpl::Descriptor::lseek (CORBA::ULong offset,
+ CORBA::Long whence
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ File::IOError))
+{
+ ACE_HANDLE file_descriptor = this->fd (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Long result = (CORBA::Long) ACE_OS::lseek (file_descriptor,
+ offset,
+ whence);
+ if (result == -1)
+ ACE_THROW_RETURN (File::IOError (), 0);
+
+ return (CORBA::ULong) result;
+}
+
+void
+FileImpl::Descriptor::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Get the ACE_HANDLE for this object reference
+ ACE_HANDLE file_descriptor = this->fd (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Close the file corresponding to this object reference.
+ ACE_OS::close (file_descriptor);
+}