/**************************************************************
 * 
 * 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_document_MediaDescriptor_idl__
#define __com_sun_star_document_MediaDescriptor_idl__

#ifndef __com_sun_star_io_XOutputStream_idl__
#include <com/sun/star/io/XOutputStream.idl>
#endif

#ifndef __com_sun_star_io_XInputStream_idl__
#include <com/sun/star/io/XInputStream.idl>
#endif

#ifndef __com_sun_star_awt_Rectangle_idl__
#include <com/sun/star/awt/Rectangle.idl>
#endif

#ifndef __com_sun_star_beans_NamedValue_idl__
#include <com/sun/star/beans/NamedValue.idl>
#endif

#ifndef __com_sun_star_util_URL_idl__
#include <com/sun/star/util/URL.idl>
#endif

#ifndef __com_sun_star_task_XInteractionHandler_idl__
#include <com/sun/star/task/XInteractionHandler.idl>
#endif

#ifndef __com_sun_star_task_XStatusIndicator_idl__
#include <com/sun/star/task/XStatusIndicator.idl>
#endif

#ifndef __com_sun_star_frame_XFrame_idl__
#include <com/sun/star/frame/XFrame.idl>
#endif

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

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

//=============================================================================
/** describes properties of a document, regarding the relationship
	between the loaded document and the resource the document is
	loaded from / stored to.

    <p>
    This service may be represented by a
    <type scope="com::sun::star::beans" dim="[]">PropertyValue</type>.
    Such descriptors will be passed to different functions, included into possible
    load/save proccesses. Every member of such process can use this descriptor
    and may change it if to actualize the informations about the document.
    So this descriptor should be used as an in/out parameter.
    </p>

    <p>
    Note:<br>
    It's not allowed to hold member of this descriptor by references longer the they
    will be used (especially a possible stream). It's allowed to use it directly
    or by copying it only.
    </p>

	@see com::sun::star::beans::PropertyValue
 */
