OIOIC的.h文件源代码


/**
 *
 * 文 件 名:oioic.h
 *
 * 描    述:OIOIC 的 .h 文件。
 *
 * 创 建 者:赵平智   <[email protected]>
 *
 * 创建日期:20050310
 *
 * 版    本:1.0.10
 *
 * 版权(C)2005-2010 赵平智。保留所有权利。   
 *
 * 备    注:
 *
 *
 * * 维护历史 *
 *
 *   <日期>             <修改者>
 *   <修改内容...>
 *
 **/

#ifndef __OIOIC_H__
#define __OIOIC_H__
     
/* #define  NDEBUG */
#include <assert.h>


/*
*
* 名称:INLINE_VOFUNCTION
* 描述:内联VO函数的开关。0 - 不内联,1 - 内联,其它 - 保留不用。
* 备注:定义为1时,能否真正内联VO函数还取决于下面的“_INLINE_”宏定义是否有效。
*/
#define     INLINE_VOFUNCTION          0

/*
*
* 名称:_INLINE_
* 描述:宏定义内联指示符,因为编译器的内联指示符不统一。
* 备注:一定要定义为有效的内联指示符,否则即使编译通过,内联也是无效的,编译
*       器会自动把用其修饰的函数转为非内联编译。
*/
#define      _INLINE_  __inline
    

/*
*
* 描述:OS、HO、SO的mask。
* 备注:目前OID是用64个比特位表示的(见下面OBJID数据类型定义)。其
*       中,高16位是OS标识域,中32位是HO标识域,低16位是SO标识域。
*/
#define   MSKOS    0xFFFF000000000000L
#define   MSKHO    0x0000FFFFFFFF0000L
#define   MSKSO    0x000000000000FFFFL


/*
*
* 各OS的OID。
*/
#define  OID_OICOS            0x0001000000000000L     /* Oicos的OID。*/
#define  OID_UNIX             0x0002000000000000L     /* Unix的OID。*/
#define  OID_LINUX            0x0003000000000000L     /* Linux的OID。*/
#define  OID_WINDOWS          0x0004000000000000L     /* Windows的OID。*/


/*
*
* 名称:OID_OS
* 描述:OS的OID。
*/
#define  OID_OS            OID_WINDOWS


/*
*
* 一级数据类型定义
*/
typedef  char                      SI8; 
typedef  unsigned char             UI8; 
typedef  short                     SI16; 
typedef  unsigned short            UI16;
typedef  int                       SI32;
typedef  unsigned int              UI32;

#if OID_OS == OID_OICOS
#elif OID_OS == OID_UNIX
#elif OID_OS == OID_LINUX
typedef  long long                 SI64;
typedef  unsigned long long        UI64;
#elif OID_OS == OID_WINDOWS
typedef  __int64                   SI64;
typedef  unsigned __int64          UI64;
#else
#error the OID of OS is undefined.
#endif

typedef  float              SR32;
/* typedef  unsigned float            UR32;  */
typedef  double                    SR64;
/* typedef  unsigned double           UR64; */
typedef  void                      VOID;


/*
*
* 二级数据类型定义
*/
typedef  UI8      BYTE;    /* 位元组类型。*/
typedef  UI16     ACTION;  /* 行为类型。*/
typedef  UI32     BYTKTY;  /* by BYTe,c(K)apaciTY and q(K)uantiTY's type,以Byte为单位的容量和数量类型。*/
typedef  UI32     BITKTY;  /* by BIT,c(K)apaciTY and q(K)uantiTY's type,以Bit为单位的容量和数量类型。*/

typedef  UI16     MLDSN;  /* MSN类型。*/
typedef  UI64     OBJID;  /* OID类型。*/
typedef  UI32     REFCNT; /* object's REFerence CouNT type,对象的引用计数类型。*/
typedef  UI32     MODES;  /* 模式集类型。*/

typedef  UI16     NUMCS;  /* the NUMber of CS type,CS的数量类型。*/
typedef  UI16     NUMND;  /* the NUMber of ND type,ND的数量类型。*/
typedef  UI16     NUMIB;  /* the NUMber of IB type,IB的数量类型。*/
typedef  UI16     NUMBN;  /* the NUMber of BN type,BN的数量类型。*/

typedef  SI8      BOOL;  /* 布尔类型,规定此类型数据只能有两个值:TRUE 或 FALSE (见下面 TRUE 和 FALSE 的定义)。*/

typedef  SI32     IRESULT;  /* 对象接口执行结果的数据类型,必须是有符号类型。*/
typedef  SI32     FRESULT;  /* 函数执行结果的数据类型,必须是有符号类型。*/


/*
*
* Byte大小(比特位数)
*/
#define    BYTESIZE         8


/*
*
* 描述:MSN
* 备注:要求MSN从1开始顺序编号,定义模板如下,
*       #define   MSN_XXX1    (MSN_ + 0)  /-* xxx1的MSN。HO *-/
*       #define   MSN_XXX2    (MSN_ + 1)  /-* xxx2的MSN。AO *-/
*       #define   MSN_XXX3    (MSN_ + 2)  /-* xxx3的MSN。.. *-/
*       #define   MSN_XXX4    (MSN_ + 3)  /-* xxx4的MSN。GO *-/
*       #define   MSN_XXX5    (MSN_ + 4)  /-* xxx5的MSN。.. *-/
*       ...     ...     ...     ...     ...     ...  
*       #define   MSN_XXXn    (MSN_ + n-1)  /-* xxxn的MSN。... *-/
*/
#define    MSN_OIOIC         1       /* OIOIC的MSN。*/
#define    MSN_              (MSN_OIOIC + 1)   /* 其它MSN的起点。*/

/*
*
* 描述:通用模式定义。
* 备注:可定义 sizeof(MODES)*BYTESIZE 个通用模式。即如下,
*
*    #define   MOD_                     1
*    #define   MOD_XXX0             ( MOD_ << 0 )     /-* BIT0。1:xxx;0:xxx。*-/
*    #define   MOD_XXX1             ( MOD_ << 1 )     /-* BIT1。1:xxx;0:xxx。*-/
*    #define   MOD_XXX2             ( MOD_ << 2 )     /-* BIT2。1:xxx;0:xxx。*-/
*       ...     ...     ...     ...     ...     ...   
*    #define   MOD_XXXn            ( MOD_ << (sizeof(MODES)*BYTESIZE-1) )   /-* BITn。 1:xxx; 0:xxx。*-/
*/
#define   MOD_                  1
#define   MOD_SHARED            ( MOD_ << 0 )     /* BIT0。0:共享;1:非共享。*/
#define   MOD_BLOCKI            ( MOD_ << 1 )     /* BIT1。0:阻断输入;1:非阻断输入。只适用于Input和IOput接口。*/
#define   MOD_BLOCKO            ( MOD_ << 2 )     /* BIT2。0:阻断输出;1:非阻断输出。只适用于Output和IOput接口。*/


