openfoam/applications/utilities/preProcessing/FoamX/C++/FoamXLib/NameServer.C
2008-04-15 18:56:58 +01:00

1228 lines
32 KiB
C

/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
// Foam header files
#include "IFstream.H"
#include "OSspecific.H"
// FoamX header files.
#include "FoamX.H"
#include "FoamXErrors.H"
#include "NameServer.H"
#include "LogManager.H"
#include "LogEntry.H"
#include "Paths.H"
#include "Pstream.H"
// Declare all the namespaces used by FoamX
#include "FoamXNameSpaces.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
FoamX::NameServer::NameServer()
:
connected_(false)
{}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
FoamX::NameServer::NameServer(CORBA::ORB_ptr pOrb)
:
connected_(false)
{
connect(pOrb);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
FoamX::NameServer::~NameServer()
{
disconnect();
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void FoamX::NameServer::connect(CORBA::ORB_ptr pOrb)
{
static const char* functionName =
"FoamX::NameServer::connect(CORBA::ORB_ptr pOrb)";
LogEntry log(functionName, __FILE__, __LINE__);
try
{
if (connected_ || !CORBA::is_nil(rootContext_))
{
throw FoamXError
(
E_FAIL,
"Name server already connected.",
functionName,
__FILE__, __LINE__
);
}
// Try to connect to the name server using the
// resolve_initial_references call provided by the ORB.
// Different ORB vendors implement the way in which their ORB obtains
// initial references in different ways (way to go OMG boys, an
// inspired design decision!).
// Therefore, we cannot rely on this call working and may have to fall
// back on the tried and trusted method of retrieving the name service
// IOR from a file written to a common location. Since the MICO name
// server reference cannot be obtained from JAVA in any other way,
// we have to write this file anyway. MICO C++ servers can specify the
// location of the name server by using the
// "-ORBNamingAddr inet:hostname:portno" command line argument
// in which case the resolve_initial_references will work.
CORBA::Object_var initServ;
try
{
// Obtain a reference to the root context of the Name service
// through the given Orb.
// Attach to reference.
initServ = pOrb->resolve_initial_references("NameService");
log << "Obtained NameService reference from Orb command line"
<< " arguments" << endl;
}
catch (...)
{
// If the resolve_initial_references call failed, try and open
// the name service reference written to the FoamX system directory.
if (CORBA::is_nil(initServ))
{
// See if the name service reference file exists.
fileName nsRefFile = Paths::tmp/"ns.ref";
if (!exists(nsRefFile))
{
throw FoamXError
(
E_FAIL,
"Failed to resolve NameService root context reference.",
functionName,
__FILE__, __LINE__
);
}
// Extract IOR from the file.
log << "Reading name service reference file '"
<< nsRefFile << "'." << endl;
word ior((IFstream(nsRefFile)()));
initServ = pOrb->string_to_object(ior.c_str());
}
}
// If we still haven't got a name server reference, throw an exception.
if (CORBA::is_nil(initServ))
{
throw FoamXError
(
E_FAIL,
"Failed to resolve NameService root context reference.",
functionName,
__FILE__, __LINE__
);
}
// call to a CosNaming::NamingContext object.
// Attach to reference.
rootContext_ = CosNaming::NamingContext::_narrow(initServ);
if (CORBA::is_nil(rootContext_))
{
throw FoamXError
(
E_FAIL,
"Failed to narrow NameService root context reference.",
functionName,
__FILE__, __LINE__
);
}
// Set connected flag.
connected_ = true;
}
catch (CORBA::ORB::InvalidName& ex)
{
throw FoamXError
(
E_FAIL,
"Caught CORBA::ORB::InvalidName exception in connect : "
"Service required is invalid [does not exist].",
functionName,
__FILE__, __LINE__
);
}
catch (CORBA::COMM_FAILURE& ex)
{
throw FoamXError
(
E_FAIL,
"Caught CORBA::COMM_FAILURE exception in connect : "
"Unable to contact name server.",
functionName,
__FILE__, __LINE__
);
}
catch (CORBA::NO_RESOURCES& ex)
{
throw FoamXError
(
E_FAIL,
"Caught CORBA::NO_RESOURCES exception in connect : "
"Unable to contact name server.",
functionName,
__FILE__, __LINE__
);
}
catch (CORBA::SystemException& ex)
{
throw FoamXError
(
E_FAIL,
"Caught CORBA::SystemException exception in connect : "
"Unable to contact name server.",
functionName,
__FILE__, __LINE__
);
}
catch (...)
{
throw FoamXError
(
E_UNEXPECTED,
"Unexpected error",
functionName,
__FILE__, __LINE__
);
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void FoamX::NameServer::disconnect()
{
static const char* functionName =
"FoamX::NameServer::disconnect()";
LogEntry log(functionName, __FILE__, __LINE__);
if (connected_)
{
// Dicsonnect from the root context and reset the connected flag.
rootContext_ = CosNaming::NamingContext::_nil();
connected_ = false;
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void FoamX::NameServer::createContext
(
const fileName& path,
bool failAlreadyBound
)
{
static const char* functionName =
"FoamX::NameServer::createContext"
"(const fileName& path, bool failAlreadyBound)";
LogEntry log(functionName, __FILE__, __LINE__);
try
{
if (!connected_ || CORBA::is_nil(rootContext_))
{
throw FoamXError
(
E_FAIL,
"Name server not connected.",
functionName,
__FILE__, __LINE__
);
}
// Construct a CosNaming::Name from the given path string.
CosNaming::Name cosName;
createNameFromString(path, cosName);
// Call bind_new_context on the root context.
// Attach to reference.
CosNaming::NamingContext_var context =
rootContext_->bind_new_context(cosName);
}
catch (CosNaming::NamingContext::AlreadyBound)
{
// Raise an exception only if required.
if (failAlreadyBound)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::AlreadyBound exception.",
functionName,
__FILE__, __LINE__
);
}
}
catch (CosNaming::NamingContext::NotFound& ex)
{
string msg = "CosNaming::NamingContext::NotFound Exception : ";
if (ex.why == CosNaming::NamingContext::missing_node)
{
msg += "Missing Node.";
}
else if (ex.why == CosNaming::NamingContext::not_context)
{
msg += "Not Context.";
}
else if (ex.why == CosNaming::NamingContext::not_object)
{
msg += "Not Object.";
}
throw FoamXError
(
E_FAIL,
msg,
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::InvalidName)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::InvalidName exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::NotEmpty)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::NotEmpty exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::CannotProceed)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::CannotProceed exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CORBA::COMM_FAILURE)
{
throw FoamXError
(
E_FAIL,
"Caught a CORBA::COMM_FAILURE exception.",
functionName,
__FILE__, __LINE__
);
}
catch (...)
{
throw FoamXError
(
E_FAIL,
"Unexpected error.",
functionName,
__FILE__, __LINE__
);
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void FoamX::NameServer::createContexts
(
const fileName& path,
bool failAlreadyBound
)
{
static const char* functionName =
"FoamX::NameServer::createContext"
"(const fileName& path, bool failAlreadyBound)";
LogEntry log(functionName, __FILE__, __LINE__);
// Pass errors through
wordList components = path.components();
fileName dir = "";
forAll(components, compI)
{
if (compI == 0)
{
dir = components[compI];
}
else
{
dir = dir/components[compI];
}
createContext(dir, failAlreadyBound);
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void FoamX::NameServer::removeContext(const fileName& path)
{
static const char* functionName =
"FoamX::NameServer::removeContext(const fileName& path)";
LogEntry log(functionName, __FILE__, __LINE__);
try
{
if (!connected_ || CORBA::is_nil(rootContext_))
{
throw FoamXError
(
E_FAIL,
"Name server not connected.",
functionName,
__FILE__, __LINE__
);
}
// Construct a CosNaming::Name from the given path string.
CosNaming::Name cosName;
createNameFromString(path, cosName);
// Get the specified naming context object.
CORBA::Object_var obj = rootContext_->resolve(cosName);
CosNaming::NamingContext_var context =
CosNaming::NamingContext::_narrow(obj);
if (CORBA::is_nil(context))
{
throw FoamXError
(
E_FAIL,
"Not a naming context.",
functionName,
__FILE__, __LINE__
);
}
// Destroy and unbind the specified naming context.
context->destroy();
rootContext_->unbind(cosName);
}
catch (CosNaming::NamingContext::NotFound& ex)
{
string msg = "CosNaming::NamingContext::NotFound Exception : ";
if (ex.why == CosNaming::NamingContext::missing_node)
{
msg += "Missing node.";
}
else if (ex.why == CosNaming::NamingContext::not_context)
{
msg += "Not Context.";
}
else if (ex.why == CosNaming::NamingContext::not_object)
{
msg += "Not Object.";
}
throw FoamXError
(
E_FAIL,
msg,
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::InvalidName)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::InvalidName exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::AlreadyBound)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::AlreadyBound exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::NotEmpty)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::NotEmpty exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::CannotProceed)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::CannotProceed exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CORBA::COMM_FAILURE)
{
throw FoamXError
(
E_FAIL,
"Caught a CORBA::COMM_FAILURE exception.",
functionName,
__FILE__, __LINE__
);
}
catch (...)
{
throw FoamXError
(
E_FAIL,
"Unexpected error.",
functionName,
__FILE__, __LINE__
);
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void FoamX::NameServer::removeContexts
(
const fileName& root,
const fileName& path
)
{
static const char* functionName =
"FoamX::NameServer::removeContexts"
"(const fileName& root, const fileName& path)";
LogEntry log(functionName, __FILE__, __LINE__);
fileName dir(path);
while((dir != "/") && (dir != "") && (dir != root))
{
removeContext(dir);
dir = dir.path();
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void FoamX::NameServer::bindObject
(
const fileName& name,
CORBA::Object_ptr pObject,
bool rebind
)
{
static const char* functionName =
"FoamX::NameServer::bindObject"
"(const fileName& name, CORBA::Object_ptr pObject, bool rebind)";
LogEntry log(functionName, __FILE__, __LINE__);
try
{
if (!connected_ || CORBA::is_nil(rootContext_))
{
throw FoamXError
(
E_FAIL,
"Name server not connected.",
functionName,
__FILE__, __LINE__
);
}
// Construct a CosNaming::Name from the given path string.
CosNaming::Name cosName;
createNameFromString(name, cosName);
// Bind this object to the specified name.
try
{
rootContext_->bind(cosName, pObject);
}
catch (CosNaming::NamingContext::AlreadyBound& ex)
{
if (!rebind) throw ex;
// Note: Using rebind() will overwrite any Object previously bound
// to the host context with obj.
// Alternatively, bind() can be used, which will raise a
// CosNaming::NamingContext::AlreadyBound exception if the
// name supplied is already bound to an object.
// Amendment: When using OrbixNames, it is necessary to first try
// bind and then rebind, as rebind on it's own will throw a
// NotFoundexception if the Name has not already been bound.
//[This is incorrect behaviour - it should just bind].
rootContext_->rebind(cosName, pObject);
}
}
catch (CosNaming::NamingContext::NotFound& ex)
{
string msg = "CosNaming::NamingContext::NotFound Exception : ";
if (ex.why == CosNaming::NamingContext::missing_node)
{
msg += "Missing node.";
}
else if (ex.why == CosNaming::NamingContext::not_context)
{
msg += "Not Context.";
}
else if (ex.why == CosNaming::NamingContext::not_object)
{
msg += "Not Object.";
}
throw FoamXError
(
E_FAIL,
msg,
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::InvalidName)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::InvalidName exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::AlreadyBound)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::AlreadyBound exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::NotEmpty)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::NotEmpty exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::CannotProceed)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::CannotProceed exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CORBA::COMM_FAILURE)
{
throw FoamXError
(
E_FAIL,
"Caught a CORBA::COMM_FAILURE exception.",
functionName,
__FILE__, __LINE__
);
}
catch (...)
{
throw FoamXError
(
E_FAIL,
"Unexpected error.",
functionName,
__FILE__, __LINE__
);
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void FoamX::NameServer::unbindObject(const fileName& name)
{
static const char* functionName =
"FoamX::NameServer::unbindObject(const fileName& name)";
LogEntry log(functionName, __FILE__, __LINE__);
try
{
if (!connected_ || CORBA::is_nil(rootContext_))
{
throw FoamXError
(
E_FAIL,
"Name server not connected.",
functionName,
__FILE__, __LINE__
);
}
// Construct a CosNaming::Name from the given path string.
CosNaming::Name cosName;
createNameFromString(name, cosName);
// List parent context and check that binding type is "nobject"
// before allowing unbind.
CosNaming::NamingContext_var context;
int len = cosName.length();
CORBA::String_var id = cosName[len-1].id;
CORBA::String_var kind = cosName[len-1].kind;
// Check that the parent is a naming context.
if (len> 1)
{
cosName.length(len - 1);
CORBA::Object_var obj = rootContext_->resolve(cosName);
context = CosNaming::NamingContext::_narrow(obj);
if (CORBA::is_nil(context))
{
throw FoamXError
(
E_FAIL,
"Parent is not a naming context.",
functionName,
__FILE__, __LINE__
);
}
}
else
{
context = rootContext_;
}
// Loop over all bindings in the parent context.
CosNaming::BindingIterator_var bi;
CosNaming::BindingList_var bl;
CosNaming::Binding_var b;
bool bFound = false;
context->list(0, bl, bi);
while (bi->next_one(b))
{
if
(
strcmp(b->binding_name[0].id, id ) == 0
&& strcmp(b->binding_name[0].kind, kind) == 0
)
{
if (b->binding_type == CosNaming::ncontext)
{
throw FoamXError
(
E_FAIL,
"Can't unbind a naming context.",
functionName,
__FILE__, __LINE__
);
}
// Unbind the object.
context->unbind(b->binding_name);
bFound = true;
break;
}
}
bi->destroy(); //?
if (!bFound)
{
throw FoamXError
(
E_FAIL,
"Object name could not be found.",
functionName,
__FILE__, __LINE__
);
}
}
catch (CosNaming::NamingContext::NotFound& ex)
{
string msg = "CosNaming::NamingContext::NotFound Exception : ";
if (ex.why == CosNaming::NamingContext::missing_node)
{
msg += "Missing node.";
}
else if (ex.why == CosNaming::NamingContext::not_context)
{
msg += "Not Context.";
}
else if (ex.why == CosNaming::NamingContext::not_object)
{
msg += "Not Object.";
}
throw FoamXError
(
E_FAIL,
msg,
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::InvalidName)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::InvalidName exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::AlreadyBound)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::AlreadyBound exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::NotEmpty)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::NotEmpty exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::CannotProceed)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::CannotProceed exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CORBA::COMM_FAILURE)
{
throw FoamXError
(
E_FAIL,
"Caught a CORBA::COMM_FAILURE exception.",
functionName,
__FILE__, __LINE__
);
}
catch (...)
{
throw FoamXError
(
E_FAIL,
"Unexpected error.",
functionName,
__FILE__, __LINE__
);
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
bool FoamX::NameServer::isObjectBound(const fileName& name)
{
static const char* functionName =
"FoamX::NameServer::isObjectBound(const fileName& name)";
LogEntry log(functionName, __FILE__, __LINE__);
bool objectBound = false;
try
{
if (!connected_ || CORBA::is_nil(rootContext_))
{
throw FoamXError
(
E_FAIL,
"Name server not connected.",
functionName,
__FILE__, __LINE__
);
}
// Construct a CosNaming::Name from the given path string.
CosNaming::Name cosName;
createNameFromString(name, cosName);
// List parent context and check that binding type is "nobject".
CosNaming::NamingContext_var context;
int len = cosName.length();
CORBA::String_var id = cosName[len-1].id;
CORBA::String_var kind = cosName[len-1].kind;
// Check that the parent is a naming context.
if (len> 1)
{
cosName.length(len - 1);
// Attach to reference.
CORBA::Object_var obj = rootContext_->resolve(cosName);
// Attach to reference.
context = CosNaming::NamingContext::_narrow(obj);
if (CORBA::is_nil(context))
{
throw FoamXError
(
E_FAIL,
"Parent is not a naming context.",
functionName,
__FILE__, __LINE__
);
}
}
else
{
context = rootContext_;
}
// Loop over all bindings in the parent context.
CosNaming::BindingIterator_var bi;
CosNaming::BindingList_var bl;
CosNaming::Binding_var b;
context->list(0, bl, bi);
if (bi)
{
while (bi->next_one(b))
{
if
(
strcmp(b->binding_name[0].id, id ) == 0
&& strcmp(b->binding_name[0].kind, kind) == 0
)
{
objectBound = b->binding_type == CosNaming::nobject;
break;
}
}
bi->destroy();
}
}
catch (CosNaming::NamingContext::NotFound& ex)
{
string msg = "CosNaming::NamingContext::NotFound Exception : ";
if (ex.why == CosNaming::NamingContext::missing_node)
{
// msg += "Missing node.";
// Missing node is no longer treated as an exception,
// it simply implies the object is not bound
return false;
}
else if (ex.why == CosNaming::NamingContext::not_context)
{
msg += "Not Context.";
}
else if (ex.why == CosNaming::NamingContext::not_object)
{
msg += "Not Object.";
}
throw FoamXError
(
E_FAIL,
msg,
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::InvalidName)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::InvalidName exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::AlreadyBound)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::AlreadyBound exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::NotEmpty)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::NotEmpty exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::CannotProceed)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::CannotProceed exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CORBA::COMM_FAILURE)
{
throw FoamXError
(
E_FAIL,
"Caught a CORBA::COMM_FAILURE exception.",
functionName,
__FILE__, __LINE__
);
}
catch (...)
{
/* This is commented out because if you open a FoamXCaseBrowser
close it and then reopen it this error is thrown. Really we need
to find out what exception is actually being thrown and catch it
throw FoamXError
(
E_FAIL,
"Unexpected error.",
functionName,
__FILE__, __LINE__
);
*/
return false;
}
return objectBound;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
CORBA::Object_ptr FoamX::NameServer::resolve(const fileName& name)
{
static const char* functionName =
"FoamX::NameServer::resolve(const fileName& name)";
LogEntry log(functionName, __FILE__, __LINE__);
CORBA::Object_ptr pObject = CORBA::Object::_nil();
try
{
if (!connected_ || CORBA::is_nil(rootContext_))
{
throw FoamXError
(
E_FAIL,
"Name server not connected.",
functionName,
__FILE__, __LINE__
);
}
// Construct a CosNaming::Name from the given path string.
CosNaming::Name cosName;
createNameFromString(name, cosName);
// Resolve the name and get the object reference.
// Attach to reference.
CORBA::Object_var obj = rootContext_->resolve(cosName);
// Duplicate the reference and return.
pObject = CORBA::Object::_duplicate(obj);
}
catch (CosNaming::NamingContext::NotFound& ex)
{
string msg = "CosNaming::NamingContext::NotFound Exception : ";
if (ex.why == CosNaming::NamingContext::missing_node)
{
msg += "Missing node.";
}
else if (ex.why == CosNaming::NamingContext::not_context)
{
msg += "Not Context.";
}
else if (ex.why == CosNaming::NamingContext::not_object)
{
msg += "Not Object.";
}
throw FoamXError
(
E_FAIL,
msg,
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::InvalidName)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::InvalidName exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::AlreadyBound)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::AlreadyBound exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::NotEmpty)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::NotEmpty exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CosNaming::NamingContext::CannotProceed)
{
throw FoamXError
(
E_FAIL,
"Caught a CosNaming::NamingContext::CannotProceed exception.",
functionName,
__FILE__, __LINE__
);
}
catch (CORBA::COMM_FAILURE)
{
throw FoamXError
(
E_FAIL,
"Caught a CORBA::COMM_FAILURE exception.",
functionName,
__FILE__, __LINE__
);
}
catch (...)
{
throw FoamXError
(
E_FAIL,
"Unexpected error.",
functionName,
__FILE__, __LINE__
);
}
return pObject;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// "Borrowed" from the MICO NameServerClient class.
void FoamX::NameServer::createNameFromString
(
const std::string& str,
CosNaming::Name& name
)
{
size_t pos = 0, p = 0;
CORBA::ULong num = 0;
if (str[0] == '/')
{
pos = 1;
}
do
{
p = str.find('/', pos);
num++;
std::string sub;
if (CORBA::Long(p) <0)
{
sub = str.substr(pos);
}
else
{
sub = str.substr(pos, p - pos);
}
pos = p + 1;
name.length(num);
name[num - 1].id = CORBA::string_dup(sub.c_str());
name[num - 1].kind = CORBA::string_dup("");
} while (CORBA::Long(p) >= 0);
}
// ************************************************************************* //