| // Copyright 2020 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "lorgnette/enums.h" |
| |
| #include <vector> |
| |
| #include <base/logging.h> |
| #include <base/strings/string_split.h> |
| #include <base/strings/stringprintf.h> |
| #include <re2/re2.h> |
| |
| namespace { |
| |
| // Index of the ScannerName within the ':' separated fields of an Airscan or |
| // IPP-USB device specification. e.g. |
| // "airscan:escl:ScannerName:http://127.0.0.2/eSCL" |
| constexpr size_t kScannerNameIndex = 2; |
| |
| // Use const char* so that ManufacturerBackend is trivially-destructible. |
| struct ManufacturerBackend { |
| const char* name_regex; |
| DocumentScanSaneBackend airscan; |
| DocumentScanSaneBackend ippusb; |
| }; |
| |
| constexpr ManufacturerBackend manufacturers[] = { |
| {"brother", kAirscanBrother, kIppUsbBrother}, |
| {"canon", kAirscanCanon, kIppUsbCanon}, |
| {"epson", kAirscanEpson, kIppUsbEpson}, |
| {"kodak", kAirscanKodak, kIppUsbKodak}, |
| {"konica[- ]?minolta", kAirscanKonicaMinolta, kIppUsbKonicaMinolta}, |
| {"kyocera", kAirscanKyocera, kIppUsbKyocera}, |
| {"lexmark", kAirscanLexmark, kIppUsbLexmark}, |
| {"ricoh", kAirscanRicoh, kIppUsbRicoh}, |
| {"samsung", kAirscanSamsung, kIppUsbSamsung}, |
| {"xerox", kAirscanXerox, kIppUsbXerox}, |
| // Keep the HP cases last. It is possible that some other manufacturer |
| // would use the abbreviation HP within their model name, so we only want |
| // to match this if no other manufacturer matched. |
| {"hp", kAirscanHp, kIppUsbHp}, |
| {"hewlett[- ]?packard", kAirscanHp, kIppUsbHp}, |
| }; |
| |
| DocumentScanSaneBackend GuessManufacturer(DocumentScanSaneBackend base_type, |
| const std::string& scanner_name) { |
| DCHECK(base_type == kAirscanOther || base_type == kIppUsbOther); |
| |
| for (const ManufacturerBackend& manufacturer : manufacturers) { |
| // Use a case-insensitive match, and require matching at a word boundary |
| // e.g if we're searching for "HP", we'll match "hp scanner" and "My HP |
| // scanner" but not "RICOHPrinter". |
| std::string regex = |
| base::StringPrintf("(?i)\\b%s\\b", manufacturer.name_regex); |
| if (RE2::PartialMatch(scanner_name, regex)) { |
| if (base_type == kAirscanOther) |
| return manufacturer.airscan; |
| else if (base_type == kIppUsbOther) |
| return manufacturer.ippusb; |
| } |
| } |
| |
| return base_type; |
| } |
| |
| } // namespace |
| |
| DocumentScanSaneBackend BackendFromDeviceName(const std::string& device) { |
| std::vector<std::string> components = base::SplitString( |
| device, ":", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); |
| |
| const std::string& name = components[0]; |
| if (name == "abaton") |
| return kAbaton; |
| if (name == "agfafocus") |
| return kAgfafocus; |
| if (name == "airscan") { |
| if (kScannerNameIndex < components.size()) |
| return GuessManufacturer(kAirscanOther, components[kScannerNameIndex]); |
| else |
| return kAirscanOther; |
| } |
| if (name == "apple") |
| return kApple; |
| if (name == "artec") |
| return kArtec; |
| if (name == "artec_eplus48u") |
| return kArtecEplus48U; |
| if (name == "as6e") |
| return kAs6E; |
| if (name == "avision") |
| return kAvision; |
| if (name == "bh") |
| return kBh; |
| if (name == "canon") |
| return kCanon; |
| if (name == "canon630u") |
| return kCanon630U; |
| if (name == "canon_dr") |
| return kCanonDr; |
| if (name == "cardscan") |
| return kCardscan; |
| if (name == "coolscan") |
| return kCoolscan; |
| if (name == "coolscan2") |
| return kCoolscan2; |
| if (name == "coolscan3") |
| return kCoolscan3; |
| if (name == "dc210") |
| return kDc210; |
| if (name == "dc240") |
| return kDc240; |
| if (name == "dc25") |
| return kDc25; |
| if (name == "dell1600n_net") |
| return kDell1600NNet; |
| if (name == "dmc") |
| return kDmc; |
| if (name == "epjitsu") |
| return kEpjitsu; |
| if (name == "epson") |
| return kEpson; |
| if (name == "epson2") |
| return kEpson2; |
| if (name == "escl") |
| return kEscl; |
| if (name == "fujitsu") |
| return kFujitsu; |
| if (name == "genesys") |
| return kGenesys; |
| if (name == "gt68xx") |
| return kGt68Xx; |
| if (name == "hp") |
| return kHp; |
| if (name == "hp3500") |
| return kHp3500; |
| if (name == "hp3900") |
| return kHp3900; |
| if (name == "hp4200") |
| return kHp4200; |
| if (name == "hp5400") |
| return kHp5400; |
| if (name == "hp5590") |
| return kHp5590; |
| if (name == "hpljm1005") |
| return kHpljm1005; |
| if (name == "hs2p") |
| return kHs2P; |
| if (name == "ibm") |
| return kIbm; |
| if (name == "ippusb") { |
| if (kScannerNameIndex < components.size()) |
| return GuessManufacturer(kIppUsbOther, components[kScannerNameIndex]); |
| else |
| return kIppUsbOther; |
| } |
| if (name == "kodak") |
| return kKodak; |
| if (name == "kodakaio") |
| return kKodakaio; |
| if (name == "kvs1025") |
| return kKvs1025; |
| if (name == "kvs20xx") |
| return kKvs20Xx; |
| if (name == "kvs40xx") |
| return kKvs40Xx; |
| if (name == "leo") |
| return kLeo; |
| if (name == "lexmark") |
| return kLexmark; |
| if (name == "ma1509") |
| return kMa1509; |
| if (name == "magicolor") |
| return kMagicolor; |
| if (name == "matsushita") |
| return kMatsushita; |
| if (name == "microtek") |
| return kMicrotek; |
| if (name == "microtek2") |
| return kMicrotek2; |
| if (name == "mustek") |
| return kMustek; |
| if (name == "mustek_usb") |
| return kMustekUsb; |
| if (name == "mustek_usb2") |
| return kMustekUsb2; |
| if (name == "nec") |
| return kNec; |
| if (name == "net") |
| return kNet; |
| if (name == "niash") |
| return kNiash; |
| if (name == "p5") |
| return kP5; |
| if (name == "pie") |
| return kPie; |
| if (name == "pixma") |
| return kPixma; |
| if (name == "plustek") |
| return kPlustek; |
| if (name == "plustek_pp") |
| return kPlustekPp; |
| if (name == "qcam") |
| return kQcam; |
| if (name == "ricoh") |
| return kRicoh; |
| if (name == "ricoh2") |
| return kRicoh2; |
| if (name == "rts8891") |
| return kRts8891; |
| if (name == "s9036") |
| return kS9036; |
| if (name == "sceptre") |
| return kSceptre; |
| if (name == "sharp") |
| return kSharp; |
| if (name == "sm3600") |
| return kSm3600; |
| if (name == "sm3840") |
| return kSm3840; |
| if (name == "snapscan") |
| return kSnapscan; |
| if (name == "sp15c") |
| return kSp15C; |
| if (name == "st400") |
| return kSt400; |
| if (name == "stv680") |
| return kStv680; |
| if (name == "tamarack") |
| return kTamarack; |
| if (name == "teco1") |
| return kTeco1; |
| if (name == "teco2") |
| return kTeco2; |
| if (name == "teco3") |
| return kTeco3; |
| if (name == "test") |
| return kTest; |
| if (name == "u12") |
| return kU12; |
| if (name == "umax") |
| return kUmax; |
| if (name == "umax1220u") |
| return kUmax1220U; |
| if (name == "umax_pp") |
| return kUmaxPp; |
| if (name == "xerox_mfp") |
| return kXeroxMfp; |
| LOG(WARNING) << "Unknown sane backend " << name; |
| return kOtherBackend; |
| } |