⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oioic.h

📁 robot open source code
💻 H
📖 第 1 页 / 共 4 页
字号:
 * 名称:VO_Interact0
 * 描述:接口Interact0的VO函数。
 * 参数:pObject --- [IN] 指向对象;
 *       Act --- [IN] 交互行为;
 *       pCaller --- [IN] 来访者。
 */	       
static  _INLINE_  IRESULT VO_Interact0(OBJECT* pObject, ACTION Act, const VR* pCaller) 
{
	extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller);
	extern  FRESULT CallerLeave(OBJECT* pND, const VR* pCaller);

	IRESULT  ir = IR_O;

	if( (MSKAC & Act) != AC0 || 0 == pCaller->cr || 0 == pCaller->mr )
		return IR_N_INVALIDARG;
	
	if( FR_P == CallerCome(pObject, pCaller) )
	{
		ir = pObject->Interact0(pObject, Act, pCaller);
		CallerLeave(pObject, pCaller);
	}else { ir = IR_N; }
	
	return ir;
}

/**
 *
 * 名称:VO_Interact1
 * 描述:接口Interact1的VO函数。
 * 参数:pObject --- [IN] 指向对象;
 *      Act --- [IN] 交互行为;
 *      OStrm --- [OUT] 输出流的流向;
 *      Cty --- [IN] OStrm所指存储空间的容量;
 *      pQty --- [OUT] 指向实际输出的Byte数量;
 *      pCaller --- [IN] 来访者。
 */       
static  _INLINE_  IRESULT VO_Interact1(OBJECT* pObject, ACTION Act, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller) 
{
	extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller);
	extern  FRESULT CallerLeave(OBJECT* pND, const VR* pCaller);

	IRESULT  ir = IR_O;

	if( (MSKAC & Act) != AC1 || NULL == OStrm || 0 == Cty || NULL == pQty || 0 == pCaller->cr || 0 == pCaller->mr )
		return IR_N_INVALIDARG;

	*pQty = 0;

	if( FR_P == CallerCome(pObject, pCaller) ) 
	{ 
		ir = pObject->Interact1(pObject, Act, OStrm, Cty, pQty, pCaller); 
		CallerLeave(pObject, pCaller); 
	}else { ir = IR_N; }
	
	return ir;
}

/**
 *
 * 名称:VO_Interact2
 * 描述:接口Interact2的VO函数。
 * 参数:pObject --- [IN] 指向对象;
 *       Act --- [IN] 交互行为;
 *       IStrm --- [IN] 输入流;
 *       Qty --- [IN] 输入的Byte数量;
 *       pCaller --- [IN] 来访者。
 */       
static  _INLINE_  IRESULT VO_Interact2(OBJECT* pObject, ACTION Act, BYTE* IStrm, BYTKTY Qty, const VR* pCaller)  
{
	extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller);
	extern  FRESULT CallerLeave(OBJECT* pND, const VR* pCaller);

	IRESULT  ir = IR_O;
	
	if( (MSKAC & Act) != AC2 || NULL == IStrm || 0 == Qty || 0 == pCaller->cr || 0 == pCaller->mr )
		return IR_N_INVALIDARG;

	if( FR_P == CallerCome(pObject, pCaller) ) 
	{ 
		ir = pObject->Interact2(pObject, Act, IStrm, Qty, pCaller); 
		CallerLeave(pObject, pCaller); 
	}else { ir = IR_N; }
	
	return ir;
}

/**
 *
 * 名称:VO_Interact3
 * 描述:接口Interact3的VO函数。
 * 参数:pObject --- [IN] 指向对象;
 *      Act --- [IN] 交互行为;
 *      IStrm --- [IN] 输入流;
 *      Qty --- [IN] 输入的Byte数量;
 *      OStrm --- [OUT] 输出流的流向;
 *      Cty --- [IN] OStrm所指存储空间的容量;
 *      pQty --- [OUT] 指向实际输出的Byte数量;
 *      pCaller --- [IN] 来访者。
 */       
static  _INLINE_  IRESULT VO_Interact3(OBJECT* pObject, ACTION Act, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)  
{
	extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller);
	extern  FRESULT CallerLeave(OBJECT* pND, const VR* pCaller);

	IRESULT  ir = IR_O;
	
	if( (MSKAC & Act) != AC3 || NULL == IStrm || 0 == Qty || NULL == OStrm || 0 == Cty || NULL == pQty || 0 == pCaller->cr || 0 == pCaller->mr )
		return IR_N_INVALIDARG;

	*pQty = 0;

	if( FR_P == CallerCome(pObject, pCaller) ) 
	{ 
		ir = pObject->Interact3(pObject, Act, IStrm, Qty, OStrm, Cty, pQty, pCaller); 
		CallerLeave(pObject, pCaller); 
	}else { ir = IR_N; }
	
	return ir;
}

/**
 *
 * 名称:VO_Close
 * 描述:接口Close的VO函数。
 * 参数:pObject --- [IN] 指向对象; 
 *       pCaller --- [IN] 来访者。
 */       
static  _INLINE_  IRESULT VO_Close(OBJECT* pObject, const VR* pCaller) 
{
	extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller);
	extern  FRESULT CallerLeave(OBJECT* pND, const VR* pCaller);

	IRESULT  ir = IR_O;
	
	if( 0 == pCaller->cr || 0 == pCaller->mr )
		return IR_N_INVALIDARG;	

	if( FR_P == CallerCome(pObject, pCaller) ) 
	{ 
		ir = pObject->Close(pObject, pCaller); 
		CallerLeave(pObject, pCaller); 
	}else { ir = IR_N; }
	
	return ir;
}

#endif

/*===============+ 继承链的四种访问模式 +================*/

/*  
* 1. 继承链的两种访问顺序:OBS和SBO。
* (1)OBS,others before self,先访问节点的IBN后访问节点自身;
* (2)SBO,self before others,先访问节点自身后访问节点的IBN。
*
* 2. 继承链的两种访问方式:接力和非接力访问。
*    (1)接力访问,Relay Visit,访问上一个节点后,不管是什么执行结果接
*         着访问下一节点,OBS返回LND的执行结果,SBO返回FND的执行结果。
*    (2)相反就是非接力访问,Non-Relay Visit,访问上一个节点后,如果不
*         是IR_O_OBSOIX(对于OBS)或IR_O_SBOOIX(对于SBO)就返回执行
*         结果,否则就访问下一个节点。
*
* 3. 继承链的四种访问模式:两种访问顺序和两种访问方式组合为四种访问模式。
* (1)OBS_O_IX,OBS_OBJECT_<INTERFACE> 型的宏,按OBS顺序非接力访问;
* (2)OBS_O_IX_,OBS_OBJECT_<INTERFACE>_ 型的宏,按OBS顺序接力访问;
* (3)SBO_O_IX,SBO_OBJECT_<INTERFACE> 型的宏,按SBO顺序非接力访问;
* (4)_SBO_O_IX,_SBO_OBJECT_<INTERFACE> 型的宏,按SBO顺序接力访问。
*
* 注:(1)Open和Close接口只能按OBS顺序接力访问,所以Open和Close接口没
*          有OBS_O_IX、SBO_O_IX和_SBO_O_IX。
*     (2)同一接口,四种访问模式只能选择其一,因此同一接口内不能同时存
*          两种不同的访问模式。
*     (3)接力访问一般适用于单重继承,对于多重继承意义不大。
*/

/*
 *
 * 名称:OBS_OBJECT_OPEN_
 * 描述:宏,Open接口的OBS_O_IX_。
 */
#define  OBS_OBJECT_OPEN_ \
	do{ \
		IRESULT  ir; \
		IRESULT  fr; \
		NUMIB	 i; \
		VR	Caller; \
		EM_OIOIC*  pem = (EM_OIOIC*)GetEMofBN(This, MSN_OIOIC); \
		Caller.cr = pCaller->cr; \
		Caller.mr = This->OID; \
		if(0 == (This->RefCnt+1)) \
			return  IR_N_FULL; \
		This->RefCnt++; \
		if(!(MOD_SHARED & pem->mds) || 1 == This->RefCnt) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
			for(i=0; i<This->NIB; i++) \
			{ \
				fr = CallerCome(*(This->ppo_AIB+i), pCaller); \
				if(FR_P == fr) ir = (*(This->ppo_AIB+i))->Open(*(This->ppo_AIB+i), pCaller); \
				else if(FR_N_HASVR == fr) continue; \
				else ir = IR_N; \
				if( NIR(ir) ) \
				{ \
					NUMIB  j; \
					for( j=0; j<i; j++) \
					{ \
						if((*(This->ppo_AIB+j))->RefCnt == This->RefCnt) \
							VO_Close(*(This->ppo_AIB+j), &Caller); \
					} \
					This->RefCnt--; \
					return ir; \
				} \
			} \
		}else \
		{ \
			This->RefCnt--; \
			return IR_N_UNSHARED; \
		} \
	}while(0)
	
/*
 *
 * 名称:OBS_OBJECT_INPUT
 * 描述:宏,Input接口的OBS_O_IX。
 */
#define  OBS_OBJECT_INPUT \
	do{ \
		IRESULT  ir = IR_O_OBSOIX; \
		IRESULT  fr; \
		NUMIB    i; \
		for(i=0; i<This->NIB; i++) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
			fr = CallerCome(*(This->ppo_AIB+i), pCaller); \
			if(FR_P == fr) ir = (*(This->ppo_AIB+i))->Input(*(This->ppo_AIB+i), IStrm, Qty, pCaller); \
			else if(FR_N_HASVR == fr) continue; \
			else ir = IR_N; \
			if(ir != IR_O_OBSOIX) return ir; \
		} \
	}while(0)

 /*
 *
 * 名称:OBS_OBJECT_INPUT_
 * 描述:宏,Input接口的OBS_O_IX_。
 */
#define  OBS_OBJECT_INPUT_ \
	do{ \
		NUMIB    i; \
		for(i=0; i<This->NIB; i++) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
			if(FR_P == CallerCome(*(This->ppo_AIB+i), pCaller)) \
				(*(This->ppo_AIB+i))->Input(*(This->ppo_AIB+i), IStrm, Qty, pCaller); \
		} \
	}while(0)

/*
 *
 * 名称:SBO_OBJECT_INPUT
 * 描述:宏,Input接口的SBO_O_IX。
 */
#define  SBO_OBJECT_INPUT \
	do{ \
		IRESULT  ir = IR_O_SBOOIX; \
		IRESULT  fr; \
		NUMIB    i; \
		for(i=0; i<This->NIB; i++) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
			fr = CallerCome(*(This->ppo_AIB+i), pCaller); \
			if(FR_P == fr) ir = (*(This->ppo_AIB+i))->Input(*(This->ppo_AIB+i), IStrm, Qty, pCaller); \
			else if(FR_N_HASVR == fr) continue; \
			else ir = IR_N; \
			if(ir != IR_O_SBOOIX) return ir; \
		} \
		return ir; \
	}while(0)

/*
 *
 * 名称:_SBO_OBJECT_INPUT
 * 描述:宏,Input接口的_SBO_O_IX。
 */
#define  _SBO_OBJECT_INPUT \
	do{ \
		IRESULT  ir = IR_O__SBOOIX; \
		NUMIB    i; \
		for(i=0; i<This->NIB; i++) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
			if(FR_P == CallerCome(*(This->ppo_AIB+i), pCaller)) \
				ir = (*(This->ppo_AIB+i))->Input(*(This->ppo_AIB+i), IStrm, Qty, pCaller); \
		} \
		return ir; \
	}while(0)
	
/*
 *
 * 名称:OBS_OBJECT_OUTPUT
 * 描述:宏,Output接口的OBS_O_IX。
 */
#define  OBS_OBJECT_OUTPUT \
	do{ \
		IRESULT  ir = IR_O_OBSOIX;  \
		IRESULT  fr; \
		NUMIB    i; \
		for(i=0; i<This->NIB; i++) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
			fr = CallerCome(*(This->ppo_AIB+i), pCaller); \
			if(FR_P == fr) ir = (*(This->ppo_AIB+i))->Output(*(This->ppo_AIB+i), OStrm, Cty, pQty, pCaller); \
			else if(FR_N_HASVR == fr) continue; \
			else ir = IR_N; \
			if(ir != IR_O_OBSOIX) return ir; \
		} \
	}while(0)

/*
 *
 * 名称:OBS_OBJECT_OUTPUT_
 * 描述:宏,Output接口的OBS_O_IX_。
 */
#define  OBS_OBJECT_OUTPUT_ \
	do{ \
		NUMIB    i; \
		for(i=0; i<This->NIB; i++) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
			if(FR_P == CallerCome(*(This->ppo_AIB+i), pCaller)) \
				(*(This->ppo_AIB+i))->Output(*(This->ppo_AIB+i), OStrm, Cty, pQty, pCaller); \
		} \
	}while(0)

/*
 *
 * 名称:SBO_OBJECT_OUTPUT
 * 描述:宏,Output接口的SBO_O_IX。
 */
#define  SBO_OBJECT_OUTPUT \
	do{ \
		IRESULT  ir = IR_O_SBOOIX; \
		IRESULT  fr; \
		NUMIB    i; \
		for(i=0; i<This->NIB; i++) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
			fr = CallerCome(*(This->ppo_AIB+i), pCaller); \
			if(FR_P == fr) ir = (*(This->ppo_AIB+i))->Output(*(This->ppo_AIB+i), OStrm, Cty, pQty, pCaller); \
			else if(FR_N_HASVR == fr) continue; \
			else ir = IR_N; \
			if(ir != IR_O_SBOOIX) return ir; \
		} \
		return ir; \
	}while(0)

/*
 *
 * 名称:_SBO_OBJECT_OUTPUT
 * 描述:宏,Output接口的_SBO_O_IX。
 */
#define  _SBO_OBJECT_OUTPUT \
	do{ \
		IRESULT  ir = IR_O__SBOOIX; \
		NUMIB    i; \
		for(i=0; i<This->NIB; i++) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
			if(FR_P == CallerCome(*(This->ppo_AIB+i), pCaller)) \
				ir = (*(This->ppo_AIB+i))->Output(*(This->ppo_AIB+i), OStrm, Cty, pQty, pCaller); \
		} \
		return ir; \
	}while(0)

/*
 *
 * 名称:OBS_OBJECT_IOPUT
 * 描述:宏,IOput接口的OBS_O_IX。
 */
#define  OBS_OBJECT_IOPUT \
	do{ \
		IRESULT  ir = IR_O_OBSOIX; \
		IRESULT  fr; \
		NUMIB    i; \
		for(i=0; i<This->NIB; i++) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
			fr = CallerCome(*(This->ppo_AIB+i), pCaller); \
			if(FR_P == fr) ir = (*(This->ppo_AIB+i))->IOput(*(This->ppo_AIB+i), IStrm, Qty, OStrm, Cty, pQty, pCaller); \
			else if(FR_N_HASVR == fr) continue; \
			else ir = IR_N; \
			if(ir != IR_O_OBSOIX) return ir; \
		} \
	}while(0)

/*
 *
 * 名称:OBS_OBJECT_IOPUT_
 * 描述:宏,IOput接口的OBS_O_IX_。
 */
#define  OBS_OBJECT_IOPUT_ \
	do{ \
		NUMIB    i; \
		for(i=0; i<This->NIB; i++) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
			if(FR_P == CallerCome(*(This->ppo_AIB+i), pCaller)) \
				(*(This->ppo_AIB+i))->IOput(*(This->ppo_AIB+i), IStrm, Qty, OStrm, Cty, pQty, pCaller); \
		} \
	}while(0)

/*
 *
 * 名称:SBO_OBJECT_IOPUT
 * 描述:宏,IOput接口的SBO_O_IX。
 */
#define  SBO_OBJECT_IOPUT \
	do{ \
		IRESULT  ir = IR_O_SBOOIX; \
		IRESULT  fr; \
		NUMIB    i; \
		for(i=0; i<This->NIB; i++) \
		{ \
			extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -