• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "scan_service_ability.h"
16 
17 #include <cerrno>
18 #include <ctime>
19 #include <string>
20 #include <sys/time.h>
21 #include <thread>
22 #include <unistd.h>
23 #include <fstream>
24 #include <fcntl.h>
25 #include <iostream>
26 #include <iomanip>
27 #include <chrono>
28 #include <random>
29 #include <condition_variable>
30 #include <regex>
31 
32 #include "accesstoken_kit.h"
33 #include "array_wrapper.h"
34 #include "file_ex.h"
35 #include "int_wrapper.h"
36 #include "ipc_skeleton.h"
37 #include "iservice_registry.h"
38 #include "napi_scan_utils.h"
39 #include "scan_constant.h"
40 #include "scan_log.h"
41 #include "scan_util.h"
42 #include "scanner_info.h"
43 #include "string_wrapper.h"
44 #include "system_ability.h"
45 #include "system_ability_definition.h"
46 #include "want_params_wrapper.h"
47 #include "scan_usb_manager.h"
48 #include "common_event_data.h"
49 #include "common_event_manager.h"
50 #include "common_event_support.h"
51 #include "scan_system_data.h"
52 
53 namespace OHOS::Scan {
54 namespace {
55 #ifdef SANE_ENABLE
GetElapsedSeconds(const SteadyTimePoint & preTime)56 static int32_t GetElapsedSeconds(const SteadyTimePoint& preTime)
57 {
58     auto nowTime = std::chrono::steady_clock::now();
59     auto elapsedTime = std::chrono::duration_cast<std::chrono::seconds>(nowTime - preTime);
60     return elapsedTime.count();
61 }
62 
GetRandomNumber(const int32_t & lowerBoundary,const int32_t & upperBoundary)63 static int32_t GetRandomNumber(const int32_t& lowerBoundary, const int32_t& upperBoundary)
64 {
65     std::random_device rd;
66     std::mt19937 gen(rd());
67     std::uniform_int_distribution<> dis(lowerBoundary, upperBoundary);
68     return dis(gen);
69 }
70 #endif
71 };
72 using namespace std;
73 using namespace OHOS::HiviewDFX;
74 using namespace Security::AccessToken;
75 using SteadyTimePoint = std::chrono::steady_clock::time_point;
76 
77 constexpr int ONE_MB = 1024 * 1024; // default buffersize 1MB
78 constexpr int SCAN_PROGRESS_100 = 100;
79 #ifdef SANE_ENABLE
80 constexpr int SCAN_PROGRESS_10 = 10;
81 constexpr int SCAN_PROGRESS_19 = 19;
82 constexpr int SCAN_PROGRESS_80 = 80;
83 #endif
84 constexpr int JPEG_QUALITY_SEVENTY_FIVE = 75;
85 constexpr int CHANNEL_ONE = 1;
86 constexpr int CHANNEL_THREE = 3;
87 #ifdef SANE_ENABLE
88 constexpr int MAX_PICTURE_DPI = 3000;
89 #endif
90 const int64_t INIT_INTERVAL = 5000L;
91 const uint32_t ASYNC_CMD_DELAY = 10;
92 const int64_t UNLOAD_SYSTEMABILITY_DELAY = 1000 * 30;
93 
94 static int32_t g_scannerState = SCANNER_READY;
95 #ifdef SANE_ENABLE
96 static bool g_hasOpenScannerFaild = false;
97 #endif
98 static bool g_hasIoFaild = false;
99 static bool g_isJpegWriteSuccess = false;
100 static const std::string PERMISSION_NAME_SCAN = "ohos.permission.SCAN";
101 static const std::string PERMISSION_NAME_SCAN_JOB = "ohos.permission.MANAGE_SCAN_JOB";
102 static const std::string PERMISSION_NAME_PRINT = "ohos.permission.PRINT";
103 static const std::string SCAN_DEVICE_FOUND_TCP = "scanDeviceFoundTCP";
104 static const std::string SCAN_DEVICE_FOUND = "scanDeviceFound";
105 static const std::string SCAN_DEVICE_SYNC = "scanDeviceSync";
106 static const std::string SCAN_DEVICE_ADD = "scanDeviceAdd";
107 static const std::string SCAN_DEVICE_DEL = "scanDeviceDel";
108 static const std::string SCAN_INIT_EVENT = "scanInitEvent";
109 
110 static const std::string DEVICE_EVENT_TYPE = "deviceStateChange";
111 static const std::string GET_FRAME_RES_EVENT_TYPE = "getFrameResult";
112 static const std::string GET_SCANNER_DEVICE_LIST = "GET_SCANNER_DEVICE_LIST";
113 
114 std::map<std::string, sptr<IScanCallback>> OHOS::Scan::ScanServiceAbility::registeredListeners_;
115 
116 REGISTER_SYSTEM_ABILITY_BY_ID(ScanServiceAbility, SCAN_SERVICE_ID, true);
117 
118 int32_t ScanServiceAbility::appCount_ = 0;
119 std::mutex ScanServiceAbility::instanceLock_;
120 sptr<ScanServiceAbility> ScanServiceAbility::instance_;
121 std::shared_ptr<AppExecFwk::EventHandler> ScanServiceAbility::serviceHandler_;
122 std::map<std::string, ScanDeviceInfoTCP> ScanServiceAbility::scanDeviceInfoTCPMap_;
123 std::map<std::string, ScanDeviceInfo> ScanServiceAbility::saneGetUsbDeviceInfoMap;
124 std::map<std::string, ScanDeviceInfo> ScanServiceAbility::saneGetTcpDeviceInfoMap;
125 std::map<std::string, std::string> ScanServiceAbility::usbSnMap;
126 
ScanServiceAbility(int32_t systemAbilityId,bool runOnCreate)127 ScanServiceAbility::ScanServiceAbility(int32_t systemAbilityId, bool runOnCreate)
128     : SystemAbility(systemAbilityId, runOnCreate), state_(ServiceRunningState::STATE_NOT_START),
129     currentJobId_(SCAN_CONSTRAINT_NONE)
130 {
131     buffer_size = ONE_MB;
132     saneReadBuf = static_cast<uint8_t *>(malloc(buffer_size));
133 #ifdef SANE_ENABLE
134     getSingleFrameFDExe = [=](SANE_Handle scannerHandle, uint32_t fd) {
135             int32_t totalReadSize = 0;
136             int32_t curReadSize = 0;
137             uint8_t *buffer = static_cast<uint8_t *>(malloc(buffer_size));
138             if (!buffer) {
139                 SCAN_HILOGE("malloc memory for buffer failed!!!");
140                 SendGetFrameResEvent(false, totalReadSize);
141                 return;
142             }
143             SANE_Status status = SANE_STATUS_GOOD;
144             while (true) {
145                 status = sane_read(scannerHandle, buffer, buffer_size, &curReadSize);
146                 if (status == SANE_STATUS_EOF) {
147                     SCAN_HILOGD("Totally read %{public}d bytes of frame data", totalReadSize);
148                     SendGetFrameResEvent(true, totalReadSize);
149                     break;
150                 }
151                 if (status != SANE_STATUS_GOOD) {
152                     SCAN_HILOGE("sane_read failed, reason: [%{public}s]", sane_strstatus(status));
153                     g_scannerState = SCANNER_READY;
154                     SendGetFrameResEvent(false, totalReadSize);
155                     break;
156                 }
157                 write(fd, buffer, curReadSize);
158                 totalReadSize += curReadSize;
159                 SCAN_HILOGD("sane_read success, current read: %{public}d Bytes, already read %{public}d Bytes",
160                     curReadSize, totalReadSize);
161             }
162             free(buffer);
163             buffer = nullptr;
164     };
165 #endif
166 
167     cinfo.comps_in_scan = 0;
168 }
169 
~ScanServiceAbility()170 ScanServiceAbility::~ScanServiceAbility()
171 {
172     free(saneReadBuf);
173     FREE_AND_NULLPTR(jpegbuf)
174     SCAN_HILOGD("~ScanServiceAbility state_  is %{public}d.", static_cast<int>(state_));
175 }
176 
GetInstance()177 sptr<ScanServiceAbility> ScanServiceAbility::GetInstance()
178 {
179     if (instance_ == nullptr) {
180         std::lock_guard<std::mutex> autoLock(instanceLock_);
181         if (instance_ == nullptr) {
182             instance_ = new ScanServiceAbility(SCAN_SERVICE_ID, true);
183         }
184     }
185     return instance_;
186 }
187 
ServiceInit()188 int32_t ScanServiceAbility::ServiceInit()
189 {
190     bool ret = Publish(ScanServiceAbility::GetInstance());
191     if (!ret) {
192         SCAN_HILOGE("ScanServiceAbility Publish failed.");
193         return E_SCAN_SERVER_FAILURE;
194     }
195     state_ = ServiceRunningState::STATE_RUNNING;
196     SCAN_HILOGD("state_ is %{public}d.", static_cast<int>(state_));
197     SCAN_HILOGI("Init ScanServiceAbility success.");
198     return ERR_OK;
199 }
200 
OnStart()201 void ScanServiceAbility::OnStart()
202 {
203     SCAN_HILOGI("ScanServiceAbility::Enter OnStart.");
204     if (instance_ == nullptr) {
205         instance_ = this;
206     }
207     if (state_ == ServiceRunningState::STATE_RUNNING) {
208         SCAN_HILOGI("ScanServiceAbility is already running.");
209         return;
210     }
211 
212     InitServiceHandler();
213     int32_t ret = ServiceInit();
214     if (ret != ERR_OK) {
215         auto callback = [=]() { ServiceInit(); };
216         serviceHandler_->PostTask(callback, INIT_INTERVAL);
217         SCAN_HILOGE("ScanServiceAbility Init failed. Try again 5s later");
218         return;
219     }
220     state_ = ServiceRunningState::STATE_RUNNING;
221     return;
222 }
223 
InitServiceHandler()224 void ScanServiceAbility::InitServiceHandler()
225 {
226     SCAN_HILOGI("InitServiceHandler started.");
227     if (serviceHandler_ != nullptr) {
228         SCAN_HILOGI("InitServiceHandler already init.");
229         return;
230     }
231     std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create("ScanServiceAbility");
232     serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
233     SCAN_HILOGI("InitServiceHandler succeeded.");
234 }
235 
ManualStart()236 void ScanServiceAbility::ManualStart()
237 {
238     if (state_ != ServiceRunningState::STATE_RUNNING) {
239         SCAN_HILOGI("ScanServiceAbility restart.");
240         OnStart();
241     }
242 }
243 
OnStop()244 void ScanServiceAbility::OnStop()
245 {
246     SCAN_HILOGI("OnStop started.");
247     if (state_ != ServiceRunningState::STATE_RUNNING) {
248         return;
249     }
250     serviceHandler_ = nullptr;
251     state_ = ServiceRunningState::STATE_NOT_START;
252     SCAN_HILOGI("OnStop end.");
253 }
UnloadSystemAbility()254 void ScanServiceAbility::UnloadSystemAbility()
255 {
256     SCAN_HILOGI("appCount_= %{public}d", appCount_);
257     auto unloadTask = [this]() {
258         if (ScanServiceAbility::appCount_ != 0) {
259             SCAN_HILOGW("appCount is not equal to zerro");
260             return;
261         }
262         auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
263         if (samgrProxy == nullptr) {
264             SCAN_HILOGE("get samgr failed");
265             return;
266         }
267         int32_t ret = samgrProxy->UnloadSystemAbility(SCAN_SERVICE_ID);
268         if (ret != ERR_OK) {
269             SCAN_HILOGE("unload system ability failed");
270             return;
271         }
272         this->ExitScan();
273         SCAN_HILOGI("unload system ability successfully");
274     };
275     serviceHandler_->PostTask(unloadTask, UNLOAD_SYSTEMABILITY_DELAY);
276 }
277 
278 #ifdef SANE_ENABLE
GetScanHandle(const std::string & scannerId)279 SANE_Handle ScanServiceAbility::GetScanHandle(const std::string &scannerId)
280 {
281     auto scannerIt = scannerHandleList_.find(scannerId);
282     if (scannerIt == scannerHandleList_.end()) {
283         SCAN_HILOGE("ScannerId: [%{public}s] is not openned!!!", scannerId.c_str());
284         return nullptr;
285     }
286 
287     return scannerHandleList_[scannerId];
288 }
289 #endif
290 
InitScan(int32_t & scanVersion)291 int32_t ScanServiceAbility::InitScan(int32_t &scanVersion)
292 {
293     ManualStart();
294     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
295         SCAN_HILOGE("no permission to access scan service");
296         return E_SCAN_NO_PERMISSION;
297     }
298     ExitScan();
299     SCAN_HILOGI("ScanServiceAbility InitScan start");
300 #ifdef SANE_ENABLE
301     SANE_Status status = sane_init(&scanVersion, nullptr);
302     if (status != SANE_STATUS_GOOD) {
303         SCAN_HILOGE("sane_init failed, reason: [%{public}s]", sane_strstatus(status));
304         return ScanUtil::ConvertErro(status);
305     }
306 #endif
307     DelayedSingleton<ScanUsbManager>::GetInstance()->Init();
308     ScanSystemData::GetInstance().Init();
309     SCAN_HILOGI("ScanServiceAbility InitScan end, scanVersion = [%{public}d]", scanVersion);
310     return E_SCAN_NONE;
311 }
312 
ExitScan()313 int32_t ScanServiceAbility::ExitScan()
314 {
315     ManualStart();
316     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
317         SCAN_HILOGE("no permission to access scan service");
318         return E_SCAN_NO_PERMISSION;
319     }
320     SCAN_HILOGI("ScanServiceAbility ExitScan start");
321     std::lock_guard<std::mutex> autoLock(lock_);
322 #ifdef SANE_ENABLE
323     sane_exit();
324     scannerHandleList_.clear();
325 #endif
326     g_scannerState = SCANNER_READY;
327     std::queue<int32_t> empty;
328     scanQueue.swap(empty);
329     scanTaskMap.clear();
330     for (const auto& [imagePath, fd] : imageFdMap_) {
331         constexpr int32_t INVALID_FILE_DESCRIPTOR = -1;
332         if (fd != INVALID_FILE_DESCRIPTOR) {
333             close(fd);
334         }
335         if (FileExists(imagePath)) {
336             unlink(imagePath.c_str());
337         }
338     }
339     imageFdMap_.clear();
340     SCAN_HILOGI("ScanServiceAbility ExitScan end");
341     return E_SCAN_NONE;
342 }
343 
ReInitScan(int32_t & scanVersion)344 int32_t ScanServiceAbility::ReInitScan(int32_t &scanVersion)
345 {
346     ManualStart();
347     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
348         SCAN_HILOGE("no permission to access scan service");
349         return E_SCAN_NO_PERMISSION;
350     }
351     SCAN_HILOGD("ScanServiceAbility ReInitScan start");
352 #ifdef SANE_ENABLE
353     sane_exit();
354     scannerHandleList_.clear();
355     g_scannerState = SCANNER_READY;
356     std::queue<int32_t> empty;
357     scanQueue.swap(empty);
358     scanTaskMap.clear();
359 
360     SANE_Status status = sane_init(&scanVersion, nullptr);
361     if (status != SANE_STATUS_GOOD) {
362         SCAN_HILOGE("ReInitScan sane_init failed, reason: [%{public}s]", sane_strstatus(status));
363         return ScanUtil::ConvertErro(status);
364     }
365 #endif
366     DelayedSingleton<ScanUsbManager>::GetInstance()->Init();
367     SCAN_HILOGD("ScanServiceAbility ReInitScan end, scanVersion = [%{public}d]", scanVersion);
368     return E_SCAN_NONE;
369 }
370 
GetUsbDevicePort(const std::string & deviceId,std::string & firstId,std::string & secondId)371 bool ScanServiceAbility::GetUsbDevicePort(const std::string &deviceId, std::string &firstId, std::string &secondId)
372 {
373     std::regex pattern(R"(([a-zA-Z0-9_]+):(libusb):([0-9]{3}):([0-9]{3}))");
374     std::smatch match;
375     if (std::regex_match(deviceId, match, pattern)) {
376         constexpr size_t STRING_POS_THREE = 3;
377         constexpr size_t STRING_POS_FOUR = 4;
378         firstId = std::to_string(std::stoi(match[STRING_POS_THREE]));
379         secondId = std::to_string(std::stoi(match[STRING_POS_FOUR]));
380         return true;
381     } else {
382         SCAN_HILOGE("In USB mode, the deviceId string format does not match");
383         return false;
384     }
385 }
386 
GetTcpDeviceIp(const std::string & deviceId,std::string & ip)387 bool ScanServiceAbility::GetTcpDeviceIp(const std::string &deviceId, std::string &ip)
388 {
389     std::regex pattern(R"(([^ ]+) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) ([^ ]+))");
390     std::smatch match;
391     if (std::regex_match(deviceId, match, pattern)) {
392         constexpr size_t STRING_POS_TWO = 2;
393         ip = match[STRING_POS_TWO];
394         return true;
395     } else {
396         SCAN_HILOGE("In TCP mode, the deviceId string format does not match");
397         return false;
398     }
399 }
400 
SetScannerSerialNumber(ScanDeviceInfo & info)401 void ScanServiceAbility::SetScannerSerialNumber(ScanDeviceInfo &info)
402 {
403     info.model = info.model.substr(0, info.model.find("(") - 1);
404     if (info.deviceId.find(":tcp") != info.deviceId.npos) {
405         info.discoverMode = "TCP";
406         SCAN_HILOGI("SetScannerSerialNumber discoverMode:[%{public}s]", info.discoverMode.c_str());
407         std::string ip;
408         if (!GetTcpDeviceIp(info.deviceId, ip)) {
409             SCAN_HILOGE("cannot get device's ip");
410             return;
411         }
412         auto it = scanDeviceInfoTCPMap_.find(ip);
413         if (it != scanDeviceInfoTCPMap_.end()) {
414             info.serialNumber = it->second.deviceName.substr(
415                 it->second.deviceName.find_last_of(" ") + 1, it->second.deviceName.size() - 1);
416             SCAN_HILOGI("Set mdns ScannerSerialNumber :[%{public}s]", info.serialNumber.c_str());
417         }
418     } else if (info.deviceId.find(":libusb") != info.deviceId.npos) {
419         info.discoverMode = "USB";
420         SCAN_HILOGI("SetScannerSerialNumber discoverMode:[%{public}s]", info.discoverMode.c_str());
421         std::string firstId;
422         std::string secondId;
423         if (!GetUsbDevicePort(info.deviceId, firstId, secondId)) {
424             SCAN_HILOGE("cannot get usb's port");
425             return;
426         }
427         std::string usbScannerPort = firstId + "-" + secondId;
428         SCAN_HILOGI("usbScannerPort: firstId-secondId [%{public}s]", usbScannerPort.c_str());
429         DelayedSingleton<ScanUsbManager>::GetInstance()->RefreshUsbDevice();
430         auto it = usbSnMap.find(usbScannerPort);
431         if (it != usbSnMap.end() && it->second != "") {
432             SCAN_HILOGI("set serialNumber [%{public}s]", usbSnMap[usbScannerPort].c_str());
433             info.serialNumber = usbSnMap[usbScannerPort];
434         } else {
435             SCAN_HILOGE("usb %{public}s can't find serialNumber", usbScannerPort.c_str());
436         }
437     }
438     info.deviceName = info.manufacturer + "-" + info.model + "-" + info.serialNumber;
439 }
440 
SyncScannerInfo(ScanDeviceInfo & info)441 void ScanServiceAbility::SyncScannerInfo(ScanDeviceInfo &info)
442 {
443     std::string uniqueId = info.discoverMode + info.serialNumber;
444     std::string deviceName = "";
445     if (ScanSystemData::GetInstance().QueryScannerNameByUniqueId(uniqueId, deviceName)) {
446         info.deviceName = deviceName;
447     } else {
448         SCAN_HILOGW("ScanServiceAbility SyncScannerInfo deviceName not need upadate");
449     }
450     if (ScanSystemData::GetInstance().UpdateScannerInfoByUniqueId(uniqueId, info)) {
451         ScanSystemData::GetInstance().SaveScannerMap();
452     }
453 }
454 
AddFoundUsbScanner(ScanDeviceInfo & info)455 void ScanServiceAbility::AddFoundUsbScanner(ScanDeviceInfo &info)
456 {
457     SCAN_HILOGI("AddFoundUsbScanner start model:[%{public}s]", info.model.c_str());
458     SyncScannerInfo(info);
459 #ifdef DEBUG_ENABLE
460     auto it = saneGetUsbDeviceInfoMap.find(info.serialNumber);
461     if (it != saneGetUsbDeviceInfoMap.end()) {
462         SCAN_HILOGD("AddFoundUsbScanner usbScanner deviceId:[%{public}s] of serialNumber:[%{public}s] has change",
463                     saneGetUsbDeviceInfoMap[info.serialNumber].deviceId.c_str(), info.serialNumber.c_str());
464     }
465 #endif
466     saneGetUsbDeviceInfoMap[info.serialNumber] = info;
467 #ifdef DEBUG_ENABLE
468     SCAN_HILOGD("AddFoundUsbScanner usbScanner deviceId:[%{public}s] of serialNumber:[%{public}s]",
469                 saneGetUsbDeviceInfoMap[info.serialNumber].deviceId.c_str(), info.serialNumber.c_str());
470 #endif
471     SCAN_HILOGI("AddFoundUsbScanner end model:[%{public}s]", info.model.c_str());
472 }
473 
AddFoundTcpScanner(ScanDeviceInfo & info)474 void ScanServiceAbility::AddFoundTcpScanner(ScanDeviceInfo &info)
475 {
476     SCAN_HILOGI("AddFoundTcpScanner start: model:[%{public}s]", info.model.c_str());
477     SyncScannerInfo(info);
478 #ifdef DEBUG_ENABLE
479     auto it = saneGetTcpDeviceInfoMap.find(info.serialNumber);
480     if (it != saneGetTcpDeviceInfoMap.end()) {
481         SCAN_HILOGD("AddFoundTcpScanner tcpScanner deviceId:[%{public}s] of serialNumber:[%{public}s] has change",
482                     saneGetTcpDeviceInfoMap[info.serialNumber].deviceId.c_str(), info.serialNumber.c_str());
483     }
484 #endif
485     saneGetTcpDeviceInfoMap[info.serialNumber] = info;
486 #ifdef DEBUG_ENABLE
487     SCAN_HILOGD("AddFoundTcpScanner tcpScanner deviceId:[%{public}s] of serialNumber:[%{public}s]",
488                 saneGetTcpDeviceInfoMap[info.serialNumber].deviceId.c_str(), info.serialNumber.c_str());
489 #endif
490     SCAN_HILOGI("AddFoundTcpScanner end: model:[%{public}s]", info.model.c_str());
491 }
492 
493 #ifdef SANE_ENABLE
SetScannerInfo(const SANE_Device ** & currentDevice,ScanDeviceInfo & info)494 bool ScanServiceAbility::SetScannerInfo(const SANE_Device** &currentDevice, ScanDeviceInfo &info)
495 {
496     SCAN_HILOGI("SetScannerInfo start.");
497     const std::string nullString = "";
498     if ((*currentDevice)->name != nullptr && (*currentDevice)->name != nullString) {
499         info.deviceId = (*currentDevice)->name;
500     } else {
501         SCAN_HILOGE("SaneGetScanner current_device's name is null.");
502         return false;
503     }
504     if ((*currentDevice)->vendor != nullptr) {
505         info.manufacturer = (*currentDevice)->vendor;
506     }
507     if ((*currentDevice)->model != nullptr) {
508         info.model = (*currentDevice)->model;
509     }
510     if ((*currentDevice)->type != nullptr) {
511         info.deviceType = (*currentDevice)->type;
512     }
513 #ifdef DEBUG_ENABLE
514     SCAN_HILOGD("SetScannerInfo deviceId:[%{public}s] manufacturer:[%{public}s]"
515                 "model:[%{public}s] deviceType:[%{public}s]",
516                 info.deviceId.c_str(), info.manufacturer.c_str(), info.model.c_str(), info.deviceType.c_str());
517 #endif
518     SCAN_HILOGI("SetScannerInfo end.");
519     return true;
520 }
521 #endif
522 
523 #ifdef SANE_ENABLE
SaneGetScanner()524 void ScanServiceAbility::SaneGetScanner()
525 {
526     const SANE_Device **deviceList;
527     SANE_Status devicesStatus = SANE_STATUS_GOOD;
528     std::lock_guard<std::mutex> autoLock(lock_);
529     g_scannerState = SCANNER_SEARCHING;
530     saneGetTcpDeviceInfoMap.clear();
531     saneGetUsbDeviceInfoMap.clear();
532     devicesStatus = sane_get_devices(&deviceList, SANE_FALSE);
533     if (devicesStatus != SANE_STATUS_GOOD) {
534         SCAN_HILOGE("sane_get_devices failed, reason: [%{public}s]", sane_strstatus(devicesStatus));
535         g_scannerState = SCANNER_READY;
536         return;
537     }
538     for (const SANE_Device **currentDevice = deviceList; *currentDevice != nullptr; ++currentDevice) {
539         ScanDeviceInfo info;
540         if (!SetScannerInfo(currentDevice, info)) {
541             SCAN_HILOGE("SaneGetScanner SetScannerInfo failed");
542             continue;
543         }
544         SetScannerSerialNumber(info);
545 #ifdef DEBUG_ENABLE
546         SCAN_HILOGD("SaneGetScanner serialNumber:[%{public}s] discoverMode:[%{public}s",
547                     info.serialNumber.c_str(), info.discoverMode.c_str());
548 #endif
549         if (info.serialNumber != "" && info.discoverMode == "USB") {
550             SCAN_HILOGI("SaneGetScanner AddFoundUsbScanner model:[%{public}s]", info.model.c_str());
551             AddFoundUsbScanner(info);
552         } else if (info.serialNumber != "" && info.discoverMode == "TCP") {
553             SCAN_HILOGI("SaneGetScanner AddFoundTcpScanner model:[%{public}s]", info.model.c_str());
554             AddFoundTcpScanner(info);
555         } else {
556             SCAN_HILOGE("SaneGetScanner SetScannerSerialNumber failed, model:[%{public}s]", info.model.c_str());
557         }
558     }
559     for (auto &t : saneGetUsbDeviceInfoMap) {
560         SendDeviceInfo(t.second, SCAN_DEVICE_FOUND);
561         deviceInfos.emplace_back(t.second);
562     }
563     for (auto &t : saneGetTcpDeviceInfoMap) {
564         SendDeviceInfo(t.second, SCAN_DEVICE_FOUND);
565         deviceInfos.emplace_back(t.second);
566     }
567     g_scannerState = SCANNER_READY;
568 }
569 #endif
570 
GetScannerList()571 int32_t ScanServiceAbility::GetScannerList()
572 {
573     ManualStart();
574     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
575         return E_SCAN_NO_PERMISSION;
576     }
577     if (g_scannerState != SCANNER_READY) {
578         SCAN_HILOGW("is working");
579         return E_SCAN_DEVICE_BUSY;
580     }
581     int32_t version = 0;
582     InitScan(version);
583     SCAN_HILOGD("ScanServiceAbility GetScannerList start");
584     std::lock_guard<std::mutex> autoLock(lock_);
585     // tcp
586     auto exec_tcp = [=]() {
587         ScanMdnsService::GetInstance().SetServiceType("_scanner._tcp");
588         ScanMdnsService::GetInstance().onStartDiscoverService();
589     };
590     auto exec_sane_getscaner = [=]() {
591         deviceInfos.clear();
592 #ifdef SANE_ENABLE
593         SaneGetScanner();
594 #endif
595         std::string message = "EOF";
596         SendDeviceSearchEnd(message, SCAN_DEVICE_FOUND);
597         SendDeviceList(deviceInfos, GET_SCANNER_DEVICE_LIST);
598     };
599     serviceHandler_->PostTask(exec_tcp, ASYNC_CMD_DELAY);
600     serviceHandler_->PostTask(exec_sane_getscaner, ASYNC_CMD_DELAY);
601     SCAN_HILOGD("ScanServiceAbility GetScannerList end");
602     return E_SCAN_NONE;
603 }
604 
StopDiscover()605 int32_t ScanServiceAbility::StopDiscover()
606 {
607     ManualStart();
608     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
609         SCAN_HILOGE("no permission to access scan service");
610         return E_SCAN_NO_PERMISSION;
611     }
612     SCAN_HILOGD("ScanServiceAbility StopDiscover start");
613 
614     ScanMdnsService::GetInstance().onStopDiscoverService();
615 
616     SCAN_HILOGD("ScanServiceAbility StopDiscover end");
617     return E_SCAN_NONE;
618 }
619 
OpenScanner(const std::string scannerId)620 int32_t ScanServiceAbility::OpenScanner(const std::string scannerId)
621 {
622     ManualStart();
623     std::lock_guard<std::mutex> autoLock(lock_);
624     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
625         SCAN_HILOGE("no permission to access scan service");
626         return E_SCAN_NO_PERMISSION;
627     }
628     SCAN_HILOGI("ScanServiceAbility OpenScanner start");
629     if (scannerId.empty()) {
630         SCAN_HILOGE("OpenScanner scannerId is empty");
631         return E_SCAN_INVALID_PARAMETER;
632     }
633     if (g_scannerState != SCANNER_READY) {
634         SCAN_HILOGE("OpenScanner scannerState not ready");
635         return E_SCAN_DEVICE_BUSY;
636     }
637 #ifdef SANE_ENABLE
638     SANE_Handle scannerHandle = 0;
639     SANE_String_Const scannerIdCstr = scannerId.c_str();
640     SANE_Status status = sane_open(scannerIdCstr, &scannerHandle);
641     if (status != SANE_STATUS_GOOD) {
642         SCAN_HILOGE("sane_open failed, reason: [%{public}s], retry one times", sane_strstatus(status));
643         g_hasOpenScannerFaild = true;
644     }
645     if (g_hasOpenScannerFaild == true) {
646         int32_t scanVersion = 0;
647         int32_t ret = ReInitScan(scanVersion);
648         if (ret != E_SCAN_NONE) {
649             SCAN_HILOGE("ScanServiceAbility OpenScanner ReInitScan failed !!!");
650             return ret;
651         }
652         status = sane_open(scannerIdCstr, &scannerHandle);
653         g_hasOpenScannerFaild = false;
654     }
655 
656     if (status != SANE_STATUS_GOOD) {
657         SCAN_HILOGE("sane_open failed, reason: [%{public}s]", sane_strstatus(status));
658         return ScanUtil::ConvertErro(status);
659     }
660 
661     scannerHandleList_[scannerId] = scannerHandle;
662 #endif
663     SCAN_HILOGI("ScanServiceAbility OpenScanner end");
664     return E_SCAN_NONE;
665 }
666 
CloseScanner(const std::string scannerId)667 int32_t ScanServiceAbility::CloseScanner(const std::string scannerId)
668 {
669     ManualStart();
670     std::lock_guard<std::mutex> autoLock(lock_);
671     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
672         SCAN_HILOGE("no permission to access scan service");
673         return E_SCAN_NO_PERMISSION;
674     }
675     SCAN_HILOGI("ScanServiceAbility CloseScanner start");
676 
677 #ifdef SANE_ENABLE
678 
679     auto scannerHandle = GetScanHandle(scannerId);
680     if (scannerHandle == nullptr) {
681         SCAN_HILOGE("ScanServiceAbility CloseScanner error exit");
682         return E_SCAN_INVALID_PARAMETER;
683     }
684     scanTaskMap.clear();
685     std::queue<int32_t> emptyQueue;
686     scanQueue.swap(emptyQueue);
687     sane_close(scannerHandle);
688     scannerHandleList_.erase(scannerId);
689 #endif
690     SCAN_HILOGI("ScanServiceAbility CloseScanner end");
691     return E_SCAN_NONE;
692 }
693 
694 #ifdef SANE_ENABLE
SetScanOptionDescriptor(ScanOptionDescriptor & desc,const SANE_Option_Descriptor * optionDesc)695 void ScanServiceAbility::SetScanOptionDescriptor(ScanOptionDescriptor &desc, const SANE_Option_Descriptor *optionDesc)
696 {
697     if (optionDesc->name != nullptr) {
698         desc.SetOptionName(std::string(optionDesc->name));
699     }
700     if (optionDesc->title != nullptr) {
701         desc.SetOptionTitle(std::string(optionDesc->title));
702     }
703     if (optionDesc->desc != nullptr) {
704         desc.SetOptionDesc(std::string(optionDesc->desc));
705     }
706     desc.SetOptionType(optionDesc->type);
707     desc.SetOptionUnit(optionDesc->unit);
708     desc.SetOptionSize(optionDesc->size);
709     desc.SetOptionCap(optionDesc->cap);
710     desc.SetOptionConstraintType(optionDesc->constraint_type);
711 }
712 #endif
713 
714 #ifdef SANE_ENABLE
SelectScanOptionDesc(const SANE_Option_Descriptor * & optionDesc,ScanOptionDescriptor & desc)715 int32_t ScanServiceAbility::SelectScanOptionDesc(
716     const SANE_Option_Descriptor* &optionDesc, ScanOptionDescriptor &desc)
717 {
718     if (optionDesc->constraint_type == SANE_CONSTRAINT_RANGE && optionDesc->constraint.range != nullptr) {
719         ScanRange scanRange;
720         scanRange.SetMinValue(optionDesc->constraint.range->min);
721         scanRange.SetMaxValue(optionDesc->constraint.range->max);
722         scanRange.SetQuantValue(optionDesc->constraint.range->quant);
723         desc.SetOptionConstraintRange(scanRange);
724     } else if (optionDesc->constraint_type == SANE_CONSTRAINT_WORD_LIST
725         && optionDesc->constraint.word_list != nullptr) {
726         std::vector<int32_t> optionConstraintNumber;
727         int sizeNumber = *(optionDesc->constraint.word_list) + 1;
728         for (int i = 0; i < sizeNumber; i++) {
729             SCAN_HILOGD("SANE_CONSTRAINT_WORD_LIST: %d", *(optionDesc->constraint.word_list + i));
730             optionConstraintNumber.push_back(*(optionDesc->constraint.word_list + i));
731         }
732         desc.SetOptionConstraintNumber(optionConstraintNumber);
733     } else if (optionDesc->constraint_type == SANE_CONSTRAINT_STRING_LIST
734         && optionDesc->constraint.string_list != nullptr) {
735         std::vector<std::string> optionConstraintString;
736         const SANE_String_Const* stringList = optionDesc->constraint.string_list;
737         if (stringList == nullptr) {
738             SCAN_HILOGE("sane_get_option_descriptor stringList nullptr");
739             return E_SCAN_INVALID_PARAMETER;
740         }
741         for (int i = 0; stringList[i] != NULL; i++) {
742             SCAN_HILOGD("SANE_CONSTRAINT_STRING_LIST: %s", stringList[i]);
743             optionConstraintString.push_back(std::string(stringList[i]));
744         }
745         optionConstraintString.push_back(string("null"));
746         desc.SetOptionConstraintString(optionConstraintString);
747     }
748     return E_SCAN_NONE;
749 }
750 #endif
751 
GetScanOptionDesc(const std::string scannerId,const int32_t optionIndex,ScanOptionDescriptor & desc)752 int32_t ScanServiceAbility::GetScanOptionDesc(
753     const std::string scannerId, const int32_t optionIndex, ScanOptionDescriptor &desc)
754 {
755     ManualStart();
756     std::lock_guard<std::mutex> autoLock(lock_);
757     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
758         SCAN_HILOGE("no permission to access scan service");
759         return E_SCAN_NO_PERMISSION;
760     }
761     SCAN_HILOGD("ScanServiceAbility GetScanOptionDesc start");
762     SCAN_HILOGI("optionIndex [%{public}d]", optionIndex);
763 
764 #ifdef SANE_ENABLE
765     auto scannerHandle = GetScanHandle(scannerId);
766     if (scannerHandle == nullptr) {
767         SCAN_HILOGE("ScanServiceAbility GetScanOptionDesc error exit");
768         return E_SCAN_INVALID_PARAMETER;
769     }
770     const SANE_Option_Descriptor *optionDesc = sane_get_option_descriptor(scannerHandle, optionIndex);
771     if (optionDesc == nullptr) {
772         SCAN_HILOGE("sane_get_option_descriptor failed, ScannerId: [%{public}s]", scannerId.c_str());
773         return E_SCAN_INVALID_PARAMETER;
774     }
775     SetScanOptionDescriptor(desc, optionDesc);
776     int32_t state = SelectScanOptionDesc(optionDesc, desc);
777     if (state != E_SCAN_NONE) {
778         SCAN_HILOGE("ScanServiceAbility GetScanOptionDesc error exit");
779         return state;
780     }
781 
782 #endif
783     SCAN_HILOGD("ScanServiceAbility GetScanOptionDesc end");
784     return E_SCAN_NONE;
785 }
786 
787 #ifdef SANE_ENABLE
ActionSetAuto(SANE_Handle & scannerHandle,const int32_t & optionIndex)788 int32_t ScanServiceAbility::ActionSetAuto(SANE_Handle &scannerHandle, const int32_t &optionIndex)
789 {
790     SCAN_HILOGD("Set OpScanOptionValue SCAN_ACTION_SET_AUTO");
791     SANE_Status status = SANE_STATUS_GOOD;
792     status = sane_control_option(scannerHandle, optionIndex, SANE_ACTION_SET_AUTO, 0, 0);
793     if (status != SANE_STATUS_GOOD) {
794         SCAN_HILOGE("sane_control_option failed, reason: [%{public}s]", sane_strstatus(status));
795         return ScanUtil::ConvertErro(status);
796     }
797     return E_SCAN_NONE;
798 }
799 #endif
800 
801 #ifdef SANE_ENABLE
ActionGetValue(SANE_Handle & scannerHandle,ScanOptionValue & value,const int32_t & optionIndex)802 int32_t ScanServiceAbility::ActionGetValue(SANE_Handle &scannerHandle, ScanOptionValue &value,
803     const int32_t &optionIndex)
804 {
805     SCAN_HILOGD("Set OpScanOptionValue SCAN_ACTION_GET_VALUE");
806     SANE_Status status = SANE_STATUS_GOOD;
807     int32_t valueSize = value.GetValueSize() / sizeof(SANE_Word);
808     uint32_t bufSize = (value.GetStrValue().size() + 1)
809         > sizeof(int) ? (value.GetStrValue().size() + 1) : sizeof(int);
810 
811     void* saneValueBuf = malloc(bufSize);
812     ScanOptionValueType valueType = value.GetScanOptionValueType();
813     if (!saneValueBuf) {
814         SCAN_HILOGE("malloc value buffer failed");
815         return E_SCAN_GENERIC_FAILURE;
816     }
817     if (memset_s(saneValueBuf, bufSize, 0, bufSize) != 0) {
818         SCAN_HILOGE("memset_s failed");
819         free(saneValueBuf);
820         saneValueBuf = nullptr;
821         return E_SCAN_GENERIC_FAILURE;
822     }
823 
824     status = sane_control_option(scannerHandle, optionIndex, SANE_ACTION_GET_VALUE, saneValueBuf, 0);
825     if (status != SANE_STATUS_GOOD) {
826         SCAN_HILOGE("sane_control_option failed, reason: [%{public}s]", sane_strstatus(status));
827         return ScanUtil::ConvertErro(status);
828     }
829 
830     if (valueType == SCAN_VALUE_NUM) {
831         value.SetNumValue(*static_cast<int *>(saneValueBuf));
832     } else if (valueType == SCAN_VALUE_NUM_LIST) {
833         std::vector<int32_t> numListValue;
834         for (int i = 0; i < valueSize; i++) {
835             numListValue.emplace_back(*(static_cast<int32_t *>(saneValueBuf) + i));
836         }
837         value.SetNumListValue(numListValue);
838     } else if (valueType == SCAN_VALUE_STR) {
839         value.SetStrValue(*static_cast<std::string*>(saneValueBuf));
840     } else if (valueType == SCAN_VALUE_BOOL) {
841         value.SetBoolValue(*static_cast<int32_t *>(saneValueBuf) > 0 ? true : false);
842     }
843 
844     free(saneValueBuf);
845     saneValueBuf = nullptr;
846     return E_SCAN_NONE;
847 }
848 #endif
849 
850 #ifdef SANE_ENABLE
ActionSetValue(SANE_Handle & scannerHandle,ScanOptionValue & value,const int32_t & optionIndex,int32_t & info)851 int32_t ScanServiceAbility::ActionSetValue(SANE_Handle &scannerHandle, ScanOptionValue &value,
852     const int32_t &optionIndex, int32_t &info)
853 {
854     SCAN_HILOGD("Set OpScanOptionValue SCAN_ACTION_SET_VALUE");
855     SANE_Status status = SANE_STATUS_GOOD;
856     int32_t valueSize = value.GetValueSize() / sizeof(SANE_Word);
857     uint32_t bufSize = (value.GetStrValue().size() + 1)
858         > sizeof(int) ? (value.GetStrValue().size() + 1) : sizeof(int);
859     void* saneValueBuf = malloc(bufSize);
860     if (!saneValueBuf) {
861         SCAN_HILOGE("malloc value buffer failed");
862         return E_SCAN_GENERIC_FAILURE;
863     }
864     if (memset_s(saneValueBuf, bufSize, 0, bufSize) != 0) {
865         SCAN_HILOGE("memset_s failed");
866         free(saneValueBuf);
867         saneValueBuf = nullptr;
868         return E_SCAN_GENERIC_FAILURE;
869     }
870     ScanOptionValueType valueType = value.GetScanOptionValueType();
871     if (valueType == SCAN_VALUE_NUM) {
872         int32_t numValue = value.GetNumValue();
873         dpi = numValue > 0 && numValue < MAX_PICTURE_DPI ? numValue : 0;
874         *static_cast<int *>(saneValueBuf) = value.GetNumValue(); //
875     } else if (valueType == SCAN_VALUE_NUM_LIST) {
876         std::vector<int32_t> numListValue;
877         value.GetNumListValue(numListValue);
878         for (int i = 0; i < valueSize; i++) {
879             *(static_cast<int32_t *>(saneValueBuf) + i) = numListValue[i];
880         }
881     } else if (valueType == SCAN_VALUE_STR) {
882         SCAN_HILOGE("Set scanner mode:[%{public}s]", value.GetStrValue().c_str());
883         strncpy_s(static_cast<char*>(saneValueBuf), bufSize,
884             value.GetStrValue().c_str(), value.GetStrValue().size());
885     } else if (valueType == SCAN_VALUE_BOOL) {
886         *static_cast<int32_t *>(saneValueBuf) = value.GetBoolValue() > 0 ? true : false;
887     }
888     status = sane_control_option(scannerHandle, optionIndex,
889         SANE_ACTION_SET_VALUE, saneValueBuf, &info);
890     if (status != SANE_STATUS_GOOD) {
891         SCAN_HILOGE("sane_control_option failed, reason: [%{public}s]", sane_strstatus(status));
892         return ScanUtil::ConvertErro(status);
893     }
894 
895     free(saneValueBuf);
896     saneValueBuf = nullptr;
897 
898     return E_SCAN_NONE;
899 }
900 #endif
901 
OpScanOptionValue(const std::string scannerId,const int32_t optionIndex,const ScanOptionOpType op,ScanOptionValue & value,int32_t & info)902 int32_t ScanServiceAbility::OpScanOptionValue(const std::string scannerId, const int32_t optionIndex,
903     const ScanOptionOpType op, ScanOptionValue &value, int32_t &info)
904 {
905     SCAN_HILOGD("ScanServiceAbility OpScanOptionValue start");
906     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
907         SCAN_HILOGE("no permission to access scan service");
908         return E_SCAN_NO_PERMISSION;
909     }
910     SCAN_HILOGI("optionIndex [%{public}d]", optionIndex);
911     int32_t state = E_SCAN_NONE;
912 #ifdef SANE_ENABLE
913     if (g_hasIoFaild) {
914         SCAN_HILOGI("OpScanOptionValue try to reOpenScanner start");
915         int32_t openRet = OpenScanner(scannerId);
916         if (openRet != E_SCAN_NONE) {
917             SCAN_HILOGE("OpScanOptionValue try to reOpenScanner failed");
918             return E_SCAN_DEVICE_BUSY;
919         }
920         g_hasIoFaild = false;
921     }
922 
923     std::lock_guard<std::mutex> autoLock(lock_);
924 
925     auto scannerHandle = GetScanHandle(scannerId);
926     if (scannerHandle == nullptr) {
927         SCAN_HILOGE("ScanServiceAbility OpScanOptionValue error exit");
928         return E_SCAN_INVALID_PARAMETER;
929     }
930     SCAN_HILOGD("ScanServiceAbility OpScanOptionValue start to dump value");
931     value.Dump();
932     switch (op) {
933         case SCAN_ACTION_SET_AUTO:
934             state = ActionSetAuto(scannerHandle, optionIndex);
935             break;
936         case SCAN_ACTION_GET_VALUE:
937             state = ActionGetValue(scannerHandle, value, optionIndex);
938             break;
939         case SCAN_ACTION_SET_VALUE:
940             state = ActionSetValue(scannerHandle, value, optionIndex, info);
941             break;
942         default:
943             SCAN_HILOGE("ScanServiceAbility OpScanOptionValue not find ScanOptionOpType");
944             break;
945     }
946 
947     if (state != E_SCAN_NONE) {
948         SCAN_HILOGE("ScanServiceAbility::OpScanOptionValue error exit");
949     }
950 
951     SCAN_HILOGD("ScanServiceAbility OpScanOptionValue start to dump value");
952     value.Dump();
953 #endif
954     SCAN_HILOGD("ScanServiceAbility OpScanOptionValue end");
955     return state;
956 }
957 
958 
GetScanParameters(const std::string scannerId,ScanParameters & para)959 int32_t ScanServiceAbility::GetScanParameters(const std::string scannerId, ScanParameters &para)
960 {
961     ManualStart();
962     std::lock_guard<std::mutex> autoLock(lock_);
963     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
964         SCAN_HILOGE("no permission to access scan service");
965         return E_SCAN_NO_PERMISSION;
966     }
967     SCAN_HILOGD("ScanServiceAbility GetScanParameters start");
968 
969 #ifdef SANE_ENABLE
970     auto scannerHandle = GetScanHandle(scannerId);
971     if (scannerHandle == nullptr) {
972         SCAN_HILOGE("ScanServiceAbility GetScanParameters error exit");
973         return E_SCAN_INVALID_PARAMETER;
974     }
975     SANE_Parameters parameters;
976     SANE_Status status = sane_get_parameters(scannerHandle, &parameters);
977     if (status != SANE_STATUS_GOOD) {
978         SCAN_HILOGE("sane_get_parameters failed, reason: [%{public}s]", sane_strstatus(status));
979         return ScanUtil::ConvertErro(status);
980     }
981     para.SetFormat((ScanFrame)parameters.format);
982     para.SetLastFrame((bool)parameters.last_frame);
983     para.SetBytesPerLine(parameters.bytes_per_line);
984     para.SetPixelsPerLine(parameters.pixels_per_line);
985     para.SetLines(parameters.lines);
986     para.SetDepth(parameters.depth);
987     para.Dump();
988 #endif
989     SCAN_HILOGD("ScanServiceAbility GetScanParameters end");
990     return E_SCAN_NONE;
991 }
992 
GetSingleFrameFD(const std::string scannerId,uint32_t & size,uint32_t fd)993 int32_t ScanServiceAbility::GetSingleFrameFD(const std::string scannerId, uint32_t &size, uint32_t fd)
994 {
995     ManualStart();
996     std::lock_guard<std::mutex> autoLock(lock_);
997     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
998         SCAN_HILOGE("no permission to access scan service");
999         return E_SCAN_NO_PERMISSION;
1000     }
1001     SCAN_HILOGD("ScanServiceAbility GetSingleFrameFD start");
1002 
1003 #ifdef SANE_ENABLE
1004     auto scannerHandle = GetScanHandle(scannerId);
1005     if (scannerHandle == nullptr) {
1006         SCAN_HILOGE("ScanServiceAbility GetSingleFrameFD error exit");
1007         return E_SCAN_INVALID_PARAMETER;
1008     }
1009 #ifdef SANE_ENABLE
1010     auto exeFrameFD = this->getSingleFrameFDExe;
1011     auto exe = [=]() {
1012         exeFrameFD(scannerHandle, fd);
1013     };
1014 #endif
1015     serviceHandler_->PostTask(exe, ASYNC_CMD_DELAY);
1016 
1017 #endif
1018     SCAN_HILOGD("ScanServiceAbility GetSingleFrameFD end");
1019     return E_SCAN_NONE;
1020 }
1021 
CancelScan(const std::string scannerId)1022 int32_t ScanServiceAbility::CancelScan(const std::string scannerId)
1023 {
1024     ManualStart();
1025     std::lock_guard<std::mutex> autoLock(lock_);
1026     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1027         SCAN_HILOGE("no permission to access scan service");
1028         return E_SCAN_NO_PERMISSION;
1029     }
1030     SCAN_HILOGI("ScanServiceAbility CancelScan start");
1031 #ifdef SANE_ENABLE
1032     auto scannerHandle = GetScanHandle(scannerId);
1033     if (scannerHandle != nullptr) {
1034         SCAN_HILOGW("start sane_cancel");
1035         sane_cancel(scannerHandle);
1036     }
1037     std::queue<int32_t> emptyQueue;
1038     scanQueue.swap(emptyQueue);
1039     if (g_scannerState == SCANNER_SCANING) {
1040         SCAN_HILOGW("ScannerState change to SCANNER_CANCELING");
1041         g_scannerState = SCANNER_CANCELING;
1042     }
1043 #endif
1044     SCAN_HILOGI("ScanServiceAbility CancelScan end");
1045     return E_SCAN_NONE;
1046 }
1047 
SetScanIOMode(const std::string scannerId,const bool isNonBlocking)1048 int32_t ScanServiceAbility::SetScanIOMode(const std::string scannerId, const bool isNonBlocking)
1049 {
1050     ManualStart();
1051     std::lock_guard<std::mutex> autoLock(lock_);
1052     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1053         SCAN_HILOGE("no permission to access scan service");
1054         return E_SCAN_NO_PERMISSION;
1055     }
1056     SCAN_HILOGD("ScanServiceAbility SetScanIOMode start");
1057 
1058 #ifdef SANE_ENABLE
1059     auto scannerHandle = GetScanHandle(scannerId);
1060     if (scannerHandle == nullptr) {
1061         SCAN_HILOGE("ScanServiceAbility SetScanIOMode error exit");
1062         return E_SCAN_INVALID_PARAMETER;
1063     }
1064     SANE_Status status = sane_set_io_mode(scannerHandle, isNonBlocking);
1065     if (status != SANE_STATUS_GOOD) {
1066         SCAN_HILOGE("sane_set_io_mode failed, reason: [%{public}s]", sane_strstatus(status));
1067         return ScanUtil::ConvertErro(status);
1068     }
1069 #endif
1070     SCAN_HILOGE("ScanServiceAbility SetScanIOMode end");
1071     return E_SCAN_NONE;
1072 }
1073 
GetScanSelectFd(const std::string scannerId,int32_t & fd)1074 int32_t ScanServiceAbility::GetScanSelectFd(const std::string scannerId, int32_t &fd)
1075 {
1076     ManualStart();
1077     std::lock_guard<std::mutex> autoLock(lock_);
1078     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1079         SCAN_HILOGE("no permission to access scan service");
1080         return E_SCAN_NO_PERMISSION;
1081     }
1082     SCAN_HILOGD("ScanServiceAbility GetScanSelectFd start");
1083 
1084 #ifdef SANE_ENABLE
1085     auto scannerHandle = GetScanHandle(scannerId);
1086     if (scannerHandle == nullptr) {
1087         SCAN_HILOGE("ScanServiceAbility GetScanSelectFd error exit");
1088         return E_SCAN_INVALID_PARAMETER;
1089     }
1090     SANE_Status status = sane_get_select_fd(scannerHandle, &fd);
1091     if (status != SANE_STATUS_GOOD) {
1092         SCAN_HILOGE("sane_set_io_mode failed, reason: [%{public}s]", sane_strstatus(status));
1093         return ScanUtil::ConvertErro(status);
1094     }
1095 #endif
1096     SCAN_HILOGE("ScanServiceAbility GetScanSelectFd end");
1097     return E_SCAN_NONE;
1098 }
1099 
On(const std::string taskId,const std::string & type,const sptr<IScanCallback> & listener)1100 int32_t ScanServiceAbility::On(const std::string taskId, const std::string &type, const sptr<IScanCallback> &listener)
1101 {
1102     std::string eventType = type;
1103     if (taskId != "") {
1104         eventType = NapiScanUtils::GetTaskEventId(taskId, type);
1105     }
1106     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1107         SCAN_HILOGE("no permission to access scan service");
1108         return E_SCAN_NO_PERMISSION;
1109     }
1110 
1111     SCAN_HILOGD("ScanServiceAbility::On started. type=%{public}s", eventType.c_str());
1112     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
1113     if (registeredListeners_.find(eventType) == registeredListeners_.end()) {
1114         const auto temp = registeredListeners_.insert(std::make_pair(eventType, listener));
1115         if (!temp.second) {
1116             SCAN_HILOGE("ScanServiceAbility::On insert type=%{public}s object fail.", eventType.c_str());
1117             return E_SCAN_SERVER_FAILURE;
1118         }
1119     } else {
1120         SCAN_HILOGD("ScanServiceAbility::On Replace listener.");
1121         registeredListeners_[eventType] = listener;
1122     }
1123     SCAN_HILOGD("ScanServiceAbility::On end.");
1124     return E_SCAN_NONE;
1125 }
1126 
Off(const std::string taskId,const std::string & type)1127 int32_t ScanServiceAbility::Off(const std::string taskId, const std::string &type)
1128 {
1129     std::string eventType = type;
1130     if (taskId != "") {
1131         eventType = NapiScanUtils::GetTaskEventId(taskId, type);
1132     }
1133     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1134         SCAN_HILOGE("no permission to access scan service");
1135         return E_SCAN_NO_PERMISSION;
1136     }
1137 
1138     SCAN_HILOGD("ScanServiceAbility::Off started.");
1139     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
1140     auto iter = registeredListeners_.find(eventType);
1141     if (iter != registeredListeners_.end()) {
1142         SCAN_HILOGD("ScanServiceAbility::Off delete type=%{public}s object message.", eventType.c_str());
1143         registeredListeners_.erase(iter);
1144         return E_SCAN_NONE;
1145     }
1146     return E_SCAN_INVALID_PARAMETER;
1147 }
1148 
SendGetFrameResEvent(const bool isGetSucc,const int32_t sizeRead)1149 void ScanServiceAbility::SendGetFrameResEvent(const bool isGetSucc, const int32_t sizeRead)
1150 {
1151     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
1152     SCAN_HILOGE("ScanServiceAbility::SendGetFrameSuccEvent SizeRead %{public}d", sizeRead);
1153     auto eventIt = registeredListeners_.find(GET_FRAME_RES_EVENT_TYPE);
1154     if (eventIt == registeredListeners_.end() || eventIt->second == nullptr) {
1155         SCAN_HILOGE("%{public}s event not register", GET_FRAME_RES_EVENT_TYPE.c_str());
1156         return;
1157     }
1158     eventIt->second->OnGetFrameResCallback(isGetSucc, sizeRead);
1159 }
1160 
SendDeviceInfoTCP(const ScanDeviceInfoTCP & info,std::string event)1161 void ScanServiceAbility::SendDeviceInfoTCP(const ScanDeviceInfoTCP &info, std::string event)
1162 {
1163     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
1164 
1165     if (event.empty()) {
1166         SCAN_HILOGE("SendDeviceInfoTCP parm has nullptr");
1167         return;
1168     }
1169 
1170     auto eventIt = registeredListeners_.find(event);
1171     if (eventIt == registeredListeners_.end() || eventIt->second == nullptr) {
1172         SCAN_HILOGE("GetScannerList SendDeviceInfoTCP event not register");
1173         return;
1174     }
1175     eventIt->second->OnCallback(info.GetDeviceState(), info);
1176 }
1177 
SendDeviceInfo(const ScanDeviceInfo & info,std::string event)1178 void ScanServiceAbility::SendDeviceInfo(const ScanDeviceInfo &info, std::string event)
1179 {
1180     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
1181 
1182     if (event.empty()) {
1183         SCAN_HILOGE("SendDeviceInfo parm has nullptr");
1184         return;
1185     }
1186 
1187     auto eventIt = registeredListeners_.find(event);
1188     if (eventIt == registeredListeners_.end() || eventIt->second == nullptr) {
1189         SCAN_HILOGE("GetScannerList SendDeviceInfo event not register");
1190         return;
1191     }
1192     eventIt->second->OnCallback(info.GetDeviceState(), info);
1193 }
1194 
SendDeviceList(std::vector<ScanDeviceInfo> & infos,std::string event)1195 void ScanServiceAbility::SendDeviceList(std::vector<ScanDeviceInfo> &infos, std::string event)
1196 {
1197     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
1198 
1199     if (event.empty()) {
1200         SCAN_HILOGE("SendDeviceInfo parm has nullptr");
1201         return;
1202     }
1203 
1204     auto eventIt = registeredListeners_.find(event);
1205     if (eventIt == registeredListeners_.end() || eventIt->second == nullptr) {
1206         SCAN_HILOGE("GetScannerList SendDeviceList event not register");
1207         return;
1208     }
1209     eventIt->second->OnGetDevicesList(infos);
1210 }
1211 
SendDeviceInfoSync(const ScanDeviceInfoSync & info,std::string event)1212 void ScanServiceAbility::SendDeviceInfoSync(const ScanDeviceInfoSync &info, std::string event)
1213 {
1214     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
1215 
1216     if (event.empty()) {
1217         SCAN_HILOGE("SendDeviceInfoSync parm has nullptr");
1218         return;
1219     }
1220 
1221     auto eventIt = registeredListeners_.find(event);
1222     if (eventIt == registeredListeners_.end() || eventIt->second == nullptr) {
1223         SCAN_HILOGE("DealUsbDevStatusChange SendDeviceInfoSync event not register");
1224         return;
1225     }
1226     eventIt->second->OnCallbackSync(info.GetDeviceState(), info);
1227 }
1228 
DisConnectUsbScanner(std::string serialNumber,std::string deviceId)1229 void ScanServiceAbility::DisConnectUsbScanner(std::string serialNumber, std::string deviceId)
1230 {
1231     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1232         SCAN_HILOGE("no permission to access scan service");
1233         return;
1234     }
1235     SCAN_HILOGD("DisConnectUsbScanner start deviceId:%{public}s", deviceId.c_str());
1236     ScanDeviceInfoSync scanDeviceInfoSync;
1237     scanDeviceInfoSync.serialNumber = serialNumber;
1238     scanDeviceInfoSync.deviceId = deviceId;
1239     scanDeviceInfoSync.discoverMode = "USB";
1240     scanDeviceInfoSync.syncMode = "delete";
1241     scanDeviceInfoSync.deviceState = 0;
1242     SendDeviceInfoSync(scanDeviceInfoSync, SCAN_DEVICE_SYNC);
1243 #ifdef DEBUG_ENABLE
1244     SCAN_HILOGD("GetScannerList delete end serialNumber:%{public}s newDeviceId:%{public}s",
1245                 serialNumber.c_str(), deviceId.c_str());
1246 #endif
1247 }
1248 
UpdateUsbScannerId(std::string serialNumber,std::string newDeviceId)1249 void ScanServiceAbility::UpdateUsbScannerId(std::string serialNumber, std::string newDeviceId)
1250 {
1251     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1252         SCAN_HILOGE("no permission to access scan service");
1253         return;
1254     }
1255     SCAN_HILOGD("UpdateUsbScannerId start newDeviceId:%{public}s", newDeviceId.c_str());
1256     ScanDeviceInfoSync scanDeviceInfoSync;
1257     scanDeviceInfoSync.serialNumber = serialNumber;
1258     scanDeviceInfoSync.deviceId = newDeviceId;
1259     scanDeviceInfoSync.discoverMode = "USB";
1260     scanDeviceInfoSync.syncMode = "update";
1261     scanDeviceInfoSync.deviceState = 0;
1262     auto it = saneGetUsbDeviceInfoMap.find(serialNumber);
1263     if (it != saneGetUsbDeviceInfoMap.end()) {
1264         saneGetUsbDeviceInfoMap[serialNumber].deviceId = newDeviceId;
1265         SendDeviceInfoSync(scanDeviceInfoSync, SCAN_DEVICE_SYNC);
1266     }
1267 #ifdef DEBUG_ENABLE
1268     SCAN_HILOGD("GetScannerList UpdateUsbScannerId serialNumber:%{public}s newDeviceId:%{public}s",
1269                 serialNumber.c_str(), newDeviceId.c_str());
1270 #endif
1271 }
1272 
SendInitEvent(int32_t & scanVersion,std::string event)1273 void ScanServiceAbility::SendInitEvent(int32_t &scanVersion, std::string event)
1274 {
1275     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
1276 
1277     if (event.empty()) {
1278         SCAN_HILOGE("SendInitEvent parm has nullptr");
1279         return;
1280     }
1281 
1282     auto eventIt = registeredListeners_.find(event);
1283     if (eventIt == registeredListeners_.end() || eventIt->second == nullptr) {
1284         SCAN_HILOGE("InitScan SendInitEvent event not register");
1285         return;
1286     }
1287     eventIt->second->OnScanInitCallback(scanVersion);
1288 }
1289 
SendDeviceSearchEnd(std::string & message,std::string event)1290 void ScanServiceAbility::SendDeviceSearchEnd(std::string &message, std::string event)
1291 {
1292     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
1293 
1294     if (message.empty() || event.empty()) {
1295         SCAN_HILOGE("SendDeviceSearchEnd parm has nullptr");
1296         return;
1297     }
1298 
1299     auto eventIt = registeredListeners_.find(event);
1300     if (eventIt == registeredListeners_.end() || eventIt->second == nullptr) {
1301         SCAN_HILOGE("SCAN_DEVICE_FOUND event not register");
1302         return;
1303     }
1304     eventIt->second->OnSendSearchMessage(message);
1305 }
1306 
CheckPermission(const std::string & permissionName)1307 bool ScanServiceAbility::CheckPermission(const std::string &permissionName)
1308 {
1309     AccessTokenID tokenId = IPCSkeleton::GetCallingTokenID();
1310     TypeATokenTypeEnum tokenType = AccessTokenKit::GetTokenTypeFlag(tokenId);
1311     if (tokenType == TOKEN_INVALID) {
1312         SCAN_HILOGE("invalid token id");
1313         return false;
1314     }
1315     int result = AccessTokenKit::VerifyAccessToken(tokenId, permissionName);
1316     if (result != PERMISSION_GRANTED) {
1317         if (permissionName == PERMISSION_NAME_PRINT) {
1318             result = AccessTokenKit::VerifyAccessToken(tokenId, PERMISSION_NAME_PRINT);
1319         }
1320         SCAN_HILOGE("Current tokenId permission is %{public}d", result);
1321     }
1322     return result == PERMISSION_GRANTED;
1323 }
1324 
GetScannerState(int32_t & scannerState)1325 int32_t ScanServiceAbility::GetScannerState(int32_t &scannerState)
1326 {
1327     ManualStart();
1328     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1329         SCAN_HILOGE("no permission to access scan service");
1330         return E_SCAN_NO_PERMISSION;
1331     }
1332     SCAN_HILOGD("ScanServiceAbility GetScannerState start");
1333     scannerState = g_scannerState;
1334     SCAN_HILOGD("ScanServiceAbility GetScannerState end, scannerState = [%{public}d]", scannerState);
1335     return E_SCAN_NONE;
1336 }
1337 
GetScanProgress(const std::string scannerId,ScanProgress & prog)1338 int32_t ScanServiceAbility::GetScanProgress(const std::string scannerId, ScanProgress &prog)
1339 {
1340     ManualStart();
1341     std::lock_guard<std::mutex> autoLock(lock_);
1342     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1343         SCAN_HILOGE("no permission to access scan service");
1344         return E_SCAN_NO_PERMISSION;
1345     }
1346 
1347 #ifdef SANE_ENABLE
1348     if (scanQueue.empty()) {
1349         SCAN_HILOGE("Not exist scan progress");
1350         if (g_hasIoFaild) {
1351             return E_SCAN_INVALID_PARAMETER;
1352         }
1353         return E_SCAN_GENERIC_FAILURE;
1354     }
1355     int32_t frontPicId = scanQueue.front();
1356     SCAN_HILOGD("frontPicId : [%{public}d]", frontPicId);
1357     auto frontProg = scanTaskMap[frontPicId];
1358     auto taskCode = frontProg.GetTaskCode();
1359     if (taskCode != E_SCAN_GOOD) {
1360         SCAN_HILOGE("scanprogress exception occurred:[%{public}u]", taskCode);
1361         scanQueue.pop();
1362         return taskCode;
1363     }
1364     auto scanProgress = frontProg.GetScanProgress();
1365     if (scanProgress == SCAN_PROGRESS_100) {
1366         SCAN_HILOGI("get scan picture successfully!");
1367         prog = frontProg;
1368         int32_t fd = open(prog.GetImageRealPath().c_str(), O_RDONLY);
1369         prog.SetScanPictureFd(fd);
1370         imageFdMap_[prog.GetImageRealPath()] = fd;
1371         prog.Dump();
1372         scanQueue.pop();
1373         return E_SCAN_NONE;
1374     }
1375     int32_t randomNumber = GetRandomNumber(SCAN_PROGRESS_10, SCAN_PROGRESS_19);
1376     auto preTime = scanTaskMap[frontPicId].GetScanTime();
1377     if (GetElapsedSeconds(preTime) >= 1 && scanProgress < SCAN_PROGRESS_80) {
1378         scanTaskMap[frontPicId].SetScanProgress(scanProgress + randomNumber);
1379         scanTaskMap[frontPicId].SetScanTime(std::chrono::steady_clock::now());
1380     }
1381     prog = scanTaskMap[frontPicId];
1382     prog.Dump();
1383 #endif
1384     return E_SCAN_NONE;
1385 }
1386 
AddScanner(const std::string & serialNumber,const std::string & discoverMode)1387 int32_t ScanServiceAbility::AddScanner(const std::string& serialNumber, const std::string& discoverMode)
1388 {
1389     ManualStart();
1390     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1391         SCAN_HILOGE("no permission to access scan service");
1392         return E_SCAN_NO_PERMISSION;
1393     }
1394     SCAN_HILOGI("ScanServiceAbility AddScanner start");
1395 
1396 #ifdef SANE_ENABLE
1397     std::string uniqueId = discoverMode + serialNumber;
1398     if (discoverMode == "USB") {
1399         auto usbIt = saneGetUsbDeviceInfoMap.find(serialNumber);
1400         if (usbIt != saneGetUsbDeviceInfoMap.end()) {
1401             ScanSystemData::GetInstance().InsertScannerInfo(uniqueId, usbIt->second);
1402             if (!ScanSystemData::GetInstance().SaveScannerMap()) {
1403                 SCAN_HILOGE("ScanServiceAbility AddScanner SaveScannerMap fail");
1404                 return E_SCAN_GENERIC_FAILURE;
1405             }
1406             SendDeviceInfo(usbIt->second, SCAN_DEVICE_ADD);
1407         } else {
1408             SCAN_HILOGE("ScanServiceAbility AddScanner not found the USB scanner");
1409         }
1410     } else if (discoverMode == "TCP") {
1411         auto tcpIt = saneGetTcpDeviceInfoMap.find(serialNumber);
1412         if (tcpIt != saneGetTcpDeviceInfoMap.end()) {
1413             ScanSystemData::GetInstance().InsertScannerInfo(uniqueId, tcpIt->second);
1414             if (!ScanSystemData::GetInstance().SaveScannerMap()) {
1415                 SCAN_HILOGE("ScanServiceAbility AddScanner SaveScannerMap fail");
1416                 return E_SCAN_GENERIC_FAILURE;
1417             }
1418             SendDeviceInfo(tcpIt->second, SCAN_DEVICE_ADD);
1419         } else {
1420             SCAN_HILOGE("ScanServiceAbility AddScanner not found the TCP scanner");
1421         }
1422     } else {
1423         SCAN_HILOGE("ScanServiceAbility AddScanner invalid parameter");
1424         return E_SCAN_INVALID_PARAMETER;
1425     }
1426 #endif
1427     SCAN_HILOGI("ScanServiceAbility AddScanner end");
1428     return E_SCAN_NONE;
1429 }
1430 
DeleteScanner(const std::string & serialNumber,const std::string & discoverMode)1431 int32_t ScanServiceAbility::DeleteScanner(const std::string& serialNumber, const std::string& discoverMode)
1432 {
1433     ManualStart();
1434     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1435         SCAN_HILOGE("no permission to access scan service");
1436         return E_SCAN_NO_PERMISSION;
1437     }
1438     SCAN_HILOGI("ScanServiceAbility DeleteScanner start");
1439 
1440 #ifdef SANE_ENABLE
1441     std::string uniqueId = discoverMode + serialNumber;
1442     ScanDeviceInfo scannerInfo;
1443     if (!ScanSystemData::GetInstance().QueryScannerInfoByUniqueId(uniqueId, scannerInfo)) {
1444         SCAN_HILOGE("ScanServiceAbility DeleteScanner QueryScannerInfoByUniqueId fail");
1445         return E_SCAN_INVALID_PARAMETER;
1446     }
1447     if (!ScanSystemData::GetInstance().DeleteScannerInfo(uniqueId)) {
1448         SCAN_HILOGE("ScanServiceAbility DeleteScanner DeleteScannerInfo fail");
1449         return E_SCAN_INVALID_PARAMETER;
1450     }
1451     if (!ScanSystemData::GetInstance().SaveScannerMap()) {
1452         SCAN_HILOGE("ScanServiceAbility DeleteScanner SaveScannerMap fail");
1453         return E_SCAN_GENERIC_FAILURE;
1454     }
1455     SendDeviceInfo(scannerInfo, SCAN_DEVICE_DEL);
1456 #endif
1457     SCAN_HILOGI("ScanServiceAbility DeleteScanner end");
1458     return E_SCAN_NONE;
1459 }
1460 
GetAddedScanner(std::vector<ScanDeviceInfo> & allAddedScanner)1461 int32_t ScanServiceAbility::GetAddedScanner(std::vector<ScanDeviceInfo>& allAddedScanner)
1462 {
1463     ManualStart();
1464     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1465         SCAN_HILOGE("no permission to access scan service");
1466         return E_SCAN_NO_PERMISSION;
1467     }
1468     SCAN_HILOGI("ScanServiceAbility GetAddedScanner start");
1469 #ifdef SANE_ENABLE
1470     ScanSystemData::GetInstance().GetAddedScannerInfoList(allAddedScanner);
1471 #endif
1472     SCAN_HILOGI("ScanServiceAbility GetAddedScanner end");
1473     return E_SCAN_NONE;
1474 }
1475 
UpdateScannerName(const std::string & serialNumber,const std::string & discoverMode,const std::string & deviceName)1476 int32_t ScanServiceAbility::UpdateScannerName(const std::string& serialNumber,
1477     const std::string& discoverMode, const std::string& deviceName)
1478 {
1479     ManualStart();
1480     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1481         SCAN_HILOGE("no permission to access scan service");
1482         return E_SCAN_NO_PERMISSION;
1483     }
1484     SCAN_HILOGI("ScanServiceAbility UpdateScannerName start");
1485 
1486 #ifdef SANE_ENABLE
1487     std::string uniqueId = discoverMode + serialNumber;
1488     if (!ScanSystemData::GetInstance().UpdateScannerNameByUniqueId(uniqueId, deviceName)) {
1489         SCAN_HILOGE("ScanServiceAbility UpdateScannerNameByUniqueId fail");
1490         return E_SCAN_INVALID_PARAMETER;
1491     }
1492     if (!ScanSystemData::GetInstance().SaveScannerMap()) {
1493         SCAN_HILOGE("ScanServiceAbility UpdateScannerName SaveScannerMap fail");
1494         return E_SCAN_GENERIC_FAILURE;
1495     }
1496 #endif
1497     SCAN_HILOGI("ScanServiceAbility UpdateScannerName end");
1498     return E_SCAN_NONE;
1499 }
1500 
AddPrinter(const std::string & serialNumber,const std::string & discoverMode)1501 int32_t ScanServiceAbility::AddPrinter(const std::string& serialNumber, const std::string& discoverMode)
1502 {
1503     ManualStart();
1504     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1505         SCAN_HILOGE("no permission to access scan service");
1506         return E_SCAN_NO_PERMISSION;
1507     }
1508     auto exe = [=]() {
1509         AddScanner(serialNumber, discoverMode);
1510     };
1511     serviceHandler_->PostTask(exe, ASYNC_CMD_DELAY);
1512     return E_SCAN_NONE;
1513 }
1514 
OnStartScan(const std::string scannerId,const bool & batchMode)1515 int32_t ScanServiceAbility::OnStartScan(const std::string scannerId, const bool &batchMode)
1516 {
1517     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1518         SCAN_HILOGE("no permission to access scan service");
1519         return E_SCAN_NO_PERMISSION;
1520     }
1521     std::queue<int32_t> emptyQueue;
1522     scanQueue.swap(emptyQueue);
1523     int32_t status = StartScan(scannerId, batchMode_);
1524     if (status != E_SCAN_NONE) {
1525         SCAN_HILOGE("Start Scan error");
1526         return status;
1527     }
1528     batchMode_ = batchMode;
1529     g_scannerState = SCANNER_SCANING;
1530     auto exe = [=]() {
1531         StartScanTask(scannerId);
1532     };
1533     serviceHandler_->PostTask(exe, ASYNC_CMD_DELAY);
1534     SCAN_HILOGI("StartScan successfully");
1535     return E_SCAN_NONE;
1536 }
1537 
StartScan(const std::string scannerId,const bool & batchMode)1538 int32_t ScanServiceAbility::StartScan(const std::string scannerId, const bool &batchMode)
1539 {
1540     ManualStart();
1541     std::lock_guard<std::mutex> autoLock(lock_);
1542     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1543         SCAN_HILOGE("no permission to access scan service");
1544         return E_SCAN_NO_PERMISSION;
1545     }
1546     SCAN_HILOGI("ScanServiceAbility StartScan start");
1547 
1548 #ifdef SANE_ENABLE
1549     if (g_scannerState == SCANNER_CANCELING) {
1550         SCAN_HILOGE("scan task is canceling");
1551         return E_SCAN_DEVICE_BUSY;
1552     }
1553     auto scannerHandle = GetScanHandle(scannerId);
1554     if (scannerHandle == nullptr) {
1555         SCAN_HILOGE("ScanServiceAbility StartScan error exit");
1556         return E_SCAN_INVALID_PARAMETER;
1557     }
1558     SANE_Status saneStatus = sane_start(scannerHandle);
1559     if (saneStatus != SANE_STATUS_GOOD) {
1560         SCAN_HILOGE("sane_start failed, reason: [%{public}s], sane sane_cancel start", sane_strstatus(saneStatus));
1561         sane_cancel(scannerHandle);
1562         auto it = scanTaskMap.find(nextPicId);
1563         if (it != scanTaskMap.end() && it != scanTaskMap.begin()) {
1564             it--;
1565             (it->second).SetScanProgress(SCAN_PROGRESS_100);
1566         }
1567         return ScanUtil::ConvertErro(saneStatus);
1568     }
1569     ScanProgress prog;
1570     scanTaskMap[nextPicId] = prog;
1571     scanQueue.push(nextPicId);
1572     scanTaskMap[nextPicId].SetPictureId(nextPicId);
1573     auto nowTime = std::chrono::steady_clock::now();
1574     scanTaskMap[nextPicId].SetScanTime(nowTime);
1575     nextPicId++;
1576 #endif
1577     SCAN_HILOGI("ScanServiceAbility StartScan end");
1578     return E_SCAN_NONE;
1579 }
1580 
StartScanTask(const std::string scannerId)1581 void ScanServiceAbility::StartScanTask(const std::string scannerId)
1582 {
1583     SCAN_HILOGI("ScanServiceAbility StartScanTask start, batchMode_ = [%{public}d]", batchMode_);
1584     int32_t status = E_SCAN_NONE;
1585     std::string file_name;
1586     std::string output_file;
1587     ScanProgress* scanProPtr = nullptr;
1588     if (batchMode_) {
1589         SCAN_HILOGI("start batch mode scan");
1590         GeneratePictureBatch(scannerId, file_name, output_file, status, scanProPtr);
1591     } else {
1592         SCAN_HILOGI("start single mode scan");
1593         GeneratePictureSingle(scannerId, file_name, output_file, status, scanProPtr);
1594     }
1595     if (status != E_SCAN_NONE) {
1596         SCAN_HILOGI("ScanServiceAbility StartScanTask error, errorcode = [%{public}d]", status);
1597     }
1598     g_scannerState = SCANNER_READY;
1599     SCAN_HILOGI("ScanServiceAbility StartScanTask end");
1600 }
1601 
GeneratePictureBatch(const std::string & scannerId,std::string & file_name,std::string & output_file,int32_t & status,ScanProgress * & scanProPtr)1602 void ScanServiceAbility::GeneratePictureBatch(const std::string &scannerId, std::string &file_name,
1603     std::string &output_file, int32_t &status, ScanProgress* &scanProPtr)
1604 {
1605     bool firstScan = true;
1606     do {
1607         if (!firstScan) {
1608             SCAN_HILOGI("not first scan");
1609             status = StartScan(scannerId, batchMode_);
1610             if (status != E_SCAN_NONE) {
1611                 SCAN_HILOGE("ScanTask restart fail");
1612                 break;
1613             }
1614             auto it = scanTaskMap.find(nextPicId - 2); // nextPicId - 2 is to find a PicId before nowScanId.
1615             (it->second).SetIsFinal(false);
1616             it->second.SetScanProgress(SCAN_PROGRESS_100);
1617             SCAN_HILOGI("ScanTask restart success, status:[%{public}d]", status);
1618         }
1619         auto it = scanTaskMap.find(nextPicId - 1);
1620         int32_t nowScanId = it->first;
1621         file_name = "scan_tmp" + std::to_string(nowScanId) + ".jpg";
1622         std::string outputDir = "/data/service/el2/public/print_service/sane/tmp/";
1623         output_file = outputDir.append(file_name);
1624         ofp = fopen(output_file.c_str(), "w");
1625         if (ofp == nullptr) {
1626             SCAN_HILOGE("file [%{public}s] open fail", output_file.c_str());
1627             return;
1628         }
1629         scanProPtr = &(scanTaskMap[nowScanId]);
1630 #ifdef SANE_ENABLE
1631         status = DoScanTask(scannerId, scanProPtr);
1632 #endif
1633         if (ofp != nullptr) {
1634             fclose(ofp);
1635             ofp = nullptr;
1636         }
1637         scanProPtr->SetImageRealPath(output_file);
1638         firstScan = false;
1639     } while (status == E_SCAN_EOF);
1640     if (status == E_SCAN_NO_DOCS) {
1641         auto it = scanTaskMap.find(nextPicId - 1);
1642         it->second.SetScanProgress(SCAN_PROGRESS_100);
1643         SCAN_HILOGI("ScanTask batch mode exit successfully.");
1644     } else {
1645         SCAN_HILOGE("ScanTask error exit[%{public}d]", status);
1646     }
1647 }
1648 
GeneratePictureSingle(const std::string & scannerId,std::string & file_name,std::string & output_file,int32_t & status,ScanProgress * & scanProPtr)1649 void ScanServiceAbility::GeneratePictureSingle(const std::string &scannerId, std::string &file_name,
1650     std::string &output_file, int32_t &status, ScanProgress* &scanProPtr)
1651 {
1652     auto it = scanTaskMap.find(nextPicId - 1);
1653     int32_t nowScanId = it->first;
1654     file_name = "scan_tmp" + std::to_string(nowScanId) + ".jpg";
1655     std::string outputDir = "/data/service/el2/public/print_service/sane/tmp/";
1656     output_file = outputDir.append(file_name);
1657     ofp = fopen(output_file.c_str(), "w");
1658     if (ofp == nullptr) {
1659         SCAN_HILOGE("file [%{public}s] open fail", output_file.c_str());
1660         return;
1661     }
1662     scanProPtr = &(scanTaskMap[nowScanId]);
1663 #ifdef SANE_ENABLE
1664     status = DoScanTask(scannerId, scanProPtr);
1665 #endif
1666     if (status == E_SCAN_EOF) {
1667         scanProPtr->SetImageRealPath(output_file);
1668         scanProPtr->SetScanProgress(SCAN_PROGRESS_100);
1669     } else {
1670         SCAN_HILOGE("ScanTask error exit[%{public}d]", status);
1671     }
1672     if (ofp != nullptr) {
1673         fclose(ofp);
1674         ofp = nullptr;
1675     }
1676     {
1677         std::lock_guard<std::mutex> autoLock(lock_);
1678 #ifdef SANE_ENABLE
1679         SANE_Handle scannerHandle = GetScanHandle(scannerId);
1680         if (scannerHandle != nullptr) {
1681             SCAN_HILOGI("GeneratePictureSingle finished, doing sane_cancel");
1682             sane_cancel(scannerHandle);
1683         }
1684 #endif
1685     }
1686 }
1687 
1688 #ifdef SANE_ENABLE
DoScanTask(const std::string scannerId,ScanProgress * scanProPtr)1689 int32_t ScanServiceAbility::DoScanTask(const std::string scannerId, ScanProgress* scanProPtr)
1690 {
1691     int32_t first_frame = 1;
1692     int32_t scanStatus = E_SCAN_NONE;
1693     ScanParameters parm;
1694     struct jpeg_error_mgr jerr;
1695     do {
1696         SCAN_HILOGI("start DoScanTask");
1697         if (!first_frame) {
1698             scanStatus = StartScan(scannerId, batchMode_);
1699             if (scanStatus != E_SCAN_NONE) {
1700                 SCAN_HILOGE("StartScanTask error exit after StartScan");
1701                 return scanStatus;
1702             }
1703         }
1704         scanStatus = GetScanParameters(scannerId, parm);
1705         if (scanStatus != E_SCAN_NONE) {
1706             SCAN_HILOGE("cyclicCallExe error exit after GetScanParameters");
1707             return scanStatus;
1708         }
1709         if (first_frame) {
1710             scanStatus = WriteJpegHeader(parm, &jerr);
1711             if (scanStatus != E_SCAN_NONE) {
1712                 SCAN_HILOGE("StartScanTask error exit after WriteJpegHeader");
1713                 return scanStatus;
1714             }
1715             jpegbuf = (JSAMPLE*)malloc(parm.GetBytesPerLine());
1716             if (jpegbuf == nullptr) {
1717                 SCAN_HILOGE("jpegbuf malloc fail");
1718                 return E_SCAN_GENERIC_FAILURE;
1719             }
1720         }
1721         GetPicFrame(scannerId, scanProPtr, scanStatus, parm);
1722         if (g_scannerState == SCANNER_CANCELING) {
1723             SCAN_HILOGE("DoScanTask cancel");
1724             FREE_AND_NULLPTR(jpegbuf)
1725             return E_SCAN_NONE;
1726         }
1727         if (scanStatus != E_SCAN_GOOD && scanStatus != E_SCAN_EOF) {
1728             SCAN_HILOGE("get scanframe fail");
1729             FREE_AND_NULLPTR(jpegbuf)
1730             return E_SCAN_NONE;
1731         }
1732         first_frame = 0;
1733     } while (!(parm.GetLastFrame()));
1734     jpeg_finish_compress(&cinfo);
1735     fflush(ofp);
1736     FREE_AND_NULLPTR(jpegbuf)
1737     SCAN_HILOGI("end DoScanTask");
1738     return scanStatus;
1739 }
1740 #endif
1741 
WriteJpegHeader(ScanParameters & parm,struct jpeg_error_mgr * jerr)1742 int32_t ScanServiceAbility::WriteJpegHeader(ScanParameters &parm, struct jpeg_error_mgr* jerr)
1743 {
1744     ScanFrame format = parm.GetFormat();
1745     int32_t width = parm.GetPixelsPerLine();
1746     int32_t height = parm.GetLines();
1747     struct jpeg_compress_struct* cinfoPtr = &cinfo;
1748     cinfoPtr->err = jpeg_std_error(jerr);
1749     cinfoPtr->err->error_exit = [](j_common_ptr cinfo) {
1750         g_isJpegWriteSuccess = false;
1751     };
1752     g_isJpegWriteSuccess = true;
1753     jpeg_create_compress(cinfoPtr);
1754     jpeg_stdio_dest(cinfoPtr, ofp);
1755 
1756     cinfoPtr->image_width = (JDIMENSION)width;
1757     cinfoPtr->image_height = (JDIMENSION)height;
1758     if (format == SCAN_FRAME_RGB) {
1759         cinfoPtr->in_color_space = JCS_RGB;
1760         cinfoPtr->input_components = CHANNEL_THREE;
1761         SCAN_HILOGI("generate RGB picture");
1762     } else if (format == SCAN_FRAME_GRAY) {
1763         cinfoPtr->in_color_space = JCS_GRAYSCALE;
1764         cinfoPtr->input_components = CHANNEL_ONE;
1765         SCAN_HILOGI("generate gray picture");
1766     } else {
1767         SCAN_HILOGE("not support this color");
1768         return E_SCAN_INVALID_PARAMETER;
1769     }
1770     jpeg_set_defaults(cinfoPtr);
1771     cinfoPtr->density_unit = 1;
1772     cinfoPtr->X_density = dpi;
1773     cinfoPtr->Y_density = dpi;
1774     cinfoPtr->write_JFIF_header = TRUE;
1775     SCAN_HILOGI("width:[%{public}d],height:[%{public}d],dpi:[%{public}d]", width, height, dpi);
1776     jpeg_set_quality(cinfoPtr, JPEG_QUALITY_SEVENTY_FIVE, TRUE);
1777     jpeg_start_compress(cinfoPtr, TRUE);
1778     cinfoPtr = nullptr;
1779     SCAN_HILOGI("finish write jpegHeader");
1780     return E_SCAN_NONE;
1781 }
1782 
CleanScanTask(const std::string & scannerId)1783 void ScanServiceAbility::CleanScanTask(const std::string &scannerId)
1784 {
1785     CancelScan(scannerId);
1786     scanTaskMap.clear();
1787     g_hasIoFaild = true;
1788 }
1789 
1790 #ifdef SANE_ENABLE
GetPicFrame(const std::string scannerId,ScanProgress * scanProPtr,int32_t & scanStatus,ScanParameters & parm)1791 void ScanServiceAbility::GetPicFrame(const std::string scannerId, ScanProgress *scanProPtr,
1792     int32_t &scanStatus, ScanParameters &parm)
1793 {
1794     int32_t curReadSize = 0;
1795     int64_t totalBytes = 0;
1796     int jpegrow = 0;
1797     SANE_Handle scannerHandle = GetScanHandle(scannerId);
1798     int64_t hundred_percent = ((int64_t)parm.GetBytesPerLine()) * parm.GetLines() * (((SANE_Frame)parm.GetFormat()
1799         == SANE_FRAME_RGB || (SANE_Frame)parm.GetFormat() == SANE_FRAME_GRAY) ?  CHANNEL_ONE : CHANNEL_THREE);
1800     if (hundred_percent == 0) {
1801         scanStatus = E_SCAN_INVAL;
1802         return;
1803     }
1804     while (true) {
1805         SANE_Status saneStatus = sane_read(scannerHandle, saneReadBuf, buffer_size, &curReadSize);
1806         scanStatus = ScanUtil::ConvertErro(saneStatus);
1807         totalBytes += (int64_t)curReadSize;
1808         int64_t progr = ((totalBytes * SCAN_PROGRESS_100) / hundred_percent);
1809         if (progr >= SCAN_PROGRESS_100)
1810             progr = SCAN_PROGRESS_100 - 1;
1811         if (progr > (scanProPtr->GetScanProgress())) {
1812             scanProPtr->SetScanProgress((int32_t)progr);
1813         }
1814         SCAN_HILOGI(" %{public}ld bytes ; scan progr:%{public}lu", totalBytes, progr);
1815         if (g_scannerState == SCANNER_CANCELING) {
1816             std::queue<int32_t> emptyQueue;
1817             scanQueue.swap(emptyQueue);
1818             nextPicId--;
1819             scanTaskMap.erase(nextPicId);
1820             scanStatus = E_SCAN_NONE;
1821             SCAN_HILOGE("scan task is canceled");
1822             return;
1823         }
1824         if (saneStatus == SANE_STATUS_EOF) {
1825             SCAN_HILOGI("Totally read %{public}ld bytes of frame data", totalBytes);
1826             break;
1827         }
1828         if (saneStatus != SANE_STATUS_GOOD) {
1829             SCAN_HILOGE("sane_read failed, reason: [%{public}s]", sane_strstatus(saneStatus));
1830             ScanErrorCode taskCode = ScanUtil::ConvertErro(saneStatus);
1831             scanProPtr->SetTaskCode(taskCode);
1832             if (taskCode == E_SCAN_IO_ERROR) {
1833                 CleanScanTask(scannerId);
1834             }
1835             break;
1836         }
1837 
1838         if (!WritePicData(jpegrow, curReadSize, parm, scanProPtr)) {
1839             SCAN_HILOGI("WritePicData fail");
1840             return;
1841         }
1842     }
1843 }
1844 #endif
1845 
WritePicData(int & jpegrow,int32_t curReadSize,ScanParameters & parm,ScanProgress * scanProPtr)1846 bool ScanServiceAbility::WritePicData(int &jpegrow, int32_t curReadSize, ScanParameters &parm, ScanProgress *scanProPtr)
1847 {
1848     SCAN_HILOGI("start write jpeg picture data");
1849     constexpr int bit = 1;
1850     int i = 0;
1851     int left = curReadSize;
1852     while (jpegrow + left >= parm.GetBytesPerLine()) {
1853         if (!g_isJpegWriteSuccess) {
1854             scanProPtr->SetTaskCode(E_SCAN_NO_MEM);
1855             return false;
1856         }
1857         int ret = memcpy_s(jpegbuf + jpegrow, parm.GetBytesPerLine(),
1858             saneReadBuf + i, parm.GetBytesPerLine() - jpegrow);
1859         if (ret != ERR_OK) {
1860             scanProPtr->SetTaskCode(E_SCAN_GENERIC_FAILURE);
1861             SCAN_HILOGE("memcpy_s failed");
1862             return false;
1863         }
1864         if (parm.GetDepth() != 1) {
1865             jpeg_write_scanlines(&cinfo, &jpegbuf, bit);
1866             i += parm.GetBytesPerLine() - jpegrow;
1867             left -= parm.GetBytesPerLine() - jpegrow;
1868             jpegrow = 0;
1869             continue;
1870         }
1871         constexpr int byteBits = 8;
1872         JSAMPLE *buf8 = (JSAMPLE *)malloc(parm.GetBytesPerLine() * byteBits);
1873         if (buf8 == nullptr) {
1874             scanProPtr->SetTaskCode(E_SCAN_GENERIC_FAILURE);
1875             SCAN_HILOGE("pic buffer malloc fail");
1876             return false;
1877         }
1878         for (int col1 = 0; col1 < parm.GetBytesPerLine(); col1++) {
1879             for (int col8 = 0; col8 < byteBits; col8++) {
1880                 buf8[col1 * byteBits + col8] = jpegbuf[col1] & (1 << (byteBits - col8 - 1)) ? 0 : 0xff;
1881                 jpeg_write_scanlines(&cinfo, &buf8, byteBits);
1882             }
1883         }
1884         free(buf8);
1885         i += parm.GetBytesPerLine() - jpegrow;
1886         left -= parm.GetBytesPerLine() - jpegrow;
1887         jpegrow = 0;
1888     }
1889     if (memcpy_s(jpegbuf + jpegrow, parm.GetBytesPerLine(), saneReadBuf + i, left) != ERR_OK) {
1890         SCAN_HILOGE("memcpy_s failed");
1891         return false;
1892     }
1893     jpegrow += left;
1894     SCAN_HILOGI("finish write jpeg picture data");
1895     return true;
1896 }
1897 }  // namespace OHOS::Scan