Avoid potential negative array index access to cached text.
[LibreOffice.git] / sc / inc / linkuno.hxx
blob855bb228432d2036475676d7b12713c9e8fae343
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #pragma once
22 #include <svl/lstner.hxx>
23 #include <svl/itemprop.hxx>
24 #include <com/sun/star/sheet/XDDELink.hpp>
25 #include <com/sun/star/sheet/XDDELinkResults.hpp>
26 #include <com/sun/star/sheet/XDDELinks.hpp>
27 #include <com/sun/star/sheet/XExternalDocLink.hpp>
28 #include <com/sun/star/sheet/XExternalDocLinks.hpp>
29 #include <com/sun/star/sheet/XExternalSheetCache.hpp>
30 #include <com/sun/star/sheet/XAreaLink.hpp>
31 #include <com/sun/star/sheet/XAreaLinks.hpp>
32 #include <com/sun/star/util/XRefreshable.hpp>
33 #include <com/sun/star/lang/XServiceInfo.hpp>
34 #include <com/sun/star/beans/XPropertySet.hpp>
35 #include <com/sun/star/container/XEnumerationAccess.hpp>
36 #include <com/sun/star/container/XNameAccess.hpp>
37 #include <com/sun/star/container/XIndexAccess.hpp>
38 #include <com/sun/star/container/XNamed.hpp>
39 #include <cppuhelper/implbase.hxx>
41 #include "externalrefmgr.hxx"
43 #include <vector>
45 class ScDocShell;
46 class ScTableLink;
48 typedef std::vector< css::uno::Reference< css::util::XRefreshListener > > XRefreshListenerArr_Impl;
50 class ScSheetLinkObj final : public cppu::WeakImplHelper<
51 css::container::XNamed,
52 css::util::XRefreshable,
53 css::beans::XPropertySet,
54 css::lang::XServiceInfo >,
55 public SfxListener
57 private:
58 SfxItemPropertySet aPropSet;
59 ScDocShell* pDocShell;
60 OUString aFileName;
61 XRefreshListenerArr_Impl aRefreshListeners;
63 ScTableLink* GetLink_Impl() const;
64 void Refreshed_Impl();
65 void ModifyRefreshDelay_Impl( sal_Int32 nRefresh );
67 public:
68 ScSheetLinkObj(ScDocShell* pDocSh, OUString aName);
69 virtual ~ScSheetLinkObj() override;
71 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
73 // XNamed
74 virtual OUString SAL_CALL getName() override;
75 virtual void SAL_CALL setName( const OUString& aName ) override;
77 // XRefreshable
78 virtual void SAL_CALL refresh() override;
79 virtual void SAL_CALL addRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override;
80 virtual void SAL_CALL removeRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override;
82 // XPropertySet
83 virtual css::uno::Reference< css::beans::XPropertySetInfo >
84 SAL_CALL getPropertySetInfo( ) override;
85 virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName,
86 const css::uno::Any& aValue ) override;
87 virtual css::uno::Any SAL_CALL getPropertyValue(
88 const OUString& PropertyName ) override;
89 virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName,
90 const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
91 virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName,
92 const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
93 virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName,
94 const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
95 virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName,
96 const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
98 // called from get/setPropertyValue:
99 OUString getFileName() const;
100 void setFileName(const OUString& FileName);
101 OUString getFilter() const;
102 void setFilter(const OUString& Filter);
103 OUString getFilterOptions() const;
104 void setFilterOptions(const OUString& FilterOptions);
105 sal_Int32 getRefreshDelay() const;
106 void setRefreshDelay(sal_Int32 nRefreshDelay);
108 // XServiceInfo
109 virtual OUString SAL_CALL getImplementationName() override;
110 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
111 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
114 class ScSheetLinksObj final : public cppu::WeakImplHelper<
115 css::container::XNameAccess,
116 css::container::XEnumerationAccess,
117 css::container::XIndexAccess,
118 css::lang::XServiceInfo >,
119 public SfxListener
121 private:
122 ScDocShell* pDocShell;
124 rtl::Reference<ScSheetLinkObj> GetObjectByIndex_Impl(sal_Int32 nIndex);
125 rtl::Reference<ScSheetLinkObj> GetObjectByName_Impl(const OUString& aName);
127 public:
128 ScSheetLinksObj(ScDocShell* pDocSh);
129 virtual ~ScSheetLinksObj() override;
131 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
133 // XNameAccess
134 virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
135 virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
136 virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
138 // XIndexAccess
139 virtual sal_Int32 SAL_CALL getCount() override;
140 virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
142 // XEnumerationAccess
143 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL
144 createEnumeration() override;
146 // XElementAccess
147 virtual css::uno::Type SAL_CALL getElementType() override;
148 virtual sal_Bool SAL_CALL hasElements() override;
150 // XServiceInfo
151 virtual OUString SAL_CALL getImplementationName() override;
152 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
153 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
156 class ScAreaLinkObj final : public cppu::WeakImplHelper<
157 css::sheet::XAreaLink,
158 css::util::XRefreshable,
159 css::beans::XPropertySet,
160 css::lang::XServiceInfo >,
161 public SfxListener
163 private:
164 SfxItemPropertySet aPropSet;
165 ScDocShell* pDocShell;
166 size_t nPos;
167 XRefreshListenerArr_Impl aRefreshListeners;
169 void Modify_Impl( const OUString* pNewFile, const OUString* pNewFilter,
170 const OUString* pNewOptions, const OUString* pNewSource,
171 const css::table::CellRangeAddress* pNewDest );
172 void ModifyRefreshDelay_Impl( sal_Int32 nRefresh );
173 void Refreshed_Impl();
175 public:
176 ScAreaLinkObj(ScDocShell* pDocSh, size_t nP);
177 virtual ~ScAreaLinkObj() override;
179 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
181 // XRefreshable
182 virtual void SAL_CALL refresh() override;
183 virtual void SAL_CALL addRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override;
184 virtual void SAL_CALL removeRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override;
186 // XPropertySet
187 virtual css::uno::Reference< css::beans::XPropertySetInfo >
188 SAL_CALL getPropertySetInfo( ) override;
189 virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName,
190 const css::uno::Any& aValue ) override;
191 virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
192 virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName,
193 const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
194 virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName,
195 const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
196 virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName,
197 const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
198 virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName,
199 const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
201 // called from get/setPropertyValue:
202 OUString getFileName() const;
203 void setFileName(const OUString& FileName);
204 OUString getFilter() const;
205 void setFilter(const OUString& Filter);
206 OUString getFilterOptions() const;
207 void setFilterOptions(const OUString& FilterOptions);
208 sal_Int32 getRefreshDelay() const;
209 void setRefreshDelay(sal_Int32 nRefreshDelay);
211 // XAreaLink
212 virtual OUString SAL_CALL getSourceArea() override;
213 virtual void SAL_CALL setSourceArea( const OUString& aSourceArea ) override;
214 virtual css::table::CellRangeAddress SAL_CALL getDestArea() override;
215 virtual void SAL_CALL setDestArea( const css::table::CellRangeAddress& aDestArea ) override;
217 // XServiceInfo
218 virtual OUString SAL_CALL getImplementationName() override;
219 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
220 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
223 class ScAreaLinksObj final : public cppu::WeakImplHelper<
224 css::sheet::XAreaLinks,
225 css::container::XEnumerationAccess,
226 css::lang::XServiceInfo >,
227 public SfxListener
229 private:
230 ScDocShell* pDocShell;
232 rtl::Reference<ScAreaLinkObj> GetObjectByIndex_Impl(sal_Int32 nIndex);
234 public:
235 ScAreaLinksObj(ScDocShell* pDocSh);
236 virtual ~ScAreaLinksObj() override;
238 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
240 // XAreaLinks
241 virtual void SAL_CALL insertAtPosition( const css::table::CellAddress& aDestPos,
242 const OUString& aFileName,
243 const OUString& aSourceArea,
244 const OUString& aFilter,
245 const OUString& aFilterOptions ) override;
246 virtual void SAL_CALL removeByIndex( sal_Int32 nIndex ) override;
248 // XIndexAccess
249 virtual sal_Int32 SAL_CALL getCount() override;
250 virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
252 // XEnumerationAccess
253 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL
254 createEnumeration() override;
256 // XElementAccess
257 virtual css::uno::Type SAL_CALL getElementType() override;
258 virtual sal_Bool SAL_CALL hasElements() override;
260 // XServiceInfo
261 virtual OUString SAL_CALL getImplementationName() override;
262 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
263 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
266 //! order of XNamed and DDELink changed to avoid "duplicate comdat" symbols
268 class ScDDELinkObj final : public cppu::WeakImplHelper<
269 css::sheet::XDDELink,
270 css::container::XNamed,
271 css::util::XRefreshable,
272 css::sheet::XDDELinkResults,
273 css::lang::XServiceInfo >,
274 public SfxListener
276 private:
277 ScDocShell* pDocShell;
278 OUString aAppl;
279 OUString aTopic;
280 OUString aItem;
281 XRefreshListenerArr_Impl aRefreshListeners;
283 void Refreshed_Impl();
285 public:
286 ScDDELinkObj(ScDocShell* pDocSh, OUString aA,
287 OUString aT, OUString aI);
288 virtual ~ScDDELinkObj() override;
290 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
292 // XNamed
293 virtual OUString SAL_CALL getName() override;
294 virtual void SAL_CALL setName( const OUString& aName ) override;
296 // XDDELink
297 virtual OUString SAL_CALL getApplication() override;
298 virtual OUString SAL_CALL getTopic() override;
299 virtual OUString SAL_CALL getItem() override;
301 // XRefreshable
302 virtual void SAL_CALL refresh() override;
303 virtual void SAL_CALL addRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override;
304 virtual void SAL_CALL removeRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override;
306 // XDDELinkResults
307 virtual css::uno::Sequence< css::uno::Sequence< css::uno::Any > >
308 SAL_CALL getResults( ) override;
309 virtual void SAL_CALL setResults(
310 const css::uno::Sequence< css::uno::Sequence< css::uno::Any > >& aResults ) override;
312 // XServiceInfo
313 virtual OUString SAL_CALL getImplementationName() override;
314 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
315 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
318 class ScDDELinksObj final : public cppu::WeakImplHelper<
319 css::container::XEnumerationAccess,
320 css::container::XIndexAccess,
321 css::sheet::XDDELinks,
322 css::lang::XServiceInfo >,
323 public SfxListener
325 private:
326 ScDocShell* pDocShell;
328 rtl::Reference<ScDDELinkObj> GetObjectByIndex_Impl(sal_Int32 nIndex);
329 rtl::Reference<ScDDELinkObj> GetObjectByName_Impl(std::u16string_view aName);
331 public:
332 ScDDELinksObj(ScDocShell* pDocSh);
333 virtual ~ScDDELinksObj() override;
335 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
337 // XNameAccess
338 virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
339 virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
340 virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
342 // XIndexAccess
343 virtual sal_Int32 SAL_CALL getCount() override;
344 virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
346 // XEnumerationAccess
347 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL
348 createEnumeration() override;
350 // XElementAccess
351 virtual css::uno::Type SAL_CALL getElementType() override;
352 virtual sal_Bool SAL_CALL hasElements() override;
354 // XDDELinks
355 virtual css::uno::Reference< css::sheet::XDDELink > SAL_CALL addDDELink(
356 const OUString& aApplication, const OUString& aTopic,
357 const OUString& aItem, css::sheet::DDELinkMode nMode ) override;
359 // XServiceInfo
360 virtual OUString SAL_CALL getImplementationName() override;
361 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
362 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
365 class ScExternalSheetCacheObj final : public cppu::WeakImplHelper< css::sheet::XExternalSheetCache >
367 public:
368 explicit ScExternalSheetCacheObj(ScDocShell* pDocShell, ScExternalRefCache::TableTypeRef pTable, size_t nIndex);
369 virtual ~ScExternalSheetCacheObj() override;
371 // XExternalSheetCache
372 virtual void SAL_CALL setCellValue(
373 sal_Int32 nCol, sal_Int32 nRow, const css::uno::Any& rAny) override;
375 virtual css::uno::Any SAL_CALL getCellValue(sal_Int32 nCol, sal_Int32 nRow) override;
377 virtual css::uno::Sequence< sal_Int32 > SAL_CALL getAllRows() override;
379 virtual css::uno::Sequence< sal_Int32 > SAL_CALL getAllColumns(sal_Int32 nRow) override;
381 // Attributes
382 virtual sal_Int32 SAL_CALL getTokenIndex() override;
384 private:
385 ScExternalSheetCacheObj(const ScExternalSheetCacheObj&) = delete;
387 private:
388 ScDocShell* mpDocShell;
389 ScExternalRefCache::TableTypeRef mpTable;
390 size_t mnIndex;
393 class ScExternalDocLinkObj final : public cppu::WeakImplHelper< css::sheet::XExternalDocLink >
395 public:
396 ScExternalDocLinkObj(ScDocShell* pDocShell, ScExternalRefManager* pRefMgr, sal_uInt16 nFileId);
397 virtual ~ScExternalDocLinkObj() override;
399 // XExternalDocLink
400 virtual css::uno::Reference< css::sheet::XExternalSheetCache >
401 SAL_CALL addSheetCache( const OUString& aSheetName, sal_Bool bDynamicCache ) override;
403 // XNameAccess
404 virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
405 virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
406 virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
408 // XIndexAccess
409 virtual sal_Int32 SAL_CALL getCount() override;
410 virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 nIndex ) override;
412 // XEnumerationAccess
413 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL
414 createEnumeration() override;
416 // XElementAccess
417 virtual css::uno::Type SAL_CALL getElementType() override;
418 virtual sal_Bool SAL_CALL hasElements() override;
420 // Attributes
421 virtual sal_Int32 SAL_CALL getTokenIndex() override;
423 private:
424 ScDocShell* mpDocShell;
425 ScExternalRefManager* mpRefMgr;
426 sal_uInt16 mnFileId;
429 /** This is the UNO API equivalent of ScExternalRefManager. */
430 class ScExternalDocLinksObj final : public cppu::WeakImplHelper< css::sheet::XExternalDocLinks >
432 public:
433 ScExternalDocLinksObj(ScDocShell* pDocShell);
434 virtual ~ScExternalDocLinksObj() override;
436 // XExternalDocLinks
437 virtual css::uno::Reference< css::sheet::XExternalDocLink >
438 SAL_CALL addDocLink( const OUString& aDocName ) override;
440 // XNameAccess
441 virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
442 virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
443 virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
445 // XIndexAccess
446 virtual sal_Int32 SAL_CALL getCount() override;
447 virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 nIndex ) override;
449 // XEnumerationAccess
450 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL
451 createEnumeration() override;
453 // XElementAccess
454 virtual css::uno::Type SAL_CALL getElementType() override;
455 virtual sal_Bool SAL_CALL hasElements() override;
457 private:
458 ScExternalDocLinksObj(const ScExternalDocLinksObj&) = delete;
460 private:
461 ScDocShell* mpDocShell;
462 ScExternalRefManager* mpRefMgr;
465 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */