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_svx.hxx" 26*b1cdbd2cSJim Jagielski #include <svx/dbaexchange.hxx> 27*b1cdbd2cSJim Jagielski #include <osl/diagnose.h> 28*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/CommandType.hpp> 29*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XTablesSupplier.hpp> 30*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/XSQLQueryComposerFactory.hpp> 31*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/XSQLQueryComposerFactory.hpp> 32*b1cdbd2cSJim Jagielski #ifndef _SVX_FMPROP_HRC 33*b1cdbd2cSJim Jagielski #include "fmprop.hrc" 34*b1cdbd2cSJim Jagielski #endif 35*b1cdbd2cSJim Jagielski #include <comphelper/extract.hxx> 36*b1cdbd2cSJim Jagielski #include <sot/formats.hxx> 37*b1cdbd2cSJim Jagielski #include <sot/exchange.hxx> 38*b1cdbd2cSJim Jagielski #include <comphelper/propertysetinfo.hxx> 39*b1cdbd2cSJim Jagielski #ifndef _SVX_FMPROP_HRC 40*b1cdbd2cSJim Jagielski #include "fmprop.hrc" 41*b1cdbd2cSJim Jagielski #endif 42*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx> 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski //........................................................................ 45*b1cdbd2cSJim Jagielski namespace svx 46*b1cdbd2cSJim Jagielski { 47*b1cdbd2cSJim Jagielski //........................................................................ 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno; 50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans; 51*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdb; 52*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbc; 53*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang; 54*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbcx; 55*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container; 56*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::datatransfer; 57*b1cdbd2cSJim Jagielski using namespace ::comphelper; 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski //==================================================================== 60*b1cdbd2cSJim Jagielski //= OColumnTransferable 61*b1cdbd2cSJim Jagielski //==================================================================== 62*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- OColumnTransferable(const::rtl::OUString & _rDatasource,const::rtl::OUString & _rConnectionResource,const sal_Int32 _nCommandType,const::rtl::OUString & _rCommand,const::rtl::OUString & _rFieldName,sal_Int32 _nFormats)63*b1cdbd2cSJim Jagielski OColumnTransferable::OColumnTransferable(const ::rtl::OUString& _rDatasource 64*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _rConnectionResource 65*b1cdbd2cSJim Jagielski ,const sal_Int32 _nCommandType 66*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _rCommand 67*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _rFieldName 68*b1cdbd2cSJim Jagielski ,sal_Int32 _nFormats) 69*b1cdbd2cSJim Jagielski :m_nFormatFlags(_nFormats) 70*b1cdbd2cSJim Jagielski { 71*b1cdbd2cSJim Jagielski implConstruct(_rDatasource,_rConnectionResource,_nCommandType, _rCommand, _rFieldName); 72*b1cdbd2cSJim Jagielski } 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- OColumnTransferable(const ODataAccessDescriptor & _rDescriptor,sal_Int32 _nFormats)75*b1cdbd2cSJim Jagielski OColumnTransferable::OColumnTransferable(const ODataAccessDescriptor& _rDescriptor, sal_Int32 _nFormats ) 76*b1cdbd2cSJim Jagielski :m_nFormatFlags(_nFormats) 77*b1cdbd2cSJim Jagielski { 78*b1cdbd2cSJim Jagielski ::rtl::OUString sDataSource, sDatabaseLocation, sConnectionResource, sCommand, sFieldName; 79*b1cdbd2cSJim Jagielski if ( _rDescriptor.has( daDataSource ) ) _rDescriptor[ daDataSource ] >>= sDataSource; 80*b1cdbd2cSJim Jagielski if ( _rDescriptor.has( daDatabaseLocation ) ) _rDescriptor[ daDatabaseLocation ] >>= sDatabaseLocation; 81*b1cdbd2cSJim Jagielski if ( _rDescriptor.has( daConnectionResource ) ) _rDescriptor[ daConnectionResource ] >>= sConnectionResource; 82*b1cdbd2cSJim Jagielski if ( _rDescriptor.has( daCommand ) ) _rDescriptor[ daCommand ] >>= sCommand; 83*b1cdbd2cSJim Jagielski if ( _rDescriptor.has( daColumnName ) ) _rDescriptor[ daColumnName ] >>= sFieldName; 84*b1cdbd2cSJim Jagielski 85*b1cdbd2cSJim Jagielski sal_Int32 nCommandType = CommandType::TABLE; 86*b1cdbd2cSJim Jagielski OSL_VERIFY( _rDescriptor[ daCommandType ] >>= nCommandType ); 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski implConstruct( 90*b1cdbd2cSJim Jagielski sDataSource.getLength() ? sDataSource : sDatabaseLocation, 91*b1cdbd2cSJim Jagielski sConnectionResource, nCommandType, sCommand, sFieldName ); 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski if ( m_nFormatFlags & CTF_COLUMN_DESCRIPTOR ) 94*b1cdbd2cSJim Jagielski { 95*b1cdbd2cSJim Jagielski if ( _rDescriptor.has( daConnection ) ) 96*b1cdbd2cSJim Jagielski m_aDescriptor[ daConnection ] = _rDescriptor[ daConnection ]; 97*b1cdbd2cSJim Jagielski if ( _rDescriptor.has( daColumnObject ) ) 98*b1cdbd2cSJim Jagielski m_aDescriptor[ daColumnObject ] = _rDescriptor[ daColumnObject ]; 99*b1cdbd2cSJim Jagielski } 100*b1cdbd2cSJim Jagielski } 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- OColumnTransferable(const Reference<XPropertySet> & _rxForm,const::rtl::OUString & _rFieldName,const Reference<XPropertySet> & _rxColumn,const Reference<XConnection> & _rxConnection,sal_Int32 _nFormats)103*b1cdbd2cSJim Jagielski OColumnTransferable::OColumnTransferable(const Reference< XPropertySet >& _rxForm, 104*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rFieldName, const Reference< XPropertySet >& _rxColumn, 105*b1cdbd2cSJim Jagielski const Reference< XConnection >& _rxConnection, sal_Int32 _nFormats) 106*b1cdbd2cSJim Jagielski :m_nFormatFlags(_nFormats) 107*b1cdbd2cSJim Jagielski { 108*b1cdbd2cSJim Jagielski OSL_ENSURE(_rxForm.is(), "OColumnTransferable::OColumnTransferable: invalid form!"); 109*b1cdbd2cSJim Jagielski // collect the necessary information from the form 110*b1cdbd2cSJim Jagielski ::rtl::OUString sCommand; 111*b1cdbd2cSJim Jagielski sal_Int32 nCommandType = CommandType::TABLE; 112*b1cdbd2cSJim Jagielski ::rtl::OUString sDatasource,sURL; 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski sal_Bool bTryToParse = sal_True; 115*b1cdbd2cSJim Jagielski try 116*b1cdbd2cSJim Jagielski { 117*b1cdbd2cSJim Jagielski _rxForm->getPropertyValue(FM_PROP_COMMANDTYPE) >>= nCommandType; 118*b1cdbd2cSJim Jagielski _rxForm->getPropertyValue(FM_PROP_COMMAND) >>= sCommand; 119*b1cdbd2cSJim Jagielski _rxForm->getPropertyValue(FM_PROP_DATASOURCE) >>= sDatasource; 120*b1cdbd2cSJim Jagielski _rxForm->getPropertyValue(FM_PROP_URL) >>= sURL; 121*b1cdbd2cSJim Jagielski bTryToParse = ::cppu::any2bool(_rxForm->getPropertyValue(FM_PROP_ESCAPE_PROCESSING)); 122*b1cdbd2cSJim Jagielski } 123*b1cdbd2cSJim Jagielski catch(Exception&) 124*b1cdbd2cSJim Jagielski { 125*b1cdbd2cSJim Jagielski OSL_ENSURE(sal_False, "OColumnTransferable::OColumnTransferable: could not collect essential data source attributes !"); 126*b1cdbd2cSJim Jagielski } 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski // If the data source is an SQL-statement and simple enough (means "select <field list> from <table> where ....") 129*b1cdbd2cSJim Jagielski // we are able to fake the drag information we are about to create. 130*b1cdbd2cSJim Jagielski if (bTryToParse && (CommandType::COMMAND == nCommandType)) 131*b1cdbd2cSJim Jagielski { 132*b1cdbd2cSJim Jagielski try 133*b1cdbd2cSJim Jagielski { 134*b1cdbd2cSJim Jagielski Reference< XTablesSupplier > xSupTab; 135*b1cdbd2cSJim Jagielski _rxForm->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SingleSelectQueryComposer"))) >>= xSupTab; 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski if(xSupTab.is()) 138*b1cdbd2cSJim Jagielski { 139*b1cdbd2cSJim Jagielski Reference< XNameAccess > xNames = xSupTab->getTables(); 140*b1cdbd2cSJim Jagielski if (xNames.is()) 141*b1cdbd2cSJim Jagielski { 142*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > aTables = xNames->getElementNames(); 143*b1cdbd2cSJim Jagielski if (1 == aTables.getLength()) 144*b1cdbd2cSJim Jagielski { 145*b1cdbd2cSJim Jagielski sCommand = aTables[0]; 146*b1cdbd2cSJim Jagielski nCommandType = CommandType::TABLE; 147*b1cdbd2cSJim Jagielski } 148*b1cdbd2cSJim Jagielski } 149*b1cdbd2cSJim Jagielski } 150*b1cdbd2cSJim Jagielski } 151*b1cdbd2cSJim Jagielski catch(Exception&) 152*b1cdbd2cSJim Jagielski { 153*b1cdbd2cSJim Jagielski OSL_ENSURE(sal_False, "OColumnTransferable::OColumnTransferable: could not collect essential data source attributes (part two) !"); 154*b1cdbd2cSJim Jagielski } 155*b1cdbd2cSJim Jagielski } 156*b1cdbd2cSJim Jagielski 157*b1cdbd2cSJim Jagielski implConstruct(sDatasource, sURL,nCommandType, sCommand, _rFieldName); 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski if ((m_nFormatFlags & CTF_COLUMN_DESCRIPTOR) == CTF_COLUMN_DESCRIPTOR) 160*b1cdbd2cSJim Jagielski { 161*b1cdbd2cSJim Jagielski if (_rxColumn.is()) 162*b1cdbd2cSJim Jagielski m_aDescriptor[daColumnObject] <<= _rxColumn; 163*b1cdbd2cSJim Jagielski if (_rxConnection.is()) 164*b1cdbd2cSJim Jagielski m_aDescriptor[daConnection] <<= _rxConnection; 165*b1cdbd2cSJim Jagielski } 166*b1cdbd2cSJim Jagielski } 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getDescriptorFormatId()169*b1cdbd2cSJim Jagielski sal_uInt32 OColumnTransferable::getDescriptorFormatId() 170*b1cdbd2cSJim Jagielski { 171*b1cdbd2cSJim Jagielski static sal_uInt32 s_nFormat = (sal_uInt32)-1; 172*b1cdbd2cSJim Jagielski if ((sal_uInt32)-1 == s_nFormat) 173*b1cdbd2cSJim Jagielski { 174*b1cdbd2cSJim Jagielski s_nFormat = SotExchange::RegisterFormatName(String::CreateFromAscii("application/x-openoffice;windows_formatname=\"dbaccess.ColumnDescriptorTransfer\"")); 175*b1cdbd2cSJim Jagielski OSL_ENSURE((sal_uInt32)-1 != s_nFormat, "OColumnTransferable::getDescriptorFormatId: bad exchange id!"); 176*b1cdbd2cSJim Jagielski } 177*b1cdbd2cSJim Jagielski return s_nFormat; 178*b1cdbd2cSJim Jagielski } 179*b1cdbd2cSJim Jagielski 180*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- implConstruct(const::rtl::OUString & _rDatasource,const::rtl::OUString & _rConnectionResource,const sal_Int32 _nCommandType,const::rtl::OUString & _rCommand,const::rtl::OUString & _rFieldName)181*b1cdbd2cSJim Jagielski void OColumnTransferable::implConstruct( const ::rtl::OUString& _rDatasource 182*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _rConnectionResource 183*b1cdbd2cSJim Jagielski ,const sal_Int32 _nCommandType 184*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _rCommand 185*b1cdbd2cSJim Jagielski , const ::rtl::OUString& _rFieldName) 186*b1cdbd2cSJim Jagielski { 187*b1cdbd2cSJim Jagielski const sal_Unicode cSeparator = sal_Unicode(11); 188*b1cdbd2cSJim Jagielski const ::rtl::OUString sSeparator(&cSeparator, 1); 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski m_sCompatibleFormat = ::rtl::OUString(); 191*b1cdbd2cSJim Jagielski m_sCompatibleFormat += _rDatasource; 192*b1cdbd2cSJim Jagielski m_sCompatibleFormat += sSeparator; 193*b1cdbd2cSJim Jagielski m_sCompatibleFormat += _rCommand; 194*b1cdbd2cSJim Jagielski m_sCompatibleFormat += sSeparator; 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski sal_Unicode cCommandType; 197*b1cdbd2cSJim Jagielski switch (_nCommandType) 198*b1cdbd2cSJim Jagielski { 199*b1cdbd2cSJim Jagielski case CommandType::TABLE: 200*b1cdbd2cSJim Jagielski cCommandType = '0'; 201*b1cdbd2cSJim Jagielski break; 202*b1cdbd2cSJim Jagielski case CommandType::QUERY: 203*b1cdbd2cSJim Jagielski cCommandType = '1'; 204*b1cdbd2cSJim Jagielski break; 205*b1cdbd2cSJim Jagielski default: 206*b1cdbd2cSJim Jagielski cCommandType = '2'; 207*b1cdbd2cSJim Jagielski break; 208*b1cdbd2cSJim Jagielski } 209*b1cdbd2cSJim Jagielski m_sCompatibleFormat += ::rtl::OUString(&cCommandType, 1); 210*b1cdbd2cSJim Jagielski m_sCompatibleFormat += sSeparator; 211*b1cdbd2cSJim Jagielski m_sCompatibleFormat += _rFieldName; 212*b1cdbd2cSJim Jagielski 213*b1cdbd2cSJim Jagielski m_aDescriptor.clear(); 214*b1cdbd2cSJim Jagielski if ((m_nFormatFlags & CTF_COLUMN_DESCRIPTOR) == CTF_COLUMN_DESCRIPTOR) 215*b1cdbd2cSJim Jagielski { 216*b1cdbd2cSJim Jagielski m_aDescriptor.setDataSource(_rDatasource); 217*b1cdbd2cSJim Jagielski if ( _rConnectionResource.getLength() ) 218*b1cdbd2cSJim Jagielski m_aDescriptor[daConnectionResource] <<= _rConnectionResource; 219*b1cdbd2cSJim Jagielski 220*b1cdbd2cSJim Jagielski m_aDescriptor[daCommand] <<= _rCommand; 221*b1cdbd2cSJim Jagielski m_aDescriptor[daCommandType] <<= _nCommandType; 222*b1cdbd2cSJim Jagielski m_aDescriptor[daColumnName] <<= _rFieldName; 223*b1cdbd2cSJim Jagielski } 224*b1cdbd2cSJim Jagielski } 225*b1cdbd2cSJim Jagielski 226*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- AddSupportedFormats()227*b1cdbd2cSJim Jagielski void OColumnTransferable::AddSupportedFormats() 228*b1cdbd2cSJim Jagielski { 229*b1cdbd2cSJim Jagielski if (CTF_CONTROL_EXCHANGE & m_nFormatFlags) 230*b1cdbd2cSJim Jagielski AddFormat(SOT_FORMATSTR_ID_SBA_CTRLDATAEXCHANGE); 231*b1cdbd2cSJim Jagielski 232*b1cdbd2cSJim Jagielski if (CTF_FIELD_DESCRIPTOR & m_nFormatFlags) 233*b1cdbd2cSJim Jagielski AddFormat(SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE); 234*b1cdbd2cSJim Jagielski 235*b1cdbd2cSJim Jagielski if (CTF_COLUMN_DESCRIPTOR & m_nFormatFlags) 236*b1cdbd2cSJim Jagielski AddFormat(getDescriptorFormatId()); 237*b1cdbd2cSJim Jagielski } 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- GetData(const DataFlavor & _rFlavor)240*b1cdbd2cSJim Jagielski sal_Bool OColumnTransferable::GetData( const DataFlavor& _rFlavor ) 241*b1cdbd2cSJim Jagielski { 242*b1cdbd2cSJim Jagielski const sal_uInt32 nFormatId = SotExchange::GetFormat(_rFlavor); 243*b1cdbd2cSJim Jagielski switch (nFormatId) 244*b1cdbd2cSJim Jagielski { 245*b1cdbd2cSJim Jagielski case SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE: 246*b1cdbd2cSJim Jagielski case SOT_FORMATSTR_ID_SBA_CTRLDATAEXCHANGE: 247*b1cdbd2cSJim Jagielski return SetString(m_sCompatibleFormat, _rFlavor); 248*b1cdbd2cSJim Jagielski } 249*b1cdbd2cSJim Jagielski if (nFormatId == getDescriptorFormatId()) 250*b1cdbd2cSJim Jagielski return SetAny( makeAny( m_aDescriptor.createPropertyValueSequence() ), _rFlavor ); 251*b1cdbd2cSJim Jagielski 252*b1cdbd2cSJim Jagielski return sal_False; 253*b1cdbd2cSJim Jagielski } 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- canExtractColumnDescriptor(const DataFlavorExVector & _rFlavors,sal_Int32 _nFormats)256*b1cdbd2cSJim Jagielski sal_Bool OColumnTransferable::canExtractColumnDescriptor(const DataFlavorExVector& _rFlavors, sal_Int32 _nFormats) 257*b1cdbd2cSJim Jagielski { 258*b1cdbd2cSJim Jagielski sal_Bool bFieldFormat = 0 != (_nFormats & CTF_FIELD_DESCRIPTOR); 259*b1cdbd2cSJim Jagielski sal_Bool bControlFormat = 0 != (_nFormats & CTF_CONTROL_EXCHANGE); 260*b1cdbd2cSJim Jagielski sal_Bool bDescriptorFormat = 0 != (_nFormats & CTF_COLUMN_DESCRIPTOR); 261*b1cdbd2cSJim Jagielski for ( DataFlavorExVector::const_iterator aCheck = _rFlavors.begin(); 262*b1cdbd2cSJim Jagielski aCheck != _rFlavors.end(); 263*b1cdbd2cSJim Jagielski ++aCheck 264*b1cdbd2cSJim Jagielski ) 265*b1cdbd2cSJim Jagielski { 266*b1cdbd2cSJim Jagielski if (bFieldFormat && (SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE == aCheck->mnSotId)) 267*b1cdbd2cSJim Jagielski return sal_True; 268*b1cdbd2cSJim Jagielski if (bControlFormat && (SOT_FORMATSTR_ID_SBA_CTRLDATAEXCHANGE == aCheck->mnSotId)) 269*b1cdbd2cSJim Jagielski return sal_True; 270*b1cdbd2cSJim Jagielski if (bDescriptorFormat && (getDescriptorFormatId() == aCheck->mnSotId)) 271*b1cdbd2cSJim Jagielski return sal_True; 272*b1cdbd2cSJim Jagielski } 273*b1cdbd2cSJim Jagielski 274*b1cdbd2cSJim Jagielski return sal_False; 275*b1cdbd2cSJim Jagielski } 276*b1cdbd2cSJim Jagielski 277*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- extractColumnDescriptor(const TransferableDataHelper & _rData)278*b1cdbd2cSJim Jagielski ODataAccessDescriptor OColumnTransferable::extractColumnDescriptor(const TransferableDataHelper& _rData) 279*b1cdbd2cSJim Jagielski { 280*b1cdbd2cSJim Jagielski if (_rData.HasFormat(getDescriptorFormatId())) 281*b1cdbd2cSJim Jagielski { 282*b1cdbd2cSJim Jagielski // the object has a real descriptor object (not just the old compatible format) 283*b1cdbd2cSJim Jagielski 284*b1cdbd2cSJim Jagielski // extract the any from the transferable 285*b1cdbd2cSJim Jagielski DataFlavor aFlavor; 286*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 287*b1cdbd2cSJim Jagielski sal_Bool bSuccess = 288*b1cdbd2cSJim Jagielski #endif 289*b1cdbd2cSJim Jagielski SotExchange::GetFormatDataFlavor(getDescriptorFormatId(), aFlavor); 290*b1cdbd2cSJim Jagielski OSL_ENSURE(bSuccess, "OColumnTransferable::extractColumnDescriptor: invalid data format (no flavor)!"); 291*b1cdbd2cSJim Jagielski 292*b1cdbd2cSJim Jagielski Any aDescriptor = _rData.GetAny(aFlavor); 293*b1cdbd2cSJim Jagielski 294*b1cdbd2cSJim Jagielski // extract the property value sequence 295*b1cdbd2cSJim Jagielski Sequence< PropertyValue > aDescriptorProps; 296*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 297*b1cdbd2cSJim Jagielski bSuccess = 298*b1cdbd2cSJim Jagielski #endif 299*b1cdbd2cSJim Jagielski aDescriptor >>= aDescriptorProps; 300*b1cdbd2cSJim Jagielski OSL_ENSURE(bSuccess, "OColumnTransferable::extractColumnDescriptor: invalid clipboard format!"); 301*b1cdbd2cSJim Jagielski 302*b1cdbd2cSJim Jagielski // build the real descriptor 303*b1cdbd2cSJim Jagielski return ODataAccessDescriptor(aDescriptorProps); 304*b1cdbd2cSJim Jagielski } 305*b1cdbd2cSJim Jagielski 306*b1cdbd2cSJim Jagielski // only the old (compatible) format exists -> use the other extract method ... 307*b1cdbd2cSJim Jagielski ::rtl::OUString sDatasource, sCommand, sFieldName,sDatabaseLocation,sConnectionResource; 308*b1cdbd2cSJim Jagielski sal_Int32 nCommandType = CommandType::COMMAND; 309*b1cdbd2cSJim Jagielski 310*b1cdbd2cSJim Jagielski ODataAccessDescriptor aDescriptor; 311*b1cdbd2cSJim Jagielski if (extractColumnDescriptor(_rData, sDatasource, sDatabaseLocation,sConnectionResource,nCommandType, sCommand, sFieldName)) 312*b1cdbd2cSJim Jagielski { 313*b1cdbd2cSJim Jagielski // and build an own descriptor 314*b1cdbd2cSJim Jagielski if ( sDatasource.getLength() ) 315*b1cdbd2cSJim Jagielski aDescriptor[daDataSource] <<= sDatasource; 316*b1cdbd2cSJim Jagielski if ( sDatabaseLocation.getLength() ) 317*b1cdbd2cSJim Jagielski aDescriptor[daDatabaseLocation] <<= sDatabaseLocation; 318*b1cdbd2cSJim Jagielski if ( sConnectionResource.getLength() ) 319*b1cdbd2cSJim Jagielski aDescriptor[daConnectionResource] <<= sConnectionResource; 320*b1cdbd2cSJim Jagielski 321*b1cdbd2cSJim Jagielski aDescriptor[daCommand] <<= sCommand; 322*b1cdbd2cSJim Jagielski aDescriptor[daCommandType] <<= nCommandType; 323*b1cdbd2cSJim Jagielski aDescriptor[daColumnName] <<= sFieldName; 324*b1cdbd2cSJim Jagielski } 325*b1cdbd2cSJim Jagielski return aDescriptor; 326*b1cdbd2cSJim Jagielski } 327*b1cdbd2cSJim Jagielski 328*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- extractColumnDescriptor(const TransferableDataHelper & _rData,::rtl::OUString & _rDatasource,::rtl::OUString & _rDatabaseLocation,::rtl::OUString & _rConnectionResource,sal_Int32 & _nCommandType,::rtl::OUString & _rCommand,::rtl::OUString & _rFieldName)329*b1cdbd2cSJim Jagielski sal_Bool OColumnTransferable::extractColumnDescriptor(const TransferableDataHelper& _rData 330*b1cdbd2cSJim Jagielski ,::rtl::OUString& _rDatasource 331*b1cdbd2cSJim Jagielski ,::rtl::OUString& _rDatabaseLocation 332*b1cdbd2cSJim Jagielski ,::rtl::OUString& _rConnectionResource 333*b1cdbd2cSJim Jagielski ,sal_Int32& _nCommandType 334*b1cdbd2cSJim Jagielski ,::rtl::OUString& _rCommand 335*b1cdbd2cSJim Jagielski ,::rtl::OUString& _rFieldName) 336*b1cdbd2cSJim Jagielski { 337*b1cdbd2cSJim Jagielski if ( _rData.HasFormat(getDescriptorFormatId()) ) 338*b1cdbd2cSJim Jagielski { 339*b1cdbd2cSJim Jagielski ODataAccessDescriptor aDescriptor = extractColumnDescriptor(_rData); 340*b1cdbd2cSJim Jagielski if ( aDescriptor.has(daDataSource) ) 341*b1cdbd2cSJim Jagielski aDescriptor[daDataSource] >>= _rDatasource; 342*b1cdbd2cSJim Jagielski if ( aDescriptor.has(daDatabaseLocation) ) 343*b1cdbd2cSJim Jagielski aDescriptor[daDatabaseLocation] >>= _rDatabaseLocation; 344*b1cdbd2cSJim Jagielski if ( aDescriptor.has(daConnectionResource) ) 345*b1cdbd2cSJim Jagielski aDescriptor[daConnectionResource] >>= _rConnectionResource; 346*b1cdbd2cSJim Jagielski 347*b1cdbd2cSJim Jagielski aDescriptor[daCommand] >>= _rCommand; 348*b1cdbd2cSJim Jagielski aDescriptor[daCommandType] >>= _nCommandType; 349*b1cdbd2cSJim Jagielski aDescriptor[daColumnName] >>= _rFieldName; 350*b1cdbd2cSJim Jagielski return sal_True; 351*b1cdbd2cSJim Jagielski } 352*b1cdbd2cSJim Jagielski 353*b1cdbd2cSJim Jagielski // check if we have a (string) format we can use .... 354*b1cdbd2cSJim Jagielski SotFormatStringId nRecognizedFormat = 0; 355*b1cdbd2cSJim Jagielski if (_rData.HasFormat(SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE)) 356*b1cdbd2cSJim Jagielski nRecognizedFormat = SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE; 357*b1cdbd2cSJim Jagielski if (_rData.HasFormat(SOT_FORMATSTR_ID_SBA_CTRLDATAEXCHANGE)) 358*b1cdbd2cSJim Jagielski nRecognizedFormat = SOT_FORMATSTR_ID_SBA_CTRLDATAEXCHANGE; 359*b1cdbd2cSJim Jagielski if (!nRecognizedFormat) 360*b1cdbd2cSJim Jagielski return sal_False; 361*b1cdbd2cSJim Jagielski 362*b1cdbd2cSJim Jagielski String sFieldDescription; 363*b1cdbd2cSJim Jagielski const_cast<TransferableDataHelper&>(_rData).GetString(nRecognizedFormat, sFieldDescription); 364*b1cdbd2cSJim Jagielski 365*b1cdbd2cSJim Jagielski const sal_Unicode cSeparator = sal_Unicode(11); 366*b1cdbd2cSJim Jagielski _rDatasource = sFieldDescription.GetToken(0, cSeparator); 367*b1cdbd2cSJim Jagielski _rCommand = sFieldDescription.GetToken(1, cSeparator); 368*b1cdbd2cSJim Jagielski _nCommandType = sFieldDescription.GetToken(2, cSeparator).ToInt32(); 369*b1cdbd2cSJim Jagielski _rFieldName = sFieldDescription.GetToken(3, cSeparator); 370*b1cdbd2cSJim Jagielski 371*b1cdbd2cSJim Jagielski return sal_True; 372*b1cdbd2cSJim Jagielski } 373*b1cdbd2cSJim Jagielski 374*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- addDataToContainer(TransferDataContainer * _pContainer)375*b1cdbd2cSJim Jagielski void OColumnTransferable::addDataToContainer( TransferDataContainer* _pContainer ) 376*b1cdbd2cSJim Jagielski { 377*b1cdbd2cSJim Jagielski OSL_ENSURE( _pContainer, "OColumnTransferable::addDataToContainer: invalid container!" ); 378*b1cdbd2cSJim Jagielski if ( _pContainer ) 379*b1cdbd2cSJim Jagielski { 380*b1cdbd2cSJim Jagielski if ( m_nFormatFlags & CTF_FIELD_DESCRIPTOR ) 381*b1cdbd2cSJim Jagielski _pContainer->CopyAny( SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE, makeAny( m_sCompatibleFormat ) ); 382*b1cdbd2cSJim Jagielski 383*b1cdbd2cSJim Jagielski if ( m_nFormatFlags & CTF_CONTROL_EXCHANGE ) 384*b1cdbd2cSJim Jagielski _pContainer->CopyAny( SOT_FORMATSTR_ID_SBA_CTRLDATAEXCHANGE, makeAny( m_sCompatibleFormat ) ); 385*b1cdbd2cSJim Jagielski 386*b1cdbd2cSJim Jagielski if ( m_nFormatFlags & CTF_COLUMN_DESCRIPTOR ) 387*b1cdbd2cSJim Jagielski { 388*b1cdbd2cSJim Jagielski Any aContent = makeAny( m_aDescriptor.createPropertyValueSequence() ); 389*b1cdbd2cSJim Jagielski _pContainer->CopyAny( 390*b1cdbd2cSJim Jagielski sal::static_int_cast< sal_uInt16 >( getDescriptorFormatId() ), 391*b1cdbd2cSJim Jagielski aContent ); 392*b1cdbd2cSJim Jagielski } 393*b1cdbd2cSJim Jagielski } 394*b1cdbd2cSJim Jagielski } 395*b1cdbd2cSJim Jagielski 396*b1cdbd2cSJim Jagielski //==================================================================== 397*b1cdbd2cSJim Jagielski //= ODataAccessObjectTransferable 398*b1cdbd2cSJim Jagielski //==================================================================== ODataAccessObjectTransferable(const::rtl::OUString & _rDatasource,const::rtl::OUString & _rConnectionResource,const sal_Int32 _nCommandType,const::rtl::OUString & _rCommand)399*b1cdbd2cSJim Jagielski ODataAccessObjectTransferable::ODataAccessObjectTransferable( 400*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rDatasource 401*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _rConnectionResource 402*b1cdbd2cSJim Jagielski ,const sal_Int32 _nCommandType 403*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _rCommand 404*b1cdbd2cSJim Jagielski ) 405*b1cdbd2cSJim Jagielski { 406*b1cdbd2cSJim Jagielski construct(_rDatasource,_rConnectionResource,_nCommandType,_rCommand,NULL,(CommandType::COMMAND == _nCommandType),_rCommand); 407*b1cdbd2cSJim Jagielski } 408*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- ODataAccessObjectTransferable(const::rtl::OUString & _rDatasource,const::rtl::OUString & _rConnectionResource,const sal_Int32 _nCommandType,const::rtl::OUString & _rCommand,const Reference<XConnection> & _rxConnection)409*b1cdbd2cSJim Jagielski ODataAccessObjectTransferable::ODataAccessObjectTransferable( 410*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rDatasource 411*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _rConnectionResource 412*b1cdbd2cSJim Jagielski ,const sal_Int32 _nCommandType 413*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _rCommand 414*b1cdbd2cSJim Jagielski ,const Reference< XConnection >& _rxConnection) 415*b1cdbd2cSJim Jagielski { 416*b1cdbd2cSJim Jagielski OSL_ENSURE(_rxConnection.is(),"Wrong ctor used.!"); 417*b1cdbd2cSJim Jagielski construct(_rDatasource,_rConnectionResource,_nCommandType,_rCommand,_rxConnection,(CommandType::COMMAND == _nCommandType),_rCommand); 418*b1cdbd2cSJim Jagielski } 419*b1cdbd2cSJim Jagielski 420*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- ODataAccessObjectTransferable(const Reference<XPropertySet> & _rxLivingForm)421*b1cdbd2cSJim Jagielski ODataAccessObjectTransferable::ODataAccessObjectTransferable(const Reference< XPropertySet >& _rxLivingForm) 422*b1cdbd2cSJim Jagielski { 423*b1cdbd2cSJim Jagielski // collect some properties of the form 424*b1cdbd2cSJim Jagielski ::rtl::OUString sDatasourceName,sConnectionResource; 425*b1cdbd2cSJim Jagielski sal_Int32 nObjectType = CommandType::COMMAND; 426*b1cdbd2cSJim Jagielski ::rtl::OUString sObjectName; 427*b1cdbd2cSJim Jagielski Reference< XConnection > xConnection; 428*b1cdbd2cSJim Jagielski try 429*b1cdbd2cSJim Jagielski { 430*b1cdbd2cSJim Jagielski _rxLivingForm->getPropertyValue(FM_PROP_COMMANDTYPE) >>= nObjectType; 431*b1cdbd2cSJim Jagielski _rxLivingForm->getPropertyValue(FM_PROP_COMMAND) >>= sObjectName; 432*b1cdbd2cSJim Jagielski _rxLivingForm->getPropertyValue(FM_PROP_DATASOURCE) >>= sDatasourceName; 433*b1cdbd2cSJim Jagielski _rxLivingForm->getPropertyValue(FM_PROP_URL) >>= sConnectionResource; 434*b1cdbd2cSJim Jagielski _rxLivingForm->getPropertyValue(FM_PROP_ACTIVE_CONNECTION) >>= xConnection; 435*b1cdbd2cSJim Jagielski } 436*b1cdbd2cSJim Jagielski catch(Exception&) 437*b1cdbd2cSJim Jagielski { 438*b1cdbd2cSJim Jagielski OSL_ENSURE(sal_False, "ODataAccessObjectTransferable::ODataAccessObjectTransferable: could not collect essential form attributes !"); 439*b1cdbd2cSJim Jagielski return; 440*b1cdbd2cSJim Jagielski } 441*b1cdbd2cSJim Jagielski 442*b1cdbd2cSJim Jagielski String sObjectKind = (CommandType::TABLE == nObjectType) ? String('1') : String('0'); 443*b1cdbd2cSJim Jagielski 444*b1cdbd2cSJim Jagielski // check if the SQL-statement is modified 445*b1cdbd2cSJim Jagielski ::rtl::OUString sCompleteStatement; 446*b1cdbd2cSJim Jagielski try 447*b1cdbd2cSJim Jagielski { 448*b1cdbd2cSJim Jagielski _rxLivingForm->getPropertyValue(FM_PROP_ACTIVECOMMAND) >>= sCompleteStatement; 449*b1cdbd2cSJim Jagielski } 450*b1cdbd2cSJim Jagielski catch(Exception&) 451*b1cdbd2cSJim Jagielski { 452*b1cdbd2cSJim Jagielski OSL_ENSURE(sal_False, "ODataAccessObjectTransferable::ODataAccessObjectTransferable: could not collect essential form attributes (part two) !"); 453*b1cdbd2cSJim Jagielski return; 454*b1cdbd2cSJim Jagielski } 455*b1cdbd2cSJim Jagielski 456*b1cdbd2cSJim Jagielski construct( sDatasourceName 457*b1cdbd2cSJim Jagielski ,sConnectionResource 458*b1cdbd2cSJim Jagielski ,nObjectType 459*b1cdbd2cSJim Jagielski ,sObjectName,xConnection 460*b1cdbd2cSJim Jagielski ,!((CommandType::QUERY == nObjectType)) 461*b1cdbd2cSJim Jagielski ,sCompleteStatement); 462*b1cdbd2cSJim Jagielski } 463*b1cdbd2cSJim Jagielski 464*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- AddSupportedFormats()465*b1cdbd2cSJim Jagielski void ODataAccessObjectTransferable::AddSupportedFormats() 466*b1cdbd2cSJim Jagielski { 467*b1cdbd2cSJim Jagielski sal_Int32 nObjectType = CommandType::COMMAND; 468*b1cdbd2cSJim Jagielski m_aDescriptor[daCommandType] >>= nObjectType; 469*b1cdbd2cSJim Jagielski switch (nObjectType) 470*b1cdbd2cSJim Jagielski { 471*b1cdbd2cSJim Jagielski case CommandType::TABLE: 472*b1cdbd2cSJim Jagielski AddFormat(SOT_FORMATSTR_ID_DBACCESS_TABLE); 473*b1cdbd2cSJim Jagielski break; 474*b1cdbd2cSJim Jagielski case CommandType::QUERY: 475*b1cdbd2cSJim Jagielski AddFormat(SOT_FORMATSTR_ID_DBACCESS_QUERY); 476*b1cdbd2cSJim Jagielski break; 477*b1cdbd2cSJim Jagielski case CommandType::COMMAND: 478*b1cdbd2cSJim Jagielski AddFormat(SOT_FORMATSTR_ID_DBACCESS_COMMAND); 479*b1cdbd2cSJim Jagielski break; 480*b1cdbd2cSJim Jagielski } 481*b1cdbd2cSJim Jagielski 482*b1cdbd2cSJim Jagielski sal_Int32 nDescriptorLen = m_sCompatibleObjectDescription.getLength(); 483*b1cdbd2cSJim Jagielski if (nDescriptorLen) 484*b1cdbd2cSJim Jagielski { 485*b1cdbd2cSJim Jagielski if (m_sCompatibleObjectDescription.getStr()[nDescriptorLen] == 11) 486*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription = m_sCompatibleObjectDescription.copy(0, nDescriptorLen - 1); 487*b1cdbd2cSJim Jagielski 488*b1cdbd2cSJim Jagielski if (nDescriptorLen) 489*b1cdbd2cSJim Jagielski AddFormat(SOT_FORMATSTR_ID_SBA_DATAEXCHANGE); 490*b1cdbd2cSJim Jagielski } 491*b1cdbd2cSJim Jagielski } 492*b1cdbd2cSJim Jagielski 493*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- GetData(const DataFlavor & rFlavor)494*b1cdbd2cSJim Jagielski sal_Bool ODataAccessObjectTransferable::GetData( const DataFlavor& rFlavor ) 495*b1cdbd2cSJim Jagielski { 496*b1cdbd2cSJim Jagielski sal_uIntPtr nFormat = SotExchange::GetFormat(rFlavor); 497*b1cdbd2cSJim Jagielski switch (nFormat) 498*b1cdbd2cSJim Jagielski { 499*b1cdbd2cSJim Jagielski case SOT_FORMATSTR_ID_DBACCESS_TABLE: 500*b1cdbd2cSJim Jagielski case SOT_FORMATSTR_ID_DBACCESS_QUERY: 501*b1cdbd2cSJim Jagielski case SOT_FORMATSTR_ID_DBACCESS_COMMAND: 502*b1cdbd2cSJim Jagielski return SetAny( makeAny(m_aDescriptor.createPropertyValueSequence()), rFlavor ); 503*b1cdbd2cSJim Jagielski 504*b1cdbd2cSJim Jagielski case SOT_FORMATSTR_ID_SBA_DATAEXCHANGE: 505*b1cdbd2cSJim Jagielski return SetString(m_sCompatibleObjectDescription, rFlavor); 506*b1cdbd2cSJim Jagielski } 507*b1cdbd2cSJim Jagielski return sal_False; 508*b1cdbd2cSJim Jagielski } 509*b1cdbd2cSJim Jagielski 510*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- canExtractObjectDescriptor(const DataFlavorExVector & _rFlavors)511*b1cdbd2cSJim Jagielski sal_Bool ODataAccessObjectTransferable::canExtractObjectDescriptor(const DataFlavorExVector& _rFlavors) 512*b1cdbd2cSJim Jagielski { 513*b1cdbd2cSJim Jagielski for ( DataFlavorExVector::const_iterator aCheck = _rFlavors.begin(); 514*b1cdbd2cSJim Jagielski aCheck != _rFlavors.end(); 515*b1cdbd2cSJim Jagielski ++aCheck 516*b1cdbd2cSJim Jagielski ) 517*b1cdbd2cSJim Jagielski { 518*b1cdbd2cSJim Jagielski if (SOT_FORMATSTR_ID_DBACCESS_TABLE == aCheck->mnSotId) 519*b1cdbd2cSJim Jagielski return sal_True; 520*b1cdbd2cSJim Jagielski if (SOT_FORMATSTR_ID_DBACCESS_QUERY == aCheck->mnSotId) 521*b1cdbd2cSJim Jagielski return sal_True; 522*b1cdbd2cSJim Jagielski if (SOT_FORMATSTR_ID_DBACCESS_COMMAND == aCheck->mnSotId) 523*b1cdbd2cSJim Jagielski return sal_True; 524*b1cdbd2cSJim Jagielski } 525*b1cdbd2cSJim Jagielski return sal_False; 526*b1cdbd2cSJim Jagielski } 527*b1cdbd2cSJim Jagielski 528*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- extractObjectDescriptor(const TransferableDataHelper & _rData)529*b1cdbd2cSJim Jagielski ODataAccessDescriptor ODataAccessObjectTransferable::extractObjectDescriptor(const TransferableDataHelper& _rData) 530*b1cdbd2cSJim Jagielski { 531*b1cdbd2cSJim Jagielski sal_Int32 nKnownFormatId = 0; 532*b1cdbd2cSJim Jagielski if ( _rData.HasFormat( SOT_FORMATSTR_ID_DBACCESS_TABLE ) ) 533*b1cdbd2cSJim Jagielski nKnownFormatId = SOT_FORMATSTR_ID_DBACCESS_TABLE; 534*b1cdbd2cSJim Jagielski if ( _rData.HasFormat( SOT_FORMATSTR_ID_DBACCESS_QUERY ) ) 535*b1cdbd2cSJim Jagielski nKnownFormatId = SOT_FORMATSTR_ID_DBACCESS_QUERY; 536*b1cdbd2cSJim Jagielski if ( _rData.HasFormat( SOT_FORMATSTR_ID_DBACCESS_COMMAND ) ) 537*b1cdbd2cSJim Jagielski nKnownFormatId = SOT_FORMATSTR_ID_DBACCESS_COMMAND; 538*b1cdbd2cSJim Jagielski 539*b1cdbd2cSJim Jagielski if (0 != nKnownFormatId) 540*b1cdbd2cSJim Jagielski { 541*b1cdbd2cSJim Jagielski // extract the any from the transferable 542*b1cdbd2cSJim Jagielski DataFlavor aFlavor; 543*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 544*b1cdbd2cSJim Jagielski sal_Bool bSuccess = 545*b1cdbd2cSJim Jagielski #endif 546*b1cdbd2cSJim Jagielski SotExchange::GetFormatDataFlavor(nKnownFormatId, aFlavor); 547*b1cdbd2cSJim Jagielski OSL_ENSURE(bSuccess, "OColumnTransferable::extractColumnDescriptor: invalid data format (no flavor)!"); 548*b1cdbd2cSJim Jagielski 549*b1cdbd2cSJim Jagielski Any aDescriptor = _rData.GetAny(aFlavor); 550*b1cdbd2cSJim Jagielski 551*b1cdbd2cSJim Jagielski // extract the property value sequence 552*b1cdbd2cSJim Jagielski Sequence< PropertyValue > aDescriptorProps; 553*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 554*b1cdbd2cSJim Jagielski bSuccess = 555*b1cdbd2cSJim Jagielski #endif 556*b1cdbd2cSJim Jagielski aDescriptor >>= aDescriptorProps; 557*b1cdbd2cSJim Jagielski OSL_ENSURE(bSuccess, "OColumnTransferable::extractColumnDescriptor: invalid clipboard format!"); 558*b1cdbd2cSJim Jagielski 559*b1cdbd2cSJim Jagielski // build the real descriptor 560*b1cdbd2cSJim Jagielski return ODataAccessDescriptor(aDescriptorProps); 561*b1cdbd2cSJim Jagielski } 562*b1cdbd2cSJim Jagielski 563*b1cdbd2cSJim Jagielski OSL_ENSURE( sal_False, "OColumnTransferable::extractColumnDescriptor: unsupported formats only!" ); 564*b1cdbd2cSJim Jagielski return ODataAccessDescriptor(); 565*b1cdbd2cSJim Jagielski } 566*b1cdbd2cSJim Jagielski 567*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- addCompatibleSelectionDescription(const Sequence<Any> & _rSelRows)568*b1cdbd2cSJim Jagielski void ODataAccessObjectTransferable::addCompatibleSelectionDescription( const Sequence< Any >& _rSelRows ) 569*b1cdbd2cSJim Jagielski { 570*b1cdbd2cSJim Jagielski const sal_Unicode cSeparator(11); 571*b1cdbd2cSJim Jagielski const ::rtl::OUString sSeparator(&cSeparator, 1); 572*b1cdbd2cSJim Jagielski 573*b1cdbd2cSJim Jagielski const Any* pSelRows = _rSelRows.getConstArray(); 574*b1cdbd2cSJim Jagielski const Any* pSelRowsEnd = pSelRows + _rSelRows.getLength(); 575*b1cdbd2cSJim Jagielski for ( ; pSelRows < pSelRowsEnd; ++pSelRows ) 576*b1cdbd2cSJim Jagielski { 577*b1cdbd2cSJim Jagielski sal_Int32 nSelectedRow( 0 ); 578*b1cdbd2cSJim Jagielski OSL_VERIFY( *pSelRows >>= nSelectedRow ); 579*b1cdbd2cSJim Jagielski 580*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += ::rtl::OUString::valueOf((sal_Int32)nSelectedRow); 581*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += sSeparator; 582*b1cdbd2cSJim Jagielski } 583*b1cdbd2cSJim Jagielski } 584*b1cdbd2cSJim Jagielski 585*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- ObjectReleased()586*b1cdbd2cSJim Jagielski void ODataAccessObjectTransferable::ObjectReleased() 587*b1cdbd2cSJim Jagielski { 588*b1cdbd2cSJim Jagielski m_aDescriptor.clear(); 589*b1cdbd2cSJim Jagielski } 590*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- construct(const::rtl::OUString & _rDatasource,const::rtl::OUString & _rConnectionResource,const sal_Int32 _nCommandType,const::rtl::OUString & _rCommand,const Reference<XConnection> & _rxConnection,sal_Bool _bAddCommand,const::rtl::OUString & _sActiveCommand)591*b1cdbd2cSJim Jagielski void ODataAccessObjectTransferable::construct( const ::rtl::OUString& _rDatasource 592*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _rConnectionResource 593*b1cdbd2cSJim Jagielski ,const sal_Int32 _nCommandType 594*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _rCommand 595*b1cdbd2cSJim Jagielski ,const Reference< XConnection >& _rxConnection 596*b1cdbd2cSJim Jagielski ,sal_Bool _bAddCommand 597*b1cdbd2cSJim Jagielski ,const ::rtl::OUString& _sActiveCommand) 598*b1cdbd2cSJim Jagielski { 599*b1cdbd2cSJim Jagielski m_aDescriptor.setDataSource(_rDatasource); 600*b1cdbd2cSJim Jagielski // build the descriptor (the property sequence) 601*b1cdbd2cSJim Jagielski if ( _rConnectionResource.getLength() ) 602*b1cdbd2cSJim Jagielski m_aDescriptor[daConnectionResource] <<= _rConnectionResource; 603*b1cdbd2cSJim Jagielski if ( _rxConnection.is() ) 604*b1cdbd2cSJim Jagielski m_aDescriptor[daConnection] <<= _rxConnection; 605*b1cdbd2cSJim Jagielski m_aDescriptor[daCommand] <<= _rCommand; 606*b1cdbd2cSJim Jagielski m_aDescriptor[daCommandType] <<= _nCommandType; 607*b1cdbd2cSJim Jagielski 608*b1cdbd2cSJim Jagielski // extract the single values from the sequence 609*b1cdbd2cSJim Jagielski 610*b1cdbd2cSJim Jagielski ::rtl::OUString sObjectName; 611*b1cdbd2cSJim Jagielski ::rtl::OUString sDatasourceName = _rDatasource; 612*b1cdbd2cSJim Jagielski sObjectName = _rCommand; 613*b1cdbd2cSJim Jagielski 614*b1cdbd2cSJim Jagielski // for compatibility: create a string which can be used for the SOT_FORMATSTR_ID_SBA_DATAEXCHANGE format 615*b1cdbd2cSJim Jagielski 616*b1cdbd2cSJim Jagielski sal_Bool bTreatAsStatement = (CommandType::COMMAND == _nCommandType); 617*b1cdbd2cSJim Jagielski // statements are - in this old and ugly format - described as queries 618*b1cdbd2cSJim Jagielski 619*b1cdbd2cSJim Jagielski const sal_Unicode cSeparator = sal_Unicode(11); 620*b1cdbd2cSJim Jagielski const ::rtl::OUString sSeparator(&cSeparator, 1); 621*b1cdbd2cSJim Jagielski 622*b1cdbd2cSJim Jagielski const sal_Unicode cTableMark = '1'; 623*b1cdbd2cSJim Jagielski const sal_Unicode cQueryMark = '0'; 624*b1cdbd2cSJim Jagielski 625*b1cdbd2cSJim Jagielski // build the descriptor string 626*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += sDatasourceName; 627*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += sSeparator; 628*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += bTreatAsStatement ? ::rtl::OUString() : sObjectName; 629*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += sSeparator; 630*b1cdbd2cSJim Jagielski switch (_nCommandType) 631*b1cdbd2cSJim Jagielski { 632*b1cdbd2cSJim Jagielski case CommandType::TABLE: 633*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += ::rtl::OUString(&cTableMark, 1); 634*b1cdbd2cSJim Jagielski break; 635*b1cdbd2cSJim Jagielski case CommandType::QUERY: 636*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += ::rtl::OUString(&cQueryMark, 1); 637*b1cdbd2cSJim Jagielski break; 638*b1cdbd2cSJim Jagielski case CommandType::COMMAND: 639*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += ::rtl::OUString(&cQueryMark, 1); 640*b1cdbd2cSJim Jagielski // think of it as a query 641*b1cdbd2cSJim Jagielski break; 642*b1cdbd2cSJim Jagielski } 643*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += sSeparator; 644*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += _bAddCommand ? _sActiveCommand : ::rtl::OUString(); 645*b1cdbd2cSJim Jagielski m_sCompatibleObjectDescription += sSeparator; 646*b1cdbd2cSJim Jagielski } 647*b1cdbd2cSJim Jagielski 648*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- OMultiColumnTransferable(const Sequence<PropertyValue> & _aDescriptors)649*b1cdbd2cSJim Jagielski OMultiColumnTransferable::OMultiColumnTransferable(const Sequence< PropertyValue >& _aDescriptors) : m_aDescriptors(_aDescriptors) 650*b1cdbd2cSJim Jagielski { 651*b1cdbd2cSJim Jagielski } 652*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getDescriptorFormatId()653*b1cdbd2cSJim Jagielski sal_uInt32 OMultiColumnTransferable::getDescriptorFormatId() 654*b1cdbd2cSJim Jagielski { 655*b1cdbd2cSJim Jagielski static sal_uInt32 s_nFormat = (sal_uInt32)-1; 656*b1cdbd2cSJim Jagielski if ((sal_uInt32)-1 == s_nFormat) 657*b1cdbd2cSJim Jagielski { 658*b1cdbd2cSJim Jagielski s_nFormat = SotExchange::RegisterFormatName(String::CreateFromAscii("application/x-openoffice;windows_formatname=\"dbaccess.MultipleColumnDescriptorTransfer\"")); 659*b1cdbd2cSJim Jagielski OSL_ENSURE((sal_uInt32)-1 != s_nFormat, "OColumnTransferable::getDescriptorFormatId: bad exchange id!"); 660*b1cdbd2cSJim Jagielski } 661*b1cdbd2cSJim Jagielski return s_nFormat; 662*b1cdbd2cSJim Jagielski } 663*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- AddSupportedFormats()664*b1cdbd2cSJim Jagielski void OMultiColumnTransferable::AddSupportedFormats() 665*b1cdbd2cSJim Jagielski { 666*b1cdbd2cSJim Jagielski AddFormat(getDescriptorFormatId()); 667*b1cdbd2cSJim Jagielski } 668*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- push_back(ODataAccessDescriptor & _aDescriptor)669*b1cdbd2cSJim Jagielski void OMultiColumnTransferable::push_back(ODataAccessDescriptor& _aDescriptor) 670*b1cdbd2cSJim Jagielski { 671*b1cdbd2cSJim Jagielski const sal_Int32 nCount = m_aDescriptors.getLength(); 672*b1cdbd2cSJim Jagielski m_aDescriptors.realloc(nCount+1); 673*b1cdbd2cSJim Jagielski m_aDescriptors[nCount].Value <<= _aDescriptor.createPropertyValueSequence(); 674*b1cdbd2cSJim Jagielski } 675*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- GetData(const DataFlavor & _rFlavor)676*b1cdbd2cSJim Jagielski sal_Bool OMultiColumnTransferable::GetData( const DataFlavor& _rFlavor ) 677*b1cdbd2cSJim Jagielski { 678*b1cdbd2cSJim Jagielski const sal_uInt32 nFormatId = SotExchange::GetFormat(_rFlavor); 679*b1cdbd2cSJim Jagielski if (nFormatId == getDescriptorFormatId()) 680*b1cdbd2cSJim Jagielski { 681*b1cdbd2cSJim Jagielski return SetAny( makeAny( m_aDescriptors ), _rFlavor ); 682*b1cdbd2cSJim Jagielski } 683*b1cdbd2cSJim Jagielski 684*b1cdbd2cSJim Jagielski return sal_False; 685*b1cdbd2cSJim Jagielski } 686*b1cdbd2cSJim Jagielski 687*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- canExtractDescriptor(const DataFlavorExVector & _rFlavors)688*b1cdbd2cSJim Jagielski sal_Bool OMultiColumnTransferable::canExtractDescriptor(const DataFlavorExVector& _rFlavors) 689*b1cdbd2cSJim Jagielski { 690*b1cdbd2cSJim Jagielski DataFlavorExVector::const_iterator aCheck = _rFlavors.begin(); 691*b1cdbd2cSJim Jagielski for ( ; 692*b1cdbd2cSJim Jagielski aCheck != _rFlavors.end() && getDescriptorFormatId() == aCheck->mnSotId; 693*b1cdbd2cSJim Jagielski ++aCheck 694*b1cdbd2cSJim Jagielski ) 695*b1cdbd2cSJim Jagielski ; 696*b1cdbd2cSJim Jagielski 697*b1cdbd2cSJim Jagielski return aCheck == _rFlavors.end(); 698*b1cdbd2cSJim Jagielski } 699*b1cdbd2cSJim Jagielski 700*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- extractDescriptor(const TransferableDataHelper & _rData)701*b1cdbd2cSJim Jagielski Sequence< PropertyValue > OMultiColumnTransferable::extractDescriptor(const TransferableDataHelper& _rData) 702*b1cdbd2cSJim Jagielski { 703*b1cdbd2cSJim Jagielski Sequence< PropertyValue > aList; 704*b1cdbd2cSJim Jagielski if (_rData.HasFormat(getDescriptorFormatId())) 705*b1cdbd2cSJim Jagielski { 706*b1cdbd2cSJim Jagielski // extract the any from the transferable 707*b1cdbd2cSJim Jagielski DataFlavor aFlavor; 708*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 709*b1cdbd2cSJim Jagielski sal_Bool bSuccess = 710*b1cdbd2cSJim Jagielski #endif 711*b1cdbd2cSJim Jagielski SotExchange::GetFormatDataFlavor(getDescriptorFormatId(), aFlavor); 712*b1cdbd2cSJim Jagielski OSL_ENSURE(bSuccess, "OColumnTransferable::extractColumnDescriptor: invalid data format (no flavor)!"); 713*b1cdbd2cSJim Jagielski 714*b1cdbd2cSJim Jagielski _rData.GetAny(aFlavor) >>= aList; 715*b1cdbd2cSJim Jagielski } // if (_rData.HasFormat(getDescriptorFormatId())) 716*b1cdbd2cSJim Jagielski return aList; 717*b1cdbd2cSJim Jagielski } 718*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- ObjectReleased()719*b1cdbd2cSJim Jagielski void OMultiColumnTransferable::ObjectReleased() 720*b1cdbd2cSJim Jagielski { 721*b1cdbd2cSJim Jagielski m_aDescriptors.realloc(0); 722*b1cdbd2cSJim Jagielski } 723*b1cdbd2cSJim Jagielski 724*b1cdbd2cSJim Jagielski //........................................................................ 725*b1cdbd2cSJim Jagielski } // namespace svx 726*b1cdbd2cSJim Jagielski //........................................................................ 727*b1cdbd2cSJim Jagielski 728*b1cdbd2cSJim Jagielski 729