/**************************************************************
 * 
 * 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_ucb_FileContent_idl__
#define __com_sun_star_ucb_FileContent_idl__

#ifndef __com_sun_star_lang_XComponent_idl__
#include <com/sun/star/lang/XComponent.idl>
#endif

#ifndef __com_sun_star_ucb_XContent_idl__
#include <com/sun/star/ucb/XContent.idl>
#endif

#ifndef __com_sun_star_ucb_XCommandProcessor_idl__
#include <com/sun/star/ucb/XCommandProcessor.idl>
#endif

#ifndef __com_sun_star_ucb_XCommandProcessor2_idl__
#include <com/sun/star/ucb/XCommandProcessor2.idl>
#endif

#ifndef __com_sun_star_ucb_XContentCreator_idl__
#include <com/sun/star/ucb/XContentCreator.idl>
#endif

#ifndef __com_sun_star_beans_XPropertiesChangeNotifier_idl__
#include <com/sun/star/beans/XPropertiesChangeNotifier.idl>
#endif

#ifndef __com_sun_star_beans_XPropertyContainer_idl__
#include <com/sun/star/beans/XPropertyContainer.idl>
#endif

#ifndef __com_sun_star_beans_XPropertySetInfoChangeNotifier_idl__
#include <com/sun/star/beans/XPropertySetInfoChangeNotifier.idl>
#endif

#ifndef __com_sun_star_ucb_XCommandInfoChangeNotifier_idl__
#include <com/sun/star/ucb/XCommandInfoChangeNotifier.idl>
#endif

#ifndef __com_sun_star_container_XChild_idl__
#include <com/sun/star/container/XChild.idl>
#endif

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

module com { module sun { module star { module ucb {

//=============================================================================
/** A File Content represents either a directory or a file in the local file
	system.

	<p>Whether a content represents a folder or a file can be determined by
	inspecting its property <b>IsFolder</b> or <b>IsDocument</b>.

	@see com::sun::star::ucb::FileContentProvider
*/
published service FileContent
{
	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::lang::XComponent;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::ucb::XContent;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.

		<p>An object representing a directory in the file system is able
		to create a new object, which in turn can become the representation
		of a physical file/directory being contained in the initial directory.
		The precise way is the following:

		<p>

		<ol>
		<li>
		Let the parent folder create a new content by calling
		<member>XContentCreator::createNewContent</member> on it. The content
		type to use for new directories is
		"application/vnd.sun.staroffice.fsys-folder". To create a new file
		use the type "application/vnd.sun.staroffice.fsys-file".
		As return value you get a new file content object.
		</li>
		<li>
		Set a title at the new object by letting it execute
		the command "setPropertyValues", which sets at least the property
		"Title" to a non-empty value ).
		</li>
		<li>
		Let the new object ( not the parent! ) execute the command "insert".
		This will create the corresponding physical file or directory.
		For files, you need to supply the implementation of
		an <type scope="com::sun::star::io">XInputStream</type> with the
		command's parameters, that provides access to the stream data.
		</li>
		</ol>

		</p>
	 */
	interface com::sun::star::ucb::XContentCreator;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.

		<p>

		<b>Supported Commands</b>

		<ul>
		<li>
		getCommandInfo
		</li>
		<li>
		getPropertySetInfo
		</li>
		<li>
		getPropertyValues
		</li>
		<li>
		setPropertyValues
		</li>
		<li>
		insert ( makes a newly created document persistent )
		</li>
		<li>
		delete
		</li>
		<li>
		open
		</li>
		<li>
		transfer
		</li>
		</ul>

		<b>Supported Properties</b>
		<ul>
		<li>
		string ContentType ( read-only, either
		"application/vnd.sun.staroffice.fsys-folder" or
		"application/vnd.sun.staroffice.fsys-file" )
		</li>
		<li>
		boolean IsDocument ( read-only, always <true/> for files, always
		<false/> for directories )
		</li>
		<li>
		boolean IsFolder ( read-only ), always <false/> for files, always
		<true/> for directories )
		</li>
		<li>
		<type scope="com::sun::star::util">DateTime</type> DateModified ( read-only )
		</li>
		<li>
		boolean IsReadOnly ( read-only attribute )
		</li>
		<li>
		hyper Size ( file size )
		</li>
		<li>
		string Title ( file name )
		</li>
		<li>
		boolean	IsVolume ( read-only )
		</li>
		<li>
		boolean IsRemoveable ( read-only )
		</li>
		<li>
		boolean IsRemote ( read-only )
		</li>
		<li>
		boolean IsCompactDisc ( read-only )
		</li>
		<li>
		boolean IsFloppy ( read-only )
		</li>
		<li>
		boolean IsHidden ( read-only )
		</li>
		</ul>

		</p>
	 */
	interface com::sun::star::ucb::XCommandProcessor;

    //-------------------------------------------------------------------------
    /** is an enhanced version of <type>XCommandProcessor</type> that has an
        additional method for releasing command identifiers obtained via
        <member>XCommandProcessor::createCommandIdentifier</member> to avoid
        resource leaks. For a detailed description of the problem refer to
        <member>XCommandProcessor2::releaseCommandIdentifier</member>.

        <p>Where many existing <type>Content</type> implementations do not
        (yet), every new implementation should support this interface.
     */
    [optional] interface com::sun::star::ucb::XCommandProcessor2;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::beans::XPropertiesChangeNotifier;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::beans::XPropertyContainer;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::beans::XPropertySetInfoChangeNotifier;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::ucb::XCommandInfoChangeNotifier;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::container::XChild;
};

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

}; }; }; };

#endif
