1d119d52dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3d119d52dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4d119d52dSAndrew Rist * or more contributor license agreements. See the NOTICE file
5d119d52dSAndrew Rist * distributed with this work for additional information
6d119d52dSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7d119d52dSAndrew Rist * to you under the Apache License, Version 2.0 (the
8d119d52dSAndrew Rist * "License"); you may not use this file except in compliance
9d119d52dSAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11d119d52dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13d119d52dSAndrew Rist * Unless required by applicable law or agreed to in writing,
14d119d52dSAndrew Rist * software distributed under the License is distributed on an
15d119d52dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16d119d52dSAndrew Rist * KIND, either express or implied. See the License for the
17d119d52dSAndrew Rist * specific language governing permissions and limitations
18d119d52dSAndrew Rist * under the License.
19cdf0e10cSrcweir *
20d119d52dSAndrew Rist *************************************************************/
21d119d52dSAndrew Rist
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_sfx2.hxx"
24cdf0e10cSrcweir
25cdf0e10cSrcweir #include <sfx2/linkmgr.hxx>
26cdf0e10cSrcweir #include <com/sun/star/document/UpdateDocMode.hpp>
2761066e41SArrigo Marchiori #include <com/sun/star/lang/XMultiServiceFactory.hpp>
2861066e41SArrigo Marchiori #include <com/sun/star/util/XURLTransformer.hpp>
2961066e41SArrigo Marchiori
30cdf0e10cSrcweir #include <sfx2/objsh.hxx>
31cdf0e10cSrcweir #include <svl/urihelper.hxx>
32cdf0e10cSrcweir #include <sot/formats.hxx>
33cdf0e10cSrcweir #include <tools/urlobj.hxx>
34cdf0e10cSrcweir #include <sot/exchange.hxx>
35cdf0e10cSrcweir #include <tools/debug.hxx>
36cdf0e10cSrcweir #include <vcl/msgbox.hxx>
37cdf0e10cSrcweir #include <sfx2/lnkbase.hxx>
38cdf0e10cSrcweir #include <sfx2/app.hxx>
39cdf0e10cSrcweir #include <vcl/graph.hxx>
40cdf0e10cSrcweir #include <svl/stritem.hxx>
41cdf0e10cSrcweir #include <svl/eitem.hxx>
42cdf0e10cSrcweir #include <svl/intitem.hxx>
43cdf0e10cSrcweir #include <unotools/localfilehelper.hxx>
4461066e41SArrigo Marchiori #include <comphelper/processfactory.hxx>
45cdf0e10cSrcweir #include <i18npool/mslangid.hxx>
46cdf0e10cSrcweir #include <sfx2/request.hxx>
4745fd3b9aSArmin Le Grand #include <vcl/dibtools.hxx>
48cdf0e10cSrcweir
49cdf0e10cSrcweir #include "fileobj.hxx"
50cdf0e10cSrcweir #include "impldde.hxx"
51cdf0e10cSrcweir #include "app.hrc"
52cdf0e10cSrcweir #include "sfx2/sfxresid.hxx"
53cdf0e10cSrcweir
54cdf0e10cSrcweir #define _SVSTDARR_STRINGSDTOR
55cdf0e10cSrcweir #include <svl/svstdarr.hxx>
56cdf0e10cSrcweir
57cdf0e10cSrcweir namespace sfx2
58cdf0e10cSrcweir {
59cdf0e10cSrcweir
60cdf0e10cSrcweir class SvxInternalLink : public sfx2::SvLinkSource
61cdf0e10cSrcweir {
62cdf0e10cSrcweir public:
SvxInternalLink()63cdf0e10cSrcweir SvxInternalLink() {}
64cdf0e10cSrcweir
65cdf0e10cSrcweir virtual sal_Bool Connect( sfx2::SvBaseLink* );
66cdf0e10cSrcweir };
67cdf0e10cSrcweir
68cdf0e10cSrcweir
SV_IMPL_PTRARR(SvBaseLinks,SvBaseLinkRefPtr)69cdf0e10cSrcweir SV_IMPL_PTRARR( SvBaseLinks, SvBaseLinkRefPtr )
70cdf0e10cSrcweir
71cdf0e10cSrcweir LinkManager::LinkManager(SfxObjectShell* p)
72611fcdabSJim Jagielski : pPersist(p),
738d6615f2SArrigo Marchiori mAutoAskUpdateAllLinks(sal_False),
748d6615f2SArrigo Marchiori mUpdateAsked(sal_False)
75cdf0e10cSrcweir {
76cdf0e10cSrcweir }
77cdf0e10cSrcweir
~LinkManager()78cdf0e10cSrcweir LinkManager::~LinkManager()
79cdf0e10cSrcweir {
80cdf0e10cSrcweir SvBaseLinkRef** ppRef = (SvBaseLinkRef**)aLinkTbl.GetData();
81cdf0e10cSrcweir for( sal_uInt16 n = aLinkTbl.Count(); n; --n, ++ppRef )
82cdf0e10cSrcweir {
83cdf0e10cSrcweir if( (*ppRef)->Is() )
84cdf0e10cSrcweir {
85cdf0e10cSrcweir (*(*ppRef))->Disconnect();
86cdf0e10cSrcweir (*(*ppRef))->SetLinkManager( NULL );
87cdf0e10cSrcweir }
88cdf0e10cSrcweir delete *ppRef;
89cdf0e10cSrcweir }
90cdf0e10cSrcweir }
91cdf0e10cSrcweir
92cdf0e10cSrcweir
93cdf0e10cSrcweir /************************************************************************
94cdf0e10cSrcweir |* LinkManager::Remove()
95cdf0e10cSrcweir |*
96cdf0e10cSrcweir |* Beschreibung
97cdf0e10cSrcweir *************************************************************************/
98cdf0e10cSrcweir
Remove(SvBaseLink * pLink)99cdf0e10cSrcweir void LinkManager::Remove( SvBaseLink *pLink )
100cdf0e10cSrcweir {
101cdf0e10cSrcweir // keine Links doppelt einfuegen
102cdf0e10cSrcweir int bFound = sal_False;
103cdf0e10cSrcweir SvBaseLinkRef** ppRef = (SvBaseLinkRef**)aLinkTbl.GetData();
104cdf0e10cSrcweir for( sal_uInt16 n = aLinkTbl.Count(); n; --n, ++ppRef )
105cdf0e10cSrcweir {
106cdf0e10cSrcweir if( pLink == *(*ppRef) )
107cdf0e10cSrcweir {
108cdf0e10cSrcweir (*(*ppRef))->Disconnect();
109cdf0e10cSrcweir (*(*ppRef))->SetLinkManager( NULL );
110cdf0e10cSrcweir (*(*ppRef)).Clear();
111cdf0e10cSrcweir bFound = sal_True;
112cdf0e10cSrcweir }
113cdf0e10cSrcweir
114cdf0e10cSrcweir // falls noch leere rum stehen sollten, weg damit
115cdf0e10cSrcweir if( !(*ppRef)->Is() )
116cdf0e10cSrcweir {
117cdf0e10cSrcweir delete *ppRef;
118cdf0e10cSrcweir aLinkTbl.Remove( aLinkTbl.Count() - n, 1 );
119cdf0e10cSrcweir if( bFound )
120cdf0e10cSrcweir return ;
121cdf0e10cSrcweir --ppRef;
122cdf0e10cSrcweir }
123cdf0e10cSrcweir }
124cdf0e10cSrcweir }
125cdf0e10cSrcweir
126cdf0e10cSrcweir
Remove(sal_uInt16 nPos,sal_uInt16 nCnt)127cdf0e10cSrcweir void LinkManager::Remove( sal_uInt16 nPos, sal_uInt16 nCnt )
128cdf0e10cSrcweir {
129cdf0e10cSrcweir if( nCnt && nPos < aLinkTbl.Count() )
130cdf0e10cSrcweir {
131cdf0e10cSrcweir if( nPos + nCnt > aLinkTbl.Count() )
132cdf0e10cSrcweir nCnt = aLinkTbl.Count() - nPos;
133cdf0e10cSrcweir
134cdf0e10cSrcweir SvBaseLinkRef** ppRef = (SvBaseLinkRef**)aLinkTbl.GetData() + nPos;
135cdf0e10cSrcweir for( sal_uInt16 n = nCnt; n; --n, ++ppRef )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir if( (*ppRef)->Is() )
138cdf0e10cSrcweir {
139cdf0e10cSrcweir (*(*ppRef))->Disconnect();
140cdf0e10cSrcweir (*(*ppRef))->SetLinkManager( NULL );
141cdf0e10cSrcweir }
142cdf0e10cSrcweir delete *ppRef;
143cdf0e10cSrcweir }
144cdf0e10cSrcweir aLinkTbl.Remove( nPos, nCnt );
145cdf0e10cSrcweir }
146cdf0e10cSrcweir }
147cdf0e10cSrcweir
148cdf0e10cSrcweir
Insert(SvBaseLink * pLink)149cdf0e10cSrcweir sal_Bool LinkManager::Insert( SvBaseLink* pLink )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir // keine Links doppelt einfuegen
152cdf0e10cSrcweir for( sal_uInt16 n = 0; n < aLinkTbl.Count(); ++n )
153cdf0e10cSrcweir {
154cdf0e10cSrcweir SvBaseLinkRef* pTmp = aLinkTbl[ n ];
155cdf0e10cSrcweir if( !pTmp->Is() )
156cdf0e10cSrcweir aLinkTbl.DeleteAndDestroy( n-- );
157cdf0e10cSrcweir
158cdf0e10cSrcweir if( pLink == *pTmp )
159cdf0e10cSrcweir return sal_False;
160cdf0e10cSrcweir }
161cdf0e10cSrcweir
162cdf0e10cSrcweir SvBaseLinkRef* pTmp = new SvBaseLinkRef( pLink );
163cdf0e10cSrcweir pLink->SetLinkManager( this );
164cdf0e10cSrcweir aLinkTbl.Insert( pTmp, aLinkTbl.Count() );
165611fcdabSJim Jagielski if (mAutoAskUpdateAllLinks)
166611fcdabSJim Jagielski {
1678521a88aSJim Jagielski Window *parent = NULL;
1688521a88aSJim Jagielski SfxObjectShell* persist = GetPersist();
1698521a88aSJim Jagielski if (persist != NULL)
1708521a88aSJim Jagielski parent = GetPersist()->GetDialogParent();
1718521a88aSJim Jagielski
172611fcdabSJim Jagielski SetUserAllowsLinkUpdate(pLink, GetUserAllowsLinkUpdate(parent));
173611fcdabSJim Jagielski }
174611fcdabSJim Jagielski
175cdf0e10cSrcweir return sal_True;
176cdf0e10cSrcweir }
177cdf0e10cSrcweir
178cdf0e10cSrcweir
InsertLink(SvBaseLink * pLink,sal_uInt16 nObjType,sal_uInt16 nUpdateMode,const String * pName)179cdf0e10cSrcweir sal_Bool LinkManager::InsertLink( SvBaseLink * pLink,
180cdf0e10cSrcweir sal_uInt16 nObjType,
181cdf0e10cSrcweir sal_uInt16 nUpdateMode,
182cdf0e10cSrcweir const String* pName )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir // unbedingt zuerst
185cdf0e10cSrcweir pLink->SetObjType( nObjType );
186cdf0e10cSrcweir if( pName )
187cdf0e10cSrcweir pLink->SetName( *pName );
188cdf0e10cSrcweir pLink->SetUpdateMode( nUpdateMode );
189cdf0e10cSrcweir return Insert( pLink );
190cdf0e10cSrcweir }
191cdf0e10cSrcweir
192cdf0e10cSrcweir
InsertDDELink(SvBaseLink * pLink,const String & rServer,const String & rTopic,const String & rItem)193cdf0e10cSrcweir sal_Bool LinkManager::InsertDDELink( SvBaseLink * pLink,
194cdf0e10cSrcweir const String& rServer,
195cdf0e10cSrcweir const String& rTopic,
196cdf0e10cSrcweir const String& rItem )
197cdf0e10cSrcweir {
198cdf0e10cSrcweir if( !( OBJECT_CLIENT_SO & pLink->GetObjType() ) )
199cdf0e10cSrcweir return sal_False;
200cdf0e10cSrcweir
201cdf0e10cSrcweir String sCmd;
202cdf0e10cSrcweir ::sfx2::MakeLnkName( sCmd, &rServer, rTopic, rItem );
203cdf0e10cSrcweir
204cdf0e10cSrcweir pLink->SetObjType( OBJECT_CLIENT_DDE );
205cdf0e10cSrcweir pLink->SetName( sCmd );
206cdf0e10cSrcweir return Insert( pLink );
207cdf0e10cSrcweir }
208cdf0e10cSrcweir
209cdf0e10cSrcweir
InsertDDELink(SvBaseLink * pLink)210cdf0e10cSrcweir sal_Bool LinkManager::InsertDDELink( SvBaseLink * pLink )
211cdf0e10cSrcweir {
212cdf0e10cSrcweir DBG_ASSERT( OBJECT_CLIENT_SO & pLink->GetObjType(), "no OBJECT_CLIENT_SO" );
213cdf0e10cSrcweir if( !( OBJECT_CLIENT_SO & pLink->GetObjType() ) )
214cdf0e10cSrcweir return sal_False;
215cdf0e10cSrcweir
216cdf0e10cSrcweir if( pLink->GetObjType() == OBJECT_CLIENT_SO )
217cdf0e10cSrcweir pLink->SetObjType( OBJECT_CLIENT_DDE );
218cdf0e10cSrcweir
219cdf0e10cSrcweir return Insert( pLink );
220cdf0e10cSrcweir }
221cdf0e10cSrcweir
222cdf0e10cSrcweir
223cdf0e10cSrcweir // erfrage die Strings fuer den Dialog
GetDisplayNames(const SvBaseLink * pLink,String * pType,String * pFile,String * pLinkStr,String * pFilter) const224cdf0e10cSrcweir sal_Bool LinkManager::GetDisplayNames( const SvBaseLink * pLink,
225cdf0e10cSrcweir String* pType,
226cdf0e10cSrcweir String* pFile,
227cdf0e10cSrcweir String* pLinkStr,
228cdf0e10cSrcweir String* pFilter ) const
229cdf0e10cSrcweir {
230cdf0e10cSrcweir sal_Bool bRet = sal_False;
231cdf0e10cSrcweir const String sLNm( pLink->GetLinkSourceName() );
232cdf0e10cSrcweir if( sLNm.Len() )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir switch( pLink->GetObjType() )
235cdf0e10cSrcweir {
236cdf0e10cSrcweir case OBJECT_CLIENT_FILE:
237cdf0e10cSrcweir case OBJECT_CLIENT_GRF:
238cdf0e10cSrcweir case OBJECT_CLIENT_OLE:
239cdf0e10cSrcweir {
240cdf0e10cSrcweir sal_uInt16 nPos = 0;
241cdf0e10cSrcweir String sFile( sLNm.GetToken( 0, ::sfx2::cTokenSeperator, nPos ) );
242cdf0e10cSrcweir String sRange( sLNm.GetToken( 0, ::sfx2::cTokenSeperator, nPos ) );
243cdf0e10cSrcweir
244cdf0e10cSrcweir if( pFile )
245cdf0e10cSrcweir *pFile = sFile;
246cdf0e10cSrcweir if( pLinkStr )
247cdf0e10cSrcweir *pLinkStr = sRange;
248cdf0e10cSrcweir if( pFilter )
249cdf0e10cSrcweir *pFilter = sLNm.Copy( nPos );
250cdf0e10cSrcweir
251cdf0e10cSrcweir if( pType )
252cdf0e10cSrcweir {
253cdf0e10cSrcweir sal_uInt16 nObjType = pLink->GetObjType();
254cdf0e10cSrcweir *pType = String( SfxResId(
255cdf0e10cSrcweir ( OBJECT_CLIENT_FILE == nObjType || OBJECT_CLIENT_OLE == nObjType )
256cdf0e10cSrcweir ? RID_SVXSTR_FILELINK
257cdf0e10cSrcweir : RID_SVXSTR_GRAFIKLINK ));
258cdf0e10cSrcweir }
259cdf0e10cSrcweir bRet = sal_True;
260cdf0e10cSrcweir }
261cdf0e10cSrcweir break;
262cdf0e10cSrcweir case OBJECT_CLIENT_DDE:
263cdf0e10cSrcweir {
264cdf0e10cSrcweir sal_uInt16 nTmp = 0;
265cdf0e10cSrcweir String sCmd( sLNm );
266cdf0e10cSrcweir String sServer( sCmd.GetToken( 0, cTokenSeperator, nTmp ) );
267cdf0e10cSrcweir String sTopic( sCmd.GetToken( 0, cTokenSeperator, nTmp ) );
268cdf0e10cSrcweir
269cdf0e10cSrcweir if( pType )
270cdf0e10cSrcweir *pType = sServer;
271cdf0e10cSrcweir if( pFile )
272cdf0e10cSrcweir *pFile = sTopic;
273cdf0e10cSrcweir if( pLinkStr )
274cdf0e10cSrcweir *pLinkStr = sCmd.Copy( nTmp );
275cdf0e10cSrcweir bRet = sal_True;
276cdf0e10cSrcweir }
277cdf0e10cSrcweir break;
278cdf0e10cSrcweir default:
279cdf0e10cSrcweir break;
280cdf0e10cSrcweir }
281cdf0e10cSrcweir }
282cdf0e10cSrcweir
283cdf0e10cSrcweir return bRet;
284cdf0e10cSrcweir }
285cdf0e10cSrcweir
SetAutoAskUpdateAllLinks()286611fcdabSJim Jagielski void LinkManager::SetAutoAskUpdateAllLinks()
287611fcdabSJim Jagielski {
288611fcdabSJim Jagielski mAutoAskUpdateAllLinks = sal_True;
2898d6615f2SArrigo Marchiori mUpdateAsked = sal_False;
2908d6615f2SArrigo Marchiori }
2918d6615f2SArrigo Marchiori
SetNeverAskUpdateAllLinks()2928d6615f2SArrigo Marchiori void LinkManager::SetNeverAskUpdateAllLinks()
2938d6615f2SArrigo Marchiori {
2948d6615f2SArrigo Marchiori mAutoAskUpdateAllLinks = sal_False;
2958d6615f2SArrigo Marchiori mAllowUpdate = sal_True;
2968d6615f2SArrigo Marchiori mUpdateAsked = sal_True;
297611fcdabSJim Jagielski }
298611fcdabSJim Jagielski
GetUserAllowsLinkUpdate(Window * pParentWin)299611fcdabSJim Jagielski sal_Bool LinkManager::GetUserAllowsLinkUpdate(Window *pParentWin)
300611fcdabSJim Jagielski {
301611fcdabSJim Jagielski if (!mUpdateAsked)
302611fcdabSJim Jagielski {
303611fcdabSJim Jagielski if (QueryBox(pParentWin, WB_YES_NO | WB_DEF_NO, SfxResId(STR_QUERY_UPDATE_LINKS)).Execute() == RET_YES)
304611fcdabSJim Jagielski mAllowUpdate = sal_True;
305611fcdabSJim Jagielski else
306611fcdabSJim Jagielski mAllowUpdate = sal_False;
307611fcdabSJim Jagielski mUpdateAsked = sal_True;
308611fcdabSJim Jagielski }
309611fcdabSJim Jagielski return mAllowUpdate;
310611fcdabSJim Jagielski }
311611fcdabSJim Jagielski
SetUserAllowsLinkUpdate(SvBaseLink * pLink,sal_Bool allows)312611fcdabSJim Jagielski void LinkManager::SetUserAllowsLinkUpdate(SvBaseLink *pLink, sal_Bool allows)
313611fcdabSJim Jagielski {
314611fcdabSJim Jagielski SfxObjectShell* pShell = pLink->GetLinkManager()->GetPersist();
315611fcdabSJim Jagielski
316611fcdabSJim Jagielski if (pShell)
317611fcdabSJim Jagielski {
318611fcdabSJim Jagielski comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = pShell->getEmbeddedObjectContainer();
319611fcdabSJim Jagielski rEmbeddedObjectContainer.setUserAllowsLinkUpdate(allows);
320611fcdabSJim Jagielski }
321611fcdabSJim Jagielski }
322611fcdabSJim Jagielski
323cdf0e10cSrcweir
UpdateAllLinks(sal_Bool bAskUpdate,sal_Bool,sal_Bool bUpdateGrfLinks,Window * pParentWin)324cdf0e10cSrcweir void LinkManager::UpdateAllLinks(
325cdf0e10cSrcweir sal_Bool bAskUpdate,
326cdf0e10cSrcweir sal_Bool /*bCallErrHdl*/,
327cdf0e10cSrcweir sal_Bool bUpdateGrfLinks,
328cdf0e10cSrcweir Window* pParentWin )
329cdf0e10cSrcweir {
330cdf0e10cSrcweir SvStringsDtor aApps, aTopics, aItems;
331cdf0e10cSrcweir String sApp, sTopic, sItem;
332cdf0e10cSrcweir
333cdf0e10cSrcweir // erstmal eine Kopie vom Array machen, damit sich updatende Links in
334cdf0e10cSrcweir // Links in ... nicht dazwischen funken!!
335cdf0e10cSrcweir SvPtrarr aTmpArr( 255, 50 );
336cdf0e10cSrcweir sal_uInt16 n;
337cdf0e10cSrcweir for( n = 0; n < aLinkTbl.Count(); ++n )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir SvBaseLink* pLink = *aLinkTbl[ n ];
340cdf0e10cSrcweir if( !pLink )
341cdf0e10cSrcweir {
342cdf0e10cSrcweir Remove( n-- );
343cdf0e10cSrcweir continue;
344cdf0e10cSrcweir }
345cdf0e10cSrcweir aTmpArr.Insert( pLink, aTmpArr.Count() );
346cdf0e10cSrcweir }
347cdf0e10cSrcweir
348cdf0e10cSrcweir for( n = 0; n < aTmpArr.Count(); ++n )
349cdf0e10cSrcweir {
350cdf0e10cSrcweir SvBaseLink* pLink = (SvBaseLink*)aTmpArr[ n ];
351cdf0e10cSrcweir
352cdf0e10cSrcweir // suche erstmal im Array nach dem Eintrag
353cdf0e10cSrcweir sal_uInt16 nFndPos = USHRT_MAX;
354cdf0e10cSrcweir for( sal_uInt16 i = 0; i < aLinkTbl.Count(); ++i )
355cdf0e10cSrcweir if( pLink == *aLinkTbl[ i ] )
356cdf0e10cSrcweir {
357cdf0e10cSrcweir nFndPos = i;
358cdf0e10cSrcweir break;
359cdf0e10cSrcweir }
360cdf0e10cSrcweir
361cdf0e10cSrcweir if( USHRT_MAX == nFndPos )
362cdf0e10cSrcweir continue; // war noch nicht vorhanden!
363cdf0e10cSrcweir
364cf914f84SJim Jagielski // do not update graphic links yet
365cdf0e10cSrcweir if( !pLink->IsVisible() ||
366cdf0e10cSrcweir ( !bUpdateGrfLinks && OBJECT_CLIENT_GRF == pLink->GetObjType() ))
367cdf0e10cSrcweir continue;
368cdf0e10cSrcweir
369a621bfbfSJim Jagielski sal_Bool allows = sal_True;
370611fcdabSJim Jagielski
371cdf0e10cSrcweir if (bAskUpdate)
372cdf0e10cSrcweir {
373611fcdabSJim Jagielski allows = GetUserAllowsLinkUpdate(pParentWin);
3740dfb9e37SArmin Le Grand }
3750dfb9e37SArmin Le Grand
376611fcdabSJim Jagielski SetUserAllowsLinkUpdate(pLink, allows);
377cf914f84SJim Jagielski bAskUpdate = sal_False; // one time is OK
378cdf0e10cSrcweir
379611fcdabSJim Jagielski if (allows)
380cdf0e10cSrcweir pLink->Update();
381611fcdabSJim Jagielski
382cdf0e10cSrcweir }
383cdf0e10cSrcweir }
384cdf0e10cSrcweir
385cdf0e10cSrcweir /************************************************************************
386cdf0e10cSrcweir |* SvBaseLink::CreateObject()
387cdf0e10cSrcweir |*
388cdf0e10cSrcweir |* Beschreibung
389cdf0e10cSrcweir *************************************************************************/
390cdf0e10cSrcweir
CreateObj(SvBaseLink * pLink)391cdf0e10cSrcweir SvLinkSourceRef LinkManager::CreateObj( SvBaseLink * pLink )
392cdf0e10cSrcweir {
393cdf0e10cSrcweir switch( pLink->GetObjType() )
394cdf0e10cSrcweir {
395cdf0e10cSrcweir case OBJECT_CLIENT_FILE:
396cdf0e10cSrcweir case OBJECT_CLIENT_GRF:
397cdf0e10cSrcweir case OBJECT_CLIENT_OLE:
398cdf0e10cSrcweir return new SvFileObject;
399cdf0e10cSrcweir case OBJECT_INTERN:
400cdf0e10cSrcweir return new SvxInternalLink;
401cdf0e10cSrcweir case OBJECT_CLIENT_DDE:
402cdf0e10cSrcweir return new SvDDEObject;
403cdf0e10cSrcweir default:
404cdf0e10cSrcweir return SvLinkSourceRef();
405cdf0e10cSrcweir }
406cdf0e10cSrcweir }
407cdf0e10cSrcweir
InsertServer(SvLinkSource * pObj)408cdf0e10cSrcweir sal_Bool LinkManager::InsertServer( SvLinkSource* pObj )
409cdf0e10cSrcweir {
410cdf0e10cSrcweir // keine doppelt einfuegen
411cdf0e10cSrcweir if( !pObj || USHRT_MAX != aServerTbl.GetPos( pObj ) )
412cdf0e10cSrcweir return sal_False;
413cdf0e10cSrcweir
414cdf0e10cSrcweir aServerTbl.Insert( pObj, aServerTbl.Count() );
415cdf0e10cSrcweir return sal_True;
416cdf0e10cSrcweir }
417cdf0e10cSrcweir
418cdf0e10cSrcweir
RemoveServer(SvLinkSource * pObj)419cdf0e10cSrcweir void LinkManager::RemoveServer( SvLinkSource* pObj )
420cdf0e10cSrcweir {
421cdf0e10cSrcweir sal_uInt16 nPos = aServerTbl.GetPos( pObj );
422cdf0e10cSrcweir if( USHRT_MAX != nPos )
423cdf0e10cSrcweir aServerTbl.Remove( nPos, 1 );
424cdf0e10cSrcweir }
425cdf0e10cSrcweir
426cdf0e10cSrcweir
MakeLnkName(String & rName,const String * pType,const String & rFile,const String & rLink,const String * pFilter)427cdf0e10cSrcweir void MakeLnkName( String& rName, const String* pType, const String& rFile,
428cdf0e10cSrcweir const String& rLink, const String* pFilter )
429cdf0e10cSrcweir {
430cdf0e10cSrcweir if( pType )
431cdf0e10cSrcweir (rName = *pType).EraseLeadingChars().EraseTrailingChars() += cTokenSeperator;
432cdf0e10cSrcweir else if( rName.Len() )
433cdf0e10cSrcweir rName.Erase();
434cdf0e10cSrcweir
435cdf0e10cSrcweir ((rName += rFile).EraseLeadingChars().EraseTrailingChars() +=
436cdf0e10cSrcweir cTokenSeperator ).EraseLeadingChars().EraseTrailingChars() += rLink;
437cdf0e10cSrcweir if( pFilter )
438cdf0e10cSrcweir ((rName += cTokenSeperator ) += *pFilter).EraseLeadingChars().EraseTrailingChars();
439cdf0e10cSrcweir }
440cdf0e10cSrcweir
InsertFileLink(sfx2::SvBaseLink & rLink,sal_uInt16 nFileType,const String & rFileNm,const String * pFilterNm,const String * pRange)441cdf0e10cSrcweir sal_Bool LinkManager::InsertFileLink( sfx2::SvBaseLink& rLink,
442cdf0e10cSrcweir sal_uInt16 nFileType,
443cdf0e10cSrcweir const String& rFileNm,
444cdf0e10cSrcweir const String* pFilterNm,
445cdf0e10cSrcweir const String* pRange )
446cdf0e10cSrcweir {
447cdf0e10cSrcweir if( !( OBJECT_CLIENT_SO & rLink.GetObjType() ))
448cdf0e10cSrcweir return sal_False;
449cdf0e10cSrcweir
450cdf0e10cSrcweir String sCmd( rFileNm );
451cdf0e10cSrcweir sCmd += ::sfx2::cTokenSeperator;
452cdf0e10cSrcweir if( pRange )
453cdf0e10cSrcweir sCmd += *pRange;
454cdf0e10cSrcweir if( pFilterNm )
455cdf0e10cSrcweir ( sCmd += ::sfx2::cTokenSeperator ) += *pFilterNm;
456cdf0e10cSrcweir
457cdf0e10cSrcweir return InsertLink( &rLink, nFileType, sfx2::LINKUPDATE_ONCALL, &sCmd );
458cdf0e10cSrcweir }
459cdf0e10cSrcweir
InsertFileLink(sfx2::SvBaseLink & rLink)460cdf0e10cSrcweir sal_Bool LinkManager::InsertFileLink( sfx2::SvBaseLink& rLink )
461cdf0e10cSrcweir {
462cdf0e10cSrcweir if( OBJECT_CLIENT_FILE == ( OBJECT_CLIENT_FILE & rLink.GetObjType() ))
463cdf0e10cSrcweir return InsertLink( &rLink, rLink.GetObjType(), sfx2::LINKUPDATE_ONCALL );
464cdf0e10cSrcweir return sal_False;
465cdf0e10cSrcweir }
466cdf0e10cSrcweir
467cdf0e10cSrcweir // eine Uebertragung wird abgebrochen, also alle DownloadMedien canceln
468cdf0e10cSrcweir // (ist zur Zeit nur fuer die FileLinks interressant!)
CancelTransfers()469cdf0e10cSrcweir void LinkManager::CancelTransfers()
470cdf0e10cSrcweir {
471cdf0e10cSrcweir SvFileObject* pFileObj;
472cdf0e10cSrcweir sfx2::SvBaseLink* pLnk;
473cdf0e10cSrcweir
474cdf0e10cSrcweir const sfx2::SvBaseLinks& rLnks = GetLinks();
475cdf0e10cSrcweir for( sal_uInt16 n = rLnks.Count(); n; )
476cdf0e10cSrcweir if( 0 != ( pLnk = &(*rLnks[ --n ])) &&
477cdf0e10cSrcweir OBJECT_CLIENT_FILE == (OBJECT_CLIENT_FILE & pLnk->GetObjType()) &&
478cdf0e10cSrcweir 0 != ( pFileObj = (SvFileObject*)pLnk->GetObj() ) )
479cdf0e10cSrcweir // 0 != ( pFileObj = (SvFileObject*)SvFileObject::ClassFactory()->
480cdf0e10cSrcweir // CastAndAddRef( pLnk->GetObj() )) )
481cdf0e10cSrcweir pFileObj->CancelTransfers();
482cdf0e10cSrcweir }
483cdf0e10cSrcweir
484cdf0e10cSrcweir // um Status Informationen aus dem FileObject an den BaseLink zu
485cdf0e10cSrcweir // senden, gibt es eine eigene ClipBoardId. Das SvData-Object hat
486cdf0e10cSrcweir // dann die entsprechenden Informationen als String.
487cdf0e10cSrcweir // Wird zur Zeit fuer FileObject in Verbindung mit JavaScript benoetigt
488cdf0e10cSrcweir // - das braucht Informationen ueber Load/Abort/Error
RegisterStatusInfoId()489cdf0e10cSrcweir sal_uIntPtr LinkManager::RegisterStatusInfoId()
490cdf0e10cSrcweir {
491cdf0e10cSrcweir static sal_uIntPtr nFormat = 0;
492cdf0e10cSrcweir
493cdf0e10cSrcweir if( !nFormat )
494cdf0e10cSrcweir {
495cdf0e10cSrcweir // wie sieht die neue Schnittstelle aus?
496cdf0e10cSrcweir // nFormat = Exchange::RegisterFormatName( "StatusInfo vom SvxInternalLink" );
497cdf0e10cSrcweir nFormat = SotExchange::RegisterFormatName(
498cdf0e10cSrcweir String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM(
499cdf0e10cSrcweir "StatusInfo vom SvxInternalLink" )));
500cdf0e10cSrcweir }
501cdf0e10cSrcweir return nFormat;
502cdf0e10cSrcweir }
503cdf0e10cSrcweir
504cdf0e10cSrcweir // ----------------------------------------------------------------------
505cdf0e10cSrcweir
GetGraphicFromAny(const String & rMimeType,const::com::sun::star::uno::Any & rValue,Graphic & rGrf)506cdf0e10cSrcweir sal_Bool LinkManager::GetGraphicFromAny( const String& rMimeType,
507cdf0e10cSrcweir const ::com::sun::star::uno::Any & rValue,
508cdf0e10cSrcweir Graphic& rGrf )
509cdf0e10cSrcweir {
510cdf0e10cSrcweir sal_Bool bRet = sal_False;
511cdf0e10cSrcweir ::com::sun::star::uno::Sequence< sal_Int8 > aSeq;
512cdf0e10cSrcweir if( rValue.hasValue() && ( rValue >>= aSeq ) )
513cdf0e10cSrcweir {
514cdf0e10cSrcweir SvMemoryStream aMemStm( (void*)aSeq.getConstArray(), aSeq.getLength(),
515cdf0e10cSrcweir STREAM_READ );
516cdf0e10cSrcweir aMemStm.Seek( 0 );
517cdf0e10cSrcweir
518cdf0e10cSrcweir switch( SotExchange::GetFormatIdFromMimeType( rMimeType ) )
519cdf0e10cSrcweir {
520cdf0e10cSrcweir case SOT_FORMATSTR_ID_SVXB:
521cdf0e10cSrcweir {
522cdf0e10cSrcweir aMemStm >> rGrf;
523cdf0e10cSrcweir bRet = sal_True;
524cdf0e10cSrcweir }
525cdf0e10cSrcweir break;
526cdf0e10cSrcweir case FORMAT_GDIMETAFILE:
527cdf0e10cSrcweir {
528cdf0e10cSrcweir GDIMetaFile aMtf;
529cdf0e10cSrcweir aMtf.Read( aMemStm );
530cdf0e10cSrcweir rGrf = aMtf;
531cdf0e10cSrcweir bRet = sal_True;
532cdf0e10cSrcweir }
533cdf0e10cSrcweir break;
534cdf0e10cSrcweir case FORMAT_BITMAP:
535cdf0e10cSrcweir {
536cdf0e10cSrcweir Bitmap aBmp;
53745fd3b9aSArmin Le Grand ReadDIB(aBmp, aMemStm, true);
538cdf0e10cSrcweir rGrf = aBmp;
539cdf0e10cSrcweir bRet = sal_True;
540cdf0e10cSrcweir }
541cdf0e10cSrcweir break;
542cdf0e10cSrcweir }
543cdf0e10cSrcweir }
544cdf0e10cSrcweir return bRet;
545cdf0e10cSrcweir }
546cdf0e10cSrcweir
urlIsSafe(const::rtl::OUString & url)54761066e41SArrigo Marchiori sal_Bool LinkManager::urlIsSafe( const ::rtl::OUString &url )
54861066e41SArrigo Marchiori {
54961066e41SArrigo Marchiori if ( url.getLength() == 0 ) {
55061066e41SArrigo Marchiori return sal_False;
55161066e41SArrigo Marchiori }
55261066e41SArrigo Marchiori if ( !xURLTransformer.is() ) {
55361066e41SArrigo Marchiori const com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > xContext ( ::comphelper::getProcessComponentContext() );
55461066e41SArrigo Marchiori com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiComponentFactory > xFactory ( xContext->getServiceManager(), ::com::sun::star::uno::UNO_QUERY );
55561066e41SArrigo Marchiori if ( !xFactory.is() ) {
55661066e41SArrigo Marchiori return sal_False;
55761066e41SArrigo Marchiori }
55861066e41SArrigo Marchiori xURLTransformer.set( xFactory->createInstanceWithContext( rtl::OUString::createFromAscii( "com.sun.star.util.URLTransformer" ), xContext), com::sun::star::uno::UNO_QUERY );
55961066e41SArrigo Marchiori if ( !xURLTransformer.is() ) {
56061066e41SArrigo Marchiori return sal_False;
56161066e41SArrigo Marchiori }
56261066e41SArrigo Marchiori }
56361066e41SArrigo Marchiori com::sun::star::util::URL aURL;
56461066e41SArrigo Marchiori aURL.Complete = url;
56561066e41SArrigo Marchiori sal_Bool b = xURLTransformer->parseSmart( aURL, ::rtl::OUString() );
56661066e41SArrigo Marchiori if ( !b ) {
56761066e41SArrigo Marchiori return sal_False;
56861066e41SArrigo Marchiori }
56961066e41SArrigo Marchiori return urlIsSafe( aURL );
57061066e41SArrigo Marchiori }
57161066e41SArrigo Marchiori
urlIsSafe(const::com::sun::star::util::URL & url)57261066e41SArrigo Marchiori sal_Bool LinkManager::urlIsSafe( const ::com::sun::star::util::URL &url )
57361066e41SArrigo Marchiori {
57461066e41SArrigo Marchiori sal_Bool result = ( url.Path.getLength() == 0 ) &&
57561066e41SArrigo Marchiori ( url.Server.getLength() == 0);
57661066e41SArrigo Marchiori return result;
57761066e41SArrigo Marchiori }
57861066e41SArrigo Marchiori
579cdf0e10cSrcweir
urlIsVendor(const::rtl::OUString & url)580*e1390266SArrigo Marchiori sal_Bool LinkManager::urlIsVendor( const ::rtl::OUString &url )
581*e1390266SArrigo Marchiori {
582*e1390266SArrigo Marchiori if ( url.matchIgnoreAsciiCaseAsciiL( "vnd.sun.star.", 13, 0 ) ) {
583*e1390266SArrigo Marchiori return url.matchIgnoreAsciiCaseAsciiL ( "expand", 6, 13 ) ||
584*e1390266SArrigo Marchiori url.matchIgnoreAsciiCaseAsciiL ( "script", 6, 13 ) ||
585*e1390266SArrigo Marchiori url.matchIgnoreAsciiCaseAsciiL ( "tdoc", 4, 13 ) ||
586*e1390266SArrigo Marchiori url.matchIgnoreAsciiCaseAsciiL ( "uno", 3, 13 );
587*e1390266SArrigo Marchiori }
588*e1390266SArrigo Marchiori return sal_False;
589*e1390266SArrigo Marchiori }
590*e1390266SArrigo Marchiori
591*e1390266SArrigo Marchiori
592cdf0e10cSrcweir // ----------------------------------------------------------------------
lcl_DDE_RelToAbs(const String & rTopic,const String & rBaseURL)593cdf0e10cSrcweir String lcl_DDE_RelToAbs( const String& rTopic, const String& rBaseURL )
594cdf0e10cSrcweir {
595cdf0e10cSrcweir String sRet;
596cdf0e10cSrcweir INetURLObject aURL( rTopic );
597cdf0e10cSrcweir if( INET_PROT_NOT_VALID == aURL.GetProtocol() )
598cdf0e10cSrcweir utl::LocalFileHelper::ConvertSystemPathToURL( rTopic, rBaseURL, sRet );
599cdf0e10cSrcweir if( !sRet.Len() )
600cdf0e10cSrcweir sRet = URIHelper::SmartRel2Abs( INetURLObject(rBaseURL), rTopic, URIHelper::GetMaybeFileHdl(), true );
601cdf0e10cSrcweir return sRet;
602cdf0e10cSrcweir }
603cdf0e10cSrcweir
Connect(sfx2::SvBaseLink * pLink)604cdf0e10cSrcweir sal_Bool SvxInternalLink::Connect( sfx2::SvBaseLink* pLink )
605cdf0e10cSrcweir {
606cdf0e10cSrcweir SfxObjectShell* pFndShell = 0;
607cdf0e10cSrcweir sal_uInt16 nUpdateMode = com::sun::star::document::UpdateDocMode::NO_UPDATE;
608cdf0e10cSrcweir String sTopic, sItem, sReferer;
609cdf0e10cSrcweir if( pLink->GetLinkManager() &&
610cdf0e10cSrcweir pLink->GetLinkManager()->GetDisplayNames( pLink, 0, &sTopic, &sItem )
611cdf0e10cSrcweir && sTopic.Len() )
612cdf0e10cSrcweir {
613cdf0e10cSrcweir // erstmal nur ueber die DocumentShells laufen und die mit dem
614cdf0e10cSrcweir // Namen heraussuchen:
615cdf0e10cSrcweir
616cdf0e10cSrcweir com::sun::star::lang::Locale aLocale;
617cdf0e10cSrcweir MsLangId::convertLanguageToLocale( LANGUAGE_SYSTEM, aLocale );
618cdf0e10cSrcweir CharClass aCC( aLocale );
619cdf0e10cSrcweir
620cdf0e10cSrcweir String sNm( sTopic ), sTmp;
621cdf0e10cSrcweir aCC.toLower( sNm );
622cdf0e10cSrcweir
623cdf0e10cSrcweir TypeId aType( TYPE(SfxObjectShell) );
624cdf0e10cSrcweir
625cdf0e10cSrcweir sal_Bool bFirst = sal_True;
626cdf0e10cSrcweir SfxObjectShell* pShell = pLink->GetLinkManager()->GetPersist();
627cdf0e10cSrcweir if( pShell && pShell->GetMedium() )
628cdf0e10cSrcweir {
629cdf0e10cSrcweir sReferer = pShell->GetMedium()->GetBaseURL();
630cdf0e10cSrcweir SFX_ITEMSET_ARG( pShell->GetMedium()->GetItemSet(), pItem, SfxUInt16Item, SID_UPDATEDOCMODE, sal_False );
631cdf0e10cSrcweir if ( pItem )
632cdf0e10cSrcweir nUpdateMode = pItem->GetValue();
633cdf0e10cSrcweir }
634cdf0e10cSrcweir
635cdf0e10cSrcweir String sNmURL( lcl_DDE_RelToAbs( sTopic, sReferer ) );
636cdf0e10cSrcweir aCC.toLower( sNmURL );
637cdf0e10cSrcweir
638cdf0e10cSrcweir if ( !pShell )
639cdf0e10cSrcweir {
640cdf0e10cSrcweir bFirst = sal_False;
641cdf0e10cSrcweir pShell = SfxObjectShell::GetFirst( &aType, sal_False );
642cdf0e10cSrcweir }
643cdf0e10cSrcweir
644cdf0e10cSrcweir while( pShell )
645cdf0e10cSrcweir {
646cdf0e10cSrcweir if( !sTmp.Len() )
647cdf0e10cSrcweir {
648cdf0e10cSrcweir sTmp = pShell->GetTitle( SFX_TITLE_FULLNAME );
649cdf0e10cSrcweir sTmp = lcl_DDE_RelToAbs(sTmp, sReferer );
650cdf0e10cSrcweir }
651cdf0e10cSrcweir
652cdf0e10cSrcweir
653cdf0e10cSrcweir aCC.toLower( sTmp );
654cdf0e10cSrcweir if( sTmp == sNmURL ) // die wollen wir haben
655cdf0e10cSrcweir {
656cdf0e10cSrcweir pFndShell = pShell;
657cdf0e10cSrcweir break;
658cdf0e10cSrcweir }
659cdf0e10cSrcweir
660cdf0e10cSrcweir if( bFirst )
661cdf0e10cSrcweir {
662cdf0e10cSrcweir bFirst = sal_False;
663cdf0e10cSrcweir pShell = SfxObjectShell::GetFirst( &aType, sal_False );
664cdf0e10cSrcweir }
665cdf0e10cSrcweir else
666cdf0e10cSrcweir pShell = SfxObjectShell::GetNext( *pShell, &aType, sal_False );
667cdf0e10cSrcweir
668cdf0e10cSrcweir sTmp.Erase();
669cdf0e10cSrcweir }
670cdf0e10cSrcweir }
671cdf0e10cSrcweir
672cdf0e10cSrcweir // empty topics are not allowed - which document is it
673cdf0e10cSrcweir if( !sTopic.Len() )
674cdf0e10cSrcweir return sal_False;
675cdf0e10cSrcweir
676cdf0e10cSrcweir if( !pFndShell )
677cdf0e10cSrcweir {
678cdf0e10cSrcweir // dann versuche die Datei zu laden:
679cdf0e10cSrcweir INetURLObject aURL( sTopic );
680cdf0e10cSrcweir INetProtocol eOld = aURL.GetProtocol();
681cdf0e10cSrcweir aURL.SetURL( sTopic = lcl_DDE_RelToAbs( sTopic, sReferer ) );
682cdf0e10cSrcweir if( INET_PROT_NOT_VALID != eOld ||
683cdf0e10cSrcweir INET_PROT_HTTP != aURL.GetProtocol() )
684cdf0e10cSrcweir {
685cdf0e10cSrcweir SfxStringItem aName( SID_FILE_NAME, sTopic );
686cdf0e10cSrcweir SfxBoolItem aMinimized(SID_MINIMIZED, sal_True);
687cdf0e10cSrcweir SfxBoolItem aHidden(SID_HIDDEN, sal_True);
688cdf0e10cSrcweir SfxStringItem aTarget( SID_TARGETNAME, String::CreateFromAscii("_blank") );
689cdf0e10cSrcweir SfxStringItem aReferer( SID_REFERER, sReferer );
690cdf0e10cSrcweir SfxUInt16Item aUpdate( SID_UPDATEDOCMODE, nUpdateMode );
691cdf0e10cSrcweir SfxBoolItem aReadOnly(SID_DOC_READONLY, sal_True);
692cdf0e10cSrcweir
693cdf0e10cSrcweir // #i14200# (DDE-link crashes wordprocessor)
694cdf0e10cSrcweir SfxAllItemSet aArgs( SFX_APP()->GetPool() );
695cdf0e10cSrcweir aArgs.Put(aReferer);
696cdf0e10cSrcweir aArgs.Put(aTarget);
697cdf0e10cSrcweir aArgs.Put(aHidden);
698cdf0e10cSrcweir aArgs.Put(aMinimized);
699cdf0e10cSrcweir aArgs.Put(aName);
700cdf0e10cSrcweir aArgs.Put(aUpdate);
701cdf0e10cSrcweir aArgs.Put(aReadOnly);
702cdf0e10cSrcweir pFndShell = SfxObjectShell::CreateAndLoadObject( aArgs );
703cdf0e10cSrcweir }
704cdf0e10cSrcweir }
705cdf0e10cSrcweir
706cdf0e10cSrcweir sal_Bool bRet = sal_False;
707cdf0e10cSrcweir if( pFndShell )
708cdf0e10cSrcweir {
709cdf0e10cSrcweir sfx2::SvLinkSource* pNewSrc = pFndShell->DdeCreateLinkSource( sItem );
710cdf0e10cSrcweir if( pNewSrc )
711cdf0e10cSrcweir {
712cdf0e10cSrcweir bRet = sal_True;
713cdf0e10cSrcweir
714cdf0e10cSrcweir ::com::sun::star::datatransfer::DataFlavor aFl;
715cdf0e10cSrcweir SotExchange::GetFormatDataFlavor( pLink->GetContentType(), aFl );
716cdf0e10cSrcweir
717cdf0e10cSrcweir pLink->SetObj( pNewSrc );
718cdf0e10cSrcweir pNewSrc->AddDataAdvise( pLink, aFl.MimeType,
719cdf0e10cSrcweir sfx2::LINKUPDATE_ONCALL == pLink->GetUpdateMode()
720cdf0e10cSrcweir ? ADVISEMODE_ONLYONCE
721cdf0e10cSrcweir : 0 );
722cdf0e10cSrcweir }
723cdf0e10cSrcweir }
724cdf0e10cSrcweir return bRet;
725cdf0e10cSrcweir }
726cdf0e10cSrcweir
727cdf0e10cSrcweir
728cdf0e10cSrcweir }
729cdf0e10cSrcweir
730cdf0e10cSrcweir
731cdf0e10cSrcweir
732