/**************************************************************
 * 
 * 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_io_XPersistObject_idl__ 
#define __com_sun_star_io_XPersistObject_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_io_IOException_idl__ 
#include <com/sun/star/io/IOException.idl> 
#endif 
 
 
//============================================================================= 
 
module com {  module sun {  module star {  module io {  
 
 published interface XObjectInputStream; 
 published interface XObjectOutputStream; 
 
//============================================================================= 
 
/** allows to make UNO objects persistent

  <p>Every UNO object, that wants to be serializable, should implement
     this interface. The object stores stores itself, when the
     write method is called.
     <p>
     The object needs to be created before it deserializes
     itself again (by using the read method). Therefor it must be
     createable by name via a factory, which is in general
     the global service manager. The create and read mechanism
     is implemented by the <type scope="com::sun::star::io">ObjectInputStream</type>.

     <p>The serialization format (the series of strings, integers, objects) must
     be specified at the specification of the concrete service.

     <p>The interface does not support any special versioning mechanism.

     @see com::sun::star::io::XObjectOutputStream
     @see com::sun::star::io::XObjectInputStream
 */
published interface XPersistObject: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	 
	/** gives the service name of the object

      @returns  
			the service name that specifies the behavior and the  
			persistent data format of this implementation.  
		 
		<p>This name is used to create such an object by a factory
        during deserialization. </p>
		 
		@see com::sun::star::lang::XServiceInfo::getAvailableServiceNames
	 */
	string getServiceName(); 
 
	//------------------------------------------------------------------------- 
	 
	// DocMerge from xml: method com::sun::star::io::XPersistObject::write
	/** writes all the persistent data of the object to the stream.
        <p>The implementation
        must write the data in the order documented in the service specification.
        @param OutStream the stream, the data shall be written to. The stream
               supports simple types and other XPersistObject implementations.
	 */
	void write( [in] com::sun::star::io::XObjectOutputStream OutStream ) 
			raises( com::sun::star::io::IOException ); 
 
	//------------------------------------------------------------------------- 
	 
	// DocMerge from xml: method com::sun::star::io::XPersistObject::read
	/** reads all the persistent data of the object from the stream.
        <p>In case
        other XPersistObjects are read from the stream, the implementation uses a factory
        to create these objects (in general the global service manager).
        <p> The implementation must read the data in the order documented at
        the service specification.
        @param InStream the stream, the data shall be read from. 
	 */
	void read( [in] com::sun::star::io::XObjectInputStream InStream ) 
			raises( com::sun::star::io::IOException ); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
