1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_connectivity.hxx" 26*b1cdbd2cSJim Jagielski #include <connectivity/sdbcx/VDescriptor.hxx> 27*b1cdbd2cSJim Jagielski #include <cppuhelper/queryinterface.hxx> 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski #include <functional> 30*b1cdbd2cSJim Jagielski #include <algorithm> 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski namespace connectivity 33*b1cdbd2cSJim Jagielski { 34*b1cdbd2cSJim Jagielski namespace sdbcx 35*b1cdbd2cSJim Jagielski { 36*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno; 37*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang; 38*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans; 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski // ========================================================================= 41*b1cdbd2cSJim Jagielski // = ODescriptor 42*b1cdbd2cSJim Jagielski // ========================================================================= 43*b1cdbd2cSJim Jagielski // ------------------------------------------------------------------------- ODescriptor(::cppu::OBroadcastHelper & _rBHelper,sal_Bool _bCase,sal_Bool _bNew)44*b1cdbd2cSJim Jagielski ODescriptor::ODescriptor(::cppu::OBroadcastHelper& _rBHelper,sal_Bool _bCase, sal_Bool _bNew) 45*b1cdbd2cSJim Jagielski :ODescriptor_PBASE(_rBHelper) 46*b1cdbd2cSJim Jagielski ,m_aCase(_bCase) 47*b1cdbd2cSJim Jagielski ,m_bNew(_bNew) 48*b1cdbd2cSJim Jagielski { 49*b1cdbd2cSJim Jagielski } 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski // ------------------------------------------------------------------------- 52*b1cdbd2cSJim Jagielski // com::sun::star::lang::XUnoTunnel getSomething(const Sequence<sal_Int8> & rId)53*b1cdbd2cSJim Jagielski sal_Int64 SAL_CALL ODescriptor::getSomething( const Sequence< sal_Int8 >& rId ) throw(RuntimeException) 54*b1cdbd2cSJim Jagielski { 55*b1cdbd2cSJim Jagielski return (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(), rId.getConstArray(), 16 ) ) 56*b1cdbd2cSJim Jagielski ? reinterpret_cast< sal_Int64 >( this ) 57*b1cdbd2cSJim Jagielski : 0; 58*b1cdbd2cSJim Jagielski } 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- getImplementation(const Reference<XInterface> & _rxSomeComp)61*b1cdbd2cSJim Jagielski ODescriptor* ODescriptor::getImplementation( const Reference< XInterface >& _rxSomeComp ) 62*b1cdbd2cSJim Jagielski { 63*b1cdbd2cSJim Jagielski Reference< XUnoTunnel > xTunnel( _rxSomeComp, UNO_QUERY ); 64*b1cdbd2cSJim Jagielski if ( xTunnel.is() ) 65*b1cdbd2cSJim Jagielski return reinterpret_cast< ODescriptor* >( xTunnel->getSomething( getUnoTunnelImplementationId() ) ); 66*b1cdbd2cSJim Jagielski return NULL; 67*b1cdbd2cSJim Jagielski } 68*b1cdbd2cSJim Jagielski 69*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- 70*b1cdbd2cSJim Jagielski namespace 71*b1cdbd2cSJim Jagielski { 72*b1cdbd2cSJim Jagielski struct ResetROAttribute : public ::std::unary_function< Property, void > 73*b1cdbd2cSJim Jagielski { operator ()connectivity::sdbcx::__anonb74f07e60111::ResetROAttribute74*b1cdbd2cSJim Jagielski void operator ()( Property& _rProperty ) const 75*b1cdbd2cSJim Jagielski { 76*b1cdbd2cSJim Jagielski _rProperty.Attributes &= ~PropertyAttribute::READONLY; 77*b1cdbd2cSJim Jagielski } 78*b1cdbd2cSJim Jagielski }; 79*b1cdbd2cSJim Jagielski struct SetROAttribute : public ::std::unary_function< Property, void > 80*b1cdbd2cSJim Jagielski { operator ()connectivity::sdbcx::__anonb74f07e60111::SetROAttribute81*b1cdbd2cSJim Jagielski void operator ()( Property& _rProperty ) const 82*b1cdbd2cSJim Jagielski { 83*b1cdbd2cSJim Jagielski _rProperty.Attributes |= PropertyAttribute::READONLY; 84*b1cdbd2cSJim Jagielski } 85*b1cdbd2cSJim Jagielski }; 86*b1cdbd2cSJim Jagielski } 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- doCreateArrayHelper() const89*b1cdbd2cSJim Jagielski ::cppu::IPropertyArrayHelper* ODescriptor::doCreateArrayHelper() const 90*b1cdbd2cSJim Jagielski { 91*b1cdbd2cSJim Jagielski Sequence< Property > aProperties; 92*b1cdbd2cSJim Jagielski describeProperties( aProperties ); 93*b1cdbd2cSJim Jagielski 94*b1cdbd2cSJim Jagielski if ( isNew() ) 95*b1cdbd2cSJim Jagielski ::std::for_each( aProperties.getArray(), aProperties.getArray() + aProperties.getLength(), ResetROAttribute() ); 96*b1cdbd2cSJim Jagielski else 97*b1cdbd2cSJim Jagielski ::std::for_each( aProperties.getArray(), aProperties.getArray() + aProperties.getLength(), SetROAttribute() ); 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski return new ::cppu::OPropertyArrayHelper( aProperties ); 100*b1cdbd2cSJim Jagielski } 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- isNew(const Reference<XInterface> & _rxDescriptor)103*b1cdbd2cSJim Jagielski sal_Bool ODescriptor::isNew( const Reference< XInterface >& _rxDescriptor ) 104*b1cdbd2cSJim Jagielski { 105*b1cdbd2cSJim Jagielski ODescriptor* pImplementation = getImplementation( _rxDescriptor ); 106*b1cdbd2cSJim Jagielski return pImplementation != NULL ? pImplementation->isNew() : sal_False; 107*b1cdbd2cSJim Jagielski } 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- getUnoTunnelImplementationId()110*b1cdbd2cSJim Jagielski Sequence< sal_Int8 > ODescriptor::getUnoTunnelImplementationId() 111*b1cdbd2cSJim Jagielski { 112*b1cdbd2cSJim Jagielski static ::cppu::OImplementationId * pId = 0; 113*b1cdbd2cSJim Jagielski if (! pId) 114*b1cdbd2cSJim Jagielski { 115*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 116*b1cdbd2cSJim Jagielski if (! pId) 117*b1cdbd2cSJim Jagielski { 118*b1cdbd2cSJim Jagielski static ::cppu::OImplementationId aId; 119*b1cdbd2cSJim Jagielski pId = &aId; 120*b1cdbd2cSJim Jagielski } 121*b1cdbd2cSJim Jagielski } 122*b1cdbd2cSJim Jagielski return pId->getImplementationId(); 123*b1cdbd2cSJim Jagielski } 124*b1cdbd2cSJim Jagielski 125*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- queryInterface(const Type & rType)126*b1cdbd2cSJim Jagielski Any SAL_CALL ODescriptor::queryInterface( const Type & rType ) throw(RuntimeException) 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski Any aRet = ::cppu::queryInterface(rType,static_cast< XUnoTunnel*> (this)); 129*b1cdbd2cSJim Jagielski return aRet.hasValue() ? aRet : ODescriptor_PBASE::queryInterface(rType); 130*b1cdbd2cSJim Jagielski } 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- setNew(sal_Bool _bNew)133*b1cdbd2cSJim Jagielski void ODescriptor::setNew(sal_Bool _bNew) 134*b1cdbd2cSJim Jagielski { 135*b1cdbd2cSJim Jagielski m_bNew = _bNew; 136*b1cdbd2cSJim Jagielski } 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- getTypes()139*b1cdbd2cSJim Jagielski Sequence< Type > SAL_CALL ODescriptor::getTypes( ) throw(RuntimeException) 140*b1cdbd2cSJim Jagielski { 141*b1cdbd2cSJim Jagielski ::cppu::OTypeCollection aTypes( ::getCppuType( (const Reference< XMultiPropertySet > *)0 ), 142*b1cdbd2cSJim Jagielski ::getCppuType( (const Reference< XFastPropertySet > *)0 ), 143*b1cdbd2cSJim Jagielski ::getCppuType( (const Reference< XPropertySet > *)0 ), 144*b1cdbd2cSJim Jagielski ::getCppuType( (const Reference< XUnoTunnel > *)0 )); 145*b1cdbd2cSJim Jagielski return aTypes.getTypes(); 146*b1cdbd2cSJim Jagielski } 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski } 149*b1cdbd2cSJim Jagielski } 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielski 152