/*
*
* 描述:对象接口执行结果定义。
* 备注:=== 定义模板 ===
*
*       ...     ...     ...     ...     ...     ...   
*       ...     ...     ...     ...     ...     ...   
*       #define     IR_N_PVT_YYY_            (IR_N_PVT_XXX_ - x)  /-* X2的私有N结果起点。*-/
*       #define     IR_N_XXX            (IR_N_PVT_XXX_ - x + 1)
*       ...     ...     ...     ...     ...     ...
*       #define     IR_N_XXX            (IR_N_PVT_XXX_ -1)
*       #define     IR_N_XXX            (IR_N_PVT_XXX_ -0)
*       /-** X1对象模的私有N结果:^ **-/
*
*       #define     IR_N_PVT_XXX_            (IR_N_PVT_ - x)  /-* X1的私有N结果起点。*-/
*       #define     IR_N_XXX            (IR_N_PVT_ - x + 1)
*       ...     ...     ...     ...     ...     ... 
*       #define     IR_N_XXX            (IR_N_PVT_ -1)
*       #define     IR_N_XXX            (IR_N_PVT_ -0)
*       /-**
*       ** 非一个对象模专用的N结果:^
*       **-/
*
*       ...     ...     ...     ...     ...     ...   
*       ...     ...     ...     ...     ...     ...   
*       #define     IR_O_PVTN_YYY_           (IR_O_PVTN_XXX_ - x)  /-* X2的私有负O结果起点。*-/
*       #define     IR_O_XXX            (IR_O_PVTN_XXX_ - x + 1)
*       ...     ...     ...     ...     ...     ...
*       #define     IR_O_XXX            (IR_O_PVTN_XXX_ -1)
*       #define     IR_O_XXX            (IR_O_PVTN_XXX_ -0)
*       /-** X1对象模的私有负O结果:^ **-/
*
*       #define     IR_O_PVTN_XXX_           (IR_O_PVTN_ - x)  /-* X1的私有负O结果起点。*-/
*       #define     IR_O_XXX            (IR_O_PVTN_ - x + 1)
*       ...     ...     ...     ...     ...     ... 
*       #define     IR_O_XXX            (IR_O_PVTN_ -1)
*       #define     IR_O_XXX            (IR_O_PVTN_ -0)
*       /-**
*       ** 非一个对象模专用的负O结果:^
*       **
*       ** 非一个对象模专用的正O结果:
*       **-/
*       #define     IR_O_XXX           (IR_O_PVTP_ + 0) 
*       #define     IR_O_XXX           (IR_O_PVTP_ + 1) 
*       ...     ...     ...     ...     ...     ...    
*       #define     IR_O_XXX           (IR_O_PVTP_ + x - 1) 
*       #define     IR_O_PVTP_XXX_           (IR_O_PVTP_ + x)  /-* X1的私有正O结果起点。*-/
*
*       /-** X1对象模的私有正O结果:**-/
*       #define     IR_O_XXX           (IR_O_PVTP_XXX_ + 0) 
*       #define     IR_O_XXX           (IR_O_PVTP_XXX_ + 1) 
*       ...     ...     ...     ...     ...     ...   
*       #define     IR_O_XXX           (IR_O_PVTP_XXX_ + x - 1) 
*       #define     IR_O_PVTP_YYY_           (IR_O_PVTP_XXX_ + x)  /-* X2的私有正O结果起点。*-/
*       ...     ...     ...     ...     ...     ...   
*       ...     ...     ...     ...     ...     ...   
*
*       /-**
*       ** 非一个对象模专用的P结果:
*       **-/
*       #define     IR_P_XXX            (IR_P_PVT_ + 0) 
*       #define     IR_P_XXX            (IR_P_PVT_ + 1) 
*       ...     ...     ...     ...     ...     ...    
*       #define     IR_P_XXX            (IR_P_PVT_ + x - 1) 
*       #define     IR_P_PVT_XXX_            (IR_P_PVT_ + x)  /-* X1的私有P结果起点。*-/
*
*       /-** X1对象模的私有P结果:**-/
*       #define     IR_P_XXX            (IR_P_PVT_XXX_ + 0) 
*       #define     IR_P_XXX            (IR_P_PVT_XXX_ + 1) 
*       ...     ...     ...     ...     ...     ...   
*       #define     IR_P_XXX            (IR_P_PVT_XXX_ + x - 1) 
*       #define     IR_P_PVT_YYY_            (IR_P_PVT_XXX_ + x)  /-* X2的私有P结果起点。*-/
*       ...     ...     ...     ...     ...     ...   
*       ...     ...     ...     ...     ...     ...   
*
*/
#define     IR_N_PVT_           (IR_N_PRIVATE_ - 50)  /* <外部私有N结果的起点> */
#define     IR_N_UNSHARED       (FR_N_PRIVATE_ - 1)  /* Open,对象是非共享的。*/
#define     IR_N_FULL           (FR_N_PRIVATE_ - 0)  /* Open,对象引用计数已满,不能再打开。*/
/* >#define     IR_N_PRIVATE_    (IR_N - x)  /-* <内部私有N结果的起点> *-/ */

#define     IR_N_PRIVATE_    (IR_N - 10)  /* <内部私有N结果的起点> */
#define     IR_N_INVALIDARG         (IR_N -1) /* 无效参数 */
#define     IR_N        __FR_ON__  /* N结果(否定性结果)的起点。*/
#define     __IR_ON__       (IR_O_PVTN_ - 1000)  /* O结果域的N界。*/

#define     IR_O_PVTN_  (IR_O - 10)  /* <外部私有负O结果起点> */

#define     IR_O_NOPEN  (IR_O - 2)  /* Close,对象还没有被打开。*/
#define     IR_O_VAINLY     (IR_O - 1)  /* 空操作 */
#define     IR_O   0    /* O结果(中立性结果)域的中点。*/
#define     IR_O_OBSOIX      (IR_O + 1)  /* OBS顺序非接力访问模式专用执行结果。*/
#define     IR_O_SBOOIX      (IR_O + 2)  /* SBO顺序非接力访问模式专用执行结果。*/
#define     IR_O__SBOOIX     (IR_O + 3)  /* SBO顺序接力访问模式专用执行结果。*/

#define     IR_O_PVTP_  (IR_O + 10)  /* <外部私有正O结果起点> */

#define     __IR_OP__       (IR_O_PVTP_ + 1000)  /* O结果域的P界。*/
#define     IR_P         __FR_OP__  /* P结果(肯定性结果)的起点。*/
#define     IR_P_PRIVATE_     (IR_P + 10) /* <内部私有P结果的起点> */