published service MediaDescriptor
{
    //-------------------------------------------------------------------------
    /** May be set by filters or detection services if user has chosen to
        abort loading/saving, e.g. while entering a password.
     */
    [optional,property] boolean Aborted;

	//-------------------------------------------------------------------------
    /** document is a template

        <p>
        Loading a component of type "template" creates a new untitled document
        by default, but setting the "AsTemplate" property to <FALSE/> loads the
        template document for editing. Setting "AsTemplate" to <TRUE/> creates a
        new untitled document out of the loaded document, even if it has not
        a "template" type.
        </p>
     */
	[optional,property] boolean AsTemplate;

	//-------------------------------------------------------------------------
    /** the author of the document

        <p>
        Only for storing versions in components supporting versioning:
        author of version.
        </p>
     */
    [optional,property] string Author;

	//-------------------------------------------------------------------------
    /** identifier of used character set

        <p>
        Defines the character set for document formats that contain single
        byte characters (if necessary).
        </p>
     */
	[optional,property] string CharacterSet;

	//-------------------------------------------------------------------------
    /** description of document

        <p>
        Only for storing versions in components supporting versioning:
        comment (description) for stored version.
        </p>
     */
    [optional,property] string Comment;

	//-------------------------------------------------------------------------
    /** pack specific properties of caller

        <p>
        This is a parameter that can be used for any properties specific
        for a special component type. Format of that depends from real
        type of addressed component.
        </p>
        
        <p>
        For extensibility, it is recommended to use values of type
        sequence<com.sun.star.beans.NamedValue> with this property.
        </p>
     */
    [optional,property] any ComponentData;

	//-------------------------------------------------------------------------
	/** The base URL of the document to be used to resolve relative links.
	 */
	[optional,property] string DocumentBaseURL;

	//-------------------------------------------------------------------------
    /** document title

        <p>
		This parameter can be used to specify a title for a document.
		</p>
	 */
	[optional,property] string DocumentTitle;

	//-------------------------------------------------------------------------
    /** encryption information for encryption/decryption of documents

        <p>
        It contains the necessary information for encryption/decryption of 
        a component (if necessary).
        If neither password nor encryption data is specified, loading of 
        a password protected document will fail, storing will be done without
        encryption. If both are provided, the encryption data is used 
        ( if the filter supports it ).
        </p>
        <p>
        The encryption data is generated based on the password.
        </p>
     */
    [optional,property] sequence< ::com::sun::star::beans::NamedValue > EncryptionData;

	//-------------------------------------------------------------------------
    /** same as <member>MediaDescriptor::URL</member>

        <p>
        It will be supported for compatibility reasons only.
        </p>

        @deprecated
     */
    [optional,property] string FileName;

	//-------------------------------------------------------------------------
    /** internal filter name

        <p>
        Name of a filter that should be used for loading or storing the component.
        Names must match the names of the <type>TypeDetection</type> configuration,
        invalid names are ignored. If a name is specified on loading,
        it still will be verified by a filter detection, but in case of doubt
        it will be preferred.
        </p>
	 */
	[optional,property] string FilterName;

	//-------------------------------------------------------------------------
    /** same as <member>MediaDescriptor::FilterOptions</member>

        <p>
        It will be supported for compatibility reasons only.
        </p>

        @deprecated
     */
    [optional,property] string FilterFlags;

	//-------------------------------------------------------------------------
    /** additional properties for filter

        <p>
        Some filters need additional parameters; use only together with property
        <member>MediaDescriptor::FilterName</member>. Details must be documented
        by the filter. This is an old format for some filters. If a string is not
        enough, filters can use the property <member>MediaDescriptor::FilterData</member>.
        </p>
     */
    [optional,property] string FilterOptions;

        //-------------------------------------------------------------------------
    /** additional properties for filter

        <p>
        This is a parameter that can be used for any properties specific
        for a special filter type. It should be used if
        <member>MediaDescriptor::FilterOptions</member> isn't enough.
        </p>
     */
    [optional,property] any FilterData;

	//-------------------------------------------------------------------------
    /** load document invisible

        <p>
        Defines if the loaded component is made visible. If this property is not
        specified, the component is made visible by default.
        </p>
	 */
    [optional,property] boolean Hidden;

	//-------------------------------------------------------------------------
	/** The hierarchical path to the embedded document from topmost container.
	 */
	[optional,property] string HierarchicalDocumentName;

	//-------------------------------------------------------------------------
    /** a stream to receive the document data.

        <p>
        If used when storing a document: writing must be done using this stream.
        If no stream is provided, the loader will create a stream by itself using
        the other properties. It is not allowed to keep a reference to this
        OutputStream after storing the component.
        </p>
	 */
    [optional,property] com::sun::star::io::XOutputStream OutputStream;

	//-------------------------------------------------------------------------
    /** content of document

        <p>
        If used when loading a document: reading must be done using this stream.
        If no stream is provided, the loader will create a stream by itself using
        the other properties. It is not allowed to keep a reference to this
        InputStream after loading the component, and it would be useless, because
        in general an InputStream is usable for readong only once, except when it
        also implements the <type scope="com::sun::star::io">XSeekable</type> interface.
        </p>
	 */
    [optional,property] com::sun::star::io::XInputStream InputStream;

	//-------------------------------------------------------------------------
    /** handle exceptional situations

        <p>
        Object implementing the <type scope="com::sun::star::task">InteractionHandler</type>
        service that is used to handle exceptional situations where proceeding with the task
        is impossible without additional information or impossible at all.
        The implemented api provides a default implementation for it that can handle many situations.
        If no InteractionHandler is set, a suitable exception is thrown.
        It is not allowed to keep a reference to this object, even not in the loaded
        or stored components' copy of the MediaDescriptor provided by its arguments attribute.
        </p>
     */
    [optional,property] com::sun::star::task::XInteractionHandler InteractionHandler;

	//-------------------------------------------------------------------------
    /** jump to a marked position after loading

        <p>
        This is the same as the text behind a '#' in a http URL. But
        this syntax with a '#' is not specified in most URL schemas.
		</p>
	 */
	[optional,property] string JumpMark;

	//-------------------------------------------------------------------------
    /** specify mime type of content

        <p>
        Type of the medium to load, that must match to one of the types defined
        in the <type>TypeDetection</type> configuration (otherwise it's ignored).
        This bypasses the type detection of the <type scope="com::sun::star::frame">Desktop</type> environment,
        so passing a wrong MediaType will cause failure of loading.
        </p>
	 */
	[optional,property] string MediaType;

	//-------------------------------------------------------------------------
    /** please use the corresponding parameters of this descriptor instead

        <p>
        String that summarizes some flags for loading. The string contains capital
        letters for the flags:<br>
        <table border=1>
            <tr>
                <td><strong>flag</strong></td>
                <td><strong>value</strong></td>
                <td><strong>replacement</strong></td>
            </tr>
            <tr>
                <td><em>ReadOnly</em></td>
                <td>R</td>
                <td><member>MediaDescriptor::ReadOnly</member></td>
            </tr>
            <tr>
                <td><em>Preview</em></td>
                <td>B</td>
                <td><member>MediaDescriptor::Preview</member></td>
            </tr>
            <tr>
                <td><em>AsTemplate</em></td>
                <td>T</td>
                <td><member>MediaDescriptor::AsTemplate</member></td>
            </tr>
            <tr>
                <td><em>Hidden</em></td>
                <td>H</td>
                <td><member>MediaDescriptor::Hidden</member></td>
            </tr>
        </table>
        </p>

        @deprecated
     */
    [optional,property] string OpenFlags;

	//-------------------------------------------------------------------------
    /** opens a new view for an already loaded document

        <p>
        Setting this to <TRUE/> forces the component to create a new window on loading
        in any case. If the component supports multiple views, a second view is
        opened, if not, the component is loaded one more time. Otherwise the behavior
        depends on the default window handling of the <type scope="com::sun::star::frame">Desktop</type> environment.
        </p>
	 */
	[optional,property] boolean OpenNewView;


	//-------------------------------------------------------------------------
    /** overwrite any existing file

        <p>
        For storing only: overwrite any existing file, default is <FALSE/>,
        so an error occurs if the target file already exists.
        </p>
     */
    [optional,property] boolean Overwrite;

	//-------------------------------------------------------------------------
    /** pasword for loading storing documents

        <p>
        It contains a password for loading or storing a component (if necessary).
        If neither password nor encryption data is specified, loading of 
        a password protected document will fail, storing will be done without
        encryption. If both are provided, the encryption data is used 
        ( if the filter supports it ).
        </p>
     */
    [optional,property] string Password;

	//-------------------------------------------------------------------------
	/** contains the data for HTTP post method as a sequence of bytes.

        <p>
        Data to send to a location described by the media descriptor to get
        a result in return that will be loaded as a component
        (usually in webforms). Default is: no PostData.
        </p>
	 */
    [optional,property] sequence< byte > PostData;

	//-------------------------------------------------------------------------
    /** use <member>MediaDescriptor::PostData</member> instead of this

        <p>
        Same as PostData, but the data is transferred as a string
        (just for compatibility).
        </p>

        @deprecated
	 */
	[optional,property] string PostString;

	//-------------------------------------------------------------------------
    /** show preview

        <p>
        Setting this to <TRUE/> tells the a loaded component that it is loaded as
        a preview, so it can optimize loading and viewing for this special purpose.
        Default is <FALSE/>.
        </p>
	 */
    [optional,property] boolean Preview;

	//-------------------------------------------------------------------------
    /** open document readonly

        <p>
        Tells whether a document should be loaded in a (logical) readonly or in
        read/write mode. If opening in the desired mode is impossible, an error occurs.
        By default the loaded content decides what to do: if its UCB content supports
        a "readonly" property, the logical open mode depends on that, otherwise
        it will be read/write. This is only a UI related property, opening a
        document in read only mode will not prevent the component from being
        modified by API calls, but all modifying functionality in the UI will
        be disabled or removed.
        </p>
	 */
	[optional,property] boolean ReadOnly;

	//-------------------------------------------------------------------------
    /** start presentation from a document

        <p>
        Tells the component loading the document that a presentation that is in the
        document is to be started right away.
        </p>
    */
    [optional,property] boolean StartPresentation;

    //-------------------------------------------------------------------------
    /** name of document referrer

        <p>
        A URL describing the environment of the request; f.e. a referrer may be a
        URL of a document, if a hyperlink inside this document is clicked to load
        another document. The referrer may be evaluated by the addressed UCB content
        or the loaded document. Without a referrer the processing of URLs that
        needs security checks will be denied, f.e. "macro:" URLs.
        <br>
        Don't be confused about the wrong spelling; is kept for compatibility reasons.
        </p>
	 */
	[optional,property] string Referer;

	//-------------------------------------------------------------------------
    /** let the document be opened in repair mode

        <p>
        For loading of corrupted zip packages: Setting this to <TRUE/> let the document
		be opened in repair mode, so as much as possible information will be retrieved.
        </p>

	 @since OpenOffice 1.1.2
	 */
	[optional,property] boolean RepairPackage;

	//-------------------------------------------------------------------------
    /** can be used for status informations

        <p>
        Object implementing the <type scope="com::sun::star::task">XStatusIndicator</type>
        interface that can be used to give status information (text or progress) for the task.
        The office provides a default implementation for it. It is not allowed to keep
        a reference to this object, even not in the loaded or stored components'
        copy of the MediaDescriptor provided by its arguments attribute.
        </p>
     */
    [optional,property] com::sun::star::task::XStatusIndicator StatusIndicator;

    //-------------------------------------------------------------------------
    /** allows to specify the URL that is used next time SaveAs dialog is opened

        <p>
        If the parameter is specified, the URL will be used by SaveAs dialog
        next time as target folder.
        </p>
     */
    [optional,property] string SuggestedSaveAsDir;

    //-------------------------------------------------------------------------
    /** allows to specify the suggested file name that is used next time SaveAs
        dialog is opened

        <p>
        If the parameter is specified, the file name will be suggested by
        SaveAs dialog next time.
        </p>
     */
    [optional,property] string SuggestedSaveAsName;

    //-------------------------------------------------------------------------
    /** name of the template instead of the URL

        <p>
        The logical name of a template to load. Together with the <member>MediaDescriptor::TemplateRegion</member>
        property it can be used instead of the URL of the template. Use always in conjunction with
        <member>MediaDescriptor::TemplateRegionName</member>.
        </p>
	 */
    [optional,property] string TemplateName;

    //-------------------------------------------------------------------------
    /** name of the template instead of the URL

        <p>
        The logical name of a template to load. Together with the <member>MediaDescriptor::TemplateRegion</member>
        property it can be used instead of the URL of the template. Use always in conjunction with
        <member>MediaDescriptor::TemplateRegionName</member>.
        </p>
	 */
    [optional,property] string TemplateRegionName;

    //-------------------------------------------------------------------------
    /** regulate using of compressing

        <p>
        For storing: Setting this to <TRUE/> means, don't use a zip file to save
        the document, use a folder instead (only usable for UCB contents, that
        support folders). Default is <FALSE/>.
        </p>
     */
    [optional,property] boolean Unpacked;

    //-------------------------------------------------------------------------
    /** URL of the document

        <p>
        The location of the component in URL syntax. It must be the full qualified URL and
        must include f.e. an optional <member>MediaDescriptor::JumpMark</member> too.
        </p>
	 */
    [optional,property] string URL;

	//-------------------------------------------------------------------------
    /** storage version

        <p>
        For components supporting versioning: the number of the version to be
        loaded or saved. Default is zero and means: no version is created or
        loaded, the "main" document is processed.
        </p>
	 */
	[optional,property] short Version;

    //-------------------------------------------------------------------------
    /** set special view state
        <p>
        Data to set a special view state after loading. The type depends on
        the component and is usually retrieved from a <type scope="com::sun::star::frame">Controller</type>
        object by its <type scope="com::sun::star::frame">XController</type>
        interface. Default is: no view data.
        </p>
	 */
    [optional,property] any ViewData;

	//-------------------------------------------------------------------------
    /** id of the initial view

        <p>
        For components supporting different views: a number to define the view
        that should be constructed after loading. Default is: zero, and this
        should be treated by the component as the default view.
        </p>
	 */
	[optional,property] short ViewId;

	//-------------------------------------------------------------------------
	/** should the macro be executed.
		the value should be one from <type scope="com::sun::star::document">MacroExecMode</type>
		constant list.

	    @since OpenOffice 1.1.2
	 */
	[optional,property] short MacroExecutionMode;

	//-------------------------------------------------------------------------
	/** can the document be updated depending from links.
		the value should be one from <type scope="com::sun::star::document">UpdateDocMode</type>
		constant list.

	    @since OpenOffice 1.1.2
	 */
	[optional,property] short UpdateDocMode;

	//-------------------------------------------------------------------------
	/** specifies the name of the view controller to create when loading a document

        <p>If this property is used when loading a document into a frame, then it
        specifies the name of the view controller to create. That is, the property
        is passed to the document's <member scope="com::sun::star::frame">XModel2::createViewController</member>
        method.<br/>
        If the loaded document does not support the <code>XModel2</code> interface,
        the property is ignored.</p>

        @see ::com::sun::star::frame::XModel2::createViewController
        @see ::com::sun::star::frame::XController2::ViewControllerName

	    @since OpenOffice 3.0
	 */
	[optional,property] string ViewControllerName;
	//-------------------------------------------------------------------------

	/** specifies the frame containing the document. May be empty.
	 */
	[optional,property] com::sun::star::frame::XFrame Frame;
};

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

}; }; }; };

#endif
