blob: 64a5adc3e76b7a0adb745b4657002d627e84ac1b [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_cli_ure.hxx"
#include "Cli_environment.h"
#using <mscorlib.dll>
#using <cli_ure.dll>
#using <system.dll>
#include "osl/diagnose.h"
#include "cli_proxy.h"
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Proxies;
using namespace System::Collections;
using namespace System::Text;
using namespace System::Diagnostics;
using namespace System::Threading;
namespace cli_uno
{
inline System::String* Cli_environment::createKey(System::String* oid, System::Type* t)
{
return System::String::Concat(oid, t->get_FullName());
}
inline Cli_environment::Cli_environment()
{
#if OSL_DEBUG_LEVEL >= 2
_numRegisteredObjects = 0;
#endif
}
Cli_environment::~Cli_environment()
{
OSL_ENSURE(_numRegisteredObjects == 0,
"cli uno bridge: CLI environment contains unrevoked objects");
}
System::Object* Cli_environment::registerInterface(
System::Object* obj, System::String* oid)
{
#if OSL_DEBUG_LEVEL >= 1
//obj must be a transparent proxy
OSL_ASSERT(RemotingServices::IsTransparentProxy(obj));
_numRegisteredObjects ++;
#endif
OSL_ASSERT( ! m_objects->ContainsKey(oid));
m_objects->Add(oid, new WeakReference(obj));
return obj;
}
System::Object* Cli_environment::registerInterface (
System::Object* obj, System::String* oid, System::Type* type)
{
#if OSL_DEBUG_LEVEL >= 1
//obj must be a real cli object
OSL_ASSERT( ! RemotingServices::IsTransparentProxy(obj));
_numRegisteredObjects ++;
#endif
System::String* key = createKey(oid, type);
//see synchronization in map_uno2cli in cli_data.cxx
OSL_ASSERT( ! m_objects->ContainsKey(key));
m_objects->Add(key, new WeakReference(obj));
return obj;
}
void Cli_environment::revokeInterface(System::String* oid, System::Type* type)
{
System::String* key = type != NULL ? createKey(oid, type) : oid;
#if OSL_DEBUG_LEVEL >= 1
_numRegisteredObjects --;
#endif
#if OSL_DEBUG_LEVEL >= 2
int i = 1;
if (m_objects->ContainsKey(key) == false)
{
Trace::WriteLine("cli uno bridge: try to revoke unregistered interface");
Trace::WriteLine(oid);
i = 0;
}
Trace::WriteLine(System::String::Format(
new System::String(S"cli uno bridge: {0} remaining registered interfaces"),
__box(m_objects->get_Count() - 1)));
#endif
m_objects->Remove(key);
}
inline void Cli_environment::revokeInterface(System::String* oid)
{
return revokeInterface(oid, NULL);
}
System::Object* Cli_environment::getRegisteredInterface(System::String* oid,
System::Type* type)
{
//try if it is a UNO interface
System::Object* ret = NULL;
ret = m_objects->get_Item(oid);
if (! ret)
{
//try if if it is a proxy for a cli object
oid = createKey(oid, type);
ret = m_objects->get_Item( oid );
}
if (ret != 0)
{
System::WeakReference* weakIface =
static_cast< System::WeakReference * >( ret );
ret = weakIface->Target;
}
if (ret == 0)
m_objects->Remove( oid );
return ret;
}
System::String* Cli_environment::getObjectIdentifier(System::Object* obj)
{
System::String* oId= 0;
RealProxy* aProxy= RemotingServices::GetRealProxy(obj);
if (aProxy)
{
UnoInterfaceProxy* proxyImpl= dynamic_cast<UnoInterfaceProxy*>(aProxy);
if (proxyImpl)
oId= proxyImpl->getOid();
}
if (oId == 0)
{
StringBuilder * buf= new StringBuilder(256);
bool bFirst = false;
System::Threading::Monitor::Enter(__typeof(Cli_environment));
try {
buf->Append(m_IDGen->GetId(obj, & bFirst));
} __finally
{
System::Threading::Monitor::Exit(__typeof(Cli_environment));
}
buf->Append(sOidPart);
oId= buf->ToString();
}
return oId;
}
} //namespace cli_uno