/* >#define     IR_P_PRIVATE_    (IR_P + x)  /-* <内部私有P结果的起点> *-/ */
#define     IR_P_RCZERO       (IR_P_PRIVATE_ + 0) /* Close,对象引用计数变为0。*/
#define     IR_P_RCONE        (IR_P_PRIVATE_ + 1) /* Open,对象引用计数为1。*/
#define     IR_P_PVT_         (IR_P_PRIVATE_ + 50) /* <外部私有P结果的起点> */

/*
*
* 描述:对象接口执行结果否定性/中立性/肯定性检测定义。
* 备注:NIR --- Negative IRESULT;
*       OIR --- O  IRESULT;
*       PIR --- Positive IRESULT。
*/
#define     NIR(Result)      ( (IRESULT)(Result) <= __IR_ON__ ) 
#define     OIR(Result)      ( ((IRESULT)(Result) > __IR_ON__) && ((IRESULT)(Result) < __IR_OP__) )
#define     PIR(Result)      ( (IRESULT)(Result) >= __IR_OP__ )  


/*
*
* 描述:对象交互行为分类定义。
* 备注:1. 按是否须要输入Byte流和有没有输出Byte流,可将交互行为分为四种:
*          AC0 - 不需输入Byte流也没有输出Byte流;
*          AC1 - 不需要输入Byte流但有输出Byte流;
*          AC2 - 需要输入Byte流但没有输出Byte流;
*          AC3 - 即需要输入Byte流也有输出Byte流。
*
*       2. TSI和TSO
*          TSI - the Type of Stream Inputted,输入流类型。
*          TSO - the Type of Stream Outputted,输出流类型。
*/
#define     AC0        0 
#define     AC1        (1 << (sizeof(ACTION)*BYTESIZE - 2))  
#define     AC2        (2 << (sizeof(ACTION)*BYTESIZE - 2))  
#define     AC3        (3 << (sizeof(ACTION)*BYTESIZE - 2)) 

/* 判断交互行为种类的mask */
#define     MSKAC      (3 << (sizeof(ACTION)*BYTESIZE - 2))

/*
*
* 描述:对象交互行为定义。
* 备注:=== 定义模板 ===
*   
*       /-** 非一个对象模专用的AC0交互行为:**-/
*       #define     XXX_YYYYY         (AC0 | (AC0_PVT_  + 0)) 
*       #define     XXX_YYYYY         (AC0 | (AC0_PVT_  + 1)) 
*       ...     ...     ...     ...     ...     ...  
*       #define     XXX_YYYYY         (AC0 | (AC0_PVT_  + x - 1)) 
*     #define     AC1_PVT_          (AC0_PVT_ + x)  /-* 非一个对象模专用的AC1交互行为起点。*-/
*
*       /-** 非一个对象模专用的AC1交互行为:**-/
*       #define     XXX_YYYYY         (AC1 | (AC1_PVT_  + 0)) 
*       #define     XXX_YYYYY         (AC1 | (AC1_PVT_  + 1)) 
*       ...     ...     ...     ...     ...     ...  
*       #define     XXX_YYYYY         (AC1 | (AC1_PVT_  + x - 1)) 
*     #define     AC2_PVT_          (AC1_PVT_ + x)  /-* 非一个对象模专用的AC2交互行为起点。*-/
*
*       /-** 非一个对象模专用的AC2交互行为:**-/
*       #define     XXX_YYYYY         (AC2 | (AC2_PVT_  + 0)) 
*       #define     XXX_YYYYY         (AC2 | (AC2_PVT_  + 1)) 
*       ...     ...     ...     ...     ...     ...  
*       #define     XXX_YYYYY         (AC2 | (AC2_PVT_  + x - 1)) 
*     #define     AC3_PVT_          (AC2_PVT_ + x)  /-* 非一个对象模专用的AC3交互行为起点。*-/
*
*       /-** 非一个对象模专用的AC3交互行为:**-/
*       #define     XXX_YYYYY         (AC3 | (AC3_PVT_  + 0)) 
*       #define     XXX_YYYYY         (AC3 | (AC3_PVT_  + 1)) 
*       ...     ...     ...     ...     ...     ...  
*       #define     XXX_YYYYY         (AC3 | (AC3_PVT_  + x - 1)) 
*     #define     AC0_PVT_XXX_      (AC3_PVT_ + x)  /-* X1的私有AC0交互行为起点。*-/
*
*
*       /-** X1对象模的私有AC0交互行为:**-/
*       #define     XXX_YYYYY         (AC0 | (AC0_PVT_XXX_  + 0)) 
*       #define     XXX_YYYYY         (AC0 | (AC0_PVT_XXX_  + 1)) 
*       ...     ...     ...     ...     ...     ...  
*       #define     XXX_YYYYY         (AC0 | (AC0_PVT_XXX_  + x - 1)) 
*     #define     AC1_PVT_XXX_      (AC0_PVT_XXX_ + x)  /-* X1的私有AC1交互行为起点。*-/
*
*       /-** X1对象模的私有AC1交互行为:**-/
*       #define     XXX_YYYYY         (AC1 | (AC1_PVT_XXX_  + 0)) 
*       #define     XXX_YYYYY         (AC1 | (AC1_PVT_XXX_  + 1)) 
*       ...     ...     ...     ...     ...     ...  
*       #define     XXX_YYYYY         (AC1 | (AC1_PVT_XXX_  + x - 1)) 
*     #define     AC2_PVT_XXX_      (AC1_PVT_XXX_ + x)  /-* X1的私有AC2交互行为起点。*-/
*
*       /-** X1对象模的私有AC2交互行为:**-/
*       #define     XXX_YYYYY         (AC2 | (AC2_PVT_XXX_  + 0)) 
*       #define     XXX_YYYYY         (AC2 | (AC2_PVT_XXX_  + 1)) 
*       ...     ...     ...     ...     ...     ...  
*       #define     XXX_YYYYY         (AC2 | (AC2_PVT_XXX_  + x - 1)) 
*     #define     AC3_PVT_XXX_      (AC2_PVT_XXX_ + x)  /-* X1的私有AC3交互行为起点。*-/
*
*       /-** X1对象模的私有AC3交互行为:**-/
*       #define     XXX_YYYYY         (AC3 | (AC3_PVT_XXX_  + 0)) 
*       #define     XXX_YYYYY         (AC3 | (AC3_PVT_XXX_  + 1)) 
*       ...     ...     ...     ...     ...     ...  
*       #define     XXX_YYYYY         (AC3 | (AC3_PVT_XXX_  + x - 1)) 
*     #define     AC0_PVT_YYY_      (AC3_PVT_XXX_ + x)  /-* X2的私有AC0交互行为起点。*-/
*
*
*       /-** X2对象模的私有AC0交互行为:**-/
*       ...     ...     ...     ...     ...     ... 
*
*       ...     ...     ...     ...     ...     ...
*              
*/
#define    AC0_                0

