1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_connectivity.hxx"
30 #include <connectivity/sdbcx/VDescriptor.hxx>
31 #include <cppuhelper/queryinterface.hxx>
32 
33 #include <functional>
34 #include <algorithm>
35 
36 namespace connectivity
37 {
38 	namespace sdbcx
39 	{
40 		using namespace ::com::sun::star::uno;
41 		using namespace ::com::sun::star::lang;
42 		using namespace ::com::sun::star::beans;
43 
44 		// =========================================================================
45 		// = ODescriptor
46 		// =========================================================================
47 		// -------------------------------------------------------------------------
48 		ODescriptor::ODescriptor(::cppu::OBroadcastHelper& _rBHelper,sal_Bool _bCase, sal_Bool _bNew)
49 			:ODescriptor_PBASE(_rBHelper)
50             ,m_aCase(_bCase)
51 			,m_bNew(_bNew)
52 		{
53 		}
54 
55 		// -------------------------------------------------------------------------
56 		// com::sun::star::lang::XUnoTunnel
57 		sal_Int64 SAL_CALL ODescriptor::getSomething( const Sequence< sal_Int8 >& rId ) throw(RuntimeException)
58 		{
59 			return (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(),  rId.getConstArray(), 16 ) )
60 				? reinterpret_cast< sal_Int64 >( this )
61 				: 0;
62 		}
63 
64         // -----------------------------------------------------------------------------
65         ODescriptor* ODescriptor::getImplementation( const Reference< XInterface >& _rxSomeComp )
66         {
67             Reference< XUnoTunnel > xTunnel( _rxSomeComp, UNO_QUERY );
68             if ( xTunnel.is() )
69                 return reinterpret_cast< ODescriptor* >( xTunnel->getSomething( getUnoTunnelImplementationId() ) );
70             return NULL;
71         }
72 
73         // -----------------------------------------------------------------------------
74         namespace
75         {
76             struct ResetROAttribute : public ::std::unary_function< Property, void >
77             {
78                 void operator ()( Property& _rProperty ) const
79                 {
80                     _rProperty.Attributes &= ~PropertyAttribute::READONLY;
81                 }
82             };
83             struct SetROAttribute : public ::std::unary_function< Property, void >
84             {
85                 void operator ()( Property& _rProperty ) const
86                 {
87                     _rProperty.Attributes |= PropertyAttribute::READONLY;
88                 }
89             };
90         }
91 
92         // -----------------------------------------------------------------------------
93         ::cppu::IPropertyArrayHelper* ODescriptor::doCreateArrayHelper() const
94         {
95             Sequence< Property > aProperties;
96             describeProperties( aProperties );
97 
98             if ( isNew() )
99                 ::std::for_each( aProperties.getArray(), aProperties.getArray() + aProperties.getLength(), ResetROAttribute() );
100             else
101                 ::std::for_each( aProperties.getArray(), aProperties.getArray() + aProperties.getLength(), SetROAttribute() );
102 
103             return new ::cppu::OPropertyArrayHelper( aProperties );
104         }
105 
106         // -----------------------------------------------------------------------------
107         sal_Bool ODescriptor::isNew( const Reference< XInterface >& _rxDescriptor )
108         {
109             ODescriptor* pImplementation = getImplementation( _rxDescriptor );
110             return pImplementation != NULL ? pImplementation->isNew() : sal_False;
111         }
112 
113 		// -----------------------------------------------------------------------------
114 		Sequence< sal_Int8 > ODescriptor::getUnoTunnelImplementationId()
115 		{
116 			static ::cppu::OImplementationId * pId = 0;
117 			if (! pId)
118 			{
119 				::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
120 				if (! pId)
121 				{
122 					static ::cppu::OImplementationId aId;
123 					pId = &aId;
124 				}
125 			}
126 			return pId->getImplementationId();
127 		}
128 
129 		// -----------------------------------------------------------------------------
130 		Any SAL_CALL ODescriptor::queryInterface( const Type & rType ) throw(RuntimeException)
131 		{
132 			Any aRet = ::cppu::queryInterface(rType,static_cast< XUnoTunnel*> (this));
133 			return aRet.hasValue() ? aRet : ODescriptor_PBASE::queryInterface(rType);
134 		}
135 
136 		// -----------------------------------------------------------------------------
137 		void ODescriptor::setNew(sal_Bool _bNew)
138 		{
139 			m_bNew = _bNew;
140 		}
141 
142 		// -----------------------------------------------------------------------------
143 		Sequence< Type > SAL_CALL ODescriptor::getTypes(  ) throw(RuntimeException)
144 		{
145 			::cppu::OTypeCollection aTypes(	::getCppuType( (const Reference< XMultiPropertySet > *)0 ),
146 											::getCppuType( (const Reference< XFastPropertySet > *)0 ),
147 											::getCppuType( (const Reference< XPropertySet > *)0 ),
148 											::getCppuType( (const Reference< XUnoTunnel > *)0 ));
149 			return aTypes.getTypes();
150 		}
151 
152 	}
153 }
154 
155 
156