From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- private/unimodem/new/mic/alloc.h | 86 + private/unimodem/new/mic/chksum.cpp | 57 + private/unimodem/new/mic/chksum.h | 23 + private/unimodem/new/mic/common.h | 32 + private/unimodem/new/mic/consts.h | 30 + private/unimodem/new/mic/dev.cpp | 1103 +++++++++++ private/unimodem/new/mic/dev.h | 136 ++ private/unimodem/new/mic/globals.cpp | 53 + private/unimodem/new/mic/globals.h | 28 + private/unimodem/new/mic/ilist.cpp | 58 + private/unimodem/new/mic/ilist.h | 66 + private/unimodem/new/mic/inf.cpp | 903 +++++++++ private/unimodem/new/mic/inf.h | 998 ++++++++++ private/unimodem/new/mic/ini.cpp | 153 ++ private/unimodem/new/mic/ini.h | 210 ++ private/unimodem/new/mic/main.cpp | 18 + private/unimodem/new/mic/makefile | 6 + private/unimodem/new/mic/mic.cpp | 167 ++ private/unimodem/new/mic/mic.h | 1 + private/unimodem/new/mic/notes.txt | 231 +++ private/unimodem/new/mic/resp.cpp | 3538 ++++++++++++++++++++++++++++++++++ private/unimodem/new/mic/sample.inf | 64 + private/unimodem/new/mic/sources | 36 + private/unimodem/new/mic/sym.cpp | 316 +++ private/unimodem/new/mic/sym.h | 215 +++ private/unimodem/new/mic/sync.cpp | 35 + private/unimodem/new/mic/sync.h | 148 ++ private/unimodem/new/mic/tdev.cpp | 84 + private/unimodem/new/mic/test.h | 2 + private/unimodem/new/mic/tsym.cpp | 65 + 30 files changed, 8862 insertions(+) create mode 100644 private/unimodem/new/mic/alloc.h create mode 100644 private/unimodem/new/mic/chksum.cpp create mode 100644 private/unimodem/new/mic/chksum.h create mode 100644 private/unimodem/new/mic/common.h create mode 100644 private/unimodem/new/mic/consts.h create mode 100644 private/unimodem/new/mic/dev.cpp create mode 100644 private/unimodem/new/mic/dev.h create mode 100644 private/unimodem/new/mic/globals.cpp create mode 100644 private/unimodem/new/mic/globals.h create mode 100644 private/unimodem/new/mic/ilist.cpp create mode 100644 private/unimodem/new/mic/ilist.h create mode 100644 private/unimodem/new/mic/inf.cpp create mode 100644 private/unimodem/new/mic/inf.h create mode 100644 private/unimodem/new/mic/ini.cpp create mode 100644 private/unimodem/new/mic/ini.h create mode 100644 private/unimodem/new/mic/main.cpp create mode 100644 private/unimodem/new/mic/makefile create mode 100644 private/unimodem/new/mic/mic.cpp create mode 100644 private/unimodem/new/mic/mic.h create mode 100644 private/unimodem/new/mic/notes.txt create mode 100644 private/unimodem/new/mic/resp.cpp create mode 100644 private/unimodem/new/mic/sample.inf create mode 100644 private/unimodem/new/mic/sources create mode 100644 private/unimodem/new/mic/sym.cpp create mode 100644 private/unimodem/new/mic/sym.h create mode 100644 private/unimodem/new/mic/sync.cpp create mode 100644 private/unimodem/new/mic/sync.h create mode 100644 private/unimodem/new/mic/tdev.cpp create mode 100644 private/unimodem/new/mic/test.h create mode 100644 private/unimodem/new/mic/tsym.cpp (limited to 'private/unimodem/new/mic') diff --git a/private/unimodem/new/mic/alloc.h b/private/unimodem/new/mic/alloc.h new file mode 100644 index 000000000..ae5637608 --- /dev/null +++ b/private/unimodem/new/mic/alloc.h @@ -0,0 +1,86 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// ALLOC.H -- Header for Classes: +// CAllococator +// +// +// History: +// 05/22/96 JosephJ Created +// +// +#if (TODO) + + +class CAllocator +{ + Allocator(UINT uSize) : m_uSize(uSize) + { + ASSERT(!(uSize %sizeof(void *))); + m_uBlockSize = (uSize+sizeof(void *)) + if (uSize<1000) + m_uBlockSize = m_uBlockSize*10 + sizeof(void *) + + m_uBlockSize += sizeof (void*); + } + + ~Allocator() + { + void *pList = m_pBlockList; + while(pList) + { + void *pOld = pList; + pList = (void *) *pList; + GlobalFree(pOld); + } + } + + void * Alloc(void) + { + m_sync.EnterCrit(); + + void *pvRet = m_pFreeList; + + if (!m_pFreeList) + { + void *pv = GlobalAlloc(LPTR, m_uBlockSize); + void *pvEnd = pv+m_uBlockSize; + if (pv) + { + *pv = m_pvBlockList; + m_pvBlockList = pv; + m_pFreeList = ++pv; + for(;;pv = *pv) + { + *pv = pv + m_uSize + sizeof (void *); + if (*pv >= pvEnd) {*pv=NULL;break;} + pv = *pv; + } + pvRet = m_pFreeList; + } + } + + m_sync.LeaveCrit(); + + return pvRet; + } + + void Free(void *pv) + { + m_sync.EnterCrit(); + pv--; + *pv = m_pFreeList; + m_pFreeList=*pv; + m_sync.LeaveCrit(); + } + +private: + + void * m_pFreeList; + void * m_pBlockList; + const UINT m_uSize; + UINT m_uBlockSize; + CSync m_sync; +} +#endif (TODO) diff --git a/private/unimodem/new/mic/chksum.cpp b/private/unimodem/new/mic/chksum.cpp new file mode 100644 index 000000000..55e936eaa --- /dev/null +++ b/private/unimodem/new/mic/chksum.cpp @@ -0,0 +1,57 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// CHKSUM.CPP -- Implementation Checksum() +// +// History: +// 05/24/96 JosephJ Created +// +// +#include "common.h" + +//---------------- ::Checksum ----------------------------------- +// Compute a 32-bit checksum of the specified bytes +// 0 is retured if pb==NULL or cb==0 +DWORD Checksum(const BYTE *pb, UINT cb) +{ + const UINT MAXSIZE = 1024; + DWORD dwRet = 0; + //DWORD rgdwBuf[MAXSIZE/sizeof(DWORD)]; + + + if (!pb) goto end; + + + // TODO: replace by crc32 + while(cb--) {dwRet ^= dwRet<<1 ^ *pb++;} + +#if (TODO) + // If buffer not dword aligned, we copy it over to a buffer which is, + // and pad it + if (cb & 0x3) + { + if (cb>=MAXSIZE) + { + ASSERT(FALSE); + goto end; + } + CopyMemory(rgdwBuf, pb, cb); + } +#endif (TODO) + +end: + return dwRet; +} + + +//---------------- ::AddToChecksumDW ---------------------------- +// Set *pdwChkSum to a new checksum, computed using it's previous value and dw. +void AddToChecksumDW(DWORD *pdwChkSum, DWORD dw) +{ + DWORD rgdw[2]; + rgdw[0] = *pdwChkSum; + rgdw[1] = dw; + + *pdwChkSum = Checksum((const BYTE *) rgdw, sizeof(rgdw)); +} diff --git a/private/unimodem/new/mic/chksum.h b/private/unimodem/new/mic/chksum.h new file mode 100644 index 000000000..e5af9e49f --- /dev/null +++ b/private/unimodem/new/mic/chksum.h @@ -0,0 +1,23 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// CHKSUM.H -- Header for Checksum computation +// +// History: +// 05/24/96 JosephJ Created +// +// +#ifndef _CHKSUM_H_ +#define _CHKSUM_H_ + +//---------------- ::Checksum ----------------------------------- +// Compute a 32-bit checksum of the specified bytes +// 0 is retured if pb==NULL or cb==0 +DWORD Checksum(const BYTE *pb, UINT cb); + +//---------------- ::AddToChecksumDW ---------------------------- +// Set *pdwChkSum to a new checksum, computed using it's previous value and dw. +void AddToChecksumDW(DWORD *pdwChkSum, DWORD dw); + +#endif // _CHKSUM_H_ diff --git a/private/unimodem/new/mic/common.h b/private/unimodem/new/mic/common.h new file mode 100644 index 000000000..6dfe74c45 --- /dev/null +++ b/private/unimodem/new/mic/common.h @@ -0,0 +1,32 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// COMMON.H -- Common header +// +// History: +// 05/22/96 JosephJ Created +// +// + +#ifndef _COMMON_H_ +#define _COMMON_H_ + +#include +#include + +#define ASSERT(_c) \ + ((_c) ? 0: printf( \ + "\n***Assertion failed in %s:%d\n***\n",\ + __FILE__,\ + __LINE__\ + )) + +#include "consts.h" +#include "chksum.h" +#include "ilist.h" +#include "sync.h" +#include "sym.h" +#include "globals.h" + + +#endif // _COMMON_H_ diff --git a/private/unimodem/new/mic/consts.h b/private/unimodem/new/mic/consts.h new file mode 100644 index 000000000..68d39d3b7 --- /dev/null +++ b/private/unimodem/new/mic/consts.h @@ -0,0 +1,30 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// CONSTS.H -- Common constants +// +// History: +// 06/13/96 JosephJ Created +// +// +#ifndef _CONSTS_H_ +#define _CONSTS_H_ + +// Platforms +enum ePLATFORM +{ + ePLAT_ALL, + ePLAT_NT_ALL, + ePLAT_NT_ALPHA, + ePLAT_NT_PPC, + ePLAT_NT_MIPS +}; + +// Object signatures. +enum eOBJSIG +{ + eOBJSIG_INVALID = 0, + eOBJSIG_CInfManufacturerSection = 1234 +}; + +#endif // _CONSTS_H_ diff --git a/private/unimodem/new/mic/dev.cpp b/private/unimodem/new/mic/dev.cpp new file mode 100644 index 000000000..051632a5c --- /dev/null +++ b/private/unimodem/new/mic/dev.cpp @@ -0,0 +1,1103 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// DEV.C -- Implementation for Classes: +// CInfDevice +// +// +// History: +// 05/22/96 JosephJ Created +// +// +#include "common.h" +#include "ini.h" +#include "inf.h" +#include "dev.h" + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfDevice +/////////////////////////////////////////////////////////////////////////// + + +//-------------- Dump ------------------ +// Dump state +void CInfDevice::Dump(void) const +{ + // Dump Version + m_pVersion->Dump(); + + // Dump manufacturer name + m_pSymManufacturerName->Dump(); + + // Dump model name + m_pSymDeviceName->Dump(); + + // Dump AddRegList + { + const CInfList *pList = m_pAddRegList; + + for (;pList; pList=pList->Next()) + { + const CInfAddRegEntry * pAddRegEntry = + (const CInfAddRegEntry *) pList->GetData(); + pAddRegEntry->Dump(); + } + + } + + // Dump CopyFilesList + { + const CInfList *pList = m_pCopyFilesList; + + for (;pList; pList=pList->Next()) + { + const CInfCopyFilesEntry * pCopyFilesEntry = + (const CInfCopyFilesEntry *) pList->GetData(); + pCopyFilesEntry->Dump(); + } + + } + + // NoResDup section + { + // [Modem6.NoResDup] + // UNIMODEMCC646872,UNIMODEMA4970248,UNIMODEMB6071C15 + + // TODO: unimplemented + + } + + // PosDup section + { + // [Modem12.PosDup] + // *PNP0500 + + // TODO: unimplemented + } + // TODO: UpdateInis, Uninstall, NoResDup, PosDup + +} + + +//-------------- Load ------------------ +// Load (init), using information from the specified inf file and model entry. +BOOL CInfDevice::Load +( + const CInfFile *pInf, + const CInfManufacturerEntry *pManuE, + const CInfModelEntry *pModelE +) +{ + BOOL fRet = FALSE; + + mfn_EnterCrit(); + + // TODO: call m_sync.BeginLoad + + ASSERT + ( + !m_pvInfSession + && !m_pInfFile + && !m_pManufacturerEntry + && !m_pModelEntry + && !m_pVersion + && !m_pSymManufacturerName + && !m_pSymDeviceName + && !m_pCopyFilesList + && !m_pAddRegList + ); + + if (!pInf || !pManuE || !pModelE) goto end; + + // Keep a reference to the Inf file and manufacturer and model entry + m_pInfFile = pInf; + m_pModelEntry = pModelE; + m_pManufacturerEntry = pManuE; + + // Open a session with the inf file. + m_pvInfSession = pInf->OpenSession (); + + if (!m_pvInfSession) + { + printf("Error calling pInf->OpenSession()\n"); + goto end; + } + + // version + m_pVersion = pInf->GetVersion(); + + // manufacturer name + m_pSymManufacturerName = pManuE->GetName(); + + // model name + m_pSymDeviceName = pModelE->GetName(); + + // TODO: UpdateInis, Uninstall + + if ( + m_pvInfSession + && m_pInfFile + && m_pModelEntry + && m_pManufacturerEntry + && m_pVersion + && m_pSymManufacturerName + && m_pSymDeviceName + ) + { + fRet = mfn_CreateAddRegList(pModelE); + fRet = fRet && mfn_CreateCopyFilesList(pModelE); + } + + // Create signatures + + // Version + m_dwSigVersion = m_pVersion->Checksum(); + + // Make and Model + m_dwSigManuAndModel = m_pSymManufacturerName->Checksum(); + AddToChecksumDW(&m_dwSigManuAndModel, m_pSymDeviceName->Checksum()); + + // Control Flags + m_dwSigFlags = m_pModelEntry->GetControlFlags(ePLAT_ALL); + AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_ALL)); + AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_ALPHA)); + AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_PPC)); + AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_MIPS)); + + // AddReg -- got created by mfn_CreateAddRegList + + // Copy files -- got created by mfn_CreateCopyFilesList + + // NoResDup and PosDup + { + const CInfInstallSection *pInstall = m_pModelEntry->GetInstallSection(); + DWORD dwSigNoResDup=0; + DWORD dwSigPosDup=0; + const CInfList *pSymList = pInstall->GetNoResDupIDList(); + while(pSymList) + { + const CInfSymbol *pSym = (const CInfSymbol *) pSymList->GetData(); + // We use XOR to combine the checksum, because we don't care about + // order. + dwSigNoResDup ^= pSym->Checksum(); + pSymList = pSymList->Next(); + } + + pSymList = pInstall->GetPosDupIDList(); + while(pSymList) + { + const CInfSymbol *pSym = (const CInfSymbol *) pSymList->GetData(); + // We use XOR to combine the checksum, because we don't care about + // order. + dwSigPosDup ^= pSym->Checksum(); + pSymList = pSymList->Next(); + } + + // Combine, and this time we *are* sensitive to the order. + m_dwSigDup = dwSigNoResDup; + AddToChecksumDW(&m_dwSigDup, dwSigPosDup); + } + + // Rank0 + m_dwSigRank0 = (m_pModelEntry->GetRank0ID())->Checksum(); + + // All ranks + m_dwSigRanks = m_dwSigRank0; + AddToChecksumDW(&m_dwSigRanks, (m_pModelEntry->GetRank1ID())->Checksum()); + AddToChecksumDW(&m_dwSigRanks, (m_pModelEntry->GetRank2ID())->Checksum()); + + // Signature of everything. + m_dwSigAll = m_dwSigVersion; + AddToChecksumDW(&m_dwSigAll, m_dwSigManuAndModel); + AddToChecksumDW(&m_dwSigAll, m_dwSigFlags); + AddToChecksumDW(&m_dwSigAll, m_dwSigAddReg); + AddToChecksumDW(&m_dwSigAll, m_dwSigCopyFiles); + AddToChecksumDW(&m_dwSigAll, m_dwSigDup); + AddToChecksumDW(&m_dwSigAll, m_dwSigRanks); + +end: + if (!fRet) + { + mfn_Cleanup(); + } + + mfn_LeaveCrit(); + + return fRet; +} + +//-------------- Unload ------------------ +// Unloads a previously loaded file. +HANDLE CInfDevice::Unload (void) +{ + HANDLE hUnload = NULL; + + mfn_EnterCrit(); + + // TODO: call m_sync.BeginUnload to try to put us in unloadable state. + + mfn_Cleanup(); + + mfn_LeaveCrit(); + + return hUnload; +} + +//-------------- WriteInf ------------------ +// Creates an inf file with all the information of this device. +BOOL CInfDevice::WriteInf(LPCTSTR lpctszIniFile) const +{ + // String-related constants + LPCTSTR lpctszStrings = TEXT("Strings"); + + BOOL fRet = FALSE; + const CInfSymbol * pSym=NULL; + + printf(TEXT("Writing inf [%s]\n"), lpctszIniFile); + + // Create/truncate file, and write header comment + if (!mfn_write_header(lpctszIniFile)) goto end; + +end: + return fRet; +} + + +// Cleanup by freeing any allocated resources. +void CInfDevice::mfn_Cleanup (void) +{ + mfn_EnterCrit(); + + // TODO: ASSERT(state == loading or state == unloading) + + if (m_pAddRegList) + { + // Explicitly cast to non-const because we're deleting it. + CInfList::FreeList((CInfList *) m_pAddRegList); + } + + if (m_pCopyFilesList) + { + // Explicitly cast to non-const because we're deleting it. + CInfList::FreeList((CInfList *) m_pCopyFilesList); + } + + if (m_pvInfSession) + { + ASSERT(m_pInfFile); + m_pInfFile->CloseSession(m_pvInfSession); + } + + m_pAddRegList = NULL; + m_pCopyFilesList = NULL; + m_pvInfSession = NULL; + m_pInfFile = NULL; + m_pModelEntry = NULL; + m_pManufacturerEntry = NULL; + m_pVersion = NULL; + m_pSymManufacturerName = NULL; + m_pSymDeviceName = NULL; + + m_dwSigVersion = 0; + m_dwSigManuAndModel = 0; + m_dwSigFlags = 0; + m_dwSigAddReg = 0; + m_dwSigCopyFiles = 0; + m_dwSigRank0 = 0; + m_dwSigRanks = 0; + + + mfn_LeaveCrit(); +} + + +// Initializes m_pAddRegList to list of addreg entries. +BOOL CInfDevice::mfn_CreateAddRegList(const CInfModelEntry *pModelE) +{ + const CInfInstallSection * pInstall = pModelE->GetInstallSection(); + const CInfList * pAddRegList = pInstall->GetAddRegSectionList(); + + ASSERT(!m_pAddRegList); + + // Initialize this here -- it is modified by mfn_AddToAddRegList. + m_dwSigAddReg = 0; + + // Walk AddReg list, adding each entry for each addreg section. + for (;pAddRegList; pAddRegList=pAddRegList->Next()) + { + const CInfAddRegSection * pAddRegSection = + (const CInfAddRegSection *) pAddRegList->GetData(); + + ASSERT(pAddRegSection); + + // Add all the entries in the section, overwriting previous entries + // with the same subkey/value-name. + const CInfAddRegEntry * pAddRegEntry = + pAddRegSection->GetFirstAddRegEntry (); + for(;pAddRegEntry; pAddRegEntry = pAddRegEntry->Next()) + { + mfn_AddToAddRegList(pAddRegEntry); + } + } + + return TRUE; +} + +void CInfDevice::mfn_AddToAddRegList (const CInfAddRegEntry *pAddRegEntry) +{ + // TODO: need to overwrite or not, depending on the addreg flags. + // for now, simply add to front of list. + m_pAddRegList = new CInfList ((void *) pAddRegEntry, m_pAddRegList); + AddToChecksumDW(&m_dwSigAddReg, pAddRegEntry->Checksum()); +} + +BOOL CInfDevice::mfn_CreateCopyFilesList(const CInfModelEntry *pModelE) +{ + + const CInfInstallSection * pInstall = pModelE->GetInstallSection(); + const CInfList * pCopyFilesList = pInstall->GetCopyFilesSectionList(); + + ASSERT(!m_pCopyFilesList); + + // Initialize this here -- it is modified by mfn_AddToCopyFilesList. + m_dwSigCopyFiles = 0; + + // Walk CopyFiles list, adding each entry for each copyfile section. + for (;pCopyFilesList; pCopyFilesList=pCopyFilesList->Next()) + { + const CInfCopyFilesSection * pCopyFilesSection = + (const CInfCopyFilesSection *) pCopyFilesList->GetData(); + + ASSERT(pCopyFilesSection); + + // Add all the entries in the section, overwriting previous entries + // with the name and destination. + const CInfCopyFilesEntry * pCopyFilesEntry = + pCopyFilesSection->GetFirstCopyFilesEntry(); + for(;pCopyFilesEntry; pCopyFilesEntry = pCopyFilesEntry->Next()) + { + mfn_AddToCopyFilesList(pCopyFilesEntry); + } + } + + return TRUE; +} + +void CInfDevice::mfn_AddToCopyFilesList ( + const CInfCopyFilesEntry *pCopyFilesEntry + ) +{ + // TODO: need to overwrite or not, depending on the addreg flags. + // for now, simply add to front of list. + m_pCopyFilesList = new CInfList ( + (void *) pCopyFilesEntry, + m_pCopyFilesList + ); + AddToChecksumDW(&m_dwSigCopyFiles, pCopyFilesEntry->Checksum()); +} + + + +// Create/Truncate inf file for just this device, and write header. +BOOL CInfDevice::mfn_write_header ( + LPCTSTR lpctszIniFile + ) +const +{ + LPCTSTR lpctszOrigFile = TEXT(""); + LPCTSTR lpctszManuS = TEXT(""); + LPCTSTR lpctszManuName = TEXT(""); + LPCTSTR lpctszModelLHS = TEXT(""); + LPCTSTR lpctszModelName = TEXT(""); + LPCTSTR lpctszRank0 = TEXT(""); + LPCTSTR lpctszRank1 = TEXT(""); + LPCTSTR lpctszRank2 = TEXT(""); + LPCTSTR lpctszProviderName = TEXT(""); + + BOOL fRet = FALSE; + const CInfSymbol * pSym=NULL; + + TCHAR rgchBuf[4098]; + HANDLE hFile=NULL; + + SYSTEMTIME st; + UINT u = 0; + GetLocalTime(&st); + + // Open file + { + TCHAR rgchPathName[MAX_PATH]; + const TCHAR tchBack = (TCHAR) '\\'; + const TCHAR tchColon = (TCHAR) ':'; + const uLen = lstrlen(lpctszIniFile); + + if (!uLen || (uLen+2) > sizeof(rgchPathName)/sizeof(TCHAR)) goto end; + + rgchPathName[0] = 0; + + u=0; + // Append %windir% if file name is not of the form + // "\.*" or "?:.*" + #if 0 // Don't do this anymore. + if ( (lpctszIniFile[0] != tchBack) + && (uLen<2 || lpctszIniFile[1]!=tchColon)) + { + const UINT uMax = sizeof(rgchPathName)/sizeof(TCHAR) - uLen - 2; + u = GetWindowsDirectory + ( + rgchPathName, + uMax + ); + + if (!u || u >= uMax) goto end; + lstrcpy(rgchPathName+u, TEXT("\\")); + u++; + } + #endif // 0 + + ASSERT((u+uLen+1)<(sizeof(rgchPathName)/sizeof(TCHAR))); + lstrcpy(rgchPathName+u, lpctszIniFile); + printf("Ini Path Name = [%s]\n", rgchPathName); + + + // Open file, nuke it if it exists. + hFile = CreateFile + ( + rgchPathName, + GENERIC_WRITE, + 0, // deny sharing + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + NULL + ); + + if (hFile==INVALID_HANDLE_VALUE) + { + printf("Create file fails with error %08lu\n", GetLastError()); + hFile = NULL; + goto end; + } + else + { + printf("File opened\n"); + } + } + + // write header. + { + //; + //; OUT.INF + //; + //; Inf generated for a single modem. + //; + //; Created: Fri 05-24-1996 12:13:42 + //; Checksum: 12507659 + //; Original Inf: mdmgen.inf/[Rockwell]/%Rockwell1% + //; Manufacturer: "Rockwell" + //; Model: "14400 bps PCMCIA Data-Fax Modem" + //; Rank0ID: GEN_Apex1 + //; Rank1ID: PCMCIA\RIPICAA-RC144ACL-845A + //; Rank2ID: PCMCIA\RIPICAA-YYY-ZZZ + //; + //; Rank0 Version M&M Flags AddReg CopyFile Ranks + //; SIG= 12342412 12222233 12334444 12234444 12244444 53265123 52366664 + //; + + const CInfSymbol *pSym = NULL; + + // File name + pSym = m_pInfFile->GetFileName(); + lpctszOrigFile = pSym->GetText(); + + // Manufacturer section name + { + const CInfManufacturerSection * pManuS = + m_pManufacturerEntry->GetManufacturerSection(); + if (pManuS) + { + pSym = pManuS->GetSectionName(); + lpctszManuS = pSym->GetText(); + } + } + + // Model entry name (LHS) + pSym = m_pModelEntry->GetLHS(); + lpctszModelLHS = pSym->GetText(); + + // Manufacturer name + pSym = m_pSymManufacturerName; + lpctszManuName = pSym->GetText(); + + // Model name + pSym = m_pSymDeviceName; + lpctszModelName = pSym->GetText(); + + // Rank 0 + pSym = m_pModelEntry->GetRank0ID(); + lpctszRank0 = pSym->GetText(); + + + // Rank 1 + pSym = m_pModelEntry->GetRank1ID(); + lpctszRank1 = pSym->GetText(); + + // Rank 1 + pSym = m_pModelEntry->GetRank1ID(); + lpctszRank1 = pSym->GetText(); + + u = wsprintf + ( + rgchBuf, + TEXT + ( + ";\r\n" + "; OUT.INF\r\n" + ";\r\n" + "; Inf generated for a single modem.\r\n" + ";\r\n" + "; Created: %02u-%02u-%04u %02u:%02u:%02u\r\n" + "; Checksum: %08lx\r\n" + ), + st.wMonth, + st.wDay, + st.wYear, + st.wHour, + st.wMinute, + st.wSecond, + m_dwSigAll + ); + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "; Original Inf: %s/[%s]/%s\r\n" + "; Manufacturer: \"%s\"\r\n" + "; Model: \"%s\"\r\n" + "; Rank0ID: %s\r\n" + "; Rank1ID: %s\r\n" + "; Rank2ID: %s\r\n" + ), + lpctszOrigFile, // original inf file + lpctszManuS, // manufacturer section + lpctszModelLHS, // model entry name + lpctszManuName, // manufacturer name + lpctszModelName,// model name + lpctszRank0, // Rank0 ID + lpctszRank1, // Rank1 ID + lpctszRank2 // Rank2 ID + ); + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + ";\r\n" +"; Rank0 Version M&M Flags AddReg CopyFile Dup Ranks\r\n" + "; SIG= %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\r\n" + ";\r\n" + ), + m_dwSigRank0, + m_dwSigVersion, + m_dwSigManuAndModel, + m_dwSigFlags, + m_dwSigAddReg, + m_dwSigCopyFiles, + m_dwSigDup, // NoResDup and PosDup + m_dwSigRanks + ); + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + } // end write header + + // Write Version + { + // Sample: + //; ---------------------- VERSION ------------------------------ + //[Version] + //LayoutFile=layout.inf + //Signature="$CHICAGO$" + //Class=Modem + //ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318} + //Provider=%provider% + + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "\r\n" + "\r\n" + "; ---------------------- VERSION ------------------------------\r\n" + "[Version]\r\n" + ) + ); + + // LayoutFile + pSym = m_pVersion->GetLayoutFile(); + if (pSym) + { + u+= wsprintf + ( + rgchBuf+u, + TEXT("LayoutFile=%s\r\n"), + pSym->GetText() + ); + } + + // Signature + pSym = m_pVersion->GetSignature(); + if (pSym) + { + u+= wsprintf + ( + rgchBuf+u, + TEXT("Signature=%s\r\n"), + pSym->GetText() + ); + } + + // Class + pSym = m_pVersion->GetClass(); + if (pSym) + { + u+= wsprintf + ( + rgchBuf+u, + TEXT("Class=%s\r\n"), + pSym->GetText() + ); + } + + // ClassGUID + pSym = m_pVersion->GetClassGUID(); + if (pSym) + { + u+= wsprintf + ( + rgchBuf+u, + TEXT("ClassGUID=%s\r\n"), + pSym->GetText() + ); + } + + // Provider + pSym = m_pVersion->GetProvider(); + if (pSym) + { + lpctszProviderName = pSym->GetText(); + u+= wsprintf + ( + rgchBuf+u, + TEXT("Provider=%%provider%%\r\n") + ); + } + + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + } // End writing version info + + + // Write Control flags section + // Sample: + // -------------------- CONTROLFLAGS --------------------------- + // [ControlFlags] + // ExcludeFromSelect=SERENUM\MNP0281 + // ExcludeFromSelect.NT=LPTENUM\MICROCOMTRAVELPORTE_1FF4 + { + DWORD dwFlagsAll; + DWORD dwFlagsNTAll; + DWORD dwFlagsNTAlpha; + DWORD dwFlagsNTPPC; + DWORD dwFlagsNTMips; + + u+= wsprintf + ( + rgchBuf+u, + TEXT( + "\r\n" + "\r\n" + "; -------------------- CONTROLFLAGS ---------------------------\r\n" + "[ControlFlags]\r\n" + ) + ); + + dwFlagsAll = m_pModelEntry->GetControlFlags(ePLAT_ALL); + dwFlagsNTAll = m_pModelEntry->GetControlFlags(ePLAT_NT_ALL); + dwFlagsNTAlpha = m_pModelEntry->GetControlFlags(ePLAT_NT_ALPHA); + dwFlagsNTPPC = m_pModelEntry->GetControlFlags(ePLAT_NT_PPC); + dwFlagsNTMips = m_pModelEntry->GetControlFlags(ePLAT_NT_MIPS); + + if(dwFlagsAll & dwCF_EXCLUDE_FROM_SELECT) + { + u+= wsprintf + ( + rgchBuf+u, + TEXT("ExcludeFromSelect=%s\r\n"), + lpctszRank0 + ); + } + + if(dwFlagsNTAll & dwCF_EXCLUDE_FROM_SELECT) + { + u+= wsprintf + ( + rgchBuf+u, + TEXT("ExcludeFromSelect.NT=%s\r\n"), + lpctszRank0 + ); + } + + if(dwFlagsNTAlpha & dwCF_EXCLUDE_FROM_SELECT) + { + u+= wsprintf + ( + rgchBuf+u, + TEXT("ExcludeFromSelect.NT.Alpha=%s\r\n"), + lpctszRank0 + ); + } + + if(dwFlagsNTPPC & dwCF_EXCLUDE_FROM_SELECT) + { + u+= wsprintf + ( + rgchBuf+u, + TEXT("ExcludeFromSelect.NT.PPC=%s\r\n"), + lpctszRank0 + ); + } + + if(dwFlagsNTMips & dwCF_EXCLUDE_FROM_SELECT) + { + u+= wsprintf + ( + rgchBuf+u, + TEXT("ExcludeFromSelect.NT.Mips=%s\r\n"), + lpctszRank0 + ); + } + + // TODO: unimplemented: Other control flags. + + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + } // End writing control flags section + + + // Write Manufacturer section + { + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "\r\n" + "\r\n" + "; -------------------- MANUFACTURER ---------------------------\r\n" + "[Manufacturer]\r\n" + "%%make%%= Make\r\n" + ) + ); + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + } // End writing Manufacturer section + + + // Write make section + { + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "\r\n" + "\r\n" + "; ----------------------- MAKE --------------------------------\r\n" + "[Make]\r\n" + "%%model%%= Model, %s" + ), + lpctszRank0 + ); + if (*lpctszRank1 || *lpctszRank2) + { + u+= wsprintf (rgchBuf+u, ", %s", lpctszRank1); + } + if (*lpctszRank2) + { + u+= wsprintf (rgchBuf+u, ", %s", lpctszRank2); + } + + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + } // End writing make section + + // Write Model section + { + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "\r\n" + "\r\n" + "\r\n" + "; ----------------------- MODEL -------------------------------\r\n" + "[Model]\r\n" + "AddReg=AddReg\r\n" + "CopyFiles=CopyFiles\r\n" + ) + ); + + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + } // End writing Model section + + + // NoResDup section + { + // [Make.NoResDup] + // UNIMODEMCC646872,UNIMODEMA4970248,UNIMODEMB6071C15 + const CInfInstallSection *pInstall = m_pModelEntry->GetInstallSection(); + const CInfList *pSymList = pInstall->GetNoResDupIDList(); + const CInfSymbol *pSym = NULL; + + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "\r\n" + "\r\n" + "; ---------------------- NORESDUP -----------------------------\r\n" + "[Model.NoResDup]\r\n" + ) + ); + + while(pSymList) + { + if (pSym) { u+= wsprintf (rgchBuf+u, TEXT(",")); } + pSym = (const CInfSymbol *) pSymList->GetData(); + u+= wsprintf (rgchBuf+u, TEXT("%s"), pSym->GetText()); + + pSymList = pSymList->Next(); + } + + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + } + + + // PosDup section + { + // [Make.PosDup] + // *PNP0500 + const CInfInstallSection *pInstall = m_pModelEntry->GetInstallSection(); + const CInfList *pSymList = pInstall->GetPosDupIDList(); + const CInfSymbol *pSym = NULL; + + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "\r\n" + "\r\n" + "; ---------------------- POSDUP -------------------------------\r\n" + "[Model.PosDup]\r\n" + ) + ); + + while(pSymList) + { + if (pSym) { u+= wsprintf (rgchBuf+u, TEXT(",")); } + pSym = (const CInfSymbol *) pSymList->GetData(); + u+= wsprintf (rgchBuf+u, TEXT("%s"), pSym->GetText()); + + pSymList = pSymList->Next(); + } + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + } + + + // Write CopyFiles section + // BUGBUG: we need the concept of muliple copy-file sections, because + // each section can have a different destination dir. + // Also: the CopyFiles.NT, etc sections. + { + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "\r\n" + "\r\n" + "; --------------------- COPYFILES -----------------------------\r\n" + "[CopyFiles]\r\n" + ) + ); + + // Now write each copyfile entry + { + const CInfList *pList = m_pCopyFilesList; + + for (;pList; pList=pList->Next()) + { + // TODO: unimplemented + } + + } + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + + } // End writing CopyFiles section + + + // Write DestinationDirs section + { + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "\r\n" + "\r\n" + "; ------------------- DESTINATIONDIRS -------------------------\r\n" + "[DestinationDirs]\r\n" + ) + ); + + // Now write each copyfile entry + // TODO: Need to construct destination-dirs entries + + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + + } // End writing DestinationDirs section + + + // TODO: UpdateInis, Uninstall + + + // Write Addreg section + { + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "\r\n" + "\r\n" + "; ---------------------- ADDREG -------------------------------\r\n" + "[AddReg]\r\n" + ) + ); + + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + + // Now write each addreg entry + { + const CInfList *pList = m_pAddRegList; + + for (;pList; pList=pList->Next()) + { + LPCTSTR lpctszRegRoot = TEXT(""); + LPCTSTR lpctszSubKey = TEXT(""); + LPCTSTR lpctszValueName = TEXT(""); + TCHAR rgchFlag[20] = TEXT(""); + LPCTSTR lpctszValue = TEXT(""); + DWORD dwFlag = MAXDWORD; + const CInfSymbol *pSym = NULL; + const CInfAddRegEntry * pARE = + (const CInfAddRegEntry *) pList->GetData(); + ASSERT(pARE); + + pSym = pARE->GetRegRoot(); + lpctszRegRoot = pSym->GetText(); + + pSym = pARE->GetSubKey(); + lpctszSubKey = pSym->GetText(); + + pSym = pARE->GetValueName(); + lpctszValueName = pSym->GetText(); + + dwFlag = pARE->GetFlag(); + if (dwFlag!=MAXDWORD) + { + wsprintf(rgchFlag, TEXT("%lu"), dwFlag); + } + + pSym = pARE->GetValue(); + lpctszValue = pSym->GetText(); + +//HKR, Settings, Prefix,, "AT" +//HKR, Responses, "AUTOSTREAM: LEVEL 3", 1, 01, 00, 00,00,00,00, 00,00,00,00 + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "%s, %s, %s, %s, %s\r\n" + ), + lpctszRegRoot, + lpctszSubKey, + lpctszValueName, + rgchFlag, + lpctszValue + ); + } + + } + } // End writing addreg section + + + // Write Strings section + { + + u+= wsprintf + ( + rgchBuf+u, + TEXT + ( + "\r\n" + "\r\n" + "; ---------------------- STRINGS ------------------------------\r\n" + "[Strings]\r\n" + "provider=\"%s\"\r\n" + "make=\"%s\"\r\n" + "model=\"%s\"\r\n" + ), + lpctszProviderName, + lpctszManuName, + lpctszModelName + ); + + ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR)); + + } // End Strings flags section + + DWORD dwWr; + if (!WriteFile(hFile, (LPBYTE) rgchBuf, u*sizeof(TCHAR), &dwWr, NULL)) + { + printf("Write file fails with error %08lu\n", GetLastError()); + goto end; + } + else + { + printf("Write file succeeded\n"); + } + + fRet = TRUE; + +end: + if (hFile) CloseHandle(hFile); + + return fRet; +} diff --git a/private/unimodem/new/mic/dev.h b/private/unimodem/new/mic/dev.h new file mode 100644 index 000000000..695571f35 --- /dev/null +++ b/private/unimodem/new/mic/dev.h @@ -0,0 +1,136 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// DEV.H -- Header for Classes: +// CInfDevice +// +// +// History: +// 05/22/96 JosephJ Created +// +// + + +class CInfDevice; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfDevice +/////////////////////////////////////////////////////////////////////////// +// +// Represents a single device, as specified by an inf (device information) +// file. +// + +class CInfDevice +{ + +public: + + CInfDevice(const CInfDevice *pNext) + : m_pNext(pNext), + m_sync(), + + m_pvInfSession(NULL), + m_pInfFile(NULL), + m_pManufacturerEntry(NULL), + m_pModelEntry(NULL), + m_pVersion(NULL), + m_pSymManufacturerName(NULL), + m_pSymDeviceName(NULL), + m_pAddRegList(NULL), + m_pCopyFilesList(NULL), + + m_dwSigVersion(101), + m_dwSigManuAndModel(102), + m_dwSigFlags(103), + m_dwSigAddReg(104), + m_dwSigCopyFiles(105), + m_dwSigDup(106), + m_dwSigRank0(107), + m_dwSigRanks(108), + m_dwSigAll(109) + {} + + ~CInfDevice() {} + + // --------------- Dump --------------- + // Dump state + void Dump(void) const; + + // --------------- Load --------------- + // Load (init) the device specifed by the inf file and model entry. + BOOL Load ( + const CInfFile *pInf, + const CInfManufacturerEntry *pManuE, + const CInfModelEntry *pModelE + ); + + //-------------- Unload ------------------ + // Unloads a previously loaded file. If there are open sessions to this + // object, Unload returns a handle which will be signalled when all + // sessions are closed. New sessions will not be allowed after this + // function returns. The call should free the handle. + HANDLE Unload (void); + + //-------------- WriteInf ------------------ + // Creates an inf file with all the information of this device. + BOOL WriteInf(LPCTSTR lpctszIniFile) const; + + //-------------- GetRank0Checksum ---------- + // Returns signature of the rank0 ID + DWORD Rank0Checksum(void) const {return m_dwSigRank0;} + + //-------------- Checksum -------------- + // Returns combined checksum for this device. + DWORD Checksum(void) const {return m_dwSigAll;} + + #if (TODO) + UpdateInisSection + UninstallSection + NoResDupIDList + PosDupIDList + #endif // (TODO) + + +private: + + const CInfDevice * m_pNext; + CSync m_sync; + + const void * m_pvInfSession; + + const CInfFile * m_pInfFile; + const CInfManufacturerEntry *m_pManufacturerEntry; + const CInfModelEntry * m_pModelEntry; + + const CInfVersionSection * m_pVersion; + const CInfSymbol * m_pSymManufacturerName; + const CInfSymbol * m_pSymDeviceName; + + const CInfList * m_pAddRegList; + const CInfList * m_pCopyFilesList; + + BOOL mfn_CreateAddRegList (const CInfModelEntry *); + BOOL mfn_CreateCopyFilesList (const CInfModelEntry *); + void mfn_AddToAddRegList (const CInfAddRegEntry *); + void mfn_AddToCopyFilesList (const CInfCopyFilesEntry *); + void mfn_Cleanup (void); + BOOL mfn_write_header (LPCTSTR lpctszIniFile) const; + + void mfn_EnterCrit(void) const {m_sync.EnterCrit();} + void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();} + + DWORD m_dwSigVersion; // Checksum of version section + DWORD m_dwSigManuAndModel;// Checksum of manufacturer name & model name + DWORD m_dwSigFlags; // Group-checksum of control flags. + DWORD m_dwSigAddReg; // Group-checksum of add reg section + DWORD m_dwSigCopyFiles; // Group-checksum of copyfile section + DWORD m_dwSigDup; // Group-checksum of NoResDup and PosDup. + DWORD m_dwSigRank0; // Group-checksum of all ranks. + DWORD m_dwSigRanks; // Group-checksum of all ranks. + DWORD m_dwSigAll; // Checksum of all the info of this device + // including version, manufacturer-name & + // model-name +}; diff --git a/private/unimodem/new/mic/globals.cpp b/private/unimodem/new/mic/globals.cpp new file mode 100644 index 000000000..b25209b6d --- /dev/null +++ b/private/unimodem/new/mic/globals.cpp @@ -0,0 +1,53 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// GLOBALS.CPP -- Defines global data: +// CInfSymbolTable gSymtab; +// +// History: +// 05/27/96 JosephJ Created +// +// +#include "common.h" + +//----------------------- gSymtab ------------------------------- +// Global symbol table. +CInfSymbolTable gSymtab; + + + +// --------------------- Global Property Symbols ---------------- +const CInfSymbol *g_pSymPropCopyFilesSection; +const CInfSymbol *g_pSymPropManufacturerSection; +const CInfSymbol *g_pSymPropAddRegSection; + +LPCTSTR lpctszPropCopyFilesSection = TEXT("InfCFS"); +LPCTSTR lpctszPropManufacturerSection = TEXT("InfMS"); +LPCTSTR lpctszPropAddRegSection = TEXT("InfARS"); + +BOOL InitializePropertySymbols(void); + + +BOOL InitGlobals(void) +{ + return InitializePropertySymbols(); +} + + +BOOL InitializePropertySymbols(void) +{ + g_pSymPropCopyFilesSection = gSymtab.Lookup( + lpctszPropCopyFilesSection, + TRUE + ); + g_pSymPropManufacturerSection = gSymtab.Lookup( + lpctszPropManufacturerSection, + TRUE + ); + g_pSymPropAddRegSection = gSymtab.Lookup(lpctszPropAddRegSection, TRUE); + + return g_pSymPropCopyFilesSection + && g_pSymPropManufacturerSection + && g_pSymPropAddRegSection; +} diff --git a/private/unimodem/new/mic/globals.h b/private/unimodem/new/mic/globals.h new file mode 100644 index 000000000..b1bf94e22 --- /dev/null +++ b/private/unimodem/new/mic/globals.h @@ -0,0 +1,28 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// GLOBALS.H -- Declares global data: +// CInfSymbolTable gSymtab; +// +// History: +// 05/27/96 JosephJ Created +// +// + +//----------------------- gSymtab ------------------------------- +// Global symbol table. +// This symbol table maintains a global pool of strings -- only one copy of +// each unique string is maintained. +extern CInfSymbolTable gSymtab; + +// --------------------- Global Property Symbols ---------------- +extern const CInfSymbol *g_pSymPropCopyFilesSection; +extern const CInfSymbol *g_pSymPropManufacturerSection; +extern const CInfSymbol *g_pSymPropAddRegSection; +#define PROP_INFSECTION_MANUFACTURER g_pSymPropManufacturerSection +#define PROP_INFSECTION_COPYFILES g_pSymPropCopyFilesSection +#define PROP_INFSECTION_ADDREG g_pSymPropAddRegSection + + +BOOL InitGlobals(void); diff --git a/private/unimodem/new/mic/ilist.cpp b/private/unimodem/new/mic/ilist.cpp new file mode 100644 index 000000000..64350a621 --- /dev/null +++ b/private/unimodem/new/mic/ilist.cpp @@ -0,0 +1,58 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// ILIST.CPP -- Implementation for Classes: +// CInfList +// +// +// History: +// 05/27/96 JosephJ Created +// +// +#include "common.h" + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfList +/////////////////////////////////////////////////////////////////////////// + +// Simple singly-linked list which can not be modified once it's been +// created. Assumes creation and eventual deletion are protected by some +// external critical section. +// +// Sample: +// for (; pList; pList = pList->Next()) +// { +// const CInfAddregSection *pAS = (CInfAddregSection *) pList->GetData(); +// } + +//-------------- FreeList ------------------ +// Distroys the list. +void +CInfList::FreeList (CInfList *pList) +{ + while(pList) + { + // Cast to get rid of the const declaration of pList->Next(). + CInfList *pNext = (CInfList *) pList->Next(); + delete pList; + pList = pNext; + } +} + +//-------------- ReverseList ------------------ +// Reverses the specified list. +void +CInfList::ReverseList (const CInfList **ppList) +{ + CInfList *pList = (CInfList *) *ppList; // override const + const CInfList *pPrev = NULL; + while(pList) + { + const CInfList *pTmp = pList->Next(); + pList->mfn_SetNext(pPrev); + pPrev = pList; + pList = (CInfList *) pTmp; // override const + } + *ppList = pPrev; +} diff --git a/private/unimodem/new/mic/ilist.h b/private/unimodem/new/mic/ilist.h new file mode 100644 index 000000000..ee91756f5 --- /dev/null +++ b/private/unimodem/new/mic/ilist.h @@ -0,0 +1,66 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// ILIST.H -- Header for Classes: +// CInfList +// +// +// History: +// 05/22/96 JosephJ Created +// +// + + +class CInfList; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfList +/////////////////////////////////////////////////////////////////////////// + +// Simple singly-linked list which can not be modified once it's been +// created. Assumes creation and eventual deletion are protected by some +// external critical section. +// +// Sample: +// for (; pList; pList = pList->Next()) +// { +// const CInfAddregSection *pAS = (CInfAddregSection *) pList->GetData(); +// } + +class CInfList +{ + +public: + + CInfList(void *pvData, const CInfList *pNext) + : m_pvData(pvData), m_pNext(pNext) {} + ~CInfList() {} + + //-------------- GetData ------------------ + const void * GetData (void) const {return m_pvData;} + + //-------------- Next ------------------ + const CInfList * Next (void) const {return m_pNext;} + + //-------------- FreeList ------------------ + // Distroys the specified list. + static void FreeList(CInfList *); + + //-------------- ReverseList ------------------ + // Reverses the specified list. + static void ReverseList(const CInfList **); + +private: + + void mfn_SetNext(const CInfList * pNewNext) + { + m_pNext = pNewNext; + } + + void * m_pvData; + const CInfList * m_pNext; + +}; + diff --git a/private/unimodem/new/mic/inf.cpp b/private/unimodem/new/mic/inf.cpp new file mode 100644 index 000000000..471530a1d --- /dev/null +++ b/private/unimodem/new/mic/inf.cpp @@ -0,0 +1,903 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// INF.CPP -- Implemtation for Classes: +// CInfFile +// +// History: +// 05/21/96 JosephJ Created +// +// +#include "common.h" +#include "ini.h" +#include "inf.h" + +// Version-related constants +LPCTSTR lpctszVersion = TEXT("Version"); +LPCTSTR lpctszLayoutFile = TEXT("LayoutFile"); +LPCTSTR lpctszSignature = TEXT("Signature"); +LPCTSTR lpctszClass = TEXT("Class"); +LPCTSTR lpctszClassGUID = TEXT("ClassGUID"); +LPCTSTR lpctszProvider = TEXT("Provider"); + + +LPCTSTR lpctszManufacturer = TEXT("Manufacturer"); +LPCTSTR lpctszControlFlags = TEXT("ControlFlags"); +LPCTSTR lpctszStrings = TEXT("Strings"); + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfFile +/////////////////////////////////////////////////////////////////////////// + + +CInfFile::CInfFile(void) +{ + m_pVersion=NULL; + m_pFirstManuE=NULL; + m_pSymFileName=NULL; + m_pIniFile=NULL; +} + + +CInfFile::~CInfFile() +{ + mfn_EnterCrit(); + + // Free resources -- there should be none to free... + ASSERT(!m_pVersion); + ASSERT(!m_pFirstManuE); + ASSERT(!m_pIniFile); + +} + + +//-------------- Load ------------------ +// Loads the specified file. (Obviously) only one file can be loaded at +// a time. +BOOL CInfFile::Load (const TCHAR rgchPathname[]) +{ + BOOL fRet = FALSE; + + mfn_EnterCrit(); + + // TODO: call m_sync.BeginLoad + + ASSERT(!m_pVersion); + ASSERT(!m_pFirstManuE); + ASSERT(!m_pIniFile); + + // Save file name + m_pSymFileName = gSymtab.Lookup(rgchPathname, TRUE); + if (!m_pSymFileName) goto end; + + // Create and Load Ini File + m_pIniFile = new CIniFile; + if (m_pIniFile) + { + if (!m_pIniFile->Load(rgchPathname)) + { + delete m_pIniFile; + m_pIniFile=NULL; + } + } + if (!m_pIniFile) goto end; + + // Create and Load version + { + CInfVersionSection *pVS = new CInfVersionSection; + if (pVS) + { + // Override const * declaration of m_pVersion + if (!pVS->Load(m_pIniFile)) + { + delete pVS; + pVS=NULL; + } + } + m_pVersion = pVS; + } + if (!m_pVersion) goto end; + + // Create and load Manufacturer list... + m_pFirstManuE = sfn_CreateManufacturerList(m_pIniFile); + if (!m_pFirstManuE) goto end; + + fRet = TRUE; + +end: + + if (!fRet) + { + mfn_Cleanup(); + } + + mfn_LeaveCrit(); + + return fRet; +} + + +//-------------- Unload ------------------ +// Unloads a previously loaded file. If there are open sessions to this +// object, Unload returns a handle which will be signalled when all +// sessions are closed. New sessions will not be allowed after this +// function returns. The call should free the handle. +HANDLE CInfFile::Unload (void) +{ + HANDLE hUnload = NULL; + + mfn_EnterCrit(); + + // TODO: call m_sync.BeginUnload to try to put us in unloadable state. + + mfn_Cleanup(); + + mfn_LeaveCrit(); + + + return hUnload; +} + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfVersionSection +/////////////////////////////////////////////////////////////////////////// + +// Sample Version section: +// [Version] +// LayoutFile=layout.inf +// Signature="$CHICAGO$" +// Class=Modem +// ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318} +// Provider=%MS% + + +//-------------- Load ------------------ +// TODO: unimplemented +BOOL CInfVersionSection::Load (const CIniFile *pIniFile) +{ + BOOL fRet = FALSE; + const CIniFileSection *pISVer = pIniFile->LookupSection(lpctszVersion); + const CIniFileSection *pISStr = pIniFile->LookupSection(lpctszStrings); + const CIniFileEntry *pIE = NULL; + +#if 0 + m_pSymLayoutFile = gSymtab.Lookup(TEXT("layout.inf"), TRUE); + m_pSymSignature = gSymtab.Lookup(TEXT("\"$CHICAGO$\""), TRUE); + m_pSymClass = gSymtab.Lookup(TEXT("Modem"), TRUE); + m_pSymClassGUID = gSymtab.Lookup + ( + TEXT("{4D36E96D-E325-11CE-BFC1-08002BE10318}"), + TRUE + ); + m_pSymProvider = gSymtab.Lookup(TEXT("Microsoft"), TRUE); + + m_dwChecksum = 0x12345678L; +#endif + + ASSERT + ( + !m_pSymLayoutFile + && !m_pSymSignature + && !m_pSymClass + && !m_pSymClassGUID + && !m_pSymProvider + && !m_dwChecksum + ); + + if (!pISVer || !pISStr) goto end; + + // LayoutFile=layout.inf + pIE = pISVer->LookupEntry(lpctszLayoutFile); + if (pIE) + { + m_pSymLayoutFile = pIE->GetRHS(); + pIE->Release();pIE=NULL; + // TODO: further checks here + } + + // Signature="$CHICAGO$" + pIE = pISVer->LookupEntry(lpctszSignature); + if (pIE) + { + m_pSymSignature = pIE->GetRHS(); + pIE->Release();pIE=NULL; + // TODO: further checks here + } + + // Class=Modem + pIE = pISVer->LookupEntry(lpctszClass); + if (pIE) + { + m_pSymClass = pIE->GetRHS(); + pIE->Release();pIE=NULL; + // TODO: further checks here + } + + // ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318} + pIE = pISVer->LookupEntry(lpctszClassGUID); + if (pIE) + { + m_pSymClassGUID = pIE->GetRHS(); + pIE->Release();pIE=NULL; + // TODO: further checks here + } + + // Provider=%MS% + pIE = pISVer->LookupEntry(lpctszProvider); + if (pIE) + { + const CInfSymbol *pSymLHS = pIE->GetLHS(); + pIE->Release();pIE=NULL; + + if (pSymLHS) + { + pIE = pISStr->LookupEntry(pSymLHS->GetText()); + if (pIE) + { + m_pSymProvider = pIE->GetRHS(); + pIE->Release();pIE=NULL; + } + } + // TODO: further checks here + } + + // Compute checksum of entire version structure + m_dwChecksum = m_pSymLayoutFile->Checksum(); + AddToChecksumDW(&m_dwChecksum, m_pSymSignature->Checksum()); + AddToChecksumDW(&m_dwChecksum, m_pSymClass->Checksum()); + AddToChecksumDW(&m_dwChecksum, m_pSymClassGUID->Checksum()); + AddToChecksumDW(&m_dwChecksum, m_pSymProvider->Checksum()); + + fRet =TRUE; + +end: + + if (pIE) { pIE->Release(); pIE=NULL; } + if (pISVer) { pISVer->Release(); pISVer=NULL; } + if (pISStr) { pISStr->Release(); pISStr=NULL; } + + if (!fRet) + { + mfn_Cleanup(); + } + + return fRet; +} + + +//-------------- Unload ------------------ +void CInfVersionSection::Unload (void) +{ + // TODO: call m_sync.BeginUnload to try to put us in unloadable state. + + mfn_Cleanup(); + + return; +} + + + +//-------------- Dump ------------------ +// Dump state +void +CInfVersionSection::Dump(void) +const +{ +} + +// Cleanup by freeing any allocated resources. +void CInfVersionSection::mfn_Cleanup (void) +{ + m_pSymLayoutFile = NULL; + m_pSymSignature = NULL; + m_pSymClass = NULL;; + m_pSymClassGUID = NULL; + m_pSymProvider = NULL; + m_dwChecksum = 0; +} + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfManufacturerEntry +/////////////////////////////////////////////////////////////////////////// + +// Sample Manufacturer list section: +// [Manufacturer] +// %Generic% = Generic +// %MagicRam% = MagicRam +// .. + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfManufacturerSection +/////////////////////////////////////////////////////////////////////////// + +// Sample Manufacturer section: +// [Generic] +// %Gen% = Gen, MDMGEN +// %Gen3% = Gen3, MDMGEN3 +// %Gen12% = Gen12, MDMGEN12 +// %Gen24% = Gen24, MDMGEN24 +// ... + + +// --------------- GetFirstModelEntry -------------- +// Get first model entry +const CInfModelEntry * +CInfManufacturerSection::GetFirstModelEntry (void) +const +{ + return m_pFirstModelE; +} + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfInstallSection +/////////////////////////////////////////////////////////////////////////// + +// Sample Install section: +// [Modem29] +// AddReg=All, MfgAddReg, ROCK_VOICE_ALL, ROCK_VOICE_SERWAVE, INTERNAL +// CopyFiles = VV_Sys, VV_Sock_Sys, VV_App, VV_Help +// UpdateInis = VView.Inis +// Uninstall = VoiceView_remove +// +// Also contains info from the related PosDup and NoResDup sections. + + +// --------------- GetAddRegSectionList ---------- +// Get generic list whose data items are pointers to +// CInfAddRegSection objects +const CInfList * +CInfInstallSection::GetAddRegSectionList (void) +const +{ + // TODO: unimplemented + + static const CInfAddRegSection AddRegSection; + static const CInfList AddRegSectionList((void *) &AddRegSection, NULL); + + return &AddRegSectionList; +} + + +// --------------- GetCopyFilesSectionList ---------- +// Get generic list whose data items are pointers to +// CInfCopyFilesSection objects +const CInfList * +CInfInstallSection::GetCopyFilesSectionList (void) +const +{ + // TODO: unimplemented + + static const CInfCopyFilesSection CopyFilesSection; + static const CInfList CopyFilesSectionList((void *) &CopyFilesSection, NULL); + + return &CopyFilesSectionList; +} + + +// --------------- GetNoResDupIDList ---------- +// Get generic list whose data items are pointers to +// InfSymbol objects representing the Rank0 IDs in the corresponding +// NoResDup section. +const CInfList * +CInfInstallSection::GetNoResDupIDList (void) +const +{ + // TODO: unimplemented + + static const CInfList NoResDupIDList + ( + (void *) gSymtab.Lookup(TEXT("NORESDUP-ID"), TRUE), + NULL + ); + + return &NoResDupIDList; +} + + +// --------------- GetPosDupIDList ---------- +// Get generic list whose data items are pointers to +// InfSymbol objects representing the Rank0 IDs in the corresponding +// PosDup section. +// const CInfList * GetPosDupIDList (void) const; +const CInfList * +CInfInstallSection::GetPosDupIDList (void) +const +{ + // TODO: unimplemented + static const CInfList PosDupIDList1 + ( + (void *) gSymtab.Lookup(TEXT("POSDUP-ID1"), TRUE), + NULL + ); + static const CInfList PosDupIDList + ( + (void *) gSymtab.Lookup(TEXT("POSDUP-ID0"), TRUE), + &PosDupIDList1 + ); + + return &PosDupIDList; +} + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfAddRegSection +/////////////////////////////////////////////////////////////////////////// + +// Sample AddReg section: +// [All] +// HKR,,FriendlyDriver,,Unimodem.vxd +// HKR,,DevLoader,,*vcomm +// HKR,,ConfigDialog,,modemui.dll +// HKR,,EnumPropPages,,"modemui.dll,EnumPropPages" +// HKR,,PortSubClass,1,02 +// HKR, Init, 1,, "AT" +// HKR, Responses, "OK", 1, 00, 00, 00,00,00,00, ...etc. +// HKR, Responses, "ERROR", 1, 03, 00, 00,00,00, ...etc. + + +// Get first addreg entry +const CInfAddRegEntry * +CInfAddRegSection::GetFirstAddRegEntry (void) +const +{ + // TODO -- fake static entries + static const CInfAddRegEntry FirstAddRegEntry; + return &FirstAddRegEntry; +} + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfCopyFilesSection +/////////////////////////////////////////////////////////////////////////// + +// Sample DestinationDirs section: +// [DestinationDirs] +// Register.Copy = 17 ;LDID_INF +// VV_Sys = 11 +// VV_Sock_Sys = 11 ;LDID_SYS \Windows\system dir +// VV_Sock_Win = 10 ;LDID_WIN \Windows dir +// VV_App = 10 +// VV_Help = 18 ;LDID_HELP + +// Sample Copyfiles section: +// [VV_Sys] +// fte.dll +// vvexe32.exe +// wsvv.vxd + + +// --------------- GetFirstCopyFilesEntry ---------- +// Get first copyfiles entry +const CInfCopyFilesEntry * +CInfCopyFilesSection::GetFirstCopyFilesEntry (void) const +{ + // TODO -- fake static entries + static const CInfCopyFilesEntry FirstCopyFilesEntry; + return &FirstCopyFilesEntry; +} + + +// Cleanup by freeing any allocated resources. +// TODO: unimplemented +void CInfFile::mfn_Cleanup (void) +{ + mfn_EnterCrit(); + + // TODO: ASSERT(state == loading or state == unloading) + + // Unload and free version + if (m_pVersion) + { + // override const * + CInfVersionSection *pVS = (CInfVersionSection *) m_pVersion; + pVS->Unload(); + delete pVS; + m_pVersion=NULL; + } + + + // Unload and free Manufacturerlist. + if (m_pFirstManuE) + { + sfn_DeleteManufacturerList(m_pFirstManuE); + m_pFirstManuE=NULL; + } + + if (m_pIniFile) + { + m_pIniFile->Unload(); + delete (CIniFile *) m_pIniFile; // override const * + m_pIniFile=NULL; + } + + m_pSymFileName=NULL; + + mfn_LeaveCrit(); +} + +// static helper function... +const CInfManufacturerEntry * +CInfFile::sfn_CreateManufacturerList (CIniFile *pIniFile) +{ + CInfManufacturerEntry * pManuE = NULL; + const CIniFileSection *pISStr = pIniFile->LookupSection(lpctszStrings); + const CIniFileSection *pISManL = + pIniFile->LookupSection(lpctszManufacturer); + CIniFileEntry *pIE = NULL; + + if (!pISManL || !pISStr) goto end; + + pIE = pISManL->GetFirstEntry(); + if (!pIE) goto end; + + // Iterate through manufacturers, building manufacturer entries... + do + { + pManuE = new CInfManufacturerEntry(pManuE); + if (!pManuE || !pManuE->Load(pIniFile, pISStr, pIE)) + { + // TODO: warning; for now break out. + if (pManuE) + { + // TODO delete previously-created elements of the list as well! + // (Or leave them there and deal with a partial list). + delete pManuE; + pManuE = NULL; + } + goto end; + } + + } while(pIE->BecomeNext()); + + // Reverse list + CInfManufacturerEntry::ReverseList(&pManuE); + +end: + if (pIE) {pIE->Release(); pIE=NULL;} + if (pISManL) { pISManL->Release(); pISManL=NULL; } + if (pISStr) { pISStr->Release(); pISStr=NULL; } + + return pManuE; +} + +// Static helper function +void +CInfFile::sfn_DeleteManufacturerList +( + const CInfManufacturerEntry * pManuEFirst +) +{ + // TODO +} + +// --------------- Load ------------------ +BOOL +CInfManufacturerEntry::Load +( + const CIniFile *pIniFile, + const CIniFileSection *pISStr, + const CIniFileEntry *pIE +) +{ + BOOL fRet = FALSE; + const CInfSymbol *pSymLHS = pIE->GetLHS(); + const CInfSymbol *pSymManuName = NULL; + // TODO need to make manu-section case insensitive! + // Basically pSymManuSection should be created based on an upper-case'd + // version of pIE->GetRHS(). + const CInfSymbol *pSymManuSection = pIE->GetRHS(); + CInfManufacturerSection *pManuS = NULL; + BOOL fNew=FALSE; + + ASSERT(!m_pManuS); + ASSERT(!m_pSymManuName); + + // Get manufacturer name ... + if (pSymLHS) + { + const CIniFileEntry *pIEStr = pISStr->LookupEntry(pSymLHS->GetText()); + if (pIEStr) + { + pSymManuName = pIE->GetRHS(); + pIEStr->Release();pIEStr=NULL; + } + } + + pManuS=NULL; + + // Look up/create manufacturer section + { + void **ppv=NULL; + BOOL fExists=FALSE; + BOOL fRet = pSymManuSection->GetOrCreatePropLoc( + PROP_INFSECTION_MANUFACTURER, + &ppv, + &fExists); + if (fRet) + { + if (fExists) + { + // This section already exists... + pManuS = (CInfManufacturerSection *) *ppv; + ASSERT(pManuS->Validate()); + } + else + { + // This section doesn't exist -- create it. + pManuS = new CInfManufacturerSection(); + if (pManuS) + { + if (pManuS->Load(pIniFile, pISStr, pSymManuSection)) + { + // set the property data + *ppv = (void *) pManuS; + } + else + { + delete pManuS; + pManuS=NULL; + pSymManuSection->DelProp(PROP_INFSECTION_MANUFACTURER); + } + } + } + } + } + + if (pManuS) + { + m_pManuS = pManuS; + m_pSymManuName = pSymManuName; + fRet = TRUE; + } + + if (!fRet) + { + mfn_Cleanup(); + } + + return fRet; + +} + +// --------------- Unload ------------------ +void CInfManufacturerEntry::Unload(void) +// TODO +{ + m_pManuS = NULL; + m_pSymManuName = NULL; + // TODO: decrement ref count for the section and delete it and delprop + // it when done. + mfn_Cleanup(); + +} + + +// --------------- Cleanup ------------------ +// Cleanup by freeing any allocated resources. +void CInfManufacturerEntry::mfn_Cleanup (void) +{ + m_pManuS = NULL; + m_pSymManuName = NULL; +} + + +// --------------- Load ------------------ +BOOL +CInfManufacturerSection::Load +( + const CIniFile *pIniFile, + const CIniFileSection *pISStr, + const CInfSymbol *pSymManuSection +) +{ + BOOL fRet = FALSE; + const CIniFileSection *pIS = + pIniFile->LookupSection(pSymManuSection->GetText()); + + ASSERT(!m_pSymSectionName); + ASSERT(!m_pFirstModelE); + ASSERT(m_eObjSig==eOBJSIG_CInfManufacturerSection); + + if (!pIS) + { + goto end; + } + + m_pSymSectionName = pSymManuSection; + + // Create and load model list + m_pFirstModelE = sfn_CreateModelList(pIniFile, pISStr, pIS); + + if (!m_pFirstModelE) + { + goto end; + } + + fRet = TRUE; + +end: + + if (!fRet) + { + mfn_Cleanup(); + } + + return fRet; +} + +// --------------- Unload ------------------ +void CInfManufacturerSection::Unload(void) +{ + mfn_Cleanup(); +} + + +// --------------- Cleanup ------------------ +// Cleanup by freeing any allocated resources. +void CInfManufacturerSection::mfn_Cleanup (void) +// TODO +{ + m_pSymSectionName = NULL; + m_pFirstModelE = NULL; +} + + +// Static helper function to create the list of models for this manufacturer +const CInfModelEntry * +CInfManufacturerSection::sfn_CreateModelList +( + const CIniFile *pIniFile, + const CIniFileSection *pISStr, + const CIniFileSection *pISManuS +) +{ + CInfModelEntry * pModelE = NULL; + CIniFileEntry *pIE = NULL; + + if (!pISManuS || !pISStr) goto end; + + pIE = pISManuS->GetFirstEntry(); + if (!pIE) goto end; + + // Iterate through models, building model entries... + do + { + pModelE = new CInfModelEntry(pModelE); + if (!pModelE || !pModelE->Load(pIniFile, pISStr, pIE)) + { + // TODO: warning; for now break out. + if (pModelE) + { + // TODO delete previously-created elements of the list as well! + // (Or leave them there and deal with a partial list). + delete pModelE; + pModelE = NULL; + } + goto end; + } + + } while(pIE->BecomeNext()); + + // Reverse list + CInfModelEntry::ReverseList(&pModelE); + +end: + if (pIE) {pIE->Release(); pIE=NULL;} + //if (pISManL) { pISManL->Release(); pISManL=NULL; } + //if (pISStr) { pISStr->Release(); pISStr=NULL; } + + return pModelE; +} + + +// --------------- Cleanup ------------------ +// Cleanup by freeing any allocated resources. +void CInfModelEntry::mfn_Cleanup (void) +// TODO +{ +} + + +// --------------- Load ------------------ +BOOL +CInfModelEntry::Load +( + const CIniFile *pIniFile, + const CIniFileSection *pISStr, + const CIniFileEntry *pIE +) +// TODO +{ + return TRUE; +#if 0 + BOOL fRet = FALSE; + const CInfSymbol *pSymLHS = pIE->GetLHS(); + const CInfSymbol *pSymManuName = NULL; + // TODO need to make manu-section case insensitive! + // Basically pSymManuSection should be created based on an upper-case'd + // version of pIE->GetRHS(). + const CInfSymbol *pSymManuSection = pIE->GetRHS(); + CInfManufacturerSection *pManuS = NULL; + BOOL fNew=FALSE; + + ASSERT(!m_pManuS); + ASSERT(!m_pSymManuName); + + // Get manufacturer name ... + if (pSymLHS) + { + const CIniFileEntry *pIEStr = pISStr->LookupEntry(pSymLHS->GetText()); + if (pIEStr) + { + pSymManuName = pIE->GetRHS(); + pIEStr->Release();pIEStr=NULL; + } + } + + pManuS=NULL; + + // Look up/create manufacturer section + { + void **ppv=NULL; + BOOL fExists=FALSE; + BOOL fRet = pSymManuSection->GetOrCreatePropLoc( + PROP_INFSECTION_MANUFACTURER, + &ppv, + &fExists); + if (fRet) + { + if (fExists) + { + // This section already exists... + pManuS = (CInfManufacturerSection *) *ppv; + ASSERT(pManuS->Validate()); + } + else + { + // This section doesn't exist -- create it. + pManuS = new CInfManufacturerSection(); + if (pManuS) + { + if (pManuS->Load(pIniFile, pISStr, pSymManuSection)) + { + // set the property data + *ppv = (void *) pManuS; + } + else + { + delete pManuS; + pManuS=NULL; + pSymManuSection->DelProp(PROP_INFSECTION_MANUFACTURER); + } + } + } + } + } + + if (pManuS) + { + m_pManuS = pManuS; + m_pSymManuName = pSymManuName; + fRet = TRUE; + } + + if (!fRet) + { + mfn_Cleanup(); + } + + return fRet; +#endif + +} + +// --------------- Unload ------------------ +void CInfModelEntry::Unload(void) +// TODO +{ + mfn_Cleanup(); +} diff --git a/private/unimodem/new/mic/inf.h b/private/unimodem/new/mic/inf.h new file mode 100644 index 000000000..32e1ae85a --- /dev/null +++ b/private/unimodem/new/mic/inf.h @@ -0,0 +1,998 @@ +// // Copyright (c) 1996 Microsoft Corporation +// +// +// INF.H -- Header for Classes: +// +// CInfFile +// +// CInfVersionSection +// CInfManufacturerSection +// CInfInstallSection +// CInfAddRegSection +// CInfCopyFilesSection +// +// CInfManufacturerEntry +// CInfModelEntry +// CInfCopyFilesEntry +// CInfAddRegEntry +// +// CInfModelEntryAux +// +// +// History: +// 05/21/96 JosephJ Created +// +// + + +class CInfVersionSection; +class CInfManufacturerEntry; +class CInfManufacturerSection; +class CInfModelEntry; +class CInfInstallSection; +class CInfAddRegSection; +class CInfAddRegEntry; +class CInfCopyFilesEntry; +class CInfCopyFilesSection; +class CInfModelEntryAux; + + +// Control flags +const DWORD dwCF_EXCLUDE_FROM_SELECT = 0x1<<0; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfFile +/////////////////////////////////////////////////////////////////////////// + +// Represents an inf (device information) file -- which is a special kind +// of INI file. + + +class CInfFile +{ + +public: + + CInfFile(void); + ~CInfFile(); + + //-------------- Load ------------------ + // Loads the specified file. (Obviously) only one file can be loaded at + // a time. + BOOL Load (const TCHAR rgchPathname[]); + + //-------------- Unload ------------------ + // Unloads a previously loaded file. If there are open sessions to this + // object, Unload returns a handle which will be signalled when all + // sessions are closed. New sessions will not be allowed after this + // function returns. The call should free the handle. + // See CloseSession for more info. + HANDLE Unload (void); + + //-------------- OpenSession ------------------ + // Open a session to this object. The object will not be unloaded until + // this session is closed. 0 indicates failure. + // TODO: unimplemented + const void * OpenSession (void) const {return (const void *) 1;} + + //-------------- CloseSession ------------------ + // Close the specified session to this object. + // If the reference count goes to zero and we're marked for unloading, + // the object is unloaded as well. + // TODO: unimplemented + void CloseSession (const void *) const {} + + // --------------- Dump ------------------ + // Dump state + void Dump(void) const; + + // --------------- GetFileName ------------------ + // Get Version info + const CInfSymbol * GetFileName(void) const + { + return m_pSymFileName; + } + + // --------------- GetVersion ------------------ + // Get Version info + const CInfVersionSection * GetVersion(void) const + { + return m_pVersion; + } + + // --------------- GetFirstManufacturerEntry ------ + // Get first manufacturer entry under the manufacturer section + const CInfManufacturerEntry * GetFirstManufacturerEntry(void) const + { + return m_pFirstManuE; + } + + #if (TODO) + // --------------- GetFirstStringEntry -------------- + // Get first string entry under the strings section + const CInfStringEntry * GetFirstStringEntry(void) const; + DestinationDirs + + // --------------- LookupManufacturerSection ---------- + // Lookup and return the manufacturer section with the specified name. + const CInfManufacturerSection * + LookupInstallSection(const CInfSymbol *pSymManSection) + const; + + // --------------- LookupInstallSection ---------- + // Lookup and return the install section with the specified name. + const CInfInstallSection * LookupInstallSection(const TCHAR pchName[])const; + + // --------------- LookupAddRegSection -------------- + // Lookup and return the addreg section with the specifed name. + const CInfAddRegSection * LookupAddRegSection(const TCHAR pchName[]) const; + + // --------------- LookupString -------------- + // Lookup and return the specified string + const CInfSymbol * LookupString(const TCHAR pchName[]) const; +#endif // TODO + + +private: + + // ============= PRIVATE MEMBER FUNCTIONS =============== + void mfn_EnterCrit(void) const {m_sync.EnterCrit();} + void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();} + void mfn_Cleanup(void); + + // ============= PRIVATE STATIC HELPER FUNCTIONS ======== + + static + const CInfManufacturerEntry * + sfn_CreateManufacturerList(CIniFile *); + + static + void + sfn_DeleteManufacturerList(const CInfManufacturerEntry *); + + // ======================= DATA ======================== + const CInfVersionSection * m_pVersion; + const CInfManufacturerEntry * m_pFirstManuE; + const CInfSymbol * m_pSymFileName; + CSync m_sync; + + CIniFile *m_pIniFile; + +}; + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfVersionSection +/////////////////////////////////////////////////////////////////////////// + +// Sample Version section: +// [Version] +// LayoutFile=layout.inf +// Signature="$CHICAGO$" +// Class=Modem +// ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318} +// Provider=%MS% + +class CInfVersionSection +{ + +public: + + CInfVersionSection(void) + { + m_pSymLayoutFile = NULL; + m_pSymSignature = NULL; + m_pSymClass = NULL;; + m_pSymClassGUID = NULL; + m_pSymProvider = NULL; + m_dwChecksum = 0; + } + + ~CInfVersionSection() + { + } + + // --------------- Dump ------------------ + // Dump state + void Dump(void) const; + + // --------------- Checksum ------------------ + // Return checksum of contents + DWORD Checksum(void) const + { + return m_dwChecksum; + } + + // --------------- GetLayoutFile ------------------ + const CInfSymbol * GetLayoutFile (void) const + { + return m_pSymLayoutFile; + } + + // --------------- GetSignature ------------------ + const CInfSymbol * GetSignature (void) const + { + return m_pSymSignature; + } + + // --------------- GetClass ------------------ + const CInfSymbol * GetClass (void) const + { + return m_pSymClass; + } + + // --------------- GetClassGUID ------------------ + const CInfSymbol * GetClassGUID (void) const + { + return m_pSymClassGUID; + } + + // --------------- GetProvider ------------------ + const CInfSymbol * GetProvider (void) const + { + return m_pSymProvider; + } + + +private: + + friend class CInfFile; + + BOOL Load(const CIniFile *); + void Unload(void); + + void mfn_Cleanup(void); + + const CInfSymbol * m_pSymLayoutFile; + const CInfSymbol * m_pSymSignature; + const CInfSymbol * m_pSymClass; + const CInfSymbol * m_pSymClassGUID; + const CInfSymbol * m_pSymProvider; + DWORD m_dwChecksum; + + +}; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfManufacturerEntry +/////////////////////////////////////////////////////////////////////////// + +// Sample Manufacturer list section: +// [Manufacturer] +// %Generic% = Generic +// %MagicRam% = MagicRam +// .. + +class CInfManufacturerEntry: private CInfList +{ + +public: + + CInfManufacturerEntry(const CInfManufacturerEntry *pNext) + : CInfList(NULL, pNext), + m_pManuS(NULL), + m_pSymManuName(NULL) + {} + + ~CInfManufacturerEntry() {} + + // --------------- Dump ------------------ + // Dump state + void Dump(void) const; + + // --------------- GetManufacturerSection ---------- + // Get manufacturer section + const CInfManufacturerSection * GetManufacturerSection (void) const + { + return m_pManuS; + } + + // --------------- GetName ------------------ + // Get manufacturer name (actual manufacturer name, not %xxxx%.) + const CInfSymbol * GetName (void) const + { + return m_pSymManuName; + } + + // --------------- Next ------------------ + // Get next Entry. NULL if no more... + const CInfManufacturerEntry * Next(void) const + { + return (const CInfManufacturerEntry *) CInfList::Next(); + } + + // --------------- Load ------------------ + BOOL + Load( + const CIniFile *pIniFile, + const CIniFileSection *pISStr, + const CIniFileEntry *pIE + ); + + // --------------- Unload ------------------ + void Unload(void); + + //-------------- ReverseList ------------------ + // Reverses the implicit list of manufacturer entries + static void ReverseList(CInfManufacturerEntry **ppManuE) + { + CInfList::ReverseList((const CInfList **) ppManuE); + } + +private: + + void mfn_Cleanup(void); + + const CInfManufacturerSection *m_pManuS; + const CInfSymbol *m_pSymManuName; + +}; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfManufacturerSection +/////////////////////////////////////////////////////////////////////////// + +// Sample Manufacturer section: +// [Generic] +// %Gen% = Gen, MDMGEN +// %Gen3% = Gen3, MDMGEN3 +// %Gen12% = Gen12, MDMGEN12 +// %Gen24% = Gen24, MDMGEN24 +// ... + +class CInfManufacturerSection +{ + +public: + + CInfManufacturerSection(void) + { + m_eObjSig=eOBJSIG_CInfManufacturerSection; + m_pSymSectionName = NULL; + m_pFirstModelE = NULL; + } + + ~CInfManufacturerSection() + //TODO + { + m_eObjSig = eOBJSIG_INVALID; + } + + // --------------- Dump ------------------ + // Dump state + void Dump(void) const; + + // --------------- GetFirstModelEntry -------------- + // Get first model entry + const CInfModelEntry * GetFirstModelEntry (void) const; + + // --------------- GetSectionName ------------------ + // Get section name + const CInfSymbol * GetSectionName (void) const + { + return m_pSymSectionName; + } + + // --------------- Load ------------------ + BOOL + Load + ( + const CIniFile *pIniFile, + const CIniFileSection *pISStr, + const CInfSymbol *pSymManuSection + ); + + // --------------- Unload ------------------ + void Unload(void); + + // --------------- Validate ------------------ + BOOL Validate(void) const + { + // TODO: can place in try-except clause... + return this && m_eObjSig==eOBJSIG_CInfManufacturerSection; + } + + #if (TODO) + // --------------- GetName ------------------ + // Get manufacturer name (actual manufacturer name), + const CInfSymbol * GetName (void) const; + #endif + +private: + + void mfn_Cleanup(void); + + // Static helper function + const CInfModelEntry * + sfn_CreateModelList( + const CIniFile *pIniFile, + const CIniFileSection *pISStr, + const CIniFileSection *pISManuS + ); + + const CInfSymbol *m_pSymSectionName; + const CInfModelEntry * m_pFirstModelE; + eOBJSIG m_eObjSig; +}; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfModelEntry +/////////////////////////////////////////////////////////////////////////// + +// Sample Model entry: +// %Gen% = Gen, MDMGEN + +class CInfModelEntry : private CInfList +{ + +public: + + CInfModelEntry(const CInfModelEntry *pNext) + : CInfList(NULL, pNext) + { + /*TODO*/ + m_dwControlFlags_All = dwCF_EXCLUDE_FROM_SELECT; + m_dwControlFlags_NT_All = dwCF_EXCLUDE_FROM_SELECT; + m_dwControlFlags_NT_Alpha = dwCF_EXCLUDE_FROM_SELECT; + m_dwControlFlags_NT_PPC = dwCF_EXCLUDE_FROM_SELECT; + m_dwControlFlags_NT_Mips = dwCF_EXCLUDE_FROM_SELECT; + } + + ~CInfModelEntry() {/*TODO*/} + + // --------------- Dump ------------------ + // Dump state + void Dump(void) const; + + + // --------------- Load ------------------ + BOOL + Load( + const CIniFile *pIniFile, + const CIniFileSection *pISStr, + const CIniFileEntry *pIE + ); + + // --------------- Unload ------------------ + void Unload(void); + + // --------------- GetNext ------------------ + // Get next Entry. NULL if no more... + const CInfModelEntry * Next(void) const + { + return (const CInfModelEntry *) CInfList::Next(); + } + + //-------------- ReverseList ------------------ + // Reverses the implicit list of model entries + static void ReverseList(CInfModelEntry **ppModelE) + { + CInfList::ReverseList((const CInfList **) ppModelE); + } + + // --------------- GetLHS ------------------ + // Get next Entry. NULL if no more... + const CInfSymbol * GetLHS(void) const + { + // TODO + return gSymtab.Lookup(TEXT("%bongo101%"), TRUE); + } + + // --------------- GetInstallSection -------------- + // Get install section + const CInfInstallSection * GetInstallSection (void) const + { + return m_pInstallSection; + } + + // --------------- GetName ------------------ + // Get model name (actual model name, not %xxx%) + const CInfSymbol * GetName (void) const + { + // TODO + //return m_pSymName; + return gSymtab.Lookup(TEXT("Christy Brinkly"), TRUE); + } + + // --------------- GetRank0ID ------------------ + // Rank-0 ID + const CInfSymbol * GetRank0ID (void) const + { + // TODO + //return m_pSymRank0ID; + // TODO + return gSymtab.Lookup(TEXT("RANK-0-ID"), TRUE); + + } + + // --------------- GetRank1ID ------------------ + // Rank-1 ID + const CInfSymbol * GetRank1ID (void) const + { + // TODO + // return m_pSymRank1ID; + return gSymtab.Lookup(TEXT("RANK-1-ID"), TRUE); + } + + // --------------- GetRank2ID ------------------ + // Rank-2 ID + const CInfSymbol * GetRank2ID (void) const + { + // TODO + // return m_pSymRank2ID; + return gSymtab.Lookup(TEXT("RANK-2-ID"), TRUE); + } + + // --------------- GetControlFlags ----------------- + // Return install flags (one or more dwCF_* flags) for the specified + // platform. + DWORD GetControlFlags(ePLATFORM ePlat) const + { + DWORD dwRet = 0; + + switch(ePlat) + { + case ePLAT_ALL: + break; + case ePLAT_NT_ALL: + dwRet = m_dwControlFlags_NT_All; + break; + + case ePLAT_NT_ALPHA: + dwRet = m_dwControlFlags_NT_Alpha; + break; + + case ePLAT_NT_PPC: + dwRet = m_dwControlFlags_NT_PPC; + break; + + case ePLAT_NT_MIPS: + dwRet = m_dwControlFlags_NT_Mips; + break; + + default: + break; + } + + return dwRet; + } + +private: + + void mfn_Cleanup(void); + + const CInfInstallSection * m_pInstallSection; + // Pointer to install section + + const CInfSymbol * m_pSymName; + // Device name + + const CInfSymbol * m_pSymRank0ID; + // Rank-0 ID (primary device ID) + + const CInfSymbol * m_pSymRank1ID; + // Rank-1 ID (compatible device ID) + + const CInfSymbol * m_pSymRank2ID; + // Rank-2 ID (Rank 2 ID) + + DWORD m_dwControlFlags_All; + // Install flags (eg exclude from select, needs reboot, etc) that + // apply to all platforms. + + DWORD m_dwControlFlags_NT_All; + // Install flags (eg exclude from select, needs reboot, etc) that + // apply to all NT platforms. + + DWORD m_dwControlFlags_NT_Alpha; + // Install flags (eg exclude from select, needs reboot, etc) that + // apply to NT Alpha platform. + + DWORD m_dwControlFlags_NT_PPC; + // Install flags (eg exclude from select, needs reboot, etc) that + // apply to NT PPC platform. + + DWORD m_dwControlFlags_NT_Mips; + // Install flags (eg exclude from select, needs reboot, etc) that + // apply to NT MIPS platform. +}; + + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfInstallSection +/////////////////////////////////////////////////////////////////////////// + +// Sample Install section: +// [Modem29] +// AddReg=All, MfgAddReg, ROCK_VOICE_ALL, ROCK_VOICE_SERWAVE, INTERNAL +// CopyFiles = VV_Sys, VV_Sock_Sys, VV_App, VV_Help +// UpdateInis = VView.Inis +// Uninstall = VoiceView_remove +// +// Also contains info from the related PosDup and NoResDup sections: +// +// [Modem12.PosDup] +// *PNP0500 +// +// [Modem6.NoResDup] +// UNIMODEMCC646872,UNIMODEMA4970248,UNIMODEMB6071C15 +// + +class CInfInstallSection +{ + +public: + + CInfInstallSection(void); + ~CInfInstallSection(); + + // --------------- Dump ------------------ + // Dump state + void Dump(void) const; + + // --------------- GetAddRegSectionList ---------- + // Get generic list whose data items are pointers to + // CInfAddRegSection objects + const CInfList * GetAddRegSectionList (void) const; + + // --------------- GetCopyFilesSectionList ---------- + // Get generic list whose data items are pointers to + // CInfCopyFilesSection objects + const CInfList * GetCopyFilesSectionList (void) const; + + // --------------- GetNoResDupIDList ---------- + // Get generic list whose data items are pointers to + // InfSymbol objects representing the Rank0 IDs in the corresponding + // NoResDup section. + const CInfList * GetNoResDupIDList (void) const; + + // --------------- GetPosDupIDList ---------- + // Get generic list whose data items are pointers to + // InfSymbol objects representing the Rank0 IDs in the corresponding + // PosDup section. + const CInfList * GetPosDupIDList (void) const; + + #if (TODO) + + // --------------- GetUpdateInisSectionList ------ + // Get generic list whose data items are pointers to + // CInfUpdateInisSection objects + const CInfList * GetUpdateInisSectionList (void) const; + + // --------------- GetUninstallSectionList ------ + // Get generic list whose data items are pointers to + // CInfUninstallSection objects + const CInfList * GetUninstallSectionList (void) const; + + // TODO: Also, treat as errors any sections which we don't understand or + // don't expect in a modem inf file or we don't support in the compiler: + // eg rename sections, and other fancy INF file constructs. + + #endif // (TODO) + +private: + + void mfn_Cleanup(void); +}; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfAddRegSection +/////////////////////////////////////////////////////////////////////////// + +// Sample AddReg section: +// [All] +// HKR,,FriendlyDriver,,Unimodem.vxd +// HKR,,DevLoader,,*vcomm +// HKR,,ConfigDialog,,modemui.dll +// HKR,,EnumPropPages,,"modemui.dll,EnumPropPages" +// HKR,,PortSubClass,1,02 +// HKR, Init, 1,, "AT" +// HKR, Responses, "OK", 1, 00, 00, 00,00,00,00, ...etc. +// HKR, Responses, "ERROR", 1, 03, 00, 00,00,00, ...etc. + +class CInfAddRegSection +{ + +public: + + CInfAddRegSection(void) {/*TODO*/} + ~CInfAddRegSection() {/*TODO*/} + + // --------------- Dump ------------------ + // Dump state + void + Dump(void) + const; + + // --------------- GetFirstAddRegEntry -------------- + // Get first addreg entry + const + CInfAddRegEntry * + GetFirstAddRegEntry (void) + const; + +private: + + void mfn_Cleanup(void); +}; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfAddRegEntry +/////////////////////////////////////////////////////////////////////////// + +// Sample AddReg entry: +// HKR, Init, 1,, "AT" + +class CInfAddRegEntry +{ + +public: + + CInfAddRegEntry(void) + { + // TODO -- faked out + + m_pSymRegRoot = gSymtab.Lookup(TEXT("HKR"), TRUE); + m_pSymSubKey = gSymtab.Lookup(TEXT("Init"), TRUE); + m_pSymValueName = gSymtab.Lookup(TEXT("1"), TRUE); + m_dwFlag = MAXDWORD; + m_pSymValue = gSymtab.Lookup(TEXT("\"AT\""), TRUE); + m_dwChecksum = 1000; + } + + ~CInfAddRegEntry() {/*TODO*/} + + // --------------- Dump ------------------ + // Dump state + void + Dump(void) + const + { + // TODO: unimplemented + printf(" HKR, Init, 1,, \"AT\"\n"); + } + + // --------------- Checksum ------------------ + // Compute and return checksum of contents + DWORD + Checksum(void) + const + { + return m_dwChecksum; + } + + // --------------- Next ------------------ + // Get next Entry. NULL if no more... + const CInfAddRegEntry * + Next(void) + const + { + // TODO: unimplemented + return NULL; + } + + // --------------- GetRegRoot ------------------ + // Get reg-root-string key (HKR, etc) + const CInfSymbol * + GetRegRoot (void) + const + { + return m_pSymRegRoot; + } + + // --------------- GetSubKey ------------------ + // Get sub key, NULL if none. + const CInfSymbol * + GetSubKey (void) + const + { + return m_pSymSubKey; + } + + // --------------- GetValueName ------------------ + // Get value-name, NULL if none. + const CInfSymbol * + GetValueName (void) + const + { + return m_pSymValueName; + } + + // --------------- GetFlag ------------------ + // Get flag-name, MAXDWORD if none. + DWORD + GetFlag (void) + const + { + return m_dwFlag; + } + + // --------------- GetValue ------------------ + // Get value-name, NULL if none. + // For binary data, this represents a normalized version of the + // string specified in the inf file: it has the format: "xxyxxyxx.." + // where xx is 2-digit hex representation of a byte and y is the space + // character (' '). For ASCII data, the value is the ascii string without + // the enclosing quotes. Extending '\' characters are processed. + const CInfSymbol * + GetValue (void) + const + { + return m_pSymValue; + } + + #if (TODO) + ... more stuff + #endif + +private: + + void mfn_Cleanup(void); + + const CInfSymbol * m_pSymRegRoot; + const CInfSymbol * m_pSymSubKey; + const CInfSymbol * m_pSymValueName; + const CInfSymbol * m_pSymValue; + DWORD m_dwFlag; + DWORD m_dwChecksum; +}; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfCopyFilesSection +/////////////////////////////////////////////////////////////////////////// + +// Sample DestinationDirs section: +// [DestinationDirs] +// Register.Copy = 17 ;LDID_INF +// VV_Sys = 11 +// VV_Sock_Sys = 11 ;LDID_SYS \Windows\system dir +// VV_Sock_Win = 10 ;LDID_WIN \Windows dir +// VV_App = 10 +// VV_Help = 18 ;LDID_HELP + +// Sample Copyfiles section: +// [VV_Sys] +// fte.dll +// vvexe32.exe +// wsvv.vxd + +// Note: each CInfCopyFilesEntry object keeps a pointer to its destination +// directory (all the entries for a particular section will have the same +// destination dir, because in the inf, a destination directory is associated +// with an entire section. + +class CInfCopyFilesSection +{ + +public: + + // --------------- Dump ------------------ + // Dump state + void Dump(void) const; + + // --------------- GetFirstCopyFilesEntry ---------- + // Get first copyfiles entry + const CInfCopyFilesEntry * GetFirstCopyFilesEntry (void) const; + + #if (TODO) + // Following reflect the Copyfiles.NT* extensions. We need to keep + // this information along with the section. + enum {PROC_X86, PROC_MIPS, PROC_ALPHA, PROC_PPC} eProcessorType; + enum {PLAT_NT, , PLAT_WIN9X} ePlatformType; + #endif // (TODO) + + // TODO: remove following friend declaration once + // CInfInstallSection::GetCopyFilesList + // is properly implemented (it currently needs to access this + // class's constructor. + // Also, move ~CInfCopyFIlesEntry to protected when done. + friend class CInfInstallSection; + ~CInfCopyFilesSection() {/*TODO*/} + +protected: + + CInfCopyFilesSection(void) {/*TODO*/} + + +private: + + void mfn_Cleanup(void); + +}; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfCopyFilesEntry +/////////////////////////////////////////////////////////////////////////// + +// Sample CopyFiles entry: +// fte.dll +// Note: each CInfCopyFilesEntry object keeps a pointer to its destination +// directory. +// TODO: keep information about platform & processor as well (see TODO +// notes under CInfCopyFilesSection). + +class CInfCopyFilesEntry +{ + +public: + + // --------------- Dump ------------------ + // Dump state + void Dump(void) const + { + // TODO: unimplemented + printf(" fte.dll ; goes to 11\n"); + } + + // --------------- Checksum ------------------ + // Compute and return checksum of contents + // Compute and return checksum of contents + DWORD + Checksum(void) + const + { + return m_dwChecksum; + } + + // --------------- GetNext ------------------ + // Get next Entry. NULL if no more... + const CInfCopyFilesEntry * Next(void) const + { + // TODO: unimplemented + return NULL; + } + + // --------------- GetFileName ------------------ + // Get file name to be copied. + const CInfSymbol * GetFileName (void) const; + + // --------------- GetDestDir ------------------ + // Get file name to be copied. + const CInfSymbol * GetDestDir (void) const; + + // TODO: remove following friend declaration once + // CInfCopyFilesSection::GetFirstCopyFilesEntry + // is properly implemented (it currently needs to access this + // class's constructor. + // Also, move ~CInfCopyFIlesEntry to protected when done. + friend class CInfCopyFilesSection; + ~CInfCopyFilesEntry() {/*TODO*/} + +protected: + + CInfCopyFilesEntry(void) + { + // TODO -- faked out + m_dwChecksum = 1001; + } + +private: + + void mfn_Cleanup(void); + + DWORD m_dwChecksum; + +}; + +#if 0 +pInf->Load("mdmgen.inf"); +pManuf = pInf->GetFirstManufacturerEntry(); +for(;pManuf; pManuf = pManuf->Next()) +{ + pNewDevice = new ModemDevice(pDevice); + pDevice->Load(pInf, pManuf); + pDevice->Dump(); + pDevice = pNewDevice; +} +pInf->Unload(" +NewSession() +FreeSession() +#endif diff --git a/private/unimodem/new/mic/ini.cpp b/private/unimodem/new/mic/ini.cpp new file mode 100644 index 000000000..617471ec9 --- /dev/null +++ b/private/unimodem/new/mic/ini.cpp @@ -0,0 +1,153 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// INI.CPP -- Implemtation for Classes: +// CIniFile +// +// History: +// 05/22/96 JosephJ Created +// +// +#include "common.h" +#include "ini.h" + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CIniFile +/////////////////////////////////////////////////////////////////////////// + + +CIniFile::CIniFile(void) +{ +} + + +CIniFile::~CIniFile() +{ + mfn_EnterCrit(); + + // Free resources +} + + +//-------------- Load ------------------ +// Loads the specified file. (Obviously) only one file can be loaded at +// a time. +// TODO: unimplemented +BOOL CIniFile::Load (const TCHAR rgchPathname[]) +{ + BOOL fRet = FALSE; + + //mfn_EnterCrit(); + + fRet = TRUE; + +// end: + + if (!fRet) + { + //mfn_Cleanup(); + } + + //mfn_LeaveCrit(); + + return fRet; +} + + +//-------------- Unload ------------------ +// Unloads a previously loaded file. If there are open sessions to this +// object, Unload returns a handle which will be signalled when all +// sessions are closed. New sessions will not be allowed after this +// function returns. The call should free the handle. +// TODO: unimplemented +HANDLE CIniFile::Unload (void) +{ + HANDLE hUnload = NULL; + + // mfn_EnterCrit(); + + // TODO: call m_sync.BeginUnload to try to put us in unloadable state. + + // mfn_Cleanup(); + + // mfn_LeaveCrit(); + + + return hUnload; +} + + +//-------------- LookupSection ------------------ +// Unloads a previously loaded file. If there are open sessions to this +const CIniFileSection * +CIniFile::LookupSection(const TCHAR *lptcszSection) +const +// TODO +{ + static const CIniFileSection * pIS; + if (!pIS) pIS = new CIniFileSection; + return pIS; +} + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CIniFileSection +/////////////////////////////////////////////////////////////////////////// + + +//-------------- LookupEntry ------------------ +const CIniFileEntry * +CIniFileSection::LookupEntry(const TCHAR *lptcszEntry) +const +// TODO +{ + static const CIniFileEntry * pIE; + if (!pIE) pIE = new CIniFileEntry; + return pIE; +} + +//-------------- GetFirstEntry ------------------ +CIniFileEntry * +CIniFileSection::GetFirstEntry (void) +// TODO +const +{ + static CIniFileEntry * pIE; + if (!pIE) pIE = new CIniFileEntry; + return pIE; +} + +//-------------- Release ------------------ +void +CIniFileSection::Release(void) +const +// TODO +{ +} + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CIniFileEntry +/////////////////////////////////////////////////////////////////////////// + + +//-------------- GetRHS ------------------ +const CInfSymbol * +CIniFileEntry::GetRHS(void) +const +// TODO +{ + return gSymtab.Lookup("[RHS]", TRUE); +} + + +//-------------- Release ------------------ +void +CIniFileEntry::Release(void) +const +// TODO +{ +} + diff --git a/private/unimodem/new/mic/ini.h b/private/unimodem/new/mic/ini.h new file mode 100644 index 000000000..1c2933b1b --- /dev/null +++ b/private/unimodem/new/mic/ini.h @@ -0,0 +1,210 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// INI.H -- Header for Classes: +// CIniFile +// CIniFileLine +// CIniFileSection +// CIniFileEntry +// +// History: +// 05/21/96 JosephJ Created +// +// + +class CIniFile; +class CIniFileLine; +class CIniFileSection; +class CIniFileEntry; + +/////////////////////////////////////////////////////////////////////////// +// CLASS CIniFile +/////////////////////////////////////////////////////////////////////////// + +// Represents a windows INI file. + +class CIniFile +{ + +public: + + CIniFile(void); + ~CIniFile(); + + //-------------- Load ------------------ + // Loads the specified file. (Obviously) only one file can be loaded at + // a time. + BOOL Load (const TCHAR rgchPathname[]); + + //-------------- Unload ------------------ + // Unloads a previously loaded file. If there are open sessions to this + // object, Unload returns a handle which will be signalled when all + // sessions are closed. New sessions will not be allowed after this + // function returns. The call should free the handle. + HANDLE Unload (void); + + //-------------- OpenSession ------------------ + // Open a session to this object. The object will not be unloaded until + // this session is closed. 0 indicates failure. + // TODO: unimplemented + const void * OpenSession (void) const {return (const void *) 1;} + + //-------------- CloseSession ------------------ + // Close the specified session to this object. + // TODO: unimplemented + void CloseSession (const void *) const {} + + //-------------- GetFirstLine ------------------ + // Get the first line in the file. Subsequent lines can be got by + // calling Next() on the line object. + const CIniFileLine * GetFirstLine (void) const; + + //-------------- GetFirstSection ------------------ + // Get the first section in the file. + const CIniFileSection * GetFirstSection (void) const; + + //-------------- LookupSection ------------------ + // Lookup a section in the file, given a name. Comparison is case- + // insensitive. + const CIniFileSection * LookupSection (const TCHAR * pchName) const; + + //-------------- Dump ------------------ + // Dump state + void Dump(void) const; + + //-------------- GetName ------------------ + // Returns the file name + const CInfSymbol * GetName (void) const + { + return m_pSymFileName; + } + +protected: + + //-------------- mfn_GetProp --------------- + // Gets the property value associated with this object. + void * mfn_GetProp(void) {return m_pvProp;} + + //-------------- mfn_SetProp --------------- + // Sets the property value associated with this object. + // Returns previously-set value, if any. + void * mfn_SetProp(void *pvNew) + { + void *pv; + mfn_EnterCrit(); + pv = m_pvProp; + m_pvProp = pvNew; + mfn_LeaveCrit(); + return pv; + } + + //-------------- mfn_EnterCrit ------------------ + void mfn_EnterCrit(void) const {m_sync.EnterCrit();} + + + //-------------- mfn_LeaveCrit ------------------ + void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();} + + +private: + + CSync m_sync; + void * m_pvProp; + const CInfSymbol * m_pSymFileName; +}; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CIniFileLine +/////////////////////////////////////////////////////////////////////////// + +// Represents a single line in an INI file. +// TODO: unimplemented +// Note: Only CIniFile member functions can construct/destruct these +// objects. + +class CIniFileLine +{ + +protected: + + CIniFileLine(void) {} + ~CIniFileLine() {} + +private: + + friend class CIniFile; +}; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CIniFileSection +/////////////////////////////////////////////////////////////////////////// + +// Represents a single section in an INI file. +// Note: Only CIniFile member functions can construct/destruct these +// objects. + +class CIniFileSection +{ + +public: + + const CInfSymbol * GetName (void) const + { + // TODO + return gSymtab.Lookup(TEXT("Steroids"), TRUE); + } + + CIniFileEntry * GetFirstEntry (void) const; + const CIniFileEntry * LookupEntry (const TCHAR rgchName[]) const; + const CIniFileSection * Next(void) const; + void Release(void) const; +protected: + + CIniFileSection(void) {/*TODO*/} + ~CIniFileSection() {/*TODO*/} + +private: + + friend class CIniFile; +}; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CIniFileEntry +/////////////////////////////////////////////////////////////////////////// + +// Represents a single entry in a section in an INI file. +// Note: Only CIniFileSection member functions can construct/destruct these +// objects. + +class CIniFileEntry +{ + +public: + + const CInfSymbol * GetLHS (void) const + { + // TODO + return gSymtab.Lookup(TEXT("%bongo101%"), TRUE); + } + const CInfSymbol * GetRHS (void) const; + const CIniFileLine * GetFirstLine (void) const; + BOOL * BecomeNext (void) + { + return FALSE; + } + + void Release(void) const; + +protected: + + CIniFileEntry(void) {/*TODO*/} + ~CIniFileEntry() {/*TODO*/} + +private: + + friend class CIniFileSection; +}; diff --git a/private/unimodem/new/mic/main.cpp b/private/unimodem/new/mic/main.cpp new file mode 100644 index 000000000..a83cab10f --- /dev/null +++ b/private/unimodem/new/mic/main.cpp @@ -0,0 +1,18 @@ +#include "common.h" +#include "test.h" +#include "mic.h" + +//#define MAIN_T main_tdev +#define MAIN_T main_mic + +int __cdecl main(int argc, char * argv[]) +{ + int iRet = 0; + + if (!InitGlobals()) goto end; + + iRet = MAIN_T (argc, argv); + +end: + return iRet; +} diff --git a/private/unimodem/new/mic/makefile b/private/unimodem/new/mic/makefile new file mode 100644 index 000000000..6ee4f43fa --- /dev/null +++ b/private/unimodem/new/mic/makefile @@ -0,0 +1,6 @@ +# +# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source +# file to this component. This file merely indirects to the real make file +# that is shared by all the components of NT OS/2 +# +!INCLUDE $(NTMAKEENV)\makefile.def diff --git a/private/unimodem/new/mic/mic.cpp b/private/unimodem/new/mic/mic.cpp new file mode 100644 index 000000000..9fa79d695 --- /dev/null +++ b/private/unimodem/new/mic/mic.cpp @@ -0,0 +1,167 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// MIC.CPP -- Modem INF Compiler -- basic version +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// History: +// 06/04/96 JosephJ Created +// +#include "common.h" +#include "ini.h" +#include "inf.h" +#include "dev.h" +#include "test.h" + +#define SIMPLE 0 +#define COMPLEX 1 +#define ACTUAL 2 + +//#define TEST_TYPE (SIMPLE) +#define TEST_TYPE (COMPLEX) +//#define TEST_TYPE (ACTUAL) + + +#if (TEST_TYPE==SIMPLE) +#elif (TEST_TYPE==COMPLEX) +#elif (TEST_TYPE==ACTUAL) +#endif + +class CMicOptions +{ +public: + CMicOptions(void) {} + ~CMicOptions() {} + BOOL Load (int argc, const char *argv[]); + void Unload(void) {} + static void Usage(void); + const TCHAR *OrigInfPath(void) {return m_rgchOrigInfPath;} + const TCHAR *NewInfDir(void) {return m_rgchNewInfDir;} + +private: + + TCHAR m_rgchOrigInfPath[MAX_PATH]; + TCHAR m_rgchNewInfDir[MAX_PATH]; + +}; + +CMicOptions gMicOptions; + +BOOL CMicOptions::Load (int argc, const char *argv[]) +{ + BOOL fRet = FALSE; + UINT u; + + if (argc!=3) goto end; + + if (lstrlen(argv[1]) >= (sizeof(m_rgchOrigInfPath)/sizeof(TCHAR))) + { + goto end; + } + + u = lstrlen(argv[2]); + // Extra space for possible addition of '\\'. + if ((u+1) >= (sizeof(m_rgchNewInfDir)/sizeof(TCHAR))) + { + goto end; + } + + lstrcpy(m_rgchOrigInfPath, argv[1]); + lstrcpy(m_rgchNewInfDir, argv[2]); + + ASSERT(u); + + // Add final \, if required. + { + TCHAR tch = m_rgchNewInfDir[u-1]; + if ( (tch!=(TCHAR) '\\') && (u>2 || tch!=(TCHAR)':')) + { + m_rgchNewInfDir[u]=TCHAR('\\'); + m_rgchNewInfDir[u+1]=0; + } + } + + printf + ( + "OrigIP=[%s]; NewID=[%s]\n", + m_rgchOrigInfPath, + m_rgchNewInfDir + ); + fRet = TRUE; + +end: + return fRet; +} + +void CMicOptions::Usage (void) +{ + printf(TEXT("\nUsage: mic \n\n")); +} + +int main_mic(int argc, char * argv[]) +{ + const CInfManufacturerEntry *pManuE = NULL; + CInfFile *pInf= NULL; + CInfDevice *pDev = NULL; + + + // Parse Options + // Format: mic + if (!gMicOptions.Load(argc, (const char **) argv)) + { + CMicOptions::Usage(); + return 1; + } + + pInf= new CInfFile(); + pDev = new CInfDevice(NULL); + + if (!pInf || !pDev) goto end; + + if (pInf->Load(gMicOptions.OrigInfPath())) + { + pManuE = pInf->GetFirstManufacturerEntry(); + } + + for (;pManuE; pManuE = pManuE->Next()) + { + const CInfManufacturerSection *pManuS=pManuE->GetManufacturerSection(); + const CInfModelEntry *pModelE = NULL; + if (pManuS) + { + pModelE = pManuS->GetFirstModelEntry(); + } + for (;pModelE; pModelE = pModelE->Next()) + { + if (pDev->Load(pInf, pManuE, pModelE)) + { + TCHAR rgchNewInf[MAX_PATH]; + DWORD dwRank0Checksum = pDev->Rank0Checksum(); + DWORD dwDeviceChecksum = pDev->Checksum(); + wsprintf + ( + rgchNewInf, + TEXT("%s%08lx_%08lx.inf"), + gMicOptions.NewInfDir(), + dwRank0Checksum, + dwDeviceChecksum + ); + pDev->Dump(); + + pDev->WriteInf(rgchNewInf); + pDev->Unload(); + } + } + } + +end: + if (pDev) {delete pDev; pDev=NULL;} + if (pInf) {pInf->Unload(); delete pInf; pInf=NULL;} + + gMicOptions.Unload(); + + return 0; +} diff --git a/private/unimodem/new/mic/mic.h b/private/unimodem/new/mic/mic.h new file mode 100644 index 000000000..2d1fd1697 --- /dev/null +++ b/private/unimodem/new/mic/mic.h @@ -0,0 +1 @@ +int main_mic(int argc, char * argv[]); diff --git a/private/unimodem/new/mic/notes.txt b/private/unimodem/new/mic/notes.txt new file mode 100644 index 000000000..08a196351 --- /dev/null +++ b/private/unimodem/new/mic/notes.txt @@ -0,0 +1,231 @@ +Modem Inf Compiler -- MIC +------------------------- + +History: + 5/18/96 JosephJ Created + +Files: + + +Classes: + +------------------------------- + CIniFile + Bind(FilePath pFilePath) + Out(FilePath pFilePath) + Section(szName) + UnBind() + Name + + CIniFileSection + CIniFileSection + EntryIterator + Out(HFILE); + Name + Line + + CIniFileEntry + Name + RHS + Out(HFILE); + Line + + CIniFileEntryIterator + NextEntry + + CIniFileLine + //Can be one of: blank, annotations, section-header, + // entry, entry-continuation, or unknown + //State can be one of: ok, warning, error(%d) + Type + State + Text + + + CIniFileAnnotation + +------------------------------- + + CInfFile + + CIniFile + + + CInfDevice + + CSymbolTable + Lookup + + CSymbol + GetText + GetTextLength + + CInfAddRegList + CInfCopyFileList + + CInfRank + + CDisplay + +-------------------------------- + +CModemDevice::CreateModem(CInfFile *pInf, CDeviceLocation *pDevLoc) +{ + // GetVersion + pInf->Version + + // Get manufacturer + ptbszManufacturer = pDevLoc->ptbszManufacturer; + + // Get Device name. + ptbszName = pDevLoc->Name + + // Get InstallSection + pInstallSec = pInf->InstallSection(pDevice->ptbszInstallSection); + + // Walk Addreg list + { + DWORD rgdwChecksum[MAX]; + CAddregIterator pAddregIter = pDevLoc->AddregIterator(); + + for (int i=0, CAddreg pAddReg=0;(pAddreg=pAddregIter->Iterate());i++) + { + // For mow, add checksum to array + rgdwChecksum[i++] = pAddreg->Checksum(); + } + + // Compute Addreg checksum + ::CRC16((LPBYTE)rgdwChecksum, (i)? (i-1) : 0); + } + + // Walk other list... + // Copyfiles + { + } + +} +------------------------------- + +Files + +Class headers: + inf.h CIniFile + ini.h CInfFile + device.h CInfDevice + sym.h CInfSymbol +--------------------------------- + +class CGenericIterator +{ + +public: + CGenericIterator(void * pData, const CGenericIterator *pNext) + {m_pData=pData; m_pNext = pNext;} + ~CGenericIterator(); + + const CGenericIterator * Next (void) const {return pNext;} + void * Data (void) const {return pData;} + +private: + + const CGenericIterator * m_pNext; + void * m_pNext; +}; + +for (; pIter, pIter = pIter->Next()) +{ + const CAddregSection * pAddreg = (const CAddregSection *) pIter; + // blah blah... +} + + CInfString +------------------------------------------ + +CSyncObject + + Load + Unload + + DWORD OpenSession(void) + void CloseSession(DWORD) + + EnterCrit + LeaveCrit + +private: + CRITICAL_SECTION + Slist EventList + UINT uRefCount; + enum {UNLOADED, MARKED_FOR_UNLOAD, LOADED} eState; + +-------------------------------------------------- +[Support APIs from sdk\inc\setupi.h] +SetupGetInfInformation +SetupQueryInfFileInformation useful? +SetupQueryInfVersionInformation useful? +SetupGetInfFileList useful? +SetupOpenInfFile +SetupOpenMasterInf +SetupOpenAppendInfFileW +SetupCloseInfFile +SetupFindFirstLineA useful? +SetupFindNextLine useful? +SetupFindNextMatchLine useful? +SetupGetLineByIndex useful? +SetupGetLineCount useful? +SetupGetLineText useful? +SetupGetFieldCount useful? +SetupGetStringField useful? +SetupGetIntField useful? +SetupGetMultiSzField useful? +SetupGetBinaryField useful? +SetupGetFileCompressionInfo +SetupGetSourceFileLocation useful? +SetupGetSourceFileSize +SetupGetTargetPath useful? +Error codes: + Inf parse outcomes: + ERROR_EXPECTED_SECTION_NAME + ERROR_BAD_SECTION_NAME_LINE + ERROR_SECTION_NAME_TOO_LONG + ERROR_GENERAL_SYNTAX + + Inf runtime errors: + ERROR_WRONG_INF_STYLE + ERROR_SECTION_NOT_FOUND + ERROR_LINE_NOT_FOUND +-------------------- +6/9/96 + +Inf:Load: + +-- Read Version Information +-- Read Manufacturer List Section + Read Manufacturer Entry + Read Manufacturer Section + Read Model Entry + Read Install Section + Read AddregSection + ... + Read ControlFlags section + +--------- +6/12/96 +-- concept of a Validate member function for each class: +BOOL Validate(void) +{ + if (!this) return FALSE; + + _try + { + test other things, like an object-type signature (each object can + have an object-type signature, which is assigned by the constructur + and cleared by the destructor. + } + _except(....) + { + } + +end: + +} diff --git a/private/unimodem/new/mic/resp.cpp b/private/unimodem/new/mic/resp.cpp new file mode 100644 index 000000000..fcb92de7d --- /dev/null +++ b/private/unimodem/new/mic/resp.cpp @@ -0,0 +1,3538 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +#include + +const TCHAR *rgpszSimpleResp[] = +{ + "How", + "Now", + "Brown", + "Cow!", + NULL +}; + +const TCHAR *rgpszComplexResp[] = +{ +"-SFA", +"-SMD", +"-SRA", +"-SRC:", +"-SRQ", +"-SSV", +"-STO", +"-SVM", +"+F4", +"+F4/+FCERROR", +"+F4@", +"+FC-FCERROR", +"+FC@", +"+FCERROR", +"+FCON", +"@", +"@#-SFA@#", +"@#-SMD@#", +"@#-SRA@#", +"@#-SRC:@#", +"@#-SRQ@#", +"@#-SSV@#", +"@#-STO@#", +"@#-SVM@#", +"@# CONNECT 1200 LAPM COMPRESSED@#", +"@#+FCERROR@@#", +"@#+FCERROR@#", +"@#@#NO CARRIER@#", +"@#ABORD@#", +"@#ABORTED@#", +"@#AUTOLOGON FAILED@#", +"@#BLACKLISTED@#", +"@#BUSY@#", +"@#C@#", +"@#CALL LOCKED:BLACKLISTED@#", +"@#CARRIER 1200@#", +"@#CARRIER 2400@#", +"@#CARRIER 300@#", +"@#CARRIER 600@#", +"@#CARRIER 1200 V.34@#", +"@#CARRIER 1200/75", +"@#CARRIER 1200/75 V.23@#", +"@#CARRIER 1200/75/VFC@#", +"@#CARRIER 1200/75@#", +"@#CARRIER 1200/VFC@#", +"@#CARRIER 1200@#", +"@#CARRIER 12000/VFC@#", +"@#CARRIER 12000@#", +"@#CARRIER 1200TX/75RX V.23@#", +"@#CARRIER 14400 V.34@#", +"@#CARRIER 14400/VFC@ @#", +"@#CARRIER 14400/VFC@#", +"@#CARRIER 14400@#", +"@#CARRIER 16800 V.34@#", +"@#CARRIER 16800/VFC@@#", +"@#CARRIER 16800/VFC@#", +"@#CARRIER 16800@#", +"@#CARRIER 19200 V.34@#", +"@#CARRIER 19200/VFC@@#", +"@#CARRIER 19200/VFC@#", +"@#CARRIER 19200@#", +"@#CARRIER 21600 V.34@#", +"@#CARRIER 21600/VFC@@#", +"@#CARRIER 21600/VFC@#", +"@#CARRIER 21600@#", +"@#CARRIER 2400 V.34@#", +"@#CARRIER 2400/VFC@#", +"@#CARRIER 2400@#", +"@#CARRIER 24000 V.34@#", +"@#CARRIER 24000/VFC@@#", +"@#CARRIER 24000/VFC@#", +"@#CARRIER 24000@#", +"@#CARRIER 26400 V.34@#", +"@#CARRIER 26400/VFC@@#", +"@#CARRIER 26400/VFC@#", +"@#CARRIER 26400@#", +"@#CARRIER 28800 V.34@#", +"@#CARRIER 28800/VFC@@#", +"@#CARRIER 28800/VFC@#", +"@#CARRIER 28800@#", +"@#CARRIER 300 V.34@#", +"@#CARRIER 300/VFC@#", +"@#CARRIER 300@#", +"@#CARRIER 4800 V.34@#", +"@#CARRIER 4800/VFC@#", +"@#CARRIER 4800@#", +"@#CARRIER 600@#", +"@#CARRIER 64000@#", +"@#CARRIER 7200 V.34@#", +"@#CARRIER 7200/VFC@#", +"@#CARRIER 7200@#", +"@#CARRIER 75/1200", +"@#CARRIER 75/1200 V.23@#", +"@#CARRIER 75/1200/VFC@#", +"@#CARRIER 75/1200@#", +"@#CARRIER 75TX/1200RX V.23@#", +"@#CARRIER 9600 V.34@#", +"@#CARRIER 9600/VFC@#", +"@#CARRIER 9600@#", +"@#CED@# ", +"@#COMPRESSION :CLASS5@#", +"@#COMPRESSION NONE@#", +"@#COMPRESSION V.42BIS@#", +"@#COMPRESSION: ADC", +"@#COMPRESSION: ADC@#", +"@#COMPRESSION: CLASS 5@#", +"@#COMPRESSION: CLASS5@#", +"@#COMPRESSION: MNP5@#", +"@#COMPRESSION: NONE@#", +"@#COMPRESSION: V.42 bis@#", +"@#COMPRESSION: V.42 BIS@#", +"@#COMPRESSION: V.42 bis@#", +"@#COMPRESSION: V.42 BIS@#", +"@#COMPRESSION: V.42 bis@#", +"@#COMPRESSION: V.42 BIS@#", +"@#COMPRESSION: V.42 bis@#", +"@#COMPRESSION: V.42 BIS@#", +"@#COMPRESSION: V.42 bis@#", +"@#COMPRESSION: V.42 BIS@#", +"@#COMPRESSION: V.42BIS@#", +"@#COMPRESSION: V.42bis@#", +"@#COMPRESSION: V.42BIS@#", +"@#COMPRESSION: V.42bis@#", +"@#COMPRESSION: V.42BIS@#", +"@#COMPRESSION: V.42bis@#", +"@#COMPRESSION: V.42BIS@#", +"@#COMPRESSION: V.42bis@#", +"@#COMPRESSION: V.42BIS@#", +"@#COMPRESSION: V.42bis@#", +"@#COMPRESSION: V.42BIS@#", +"@#COMPRESSION: V.42bis@#", +"@#COMPRESSION: V.42BIS@#", +"@#COMPRESSION: V42BIS@#", +"@#COMPRESSION:CLASS 5@#", +"@#COMPRESSION:NONE@#", +"@#COMPRESSION:V.42bis@#", +"@#COMPRESSION:V.42BIS@#", +"@#CONNECT 0600/ARQ@#", +"@#CONNECT 0600/LAP-M/COMPRESSION@#", +"@#CONNECT 0600/LAP-M@#", +"@#CONNECT 0600/LAPM/COMP@#", +"@#CONNECT 0600/LAPM@#", +"@#CONNECT 0600/MNP@#", +"@#CONNECT 0600/NONE@#", +"@#CONNECT 0600/REL-LAPM V.42 BIS@#", +"@#CONNECT 0600/REL/COMP@#", +"@#CONNECT 0600/REL@#", +"@#CONNECT 0600/V42BIS@#", +"@#CONNECT 0600@#", +"@#CONNECT 112000/ARQ/MLP /V120/V42b@#", +"@#CONNECT 112000/ARQ/MLP /V120@#", +"@#CONNECT 112000@#", +"@#CONNECT 115,200/ARQ@#", +"@#CONNECT 115,200/LAP-M/COMPRESSION@#", +"@#CONNECT 115,200/LAP-M@#", +"@#CONNECT 115,200/LAPM/COMP@#", +"@#CONNECT 115,200/LAPM@#", +"@#CONNECT 115,200/MNP@#", +"@#CONNECT 115,200/NONE@#", +"@#CONNECT 115,200/REL/COMP@#", +"@#CONNECT 115,200/REL@#", +"@#CONNECT 115,200/V42@#", +"@#CONNECT 115,200/V42BIS@#", +"@#CONNECT 115,200@#", +"@#CONNECT 115200 ALT / MNP5@#", +"@#CONNECT 115200 ALT /MNP 5@#", +"@#CONNECT 115200 ALT@#", +"@#CONNECT 115200 LAPM / V.42bis@#", +"@#CONNECT 115200 LAPM /V.42bis@#", +"@#CONNECT 115200 LAPM@#", +"@#CONNECT 115200 REL/MNP5@#", +"@#CONNECT 115200 REL@#", +"@#CONNECT 115200/ARQ@#", +"@#CONNECT 115200/LAP-M/COMPRESSION@#", +"@#CONNECT 115200/LAP-M@#", +"@#CONNECT 115200/LAPM/COMP@#", +"@#CONNECT 115200/LAPM@#", +"@#CONNECT 115200/MNP COMPRESSED@#", +"@#CONNECT 115200/MNP@#", +"@#CONNECT 115200/NONE@#", +"@#CONNECT 115200/REL-LAPM V.42 BIS@#", +"@#CONNECT 115200/REL-LAPM@#", +"@#CONNECT 115200/REL-V.42@#", +"@#CONNECT 115200/REL/COMP@#", +"@#CONNECT 115200/REL@#", +"@#CONNECT 115200/V42@#", +"@#CONNECT 115200/V42BIS@#", +"@#CONNECT 115200/VBIS@#", +"@#CONNECT 115200@#", +"@#CONNECT 115200T/V42BIS@#", +"@#CONNECT 1200 ALT / MNP5@#", +"@#CONNECT 1200 ALT /MNP 5@#", +"@#CONNECT 1200 ALT@#", +"@#CONNECT 1200 EC/V42BIS@#", +"@#CONNECT 1200 EC@#", +"@#CONNECT 1200 LAPM / V.42bis@#", +"@#CONNECT 1200 LAPM /V.42bis@#", +"@#CONNECT 1200 LAPM COMPRESSED@#", +"@#CONNECT 1200 LAPM@#", +"@#CONNECT 1200 NORMAL@#", +"@#CONNECT 1200 REL/MNP5@#", +"@#CONNECT 1200 REL/V42@#", +"@#CONNECT 1200 REL/V42BIS@#", +"@#CONNECT 1200 REL@#", +"@#CONNECT 1200 RELIABLE COMPRESSED@#", +"@#CONNECT 1200 RELIABLE@#", +"@#CONNECT 1200 V.42@#", +"@#CONNECT 1200/75", +"@#CONNECT 1200/75/ARQ@#", +"@#CONNECT 1200/75/LAP-M/COMPRESSION@#", +"@#CONNECT 1200/75/LAP-M@#", +"@#CONNECT 1200/75/LAPM/COMP@#", +"@#CONNECT 1200/75/LAPM@#", +"@#CONNECT 1200/75/MNP@#", +"@#CONNECT 1200/75/NONE@#", +"@#CONNECT 1200/75/REL-LAPM V.42 BIS@#", +"@#CONNECT 1200/75/REL/COMP@#", +"@#CONNECT 1200/75/REL@#", +"@#CONNECT 1200/75/V42@#", +"@#CONNECT 1200/75/V42BIS@#", +"@#CONNECT 1200/75@#", +"@#CONNECT 1200/ARQ/MNP4@#", +"@#CONNECT 1200/ARQ/MNP5@#", +"@#CONNECT 1200/ARQ/V.42@#", +"@#CONNECT 1200/ARQ/V.42bis@#", +"@#CONNECT 1200/ARQ/V22 /MNP4@#", +"@#CONNECT 1200/ARQ/V22 /MNP5@#", +"@#CONNECT 1200/ARQ/V22 /V42 /SREJ@#", +"@#CONNECT 1200/ARQ/V22 /V42 @#", +"@#CONNECT 1200/ARQ/V22 /V42b/SREJ@#", +"@#CONNECT 1200/ARQ/V22 /V42b@#", +"@#CONNECT 1200/ARQ/V22/MNP4@#", +"@#CONNECT 1200/ARQ/V22/MNP5@#", +"@#CONNECT 1200/ARQ/V22/V42 /SREJ@#", +"@#CONNECT 1200/ARQ/V22/V42 @#", +"@#CONNECT 1200/ARQ/V22/V42b/SREJ@#", +"@#CONNECT 1200/ARQ/V22/V42b@#", +"@#CONNECT 1200/ARQ/V22b /MNP4@#", +"@#CONNECT 1200/ARQ/V22b /MNP5@#", +"@#CONNECT 1200/ARQ/V22b /V42 /SREJ@#", +"@#CONNECT 1200/ARQ/V22b /V42 @#", +"@#CONNECT 1200/ARQ/V22b /V42b/SREJ@#", +"@#CONNECT 1200/ARQ/V22b /V42b@#", +"@#CONNECT 1200/ARQ/V22b/MNP4@#", +"@#CONNECT 1200/ARQ/V22b/MNP5@#", +"@#CONNECT 1200/ARQ/V22b/V42 /SREJ@#", +"@#CONNECT 1200/ARQ/V22b/V42 @#", +"@#CONNECT 1200/ARQ/V22b/V42b/SREJ@#", +"@#CONNECT 1200/ARQ/V22b/V42b@#", +"@#CONNECT 1200/ARQ/V32 /MNP4@#", +"@#CONNECT 1200/ARQ/V32 /MNP5@#", +"@#CONNECT 1200/ARQ/V32 /V42 /SREJ@#", +"@#CONNECT 1200/ARQ/V32 /V42 @#", +"@#CONNECT 1200/ARQ/V32 /V42b/SREJ@#", +"@#CONNECT 1200/ARQ/V32 /V42b@#", +"@#CONNECT 1200/ARQ/V32 /MNP4@#", +"@#CONNECT 1200/ARQ/V32 /MNP5@#", +"@#CONNECT 1200/ARQ/V32 /V42 /SREJ@#", +"@#CONNECT 1200/ARQ/V32 /V42 @#", +"@#CONNECT 1200/ARQ/V32 /V42b/SREJ@#", +"@#CONNECT 1200/ARQ/V32 /V42b@#", +"@#CONNECT 1200/ARQ/V32b /MNP4@#", +"@#CONNECT 1200/ARQ/V32b /MNP5@#", +"@#CONNECT 1200/ARQ/V32b /V42 /SREJ@#", +"@#CONNECT 1200/ARQ/V32b /V42 @#", +"@#CONNECT 1200/ARQ/V32b /V42b/SREJ@#", +"@#CONNECT 1200/ARQ/V32b /V42b@#", +"@#CONNECT 1200/ARQ/V32b/MNP4@#", +"@#CONNECT 1200/ARQ/V32b/MNP5@#", +"@#CONNECT 1200/ARQ/V32b/V42 /SREJ@#", +"@#CONNECT 1200/ARQ/V32b/V42 @#", +"@#CONNECT 1200/ARQ/V32b/V42b/SREJ@#", +"@#CONNECT 1200/ARQ/V32b/V42b@#", +"@#CONNECT 1200/ARQ/V42 /SREJ@#", +"@#CONNECT 1200/ARQ/V42 @#", +"@#CONNECT 1200/ARQ/V42b/SREJ@#", +"@#CONNECT 1200/ARQ/V42b@#", +"@#CONNECT 1200/ARQ/ZyX /MNP4@#", +"@#CONNECT 1200/ARQ/ZyX /MNP5@#", +"@#CONNECT 1200/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 1200/ARQ/ZyX /V42 @#", +"@#CONNECT 1200/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 1200/ARQ/ZyX /V42b@#", +"@#CONNECT 1200/ARQ/ZyX /MNP4@#", +"@#CONNECT 1200/ARQ/ZyX /MNP5@#", +"@#CONNECT 1200/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 1200/ARQ/ZyX /V42 @#", +"@#CONNECT 1200/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 1200/ARQ/ZyX /V42b@#", +"@#CONNECT 1200/ARQ@#", +"@#CONNECT 1200/COMP@#", +"@#CONNECT 1200/LAP-M/COMPRESSION@#", +"@#CONNECT 1200/LAP-M@#", +"@#CONNECT 1200/LAPM/COMP@#", +"@#CONNECT 1200/LAPM/V42BIS@#", +"@#CONNECT 1200/LAPM@#", +"@#CONNECT 1200/MNP COMPRESSED@#", +"@#CONNECT 1200/MNP@#", +"@#CONNECT 1200/NONE@#", +"@#CONNECT 1200/NOR@#", +"@#CONNECT 1200/REL-LAPM-COMP@#", +"@#CONNECT 1200/REL-LAPM V.42 BIS@#", +"@#CONNECT 1200/REL-LAPM@#", +"@#CONNECT 1200/REL-MNP-COMP@#", +"@#CONNECT 1200/REL-MNP@#", +"@#CONNECT 1200/REL-V.42@#", +"@#CONNECT 1200/REL 1@# ", +"@#CONNECT 1200/REL 2@# ", +"@#CONNECT 1200/REL 3@# ", +"@#CONNECT 1200/REL 4@# ", +"@#CONNECT 1200/REL 5@# ", +"@#CONNECT 1200/REL COMP@#", +"@#CONNECT 1200/REL COMPRESSED@#", +"@#CONNECT 1200/REL/COMP@#", +"@#CONNECT 1200/REL@#", +"@#CONNECT 1200/RELC@#", +"@#CONNECT 1200/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 1200/RELIABLE/LAPM@#", +"@#CONNECT 1200/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 1200/RELIABLE/MNP@#", +"@#CONNECT 1200/V42@#", +"@#CONNECT 1200/V42B@#", +"@#CONNECT 1200/V42BIS@#", +"@#CONNECT 1200@#", +"@#CONNECT 12000 ALT / MNP5@#", +"@#CONNECT 12000 ALT /MNP 5@#", +"@#CONNECT 12000 ALT@#", +"@#CONNECT 12000 EC/V42@#", +"@#CONNECT 12000 EC/V42BIS@#", +"@#CONNECT 12000 EC@#", +"@#CONNECT 12000 LAPM / V.42bis@#", +"@#CONNECT 12000 LAPM /V.42bis@#", +"@#CONNECT 12000 LAPM COMPRESSED@#", +"@#CONNECT 12000 LAPM@#", +"@#CONNECT 12000 REL/MNP5@#", +"@#CONNECT 12000 REL/V42@#", +"@#CONNECT 12000 REL/V42BIS@#", +"@#CONNECT 12000 REL@#", +"@#CONNECT 12000 RELIABLE COMPRESSED@#", +"@#CONNECT 12000 RELIABLE@#", +"@#CONNECT 12000/ARQ/CELL /MNP4@#", +"@#CONNECT 12000/ARQ/CELL /MNP5@#", +"@#CONNECT 12000/ARQ/CELL /V42 /SREJ@#", +"@#CONNECT 12000/ARQ/CELL /V42 @#", +"@#CONNECT 12000/ARQ/CELL /V42b/SREJ@#", +"@#CONNECT 12000/ARQ/CELL /V42b@#", +"@#CONNECT 12000/ARQ/CELL/MNP4@#", +"@#CONNECT 12000/ARQ/CELL/MNP5@#", +"@#CONNECT 12000/ARQ/CELL/V42 /SREJ@#", +"@#CONNECT 12000/ARQ/CELL/V42 @#", +"@#CONNECT 12000/ARQ/CELL/V42b/SREJ@#", +"@#CONNECT 12000/ARQ/CELL/V42b@#", +"@#CONNECT 12000/ARQ/MNP4@#", +"@#CONNECT 12000/ARQ/MNP5@#", +"@#CONNECT 12000/ARQ/V.34/MNP4@#", +"@#CONNECT 12000/ARQ/V.34/MNP5@#", +"@#CONNECT 12000/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 12000/ARQ/V.34/V42 @#", +"@#CONNECT 12000/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 12000/ARQ/V.34/V42b@#", +"@#CONNECT 12000/ARQ/V.42@#", +"@#CONNECT 12000/ARQ/V.42bis@#", +"@#CONNECT 12000/ARQ/V32b /MNP4@#", +"@#CONNECT 12000/ARQ/V32b /MNP5@#", +"@#CONNECT 12000/ARQ/V32b /V42 /SREJ@#", +"@#CONNECT 12000/ARQ/V32b /V42 @#", +"@#CONNECT 12000/ARQ/V32b /V42b/SREJ@#", +"@#CONNECT 12000/ARQ/V32b /V42b@#", +"@#CONNECT 12000/ARQ/V32b/MNP4@#", +"@#CONNECT 12000/ARQ/V32b/MNP5@#", +"@#CONNECT 12000/ARQ/V32b/V42 /SREJ@#", +"@#CONNECT 12000/ARQ/V32b/V42 @#", +"@#CONNECT 12000/ARQ/V32b/V42b/SREJ@#", +"@#CONNECT 12000/ARQ/V32b/V42b@#", +"@#CONNECT 12000/ARQ/V42 /SREJ@#", +"@#CONNECT 12000/ARQ/V42 @#", +"@#CONNECT 12000/ARQ/V42b/SREJ@#", +"@#CONNECT 12000/ARQ/V42b@#", +"@#CONNECT 12000/ARQ/ZyX /MNP4@#", +"@#CONNECT 12000/ARQ/ZyX /MNP5@#", +"@#CONNECT 12000/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 12000/ARQ/ZyX /V42 @#", +"@#CONNECT 12000/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 12000/ARQ/ZyX /V42b@#", +"@#CONNECT 12000/ARQ/ZyX /MNP4@#", +"@#CONNECT 12000/ARQ/ZyX /MNP5@#", +"@#CONNECT 12000/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 12000/ARQ/ZyX /V42 @#", +"@#CONNECT 12000/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 12000/ARQ/ZyX /V42b@#", +"@#CONNECT 12000/ARQ@#", +"@#CONNECT 12000/COMP@#", +"@#CONNECT 12000/LAP-M/COMPRESSION@#", +"@#CONNECT 12000/LAP-M@#", +"@#CONNECT 12000/LAPM/COMP@#", +"@#CONNECT 12000/LAPM/V42BIS@#", +"@#CONNECT 12000/LAPM@#", +"@#CONNECT 12000/MNP COMPRESSED@#", +"@#CONNECT 12000/MNP@#", +"@#CONNECT 12000/NONE@#", +"@#CONNECT 12000/NOR@#", +"@#CONNECT 12000/REL-LAPM-COMP@#", +"@#CONNECT 12000/REL-LAPM V.42 BIS@#", +"@#CONNECT 12000/REL-LAPM@#", +"@#CONNECT 12000/REL-MNP-COMP@#", +"@#CONNECT 12000/REL-MNP@#", +"@#CONNECT 12000/REL-V.42@#", +"@#CONNECT 12000/REL COMP@#", +"@#CONNECT 12000/REL COMPRESSED@#", +"@#CONNECT 12000/REL/COMP@#", +"@#CONNECT 12000/REL@#", +"@#CONNECT 12000/RELC@#", +"@#CONNECT 12000/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 12000/RELIABLE/LAPM@#", +"@#CONNECT 12000/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 12000/RELIABLE/MNP@#", +"@#CONNECT 12000/V42@#", +"@#CONNECT 12000/V42B@#", +"@#CONNECT 12000/V42BIS@#", +"@#CONNECT 12000@#", +"@#CONNECT 12000T/V42BIS@#", +"@#CONNECT 1200T/V42BIS@#", +"@#CONNECT 1200TX/75RX REL/MNP5@#", +"@#CONNECT 1200TX/75RX REL@#", +"@#CONNECT 1200TX/75RX/ARQ@#", +"@#CONNECT 1200TX/75RX/LAP-M/COMPRESSION@#", +"@#CONNECT 1200TX/75RX/LAP-M@#", +"@#CONNECT 1200TX/75RX/LAPM/COMP@#", +"@#CONNECT 1200TX/75RX/LAPM@#", +"@#CONNECT 1200TX/75RX/MNP@#", +"@#CONNECT 1200TX/75RX/NONE@#", +"@#CONNECT 1200TX/75RX/REL-LAPM V.42 BIS@#", +"@#CONNECT 1200TX/75RX/REL/COMP@#", +"@#CONNECT 1200TX/75RX/REL@#", +"@#CONNECT 1200TX/75RX/V42@#", +"@#CONNECT 1200TX/75RX/V42BIS@#", +"@#CONNECT 1200TX/75RX@#", +"@#CONNECT 12200/ARQ/V.34/MNP4@#", +"@#CONNECT 12200/ARQ/V.34/MNP5@#", +"@#CONNECT 12200/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 12200/ARQ/V.34/V42 @#", +"@#CONNECT 12200/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 12200/ARQ/V.34/V42b@#", +"@#CONNECT 12200@#", +"@#CONNECT 1275@#", +"@#CONNECT 128000/ARQ/MLP /X.75/V42b@#", +"@#CONNECT 128000/ARQ/MLP /X.75@#", +"@#CONNECT 128000@#", +"@#CONNECT 14400 ALT / MNP5@#", +"@#CONNECT 14400 ALT /MNP 5@#", +"@#CONNECT 14400 ALT@#", +"@#CONNECT 14400 EC/V42@#", +"@#CONNECT 14400 EC/V42BIS@#", +"@#CONNECT 14400 EC@#", +"@#CONNECT 14400 LAPM / V.42bis@#", +"@#CONNECT 14400 LAPM /V.42bis@#", +"@#CONNECT 14400 LAPM COMPRESSED@#", +"@#CONNECT 14400 LAPM@#", +"@#CONNECT 14400 NORMAL@#", +"@#CONNECT 14400 REL/MNP5@#", +"@#CONNECT 14400 REL/V42@#", +"@#CONNECT 14400 REL/V42BIS@#", +"@#CONNECT 14400 REL@#", +"@#CONNECT 14400 RELIABLE COMPRESSED@#", +"@#CONNECT 14400 RELIABLE@#", +"@#CONNECT 14400 V.42@#", +"@#CONNECT 14400/ARQ/CELL /MNP4@#", +"@#CONNECT 14400/ARQ/CELL /MNP5@#", +"@#CONNECT 14400/ARQ/CELL /V42 /SREJ@#", +"@#CONNECT 14400/ARQ/CELL /V42 @#", +"@#CONNECT 14400/ARQ/CELL /V42b/SREJ@#", +"@#CONNECT 14400/ARQ/CELL /V42b@#", +"@#CONNECT 14400/ARQ/CELL/MNP4@#", +"@#CONNECT 14400/ARQ/CELL/MNP5@#", +"@#CONNECT 14400/ARQ/CELL/V42 /SREJ@#", +"@#CONNECT 14400/ARQ/CELL/V42 @#", +"@#CONNECT 14400/ARQ/CELL/V42b/SREJ@#", +"@#CONNECT 14400/ARQ/CELL/V42b@#", +"@#CONNECT 14400/ARQ/MNP4@#", +"@#CONNECT 14400/ARQ/MNP5@#", +"@#CONNECT 14400/ARQ/V.34/MNP4@#", +"@#CONNECT 14400/ARQ/V.34/MNP5@#", +"@#CONNECT 14400/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 14400/ARQ/V.34/V42 @#", +"@#CONNECT 14400/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 14400/ARQ/V.34/V42b@#", +"@#CONNECT 14400/ARQ/V.42@#", +"@#CONNECT 14400/ARQ/V.42bis@#", +"@#CONNECT 14400/ARQ/V32b /MNP4@#", +"@#CONNECT 14400/ARQ/V32b /MNP5@#", +"@#CONNECT 14400/ARQ/V32b /V42 /SREJ@#", +"@#CONNECT 14400/ARQ/V32b /V42 @#", +"@#CONNECT 14400/ARQ/V32b /V42b/SREJ@#", +"@#CONNECT 14400/ARQ/V32b /V42b@#", +"@#CONNECT 14400/ARQ/V32b/MNP4@#", +"@#CONNECT 14400/ARQ/V32b/MNP5@#", +"@#CONNECT 14400/ARQ/V32b/V42 /SREJ@#", +"@#CONNECT 14400/ARQ/V32b/V42 @#", +"@#CONNECT 14400/ARQ/V32b/V42b/SREJ@#", +"@#CONNECT 14400/ARQ/V32b/V42b@#", +"@#CONNECT 14400/ARQ/V42 /SREJ@#", +"@#CONNECT 14400/ARQ/V42 @#", +"@#CONNECT 14400/ARQ/V42b/SREJ@#", +"@#CONNECT 14400/ARQ/V42b@#", +"@#CONNECT 14400/ARQ/ZyX /MNP4@#", +"@#CONNECT 14400/ARQ/ZyX /MNP5@#", +"@#CONNECT 14400/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 14400/ARQ/ZyX /V42 @#", +"@#CONNECT 14400/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 14400/ARQ/ZyX /V42b@#", +"@#CONNECT 14400/ARQ/ZyX /MNP4@#", +"@#CONNECT 14400/ARQ/ZyX /MNP5@#", +"@#CONNECT 14400/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 14400/ARQ/ZyX /V42 @#", +"@#CONNECT 14400/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 14400/ARQ/ZyX /V42b@#", +"@#CONNECT 14400/ARQ@#", +"@#CONNECT 14400/COMP@#", +"@#CONNECT 14400/LAP-M/COMPRESSION@#", +"@#CONNECT 14400/LAP-M@#", +"@#CONNECT 14400/LAPM/COMP@#", +"@#CONNECT 14400/LAPM/V42BIS@#", +"@#CONNECT 14400/LAPM@#", +"@#CONNECT 14400/MNP COMPRESSED@#", +"@#CONNECT 14400/MNP@#", +"@#CONNECT 14400/NONE@#", +"@#CONNECT 14400/NOR@#", +"@#CONNECT 14400/REL-LAPM-COMP@#", +"@#CONNECT 14400/REL-LAPM V.42 BIS@#", +"@#CONNECT 14400/REL-LAPM@#", +"@#CONNECT 14400/REL-MNP-COMP@#", +"@#CONNECT 14400/REL-MNP@#", +"@#CONNECT 14400/REL-V.42@#", +"@#CONNECT 14400/REL COMP@#", +"@#CONNECT 14400/REL COMPRESSED@#", +"@#CONNECT 14400/REL/COMP@#", +"@#CONNECT 14400/REL@#", +"@#CONNECT 14400/RELC@#", +"@#CONNECT 14400/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 14400/RELIABLE/LAPM@#", +"@#CONNECT 14400/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 14400/RELIABLE/MNP@#", +"@#CONNECT 14400/V42@#", +"@#CONNECT 14400/V42B@#", +"@#CONNECT 14400/V42BIS@#", +"@#CONNECT 14400@#", +"@#CONNECT 14400T RELIABLE@#", +"@#CONNECT 14400T V.42@#", +"@#CONNECT 14400T/V42BIS@#", +"@#CONNECT 14600/ARQ/V.34/MNP4@#", +"@#CONNECT 14600/ARQ/V.34/MNP5@#", +"@#CONNECT 14600/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 14600/ARQ/V.34/V42 @#", +"@#CONNECT 14600/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 14600/ARQ/V.34/V42b@#", +"@#CONNECT 14600@#", +"@#CONNECT 16000 EC/V42BIS@#", +"@#CONNECT 16800 EC/V42@#", +"@#CONNECT 16800 EC/V42BIS@#", +"@#CONNECT 16800 EC@#", +"@#CONNECT 16800 LAPM COMPRESSED@#", +"@#CONNECT 16800 LAPM@#", +"@#CONNECT 16800 REL/MNP5@#", +"@#CONNECT 16800 REL/V42@#", +"@#CONNECT 16800 REL/V42BIS@#", +"@#CONNECT 16800 REL@#", +"@#CONNECT 16800 RELIABLE COMPRESSED@#", +"@#CONNECT 16800 RELIABLE@#", +"@#CONNECT 16800/ARQ/MNP4@#", +"@#CONNECT 16800/ARQ/MNP5@#", +"@#CONNECT 16800/ARQ/V.34/MNP4@#", +"@#CONNECT 16800/ARQ/V.34/MNP5@#", +"@#CONNECT 16800/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 16800/ARQ/V.34/V42 @#", +"@#CONNECT 16800/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 16800/ARQ/V.34/V42b@#", +"@#CONNECT 16800/ARQ/V.42@#", +"@#CONNECT 16800/ARQ/V.42bis@#", +"@#CONNECT 16800/ARQ/V42 /SREJ@#", +"@#CONNECT 16800/ARQ/V42 @#", +"@#CONNECT 16800/ARQ/V42b/SREJ@#", +"@#CONNECT 16800/ARQ/V42b@#", +"@#CONNECT 16800/ARQ/ZyX /MNP4@#", +"@#CONNECT 16800/ARQ/ZyX /MNP5@#", +"@#CONNECT 16800/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 16800/ARQ/ZyX /V42 @#", +"@#CONNECT 16800/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 16800/ARQ/ZyX /V42b@#", +"@#CONNECT 16800/ARQ/ZyX /MNP4@#", +"@#CONNECT 16800/ARQ/ZyX /MNP5@#", +"@#CONNECT 16800/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 16800/ARQ/ZyX /V42 @#", +"@#CONNECT 16800/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 16800/ARQ/ZyX /V42b@#", +"@#CONNECT 16800/ARQ@#", +"@#CONNECT 16800/COMP@#", +"@#CONNECT 16800/LAP-M/COMPRESSION@#", +"@#CONNECT 16800/LAP-M@#", +"@#CONNECT 16800/LAPM/COMP@#", +"@#CONNECT 16800/LAPM/V42BIS@#", +"@#CONNECT 16800/LAPM@#", +"@#CONNECT 16800/MNP COMPRESSED@#", +"@#CONNECT 16800/MNP@#", +"@#CONNECT 16800/NONE@#", +"@#CONNECT 16800/NOR@#", +"@#CONNECT 16800/REL-LAPM V.42 BIS@#", +"@#CONNECT 16800/REL-LAPM@#", +"@#CONNECT 16800/REL-V.42@#", +"@#CONNECT 16800/REL COMP@#", +"@#CONNECT 16800/REL/COMP@#", +"@#CONNECT 16800/REL@#", +"@#CONNECT 16800/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 16800/RELIABLE/LAPM@#", +"@#CONNECT 16800/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 16800/RELIABLE/MNP@#", +"@#CONNECT 16800/V42@#", +"@#CONNECT 16800/V42BIS@#", +"@#CONNECT 16800@#", +"@#CONNECT 16800T/V42BIS@#", +"@#CONNECT 17000/ARQ/V.34/MNP4@#", +"@#CONNECT 17000/ARQ/V.34/MNP5@#", +"@#CONNECT 17000/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 17000/ARQ/V.34/V42 @#", +"@#CONNECT 17000/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 17000/ARQ/V.34/V42b@#", +"@#CONNECT 17000@#", +"@#CONNECT 19200 ALT / MNP5@#", +"@#CONNECT 19200 ALT /MNP 5@#", +"@#CONNECT 19200 ALT@#", +"@#CONNECT 19200 EC/BIS@#", +"@#CONNECT 19200 EC/V42@#", +"@#CONNECT 19200 EC/V42BIZ@#", +"@#CONNECT 19200 EC@#", +"@#CONNECT 19200 LAPM / V.42bis@#", +"@#CONNECT 19200 LAPM /V.42bis@#", +"@#CONNECT 19200 LAPM COMPRESSED@#", +"@#CONNECT 19200 LAPM@#", +"@#CONNECT 19200 REL/MNP5@#", +"@#CONNECT 19200 REL/V42@#", +"@#CONNECT 19200 REL/V42BIS@#", +"@#CONNECT 19200 REL@#", +"@#CONNECT 19200 RELIABLE COMPRESSED@#", +"@#CONNECT 19200 RELIABLE@#", +"@#CONNECT 19200/ARQ/MNP4@#", +"@#CONNECT 19200/ARQ/MNP5@#", +"@#CONNECT 19200/ARQ/V.34/MNP4@#", +"@#CONNECT 19200/ARQ/V.34/MNP5@#", +"@#CONNECT 19200/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 19200/ARQ/V.34/V42 @#", +"@#CONNECT 19200/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 19200/ARQ/V.34/V42b@#", +"@#CONNECT 19200/ARQ/V.42@#", +"@#CONNECT 19200/ARQ/V.42bis@#", +"@#CONNECT 19200/ARQ/V42 /SREJ@#", +"@#CONNECT 19200/ARQ/V42 @#", +"@#CONNECT 19200/ARQ/V42b/SREJ@#", +"@#CONNECT 19200/ARQ/V42b@#", +"@#CONNECT 19200/ARQ/ZyX /MNP4@#", +"@#CONNECT 19200/ARQ/ZyX /MNP5@#", +"@#CONNECT 19200/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 19200/ARQ/ZyX /V42 @#", +"@#CONNECT 19200/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 19200/ARQ/ZyX /V42b@#", +"@#CONNECT 19200/ARQ/ZyX /MNP4@#", +"@#CONNECT 19200/ARQ/ZyX /MNP5@#", +"@#CONNECT 19200/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 19200/ARQ/ZyX /V42 @#", +"@#CONNECT 19200/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 19200/ARQ/ZyX /V42b@#", +"@#CONNECT 19200/ARQ@#", +"@#CONNECT 19200/COMP@#", +"@#CONNECT 19200/LAP-M/COMPRESSION@#", +"@#CONNECT 19200/LAP-M@#", +"@#CONNECT 19200/LAPM/COMP@#", +"@#CONNECT 19200/LAPM/V42BIS@#", +"@#CONNECT 19200/LAPM@#", +"@#CONNECT 19200/MNP COMPRESSED@#", +"@#CONNECT 19200/MNP@#", +"@#CONNECT 19200/NONE@#", +"@#CONNECT 19200/NOR@#", +"@#CONNECT 19200/REL-LAPM V.42 BIS@#", +"@#CONNECT 19200/REL-LAPM@#", +"@#CONNECT 19200/REL-V.42@#", +"@#CONNECT 19200/REL COMP@#", +"@#CONNECT 19200/REL/COMP@#", +"@#CONNECT 19200/REL@#", +"@#CONNECT 19200/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 19200/RELIABLE/LAPM@#", +"@#CONNECT 19200/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 19200/RELIABLE/MNP@#", +"@#CONNECT 19200/V.110@#", +"@#CONNECT 19200/V42@#", +"@#CONNECT 19200/V42BIS@#", +"@#CONNECT 19200@#", +"@#CONNECT 19200T/V42BIS@#", +"@#CONNECT 19400/ARQ/V.34/MNP4@#", +"@#CONNECT 19400/ARQ/V.34/MNP5@#", +"@#CONNECT 19400/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 19400/ARQ/V.34/V42 @#", +"@#CONNECT 19400/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 19400/ARQ/V.34/V42b@#", +"@#CONNECT 19400@#", +"@#CONNECT 21600 LAPM COMPRESSED@#", +"@#CONNECT 21600 LAPM@#", +"@#CONNECT 21600 REL/MNP5@#", +"@#CONNECT 21600 REL@#", +"@#CONNECT 21600 RELIABLE COMPRESSED@#", +"@#CONNECT 21600 RELIABLE@#", +"@#CONNECT 21600/ARQ/V.34/MNP4@#", +"@#CONNECT 21600/ARQ/V.34/MNP5@#", +"@#CONNECT 21600/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 21600/ARQ/V.34/V42 @#", +"@#CONNECT 21600/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 21600/ARQ/V.34/V42b@#", +"@#CONNECT 21600/ARQ@#", +"@#CONNECT 21600/COMP@#", +"@#CONNECT 21600/LAP-M/COMPRESSION@#", +"@#CONNECT 21600/LAP-M@#", +"@#CONNECT 21600/LAPM/COMP@#", +"@#CONNECT 21600/LAPM/V42BIS@#", +"@#CONNECT 21600/LAPM@#", +"@#CONNECT 21600/MNP COMPRESSED@#", +"@#CONNECT 21600/MNP@#", +"@#CONNECT 21600/NONE@#", +"@#CONNECT 21600/NOR@#", +"@#CONNECT 21600/REL-LAPM V.42 BIS@#", +"@#CONNECT 21600/REL-LAPM@#", +"@#CONNECT 21600/REL-V.42@#", +"@#CONNECT 21600/REL COMP@#", +"@#CONNECT 21600/REL/COMP@#", +"@#CONNECT 21600/REL@#", +"@#CONNECT 21600/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 21600/RELIABLE/LAPM@#", +"@#CONNECT 21600/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 21600/RELIABLE/MNP@#", +"@#CONNECT 21600/V42@#", +"@#CONNECT 21600/V42BIS@#", +"@#CONNECT 21600@#", +"@#CONNECT 21600T/V42BIS@#", +"@#CONNECT 21800/ARQ/V.34/MNP4@#", +"@#CONNECT 21800/ARQ/V.34/MNP5@#", +"@#CONNECT 21800/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 21800/ARQ/V.34/V42 @#", +"@#CONNECT 21800/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 21800/ARQ/V.34/V42b@#", +"@#CONNECT 21800@#", +"@#CONNECT 230400/ARQ@#", +"@#CONNECT 230400/LAP-M@#", +"@#CONNECT 230400/LAPM/COMP@#", +"@#CONNECT 230400/LAPM@#", +"@#CONNECT 230400/MNP@#", +"@#CONNECT 230400/NONE@#", +"@#CONNECT 230400/REL/COMP@#", +"@#CONNECT 230400/REL@#", +"@#CONNECT 230400/V42BIS@#", +"@#CONNECT 230400@#", +"@#CONNECT 240/MNP@#", +"@#CONNECT 2400 @#", +"@#CONNECT 2400 ALT / MNP5@#", +"@#CONNECT 2400 ALT /MNP 5@#", +"@#CONNECT 2400 ALT@#", +"@#CONNECT 2400 EC/V42@#", +"@#CONNECT 2400 EC/V42BIS@#", +"@#CONNECT 2400 EC@#", +"@#CONNECT 2400 LAPM / V.42bis@#", +"@#CONNECT 2400 LAPM /V.42bis@#", +"@#CONNECT 2400 LAPM COMPRESSED@#", +"@#CONNECT 2400 LAPM@#", +"@#CONNECT 2400 NORMAL@#", +"@#CONNECT 2400 REL/MNP5@#", +"@#CONNECT 2400 REL/V42@#", +"@#CONNECT 2400 REL/V42BIS@#", +"@#CONNECT 2400 REL@#", +"@#CONNECT 2400 RELIABLE COMPRESSED@#", +"@#CONNECT 2400 RELIABLE@#", +"@#CONNECT 2400 V.42@#", +"@#CONNECT 2400/ARQ/CELL /MNP4@#", +"@#CONNECT 2400/ARQ/CELL /MNP5@#", +"@#CONNECT 2400/ARQ/CELL /V42 /SREJ@#", +"@#CONNECT 2400/ARQ/CELL /V42 @#", +"@#CONNECT 2400/ARQ/CELL /V42b/SREJ@#", +"@#CONNECT 2400/ARQ/CELL /V42b@#", +"@#CONNECT 2400/ARQ/CELL/MNP4@#", +"@#CONNECT 2400/ARQ/CELL/MNP5@#", +"@#CONNECT 2400/ARQ/CELL/V42 /SREJ@#", +"@#CONNECT 2400/ARQ/CELL/V42 @#", +"@#CONNECT 2400/ARQ/CELL/V42b/SREJ@#", +"@#CONNECT 2400/ARQ/CELL/V42b@#", +"@#CONNECT 2400/ARQ/MNP4@#", +"@#CONNECT 2400/ARQ/MNP5@#", +"@#CONNECT 2400/ARQ/V.34/MNP4@#", +"@#CONNECT 2400/ARQ/V.34/MNP5@#", +"@#CONNECT 2400/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 2400/ARQ/V.34/V42 @#", +"@#CONNECT 2400/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 2400/ARQ/V.34/V42b@#", +"@#CONNECT 2400/ARQ/V.42@#", +"@#CONNECT 2400/ARQ/V.42bis@#", +"@#CONNECT 2400/ARQ/V22b /MNP4@#", +"@#CONNECT 2400/ARQ/V22b /MNP5@#", +"@#CONNECT 2400/ARQ/V22b /V42 /SREJ@#", +"@#CONNECT 2400/ARQ/V22b /V42 @#", +"@#CONNECT 2400/ARQ/V22b /V42b/SREJ@#", +"@#CONNECT 2400/ARQ/V22b /V42b@#", +"@#CONNECT 2400/ARQ/V22b/MNP4@#", +"@#CONNECT 2400/ARQ/V22b/MNP5@#", +"@#CONNECT 2400/ARQ/V22b/V42 /SREJ@#", +"@#CONNECT 2400/ARQ/V22b/V42 @#", +"@#CONNECT 2400/ARQ/V22b/V42b/SREJ@#", +"@#CONNECT 2400/ARQ/V22b/V42b@#", +"@#CONNECT 2400/ARQ/V32 /MNP4@#", +"@#CONNECT 2400/ARQ/V32 /MNP5@#", +"@#CONNECT 2400/ARQ/V32 /V42 /SREJ@#", +"@#CONNECT 2400/ARQ/V32 /V42 @#", +"@#CONNECT 2400/ARQ/V32 /V42b/SREJ@#", +"@#CONNECT 2400/ARQ/V32 /V42b@#", +"@#CONNECT 2400/ARQ/V32 /MNP4@#", +"@#CONNECT 2400/ARQ/V32 /MNP5@#", +"@#CONNECT 2400/ARQ/V32 /V42 /SREJ@#", +"@#CONNECT 2400/ARQ/V32 /V42 @#", +"@#CONNECT 2400/ARQ/V32 /V42b/SREJ@#", +"@#CONNECT 2400/ARQ/V32 /V42b@#", +"@#CONNECT 2400/ARQ/V32b /MNP4@#", +"@#CONNECT 2400/ARQ/V32b /MNP5@#", +"@#CONNECT 2400/ARQ/V32b /V42 /SREJ@#", +"@#CONNECT 2400/ARQ/V32b /V42 @#", +"@#CONNECT 2400/ARQ/V32b /V42b/SREJ@#", +"@#CONNECT 2400/ARQ/V32b /V42b@#", +"@#CONNECT 2400/ARQ/V32b/MNP4@#", +"@#CONNECT 2400/ARQ/V32b/MNP5@#", +"@#CONNECT 2400/ARQ/V32b/V42 /SREJ@#", +"@#CONNECT 2400/ARQ/V32b/V42 @#", +"@#CONNECT 2400/ARQ/V32b/V42b/SREJ@#", +"@#CONNECT 2400/ARQ/V32b/V42b@#", +"@#CONNECT 2400/ARQ/V42 /SREJ@#", +"@#CONNECT 2400/ARQ/V42 @#", +"@#CONNECT 2400/ARQ/V42b/SREJ@#", +"@#CONNECT 2400/ARQ/V42b@#", +"@#CONNECT 2400/ARQ/ZyX /MNP4@#", +"@#CONNECT 2400/ARQ/ZyX /MNP5@#", +"@#CONNECT 2400/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 2400/ARQ/ZyX /V42 @#", +"@#CONNECT 2400/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 2400/ARQ/ZyX /V42b@#", +"@#CONNECT 2400/ARQ/ZyX /MNP4@#", +"@#CONNECT 2400/ARQ/ZyX /MNP5@#", +"@#CONNECT 2400/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 2400/ARQ/ZyX /V42 @#", +"@#CONNECT 2400/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 2400/ARQ/ZyX /V42b@#", +"@#CONNECT 2400/ARQ@#", +"@#CONNECT 2400/COMP@#", +"@#CONNECT 2400/LAP-M/COMPRESSION@#", +"@#CONNECT 2400/LAP-M@#", +"@#CONNECT 2400/LAPM/COMP@#", +"@#CONNECT 2400/LAPM/V42BIS@#", +"@#CONNECT 2400/LAPM@#", +"@#CONNECT 2400/MNP COMPRESSED@#", +"@#CONNECT 2400/MNP@#", +"@#CONNECT 2400/NONE@#", +"@#CONNECT 2400/NOR@#", +"@#CONNECT 2400/REL-LAPM-COMP@#", +"@#CONNECT 2400/REL-LAPM V.42 BIS@#", +"@#CONNECT 2400/REL-LAPM@#", +"@#CONNECT 2400/REL-MNP-COMP@#", +"@#CONNECT 2400/REL-MNP@#", +"@#CONNECT 2400/REL-V.42@#", +"@#CONNECT 2400/REL 1@# ", +"@#CONNECT 2400/REL 2@# ", +"@#CONNECT 2400/REL 3@# ", +"@#CONNECT 2400/REL 4@# ", +"@#CONNECT 2400/REL 5@# ", +"@#CONNECT 2400/REL COMP@#", +"@#CONNECT 2400/REL COMPRESSED@#", +"@#CONNECT 2400/REL/COMP@#", +"@#CONNECT 2400/REL@#", +"@#CONNECT 2400/RELC@#", +"@#CONNECT 2400/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 2400/RELIABLE/LAPM@#", +"@#CONNECT 2400/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 2400/RELIABLE/MNP@#", +"@#CONNECT 2400/V42@#", +"@#CONNECT 2400/V42B@#", +"@#CONNECT 2400/V42BIS@#", +"@#CONNECT 2400@#", +"@#CONNECT 24000 LAPM COMPRESSED@#", +"@#CONNECT 24000 LAPM@#", +"@#CONNECT 24000 REL/MNP5@#", +"@#CONNECT 24000 REL@#", +"@#CONNECT 24000 RELIABLE COMPRESSED@#", +"@#CONNECT 24000 RELIABLE@#", +"@#CONNECT 24000/ARQ/V.34/MNP4@#", +"@#CONNECT 24000/ARQ/V.34/MNP5@#", +"@#CONNECT 24000/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 24000/ARQ/V.34/V42 @#", +"@#CONNECT 24000/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 24000/ARQ/V.34/V42b@#", +"@#CONNECT 24000/ARQ@#", +"@#CONNECT 24000/COMP@#", +"@#CONNECT 24000/LAP-M/COMPRESSION@#", +"@#CONNECT 24000/LAP-M@#", +"@#CONNECT 24000/LAPM/COMP@#", +"@#CONNECT 24000/LAPM/V42BIS@#", +"@#CONNECT 24000/LAPM@#", +"@#CONNECT 24000/MNP COMPRESSED@#", +"@#CONNECT 24000/MNP@#", +"@#CONNECT 24000/NONE@#", +"@#CONNECT 24000/NOR@#", +"@#CONNECT 24000/REL-LAPM V.42 BIS@#", +"@#CONNECT 24000/REL-LAPM@#", +"@#CONNECT 24000/REL-V.42@#", +"@#CONNECT 24000/REL COMP@#", +"@#CONNECT 24000/REL/COMP@#", +"@#CONNECT 24000/REL@#", +"@#CONNECT 24000/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 24000/RELIABLE/LAPM@#", +"@#CONNECT 24000/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 24000/RELIABLE/MNP@#", +"@#CONNECT 24000/V42@#", +"@#CONNECT 24000/V42BIS@#", +"@#CONNECT 24000@#", +"@#CONNECT 24000T/V42BIS@#", +"@#CONNECT 2400T/V42BIS@#", +"@#CONNECT 24200/ARQ/V.34/MNP4@#", +"@#CONNECT 24200/ARQ/V.34/MNP5@#", +"@#CONNECT 24200/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 24200/ARQ/V.34/V42 @#", +"@#CONNECT 24200/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 24200/ARQ/V.34/V42b@#", +"@#CONNECT 24200@#", +"@#CONNECT 2600/ARQ/V.34/MNP4@#", +"@#CONNECT 2600/ARQ/V.34/MNP5@#", +"@#CONNECT 2600/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 2600/ARQ/V.34/V42 @#", +"@#CONNECT 2600/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 2600/ARQ/V.34/V42b@#", +"@#CONNECT 2600@#", +"@#CONNECT 26400 LAPM COMPRESSED#", +"@#CONNECT 26400 LAPM@#", +"@#CONNECT 26400 REL/MNP5@#", +"@#CONNECT 26400 REL@#", +"@#CONNECT 26400 RELIABLE COMPRESSED#", +"@#CONNECT 26400 RELIABLE@#", +"@#CONNECT 26400/ARQ/V.34/MNP4@#", +"@#CONNECT 26400/ARQ/V.34/MNP5@#", +"@#CONNECT 26400/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 26400/ARQ/V.34/V42 @#", +"@#CONNECT 26400/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 26400/ARQ/V.34/V42b@#", +"@#CONNECT 26400/ARQ@#", +"@#CONNECT 26400/COMP@#", +"@#CONNECT 26400/LAP-M/COMPRESSION@#", +"@#CONNECT 26400/LAP-M@#", +"@#CONNECT 26400/LAPM/COMP@#", +"@#CONNECT 26400/LAPM/V42BIS@#", +"@#CONNECT 26400/LAPM@#", +"@#CONNECT 26400/MNP COMPRESSED@#", +"@#CONNECT 26400/MNP@#", +"@#CONNECT 26400/NONE@#", +"@#CONNECT 26400/NOR@#", +"@#CONNECT 26400/REL-LAPM V.42 BIS@#", +"@#CONNECT 26400/REL-LAPM@#", +"@#CONNECT 26400/REL-V.42@#", +"@#CONNECT 26400/REL COMP@#", +"@#CONNECT 26400/REL/COMP@#", +"@#CONNECT 26400/REL@#", +"@#CONNECT 26400/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 26400/RELIABLE/LAPM@#", +"@#CONNECT 26400/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 26400/RELIABLE/MNP@#", +"@#CONNECT 26400/V42@#", +"@#CONNECT 26400/V42BIS@#", +"@#CONNECT 26400@#", +"@#CONNECT 26400T/V42BIS@#", +"@#CONNECT 26600/ARQ/V.34/MNP4@#", +"@#CONNECT 26600/ARQ/V.34/MNP5@#", +"@#CONNECT 26600/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 26600/ARQ/V.34/V42 @#", +"@#CONNECT 26600/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 26600/ARQ/V.34/V42b@#", +"@#CONNECT 26600@#", +"@#CONNECT 26800/MNP COMPRESSED@#", +"@#CONNECT 28800 LAPM COMPRESSED@#", +"@#CONNECT 28800 LAPM@#", +"@#CONNECT 28800 REL/MNP5@#", +"@#CONNECT 28800 REL@#", +"@#CONNECT 28800 RELIABLE COMPRESSED@#", +"@#CONNECT 28800 RELIABLE@#", +"@#CONNECT 28800/ARQ/V.34/MNP4@#", +"@#CONNECT 28800/ARQ/V.34/MNP5@#", +"@#CONNECT 28800/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 28800/ARQ/V.34/V42 @#", +"@#CONNECT 28800/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 28800/ARQ/V.34/V42b@#", +"@#CONNECT 28800/ARQ@#", +"@#CONNECT 28800/COMP@#", +"@#CONNECT 28800/LAP-M/COMPRESSION@#", +"@#CONNECT 28800/LAP-M@#", +"@#CONNECT 28800/LAPM/COMP@#", +"@#CONNECT 28800/LAPM/V42BIS@#", +"@#CONNECT 28800/LAPM@#", +"@#CONNECT 28800/MNP COMPRESSED@#", +"@#CONNECT 28800/MNP@#", +"@#CONNECT 28800/NONE@#", +"@#CONNECT 28800/NOR@#", +"@#CONNECT 28800/REL-LAPM V.42 BIS@#", +"@#CONNECT 28800/REL-LAPM@#", +"@#CONNECT 28800/REL-V.42@#", +"@#CONNECT 28800/REL COMP@#", +"@#CONNECT 28800/REL/COMP@#", +"@#CONNECT 28800/REL@#", +"@#CONNECT 28800/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 28800/RELIABLE/LAPM@#", +"@#CONNECT 28800/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 28800/RELIABLE/MNP@#", +"@#CONNECT 28800/V42@#", +"@#CONNECT 28800/V42BIS@#", +"@#CONNECT 28800@#", +"@#CONNECT 28800T/V42BIS@#", +"@#CONNECT 29000/ARQ/V.34/MNP4@#", +"@#CONNECT 29000/ARQ/V.34/MNP5@#", +"@#CONNECT 29000/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 29000/ARQ/V.34/V42 @#", +"@#CONNECT 29000/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 29000/ARQ/V.34/V42b@#", +"@#CONNECT 29000@#", +"@#CONNECT 300 ALT / MNP5@#", +"@#CONNECT 300 ALT /MNP 5@#", +"@#CONNECT 300 ALT@#", +"@#CONNECT 300 EC/V42BIS@#", +"@#CONNECT 300 EC@#", +"@#CONNECT 300 LAPM / V.42bis@#", +"@#CONNECT 300 LAPM /V.42bis@#", +"@#CONNECT 300 LAPM@#", +"@#CONNECT 300 REL/MNP5@#", +"@#CONNECT 300 REL@#", +"@#CONNECT 300/ARQ/MNP4@#", +"@#CONNECT 300/ARQ/MNP5@#", +"@#CONNECT 300/ARQ/V.42@#", +"@#CONNECT 300/ARQ/V.42bis@#", +"@#CONNECT 300/ARQ/V42 /SREJ@#", +"@#CONNECT 300/ARQ/V42 @#", +"@#CONNECT 300/ARQ/V42b@#", +"@#CONNECT 300/ARQ@#", +"@#CONNECT 300/COMP@#", +"@#CONNECT 300/LAP-M/COMPRESSION@#", +"@#CONNECT 300/LAP-M@#", +"@#CONNECT 300/LAPM/COMP@#", +"@#CONNECT 300/LAPM/V42BIS@#", +"@#CONNECT 300/LAPM@#", +"@#CONNECT 300/MNP COMPRESSED@#", +"@#CONNECT 300/MNP@#", +"@#CONNECT 300/NONE@#", +"@#CONNECT 300/NOR@#", +"@#CONNECT 300/REL-LAPM V.42 BIS@#", +"@#CONNECT 300/REL-LAPM@#", +"@#CONNECT 300/REL-MNP@#", +"@#CONNECT 300/REL-V.42@#", +"@#CONNECT 300/REL 1@# ", +"@#CONNECT 300/REL 2@# ", +"@#CONNECT 300/REL 3@# ", +"@#CONNECT 300/REL 4@# ", +"@#CONNECT 300/REL 5@# ", +"@#CONNECT 300/REL COMP@#", +"@#CONNECT 300/REL COMPRESSED@#", +"@#CONNECT 300/REL/COMP@#", +"@#CONNECT 300/REL@#", +"@#CONNECT 300/V42@#", +"@#CONNECT 300/V42BIS@#", +"@#CONNECT 300@#", +"@#CONNECT 300T/V42BIS@#", +"@#CONNECT 31200/ARQ/V.34/MNP4@#", +"@#CONNECT 31200/ARQ/V.34/MNP5@#", +"@#CONNECT 31200/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 31200/ARQ/V.34/V42 @#", +"@#CONNECT 31200/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 31200/ARQ/V.34/V42b@#", +"@#CONNECT 31200@#", +"@#CONNECT 31400/ARQ/V.34/MNP4@#", +"@#CONNECT 31400/ARQ/V.34/MNP5@#", +"@#CONNECT 31400/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 31400/ARQ/V.34/V42 @#", +"@#CONNECT 31400/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 31400/ARQ/V.34/V42b@#", +"@#CONNECT 31400@#", +"@#CONNECT 33600/ARQ/V.34/MNP4@#", +"@#CONNECT 33600/ARQ/V.34/MNP5@#", +"@#CONNECT 33600/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 33600/ARQ/V.34/V42 @#", +"@#CONNECT 33600/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 33600/ARQ/V.34/V42b@#", +"@#CONNECT 33600@#", +"@#CONNECT 33800/ARQ/V.34/MNP4@#", +"@#CONNECT 33800/ARQ/V.34/MNP5@#", +"@#CONNECT 33800/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 33800/ARQ/V.34/V42 @#", +"@#CONNECT 33800/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 33800/ARQ/V.34/V42b@#", +"@#CONNECT 33800@#", +"@#CONNECT 38400 ALT / MNP5@#", +"@#CONNECT 38400 ALT /MNP 5@#", +"@#CONNECT 38400 ALT@#", +"@#CONNECT 38400 EC/V42BIS@#", +"@#CONNECT 38400 EC@#", +"@#CONNECT 38400 LAPM / V.42bis@#", +"@#CONNECT 38400 LAPM /V.42bis@#", +"@#CONNECT 38400 LAPM@#", +"@#CONNECT 38400 REL/MNP5@#", +"@#CONNECT 38400 REL/V42@#", +"@#CONNECT 38400 REL@#", +"@#CONNECT 38400/ARQ/V42 /SREJ@#", +"@#CONNECT 38400/ARQ/V42 @#", +"@#CONNECT 38400/ARQ/V42b@#", +"@#CONNECT 38400/ARQ@#", +"@#CONNECT 38400/COMP@#", +"@#CONNECT 38400/LAP-M/COMPRESSION@#", +"@#CONNECT 38400/LAP-M@#", +"@#CONNECT 38400/LAPM/COMP@#", +"@#CONNECT 38400/LAPM@#", +"@#CONNECT 38400/MNP COMPRESSED@#", +"@#CONNECT 38400/MNP@#", +"@#CONNECT 38400/NONE@#", +"@#CONNECT 38400/NOR@#", +"@#CONNECT 38400/REL-LAPM V.42 BIS@#", +"@#CONNECT 38400/REL-LAPM@#", +"@#CONNECT 38400/REL-V.42@#", +"@#CONNECT 38400/REL COMP@#", +"@#CONNECT 38400/REL/COMP@#", +"@#CONNECT 38400/REL@#", +"@#CONNECT 38400/V.110@#", +"@#CONNECT 38400/V42@#", +"@#CONNECT 38400/V42BIS@#", +"@#CONNECT 38400@#", +"@#CONNECT 38400T/V42BIS@#", +"@#CONNECT 4800 ALT / MNP5@#", +"@#CONNECT 4800 ALT /MNP 5@#", +"@#CONNECT 4800 ALT@#", +"@#CONNECT 4800 EC/V42@#", +"@#CONNECT 4800 EC/V42BIS@#", +"@#CONNECT 4800 EC@#", +"@#CONNECT 4800 LAPM / V.42bis@#", +"@#CONNECT 4800 LAPM /V.42bis@#", +"@#CONNECT 4800 LAPM COMPRESSED@#", +"@#CONNECT 4800 LAPM@#", +"@#CONNECT 4800 NORMAL@#", +"@#CONNECT 4800 REL/MNP5@#", +"@#CONNECT 4800 REL/V42@#", +"@#CONNECT 4800 REL/V42BIS@#", +"@#CONNECT 4800 REL@#", +"@#CONNECT 4800 RELIABLE COMPRESSED@#", +"@#CONNECT 4800 RELIABLE@#", +"@#CONNECT 4800 V.42@#", +"@#CONNECT 4800/ARQ/CELL /MNP4@#", +"@#CONNECT 4800/ARQ/CELL /MNP5@#", +"@#CONNECT 4800/ARQ/CELL /V42 /SREJ@#", +"@#CONNECT 4800/ARQ/CELL /V42 @#", +"@#CONNECT 4800/ARQ/CELL /V42b/SREJ@#", +"@#CONNECT 4800/ARQ/CELL /V42b@#", +"@#CONNECT 4800/ARQ/CELL/MNP4@#", +"@#CONNECT 4800/ARQ/CELL/MNP5@#", +"@#CONNECT 4800/ARQ/CELL/V42 /SREJ@#", +"@#CONNECT 4800/ARQ/CELL/V42 @#", +"@#CONNECT 4800/ARQ/CELL/V42b/SREJ@#", +"@#CONNECT 4800/ARQ/CELL/V42b@#", +"@#CONNECT 4800/ARQ/MNP4@#", +"@#CONNECT 4800/ARQ/MNP5@#", +"@#CONNECT 4800/ARQ/V.34/MNP4@#", +"@#CONNECT 4800/ARQ/V.34/MNP5@#", +"@#CONNECT 4800/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 4800/ARQ/V.34/V42 @#", +"@#CONNECT 4800/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 4800/ARQ/V.34/V42b@#", +"@#CONNECT 4800/ARQ/V.42@#", +"@#CONNECT 4800/ARQ/V.42bis@#", +"@#CONNECT 4800/ARQ/V32 /MNP4@#", +"@#CONNECT 4800/ARQ/V32 /MNP5@#", +"@#CONNECT 4800/ARQ/V32 /V42 /SREJ@#", +"@#CONNECT 4800/ARQ/V32 /V42 @#", +"@#CONNECT 4800/ARQ/V32 /V42b/SREJ@#", +"@#CONNECT 4800/ARQ/V32 /V42b@#", +"@#CONNECT 4800/ARQ/V32 /MNP4@#", +"@#CONNECT 4800/ARQ/V32 /MNP5@#", +"@#CONNECT 4800/ARQ/V32 /V42 /SREJ@#", +"@#CONNECT 4800/ARQ/V32 /V42 @#", +"@#CONNECT 4800/ARQ/V32 /V42b/SREJ@#", +"@#CONNECT 4800/ARQ/V32 /V42b@#", +"@#CONNECT 4800/ARQ/V32b /MNP4@#", +"@#CONNECT 4800/ARQ/V32b /MNP5@#", +"@#CONNECT 4800/ARQ/V32b /V42 /SREJ@#", +"@#CONNECT 4800/ARQ/V32b /V42 @#", +"@#CONNECT 4800/ARQ/V32b /V42b/SREJ@#", +"@#CONNECT 4800/ARQ/V32b /V42b@#", +"@#CONNECT 4800/ARQ/V32b/MNP4@#", +"@#CONNECT 4800/ARQ/V32b/MNP5@#", +"@#CONNECT 4800/ARQ/V32b/V42 /SREJ@#", +"@#CONNECT 4800/ARQ/V32b/V42 @#", +"@#CONNECT 4800/ARQ/V32b/V42b/SREJ@#", +"@#CONNECT 4800/ARQ/V32b/V42b@#", +"@#CONNECT 4800/ARQ/V42 /SREJ@#", +"@#CONNECT 4800/ARQ/V42 @#", +"@#CONNECT 4800/ARQ/V42b/SREJ@#", +"@#CONNECT 4800/ARQ/V42b@#", +"@#CONNECT 4800/ARQ/ZyX /MNP4@#", +"@#CONNECT 4800/ARQ/ZyX /MNP5@#", +"@#CONNECT 4800/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 4800/ARQ/ZyX /V42 @#", +"@#CONNECT 4800/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 4800/ARQ/ZyX /V42b@#", +"@#CONNECT 4800/ARQ/ZyX /MNP4@#", +"@#CONNECT 4800/ARQ/ZyX /MNP5@#", +"@#CONNECT 4800/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 4800/ARQ/ZyX /V42 @#", +"@#CONNECT 4800/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 4800/ARQ/ZyX /V42b@#", +"@#CONNECT 4800/ARQ@#", +"@#CONNECT 4800/COMP@#", +"@#CONNECT 4800/LAP-M/COMPRESSION@#", +"@#CONNECT 4800/LAP-M@#", +"@#CONNECT 4800/LAPM/COMP@#", +"@#CONNECT 4800/LAPM/V42BIS@#", +"@#CONNECT 4800/LAPM@#", +"@#CONNECT 4800/MNP COMPRESSED@#", +"@#CONNECT 4800/MNP@#", +"@#CONNECT 4800/NONE@#", +"@#CONNECT 4800/NOR@#", +"@#CONNECT 4800/REL-LAPM-COMP@#", +"@#CONNECT 4800/REL-LAPM V.42 BIS@#", +"@#CONNECT 4800/REL-LAPM@#", +"@#CONNECT 4800/REL-MNP-COMP@#", +"@#CONNECT 4800/REL-MNP@#", +"@#CONNECT 4800/REL-V.42@#", +"@#CONNECT 4800/REL 1@# ", +"@#CONNECT 4800/REL 2@# ", +"@#CONNECT 4800/REL 3@# ", +"@#CONNECT 4800/REL 4@# ", +"@#CONNECT 4800/REL 5@# ", +"@#CONNECT 4800/REL COMP@#", +"@#CONNECT 4800/REL COMPRESSED@#", +"@#CONNECT 4800/REL/COMP@#", +"@#CONNECT 4800/REL@#", +"@#CONNECT 4800/RELC@#", +"@#CONNECT 4800/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 4800/RELIABLE/LAPM@#", +"@#CONNECT 4800/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 4800/RELIABLE/MNP@#", +"@#CONNECT 4800/V42@#", +"@#CONNECT 4800/V42B@#", +"@#CONNECT 4800/V42BIS@#", +"@#CONNECT 4800@#", +"@#CONNECT 48000@#", +"@#CONNECT 4800T/V42BIS@#", +"@#CONNECT 5000/ARQ/V.34/MNP4@#", +"@#CONNECT 5000/ARQ/V.34/MNP5@#", +"@#CONNECT 5000/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 5000/ARQ/V.34/V42 @#", +"@#CONNECT 5000/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 5000/ARQ/V.34/V42b@#", +"@#CONNECT 5000@#", +"@#CONNECT 56000/ARQ/SLP /V120/V42b@#", +"@#CONNECT 56000/ARQ/SLP /V120@#", +"@#CONNECT 56000/REL@#", +"@#CONNECT 56000@#", +"@#CONNECT 57600 ALT / MNP5@#", +"@#CONNECT 57600 ALT /MNP 5@#", +"@#CONNECT 57600 ALT@#", +"@#CONNECT 57600 EC/V42BIS@#", +"@#CONNECT 57600 EC@#", +"@#CONNECT 57600 LAPM / V.42bis@#", +"@#CONNECT 57600 LAPM /V.42bis@#", +"@#CONNECT 57600 LAPM@#", +"@#CONNECT 57600 REL/MNP5@#", +"@#CONNECT 57600 REL@#", +"@#CONNECT 57600/ARQ/V42 /SREJ@#", +"@#CONNECT 57600/ARQ/V42 @#", +"@#CONNECT 57600/ARQ/V42b@#", +"@#CONNECT 57600/ARQ@#", +"@#CONNECT 57600/COMP@#", +"@#CONNECT 57600/LAP-M/COMPRESSION@#", +"@#CONNECT 57600/LAP-M@#", +"@#CONNECT 57600/LAPM/COMP@#", +"@#CONNECT 57600/LAPM@#", +"@#CONNECT 57600/MNP COMPRESSED@#", +"@#CONNECT 57600/MNP@#", +"@#CONNECT 57600/NONE@#", +"@#CONNECT 57600/NOR@#", +"@#CONNECT 57600/REL-LAPM V.42 BIS@#", +"@#CONNECT 57600/REL-LAPM@#", +"@#CONNECT 57600/REL-V.42@#", +"@#CONNECT 57600/REL COMP@#", +"@#CONNECT 57600/REL/COMP@#", +"@#CONNECT 57600/REL@#", +"@#CONNECT 57600/V42@#", +"@#CONNECT 57600/V42BIS@#", +"@#CONNECT 57600@#", +"@#CONNECT 57600@#@#@#*@#COM@#", +"@#CONNECT 57600T/V42BIS@#", +"@#CONNECT 600 ALT / MNP5@#", +"@#CONNECT 600 ALT /MNP 5@#", +"@#CONNECT 600 ALT@#", +"@#CONNECT 600 EC/V42BIS@#", +"@#CONNECT 600 EC@#", +"@#CONNECT 600 LAPM / V.42bis@#", +"@#CONNECT 600 LAPM /V.42bis@#", +"@#CONNECT 600 LAPM@#", +"@#CONNECT 600 REL/MNP5@#", +"@#CONNECT 600 REL@#", +"@#CONNECT 600/ARQ/MNP4@#", +"@#CONNECT 600/ARQ/MNP5@#", +"@#CONNECT 600/ARQ/V.42@#", +"@#CONNECT 600/ARQ/V.42bis@#", +"@#CONNECT 600/ARQ@#", +"@#CONNECT 600/COMP@#", +"@#CONNECT 600/LAP-M/COMPRESSION@#", +"@#CONNECT 600/LAP-M@#", +"@#CONNECT 600/LAPM/COMP@#", +"@#CONNECT 600/LAPM@#", +"@#CONNECT 600/MNP COMPRESSED@#", +"@#CONNECT 600/MNP@#", +"@#CONNECT 600/NONE@#", +"@#CONNECT 600/REL-LAPM V.42 BIS@#", +"@#CONNECT 600/REL 1@# ", +"@#CONNECT 600/REL 2@# ", +"@#CONNECT 600/REL 3@# ", +"@#CONNECT 600/REL 4@# ", +"@#CONNECT 600/REL 5@# ", +"@#CONNECT 600/REL COMPRESSED@#", +"@#CONNECT 600/REL/COMP@#", +"@#CONNECT 600/REL@#", +"@#CONNECT 600/V42@#", +"@#CONNECT 600/V42BIS@#", +"@#CONNECT 600@#", +"@#CONNECT 64000/ARQ/SLP /X.75/V42b@#", +"@#CONNECT 64000/ARQ/SLP /X.75@#", +"@#CONNECT 64000/MNP@#", +"@#CONNECT 64000/REL@#", +"@#CONNECT 64000/X.70 BTX@#", +"@#CONNECT 64000/X.70NL@#", +"@#CONNECT 64000/X.75@#", +"@#CONNECT 64000@#", +"@#CONNECT 7200 ALT / MNP5@#", +"@#CONNECT 7200 ALT /MNP 5@#", +"@#CONNECT 7200 ALT@#", +"@#CONNECT 7200 EC/V42@#", +"@#CONNECT 7200 EC/V42BIS@#", +"@#CONNECT 7200 EC@#", +"@#CONNECT 7200 LAPM / V.42bis@#", +"@#CONNECT 7200 LAPM /V.42bis@#", +"@#CONNECT 7200 LAPM COMPRESSED@#", +"@#CONNECT 7200 LAPM@#", +"@#CONNECT 7200 REL/MNP5@#", +"@#CONNECT 7200 REL/V42@#", +"@#CONNECT 7200 REL/V42BIS@#", +"@#CONNECT 7200 REL@#", +"@#CONNECT 7200 RELIABLE@#", +"@#CONNECT 7200/ARQ/CELL /MNP4@#", +"@#CONNECT 7200/ARQ/CELL /MNP5@#", +"@#CONNECT 7200/ARQ/CELL /V42 /SREJ@#", +"@#CONNECT 7200/ARQ/CELL /V42 @#", +"@#CONNECT 7200/ARQ/CELL /V42b/SREJ@#", +"@#CONNECT 7200/ARQ/CELL /V42b@#", +"@#CONNECT 7200/ARQ/CELL/MNP4@#", +"@#CONNECT 7200/ARQ/CELL/MNP5@#", +"@#CONNECT 7200/ARQ/CELL/V42 /SREJ@#", +"@#CONNECT 7200/ARQ/CELL/V42 @#", +"@#CONNECT 7200/ARQ/CELL/V42b/SREJ@#", +"@#CONNECT 7200/ARQ/CELL/V42b@#", +"@#CONNECT 7200/ARQ/MNP4@#", +"@#CONNECT 7200/ARQ/MNP5@#", +"@#CONNECT 7200/ARQ/V.34/MNP4@#", +"@#CONNECT 7200/ARQ/V.34/MNP5@#", +"@#CONNECT 7200/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 7200/ARQ/V.34/V42 @#", +"@#CONNECT 7200/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 7200/ARQ/V.34/V42b@#", +"@#CONNECT 7200/ARQ/V.42@#", +"@#CONNECT 7200/ARQ/V.42bis@#", +"@#CONNECT 7200/ARQ/V32 /MNP4@#", +"@#CONNECT 7200/ARQ/V32 /MNP5@#", +"@#CONNECT 7200/ARQ/V32 /V42 /SREJ@#", +"@#CONNECT 7200/ARQ/V32 /V42 @#", +"@#CONNECT 7200/ARQ/V32 /V42b/SREJ@#", +"@#CONNECT 7200/ARQ/V32 /V42b@#", +"@#CONNECT 7200/ARQ/V32 /MNP4@#", +"@#CONNECT 7200/ARQ/V32 /MNP5@#", +"@#CONNECT 7200/ARQ/V32 /V42 /SREJ@#", +"@#CONNECT 7200/ARQ/V32 /V42 @#", +"@#CONNECT 7200/ARQ/V32 /V42b/SREJ@#", +"@#CONNECT 7200/ARQ/V32 /V42b@#", +"@#CONNECT 7200/ARQ/V32b /MNP4@#", +"@#CONNECT 7200/ARQ/V32b /MNP5@#", +"@#CONNECT 7200/ARQ/V32b /V42 /SREJ@#", +"@#CONNECT 7200/ARQ/V32b /V42 @#", +"@#CONNECT 7200/ARQ/V32b /V42b/SREJ@#", +"@#CONNECT 7200/ARQ/V32b /V42b@#", +"@#CONNECT 7200/ARQ/V32b/MNP4@#", +"@#CONNECT 7200/ARQ/V32b/MNP5@#", +"@#CONNECT 7200/ARQ/V32b/V42 /SREJ@#", +"@#CONNECT 7200/ARQ/V32b/V42 @#", +"@#CONNECT 7200/ARQ/V32b/V42b/SREJ@#", +"@#CONNECT 7200/ARQ/V32b/V42b@#", +"@#CONNECT 7200/ARQ/V42 /SREJ@#", +"@#CONNECT 7200/ARQ/V42 @#", +"@#CONNECT 7200/ARQ/V42b/SREJ@#", +"@#CONNECT 7200/ARQ/V42b@#", +"@#CONNECT 7200/ARQ/ZyX /MNP4@#", +"@#CONNECT 7200/ARQ/ZyX /MNP5@#", +"@#CONNECT 7200/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 7200/ARQ/ZyX /V42 @#", +"@#CONNECT 7200/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 7200/ARQ/ZyX /V42b@#", +"@#CONNECT 7200/ARQ/ZyX /MNP4@#", +"@#CONNECT 7200/ARQ/ZyX /MNP5@#", +"@#CONNECT 7200/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 7200/ARQ/ZyX /V42 @#", +"@#CONNECT 7200/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 7200/ARQ/ZyX /V42b@#", +"@#CONNECT 7200/ARQ@#", +"@#CONNECT 7200/COMP@#", +"@#CONNECT 7200/LAP-M/COMPRESSION@#", +"@#CONNECT 7200/LAP-M@#", +"@#CONNECT 7200/LAPM/COMP@#", +"@#CONNECT 7200/LAPM/V42BIS@#", +"@#CONNECT 7200/LAPM@#", +"@#CONNECT 7200/MNP COMPRESSED@#", +"@#CONNECT 7200/MNP@#", +"@#CONNECT 7200/NONE@#", +"@#CONNECT 7200/NOR@#", +"@#CONNECT 7200/REL-LAPM-COMP@#", +"@#CONNECT 7200/REL-LAPM V.42 BIS@#", +"@#CONNECT 7200/REL-LAPM@#", +"@#CONNECT 7200/REL-MNP-COMP@#", +"@#CONNECT 7200/REL-MNP@#", +"@#CONNECT 7200/REL-V.42@#", +"@#CONNECT 7200/REL 1@# ", +"@#CONNECT 7200/REL 2@# ", +"@#CONNECT 7200/REL 3@# ", +"@#CONNECT 7200/REL 4@# ", +"@#CONNECT 7200/REL 5@# ", +"@#CONNECT 7200/REL COMP@#", +"@#CONNECT 7200/REL/COMP@#", +"@#CONNECT 7200/REL@#", +"@#CONNECT 7200/RELC@#", +"@#CONNECT 7200/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 7200/RELIABLE/LAPM@#", +"@#CONNECT 7200/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 7200/RELIABLE/MNP@#", +"@#CONNECT 7200/V42@#", +"@#CONNECT 7200/V42B@#", +"@#CONNECT 7200/V42BIS@#", +"@#CONNECT 7200@#", +"@#CONNECT 7200T/V42BIS@#", +"@#CONNECT 7400/ARQ/V.34/MNP4@#", +"@#CONNECT 7400/ARQ/V.34/MNP5@#", +"@#CONNECT 7400/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 7400/ARQ/V.34/V42 @#", +"@#CONNECT 7400/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 7400/ARQ/V.34/V42b@#", +"@#CONNECT 7400@#", +"@#CONNECT 75/1200", +"@#CONNECT 75/1200/ARQ@#", +"@#CONNECT 75/1200/LAP-M/COMPRESSION@#", +"@#CONNECT 75/1200/LAP-M@#", +"@#CONNECT 75/1200/LAPM/COMP@#", +"@#CONNECT 75/1200/LAPM@#", +"@#CONNECT 75/1200/MNP@#", +"@#CONNECT 75/1200/NONE@#", +"@#CONNECT 75/1200/REL-LAPM V.42 BIS@#", +"@#CONNECT 75/1200/REL/COMP@#", +"@#CONNECT 75/1200/REL@#", +"@#CONNECT 75/1200/REL#", +"@#CONNECT 75/1200/V42@#", +"@#CONNECT 75/1200/V42BIS@#", +"@#CONNECT 75/1200@#", +"@#CONNECT 75TX/1200RX REL/MNP5@#", +"@#CONNECT 75TX/1200RX REL@#", +"@#CONNECT 75TX/1200RX/ARQ@#", +"@#CONNECT 75TX/1200RX/LAP-M/COMPRESSION@#", +"@#CONNECT 75TX/1200RX/LAP-M@#", +"@#CONNECT 75TX/1200RX/LAPM/COMP@#", +"@#CONNECT 75TX/1200RX/LAPM@#", +"@#CONNECT 75TX/1200RX/MNP@#", +"@#CONNECT 75TX/1200RX/NONE@#", +"@#CONNECT 75TX/1200RX/REL-LAPM V.42 BIS@#", +"@#CONNECT 75TX/1200RX/REL/COMP@#", +"@#CONNECT 75TX/1200RX/REL@#", +"@#CONNECT 75TX/1200RX/V42@#", +"@#CONNECT 75TX/1200RX/V42BIS@#", +"@#CONNECT 75TX/1200RX@#", +"@#CONNECT 76800/ARQ/V42 /SREJ@#", +"@#CONNECT 76800/ARQ/V42 @#", +"@#CONNECT 76800/ARQ/V42b@#", +"@#CONNECT 76800@#", +"@#CONNECT 9600 ALT / MNP5@#", +"@#CONNECT 9600 ALT /MNP 5@#", +"@#CONNECT 9600 ALT@#", +"@#CONNECT 9600 EC/V42@#", +"@#CONNECT 9600 EC/V42BIS@#", +"@#CONNECT 9600 EC@#", +"@#CONNECT 9600 LAPM / V.42bis@#", +"@#CONNECT 9600 LAPM /V.42bis@#", +"@#CONNECT 9600 LAPM COMPRESSED@#", +"@#CONNECT 9600 LAPM@#", +"@#CONNECT 9600 NORMAL@#", +"@#CONNECT 9600 REL/MNP5@#", +"@#CONNECT 9600 REL/V42@#", +"@#CONNECT 9600 REL/V42BIS@#", +"@#CONNECT 9600 REL@#", +"@#CONNECT 9600 RELIABLE COMPRESSED@#", +"@#CONNECT 9600 RELIABLE@#", +"@#CONNECT 9600 V.42@#", +"@#CONNECT 9600/ARQ/CELL /MNP4@#", +"@#CONNECT 9600/ARQ/CELL /MNP5@#", +"@#CONNECT 9600/ARQ/CELL /V42 /SREJ@#", +"@#CONNECT 9600/ARQ/CELL /V42 @#", +"@#CONNECT 9600/ARQ/CELL /V42b/SREJ@#", +"@#CONNECT 9600/ARQ/CELL /V42b@#", +"@#CONNECT 9600/ARQ/CELL/MNP4@#", +"@#CONNECT 9600/ARQ/CELL/MNP5@#", +"@#CONNECT 9600/ARQ/CELL/V42 /SREJ@#", +"@#CONNECT 9600/ARQ/CELL/V42 @#", +"@#CONNECT 9600/ARQ/CELL/V42b/SREJ@#", +"@#CONNECT 9600/ARQ/CELL/V42b@#", +"@#CONNECT 9600/ARQ/MNP4@#", +"@#CONNECT 9600/ARQ/MNP5@#", +"@#CONNECT 9600/ARQ/V.34/MNP4@#", +"@#CONNECT 9600/ARQ/V.34/MNP5@#", +"@#CONNECT 9600/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 9600/ARQ/V.34/V42 @#", +"@#CONNECT 9600/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 9600/ARQ/V.34/V42b@#", +"@#CONNECT 9600/ARQ/V.42@#", +"@#CONNECT 9600/ARQ/V.42bis@#", +"@#CONNECT 9600/ARQ/V32 /MNP4@#", +"@#CONNECT 9600/ARQ/V32 /MNP5@#", +"@#CONNECT 9600/ARQ/V32 /V42 /SREJ@#", +"@#CONNECT 9600/ARQ/V32 /V42 @#", +"@#CONNECT 9600/ARQ/V32 /V42b/SREJ@#", +"@#CONNECT 9600/ARQ/V32 /V42b@#", +"@#CONNECT 9600/ARQ/V32 /MNP4@#", +"@#CONNECT 9600/ARQ/V32 /MNP5@#", +"@#CONNECT 9600/ARQ/V32 /V42 /SREJ@#", +"@#CONNECT 9600/ARQ/V32 /V42 @#", +"@#CONNECT 9600/ARQ/V32 /V42b/SREJ@#", +"@#CONNECT 9600/ARQ/V32 /V42b@#", +"@#CONNECT 9600/ARQ/V32b /MNP4@#", +"@#CONNECT 9600/ARQ/V32b /MNP5@#", +"@#CONNECT 9600/ARQ/V32b /V42 /SREJ@#", +"@#CONNECT 9600/ARQ/V32b /V42 @#", +"@#CONNECT 9600/ARQ/V32b /V42b/SREJ@#", +"@#CONNECT 9600/ARQ/V32b /V42b@#", +"@#CONNECT 9600/ARQ/V32b/MNP4@#", +"@#CONNECT 9600/ARQ/V32b/MNP5@#", +"@#CONNECT 9600/ARQ/V32b/V42 /SREJ@#", +"@#CONNECT 9600/ARQ/V32b/V42 @#", +"@#CONNECT 9600/ARQ/V32b/V42b/SREJ@#", +"@#CONNECT 9600/ARQ/V32b/V42b@#", +"@#CONNECT 9600/ARQ/V42 /SREJ@#", +"@#CONNECT 9600/ARQ/V42 @#", +"@#CONNECT 9600/ARQ/V42b/SREJ@#", +"@#CONNECT 9600/ARQ/V42b@#", +"@#CONNECT 9600/ARQ/ZyX /MNP4@#", +"@#CONNECT 9600/ARQ/ZyX /MNP5@#", +"@#CONNECT 9600/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 9600/ARQ/ZyX /V42 @#", +"@#CONNECT 9600/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 9600/ARQ/ZyX /V42b@#", +"@#CONNECT 9600/ARQ/ZyX /MNP4@#", +"@#CONNECT 9600/ARQ/ZyX /MNP5@#", +"@#CONNECT 9600/ARQ/ZyX /V42 /SREJ@#", +"@#CONNECT 9600/ARQ/ZyX /V42 @#", +"@#CONNECT 9600/ARQ/ZyX /V42b/SREJ@#", +"@#CONNECT 9600/ARQ/ZyX /V42b@#", +"@#CONNECT 9600/ARQ@#", +"@#CONNECT 9600/COMP@#", +"@#CONNECT 9600/LAP-M/COMPRESSION@#", +"@#CONNECT 9600/LAP-M@#", +"@#CONNECT 9600/LAPM/COMP@#", +"@#CONNECT 9600/LAPM/V42BIS@#", +"@#CONNECT 9600/LAPM@#", +"@#CONNECT 9600/MNP COMPRESSED@#", +"@#CONNECT 9600/MNP@#", +"@#CONNECT 9600/NONE@#", +"@#CONNECT 9600/NOR@#", +"@#CONNECT 9600/REL-LAPM-COMP@#", +"@#CONNECT 9600/REL-LAPM V.42 BIS@#", +"@#CONNECT 9600/REL-LAPM@#", +"@#CONNECT 9600/REL-MNP-COMP@#", +"@#CONNECT 9600/REL-MNP@#", +"@#CONNECT 9600/REL-V.42@#", +"@#CONNECT 9600/REL 1@# ", +"@#CONNECT 9600/REL 2@# ", +"@#CONNECT 9600/REL 3@# ", +"@#CONNECT 9600/REL 4@# ", +"@#CONNECT 9600/REL 5@# ", +"@#CONNECT 9600/REL COMP@#", +"@#CONNECT 9600/REL COMPRESSED@#", +"@#CONNECT 9600/REL/COMP@#", +"@#CONNECT 9600/REL@#", +"@#CONNECT 9600/RELC@#", +"@#CONNECT 9600/RELIABLE/LAPM/COMPRESSED@#", +"@#CONNECT 9600/RELIABLE/LAPM@#", +"@#CONNECT 9600/RELIABLE/MNP/COMPRESSED@#", +"@#CONNECT 9600/RELIABLE/MNP@#", +"@#CONNECT 9600/V.110@#", +"@#CONNECT 9600/V42@#", +"@#CONNECT 9600/V42B@#", +"@#CONNECT 9600/V42BIS@#", +"@#CONNECT 9600@#", +"@#CONNECT 9600T RELIABLE@#", +"@#CONNECT 9600T V.42@#", +"@#CONNECT 9600T/V42BIS@#", +"@#CONNECT 9800/ARQ/V.34/MNP4@#", +"@#CONNECT 9800/ARQ/V.34/MNP5@#", +"@#CONNECT 9800/ARQ/V.34/V42 /SREJ@#", +"@#CONNECT 9800/ARQ/V.34/V42 @#", +"@#CONNECT 9800/ARQ/V.34/V42b/SREJ@#", +"@#CONNECT 9800/ARQ/V.34/V42b@#", +"@#CONNECT 9800@#", +"@#CONNECT EC@#", +"@#CONNECT FAST@#", +"@#CONNECT LAPM COMPRESSED@#", +"@#CONNECT LAPM@#", +"@#CONNECT REL/MNP5@#", +"@#CONNECT REL@#", +"@#CONNECT RELIABLE COMPRESSED@#", +"@#CONNECT RELIABLE@#", +"@#CONNECT V.21/REL@#", +"@#CONNECT/ARQ@#", +"@#CONNECT/LAP-M/COMPRESSION@#", +"@#CONNECT/LAP-M@#", +"@#CONNECT/LAPM/COMP@#", +"@#CONNECT/LAPM@#", +"@#CONNECT/MNP@#", +"@#CONNECT/NONE@#", +"@#CONNECT/REL/COMP@#", +"@#CONNECT/REL@#", +"@#CONNECT/V42@#", +"@#CONNECT/V42BIS@#", +"@#CONNECT@#", +"@#DALAYED@#", +"@#DATA@#", +"@#DATE = ", +"@#DELAYED", +"@#Delayed@#", +"@#DELAYED@#", +"@#Delayed@#", +"@#DELAYED@#", +"@#DIALING@#", +"@#DISCONNECT@#", +"@#Don't use this command at this situation @#", +"@#ERROR SERIAL SPEED SETUP@#", +"@#ERROR@#", +"@#FAX@#", +"@#LIB DER 00@#", +"@#LOCKED@#", +"@#NO ANSWER@#", +"@#NO CARRIER@#", +"@#NO DIAL TONE@#", +"@#NO DIALTONE@#", +"@#NO USER RESPONDING@#", +"@#NOTUSED@#", +"@#NUMBER DELAYED:TIMER@#", +"@#NUMBER LOCKED OUT@#", +"@#OFF HOOK@#", +"@#OK@#", +"@#PROTOCOL: ALT-+FCERROR@#", +"@#PROTOCOL: ALT-CELLULAR@#", +"@#PROTOCOL: ALT-DATA@#", +"@#PROTOCOL: ALT-FAX@#", +"@#PROTOCOL: ALT - CELLULAR@#", +"@#PROTOCOL: ALT CELLULAR@#", +"@#PROTOCOL: ALT@#", +"@#PROTOCOL: ERROR-CONTROL/LAP-B@#", +"@#PROTOCOL: ERROR-CONTROL/LAPB/AFT@#", +"@#PROTOCOL: ERROR-CONTROL/LAPB/HDX@#", +"@#PROTOCOL: ERROR-CONTROL/LAPB@#", +"@#PROTOCOL: LAP-M/AFT@#", +"@#PROTOCOL: LAP-M/HDX@#", +"@#PROTOCOL: LAP-M@#", +"@#PROTOCOL: LAP_M@#", +"@#PROTOCOL: LAPM/AFT@#", +"@#PROTOCOL: LAPM/HDX@#", +"@#PROTOCOL: LAPM@#", +"@#PROTOCOL: MNP 3,4@#", +"@#PROTOCOL: MNP ALT@#", +"@#PROTOCOL: MNP REL 1@#", +"@#PROTOCOL: MNP REL 2@#", +"@#PROTOCOL: MNP REL 3@#", +"@#PROTOCOL: MNP REL 4@#", +"@#PROTOCOL: MNP REL 5@#", +"@#PROTOCOL: MNP REL@#", +"@#PROTOCOL: MNP@#", +"@#PROTOCOL: MNP1@#", +"@#PROTOCOL: MNP2@#", +"@#PROTOCOL: MNP3@#", +"@#PROTOCOL: MNP4@#", +"@#PROTOCOL: NONE@#", +"@#PROTOCOL: PAD@#", +"@#PROTOCOL: V.42BIS@#", +"@#PROTOCOL: V42@#", +"@#PROTOCOL: V42BIS@#", +"@#PROTOCOL: X.25/LAPB/AFT@#", +"@#PROTOCOL: X.25/LAPB/HDX@#", +"@#PROTOCOL: X.25/LAPB@#", +"@#PROTOCOL:ALT-+FCERROR@#", +"@#PROTOCOL:ALT-CELLULAR@#", +"@#PROTOCOL:ALT-DATA@#", +"@#PROTOCOL:ALT-FAX@#", +"@#PROTOCOL:ALT@#", +"@#PROTOCOL:LAP-M@#", +"@#PROTOCOL:LAPM@#", +"@#PROTOCOL:MNP@#", +"@#PROTOCOL:MNP2@#", +"@#PROTOCOL:MNP3@#", +"@#PROTOCOL:MNP4@#", +"@#PROTOCOL:NONE@#", +"@#PROTOCOL:V.42BIS@#", +"@#PROTOCOL:V42BIS@#", +"@#RING@#", +"@#RING1@#", +"@#RING2@#", +"@#RING3@#", +"@#RINGING@#", +"@#RRING@#", +"@#TEST FAILED@#", +"@#TEST PASSED@#", +"@#VCON@#", +"@#VOICE@#", +"@#Wait 5 seconds,then dial@#", +"@OK#", +"@", +"@@#OK@#", +"CLIENT", +"#", +"0@", +"0", +"0@", +"00@", +"01@", +"02@", +"03@", +"04@", +"05@", +"06@", +"07@", +"08@", +"1", +"1@", +"10@", +"10", +"10@", +"10@#", +"10@66@", +"10@67@", +"10@69@", +"100@", +"101@", +"102@", +"103@", +"104@", +"105@", +"10L@#", +"10LC@#", +"10R@#", +"10RC@#", +"11", +"11@", +"11", +"11@", +"11", +"11@", +"11", +"11@", +"11", +"11@", +"11@#", +"11@66@", +"11@67@", +"11@69@", +"111@", +"112@", +"113@", +"114@", +"115@", +"116@", +"117@", +"118@", +"119@", +"11L@#", +"11LC@#", +"11R@#", +"11RC@#", +"12@", +"12", +"12@", +"12", +"12@", +"12", +"12@", +"12", +"12@", +"12", +"12@", +"12@#", +"12@66@", +"12@67@", +"12@69@", +"120@", +"121@", +"122@", +"123@", +"124@", +"125@", +"126@", +"127@", +"128@", +"129@", +"12L@#", +"12LC@#", +"12R@#", +"12RC@#", +"13@", +"13", +"13@", +"13", +"13@", +"13", +"13@", +"13", +"13@", +"13", +"13@#", +"13@66@", +"13@67@", +"13@69@", +"13L@#", +"13LC@#", +"13R@#", +"13RC@#", +"14@", +"14", +"14@", +"14", +"14@", +"14", +"14@", +"14", +"14@66@", +"14@67@", +"14@69@", +"15@", +"15", +"15@", +"15", +"15@", +"15", +"15@", +"15", +"15@", +"15@66@", +"15@67@", +"15@69@", +"16@", +"16", +"16@", +"16@66@", +"16@67@", +"16@69@", +"17@", +"18@", +"18", +"18@", +"19@", +"19@#", +"19L@#", +"19LC@#", +"19R@#", +"19RC@#", +"1L@#", +"1LC@#", +"1R@#", +"1RC@#", +"2@", +"2", +"2@", +"20@", +"21@", +"21@#", +"21L@#", +"21LC@#", +"21R@#", +"21RC@#", +"22@", +"22", +"22@", +"22", +"22@", +"22", +"22@", +"22", +"22@", +"23", +"23@", +"23", +"23@", +"23", +"23@", +"23", +"23@", +"24@", +"24", +"24@", +"24", +"24@", +"24", +"24@", +"24", +"24@", +"24", +"24@", +"24@#", +"24L@#", +"24LC@#", +"24R@#", +"24RC@#", +"25@", +"25", +"25@", +"25", +"25@", +"25", +"26", +"26@", +"26", +"26@", +"26", +"26@", +"26@#", +"26L@#", +"26LC@#", +"26R@#", +"26RC#", +"27@", +"28@", +"28", +"28@", +"28", +"28@", +"28", +"28@", +"28@#", +"28L@#", +"28LC@#", +"28R@#", +"28RC@#", +"29@", +"29", +"29@", +"3@", +"3", +"3@", +"30@", +"31@", +"31", +"31@", +"32@", +"33@", +"34", +"34@", +"35@", +"36@", +"36", +"36@", +"37@", +"37", +"37@", +"38", +"38@", +"39@", +"4@", +"4", +"4@", +"40@", +"40", +"40@", +"40@70@01@", +"40@70@66@01@", +"40@70@67@01@", +"40@70@69@01@", +"40@77@01@", +"40@77@66@01@", +"40@77@67@01@", +"40@77@69@01@", +"40@80@01@", +"40@80@66@01@", +"40@80@67@01@", +"40@80@69@01@", +"40@81@01@", +"40@81@66@01@", +"40@81@67@01@", +"40@81@69@01@", +"41@", +"42@", +"43@", +"44@", +"44", +"44@", +"44@70@05@", +"44@70@66@05@", +"44@70@67@05@", +"44@70@69@05@", +"44@77@05@", +"44@77@66@05@", +"44@77@67@05@", +"44@77@69@05@", +"44@80@05@", +"44@80@66@05@", +"44@80@67@05@", +"44@80@69@05@", +"44@81@05@", +"44@81@66@05@", +"44@81@67@05@", +"44@81@69@05@", +"45@", +"45", +"45@", +"45@70@05@", +"45@70@66@05@", +"45@70@67@05@", +"45@70@69@05@", +"45@77@05@", +"45@77@66@05@", +"45@77@67@05@", +"45@77@69@05@", +"45@80@05@", +"45@80@66@05@", +"45@80@67@05@", +"45@80@69@05@", +"45@81@05@", +"45@81@66@05@", +"45@81@67@05@", +"45@81@69@05@", +"46@", +"46", +"46@", +"46@70@05@", +"46@70@66@05@", +"46@70@67@05@", +"46@70@69@05@", +"46@77@05@", +"46@77@66@05@", +"46@77@67@05@", +"46@77@69@05@", +"46@80@05@", +"46@80@66@05@", +"46@80@67@05@", +"46@80@69@05@", +"46@81@05@", +"46@81@66@05@", +"46@81@67@05@", +"46@81@69@05@", +"47@", +"47", +"47@", +"47@70@10@", +"47@70@66@10@", +"47@70@67@10@", +"47@70@69@10@", +"47@77@10@", +"47@77@66@10@", +"47@77@67@10@", +"47@77@69@10@", +"47@80@10@", +"47@80@66@10@", +"47@80@67@10@", +"47@80@69@10@", +"47@81@10@", +"47@81@66@10@", +"47@81@67@10@", +"47@81@69@10@", +"48@", +"48", +"48@", +"48@70@11@", +"48@70@66@11@", +"48@70@67@11@", +"48@70@69@11@", +"48@77@11@", +"48@77@66@11@", +"48@77@67@11@", +"48@77@69@11@", +"48@80@11@", +"48@80@66@11@", +"48@80@67@11@", +"48@80@69@11@", +"48@81@11@", +"48@81@66@11@", +"48@81@67@11@", +"48@81@69@11@", +"49@", +"49", +"49@", +"49@70@13@", +"49@70@66@13@", +"49@70@67@13@", +"49@70@69@13@", +"49@77@13@", +"49@77@66@13@", +"49@77@67@13@", +"49@77@69@13@", +"49@80@13@", +"49@80@66@13@", +"49@80@67@13@", +"49@80@69@13@", +"49@81@13@", +"49@81@66@13@", +"49@81@67@13@", +"49@81@69@13@", +"5@", +"5", +"5@", +"5@66@", +"5@67@", +"5@69@", +"50@", +"50", +"50@", +"50@70@12@", +"50@70@66@12@", +"50@70@67@12@", +"50@70@69@12@", +"50@77@12@", +"50@77@66@12@", +"50@77@67@12@", +"50@77@69@12@", +"50@80@12@", +"50@80@66@12@", +"50@80@67@12@", +"50@80@69@12@", +"50@81@12@", +"50@81@66@12@", +"50@81@67@12@", +"50@81@69@12@", +"51@", +"51", +"51@", +"51@70@14@", +"51@70@66@14@", +"51@70@67@14@", +"51@70@69@14@", +"51@77@14@", +"51@77@66@14@", +"51@77@67@14@", +"51@77@69@14@", +"51@80@14@", +"51@80@66@14@", +"51@80@67@14@", +"51@80@69@14@", +"51@81@14@", +"51@81@66@14@", +"51@81@67@14@", +"51@81@69@14@", +"52@", +"52", +"52@", +"52@70@15@", +"52@70@66@15@", +"52@70@67@15@", +"52@70@69@15@", +"52@77@15@", +"52@77@66@15@", +"52@77@67@15@", +"52@77@69@15@", +"52@80@15@", +"52@80@66@15@", +"52@80@67@15@", +"52@80@69@15@", +"52@81@15@", +"52@81@66@15@", +"52@81@67@15@", +"52@81@69@15@", +"53@", +"53", +"53@", +"53@70@59@", +"53@70@66@59@", +"53@70@67@59@", +"53@70@69@59@", +"53@77@59@", +"53@77@66@59@", +"53@77@67@59@", +"53@77@69@59@", +"53@80@59@", +"53@80@66@59@", +"53@80@67@59@", +"53@80@69@59@", +"53@81@59@", +"53@81@66@59@", +"53@81@67@59@", +"53@81@69@59@", +"54@", +"54", +"54@70@16@", +"54@70@66@16@", +"54@70@67@16@", +"54@70@69@16@", +"54@77@16@", +"54@77@66@16@", +"54@77@67@16@", +"54@77@69@16@", +"54@80@16@", +"54@80@66@16@", +"54@80@67@16@", +"54@80@69@16@", +"54@81@16@", +"54@81@66@16@", +"54@81@67@16@", +"54@81@69@16@", +"55@", +"55", +"55@", +"55@70@61@", +"55@70@66@61@", +"55@70@67@61@", +"55@70@69@61@", +"55@77@61@", +"55@77@66@61@", +"55@77@67@61@", +"55@77@69@61@", +"55@80@61@", +"55@80@66@61@", +"55@80@67@61@", +"55@80@69@61@", +"55@81@61@", +"55@81@66@61@", +"55@81@67@61@", +"55@81@69@61@", +"56@", +"56@70@62@", +"56@70@66@62@", +"56@70@67@62@", +"56@70@69@62@", +"56@77@62@", +"56@77@66@62@", +"56@77@67@62@", +"56@77@69@62@", +"56@80@62@", +"56@80@66@62@", +"56@80@67@62@", +"56@80@69@62@", +"56@81@62@", +"56@81@66@62@", +"56@81@67@62@", +"56@81@69@62@", +"57@", +"57@70@63@", +"57@70@66@63@", +"57@70@67@63@", +"57@70@69@63@", +"57@77@63@", +"57@77@66@63@", +"57@77@67@63@", +"57@77@69@63@", +"57@80@63@", +"57@80@66@63@", +"57@80@67@63@", +"57@80@69@63@", +"57@81@63@", +"57@81@66@63@", +"57@81@67@63@", +"57@81@69@63@", +"58@", +"58@70@64@", +"58@70@66@64@", +"58@70@67@64@", +"58@70@69@64@", +"58@77@64@", +"58@77@66@64@", +"58@77@67@64@", +"58@77@69@64@", +"58@80@64@", +"58@80@66@64@", +"58@80@67@64@", +"58@80@69@64@", +"58@81@64@", +"58@81@66@64@", +"58@81@67@64@", +"58@81@69@64@", +"59@", +"5L@#", +"5LC@#", +"5R@#", +"5RC@#", +"6@", +"6", +"6@", +"60@", +"60", +"60@", +"61@", +"62@", +"63@", +"63@66@", +"63@67@", +"63@69@", +"64@", +"64@66@", +"64@67@", +"64@69@", +"65@", +"66@", +"66", +"66@", +"67@", +"67", +"67@", +"68@", +"69@", +"69", +"69@", +"69", +"69@", +"69", +"69@", +"69", +"69@", +"7@", +"7", +"7@", +"70@", +"70", +"70@", +"71@", +"72@", +"73@", +"74@", +"75@", +"76@", +"77@", +"77", +"77@", +"78@", +"79@", +"8@", +"8", +"8@", +"80@", +"80", +"80@", +"81@", +"82@", +"83@", +"84@", +"85@", +"86@", +"87@", +"88@", +"89@", +"9@", +"9", +"9@", +"9@#", +"90@", +"91@", +"92@", +"93@", +"94@", +"95@", +"96@", +"97@", +"98@", +"99@", +"9L@#", +"9LC@#", +"9R@#", +"9RC@#", +"ATE0V0", +"AUTOSTREAM: LEVEL 1", +"AUTOSTREAM: LEVEL 2", +"AUTOSTREAM: LEVEL 3", +"BLACKLISTED", +"BUSY", +"CARRIER", +"CARRIER 0300", +"CARRIER 1200", +"CARRIER 1200/75", +"CARRIER 1200/75/VFC", +"CARRIER 1200/VFC", +"CARRIER 12000", +"CARRIER 12000/VFC", +"CARRIER 14400", +"CARRIER 14400/VFC", +"CARRIER 16800", +"CARRIER 16800 V.34", +"CARRIER 16800/VFC", +"CARRIER 19200", +"CARRIER 19200 V.34", +"CARRIER 19200/VFC", +"CARRIER 21600", +"CARRIER 21600 V.34", +"CARRIER 21600/VFC", +"CARRIER 2400", +"CARRIER 2400/VFC", +"CARRIER 24000", +"CARRIER 24000 V.34", +"CARRIER 24000/VFC", +"CARRIER 26400", +"CARRIER 26400 V.34", +"CARRIER 26400/VFC", +"CARRIER 28800", +"CARRIER 28800 V.34", +"CARRIER 28800/VFC", +"CARRIER 300", +"CARRIER 300/VFC", +"CARRIER 4800", +"CARRIER 4800/VFC", +"CARRIER 7200", +"CARRIER 7200/VFC", +"CARRIER 75/1200", +"CARRIER 75/1200/VFC", +"CARRIER 9600", +"CARRIER 9600/VFC", +"CLIENT", +"CLIENTSERVER", +"COMPRESSION: ADC", +"COMPRESSION: CLASS 5", +"COMPRESSION: CLASS5", +"COMPRESSION: MNP5", +"COMPRESSION: NONE", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42 bis", +"COMPRESSION: V.42 BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V.42bis", +"COMPRESSION: V.42BIS", +"COMPRESSION: V42BIS", +"COMPRESSION:CLASS5", +"COMPRESSION:MNP5", +"COMPRESSION:NONE", +"COMPRESSION:V.42bis", +"CONNECT", +"CONNECT 0300", +"CONNECT 0300/ARQ", +"CONNECT 0300/LAP-M", +"CONNECT 0300/MNP", +"CONNECT 0300/REL", +"CONNECT 0300/REL-5", +"CONNECT 0300/REL-LAPM", +"CONNECT 0300/REL-LAPM-COMP", +"CONNECT 0300/REL-MNP", +"CONNECT 0300/REL-MNP-COMP", +"CONNECT 0300/REL-V.42", +"CONNECT 0300/V42b", +"CONNECT 0300/V42BIS", +"CONNECT 0600", +"CONNECT 0600/ARQ", +"CONNECT 0600/LAP-M", +"CONNECT 0600/LAPM", +"CONNECT 0600/MNP", +"CONNECT 0600/NONE", +"CONNECT 0600/REL", +"CONNECT 0600/REL-5", +"CONNECT 0600/REL-LAPM", +"CONNECT 0600/REL-LAPM-COMP", +"CONNECT 0600/REL-MNP", +"CONNECT 0600/REL-MNP-COMP", +"CONNECT 0600/REL-V.42", +"CONNECT 0600/V42", +"CONNECT 0600/V42b", +"CONNECT 0600/V42BIS", +"CONNECT 115,200", +"CONNECT 115,200/ARQ", +"CONNECT 115,200/LAP-M", +"CONNECT 115,200/MNP", +"CONNECT 115,200/NONE", +"CONNECT 115,200/REL", +"CONNECT 115,200/REL-5", +"CONNECT 115,200/REL-V.42", +"CONNECT 115,200/V42", +"CONNECT 115,200/V42b", +"CONNECT 115,200/V42BIS", +"CONNECT 115200", +"CONNECT 115200/ARQ", +"CONNECT 115200/LAP-M", +"CONNECT 115200/LAPM", +"CONNECT 115200/MNP", +"CONNECT 115200/NONE", +"CONNECT 115200/REL", +"CONNECT 115200/REL-5", +"CONNECT 115200/REL-LAPM", +"CONNECT 115200/REL-LAPM-COMP", +"CONNECT 115200/REL-MNP", +"CONNECT 115200/REL-MNP-COMP", +"CONNECT 115200/REL-V.42", +"CONNECT 115200/REL/VFC", +"CONNECT 115200/V42", +"CONNECT 115200/V42b", +"CONNECT 115200/V42BIS", +"CONNECT 115200/VFC", +"CONNECT 1200", +"CONNECT 1200/75", +"CONNECT 1200/75/ARQ", +"CONNECT 1200/75/LAP-M", +"CONNECT 1200/75/LAPM", +"CONNECT 1200/75/MNP", +"CONNECT 1200/75/NONE", +"CONNECT 1200/75/REL", +"CONNECT 1200/75/REL-5", +"CONNECT 1200/75/REL-LAPM", +"CONNECT 1200/75/REL-LAPM-COMP", +"CONNECT 1200/75/REL-MNP", +"CONNECT 1200/75/REL-MNP-COMP", +"CONNECT 1200/75/REL-V.42", +"CONNECT 1200/75/V42", +"CONNECT 1200/75/V42b", +"CONNECT 1200/75/V42BIS", +"CONNECT 1200/ARQ", +"CONNECT 1200/ECL", +"CONNECT 1200/ECLC", +"CONNECT 1200/LAP-M", +"CONNECT 1200/LAPM", +"CONNECT 1200/MNP", +"CONNECT 1200/NONE", +"CONNECT 1200/REL", +"CONNECT 1200/REL-5", +"CONNECT 1200/REL-LAPM", +"CONNECT 1200/REL-LAPM-COMP", +"CONNECT 1200/REL-LAPM V.42 BIS", +"CONNECT 1200/REL-MNP", +"CONNECT 1200/REL-MNP-COMP", +"CONNECT 1200/REL-MNP 5", +"CONNECT 1200/REL-V.42", +"CONNECT 1200/V42", +"CONNECT 1200/V42b", +"CONNECT 1200/V42BIS", +"CONNECT 12000", +"CONNECT 12000/ARQ", +"CONNECT 12000/ECL", +"CONNECT 12000/ECLC", +"CONNECT 12000/LAP-M", +"CONNECT 12000/LAPM", +"CONNECT 12000/MNP", +"CONNECT 12000/NONE", +"CONNECT 12000/REL", +"CONNECT 12000/REL-5", +"CONNECT 12000/REL-LAPM", +"CONNECT 12000/REL-LAPM-COMP", +"CONNECT 12000/REL-LAPM V.42 BIS", +"CONNECT 12000/REL-MNP", +"CONNECT 12000/REL-MNP-COMP", +"CONNECT 12000/REL-MNP 5", +"CONNECT 12000/REL-V.42", +"CONNECT 12000/V42", +"CONNECT 12000/V42b", +"CONNECT 12000/V42BIS", +"CONNECT 1200TX/75RX", +"CONNECT 1200TX/75RX/ARQ", +"CONNECT 1200TX/75RX/LAP-M", +"CONNECT 1200TX/75RX/LAPM", +"CONNECT 1200TX/75RX/MNP", +"CONNECT 1200TX/75RX/NONE", +"CONNECT 1200TX/75RX/REL", +"CONNECT 1200TX/75RX/REL-5", +"CONNECT 1200TX/75RX/REL-LAPM", +"CONNECT 1200TX/75RX/REL-LAPM-COMP", +"CONNECT 1200TX/75RX/REL-MNP", +"CONNECT 1200TX/75RX/REL-MNP-COMP", +"CONNECT 1200TX/75RX/REL-V.42", +"CONNECT 1200TX/75RX/V42", +"CONNECT 1200TX/75RX/V42b", +"CONNECT 1200TX/75RX/V42BIS", +"CONNECT 14400", +"CONNECT 14400/ARQ", +"CONNECT 14400/ECL", +"CONNECT 14400/ECLC", +"CONNECT 14400/LAP-M", +"CONNECT 14400/LAPM", +"CONNECT 14400/MNP", +"CONNECT 14400/NONE", +"CONNECT 14400/REL", +"CONNECT 14400/REL-5", +"CONNECT 14400/REL-LAPM", +"CONNECT 14400/REL-LAPM-COMP", +"CONNECT 14400/REL-LAPM V.42 BIS", +"CONNECT 14400/REL-MNP", +"CONNECT 14400/REL-MNP-COMP", +"CONNECT 14400/REL-MNP 5", +"CONNECT 14400/REL-V.42", +"CONNECT 14400/V42", +"CONNECT 14400/V42b", +"CONNECT 14400/V42BIS", +"CONNECT 14400/VFC", +"CONNECT 16800", +"CONNECT 16800/ARQ", +"CONNECT 16800/ECL", +"CONNECT 16800/ECLC", +"CONNECT 16800/LAP-M", +"CONNECT 16800/LAPM", +"CONNECT 16800/MNP", +"CONNECT 16800/NONE", +"CONNECT 16800/REL", +"CONNECT 16800/REL-5", +"CONNECT 16800/REL-LAPM", +"CONNECT 16800/REL-LAPM-COMP", +"CONNECT 16800/REL-MNP", +"CONNECT 16800/REL-MNP-COMP", +"CONNECT 16800/REL-V.42", +"CONNECT 16800/V42", +"CONNECT 16800/V42b", +"CONNECT 16800/V42BIS", +"CONNECT 16800/VFC", +"CONNECT 19200", +"CONNECT 19200/ARQ", +"CONNECT 19200/ECL", +"CONNECT 19200/ECLC", +"CONNECT 19200/LAP-M", +"CONNECT 19200/LAPM", +"CONNECT 19200/MNP", +"CONNECT 19200/NONE", +"CONNECT 19200/REL", +"CONNECT 19200/REL-5", +"CONNECT 19200/REL-LAPM", +"CONNECT 19200/REL-LAPM-COMP", +"CONNECT 19200/REL-MNP", +"CONNECT 19200/REL-MNP-COMP", +"CONNECT 19200/REL-V.42", +"CONNECT 19200/V42", +"CONNECT 19200/V42b", +"CONNECT 19200/V42BIS", +"CONNECT 19200/VFC", +"CONNECT 21600", +"CONNECT 21600/ARQ", +"CONNECT 21600/ECL", +"CONNECT 21600/ECLC", +"CONNECT 21600/LAP-M", +"CONNECT 21600/LAPM", +"CONNECT 21600/MNP", +"CONNECT 21600/NONE", +"CONNECT 21600/REL", +"CONNECT 21600/REL-5", +"CONNECT 21600/REL-LAPM-COMP", +"CONNECT 21600/REL-MNP", +"CONNECT 21600/REL-MNP-COMP", +"CONNECT 21600/REL-REL-LAPM", +"CONNECT 21600/REL-V.42", +"CONNECT 21600/V42", +"CONNECT 21600/V42b", +"CONNECT 21600/V42BIS", +"CONNECT 21600/VFC", +"CONNECT 230400", +"CONNECT 230400/ARQ", +"CONNECT 230400/LAP-M", +"CONNECT 230400/MNP", +"CONNECT 230400/NONE", +"CONNECT 230400/REL", +"CONNECT 230400/V42", +"CONNECT 230400/V42b", +"CONNECT 230400/V42BIS", +"CONNECT 2400", +"CONNECT 2400/ARQ", +"CONNECT 2400/ECL", +"CONNECT 2400/ECLC", +"CONNECT 2400/LAP-M", +"CONNECT 2400/LAPM", +"CONNECT 2400/MNP", +"CONNECT 2400/NONE", +"CONNECT 2400/REL", +"CONNECT 2400/REL-5", +"CONNECT 2400/REL-LAPM", +"CONNECT 2400/REL-LAPM-COMP", +"CONNECT 2400/REL-LAPM V.42 BIS", +"CONNECT 2400/REL-MNP", +"CONNECT 2400/REL-MNP-COMP", +"CONNECT 2400/REL-MNP 5", +"CONNECT 2400/REL-V.42", +"CONNECT 2400/V42", +"CONNECT 2400/V42b", +"CONNECT 2400/V42BIS", +"CONNECT 24000", +"CONNECT 24000/ARQ", +"CONNECT 24000/ECL", +"CONNECT 24000/ECLC", +"CONNECT 24000/LAP-M", +"CONNECT 24000/LAPM", +"CONNECT 24000/MNP", +"CONNECT 24000/NONE", +"CONNECT 24000/REL", +"CONNECT 24000/REL-5", +"CONNECT 24000/REL-LAPM", +"CONNECT 24000/REL-LAPM-COMP", +"CONNECT 24000/REL-MNP", +"CONNECT 24000/REL-MNP-COMP", +"CONNECT 24000/REL-V.42", +"CONNECT 24000/V42", +"CONNECT 24000/V42b", +"CONNECT 24000/V42BIS", +"CONNECT 24000/VFC", +"CONNECT 26400", +"CONNECT 26400/ARQ", +"CONNECT 26400/ECL", +"CONNECT 26400/ECLC", +"CONNECT 26400/LAP-M", +"CONNECT 26400/LAPM", +"CONNECT 26400/MNP", +"CONNECT 26400/NONE", +"CONNECT 26400/REL", +"CONNECT 26400/REL-5", +"CONNECT 26400/REL-LAPM", +"CONNECT 26400/REL-LAPM-COMP", +"CONNECT 26400/REL-MNP", +"CONNECT 26400/REL-MNP-COMP", +"CONNECT 26400/REL-V.42", +"CONNECT 26400/V42", +"CONNECT 26400/V42b", +"CONNECT 26400/V42BIS", +"CONNECT 26400/VFC", +"CONNECT 28800", +"CONNECT 28800/ARQ", +"CONNECT 28800/ARQ/VFC", +"CONNECT 28800/ECL", +"CONNECT 28800/ECLC", +"CONNECT 28800/LAP-M", +"CONNECT 28800/LAPM", +"CONNECT 28800/MNP", +"CONNECT 28800/NONE", +"CONNECT 28800/REL", +"CONNECT 28800/REL-5", +"CONNECT 28800/REL-LAPM", +"CONNECT 28800/REL-LAPM-COMP", +"CONNECT 28800/REL-MNP", +"CONNECT 28800/REL-MNP-COMP", +"CONNECT 28800/REL-V.42", +"CONNECT 28800/REL/VFC", +"CONNECT 28800/V42", +"CONNECT 28800/V42b", +"CONNECT 28800/V42BIS", +"CONNECT 28800/VFC", +"CONNECT 300", +"CONNECT 300/ARQ", +"CONNECT 300/ECL", +"CONNECT 300/ECLC", +"CONNECT 300/LAP-M", +"CONNECT 300/LAPM", +"CONNECT 300/MNP", +"CONNECT 300/NONE", +"CONNECT 300/REL", +"CONNECT 300/REL-5", +"CONNECT 300/REL-LAPM", +"CONNECT 300/REL-LAPM-COMP", +"CONNECT 300/REL-LAPM V.42 BIS", +"CONNECT 300/REL-MNP", +"CONNECT 300/REL-MNP-COMP", +"CONNECT 300/REL-MNP 5", +"CONNECT 300/REL-V.42", +"CONNECT 300/V42", +"CONNECT 300/V42b", +"CONNECT 300/V42BIS", +"CONNECT 38400", +"CONNECT 38400/ARQ", +"CONNECT 38400/LAP-M", +"CONNECT 38400/LAPM", +"CONNECT 38400/MNP", +"CONNECT 38400/NONE", +"CONNECT 38400/REL", +"CONNECT 38400/REL-5", +"CONNECT 38400/REL-LAPM", +"CONNECT 38400/REL-LAPM-COMP", +"CONNECT 38400/REL-MNP", +"CONNECT 38400/REL-MNP-COMP", +"CONNECT 38400/REL-V.42", +"CONNECT 38400/REL/VFC", +"CONNECT 38400/V42", +"CONNECT 38400/V42b", +"CONNECT 38400/V42BIS", +"CONNECT 38400/VFC", +"CONNECT 4800", +"CONNECT 4800/ARQ", +"CONNECT 4800/ECL", +"CONNECT 4800/ECLC", +"CONNECT 4800/LAP-M", +"CONNECT 4800/LAPM", +"CONNECT 4800/MNP", +"CONNECT 4800/NONE", +"CONNECT 4800/REL", +"CONNECT 4800/REL-5", +"CONNECT 4800/REL-LAPM", +"CONNECT 4800/REL-LAPM-COMP", +"CONNECT 4800/REL-LAPM V.42 BIS", +"CONNECT 4800/REL-MNP", +"CONNECT 4800/REL-MNP-COMP", +"CONNECT 4800/REL-MNP 5", +"CONNECT 4800/REL-V.42", +"CONNECT 4800/V42", +"CONNECT 4800/V42b", +"CONNECT 4800/V42BIS", +"CONNECT 57600", +"CONNECT 57600/ARQ", +"CONNECT 57600/LAP-M", +"CONNECT 57600/LAPM", +"CONNECT 57600/MNP", +"CONNECT 57600/NONE", +"CONNECT 57600/REL", +"CONNECT 57600/REL-5", +"CONNECT 57600/REL-LAPM", +"CONNECT 57600/REL-LAPM-COMP", +"CONNECT 57600/REL-MNP", +"CONNECT 57600/REL-MNP-COMP", +"CONNECT 57600/REL-V.42", +"CONNECT 57600/REL/VFC", +"CONNECT 57600/V42", +"CONNECT 57600/V42b", +"CONNECT 57600/V42BIS", +"CONNECT 57600/VFC", +"CONNECT 600", +"CONNECT 600/ARQ", +"CONNECT 600/ECL", +"CONNECT 600/ECLC", +"CONNECT 600/LAP-M", +"CONNECT 600/LAPM", +"CONNECT 600/MNP", +"CONNECT 600/NONE", +"CONNECT 600/REL", +"CONNECT 600/REL-5", +"CONNECT 600/REL-LAPM", +"CONNECT 600/REL-LAPM-COMP", +"CONNECT 600/REL-LAPM V.42 BIS", +"CONNECT 600/REL-MNP", +"CONNECT 600/REL-MNP-COMP", +"CONNECT 600/REL-MNP 5", +"CONNECT 600/REL-V.42", +"CONNECT 600/V42", +"CONNECT 600/V42b", +"CONNECT 600/V42BIS", +"CONNECT 7200", +"CONNECT 7200/ARQ", +"CONNECT 7200/ECL", +"CONNECT 7200/ECLC", +"CONNECT 7200/LAP-M", +"CONNECT 7200/LAPM", +"CONNECT 7200/MNP", +"CONNECT 7200/NONE", +"CONNECT 7200/REL", +"CONNECT 7200/REL-5", +"CONNECT 7200/REL-LAPM", +"CONNECT 7200/REL-LAPM-COMP", +"CONNECT 7200/REL-LAPM V.42 BIS", +"CONNECT 7200/REL-MNP", +"CONNECT 7200/REL-MNP-COMP", +"CONNECT 7200/REL-MNP 5", +"CONNECT 7200/REL-V.42", +"CONNECT 7200/V42", +"CONNECT 7200/V42b", +"CONNECT 7200/V42BIS", +"CONNECT 75/1200", +"CONNECT 75/1200/ARQ", +"CONNECT 75/1200/LAP-M", +"CONNECT 75/1200/MNP", +"CONNECT 75/1200/NONE", +"CONNECT 75/1200/REL", +"CONNECT 75/1200/REL-5", +"CONNECT 75/1200/REL-LAPM", +"CONNECT 75/1200/REL-LAPM-COMP", +"CONNECT 75/1200/REL-MNP", +"CONNECT 75/1200/REL-MNP-COMP", +"CONNECT 75/1200/REL-V.42", +"CONNECT 75/1200/V42", +"CONNECT 75/1200/V42b", +"CONNECT 75/1200/V42BIS", +"CONNECT 75TX/1200RX", +"CONNECT 75TX/1200RX/ARQ", +"CONNECT 75TX/1200RX/LAP-M", +"CONNECT 75TX/1200RX/LAPM", +"CONNECT 75TX/1200RX/MNP", +"CONNECT 75TX/1200RX/NONE", +"CONNECT 75TX/1200RX/REL", +"CONNECT 75TX/1200RX/REL-5", +"CONNECT 75TX/1200RX/REL-LAPM", +"CONNECT 75TX/1200RX/REL-LAPM-COMP", +"CONNECT 75TX/1200RX/REL-MNP", +"CONNECT 75TX/1200RX/REL-MNP-COMP", +"CONNECT 75TX/1200RX/REL-V.42", +"CONNECT 75TX/1200RX/V42", +"CONNECT 75TX/1200RX/V42b", +"CONNECT 75TX/1200RX/V42BIS", +"CONNECT 9600", +"CONNECT 9600/ARQ", +"CONNECT 9600/ECL", +"CONNECT 9600/ECLC", +"CONNECT 9600/LAP-M", +"CONNECT 9600/LAPM", +"CONNECT 9600/MNP", +"CONNECT 9600/NONE", +"CONNECT 9600/REL", +"CONNECT 9600/REL-5", +"CONNECT 9600/REL-LAPM", +"CONNECT 9600/REL-LAPM-COMP", +"CONNECT 9600/REL-LAPM V.42 BIS", +"CONNECT 9600/REL-MNP", +"CONNECT 9600/REL-MNP-COMP", +"CONNECT 9600/REL-MNP 5", +"CONNECT 9600/REL-V.42", +"CONNECT 9600/V42", +"CONNECT 9600/V42b", +"CONNECT 9600/V42BIS", +"CONNECT ECL", +"CONNECT ECLC", +"CONNECT/ARQ", +"CONNECT/LAP-M", +"CONNECT/LAPM", +"CONNECT/MNP", +"CONNECT/NONE", +"CONNECT/REL", +"CONNECT/V42", +"CONNECT/V42b", +"CONNECT/V42BIS", +"DATA", +"DELAYED", +"DIALING", +"ERROR", +"FAX", +"HOST DRIVER TIMEOUT", +"mdmblatz.inf:HKR, Responses,", +"mdmbsb.inf:HKR, Responses,", +"mdmbsch.inf:HKR, Responses,", +"mdmhaeus.inf:HKR, Responses,", +"mdmico.inf:HKR, Responses,", +"mdminsys.inf:HKR, Responses,", +"mdmke.inf:HKR, Responses,", +"mdmmart.inf:HKR, Responses,", +"mdmneuhs.inf:HKR, Responses,", +"mdmrfi.inf:HKR, Responses,", +"mdmtelnk.inf:HKR, Responses,", +"mdmtger.inf:HKR, Responses,", +"mdmtkr.inf:HKR, Responses,", +"mdmusrcr.inf:HKR,Responses,", +"mdmusrg.inf:HKR,Responses,", +"mdmusrsp.inf:HKR,Responses,", +"mdmusrwp.inf:HKR,Responses,", +"mdmwoer.inf:HKR, Responses,", +"MESG = ", +"NAME = ", +"NMBR = ", +"NO ANSWER", +"NO CARRIER", +"NO DIAL TONE", +"NO DIALTONE", +"NoResponse", +"OK", +"PROTOCOL: ALT", +"PROTOCOL: ALT-CELLULAR", +"PROTOCOL: ALT - CELLULAR", +"PROTOCOL: ERROR-CONTROL/LAPB", +"PROTOCOL: ERROR-CONTROL/LAPB/AFT", +"PROTOCOL: ERROR-CONTROL/LAPB/HDX", +"PROTOCOL: LAP-M", +"PROTOCOL: LAP-M/AFT", +"PROTOCOL: LAP-M/ETC", +"PROTOCOL: LAP-M/HDX", +"PROTOCOL: LAPM", +"PROTOCOL: LAPM/AFT", +"PROTOCOL: LAPM/HDX", +"PROTOCOL: MNP", +"PROTOCOL: MNP 2", +"PROTOCOL: MNP 2, 4", +"PROTOCOL: MNP 3", +"PROTOCOL: MNP 3, 4", +"PROTOCOL: MNP 4", +"PROTOCOL: MNP10", +"PROTOCOL: MNP2", +"PROTOCOL: MNP3", +"PROTOCOL: MNP4", +"PROTOCOL: NONE", +"PROTOCOL: X.25/LAPB", +"PROTOCOL: X.25/LAPB/AFT", +"PROTOCOL: X.25/LAPB/HDX", +"PROTOCOL:MNP 2, 4", +"PROTOCOL:MNP 3, 4", +"PROTOCOL:NONE", +"RING", +"RINGING", +"RRING", +"TIME = ", +"VOICE", +NULL +}; + + +const TCHAR *rgpszActualResp[] = +{ + "0@", + "2@", + "3@", + "4@", + "6@", + "7@", + "8@", + "@", + "@#BUSY@#", + "@#CONNECT 1200/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 1200/ARQ/LAPM/MNP5@#", + "@#CONNECT 1200/ARQ/LAPM/V42BIS@#", + "@#CONNECT 1200/ARQ/LAPM@#", + "@#CONNECT 1200/ARQ/MNP/MNP5@#", + "@#CONNECT 1200/ARQ/MNP/V42BIS@#", + "@#CONNECT 1200/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 1200/ARQ/V32/LAPM@#", + "@#CONNECT 1200/ARQ/V32/MNP@#", + "@#CONNECT 1200/ARQ/V34/LAPM@#", + "@#CONNECT 1200/ARQ/V34/MNP@#", + "@#CONNECT 1200/ARQ@#", + "@#CONNECT 1200/NONE@#", + "@#CONNECT 12000/ARQ/HST/HST/CELLULAR/MNP5@#", + "@#CONNECT 12000/ARQ/HST/HST/CELLULAR/V42BIS@#", + "@#CONNECT 12000/ARQ/HST/HST/CELLULAR@#", + "@#CONNECT 12000/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 12000/ARQ/HST/LAPM/MNP5@#", + "@#CONNECT 12000/ARQ/HST/LAPM/NONE@#", + "@#CONNECT 12000/ARQ/HST/LAPM/V42BIS@#", + "@#CONNECT 12000/ARQ/HST/MNP/MNP5@#", + "@#CONNECT 12000/ARQ/HST/MNP/NONE@#", + "@#CONNECT 12000/ARQ/HST/MNP/V42BIS@#", + "@#CONNECT 12000/ARQ/LAPM/V42BIS@#", + "@#CONNECT 12000/ARQ/MNP/MNP5@#", + "@#CONNECT 12000/ARQ/V32/LAPM/MNP5@#", + "@#CONNECT 12000/ARQ/V32/LAPM/NONE@#", + "@#CONNECT 12000/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 12000/ARQ/V32/LAPM@#", + "@#CONNECT 12000/ARQ/V32/MNP/MNP5@#", + "@#CONNECT 12000/ARQ/V32/MNP/NONE@#", + "@#CONNECT 12000/ARQ/V32/MNP/V42BIS@#", + "@#CONNECT 12000/ARQ/V32/MNP@#", + "@#CONNECT 12000/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 12000/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 12000/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 12000/ARQ/V34/LAPM@#", + "@#CONNECT 12000/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 12000/ARQ/V34/MNP/NONE@#", + "@#CONNECT 12000/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 12000/ARQ/V34/MNP@#", + "@#CONNECT 12000/ARQ/VFC/LAPM/MNP5@#", + "@#CONNECT 12000/ARQ/VFC/LAPM/NONE@#", + "@#CONNECT 12000/ARQ/VFC/LAPM/V42BIS@#", + "@#CONNECT 12000/ARQ/VFC/LAPM@#", + "@#CONNECT 12000/ARQ/VFC/MNP/MNP5@#", + "@#CONNECT 12000/ARQ/VFC/MNP/NONE@#", + "@#CONNECT 12000/ARQ/VFC/MNP/V42BIS@#", + "@#CONNECT 12000/ARQ@#", + "@#CONNECT 12000/HST/NONE@#", + "@#CONNECT 12000/V32/NONE@#", + "@#CONNECT 12000/V34/NONE@#", + "@#CONNECT 12000/VFC/NONE@#", + "@#CONNECT 14000/ARQ/HST/HST/CELLULAR/MNP5@#", + "@#CONNECT 14000/ARQ/HST/HST/CELLULAR/V42BIS@#", + "@#CONNECT 14000/ARQ/HST/HST/CELLULAR@#", + "@#CONNECT 14400/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 14400/ARQ/HST/LAPM/MNP5@#", + "@#CONNECT 14400/ARQ/HST/LAPM/NONE@#", + "@#CONNECT 14400/ARQ/HST/LAPM/V42BIS@#", + "@#CONNECT 14400/ARQ/HST/MNP/MNP5@#", + "@#CONNECT 14400/ARQ/HST/MNP/NONE@#", + "@#CONNECT 14400/ARQ/HST/MNP/V42BIS@#", + "@#CONNECT 14400/ARQ/LAPM/V42BIS@#", + "@#CONNECT 14400/ARQ/MNP/MNP5@#", + "@#CONNECT 14400/ARQ/V32/LAPM/MNP5@#", + "@#CONNECT 14400/ARQ/V32/LAPM/NONE@#", + "@#CONNECT 14400/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 14400/ARQ/V32/LAPM@#", + "@#CONNECT 14400/ARQ/V32/MNP/MNP5@#", + "@#CONNECT 14400/ARQ/V32/MNP/NONE@#", + "@#CONNECT 14400/ARQ/V32/MNP/V42BIS@#", + "@#CONNECT 14400/ARQ/V32/MNP@#", + "@#CONNECT 14400/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 14400/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 14400/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 14400/ARQ/V34/LAPM@#", + "@#CONNECT 14400/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 14400/ARQ/V34/MNP/NONE@#", + "@#CONNECT 14400/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 14400/ARQ/V34/MNP@#", + "@#CONNECT 14400/ARQ/VFC/LAPM/MNP5@#", + "@#CONNECT 14400/ARQ/VFC/LAPM/NONE@#", + "@#CONNECT 14400/ARQ/VFC/LAPM/V42BIS@#", + "@#CONNECT 14400/ARQ/VFC/LAPM@#", + "@#CONNECT 14400/ARQ/VFC/MNP/MNP5@#", + "@#CONNECT 14400/ARQ/VFC/MNP/NONE@#", + "@#CONNECT 14400/ARQ/VFC/MNP/V42BIS@#", + "@#CONNECT 14400/ARQ@#", + "@#CONNECT 14400/HST/NONE@#", + "@#CONNECT 14400/V32/NONE@#", + "@#CONNECT 14400/V34/NONE@#", + "@#CONNECT 14400/VFC/NONE@#", + "@#CONNECT 16800/ARQ/HST/HST/CELLULAR/MNP5@#", + "@#CONNECT 16800/ARQ/HST/HST/CELLULAR/V42BIS@#", + "@#CONNECT 16800/ARQ/HST/HST/CELLULAR@#", + "@#CONNECT 16800/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 16800/ARQ/HST/LAPM/MNP5@#", + "@#CONNECT 16800/ARQ/HST/LAPM/NONE@#", + "@#CONNECT 16800/ARQ/HST/LAPM/V42BIS@#", + "@#CONNECT 16800/ARQ/HST/MNP/MNP5@#", + "@#CONNECT 16800/ARQ/HST/MNP/NONE@#", + "@#CONNECT 16800/ARQ/HST/MNP/V42BIS@#", + "@#CONNECT 16800/ARQ/LAPM/V42BIS@#", + "@#CONNECT 16800/ARQ/MNP/MNP5@#", + "@#CONNECT 16800/ARQ/V32/LAPM/MNP5@#", + "@#CONNECT 16800/ARQ/V32/LAPM/NONE@#", + "@#CONNECT 16800/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 16800/ARQ/V32/LAPM@#", + "@#CONNECT 16800/ARQ/V32/MNP/MNP5@#", + "@#CONNECT 16800/ARQ/V32/MNP/NONE@#", + "@#CONNECT 16800/ARQ/V32/MNP/V42BIS@#", + "@#CONNECT 16800/ARQ/V32/MNP@#", + "@#CONNECT 16800/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 16800/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 16800/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 16800/ARQ/V34/LAPM@#", + "@#CONNECT 16800/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 16800/ARQ/V34/MNP/NONE@#", + "@#CONNECT 16800/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 16800/ARQ/V34/MNP@#", + "@#CONNECT 16800/ARQ/VFC/LAPM/MNP5@#", + "@#CONNECT 16800/ARQ/VFC/LAPM/NONE@#", + "@#CONNECT 16800/ARQ/VFC/LAPM/V42BIS@#", + "@#CONNECT 16800/ARQ/VFC/MNP/MNP5@#", + "@#CONNECT 16800/ARQ/VFC/MNP/NONE@#", + "@#CONNECT 16800/ARQ/VFC/MNP/V42BIS@#", + "@#CONNECT 16800/ARQ@#", + "@#CONNECT 16800/HST/NONE@#", + "@#CONNECT 16800/V32/NONE@#", + "@#CONNECT 16800/V34/NONE@#", + "@#CONNECT 16800/VFC/NONE@#", + "@#CONNECT 19200/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 19200/ARQ/LAPM/V42BIS@#", + "@#CONNECT 19200/ARQ/MNP/MNP5@#", + "@#CONNECT 19200/ARQ/V32/LAPM/MNP5@#", + "@#CONNECT 19200/ARQ/V32/LAPM/NONE@#", + "@#CONNECT 19200/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 19200/ARQ/V32/LAPM@#", + "@#CONNECT 19200/ARQ/V32/MNP/MNP5@#", + "@#CONNECT 19200/ARQ/V32/MNP/NONE@#", + "@#CONNECT 19200/ARQ/V32/MNP/V42BIS@#", + "@#CONNECT 19200/ARQ/V32/MNP@#", + "@#CONNECT 19200/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 19200/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 19200/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 19200/ARQ/V34/LAPM@#", + "@#CONNECT 19200/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 19200/ARQ/V34/MNP/NONE@#", + "@#CONNECT 19200/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 19200/ARQ/V34/MNP@#", + "@#CONNECT 19200/ARQ/VFC/LAPM/MNP5@#", + "@#CONNECT 19200/ARQ/VFC/LAPM/NONE@#", + "@#CONNECT 19200/ARQ/VFC/LAPM/V42BIS@#", + "@#CONNECT 19200/ARQ/VFC/MNP/MNP5@#", + "@#CONNECT 19200/ARQ/VFC/MNP/NONE@#", + "@#CONNECT 19200/ARQ/VFC/MNP/V42BIS@#", + "@#CONNECT 19200/ARQ@#", + "@#CONNECT 19200/V32/NONE@#", + "@#CONNECT 19200/V34/NONE@#", + "@#CONNECT 19200/VFC/NONE@#", + "@#CONNECT 21600/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 21600/ARQ/LAPM/V42BIS@#", + "@#CONNECT 21600/ARQ/MNP/MNP5@#", + "@#CONNECT 21600/ARQ/V32/LAPM/MNP5@#", + "@#CONNECT 21600/ARQ/V32/LAPM/NONE@#", + "@#CONNECT 21600/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 21600/ARQ/V32/LAPM@#", + "@#CONNECT 21600/ARQ/V32/MNP/MNP5@#", + "@#CONNECT 21600/ARQ/V32/MNP/NONE@#", + "@#CONNECT 21600/ARQ/V32/MNP/V42BIS@#", + "@#CONNECT 21600/ARQ/V32/MNP@#", + "@#CONNECT 21600/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 21600/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 21600/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 21600/ARQ/V34/LAPM@#", + "@#CONNECT 21600/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 21600/ARQ/V34/MNP/NONE@#", + "@#CONNECT 21600/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 21600/ARQ/V34/MNP@#", + "@#CONNECT 21600/ARQ/VFC/LAPM/MNP5@#", + "@#CONNECT 21600/ARQ/VFC/LAPM/NONE@#", + "@#CONNECT 21600/ARQ/VFC/LAPM/V42BIS@#", + "@#CONNECT 21600/ARQ/VFC/MNP/MNP5@#", + "@#CONNECT 21600/ARQ/VFC/MNP/NONE@#", + "@#CONNECT 21600/ARQ/VFC/MNP/V42BIS@#", + "@#CONNECT 21600/ARQ@#", + "@#CONNECT 21600/V32/NONE@#", + "@#CONNECT 21600/V34/NONE@#", + "@#CONNECT 21600/VFC/NONE@#", + "@#CONNECT 2400/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 2400/ARQ/LAPM/V42BIS@#", + "@#CONNECT 2400/ARQ/LAPM@#", + "@#CONNECT 2400/ARQ/MNP/MNP5@#", + "@#CONNECT 2400/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 2400/ARQ/V32/LAPM@#", + "@#CONNECT 2400/ARQ/V32/MNP@#", + "@#CONNECT 2400/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 2400/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 2400/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 2400/ARQ/V34/LAPM@#", + "@#CONNECT 2400/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 2400/ARQ/V34/MNP/NONE@#", + "@#CONNECT 2400/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 2400/ARQ/V34/MNP@#", + "@#CONNECT 2400/ARQ@#", + "@#CONNECT 2400/NONE@#", + "@#CONNECT 2400/V34/NONE@#", + "@#CONNECT 24000/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 24000/ARQ/LAPM/V42BIS@#", + "@#CONNECT 24000/ARQ/MNP/MNP5@#", + "@#CONNECT 24000/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 24000/ARQ/V32/LAPM@#", + "@#CONNECT 24000/ARQ/V32/MNP@#", + "@#CONNECT 24000/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 24000/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 24000/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 24000/ARQ/V34/LAPM@#", + "@#CONNECT 24000/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 24000/ARQ/V34/MNP/NONE@#", + "@#CONNECT 24000/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 24000/ARQ/V34/MNP@#", + "@#CONNECT 24000/ARQ/VFC/LAPM/MNP5@#", + "@#CONNECT 24000/ARQ/VFC/LAPM/NONE@#", + "@#CONNECT 24000/ARQ/VFC/LAPM/V42BIS@#", + "@#CONNECT 24000/ARQ/VFC/LAPM@#", + "@#CONNECT 24000/ARQ/VFC/MNP/MNP5@#", + "@#CONNECT 24000/ARQ/VFC/MNP/NONE@#", + "@#CONNECT 24000/ARQ/VFC/MNP/V42BIS@#", + "@#CONNECT 24000/ARQ@#", + "@#CONNECT 24000/V34/NONE@#", + "@#CONNECT 24000/VFC/NONE@#", + "@#CONNECT 26400/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 26400/ARQ/LAPM/V42BIS@#", + "@#CONNECT 26400/ARQ/MNP/MNP5@#", + "@#CONNECT 26400/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 26400/ARQ/V32/LAPM@#", + "@#CONNECT 26400/ARQ/V32/MNP@#", + "@#CONNECT 26400/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 26400/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 26400/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 26400/ARQ/V34/LAPM@#", + "@#CONNECT 26400/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 26400/ARQ/V34/MNP/NONE@#", + "@#CONNECT 26400/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 26400/ARQ/V34/MNP@#", + "@#CONNECT 26400/ARQ/VFC/LAPM/MNP5@#", + "@#CONNECT 26400/ARQ/VFC/LAPM/NONE@#", + "@#CONNECT 26400/ARQ/VFC/LAPM/V42BIS@#", + "@#CONNECT 26400/ARQ/VFC/LAPM@#", + "@#CONNECT 26400/ARQ/VFC/MNP/MNP5@#", + "@#CONNECT 26400/ARQ/VFC/MNP/NONE@#", + "@#CONNECT 26400/ARQ/VFC/MNP/V42BIS@#", + "@#CONNECT 26400/ARQ@#", + "@#CONNECT 26400/V34/NONE@#", + "@#CONNECT 26400/VFC/NONE@#", + "@#CONNECT 28800/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 28800/ARQ/LAPM/V42BIS@#", + "@#CONNECT 28800/ARQ/MNP/MNP5@#", + "@#CONNECT 28800/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 28800/ARQ/V32/LAPM@#", + "@#CONNECT 28800/ARQ/V32/MNP@#", + "@#CONNECT 28800/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 28800/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 28800/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 28800/ARQ/V34/LAPM@#", + "@#CONNECT 28800/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 28800/ARQ/V34/MNP/NONE@#", + "@#CONNECT 28800/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 28800/ARQ/V34/MNP@#", + "@#CONNECT 28800/ARQ/VFC/LAPM/MNP5@#", + "@#CONNECT 28800/ARQ/VFC/LAPM/NONE@#", + "@#CONNECT 28800/ARQ/VFC/LAPM/V42BIS@#", + "@#CONNECT 28800/ARQ/VFC/LAPM@#", + "@#CONNECT 28800/ARQ/VFC/MNP/MNP5@#", + "@#CONNECT 28800/ARQ/VFC/MNP/NONE@#", + "@#CONNECT 28800/ARQ/VFC/MNP/V42BIS@#", + "@#CONNECT 28800/ARQ@#", + "@#CONNECT 28800/V34/NONE@#", + "@#CONNECT 28800/VFC/NONE@#", + "@#CONNECT 4800/ARQ/HST/HST/CELLULAR/MNP5@#", + "@#CONNECT 4800/ARQ/HST/HST/CELLULAR/V42BIS@#", + "@#CONNECT 4800/ARQ/HST/HST/CELLULAR@#", + "@#CONNECT 4800/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 4800/ARQ/HST/LAPM/MNP5@#", + "@#CONNECT 4800/ARQ/HST/LAPM/NONE@#", + "@#CONNECT 4800/ARQ/HST/LAPM/V42BIS@#", + "@#CONNECT 4800/ARQ/HST/MNP/MNP5@#", + "@#CONNECT 4800/ARQ/HST/MNP/NONE@#", + "@#CONNECT 4800/ARQ/HST/MNP/V42BIS@#", + "@#CONNECT 4800/ARQ/LAPM/V42BIS@#", + "@#CONNECT 4800/ARQ/LAPM@#", + "@#CONNECT 4800/ARQ/MNP/MNP5@#", + "@#CONNECT 4800/ARQ/V32/LAPM/MNP5@#", + "@#CONNECT 4800/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 4800/ARQ/V32/LAPM@#", + "@#CONNECT 4800/ARQ/V32/MNP/MNP5@#", + "@#CONNECT 4800/ARQ/V32/MNP/NONE@#", + "@#CONNECT 4800/ARQ/V32/MNP/V42BIS@#", + "@#CONNECT 4800/ARQ/V32/MNP@#", + "@#CONNECT 4800/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 4800/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 4800/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 4800/ARQ/V34/LAPM@#", + "@#CONNECT 4800/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 4800/ARQ/V34/MNP/NONE@#", + "@#CONNECT 4800/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 4800/ARQ/V34/MNP@#", + "@#CONNECT 4800/ARQ@#", + "@#CONNECT 4800/HST/NONE@#", + "@#CONNECT 4800/V32/NONE@#", + "@#CONNECT 4800/V34/NONE@#", + "@#CONNECT 7200/ARQ/HST/HST/CELLULAR/MNP5@#", + "@#CONNECT 7200/ARQ/HST/HST/CELLULAR/V42BIS@#", + "@#CONNECT 7200/ARQ/HST/HST/CELLULAR@#", + "@#CONNECT 7200/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 7200/ARQ/HST/LAPM/MNP5@#", + "@#CONNECT 7200/ARQ/HST/LAPM/NONE@#", + "@#CONNECT 7200/ARQ/HST/LAPM/V42BIS@#", + "@#CONNECT 7200/ARQ/HST/MNP/MNP5@#", + "@#CONNECT 7200/ARQ/HST/MNP/NONE@#", + "@#CONNECT 7200/ARQ/HST/MNP/V42BIS@#", + "@#CONNECT 7200/ARQ/LAPM/V42BIS@#", + "@#CONNECT 7200/ARQ/LAPM@#", + "@#CONNECT 7200/ARQ/MNP/MNP5@#", + "@#CONNECT 7200/ARQ/V32/LAPM/MNP5@#", + "@#CONNECT 7200/ARQ/V32/LAPM/NONE@#", + "@#CONNECT 7200/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 7200/ARQ/V32/LAPM@#", + "@#CONNECT 7200/ARQ/V32/MNP/MNP5@#", + "@#CONNECT 7200/ARQ/V32/MNP/NONE@#", + "@#CONNECT 7200/ARQ/V32/MNP/V42BIS@#", + "@#CONNECT 7200/ARQ/V32/MNP@#", + "@#CONNECT 7200/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 7200/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 7200/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 7200/ARQ/V34/LAPM@#", + "@#CONNECT 7200/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 7200/ARQ/V34/MNP/NONE@#", + "@#CONNECT 7200/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 7200/ARQ/V34/MNP@#", + "@#CONNECT 7200/ARQ@#", + "@#CONNECT 7200/HST/NONE@#", + "@#CONNECT 7200/V32/NONE@#", + "@#CONNECT 7200/V34/NONE@#", + "@#CONNECT 9600/ARQ/HST/HST/CELLULAR/MNP5@#", + "@#CONNECT 9600/ARQ/HST/HST/CELLULAR/V42BIS@#", + "@#CONNECT 9600/ARQ/HST/HST/CELLULAR@#", + "@#CONNECT 9600/ARQ/HST/HST/V42BIS@#", + "@#CONNECT 9600/ARQ/HST/LAPM/MNP5@#", + "@#CONNECT 9600/ARQ/HST/LAPM/NONE@#", + "@#CONNECT 9600/ARQ/HST/LAPM/V42BIS@#", + "@#CONNECT 9600/ARQ/HST/MNP/MNP5@#", + "@#CONNECT 9600/ARQ/HST/MNP/NONE@#", + "@#CONNECT 9600/ARQ/HST/MNP/V42BIS@#", + "@#CONNECT 9600/ARQ/LAPM/V42BIS@#", + "@#CONNECT 9600/ARQ/MNP/MNP5@#", + "@#CONNECT 9600/ARQ/V32/LAPM/MNP5@#", + "@#CONNECT 9600/ARQ/V32/LAPM/NONE@#", + "@#CONNECT 9600/ARQ/V32/LAPM/V42BIS@#", + "@#CONNECT 9600/ARQ/V32/LAPM@#", + "@#CONNECT 9600/ARQ/V32/MNP/MNP5@#", + "@#CONNECT 9600/ARQ/V32/MNP/NONE@#", + "@#CONNECT 9600/ARQ/V32/MNP/V42BIS@#", + "@#CONNECT 9600/ARQ/V32/MNP@#", + "@#CONNECT 9600/ARQ/V34/LAPM/MNP5@#", + "@#CONNECT 9600/ARQ/V34/LAPM/NONE@#", + "@#CONNECT 9600/ARQ/V34/LAPM/V42BIS@#", + "@#CONNECT 9600/ARQ/V34/LAPM@#", + "@#CONNECT 9600/ARQ/V34/MNP/MNP5@#", + "@#CONNECT 9600/ARQ/V34/MNP/NONE@#", + "@#CONNECT 9600/ARQ/V34/MNP/V42BIS@#", + "@#CONNECT 9600/ARQ/V34/MNP@#", + "@#CONNECT 9600/ARQ@#", + "@#CONNECT 9600/HST/NONE@#", + "@#CONNECT 9600/V32/NONE@#", + "@#CONNECT 9600/V34/NONE@#", + "@#CONNECT@#", + "@#ERROR@#", + "@#NO ANSWER@#", + "@#NO CARRIER@#", + "@#NO DIAL TONE@#", + "@#NO DIALTONE@#", + "@#OK@#", + "@#RING@#", + "@#RINGING@#", + "@#VOICE@#", + "#", + NULL +}; diff --git a/private/unimodem/new/mic/sample.inf b/private/unimodem/new/mic/sample.inf new file mode 100644 index 000000000..b07c29174 --- /dev/null +++ b/private/unimodem/new/mic/sample.inf @@ -0,0 +1,64 @@ +; OUT.INF +; +; Inf generated for a single modem. +; +; Created: Fri 05-24-1996 12:13:42 +; Original Inf: mdmgen.inf/[Rockwell]/%Rockwell1% +; Manufacturer: "Rockwell" +; Model: "14400 bps PCMCIA Data-Fax Modem" +; Rank0ID: GEN_Apex1 +; Rank1ID: PCMCIA\RIPICAA-RC144ACL-845A +; +; Signature: +; Rank0 Version M&M Flags AddReg CopyFile Ranks +; 12342412 12222233 12334444 12234444 12244444 53265123 52366664 23466666 + +[Version] +LayoutFile = layout.inf +Signature = "$CHICAGO$" +Class = Modem +ClassGUID = {4D36E96D-E325-11CE-BFC1-08002BE10318} +Provider = %provider% + + +[ControlFlags] +ExcludeFromSelect = GEN_Apex1 + + +[Manufacturer] +%manufacturer0% = Manufacturer0 + + +[Manufacturer0] +%model0% = Model0.Install, GEN_Apex1, PCMCIA\RIPICAA-RC144ACL-845A + + +[Model0.Install] +AddReg = Model0.AddReg + + +[Model0.AddReg] +HKR,,FriendlyDriver,,Unimodem.vxd +HKR,,DevLoader,,*VCOMM +HKR,,ConfigDialog,,modemui.dll +HKR,,PortSubClass,1,02 +HKR,,EnumPropPages,,"modemui.dll,EnumPropPages" +HKR,,PortDriver,,Serial.vxd +HKR,,Contention,,*vcd +HKR,, DeviceType, 1, 03 +HKR, Settings, SpeakerMode_Setup,, "M3" +HKR, Init, 1,, "AT" +HKR, Init, 2,, "ATE0V1" +HKR, Monitor, 1,, "ATS0=0" +HKR, Monitor, 2,, "None" +HKR, Answer, 1,, "ATA" +HKR, Hangup, 1,, "ATH" +HKR,, Reset,, "ATZ" +HKR, Settings, Prefix,, "AT" +HKR, Responses, "AUTOSTREAM: LEVEL 3", 1, 01, 00, 00,00,00,00, 00,00,00,00 + + +[Strings] +provider = "Microsoft" +manufacturer0 = "Rockwell" +model0 = "14400 bps PCMCIA Data-Fax Modem" diff --git a/private/unimodem/new/mic/sources b/private/unimodem/new/mic/sources new file mode 100644 index 000000000..fb24df25b --- /dev/null +++ b/private/unimodem/new/mic/sources @@ -0,0 +1,36 @@ +MAJORCOMP=net +MINORCOMP=unimodem + +TARGETNAME=tsym +TARGETPATH=obj +TARGETTYPE=PROGRAM +TARGETLIBS=\ + $(BASEDIR)\public\sdk\lib\*\kernel32.lib \ + $(BASEDIR)\public\sdk\lib\*\user32.lib + + +INCLUDES=$(BASEDIR)\public\sdk\inc;. + +C_DEFINES=-DWINVER=0x0400 + +USE_CRTDLL=1 + +SOURCES= CHKSUM.CPP \ + SYNC.CPP \ + ILIST.CPP \ + sym.cpp \ + INI.CPP \ + INF.CPP \ + globals.CPP \ + DEV.CPP \ + tsym.CPP \ + resp.cpp \ + tdev.CPP \ + mic.cpp \ + main.cpp + +UMTYPE=console + +!IFNDEF 386_WARNING_LEVEL +386_WARNING_LEVEL=/W3 +!ENDIF diff --git a/private/unimodem/new/mic/sym.cpp b/private/unimodem/new/mic/sym.cpp new file mode 100644 index 000000000..81d76e0c9 --- /dev/null +++ b/private/unimodem/new/mic/sym.cpp @@ -0,0 +1,316 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// SYM.C -- Implemtation for Classes: +// CInfSymbolTable +// CInfSymbol +// +// History: +// 05/21/96 JosephJ Created +// +// +#include "common.h" + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfSymbol +/////////////////////////////////////////////////////////////////////////// + + +CInfSymbol::CInfSymbol +( + const TCHAR rgchName[], + UINT cchName, + DWORD dwChecksum, + const CInfSymbol * pNext +) +: m_rgchText(rgchName), + m_cchText(cchName), + m_dwChecksum(dwChecksum), + m_pNext(pNext), + m_pPropList(NULL) +{ +} + + +CInfSymbol::~CInfSymbol() +{ + // BUGBUG -- delete all the InfSymbols allocated! +} + + +// Return the text associated with this symbol as a null-terminated +// string +const TCHAR * CInfSymbol::GetText(void) const +{ + return (this) ? m_rgchText : TEXT(""); +} + + +// Return the length of the text associated with this symbol +UINT CInfSymbol::GetTextLength() const +{ + return (this) ? m_cchText : 0; +} + + +// Release (decrement ref-count) of this symbol +void CInfSymbol::Release(void) const +{ +} + + +// Dump state +void CInfSymbol::Dump(void) const +{ + printf("Symbol(0x%08lx) = [%s]\n", this, (this) ? m_rgchText : TEXT("")); +} + + +// --------------- SetProp ------------------ +// Not really const -- it modifies the property list +BOOL +CInfSymbol::SetProp(const CInfSymbol *pSymPropName, void *pvProp) +const +// TODO +{ +#if 0 + CInfSymProp * pPropRec = (CInfSymProp *) m_pPropList; + DWORD dwSig = pSymPropName->Checksum(); + BOOL fRet=FALSE; + + // Search for property + while(pPropRec) + { + const CInfSymbol *pSym = pPropRec->pSymPropName; + if (dwChecksum == pSym->Checksum()) + { + if (!lstrcmp(pSymPropName->GetText(), pSym->GetText())) + { + // currently we don't allow you to set an already set prop. + ASSERT(FALSE); + goto end; + } + } + pPropRec = pPropRec->m_pNext; + } + + // Insert property + pPropRec = new CInfSymProp + ( + pSymPropName, + pvProp, + (CInfSymProp *) m_pPropList + ); + m_pPropList = (void *) pPropRec; + +end: + return fRet; +#endif // 0 + + return FALSE; +} + +// --------------- GetProp ------------------ +// TODO +BOOL +CInfSymbol::GetProp(const CInfSymbol *pSymPropName, void **ppvProp) +const +{ + return FALSE; +} + +// --------------- DelProp ------------------ +// Not really const -- it modifies the property list +// TODO +BOOL +CInfSymbol::DelProp(const CInfSymbol *pSymPropName) +const +{ + return FALSE; +} + + +// --------------- GetOrCreatePropLoc -------------- +// Not really const -- it could modify the property list +// TODO +BOOL +CInfSymbol::GetOrCreatePropLoc( + const CInfSymbol *pSymPropName, + void ***ppvProp, + BOOL *pfExists + ) +const +{ + static void *pv; + *pfExists=FALSE; + *ppvProp = &pv; + + return TRUE; +} + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfSymbolTable +/////////////////////////////////////////////////////////////////////////// + + +CInfSymbolTable::CInfSymbolTable(void) +{ + FillMemory((void*)m_rgpSym, sizeof(m_rgpSym), 0); + m_cSymbols=0; + m_pchFree = m_rgchTextStore; + m_pchLastFree = m_pchFree + + sizeof(m_rgchTextStore)/sizeof(*m_rgchTextStore)-1; +} + + +CInfSymbolTable::~CInfSymbolTable() +{ + mfn_EnterCrit(); + + // Free resources +} + + +// Look up and return the symbol with the specified text. +// If symbol is not prestent, return NULL if (!fInsert), else +// insert new symbol and return it. +// This symbol MUST be released by calling its Release function +// when it is no longer needed. +// NULL is returned for the empty string ("") +const CInfSymbol * CInfSymbolTable::Lookup(const TCHAR rgchName[], BOOL fInsert) +{ + const TCHAR *pch = rgchName; + const CInfSymbol *pSym = NULL; + const UINT cchName = lstrlen(rgchName); + const DWORD dwChecksum = ::Checksum + ( + (BYTE *) rgchName, + cchName*sizeof(TCHAR) + ); + const UINT u = dwChecksum % SYMTABSIZE; // we use checksum to compute hash. + + if (!cchName) { goto end; } + + mfn_EnterCrit(); + + // Look for it + for (pSym = m_rgpSym[u]; pSym; pSym = pSym->Next()) + { + // may as well use the checksum as a quick check... + if (dwChecksum==pSym->Checksum()) + { + if (!lstrcmp(rgchName, pSym->GetText())) goto end; + + printf + ( + "WARNING: CS(%s) == CS(%s) = 0x%08lx\n", + rgchName, + pSym->GetText(), + dwChecksum + ); + } + } + + // Didn't find it -- insert if necessary + ASSERT(pSym==NULL); + if (fInsert) + { + if ( (m_pchFree+cchName) < m_pchLastFree) + { + CopyMemory ( + (void *) m_pchFree, + (const void *) rgchName, + (cchName+1)*sizeof(*rgchName) // incl. null term. + ); + pSym = new CInfSymbol(m_pchFree, cchName, dwChecksum, m_rgpSym[u]); + if (pSym) + { + printf("Inserting. %s @ 0x%08lx..\n", m_pchFree, (DWORD) pSym); + m_pchFree += (cchName+1); + ASSERT(m_pchFree<=m_pchLastFree); + m_rgpSym[u] = pSym; + } + } + } + + mfn_LeaveCrit(); + +end: + return pSym; +} + + +// Dump state +void CInfSymbolTable::Dump(void) const +{ + mfn_EnterCrit(); + + printf("[BEGIN SYMBOL TABLE DUMP]\n"); + for (UINT u=0; uNext()) + { + pSym->Dump(); + } + } + } + printf("[End symbol table dump]\n"); + + mfn_LeaveCrit(); + +} + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfSymbolList +/////////////////////////////////////////////////////////////////////////// + + +// --------------------------- Find ----------------------------- +// Looks for the specified symbol, returns the list element with that symbol. +// If ppListPrev is non-NULL, sets it to the previous list element +// (if no previous element, sets it to NULL). If the symbol is not found, +// *ppListPrev is not touched. +// +const CInfSymbolList * +CInfSymbolList::Find +( + const CInfSymbolList *pList, + const CInfSymbol *pSym, + const CInfSymbolList **ppListPrev +) +{ + DWORD dwChecksum = pSym->Checksum(); + const CInfSymbolList *pListPrev=NULL; + + while(pList) + { + const CInfSymbol *pSym1 = pList->m_pSym; + if (dwChecksum == pSym1->Checksum()) + { + if (!lstrcmp(pSym->GetText(), pSym1->GetText())) + { + // Found it ... + if (ppListPrev) + { + // Note, if we find the 1st element, *ppListPrev is set + // to NULL. + *ppListPrev = pListPrev; + } + goto end; + } + } + pListPrev = pList; + pList = pList->Next(); + } + +end: + + return pList; +} diff --git a/private/unimodem/new/mic/sym.h b/private/unimodem/new/mic/sym.h new file mode 100644 index 000000000..054fcb569 --- /dev/null +++ b/private/unimodem/new/mic/sym.h @@ -0,0 +1,215 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// SYM.H -- Header for Classes: +// CInfSymbolTable +// CInfSymbol +// +// History: +// 05/21/96 JosephJ Created +// +// +#ifndef _SYM_H_ +#define _SYM_H_ + +class CInfSymbolList; + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfSymbol +/////////////////////////////////////////////////////////////////////////// + +// Represents a symbol in the symbol table. +// Note: Only CInfSymbolTable member functions can construct/destruct these +// objects. +// +// Empty string maps to NULL symbol. So a NULL pointer is perfectly valid for +// all member functions. +// GetText(NULL) returns the empty string, and Checksum returns 0x0. +// Strcmpi treats NULL pointer as the empty string. + +class CInfSymbol +{ + +public: + + //-------------- GetText ------------------ + // Return the text associated with this symbol as a null-terminated + // string + const TCHAR * GetText(void) const; + + //-------------- GetTextLength ------------------ + // Return the length of the text associated with this symbol, + // not counting terminating zero. + UINT GetTextLength() const; + + //-------------- Strcmpi ------------------ + // Case-insensitive equal + // -ve implies this is less-than pSym + int Strcmpi(const CInfSymbol *pSym) const + { + if (this && pSym) + { + return lstrcmpi(m_rgchText, pSym->m_rgchText); + } + else if (this && !pSym) + { + return 1; + } + else if (!this && pSym) + { + return -1; + } + else + { + return 0; + } + } + + //-------------- Release ------------------ + // Release (decrement ref-count) of this symbol + void Release(void) const; + + //-------------- Dump ------------------ + // Dump state + void Dump(void) const; + + // --------------- Checksum ------------------ + // Return checksum of contents + DWORD Checksum(void) const {return (this) ? m_dwChecksum : 0;} + + // --------------- SetProp ------------------ + BOOL SetProp(const CInfSymbol *pSymPropName, void *pvProp) const; + + // --------------- GetProp ------------------ + BOOL GetProp(const CInfSymbol *pSymPropName, void **ppvProp) const; + + // --------------- GetOrCreatePropLoc -------------- + BOOL + GetOrCreatePropLoc( + const CInfSymbol *pSymPropName, + void ***ppvProp, + BOOL *pfExists + ) + const; + + // --------------- DelProp ------------------ + BOOL DelProp(const CInfSymbol *pSymPropName) const; + +private: + + friend class CInfSymbolTable; + + CInfSymbol + ( + const TCHAR rgchName[], + UINT cchName, + DWORD dwChecksum, + const CInfSymbol *pNext + ); + + ~CInfSymbol(); + + const CInfSymbol *Next(void) const {return m_pNext;} + + const TCHAR * m_rgchText; + const UINT m_cchText; + const DWORD m_dwChecksum; + const CInfSymbol * m_pNext; + CInfSymbolList * m_pPropList; + +}; + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CInfSymbolTable +/////////////////////////////////////////////////////////////////////////// + +// A symbol table. + +static const UINT SYMTABSIZE = 1000; +static const UINT TEXTSTORESIZE = 1000*1000; + + +class CInfSymbolTable +{ + +public: + + CInfSymbolTable(void); + ~CInfSymbolTable(); + + // TODO -- add "context" parameter to symbols -- symbols with different + // context will be stored separately even if their name is the same. + // Context is not interpreted by the symbol table, except to test for + // equality. When implementing this, add a context parameter to + // InfSymbols's constructor, and a member fn "GetContext()" to InfSymbol. + + //-------------- Lookup ------------------ + // Look up and return the symbol with the specified text + // This symbol must be released by calling its Release function + // when it is no longer needed. + const CInfSymbol * Lookup(const TCHAR rgchName[], BOOL fInsert); + + //-------------- Dump ------------------ + // Dump state + void Dump(void) const; + +private: + + const CInfSymbol * m_rgpSym[SYMTABSIZE]; + TCHAR m_rgchTextStore[TEXTSTORESIZE]; + TCHAR * m_pchFree; + TCHAR * m_pchLastFree; + + CSync m_sync; + UINT m_cSymbols; + + void mfn_EnterCrit(void) const {m_sync.EnterCrit();} + void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();} + +}; + + +class CInfSymbolList : private CInfList +{ + CInfSymbolList + ( + const CInfSymbol *pSym, + void *pvData, + const CInfSymbolList *pNext + ) + : CInfList(pvData, pNext), m_pSym(pSym) + { + } + + const CInfSymbolList * + Next (void) + const + { + return (const CInfSymbolList *) CInfList::Next(); + } + + const CInfSymbol * GetSym(void) {return m_pSym;} + + ~CInfSymbolList () {} + + // --------------------------- Find ----------------------------- + // Looks for the specified symbol, returns the list element with that + // symbol. If ppListPrev is non-NULL, sets it to the previous list element + // (if no previous element, sets it to NULL). If the symbol is not found, + // *ppListPrev is not touched. + static + const CInfSymbolList * + Find + ( + const CInfSymbolList *pList, + const CInfSymbol *pSym, + const CInfSymbolList **ppListPrev + ); + +private: + const CInfSymbol *m_pSym; +}; + +#endif // _SYM_H_ diff --git a/private/unimodem/new/mic/sync.cpp b/private/unimodem/new/mic/sync.cpp new file mode 100644 index 000000000..10f58f263 --- /dev/null +++ b/private/unimodem/new/mic/sync.cpp @@ -0,0 +1,35 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +#include "common.h" +// +// SYNC.CPP -- Implemtation for Classes: +// CSync +// +// History: +// 05/22/96 JosephJ Created +// +// + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CSync +/////////////////////////////////////////////////////////////////////////// + +#if (TODO) + +// +// Signals all the events specified in the event list and at the same +// time distroys the list. +// +void CSync::mfn_SignalAndFree(SLIST *pEventList) +{ + while(m_pEventList) + { + SLIST pOld = m_pEventList; + SetEvent((HANDLE) m_pEventList->pv); + m_pEventList = m_pEventList->Next(); + delete m_pOld; + } +} +#endif // TODO diff --git a/private/unimodem/new/mic/sync.h b/private/unimodem/new/mic/sync.h new file mode 100644 index 000000000..95f9bbe48 --- /dev/null +++ b/private/unimodem/new/mic/sync.h @@ -0,0 +1,148 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// SYNC.H -- Header for Classes: +// CSync +// +// History: +// 05/21/96 JosephJ Created +// +// +#ifndef _SYNC_H_ +#define _SYNC_H_ + + +/////////////////////////////////////////////////////////////////////////// +// CLASS CSync +/////////////////////////////////////////////////////////////////////////// + +// Controls access to its parent object. Includes a critical section, and +// (TODO) mechanism for waiting until all threads have finished using +// the parent object. + +// Sample session (pObj is a ptr to a hypothetical parent, which implements +// methods Load, Unload, OpenSession, CloseSession using the member CSymc +// object): +// pObj->Load("mdmusr.inf"); +// hSession = pObj->OpenSession(); +// ... do stuff ... +// pObj->CloseSession(hSession); +// hSync = pObj->Unload(); +// if (hSync) WaitForSingleObject(hSync, INFINITE); +// CloseHandle(hSync); + +class CSync +{ + +public: + + CSync(void) {InitializeCriticalSection(&m_crit);} + + ~CSync() + { + EnterCriticalSection(&m_crit); + DeleteCriticalSection(&m_crit); + } + + //-------------- EnterCrit ------------------ + // Claim our critical section + void EnterCrit(void) const + { + EnterCriticalSection((CRITICAL_SECTION *)&m_crit); + } + + //-------------- LeaveCrit ------------------ + // Release our critical section + void LeaveCrit(void) const + { + LeaveCriticalSection((CRITICAL_SECTION *)&m_crit); + } + +#if (TODO) + + BOOL BeginLoad(void) + { + } + + void EndLoad(void) + { + EnterCrit(); + ASSERT (m_eState == CSYNC_LOADING); + m_eState = CSYNC_LOADED; + LeaveCrit(); + } + + HANDLE BeginUnload(void) + { + HANDLE h=NULL; + EnterCrit(); + if (m_eState == CSYNC_LOADED) + { + m_eState = CSYNC_UNLOADING; + } + else + { + fRet = FALSE; + } + LeaveCrit(); + + return fRet; + } + + void EndUnload(void); + + HSESSION BeginSession(void) + { + HSESSION hRet = 1; + EnterCrit(); + if (m_eState==SYNC_LOADED) + { + m_uRefCount++; + } + else + { + hRet = 0; + } + LeaveCrit(); + + return hRet; + } + + void EndSession(HSESSION hSession) + { + SLINST *pEventList=NULL; + EnterCrit(); + ASSERT(hSession==1 && m_uRefCount); + m_uRefCount--; + if (m_eState==SYNC_UNLOADING && m_pEventList) + { + pEventList = m_pEventList; + m_pEventList=NULL; + } + LeaveCrit(); + + mfn_SignalAndFree(m_pEventList); + } + + BOOL AddContext(HSESSION hS) + { + return FALSE; + } +#endif // TODO + +private: + + CRITICAL_SECTION m_crit; + +#if (TODO) + UINT m_uRefCount; + enum {CSYNC_UNLOADED, CSYNC_LOADING, CSYNC_UNLOADING, CSYNC_UNLOADED} + m_eState; + SLIST* pUnloadEventList; +#endif // TODO + +}; + + +#endif // _SYNC_H_ diff --git a/private/unimodem/new/mic/tdev.cpp b/private/unimodem/new/mic/tdev.cpp new file mode 100644 index 000000000..2e32384f1 --- /dev/null +++ b/private/unimodem/new/mic/tdev.cpp @@ -0,0 +1,84 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// TDEV.CPP -- Component tests for classes: +// CIndDevice +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// History: +// 05/22/96 JosephJ Created +// +#include "common.h" +#include "ini.h" +#include "inf.h" +#include "dev.h" +#include "test.h" + +#define SIMPLE 0 +#define COMPLEX 1 +#define ACTUAL 2 + +//#define TEST_TYPE (SIMPLE) +#define TEST_TYPE (COMPLEX) +//#define TEST_TYPE (ACTUAL) + + +#if (TEST_TYPE==SIMPLE) +#elif (TEST_TYPE==COMPLEX) +#elif (TEST_TYPE==ACTUAL) +#endif + +int main_tdev(int argc, char * argv[]) +{ + CInfFile *pInf= new CInfFile(); + CInfDevice *pDev = new CInfDevice(NULL); + + const CInfManufacturerEntry *pManuE = NULL; + const CInfManufacturerSection *pManuS = NULL; + const CInfModelEntry *pModelE = NULL; + + //__try + { + //__try + { + if (pInf->Load("test.inf")) + { + pManuE = pInf->GetFirstManufacturerEntry(); + } + if (pManuE) + { + pManuS = pManuE->GetManufacturerSection(); + } + if (pManuS) + { + pModelE = pManuS->GetFirstModelEntry(); + } + if (pModelE) + { + if (pDev->Load(pInf, pManuE, pModelE)) + { + pDev->Dump(); + pDev->WriteInf(TEXT("out.inf")); + } + } + + } + //__finally + { + // printf("in finally\n"); + if (pDev) {pDev->Unload(); delete pDev; pDev=NULL;} + if (pInf) {pInf->Unload(); delete pInf; pInf=NULL;} + } + } + //__except(printf("in filter\n"), EXCEPTION_EXECUTE_HANDLER) + if (0) { + printf("in except\n"); + ASSERT(FALSE); + } + + + return 0; +} diff --git a/private/unimodem/new/mic/test.h b/private/unimodem/new/mic/test.h new file mode 100644 index 000000000..d5064c9d0 --- /dev/null +++ b/private/unimodem/new/mic/test.h @@ -0,0 +1,2 @@ +int main_tsym(int argc, char * argv[]); +int main_tdev(int argc, char * argv[]); diff --git a/private/unimodem/new/mic/tsym.cpp b/private/unimodem/new/mic/tsym.cpp new file mode 100644 index 000000000..ab6712aa5 --- /dev/null +++ b/private/unimodem/new/mic/tsym.cpp @@ -0,0 +1,65 @@ +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// TSYM.CPP -- Component tests for classes: +// CInfSymbolTable +// CInfSymbol +// +// Copyright (c) 1996 Microsoft Corporation +// +// +// History: +// 05/21/96 JosephJ Created +// +#include "common.h" +#include "test.h" + + +#define SIMPLE 0 +#define COMPLEX 1 +#define ACTUAL 2 + +//#define TEST_TYPE (SIMPLE) +#define TEST_TYPE (COMPLEX) +//#define TEST_TYPE (ACTUAL) + +extern const TCHAR *rgpszSimpleResp[]; +extern const TCHAR *rgpszComplexResp[]; +extern const TCHAR *rgpszActualResp[]; + + +#if (TEST_TYPE==SIMPLE) +# define TEST_RESP_ARRAY rgpszSimpleResp +#elif (TEST_TYPE==COMPLEX) +# define TEST_RESP_ARRAY rgpszComplexResp +#elif (TEST_TYPE==ACTUAL) +# define TEST_RESP_ARRAY rgpszActualResp +#endif + +static const TCHAR **rgpchStrings = TEST_RESP_ARRAY; + +int main_tsym(int argc, char * argv[]) +{ + const TCHAR **pch = NULL; + + for (pch = rgpchStrings; *pch; pch++) + { + const CInfSymbol *pSym = gSymtab.Lookup(*pch, TRUE); + if (pSym) {pSym->Dump(); pSym->Release(); pSym=0;} + } + + printf("+++\n"); + + for (pch = rgpchStrings; *pch; pch++) + { + const CInfSymbol *pSym = gSymtab.Lookup(*pch, TRUE); + if (pSym) {pSym->Dump(); pSym->Release(); pSym=0;} + } + + printf("+++\n"); + + gSymtab.Dump(); + + return 0; +} -- cgit v1.2.3