/**************************************************************
 * 
 * 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_graphic_MediaProperties_idl
#define com_sun_star_graphic_MediaProperties_idl

#include <com/sun/star/beans/PropertyValues.idl>
#include <com/sun/star/io/XInputStream.idl>
#include <com/sun/star/io/XStream.idl>

module com { module sun { module star { module graphic
{

/** This service describes the properties that are used
	when using the <type>XGraphicProvider</type> interface methods
*/
published service MediaProperties
{
	/** Property that describes the location of the source or target
		of the graphic as URL. 
		
		<p>A URL can be used instead of the 
		<member>InputStream</member> or <member>OutputStream</member>
		property</p>
	
		<p>In addition to the normal protocols like file:// or http://
		you can use private URL's as follows to get access to graphics
		lying inside the resource system within an Office context:
		
		<ul>
			<li>private:resource/projectshortname/bitmap/12345</li>
			<li>private:resource/projectshortname/bitmapex/12345</li>
			<li>private:resource/projectshortname/image/12345</li>
			<li>private:resource/projectshortname/imagelist/12345</li>
			<li>private:resource/projectshortname/imagelist/12345/12</li>
		</ul>
And additionally, GraphicObject scheme url's like 
            <ul> <li>vnd.sun.star.GraphicObject:10000000000001940000012FB99807BD</li> </ul>
              can be used to access graphics held by the GraphicCache implementation. 
        </p>

        <p>Yet more, you can access graphics in the application-wide image
        repository by specifying URLs of the form
        <code>private:graphicrepository/<em>&lt;path_in_repository&gt;</em></code>. 
</p>
	*/
	[optional, property ] string URL;

	/** This property is only used for loading graphics or querying
		graphic descriptors

		<p>A <member>InputStream</member> can be used instead of the 
		<member>URL</member> property</p>
				
		@see com::sun::star::io::XInputStream
	*/
	[optional, property ] ::com::sun::star::io::XInputStream InputStream;
	
	/** This property is only used for storing graphics

		<p>A <member>OutputStream</member> can be used instead of the 
		<member>URL</member> property</p>
			
		@see com::sun::star::io::XStream
	*/
	[optional, property ] ::com::sun::star::io::XStream OutputStream;

	/** This property is only used for storing graphics and describes the
		format into which the graphic is to be converted
	
		<p>At the moment, the following mime types are supported for storing
		graphics:</p>
		
		<ul>
			<li>image/bmp</li>
			<li>image/gif</li>
			<li>image/jpeg</li>
			<li>image/png</li>
			<li>image/tiff</li>
			<li>image/svg+xml</li>
			<li>image/x-cmu-raster</li>
			<li>image/x-emf</li>
			<li>image/x-eps</li>
			<li>image/x-met</li>
			<li>image/x-pict</li>
			<li>image/x-portable-bitmap</li>
			<li>image/x-portable-pixmap</li>
			<li>image/x-wmf</li>
			<li>image/x-svm</li>
			<li>image/x-xpixmap</li>
			<li>image/x-vclgraphic</li>
		</ul>
	*/
	[optional, property ] string MimeType;
	
	/** Additional properties that will be passed to the
	appropriate filter module.
	*/
    [optional, property] ::com::sun::star::beans::PropertyValues FilterData;
};

} ; } ; } ; } ; 

#endif
