#ifndef _CEGOCONTENTOBJECT_H_INCLUDED_
#define _CEGOCONTENTOBJECT_H_INCLUDED_
///////////////////////////////////////////////////////////////////////////////
//                                                         
// CegoContentObject.h
// -------------------
// Cego content object class definition
//     
// Design and Implementation by Bjoern Lemke
//
// (C)opyright 2000-2025 Bjoern Lemke
//
// INTERFACE MODULE
//
// Class: CegoContentObject
//
// Description: This is a super class for all content classes like CegoTableObject, CegoIndexObject
//              and others which are used to describe data content objects.
//
// Status: CLEAN
//
///////////////////////////////////////////////////////////////////////////////

// LFC INCLUDES
#include <lfcbase/Exception.h>
#include <lfcbase/ListT.h>
#include <lfcbase/Chain.h>

// CEGO INCLUDES
#include "CegoField.h"
#include "CegoProcBlock.h"
#include "CegoDecodableObject.h"

class CegoContentObject : public CegoDecodableObject {

public:
    
    CegoContentObject();
    CegoContentObject(const CegoContentObject& co);
    CegoContentObject(unsigned tabSetId, CegoObject::ObjectType type, const Chain& contentName);
    CegoContentObject(unsigned tabSetId, CegoObject::ObjectType type, const Chain& contentName, const Chain& tableName, const ListT<CegoField>& schema);
    
    virtual ~CegoContentObject();

    void setTabName(const Chain& name);
    const Chain& getTabName() const;

    void setTabAlias(const Chain& name);
    const Chain& getTabAlias() const;
    
    virtual void setSchema(const ListT<CegoField>& schema) = 0;   
    const ListT<CegoField>& getSchema();
    
    ListT<CegoContentObject*>& getSubCOList();

    CegoContentObject& operator = ( const CegoContentObject& co);
    bool operator == ( const CegoContentObject& co);

    virtual Chain getId(CegoProcBlock *pBlock) const = 0;
    virtual Chain toChain(unsigned defTabSetId) const = 0;
    virtual CegoContentObject* clone(bool isAttrRef) = 0;
    
protected:

    unsigned getBaseContentSize() const;

    void encodeBaseContent(char *buf, unsigned size) const;
    void decodeBaseContent(char *buf, unsigned& size);

    void setEmpty();
    
    ListT<CegoField> _schema;
    ListT<CegoContentObject*> _subCOList;
    
private:

    unsigned getSchemaSize() const;
    Chain _tabName;
    Chain _tabAlias;
};
#endif