/** AC0交互行为:**/
#define    ASK_SHARED         (AC0 | (AC0_  + 0))   /* 问对象共享么。*/
#define    SET_SHARED         (AC0 | (AC0_  + 1))   /* 设置对象共享。*/
#define    SET_UNSHARED       (AC0 | (AC0_  + 2))   /* 设置对象非共享。*/
#define    SET_BLOCKI         (AC0 | (AC0_  + 3))   /* 设置对象阻断输入。*/
#define    SET_UNBLOCKI       (AC0 | (AC0_  + 4))   /* 设置对象非阻断输入。*/
#define    SET_BLOCKO         (AC0 | (AC0_  + 5))   /* 设置对象阻断输出。*/
#define    SET_UNBLOCKO       (AC0 | (AC0_  + 6))   /* 设置对象非阻断输出。*/
#define    CMD_RESET          (AC0 | (AC0_  + 7))   /* 重置。*/
#define    CMD_PREPARE        (AC0 | (AC0_  + 8))   /* 准备。*/
#define    AC1_               (AC0_ + 9)  /* AC1交互行为起点。*/

/** AC1交互行为:**/
#define    GET_IQCTY          (AC1 | (AC1_  + 0))   /* 获取IQ容量。*/
#define    GET_OQCTY          (AC1 | (AC1_  + 1))   /* 获取OQ容量。*/
#define    AC2_               (AC1_ + 2)  /* AC2交互行为起点。*/

/** AC2交互行为:**/
#define    SET_IQCTY          (AC2 | (AC2_  + 0))   /* 设置IQ容量。*/
#define    SET_OQCTY          (AC2 | (AC2_  + 1))   /* 设置OQ容量。*/
#define    CMD_INITIALIZE     (AC2 | (AC2_  + 2))   /* 初始化 */
#define    AC3_               (AC2_ + 3)  /* AC3交互行为起点。*/

/** AC3交互行为:**/
/* ...     ...     ...     ...     ...     ... */
#define    AC0_PVT_           (AC3_  + 0)    /* <外部私有AC0交互行为起点> */


/*
*
* 描述:函数执行结果定义,建议功能复杂或多返回值的函数使用。
* 备注:=== 定义模板 ===
*
*       ...     ...     ...     ...     ...     ...   
*       ...     ...     ...     ...     ...     ...   
*       #define     FR_N_PVT_YYY_            (FR_N_PVT_XXX_ - x)  /-* X2的私有N结果起点。*-/
*       #define     FR_N_XXX            (FR_N_PVT_XXX_ - x + 1)
*       ...     ...     ...     ...     ...     ...
*       #define     FR_N_XXX            (FR_N_PVT_XXX_ -1)
*       #define     FR_N_XXX            (FR_N_PVT_XXX_ -0)
*       /-** X1函数的私有N结果:^ **-/
*
*       #define     FR_N_PVT_XXX_            (FR_N_PVT_ - x)  /-* X1的私有N结果起点。*-/
*       #define     FR_N_XXX            (FR_N_PVT_ - x + 1)
*       ...     ...     ...     ...     ...     ... 
*       #define     FR_N_XXX            (FR_N_PVT_ -1)
*       #define     FR_N_XXX            (FR_N_PVT_ -0)
*       /-**
*       ** 非一个函数专用的N结果:^
*       **-/
*
*       ...     ...     ...     ...     ...     ...   
*       ...     ...     ...     ...     ...     ...   
*       #define     FR_O_PVTN_YYY_           (FR_O_PVTN_XXX_ - x)  /-* X2的私有负O结果起点。*-/
*       #define     FR_O_XXX            (FR_O_PVTN_XXX_ - x + 1)
*       ...     ...     ...     ...     ...     ...
*       #define     FR_O_XXX            (FR_O_PVTN_XXX_ -1)
*       #define     FR_O_XXX            (FR_O_PVTN_XXX_ -0)
*       /-** X1函数的私有负O结果:^ **-/
*
*       #define     FR_O_PVTN_XXX_           (FR_O_PVTN_ - x)  /-* X1的私有负O结果起点。*-/
*       #define     FR_O_XXX            (FR_O_PVTN_ - x + 1)
*       ...     ...     ...     ...     ...     ... 
*       #define     FR_O_XXX            (FR_O_PVTN_ -1)
*       #define     FR_O_XXX            (FR_O_PVTN_ -0)
*       /-**
*       ** 非一个函数专用的负O结果:^
*       **
*       ** 非一个函数专用的正O结果:
*       **-/
*       #define     FR_O_XXX            (FR_O_PVTP_ + 0) 
*       #define     FR_O_XXX            (FR_O_PVTP_ + 1) 
*       ...     ...     ...     ...     ...     ...    
*       #define     FR_O_XXX            (FR_O_PVTP_ + x - 1) 
*       #define     FR_O_PVTP_XXX_           (FR_O_PVTP_ + x)  /-* X1的私有正O结果起点。*-/
*
*       /-** X1函数的私有正O结果:**-/
*       #define     FR_O_XXX            (FR_O_PVTP_XXX_ + 0) 
*       #define     FR_O_XXX            (FR_O_PVTP_XXX_ + 1) 
*       ...     ...     ...     ...     ...     ...   
*       #define     FR_O_XXX            (FR_O_PVTP_XXX_ + x - 1) 
*       #define     FR_O_PVTP_YYY_           (FR_O_PVTP_XXX_ + x)  /-* X2的私有正O结果起点。*-/
*       ...     ...     ...     ...     ...     ...   
*       ...     ...     ...     ...     ...     ... 

*       /-**
*       ** 非一个函数专用的P结果:
*       **-/
*       #define     FR_P_XXX            (FR_P_PVT_ + 0) 
*       #define     FR_P_XXX            (FR_P_PVT_ + 1) 
*       ...     ...     ...     ...     ...     ...    
*       #define     FR_P_XXX            (FR_P_PVT_ + x - 1) 
*       #define     FR_P_PVT_XXX_            (FR_P_PVT_ + x)  /-* X1的私有P结果起点。*-/
*
*       /-** X1函数的私有P结果:**-/
*       #define     FR_P_XXX            (FR_P_PVT_XXX_ + 0) 
*       #define     FR_P_XXX            (FR_P_PVT_XXX_ + 1) 
*       ...     ...     ...     ...     ...     ...   
*       #define     FR_P_XXX            (FR_P_PVT_XXX_ + x - 1) 
*       #define     FR_P_PVT_YYY_            (FR_P_PVT_XXX_ + x)  /-* X2的私有P结果起点。*-/
*       ...     ...     ...     ...     ...     ...   
*       ...     ...     ...     ...     ...     ...   

*/
#define     FR_N_PVT_            (FR_N_PRIVATE_ - 50)  /* <外部私有N结果的起点> */
#define     FR_N_LACKOID         (FR_N_PRIVATE_ - 2)  /* __CreateObject__,没有足够的OID供分配。*/
#define     FR_N_HASVR           (FR_N_PRIVATE_ - 1)  /* CallerCome,已经有这个VR了。*/
#define     FR_N_LOST            (FR_N_PRIVATE_ - 0)  /* Enqueue/Dequeue,已丢失了Byte。*/
/* >#define     FR_N_PRIVATE_        (FR_N - x)  /-* <内部私有N结果的起点> *-/ */

