xref: /aoo4110/main/svx/source/fmcomp/dbaexchange.cxx (revision b1cdbd2c)
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