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