summaryrefslogtreecommitdiff
path: root/ACE/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.cpp')
-rw-r--r--ACE/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/ACE/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.cpp b/ACE/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.cpp
new file mode 100644
index 00000000000..a5a5e4666ca
--- /dev/null
+++ b/ACE/TAO/orbsvcs/orbsvcs/LoadBalancing/LB_Component.cpp
@@ -0,0 +1,140 @@
+#include "orbsvcs/LoadBalancing/LB_Component.h"
+#include "orbsvcs/LoadBalancing/LB_ORBInitializer.h"
+
+#include "tao/ORB_Constants.h"
+#include "tao/ORBInitializer_Registry.h"
+#include "ace/OS_NS_strings.h"
+
+ACE_RCSID (LoadBalancing,
+ LB_Component,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+int
+TAO_LB_Component::init (int argc, ACE_TCHAR * argv[])
+{
+ // There must be at least six arguments.
+ if (argc < 6)
+ return -1;
+
+ // Try to optimize sequence growth by growing it once.
+ const CORBA::ULong initial_len = argc / 6; // -LBGroup group
+ // -LBTypeId type_id
+ // -LBLocation location
+
+ CORBA::StringSeq object_groups (initial_len);
+ object_groups.length (initial_len);
+
+ CORBA::StringSeq repository_ids (initial_len);
+ repository_ids.length (initial_len);
+
+ CORBA::String_var location;
+
+ CORBA::ULong len = 0;
+
+ for (int i = 0; i < argc; ++i)
+ {
+ if (ACE_OS::strcasecmp (argv[i], ACE_TEXT("-LBGroup")) == 0)
+ {
+ const CORBA::ULong j = len;
+ ++len;
+
+ ++i; // 1
+
+ object_groups.length (len);
+ object_groups[j] = CORBA::string_dup (ACE_TEXT_ALWAYS_CHAR(argv[i]));
+
+ ++i; // 2
+
+ if (ACE_OS::strcasecmp (argv[i], ACE_TEXT("-LBTypeId")) != 0)
+ return -1;
+
+ ++i; // 3
+
+ repository_ids.length (len);
+ repository_ids[j] = CORBA::string_dup (ACE_TEXT_ALWAYS_CHAR(argv[i]));
+ }
+ else if (ACE_OS::strcasecmp (argv[i], ACE_TEXT("-LBTypeId")) == 0)
+ {
+ CORBA::ULong const j = len;
+ ++len;
+
+ ++i; // 1
+
+ repository_ids.length (len);
+ repository_ids[j] = CORBA::string_dup (ACE_TEXT_ALWAYS_CHAR(argv[i]));
+
+ ++i; // 2
+
+ if (ACE_OS::strcasecmp (argv[i], ACE_TEXT("-LBGroup")) != 0)
+ return -1;
+
+ ++i; // 3
+
+ object_groups.length (len);
+ object_groups[j] = CORBA::string_dup (ACE_TEXT_ALWAYS_CHAR(argv[i]));
+ }
+ else if (ACE_OS::strcasecmp (argv[i], ACE_TEXT("-LBLocation")) == 0)
+ {
+ ++i;
+ location = CORBA::string_dup (ACE_TEXT_ALWAYS_CHAR(argv[i]));
+ }
+ }
+
+ return this->register_orb_initializer (object_groups,
+ repository_ids,
+ location.in ());
+}
+
+int
+TAO_LB_Component::fini (void)
+{
+ return 0;
+}
+
+int
+TAO_LB_Component::register_orb_initializer (
+ const CORBA::StringSeq & object_groups,
+ const CORBA::StringSeq & repository_ids,
+ const char * location)
+{
+ try
+ {
+ // Register the LB_Component ORB initializer.
+ PortableInterceptor::ORBInitializer_ptr tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_LB_ORBInitializer (object_groups,
+ repository_ids,
+ location),
+ CORBA::NO_MEMORY (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ ENOMEM),
+ CORBA::COMPLETED_NO));
+
+ PortableInterceptor::ORBInitializer_var initializer = tmp;
+
+ PortableInterceptor::register_orb_initializer (initializer.in ());
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception (
+ "Unable to register LB_Component ORB ""initializer.");
+ return -1;
+ }
+
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+ACE_STATIC_SVC_DEFINE (TAO_LB_Component,
+ ACE_TEXT ("LB_Component"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_LB_Component),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (TAO_LoadBalancing, TAO_LB_Component)