📄 snoopio.cpp
字号:
void WriteVerbose( void *pData, int iLen )
{
int i;
const char *pC = (const char *)pData;
for( i=0; i<iLen; i+=16 )
{
int iToWrite = iLen - i;
WriteVerboseLine( i, &(pC[i]), iToWrite < 16 ? iToWrite : 16 );
};
}
public:
/* ---
Regular constructor
--- */
SnoopIO( PIObject *pTheObject, int iArgc, const char *ppArgv[] )
: pObject( pTheObject ), pIOObject( 0 ), pOfs( 0 ), pOfsToDelete( 0 ),
pOutFile( 0 ), pSaveDB( 0 ), pMutex( PIPlatform_allocLocalMutex() ),
iPrototype( 1 ), iVerbose( 0 ), iOK( 0 )
{
/* ---
Regular constructor
--- */
if (!PIObject_readParameters(
pTheObject,
iArgc,
ppArgv,
ParameterFn,
this ) )
{ return; };
if ( !pIOObject )
{
CONFIG_ERR( pObject, "SnoopIO: 'IOObject' not defined.",
(iArgc ? (const char *)(ppArgv[0]) : "" ) );
return;
};
if ( !pOutFile )
{
CONFIG_ERR( pObject, "SnoopIO: 'OutFile' not defined.",
(iArgc ? (const char *)(ppArgv[0]) : "" ) );
return;
};
iOK = 1;
SNOOP( this, "New", pTheObject, "-", "-", "-" );
};
/* ---
Copy constructor
--- */
SnoopIO( PIObject *pTheObject, SnoopIO *pPrototype,
int iArgc, const char *ppArgv[] )
: pObject( pTheObject ), pIOObject( 0 ), pOfs( 0 ), pOfsToDelete( 0 ),
pOutFile( 0 ), pSaveDB( 0 ), pMutex( pPrototype->pMutex ),
iPrototype( 0 ), iVerbose( pPrototype->iVerbose ), iOK( 0 )
{
/* ---
Copy constructor
--- */
assert( pPrototype );
if ( !pPrototype ) { return; };
pIOObject = PIObject_copy(
pPrototype->pIOObject,
iArgc,
ppArgv
);
/* ---
Save this objects DB and then set this DB to be that of the
contained IO object, this allows the callee to access parameters
in the lower level IO object chain
--- */
pSaveDB = PIObject_getDB( pObject );
PIObject_setDB( pObject, PIObject_getDB( pIOObject ) );
pOfs=pPrototype->pOfs;
iOK = 1;
SNOOP( this, "Copy", pTheObject, "-", "-", "-" );
};
/* ---
Destroy object. We can't assume the object was fully
loaded and initialized. Hence checks
--- */
inline int Destroy( int iArgc, const char *ppArgv[] )
{
if ( pOfs )
{ SNOOP( this, "Del", pIOObject, "-", "-", "-" ); };
int iRet = PIAPI_COMPLETED;
if ( pIOObject )
{
PIObject_delete( pIOObject, iArgc, ppArgv );
pIOObject = 0;
};
if ( pSaveDB )
{
/* --- restore this child objects original DB --- */
PIObject_setDB( pObject, pSaveDB );
};
if ( iPrototype )
{ PISync_delete( pMutex ); };
return iRet;
};
/* --- */
~SnoopIO()
{
assert( !pIOObject );
delete pOfsToDelete;
};
/* --- */
inline int Out( void *pData, int iLen, int *piSent, int iArgc,
const char *ppArgv[] )
{
if ( !IsOK() ) { return PIAPI_ERROR; };
int iRet = PIIO_out( pIOObject, pData, iLen, piSent, iArgc, ppArgv );
if ( iRet==PIAPI_COMPLETED )
{
SNOOP( this, "Out", pData, iLen, (*piSent), iRet );
if ( iVerbose ) { WriteVerbose( pData, *piSent ); };
}
else
{ SNOOP( this, "Out", pData, iLen, "N/A", iRet ); }
return iRet;
};
/* --- */
inline int In( void *pData, int iLen, int *piReceived, int iArgc,
const char *ppArgv[] )
{
if ( !IsOK() ) { return PIAPI_ERROR; };
int iRet = PIIO_in( pIOObject, pData, iLen, piReceived, iArgc, ppArgv);
if ( iRet==PIAPI_COMPLETED )
{
SNOOP( this, "In", pData, iLen, (*piReceived), iRet );
if ( iVerbose ) { WriteVerbose( pData, *piReceived ); };
}
else
{ SNOOP( this, "In", pData, iLen, "N/A", iRet ); }
return iRet;
};
/* --- */
inline int IsOK() { return iOK; };
};
/*____________________________________________________________________________*\
*
Function: SnoopIO_onClassLoad
Synopsis:
Description:
This is called on program startup, restart or shutdown.
\*____________________________________________________________________________*/
PUBLIC_PIAPI int SnoopIO_onClassLoad( PIClass_LoadAction eAction, void * )
{
switch( eAction )
{
case STARTUP:
break;
case SHUTDOWN:
break;
default:;
};
return PIAPI_COMPLETED;
}
/*____________________________________________________________________________*\
*
Function: SnoopIO_SnoopIO
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int SnoopIO_SnoopIO( PIObject *pObj, int iArgc,
const char *ppArgv[] )
{
SnoopIO *pSnoop = new SnoopIO( pObj, iArgc, ppArgv );
if (!( pSnoop && pSnoop->IsOK() ))
{
pSnoop->Destroy( 0, 0 );
delete pSnoop;
return PIAPI_ERROR;
};
PIObject_setUserData( pObj, pSnoop );
return PIAPI_COMPLETED;
}
/*____________________________________________________________________________*\
*
Function: SnoopIO_SnoopIO
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int SnoopIO_copySnoopIO( PIObject *pObj, int iArgc,
const char *ppArgv[] )
{
SnoopIO *pPrototype = (SnoopIO *)PIObject_getUserData( pObj );
SnoopIO *pSnoop = new SnoopIO( pObj, pPrototype, iArgc, ppArgv );
if (!( pSnoop && pSnoop->IsOK() ))
{
PIObject_setUserData( pObj, 0 );
pSnoop->Destroy( 0, 0 );
delete pSnoop;
return PIAPI_ERROR;
};
PIObject_setUserData( pObj, pSnoop );
return PIAPI_COMPLETED;
}
/*____________________________________________________________________________*\
*
Function: SnoopIO_xSnoopIO
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int SnoopIO_xSnoopIO( PIObject *pObj, int iArgc,
const char *ppArgv[] )
{
assert( pObj );
SnoopIO *pSnoopIO = (SnoopIO *)PIObject_getUserData( pObj );
int iRet = PIAPI_COMPLETED;
if ( pSnoopIO )
{
iRet = pSnoopIO->Destroy( iArgc, ppArgv );
delete pSnoopIO;
};
return iRet;
}
/*____________________________________________________________________________*\
*
Function: SnoopIO_out
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int SnoopIO_out( PIObject *pObj, void *pData, int iLen,
int *piSent, int iArgc, const char *ppArgv[] )
{
assert( pObj && PIObject_getUserData( pObj ) );
return ((SnoopIO *)PIObject_getUserData( pObj ) )->Out( pData, iLen,
piSent, iArgc, ppArgv );
}
/*____________________________________________________________________________*\
*
Function: SnoopIO_in
Synopsis:
Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int SnoopIO_in( PIObject *pObj, void *pData, int iLen,
int *piReceived, int iArgc, const char *ppArgv[] )
{
assert( pObj && PIObject_getUserData( pObj ) );
return ((SnoopIO *)PIObject_getUserData( pObj ) )->In( pData, iLen,
piReceived, iArgc, ppArgv );
}
/* ---
Class configuration specification
--- */
#if 0
/*___+++CNF_BEGIN+++___*/
<Class>
Name SnoopIOClass
Type IO
Library IO
OnClassLoad SnoopIO_onClassLoad
Constructor SnoopIO_SnoopIO
CopyConstructor SnoopIO_copySnoopIO
Destructor SnoopIO_xSnoopIO
Out SnoopIO_out
In SnoopIO_in
</Class>
<Object>
Name SnoopIO
Class SnoopIOClass
</Object>
/*___+++CNF_END+++___*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -