1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef INCLUDED_TDOC_STORAGE_HXX
25 #define INCLUDED_TDOC_STORAGE_HXX
26 
27 #include <map>
28 
29 #include "osl/mutex.hxx"
30 #include "rtl/ref.hxx"
31 #include "salhelper/simplereferenceobject.hxx"
32 
33 #include "com/sun/star/embed/XStorage.hpp"
34 
35 namespace tdoc_ucp {
36 
37     enum StorageAccessMode
38     {
39         READ, // Note: might be writable as well
40         READ_WRITE_NOCREATE,
41         READ_WRITE_CREATE
42     };
43 
44     class Storage;
45     class OfficeDocumentsManager;
46 
47     class StorageElementFactory : public salhelper::SimpleReferenceObject
48     {
49     public:
50         StorageElementFactory(
51             const com::sun::star::uno::Reference<
52                 com::sun::star::lang::XMultiServiceFactory > & xSMgr,
53             const rtl::Reference< OfficeDocumentsManager > & xDocsMgr );
54         ~StorageElementFactory();
55 
56         com::sun::star::uno::Reference< com::sun::star::embed::XStorage >
57 		createTemporaryStorage()
58             throw ( com::sun::star::uno::Exception,
59             		com::sun::star::uno::RuntimeException );
60 
61         com::sun::star::uno::Reference< com::sun::star::embed::XStorage >
62         createStorage( const rtl::OUString & rUri, StorageAccessMode eMode )
63             throw ( com::sun::star::embed::InvalidStorageException,
64                     com::sun::star::lang::IllegalArgumentException,
65                     com::sun::star::io::IOException,
66                     com::sun::star::embed::StorageWrappedTargetException,
67                     com::sun::star::uno::RuntimeException );
68 
69         com::sun::star::uno::Reference< com::sun::star::io::XInputStream >
70         createInputStream( const rtl::OUString & rUri,
71                            const rtl::OUString & rPassword )
72             throw ( com::sun::star::embed::InvalidStorageException,
73                     com::sun::star::lang::IllegalArgumentException,
74                     com::sun::star::io::IOException,
75                     com::sun::star::embed::StorageWrappedTargetException,
76                     com::sun::star::packages::WrongPasswordException,
77                     com::sun::star::uno::RuntimeException );
78 
79         com::sun::star::uno::Reference< com::sun::star::io::XOutputStream >
80         createOutputStream( const rtl::OUString & rUri,
81                             const rtl::OUString & rPassword,
82                             bool bTruncate )
83             throw ( com::sun::star::embed::InvalidStorageException,
84                     com::sun::star::lang::IllegalArgumentException,
85                     com::sun::star::io::IOException,
86                     com::sun::star::embed::StorageWrappedTargetException,
87                     com::sun::star::packages::WrongPasswordException,
88                     com::sun::star::uno::RuntimeException );
89 
90         com::sun::star::uno::Reference< com::sun::star::io::XStream >
91         createStream( const rtl::OUString & rUri,
92                       const rtl::OUString & rPassword,
93                       bool bTruncate )
94             throw ( com::sun::star::embed::InvalidStorageException,
95                     com::sun::star::lang::IllegalArgumentException,
96                     com::sun::star::io::IOException,
97                     com::sun::star::embed::StorageWrappedTargetException,
98                     com::sun::star::packages::WrongPasswordException,
99                     com::sun::star::uno::RuntimeException );
100 
101     private:
102         friend class Storage;
103 
104         void releaseElement( Storage * pElement ) SAL_THROW(());
105 
106         com::sun::star::uno::Reference< com::sun::star::embed::XStorage >
107         queryParentStorage( const rtl::OUString & rUri,
108                             StorageAccessMode eMode )
109             throw ( com::sun::star::embed::InvalidStorageException,
110                     com::sun::star::lang::IllegalArgumentException,
111                     com::sun::star::io::IOException,
112                     com::sun::star::embed::StorageWrappedTargetException,
113                     com::sun::star::uno::RuntimeException );
114 
115         com::sun::star::uno::Reference< com::sun::star::embed::XStorage >
116         queryStorage( const com::sun::star::uno::Reference<
117                         com::sun::star::embed::XStorage > & xParentStorage,
118                       const rtl::OUString & rUri,
119                       StorageAccessMode eMode )
120             throw ( com::sun::star::embed::InvalidStorageException,
121                     com::sun::star::lang::IllegalArgumentException,
122                     com::sun::star::io::IOException,
123                     com::sun::star::embed::StorageWrappedTargetException,
124                     com::sun::star::uno::RuntimeException );
125 
126         com::sun::star::uno::Reference< com::sun::star::io::XStream >
127         queryStream( const com::sun::star::uno::Reference<
128                         com::sun::star::embed::XStorage > & xParentStorage,
129                      const rtl::OUString & rPassword,
130                      const rtl::OUString & rUri,
131                      StorageAccessMode eMode,
132                      bool bTruncate /* ignored for read-only streams */ )
133             throw ( com::sun::star::embed::InvalidStorageException,
134                     com::sun::star::lang::IllegalArgumentException,
135                     com::sun::star::io::IOException,
136                     com::sun::star::embed::StorageWrappedTargetException,
137                     com::sun::star::packages::WrongPasswordException,
138                     com::sun::star::uno::RuntimeException );
139 
140         struct ltstrbool
141         {
operator ()tdoc_ucp::StorageElementFactory::ltstrbool142             bool operator()(
143                 const std::pair< rtl::OUString, bool > & s1,
144                 const std::pair< rtl::OUString, bool > & s2 ) const
145             {
146                 if ( s1.first < s2.first )
147                     return true;
148                 else if ( s1.first == s2.first )
149                     return ( !s1.second && s2.second );
150                 else
151                     return false;
152             }
153         };
154 
155         // key: pair< storageuri, iswritable >
156         typedef std::map<
157 			std::pair< rtl::OUString, bool >, Storage *, ltstrbool > StorageMap;
158 
159         StorageMap m_aMap;
160         osl::Mutex m_aMutex;
161         rtl::Reference< OfficeDocumentsManager > m_xDocsMgr;
162         com::sun::star::uno::Reference<
163             com::sun::star::lang::XMultiServiceFactory > m_xSMgr;
164     };
165 
166 } // namespace tdoc_ucp
167 
168 #endif /* !INCLUDED_TDOC_STORAGE_HXX */
169