#define     FR_N_PRIVATE_        (FR_N - 10)  /* <内部私有N结果的起点> */
#define     FR_N_INVALIDARG      (FR_N -1) /* 无效参数。*/
#define     FR_N        __FR_ON__  /* N结果(否定性结果)的起点。*/
#define     __FR_ON__       (FR_O_PVTN_ - 1000)  /* O结果域的N界。*/

#define     FR_O_PVTN_  (FR_O - 10)  /* <外部私有负O结果的起点> */

#define     FR_O_VAINLY   (FR_O - 1)  /* 空操作 */
#define     FR_O    0   /* O结果(中立性结果)域的中点。*/

#define     FR_O_PVTP_  (FR_O + 10)  /* <外部私有正O结果的起点> */

#define     __FR_OP__       (FR_O_PVTP_ + 1000)  /* O结果域的P界。*/
#define     FR_P         __FR_OP__   /* P结果(肯定性结果)的起点。*/
#define     FR_P_PRIVATE_        (FR_P + 10)  /* <内部私有P结果的起点> */

/* >#define     FR_P_PRIVATE_        (FR_P + x)  /-* <内部私有P结果的起点> *-/ */
#define     FR_P_PVT_            (FR_P_PRIVATE_ + 0)  /* <外部私有P结果的起点> */

/*
*
* 描述:函数执行结果否定性/中立性/肯定性检测定义。
* 备注:NFR --- Negative FRESULT;
*      OFR --- O  FRESULT;
*      PFR --- Positive FRESULT。
*/
#define     NFR(Result)      ( (FRESULT)(Result) <= __FR_ON__ )
#define     OFR(Result)      ( ((FRESULT)(Result) > __FR_ON__) && ((FRESULT)(Result) < __FR_OP__) )
#define     PFR(Result)      ( (FRESULT)(Result) >= __FR_OP__ )

/*
*
* 定义布尔值和空指针值。
*/
#undef TRUE
#undef FALSE
#undef NULL

#define TRUE          1      /* 布尔类型数据值:真 */
#define FALSE         0      /* 布尔类型数据值:假 */
#define NULL          0      /* 指针类型数据值:空 */


/*======================+  OIOIC  +======================*/

/*
*
* 描述:队列结构体
* 备注:q_,pq_。
*/
typedef struct TAG_QUEUE
{
   BYTE*    Dtrm; /* Data Room,数据空间。*/
   BYTKTY   Cty;  /* Dtrm的容量。*/
   BYTE*    Front;  /* 当前第一个Byte数据的地址。*/
   BYTE*    Rear;  /* 当前最后一个Byte数据的地址。*/
   BYTKTY   Qty;  /* 当前Dtrm内存有的Byte数量。*/
   BYTKTY   Lost;  /* 因Dtrm已满而丢弃的Byte数量。*/
}QUEUE;


/*
*
* 描述:VR结构体。
* 备注:vr_,pvr_。
*/
typedef struct TAG_VR
{
 OBJID    cr;  /* CR的ID。*/
 OBJID    mr;  /* MR的ID。*/
}VR;  

/*
*
* 描述:定义 EM 数据类型。
* 备注:1. em_,pem_;
*       2. 对象的实际扩展成员必须放在如下格式的EM结构体里,
*   typedef struct TAG_EM_XXX
*   {
*    ...
*   }EM_XXX;
*/
typedef    VOID     EM;  /* 定义EM数据类型。*/


/*
*
* 描述:OIOIC对象模型结构体。
* 备注:“OIOIC”是5个通用接口(Open,Input,Output,Interact,Close)的第一个字符的合写。
*/
typedef struct TAG_OBJECT
{  
   /* RefCnt,对象引用计数(Reference Count)。*/
   REFCNT     RefCnt;

   /* MSN,模的SN。*/ 
   MLDSN      MSN;
  
   /* OID,对象的ID。*/ 
   OBJID      OID;
  
   /* 为了... 需要下面两个成员:
   * po_AND:指向AND。
   * NND:the Number of ND of IC,IC的ND数量,也就是AND的元素数量。*/
   struct TAG_OBJECT*   po_AND;
   NUMND      NND;
  
   /* 为能高效率访问IBN,需要下面两个成员:
   * ppo_AIB:指向AIB数组。
   * NIB:the Number of IB,IB数量,即AIB的元素数量。*/
   struct TAG_OBJECT**  ppo_AIB;
   NUMIB      NIB;
  
   /* 为了能访问BN的EM和高效率地清除来访记录,需要下面两个成员:
   * ppo_ABN:指向ABN数组。
   * NBN:the Number of BN,BN数量,即ABN的元素数量。*/
   struct TAG_OBJECT**  ppo_ABN;
   NUMBN   NBN;
  
   /* 不可重入(Not Reentrant)访问规则,即同一MR的同一CR对每个BN只能访问一次。
   * 为遵守不可重入访问规则,需要下面两个成员:
   * pvr_ACS:指向ACS。
   * NCS:the Number of CS,CS的数量,即ACS的元素数量。*/
   VR*        pvr_ACS;
   NUMCS      NCS;   
  
   /** 对象接口:Open,Input,Output,IOput,Interact0~3,Close。**/
  
   /* 名称:Open
   *  描述:打开。
   *  参数:pCaller --- [IN] 来访者。*/
   IRESULT  (*Open) (struct TAG_OBJECT* This, const VR* pCaller);
   /* 名称:Input
   *  描述:输入。
   *  参数:IStrm --- [IN] 输入流;
   *        Qty --- [IN] 输入的Byte数量;
   *        pCaller --- [IN] 来访者。*/
   IRESULT  (*Input) (struct TAG_OBJECT* This, BYTE* IStrm, BYTKTY Qty, const VR* pCaller);
   /* 名称:Output
   *  描述:输出。
   *  参数:OStrm --- [OUT] 输出流的流向;
   *        Cty --- [IN] OStrm所指存储空间的容量;
   *        pQty --- [OUT] 指向实际输出的Byte数量;
   *        pCaller --- [IN] 来访者。*/
   IRESULT  (*Output) (struct TAG_OBJECT* This, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller);
   /* 名称:IOput
   *  描述:输入输出。
   *  参数:IStrm --- [IN] 输入流;
   *        Qty --- [IN] 输入的Byte数量;
   *        OStrm --- [OUT] 输出流的流向;
   *        Cty --- [IN] OStrm所指存储空间的容量;
   *        pQty --- [OUT] 指向实际输出的Byte数量;
   *        pCaller --- [IN] 来访者。*/
   IRESULT  (*IOput) (struct TAG_OBJECT* This, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller);
   /* 名称:Interact0
   *  描述:交互,接收AC0类型的行为。
   *  参数:Act --- [IN] 交互行为;
   *        pCaller --- [IN] 来访者。*/
   IRESULT  (*Interact0) (struct TAG_OBJECT* This, ACTION Act, const VR* pCaller);
   /* 名称:Interact1
   *  描述:交互,接收AC1类型的行为。
   *  参数:Act --- [IN] 交互行为;
   *        OStrm --- [OUT] 输出流的流向;
   *        Cty --- [IN] OStrm所指存储空间的容量;
   *        pQty --- [OUT] 指向实际输出的Byte数量;
   *        pCaller --- [IN] 来访者。*/
   IRESULT  (*Interact1) (struct TAG_OBJECT* This, ACTION Act, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller);
   /* 名称:Interact2
   *  描述:交互,接收AC2类型的行为。
   *  参数:Act --- [IN] 交互行为;
   *        IStrm --- [IN] 输入流;
   *        Qty --- [IN] 输入的Byte数量;
   *        pCaller --- [IN] 来访者。*/
   IRESULT  (*Interact2) (struct TAG_OBJECT* This, ACTION  Act, BYTE* IStrm, BYTKTY Qty, const VR* pCaller);
   /* 名称:Interact3
   *  描述:交互,接收AC3类型的行为。
   *  参数:Act --- [IN] 交互行为;
   *        IStrm --- [IN] 输入流;
   *        Qty --- [IN] 输入的Byte数量;
   *        OStrm --- [OUT] 输出流的流向;
   *        Cty --- [IN] OStrm所指存储空间的容量;
   *        pQty --- [OUT] 指向实际输出的Byte数量;
   *        pCaller --- [IN] 来访者。*/
   IRESULT  (*Interact3) (struct TAG_OBJECT* This, ACTION Act, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller);
   /* 名称:Close
   *  描述:关闭。
   *  参数:pCaller --- [IN] 来访者。*/
   IRESULT  (*Close) (struct TAG_OBJECT* This, const VR* pCaller);
  
   /* pEM,指向对象的EM(扩展成员)。*/
   EM*   pEM;  
}OBJECT;

