#ifndef _MPxCacheFormat
#define _MPxCacheFormat
//-
// ==========================================================================
// Copyright (C) 1995 - 2006 Autodesk, Inc., and/or its licensors.  All
// rights reserved.
//
// The coded instructions, statements, computer programs, and/or related
// material (collectively the "Data") in these files contain unpublished
// information proprietary to Autodesk, Inc. ("Autodesk") and/or its
// licensors,  which is protected by U.S. and Canadian federal copyright law
// and by international treaties.
//
// The Data may not be disclosed or distributed to third parties or be
// copied or duplicated, in whole or in part, without the prior written
// consent of Autodesk.
//
// The copyright notices in the Software and this entire statement,
// including the above license grant, this restriction and the following
// disclaimer, must be included in all copies of the Software, in whole
// or in part, and all derivative works of the Software, unless such copies
// or derivative works are solely in the form of machine-executable object
// code generated by a source language processor.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
// AUTODESK DOES NOT MAKE AND HEREBY DISCLAIMS ANY EXPRESS OR IMPLIED
// WARRANTIES INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF
// NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE,
// OR ARISING FROM A COURSE OF DEALING, USAGE, OR TRADE PRACTICE. IN NO
// EVENT WILL AUTODESK AND/OR ITS LICENSORS BE LIABLE FOR ANY LOST
// REVENUES, DATA, OR PROFITS, OR SPECIAL, DIRECT, INDIRECT, OR
// CONSEQUENTIAL DAMAGES, EVEN IF AUTODESK AND/OR ITS LICENSORS HAS
// BEEN ADVISED OF THE POSSIBILITY OR PROBABILITY OF SUCH DAMAGES.
// ==========================================================================
//+
//
// CLASS:    MPxCacheFormat
//
// ****************************************************************************

#if defined __cplusplus

// ****************************************************************************
// INCLUDED HEADER FILES


#include <maya/MObject.h>
#include <maya/MString.h>
#include <maya/MTypes.h>

class MTime;
class MFloatVectorArray;
class MDoubleArray;
class MFloatArray;
class MIntArray;
class MVectorArray;
class MCacheFormatDescription;

// ****************************************************************************
// CLASS DECLARATION (MPxCacheFormat)

//! \ingroup OpenMaya MPx
//! \brief CacheFormat definition. 
/*!
  The MPxCacheFormat class can be used to implement support for new cache
  file formats in Maya.
*/
class OPENMAYA_EXPORT MPxCacheFormat
{
public:
	//! Cache file access modes.
    typedef enum {
        kRead,		//!< read only
        kWrite,		//!< write only
	kReadWrite 	//!< read and write (e.g. append, edit, etc.)
    } FileAccessMode;

	MPxCacheFormat();
	virtual ~MPxCacheFormat();

	virtual MStatus		open( const MString& fileName, FileAccessMode mode);

	virtual void		close();

	virtual MStatus		isValid();

	virtual MStatus		rewind();


	virtual MString		extension();

	virtual MStatus		readHeader();

	virtual MStatus		writeHeader(const MString& version, MTime& startTime, MTime& endTime);


	virtual void		beginWriteChunk();

	virtual void		endWriteChunk();

	virtual MStatus		beginReadChunk();


	virtual void		endReadChunk();

	virtual MStatus		writeTime(MTime& time);

	virtual MStatus		readTime(MTime& time);

	virtual	MStatus		findTime(MTime& time, MTime& foundTime);

	virtual MStatus		readNextTime(MTime& foundTime);

	virtual unsigned	readArraySize();

	// Write data to the cache.
	virtual MStatus		writeDoubleArray(const MDoubleArray&);
	virtual MStatus		writeFloatArray(const MFloatArray&);
	virtual MStatus		writeIntArray(const MIntArray&);
	virtual MStatus		writeDoubleVectorArray(const MVectorArray& array);
	virtual MStatus     writeFloatVectorArray(const MFloatVectorArray& array);
	virtual MStatus		writeInt32(int);

	// Read data from the cache.
	virtual MStatus		readDoubleArray(MDoubleArray&, unsigned size);
	virtual MStatus		readFloatArray(MFloatArray&, unsigned size);
	virtual MStatus		readIntArray(MIntArray&, unsigned size);
	virtual MStatus		readDoubleVectorArray(MVectorArray&, unsigned arraySize);
	virtual MStatus		readFloatVectorArray(MFloatVectorArray& array, unsigned arraySize);
	virtual int			readInt32();

	virtual MStatus		writeChannelName(const MString & name);
	virtual MStatus		findChannelName(const MString & name);
	virtual MStatus		readChannelName(MString& name);

	// Read and write the description file.
	virtual bool		handlesDescription();
	virtual MStatus		readDescription( MCacheFormatDescription& description,
										 const MString& descriptionFileLocation,
										 const MString& baseFileName );
	virtual MStatus		writeDescription( const MCacheFormatDescription& description,
										  const MString& descriptionFileLocation,
										  const MString& baseFileName );

	static const char* className();

protected:

private:
};

#endif /* __cplusplus */
#endif /* _MPxCacheFormat */
