/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_embed_XStorageBasedDocument_idl__
#define __com_sun_star_embed_XStorageBasedDocument_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_embed_XStorage_idl__
#include <com/sun/star/embed/XStorage.idl>
#endif

#ifndef __com_sun_star_io_IOException_idl__
#include <com/sun/star/io/IOException.idl>
#endif

#ifndef __com_sun_star_frame_DoubleInitializationException_idl__
#include <com/sun/star/frame/DoubleInitializationException.idl>
#endif

#ifndef __com_sun_star_document_XStorageChangeListener_idl__
#include <com/sun/star/document/XStorageChangeListener.idl>
#endif

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

#ifndef __com_sun_star_beans_PropertyValue_idl__
#include <com/sun/star/beans/PropertyValue.idl>
#endif

//============================================================================

 module com {  module sun {  module star {  module document {

//============================================================================
/** allows to initialize document with a storage, to store document to
    a storage, and to set document to be based on provided storage.
 */
published interface XStorageBasedDocument: com::sun::star::uno::XInterface
{
    //------------------------------------------------------------------------
    /** lets the document load itself using provided storage.
     */
    void loadFromStorage(
            [in] ::com::sun::star::embed::XStorage xStorage,
            [in] sequence< ::com::sun::star::beans::PropertyValue > aMediaDescriptor )
        raises( ::com::sun::star::lang::IllegalArgumentException,
                ::com::sun::star::frame::DoubleInitializationException,
                ::com::sun::star::io::IOException,
                ::com::sun::star::uno::Exception );

    //------------------------------------------------------------------------
    /** lets the document store itself to the provided storage.
     */
    void storeToStorage(
            [in] ::com::sun::star::embed::XStorage xStorage,
            [in] sequence< ::com::sun::star::beans::PropertyValue > aMediaDescriptor )
        raises( ::com::sun::star::lang::IllegalArgumentException,
                ::com::sun::star::io::IOException,
                ::com::sun::star::uno::Exception );

    //------------------------------------------------------------------------
    /** allows to switch the document to the provided storage.
     */
    void switchToStorage( [in] ::com::sun::star::embed::XStorage xStorage )
        raises( ::com::sun::star::lang::IllegalArgumentException,
                ::com::sun::star::io::IOException,
                ::com::sun::star::uno::Exception );


    //------------------------------------------------------------------------
    /** allows to get the storage the document is based on.
     */
    ::com::sun::star::embed::XStorage getDocumentStorage()
        raises( ::com::sun::star::io::IOException,
                ::com::sun::star::uno::Exception );

    //------------------------------------------------------------------------
    /** allows to register a listener that will be notified when another
        storage is set to the document.
     */
    void addStorageChangeListener( [in] XStorageChangeListener xListener );

    //------------------------------------------------------------------------
    /** allows to deregister the listener.
     */
    void removeStorageChangeListener( [in] XStorageChangeListener xListener );

};

//============================================================================

}; }; }; };

#endif