/*=====================+ OIOIC的EM +=====================*/

typedef struct TAG_EM_OIOIC
{
 QUEUE    IQ; /* 输入队列。*/ 
 QUEUE    OQ;  /* 输出队列。*/ 
 MODES      mds; /* 模式集。*/
}EM_OIOIC;

/*=============+  宏封装单个Byte入列和出列  +============*/

/* 单个Byte入列有两种模式:
*  1. PLACE --- 放入模式,向有空闲空间的队列放入一个Byte;
*  2. PUSH --- 推入模式,向已满(没有空闲空间)的队列推入一个Byte,把第一个Byte挤出扔掉。*/

/*
*
* 名称:ENQ_PLACE_BYTE
* 描述:宏,向有空闲空间的队列放入一个Byte。
* 参数:pQ --- [IN] QUEUE类型指针,指向队列,这个队列必须是有空闲空间的;
*       byte --- [IN] 入列的Byte。
* 备注:只有在队列有空闲空间时才能使用。如下,
*
*   if(pQ->Qty < pQ->Cty)
*   {
*     ENQ_PLACE_BYTE(pQ, byte);
*   }else
*   {
*    pQ->Lost++;
*
*    /-* ... *-/
*   }
*/
#define  ENQ_PLACE_BYTE(pQ, byte) \
 do{ \
  if((pQ)->Rear == (pQ)->Dtrm + (pQ)->Cty - 1) \
   (pQ)->Rear = (pQ)->Dtrm; \
  else \
   (pQ)->Rear++; \
  *((pQ)->Rear) = (byte); \
  (pQ)->Qty++; \
  if((pQ)->Dtrm-1 == (pQ)->Front) \
   (pQ)->Front = (pQ)->Dtrm; \
 }while(0)

/*
*
* 名称:ENQ_PUSH_BYTE
* 描述:宏,向已满(没有空闲空间)的队列推入一个Byte,把第一个Byte挤出扔掉。
* 参数:pQ --- [IN] QUEUE类型指针,指向队列;
*       byte --- [IN] 入列的Byte。
* 备注:只有在队列已满时才能使用。如下,
*
*     if(pQ->Qty < pQ->Cty)
*   {
*   ENQ_PLACE_BYTE(pQ, byte);
*   }else
*   {
*    ENQ_PUSH_BYTE(pQ, byte);
*    pQ->Lost++;
*
*   /-* ... *-/
*   }
*/
#define  ENQ_PUSH_BYTE(pQ, byte) \
 do{ \
  (pQ)->Rear = (pQ)->Front; \
  *((pQ)->Rear) = (byte); \
  if( (pQ)->Front == ((pQ)->Dtrm + (pQ)->Cty -1) ) \
   (pQ)->Front = (pQ)->Dtrm; \
  else \
   (pQ)->Front++; \
 }while(0)

/*
*
* 名称:DEQ_BYTE
* 描述:宏,从非空的队列出列一个Byte。
* 参数:pQ --- [IN] QUEUE类型指针,指向队列;
*       pByte --- [OUT] Byte地址,输出出列的Byte。
* 备注:只有在队列非空时才能使用。如下,
*
*     if(pQ->Qty > 0)
*   {
*   DEQ_BYTE(pQ, pByte);
*   }
*/
#define  DEQ_BYTE(pQ, pByte) \
 do{ \
  *(pByte) = *((pQ)->Front); \
  (pQ)->Qty--; \
  if(0 == (pQ)->Qty) \
   (pQ)->Front = (pQ)->Rear = (pQ)->Dtrm -1; \
  else if( (pQ)->Front == ((pQ)->Dtrm + (pQ)->Cty -1) ) \
   (pQ)->Front = (pQ)->Dtrm; \
  else \
   (pQ)->Front++; \
 }while(0)


/*===================+  内联VO函数  +====================*/

/* 注意:内联VO函数和非内联VO函数的功能是完全相同的。*/


#if INLINE_VOFUNCTION == 1

