#ifndef MARSHAL_H #define MARSHAL_H #include #include #include "sortdict.h" #include "store.h" class ArgumentList; struct BaseInfo; struct Grouping; struct SectionInfo; struct ListItemInfo; class QCString; class QGString; class SectionDict; class MemberSDict; class GroupList; struct BodyInfo; struct DocInfo; struct BriefInfo; class MemberList; class ExampleSDict; class Entry; #define NULL_LIST 0xffffffff class FileStorage : public QFile, public StorageIntf { public: FileStorage() : QFile() {} FileStorage( const QString &name) : QFile(name) {} int read(char *buf,uint size) { return QFile::readBlock(buf,size); } int write(const char *buf,uint size) { return QFile::writeBlock(buf,size); } }; class StreamStorage : public StorageIntf { public: StreamStorage() { m_data=0; m_offset=0; m_len=0; } ~StreamStorage() { delete m_data; } StreamStorage(char *data,uint len) { m_data=data; m_offset=0; m_len=len; } int read(char *buf,uint size) { int bytesLeft = QMIN((int)size,m_len-m_offset); if (bytesLeft>0) memcpy(buf,m_data,bytesLeft); m_offset+=bytesLeft; return bytesLeft; } int write(const char *buf,uint size) { m_data=(char *)realloc(m_data,m_offset+size); memcpy(m_data+m_offset,buf,size); m_offset+=size; m_len+=size; return size; } void rewind() { m_offset=0; } char *data() const { return m_data; } int size() { return m_len; } private: char *m_data; int m_offset; int m_len; }; //----- marshaling function: datatype -> byte stream -------------------- void marshalInt(StorageIntf *s,int v); void marshalUInt(StorageIntf *s,uint v); void marshalBool(StorageIntf *s,bool b); void marshalQCString(StorageIntf *s,const QCString &str); void marshalQGString(StorageIntf *s,const QGString &str); void marshalArgumentList(StorageIntf *s,ArgumentList *argList); void marshalArgumentLists(StorageIntf *s,QList *argLists); void marshalBaseInfoList(StorageIntf *s, QList *baseList); void marshalGroupingList(StorageIntf *s, QList *groups); void marshalSectionInfoList(StorageIntf *s, QList *anchors); void marshalItemInfoList(StorageIntf *s, QList *sli); void marshalObjPointer(StorageIntf *s,void *obj); void marshalSectionDict(StorageIntf *s,SectionDict *sections); void marshalMemberSDict(StorageIntf *s,MemberSDict *memberSDict); void marshalDocInfo(StorageIntf *s,DocInfo *docInfo); void marshalBriefInfo(StorageIntf *s,BriefInfo *briefInfo); void marshalBodyInfo(StorageIntf *s,BodyInfo *bodyInfo); void marshalGroupList(StorageIntf *s,GroupList *groupList); void marshalMemberList(StorageIntf *s,MemberList *ml); void marshalExampleSDict(StorageIntf *s,ExampleSDict *ed); void marshalMemberLists(StorageIntf *s,SDict *mls); void marshalEntry(StorageIntf *s,Entry *e); void marshalEntryTree(StorageIntf *s,Entry *e); //----- unmarshaling function: byte stream -> datatype ------------------ int unmarshalInt(StorageIntf *s); uint unmarshalUInt(StorageIntf *s); bool unmarshalBool(StorageIntf *s); QCString unmarshalQCString(StorageIntf *s); QGString unmarshalQGString(StorageIntf *s); ArgumentList * unmarshalArgumentList(StorageIntf *s); QList *unmarshalArgumentLists(StorageIntf *s); QList * unmarshalBaseInfoList(StorageIntf *s); QList * unmarshalGroupingList(StorageIntf *s); QList * unmarshalSectionInfoList(StorageIntf *s); QList *unmarshalItemInfoList(StorageIntf *s); void * unmarshalObjPointer(StorageIntf *s); SectionDict * unmarshalSectionDict(StorageIntf *s); MemberSDict * unmarshalMemberSDict(StorageIntf *s); DocInfo * unmarshalDocInfo(StorageIntf *s); BriefInfo * unmarshalBriefInfo(StorageIntf *s); BodyInfo * unmarshalBodyInfo(StorageIntf *s); GroupList * unmarshalGroupList(StorageIntf *s); MemberList * unmarshalMemberList(StorageIntf *s); ExampleSDict * unmarshalExampleSDict(StorageIntf *s); SDict * unmarshalMemberLists(StorageIntf *s); Entry * unmarshalEntry(StorageIntf *s); Entry * unmarshalEntryTree(StorageIntf *s); #endif