com0com-cvs Mailing List for Null-modem emulator (Page 9)
The virtual serial port driver for Windows.
Brought to you by:
vfrolov
You can subscribe to this list here.
2005 |
Jan
|
Feb
(7) |
Mar
|
Apr
|
May
(13) |
Jun
(18) |
Jul
(9) |
Aug
(10) |
Sep
(15) |
Oct
(6) |
Nov
(9) |
Dec
(6) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
(6) |
Feb
(4) |
Mar
(4) |
Apr
(2) |
May
(7) |
Jun
(11) |
Jul
(6) |
Aug
(9) |
Sep
(1) |
Oct
(27) |
Nov
(22) |
Dec
(3) |
2007 |
Jan
(13) |
Feb
(16) |
Mar
(2) |
Apr
(3) |
May
(7) |
Jun
(17) |
Jul
(9) |
Aug
(1) |
Sep
(13) |
Oct
(20) |
Nov
(18) |
Dec
(1) |
2008 |
Jan
|
Feb
(3) |
Mar
(46) |
Apr
(40) |
May
(4) |
Jun
(9) |
Jul
(7) |
Aug
(62) |
Sep
(25) |
Oct
(51) |
Nov
(67) |
Dec
(81) |
2009 |
Jan
(13) |
Feb
(31) |
Mar
(12) |
Apr
|
May
(10) |
Jun
|
Jul
(5) |
Aug
(2) |
Sep
(10) |
Oct
|
Nov
(3) |
Dec
(1) |
2010 |
Jan
|
Feb
(1) |
Mar
(4) |
Apr
|
May
(12) |
Jun
(9) |
Jul
(12) |
Aug
(7) |
Sep
(6) |
Oct
|
Nov
|
Dec
(1) |
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(11) |
Jun
|
Jul
(26) |
Aug
|
Sep
|
Oct
|
Nov
(2) |
Dec
(23) |
2012 |
Jan
(7) |
Feb
(3) |
Mar
|
Apr
|
May
(2) |
Jun
(9) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Vyacheslav F. <vf...@us...> - 2009-02-02 15:21:51
|
Update of /cvsroot/com0com/hub4com/plugins/escinsert In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27344/plugins/escinsert Modified Files: filter.cpp precomp.h Log Message: Optimized filter's API Index: precomp.h =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/escinsert/precomp.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** precomp.h 30 Sep 2008 08:32:38 -0000 1.1 --- precomp.h 2 Feb 2009 15:21:42 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.1 2008/09/30 08:32:38 vfrolov * Initial revision *************** *** 31,35 **** #include <crtdbg.h> - #include <map> #include <iostream> --- 34,37 ---- Index: filter.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/escinsert/filter.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** filter.cpp 22 Dec 2008 09:40:45 -0000 1.8 --- filter.cpp 2 Feb 2009 15:21:42 -0000 1.9 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.9 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.8 2008/12/22 09:40:45 vfrolov * Optimized message switching *************** *** 81,84 **** --- 84,89 ---- }; /////////////////////////////////////////////////////////////// + class Filter; + class State { public: *************** *** 101,114 **** public: Filter(int argc, const char *const argv[]); - State *GetState(HMASTERPORT hPort); DWORD soMask; BYTE escapeChar; - - private: - typedef map<HMASTERPORT, State*> PortsMap; - typedef pair<HMASTERPORT, State*> PortPair; - - PortsMap portsMap; }; --- 106,112 ---- *************** *** 134,156 **** } } - - State *Filter::GetState(HMASTERPORT hPort) - { - PortsMap::iterator iPair = portsMap.find(hPort); - - if (iPair == portsMap.end()) { - portsMap.insert(PortPair(hPort, NULL)); - - iPair = portsMap.find(hPort); - - if (iPair == portsMap.end()) - return NULL; - } - - if (!iPair->second) - iPair->second = new State(); - - return iPair->second; - } /////////////////////////////////////////////////////////////// static PLUGIN_TYPE CALLBACK GetPluginType() --- 132,135 ---- *************** *** 199,210 **** /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( HCONFIG /*hConfig*/, int argc, const char *const argv[]) { Filter *pFilter = new Filter(argc, argv); ! if (!pFilter) ! return NULL; if (!pFilter->IsValid()) { --- 178,194 ---- /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( + HMASTERFILTER DEBUG_PARAM(hMasterFilter), HCONFIG /*hConfig*/, int argc, const char *const argv[]) { + _ASSERTE(hMasterFilter != NULL); + Filter *pFilter = new Filter(argc, argv); ! if (!pFilter) { ! cerr << "No enough memory." << endl; ! exit(2); ! } if (!pFilter->IsValid()) { *************** *** 216,219 **** --- 200,227 ---- } /////////////////////////////////////////////////////////////// + static void CALLBACK Delete( + HFILTER hFilter) + { + _ASSERTE(hFilter != NULL); + + delete (Filter *)hFilter; + } + /////////////////////////////////////////////////////////////// + static HFILTERINSTANCE CALLBACK CreateInstance( + HMASTERFILTERINSTANCE DEBUG_PARAM(hMasterFilterInstance)) + { + _ASSERTE(hMasterFilterInstance != NULL); + + return (HFILTERINSTANCE)new State(); + } + /////////////////////////////////////////////////////////////// + static void CALLBACK DeleteInstance( + HFILTERINSTANCE hFilterInstance) + { + _ASSERTE(hFilterInstance != NULL); + + delete (State *)hFilterInstance; + } + /////////////////////////////////////////////////////////////// static void InsertStatus( BYTE escapeChar, *************** *** 272,281 **** static BOOL CALLBACK InMethod( HFILTER hFilter, ! HMASTERPORT hFromPort, HUB_MSG *pInMsg, HUB_MSG **ppEchoMsg) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFromPort != NULL); _ASSERTE(pInMsg != NULL); _ASSERTE(ppEchoMsg != NULL); --- 280,289 ---- static BOOL CALLBACK InMethod( HFILTER hFilter, ! HFILTERINSTANCE hFilterInstance, HUB_MSG *pInMsg, HUB_MSG **ppEchoMsg) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFilterInstance != NULL); _ASSERTE(pInMsg != NULL); _ASSERTE(ppEchoMsg != NULL); *************** *** 284,298 **** switch (HUB_MSG_T2N(pInMsg->type)) { case HUB_MSG_T2N(HUB_MSG_TYPE_CONNECT): { - State *pState = ((Filter *)hFilter)->GetState(hFromPort); - - if (!pState) - return FALSE; - if (pInMsg->u.val) { ! _ASSERTE(pState->isConnected == FALSE); ! pState->isConnected = TRUE; } else { ! _ASSERTE(pState->isConnected == TRUE); ! pState->isConnected = FALSE; break; } --- 292,301 ---- switch (HUB_MSG_T2N(pInMsg->type)) { case HUB_MSG_T2N(HUB_MSG_TYPE_CONNECT): { if (pInMsg->u.val) { ! _ASSERTE(((State *)hFilterInstance)->isConnected == FALSE); ! ((State *)hFilterInstance)->isConnected = TRUE; } else { ! _ASSERTE(((State *)hFilterInstance)->isConnected == TRUE); ! ((State *)hFilterInstance)->isConnected = FALSE; break; } *************** *** 300,317 **** // Insert current state ! if ((pState->soMask & SO_SET_BR) && pState->br != 0) ! InsertRBR(((Filter *)hFilter)->escapeChar, pState->br, ppEchoMsg); ! if ((pState->soMask & SO_SET_LC) && ! (pState->lc & (LC_MASK_BYTESIZE|LC_MASK_PARITY|LC_MASK_STOPBITS)) == (LC_MASK_BYTESIZE|LC_MASK_PARITY|LC_MASK_STOPBITS)) { ! InsertRLC(((Filter *)hFilter)->escapeChar, pState->lc, ppEchoMsg); } ! if (pState->soMask & SO_V2O_PIN_STATE(SPS_V2P_MST(-1))) ! InsertStatus(((Filter *)hFilter)->escapeChar, SERIAL_LSRMST_MST, SPS_P2V_MST(pState->pinState), ppEchoMsg); ! if (pState->soMask & (SO_V2O_LINE_STATUS(-1) | SO_V2O_PIN_STATE(PIN_STATE_BREAK))) { ! BYTE brk = (pState->pinState & PIN_STATE_BREAK) ? LINE_STATUS_BI : 0; InsertStatus(((Filter *)hFilter)->escapeChar, SERIAL_LSRMST_LSR_NODATA, brk, ppEchoMsg); --- 303,320 ---- // Insert current state ! if ((((State *)hFilterInstance)->soMask & SO_SET_BR) && ((State *)hFilterInstance)->br != 0) ! InsertRBR(((Filter *)hFilter)->escapeChar, ((State *)hFilterInstance)->br, ppEchoMsg); ! if ((((State *)hFilterInstance)->soMask & SO_SET_LC) && ! (((State *)hFilterInstance)->lc & (LC_MASK_BYTESIZE|LC_MASK_PARITY|LC_MASK_STOPBITS)) == (LC_MASK_BYTESIZE|LC_MASK_PARITY|LC_MASK_STOPBITS)) { ! InsertRLC(((Filter *)hFilter)->escapeChar, ((State *)hFilterInstance)->lc, ppEchoMsg); } ! if (((State *)hFilterInstance)->soMask & SO_V2O_PIN_STATE(SPS_V2P_MST(-1))) ! InsertStatus(((Filter *)hFilter)->escapeChar, SERIAL_LSRMST_MST, SPS_P2V_MST(((State *)hFilterInstance)->pinState), ppEchoMsg); ! if (((State *)hFilterInstance)->soMask & (SO_V2O_LINE_STATUS(-1) | SO_V2O_PIN_STATE(PIN_STATE_BREAK))) { ! BYTE brk = (((State *)hFilterInstance)->pinState & PIN_STATE_BREAK) ? LINE_STATUS_BI : 0; InsertStatus(((Filter *)hFilter)->escapeChar, SERIAL_LSRMST_LSR_NODATA, brk, ppEchoMsg); *************** *** 327,335 **** static BOOL CALLBACK OutMethod( HFILTER hFilter, HMASTERPORT DEBUG_PARAM(hFromPort), - HMASTERPORT hToPort, HUB_MSG *pOutMsg) { ! _ASSERTE(hFilter != NULL); _ASSERTE(hFromPort != NULL); _ASSERTE(pOutMsg != NULL); --- 330,339 ---- static BOOL CALLBACK OutMethod( HFILTER hFilter, + HFILTERINSTANCE hFilterInstance, HMASTERPORT DEBUG_PARAM(hFromPort), HUB_MSG *pOutMsg) { ! _ASSERTE(hFilterInstance != NULL); ! _ASSERTE(hFilterInstance != NULL); _ASSERTE(hFromPort != NULL); _ASSERTE(pOutMsg != NULL); *************** *** 342,363 **** pOutMsg->u.val &= ~((Filter *)hFilter)->soMask; ! State *pState = ((Filter *)hFilter)->GetState(hToPort); ! ! if (!pState) ! return FALSE; ! ! pState->soMask |= soMask; break; } case HUB_MSG_T2N(HUB_MSG_TYPE_SET_BR): { ! State *pState = ((Filter *)hFilter)->GetState(hToPort); ! ! if (!pState) ! return FALSE; ! ! _ASSERTE(((pState->soMask | ~((Filter *)hFilter)->soMask) & SO_SET_BR) != 0); ! if (pState->soMask & SO_SET_BR) { DWORD val = pOutMsg->u.val; --- 346,357 ---- pOutMsg->u.val &= ~((Filter *)hFilter)->soMask; ! ((State *)hFilterInstance)->soMask |= soMask; break; } case HUB_MSG_T2N(HUB_MSG_TYPE_SET_BR): { ! _ASSERTE(((((State *)hFilterInstance)->soMask | ~((Filter *)hFilter)->soMask) & SO_SET_BR) != 0); ! if (((State *)hFilterInstance)->soMask & SO_SET_BR) { DWORD val = pOutMsg->u.val; *************** *** 366,374 **** return FALSE; ! if (pState->br != val) { ! pState->br = val; ! if (pState->isConnected) ! InsertRBR(((Filter *)hFilter)->escapeChar, pState->br, &pOutMsg); } } --- 360,368 ---- return FALSE; ! if (((State *)hFilterInstance)->br != val) { ! ((State *)hFilterInstance)->br = val; ! if (((State *)hFilterInstance)->isConnected) ! InsertRBR(((Filter *)hFilter)->escapeChar, ((State *)hFilterInstance)->br, &pOutMsg); } } *************** *** 381,392 **** |VAL2LC_STOPBITS(-1)|LC_MASK_STOPBITS)) == 0); ! State *pState = ((Filter *)hFilter)->GetState(hToPort); ! ! if (!pState) ! return FALSE; ! ! _ASSERTE(((pState->soMask | ~((Filter *)hFilter)->soMask) & SO_SET_LC) != 0); ! if (pState->soMask & SO_SET_LC) { DWORD val = pOutMsg->u.val; --- 375,381 ---- |VAL2LC_STOPBITS(-1)|LC_MASK_STOPBITS)) == 0); ! _ASSERTE(((((State *)hFilterInstance)->soMask | ~((Filter *)hFilter)->soMask) & SO_SET_LC) != 0); ! if (((State *)hFilterInstance)->soMask & SO_SET_LC) { DWORD val = pOutMsg->u.val; *************** *** 397,418 **** if ((val & LC_MASK_BYTESIZE) == 0) { _ASSERTE((val & VAL2LC_BYTESIZE(-1)) == 0); ! val |= (pState->lc & (VAL2LC_BYTESIZE(-1)|LC_MASK_BYTESIZE)); } if ((val & LC_MASK_PARITY) == 0) { _ASSERTE((val & VAL2LC_PARITY(-1)) == 0); ! val |= (pState->lc & (VAL2LC_PARITY(-1)|LC_MASK_PARITY)); } if ((val & LC_MASK_STOPBITS) == 0) { _ASSERTE((val & VAL2LC_STOPBITS(-1)) == 0); ! val |= (pState->lc & (VAL2LC_STOPBITS(-1)|LC_MASK_STOPBITS)); } ! if (pState->lc != val) { ! pState->lc = val; ! if (pState->isConnected) ! InsertRLC(((Filter *)hFilter)->escapeChar, pState->lc, &pOutMsg); } } --- 386,407 ---- if ((val & LC_MASK_BYTESIZE) == 0) { _ASSERTE((val & VAL2LC_BYTESIZE(-1)) == 0); ! val |= (((State *)hFilterInstance)->lc & (VAL2LC_BYTESIZE(-1)|LC_MASK_BYTESIZE)); } if ((val & LC_MASK_PARITY) == 0) { _ASSERTE((val & VAL2LC_PARITY(-1)) == 0); ! val |= (((State *)hFilterInstance)->lc & (VAL2LC_PARITY(-1)|LC_MASK_PARITY)); } if ((val & LC_MASK_STOPBITS) == 0) { _ASSERTE((val & VAL2LC_STOPBITS(-1)) == 0); ! val |= (((State *)hFilterInstance)->lc & (VAL2LC_STOPBITS(-1)|LC_MASK_STOPBITS)); } ! if (((State *)hFilterInstance)->lc != val) { ! ((State *)hFilterInstance)->lc = val; ! if (((State *)hFilterInstance)->isConnected) ! InsertRLC(((Filter *)hFilter)->escapeChar, ((State *)hFilterInstance)->lc, &pOutMsg); } } *************** *** 421,432 **** } case HUB_MSG_T2N(HUB_MSG_TYPE_SET_PIN_STATE): { ! State *pState = ((Filter *)hFilter)->GetState(hToPort); ! ! if (!pState) ! return FALSE; ! ! _ASSERTE(((pState->soMask | ~((Filter *)hFilter)->soMask) & SO_V2O_PIN_STATE(-1)) != 0); ! WORD mask = MASK2VAL(pOutMsg->u.val) & SO_O2V_PIN_STATE(pState->soMask); if (!mask) --- 410,416 ---- } case HUB_MSG_T2N(HUB_MSG_TYPE_SET_PIN_STATE): { ! _ASSERTE(((((State *)hFilterInstance)->soMask | ~((Filter *)hFilter)->soMask) & SO_V2O_PIN_STATE(-1)) != 0); ! WORD mask = MASK2VAL(pOutMsg->u.val) & SO_O2V_PIN_STATE(((State *)hFilterInstance)->soMask); if (!mask) *************** *** 438,446 **** pOutMsg->u.val &= ~VAL2MASK(mask); ! pinState = ((pinState & mask) | (pState->pinState & ~mask)); ! mask = pState->pinState ^ pinState; if (mask) { ! if (pState->isConnected) { if (SPS_P2V_MST(mask)) InsertStatus(((Filter *)hFilter)->escapeChar, SERIAL_LSRMST_MST, SPS_P2V_MST(pinState), &pOutMsg); --- 422,430 ---- pOutMsg->u.val &= ~VAL2MASK(mask); ! pinState = ((pinState & mask) | (((State *)hFilterInstance)->pinState & ~mask)); ! mask = ((State *)hFilterInstance)->pinState ^ pinState; if (mask) { ! if (((State *)hFilterInstance)->isConnected) { if (SPS_P2V_MST(mask)) InsertStatus(((Filter *)hFilter)->escapeChar, SERIAL_LSRMST_MST, SPS_P2V_MST(pinState), &pOutMsg); *************** *** 449,458 **** BYTE brk = (pinState & PIN_STATE_BREAK) ? LINE_STATUS_BI : 0; ! if (!brk || (pState->soMask & SO_V2O_LINE_STATUS(LINE_STATUS_BI)) == 0) InsertStatus(((Filter *)hFilter)->escapeChar, SERIAL_LSRMST_LSR_NODATA, brk, &pOutMsg); } } ! pState->pinState = pinState; } --- 433,442 ---- BYTE brk = (pinState & PIN_STATE_BREAK) ? LINE_STATUS_BI : 0; ! if (!brk || (((State *)hFilterInstance)->soMask & SO_V2O_LINE_STATUS(LINE_STATUS_BI)) == 0) InsertStatus(((Filter *)hFilter)->escapeChar, SERIAL_LSRMST_LSR_NODATA, brk, &pOutMsg); } } ! ((State *)hFilterInstance)->pinState = pinState; } *************** *** 460,481 **** } case HUB_MSG_T2N(HUB_MSG_TYPE_SET_LSR): { ! State *pState = ((Filter *)hFilter)->GetState(hToPort); ! ! if (!pState) ! return FALSE; ! ! _ASSERTE(((pState->soMask | ~((Filter *)hFilter)->soMask) & SO_V2O_LINE_STATUS(-1)) != 0); BYTE lsr; ! lsr = (BYTE)pOutMsg->u.val & (BYTE)MASK2VAL(pOutMsg->u.val) & SO_O2V_LINE_STATUS(pState->soMask); // discard settings for supported options ! pOutMsg->u.val &= ~VAL2MASK(SO_O2V_LINE_STATUS(pState->soMask)); if (!lsr) break; ! if (pState->isConnected) InsertStatus(((Filter *)hFilter)->escapeChar, SERIAL_LSRMST_LSR_NODATA, lsr, &pOutMsg); --- 444,460 ---- } case HUB_MSG_T2N(HUB_MSG_TYPE_SET_LSR): { ! _ASSERTE(((((State *)hFilterInstance)->soMask | ~((Filter *)hFilter)->soMask) & SO_V2O_LINE_STATUS(-1)) != 0); BYTE lsr; ! lsr = (BYTE)pOutMsg->u.val & (BYTE)MASK2VAL(pOutMsg->u.val) & SO_O2V_LINE_STATUS(((State *)hFilterInstance)->soMask); // discard settings for supported options ! pOutMsg->u.val &= ~VAL2MASK(SO_O2V_LINE_STATUS(((State *)hFilterInstance)->soMask)); if (!lsr) break; ! if (((State *)hFilterInstance)->isConnected) InsertStatus(((Filter *)hFilter)->escapeChar, SERIAL_LSRMST_LSR_NODATA, lsr, &pOutMsg); *************** *** 526,530 **** NULL, // ConfigStop Create, ! NULL, // Init InMethod, OutMethod, --- 505,511 ---- NULL, // ConfigStop Create, ! Delete, ! CreateInstance, ! DeleteInstance, InMethod, OutMethod, |
From: Vyacheslav F. <vf...@us...> - 2009-02-02 15:21:51
|
Update of /cvsroot/com0com/hub4com/plugins/tag In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27344/plugins/tag Modified Files: filter.cpp Log Message: Optimized filter's API Index: filter.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/tag/filter.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** filter.cpp 22 Dec 2008 09:40:46 -0000 1.3 --- filter.cpp 2 Feb 2009 15:21:42 -0000 1.4 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.4 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.3 2008/12/22 09:40:46 vfrolov * Optimized message switching *************** *** 203,214 **** /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( HCONFIG /*hConfig*/, int argc, const char *const argv[]) { Filter *pFilter = new Filter(argc, argv); ! if (!pFilter) ! return NULL; if (!pFilter->IsValid()) { --- 206,222 ---- /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( + HMASTERFILTER DEBUG_PARAM(hMasterFilter), HCONFIG /*hConfig*/, int argc, const char *const argv[]) { + _ASSERTE(hMasterFilter != NULL); + Filter *pFilter = new Filter(argc, argv); ! if (!pFilter) { ! cerr << "No enough memory." << endl; ! exit(2); ! } if (!pFilter->IsValid()) { *************** *** 220,231 **** } /////////////////////////////////////////////////////////////// static BOOL CALLBACK InMethod( HFILTER hFilter, ! HMASTERPORT DEBUG_PARAM(hFromPort), HUB_MSG *pInMsg, HUB_MSG **DEBUG_PARAM(ppEchoMsg)) { _ASSERTE(hFilter != NULL); - _ASSERTE(hFromPort != NULL); _ASSERTE(pInMsg != NULL); _ASSERTE(ppEchoMsg != NULL); --- 228,246 ---- } /////////////////////////////////////////////////////////////// + static void CALLBACK Delete( + HFILTER hFilter) + { + _ASSERTE(hFilter != NULL); + + delete (Filter *)hFilter; + } + /////////////////////////////////////////////////////////////// static BOOL CALLBACK InMethod( HFILTER hFilter, ! HFILTERINSTANCE /*hFilterInstance*/, HUB_MSG *pInMsg, HUB_MSG **DEBUG_PARAM(ppEchoMsg)) { _ASSERTE(hFilter != NULL); _ASSERTE(pInMsg != NULL); _ASSERTE(ppEchoMsg != NULL); *************** *** 261,271 **** static BOOL CALLBACK OutMethod( HFILTER hFilter, HMASTERPORT DEBUG_PARAM(hFromPort), - HMASTERPORT DEBUG_PARAM(hToPort), HUB_MSG *pOutMsg) { _ASSERTE(hFilter != NULL); _ASSERTE(hFromPort != NULL); - _ASSERTE(hToPort != NULL); _ASSERTE(pOutMsg != NULL); --- 276,285 ---- static BOOL CALLBACK OutMethod( HFILTER hFilter, + HFILTERINSTANCE /*hFilterInstance*/, HMASTERPORT DEBUG_PARAM(hFromPort), HUB_MSG *pOutMsg) { _ASSERTE(hFilter != NULL); _ASSERTE(hFromPort != NULL); _ASSERTE(pOutMsg != NULL); *************** *** 319,323 **** NULL, // ConfigStop Create, ! NULL, // Init InMethod, OutMethod, --- 333,339 ---- NULL, // ConfigStop Create, ! Delete, ! NULL, // CreateInstance ! NULL, // DeleteInstance InMethod, OutMethod, |
From: Vyacheslav F. <vf...@us...> - 2009-02-02 15:21:51
|
Update of /cvsroot/com0com/hub4com/plugins/trace In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27344/plugins/trace Modified Files: filter.cpp Log Message: Optimized filter's API Index: filter.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/trace/filter.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** filter.cpp 23 Jan 2009 16:48:49 -0000 1.16 --- filter.cpp 2 Feb 2009 15:21:43 -0000 1.17 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.17 2009/02/02 15:21:43 vfrolov + * Optimized filter's API + * * Revision 1.16 2009/01/23 16:48:49 vfrolov * Exported timer routines *************** *** 87,90 **** --- 90,94 ---- static ROUTINE_PORT_NAME_A *pPortName = NULL; static ROUTINE_FILTER_NAME_A *pFilterName = NULL; + static ROUTINE_FILTERPORT *pFilterPort; /////////////////////////////////////////////////////////////// static void PrintTime(ostream &tout); *************** *** 167,173 **** class Filter : public Valid { public: ! Filter(TraceConfig &config, int argc, const char *const argv[]); - void SetFilterName(const char *_pName) { pName = _pName; } const char *FilterName() const { return pName; } --- 171,176 ---- class Filter : public Valid { public: ! Filter(const char *_pName, TraceConfig &config, int argc, const char *const argv[]); const char *FilterName() const { return pName; } *************** *** 178,184 **** }; ! Filter::Filter(TraceConfig &config, int argc, const char *const argv[]) ! : pTraceStream(NULL), ! pName(NULL) { for (const char *const *pArgs = &argv[1] ; argc > 1 ; pArgs++, argc--) { --- 181,187 ---- }; ! Filter::Filter(const char *_pName, TraceConfig &config, int argc, const char *const argv[]) ! : pName(_pName), ! pTraceStream(NULL) { for (const char *const *pArgs = &argv[1] ; argc > 1 ; pArgs++, argc--) { *************** *** 192,196 **** { ! cerr << "Unknown option --" << pArg << endl; Invalidate(); } --- 195,199 ---- { ! cerr << "Unknown option " << *pArgs << endl; Invalidate(); } *************** *** 314,317 **** --- 317,321 ---- /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( + HMASTERFILTER hMasterFilter, HCONFIG hConfig, int argc, *************** *** 319,327 **** { _ASSERTE(hConfig != NULL); ! Filter *pFilter = new Filter(*(TraceConfig *)hConfig, argc, argv); ! if (!pFilter) ! return NULL; if (!pFilter->IsValid()) { --- 323,334 ---- { _ASSERTE(hConfig != NULL); + _ASSERTE(hMasterFilter != NULL); ! Filter *pFilter = new Filter(pFilterName(hMasterFilter), *(TraceConfig *)hConfig, argc, argv); ! if (!pFilter) { ! cerr << "No enough memory." << endl; ! exit(2); ! } if (!pFilter->IsValid()) { *************** *** 333,346 **** } /////////////////////////////////////////////////////////////// ! static BOOL CALLBACK Init( ! HFILTER hFilter, ! HMASTERFILTER hMasterFilter) { _ASSERTE(hFilter != NULL); - _ASSERTE(hMasterFilter != NULL); ! ((Filter *)hFilter)->SetFilterName(pFilterName(hMasterFilter)); ! return TRUE; } /////////////////////////////////////////////////////////////// --- 340,367 ---- } /////////////////////////////////////////////////////////////// ! static void CALLBACK Delete( ! HFILTER hFilter) { _ASSERTE(hFilter != NULL); ! delete (Filter *)hFilter; ! } ! /////////////////////////////////////////////////////////////// ! static HFILTERINSTANCE CALLBACK CreateInstance( ! HMASTERFILTERINSTANCE hMasterFilterInstance) ! { ! _ASSERTE(hMasterFilterInstance != NULL); ! HMASTERPORT hMasterPort = pFilterPort(hMasterFilterInstance); ! ! _ASSERTE(hMasterPort != NULL); ! ! return (HFILTERINSTANCE)pPortName(hMasterPort); ! } ! /////////////////////////////////////////////////////////////// ! static void CALLBACK DeleteInstance( ! HFILTERINSTANCE DEBUG_PARAM(hFilterInstance)) ! { ! _ASSERTE(hFilterInstance != NULL); } /////////////////////////////////////////////////////////////// *************** *** 750,759 **** static BOOL CALLBACK InMethod( HFILTER hFilter, ! HMASTERPORT hFromPort, HUB_MSG *pInMsg, HUB_MSG **DEBUG_PARAM(ppEchoMsg)) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFromPort != NULL); _ASSERTE(pInMsg != NULL); _ASSERTE(ppEchoMsg != NULL); --- 771,780 ---- static BOOL CALLBACK InMethod( HFILTER hFilter, ! HFILTERINSTANCE hFilterInstance, HUB_MSG *pInMsg, HUB_MSG **DEBUG_PARAM(ppEchoMsg)) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFilterInstance != NULL); _ASSERTE(pInMsg != NULL); _ASSERTE(ppEchoMsg != NULL); *************** *** 765,769 **** PrintTime(tout); ! tout << pPortName(hFromPort) << "-(" << ((Filter *)hFilter)->FilterName() << ")->: "; --- 786,790 ---- PrintTime(tout); ! tout << (const char *)hFilterInstance << "-(" << ((Filter *)hFilter)->FilterName() << ")->: "; *************** *** 775,785 **** static BOOL CALLBACK OutMethod( HFILTER hFilter, HMASTERPORT hFromPort, - HMASTERPORT hToPort, HUB_MSG *pOutMsg) { _ASSERTE(hFilter != NULL); _ASSERTE(hFromPort != NULL); - _ASSERTE(hToPort != NULL); _ASSERTE(pOutMsg != NULL); --- 796,806 ---- static BOOL CALLBACK OutMethod( HFILTER hFilter, + HFILTERINSTANCE hFilterInstance, HMASTERPORT hFromPort, HUB_MSG *pOutMsg) { _ASSERTE(hFilter != NULL); + _ASSERTE(hFilterInstance != NULL); _ASSERTE(hFromPort != NULL); _ASSERTE(pOutMsg != NULL); *************** *** 789,793 **** PrintTime(tout); ! tout << pPortName(hToPort) << "<-(" << ((Filter *)hFilter)->FilterName() << ")-" << pPortName(hFromPort) << ": "; --- 810,814 ---- PrintTime(tout); ! tout << (const char *)hFilterInstance << "<-(" << ((Filter *)hFilter)->FilterName() << ")-" << pPortName(hFromPort) << ": "; *************** *** 807,811 **** ConfigStop, Create, ! Init, InMethod, OutMethod, --- 828,834 ---- ConfigStop, Create, ! Delete, ! CreateInstance, ! DeleteInstance, InMethod, OutMethod, *************** *** 822,826 **** { if (!ROUTINE_IS_VALID(pHubRoutines, pPortName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterName)) { return NULL; --- 845,850 ---- { if (!ROUTINE_IS_VALID(pHubRoutines, pPortName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterPort)) { return NULL; *************** *** 829,832 **** --- 853,857 ---- pPortName = pHubRoutines->pPortName; pFilterName = pHubRoutines->pFilterName; + pFilterPort = pHubRoutines->pFilterPort; return plugins; |
From: Vyacheslav F. <vf...@us...> - 2009-02-02 15:21:48
|
Update of /cvsroot/com0com/hub4com/plugins/awakseq In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27344/plugins/awakseq Modified Files: filter.cpp precomp.h Log Message: Optimized filter's API Index: precomp.h =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/awakseq/precomp.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** precomp.h 1 Apr 2008 14:52:24 -0000 1.1 --- precomp.h 2 Feb 2009 15:21:42 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.1 2008/04/01 14:52:24 vfrolov * Initial revision *************** *** 32,36 **** #include <crtdbg.h> - #include <map> #include <iostream> --- 35,38 ---- Index: filter.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/awakseq/filter.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** filter.cpp 22 Dec 2008 09:40:45 -0000 1.11 --- filter.cpp 2 Feb 2009 15:21:42 -0000 1.12 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.12 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.11 2008/12/22 09:40:45 vfrolov * Optimized message switching *************** *** 80,87 **** } /////////////////////////////////////////////////////////////// class State { public: ! State(const BYTE *pAwakSeq) ! : connectSent(FALSE), connectionCounter(0) { StartAwakSeq(pAwakSeq); } void StartAwakSeq(const BYTE *pAwakSeq) { --- 83,102 ---- } /////////////////////////////////////////////////////////////// + class Valid { + public: + Valid() : isValid(TRUE) {} + void Invalidate() { isValid = FALSE; } + BOOL IsValid() const { return isValid; } + private: + BOOL isValid; + }; + /////////////////////////////////////////////////////////////// class State { public: ! State() ! : waitAwakSeq(FALSE), ! pAwakSeqNext(NULL), ! connectSent(FALSE), ! connectionCounter(0) {} void StartAwakSeq(const BYTE *pAwakSeq) { *************** *** 96,116 **** }; /////////////////////////////////////////////////////////////// ! class Filter { public: Filter(int argc, const char *const argv[]); ! State *GetState(HMASTERPORT hPort); const BYTE *pAwakSeq; - - private: - - typedef map<HMASTERPORT, State*> PortsMap; - typedef pair<HMASTERPORT, State*> PortPair; - - PortsMap portsMap; }; Filter::Filter(int argc, const char *const argv[]) ! : pAwakSeq((const BYTE *)"") { for (const char *const *pArgs = &argv[1] ; argc > 1 ; pArgs++, argc--) { --- 111,127 ---- }; /////////////////////////////////////////////////////////////// ! class Filter : public Valid { public: Filter(int argc, const char *const argv[]); ! ~Filter() { ! if (pAwakSeq) ! free((void *)pAwakSeq); ! } const BYTE *pAwakSeq; }; Filter::Filter(int argc, const char *const argv[]) ! : pAwakSeq(NULL) { for (const char *const *pArgs = &argv[1] ; argc > 1 ; pArgs++, argc--) { *************** *** 118,122 **** if (!pArg) { ! cerr << "Unknown option " << *pArgs << endl; continue; } --- 129,134 ---- if (!pArg) { ! cerr << "ERROR: Unknown option " << *pArgs << endl; ! Invalidate(); continue; } *************** *** 125,152 **** if ((pParam = GetParam(pArg, "awak-seq=")) != NULL) { ! pAwakSeq = (const BYTE *)_strdup(pParam); } else { ! cerr << "Unknown option " << pArg << endl; } } - } ! State *Filter::GetState(HMASTERPORT hPort) ! { ! PortsMap::iterator iPair = portsMap.find(hPort); ! ! if (iPair == portsMap.end()) { ! portsMap.insert(PortPair(hPort, NULL)); ! ! iPair = portsMap.find(hPort); ! if (iPair == portsMap.end()) ! return NULL; } - - if (!iPair->second) - iPair->second = new State(pAwakSeq); - - return iPair->second; } /////////////////////////////////////////////////////////////// --- 137,166 ---- if ((pParam = GetParam(pArg, "awak-seq=")) != NULL) { ! if (pAwakSeq) { ! cerr << "ERROR: The awakening sequence was set twice" << endl; ! Invalidate(); ! continue; ! } ! ! pAwakSeq = (BYTE *)_strdup(pParam); ! ! if (!pAwakSeq) { ! cerr << "No enough memory." << endl; ! exit(2); ! } } else { ! cerr << "ERROR: Unknown option " << *pArgs << endl; ! Invalidate(); } } ! if (IsValid() && !pAwakSeq) { ! pAwakSeq = (BYTE *)_strdup(""); ! if (!pAwakSeq) { ! cerr << "No enough memory." << endl; ! exit(2); ! } } } /////////////////////////////////////////////////////////////// *************** *** 206,224 **** /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( HCONFIG /*hConfig*/, int argc, const char *const argv[]) { ! return (HFILTER)new Filter(argc, argv); } /////////////////////////////////////////////////////////////// static BOOL CALLBACK InMethod( HFILTER hFilter, ! HMASTERPORT hFromPort, HUB_MSG *pInMsg, HUB_MSG **DEBUG_PARAM(ppEchoMsg)) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFromPort != NULL); _ASSERTE(pInMsg != NULL); _ASSERTE(ppEchoMsg != NULL); --- 220,277 ---- /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( + HMASTERFILTER DEBUG_PARAM(hMasterFilter), HCONFIG /*hConfig*/, int argc, const char *const argv[]) { ! _ASSERTE(hMasterFilter != NULL); ! ! Filter *pFilter = new Filter(argc, argv); ! ! if (!pFilter) { ! cerr << "No enough memory." << endl; ! exit(2); ! } ! ! if (!pFilter->IsValid()) { ! delete pFilter; ! return NULL; ! } ! ! return (HFILTER)pFilter; ! } ! /////////////////////////////////////////////////////////////// ! static void CALLBACK Delete( ! HFILTER hFilter) ! { ! _ASSERTE(hFilter != NULL); ! ! delete (Filter *)hFilter; ! } ! /////////////////////////////////////////////////////////////// ! static HFILTERINSTANCE CALLBACK CreateInstance( ! HMASTERFILTERINSTANCE DEBUG_PARAM(hMasterFilterInstance)) ! { ! _ASSERTE(hMasterFilterInstance != NULL); ! ! return (HFILTERINSTANCE)new State(); ! } ! /////////////////////////////////////////////////////////////// ! static void CALLBACK DeleteInstance( ! HFILTERINSTANCE hFilterInstance) ! { ! _ASSERTE(hFilterInstance != NULL); ! ! delete (State *)hFilterInstance; } /////////////////////////////////////////////////////////////// static BOOL CALLBACK InMethod( HFILTER hFilter, ! HFILTERINSTANCE hFilterInstance, HUB_MSG *pInMsg, HUB_MSG **DEBUG_PARAM(ppEchoMsg)) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFilterInstance != NULL); _ASSERTE(pInMsg != NULL); _ASSERTE(ppEchoMsg != NULL); *************** *** 234,247 **** return TRUE; ! State *pState = ((Filter *)hFilter)->GetState(hFromPort); ! ! if (!pState) ! return FALSE; ! if (!pState->waitAwakSeq) return TRUE; BYTE *pBuf = pInMsg->u.buf.pBuf; ! const BYTE *pAwakSeqNext = pState->pAwakSeqNext; for ( ; *pAwakSeqNext && size ; size--) { --- 287,298 ---- return TRUE; ! if (((State *)hFilterInstance)->pAwakSeqNext == NULL) ! ((State *)hFilterInstance)->StartAwakSeq(((Filter *)hFilter)->pAwakSeq); ! if (!((State *)hFilterInstance)->waitAwakSeq) return TRUE; BYTE *pBuf = pInMsg->u.buf.pBuf; ! const BYTE *pAwakSeqNext = ((State *)hFilterInstance)->pAwakSeqNext; for ( ; *pAwakSeqNext && size ; size--) { *************** *** 253,257 **** if (!*pAwakSeqNext) { ! pState->waitAwakSeq = FALSE; if (size) { --- 304,308 ---- if (!*pAwakSeqNext) { ! ((State *)hFilterInstance)->waitAwakSeq = FALSE; if (size) { *************** *** 280,287 **** } ! pState->connectSent = TRUE; } else { pInMsg->u.buf.size = 0; ! pState->pAwakSeqNext = pAwakSeqNext; } break; --- 331,338 ---- } ! ((State *)hFilterInstance)->connectSent = TRUE; } else { pInMsg->u.buf.size = 0; ! ((State *)hFilterInstance)->pAwakSeqNext = pAwakSeqNext; } break; *************** *** 293,305 **** return FALSE; } else { - State *pState = ((Filter *)hFilter)->GetState(hFromPort); - - if (!pState) - return FALSE; - // discard CONNECT(FALSE) from the input stream // if CONNECT(TRUE) was not added yet ! if (pState->connectSent) { ! pState->connectSent = FALSE; } else { if (!pMsgReplaceNone(pInMsg, HUB_MSG_TYPE_EMPTY)) --- 344,351 ---- return FALSE; } else { // discard CONNECT(FALSE) from the input stream // if CONNECT(TRUE) was not added yet ! if (((State *)hFilterInstance)->connectSent) { ! ((State *)hFilterInstance)->connectSent = FALSE; } else { if (!pMsgReplaceNone(pInMsg, HUB_MSG_TYPE_EMPTY)) *************** *** 308,312 **** // start awakening sequence waiting ! pState->StartAwakSeq(((Filter *)hFilter)->pAwakSeq); } break; --- 354,358 ---- // start awakening sequence waiting ! ((State *)hFilterInstance)->StartAwakSeq(((Filter *)hFilter)->pAwakSeq); } break; *************** *** 318,349 **** static BOOL CALLBACK OutMethod( HFILTER hFilter, HMASTERPORT DEBUG_PARAM(hFromPort), - HMASTERPORT hToPort, HUB_MSG *pOutMsg) { _ASSERTE(hFilter != NULL); _ASSERTE(hFromPort != NULL); - _ASSERTE(hToPort != NULL); _ASSERTE(pOutMsg != NULL); switch (HUB_MSG_T2N(pOutMsg->type)) { ! case HUB_MSG_T2N(HUB_MSG_TYPE_CONNECT): { ! State *pState = ((Filter *)hFilter)->GetState(hToPort); ! ! if (!pState) ! return FALSE; ! ! if (pOutMsg->u.val) { ! pState->connectionCounter++; ! _ASSERTE(pState->connectionCounter > 0); ! } else { ! _ASSERTE(pState->connectionCounter > 0); ! if (--pState->connectionCounter <= 0) ! pState->StartAwakSeq(((Filter *)hFilter)->pAwakSeq); } - break; - } } --- 364,390 ---- static BOOL CALLBACK OutMethod( HFILTER hFilter, + HFILTERINSTANCE hFilterInstance, HMASTERPORT DEBUG_PARAM(hFromPort), HUB_MSG *pOutMsg) { _ASSERTE(hFilter != NULL); + _ASSERTE(hFilterInstance != NULL); _ASSERTE(hFromPort != NULL); _ASSERTE(pOutMsg != NULL); switch (HUB_MSG_T2N(pOutMsg->type)) { ! case HUB_MSG_T2N(HUB_MSG_TYPE_CONNECT): { ! if (pOutMsg->u.val) { ! ((State *)hFilterInstance)->connectionCounter++; ! _ASSERTE(((State *)hFilterInstance)->connectionCounter > 0); ! } else { ! _ASSERTE(((State *)hFilterInstance)->connectionCounter > 0); ! if (--((State *)hFilterInstance)->connectionCounter <= 0) ! ((State *)hFilterInstance)->StartAwakSeq(((Filter *)hFilter)->pAwakSeq); ! } ! break; } } *************** *** 360,364 **** NULL, // ConfigStop Create, ! NULL, // Init InMethod, OutMethod, --- 401,407 ---- NULL, // ConfigStop Create, ! Delete, ! CreateInstance, ! DeleteInstance, InMethod, OutMethod, |
From: Vyacheslav F. <vf...@us...> - 2009-02-02 15:21:48
|
Update of /cvsroot/com0com/hub4com/plugins/linectl In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27344/plugins/linectl Modified Files: filter.cpp precomp.h Log Message: Optimized filter's API Index: precomp.h =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/linectl/precomp.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** precomp.h 30 Sep 2008 08:34:38 -0000 1.1 --- precomp.h 2 Feb 2009 15:21:42 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.1 2008/09/30 08:34:38 vfrolov * Initial revision *************** *** 31,35 **** #include <crtdbg.h> - #include <map> #include <iostream> --- 34,37 ---- Index: filter.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/linectl/filter.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** filter.cpp 22 Dec 2008 09:40:45 -0000 1.10 --- filter.cpp 2 Feb 2009 15:21:42 -0000 1.11 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.11 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.10 2008/12/22 09:40:45 vfrolov * Optimized message switching *************** *** 57,64 **** namespace FilterLineCtl { /////////////////////////////////////////////////////////////// ! static ROUTINE_MSG_INSERT_VAL *pMsgInsertVal = NULL; ! static ROUTINE_MSG_REPLACE_NONE *pMsgReplaceNone = NULL; ! static ROUTINE_PORT_NAME_A *pPortName = NULL; ! static ROUTINE_FILTER_NAME_A *pFilterName = NULL; /////////////////////////////////////////////////////////////// const char *GetParam(const char *pArg, const char *pPattern) --- 60,74 ---- namespace FilterLineCtl { /////////////////////////////////////////////////////////////// ! #ifndef _DEBUG ! #define DEBUG_PARAM(par) ! #else /* _DEBUG */ ! #define DEBUG_PARAM(par) par ! #endif /* _DEBUG */ ! /////////////////////////////////////////////////////////////// ! static ROUTINE_MSG_INSERT_VAL *pMsgInsertVal; ! static ROUTINE_MSG_REPLACE_NONE *pMsgReplaceNone; ! static ROUTINE_PORT_NAME_A *pPortName; ! static ROUTINE_FILTER_NAME_A *pFilterName; ! static ROUTINE_FILTERPORT *pFilterPort; /////////////////////////////////////////////////////////////// const char *GetParam(const char *pArg, const char *pPattern) *************** *** 83,89 **** class Filter : public Valid { public: ! Filter(int argc, const char *const argv[]); - void SetFilterName(const char *_pName) { pName = _pName; } const char *FilterName() const { return pName; } --- 93,98 ---- class Filter : public Valid { public: ! Filter(const char *pName, int argc, const char *const argv[]); const char *FilterName() const { return pName; } *************** *** 97,103 **** }; ! Filter::Filter(int argc, const char *const argv[]) ! : soOutMask(0), ! pName(NULL) { goInMask[0] = goInMask[1] = 0; --- 106,112 ---- }; ! Filter::Filter(const char *_pName, int argc, const char *const argv[]) ! : pName(_pName), ! soOutMask(0) { goInMask[0] = goInMask[1] = 0; *************** *** 207,218 **** /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( HCONFIG /*hConfig*/, int argc, const char *const argv[]) { ! Filter *pFilter = new Filter(argc, argv); ! if (!pFilter) ! return NULL; if (!pFilter->IsValid()) { --- 216,232 ---- /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( + HMASTERFILTER hMasterFilter, HCONFIG /*hConfig*/, int argc, const char *const argv[]) { ! _ASSERTE(hMasterFilter != NULL); ! Filter *pFilter = new Filter(pFilterName(hMasterFilter), argc, argv); ! ! if (!pFilter) { ! cerr << "No enough memory." << endl; ! exit(2); ! } if (!pFilter->IsValid()) { *************** *** 224,247 **** } /////////////////////////////////////////////////////////////// ! static BOOL CALLBACK Init( ! HFILTER hFilter, ! HMASTERFILTER hMasterFilter) { _ASSERTE(hFilter != NULL); - _ASSERTE(hMasterFilter != NULL); ! ((Filter *)hFilter)->SetFilterName(pFilterName(hMasterFilter)); ! return TRUE; } /////////////////////////////////////////////////////////////// static BOOL CALLBACK OutMethod( HFILTER hFilter, ! HMASTERPORT hFromPort, HMASTERPORT hToPort, HUB_MSG *pOutMsg) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFromPort != NULL); _ASSERTE(hToPort != NULL); _ASSERTE(pOutMsg != NULL); --- 238,275 ---- } /////////////////////////////////////////////////////////////// ! static void CALLBACK Delete( ! HFILTER hFilter) { _ASSERTE(hFilter != NULL); ! delete (Filter *)hFilter; ! } ! /////////////////////////////////////////////////////////////// ! static HFILTERINSTANCE CALLBACK CreateInstance( ! HMASTERFILTERINSTANCE hMasterFilterInstance) ! { ! _ASSERTE(hMasterFilterInstance != NULL); ! HMASTERPORT hMasterPort = pFilterPort(hMasterFilterInstance); ! ! _ASSERTE(hMasterPort != NULL); ! ! return (HFILTERINSTANCE)pPortName(hMasterPort); ! } ! /////////////////////////////////////////////////////////////// ! static void CALLBACK DeleteInstance( ! HFILTERINSTANCE DEBUG_PARAM(hFilterInstance)) ! { ! _ASSERTE(hFilterInstance != NULL); } /////////////////////////////////////////////////////////////// static BOOL CALLBACK OutMethod( HFILTER hFilter, ! HFILTERINSTANCE hFilterInstance, HMASTERPORT hToPort, HUB_MSG *pOutMsg) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFilterInstance != NULL); _ASSERTE(hToPort != NULL); _ASSERTE(pOutMsg != NULL); *************** *** 274,278 **** if (fail_options) { ! cerr << pPortName(hFromPort) << " WARNING: Requested by filter " << ((Filter *)hFilter)->FilterName() << " for port " << pPortName(hToPort) --- 302,306 ---- if (fail_options) { ! cerr << (const char *)hFilterInstance << " WARNING: Requested by filter " << ((Filter *)hFilter)->FilterName() << " for port " << pPortName(hToPort) *************** *** 346,350 **** NULL, // ConfigStop Create, ! Init, NULL, // InMethod OutMethod, --- 374,380 ---- NULL, // ConfigStop Create, ! Delete, ! CreateInstance, ! DeleteInstance, NULL, // InMethod OutMethod, *************** *** 363,367 **** !ROUTINE_IS_VALID(pHubRoutines, pMsgReplaceNone) || !ROUTINE_IS_VALID(pHubRoutines, pPortName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterName)) { return NULL; --- 393,398 ---- !ROUTINE_IS_VALID(pHubRoutines, pMsgReplaceNone) || !ROUTINE_IS_VALID(pHubRoutines, pPortName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterPort)) { return NULL; *************** *** 372,375 **** --- 403,407 ---- pPortName = pHubRoutines->pPortName; pFilterName = pHubRoutines->pFilterName; + pFilterPort = pHubRoutines->pFilterPort; return plugins; |
From: Vyacheslav F. <vf...@us...> - 2009-02-02 15:21:48
|
Update of /cvsroot/com0com/hub4com In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27344 Modified Files: export.cpp filter.h filters.cpp filters.h hub4com.cpp Log Message: Optimized filter's API Index: filter.h =================================================================== RCS file: /cvsroot/com0com/hub4com/filter.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** filter.h 24 Nov 2008 11:46:56 -0000 1.1 --- filter.h 2 Feb 2009 15:21:42 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.1 2008/11/24 11:46:56 vfrolov * Initial revision *************** *** 37,48 **** const char *pGroup, const char *pName, ! HFILTER _hFilter, FILTER_IN_METHOD *_pInMethod, FILTER_OUT_METHOD *_pOutMethod) : group(pGroup), name(pName), ! hFilter(_hFilter), pInMethod(_pInMethod), ! pOutMethod(_pOutMethod) { #ifdef _DEBUG --- 40,52 ---- const char *pGroup, const char *pName, ! FILTER_CREATE_INSTANCE *_pCreateInstance, FILTER_IN_METHOD *_pInMethod, FILTER_OUT_METHOD *_pOutMethod) : group(pGroup), name(pName), ! pCreateInstance(_pCreateInstance), pInMethod(_pInMethod), ! pOutMethod(_pOutMethod), ! hFilter(NULL) { #ifdef _DEBUG *************** *** 58,67 **** #endif const string group; const string name; ! const HFILTER hFilter; FILTER_IN_METHOD *const pInMethod; FILTER_OUT_METHOD *const pOutMethod; #ifdef _DEBUG private: --- 62,79 ---- #endif + const string &Name() const { return name; } + + protected: + friend class Filters; + friend class FilterInstance; + const string group; const string name; ! FILTER_CREATE_INSTANCE *const pCreateInstance; FILTER_IN_METHOD *const pInMethod; FILTER_OUT_METHOD *const pOutMethod; + HFILTER hFilter; + #ifdef _DEBUG private: *************** *** 73,76 **** --- 85,144 ---- }; /////////////////////////////////////////////////////////////// + #define FILTER_INSTANCE_SIGNATURE 'h4cI' + /////////////////////////////////////////////////////////////// + class FilterInstance { + public: + FilterInstance( + Filter &_filter, + Port &_port, + BOOL addInMethod, + BOOL addOutMethod, + const set<Port *> *_pSrcPorts) + : filter(_filter), + port(_port), + pInMethod(addInMethod ? _filter.pInMethod : NULL), + pOutMethod(addOutMethod ? _filter.pOutMethod : NULL), + pSrcPorts(_pSrcPorts), + hFilterInstance(NULL) + { + #ifdef _DEBUG + signature = FILTER_INSTANCE_SIGNATURE; + #endif + } + + ~FilterInstance() { + if (pSrcPorts) + delete pSrcPorts; + + //if (hFilterInstance) + // Delete(hFilterInstance); + + #ifdef _DEBUG + _ASSERTE(signature == FILTER_INSTANCE_SIGNATURE); + signature = 0; + #endif + } + + Filter &filter; + Port &port; + + protected: + friend class Filters; + + FILTER_IN_METHOD *const pInMethod; + FILTER_OUT_METHOD *const pOutMethod; + const set<Port *> *const pSrcPorts; + + HFILTERINSTANCE hFilterInstance; + + #ifdef _DEBUG + private: + DWORD signature; + + public: + BOOL IsValid() { return signature == FILTER_INSTANCE_SIGNATURE; } + #endif + }; + /////////////////////////////////////////////////////////////// #endif // _FILTER_H Index: export.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/export.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** export.cpp 26 Jan 2009 14:55:29 -0000 1.11 --- export.cpp 2 Feb 2009 15:21:42 -0000 1.12 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.12 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.11 2009/01/26 14:55:29 vfrolov * Added signature checking for Timer *************** *** 221,225 **** _ASSERTE(((Filter *)hMasterFilter)->IsValid()); ! return ((Filter *)hMasterFilter)->name.c_str(); } /////////////////////////////////////////////////////////////// --- 224,228 ---- _ASSERTE(((Filter *)hMasterFilter)->IsValid()); ! return ((Filter *)hMasterFilter)->Name().c_str(); } /////////////////////////////////////////////////////////////// *************** *** 277,280 **** --- 280,291 ---- } /////////////////////////////////////////////////////////////// + static HMASTERPORT CALLBACK filter_port(HMASTERFILTERINSTANCE hMasterFilterInstance) + { + _ASSERTE(hMasterFilterInstance != NULL); + _ASSERTE(((FilterInstance *)hMasterFilterInstance)->IsValid()); + + return (HMASTERPORT)&((FilterInstance *)hMasterFilterInstance)->port; + } + /////////////////////////////////////////////////////////////// HUB_ROUTINES_A hubRoutines = { sizeof(HUB_ROUTINES_A), *************** *** 295,298 **** --- 306,310 ---- timer_cancel, timer_delete, + filter_port, }; /////////////////////////////////////////////////////////////// Index: filters.h =================================================================== RCS file: /cvsroot/com0com/hub4com/filters.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** filters.h 24 Nov 2008 12:36:59 -0000 1.7 --- filters.h 2 Feb 2009 15:21:42 -0000 1.8 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.8 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.7 2008/11/24 12:36:59 vfrolov * Changed plugin API *************** *** 49,59 **** class ComHub; class Filter; ! class FilterMethod; class HubMsg; /////////////////////////////////////////////////////////////// typedef vector<Filter*> FilterArray; ! typedef vector<FilterMethod*> FilterMethodArray; ! typedef map<Port *, FilterMethodArray*> PortFiltersMap; ! typedef set<Port *> SetOfPorts; /////////////////////////////////////////////////////////////// class Filters --- 52,61 ---- class ComHub; class Filter; ! class FilterInstance; class HubMsg; /////////////////////////////////////////////////////////////// typedef vector<Filter*> FilterArray; ! typedef vector<FilterInstance*> FilterInstanceArray; ! typedef map<Port *, FilterInstanceArray*> PortFiltersMap; /////////////////////////////////////////////////////////////// class Filters *************** *** 73,77 **** BOOL addInMethod, BOOL addOutMethod, ! const SetOfPorts *pOutMethodSrcPorts); void Report() const; BOOL InMethod( --- 75,79 ---- BOOL addInMethod, BOOL addOutMethod, ! const set<Port *> *pOutMethodSrcPorts); void Report() const; BOOL InMethod( *************** *** 85,88 **** --- 87,97 ---- private: + static BOOL Filters::InMethod( + Port *pFromPort, + const FilterInstanceArray::const_iterator &i, + const FilterInstanceArray::const_iterator &iEnd, + HubMsg *pInMsg, + HubMsg **ppEchoMsg); + const ComHub &hub; FilterArray allFilters; Index: hub4com.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/hub4com.cpp,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** hub4com.cpp 1 Dec 2008 17:14:52 -0000 1.20 --- hub4com.cpp 2 Feb 2009 15:21:42 -0000 1.21 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2006-2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2006-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.21 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.20 2008/12/01 17:14:52 vfrolov * Implemented --fc-route and --no-default-fc-route options *************** *** 391,395 **** char *pList = STRTOK_R(NULL, ")", &pSave2); ! SetOfPorts *pSrcPorts = NULL; if (pList) { --- 394,398 ---- char *pList = STRTOK_R(NULL, ")", &pSave2); ! set<Port *> *pSrcPorts = NULL; if (pList) { *************** *** 407,411 **** if (StrToInt(p, &i) && i >= 0 && (unsigned)i < hub.NumPorts()) { if (!pSrcPorts) { ! pSrcPorts = new SetOfPorts; if (!pSrcPorts) { --- 410,414 ---- if (StrToInt(p, &i) && i >= 0 && (unsigned)i < hub.NumPorts()) { if (!pSrcPorts) { ! pSrcPorts = new set<Port *>; if (!pSrcPorts) { Index: filters.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/filters.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** filters.cpp 24 Nov 2008 12:36:59 -0000 1.7 --- filters.cpp 2 Feb 2009 15:21:42 -0000 1.8 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.8 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.7 2008/11/24 12:36:59 vfrolov * Changed plugin API *************** *** 55,76 **** /////////////////////////////////////////////////////////////// ! class FilterMethod { ! public: ! FilterMethod(const Filter &_filter, BOOL _isInMethod, const SetOfPorts *_pSrcPorts) ! : filter(_filter), ! isInMethod(_isInMethod), ! pSrcPorts(_pSrcPorts) {} ! ! ~FilterMethod() { ! if (pSrcPorts) ! delete pSrcPorts; ! } ! ! const Filter &filter; ! const BOOL isInMethod; ! const SetOfPorts *const pSrcPorts; ! }; ! /////////////////////////////////////////////////////////////// ! typedef pair<Port *, FilterMethodArray*> PortFilters; /////////////////////////////////////////////////////////////// Filters::~Filters() --- 58,62 ---- /////////////////////////////////////////////////////////////// ! typedef pair<Port *, FilterInstanceArray*> PortFilters; /////////////////////////////////////////////////////////////// Filters::~Filters() *************** *** 78,82 **** for (PortFiltersMap::const_iterator iPort = portFilters.begin() ; iPort != portFilters.end() ; iPort++) { if (iPort->second) { ! for (FilterMethodArray::const_iterator i = iPort->second->begin() ; i != iPort->second->end() ; i++) { if (*i) delete *i; --- 64,68 ---- for (PortFiltersMap::const_iterator iPort = portFilters.begin() ; iPort != portFilters.end() ; iPort++) { if (iPort->second) { ! for (FilterInstanceArray::const_iterator i = iPort->second->begin() ; i != iPort->second->end() ; i++) { if (*i) delete *i; *************** *** 99,126 **** const char *pArgs) { - if (!ROUTINE_IS_VALID(pFltRoutines, pCreate)) { - cerr << "No create routine for filter " << pFilterName << endl; - return FALSE; - } - - int argc; - const char **argv; - void *pTmpArgs; - - CreateArgsVector(pFilterName, pArgs, &argc, &argv, &pTmpArgs); - - HFILTER hFilter = pFltRoutines->pCreate(hConfig, argc, argv); - - FreeArgsVector(argv, pTmpArgs); - - if (!hFilter) { - cerr << "Can't create filter " << pFilterName << endl; - return FALSE; - } - Filter *pFilter = new Filter( pFilterGroup, pFilterName, ! hFilter, ROUTINE_GET(pFltRoutines, pInMethod), ROUTINE_GET(pFltRoutines, pOutMethod)); --- 85,92 ---- const char *pArgs) { Filter *pFilter = new Filter( pFilterGroup, pFilterName, ! ROUTINE_GET(pFltRoutines, pCreateInstance), ROUTINE_GET(pFltRoutines, pInMethod), ROUTINE_GET(pFltRoutines, pOutMethod)); *************** *** 131,141 **** } ! allFilters.push_back(pFilter); ! if (ROUTINE_IS_VALID(pFltRoutines, pInit)) { ! if (!ROUTINE_GET(pFltRoutines, pInit)(hFilter, HMASTERFILTER(pFilter))) return FALSE; } return TRUE; } --- 97,122 ---- } ! if (ROUTINE_IS_VALID(pFltRoutines, pCreate)) { ! int argc; ! const char **argv; ! void *pTmpArgs; ! CreateArgsVector(pFilterName, pArgs, &argc, &argv, &pTmpArgs); ! ! HFILTER hFilter = pFltRoutines->pCreate((HMASTERFILTER)pFilter, hConfig, argc, argv); ! ! FreeArgsVector(argv, pTmpArgs); ! ! if (!hFilter) { ! cerr << "Can't create filter " << pFilterName << endl; ! delete pFilter; return FALSE; + } + + pFilter->hFilter = hFilter; } + allFilters.push_back(pFilter); + return TRUE; } *************** *** 146,151 **** BOOL addInMethod, BOOL addOutMethod, ! const SetOfPorts *pOutMethodSrcPorts) { PortFiltersMap::iterator iPair = portFilters.find(pPort); --- 127,135 ---- BOOL addInMethod, BOOL addOutMethod, ! const set<Port *> *pOutMethodSrcPorts) { + _ASSERTE(pPort != NULL); + _ASSERTE(pGroup != NULL); + PortFiltersMap::iterator iPair = portFilters.find(pPort); *************** *** 162,166 **** if (!iPair->second) { ! iPair->second = new FilterMethodArray; if (!iPair->second) { --- 146,150 ---- if (!iPair->second) { ! iPair->second = new FilterInstanceArray; if (!iPair->second) { *************** *** 174,193 **** for (FilterArray::const_iterator i = allFilters.begin() ; i != allFilters.end() ; i++) { if (*i && (*i)->group == pGroup) { ! if (addInMethod && (*i)->pInMethod) { ! FilterMethod *pFilterMethod = new FilterMethod(*(*i), TRUE, NULL); ! ! if (!pFilterMethod) { ! cerr << "No enough memory." << endl; ! return FALSE; ! } ! ! iPair->second->push_back(pFilterMethod); ! } ! ! if (addOutMethod && (*i)->pOutMethod) { ! const SetOfPorts *pSrcPorts; if (pOutMethodSrcPorts) { ! pSrcPorts = new SetOfPorts(*pOutMethodSrcPorts); if (!pSrcPorts) { --- 158,166 ---- for (FilterArray::const_iterator i = allFilters.begin() ; i != allFilters.end() ; i++) { if (*i && (*i)->group == pGroup) { ! if ((addInMethod && (*i)->pInMethod) || (addOutMethod && (*i)->pOutMethod)) { ! const set<Port *> *pSrcPorts; if (pOutMethodSrcPorts) { ! pSrcPorts = new set<Port *>(*pOutMethodSrcPorts); if (!pSrcPorts) { *************** *** 199,210 **** } ! FilterMethod *pFilterMethod = new FilterMethod(*(*i), FALSE, pSrcPorts); ! if (!pFilterMethod) { cerr << "No enough memory." << endl; return FALSE; } ! iPair->second->push_back(pFilterMethod); } --- 172,199 ---- } ! FilterInstance *pFilterInstance = new FilterInstance(*(*i), *pPort, addInMethod, addOutMethod, pSrcPorts); ! if (!pFilterInstance) { cerr << "No enough memory." << endl; + + if (pSrcPorts) + delete pSrcPorts; + return FALSE; } ! if ((*i)->pCreateInstance) { ! HFILTERINSTANCE hFilterInstance = (*i)->pCreateInstance((HMASTERFILTERINSTANCE)pFilterInstance); ! ! if (!hFilterInstance) { ! cerr << "Can't create instance of filter " << (*i)->name << " for port " << pPort->Name() << endl; ! delete pFilterInstance; ! return FALSE; ! } ! ! pFilterInstance->hFilterInstance = hFilterInstance; ! } ! ! iPair->second->push_back(pFilterInstance); } *************** *** 252,260 **** bufs[2] << "/<-"; ! FilterMethodArray *pFilters = iPort->second; if (pFilters) { ! for (FilterMethodArray::const_iterator i = pFilters->begin() ; i != pFilters->end() ; i++) { ! if ((*i)->isInMethod) { bufs[0] << ">{" << (*i)->filter.name << ".IN" << "}-"; string::size_type len = (*i)->filter.name.length(); --- 241,249 ---- bufs[2] << "/<-"; ! FilterInstanceArray *pFilters = iPort->second; if (pFilters) { ! for (FilterInstanceArray::const_iterator i = pFilters->begin() ; i != pFilters->end() ; i++) { ! if ((*i)->pInMethod) { bufs[0] << ">{" << (*i)->filter.name << ".IN" << "}-"; string::size_type len = (*i)->filter.name.length(); *************** *** 269,277 **** bufs[1] << "/"; bufs[2] << "-"; ! } else { bufs[2] << "{" << (*i)->filter.name << ".OUT"; if ((*i)->pSrcPorts) { bufs[2] << "("; ! for (SetOfPorts::const_iterator iSrc = (*i)->pSrcPorts->begin() ; iSrc != (*i)->pSrcPorts->end() ; iSrc++) { --- 258,268 ---- bufs[1] << "/"; bufs[2] << "-"; ! } ! ! if ((*i)->pOutMethod) { bufs[2] << "{" << (*i)->filter.name << ".OUT"; if ((*i)->pSrcPorts) { bufs[2] << "("; ! for (set<Port *>::const_iterator iSrc = (*i)->pSrcPorts->begin() ; iSrc != (*i)->pSrcPorts->end() ; iSrc++) { *************** *** 319,326 **** } /////////////////////////////////////////////////////////////// ! static BOOL InMethod( Port *pFromPort, ! const FilterMethodArray::const_iterator &i, ! const FilterMethodArray::const_iterator &iEnd, HubMsg *pInMsg, HubMsg **ppEchoMsg) --- 310,317 ---- } /////////////////////////////////////////////////////////////// ! BOOL Filters::InMethod( Port *pFromPort, ! const FilterInstanceArray::const_iterator &i, ! const FilterInstanceArray::const_iterator &iEnd, HubMsg *pInMsg, HubMsg **ppEchoMsg) *************** *** 329,337 **** HubMsg *pEchoMsg = NULL; ! if ((*i)->isInMethod) { ! FILTER_IN_METHOD *pInMethod = (*i)->filter.pInMethod; ! HFILTER hFilter = (*i)->filter.hFilter; ! HubMsg *pNextMsg = pInMsg; --- 320,328 ---- HubMsg *pEchoMsg = NULL; + HFILTER hFilter = (*i)->filter.hFilter; + HFILTERINSTANCE hFilterInstance = (*i)->hFilterInstance; ! if ((*i)->pInMethod) { ! FILTER_IN_METHOD *pInMethod = (*i)->pInMethod; HubMsg *pNextMsg = pInMsg; *************** *** 341,347 **** HUB_MSG *pEchoMsgPart = NULL; ! if (!pInMethod(hFilter, (HMASTERPORT)pFromPort, pCurMsg, &pEchoMsgPart)) { if (pEchoMsgPart) delete (HubMsg *)pEchoMsgPart; return FALSE; } --- 332,342 ---- HUB_MSG *pEchoMsgPart = NULL; ! if (!pInMethod(hFilter, hFilterInstance, pCurMsg, &pEchoMsgPart)) { if (pEchoMsgPart) delete (HubMsg *)pEchoMsgPart; + + if (pEchoMsg) + delete pEchoMsg; + return FALSE; } *************** *** 357,361 **** } ! const FilterMethodArray::const_iterator iNext = i + 1; if (iNext != iEnd) { --- 352,356 ---- } ! const FilterInstanceArray::const_iterator iNext = i + 1; if (iNext != iEnd) { *************** *** 364,378 **** } ! if (pEchoMsg) { ! if (*ppEchoMsg) ! pEchoMsg->Merge(*ppEchoMsg); ! ! *ppEchoMsg = pEchoMsg; ! } ! ! if (!(*i)->isInMethod) { ! FILTER_OUT_METHOD *pOutMethod = (*i)->filter.pOutMethod; ! HFILTER hFilter = (*i)->filter.hFilter; ! HubMsg *pNextMsg = *ppEchoMsg; --- 359,364 ---- } ! if ((*i)->pOutMethod) { ! FILTER_OUT_METHOD *pOutMethod = (*i)->pOutMethod; HubMsg *pNextMsg = *ppEchoMsg; *************** *** 380,388 **** pNextMsg = pNextMsg->Next(); ! if (!pOutMethod(hFilter, (HMASTERPORT)pFromPort, (HMASTERPORT)pFromPort, pCurMsg)) return FALSE; } } return TRUE; } --- 366,385 ---- pNextMsg = pNextMsg->Next(); ! if (!pOutMethod(hFilter, hFilterInstance, (HMASTERPORT)pFromPort, pCurMsg)) { ! if (pEchoMsg) ! delete pEchoMsg; ! return FALSE; + } } } + if (pEchoMsg) { + if (*ppEchoMsg) + pEchoMsg->Merge(*ppEchoMsg); + + *ppEchoMsg = pEchoMsg; + } + return TRUE; } *************** *** 400,412 **** return TRUE; ! FilterMethodArray *pFilters = iPair->second; if (!pFilters) return TRUE; ! const FilterMethodArray::const_iterator i = pFilters->begin(); if (i != pFilters->end()) { ! if (!::InMethod(pFromPort, i, pFilters->end(), pInMsg, ppEchoMsg)) return FALSE; } --- 397,409 ---- return TRUE; ! FilterInstanceArray *pFilters = iPair->second; if (!pFilters) return TRUE; ! const FilterInstanceArray::const_iterator i = pFilters->begin(); if (i != pFilters->end()) { ! if (!InMethod(pFromPort, i, pFilters->end(), pInMsg, ppEchoMsg)) return FALSE; } *************** *** 425,439 **** return TRUE; ! FilterMethodArray *pFilters = iPair->second; if (!pFilters) return TRUE; ! for (FilterMethodArray::const_reverse_iterator i = pFilters->rbegin() ; i != pFilters->rend() ; i++) { ! if (!(*i)->isInMethod && (!(*i)->pSrcPorts || (*i)->pSrcPorts->find(pFromPort) != (*i)->pSrcPorts->end())) { ! FILTER_OUT_METHOD *pOutMethod = (*i)->filter.pOutMethod; HFILTER hFilter = (*i)->filter.hFilter; HubMsg *pNextMsg = pOutMsg; --- 422,437 ---- return TRUE; ! FilterInstanceArray *pFilters = iPair->second; if (!pFilters) return TRUE; ! for (FilterInstanceArray::const_reverse_iterator i = pFilters->rbegin() ; i != pFilters->rend() ; i++) { ! if ((*i)->pOutMethod && (!(*i)->pSrcPorts || (*i)->pSrcPorts->find(pFromPort) != (*i)->pSrcPorts->end())) { ! FILTER_OUT_METHOD *pOutMethod = (*i)->pOutMethod; HFILTER hFilter = (*i)->filter.hFilter; + HFILTERINSTANCE hFilterInstance = (*i)->hFilterInstance; HubMsg *pNextMsg = pOutMsg; *************** *** 442,446 **** pNextMsg = pNextMsg->Next(); ! if (!pOutMethod(hFilter, (HMASTERPORT)pFromPort, (HMASTERPORT)pToPort, pCurMsg)) return FALSE; } --- 440,444 ---- pNextMsg = pNextMsg->Next(); ! if (!pOutMethod(hFilter, hFilterInstance, (HMASTERPORT)pFromPort, pCurMsg)) return FALSE; } |
From: Vyacheslav F. <vf...@us...> - 2009-02-02 15:21:48
|
Update of /cvsroot/com0com/hub4com/plugins/pin2con In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27344/plugins/pin2con Modified Files: filter.cpp precomp.h Log Message: Optimized filter's API Index: precomp.h =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/pin2con/precomp.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** precomp.h 2 Apr 2008 10:33:23 -0000 1.1 --- precomp.h 2 Feb 2009 15:21:42 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.1 2008/04/02 10:33:23 vfrolov * Initial revision *************** *** 32,36 **** #include <crtdbg.h> - #include <map> #include <iostream> --- 35,38 ---- Index: filter.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/pin2con/filter.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** filter.cpp 22 Dec 2008 09:40:46 -0000 1.15 --- filter.cpp 2 Feb 2009 15:21:42 -0000 1.16 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.16 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.15 2008/12/22 09:40:46 vfrolov * Optimized message switching *************** *** 89,96 **** #endif /* _DEBUG */ /////////////////////////////////////////////////////////////// ! static ROUTINE_MSG_INSERT_VAL *pMsgInsertVal = NULL; ! static ROUTINE_MSG_REPLACE_NONE *pMsgReplaceNone = NULL; ! static ROUTINE_PORT_NAME_A *pPortName = NULL; ! static ROUTINE_FILTER_NAME_A *pFilterName = NULL; /////////////////////////////////////////////////////////////// const char *GetParam(const char *pArg, const char *pPattern) --- 92,100 ---- #endif /* _DEBUG */ /////////////////////////////////////////////////////////////// ! static ROUTINE_MSG_INSERT_VAL *pMsgInsertVal; ! static ROUTINE_MSG_REPLACE_NONE *pMsgReplaceNone; ! static ROUTINE_PORT_NAME_A *pPortName; ! static ROUTINE_FILTER_NAME_A *pFilterName; ! static ROUTINE_FILTERPORT *pFilterPort; /////////////////////////////////////////////////////////////// const char *GetParam(const char *pArg, const char *pPattern) *************** *** 104,120 **** } /////////////////////////////////////////////////////////////// class State { public: ! State() : connect(FALSE) {} BOOL connect; }; /////////////////////////////////////////////////////////////// ! class Filter { public: ! Filter(int argc, const char *const argv[]); ! State *GetState(HMASTERPORT hPort); - void SetFilterName(const char *_pName) { pName = _pName; } const char *FilterName() const { return pName; } --- 108,132 ---- } /////////////////////////////////////////////////////////////// + class Valid { + public: + Valid() : isValid(TRUE) {} + void Invalidate() { isValid = FALSE; } + BOOL IsValid() const { return isValid; } + private: + BOOL isValid; + }; + /////////////////////////////////////////////////////////////// class State { public: ! State(HMASTERPORT hMasterPort) : pName(pPortName(hMasterPort)), connect(FALSE) {} + const char *const pName; BOOL connect; }; /////////////////////////////////////////////////////////////// ! class Filter : public Valid { public: ! Filter(const char *_pName, int argc, const char *const argv[]); const char *FilterName() const { return pName; } *************** *** 124,132 **** private: const char *pName; - - typedef map<HMASTERPORT, State*> PortsMap; - typedef pair<HMASTERPORT, State*> PortPair; - - PortsMap portsMap; }; --- 136,139 ---- *************** *** 142,149 **** }; ! Filter::Filter(int argc, const char *const argv[]) ! : pin(GO1_V2O_MODEM_STATUS(MODEM_STATUS_DSR)), ! negative(FALSE), ! pName(NULL) { for (const char *const *pArgs = &argv[1] ; argc > 1 ; pArgs++, argc--) { --- 149,156 ---- }; ! Filter::Filter(const char *_pName, int argc, const char *const argv[]) ! : pName(_pName), ! pin(GO1_V2O_MODEM_STATUS(MODEM_STATUS_DSR)), ! negative(FALSE) { for (const char *const *pArgs = &argv[1] ; argc > 1 ; pArgs++, argc--) { *************** *** 152,155 **** --- 159,163 ---- if (!pArg) { cerr << "Unknown option " << *pArgs << endl; + Invalidate(); continue; } *************** *** 172,201 **** } ! if (!pin) ! cerr << "Unknown pin " << pParam << endl; } else { ! cerr << "Unknown option " << pArg << endl; } } } - - State *Filter::GetState(HMASTERPORT hPort) - { - PortsMap::iterator iPair = portsMap.find(hPort); - - if (iPair == portsMap.end()) { - portsMap.insert(PortPair(hPort, NULL)); - - iPair = portsMap.find(hPort); - - if (iPair == portsMap.end()) - return NULL; - } - - if (!iPair->second) - iPair->second = new State(); - - return iPair->second; - } /////////////////////////////////////////////////////////////// static PLUGIN_TYPE CALLBACK GetPluginType() --- 180,193 ---- } ! if (!pin) { ! cerr << "Unknown pin " << pParam << " in " << *pArgs << endl; ! Invalidate(); ! } } else { ! cerr << "Unknown option " << *pArgs << endl; ! Invalidate(); } } } /////////////////////////////////////////////////////////////// static PLUGIN_TYPE CALLBACK GetPluginType() *************** *** 250,288 **** /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( HCONFIG /*hConfig*/, int argc, const char *const argv[]) { ! return (HFILTER)new Filter(argc, argv); } /////////////////////////////////////////////////////////////// ! static BOOL CALLBACK Init( ! HFILTER hFilter, ! HMASTERFILTER hMasterFilter) { _ASSERTE(hFilter != NULL); - _ASSERTE(hMasterFilter != NULL); ! ((Filter *)hFilter)->SetFilterName(pFilterName(hMasterFilter)); ! return TRUE; } /////////////////////////////////////////////////////////////// static HUB_MSG *InsertConnectState( Filter &filter, ! HMASTERPORT hFromPort, HUB_MSG *pInMsg, BOOL pinState) { - State *pState = filter.GetState(hFromPort); - - if (!pState) - return FALSE; - if (filter.negative) pinState = !pinState; ! if (pState->connect != pinState) ! pInMsg = pMsgInsertVal(pInMsg, HUB_MSG_TYPE_CONNECT, pState->connect = pinState); return pInMsg; --- 242,306 ---- /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( + HMASTERFILTER hMasterFilter, HCONFIG /*hConfig*/, int argc, const char *const argv[]) { ! _ASSERTE(hMasterFilter != NULL); ! ! Filter *pFilter = new Filter(pFilterName(hMasterFilter), argc, argv); ! ! if (!pFilter) { ! cerr << "No enough memory." << endl; ! exit(2); ! } ! ! if (!pFilter->IsValid()) { ! delete pFilter; ! return NULL; ! } ! ! return (HFILTER)pFilter; } /////////////////////////////////////////////////////////////// ! static void CALLBACK Delete( ! HFILTER hFilter) { _ASSERTE(hFilter != NULL); ! delete (Filter *)hFilter; ! } ! /////////////////////////////////////////////////////////////// ! static HFILTERINSTANCE CALLBACK CreateInstance( ! HMASTERFILTERINSTANCE hMasterFilterInstance) ! { ! _ASSERTE(hMasterFilterInstance != NULL); ! HMASTERPORT hMasterPort = pFilterPort(hMasterFilterInstance); ! ! _ASSERTE(hMasterPort != NULL); ! ! return (HFILTERINSTANCE)new State(hMasterPort); ! } ! /////////////////////////////////////////////////////////////// ! static void CALLBACK DeleteInstance( ! HFILTERINSTANCE hFilterInstance) ! { ! _ASSERTE(hFilterInstance != NULL); ! ! delete (State *)hFilterInstance; } /////////////////////////////////////////////////////////////// static HUB_MSG *InsertConnectState( Filter &filter, ! State &state, HUB_MSG *pInMsg, BOOL pinState) { if (filter.negative) pinState = !pinState; ! if (state.connect != pinState) ! pInMsg = pMsgInsertVal(pInMsg, HUB_MSG_TYPE_CONNECT, state.connect = pinState); return pInMsg; *************** *** 291,300 **** static BOOL CALLBACK InMethod( HFILTER hFilter, ! HMASTERPORT hFromPort, HUB_MSG *pInMsg, HUB_MSG **DEBUG_PARAM(ppEchoMsg)) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFromPort != NULL); _ASSERTE(pInMsg != NULL); _ASSERTE(ppEchoMsg != NULL); --- 309,318 ---- static BOOL CALLBACK InMethod( HFILTER hFilter, ! HFILTERINSTANCE hFilterInstance, HUB_MSG *pInMsg, HUB_MSG **DEBUG_PARAM(ppEchoMsg)) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFilterInstance != NULL); _ASSERTE(pInMsg != NULL); _ASSERTE(ppEchoMsg != NULL); *************** *** 318,322 **** if (fail_options) { ! cerr << pPortName(hFromPort) << " WARNING: Requested by filter " << ((Filter *)hFilter)->FilterName() << " option(s) GO1_0x" << hex << fail_options << dec --- 336,340 ---- if (fail_options) { ! cerr << ((State *)hFilterInstance)->pName << " WARNING: Requested by filter " << ((Filter *)hFilter)->FilterName() << " option(s) GO1_0x" << hex << fail_options << dec *************** *** 338,342 **** break; ! pInMsg = InsertConnectState(*((Filter *)hFilter), hFromPort, pInMsg, ((pInMsg->u.val & pin) != 0)); break; --- 356,360 ---- break; ! pInMsg = InsertConnectState(*((Filter *)hFilter), *(State *)hFilterInstance, pInMsg, ((pInMsg->u.val & pin) != 0)); break; *************** *** 344,348 **** case HUB_MSG_T2N(HUB_MSG_TYPE_BREAK_STATUS): if (((Filter *)hFilter)->pin & GO1_BREAK_STATUS) ! pInMsg = InsertConnectState(*((Filter *)hFilter), hFromPort, pInMsg, pInMsg->u.val != 0); break; } --- 362,366 ---- case HUB_MSG_T2N(HUB_MSG_TYPE_BREAK_STATUS): if (((Filter *)hFilter)->pin & GO1_BREAK_STATUS) ! pInMsg = InsertConnectState(*((Filter *)hFilter), *(State *)hFilterInstance, pInMsg, pInMsg->u.val != 0); break; } *************** *** 360,364 **** NULL, // ConfigStop Create, ! Init, InMethod, NULL, // OutMethod --- 378,384 ---- NULL, // ConfigStop Create, ! Delete, ! CreateInstance, ! DeleteInstance, InMethod, NULL, // OutMethod *************** *** 377,381 **** !ROUTINE_IS_VALID(pHubRoutines, pMsgReplaceNone) || !ROUTINE_IS_VALID(pHubRoutines, pPortName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterName)) { return NULL; --- 397,402 ---- !ROUTINE_IS_VALID(pHubRoutines, pMsgReplaceNone) || !ROUTINE_IS_VALID(pHubRoutines, pPortName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterPort)) { return NULL; *************** *** 386,389 **** --- 407,411 ---- pPortName = pHubRoutines->pPortName; pFilterName = pHubRoutines->pFilterName; + pFilterPort = pHubRoutines->pFilterPort; return plugins; |
From: Vyacheslav F. <vf...@us...> - 2009-02-02 15:21:48
|
Update of /cvsroot/com0com/hub4com/plugins/lsrmap In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27344/plugins/lsrmap Modified Files: filter.cpp precomp.h Log Message: Optimized filter's API Index: precomp.h =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/lsrmap/precomp.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** precomp.h 16 Oct 2008 07:05:53 -0000 1.1 --- precomp.h 2 Feb 2009 15:21:42 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.1 2008/10/16 07:05:53 vfrolov * Initial revision *************** *** 31,35 **** #include <crtdbg.h> - #include <map> #include <iostream> --- 34,37 ---- Index: filter.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/lsrmap/filter.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** filter.cpp 22 Dec 2008 09:40:45 -0000 1.6 --- filter.cpp 2 Feb 2009 15:21:42 -0000 1.7 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.7 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.6 2008/12/22 09:40:45 vfrolov * Optimized message switching *************** *** 45,51 **** --- 48,61 ---- namespace FilterLsrMap { /////////////////////////////////////////////////////////////// + #ifndef _DEBUG + #define DEBUG_PARAM(par) + #else /* _DEBUG */ + #define DEBUG_PARAM(par) par + #endif /* _DEBUG */ + /////////////////////////////////////////////////////////////// static ROUTINE_MSG_INSERT_VAL *pMsgInsertVal; static ROUTINE_PORT_NAME_A *pPortName; static ROUTINE_FILTER_NAME_A *pFilterName; + static ROUTINE_FILTERPORT *pFilterPort; /////////////////////////////////////////////////////////////// const char *GetParam(const char *pArg, const char *pPattern) *************** *** 70,76 **** class Filter : public Valid { public: ! Filter(int argc, const char *const argv[]); - void SetFilterName(const char *_pName) { pName = _pName; } const char *FilterName() const { return pName; } --- 80,85 ---- class Filter : public Valid { public: ! Filter(const char *pName, int argc, const char *const argv[]); const char *FilterName() const { return pName; } *************** *** 81,87 **** }; ! Filter::Filter(int argc, const char *const argv[]) ! : lsrMask(LINE_STATUS_OE|LINE_STATUS_PE|LINE_STATUS_FE|LINE_STATUS_BI|LINE_STATUS_FIFOERR), ! pName(NULL) { for (const char *const *pArgs = &argv[1] ; argc > 1 ; pArgs++, argc--) { --- 90,96 ---- }; ! Filter::Filter(const char *_pName, int argc, const char *const argv[]) ! : pName(_pName), ! lsrMask(LINE_STATUS_OE|LINE_STATUS_PE|LINE_STATUS_FE|LINE_STATUS_BI|LINE_STATUS_FIFOERR) { for (const char *const *pArgs = &argv[1] ; argc > 1 ; pArgs++, argc--) { *************** *** 132,143 **** /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( HCONFIG /*hConfig*/, int argc, const char *const argv[]) { ! Filter *pFilter = new Filter(argc, argv); ! if (!pFilter) ! return NULL; if (!pFilter->IsValid()) { --- 141,157 ---- /////////////////////////////////////////////////////////////// static HFILTER CALLBACK Create( + HMASTERFILTER hMasterFilter, HCONFIG /*hConfig*/, int argc, const char *const argv[]) { ! _ASSERTE(hMasterFilter != NULL); ! Filter *pFilter = new Filter(pFilterName(hMasterFilter), argc, argv); ! ! if (!pFilter) { ! cerr << "No enough memory." << endl; ! exit(2); ! } if (!pFilter->IsValid()) { *************** *** 149,172 **** } /////////////////////////////////////////////////////////////// ! static BOOL CALLBACK Init( ! HFILTER hFilter, ! HMASTERFILTER hMasterFilter) { _ASSERTE(hFilter != NULL); - _ASSERTE(hMasterFilter != NULL); ! ((Filter *)hFilter)->SetFilterName(pFilterName(hMasterFilter)); ! return TRUE; } /////////////////////////////////////////////////////////////// static BOOL CALLBACK OutMethod( HFILTER hFilter, ! HMASTERPORT hFromPort, HMASTERPORT hToPort, HUB_MSG *pOutMsg) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFromPort != NULL); _ASSERTE(hToPort != NULL); _ASSERTE(pOutMsg != NULL); --- 163,200 ---- } /////////////////////////////////////////////////////////////// ! static void CALLBACK Delete( ! HFILTER hFilter) { _ASSERTE(hFilter != NULL); ! delete (Filter *)hFilter; ! } ! /////////////////////////////////////////////////////////////// ! static HFILTERINSTANCE CALLBACK CreateInstance( ! HMASTERFILTERINSTANCE hMasterFilterInstance) ! { ! _ASSERTE(hMasterFilterInstance != NULL); ! HMASTERPORT hMasterPort = pFilterPort(hMasterFilterInstance); ! ! _ASSERTE(hMasterPort != NULL); ! ! return (HFILTERINSTANCE)pPortName(hMasterPort); ! } ! /////////////////////////////////////////////////////////////// ! static void CALLBACK DeleteInstance( ! HFILTERINSTANCE DEBUG_PARAM(hFilterInstance)) ! { ! _ASSERTE(hFilterInstance != NULL); } /////////////////////////////////////////////////////////////// static BOOL CALLBACK OutMethod( HFILTER hFilter, ! HFILTERINSTANCE hFilterInstance, HMASTERPORT hToPort, HUB_MSG *pOutMsg) { _ASSERTE(hFilter != NULL); ! _ASSERTE(hFilterInstance != NULL); _ASSERTE(hToPort != NULL); _ASSERTE(pOutMsg != NULL); *************** *** 195,199 **** if (fail_options) { ! cerr << pPortName(hFromPort) << " WARNING: Requested by filter " << ((Filter *)hFilter)->FilterName() << " for port " << pPortName(hToPort) --- 223,227 ---- if (fail_options) { ! cerr << (const char *)hFilterInstance << " WARNING: Requested by filter " << ((Filter *)hFilter)->FilterName() << " for port " << pPortName(hToPort) *************** *** 227,231 **** NULL, // ConfigStop Create, ! Init, NULL, // InMethod OutMethod, --- 255,261 ---- NULL, // ConfigStop Create, ! Delete, ! CreateInstance, ! DeleteInstance, NULL, // InMethod OutMethod, *************** *** 243,247 **** if (!ROUTINE_IS_VALID(pHubRoutines, pMsgInsertVal) || !ROUTINE_IS_VALID(pHubRoutines, pPortName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterName)) { return NULL; --- 273,278 ---- if (!ROUTINE_IS_VALID(pHubRoutines, pMsgInsertVal) || !ROUTINE_IS_VALID(pHubRoutines, pPortName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterPort)) { return NULL; *************** *** 251,254 **** --- 282,286 ---- pPortName = pHubRoutines->pPortName; pFilterName = pHubRoutines->pFilterName; + pFilterPort = pHubRoutines->pFilterPort; return plugins; |
From: Vyacheslav F. <vf...@us...> - 2009-02-02 15:21:48
|
Update of /cvsroot/com0com/hub4com/plugins/telnet In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27344/plugins/telnet Modified Files: filter.cpp precomp.h Log Message: Optimized filter's API Index: precomp.h =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/telnet/precomp.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** precomp.h 28 Mar 2008 16:04:47 -0000 1.1 --- precomp.h 2 Feb 2009 15:21:43 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2009/02/02 15:21:43 vfrolov + * Optimized filter's API + * * Revision 1.1 2008/03/28 16:04:47 vfrolov * Initial revision *************** *** 34,38 **** #include <string> #include <vector> - #include <map> #include <iostream> --- 37,40 ---- Index: filter.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/telnet/filter.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** filter.cpp 26 Jan 2009 15:07:52 -0000 1.15 --- filter.cpp 2 Feb 2009 15:21:42 -0000 1.16 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.16 2009/02/02 15:21:42 vfrolov + * Optimized filter's API + * * Revision 1.15 2009/01/26 15:07:52 vfrolov * Implemented --keep-active option *************** *** 81,84 **** [...984 lines suppressed...] !ROUTINE_IS_VALID(pHubRoutines, pTimerCreate) || !ROUTINE_IS_VALID(pHubRoutines, pTimerSet) || ! !ROUTINE_IS_VALID(pHubRoutines, pTimerDelete)) { return NULL; --- 893,898 ---- !ROUTINE_IS_VALID(pHubRoutines, pTimerCreate) || !ROUTINE_IS_VALID(pHubRoutines, pTimerSet) || ! !ROUTINE_IS_VALID(pHubRoutines, pTimerDelete) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterPort)) { return NULL; *************** *** 961,964 **** --- 909,913 ---- pTimerSet = pHubRoutines->pTimerSet; pTimerDelete = pHubRoutines->pTimerDelete; + pFilterPort = pHubRoutines->pFilterPort; return plugins; |
From: Vyacheslav F. <vf...@us...> - 2009-01-29 14:54:20
|
Update of /cvsroot/com0com/hub4com In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv11541 Modified Files: plugins.cpp Log Message: Fixed failure if pInitProc() returns NULL Index: plugins.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** plugins.cpp 24 Nov 2008 12:36:59 -0000 1.5 --- plugins.cpp 29 Jan 2009 14:54:05 -0000 1.6 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.6 2009/01/29 14:54:05 vfrolov + * Fixed failure if pInitProc() returns NULL + * * Revision 1.5 2008/11/24 12:36:59 vfrolov * Changed plugin API *************** *** 274,278 **** if (!hDll) { ! cerr << "Can't load " << pathPlugin << endl; return; } --- 277,281 ---- if (!hDll) { ! cerr << "WARNING: Can't load " << pathPlugin << endl; return; } *************** *** 286,290 **** if (!pInitProc) { ! cerr << "No procedure " << PLUGIN_INIT_PROC_NAME_A << " in " << pathPlugin << endl; FreeLibrary(hDll); return; --- 289,293 ---- if (!pInitProc) { ! cerr << "WARNING: No procedure " << PLUGIN_INIT_PROC_NAME_A << " in " << pathPlugin << endl; FreeLibrary(hDll); return; *************** *** 320,327 **** PluginArray &pluginArray) { ! for (const PLUGIN_ROUTINES_A *const *ppPlgRoutines = pInitProc(&hubRoutines) ; ! *ppPlgRoutines ; ! *ppPlgRoutines++) ! { PLUGIN_TYPE type = ROUTINE_IS_VALID(*ppPlgRoutines, pGetPluginType) ? (*ppPlgRoutines)->pGetPluginType() : --- 323,334 ---- PluginArray &pluginArray) { ! const PLUGIN_ROUTINES_A *const *ppPlgRoutines = pInitProc(&hubRoutines); ! ! if (!ppPlgRoutines) { ! cerr << "WARNING: Can't initialize " << GetModulePath(hDll, TRUE) << endl; ! return; ! } ! ! for ( ; *ppPlgRoutines ; *ppPlgRoutines++) { PLUGIN_TYPE type = ROUTINE_IS_VALID(*ppPlgRoutines, pGetPluginType) ? (*ppPlgRoutines)->pGetPluginType() : *************** *** 329,333 **** if (type == PLUGIN_TYPE_INVALID) { ! cerr << "Found module with invalid type in " << GetModulePath(hDll, TRUE) << endl; continue; } --- 336,340 ---- if (type == PLUGIN_TYPE_INVALID) { ! cerr << "WARNING: Found module with invalid type in " << GetModulePath(hDll, TRUE) << endl; continue; } *************** *** 348,352 **** if (iPair == plugins.end()) { ! cerr << "Can't add module type " << type2str(type) << endl; delete pPlugin; continue; --- 355,359 ---- if (iPair == plugins.end()) { ! cerr << "WARNING: Can't add module type " << type2str(type) << endl; delete pPlugin; continue; |
From: Vyacheslav F. <vf...@us...> - 2009-01-26 15:10:33
|
Update of /cvsroot/com0com/hub4com/examples In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv30154 Modified Files: com2tcp-rfc2217.bat Log Message: Implemented --keep-active option Index: com2tcp-rfc2217.bat =================================================================== RCS file: /cvsroot/com0com/hub4com/examples/com2tcp-rfc2217.bat,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** com2tcp-rfc2217.bat 11 Dec 2008 13:23:11 -0000 1.5 --- com2tcp-rfc2217.bat 26 Jan 2009 15:10:27 -0000 1.6 *************** *** 51,54 **** --- 51,60 ---- :END_OPTION_CONNECT + IF /I "%OPTION%" NEQ "--keep-active" GOTO END_OPTION_KEEP_ACTIVE + SET TCP_TELNET_OPTIONS=%TCP_TELNET_OPTIONS% --keep-active=%~1 + SHIFT /1 + GOTO BEGIN_PARSE_OPTIONS + :END_OPTION_KEEP_ACTIVE + GOTO USAGE :END_PARSE_OPTIONS *************** *** 76,80 **** IF /I "%LC_CLIENT_MODE%" == "yes" GOTO SET_LC_CLIENT_MODE_OPTIONS ! SET TCP_TELNET_OPTIONS=:"--comport=server --suppress-echo=yes" SET TCP_LSRMAP=--create-filter=lsrmap,tcp,lsrmap SET TCP_PINMAP_OPTIONS=:"--cts=cts --dsr=dsr --dcd=dcd --ring=ring" --- 82,86 ---- IF /I "%LC_CLIENT_MODE%" == "yes" GOTO SET_LC_CLIENT_MODE_OPTIONS ! SET TCP_TELNET_OPTIONS=%TCP_TELNET_OPTIONS% --comport=server --suppress-echo=yes SET TCP_LSRMAP=--create-filter=lsrmap,tcp,lsrmap SET TCP_PINMAP_OPTIONS=:"--cts=cts --dsr=dsr --dcd=dcd --ring=ring" *************** *** 88,92 **** :SET_LC_CLIENT_MODE_OPTIONS ! SET TCP_TELNET_OPTIONS=:"--comport=client" SET TCP_PINMAP_OPTIONS=:"--rts=cts --dtr=dsr --break=break" SET TCP_LC_OPTIONS=:"--br=remote --lc=remote" --- 94,98 ---- :SET_LC_CLIENT_MODE_OPTIONS ! SET TCP_TELNET_OPTIONS=%TCP_TELNET_OPTIONS% --comport=client SET TCP_PINMAP_OPTIONS=:"--rts=cts --dtr=dsr --break=break" SET TCP_LC_OPTIONS=:"--br=remote --lc=remote" *************** *** 98,101 **** --- 104,111 ---- :END_SET_LC_MODE_OPTIONS + IF "%TCP_TELNET_OPTIONS%" == "" GOTO END_QUOTE_TCP_TELNET_OPTIONS + SET TCP_TELNET_OPTIONS=:"%TCP_TELNET_OPTIONS%" + :END_QUOTE_TCP_TELNET_OPTIONS + %TC% SET OPTIONS=%OPTIONS% --create-filter=trace,com,COM SET OPTIONS=%OPTIONS% --create-filter=escparse,com,parse *************** *** 142,145 **** --- 152,157 ---- ECHO action. By default the connection will be permanent ECHO as it's possible. + ECHO --keep-active ^<s^> - send NOP command every ^<s^> seconds to keep the + ECHO connection active if data is not transferred. ECHO --trace - enable trace output. ECHO --help - show this help. |
From: Vyacheslav F. <vf...@us...> - 2009-01-26 15:07:59
|
Update of /cvsroot/com0com/hub4com/plugins/telnet In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv29287 Modified Files: filter.cpp telnet.cpp telnet.h Log Message: Implemented --keep-active option Index: telnet.h =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/telnet/telnet.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** telnet.h 13 Nov 2008 07:44:12 -0000 1.4 --- telnet.h 26 Jan 2009 15:07:52 -0000 1.5 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2005-2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2005-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.5 2009/01/26 15:07:52 vfrolov + * Implemented --keep-active option + * * Revision 1.4 2008/11/13 07:44:12 vfrolov * Changed for staticaly linking *************** *** 54,57 **** --- 57,61 ---- void FlushEncodedStream(HUB_MSG **ppEchoMsg); HUB_MSG *Encode(HUB_MSG *pMsg); + void KeepActive(); public: Index: telnet.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/telnet/telnet.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** telnet.cpp 13 Nov 2008 07:44:12 -0000 1.5 --- telnet.cpp 26 Jan 2009 15:07:52 -0000 1.6 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2005-2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2005-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.6 2009/01/26 15:07:52 vfrolov + * Implemented --keep-active option + * * Revision 1.5 2008/11/13 07:44:12 vfrolov * Changed for staticaly linking *************** *** 162,165 **** --- 165,176 ---- } + void TelnetProtocol::KeepActive() + { + cout << name << " SEND: NOP" << endl; + + streamEncoded += (BYTE)cdIAC; + streamEncoded += (BYTE)cdNOP; + } + HUB_MSG *TelnetProtocol::Decode(HUB_MSG *pMsg) { Index: filter.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/telnet/filter.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** filter.cpp 23 Jan 2009 17:01:28 -0000 1.14 --- filter.cpp 26 Jan 2009 15:07:52 -0000 1.15 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.15 2009/01/26 15:07:52 vfrolov + * Implemented --keep-active option + * * Revision 1.14 2009/01/23 17:01:28 vfrolov * Fixed discarding of data if engine not started *************** *** 75,78 **** --- 78,84 ---- static ROUTINE_PORT_NAME_A *pPortName; static ROUTINE_FILTER_NAME_A *pFilterName; + static ROUTINE_TIMER_CREATE *pTimerCreate; + static ROUTINE_TIMER_SET *pTimerSet; + static ROUTINE_TIMER_DELETE *pTimerDelete; /////////////////////////////////////////////////////////////// #ifndef _DEBUG *************** *** 109,113 **** pinState(0), br(0), ! lc(0) { for (int iGo = 0 ; iGo < sizeof(goMask)/sizeof(goMask[0]) ; iGo++) --- 115,120 ---- pinState(0), br(0), ! lc(0), ! hKeepActiveTimer(NULL) { for (int iGo = 0 ; iGo < sizeof(goMask)/sizeof(goMask[0]) ; iGo++) *************** *** 133,136 **** --- 140,144 ---- DWORD br; DWORD lc; + HMASTERTIMER hKeepActiveTimer; }; /////////////////////////////////////////////////////////////// *************** *** 157,160 **** --- 165,170 ---- DWORD goMask[2]; + unsigned keepActive; + private: const char *pName; *************** *** 178,181 **** --- 188,192 ---- terminalType("UNKNOWN"), suppressEcho(FALSE), + keepActive(0), comport(comport_no) { *************** *** 207,211 **** break; default: ! cerr << "Unknown value in " << pArg << endl; Invalidate(); } --- 218,222 ---- break; default: ! cerr << "Unknown value in " << *pArgs << endl; Invalidate(); } *************** *** 221,230 **** break; default: ! cerr << "Unknown value in " << pArg << endl; Invalidate(); } } else { ! cerr << "Unknown option " << pArg << endl; Invalidate(); } --- 232,250 ---- break; default: ! cerr << "Unknown value in " << *pArgs << endl; Invalidate(); } } + else + if ((pParam = GetParam(pArg, "keep-active=")) != NULL) { + if (isdigit(*pParam)) { + keepActive = (unsigned)atol(pParam); + } else { + cerr << "Invalid value in " << *pArgs << endl; + Invalidate(); + } + } else { ! cerr << "Unknown option " << *pArgs << endl; Invalidate(); } *************** *** 382,385 **** --- 402,407 ---- << " remote side. Where <c> is y[es] or n[o] (no by" << endl << " default)." << endl + << " --keep-active=<s> - send NOP command every <s> seconds to keep the" << endl + << " connection active if data is not transferred." << endl << endl << "IN method input data stream description:" << endl *************** *** 547,550 **** --- 569,579 ---- if (!pInMsg->u.val) { + // CONNECT(FALSE) + + if (pState->hKeepActiveTimer) { + pTimerDelete(pState->hKeepActiveTimer); + pState->hKeepActiveTimer = NULL; + } + if (pState->pComPort) { if (pState->goMask[1] & GO1_BREAK_STATUS) { *************** *** 570,573 **** --- 599,604 ---- } + // CONNECT(TRUE) + TelnetProtocol *pTelnetProtocol = ((Filter *)hFilter)->CreateProtocol(pState, pPortName(hFromPort)); *************** *** 599,606 **** --- 630,673 ---- } + if (((Filter *)hFilter)->keepActive) { + _ASSERTE(pState->hKeepActiveTimer == NULL); + + pState->hKeepActiveTimer = pTimerCreate(); + + if (pState->hKeepActiveTimer) { + LARGE_INTEGER firstReportTime; + + firstReportTime.QuadPart = -10000000LL * ((Filter *)hFilter)->keepActive; + + pTimerSet(pState->hKeepActiveTimer, hFromPort, &firstReportTime, ((Filter *)hFilter)->keepActive * 1000L); + } + } + pTelnetProtocol->FlushEncodedStream(ppEchoMsg); break; } + case HUB_MSG_T2N(HUB_MSG_TYPE_TICK): { + HMASTERTIMER hTimer = (HMASTERTIMER)pInMsg->u.hVal; + + if (!hTimer) + break; + + State *pState = ((Filter *)hFilter)->GetState(hFromPort); + + if (!pState) + return FALSE; + + if (hTimer == pState->hKeepActiveTimer) { + TelnetProtocol *pTelnetProtocol = ((Filter *)hFilter)->GetProtocol(hFromPort); + + if (pTelnetProtocol) { + pTelnetProtocol->KeepActive(); + pTelnetProtocol->FlushEncodedStream(ppEchoMsg); + } + } + + break; + } } *************** *** 876,880 **** !ROUTINE_IS_VALID(pHubRoutines, pMsgInsertNone) || !ROUTINE_IS_VALID(pHubRoutines, pPortName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterName)) { return NULL; --- 943,950 ---- !ROUTINE_IS_VALID(pHubRoutines, pMsgInsertNone) || !ROUTINE_IS_VALID(pHubRoutines, pPortName) || ! !ROUTINE_IS_VALID(pHubRoutines, pFilterName) || ! !ROUTINE_IS_VALID(pHubRoutines, pTimerCreate) || ! !ROUTINE_IS_VALID(pHubRoutines, pTimerSet) || ! !ROUTINE_IS_VALID(pHubRoutines, pTimerDelete)) { return NULL; *************** *** 888,891 **** --- 958,964 ---- pPortName = pHubRoutines->pPortName; pFilterName = pHubRoutines->pFilterName; + pTimerCreate = pHubRoutines->pTimerCreate; + pTimerSet = pHubRoutines->pTimerSet; + pTimerDelete = pHubRoutines->pTimerDelete; return plugins; |
From: Vyacheslav F. <vf...@us...> - 2009-01-26 14:55:38
|
Update of /cvsroot/com0com/hub4com In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv21266 Modified Files: export.cpp timer.cpp timer.h Log Message: Added signature checking for Timer Index: export.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/export.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** export.cpp 23 Jan 2009 16:48:49 -0000 1.10 --- export.cpp 26 Jan 2009 14:55:29 -0000 1.11 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.11 2009/01/26 14:55:29 vfrolov + * Added signature checking for Timer + * * Revision 1.10 2009/01/23 16:48:49 vfrolov * Exported timer routines *************** *** 251,255 **** --- 254,260 ---- { _ASSERTE(hMasterTimer != NULL); + _ASSERTE(((Timer *)hMasterTimer)->IsValid()); _ASSERTE(hMasterPort != NULL); + _ASSERTE(((Port *)hMasterPort)->IsValid()); return ((Timer *)hMasterTimer)->Set((Port *)hMasterPort, pDueTime, period); *************** *** 259,262 **** --- 264,268 ---- { _ASSERTE(hMasterTimer != NULL); + _ASSERTE(((Timer *)hMasterTimer)->IsValid()); ((Timer *)hMasterTimer)->Cancel(); *************** *** 266,269 **** --- 272,276 ---- { _ASSERTE(hMasterTimer != NULL); + _ASSERTE(((Timer *)hMasterTimer)->IsValid()); delete ((Timer *)hMasterTimer); Index: timer.h =================================================================== RCS file: /cvsroot/com0com/hub4com/timer.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** timer.h 23 Jan 2009 16:46:32 -0000 1.1 --- timer.h 26 Jan 2009 14:55:29 -0000 1.2 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2009/01/26 14:55:29 vfrolov + * Added signature checking for Timer + * * Revision 1.1 2009/01/23 16:46:32 vfrolov * Initial revision *************** *** 31,34 **** --- 34,39 ---- class Port; /////////////////////////////////////////////////////////////// + #define TIMER_SIGNATURE 'h4cT' + /////////////////////////////////////////////////////////////// class Timer { *************** *** 40,44 **** void Cancel(); ! protected: static VOID CALLBACK TimerAPCProc( LPVOID pArg, --- 45,49 ---- void Cancel(); ! private: static VOID CALLBACK TimerAPCProc( LPVOID pArg, *************** *** 48,51 **** --- 53,64 ---- Port *pPort; HANDLE hTimer; + + #ifdef _DEBUG + private: + DWORD signature; + + public: + BOOL IsValid() { return signature == TIMER_SIGNATURE; } + #endif }; /////////////////////////////////////////////////////////////// Index: timer.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/timer.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** timer.cpp 23 Jan 2009 16:46:32 -0000 1.1 --- timer.cpp 26 Jan 2009 14:55:29 -0000 1.2 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2009/01/26 14:55:29 vfrolov + * Added signature checking for Timer + * * Revision 1.1 2009/01/23 16:46:32 vfrolov * Initial revision *************** *** 35,38 **** --- 38,45 ---- Timer::Timer() { + #ifdef _DEBUG + signature = TIMER_SIGNATURE; + #endif + hTimer = ::CreateWaitableTimer(NULL, FALSE, NULL); *************** *** 46,53 **** --- 53,66 ---- Timer::~Timer() { + _ASSERTE(signature == TIMER_SIGNATURE); + if (hTimer) { Cancel(); CloseHandle(hTimer); } + + #ifdef _DEBUG + signature = 0; + #endif } /////////////////////////////////////////////////////////////// *************** *** 57,60 **** --- 70,75 ---- DWORD /*dwTimerHighValue*/) { + _ASSERTE(((Timer *)pArg)->signature == TIMER_SIGNATURE); + HubMsg msg; *************** *** 67,70 **** --- 82,87 ---- BOOL Timer::Set(Port *_pPort, const LARGE_INTEGER *pDueTime, LONG period) { + _ASSERTE(signature == TIMER_SIGNATURE); + pPort = _pPort; *************** *** 84,87 **** --- 101,106 ---- void Timer::Cancel() { + _ASSERTE(signature == TIMER_SIGNATURE); + if (!::CancelWaitableTimer(hTimer)) { DWORD err = GetLastError(); |
From: Vyacheslav F. <vf...@us...> - 2009-01-23 17:01:34
|
Update of /cvsroot/com0com/hub4com/plugins/telnet In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv10080 Modified Files: filter.cpp Log Message: Fixed discarding of data if engine not started Index: filter.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/telnet/filter.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** filter.cpp 22 Dec 2008 09:40:46 -0000 1.13 --- filter.cpp 23 Jan 2009 17:01:28 -0000 1.14 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.14 2009/01/23 17:01:28 vfrolov + * Fixed discarding of data if engine not started + * * Revision 1.13 2008/12/22 09:40:46 vfrolov * Optimized message switching *************** *** 522,527 **** TelnetProtocol *pTelnetProtocol = ((Filter *)hFilter)->GetProtocol(hFromPort); ! if (!pTelnetProtocol) ! return FALSE; if (!pTelnetProtocol->Decode(pInMsg)) --- 525,535 ---- TelnetProtocol *pTelnetProtocol = ((Filter *)hFilter)->GetProtocol(hFromPort); ! if (!pTelnetProtocol) { ! // discard data ! if (!pMsgReplaceNone(pInMsg, HUB_MSG_TYPE_EMPTY)) ! return FALSE; ! ! break; ! } if (!pTelnetProtocol->Decode(pInMsg)) *************** *** 815,820 **** TelnetProtocol *pTelnetProtocol = ((Filter *)hFilter)->GetProtocol(hToPort); ! if (!pTelnetProtocol) ! return FALSE; if (!pTelnetProtocol->Encode(pOutMsg)) --- 823,833 ---- TelnetProtocol *pTelnetProtocol = ((Filter *)hFilter)->GetProtocol(hToPort); ! if (!pTelnetProtocol) { ! // discard data ! if (!pMsgReplaceNone(pOutMsg, HUB_MSG_TYPE_EMPTY)) ! return FALSE; ! ! break; ! } if (!pTelnetProtocol->Encode(pOutMsg)) |
From: Vyacheslav F. <vf...@us...> - 2009-01-23 16:55:16
|
Update of /cvsroot/com0com/hub4com/plugins/tcp In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv9541 Modified Files: comport.cpp import.h comport.h port.cpp Log Message: Utilized timer routines Index: comport.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/tcp/comport.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** comport.cpp 22 Dec 2008 09:40:46 -0000 1.13 --- comport.cpp 23 Jan 2009 16:55:05 -0000 1.14 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.14 2009/01/23 16:55:05 vfrolov + * Utilized timer routines + * * Revision 1.13 2008/12/22 09:40:46 vfrolov * Optimized message switching *************** *** 264,267 **** --- 267,293 ---- } + BOOL ComPort::FakeReadFilter(HUB_MSG *pInMsg) + { + _ASSERTE(pInMsg != NULL); + + switch (HUB_MSG_T2N(pInMsg->type)) { + case HUB_MSG_T2N(HUB_MSG_TYPE_TICK): { + HMASTERTIMER hTimer = (HMASTERTIMER)pInMsg->u.hVal; + + if (!hTimer) + break; + + if (hTimer == hReconnectTimer) { + if (CanConnect()) + StartConnect(); + } + + break; + } + } + + return pInMsg != NULL; + } + void ComPort::StartConnect() { *************** *** 514,526 **** } - static VOID CALLBACK TimerAPCProc( - LPVOID pArg, - DWORD /*dwTimerLowValue*/, - DWORD /*dwTimerHighValue*/) - { - if (((ComPort *)pArg)->CanConnect()) - ((ComPort *)pArg)->StartConnect(); - } - void ComPort::OnDisconnect() { --- 540,543 ---- *************** *** 562,566 **** if (reconnectTime > 0) { if (!hReconnectTimer) ! hReconnectTimer = ::CreateWaitableTimer(NULL, FALSE, NULL); if (hReconnectTimer) { --- 579,583 ---- if (reconnectTime > 0) { if (!hReconnectTimer) ! hReconnectTimer = pTimerCreate(); if (hReconnectTimer) { *************** *** 569,581 **** firstReportTime.QuadPart = -10000LL * reconnectTime; ! if (!::SetWaitableTimer(hReconnectTimer, &firstReportTime, 0, TimerAPCProc, this, FALSE)) { ! DWORD err = GetLastError(); ! ! cerr << "WARNING: SetWaitableTimer() - error=" << err << endl; ! } ! } else { ! DWORD err = GetLastError(); ! ! cerr << "WARNING: CreateWaitableTimer() - error=" << err << endl; } } --- 586,590 ---- firstReportTime.QuadPart = -10000LL * reconnectTime; ! pTimerSet(hReconnectTimer, hMasterPort, &firstReportTime, 0); } } Index: comport.h =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/tcp/comport.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** comport.h 1 Dec 2008 17:09:34 -0000 1.8 --- comport.h 23 Jan 2009 16:55:05 -0000 1.9 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.9 2009/01/23 16:55:05 vfrolov + * Utilized timer routines + * * Revision 1.8 2008/12/01 17:09:34 vfrolov * Improved write buffering *************** *** 85,88 **** --- 88,92 ---- BOOL Init(HMASTERPORT _hMasterPort); BOOL Start(); + BOOL FakeReadFilter(HUB_MSG *pInMsg); BOOL Write(HUB_MSG *pMsg); void OnWrite(WriteOverlapped *pOverlapped, DWORD len, DWORD done); *************** *** 118,122 **** int reconnectTime; ! HANDLE hReconnectTimer; string name; --- 122,126 ---- int reconnectTime; ! HMASTERTIMER hReconnectTimer; string name; Index: port.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/tcp/port.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** port.cpp 1 Dec 2008 17:09:34 -0000 1.11 --- port.cpp 23 Jan 2009 16:55:05 -0000 1.12 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.12 2009/01/23 16:55:05 vfrolov + * Utilized timer routines + * * Revision 1.11 2008/12/01 17:09:34 vfrolov * Improved write buffering *************** *** 271,274 **** --- 274,287 ---- } /////////////////////////////////////////////////////////////// + static BOOL CALLBACK FakeReadFilter( + HPORT hPort, + HUB_MSG *pMsg) + { + _ASSERTE(hPort != NULL); + _ASSERTE(pMsg != NULL); + + return ((ComPort *)hPort)->FakeReadFilter(pMsg); + } + /////////////////////////////////////////////////////////////// static BOOL CALLBACK Write( HPORT hPort, *************** *** 302,306 **** Init, Start, ! NULL, // FakeReadFilter Write, LostReport, --- 315,319 ---- Init, Start, ! FakeReadFilter, Write, LostReport, *************** *** 316,319 **** --- 329,334 ---- ROUTINE_BUF_APPEND *pBufAppend; ROUTINE_ON_READ *pOnRead; + ROUTINE_TIMER_CREATE *pTimerCreate; + ROUTINE_TIMER_SET *pTimerSet; /////////////////////////////////////////////////////////////// PLUGIN_INIT_A InitA; *************** *** 324,328 **** !ROUTINE_IS_VALID(pHubRoutines, pBufFree) || !ROUTINE_IS_VALID(pHubRoutines, pBufAppend) || ! !ROUTINE_IS_VALID(pHubRoutines, pOnRead)) { return NULL; --- 339,345 ---- !ROUTINE_IS_VALID(pHubRoutines, pBufFree) || !ROUTINE_IS_VALID(pHubRoutines, pBufAppend) || ! !ROUTINE_IS_VALID(pHubRoutines, pOnRead) || ! !ROUTINE_IS_VALID(pHubRoutines, pTimerCreate) || ! !ROUTINE_IS_VALID(pHubRoutines, pTimerSet)) { return NULL; *************** *** 333,336 **** --- 350,355 ---- pBufAppend = pHubRoutines->pBufAppend; pOnRead = pHubRoutines->pOnRead; + pTimerCreate = pHubRoutines->pTimerCreate; + pTimerSet = pHubRoutines->pTimerSet; WSADATA wsaData; Index: import.h =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/tcp/import.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** import.h 1 Dec 2008 17:09:34 -0000 1.5 --- import.h 23 Jan 2009 16:55:05 -0000 1.6 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.6 2009/01/23 16:55:05 vfrolov + * Utilized timer routines + * * Revision 1.5 2008/12/01 17:09:34 vfrolov * Improved write buffering *************** *** 45,48 **** --- 48,53 ---- extern ROUTINE_BUF_APPEND *pBufAppend; extern ROUTINE_ON_READ *pOnRead; + extern ROUTINE_TIMER_CREATE *pTimerCreate; + extern ROUTINE_TIMER_SET *pTimerSet; /////////////////////////////////////////////////////////////// |
From: Vyacheslav F. <vf...@us...> - 2009-01-23 16:48:56
|
Update of /cvsroot/com0com/hub4com In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv9167 Modified Files: export.cpp hub4com.vcproj Log Message: Exported timer routines Index: export.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/export.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** export.cpp 19 Dec 2008 18:23:05 -0000 1.9 --- export.cpp 23 Jan 2009 16:48:49 -0000 1.10 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.10 2009/01/23 16:48:49 vfrolov + * Exported timer routines + * * Revision 1.9 2008/12/19 18:23:05 vfrolov * Changed message type to 32 bit *************** *** 58,61 **** --- 61,65 ---- #include "hubmsg.h" #include "filter.h" + #include "timer.h" /////////////////////////////////////////////////////////////// *************** *** 230,233 **** --- 234,273 ---- } /////////////////////////////////////////////////////////////// + static HMASTERTIMER CALLBACK timer_create() + { + Timer *pTimer = new Timer(); + + if (!pTimer) + cerr << "No enough memory." << endl; + + return (HMASTERTIMER)pTimer; + } + /////////////////////////////////////////////////////////////// + static BOOL CALLBACK timer_set( + HMASTERTIMER hMasterTimer, + HMASTERPORT hMasterPort, + const LARGE_INTEGER *pDueTime, + LONG period) + { + _ASSERTE(hMasterTimer != NULL); + _ASSERTE(hMasterPort != NULL); + + return ((Timer *)hMasterTimer)->Set((Port *)hMasterPort, pDueTime, period); + } + /////////////////////////////////////////////////////////////// + static void CALLBACK timer_cancel(HMASTERTIMER hMasterTimer) + { + _ASSERTE(hMasterTimer != NULL); + + ((Timer *)hMasterTimer)->Cancel(); + } + /////////////////////////////////////////////////////////////// + static void CALLBACK timer_delete(HMASTERTIMER hMasterTimer) + { + _ASSERTE(hMasterTimer != NULL); + + delete ((Timer *)hMasterTimer); + } + /////////////////////////////////////////////////////////////// HUB_ROUTINES_A hubRoutines = { sizeof(HUB_ROUTINES_A), *************** *** 244,247 **** --- 284,291 ---- filter_name, on_read, + timer_create, + timer_set, + timer_cancel, + timer_delete, }; /////////////////////////////////////////////////////////////// Index: hub4com.vcproj =================================================================== RCS file: /cvsroot/com0com/hub4com/hub4com.vcproj,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** hub4com.vcproj 5 Dec 2008 18:05:21 -0000 1.10 --- hub4com.vcproj 23 Jan 2009 16:48:49 -0000 1.11 *************** *** 227,230 **** --- 227,234 ---- </File> <File + RelativePath=".\timer.h" + > + </File> + <File RelativePath=".\utils.h" > *************** *** 307,310 **** --- 311,318 ---- </File> <File + RelativePath=".\timer.cpp" + > + </File> + <File RelativePath=".\utils.cpp" > |
From: Vyacheslav F. <vf...@us...> - 2009-01-23 16:48:55
|
Update of /cvsroot/com0com/hub4com/plugins In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv9167/plugins Modified Files: plugins_api.h Log Message: Exported timer routines Index: plugins_api.h =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/plugins_api.h,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** plugins_api.h 19 Dec 2008 18:23:05 -0000 1.23 --- plugins_api.h 23 Jan 2009 16:48:49 -0000 1.24 *************** *** 2,6 **** * plugins_api.h * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * plugins_api.h * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 134,137 **** --- 134,138 ---- #define HUB_MSG_TYPE_PURGE_TX_IN (22 | HUB_MSG_UNION_TYPE_NONE) #define HUB_MSG_TYPE_PURGE_TX (23 | HUB_MSG_UNION_TYPE_NONE) + #define HUB_MSG_TYPE_TICK (24 | HUB_MSG_UNION_TYPE_HVAL) /*******************************************************************/ typedef struct _HUB_MSG { *************** *** 153,156 **** --- 154,158 ---- DECLARE_HANDLE(HMASTERPORT); DECLARE_HANDLE(HMASTERFILTER); + DECLARE_HANDLE(HMASTERTIMER); /*******************************************************************/ typedef BYTE *(CALLBACK ROUTINE_BUF_ALLOC)( *************** *** 194,197 **** --- 196,210 ---- HMASTERPORT hMasterPort, HUB_MSG *pMsg); + typedef HMASTERTIMER (CALLBACK ROUTINE_TIMER_CREATE)( + ); + typedef BOOL (CALLBACK ROUTINE_TIMER_SET)( + HMASTERTIMER hMasterTimer, + HMASTERPORT hMasterPort, + const LARGE_INTEGER *pDueTime, + LONG period); + typedef void (CALLBACK ROUTINE_TIMER_CANCEL)( + HMASTERTIMER hMasterTimer); + typedef void (CALLBACK ROUTINE_TIMER_DELETE)( + HMASTERTIMER hMasterTimer); /*******************************************************************/ typedef struct _HUB_ROUTINES_A { *************** *** 209,212 **** --- 222,229 ---- ROUTINE_FILTER_NAME_A *pFilterName; ROUTINE_ON_READ *pOnRead; + ROUTINE_TIMER_CREATE *pTimerCreate; + ROUTINE_TIMER_SET *pTimerSet; + ROUTINE_TIMER_CANCEL *pTimerCancel; + ROUTINE_TIMER_DELETE *pTimerDelete; } HUB_ROUTINES_A; /*******************************************************************/ |
From: Vyacheslav F. <vf...@us...> - 2009-01-23 16:48:54
|
Update of /cvsroot/com0com/hub4com/plugins/trace In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv9167/plugins/trace Modified Files: filter.cpp Log Message: Exported timer routines Index: filter.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/trace/filter.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** filter.cpp 22 Dec 2008 09:40:46 -0000 1.15 --- filter.cpp 23 Jan 2009 16:48:49 -0000 1.16 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2008-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.16 2009/01/23 16:48:49 vfrolov + * Exported timer routines + * * Revision 1.15 2008/12/22 09:40:46 vfrolov * Optimized message switching *************** *** 451,454 **** --- 454,458 ---- TOCODE2NAME(HUB_MSG_TYPE_, PURGE_TX_IN), TOCODE2NAME(HUB_MSG_TYPE_, PURGE_TX), + TOCODE2NAME(HUB_MSG_TYPE_, TICK), {0, NULL} }; |
From: Vyacheslav F. <vf...@us...> - 2009-01-23 16:46:40
|
Update of /cvsroot/com0com/hub4com In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv8996 Added Files: timer.cpp timer.h Log Message: Initial revision --- NEW FILE: timer.h --- /* * $Id: timer.h,v 1.1 2009/01/23 16:46:32 vfrolov Exp $ * * Copyright (c) 2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * $Log: timer.h,v $ * Revision 1.1 2009/01/23 16:46:32 vfrolov * Initial revision * */ #ifndef _TIMER_H #define _TIMER_H /////////////////////////////////////////////////////////////// class Port; /////////////////////////////////////////////////////////////// class Timer { public: Timer(); ~Timer(); BOOL Set(Port *_pPort, const LARGE_INTEGER *pDueTime, LONG period); void Cancel(); protected: static VOID CALLBACK TimerAPCProc( LPVOID pArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue); Port *pPort; HANDLE hTimer; }; /////////////////////////////////////////////////////////////// #endif // _TIMER_H --- NEW FILE: timer.cpp --- /* * $Id: timer.cpp,v 1.1 2009/01/23 16:46:32 vfrolov Exp $ * * Copyright (c) 2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * $Log: timer.cpp,v $ * Revision 1.1 2009/01/23 16:46:32 vfrolov * Initial revision * */ #include "precomp.h" #include "plugins/plugins_api.h" #include "timer.h" #include "comhub.h" #include "port.h" #include "hubmsg.h" /////////////////////////////////////////////////////////////// Timer::Timer() { hTimer = ::CreateWaitableTimer(NULL, FALSE, NULL); if (!hTimer) { DWORD err = GetLastError(); cerr << "WARNING: CreateWaitableTimer() - error=" << err << endl; } } /////////////////////////////////////////////////////////////// Timer::~Timer() { if (hTimer) { Cancel(); CloseHandle(hTimer); } } /////////////////////////////////////////////////////////////// VOID CALLBACK Timer::TimerAPCProc( LPVOID pArg, DWORD /*dwTimerLowValue*/, DWORD /*dwTimerHighValue*/) { HubMsg msg; msg.type = HUB_MSG_TYPE_TICK; msg.u.hVal = pArg; ((Timer *)pArg)->pPort->hub.OnFakeRead(((Timer *)pArg)->pPort, &msg); } /////////////////////////////////////////////////////////////// BOOL Timer::Set(Port *_pPort, const LARGE_INTEGER *pDueTime, LONG period) { pPort = _pPort; _ASSERTE(pPort != NULL); if (!::SetWaitableTimer(hTimer, pDueTime, period, TimerAPCProc, this, FALSE)) { DWORD err = GetLastError(); cerr << "WARNING: SetWaitableTimer() - error=" << err << endl; return FALSE; } return TRUE; } /////////////////////////////////////////////////////////////// void Timer::Cancel() { if (!::CancelWaitableTimer(hTimer)) { DWORD err = GetLastError(); cerr << "WARNING: CancelWaitableTimer() - error=" << err << endl; } } /////////////////////////////////////////////////////////////// |
From: Vyacheslav F. <vf...@us...> - 2009-01-12 13:16:28
|
Update of /cvsroot/com0com/com0com/NSIS In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27593 Modified Files: install.nsi Log Message: Added driver updating Index: install.nsi =================================================================== RCS file: /cvsroot/com0com/com0com/NSIS/install.nsi,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** install.nsi 12 Sep 2008 12:29:53 -0000 1.13 --- install.nsi 12 Jan 2009 13:16:20 -0000 1.14 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2006-2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2006-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.14 2009/01/12 13:16:20 vfrolov + * Added driver updating + * * Revision 1.13 2008/09/12 12:29:53 vfrolov * Added --silent option *************** *** 243,246 **** --- 246,258 ---- WriteUninstaller "uninstall.exe" + GetTempFileName $0 + + StrCpy $1 "" + IfSilent 0 +2 + StrCpy $1 "--silent" + + ExecWait "setupc.exe $1 --output $0 update" + !insertmacro MoveFileToDetails $0 + SectionEnd |
From: Vyacheslav F. <vf...@us...> - 2009-01-12 13:04:15
|
Update of /cvsroot/com0com/com0com/setupg In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv26879 Modified Files: Form1.h portprms.cpp portprms.h Log Message: Added red painting InUse portnames Index: portprms.h =================================================================== RCS file: /cvsroot/com0com/com0com/setupg/portprms.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** portprms.h 31 Oct 2007 10:16:55 -0000 1.1 --- portprms.h 12 Jan 2009 13:04:07 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2007 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2007-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,27 **** * * $Log$ * Revision 1.1 2007/10/31 10:16:55 vfrolov * Initial revision * - * */ --- 20,29 ---- * * $Log$ + * Revision 1.2 2009/01/12 13:04:07 vfrolov + * Added red painting InUse portnames + * * Revision 1.1 2007/10/31 10:16:55 vfrolov * Initial revision * */ *************** *** 57,64 **** --- 59,69 ---- void RemovePair(String ^keyPair); void ChangePair(String ^keyPair, PortPair ^pairChanges); + bool IsValidName(String ^name); private: String ^ParseLine(String ^line); + void LoadBusyNames(); + array<String ^> ^busyNames; System::Windows::Forms::Control ^parent; }; Index: Form1.h =================================================================== RCS file: /cvsroot/com0com/com0com/setupg/Form1.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Form1.h 4 May 2008 09:56:47 -0000 1.4 --- Form1.h 12 Jan 2009 13:04:07 -0000 1.5 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2007-2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2007-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.5 2009/01/12 13:04:07 vfrolov + * Added red painting InUse portnames + * * Revision 1.4 2008/05/04 09:56:47 vfrolov * Implemented HiddenMode option *************** *** 540,543 **** --- 543,555 ---- } + bool IsValidValue(String ^key, String ^value) { + if (key == "portname") { + if (!pairs->IsValidName(value)) + return false; + } + + return true; + } + ///////////////////////////////////////////////////////////////////// #define DeclareControlPair(controlClass, control) \ *************** *** 557,561 **** String ^value = GetControlValue(control##s[i])->ToUpper(); \ if (pairs[pairList->SelectedNode->Name][i][key] != value) { \ ! control##s[i]->ForeColor = Color::Blue; \ return; \ } \ --- 569,573 ---- String ^value = GetControlValue(control##s[i])->ToUpper(); \ if (pairs[pairList->SelectedNode->Name][i][key] != value) { \ ! control##s[i]->ForeColor = (IsValidValue(key, value) ? Color::Blue : Color::Red); \ return; \ } \ *************** *** 624,628 **** TreeNode ^pair; bool pairExpand; ! if (pairList->Nodes->ContainsKey(kvpPair.Key)) { pair = pairList->Nodes[kvpPair.Key]; --- 636,640 ---- TreeNode ^pair; bool pairExpand; ! if (pairList->Nodes->ContainsKey(kvpPair.Key)) { pair = pairList->Nodes[kvpPair.Key]; *************** *** 718,722 **** System::Windows::Forms::DialogResult res; ! res = MessageBox::Show(this, msg, "Apply", MessageBoxButtons::YesNoCancel); --- 730,734 ---- System::Windows::Forms::DialogResult res; ! res = MessageBox::Show(this, msg, "Apply", MessageBoxButtons::YesNoCancel); *************** *** 755,759 **** pinMap->Paint(e, picturePinMap); } ! Void picturePinMap_MouseDown(Object ^/*sender*/, MouseEventArgs ^e) { pinMap->MouseDown(e); --- 767,771 ---- pinMap->Paint(e, picturePinMap); } ! Void picturePinMap_MouseDown(Object ^/*sender*/, MouseEventArgs ^e) { pinMap->MouseDown(e); *************** *** 784,788 **** Void pairsList_BeforeSelect(Object ^/*sender*/, TreeViewCancelEventArgs ^e) { ! if (e->Node->Level != 0 || !SaveChanges()) e->Cancel = true; } --- 796,800 ---- Void pairsList_BeforeSelect(Object ^/*sender*/, TreeViewCancelEventArgs ^e) { ! if (!SaveChanges()) e->Cancel = true; } *************** *** 808,812 **** System::Windows::Forms::DialogResult res; ! res = MessageBox::Show(this, msg, "", MessageBoxButtons::YesNo); --- 820,824 ---- System::Windows::Forms::DialogResult res; ! res = MessageBox::Show(this, msg, "", MessageBoxButtons::YesNo); Index: portprms.cpp =================================================================== RCS file: /cvsroot/com0com/com0com/setupg/portprms.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** portprms.cpp 31 Oct 2007 10:16:55 -0000 1.1 --- portprms.cpp 12 Jan 2009 13:04:07 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2007 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2007-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,27 **** * * $Log$ * Revision 1.1 2007/10/31 10:16:55 vfrolov * Initial revision * - * */ --- 20,29 ---- * * $Log$ + * Revision 1.2 2009/01/12 13:04:07 vfrolov + * Added red painting InUse portnames + * * Revision 1.1 2007/10/31 10:16:55 vfrolov * Initial revision * */ *************** *** 91,94 **** --- 93,98 ---- for (int i = 0 ; i < lines->Length ; i++) ParseLine(lines[i]); + + LoadBusyNames(); } *************** *** 108,111 **** --- 112,117 ---- } + LoadBusyNames(); + return res; } *************** *** 137,138 **** --- 143,164 ---- Init(); } + + bool PortPairs::IsValidName(String ^name) + { + if (busyNames == nullptr) + return true; + + for each (String ^busyName in busyNames) { + if (busyName->ToUpper() == name->ToUpper()) + return false; + } + + return true; + } + + void PortPairs::LoadBusyNames() + { + String ^cmd = "busynames *"; + + busyNames = ExecCommand::ExecCommand(parent, cmd); + } |
From: Vyacheslav F. <vf...@us...> - 2009-01-12 12:48:19
|
Update of /cvsroot/com0com/com0com/setup In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv25919 Modified Files: setup.cpp Log Message: Fixed typo Index: setup.cpp =================================================================== RCS file: /cvsroot/com0com/com0com/setup/setup.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** setup.cpp 25 Dec 2008 16:58:45 -0000 1.27 --- setup.cpp 12 Jan 2009 12:48:05 -0000 1.28 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2006-2008 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2006-2009 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.28 2009/01/12 12:48:05 vfrolov + * Fixed typo + * * Revision 1.27 2008/12/25 16:58:45 vfrolov * Implemented busynames command *************** *** 1166,1170 **** , pProgName, (pProgName && *pProgName) ? " " : ""); ConsoleWrite( ! " %s%busynames COM?*\n" , pProgName, (pProgName && *pProgName) ? " " : ""); ConsoleWrite( --- 1169,1173 ---- , pProgName, (pProgName && *pProgName) ? " " : ""); ConsoleWrite( ! " %s%sbusynames COM?*\n" , pProgName, (pProgName && *pProgName) ? " " : ""); ConsoleWrite( |
From: Vyacheslav F. <vf...@us...> - 2008-12-25 16:58:50
|
Update of /cvsroot/com0com/com0com/setup In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv15495 Modified Files: setup.cpp Log Message: Implemented busynames command Index: setup.cpp =================================================================== RCS file: /cvsroot/com0com/com0com/setup/setup.cpp,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** setup.cpp 24 Dec 2008 15:32:22 -0000 1.26 --- setup.cpp 25 Dec 2008 16:58:45 -0000 1.27 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.27 2008/12/25 16:58:45 vfrolov + * Implemented busynames command + * * Revision 1.26 2008/12/24 15:32:22 vfrolov * Added logging COM port numbers in the COM port database *************** *** 922,925 **** --- 925,1080 ---- } /////////////////////////////////////////////////////////////// + int ShowBusyNames(const char *pPattern) + { + char *pPatternUp; + SIZE_T sizePattern; + + sizePattern = (lstrlen(pPattern) + 1) * sizeof(pPatternUp[0]); + + pPatternUp = (char *)LocalAlloc(LPTR, sizePattern); + + if (!pPatternUp) { + ShowError(MB_OK|MB_ICONSTOP, ERROR_NOT_ENOUGH_MEMORY, "LocalAlloc(%lu)", (unsigned long)sizePattern); + return 1; + } + + lstrcpy(pPatternUp, pPattern); + CharUpper(pPatternUp); + + char *pNames = NULL; + DWORD iNamesEnd = 0; + + for (int i = 0 ; i < 2 ; i++) { + char *pBuf = NULL; + + for (DWORD size = 1024 ; size >= 1024 ; size += 1024) { + char *pBufNew; + + if (!pBuf) + pBufNew = (char *)LocalAlloc(LPTR, size); + else + pBufNew = (char *)LocalReAlloc(pBuf, size, LMEM_ZEROINIT|LMEM_MOVEABLE); + + if (!pBufNew) { + if (pBuf) { + LocalFree(pBuf); + pBuf = NULL; + } + + if (ShowError(MB_OKCANCEL, ERROR_NOT_ENOUGH_MEMORY, "LocalAlloc(%lu)", (unsigned long)size) == IDCANCEL) { + if (pNames) + LocalFree(pNames); + + LocalFree(pPatternUp); + return 1; + } + + break; + } + + pBuf = pBufNew; + + DWORD res = (i != 0 + ? QueryDosDevice(NULL, pBuf, size/sizeof(pBuf[0])) + : ComDbQueryNames(pBuf, size/sizeof(pBuf[0]))); + + if (!res) { + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) + continue; + + LocalFree(pBuf); + pBuf = NULL; + + if (GetLastError() == ERROR_FILE_NOT_FOUND) + continue; + + if (ShowLastError(MB_OKCANCEL, + i != 0 ? "QueryDosDevice()" : "ComDbNames()") == IDCANCEL) + { + if (pNames) + LocalFree(pNames); + + LocalFree(pPatternUp); + return 1; + } + + break; + } + + // Workaround for succeeds even if buffer cannot hold all returned information + + if ((size/sizeof(pBuf[0]) - res) > 100) + break; + } + + if (pBuf) { + for (char *pName = pBuf ; *pName ; pName += lstrlen(pName) + 1) { + static const char strangeChars[] = ":#&$?!{}()[]/\\ \t\r\n"; + + if (strpbrk(pName, strangeChars)) + continue; // skip strange names + + CharUpper(pName); + + if (!MatchPattern(pPatternUp, pName)) + continue; + + if (pNames) { + char *pNamesName; + + for (pNamesName = pNames ; *pNamesName ; pNamesName += lstrlen(pNamesName) + 1) { + if (!lstrcmp(pNamesName, pName)) + break; + } + + if (*pNamesName) + continue; + } + + DWORD iNamesEndNew = iNamesEnd + lstrlen(pName) + 1; + DWORD sizeNamesNew = (iNamesEndNew + 1) * sizeof(pNames[0]); + + char *pNamesNew; + + if (!pNames) + pNamesNew = (char *)LocalAlloc(LPTR, sizeNamesNew); + else + pNamesNew = (char *)LocalReAlloc(pNames, sizeNamesNew, LMEM_ZEROINIT|LMEM_MOVEABLE); + + if (!pNamesNew) { + if (ShowError(MB_OKCANCEL, ERROR_NOT_ENOUGH_MEMORY, "LocalAlloc(%lu)", (unsigned long)size) == IDCANCEL) { + if (pNames) + LocalFree(pNames); + + LocalFree(pPatternUp); + return 1; + } + + break; + } + + pNames = pNamesNew; + + lstrcpy(pNames + iNamesEnd, pName); + + iNamesEnd = iNamesEndNew; + } + + LocalFree(pBuf); + } + } + + if (pNames) { + for (char *pName = pNames ; *pName ; pName += lstrlen(pName) + 1) + Trace("%s\n", pName); + + LocalFree(pNames); + } + + LocalFree(pPatternUp); + + return 0; + } + /////////////////////////////////////////////////////////////// int Help(const char *pProgName) { *************** *** 963,966 **** --- 1118,1123 ---- " reload - reload driver\n" " uninstall - uninstall all ports and the driver\n" + " busynames <pattern> - show names that already in use and match the\n" + " <pattern> (wildcards: '*' and '?')\n" " quit - quit\n" " help - print this help\n" *************** *** 1009,1012 **** --- 1166,1172 ---- , pProgName, (pProgName && *pProgName) ? " " : ""); ConsoleWrite( + " %s%busynames COM?*\n" + , pProgName, (pProgName && *pProgName) ? " " : ""); + ConsoleWrite( "\n"); *************** *** 1062,1065 **** --- 1222,1230 ---- return 0; } + else + if (argc == 3 && !lstrcmpi(argv[1], "busynames")) { + SetTitle(C0C_SETUP_TITLE " (BUSY NAMES)"); + return ShowBusyNames(argv[2]); + } InfFile infFile(C0C_INF_NAME, C0C_INF_NAME); |
From: Vyacheslav F. <vf...@us...> - 2008-12-25 16:57:36
|
Update of /cvsroot/com0com/com0com/setup In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv15395 Modified Files: comdb.cpp comdb.h Log Message: Added ComDbQueryNames() Index: comdb.h =================================================================== RCS file: /cvsroot/com0com/com0com/setup/comdb.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** comdb.h 24 Dec 2008 15:20:35 -0000 1.1 --- comdb.h 25 Dec 2008 16:57:33 -0000 1.2 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2008/12/25 16:57:33 vfrolov + * Added ComDbQueryNames() + * * Revision 1.1 2008/12/24 15:20:35 vfrolov * Initial revision *************** *** 33,36 **** --- 36,40 ---- BOOL ComDbGetInUse(const char *pPortName, BOOL &inUse); void ComDbSync(InfFile &infFile); + DWORD ComDbQueryNames(char *pBuf, DWORD maxChars); /////////////////////////////////////////////////////////////// Index: comdb.cpp =================================================================== RCS file: /cvsroot/com0com/com0com/setup/comdb.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** comdb.cpp 24 Dec 2008 15:20:35 -0000 1.1 --- comdb.cpp 25 Dec 2008 16:57:33 -0000 1.2 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2008/12/25 16:57:33 vfrolov + * Added ComDbQueryNames() + * * Revision 1.1 2008/12/24 15:20:35 vfrolov * Initial revision *************** *** 47,50 **** --- 50,54 ---- (pPortName[1] != 'O' && pPortName[1] != 'o') || (pPortName[2] != 'M' && pPortName[2] != 'm') || + pPortName[3] == '0' || !StrToInt(pPortName + 3, &num) || num <= 0 || *************** *** 114,119 **** } while (res == IDTRYAGAIN); ! if (res != IDCONTINUE) return FALSE; return TRUE; --- 118,125 ---- } while (res == IDTRYAGAIN); ! if (res != IDCONTINUE) { ! SetLastError(ERROR_CANCELLED); return FALSE; + } return TRUE; *************** *** 164,169 **** } while (res == IDRETRY); ! if (res != IDCONTINUE) return FALSE; return TRUE; --- 170,177 ---- } while (res == IDRETRY); ! if (res != IDCONTINUE) { ! SetLastError(ERROR_CANCELLED); return FALSE; + } return TRUE; *************** *** 251,256 **** } while (res == IDTRYAGAIN); ! if (res != IDCONTINUE) return FALSE; return TRUE; --- 259,266 ---- } while (res == IDTRYAGAIN); ! if (res != IDCONTINUE) { ! SetLastError(ERROR_CANCELLED); return FALSE; + } return TRUE; *************** *** 382,387 **** } while (res == IDTRYAGAIN); ! if (res != IDCONTINUE) return FALSE; return TRUE; --- 392,399 ---- } while (res == IDTRYAGAIN); ! if (res != IDCONTINUE) { ! SetLastError(ERROR_CANCELLED); return FALSE; + } return TRUE; *************** *** 439,440 **** --- 451,491 ---- } /////////////////////////////////////////////////////////////// + DWORD ComDbQueryNames(char *pBuf, DWORD maxChars) + { + BusyMask comDb; + + if (!LoadComDb(comDb)) + return 0; + + char *pB = pBuf; + + for (DWORD num = 0 ; num < COMDB_MAX_PORTS_ARBITRATED ; num++) { + if (comDb.IsFreeNum(num)) + continue; + + int len = SNPRINTF(pB, maxChars, "COM%u", (unsigned)(num + 1)); + + if (len < 0) { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return 0; + } + + pB += len + 1; + maxChars -= len + 1; + } + + if (pB == pBuf) { + SetLastError(ERROR_FILE_NOT_FOUND); + return 0; + } + + if (maxChars == 0) { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return 0; + } + + *pB++ = 0; + + return (DWORD)(pB - pBuf); + } + /////////////////////////////////////////////////////////////// |
From: Vyacheslav F. <vf...@us...> - 2008-12-25 16:56:30
|
Update of /cvsroot/com0com/com0com/setup In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv15290 Modified Files: utils.cpp utils.h Log Message: Added MatchPattern() Index: utils.cpp =================================================================== RCS file: /cvsroot/com0com/com0com/setup/utils.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** utils.cpp 24 Dec 2008 15:22:44 -0000 1.7 --- utils.cpp 25 Dec 2008 16:56:25 -0000 1.8 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.8 2008/12/25 16:56:25 vfrolov + * Added MatchPattern() + * * Revision 1.7 2008/12/24 15:22:44 vfrolov * Added BusyMask::Clear() and BusyMask::DelNum() *************** *** 154,157 **** --- 157,192 ---- } /////////////////////////////////////////////////////////////// + BOOL MatchPattern(const char *pPattern, const char *pStr) + { + for (;;) { + switch (*pPattern) { + case '*': + pPattern++; + do { + if (MatchPattern(pPattern, pStr)) + return TRUE; + } while (*pStr++); + + return FALSE; + case '?': + if (!*pStr) + return FALSE; + + pStr++; + pPattern++; + break; + default: + if (*pPattern != *pStr) + return FALSE; + + if (!*pStr) + return TRUE; + + pStr++; + pPattern++; + } + } + } + /////////////////////////////////////////////////////////////// void BusyMask::Clear() { Index: utils.h =================================================================== RCS file: /cvsroot/com0com/com0com/setup/utils.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** utils.h 24 Dec 2008 15:22:44 -0000 1.6 --- utils.h 25 Dec 2008 16:56:25 -0000 1.7 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.7 2008/12/25 16:56:25 vfrolov + * Added MatchPattern() + * * Revision 1.6 2008/12/24 15:22:44 vfrolov * Added BusyMask::Clear() and BusyMask::DelNum() *************** *** 48,51 **** --- 51,55 ---- char *STRTOK_R(char *pStr, const char *pDelims, char **ppSave); BOOL StrToInt(const char *pStr, int *pNum); + BOOL MatchPattern(const char *pPattern, const char *pStr); class BusyMask { |