📄 oioic.h
字号:
* 名称: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 + -