[Com0com-cvs] hub4com/plugins/escparse .cvsignore, NONE, 1.1 filter.cpp, NONE, 1.1 precomp.cpp, NON
The virtual serial port driver for Windows.
Brought to you by:
vfrolov
From: Vyacheslav F. <vf...@us...> - 2008-08-22 17:03:03
|
Update of /cvsroot/com0com/hub4com/plugins/escparse In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv9209 Added Files: .cvsignore filter.cpp precomp.cpp escparse.vcproj precomp.h Log Message: Initial revision --- NEW FILE: precomp.cpp --- /* * $Id: precomp.cpp,v 1.1 2008/08/22 17:02:59 vfrolov Exp $ * * Copyright (c) 2007-2008 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 * */ /////////////////////////////////////////////////////////////// #include "precomp.h" /////////////////////////////////////////////////////////////// --- NEW FILE: precomp.h --- /* * $Id: precomp.h,v 1.1 2008/08/22 17:02:59 vfrolov Exp $ * * Copyright (c) 2008 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: precomp.h,v $ * Revision 1.1 2008/08/22 17:02:59 vfrolov * Initial revision * */ #ifndef _PRECOMP_H_ #define _PRECOMP_H_ #include <windows.h> #include <crtdbg.h> #include <string> #include <map> #include <iostream> using namespace std; #pragma warning(disable:4512) // assignment operator could not be generated #endif /* _PRECOMP_H_ */ --- NEW FILE: .cvsignore --- *.user Release Debug --- NEW FILE: filter.cpp --- /* * $Id: filter.cpp,v 1.1 2008/08/22 17:02:59 vfrolov Exp $ * * Copyright (c) 2008 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: filter.cpp,v $ * Revision 1.1 2008/08/22 17:02:59 vfrolov * Initial revision * */ #include "precomp.h" #include "../plugins_api.h" #include "../cncext.h" /////////////////////////////////////////////////////////////// #ifndef _DEBUG #define DEBUG_PARAM(par) #else /* _DEBUG */ #define DEBUG_PARAM(par) par #endif /* _DEBUG */ /////////////////////////////////////////////////////////////// static ROUTINE_MSG_INSERT_VAL *pMsgInsertVal = NULL; static ROUTINE_MSG_INSERT_NONE *pMsgInsertNone = NULL; static ROUTINE_MSG_REPLACE_NONE *pMsgReplaceNone = NULL; static ROUTINE_MSG_INSERT_BUF *pMsgInsertBuf = NULL; static ROUTINE_MSG_REPLACE_BUF *pMsgReplaceBuf = NULL; static ROUTINE_PORT_NAME_A *pPortName = NULL; static ROUTINE_FILTER_NAME_A *pFilterName = NULL; /////////////////////////////////////////////////////////////// const char *GetParam(const char *pArg, const char *pPattern) { size_t lenPattern = strlen(pPattern); if (_strnicmp(pArg, pPattern, lenPattern) != 0) return NULL; return pArg + lenPattern; } /////////////////////////////////////////////////////////////// class Valid { public: Valid() : isValid(TRUE) {} void Invalidate() { isValid = FALSE; } BOOL IsValid() const { return isValid; } private: BOOL isValid; }; /////////////////////////////////////////////////////////////// class EscParse { public: EscParse(BYTE _escapeChar) : escMode(FALSE), intercepted_options(0), escapeChar(_escapeChar), maskMst(0), maskLsr(0), _options(0) { Reset(); } HUB_MSG *Convert(HUB_MSG *pMsg); DWORD Options() const { return _options; } void OptionsDel(DWORD opts) { _options &= ~opts; maskMst = GO_O2V_MODEM_STATUS(_options); maskLsr = GO_O2V_LINE_STATUS(_options); } void OptionsAdd(DWORD opts) { _options |= opts; maskMst = GO_O2V_MODEM_STATUS(_options); maskLsr = GO_O2V_LINE_STATUS(_options); } BOOL escMode; DWORD intercepted_options; private: void Reset() { state = subState = 0; } HUB_MSG *Flush(HUB_MSG *pMsg); BYTE escapeChar; WORD maskMst; WORD maskLsr; int state; BYTE code; int subState; BYTE data[sizeof(ULONG)]; basic_string<BYTE> line_data; DWORD _options; }; HUB_MSG *EscParse::Flush(HUB_MSG *pMsg) { if (!line_data.empty()) { pMsg = pMsgInsertBuf(pMsg, HUB_MSG_TYPE_LINE_DATA, line_data.data(), (DWORD)line_data.size()); line_data.clear(); } return pMsg; } HUB_MSG *EscParse::Convert(HUB_MSG *pMsg) { if (!escMode) return pMsg; DWORD len = pMsg->u.buf.size; basic_string<BYTE> org(pMsg->u.buf.pBuf, len); const BYTE *pBuf = org.data(); // discard original data from the stream pMsg = pMsgReplaceBuf(pMsg, HUB_MSG_TYPE_LINE_DATA, NULL, 0); for (; len ; len--) { BYTE ch = *pBuf++; switch (state) { case 0: break; case 1: code = ch; state++; case 2: switch (code) { case SERIAL_LSRMST_ESCAPE: line_data.append(&escapeChar, 1); Reset(); break; case SERIAL_LSRMST_LSR_DATA: _ASSERTE(subState >= 0 && subState <= 2); if (subState == 0) { subState++; } else if (subState == 1) { data[0] = ch; // LSR subState++; } else if (subState == 2) { line_data.append(&ch, 1); if (Options() & GO_BREAK_STATUS) { pMsg = Flush(pMsg); pMsg = pMsgInsertVal(pMsg, HUB_MSG_TYPE_BREAK_STATUS, (data[0] & LINE_STATUS_BI) != 0); } if (maskLsr) { pMsg = Flush(pMsg); pMsg = pMsgInsertVal(pMsg, HUB_MSG_TYPE_LINE_STATUS, data[0] | VAL2MASK(maskLsr)); } Reset(); } else { cerr << "ERROR: SERIAL_LSRMST_LSR_DATA subState=" << subState << endl; Reset(); } break; case SERIAL_LSRMST_LSR_NODATA: _ASSERTE(subState >= 0 && subState <= 1); if (subState == 0) { subState++; } else if (subState == 1) { if (Options() & GO_BREAK_STATUS) { pMsg = Flush(pMsg); pMsg = pMsgInsertVal(pMsg, HUB_MSG_TYPE_BREAK_STATUS, (ch & LINE_STATUS_BI) != 0); } if (maskLsr) { pMsg = Flush(pMsg); pMsg = pMsgInsertVal(pMsg, HUB_MSG_TYPE_LINE_STATUS, ch | VAL2MASK(maskLsr)); } Reset(); } else { cerr << "ERROR: SERIAL_LSRMST_LSR_NODATA subState=" << subState << endl; Reset(); } break; case SERIAL_LSRMST_MST: _ASSERTE(subState >= 0 && subState <= 1); if (subState == 0) { subState++; } else if (subState == 1) { if (maskMst) { pMsg = Flush(pMsg); pMsg = pMsgInsertVal(pMsg, HUB_MSG_TYPE_MODEM_STATUS, ch | VAL2MASK(maskMst)); } Reset(); } else { cerr << "ERROR: SERIAL_LSRMST_MST subState=" << subState << endl; Reset(); } break; case C0CE_INSERT_RBR: _ASSERTE(subState >= 0 && subState < (sizeof(ULONG) + 1)); if (subState == 0) { subState++; } else if (subState >= 1 && subState < (sizeof(ULONG) + 1)) { data[subState - 1] = ch; if (subState < sizeof(ULONG)) { subState++; } else { if (Options() & GO_RBR_STATUS) { pMsg = Flush(pMsg); pMsg = pMsgInsertVal(pMsg, HUB_MSG_TYPE_RBR_STATUS, *(ULONG *)data); } Reset(); } } else { cerr << "ERROR: C0CE_INSERT_RBR subState=" << subState << endl; Reset(); } break; case C0CE_INSERT_RLC: _ASSERTE(subState >= 0 && subState <= 3); if (subState == 0) { subState++; } else if (subState >= 1 && subState <= 3) { data[subState - 1] = ch; if (subState < 3) { subState++; } else { if (Options() & GO_RLC_STATUS) { pMsg = Flush(pMsg); pMsg = pMsgInsertVal(pMsg, HUB_MSG_TYPE_RLC_STATUS, *(ULONG *)data); } Reset(); } } else { cerr << "ERROR: C0CE_INSERT_RLC subState=" << subState << endl; _ASSERTE(FALSE); Reset(); } break; default: cerr << "ERROR: SERIAL_LSRMST_" << (WORD)code << " subState=" << subState << endl; Reset(); } continue; default: cerr << "ERROR: state=" << state << endl; Reset(); } if (ch == escapeChar) { state = 1; continue; } line_data.append(&ch, 1); } pMsg = Flush(pMsg); return pMsg; } /////////////////////////////////////////////////////////////// class Filter : public Valid { public: Filter(int argc, const char *const argv[]); void SetHub(HHUB _hHub) { hHub = _hHub; } EscParse *GetEscParse(int nPort); const char *PortName(int nPort) const { return pPortName(hHub, nPort); } const char *FilterName() const { return pFilterName(hHub, (HFILTER)this); } BOOL requestEscMode; BYTE escapeChar; DWORD acceptableOptions; private: HHUB hHub; typedef map<int, EscParse*> PortsMap; typedef pair<int, EscParse*> PortPair; PortsMap portsMap; }; Filter::Filter(int argc, const char *const argv[]) : requestEscMode(TRUE), escapeChar(0xFF), acceptableOptions( GO_RBR_STATUS | GO_RLC_STATUS | GO_BREAK_STATUS | GO_V2O_MODEM_STATUS(-1) | GO_V2O_LINE_STATUS(-1)), hHub(NULL) { for (const char *const *pArgs = &argv[1] ; argc > 1 ; pArgs++, argc--) { const char *pArg = GetParam(*pArgs, "--"); if (!pArg) { cerr << "Unknown option " << *pArgs << endl; Invalidate(); continue; } } } EscParse *Filter::GetEscParse(int nPort) { PortsMap::iterator iPair = portsMap.find(nPort); if (iPair == portsMap.end()) { portsMap.insert(PortPair(nPort, NULL)); iPair = portsMap.find(nPort); if (iPair == portsMap.end()) return NULL; } if (!iPair->second) iPair->second = new EscParse(escapeChar); return iPair->second; } /////////////////////////////////////////////////////////////// static PLUGIN_TYPE CALLBACK GetPluginType() { return PLUGIN_TYPE_FILTER; } /////////////////////////////////////////////////////////////// static const PLUGIN_ABOUT_A about = { sizeof(PLUGIN_ABOUT_A), "escparse", "Copyright (c) 2008 Vyacheslav Frolov", "GNU General Public License", "Escaped data stream parsing filter", }; static const PLUGIN_ABOUT_A * CALLBACK GetPluginAbout() { return &about; } /////////////////////////////////////////////////////////////// static void CALLBACK Help(const char *pProgPath) { cerr << "Usage:" << endl << " " << pProgPath << " ... --create-filter=" << GetPluginAbout()->pName << "[,<FID>][:<options>] ... --add-filters=<ports>:[...,]<FID>[,...] ..." << endl << endl << "Options:" << endl << endl << "Examples:" << endl << " " << pProgPath << " --create-filter=pinmap --create-filter=" << GetPluginAbout()->pName << " --add-filters=0,1:pinmap," << GetPluginAbout()->pName << " COM1 COM2" << endl << " - transfer data and signals between COM1 and COM2." << endl ; } /////////////////////////////////////////////////////////////// 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()) { delete pFilter; return NULL; } return (HFILTER)pFilter; } /////////////////////////////////////////////////////////////// static BOOL CALLBACK Init( HFILTER hFilter, HHUB hHub) { _ASSERTE(hFilter != NULL); _ASSERTE(hHub != NULL); ((Filter *)hFilter)->SetHub(hHub); return TRUE; } /////////////////////////////////////////////////////////////// inline DWORD go2esc(DWORD goOpts) { return ESC_OPTS_V2O_MST(GO_O2V_MODEM_STATUS(goOpts)) | ESC_OPTS_V2O_LSR(GO_O2V_LINE_STATUS(goOpts)) | ((goOpts & GO_RBR_STATUS) ? ESC_OPTS_RBR_STATUS : 0) | ((goOpts & GO_RLC_STATUS) ? ESC_OPTS_RLC_STATUS : 0) | ((goOpts & GO_BREAK_STATUS) ? ESC_OPTS_BREAK_STATUS : 0); } inline DWORD esc2go(DWORD escOpts) { return GO_V2O_MODEM_STATUS(ESC_OPTS_O2V_MST(escOpts)) | GO_V2O_LINE_STATUS(ESC_OPTS_O2V_LSR(escOpts)) | ((escOpts & ESC_OPTS_RBR_STATUS) ? GO_RBR_STATUS : 0) | ((escOpts & ESC_OPTS_RLC_STATUS) ? GO_RLC_STATUS : 0) | ((escOpts & ESC_OPTS_BREAK_STATUS) ? GO_BREAK_STATUS : 0); } static BOOL CALLBACK InMethod( HFILTER hFilter, int nFromPort, HUB_MSG *pInMsg, HUB_MSG ** DEBUG_PARAM(ppEchoMsg)) { _ASSERTE(hFilter != NULL); _ASSERTE(pInMsg != NULL); _ASSERTE(ppEchoMsg != NULL); _ASSERTE(*ppEchoMsg == NULL); switch (pInMsg->type) { case HUB_MSG_TYPE_COUNT_REPEATS: if (pInMsg->u.pv.val == HUB_MSG_TYPE_GET_IN_OPTS) { // we need it twice to // - get interceptable options from subsequent filters // - accept the received options and request the escape mode (*pInMsg->u.pv.pVal)++; } break; case HUB_MSG_TYPE_GET_IN_OPTS: { EscParse *pEscParse = ((Filter *)hFilter)->GetEscParse(nFromPort); if (!pEscParse) return FALSE; // if the subsequent filters require interceptable options then // accept the received options and request the escape mode pEscParse->OptionsAdd((pEscParse->intercepted_options & ((Filter *)hFilter)->acceptableOptions)); if (((Filter *)hFilter)->requestEscMode) { if (pEscParse->Options() && (pInMsg->u.pv.val & GO_ESCAPE_MODE)) { pEscParse->escMode = TRUE; *pInMsg->u.pv.pVal |= GO_ESCAPE_MODE; // request the escape mode } } else { pEscParse->escMode = TRUE; } // get interceptable options from subsequent filters separately DWORD interceptable_options = (pInMsg->u.pv.val & (GO_ESCAPE_MODE | ((Filter *)hFilter)->acceptableOptions)); pInMsg->u.pv.val &= ~interceptable_options; pInMsg = pMsgInsertNone(pInMsg, HUB_MSG_TYPE_EMPTY); if (pInMsg) { pInMsg->type = HUB_MSG_TYPE_GET_IN_OPTS; pInMsg->u.pv.pVal = &pEscParse->intercepted_options; pInMsg->u.pv.val = interceptable_options; } break; } case HUB_MSG_TYPE_GET_ESC_OPTS: { EscParse *pEscParse = ((Filter *)hFilter)->GetEscParse(nFromPort); if (!pEscParse) return FALSE; *pInMsg->u.pv.pVal = go2esc(pEscParse->Options()) | ESC_OPTS_V2O_ESCCHAR(((Filter *)hFilter)->escapeChar); // hide this message from subsequent filters pMsgReplaceNone(pInMsg, HUB_MSG_TYPE_EMPTY); break; } case HUB_MSG_TYPE_FAIL_ESC_OPTS: { EscParse *pEscParse = ((Filter *)hFilter)->GetEscParse(nFromPort); if (!pEscParse) return FALSE; DWORD fail_options = (pInMsg->u.val & go2esc(pEscParse->Options())); if (fail_options) { cerr << ((Filter *)hFilter)->PortName(nFromPort) << " WARNING: Requested by filter " << ((Filter *)hFilter)->FilterName() << " escape mode option(s) 0x" << hex << fail_options << dec << " not accepted" << endl; pEscParse->OptionsDel(esc2go(fail_options)); } // hide this message from subsequent filters pMsgReplaceNone(pInMsg, HUB_MSG_TYPE_EMPTY); break; } case HUB_MSG_TYPE_FAIL_IN_OPTS: { EscParse *pEscParse = ((Filter *)hFilter)->GetEscParse(nFromPort); if (!pEscParse) return FALSE; if ((pInMsg->u.val & GO_ESCAPE_MODE) && ((Filter *)hFilter)->requestEscMode) { cerr << ((Filter *)hFilter)->PortName(nFromPort) << " WARNING: Requested by filter " << ((Filter *)hFilter)->FilterName() << " option ESCAPE_MODE not accepted" << endl; pEscParse->escMode = FALSE; pEscParse->OptionsDel((DWORD)-1); } pInMsg->u.val &= ~GO_ESCAPE_MODE; // hide from subsequent filters DWORD fail_options = (pEscParse->intercepted_options & ~pEscParse->Options()); if (fail_options) { cerr << ((Filter *)hFilter)->PortName(nFromPort) << " WARNING: Intercepted option(s) 0x" << hex << fail_options << dec << " by filter " << ((Filter *)hFilter)->FilterName() << " will be ignored" << endl; // report not supported intercepted options to subsequent filters pInMsg->u.val |= fail_options; } break; } case HUB_MSG_TYPE_LINE_DATA: { _ASSERTE(pInMsg->u.buf.pBuf != NULL || pInMsg->u.buf.size == 0); if (pInMsg->u.buf.size == 0) return TRUE; EscParse *pEscParse = ((Filter *)hFilter)->GetEscParse(nFromPort); if (!pEscParse) return FALSE; pInMsg = pEscParse->Convert(pInMsg); break; } case HUB_MSG_TYPE_MODEM_STATUS: // discard any status settings controlled by this filter pInMsg->u.val &= ~VAL2MASK(GO_O2V_MODEM_STATUS(((Filter *)hFilter)->acceptableOptions)); break; case HUB_MSG_TYPE_LINE_STATUS: // discard any status settings controlled by this filter pInMsg->u.val &= ~VAL2MASK(GO_O2V_LINE_STATUS(((Filter *)hFilter)->acceptableOptions)); break; case HUB_MSG_TYPE_RBR_STATUS: if (((Filter *)hFilter)->acceptableOptions & GO_RBR_STATUS) { // discard any status settings controlled by this filter pMsgReplaceNone(pInMsg, HUB_MSG_TYPE_EMPTY); } break; case HUB_MSG_TYPE_RLC_STATUS: if (((Filter *)hFilter)->acceptableOptions & GO_RLC_STATUS) { // discard any status settings controlled by this filter pMsgReplaceNone(pInMsg, HUB_MSG_TYPE_EMPTY); } break; case HUB_MSG_TYPE_BREAK_STATUS: if (((Filter *)hFilter)->acceptableOptions & GO_BREAK_STATUS) { // discard any status settings controlled by this filter pMsgReplaceNone(pInMsg, HUB_MSG_TYPE_EMPTY); } break; } return pInMsg != NULL; } /////////////////////////////////////////////////////////////// static const FILTER_ROUTINES_A routines = { sizeof(FILTER_ROUTINES_A), GetPluginType, GetPluginAbout, Help, NULL, // ConfigStart NULL, // Config NULL, // ConfigStop Create, Init, InMethod, NULL, // OutMethod }; static const PLUGIN_ROUTINES_A *const plugins[] = { (const PLUGIN_ROUTINES_A *)&routines, NULL }; /////////////////////////////////////////////////////////////// PLUGIN_INIT_A InitA; const PLUGIN_ROUTINES_A *const * CALLBACK InitA( const HUB_ROUTINES_A * pHubRoutines) { if (!ROUTINE_IS_VALID(pHubRoutines, pMsgInsertVal) || !ROUTINE_IS_VALID(pHubRoutines, pMsgInsertNone) || !ROUTINE_IS_VALID(pHubRoutines, pMsgReplaceNone) || !ROUTINE_IS_VALID(pHubRoutines, pMsgInsertBuf) || !ROUTINE_IS_VALID(pHubRoutines, pMsgReplaceBuf) || !ROUTINE_IS_VALID(pHubRoutines, pPortName) || !ROUTINE_IS_VALID(pHubRoutines, pFilterName)) { return NULL; } pMsgInsertVal = pHubRoutines->pMsgInsertVal; pMsgInsertNone = pHubRoutines->pMsgInsertNone; pMsgReplaceNone = pHubRoutines->pMsgReplaceNone; pMsgInsertBuf = pHubRoutines->pMsgInsertBuf; pMsgReplaceBuf = pHubRoutines->pMsgReplaceBuf; pPortName = pHubRoutines->pPortName; pFilterName = pHubRoutines->pFilterName; return plugins; } /////////////////////////////////////////////////////////////// --- NEW FILE: escparse.vcproj --- <?xml version="1.0" encoding="windows-1251"?> <VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="filter-escparse" ProjectGUID="{B56122ED-F2E6-4FA1-8E85-B8C606ED9400}" RootNamespace="hub4com" Keyword="Win32Proj" > <Platforms> <Platform Name="Win32" /> </Platforms> <ToolFiles> </ToolFiles> <Configurations> <Configuration Name="Debug|Win32" OutputDirectory="Debug" IntermediateDirectory="Debug" ConfigurationType="2" UseOfMFC="0" > <Tool Name="VCPreBuildEventTool" /> <Tool Name="VCCustomBuildTool" /> <Tool Name="VCXMLDataGeneratorTool" /> <Tool Name="VCWebServiceProxyGeneratorTool" /> <Tool Name="VCMIDLTool" /> <Tool Name="VCCLCompilerTool" Optimization="0" PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" UsePrecompiledHeader="2" PrecompiledHeaderThrough="precomp.h" PrecompiledHeaderFile="$(IntDir)\precomp.pch" WarningLevel="4" Detect64BitPortabilityProblems="true" DebugInformationFormat="4" /> <Tool Name="VCManagedResourceCompilerTool" /> <Tool Name="VCResourceCompilerTool" /> <Tool Name="VCPreLinkEventTool" /> <Tool Name="VCLinkerTool" OutputFile="..\..\$(OutDir)\plugins\$(ProjectName).dll" LinkIncremental="2" ModuleDefinitionFile="..\plugins.def" GenerateDebugInformation="true" SubSystem="1" TargetMachine="1" /> <Tool Name="VCALinkTool" /> <Tool Name="VCManifestTool" /> <Tool Name="VCXDCMakeTool" /> <Tool Name="VCBscMakeTool" /> <Tool Name="VCFxCopTool" /> <Tool Name="VCAppVerifierTool" /> <Tool Name="VCWebDeploymentTool" /> <Tool Name="VCPostBuildEventTool" /> </Configuration> <Configuration Name="Release|Win32" OutputDirectory="Release" IntermediateDirectory="Release" ConfigurationType="2" UseOfMFC="0" > <Tool Name="VCPreBuildEventTool" /> <Tool Name="VCCustomBuildTool" /> <Tool Name="VCXMLDataGeneratorTool" /> <Tool Name="VCWebServiceProxyGeneratorTool" /> <Tool Name="VCMIDLTool" /> <Tool Name="VCCLCompilerTool" PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE" RuntimeLibrary="0" UsePrecompiledHeader="2" PrecompiledHeaderThrough="precomp.h" PrecompiledHeaderFile="$(IntDir)\precomp.pch" WarningLevel="4" Detect64BitPortabilityProblems="true" DebugInformationFormat="3" /> <Tool Name="VCManagedResourceCompilerTool" /> <Tool Name="VCResourceCompilerTool" /> <Tool Name="VCPreLinkEventTool" /> <Tool Name="VCLinkerTool" OutputFile="..\..\$(OutDir)\plugins\$(ProjectName).dll" LinkIncremental="2" ModuleDefinitionFile="..\plugins.def" GenerateDebugInformation="true" SubSystem="1" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1" /> <Tool Name="VCALinkTool" /> <Tool Name="VCManifestTool" /> <Tool Name="VCXDCMakeTool" /> <Tool Name="VCBscMakeTool" /> <Tool Name="VCFxCopTool" /> <Tool Name="VCAppVerifierTool" /> <Tool Name="VCWebDeploymentTool" /> <Tool Name="VCPostBuildEventTool" /> </Configuration> </Configurations> <References> </References> <Files> <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > <File RelativePath="..\cncext.h" > </File> <File RelativePath="..\plugins_api.h" > </File> <File RelativePath=".\precomp.h" > </File> </Filter> <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > <File RelativePath=".\filter.cpp" > </File> <File RelativePath="..\plugins.def" > </File> <File RelativePath=".\precomp.cpp" > <FileConfiguration Name="Debug|Win32" > <Tool Name="VCCLCompilerTool" UsePrecompiledHeader="1" /> </FileConfiguration> <FileConfiguration Name="Release|Win32" > <Tool Name="VCCLCompilerTool" UsePrecompiledHeader="1" /> </FileConfiguration> </File> </Filter> </Files> <Globals> </Globals> </VisualStudioProject> |