NSF.c++
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:22k
- /* $Id: NSF.c++,v 1.11 2009/07/02 05:16:20 faxguy Exp $ */
- /*
- * This file does not exist in the original HylaFAX distribution.
- * Created by Dmitry Bely, April 2000
- */
- /*
- * Copyright (c) 1994-1996 Sam Leffler
- * Copyright (c) 1994-1996 Silicon Graphics, Inc.
- * HylaFAX is a trademark of Silicon Graphics
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
- #include <ctype.h>
- #include "NSF.h"
- struct ModelData
- {
- const char* modelId;
- const char* modelName;
- };
- struct NSFData {
- const char* vendorId;
- u_int vendorIdSize; // Country & provider code (T.35)
- const char* vendorName;
- bool inverseStationIdOrder;
- u_int modelIdPos;
- u_int modelIdSize;
- const ModelData* knownModels;
- };
- /*
- * Unless a manufacturer is able to provide detailed specifics
- * of the construction of their NSF signals the only guaranteed
- * accurate information that we get from NSF is the manufacturer
- * (once the bitorder and construction of the first few bytes is
- * confirmed). At that point we would ideally be able to identify
- * the model type, but doing that is often more guesswork than
- * anything and is more likely to prove wrong than right, depending
- * on how specific our ModelData typing is. Any matches as to the
- * model identification really should be taken with some degree
- * of scepticism.
- *
- * As manufacturers often encode (in plain text) a station identification
- * in the NSF string it is often useful to look for that.
- */
- static const ModelData Canon[] =
- {{"x80x00x80x48x00", "Faxphone B640"},
- {"x80x00x80x49x10", "Fax B100"},
- {"x80x00x8Ax49x10", "Laser Class 9000 Series"},
- {"x80x00x8Ax48x00", "Laser Class 2060"},
- {NULL}};
-
- static const ModelData Brother[] =
- {{"x55x55x00x88x90x80x5Fx00x15x51", "Fax-560/770"},
- {"x55x55x00x80xB0x80x00x00x59xD4", "Personal fax 190"},
- {"x55x55x00x8Cx90x80", "MFC-3100C/MFC-8600"},
- {NULL}};
- static const ModelData Panasonic0E[] =
- {{"x00x00x00x96x0Fx01x02x00x10x05x02x95xC8x08x01x49x02x41x53x54x47", "KX-F90" },
- {"x00x00x00x96x0Fx01x03x00x10x05x02x95xC8x08x01x49x02x03", "KX-F230/KX-FT21" },
- {"x00x00x00x16x0Fx01x03x00x10x05x02x95xC8x08", "KX-F780" },
- {"x00x00x00x16x0Fx01x03x00x10x00x02x95x80x08x75xB5", "KX-M260" },
- {"x00x00x00x16x0Fx01x02x00x10x05x02x85xC8x08xAD", "KX-F2050BS" },
- {NULL}};
- static const ModelData Panasonic79[] =
- {{"x00x00x00x02x0Fx09x12x00x10x05x02x95xC8x88x80x80x01", "UF-S10" },
- {"x00x00x00x16x7Fx09x13x00x10x05x16x8DxC0xD0xF8x80x01", "/Siemens Fax 940" },
- {"x00x00x00x16x0Fx09x13x00x10x05x06x8DxC0x50xCB", "Panafax UF-321" },
- {NULL}};
- static const ModelData Ricoh[] =
- {{"x00x00x00x12x10x0Dx02x00x50x00x2AxB8x2C", "/Nashuatec P394" },
- {NULL}};
- static const ModelData Samsung16[] =
- {{"x00x00xA4x01", "M545 6800" },
- {NULL}};
- static const ModelData Samsung8C[] =
- {{"x00x00x01x00", "SF-2010" },
- {NULL}};
- static const ModelData SamsungA2[] =
- {{"x00x00x80x00", "FX-4000" },
- {NULL}};
- static const ModelData Sanyo[] =
- {{"x00x00x10xB1x04x04x04x04x04x04x04x04x04x04x04x04x04x04x04x04x04x04x04x04x04x04x04x04xFFxFFxFFxFFxFFxFFxFFxFFx41x26xFFxFFx00x00x85xA1", "SFX-107" },
- {"x00x00x00xB1x12xF2x62xB4x82x0AxF2x2Ax12xD2xA2x04x04x04x04x04x04x04x04x04x04x04x04x04xFFxFFxFFxFFxFFxFFxFFxFFx41x4ExFFxFFx00x00", "MFP-510" },
- {NULL}};
- static const ModelData HP[] =
- {{"x20x00x45x00x0Cx04x70xCDx4Fx00x7Fx49", "LaserJet 3150" },
- {"x40x80x84x01xF0x6A", "OfficeJet" },
- {"xC0x00x00x00x00", "OfficeJet 500" },
- {"xC0x00x00x00x00x8B", "Fax-920" },
- {NULL}};
- static const ModelData Sharp[] =
- {{"x00xCExB8x80x80x11x85x0DxDDx00x00xDDxDDx00x00xDDxDDx00x00x00x00x00x00x00x00xEDx22xB0x00x00x90x00x8C", "Sharp UX-460" },
- {"x00x4ExB8x80x80x11x84x0DxDDx00x00xDDxDDx00x00xDDxDDx00x00x00x00x00x00x00x00xEDx22xB0x00x00x90x00xAD", "Sharp UX-177" },
- {"x00xCExB8x00x84x0DxDDx00x00xDDxDDx00x00xDDxDDxDDxDDxDDx02x05x28x02x22x43x29xEDx23x90x00x00x90x01x00", "Sharp FO-4810" },
- {NULL}};
- static const ModelData Xerox[] =
- {{"x00x08x2Dx43x57x50x61x75xFFxFFxFFxFFxFFxFFxFFx01x1Ax02x02x10x01x82x01x30x34", "635 Workcenter" },
- {NULL}};
- static const ModelData XeroxDA[] =
- {{"x00x00xC0x00", "Workcentre Pro 580" },
- {NULL}};
- static const ModelData Lexmark[] =
- {{"x00x80xA0x00", "X4270" },
- {NULL}};
- static const ModelData JetFax[] =
- {{"x01x00x45x00x0Dx7F", "M910e" },
- {NULL}};
- static const ModelData PitneyBowes[] =
- {{"x79x91xB1xB8x7AxD8", "9550" },
- {NULL}};
- static const ModelData Muratec45[] =
- {{"xF4x91xFFxFFxFFx42x2AxBCx01x57", "M4700" },
- {NULL}};
- static const ModelData Muratec48[] =
- {{"x53x53x61", "M620" },
- {NULL}};
- /*
- * Country code first byte, then manufacturer is last two bytes. See T.35.
- * Apparently Germany issued some manufacturer codes before the two-byte
- * standard was accepted, and so some few German manufacturers are
- * identified by a single manufacturer byte.
- *
- * T.30 5.3.6.2.7 (2003) states that the NSF FIF is transmitted
- * in MSB2LSB order. Revisions of T.30 prior to 2003 did not
- * contain explicit specification as to the transmit bit order.
- * (Although it did otherwise state that all HDLC frame data should
- * be in MSB order except as noted.) Because CSI, TSI, and other
- * prologue frames were in LSB order by way of an exception to the
- * general rule (T.30 5.3.6.2.4-11) many manufacturers assumed that
- * NSF should also be in LSB order. Consequently there will be
- * some country-code "masquerading" as a terminal may use the
- * proper country-code, but with an inverted bit order.
- *
- * Thus, country code x61 (Korea) turns into x86 (Papua New Guinea),
- * code xB5 (USA) turns into xAD (Tunisia), code x26 (China) turns
- * into x64 (Lebanon), code x04 (Germany) turns into x20 (Canada),
- * and code x3D (France) turns into xBC (Vietnam).
- *
- * For the most part it should be safe to identify a manufacturer
- * both with the MSB and LSB ordered bits, as the "masqueraded" country
- * is likely to not be actively assigning T.35 manufacturer codes.
- * However, some manufacturers (e.g. Microsoft) may use MSB for the
- * country code and LSB for the rest of the NSF, and so basically this
- * table must be verified and corrected against actual real-world
- * results.
- */
- static const NSFData KnownNSF[] =
- {
- /* Japan */
- {"x00x00x00", 3, "unknown - indeterminate", true },
- {"x00x00x01", 3, "Anjitsu", false },
- {"x00x00x02", 3, "Nippon Telephone", false },
- {"x00x00x05", 3, "Mitsuba Electric", false },
- {"x00x00x06", 3, "Master Net", false },
- {"x00x00x09", 3, "Xerox/Toshiba", true, 3, 10, Xerox },
- {"x00x00x0A", 3, "Kokusai", false },
- {"x00x00x0D", 3, "Logic System International", false },
- {"x00x00x0E", 3, "Panasonic", false, 3,10, Panasonic0E },
- {"x00x00x11", 3, "Canon", false, 3, 5, Canon },
- {"x00x00x15", 3, "Toyotsushen Machinery", false },
- {"x00x00x16", 3, "System House Mind", false },
- {"x00x00x19", 3, "Xerox", true },
- {"x00x00x1D", 3, "Hitachi Software", false },
- {"x00x00x21", 3, "Oki Electric/Lanier", true },
- {"x00x00x25", 3, "Ricoh", true, 3,10, Ricoh },
- {"x00x00x26", 3, "Konica", false },
- {"x00x00x29", 3, "Japan Wireless", false },
- {"x00x00x2D", 3, "Sony", false },
- {"x00x00x31", 3, "Sharp/Olivetti", false, 3, 10, Sharp },
- {"x00x00x35", 3, "Kogyu", false },
- {"x00x00x36", 3, "Japan Telecom", false },
- {"x00x00x3D", 3, "IBM Japan", false },
- {"x00x00x39", 3, "Panasonic", false },
- {"x00x00x41", 3, "Swasaki Communication", false },
- {"x00x00x45", 3, "Muratec", false, 3,10, Muratec45 },
- {"x00x00x46", 3, "Pheonix", false },
- {"x00x00x48", 3, "Muratec", false, 3,3, Muratec48 }, // not registered
- {"x00x00x49", 3, "Japan Electric", false },
- {"x00x00x4D", 3, "Okura Electric", false },
- {"x00x00x51", 3, "Sanyo", false, 3,10, Sanyo },
- {"x00x00x55", 3, "unknown - Japan 55", false },
- {"x00x00x56", 3, "Brother", false, 3, 6, Brother },
- {"x00x00x59", 3, "Fujitsu", false },
- {"x00x00x5D", 3, "Kuoni", false },
- {"x00x00x61", 3, "Casio", false },
- {"x00x00x65", 3, "Tateishi Electric", false },
- {"x00x00x66", 3, "Utax/Mita", true },
- {"x00x00x69", 3, "Hitachi Production", false },
- {"x00x00x6D", 3, "Hitachi Telecom", false },
- {"x00x00x71", 3, "Tamura Electric Works", false },
- {"x00x00x75", 3, "Tokyo Electric Corp.", false },
- {"x00x00x76", 3, "Advance", false },
- {"x00x00x79", 3, "Panasonic", false, 3,10, Panasonic79 },
- {"x00x00x7D", 3, "Seiko", false },
- {"x00x08x00", 3, "Daiko", false },
- {"x00x10x00", 3, "Funai Electric", false },
- {"x00x20x00", 3, "Eagle System", false },
- {"x00x30x00", 3, "Nippon Business Systems", false },
- {"x00x40x00", 3, "Comtron", false },
- {"x00x48x00", 3, "Cosmo Consulting", false },
- {"x00x50x00", 3, "Orion Electric", false },
- {"x00x60x00", 3, "Nagano Nippon", false },
- {"x00x70x00", 3, "Kyocera", false },
- {"x00x80x00", 3, "Kanda Networks", false },
- {"x00x88x00", 3, "Soft Front", false },
- {"x00x90x00", 3, "Arctic", false },
- {"x00xA0x00", 3, "Nakushima", false },
- {"x00xB0x00", 3, "Minolta", false },
- {"x00xC0x00", 3, "Tohoku Pioneer", false },
- {"x00xD0x00", 3, "USC", false },
- {"x00xE0x00", 3, "Hiboshi", false },
- {"x00xF0x00", 3, "Sumitomo Electric", false },
- /* Germany */
- {"x20x09", 2, "ITK Institut für Telekommunikation GmbH & Co KG", false },
- {"x20x11", 2, "Dr. Neuhaus Mikroelektronik", false },
- {"x20x21", 2, "ITO Communication", false },
- {"x20x31", 2, "mbp Kommunikationssysteme GmbH", false },
- {"x20x41", 2, "Siemens", false },
- {"x20x42", 2, "Deutsche Telekom AG", false },
- {"x20x51", 2, "mps Software", false },
- {"x20x61", 2, "Hauni Elektronik", false },
- {"x20x71", 2, "Digitronic computersysteme gmbh", false },
- {"x20x81x00", 3, "Innovaphone GmbH", false },
- {"x20x81x40", 3, "TEDAS Gesellschaft für Telekommunikations-, Daten- und Audiosysteme mbH", false },
- {"x20x81x80", 3, "AVM Audiovisuelles Marketing und Computersysteme GmbH", false },
- {"x20x81xC0", 3, "EICON Technology Research GmbH", false },
- {"x20xB1", 2, "Schneider Rundfunkwerke AG", false },
- {"x20xC2", 2, "Deutsche Telekom AG", false },
- {"x20xD1", 2, "Ferrari electronik GmbH", false },
- {"x20xF1", 2, "DeTeWe - Deutsche Telephonwerke AG & Co", false },
- {"x20xFF", 2, "Germany Regional Code", false },
- /* China */
- {"x64x00x00", 3, "unknown - China 00 00", false },
- {"x64x01x00", 3, "unknown - China 01 00", false },
- {"x64x01x01", 3, "unknown - China 01 01", false },
- {"x64x01x02", 3, "unknown - China 01 02", false },
- /* France */
- {"xBCx53x01", 3, "Minolta", false },
- /* Korea */
- {"x61x00x7A", 3, "Xerox", false },
- {"x86x00x02", 3, "unknown - Korea 02", false },
- {"x86x00x06", 3, "unknown - Korea 06", false },
- {"x86x00x08", 3, "unknown - Korea 08", false },
- {"x86x00x0A", 3, "unknown - Korea 0A", false },
- {"x86x00x0E", 3, "unknown - Korea 0E", false },
- {"x86x00x10", 3, "Samsung", false },
- {"x86x00x11", 3, "unknown - Korea 11" },
- {"x86x00x16", 3, "Samsung", false, 3, 4, Samsung16 },
- {"x86x00x1A", 3, "unknown - Korea 1A", false },
- {"x86x00x40", 3, "unknown - Korea 40", false },
- {"x86x00x48", 3, "Samsung/Dell", false },
- {"x86x00x52", 3, "Samsung", false },
- {"x86x00x5A", 3, "Samsung", false },
- {"x86x00x5E", 3, "Xerox", false },
- {"x86x00x66", 3, "unknown - Korea 66", false },
- {"x86x00x6E", 3, "unknown - Korea 6E", false },
- {"x86x00x82", 3, "unknown - Korea 82", false },
- {"x86x00x88", 3, "Ricoh", false },
- {"x86x00x8A", 3, "unknown - Korea 8A", false },
- {"x86x00x8C", 3, "Samsung", false, 3, 4, Samsung8C },
- {"x86x00x92", 3, "unknown - Korea 92", false },
- {"x86x00x98", 3, "Samsung", false },
- {"x86x00xA2", 3, "Samsung", false, 3, 4, SamsungA2 },
- {"x86x00xA4", 3, "unknown - Korea A4", false },
- {"x86x00xC2", 3, "Samsung", false },
- {"x86x00xC9", 3, "unknown - Korea C9", false },
- {"x86x00xCC", 3, "unknown - Korea CC", false },
- {"x86x00xD2", 3, "unknown - Korea D2", false },
- {"x86x00xDA", 3, "Xerox", false, 3, 4, XeroxDA },
- {"x86x00xE2", 3, "unknown - Korea E2", false },
- {"x86x00xEC", 3, "unknown - Korea EC", false },
- {"x86x00xEE", 3, "unknown - Korea EE", false },
- /* United Kingdom */
- {"xB4x00xB0", 3, "DCE", false },
- {"xB4x00xB1", 3, "Hasler", false },
- {"xB4x00xB2", 3, "Interquad", false },
- {"xB4x00xB3", 3, "Comwave", false },
- {"xB4x00xB4", 3, "Iconographic", false },
- {"xB4x00xB5", 3, "Wordcraft", false },
- {"xB4x00xB6", 3, "Acorn", false },
- /* United States */
- {"xADx00x00", 3, "Pitney Bowes", false, 3, 6, PitneyBowes },
- {"xADx00x0C", 3, "Dialogic", false },
- {"xADx00x15", 3, "Lexmark", false, 3, 4, Lexmark },
- {"xADx00x16", 3, "JetFax", false, 3, 6, JetFax },
- {"xADx00x24", 3, "Octel", false },
- {"xADx00x36", 3, "HP", false, 3, 5, HP },
- {"xADx00x42", 3, "FaxTalk", false },
- {"xADx00x44", 3, NULL, true },
- {"xADx00x46", 3, "BrookTrout", false },
- {"xADx00x51", 3, "Telogy Networks", false },
- {"xADx00x55", 3, "HylaFAX", false },
- {"xADx00x5C", 3, "IBM", false },
- {"xADx00x98", 3, "unknown - USA 98", true },
- {"xB5x00x01", 3, "Picturetel", false },
- {"xB5x00x20", 3, "Conexant", false },
- {"xB5x00x22", 3, "Comsat", false },
- {"xB5x00x24", 3, "Octel", false },
- {"xB5x00x26", 3, "ROLM", false },
- {"xB5x00x28", 3, "SOFNET", false },
- {"xB5x00x29", 3, "TIA TR-29 Committee", false },
- {"xB5x00x2A", 3, "STF Tech", false },
- {"xB5x00x2C", 3, "HKB", false },
- {"xB5x00x2E", 3, "Delrina", false },
- {"xB5x00x30", 3, "Dialogic", false },
- {"xB5x00x32", 3, "Applied Synergy", false },
- {"xB5x00x34", 3, "Syncro Development", false },
- {"xB5x00x36", 3, "Genoa", false },
- {"xB5x00x38", 3, "Texas Instruments", false },
- {"xB5x00x3A", 3, "IBM", false },
- {"xB5x00x3C", 3, "ViaSat", false },
- {"xB5x00x3E", 3, "Ericsson", false },
- {"xB5x00x42", 3, "Bogosian", false },
- {"xB5x00x44", 3, "Adobe", false },
- {"xB5x00x46", 3, "Fremont Communications", false },
- {"xB5x00x48", 3, "Hayes", false },
- {"xB5x00x4A", 3, "Lucent", false },
- {"xB5x00x4C", 3, "Data Race", false },
- {"xB5x00x4E", 3, "TRW", false },
- {"xB5x00x52", 3, "Audiofax", false },
- {"xB5x00x54", 3, "Computer Automation", false },
- {"xB5x00x56", 3, "Serca", false },
- {"xB5x00x58", 3, "Octocom", false },
- {"xB5x00x5C", 3, "Power Solutions", false },
- {"xB5x00x5A", 3, "Digital Sound", false },
- {"xB5x00x5E", 3, "Pacific Data", false },
- {"xB5x00x60", 3, "Commetrex", false },
- {"xB5x00x62", 3, "BrookTrout", false },
- {"xB5x00x64", 3, "Gammalink", false },
- {"xB5x00x66", 3, "Castelle", false },
- {"xB5x00x68", 3, "Hybrid Fax", false },
- {"xB5x00x6A", 3, "Omnifax", false },
- {"xB5x00x6C", 3, "HP", false },
- {"xB5x00x6E", 3, "Microsoft", false },
- {"xB5x00x72", 3, "Speaking Devices", false },
- {"xB5x00x74", 3, "Compaq", false },
- /*
- {"xB5x00x76", 3, "Trust - Cryptek", false }, // collision with Microsoft
- */
- {"xB5x00x76", 3, "Microsoft", false }, // uses LSB for country but MSB for manufacturer
- {"xB5x00x78", 3, "Cylink", false },
- {"xB5x00x7A", 3, "Pitney Bowes", false },
- {"xB5x00x7C", 3, "Digiboard", false },
- {"xB5x00x7E", 3, "Codex", false },
- {"xB5x00x82", 3, "Wang Labs", false },
- {"xB5x00x84", 3, "Netexpress Communications", false },
- {"xB5x00x86", 3, "Cable-Sat", false },
- {"xB5x00x88", 3, "MFPA", false },
- {"xB5x00x8A", 3, "Telogy Networks", false },
- {"xB5x00x8E", 3, "Telecom Multimedia Systems", false },
- {"xB5x00x8C", 3, "AT&T", false },
- {"xB5x00x92", 3, "Nuera", false },
- {"xB5x00x94", 3, "K56flex", false },
- {"xB5x00x96", 3, "MiBridge", false },
- {"xB5x00x98", 3, "Xerox", false },
- {"xB5x00x9A", 3, "Fujitsu", false },
- {"xB5x00x9B", 3, "Fujitsu", false },
- {"xB5x00x9C", 3, "Natural Microsystems", false },
- {"xB5x00x9E", 3, "CopyTele", false },
- {"xB5x00xA2", 3, "Murata", false },
- {"xB5x00xA4", 3, "Lanier", false },
- {"xB5x00xA6", 3, "Qualcomm", false },
- {"xB5x00xAA", 3, "HylaFAX", false }, // we did it backwards for a while
- {NULL}
- };
- NSF::NSF()
- {
- clear();
- }
- NSF::NSF( const char* hexNSF, bool useHex )
- {
- clear();
- loadHexData( hexNSF, useHex );
- decode();
- }
- NSF::NSF( const u_char* rawData, int size, const u_char* revTab )
- {
- clear();
- loadRawData( rawData, size, revTab );
- decode();
- }
- void NSF::clear()
- {
- nsf.resize(0);
- hexNsf.resize(0);
- vendor = "unknown";
- model = "";
- stationId = "";
- vendorDecoded = false;
- stationIdDecoded = false;
- }
- void NSF::loadHexData( const char* hexNSF, bool useHex )
- {
- hexNsf.append( hexNSF );
- const char *p = hexNSF;
- char *pNext = NULL;
- for( ;; ){
- int val = strtol( p, &pNext, (useHex ? 16 : 10) );
- if( pNext == p )
- break;
- p = pNext;
- if (p[0] != ' ') p++; // skip delimiter
- nsf.append( (unsigned char)val );
- }
- }
- void NSF::loadRawData( const u_char* rawData, int size, const u_char* revTab )
- {
- nsf.append( (const char*)rawData, size );
- u_char *p = (u_char*)(const char*)nsf;
- u_char *end = p+size;
- for( ; p < end; p++ ){
- *p = revTab[*p];
- hexNsf.append(fxStr::format("%02X ", *p));
- }
- // remove trailing space
- hexNsf.resize( hexNsf.length() - 1 );
- }
- void NSF::decode()
- {
- u_int nsfSize = nsf.length();
- for( const NSFData* p = KnownNSF; p->vendorId; p++ ){
- if( nsfSize >= p->vendorIdSize &&
- memcmp( p->vendorId, &nsf[0], p->vendorIdSize )==0 ){
- if( p->vendorName )
- vendor = p->vendorName;
- if( p->knownModels ){
- for( const ModelData* pp = p->knownModels; pp->modelId; pp++ )
- if( nsfSize >= p->modelIdPos + p->modelIdSize &&
- memcmp( pp->modelId, &nsf[p->modelIdPos], p->modelIdSize )==0 )
- model = pp->modelName;
- }
- findStationId( p->inverseStationIdOrder, p->vendorIdSize );
- vendorDecoded = true;
- }
- }
- if( !vendorFound() )
- findStationId( 0, 0 ); // don't skip initial bytes in search
- }
- void NSF::findStationId( bool reverseOrder, u_int vendorIdSize )
- {
- const char* id = NULL;
- u_int idSize = 0;
- const char* maxId = NULL;
- u_int maxIdSize = 0;
- /*
- * Sometimes station ID is in MSB2LSB, and sometimes it is in
- * LSB2MSB. Rather than trying to collect bit order information
- * about every fax machine out there, we simply inverse the
- * data bit order and append it to the raw data and thereby
- * check both ways.
- */
- fxStr thisnsf = nsf;
- thisnsf.append((char) 0x00); // establish a break
- for ( u_int i = 0 ; i < nsf.length(); i++ ) {
- // a one-byte bit-order converter...
- thisnsf.append((((nsf[i]>>0)&1)<<7)|(((nsf[i]>>1)&1)<<6)|
- (((nsf[i]>>2)&1)<<5)|(((nsf[i]>>3)&1)<<4)|
- (((nsf[i]>>4)&1)<<3)|(((nsf[i]>>5)&1)<<2)|
- (((nsf[i]>>6)&1)<<1)|(((nsf[i]>>7)&1)<<0));
- }
- /*
- * Trying to find the longest printable ASCII sequence
- */
- const char *p = (const char*) thisnsf, *end = p + thisnsf.length();
- for (p += vendorIdSize; p < end; p++) {
- if( isprint(*p) ){
- if( !idSize++ )
- id = p;
- if( idSize > maxIdSize ){
- maxId = id;
- maxIdSize = idSize;
- }
- }
- else {
- id = NULL;
- idSize = 0;
- }
- }
-
- /*
- * Minimum acceptable id length
- */
- const u_int MinIdSize = 4;
- if( maxIdSize >= MinIdSize ){
- stationId.resize(0);
- const char* p;
- int dir;
- if( reverseOrder ){
- p = maxId + maxIdSize - 1;
- dir = -1;
- }
- else {
- p = maxId;
- dir = 1;
- }
- for( u_int i = 0; i < maxIdSize; i++ ){
- stationId.append( *p );
- p += dir;
- }
- stationIdDecoded = true;
- }
- }