1*efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*efeef26fSAndrew Rist  * distributed with this work for additional information
6*efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9*efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*efeef26fSAndrew Rist  *
11*efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*efeef26fSAndrew Rist  *
13*efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15*efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17*efeef26fSAndrew Rist  * specific language governing permissions and limitations
18*efeef26fSAndrew Rist  * under the License.
19*efeef26fSAndrew Rist  *
20*efeef26fSAndrew Rist  *************************************************************/
21*efeef26fSAndrew Rist 
22*efeef26fSAndrew Rist 
23cdf0e10cSrcweir #include "precompiled_sw.hxx"
24cdf0e10cSrcweir #include <retrievedinputstreamdata.hxx>
25cdf0e10cSrcweir #include <retrieveinputstreamconsumer.hxx>
26cdf0e10cSrcweir #include <vcl/svapp.hxx>
27cdf0e10cSrcweir 
28cdf0e10cSrcweir /** implementation of class <SwRetrievedInputStreamDataManager>
29cdf0e10cSrcweir 
30cdf0e10cSrcweir     OD 2007-01-30 #i73788#
31cdf0e10cSrcweir */
32cdf0e10cSrcweir SwRetrievedInputStreamDataManager* SwRetrievedInputStreamDataManager::mpManager = 0;
33cdf0e10cSrcweir SwRetrievedInputStreamDataManager::tDataKey SwRetrievedInputStreamDataManager::mnNextKeyValue = 1;
34cdf0e10cSrcweir osl::Mutex SwRetrievedInputStreamDataManager::maGetManagerMutex;
35cdf0e10cSrcweir 
GetManager()36cdf0e10cSrcweir SwRetrievedInputStreamDataManager& SwRetrievedInputStreamDataManager::GetManager()
37cdf0e10cSrcweir {
38cdf0e10cSrcweir     osl::MutexGuard aGuard(maGetManagerMutex);
39cdf0e10cSrcweir 
40cdf0e10cSrcweir     if ( mpManager == 0 )
41cdf0e10cSrcweir     {
42cdf0e10cSrcweir         mpManager = new SwRetrievedInputStreamDataManager();
43cdf0e10cSrcweir     }
44cdf0e10cSrcweir 
45cdf0e10cSrcweir     return *mpManager;
46cdf0e10cSrcweir }
47cdf0e10cSrcweir 
ReserveData(boost::weak_ptr<SwAsyncRetrieveInputStreamThreadConsumer> pThreadConsumer)48cdf0e10cSrcweir SwRetrievedInputStreamDataManager::tDataKey SwRetrievedInputStreamDataManager::ReserveData(
49cdf0e10cSrcweir                         boost::weak_ptr< SwAsyncRetrieveInputStreamThreadConsumer > pThreadConsumer )
50cdf0e10cSrcweir {
51cdf0e10cSrcweir     osl::MutexGuard aGuard(maMutex);
52cdf0e10cSrcweir 
53cdf0e10cSrcweir     // create empty data container for given thread Consumer
54cdf0e10cSrcweir     tDataKey nDataKey( mnNextKeyValue );
55cdf0e10cSrcweir     tData aNewEntry( pThreadConsumer );
56cdf0e10cSrcweir     maInputStreamData[ nDataKey ] = aNewEntry;
57cdf0e10cSrcweir 
58cdf0e10cSrcweir     // prepare next data key value
59cdf0e10cSrcweir     if ( mnNextKeyValue < SAL_MAX_UINT64 )
60cdf0e10cSrcweir     {
61cdf0e10cSrcweir         ++mnNextKeyValue;
62cdf0e10cSrcweir     }
63cdf0e10cSrcweir     else
64cdf0e10cSrcweir     {
65cdf0e10cSrcweir         mnNextKeyValue = 1;
66cdf0e10cSrcweir     }
67cdf0e10cSrcweir 
68cdf0e10cSrcweir     return nDataKey;
69cdf0e10cSrcweir }
70cdf0e10cSrcweir 
PushData(const tDataKey nDataKey,com::sun::star::uno::Reference<com::sun::star::io::XInputStream> xInputStream,const sal_Bool bIsStreamReadOnly)71cdf0e10cSrcweir void SwRetrievedInputStreamDataManager::PushData(
72cdf0e10cSrcweir         const tDataKey nDataKey,
73cdf0e10cSrcweir         com::sun::star::uno::Reference<com::sun::star::io::XInputStream> xInputStream,
74cdf0e10cSrcweir         const sal_Bool bIsStreamReadOnly )
75cdf0e10cSrcweir {
76cdf0e10cSrcweir     osl::MutexGuard aGuard(maMutex);
77cdf0e10cSrcweir 
78cdf0e10cSrcweir     std::map< tDataKey, tData >::iterator aIter = maInputStreamData.find( nDataKey );
79cdf0e10cSrcweir 
80cdf0e10cSrcweir     if ( aIter != maInputStreamData.end() )
81cdf0e10cSrcweir     {
82cdf0e10cSrcweir         // Fill data container.
83cdf0e10cSrcweir         (*aIter).second.mxInputStream = xInputStream;
84cdf0e10cSrcweir         (*aIter).second.mbIsStreamReadOnly = bIsStreamReadOnly;
85cdf0e10cSrcweir 
86cdf0e10cSrcweir         // post user event to process the retrieved input stream data
87cdf0e10cSrcweir         if ( GetpApp() )
88cdf0e10cSrcweir         {
89cdf0e10cSrcweir 
90cdf0e10cSrcweir             tDataKey* pDataKey = new tDataKey;
91cdf0e10cSrcweir             *pDataKey = nDataKey;
92cdf0e10cSrcweir             GetpApp()->PostUserEvent( LINK( this, SwRetrievedInputStreamDataManager, LinkedInputStreamReady ), pDataKey );
93cdf0e10cSrcweir         }
94cdf0e10cSrcweir         else
95cdf0e10cSrcweir         {
96cdf0e10cSrcweir             // no application available -> discard data
97cdf0e10cSrcweir             maInputStreamData.erase( aIter );
98cdf0e10cSrcweir         }
99cdf0e10cSrcweir     }
100cdf0e10cSrcweir }
101cdf0e10cSrcweir 
PopData(const tDataKey nDataKey,tData & rData)102cdf0e10cSrcweir bool SwRetrievedInputStreamDataManager::PopData( const tDataKey nDataKey,
103cdf0e10cSrcweir                                                  tData& rData )
104cdf0e10cSrcweir {
105cdf0e10cSrcweir     osl::MutexGuard aGuard(maMutex);
106cdf0e10cSrcweir 
107cdf0e10cSrcweir     bool bDataProvided( false );
108cdf0e10cSrcweir 
109cdf0e10cSrcweir     std::map< tDataKey, tData >::iterator aIter = maInputStreamData.find( nDataKey );
110cdf0e10cSrcweir 
111cdf0e10cSrcweir     if ( aIter != maInputStreamData.end() )
112cdf0e10cSrcweir     {
113cdf0e10cSrcweir         rData.mpThreadConsumer = (*aIter).second.mpThreadConsumer;
114cdf0e10cSrcweir         rData.mxInputStream = (*aIter).second.mxInputStream;
115cdf0e10cSrcweir         rData.mbIsStreamReadOnly = (*aIter).second.mbIsStreamReadOnly;
116cdf0e10cSrcweir 
117cdf0e10cSrcweir         maInputStreamData.erase( aIter );
118cdf0e10cSrcweir 
119cdf0e10cSrcweir         bDataProvided = true;
120cdf0e10cSrcweir     }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     return bDataProvided;
123cdf0e10cSrcweir }
124cdf0e10cSrcweir 
125cdf0e10cSrcweir /** callback function, which is triggered by input stream data manager on
126cdf0e10cSrcweir     filling of the data container to provide retrieved input stream to the
127cdf0e10cSrcweir     thread Consumer using <Application::PostUserEvent(..)>
128cdf0e10cSrcweir 
129cdf0e10cSrcweir     OD 2007-01-29 #i73788#
130cdf0e10cSrcweir     Note: This method has to be run in the main thread.
131cdf0e10cSrcweir 
132cdf0e10cSrcweir     @author OD
133cdf0e10cSrcweir */
IMPL_LINK(SwRetrievedInputStreamDataManager,LinkedInputStreamReady,SwRetrievedInputStreamDataManager::tDataKey *,pDataKey)134cdf0e10cSrcweir IMPL_LINK( SwRetrievedInputStreamDataManager,
135cdf0e10cSrcweir            LinkedInputStreamReady,
136cdf0e10cSrcweir            SwRetrievedInputStreamDataManager::tDataKey*,
137cdf0e10cSrcweir            pDataKey )
138cdf0e10cSrcweir {
139cdf0e10cSrcweir     if ( !pDataKey )
140cdf0e10cSrcweir     {
141cdf0e10cSrcweir         return 0;
142cdf0e10cSrcweir     }
143cdf0e10cSrcweir 
144cdf0e10cSrcweir     osl::MutexGuard aGuard(maMutex);
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     SwRetrievedInputStreamDataManager& rDataManager =
147cdf0e10cSrcweir                             SwRetrievedInputStreamDataManager::GetManager();
148cdf0e10cSrcweir     SwRetrievedInputStreamDataManager::tData aInputStreamData;
149cdf0e10cSrcweir     if ( rDataManager.PopData( *pDataKey, aInputStreamData ) )
150cdf0e10cSrcweir     {
151cdf0e10cSrcweir         boost::shared_ptr< SwAsyncRetrieveInputStreamThreadConsumer > pThreadConsumer =
152cdf0e10cSrcweir                                     aInputStreamData.mpThreadConsumer.lock();
153cdf0e10cSrcweir         if ( pThreadConsumer )
154cdf0e10cSrcweir         {
155cdf0e10cSrcweir             pThreadConsumer->ApplyInputStream( aInputStreamData.mxInputStream,
156cdf0e10cSrcweir                                                aInputStreamData.mbIsStreamReadOnly );
157cdf0e10cSrcweir         }
158cdf0e10cSrcweir     }
159cdf0e10cSrcweir     delete pDataKey;
160cdf0e10cSrcweir 
161cdf0e10cSrcweir     return 0;
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
164