/**************************************************************
 *
 * 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.
 *
 *************************************************************/



#include "uno/environment.hxx"

#include "cppu/EnvDcp.hxx"
#include "cppu/Enterable.hxx"

#include "osl/thread.h"
#include "osl/mutex.hxx"

#include <hash_map>


using namespace com::sun::star;


struct SAL_DLLPRIVATE oslThreadIdentifier_equal
{
	bool operator()(oslThreadIdentifier s1, oslThreadIdentifier s2) const;
};

bool oslThreadIdentifier_equal::operator()(oslThreadIdentifier s1, oslThreadIdentifier s2) const
{
	bool result = s1 == s2;

	return result;
}


struct SAL_DLLPRIVATE oslThreadIdentifier_hash
{
	size_t operator()(oslThreadIdentifier s1) const;
};

size_t oslThreadIdentifier_hash::operator()(oslThreadIdentifier s1) const
{
	return s1;
}

typedef ::std::hash_map<oslThreadIdentifier,
						uno_Environment *,
						oslThreadIdentifier_hash,
						oslThreadIdentifier_equal>  ThreadMap;

static osl::Mutex s_threadMap_mutex;
static ThreadMap  s_threadMap;


static rtl::OUString s_uno_envDcp(RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO));

static void s_setCurrent(uno_Environment * pEnv)
{
	oslThreadIdentifier threadId = osl_getThreadIdentifier(NULL);

	osl::MutexGuard guard(s_threadMap_mutex);
	if (pEnv)
		s_threadMap[threadId] = pEnv;
	else
	{
		ThreadMap::iterator iEnv = s_threadMap.find(threadId);
		if( iEnv != s_threadMap.end())
			s_threadMap.erase(iEnv);
	}
}

static uno_Environment * s_getCurrent(void)
{
	uno_Environment * pEnv = NULL;

	oslThreadIdentifier threadId = osl_getThreadIdentifier(NULL);

	osl::MutexGuard guard(s_threadMap_mutex);
	ThreadMap::iterator iEnv = s_threadMap.find(threadId);
	if(iEnv != s_threadMap.end())
		pEnv = iEnv->second;

	return pEnv;
}


extern "C" void SAL_CALL uno_getCurrentEnvironment(uno_Environment ** ppEnv, rtl_uString * pTypeName)
	SAL_THROW_EXTERN_C()
{
	if (*ppEnv)
	{
		(*ppEnv)->release(*ppEnv);
		*ppEnv = NULL;
	}

	rtl::OUString currPurpose;

	uno_Environment * pCurrEnv = s_getCurrent();
	if (pCurrEnv) // no environment means no purpose
		currPurpose = cppu::EnvDcp::getPurpose(pCurrEnv->pTypeName);

	if (pTypeName && rtl_uString_getLength(pTypeName))
	{
		rtl::OUString envDcp(pTypeName);
		envDcp += currPurpose;

		uno_getEnvironment(ppEnv, envDcp.pData, NULL);
	}
	else
	{
		if (pCurrEnv)
		{
			*ppEnv = pCurrEnv;
			(*ppEnv)->acquire(*ppEnv);
		}
		else
			uno_getEnvironment(ppEnv, s_uno_envDcp.pData, NULL);

	}
}

static rtl::OUString s_getPrefix(rtl::OUString const & str1, rtl::OUString const & str2)
{
	sal_Int32 nIndex1 = 0;
	sal_Int32 nIndex2 = 0;
	sal_Int32 sim = 0;

	rtl::OUString token1;
	rtl::OUString token2;

	do
	{
		token1 = str1.getToken(0, ':', nIndex1);
		token2 = str2.getToken(0, ':', nIndex2);

		if (token1.equals(token2))
			sim += token1.getLength() + 1;
	}
	while(nIndex1 == nIndex2 && nIndex1 >= 0 && token1.equals(token2));

	rtl::OUString result;

	if (sim)
		result = str1.copy(0, sim - 1);

	return result;
}

static int s_getNextEnv(uno_Environment ** ppEnv, uno_Environment * pCurrEnv, uno_Environment * pTargetEnv)
{
	int res = 0;

	rtl::OUString nextPurpose;

	rtl::OUString currPurpose;
	if (pCurrEnv)
		currPurpose = cppu::EnvDcp::getPurpose(pCurrEnv->pTypeName);

	rtl::OUString targetPurpose;
	if (pTargetEnv)
		targetPurpose = cppu::EnvDcp::getPurpose(pTargetEnv->pTypeName);

	rtl::OUString intermPurpose(s_getPrefix(currPurpose, targetPurpose));
	if (currPurpose.getLength() > intermPurpose.getLength())
	{
		sal_Int32 idx = currPurpose.lastIndexOf(':');
		nextPurpose = currPurpose.copy(0, idx);

		res = -1;
	}
	else if (intermPurpose.getLength() < targetPurpose.getLength())
	{
		sal_Int32 idx = targetPurpose.indexOf(':', intermPurpose.getLength() + 1);
		if (idx == -1)
			nextPurpose = targetPurpose;

		else
			nextPurpose = targetPurpose.copy(0, idx);

		res = 1;
	}

	if (nextPurpose.getLength())
	{
		rtl::OUString next_envDcp(s_uno_envDcp);
		next_envDcp += nextPurpose;

		uno_getEnvironment(ppEnv, next_envDcp.pData, NULL);
	}
	else
	{
		if (*ppEnv)
			(*ppEnv)->release(*ppEnv);

		*ppEnv = NULL;
	}

	return res;
}

extern "C" { static void s_pull(va_list * pParam)
{
	uno_EnvCallee * pCallee = va_arg(*pParam, uno_EnvCallee *);
    va_list       * pXparam = va_arg(*pParam, va_list *);

    pCallee(pXparam);
}}

static void s_callInto_v(uno_Environment * pEnv, uno_EnvCallee * pCallee, va_list * pParam)
{
	cppu::Enterable * pEnterable = reinterpret_cast<cppu::Enterable *>(pEnv->pReserved);
	if (pEnterable)
		pEnterable->callInto(s_pull, pCallee, pParam);

	else
		pCallee(pParam);
}

static void s_callInto(uno_Environment * pEnv, uno_EnvCallee * pCallee, ...)
{
	va_list param;

	va_start(param, pCallee);
	s_callInto_v(pEnv, pCallee, &param);
	va_end(param);
}

static void s_callOut_v(uno_Environment * pEnv, uno_EnvCallee * pCallee, va_list * pParam)
{
	cppu::Enterable * pEnterable = reinterpret_cast<cppu::Enterable *>(pEnv->pReserved);
	if (pEnterable)
		pEnterable->callOut_v(pCallee, pParam);

	else
		pCallee(pParam);
}

static void s_callOut(uno_Environment * pEnv, uno_EnvCallee * pCallee, ...)
{
	va_list param;

	va_start(param, pCallee);
	s_callOut_v(pEnv, pCallee, &param);
	va_end(param);
}

static void s_environment_invoke_v(uno_Environment *, uno_Environment *, uno_EnvCallee *, va_list *);

extern "C" { static void s_environment_invoke_vv(va_list * pParam)
{
	uno_Environment * pCurrEnv    = va_arg(*pParam, uno_Environment *);
	uno_Environment * pTargetEnv  = va_arg(*pParam, uno_Environment *);
	uno_EnvCallee   * pCallee     = va_arg(*pParam, uno_EnvCallee *);
    va_list         * pXparam     = va_arg(*pParam, va_list *);

    s_environment_invoke_v(pCurrEnv, pTargetEnv, pCallee, pXparam);
}}

static void s_environment_invoke_v(uno_Environment * pCurrEnv, uno_Environment * pTargetEnv, uno_EnvCallee * pCallee, va_list * pParam)
{
	uno_Environment * pNextEnv = NULL;
	switch(s_getNextEnv(&pNextEnv, pCurrEnv, pTargetEnv))
	{
	case -1:
		s_setCurrent(pNextEnv);
		s_callOut(pCurrEnv, s_environment_invoke_vv, pNextEnv, pTargetEnv, pCallee, pParam);
		s_setCurrent(pCurrEnv);
		break;

	case 0: {
		uno_Environment * hld = s_getCurrent();
		s_setCurrent(pCurrEnv);
		pCallee(pParam);
		s_setCurrent(hld);
	}
		break;

	case 1:
		s_setCurrent(pNextEnv);
		s_callInto(pNextEnv, s_environment_invoke_vv, pNextEnv, pTargetEnv, pCallee, pParam);
		s_setCurrent(pCurrEnv);
		break;
	}

	if (pNextEnv)
		pNextEnv->release(pNextEnv);
}

extern "C" void SAL_CALL uno_Environment_invoke_v(uno_Environment * pTargetEnv, uno_EnvCallee * pCallee, va_list * pParam)
	SAL_THROW_EXTERN_C()
{
	s_environment_invoke_v(s_getCurrent(), pTargetEnv, pCallee, pParam);
}

extern "C" void SAL_CALL uno_Environment_invoke(uno_Environment * pEnv, uno_EnvCallee * pCallee, ...)
	SAL_THROW_EXTERN_C()
{
	va_list param;

	va_start(param, pCallee);
	uno_Environment_invoke_v(pEnv, pCallee, &param);
	va_end(param);
}

extern "C" void SAL_CALL uno_Environment_enter(uno_Environment * pTargetEnv)
	SAL_THROW_EXTERN_C()
{
	uno_Environment * pNextEnv = NULL;
	uno_Environment * pCurrEnv = s_getCurrent();

	int res;
	while ( (res = s_getNextEnv(&pNextEnv, pCurrEnv, pTargetEnv)) != 0)
	{
		cppu::Enterable * pEnterable;

		switch(res)
		{
		case -1:
			pEnterable = reinterpret_cast<cppu::Enterable *>(pCurrEnv->pReserved);
			if (pEnterable)
				pEnterable->leave();
			pCurrEnv->release(pCurrEnv);
			break;

		case 1:
			pNextEnv->acquire(pNextEnv);
			pEnterable = reinterpret_cast<cppu::Enterable *>(pNextEnv->pReserved);
			if (pEnterable)
				pEnterable->enter();
			break;
		}

		s_setCurrent(pNextEnv);
		pCurrEnv = pNextEnv;
	}
}

int SAL_CALL uno_Environment_isValid(uno_Environment * pEnv, rtl_uString ** pReason)
	SAL_THROW_EXTERN_C()
{
	int result = 1;

	rtl::OUString typeName(cppu::EnvDcp::getTypeName(pEnv->pTypeName));
	if (typeName.equals(s_uno_envDcp))
	{
		cppu::Enterable * pEnterable = reinterpret_cast<cppu::Enterable *>(pEnv->pReserved);
		if (pEnterable)
			result = pEnterable->isValid((rtl::OUString *)pReason);
	}
	else
	{
		rtl::OUString envDcp(s_uno_envDcp);
		envDcp += cppu::EnvDcp::getPurpose(pEnv->pTypeName);

		uno::Environment env(envDcp);

		result = env.isValid((rtl::OUString *)pReason);
	}

	return result;
}