/**
*
* 名称:VO_Open
* 描述:接口Open的VO函数。
* 参数:pObject --- [IN] 指向对象;
*       pCaller --- [IN] 来访者。
*/                 
static  _INLINE_  IRESULT  VO_Open(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;

 assert( pObject != NULL );
 assert( pCaller->cr != 0 );
 assert( pCaller->mr != 0 );
 
 if( FR_P == CallerCome(pObject, pCaller) )
 {
  ir = pObject->Open(pObject, pCaller);
  CallerLeave(pObject, pCaller);
 }else { ir = IR_N; }
 
 return ir;
}
      
/**
*
* 名称:VO_Input
* 描述:接口Input的VO函数。
* 参数:pObject --- [IN] 指向对象;
*      IStrm --- [IN] 输入流;
*      Qty --- [IN] 输入的Byte数量;
*      pCaller --- [IN] 来访者。
*/         
static  _INLINE_  IRESULT  VO_Input(OBJECT* pObject, 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;

 assert( pObject != NULL );
 assert( IStrm != NULL );
 assert( Qty > 0 );
 assert( pCaller->cr != 0 );
 assert( pCaller->mr !=0 );

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

/**
*
* 名称:VO_Output
* 描述:接口Output的VO函数。
* 参数:pObject --- [IN] 指向对象;
*      OStrm --- [OUT] 输出流的流向;
*      Cty --- [IN] OStrm所指存储空间的容量;
*      pQty --- [OUT] 指向实际输出的Byte数量;
*      pCaller --- [IN] 来访者。
*/     
static  _INLINE_  IRESULT  VO_Output(OBJECT* pObject, 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;

 assert( pObject != NULL );
 assert( OStrm != NULL );
 assert( Cty > 0 );
 assert( pQty != NULL );
 assert( pCaller->cr != 0 );
 assert( pCaller->mr != 0 );

 *pQty = 0;

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

/**
*
* 名称:VO_IOput
* 描述:接口IOput的VO函数。
*  参数:pObject --- [IN] 指向对象;
*        IStrm --- [IN] 输入流;
*        Qty --- [IN] 输入的Byte数量;
*        OStrm --- [OUT] 输出流的流向;
*        Cty --- [IN] OStrm所指存储空间的容量;
*        pQty --- [OUT] 指向实际输出的Byte数量;
*        pCaller --- [IN] 来访者。
*/ 
static  _INLINE_  IRESULT  VO_IOput(OBJECT* pObject, 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;

 assert( pObject != NULL );
 assert( IStrm != NULL );
 assert( Qty > 0 );
 assert( OStrm != NULL );
 assert( Cty > 0 );
 assert( pQty != NULL );
 assert( pCaller->cr != 0 );
 assert( pCaller->mr != 0 );
 
 *pQty = 0;

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

/**
*
* 名称: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;

 assert( pObject != NULL );
 assert( (MSKAC & Act) == AC0 );
 assert( pCaller->cr != 0 );
 assert( pCaller->mr != 0 );
 
 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;

 assert( pObject != NULL );
 assert( (MSKAC & Act) == AC1 );
 assert( OStrm != NULL );
 assert( Cty > 0 );
 assert( pQty != NULL );
 assert( pCaller->cr != 0 );
 assert( pCaller->mr != 0 );

 *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;
 
 assert( pObject != NULL );
 assert( (MSKAC & Act) == AC2 );
 assert( IStrm != NULL );
 assert( Qty > 0 );
 assert( pCaller->cr != 0 );
 assert( pCaller->mr != 0 );

 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;

 assert( pObject != NULL );
 assert( (MSKAC & Act) == AC3 );
 assert( IStrm != NULL );
 assert( Qty > 0 );
 assert( OStrm != NULL );
 assert( Cty > 0 );
 assert( pQty != NULL );
 assert( pCaller->cr != 0 );
 assert( pCaller->mr != 0 );

 *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;
 
 assert( pObject != NULL );
 assert( pCaller->cr != 0 );
 assert( pCaller->mr != 0 );

 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 Visiting,访问上一个节点后,不管是什么执行结果接
*         着访问下一节点。OBS返回LND的执行结果;SBO的返回结果分两种情况,
*         单重继承链返回FND的执行结果,多重继承链返回IR_O__SBOOIX。
*    (2)相反就是非接力访问,Non-Relay Visiting,访问上一个节点后,如果不
*         是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) \
  { \
   This->RefCnt--; \
   return  IR_N_FULL; \
  } \
  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); \
   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_SBOOIX) return ir; \
  } \
  return ir; \
 }while(0)

/*
*
* 名称:_SBO_OBJECT_IOPUT
* 描述:宏,IOput接口的_SBO_O_IX。
*/
#define  _SBO_OBJECT_IOPUT \
 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))->IOput(*(This->ppo_AIB+i), IStrm, Qty, OStrm, Cty, pQty, pCaller); \
  } \
  return ir; \
 }while(0)
 
/*
*
* 名称:OBS_OBJECT_INTERACT0
* 描述:宏,Interact0接口的OBS_O_IX。
*/
#define  OBS_OBJECT_INTERACT0 \
 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))->Interact0(*(This->ppo_AIB+i), Act, pCaller); \
   else if(FR_N_HASVR == fr) continue; \
   else ir = IR_N; \
   if(ir != IR_O_OBSOIX) return ir; \
  } \
 }while(0)

/*
*
* 名称:OBS_OBJECT_INTERACT0_
* 描述:宏,Interact0接口的OBS_O_IX_。
*/
#define  OBS_OBJECT_INTERACT0_ \
 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))->Interact0(*(This->ppo_AIB+i), Act, pCaller); \
  } \
 }while(0)

/*
*
* 名称:SBO_OBJECT_INTERACT0
* 描述:宏,Interact0接口的SBO_O_IX。
*/
#define  SBO_OBJECT_INTERACT0 \
 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))->Interact0(*(This->ppo_AIB+i), Act, 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_INTERACT0
* 描述:宏,Interact0接口的_SBO_O_IX。
*/
#define  _SBO_OBJECT_INTERACT0 \
 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)) \
    (*(This->ppo_AIB+i))->Interact0(*(This->ppo_AIB+i), Act, pCaller); \
  } \
  return ir; \
 }while(0)

/*
*
* 名称:OBS_OBJECT_INTERACT1
* 描述:宏,Interact1接口的OBS_O_IX。
*/
#define  OBS_OBJECT_INTERACT1 \
 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))->Interact1(*(This->ppo_AIB+i), Act, 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_INTERACT1_
* 描述:宏,Interact1接口的OBS_O_IX_。
*/
#define  OBS_OBJECT_INTERACT1_ \
 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))->Interact1(*(This->ppo_AIB+i), Act, OStrm, Cty, pQty, pCaller); \
  } \
 }while(0)

