1*ca5ec200SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*ca5ec200SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*ca5ec200SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*ca5ec200SAndrew Rist  * distributed with this work for additional information
6*ca5ec200SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*ca5ec200SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*ca5ec200SAndrew Rist  * "License"); you may not use this file except in compliance
9*ca5ec200SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*ca5ec200SAndrew Rist  *
11*ca5ec200SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*ca5ec200SAndrew Rist  *
13*ca5ec200SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*ca5ec200SAndrew Rist  * software distributed under the License is distributed on an
15*ca5ec200SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*ca5ec200SAndrew Rist  * KIND, either express or implied.  See the License for the
17*ca5ec200SAndrew Rist  * specific language governing permissions and limitations
18*ca5ec200SAndrew Rist  * under the License.
19*ca5ec200SAndrew Rist  *
20*ca5ec200SAndrew Rist  *************************************************************/
21*ca5ec200SAndrew Rist 
22*ca5ec200SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "oox/xls/querytablebuffer.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include <com/sun/star/container/XEnumerationAccess.hpp>
27cdf0e10cSrcweir #include <com/sun/star/sheet/XAreaLink.hpp>
28cdf0e10cSrcweir #include <com/sun/star/sheet/XAreaLinks.hpp>
29cdf0e10cSrcweir #include "oox/core/filterbase.hxx"
30cdf0e10cSrcweir #include "oox/helper/attributelist.hxx"
31cdf0e10cSrcweir #include "oox/xls/addressconverter.hxx"
32cdf0e10cSrcweir #include "oox/xls/biffinputstream.hxx"
33cdf0e10cSrcweir #include "oox/xls/connectionsbuffer.hxx"
34cdf0e10cSrcweir #include "oox/xls/defnamesbuffer.hxx"
35cdf0e10cSrcweir 
36cdf0e10cSrcweir namespace oox {
37cdf0e10cSrcweir namespace xls {
38cdf0e10cSrcweir 
39cdf0e10cSrcweir // ============================================================================
40cdf0e10cSrcweir 
41cdf0e10cSrcweir using namespace ::com::sun::star::container;
42cdf0e10cSrcweir using namespace ::com::sun::star::sheet;
43cdf0e10cSrcweir using namespace ::com::sun::star::table;
44cdf0e10cSrcweir using namespace ::com::sun::star::uno;
45cdf0e10cSrcweir 
46cdf0e10cSrcweir using ::rtl::OUString;
47cdf0e10cSrcweir using ::rtl::OUStringBuffer;
48cdf0e10cSrcweir 
49cdf0e10cSrcweir // ============================================================================
50cdf0e10cSrcweir 
51cdf0e10cSrcweir namespace {
52cdf0e10cSrcweir 
53cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_HEADERS          = 0x00000001;
54cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_ROWNUMBERS       = 0x00000002;
55cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_DISABLEREFRESH   = 0x00000004;
56cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_BACKGROUND       = 0x00000008;
57cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_FIRSTBACKGROUND  = 0x00000010;
58cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_REFRESHONLOAD    = 0x00000020;
59cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_FILLFORMULAS     = 0x00000100;
60cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_SAVEDATA         = 0x00000200;
61cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_DISABLEEDIT      = 0x00000400;
62cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_PRESERVEFORMAT   = 0x00000800;
63cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_ADJUSTCOLWIDTH   = 0x00001000;
64cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_INTERMEDIATE     = 0x00002000;
65cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYNUMFMT      = 0x00004000;
66cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYFONT        = 0x00008000;
67cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYALIGNMENT   = 0x00010000;
68cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYBORDER      = 0x00020000;
69cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYFILL        = 0x00040000;
70cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYPROTECTION  = 0x00080000;
71cdf0e10cSrcweir 
72cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_HEADERS            = 0x0001;
73cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_ROWNUMBERS         = 0x0002;
74cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_DISABLEREFRESH     = 0x0004;
75cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_BACKGROUND         = 0x0008;
76cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_FIRSTBACKGROUND    = 0x0010;
77cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_REFRESHONLOAD      = 0x0020;
78cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_DELETEUNUSED       = 0x0040;
79cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_FILLFORMULAS       = 0x0080;
80cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_ADJUSTCOLWIDTH     = 0x0100;
81cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_SAVEDATA           = 0x0200;
82cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_DISABLEEDIT        = 0x0400;
83cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_OVERWRITEEXISTING  = 0x2000;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYNUMFMT        = 0x0001;
86cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYFONT          = 0x0002;
87cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYALIGNMENT     = 0x0004;
88cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYBORDER        = 0x0008;
89cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYFILL          = 0x0010;
90cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYPROTECTION    = 0x0020;
91cdf0e10cSrcweir 
92cdf0e10cSrcweir const sal_uInt32 BIFF_QTREFRESH_PRESERVEFORMAT      = 0x00000001;
93cdf0e10cSrcweir const sal_uInt32 BIFF_QTREFRESH_ADJUSTCOLWIDTH      = 0x00000002;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir // ----------------------------------------------------------------------------
96cdf0e10cSrcweir 
lclAppendWebQueryTableName(OUStringBuffer & rTables,const OUString & rTableName)97cdf0e10cSrcweir void lclAppendWebQueryTableName( OUStringBuffer& rTables, const OUString& rTableName )
98cdf0e10cSrcweir {
99cdf0e10cSrcweir     if( rTableName.getLength() > 0 )
100cdf0e10cSrcweir     {
101cdf0e10cSrcweir         if( rTables.getLength() > 0 )
102cdf0e10cSrcweir             rTables.append( sal_Unicode( ';' ) );
103cdf0e10cSrcweir         rTables.appendAscii( RTL_CONSTASCII_STRINGPARAM( "HTML__" ) ).append( rTableName );
104cdf0e10cSrcweir     }
105cdf0e10cSrcweir }
106cdf0e10cSrcweir 
lclAppendWebQueryTableIndex(OUStringBuffer & rTables,sal_Int32 nTableIndex)107cdf0e10cSrcweir void lclAppendWebQueryTableIndex( OUStringBuffer& rTables, sal_Int32 nTableIndex )
108cdf0e10cSrcweir {
109cdf0e10cSrcweir     if( nTableIndex > 0 )
110cdf0e10cSrcweir     {
111cdf0e10cSrcweir         if( rTables.getLength() > 0 )
112cdf0e10cSrcweir             rTables.append( sal_Unicode( ';' ) );
113cdf0e10cSrcweir         rTables.appendAscii( RTL_CONSTASCII_STRINGPARAM( "HTML_" ) ).append( nTableIndex );
114cdf0e10cSrcweir     }
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
lclBuildWebQueryTables(const WebPrModel::TablesVector & rTables)117cdf0e10cSrcweir OUString lclBuildWebQueryTables( const WebPrModel::TablesVector& rTables )
118cdf0e10cSrcweir {
119cdf0e10cSrcweir     if( rTables.empty() )
120cdf0e10cSrcweir         return CREATE_OUSTRING( "HTML_tables" );
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     OUStringBuffer aTables;
123cdf0e10cSrcweir     for( WebPrModel::TablesVector::const_iterator aIt = rTables.begin(), aEnd = rTables.end(); aIt != aEnd; ++aIt )
124cdf0e10cSrcweir     {
125cdf0e10cSrcweir         if( aIt->has< OUString >() )
126cdf0e10cSrcweir             lclAppendWebQueryTableName( aTables, aIt->get< OUString >() );
127cdf0e10cSrcweir         else if( aIt->has< sal_Int32 >() )
128cdf0e10cSrcweir             lclAppendWebQueryTableIndex( aTables, aIt->get< sal_Int32 >() );
129cdf0e10cSrcweir     }
130cdf0e10cSrcweir     return aTables.makeStringAndClear();
131cdf0e10cSrcweir }
132cdf0e10cSrcweir 
lclFindAreaLink(const Reference<XAreaLinks> & rxAreaLinks,const CellAddress & rDestPos,const OUString & rFileUrl,const OUString & rTables,const OUString & rFilterName,const OUString & rFilterOptions)133cdf0e10cSrcweir Reference< XAreaLink > lclFindAreaLink(
134cdf0e10cSrcweir         const Reference< XAreaLinks >& rxAreaLinks, const CellAddress& rDestPos,
135cdf0e10cSrcweir         const OUString& rFileUrl, const OUString& rTables, const OUString& rFilterName, const OUString& rFilterOptions )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir     try
138cdf0e10cSrcweir     {
139cdf0e10cSrcweir         Reference< XEnumerationAccess > xAreaLinksEA( rxAreaLinks, UNO_QUERY_THROW );
140cdf0e10cSrcweir         Reference< XEnumeration > xAreaLinksEnum( xAreaLinksEA->createEnumeration(), UNO_SET_THROW );
141cdf0e10cSrcweir         while( xAreaLinksEnum->hasMoreElements() )
142cdf0e10cSrcweir         {
143cdf0e10cSrcweir             Reference< XAreaLink > xAreaLink( xAreaLinksEnum->nextElement(), UNO_QUERY_THROW );
144cdf0e10cSrcweir             PropertySet aPropSet( xAreaLink );
145cdf0e10cSrcweir             CellRangeAddress aDestArea = xAreaLink->getDestArea();
146cdf0e10cSrcweir             OUString aString;
147cdf0e10cSrcweir             if( (rDestPos.Sheet == aDestArea.Sheet) && (rDestPos.Column == aDestArea.StartColumn) && (rDestPos.Row == aDestArea.StartRow) &&
148cdf0e10cSrcweir                     (rTables == xAreaLink->getSourceArea()) &&
149cdf0e10cSrcweir                     aPropSet.getProperty( aString, PROP_Url ) && (rFileUrl == aString) &&
150cdf0e10cSrcweir                     aPropSet.getProperty( aString, PROP_Filter ) && (rFilterName == aString) &&
151cdf0e10cSrcweir                     aPropSet.getProperty( aString, PROP_FilterOptions ) && (rFilterOptions == aString) )
152cdf0e10cSrcweir                 return xAreaLink;
153cdf0e10cSrcweir         }
154cdf0e10cSrcweir     }
155cdf0e10cSrcweir     catch( Exception& )
156cdf0e10cSrcweir     {
157cdf0e10cSrcweir     }
158cdf0e10cSrcweir     return Reference< XAreaLink >();
159cdf0e10cSrcweir }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir } // namespace
162cdf0e10cSrcweir 
163cdf0e10cSrcweir // ============================================================================
164cdf0e10cSrcweir 
QueryTableModel()165cdf0e10cSrcweir QueryTableModel::QueryTableModel() :
166cdf0e10cSrcweir     mnConnId( -1 ),
167cdf0e10cSrcweir     mnGrowShrinkType( XML_insertDelete ),
168cdf0e10cSrcweir     mbHeaders( true ),
169cdf0e10cSrcweir     mbRowNumbers( false ),
170cdf0e10cSrcweir     mbDisableRefresh( false ),
171cdf0e10cSrcweir     mbBackground( true ),
172cdf0e10cSrcweir     mbFirstBackground( false ),
173cdf0e10cSrcweir     mbRefreshOnLoad( false ),
174cdf0e10cSrcweir     mbFillFormulas( false ),
175cdf0e10cSrcweir     mbRemoveDataOnSave( false ),
176cdf0e10cSrcweir     mbDisableEdit( false ),
177cdf0e10cSrcweir     mbPreserveFormat( true ),
178cdf0e10cSrcweir     mbAdjustColWidth( true ),
179cdf0e10cSrcweir     mbIntermediate( false )
180cdf0e10cSrcweir {
181cdf0e10cSrcweir }
182cdf0e10cSrcweir 
183cdf0e10cSrcweir // ----------------------------------------------------------------------------
184cdf0e10cSrcweir 
QueryTable(const WorksheetHelper & rHelper)185cdf0e10cSrcweir QueryTable::QueryTable( const WorksheetHelper& rHelper ) :
186cdf0e10cSrcweir     WorksheetHelper( rHelper )
187cdf0e10cSrcweir {
188cdf0e10cSrcweir }
189cdf0e10cSrcweir 
importQueryTable(const AttributeList & rAttribs)190cdf0e10cSrcweir void QueryTable::importQueryTable( const AttributeList& rAttribs )
191cdf0e10cSrcweir {
192cdf0e10cSrcweir     maModel.maDefName          = rAttribs.getXString( XML_name, OUString() );
193cdf0e10cSrcweir     maModel.mnConnId           = rAttribs.getInteger( XML_connectionId, -1 );
194cdf0e10cSrcweir     maModel.mnGrowShrinkType   = rAttribs.getToken( XML_growShrinkType, XML_insertDelete );
195cdf0e10cSrcweir     maModel.mnAutoFormatId     = rAttribs.getInteger( XML_autoFormatId, 0 );
196cdf0e10cSrcweir     maModel.mbHeaders          = rAttribs.getBool( XML_headers, true );
197cdf0e10cSrcweir     maModel.mbRowNumbers       = rAttribs.getBool( XML_rowNumbers, false );
198cdf0e10cSrcweir     maModel.mbDisableRefresh   = rAttribs.getBool( XML_disableRefresh, false );
199cdf0e10cSrcweir     maModel.mbBackground       = rAttribs.getBool( XML_backgroundRefresh, true );
200cdf0e10cSrcweir     maModel.mbFirstBackground  = rAttribs.getBool( XML_firstBackgroundRefresh, false );
201cdf0e10cSrcweir     maModel.mbRefreshOnLoad    = rAttribs.getBool( XML_refreshOnLoad, false );
202cdf0e10cSrcweir     maModel.mbFillFormulas     = rAttribs.getBool( XML_fillFormulas, false );
203cdf0e10cSrcweir     maModel.mbRemoveDataOnSave = rAttribs.getBool( XML_removeDataOnSave, false );
204cdf0e10cSrcweir     maModel.mbDisableEdit      = rAttribs.getBool( XML_disableEdit, false );
205cdf0e10cSrcweir     maModel.mbPreserveFormat   = rAttribs.getBool( XML_preserveFormatting, true );
206cdf0e10cSrcweir     maModel.mbAdjustColWidth   = rAttribs.getBool( XML_adjustColumnWidth, true );
207cdf0e10cSrcweir     maModel.mbIntermediate     = rAttribs.getBool( XML_intermediate, false );
208cdf0e10cSrcweir     maModel.mbApplyNumFmt      = rAttribs.getBool( XML_applyNumberFormats, false );
209cdf0e10cSrcweir     maModel.mbApplyFont        = rAttribs.getBool( XML_applyFontFormats, false );
210cdf0e10cSrcweir     maModel.mbApplyAlignment   = rAttribs.getBool( XML_applyAlignmentFormats, false );
211cdf0e10cSrcweir     maModel.mbApplyBorder      = rAttribs.getBool( XML_applyBorderFormats, false );
212cdf0e10cSrcweir     maModel.mbApplyFill        = rAttribs.getBool( XML_applyPatternFormats, false );
213cdf0e10cSrcweir     // OOXML and BIFF12 documentation differ: OOXML mentions width/height, BIFF12 mentions protection
214cdf0e10cSrcweir     maModel.mbApplyProtection  = rAttribs.getBool( XML_applyWidthHeightFormats, false );
215cdf0e10cSrcweir }
216cdf0e10cSrcweir 
importQueryTable(SequenceInputStream & rStrm)217cdf0e10cSrcweir void QueryTable::importQueryTable( SequenceInputStream& rStrm )
218cdf0e10cSrcweir {
219cdf0e10cSrcweir     sal_uInt32 nFlags;
220cdf0e10cSrcweir     rStrm >> nFlags;
221cdf0e10cSrcweir     maModel.mnAutoFormatId = rStrm.readuInt16();
222cdf0e10cSrcweir     rStrm >> maModel.mnConnId >> maModel.maDefName;
223cdf0e10cSrcweir 
224cdf0e10cSrcweir     static const sal_Int32 spnGrowShrinkTypes[] = { XML_insertClear, XML_insertDelete, XML_overwriteClear };
225cdf0e10cSrcweir     maModel.mnGrowShrinkType = STATIC_ARRAY_SELECT( spnGrowShrinkTypes, extractValue< sal_uInt8 >( nFlags, 6, 2 ), XML_insertDelete );
226cdf0e10cSrcweir 
227cdf0e10cSrcweir     maModel.mbHeaders           = getFlag( nFlags, BIFF12_QUERYTABLE_HEADERS );
228cdf0e10cSrcweir     maModel.mbRowNumbers        = getFlag( nFlags, BIFF12_QUERYTABLE_ROWNUMBERS );
229cdf0e10cSrcweir     maModel.mbDisableRefresh    = getFlag( nFlags, BIFF12_QUERYTABLE_DISABLEREFRESH );
230cdf0e10cSrcweir     maModel.mbBackground        = getFlag( nFlags, BIFF12_QUERYTABLE_BACKGROUND );
231cdf0e10cSrcweir     maModel.mbFirstBackground   = getFlag( nFlags, BIFF12_QUERYTABLE_FIRSTBACKGROUND );
232cdf0e10cSrcweir     maModel.mbRefreshOnLoad     = getFlag( nFlags, BIFF12_QUERYTABLE_REFRESHONLOAD );
233cdf0e10cSrcweir     maModel.mbFillFormulas      = getFlag( nFlags, BIFF12_QUERYTABLE_FILLFORMULAS );
234cdf0e10cSrcweir     maModel.mbRemoveDataOnSave  = !getFlag( nFlags, BIFF12_QUERYTABLE_SAVEDATA ); // flag negated in BIFF12
235cdf0e10cSrcweir     maModel.mbDisableEdit       = getFlag( nFlags, BIFF12_QUERYTABLE_DISABLEEDIT );
236cdf0e10cSrcweir     maModel.mbPreserveFormat    = getFlag( nFlags, BIFF12_QUERYTABLE_PRESERVEFORMAT );
237cdf0e10cSrcweir     maModel.mbAdjustColWidth    = getFlag( nFlags, BIFF12_QUERYTABLE_ADJUSTCOLWIDTH );
238cdf0e10cSrcweir     maModel.mbIntermediate      = getFlag( nFlags, BIFF12_QUERYTABLE_INTERMEDIATE );
239cdf0e10cSrcweir     maModel.mbApplyNumFmt       = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYNUMFMT );
240cdf0e10cSrcweir     maModel.mbApplyFont         = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYFONT );
241cdf0e10cSrcweir     maModel.mbApplyAlignment    = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYALIGNMENT );
242cdf0e10cSrcweir     maModel.mbApplyBorder       = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYBORDER );
243cdf0e10cSrcweir     maModel.mbApplyFill         = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYFILL );
244cdf0e10cSrcweir     maModel.mbApplyProtection   = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYPROTECTION );
245cdf0e10cSrcweir }
246cdf0e10cSrcweir 
importQueryTable(BiffInputStream & rStrm)247cdf0e10cSrcweir void QueryTable::importQueryTable( BiffInputStream& rStrm )
248cdf0e10cSrcweir {
249cdf0e10cSrcweir     sal_uInt16 nFlags, nAutoFormatFlags;
250cdf0e10cSrcweir     rStrm >> nFlags;
251cdf0e10cSrcweir     maModel.mnAutoFormatId = rStrm.readuInt16();
252cdf0e10cSrcweir     rStrm >> nAutoFormatFlags;
253cdf0e10cSrcweir     rStrm.skip( 4 );
254cdf0e10cSrcweir     maModel.maDefName = rStrm.readUniString();
255cdf0e10cSrcweir 
256cdf0e10cSrcweir     bool bDeleteUnused = getFlag( nFlags, BIFF_QUERYTABLE_DELETEUNUSED );
257cdf0e10cSrcweir     bool bOverwriteExisting = getFlag( nFlags, BIFF_QUERYTABLE_OVERWRITEEXISTING );
258cdf0e10cSrcweir     OSL_ENSURE( !bDeleteUnused || !bOverwriteExisting, "QueryTable::importQueryTable - invalid flags" );
259cdf0e10cSrcweir     maModel.mnGrowShrinkType = bDeleteUnused ? XML_insertDelete : (bOverwriteExisting ? XML_overwriteClear : XML_insertClear);
260cdf0e10cSrcweir 
261cdf0e10cSrcweir     maModel.mbHeaders           = getFlag( nFlags, BIFF_QUERYTABLE_HEADERS );
262cdf0e10cSrcweir     maModel.mbRowNumbers        = getFlag( nFlags, BIFF_QUERYTABLE_ROWNUMBERS );
263cdf0e10cSrcweir     maModel.mbDisableRefresh    = getFlag( nFlags, BIFF_QUERYTABLE_DISABLEREFRESH );
264cdf0e10cSrcweir     maModel.mbBackground        = getFlag( nFlags, BIFF_QUERYTABLE_BACKGROUND );
265cdf0e10cSrcweir     maModel.mbFirstBackground   = getFlag( nFlags, BIFF_QUERYTABLE_FIRSTBACKGROUND );
266cdf0e10cSrcweir     maModel.mbRefreshOnLoad     = getFlag( nFlags, BIFF_QUERYTABLE_REFRESHONLOAD );
267cdf0e10cSrcweir     maModel.mbFillFormulas      = getFlag( nFlags, BIFF_QUERYTABLE_FILLFORMULAS );
268cdf0e10cSrcweir     maModel.mbRemoveDataOnSave  = !getFlag( nFlags, BIFF_QUERYTABLE_SAVEDATA ); // flag negated in BIFF
269cdf0e10cSrcweir     maModel.mbDisableEdit       = getFlag( nFlags, BIFF_QUERYTABLE_DISABLEEDIT );
270cdf0e10cSrcweir     maModel.mbAdjustColWidth    = getFlag( nFlags, BIFF_QUERYTABLE_ADJUSTCOLWIDTH );
271cdf0e10cSrcweir     maModel.mbApplyNumFmt       = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYNUMFMT );
272cdf0e10cSrcweir     maModel.mbApplyFont         = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYFONT );
273cdf0e10cSrcweir     maModel.mbApplyAlignment    = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYALIGNMENT );
274cdf0e10cSrcweir     maModel.mbApplyBorder       = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYBORDER );
275cdf0e10cSrcweir     maModel.mbApplyFill         = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYFILL );
276cdf0e10cSrcweir     maModel.mbApplyProtection   = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYPROTECTION );
277cdf0e10cSrcweir 
278cdf0e10cSrcweir     // create a new connection object that will store settings from following records
279cdf0e10cSrcweir     OSL_ENSURE( maModel.mnConnId == -1, "QueryTable::importQueryTable - multiple call" );
280cdf0e10cSrcweir     Connection& rConnection = getConnections().createConnectionWithId();
281cdf0e10cSrcweir     maModel.mnConnId = rConnection.getConnectionId();
282cdf0e10cSrcweir 
283cdf0e10cSrcweir     // a DBQUERY record with some PCITEM_STRING records must follow
284cdf0e10cSrcweir     bool bHasDbQuery = (rStrm.getNextRecId() == BIFF_ID_DBQUERY) && rStrm.startNextRecord();
285cdf0e10cSrcweir     OSL_ENSURE( bHasDbQuery, "QueryTable::importQueryTable - missing DBQUERY record" );
286cdf0e10cSrcweir     if( bHasDbQuery )
287cdf0e10cSrcweir         rConnection.importDbQuery( rStrm );
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
importQueryTableRefresh(BiffInputStream & rStrm)290cdf0e10cSrcweir void QueryTable::importQueryTableRefresh( BiffInputStream& rStrm )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir     rStrm.skip( 4 );
293cdf0e10cSrcweir     bool bPivot = rStrm.readuInt16() != 0;
294cdf0e10cSrcweir     OSL_ENSURE( !bPivot, "QueryTable::importQueryTableRefresh - unexpected pivot flag" );
295cdf0e10cSrcweir     if( !bPivot )
296cdf0e10cSrcweir     {
297cdf0e10cSrcweir         rStrm.skip( 2 );
298cdf0e10cSrcweir         sal_uInt32 nFlags = rStrm.readuInt32();
299cdf0e10cSrcweir         maModel.mbPreserveFormat = getFlag( nFlags, BIFF_QTREFRESH_PRESERVEFORMAT );
300cdf0e10cSrcweir         maModel.mbAdjustColWidth = getFlag( nFlags, BIFF_QTREFRESH_ADJUSTCOLWIDTH );
301cdf0e10cSrcweir     }
302cdf0e10cSrcweir }
303cdf0e10cSrcweir 
importQueryTableSettings(BiffInputStream & rStrm)304cdf0e10cSrcweir void QueryTable::importQueryTableSettings( BiffInputStream& rStrm )
305cdf0e10cSrcweir {
306cdf0e10cSrcweir     ConnectionRef xConnection = getConnections().getConnection( maModel.mnConnId );
307cdf0e10cSrcweir     OSL_ENSURE( xConnection.get(), "QueryTable::importQueryTableSettings - missing connection object" );
308cdf0e10cSrcweir     if( xConnection.get() )
309cdf0e10cSrcweir         xConnection->importQueryTableSettings( rStrm );
310cdf0e10cSrcweir }
311cdf0e10cSrcweir 
finalizeImport()312cdf0e10cSrcweir void QueryTable::finalizeImport()
313cdf0e10cSrcweir {
314cdf0e10cSrcweir     ConnectionRef xConnection = getConnections().getConnection( maModel.mnConnId );
315cdf0e10cSrcweir     OSL_ENSURE( xConnection.get(), "QueryTable::finalizeImport - missing connection object" );
316cdf0e10cSrcweir     if( xConnection.get() && (xConnection->getConnectionType() == BIFF12_CONNECTION_HTML) )
317cdf0e10cSrcweir     {
318cdf0e10cSrcweir         // check that valid web query properties exist
319cdf0e10cSrcweir         const WebPrModel* pWebPr = xConnection->getModel().mxWebPr.get();
320cdf0e10cSrcweir         if( pWebPr && !pWebPr->mbXml )
321cdf0e10cSrcweir         {
322cdf0e10cSrcweir             OUString aFileUrl = getBaseFilter().getAbsoluteUrl( pWebPr->maUrl );
323cdf0e10cSrcweir             if( aFileUrl.getLength() > 0 )
324cdf0e10cSrcweir             {
325cdf0e10cSrcweir                 // resolve destination cell range (stored as defined name containing the range)
326cdf0e10cSrcweir                 OUString aDefName = maModel.maDefName.replace( ' ', '_' ).replace( '-', '_' );
327cdf0e10cSrcweir                 DefinedNameRef xDefName = getDefinedNames().getByModelName( aDefName, getSheetIndex() );
328cdf0e10cSrcweir                 OSL_ENSURE( xDefName.get(), "QueryTable::finalizeImport - missing defined name" );
329cdf0e10cSrcweir                 if( xDefName.get() )
330cdf0e10cSrcweir                 {
331cdf0e10cSrcweir                     CellRangeAddress aDestRange;
332cdf0e10cSrcweir                     bool bIsRange = xDefName->getAbsoluteRange( aDestRange ) && (aDestRange.Sheet == getSheetIndex());
333cdf0e10cSrcweir                     OSL_ENSURE( bIsRange, "QueryTable::finalizeImport - defined name does not contain valid cell range" );
334cdf0e10cSrcweir                     if( bIsRange && getAddressConverter().checkCellRange( aDestRange, false, true ) )
335cdf0e10cSrcweir                     {
336cdf0e10cSrcweir                         CellAddress aDestPos( aDestRange.Sheet, aDestRange.StartColumn, aDestRange.StartRow );
337cdf0e10cSrcweir                         // find tables mode: entire document, all tables, or specific tables
338cdf0e10cSrcweir                         OUString aTables = pWebPr->mbHtmlTables ? lclBuildWebQueryTables( pWebPr->maTables ) : CREATE_OUSTRING( "HTML_all" );
339cdf0e10cSrcweir                         if( aTables.getLength() > 0 ) try
340cdf0e10cSrcweir                         {
341cdf0e10cSrcweir                             PropertySet aDocProps( getDocument() );
342cdf0e10cSrcweir                             Reference< XAreaLinks > xAreaLinks( aDocProps.getAnyProperty( PROP_AreaLinks ), UNO_QUERY_THROW );
343cdf0e10cSrcweir                             OUString aFilterName = CREATE_OUSTRING( "calc_HTML_WebQuery" );
344cdf0e10cSrcweir                             OUString aFilterOptions;
345cdf0e10cSrcweir                             xAreaLinks->insertAtPosition( aDestPos, aFileUrl, aTables, aFilterName, aFilterOptions );
346cdf0e10cSrcweir                             // set refresh interval (convert minutes to seconds)
347cdf0e10cSrcweir                             sal_Int32 nRefreshPeriod = xConnection->getModel().mnInterval * 60;
348cdf0e10cSrcweir                             if( nRefreshPeriod > 0 )
349cdf0e10cSrcweir                             {
350cdf0e10cSrcweir                                 PropertySet aPropSet( lclFindAreaLink( xAreaLinks, aDestPos, aFileUrl, aTables, aFilterName, aFilterOptions ) );
351cdf0e10cSrcweir                                 aPropSet.setProperty( PROP_RefreshPeriod, nRefreshPeriod );
352cdf0e10cSrcweir                             }
353cdf0e10cSrcweir                         }
354cdf0e10cSrcweir                         catch( Exception& )
355cdf0e10cSrcweir                         {
356cdf0e10cSrcweir                         }
357cdf0e10cSrcweir                     }
358cdf0e10cSrcweir                 }
359cdf0e10cSrcweir             }
360cdf0e10cSrcweir         }
361cdf0e10cSrcweir     }
362cdf0e10cSrcweir }
363cdf0e10cSrcweir 
364cdf0e10cSrcweir // ============================================================================
365cdf0e10cSrcweir 
QueryTableBuffer(const WorksheetHelper & rHelper)366cdf0e10cSrcweir QueryTableBuffer::QueryTableBuffer( const WorksheetHelper& rHelper ) :
367cdf0e10cSrcweir     WorksheetHelper( rHelper )
368cdf0e10cSrcweir {
369cdf0e10cSrcweir }
370cdf0e10cSrcweir 
createQueryTable()371cdf0e10cSrcweir QueryTable& QueryTableBuffer::createQueryTable()
372cdf0e10cSrcweir {
373cdf0e10cSrcweir     QueryTableVector::value_type xQueryTable( new QueryTable( *this ) );
374cdf0e10cSrcweir     maQueryTables.push_back( xQueryTable );
375cdf0e10cSrcweir     return *xQueryTable;
376cdf0e10cSrcweir }
377cdf0e10cSrcweir 
finalizeImport()378cdf0e10cSrcweir void QueryTableBuffer::finalizeImport()
379cdf0e10cSrcweir {
380cdf0e10cSrcweir     maQueryTables.forEachMem( &QueryTable::finalizeImport );
381cdf0e10cSrcweir }
382cdf0e10cSrcweir 
383cdf0e10cSrcweir // ============================================================================
384cdf0e10cSrcweir 
385cdf0e10cSrcweir } // namespace xls
386cdf0e10cSrcweir } // namespace oox
387