geometryCacheFile.h

#ifndef _GEOMETRY_CACHE_FILE
#define _GEOMETRY_CACHE_FILE

//-
// ==========================================================================
// Copyright 1995,2006,2008 Autodesk, Inc. All rights reserved.
//
// Use of this software is subject to the terms of the Autodesk
// license agreement provided at the time of installation or download,
// or which otherwise accompanies this software in either electronic
// or hard copy form.
// ==========================================================================
//+

//
// File Name: geometryCacheFile.h
//
// Description : 
//      An interface used for reading cache file data, storing it
//      and converting it to ASCII.  The geometry cache file data is 
//      currently being stored in the Maya IFF format.  However, note that 
//      the file format is subject to change in future versions of Maya.  
//      The following is the typical tag format for a single file cache.
//
//  |---CACH (Group)    // Header
//  |     |---VRSN      // Version Number (char*)
//  |     |---STIM      // Start Time of the Cache File (int)
//  |     |---ETIM      // End Time of the Cache File (int)
//  |
//  |---MYCH (Group)    // 1st Time 
//  |     |---TIME      // Time (int)
//  |     |---CHNM      // 1st Channel Name (char*)
//  |     |---SIZE      // 1st Channel Size
//  |     |---DVCA      // 1st Channel Data (Double Vector Array)
//  |     |---CHNM      // n-th Channel Name
//  |     |---SIZE      // n-th Channel Size
//  |     |---DVCA      // n-th Channel Data (Double Vector Array)
//  |     |..
//  |
//  |---MYCH (Group)    // 2nd Time 
//  |     |---TIME      // Time
//  |     |---CHNM      // 1st Channel Name
//  |     |---SIZE      // 1st Channel Size
//  |     |---DVCA      // 1st Channel Data (Double Vector Array)
//  |     |---CHNM      // n-th Channel Name
//  |     |---SIZE      // n-th Channel Size
//  |     |---DVCA      // n-th Channel Data (Double Vector Array)
//  |     |..
//  |
//  |---..
//  |
//
//      The above example shows a cache file containing channels of double
//      vector array data.  Maya can also store float vector array data,
//      using the IFF key "FVCA".
//
//      In a multiple file caches, the only difference is that after the 
//      header "CACH" group, there is only one MYCH group and there is no 
//      TIME chunk. Note that the value of the header's STIM and ETIM chunk 
//      are only relevant with multiple file caches.
//

// Project includes
//
#include <geometryCacheBlockBase.h>

// Maya includes
//
#include <maya/MString.h>
#include <maya/MIffFile.h>

// Other includes
//
#include <list>

// Typedef of STL containers to store our chunks of data
//
typedef std::list<geometryCacheBlockBase*> cacheBlockList;
typedef std::list<geometryCacheBlockBase*>::iterator cacheBlockIterator;

class geometryCacheFile
{
public:
    // Constructor / Destructor methods
    //
                geometryCacheFile( const MString& fileName, MIffFile* iffFile );
    virtual     ~geometryCacheFile();

    // Accessor methods
    //
    const MString&  fileName();
    const bool&     isRead();

    // Read cache method
    //
    bool    readCacheFiles();

    // Convert cache method
    //
    bool    convertToAscii();

private:
    // Read header methods
    //
    bool    readHeaderGroup( MStatus& status );
    bool    readHeaderVersion();
    bool    readHeaderTimeRange();

    // Read channel methods
    //    
    bool    readChannelGroup( MStatus& groupStatus );
    
    bool    readChannelTime();
    bool    readChannel( MStatus& channelStatus );
    bool    readChannelName( MStatus& channelStatus );
    bool    readChannelData();

    // These methods are for modifying the data in the 
    // cacheBlockList member called "blockList"
    //
    void    storeCacheBlock( const MString& tag );
    void    storeCacheBlock( const MString& tag, const int& value );
    void    storeCacheBlock( const MString& tag, const MString& value  );
    void    storeCacheBlock( const MString& tag, 
                        const double* value, 
                        const uint& size );
    void    storeCacheBlock( const MString& tag, 
                        const float* value, 
                        const uint& size );

    // Data members
    //
    MIffFile*           iffFilePtr;     // Object that reads the cache files
    MString             cacheFileName;  // The cache file name
    bool                readStatus;     // Indicates if the file was read
    cacheBlockList      blockList;      // List of read data blocks from file
};

#endif