#pragma once

#include "McDbObject.h"
#include "Mdsdef.h"

class McDbXrecordImp;
class McDbDatabase;
// -------------------------------------------------------------------------
// Summary:
// 		扩展记录类型，实体可以设置它的扩展记录，用于存放更多的信息
// Remarks:
// 		例如:写实体的扩展记录代码如下
// 		<code>
// 			void CTestCommands::Writexrecorddata()
// 			{
// 				ads_name entName;
// 				ads_point pt;
// 				if(acedEntSel(_T("选择写扩展记录数据的实体:"),entName,pt) != RTNORM)
// 				{
// 					return;
// 				}
// 				AcDbObjectId objId;
// 				if(acdbGetObjectId(objId,entName) != Acad::eOk)
// 					return;
// 
// 
// 				struct resbuf* pData = acutBuildList(RTSTR,_T("Test"),RTLONG,4555,0);
// 
// 				WriteXRecord(pData,objId,_T("TestRecordName"));
// 
// 				acutRelRb(pData);
// 			}
// 			bool CTestCommands::WriteXRecord(struct resbuf* pRbValue,const AcDbObjectId &id,LPCMSTR pszxRecordName)
// 			{
// 				AcDbObjectPointer<AcDbObject> pObj(id,AcDb::kForWrite);
// 				if(pObj.openStatus() != Acad::eOk)
// 				{
// 					return false;
// 				}
// 
// 				if(pszxRecordName == NULL || pRbValue == NULL)
// 				{
// 					acutPrintf(_T("\n参数为空!"));
// 					return false;
// 				}
// 
// 				//得到实体的字典ID
// 				AcDbObjectId extDictId = pObj->extensionDictionary();
// 				if (extDictId == AcDbObjectId::kNull) 
// 				{
// 					Acad::ErrorStatus es = pObj->createExtensionDictionary();
// 					if (es != Acad::eOk) 
// 					{
// 						acutPrintf(_T("\n创建扩展字典错误:%d!"),es);
// 						return false;
// 					}
// 					if ((extDictId = pObj->extensionDictionary()) == AcDbObjectId::kNull) 
// 					{
// 						acutPrintf(_T("\n错误: 不能创建扩展字典!"));
// 						return false;
// 					}
// 				}
// 
// 				//创建新的扩展记录
// 				AcDbObjectPointer<McDbDictionary> pDict(extDictId,AcDb::kForRead);
// 				if(pDict.openStatus() != Acad::eOk)
// 				{
// 					acutPrintf(_T("\n读方式打开字典失败!"));
// 					return false;
// 				}
// 				AcDbObjectId xRecId;
// 				if(pDict->getAt(pszxRecordName,xRecId) != Acad::eOk)
// 				{
// 					AcDbXrecord* pXrec = new AcDbXrecord;
// 					pDict->upgradeOpen();
// 					if(pDict->setAt(pszxRecordName,pXrec,xRecId) != Acad::eOk)
// 					{
// 						acutPrintf(_T("\n创建新的扩展记录数据失败!"));
// 						return false;
// 					}
// 					pXrec->close();
// 				}
// 
// 				//写数据
// 				AcDbObjectPointer<AcDbXrecord> pXrcord(xRecId,AcDb::kForWrite);
// 				if(pXrcord.openStatus() != Acad::eOk)
// 				{
// 					acutPrintf(_T("\n写方式打开扩展记录失败"));
// 					return false;
// 				}
// 				else
// 				{
// 					if(pXrcord->setFromRbChain(*pRbValue) != Acad::eOk)
// 					{
// 						acutPrintf(_T("\nsetFromRbChain() 失败!"));
// 						return false;
// 					}
// 				}
// 
// 				return true;
// 			}
// 		</code>
// 		例如:读实体的扩展记录代码如下
// 		<code>
// 			void CTestCommands::Readxrecorddata()
// 			{
// 				ads_name entName;
// 				ads_point pt;
// 				if(acedEntSel(_T("选择实体:"),entName,pt) != RTNORM)
// 				{
// 					return;
// 				}
// 				AcDbObjectId objId;
// 				if(acdbGetObjectId(objId,entName) != Acad::eOk)
// 					return;
// 
// 				AcDbObjectPointer<AcDbEntity> spEnt(objId,AcDb::kForRead);
// 				if(spEnt.openStatus() != Acad::eOk)
// 					return;
// 
// 				AcDbObjectId dictId = spEnt->extensionDictionary();
// 
// 				if(!dictId.isNull())
// 				{
// 					AcDbObjectPointer<AcDbDictionary> spDict(dictId,AcDb::kForRead);
// 					if(spDict.openStatus() == Acad::eOk)
// 					{
// 						PrintDictionary(spDict.object());
// 					}
// 				}
// 				else
// 				{
// 					acutPrintf(_T("\n 没有扩展记录数据"));
// 				}
// 			}
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDbXrecord : public McDbObject
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbXrecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbXrecord(void);

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbXrecord(void);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回扩展记录数据
	// Parameters:
	// 		ppRb		-     返回的扩展记录数据指针，在不使用时需要调用Mx::mcutRelRb释放内存
	//		auxDb		-     暂没有使用
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus rbChain(struct resbuf** ppRb, McDbDatabase* auxDb = NULL) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置扩展记录数据
	// Parameters:
	//		pRb        -    设置的扩展记录数据，在不使用时需要调用Mx::mcutRelRb释放内存
	//		auxDb      -    暂没有使用
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus setFromRbChain(const struct resbuf& pRb,
		McDbDatabase* auxDb = NULL);

	//:Ignore
	const void* GetInnerData() const;
	void SetInnerData(void* );

	inline McDbXrecordImp* getMcDbXrecordImp() const {
		return (McDbXrecordImp*)m_pImp;
	}

private:
	//:End Ignore
};
