20#include <uno/environment.hxx>
21#include <uno/lbnames.h>
26#include <osl/thread.h>
27#include <osl/thread.hxx>
31#include <unordered_map>
37struct oslThreadIdentifier_equal
39 bool operator()(oslThreadIdentifier s1, oslThreadIdentifier s2)
const;
44bool oslThreadIdentifier_equal::operator()(oslThreadIdentifier s1, oslThreadIdentifier s2)
const
53struct oslThreadIdentifier_hash
55 size_t operator()(oslThreadIdentifier s1)
const;
60size_t oslThreadIdentifier_hash::operator()(oslThreadIdentifier s1)
const
65typedef std::unordered_map<oslThreadIdentifier,
67 oslThreadIdentifier_hash,
72 std::mutex s_threadMap_mutex;
78 oslThreadIdentifier threadId = osl::Thread::getCurrentIdentifier();
80 std::scoped_lock guard(s_threadMap_mutex);
83 s_threadMap[threadId] = pEnv;
87 ThreadMap::iterator iEnv = s_threadMap.find(threadId);
88 if( iEnv != s_threadMap.end())
89 s_threadMap.erase(iEnv);
97 oslThreadIdentifier threadId = osl::Thread::getCurrentIdentifier();
99 std::scoped_lock guard(s_threadMap_mutex);
100 ThreadMap::iterator iEnv = s_threadMap.find(threadId);
101 if(iEnv != s_threadMap.end())
113 (*ppEnv)->release(*ppEnv);
117 OUString currPurpose;
123 if (pTypeName && rtl_uString_getLength(pTypeName))
125 OUString envDcp = OUString::unacquired(&pTypeName) + currPurpose;
134 (*ppEnv)->acquire(*ppEnv);
138 OUString uno_envDcp(UNO_LB_UNO);
144static OUString
s_getPrefix(std::u16string_view str1, std::u16string_view str2)
146 sal_Int32 nIndex1 = 0;
147 sal_Int32 nIndex2 = 0;
150 std::u16string_view token1;
151 std::u16string_view token2;
158 if (token1 == token2)
159 sim += token1.size() + 1;
161 while(nIndex1 == nIndex2 && nIndex1 >= 0 && token1 == token2);
166 result = str1.substr(0, sim - 1);
175 std::u16string_view nextPurpose;
177 OUString currPurpose;
181 OUString targetPurpose;
185 OUString intermPurpose(
s_getPrefix(currPurpose, targetPurpose));
186 if (currPurpose.getLength() > intermPurpose.getLength())
188 sal_Int32
idx = currPurpose.lastIndexOf(
':');
189 nextPurpose = currPurpose.subView(0,
idx);
193 else if (intermPurpose.getLength() < targetPurpose.getLength())
195 sal_Int32
idx = targetPurpose.indexOf(
':', intermPurpose.getLength() + 1);
197 nextPurpose = targetPurpose;
200 nextPurpose = targetPurpose.subView(0,
idx);
205 if (!nextPurpose.empty())
207 OUString next_envDcp = OUString::Concat(UNO_LB_UNO) + nextPurpose;
213 (*ppEnv)->release(*ppEnv);
221extern "C" {
static void s_pull(va_list * pParam)
223 uno_EnvCallee * pCallee = va_arg(*pParam, uno_EnvCallee *);
224 va_list * pXparam = va_arg(*pParam, va_list *);
243 va_start(param, pCallee);
262 va_start(param, pCallee);
273 uno_EnvCallee * pCallee = va_arg(*pParam, uno_EnvCallee *);
274 va_list * pXparam = va_arg(*pParam, va_list *);
306 pNextEnv->release(pNextEnv);
320 va_start(param, pCallee);
332 while ( (res =
s_getNextEnv(&pNextEnv, pCurrEnv, pTargetEnv)) != 0)
342 pCurrEnv->release(pCurrEnv);
346 pNextEnv->acquire(pNextEnv);
368 result = pEnterable->
isValid(
reinterpret_cast<OUString *
>(pReason));
374 uno::Environment
env(envDcp);
376 result =
env.isValid(
reinterpret_cast<OUString *
>(pReason));
static void s_environment_invoke_v(uno_Environment *, uno_Environment *, uno_EnvCallee *, va_list *)
static void s_callInto_v(uno_Environment *pEnv, uno_EnvCallee *pCallee, va_list *pParam)
static void s_environment_invoke_vv(va_list *pParam)
static void s_callInto(uno_Environment *pEnv, uno_EnvCallee *pCallee,...)
void SAL_CALL uno_Environment_invoke(uno_Environment *pEnv, uno_EnvCallee *pCallee,...) SAL_THROW_EXTERN_C()
static void s_setCurrent(uno_Environment *pEnv)
static int s_getNextEnv(uno_Environment **ppEnv, uno_Environment *pCurrEnv, uno_Environment *pTargetEnv)
void SAL_CALL uno_Environment_enter(uno_Environment *pTargetEnv) SAL_THROW_EXTERN_C()
static uno_Environment * s_getCurrent()
void SAL_CALL uno_Environment_invoke_v(uno_Environment *pTargetEnv, uno_EnvCallee *pCallee, va_list *pParam) SAL_THROW_EXTERN_C()
static void s_callOut(uno_Environment *pEnv, uno_EnvCallee *pCallee,...)
static OUString s_getPrefix(std::u16string_view str1, std::u16string_view str2)
void SAL_CALL uno_getCurrentEnvironment(uno_Environment **ppEnv, rtl_uString *pTypeName) SAL_THROW_EXTERN_C()
static void s_pull(va_list *pParam)
int SAL_CALL uno_Environment_isValid(uno_Environment *pEnv, rtl_uString **pReason) SAL_THROW_EXTERN_C()
std::unordered_map< oslThreadIdentifier, uno_Environment *, oslThreadIdentifier_hash, oslThreadIdentifier_equal > ThreadMap
static void s_callOut_v(uno_Environment *pEnv, uno_EnvCallee *pCallee, va_list *pParam)
C++ wrapper for binary C Enterable (http://wiki.openoffice.org/wiki/Uno/Cpp/Spec/Environment_Stack)
void callInto(uno_EnvCallee *pCallee,...)
int isValid(rtl::OUString *pReason)
void callOut_v(uno_EnvCallee *pCallee, va_list *pParam)
struct _uno_Environment uno_Environment
void SAL_CALL uno_getEnvironment(uno_Environment **ppEnv, rtl_uString *pEnvDcp, void *pContext) SAL_THROW_EXTERN_C()
const css::uno::Reference< css::xml::crypto::XSecurityEnvironment > & env
rtl::OUString getPurpose(rtl::OUString const &rEnvDcp)
Get the purpose part of an environment descriptor.
rtl::OUString getTypeName(rtl::OUString const &rEnvDcp)
Get the OBI type part of an environment descriptor.
std::basic_string_view< charT, traits > getToken(std::basic_string_view< charT, traits > sv, charT delimiter, std::size_t &position)
#define SAL_THROW_EXTERN_C()