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_CONTENT_HXX 25 #define INCLUDED_TDOC_CONTENT_HXX 26 27 #include <ucbhelper/contenthelper.hxx> 28 #include <com/sun/star/task/DocumentPasswordRequest.hpp> 29 #include <com/sun/star/ucb/XContentCreator.hpp> 30 #include <com/sun/star/ucb/CommandFailedException.hpp> 31 #include "tdoc_provider.hxx" 32 33 #define NO_STREAM_CREATION_WITHIN_DOCUMENT_ROOT 1 34 35 namespace com { namespace sun { namespace star { 36 namespace sdbc { class XRow; } 37 namespace io { class XInputStream; class XOutputStream; } 38 namespace beans { struct PropertyValue; } 39 namespace ucb { struct OpenCommandArgument2; struct TransferInfo; 40 struct ContentInfo; } 41 } } } 42 43 namespace tdoc_ucp 44 { 45 46 //========================================================================= 47 48 #define TDOC_ROOT_CONTENT_SERVICE_NAME \ 49 "com.sun.star.ucb.TransientDocumentsRootContent" 50 #define TDOC_DOCUMENT_CONTENT_SERVICE_NAME \ 51 "com.sun.star.ucb.TransientDocumentsDocumentContent" 52 #define TDOC_FOLDER_CONTENT_SERVICE_NAME \ 53 "com.sun.star.ucb.TransientDocumentsFolderContent" 54 #define TDOC_STREAM_CONTENT_SERVICE_NAME \ 55 "com.sun.star.ucb.TransientDocumentsStreamContent" 56 57 //========================================================================= 58 59 enum ContentType { STREAM, FOLDER, DOCUMENT, ROOT }; 60 61 class ContentProperties 62 { 63 public: ContentProperties()64 ContentProperties() 65 {} 66 ContentProperties(const ContentType & rType,const rtl::OUString & rTitle)67 ContentProperties( const ContentType & rType, const rtl::OUString & rTitle ) 68 : m_eType( rType ), 69 m_aContentType( rType == STREAM 70 ? rtl::OUString::createFromAscii( TDOC_STREAM_CONTENT_TYPE ) 71 : rType == FOLDER 72 ? rtl::OUString::createFromAscii( TDOC_FOLDER_CONTENT_TYPE ) 73 : rType == DOCUMENT 74 ? rtl::OUString::createFromAscii( TDOC_DOCUMENT_CONTENT_TYPE ) 75 : rtl::OUString::createFromAscii( TDOC_ROOT_CONTENT_TYPE ) ), 76 m_aTitle( rTitle ) 77 {} 78 getType() const79 ContentType getType() const { return m_eType; } 80 81 // Properties 82 getContentType() const83 const rtl::OUString & getContentType() const { return m_aContentType; } 84 getIsFolder() const85 bool getIsFolder() const { return m_eType > STREAM; } getIsDocument() const86 bool getIsDocument() const { return !getIsFolder(); } 87 getTitle() const88 const rtl::OUString & getTitle() const { return m_aTitle; } setTitle(const rtl::OUString & rTitle)89 void setTitle( const rtl::OUString & rTitle ) { m_aTitle = rTitle; } 90 91 com::sun::star::uno::Sequence< com::sun::star::ucb::ContentInfo > 92 getCreatableContentsInfo() const; 93 94 bool isContentCreator() const; 95 96 private: 97 ContentType m_eType; 98 rtl::OUString m_aContentType; 99 rtl::OUString m_aTitle; 100 }; 101 102 //========================================================================= 103 104 class Content : public ::ucbhelper::ContentImplHelper, 105 public com::sun::star::ucb::XContentCreator 106 { 107 enum ContentState { TRANSIENT, // created via createNewContent, 108 // but did not process "insert" yet 109 PERSISTENT, // processed "insert" 110 DEAD // processed "delete" / document was closed 111 }; 112 113 ContentProperties m_aProps; 114 ContentState m_eState; 115 ContentProvider* m_pProvider; 116 117 private: 118 Content( const com::sun::star::uno::Reference< 119 com::sun::star::lang::XMultiServiceFactory >& rxSMgr, 120 ContentProvider* pProvider, 121 const com::sun::star::uno::Reference< 122 com::sun::star::ucb::XContentIdentifier >& Identifier, 123 const ContentProperties & rProps ); 124 Content( const com::sun::star::uno::Reference< 125 com::sun::star::lang::XMultiServiceFactory >& rxSMgr, 126 ContentProvider* pProvider, 127 const com::sun::star::uno::Reference< 128 com::sun::star::ucb::XContentIdentifier >& Identifier, 129 const com::sun::star::ucb::ContentInfo& Info ); 130 131 virtual com::sun::star::uno::Sequence< com::sun::star::beans::Property > 132 getProperties( const com::sun::star::uno::Reference< 133 com::sun::star::ucb::XCommandEnvironment > & xEnv ); 134 virtual com::sun::star::uno::Sequence< com::sun::star::ucb::CommandInfo > 135 getCommands( const com::sun::star::uno::Reference< 136 com::sun::star::ucb::XCommandEnvironment > & xEnv ); 137 virtual ::rtl::OUString getParentURL(); 138 139 static bool hasData( ContentProvider* pProvider, const Uri & rUri ); hasData(const Uri & rUri)140 bool hasData( const Uri & rUri ) { return hasData( m_pProvider, rUri ); } 141 142 static bool loadData( ContentProvider* pProvider, 143 const Uri & rUri, 144 ContentProperties& rProps ); 145 bool storeData( const com::sun::star::uno::Reference< 146 com::sun::star::io::XInputStream >& xData, 147 const com::sun::star::uno::Reference< 148 com::sun::star::ucb::XCommandEnvironment >& xEnv ) 149 throw ( ::com::sun::star::ucb::CommandFailedException, 150 ::com::sun::star::task::DocumentPasswordRequest ); 151 bool renameData( const com::sun::star::uno::Reference< 152 com::sun::star::ucb::XContentIdentifier >& xOldId, 153 const com::sun::star::uno::Reference< 154 com::sun::star::ucb::XContentIdentifier >& xNewId ); 155 bool removeData(); 156 157 bool copyData( const Uri & rSourceUri, const rtl::OUString & rNewName ); 158 159 ::com::sun::star::uno::Reference< 160 ::com::sun::star::ucb::XContentIdentifier > 161 makeNewIdentifier( const rtl::OUString& rTitle ); 162 163 typedef rtl::Reference< Content > ContentRef; 164 typedef std::list< ContentRef > ContentRefList; 165 void queryChildren( ContentRefList& rChildren ); 166 167 sal_Bool exchangeIdentity( 168 const ::com::sun::star::uno::Reference< 169 ::com::sun::star::ucb::XContentIdentifier >& xNewId ); 170 171 ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow > 172 getPropertyValues( const ::com::sun::star::uno::Sequence< 173 ::com::sun::star::beans::Property >& rProperties ); 174 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > 175 setPropertyValues( 176 const ::com::sun::star::uno::Sequence< 177 ::com::sun::star::beans::PropertyValue >& rValues, 178 const ::com::sun::star::uno::Reference< 179 ::com::sun::star::ucb::XCommandEnvironment > & xEnv ) 180 throw( ::com::sun::star::uno::Exception ); 181 182 com::sun::star::uno::Any 183 open( const ::com::sun::star::ucb::OpenCommandArgument2& rArg, 184 const ::com::sun::star::uno::Reference< 185 ::com::sun::star::ucb::XCommandEnvironment >& xEnv ) 186 throw( ::com::sun::star::uno::Exception ); 187 188 void insert( const ::com::sun::star::uno::Reference< 189 ::com::sun::star::io::XInputStream >& xData, 190 sal_Int32 nNameClashResolve, 191 const ::com::sun::star::uno::Reference< 192 ::com::sun::star::ucb::XCommandEnvironment > & xEnv ) 193 throw( ::com::sun::star::uno::Exception ); 194 195 void destroy( sal_Bool bDeletePhysical, 196 const ::com::sun::star::uno::Reference< 197 ::com::sun::star::ucb::XCommandEnvironment > & xEnv ) 198 throw( ::com::sun::star::uno::Exception ); 199 200 void transfer( const ::com::sun::star::ucb::TransferInfo& rInfo, 201 const ::com::sun::star::uno::Reference< 202 ::com::sun::star::ucb::XCommandEnvironment > & xEnv ) 203 throw( ::com::sun::star::uno::Exception ); 204 205 static ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow > 206 getPropertyValues( const ::com::sun::star::uno::Reference< 207 ::com::sun::star::lang::XMultiServiceFactory >& rSMgr, 208 const ::com::sun::star::uno::Sequence< 209 ::com::sun::star::beans::Property >& rProperties, 210 const ContentProperties& rData, 211 ContentProvider* pProvider, 212 const ::rtl::OUString& rContentId ); 213 214 215 static bool commitStorage( 216 const com::sun::star::uno::Reference< 217 com::sun::star::embed::XStorage > & xStorage ); 218 219 static bool closeOutputStream( 220 const com::sun::star::uno::Reference< 221 com::sun::star::io::XOutputStream > & xOut ); 222 223 ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > 224 getInputStream( const ::com::sun::star::uno::Reference< 225 ::com::sun::star::ucb::XCommandEnvironment > & 226 xEnv ) 227 throw ( ::com::sun::star::ucb::CommandFailedException, 228 ::com::sun::star::task::DocumentPasswordRequest ); 229 230 ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > 231 getTruncatedOutputStream( 232 const ::com::sun::star::uno::Reference< 233 ::com::sun::star::ucb::XCommandEnvironment > & xEnv ) 234 throw ( ::com::sun::star::ucb::CommandFailedException, 235 ::com::sun::star::task::DocumentPasswordRequest ); 236 237 ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XContent > 238 queryChildContent( const rtl::OUString & rRelativeChildUri ); 239 240 ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > 241 getStream( const ::com::sun::star::uno::Reference< 242 ::com::sun::star::ucb::XCommandEnvironment > & xEnv ) 243 throw ( ::com::sun::star::ucb::CommandFailedException, 244 ::com::sun::star::task::DocumentPasswordRequest ); 245 246 public: 247 // Create existing content. Fail, if not already exists. 248 static Content* create( 249 const com::sun::star::uno::Reference< 250 com::sun::star::lang::XMultiServiceFactory >& rxSMgr, 251 ContentProvider* pProvider, 252 const com::sun::star::uno::Reference< 253 com::sun::star::ucb::XContentIdentifier >& Identifier ); 254 255 // Create new content. Fail, if already exists. 256 static Content* create( 257 const com::sun::star::uno::Reference< 258 com::sun::star::lang::XMultiServiceFactory >& rxSMgr, 259 ContentProvider* pProvider, 260 const com::sun::star::uno::Reference< 261 com::sun::star::ucb::XContentIdentifier >& Identifier, 262 const com::sun::star::ucb::ContentInfo& Info ); 263 264 virtual ~Content(); 265 266 // XInterface 267 XINTERFACE_DECL() 268 269 // XTypeProvider 270 XTYPEPROVIDER_DECL() 271 272 // XServiceInfo 273 virtual ::rtl::OUString SAL_CALL 274 getImplementationName() 275 throw( ::com::sun::star::uno::RuntimeException ); 276 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL 277 getSupportedServiceNames() 278 throw( ::com::sun::star::uno::RuntimeException ); 279 280 // XContent 281 virtual rtl::OUString SAL_CALL 282 getContentType() 283 throw( com::sun::star::uno::RuntimeException ); 284 virtual com::sun::star::uno::Reference< 285 com::sun::star::ucb::XContentIdentifier > SAL_CALL 286 getIdentifier() 287 throw( com::sun::star::uno::RuntimeException ); 288 289 // XCommandProcessor 290 virtual com::sun::star::uno::Any SAL_CALL 291 execute( const com::sun::star::ucb::Command& aCommand, 292 sal_Int32 CommandId, 293 const com::sun::star::uno::Reference< 294 com::sun::star::ucb::XCommandEnvironment >& Environment ) 295 throw( com::sun::star::uno::Exception, 296 com::sun::star::ucb::CommandAbortedException, 297 com::sun::star::uno::RuntimeException ); 298 virtual void SAL_CALL 299 abort( sal_Int32 CommandId ) 300 throw( com::sun::star::uno::RuntimeException ); 301 302 ////////////////////////////////////////////////////////////////////// 303 // Additional interfaces 304 ////////////////////////////////////////////////////////////////////// 305 306 // XContentCreator 307 virtual com::sun::star::uno::Sequence< 308 com::sun::star::ucb::ContentInfo > SAL_CALL 309 queryCreatableContentsInfo() 310 throw( com::sun::star::uno::RuntimeException ); 311 virtual com::sun::star::uno::Reference< 312 com::sun::star::ucb::XContent > SAL_CALL 313 createNewContent( const com::sun::star::ucb::ContentInfo& Info ) 314 throw( com::sun::star::uno::RuntimeException ); 315 316 ////////////////////////////////////////////////////////////////////// 317 // Non-interface methods. 318 ////////////////////////////////////////////////////////////////////// 319 320 static ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow > 321 getPropertyValues( const ::com::sun::star::uno::Reference< 322 ::com::sun::star::lang::XMultiServiceFactory >& rSMgr, 323 const ::com::sun::star::uno::Sequence< 324 ::com::sun::star::beans::Property >& rProperties, 325 ContentProvider* pProvider, 326 const ::rtl::OUString& rContentId ); 327 328 void notifyDocumentClosed(); 329 void notifyChildRemoved( const rtl::OUString & rRelativeChildUri ); 330 void notifyChildInserted( const rtl::OUString & rRelativeChildUri ); 331 getContentProvider() const332 rtl::Reference< ContentProvider > getContentProvider() const 333 { return rtl::Reference< ContentProvider >( m_pProvider ); } 334 }; 335 336 } // namespace tdoc_ucp 337 338 #endif /* !INCLUDED_TDOC_CONTENT_HXX */ 339