1*129fa3d1SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*129fa3d1SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*129fa3d1SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*129fa3d1SAndrew Rist * distributed with this work for additional information
6*129fa3d1SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*129fa3d1SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*129fa3d1SAndrew Rist * "License"); you may not use this file except in compliance
9*129fa3d1SAndrew Rist * with the License. You may obtain a copy of the License at
10*129fa3d1SAndrew Rist *
11*129fa3d1SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*129fa3d1SAndrew Rist *
13*129fa3d1SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*129fa3d1SAndrew Rist * software distributed under the License is distributed on an
15*129fa3d1SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*129fa3d1SAndrew Rist * KIND, either express or implied. See the License for the
17*129fa3d1SAndrew Rist * specific language governing permissions and limitations
18*129fa3d1SAndrew Rist * under the License.
19*129fa3d1SAndrew Rist *
20*129fa3d1SAndrew Rist *************************************************************/
21*129fa3d1SAndrew Rist
22*129fa3d1SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir #include "IdentityMapping.hxx"
25cdf0e10cSrcweir
26cdf0e10cSrcweir #include "uno/mapping.h"
27cdf0e10cSrcweir #include "uno/environment.hxx"
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include "osl/interlck.h"
30cdf0e10cSrcweir
31cdf0e10cSrcweir
32cdf0e10cSrcweir using namespace ::com::sun::star;
33cdf0e10cSrcweir
34cdf0e10cSrcweir struct IdentityMapping : public uno_Mapping
35cdf0e10cSrcweir {
36cdf0e10cSrcweir sal_Int32 m_nRef;
37cdf0e10cSrcweir uno::Environment m_env;
38cdf0e10cSrcweir
39cdf0e10cSrcweir IdentityMapping(uno::Environment const & rEnv);
40cdf0e10cSrcweir };
41cdf0e10cSrcweir
42cdf0e10cSrcweir extern "C"
43cdf0e10cSrcweir {
44cdf0e10cSrcweir
s_free(uno_Mapping * pMapping)45cdf0e10cSrcweir static void SAL_CALL s_free(uno_Mapping * pMapping) SAL_THROW(())
46cdf0e10cSrcweir {
47cdf0e10cSrcweir delete static_cast<IdentityMapping *>(pMapping);
48cdf0e10cSrcweir }
49cdf0e10cSrcweir
s_acquire(uno_Mapping * pMapping)50cdf0e10cSrcweir static void SAL_CALL s_acquire(uno_Mapping * pMapping) SAL_THROW(())
51cdf0e10cSrcweir {
52cdf0e10cSrcweir static rtl::OUString s_purpose;
53cdf0e10cSrcweir
54cdf0e10cSrcweir if (1 == ::osl_incrementInterlockedCount(&static_cast<IdentityMapping *>(pMapping)->m_nRef))
55cdf0e10cSrcweir {
56cdf0e10cSrcweir uno_registerMapping(
57cdf0e10cSrcweir &pMapping,
58cdf0e10cSrcweir s_free,
59cdf0e10cSrcweir static_cast<IdentityMapping *>(pMapping)->m_env.get(),
60cdf0e10cSrcweir static_cast<IdentityMapping *>(pMapping)->m_env.get(),
61cdf0e10cSrcweir s_purpose.pData);
62cdf0e10cSrcweir }
63cdf0e10cSrcweir }
64cdf0e10cSrcweir
s_release(uno_Mapping * pMapping)65cdf0e10cSrcweir static void SAL_CALL s_release(uno_Mapping * pMapping) SAL_THROW(())
66cdf0e10cSrcweir {
67cdf0e10cSrcweir if (!::osl_decrementInterlockedCount(&static_cast<IdentityMapping *>(pMapping )->m_nRef))
68cdf0e10cSrcweir uno_revokeMapping(pMapping);
69cdf0e10cSrcweir }
70cdf0e10cSrcweir
s_mapInterface(uno_Mapping * pMapping,void ** ppOut,void * pInterface,struct _typelib_InterfaceTypeDescription *)71cdf0e10cSrcweir static void SAL_CALL s_mapInterface(uno_Mapping * pMapping,
72cdf0e10cSrcweir void ** ppOut,
73cdf0e10cSrcweir void * pInterface,
74cdf0e10cSrcweir struct _typelib_InterfaceTypeDescription * /*pInterfaceTypeDescr*/)
75cdf0e10cSrcweir SAL_THROW(())
76cdf0e10cSrcweir {
77cdf0e10cSrcweir *ppOut = pInterface;
78cdf0e10cSrcweir
79cdf0e10cSrcweir if (pInterface)
80cdf0e10cSrcweir {
81cdf0e10cSrcweir IdentityMapping * that = static_cast<IdentityMapping *>(pMapping);
82cdf0e10cSrcweir
83cdf0e10cSrcweir (that->m_env.get()->pExtEnv->acquireInterface)(that->m_env.get()->pExtEnv, pInterface);
84cdf0e10cSrcweir }
85cdf0e10cSrcweir }
86cdf0e10cSrcweir }
87cdf0e10cSrcweir
88cdf0e10cSrcweir
IdentityMapping(uno::Environment const & rEnv)89cdf0e10cSrcweir IdentityMapping::IdentityMapping(uno::Environment const & rEnv)
90cdf0e10cSrcweir : m_nRef(0),
91cdf0e10cSrcweir m_env(rEnv)
92cdf0e10cSrcweir {
93cdf0e10cSrcweir uno_Mapping::acquire = s_acquire;
94cdf0e10cSrcweir uno_Mapping::release = s_release;
95cdf0e10cSrcweir uno_Mapping::mapInterface = s_mapInterface;
96cdf0e10cSrcweir }
97cdf0e10cSrcweir
98cdf0e10cSrcweir
createIdentityMapping(uno::Environment const & rEnv)99cdf0e10cSrcweir uno_Mapping * createIdentityMapping(uno::Environment const & rEnv) SAL_THROW(())
100cdf0e10cSrcweir {
101cdf0e10cSrcweir return new IdentityMapping(rEnv);
102cdf0e10cSrcweir }
103