/*
*
* 名称:SBO_OBJECT_INTERACT1
* 描述:宏,Interact1接口的SBO_O_IX。
*/
#define  SBO_OBJECT_INTERACT1 \
 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))->Interact1(*(This->ppo_AIB+i), Act, 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_INTERACT1
* 描述:宏,Interact1接口的_SBO_O_IX。
*/
#define  _SBO_OBJECT_INTERACT1 \
 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))->Interact1(*(This->ppo_AIB+i), Act, OStrm, Cty, pQty, pCaller); \
  } \
  return ir; \
 }while(0)
 
/*
*
* 名称:OBS_OBJECT_INTERACT2
* 描述:宏,Interact2接口的OBS_O_IX。
*/
#define  OBS_OBJECT_INTERACT2 \
 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))->Interact2(*(This->ppo_AIB+i), Act, 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_INTERACT2_
* 描述:宏,Interact2接口的OBS_O_IX_。
*/
#define  OBS_OBJECT_INTERACT2_ \
 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))->Interact2(*(This->ppo_AIB+i), Act, IStrm, Qty, pCaller); \
  } \
 }while(0)

/*
*
* 名称:SBO_OBJECT_INTERACT2
* 描述:宏,Interact2接口的SBO_O_IX。
*/
#define  SBO_OBJECT_INTERACT2 \
 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))->Interact2(*(This->ppo_AIB+i), Act, 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_INTERACT2
* 描述:宏,Interact2接口的_SBO_O_IX。
*/
#define  _SBO_OBJECT_INTERACT2 \
 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))->Interact2(*(This->ppo_AIB+i), Act, IStrm, Qty, pCaller); \
  } \
  return ir; \
 }while(0)
 
/*
*
* 名称:OBS_OBJECT_INTERACT3
* 描述:宏,Interact3接口的OBS_O_IX。
*/
#define  OBS_OBJECT_INTERACT3 \
 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))->Interact3(*(This->ppo_AIB+i), Act, 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_INTERACT3_
* 描述:宏,Interact3接口的OBS_O_IX_。
*/
#define  OBS_OBJECT_INTERACT3_ \
 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))->Interact3(*(This->ppo_AIB+i), Act, IStrm, Qty, OStrm, Cty, pQty, pCaller); \
  } \
 }while(0)
 
/*
*
* 名称:SBO_OBJECT_INTERACT3
* 描述:宏,Interact3接口的SBO_O_IX。
*/
#define  SBO_OBJECT_INTERACT3 \
 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))->Interact3(*(This->ppo_AIB+i), Act, IStrm, Qty, 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_INTERACT3
* 描述:宏,Interact3接口的_SBO_O_IX。
*/
#define  _SBO_OBJECT_INTERACT3 \
 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); \
   if(FR_P == CallerCome(*(This->ppo_AIB+i), pCaller)) \
    ir = (*(This->ppo_AIB+i))->Interact3(*(This->ppo_AIB+i), Act, IStrm, Qty, OStrm, Cty, pQty, pCaller); \
  } \
  return ir; \
 }while(0)

/*
*
* 名称:OBS_OBJECT_CLOSE_
* 描述:宏,Close接口的OBS_O_IX_。
*/
#define  OBS_OBJECT_CLOSE_ \
 do{ \
  IRESULT  ir; \
  IRESULT  fr; \
  NUMIB    i; \
  if( 0 == This->RefCnt ) \
   return IR_O_NOPEN; \
  This->RefCnt--; \
  for(i=0; i<This->NIB; i++) \
  { \
   extern  FRESULT CallerCome(OBJECT* pND, const VR* pCaller); \
   if((*(This->ppo_AIB+i))->RefCnt -1 == This->RefCnt) \
   { \
    fr = CallerCome(*(This->ppo_AIB+i), pCaller); \
    if(FR_P == fr) ir = (*(This->ppo_AIB+i))->Close(*(This->ppo_AIB+i), pCaller); \
    else if(FR_N_HASVR == fr) continue; \
    else ir = IR_N; \
    if( NIR(ir) ) \
    { \
     This->RefCnt++; \
     return ir; \
    } \
   } \
  } \
 }while(0)

/*==========+  CreateObject & DestroyObject  +===========*/

/*
*
* 名称:CreateObject
* 描述:宏,动态创建对象。
* 参数:Msn --- [IN] 模序号,指定创建哪个模的对象。
*       IQCty --- [IN] 输入队列的容量。
*       OQCty --- [IN] 输出队列的容量。
*       NumCR --- [IN] 来访者数量。
*       ppObj --- [OUT] 输出创建的对象。
*/
extern  FRESULT  __CreateObject__(MLDSN Msn, BYTKTY IQCty, BYTKTY OQCty, SI32 NumCR, OBJECT** ppObj, BYTE* pExotic);
#define  CreateObject(Msn, IQCty, OQCty, NumCR, ppObj) \
     __CreateObject__(Msn, IQCty, OQCty, NumCR, ppObj, NULL)

/*
*
* 名称:DestroyObject
* 描述:宏,销毁动态创建的对象,即销毁由CreateObject宏创建的对象。
* 参数:pObj --- [IN] 指向对象。
*/
extern  BOOL  __DestroyObject__(OBJECT*  pObj);
#define  DestroyObject( pObj ) \
 do{ \
  if(TRUE == __DestroyObject__(pObj)) \
  { \
   free(pObj); \
   (pObj) = NULL; \
  } \
 }while(0)

/*===========+  向外声明外面直接调用的函数  +============*/

extern  FRESULT  Enqueue(QUEUE* pq, BYTE* IData, BYTKTY Qty);
extern  FRESULT  Dequeue(QUEUE* pq, BYTE* OData, BYTKTY Cty, BYTKTY* pQty);
extern  OBJECT*  GetBN(OBJECT* pND, MLDSN msn);
extern  EM*      GetEMofBN(OBJECT* pND, MLDSN msn);
extern  QUEUE*   GetIQ(OBJECT* pND);
extern  QUEUE*   GetOQ(OBJECT* pND);

#if INLINE_VOFUNCTION == 0

extern  IRESULT VO_Open(OBJECT* pObject, const VR* pCaller);
extern  IRESULT VO_Input(OBJECT* pObject, BYTE* IStrm, BYTKTY Qty, const VR* pCaller);
extern  IRESULT VO_Output(OBJECT* pObject, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller);
extern  IRESULT VO_IOput(OBJECT* pObject, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller);
extern  IRESULT VO_Interact0(OBJECT* pObject, ACTION Act, const VR* pCaller);
extern  IRESULT VO_Interact1(OBJECT* pObject, ACTION Act, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller);
extern  IRESULT VO_Interact2(OBJECT* pObject, ACTION Act, BYTE* IStrm, BYTKTY Qty, const VR* pCaller);
extern  IRESULT VO_Interact3(OBJECT* pObject, ACTION Act, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller);
extern  IRESULT VO_Close(OBJECT* pObject, const VR* pCaller);

#endif


#endif  /* #ifndef __OIOIC_H__ */