📄 dpciso.cpp
字号:
/////////////////////////////////////////////////////////////////////////////////////////////////////
//
// IT24 Sistemas S..
// (Inicial) 2001.06.14 mdc Inicial
// (Inicial) 2001.07.31 mdc
// (Inicial) 2001.12.24 mdc CheckForMsgs ampliada
// (Inicial) 2002.01.08 mdc StartProcessing incluye a TrxResolution
// (Inicial) 2002.05.07 mdc ::SetStatus()
// (ALFA) 2002.08.21 mdc Atributos nuevos bNETWORK_MGMT_ENABLE,
// bISO8583_REPLY_SAF, shOFFSET_OUTPUT_MESSAGE, y bTCPIP_PP_PROTOCOL
// (ALFA) 2002.11.21 mdc EXPORT short DPCGETLASTTRANSACTIONSTATUS(void) ....
// (Beta) 2002.11.22 mdc EXPORT enumHostStatus WINAPI DPCGETSTATUSBACKEND() ;
// (Beta) 2002.12.11 mdc SAF concatenado enviado a SAF LOCAL
// (Beta) 2003.05.14 mdc Sistema SIOP
// (Relase-1) 2003.06.11 mdc Se agregan atributos de USUARIO y CONTRASENA hacia el backend. TSHOPPING.
// (Relase-1) 2003.08.01 mdc Correccion de parametro PSHORT hacia variable PSHORT, antes PINT. shLen <> ilen.
// (Relase-2) 2003.07.21 mdc BANCO INDUSTRIAL y atributos.
//
/////////////////////////////////////////////////////////////////////////////////////////////////////
// Headers propios
// Header Type Definitions
#include <qusrinc/typedefs.h>
// Aliases
#include <qusrinc/alias.h>
// Data Processing Center
#include <qusrinc/dpciso.h>
// Header Standard Library
#include <stdlib.h>
// Header Standard I/O Library
#include <stdio.h>
// Header String
#include <string.h>
// Header Hora
#include <time.h>
// Header Local Settings
#include <locale.h>
// Header INTERNET para htons()
#include <netinet/in.h>
// Header TrxResolution general y COBIS
#include <qusrinc/trxres.h>
// Header Standard I/O Library
#include <qusrinc/stdiol.h>
// Header TrxResolution SIAF
#include <qusrinc/ctotcp4u.h>
// constant definitions
#if defined(_SYSTEM_ATM_COBIS_)
static const char _DPC_ISO_SYSTEM_DEFINED_[] = "SISTEMA COBIS ";
#elif defined(_SYSTEM_ATM_SIAF_)
static const char _DPC_ISO_SYSTEM_DEFINED_[] = "SISTEMA SIAF ";
#elif defined(_SYSTEM_ATM_SIOP_)
static const char _DPC_ISO_SYSTEM_DEFINED_[] = "SISTEMA SIOP ";
#elif defined(_SYSTEM_ATM_TSHOP_)
static const char _DPC_ISO_SYSTEM_DEFINED_[] = "SISTEMA TSHOPPING ";
#elif defined(_SYSTEM_ATM_INDUS_)
static const char _DPC_ISO_SYSTEM_DEFINED_[] = "SISTEMA INDUSTRIAL ";
#elif defined(_SYSTEM_ATM_)
static const char _DPC_ISO_SYSTEM_DEFINED_[] = "SISTEMA BASE ";
#else
static const char _DPC_ISO_SYSTEM_DEFINED_[] = "<<< SIN SISTEMA >>>";
#endif // SYSTEM DEFINED
////////////////////////////////////////////////////////////////////////////////////////////////////
// static member variables
#if (STATIC_PROPERTY_SET == TRUE)
APPMSG DPCISO::isoMsg;
char DPCISO::szStr[CISOMESSAGESIZE*10];
short DPCISO::iLen;
char DPCISO::szStrOut[CISOMESSAGESIZE*10];
short DPCISO::iLenOut;
char DPCISO::szStrBackup[CISOMESSAGESIZE*10];
short DPCISO::iLenBackup;
SOCKET DPCISO::mySock,
DPCISO::mySockListen,
DPCISO::myActiveSock;
char DPCISO::szISOHost[256];
unsigned short DPCISO::usISOPort,
DPCISO::usISOLiPort;
char DPCISO::szVer[128];
int DPCISO::iRc;
bool DPCISO::bConnect;
bool DPCISO::bNETWORK_MGMT_ENABLE; // Habilita manejo de echo-logon ?
bool DPCISO::bISO8583_REPLY_SAF; // Habilita responder SAF y REVERSOS ?
short DPCISO::shOFFSET_OUTPUT_MESSAGE;// Existe un OFFSET al mensaje ISO ?
bool DPCISO::bTCPIP_PP_PROTOCOL; // Habilita protocolo PP del TCP ?
HWND DPCISO::hHandle;
time_t DPCISO::tLastEchoLogon;
enumFormatType DPCISO::efFormat;
int DPCISO::iTimeout;
enumEvTypeChecking DPCISO::eventType;
enumHostStatus DPCISO::hostStatus;
StoreAndForward DPCISO::safQueue; // Cola de requerimientos , "SAF"
MessageTracker DPCISO::trkLogg; // Logger de mensajes req/rta
MessageTracker DPCISO::trkError; // Logger de errores
MessageTracker DPCISO::trkEchoes; // Logger de echoes
rpcdb DPCISO::prpcDB; // Punto de conexion de la base de datos externa
unsigned long DPCISO::ulTrxCounter; // Contador interno de mensajes
bool DPCISO::bReversalToSAF_SystemFailure;
HFILE DPCISO::hDumpFile ;
bool DPCISO::bLocalNetMgmt_Enable;
char DPCISO::szBackEndHost[256]; // Nombre del BACK END (Cobis, SIAF, etc)
unsigned short DPCISO::usBackEndPort; // Si es IP, puerta de conexion
enumHostStatus DPCISO::hostBackEndStatus; // Estado del BACK END
time_t DPCISO::tLastSAFProcessed; // TimeStamp del ultimo SAF procesado
char DPCISO::szBackEndUser[256]; // Usuario del BACK END
char DPCISO::szBackEndPassw[256];// Contrasena del BACK END
#endif // STATIC_PROPERTY_SET
////////////////////////////////////////////////////////////////////////////////////////////////////
// global variables
DPCISO dpcISO;
////////////////////////////////////////////////////////////////////////////////////////////////////
// PRIVATE FUNCTIONS
VOID CALLBACK DPCTIMERPROC(HWND hWindow, UINT uTimer, UINT uInt, DWORD uDWord)
{ dpcISO.TimerProc(hWindow, uTimer, uInt, uDWord); };
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// API FUNCTIONS
EXPORT const char * WINAPI DPCGETSYSTEMDEFINED(void) { return _DPC_ISO_SYSTEM_DEFINED_; };
EXPORT int WINAPI DPCCONNECT(char *szHost,unsigned short usPort, unsigned short usLiPort,
bool bTCPIP_PP_PROTOCOL, int iTimeout, cobisdb *prpcXDB)
{ return dpcISO.Connect (szHost,usPort,usLiPort,bTCPIP_PP_PROTOCOL, iTimeout, prpcXDB); } ;
EXPORT int WINAPI DPCDISCONNECT()
{ return dpcISO.Disconnect (); } ;
EXPORT int WINAPI DPCRECONNECT( )
{ return dpcISO.Reconnect (); } ;
EXPORT int WINAPI DPCCHECKFORMSGS(unsigned short uTimeOut)
{ return dpcISO.CheckForMsgs ( uTimeOut); } ;
EXPORT int WINAPI DPCSTARTPROCESSING( boolean_t bLogon,boolean_t bAuth, boolean_t bReversalToSAF)
{ return dpcISO.StartProcessing ( bLogon,bAuth, bReversalToSAF ); } ;
EXPORT int WINAPI DPCSENDLOGON( enumCntlType wLogon )
{ return dpcISO.SendLogon (wLogon); } ;
EXPORT int WINAPI DPCSENDLOGOFF( )
{ return dpcISO.SendLogoff (); } ;
EXPORT int WINAPI DPCGETMSG(char *szMsg, unsigned short *piLen )
{ return dpcISO.GetMsg (szMsg, piLen); } ;
EXPORT int WINAPI DPCSETMSG(char *szMsg, unsigned short iLen )
{ return dpcISO.SetMsg (szMsg, iLen); } ;
EXPORT int WINAPI DPCSENDREQANDWAITRESP(short xbPP_Protocol,unsigned uTimeOut)
{ return dpcISO.SendReqAndWaitResp(xbPP_Protocol,uTimeOut); } ;
EXPORT void WINAPI DPCSETNOTIFYHANDLE( HWND hHandle)
{ if(hHandle) dpcISO.SetNotifyHandle( hHandle ); }
EXPORT int WINAPI DPCSENDREQNOWAIT(short xbPP_Protocol,unsigned uTimeOut)
{ return dpcISO.SendReqNoWait(xbPP_Protocol,uTimeOut); } ;
EXPORT int WINAPI DPCSMTPSENDMAIL( const char *szFrom, const char *szTo, const char *szMessage,
const char *szHost, const char *szMyDomain )
{ return dpcISO.SmtpSendMail (szFrom, szTo, szMessage, szHost, szMyDomain); } ;
EXPORT enumHostStatus WINAPI DPCGETSTATUS()
{ return dpcISO.GetStatus() ; };
EXPORT enumHostStatus WINAPI DPCSETSTATUS( enumHostStatus s )
{ return dpcISO.SetStatus( s ) ; };
EXPORT enumFormatType WINAPI DPCSETFORMAT( enumFormatType f)
{ return dpcISO.SetFormat( f ) ; };
EXPORT unsigned long WINAPI DPCGETTRXCOUNTER( void )
{ return dpcISO.GetTrxCounter() ; };
EXPORT enumFormatType WINAPI DPCGETFORMAT( void )
{ return dpcISO.GetFormat( ); };
EXPORT void WINAPI DPCSETCONFIG( char *szHost,unsigned short usPort, unsigned short usLiPort,
bool bTCPIP_PP_PROTOCOL, int iTimeout,
char *szIPBackEnd, unsigned short usPortBackEnd )
{ dpcISO.SetConfig(szHost,usPort,usLiPort,bTCPIP_PP_PROTOCOL,
iTimeout, szIPBackEnd, usPortBackEnd );
};
EXPORT short DPCGETLASTTRANSACTIONSTATUS(void)
{ return dpcISO.GetLastTransactionStatus(); };
EXPORT short DPCSETLASTTRANSACTIONSTATUS(short shNew)
{ return dpcISO.SetLastTransactionStatus(shNew); };
EXPORT enumHostStatus WINAPI DPCGETSTATUSBACKEND()
{ return dpcISO.GetStatusBackEnd() ; };
EXPORT enumHostStatus WINAPI DPCSETSTATUSBACKEND( enumHostStatus s )
{ return dpcISO.SetStatusBackEnd( s ) ; };
////////////////////////////////////////////////////////////////////////////////////////////////////
// ISO8583 API FUNCTIONS
EXPORT BOOL WINAPI DPCINITMESSAGE(void)
{ return dpcISO.isoMsg.InitMessage() ; };
EXPORT BOOL WINAPI DPCDELETEFIELD(WORD field)
{ return dpcISO.isoMsg. DeleteField(field); };
EXPORT BOOL WINAPI DPCEXPORTMSG(PBYTE pMsg,PWORD pwLen)
{ return dpcISO.isoMsg.Export(pMsg,pwLen); };
EXPORT BOOL WINAPI DPCIMPORTMSG(const PBYTE pBuf, WORD iLen)
{ return dpcISO.isoMsg.Import(pBuf,iLen); };
EXPORT BOOL WINAPI DPCSETMSGTYPEID(PBYTE lpszValue)
{ return dpcISO.isoMsg.SetMsgTypeId(lpszValue, 4); };
EXPORT BOOL WINAPI DPCGETMSGTYPEID(PBYTE lpszValue)
{ return dpcISO.isoMsg.GetMsgTypeId(lpszValue, 4+1); };
EXPORT BOOL WINAPI DPCGETFIELD(WORD iField,PWORD pwLen,PBYTE szBuf,WORD wLen)
{ return dpcISO.isoMsg.GetField(iField,pwLen,szBuf,wLen); };
EXPORT BOOL WINAPI DPCINSERTFIELD(WORD iField,PWORD pwLen,PBYTE szBuf,WORD wLen)
{ return dpcISO.isoMsg.InsertField(iField,pwLen,szBuf,wLen); };
EXPORT BOOL WINAPI DPCUPDATEFIELD(WORD iField,PWORD pwLen,PBYTE szBuf,WORD wLen)
{ return dpcISO.isoMsg.SetField(iField,pwLen,szBuf,wLen); };
EXPORT BOOL WINAPI DPCSETMSGTYPEIDRESPONSE( void )
{ return dpcISO.isoMsg.SetMsgTypeIdResponse(); };
EXPORT void WINAPI DPCSETTIMEOUT( int iTime )
{ dpcISO.SetTimeOut( iTime ); };
EXPORT int WINAPI DPCSENDDRAFT(short xbPP_Protocol,unsigned uTimeOut,
char *szExtStr,int iExtLen )
{ return dpcISO.SendDraft(xbPP_Protocol,uTimeOut,szExtStr,iExtLen ); };
////////////////////////////////////////////////////////////////////////////////////////////////////
// API FUNCTIONS
// CONSTANTS
// TimeOuts de norma ISO, segun configuracion propietaria
#define _ISO8583_ECHO_TIMEOUT_ (71)
// Timers en MILISEGUNDOS en caso de que se desee una notificacion via
// S.O. y eventos asincronicos mediante temporizadores.
#define _ISO8583_ECHO_TIMEOUT_MSEG_ (_ISO8583_ECHO_TIMEOUT_*1000L)
#define _POLLING_TIMEOUT_MSEG_ (1000L)
// TimeOut general del DPC (ACCEPT - WRITE)
// Se elije un TIMEOUT que es numero primo para no provocar
// una secuencia que se superponga y a su vez sobrecargue los
// ECHO - LOGON del HOST administrador, RED LINK / BANELCO / BANCOMAT / etc.
#define _DPC_COMM_TIMEOUT_ (73)
// Alerta de procesamiento de SAF continuo, en segundos
#define _ISO8583_SAF_IN_PROGRESS_ALERT_ (300)
// ISO8583 Msg. Header
static const char _ISO_MSG_HEADER_[] = "ISO";
// ISO8583 Msg. Header, Product ACI B24-ATM-POS
static const char _ISO_MSG_HEADER_ATM_POS_[] = "ISO0";
// ISO8583 Msg. Header, Product ACI EFT
static const char _ISO_MSG_HEADER_EFT_[] = "ISO1";
// Definicion de funciones de manejo de TIMER como funciones nulas,
// en caso de que la plataforma no soporte temporiadores
#ifdef ___INNER_LOOP_CHECKING_
// PRIVATE FUNCTIONS
typedef VOID CALLBACK (*DPCTIMERPROC_PTR)(HWND hWindow, UINT uTimer, UINT uInt, DWORD uDWord);
int SetTimer( HWND,UINT,UINT,DPCTIMERPROC_PTR ) { return 0; }
int KillTimer( HWND, UINT) { return 0; }
#endif
///////////////////////////////////////////////////////////////////////////////////////
// constructor
DPCISO::DPCISO( )
{
bConnect = false;
///////////////////////////////////////////////////////////////////////////////
bTCPIP_PP_PROTOCOL = true; // Habilita protocolo PP del TCP ?
bNETWORK_MGMT_ENABLE = true; // Habilita manejo de echo-logon ?
bISO8583_REPLY_SAF = true; // Habilita responder SAF y REVERSOS ?
shOFFSET_OUTPUT_MESSAGE = 0; // Existe un OFFSET al mensaje ISO ?
///////////////////////////////////////////////////////////////////////////////
tLastSAFProcessed = 0L;
bReversalToSAF_SystemFailure = is_false;
trxStatus = CISO_APPROVED_I;
iLen = iLenOut = iLenBackup = 0;
memset( szStr , 0x00, sizeof szStr );
memset( szStrOut , 0x00, sizeof szStrOut );
memset( szStrBackup, 0x00, sizeof szStrBackup );
//////////////////////////////////////////////////////////////
iRc = TCP4U_SUCCESS;
hDumpFile = HFILE_ERROR; // Archivo DUMP de TCP4U Library
mySock = mySockListen = myActiveSock = INVALID_SOCKET;
hHandle = NULL;
tLastEchoLogon = 0L;
efFormat = CNTL_FORMAT_ISO8583;
iTimeout = 0;
hostStatus = _HOST_READY_;
hostBackEndStatus = _HOST_READY_;
ulTrxCounter = 0;
#if defined( ___INNER_LOOP_CHECKING_ )
eventType = _INNER_LOOP_CHECKING_ ;
#elif defined( ___TIMER_EVENT_CHECKING_ )
eventType = _TIMER_EVENT_CHECKING_ ;
#else
#error "Sin definir el modo de procesamiento de eventos"
#endif
// ISO8583 init
isoMsg.InitMessage();
// open-create SAF
safQueue.Open( SAFFILENAME );
// open-cerate MSG track
trkLogg.Open( MSGTRKFILENAME );
// open-create ERROR track
trkError.Open( ERRTRKFILENAME );
// open-create ECHOE track
trkEchoes.Open( ECHOTRKFILENAME );
//////////////////////////////////////////////
szISOHost[0] = 0x00;
usISOPort = 0;
usISOLiPort = 0 ;
szBackEndHost[0] = 0x00;
usBackEndPort = 0;
//////////////////////////////////////////////
szBackEndUser[0] = 0x00;
szBackEndPassw[0] = 0x00;
//////////////////////////////////////////////
// Verify locale settings (decimal point)
VerifyLocaleSettings();
}
///////////////////////////////////////////////////////////////////////////////////////
// constructor
DPCISO::DPCISO( cobisdb *prpcXDB )
{
// def. constructor
::DPCISO();
// db backup
prpcDB = prpcXDB;
// Verify locale settings (decimal point)
VerifyLocaleSettings();
}
///////////////////////////////////////////////////////////////////////////////////////
// optional constructor
DPCISO::DPCISO( char *szHost, unsigned short usPort, unsigned short usLiPort, bool xbPP_Protocol, int *pRc)
{
bConnect = false;
///////////////////////////////////////////////////////////////////////////////
bTCPIP_PP_PROTOCOL = true; // Habilita protocolo PP del TCP ?
bNETWORK_MGMT_ENABLE = true; // Habilita manejo de echo-logon ?
bISO8583_REPLY_SAF = true; // Habilita responder SAF y REVERSOS ?
shOFFSET_OUTPUT_MESSAGE = 0; // Existe un OFFSET al mensaje ISO ?
///////////////////////////////////////////////////////////////////////////////
tLastSAFProcessed = 0L;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -