• 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 "scan_service_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 #include "sane_manager_client.h"
53 #include "sane_option_descriptor.h"
54 #include "sane_device.h"
55 #include "sane_control_param.h"
56 #include "sane_picture_data.h"
57 #include "scan_log.h"
58 #include "os_account_manager.h"
59 
60 namespace OHOS::Scan {
61 namespace {
GetElapsedSeconds(const SteadyTimePoint & preTime)62 static int32_t GetElapsedSeconds(const SteadyTimePoint& preTime)
63 {
64     auto nowTime = std::chrono::steady_clock::now();
65     auto elapsedTime = std::chrono::duration_cast<std::chrono::seconds>(nowTime - preTime);
66     return elapsedTime.count();
67 }
68 
GetRandomNumber(const int32_t & lowerBoundary,const int32_t & upperBoundary)69 static int32_t GetRandomNumber(const int32_t& lowerBoundary, const int32_t& upperBoundary)
70 {
71     std::random_device rd;
72     std::mt19937 gen(rd());
73     std::uniform_int_distribution<> dis(lowerBoundary, upperBoundary);
74     return dis(gen);
75 }
76 
GetLastWord(const std::string & str)77 static std::string GetLastWord(const std::string& str)
78 {
79     size_t pos = str.find_last_of(' ');
80     if (pos == std::string::npos) {
81         return str;
82     }
83     return str.substr(pos + 1);
84 }
85 };
86 using namespace std;
87 using namespace OHOS::HiviewDFX;
88 using namespace Security::AccessToken;
89 using SteadyTimePoint = std::chrono::steady_clock::time_point;
90 
91 constexpr int ONE_KB = 1024; // default buffersize 1KB
92 constexpr int SCAN_PROGRESS_100 = 100;
93 constexpr int SCAN_PROGRESS_10 = 10;
94 constexpr int SCAN_PROGRESS_19 = 19;
95 constexpr int SCAN_PROGRESS_80 = 80;
96 constexpr int JPEG_QUALITY_SEVENTY_FIVE = 75;
97 constexpr int CHANNEL_ONE = 1;
98 constexpr int CHANNEL_THREE = 3;
99 const int64_t INIT_INTERVAL = 5000L;
100 const uint32_t ASYNC_CMD_DELAY = 10;
101 const int64_t UNLOAD_SYSTEMABILITY_DELAY = 1000 * 30;
102 constexpr int32_t INVALID_USER_ID = -1;
103 
104 static int32_t g_scannerState = SCANNER_READY;
105 static bool g_isJpegWriteSuccess = false;
106 static const std::string PERMISSION_NAME_SCAN = "ohos.permission.SCAN";
107 static const std::string PERMISSION_NAME_SCAN_JOB = "ohos.permission.MANAGE_SCAN_JOB";
108 static const std::string PERMISSION_NAME_PRINT = "ohos.permission.PRINT";
109 static const std::string SCAN_DEVICE_FOUND_TCP = "scanDeviceFoundTCP";
110 static const std::string SCAN_DEVICE_FOUND = "scanDeviceFound";
111 static const std::string SCAN_DEVICE_SYNC = "scanDeviceSync";
112 static const std::string SCAN_DEVICE_ADD = "scanDeviceAdd";
113 static const std::string SCAN_DEVICE_DEL = "scanDeviceDel";
114 static const std::string SCAN_INIT_EVENT = "scanInitEvent";
115 
116 static const std::string DEVICE_EVENT_TYPE = "deviceStateChange";
117 static const std::string GET_SCANNER_DEVICE_LIST = "GET_SCANNER_DEVICE_LIST";
118 
119 std::map<std::string, sptr<IScanCallback>> OHOS::Scan::ScanServiceAbility::registeredListeners_;
120 
121 REGISTER_SYSTEM_ABILITY_BY_ID(ScanServiceAbility, SCAN_SERVICE_ID, true);
122 
123 std::mutex ScanServiceAbility::instanceLock_;
124 sptr<ScanServiceAbility> ScanServiceAbility::instance_;
125 std::shared_ptr<AppExecFwk::EventHandler> ScanServiceAbility::serviceHandler_;
126 std::map<std::string, ScanDeviceInfo> ScanServiceAbility::saneGetUsbDeviceInfoMap;
127 std::map<std::string, ScanDeviceInfo> ScanServiceAbility::saneGetTcpDeviceInfoMap;
128 
ScanServiceAbility(int32_t systemAbilityId,bool runOnCreate)129 ScanServiceAbility::ScanServiceAbility(int32_t systemAbilityId, bool runOnCreate)
130     : SystemAbility(systemAbilityId, runOnCreate), state_(ServiceRunningState::STATE_NOT_START),
131     currentJobId_(SCAN_CONSTRAINT_NONE), currentUseScannerUserId_(INVALID_USER_ID)
132 {
133     constexpr int32_t oneHundred = 100;
134     buffer_size = ONE_KB * oneHundred;
135     saneReadBuf = static_cast<uint8_t *>(malloc(buffer_size));
136     cinfoPtr = new (std::nothrow) jpeg_compress_struct();
137     if (cinfoPtr == nullptr) {
138         SCAN_HILOGE("cinfoPtr allocated failed");
139         return;
140     }
141     cinfoPtr->comps_in_scan = 0;
142 }
143 
~ScanServiceAbility()144 ScanServiceAbility::~ScanServiceAbility()
145 {
146     FREE_AND_NULLPTR(saneReadBuf);
147     DELETE_ARRAY_AND_NULLIFY(jpegbuf)
148     DELETE_AND_NULLIFY(cinfoPtr);
149     DELETE_AND_NULLIFY(ofp);
150     SCAN_HILOGD("~ScanServiceAbility state_  is %{public}d.", static_cast<int>(state_));
151 }
152 
GetInstance()153 sptr<ScanServiceAbility> ScanServiceAbility::GetInstance()
154 {
155     if (instance_ == nullptr) {
156         std::lock_guard<std::mutex> autoLock(instanceLock_);
157         if (instance_ == nullptr) {
158             instance_ = new ScanServiceAbility(SCAN_SERVICE_ID, true);
159         }
160     }
161     return instance_;
162 }
163 
ServiceInit()164 int32_t ScanServiceAbility::ServiceInit()
165 {
166     bool ret = Publish(ScanServiceAbility::GetInstance());
167     if (!ret) {
168         SCAN_HILOGE("ScanServiceAbility Publish failed.");
169         return E_SCAN_SERVER_FAILURE;
170     }
171     state_ = ServiceRunningState::STATE_RUNNING;
172     SCAN_HILOGD("state_ is %{public}d.", static_cast<int>(state_));
173     SCAN_HILOGI("Init ScanServiceAbility success.");
174     return ERR_OK;
175 }
176 
OnStart()177 void ScanServiceAbility::OnStart()
178 {
179     SCAN_HILOGI("ScanServiceAbility::Enter OnStart.");
180     if (instance_ == nullptr) {
181         instance_ = this;
182     }
183     if (state_ == ServiceRunningState::STATE_RUNNING) {
184         SCAN_HILOGI("ScanServiceAbility is already running.");
185         return;
186     }
187 
188     InitServiceHandler();
189     int32_t ret = ServiceInit();
190     if (ret != ERR_OK) {
191         auto callback = [=]() { ServiceInit(); };
192         serviceHandler_->PostTask(callback, INIT_INTERVAL);
193         SCAN_HILOGE("ScanServiceAbility Init failed. Try again 5s later");
194         return;
195     }
196     state_ = ServiceRunningState::STATE_RUNNING;
197     return;
198 }
199 
InitServiceHandler()200 void ScanServiceAbility::InitServiceHandler()
201 {
202     SCAN_HILOGI("InitServiceHandler started.");
203     if (serviceHandler_ != nullptr) {
204         SCAN_HILOGI("InitServiceHandler already init.");
205         return;
206     }
207     std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create("ScanServiceAbility");
208     serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
209     SCAN_HILOGI("InitServiceHandler succeeded.");
210 }
211 
ManualStart()212 void ScanServiceAbility::ManualStart()
213 {
214     if (state_ != ServiceRunningState::STATE_RUNNING) {
215         SCAN_HILOGI("ScanServiceAbility restart.");
216         OnStart();
217     }
218 }
219 
OnStop()220 void ScanServiceAbility::OnStop()
221 {
222     SCAN_HILOGI("OnStop started.");
223     if (state_ != ServiceRunningState::STATE_RUNNING) {
224         SCAN_HILOGW("service is not running");
225         return;
226     }
227     serviceHandler_ = nullptr;
228     state_ = ServiceRunningState::STATE_NOT_START;
229     SCAN_HILOGI("OnStop end.");
230 }
UnloadSystemAbility()231 void ScanServiceAbility::UnloadSystemAbility()
232 {
233     auto unloadTask = [this]() {
234         if (appCount_.load() != 0) {
235             SCAN_HILOGW("appCount = %{public}d is not equal to zerro", appCount_.load());
236             return;
237         }
238         SaneManagerClient::GetInstance()->UnloadSystemAbility();
239         auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
240         if (samgrProxy == nullptr) {
241             SCAN_HILOGE("get samgr failed");
242             return;
243         }
244         int32_t ret = samgrProxy->UnloadSystemAbility(SCAN_SERVICE_ID);
245         if (ret != ERR_OK) {
246             SCAN_HILOGE("unload scan_service failed");
247             return;
248         }
249         SCAN_HILOGI("unload scan_service successfully");
250     };
251     serviceHandler_->PostTask(unloadTask, UNLOAD_SYSTEMABILITY_DELAY);
252 }
253 
InitScan()254 int32_t ScanServiceAbility::InitScan()
255 {
256     ManualStart();
257     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
258         SCAN_HILOGE("no permission to access scan service");
259         return E_SCAN_NO_PERMISSION;
260     }
261     if (appCount_.load() == 0) {
262         InitializeScanService();
263     }
264     appCount_.fetch_add(1);
265     SCAN_HILOGD("appCount = %{public}d", appCount_.load());
266     return E_SCAN_NONE;
267 }
268 
ExitScan()269 int32_t ScanServiceAbility::ExitScan()
270 {
271     ManualStart();
272     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
273         SCAN_HILOGE("no permission to access scan service");
274         return E_SCAN_NO_PERMISSION;
275     }
276     appCount_.fetch_sub(1);
277     SCAN_HILOGD("appCount = %{public}d", appCount_.load());
278     if (appCount_.load() == 0) {
279         CleanupScanService();
280         UnloadSystemAbility();
281     }
282     return E_SCAN_NONE;
283 }
284 
InitializeScanService()285 void ScanServiceAbility::InitializeScanService()
286 {
287     SaneManagerClient::GetInstance()->SaneInit();
288     DelayedSingleton<ScanUsbManager>::GetInstance()->Init();
289     ScanSystemData::GetInstance().Init();
290     ScanMdnsService::OnStartDiscoverService();
291 }
292 
CleanupScanService()293 void ScanServiceAbility::CleanupScanService()
294 {
295     std::lock_guard<std::mutex> autoLock(lock_);
296     for (const auto& scannerId : openedScannerList_) {
297         SaneManagerClient::GetInstance()->SaneCancel(scannerId);
298         SaneManagerClient::GetInstance()->SaneClose(scannerId);
299     }
300     openedScannerList_.clear();
301     SaneManagerClient::GetInstance()->SaneExit();
302     ScanMdnsService::OnStopDiscoverService();
303     g_scannerState = SCANNER_READY;
304     std::queue<int32_t> empty;
305     scanQueue.swap(empty);
306     scanTaskMap.clear();
307     for (const auto& [imagePath, fd] : imageFdMap_) {
308         constexpr int32_t INVALID_FILE_DESCRIPTOR = -1;
309         if (fd != INVALID_FILE_DESCRIPTOR) {
310             fdsan_close_with_tag(fd, SCAN_LOG_DOMAIN);
311         }
312         if (FileExists(imagePath)) {
313             unlink(imagePath.c_str());
314         }
315     }
316     imageFdMap_.clear();
317 }
318 
GetUsbDevicePort(const std::string & deviceId,std::string & firstId,std::string & secondId)319 bool ScanServiceAbility::GetUsbDevicePort(const std::string &deviceId, std::string &firstId, std::string &secondId)
320 {
321     static const std::regex pattern(R"(([a-zA-Z0-9_]+):(libusb):([0-9]{3}):([0-9]{3}))");
322     std::smatch match;
323     constexpr size_t STRING_POS_THREE = 3;
324     constexpr size_t STRING_POS_FOUR = 4;
325     if (!std::regex_match(deviceId, match, pattern) || match.size() <= STRING_POS_FOUR) {
326         SCAN_HILOGE("In USB mode, the deviceId string format does not match");
327         return false;
328     }
329     const std::string firstIdTmp = match[STRING_POS_THREE].str();
330     const std::string secondIdTmp = match[STRING_POS_FOUR].str();
331     int32_t firstNumTmp = 0;
332     int32_t secondNumTmp = 0;
333     if (!ScanUtil::ConvertToInt(firstIdTmp, firstNumTmp) ||
334         !ScanUtil::ConvertToInt(secondIdTmp, secondNumTmp)) {
335         SCAN_HILOGE("parse [%{public}s]:[%{public}s] fail", firstIdTmp.c_str(), secondIdTmp.c_str());
336         return false;
337     }
338     firstId = std::to_string(firstNumTmp);
339     secondId = std::to_string(secondNumTmp);
340     return true;
341 }
342 
GetTcpDeviceIp(const std::string & deviceId,std::string & ip)343 bool ScanServiceAbility::GetTcpDeviceIp(const std::string &deviceId, std::string &ip)
344 {
345     static const std::regex pattern(R"(([^ ]+) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) ([^ ]+))");
346     std::smatch match;
347     if (std::regex_match(deviceId, match, pattern)) {
348         constexpr size_t STRING_POS_TWO = 2;
349         ip = match[STRING_POS_TWO];
350         return true;
351     } else {
352         SCAN_HILOGE("In TCP mode, the deviceId string format does not match");
353         return false;
354     }
355 }
356 
SetScannerSerialNumberByTCP(ScanDeviceInfo & info)357 void ScanServiceAbility::SetScannerSerialNumberByTCP(ScanDeviceInfo &info)
358 {
359     info.discoverMode = "TCP";
360     std::string ip;
361     if (!GetTcpDeviceIp(info.deviceId, ip)) {
362         SCAN_HILOGE("cannot get device's ip");
363         return;
364     }
365     int32_t count = 0;
366     constexpr int32_t MAX_WAIT_COUNT = 5;
367     constexpr int32_t WAIT_TIME = 1;
368     ScanDeviceInfoTCP netScannerInfo;
369     bool findNetScannerInfoByIp = ScanMdnsService::FindNetScannerInfoByIp(ip, netScannerInfo);
370     do {
371         sleep(WAIT_TIME);
372         SCAN_HILOGW("wait a second");
373         findNetScannerInfoByIp = ScanMdnsService::FindNetScannerInfoByIp(ip, netScannerInfo);
374         count++;
375     } while (!findNetScannerInfoByIp && count < MAX_WAIT_COUNT);
376     info.uniqueId = ip;
377     if (findNetScannerInfoByIp) {
378         info.serialNumber = GetLastWord(netScannerInfo.deviceName);
379         info.uuid = netScannerInfo.uuid;
380         info.deviceName = netScannerInfo.deviceName;
381     } else {
382         info.deviceName = info.manufacturer + "-" + info.model;
383     }
384 }
385 
SetScannerSerialNumberByUSB(ScanDeviceInfo & info)386 void ScanServiceAbility::SetScannerSerialNumberByUSB(ScanDeviceInfo &info)
387 {
388     info.discoverMode = "USB";
389     std::string firstId;
390     std::string secondId;
391     if (!GetUsbDevicePort(info.deviceId, firstId, secondId)) {
392         SCAN_HILOGE("cannot get usb's port");
393         return;
394     }
395     std::string usbScannerPort = firstId + "-" + secondId;
396     auto scanUsbManager = DelayedSingleton<ScanUsbManager>::GetInstance();
397     if (scanUsbManager == nullptr) {
398         SCAN_HILOGE("scanUsbManager is nullptr");
399         return;
400     }
401     std::string serialNumber = scanUsbManager->GetSerialNumberByPort(usbScannerPort);
402     if (serialNumber.empty() && !scanUsbManager->IsDeviceAvailable(firstId, secondId)) {
403         SCAN_HILOGD("usb can't find device: %{private}s", usbScannerPort.c_str());
404         info.SetDeviceAvailable(false);
405         return;
406     }
407     if (serialNumber.empty()) {
408         std::ostringstream oss;
409         oss << "USB-" << info.manufacturer << " " << info.model << " " << usbScannerPort;
410         info.deviceName = oss.str();
411     } else {
412         info.serialNumber = serialNumber;
413         info.uniqueId = serialNumber;
414         info.deviceName = scanUsbManager->GetScannerNameBySn(serialNumber);
415     }
416 }
417 
SetScannerSerialNumber(ScanDeviceInfo & info)418 void ScanServiceAbility::SetScannerSerialNumber(ScanDeviceInfo &info)
419 {
420     if (info.deviceId.find(":tcp") != info.deviceId.npos) {
421         SetScannerSerialNumberByTCP(info);
422     } else if (info.deviceId.find(":libusb") != info.deviceId.npos) {
423         SetScannerSerialNumberByUSB(info);
424     }  else {
425         SCAN_HILOGE("Unknown scanner connect method");
426     }
427 }
428 
AddFoundScanner(ScanDeviceInfo & info)429 void ScanServiceAbility::AddFoundScanner(ScanDeviceInfo& info)
430 {
431     std::lock_guard<std::mutex> autoLock(clearMapLock_);
432     if (info.GetDeviceAvailable() == false) {
433         SCAN_HILOGE("device is unavailable");
434         return;
435     }
436     if (info.discoverMode != "USB" && info.discoverMode != "TCP") {
437         SCAN_HILOGE("discoverMode is invalid:[%{public}s]", info.discoverMode.c_str());
438         return;
439     }
440     std::map<std::string, ScanDeviceInfo>& deviceMap = info.discoverMode == "USB" ?
441         saneGetUsbDeviceInfoMap : saneGetTcpDeviceInfoMap;
442     if (info.uniqueId.empty()) {
443         info.uniqueId = info.deviceId;
444     } else {
445         std::string uniqueId = info.discoverMode + info.uniqueId;
446         ScanSystemData& scanData = ScanSystemData::GetInstance();
447         if (info.discoverMode == "USB") {
448             scanData.UpdateScannerInfoByUniqueId(uniqueId, info);
449         } else {
450             scanData.UpdateNetScannerByUuid(info.uuid, info.uniqueId);
451         }
452         scanData.SaveScannerMap();
453     }
454     deviceMap[info.uniqueId] = info;
455 }
456 
SaneGetScanner()457 void ScanServiceAbility::SaneGetScanner()
458 {
459     std::lock_guard<std::mutex> autoLock(lock_);
460     clearMapLock_.lock();
461     saneGetTcpDeviceInfoMap.clear();
462     saneGetUsbDeviceInfoMap.clear();
463     clearMapLock_.unlock();
464     g_scannerState = SCANNER_SEARCHING;
465     std::vector<SaneDevice> deviceInfos;
466     SaneStatus status = SaneManagerClient::GetInstance()->SaneGetDevices(deviceInfos);
467     if (status != SANE_STATUS_GOOD) {
468         SCAN_HILOGE("SaneGetDevices failed, ret: [%{public}u]", status);
469         g_scannerState = SCANNER_READY;
470         return;
471     }
472     for (const auto& device: deviceInfos) {
473         ScanDeviceInfo info;
474         info.deviceId = device.name_;
475         info.manufacturer = device.vendor_;
476         info.model = device.model_;
477         info.deviceType = device.type_;
478         SetScannerSerialNumber(info);
479         AddFoundScanner(info);
480     }
481     clearMapLock_.lock();
482     for (auto &t : saneGetUsbDeviceInfoMap) {
483         SendDeviceInfo(t.second, SCAN_DEVICE_FOUND);
484         deviceInfos_.emplace_back(t.second);
485     }
486     for (auto &t : saneGetTcpDeviceInfoMap) {
487         SendDeviceInfo(t.second, SCAN_DEVICE_FOUND);
488         deviceInfos_.emplace_back(t.second);
489     }
490     clearMapLock_.unlock();
491     g_scannerState = SCANNER_READY;
492 }
493 
GetScannerList()494 int32_t ScanServiceAbility::GetScannerList()
495 {
496     ManualStart();
497     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
498         return E_SCAN_NO_PERMISSION;
499     }
500     if (g_scannerState != SCANNER_READY) {
501         SCAN_HILOGW("is working");
502         return E_SCAN_DEVICE_BUSY;
503     }
504     CleanupScanService();
505     InitializeScanService();
506     SCAN_HILOGD("ScanServiceAbility GetScannerList start");
507     std::lock_guard<std::mutex> autoLock(lock_);
508     auto exec_sane_getscaner = [=]() {
509         deviceInfos_.clear();
510         SaneGetScanner();
511         SendDeviceList(deviceInfos_, GET_SCANNER_DEVICE_LIST);
512     };
513     serviceHandler_->PostTask(exec_sane_getscaner, ASYNC_CMD_DELAY);
514     SCAN_HILOGD("ScanServiceAbility GetScannerList end");
515     return E_SCAN_NONE;
516 }
517 
OpenScanner(const std::string scannerId)518 int32_t ScanServiceAbility::OpenScanner(const std::string scannerId)
519 {
520     ManualStart();
521     std::lock_guard<std::mutex> autoLock(lock_);
522     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
523         SCAN_HILOGE("no permission to access scan service");
524         return E_SCAN_NO_PERMISSION;
525     }
526     SCAN_HILOGI("ScanServiceAbility OpenScanner start");
527     if (scannerId.empty()) {
528         SCAN_HILOGE("OpenScanner scannerId is empty");
529         return E_SCAN_INVALID_PARAMETER;
530     }
531     if (openedScannerList_.find(scannerId) != openedScannerList_.end()) {
532         SCAN_HILOGD("scannerId %{private}s is already opened", scannerId.c_str());
533         return E_SCAN_NONE;
534     }
535     SaneStatus status = SaneManagerClient::GetInstance()->SaneOpen(scannerId);
536     if (status != SANE_STATUS_GOOD) {
537         SCAN_HILOGE("sane_open failed, ret: [%{public}u], retry one times", status);
538         status = SaneManagerClient::GetInstance()->SaneOpen(scannerId);
539     }
540 
541     if (status != SANE_STATUS_GOOD) {
542         SCAN_HILOGE("SaneOpen failed, status: [%{public}u]", status);
543         return ScanServiceUtils::ConvertErro(status);
544     }
545     openedScannerList_.insert(scannerId);
546     SCAN_HILOGI("ScanServiceAbility OpenScanner end");
547     return E_SCAN_NONE;
548 }
549 
CloseScanner(const std::string scannerId)550 int32_t ScanServiceAbility::CloseScanner(const std::string scannerId)
551 {
552     ManualStart();
553     std::lock_guard<std::mutex> autoLock(lock_);
554     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
555         SCAN_HILOGE("no permission to access scan service");
556         return E_SCAN_NO_PERMISSION;
557     }
558     SCAN_HILOGI("ScanServiceAbility CloseScanner start");
559     if (openedScannerList_.find(scannerId) == openedScannerList_.end()) {
560         SCAN_HILOGE("scannerId %{private}s is not opened", scannerId.c_str());
561         return E_SCAN_INVALID_PARAMETER;
562     }
563     scanTaskMap.clear();
564     std::queue<int32_t> emptyQueue;
565     scanQueue.swap(emptyQueue);
566     SaneStatus status = SaneManagerClient::GetInstance()->SaneClose(scannerId);
567     if (status != SANE_STATUS_GOOD) {
568         SCAN_HILOGE("SaneClose failed, status: [%{public}u]", status);
569         return ScanServiceUtils::ConvertErro(status);
570     }
571     openedScannerList_.erase(scannerId);
572     SCAN_HILOGI("ScanServiceAbility CloseScanner end");
573     return E_SCAN_NONE;
574 }
575 
GetScanOptionDesc(const std::string scannerId,const int32_t optionIndex,ScanOptionDescriptor & desc)576 int32_t ScanServiceAbility::GetScanOptionDesc(
577     const std::string scannerId, const int32_t optionIndex, ScanOptionDescriptor &desc)
578 {
579     ManualStart();
580     std::lock_guard<std::mutex> autoLock(lock_);
581     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
582         SCAN_HILOGE("no permission to access scan service");
583         return E_SCAN_NO_PERMISSION;
584     }
585     SCAN_HILOGI("ScanServiceAbility GetScanOptionDesc start");
586     if (openedScannerList_.find(scannerId) == openedScannerList_.end()) {
587         SCAN_HILOGE("scannerId %{private}s is not opened", scannerId.c_str());
588         return E_SCAN_INVALID_PARAMETER;
589     }
590     SaneOptionDescriptor saneDesc;
591     SaneStatus status = SaneManagerClient::GetInstance()->SaneGetOptionDescriptor(scannerId, optionIndex, saneDesc);
592     if (status != SANE_STATUS_GOOD) {
593         SCAN_HILOGE("SaneGetOptionDescriptor failed, status: [%{public}u]", status);
594         return ScanServiceUtils::ConvertErro(status);
595     }
596     desc.SetOptionName(saneDesc.optionName_);
597     desc.SetOptionTitle(saneDesc.optionTitle_);
598     desc.SetOptionDesc(saneDesc.optionDesc_);
599     desc.SetOptionType(saneDesc.optionType_);
600     desc.SetOptionUnit(saneDesc.optionUnit_);
601     desc.SetOptionConstraintType(saneDesc.optionConstraintType_);
602     if (saneDesc.optionConstraintType_ == SANE_CONSTRAINT_RANGE) {
603         ScanRange scanRange;
604         scanRange.SetMinValue(saneDesc.minValue_);
605         scanRange.SetMaxValue(saneDesc.maxValue_);
606         scanRange.SetQuantValue(saneDesc.quantValue_);
607         desc.SetOptionConstraintRange(scanRange);
608     } else if (saneDesc.optionConstraintType_ == SANE_CONSTRAINT_WORD_LIST) {
609         std::vector<int32_t> optionConstraintNumber;
610         for (const auto& number : saneDesc.optionConstraintNumber_) {
611             SCAN_HILOGD("SANE_CONSTRAINT_WORD_LIST : %{public}d", number);
612             optionConstraintNumber.push_back(number);
613         }
614         desc.SetOptionConstraintNumber(optionConstraintNumber);
615     } else if (saneDesc.optionConstraintType_ == SANE_CONSTRAINT_STRING_LIST) {
616         std::vector<std::string> optionConstraintString;
617         std::vector<std::string>& stringList = saneDesc.optionConstraintString_;
618         for (auto& str : stringList) {
619             SCAN_HILOGD("SANE_CONSTRAINT_STRING_LIST %{public}s", str.c_str());
620             optionConstraintString.push_back(str);
621         }
622         desc.SetOptionConstraintString(optionConstraintString);
623     }
624     desc.Dump();
625     SCAN_HILOGI("ScanServiceAbility GetScanOptionDesc end");
626     return E_SCAN_NONE;
627 }
628 
ActionSetAuto(const std::string & scannerId,const int32_t & optionIndex)629 int32_t ScanServiceAbility::ActionSetAuto(const std::string &scannerId, const int32_t &optionIndex)
630 {
631     SCAN_HILOGD("Set OpScanOptionValue SCAN_ACTION_SET_AUTO");
632     SaneStatus status = SANE_STATUS_GOOD;
633     SaneControlParam controlParam;
634     controlParam.option_ = optionIndex;
635     controlParam.action_ = static_cast<SaneAction>(SANE_ACTION_SET_AUTO);
636     SaneOutParam outParam;
637     status = SaneManagerClient::GetInstance()->SaneControlOption(scannerId, controlParam, outParam);
638     if (status != SANE_STATUS_GOOD) {
639         SCAN_HILOGE("SaneControlOption failed, status: [%{public}d]", status);
640         return ScanServiceUtils::ConvertErro(status);
641     }
642     return E_SCAN_NONE;
643 }
644 
ActionGetValue(const std::string & scannerId,ScanOptionValue & value,const int32_t & optionIndex)645 int32_t ScanServiceAbility::ActionGetValue(const std::string &scannerId, ScanOptionValue &value,
646     const int32_t &optionIndex)
647 {
648     SCAN_HILOGD("Set OpScanOptionValue SCAN_ACTION_GET_VALUE");
649     SaneStatus status = SANE_STATUS_GOOD;
650     ScanOptionValueType valueType = value.GetScanOptionValueType();
651     SaneControlParam controlParam;
652     controlParam.option_ = optionIndex;
653     controlParam.action_ = SANE_ACTION_GET_VALUE;
654     controlParam.valueType_ = static_cast<int32_t>(valueType);
655     controlParam.valueSize_ = value.GetValueSize();
656     SaneOutParam outParam;
657     status = SaneManagerClient::GetInstance()->SaneControlOption(scannerId, controlParam, outParam);
658     if (status != SANE_STATUS_GOOD) {
659         SCAN_HILOGE("sane_control_option failed, status: [%{public}d]", status);
660         return ScanServiceUtils::ConvertErro(status);
661     }
662     if (valueType == SCAN_VALUE_NUM) {
663         value.SetNumValue(outParam.valueNumber_);
664     } else if (valueType == SCAN_VALUE_STR) {
665         value.SetStrValue(outParam.valueStr_);
666     } else if (valueType == SCAN_VALUE_BOOL) {
667         value.SetBoolValue(outParam.valueBool_);
668     }
669     return E_SCAN_NONE;
670 }
671 
ActionSetValue(const std::string & scannerId,ScanOptionValue & value,const int32_t & optionIndex)672 int32_t ScanServiceAbility::ActionSetValue(const std::string &scannerId, ScanOptionValue &value,
673     const int32_t &optionIndex)
674 {
675     SCAN_HILOGI("Set OpScanOptionValue SCAN_ACTION_SET_VALUE");
676     SaneStatus status = SANE_STATUS_GOOD;
677     SaneControlParam controlParam;
678     controlParam.option_ = optionIndex;
679     controlParam.action_ = static_cast<SaneAction>(SANE_ACTION_SET_VALUE);
680     controlParam.valueType_ = static_cast<int32_t>(value.GetScanOptionValueType());
681     int32_t numValue = value.GetNumValue();
682     controlParam.valueNumber_ = numValue;
683     constexpr int32_t MAX_PICTURE_DPI = 3000;
684     dpi = numValue > 0 && numValue < MAX_PICTURE_DPI ? numValue : dpi;
685     controlParam.valueStr_ = value.GetStrValue();
686     SaneOutParam outParam;
687     status = SaneManagerClient::GetInstance()->SaneControlOption(scannerId, controlParam, outParam);
688     if (status != SANE_STATUS_GOOD) {
689         SCAN_HILOGE("SaneControlOption failed, ret = [%{public}d]", status);
690         return ScanServiceUtils::ConvertErro(status);
691     }
692     return status;
693 }
694 
OpScanOptionValue(const std::string scannerId,const int32_t optionIndex,const ScanOptionOpType op,ScanOptionValue & value)695 int32_t ScanServiceAbility::OpScanOptionValue(const std::string scannerId, const int32_t optionIndex,
696     const ScanOptionOpType op, ScanOptionValue &value)
697 {
698     SCAN_HILOGD("ScanServiceAbility OpScanOptionValue start");
699     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
700         SCAN_HILOGE("no permission to access scan service");
701         return E_SCAN_NO_PERMISSION;
702     }
703     if (openedScannerList_.find(scannerId) == openedScannerList_.end()) {
704         SCAN_HILOGE("scannerId %{private}s is not opened", scannerId.c_str());
705         return E_SCAN_INVALID_PARAMETER;
706     }
707     int32_t state = E_SCAN_NONE;
708     std::lock_guard<std::mutex> autoLock(lock_);
709     SCAN_HILOGD("ScanServiceAbility OpScanOptionValue start to dump value");
710     value.Dump();
711     switch (op) {
712         case SCAN_ACTION_SET_AUTO:
713             state = ActionSetAuto(scannerId, optionIndex);
714             break;
715         case SCAN_ACTION_GET_VALUE:
716             state = ActionGetValue(scannerId, value, optionIndex);
717             break;
718         case SCAN_ACTION_SET_VALUE:
719             state = ActionSetValue(scannerId, value, optionIndex);
720             break;
721         default:
722             SCAN_HILOGE("ScanServiceAbility OpScanOptionValue not find ScanOptionOpType");
723             break;
724     }
725 
726     if (state != E_SCAN_NONE) {
727         SCAN_HILOGE("ScanServiceAbility::OpScanOptionValue error exit");
728     }
729 
730     SCAN_HILOGD("ScanServiceAbility OpScanOptionValue start to dump value");
731     value.Dump();
732     SCAN_HILOGD("ScanServiceAbility OpScanOptionValue end");
733     return state;
734 }
735 
736 
GetScanParameters(const std::string scannerId,ScanParameters & para)737 int32_t ScanServiceAbility::GetScanParameters(const std::string scannerId, ScanParameters &para)
738 {
739     ManualStart();
740     std::lock_guard<std::mutex> autoLock(lock_);
741     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
742         SCAN_HILOGE("no permission to access scan service");
743         return E_SCAN_NO_PERMISSION;
744     }
745     if (openedScannerList_.find(scannerId) == openedScannerList_.end()) {
746         SCAN_HILOGE("scannerId %{private}s is not opened", scannerId.c_str());
747         return E_SCAN_INVALID_PARAMETER;
748     }
749     SCAN_HILOGD("ScanServiceAbility GetScanParameters start");
750     SaneParameters saneParams;
751     SaneStatus status = SaneManagerClient::GetInstance()->SaneGetParameters(scannerId, saneParams);
752     if (status != SANE_STATUS_GOOD) {
753         SCAN_HILOGE("SaneGetParameters failed, status: [%{public}u]", status);
754         return ScanServiceUtils::ConvertErro(status);
755     }
756     para.SetFormat(static_cast<ScanFrame>(saneParams.format_));
757     para.SetLastFrame(saneParams.lastFrame_);
758     para.SetBytesPerLine(saneParams.bytesPerLine_);
759     para.SetPixelsPerLine(saneParams.pixelsPerLine_);
760     para.SetLines(saneParams.lines_);
761     para.SetDepth(saneParams.depth_);
762     para.Dump();
763     SCAN_HILOGD("ScanServiceAbility GetScanParameters end");
764     return E_SCAN_NONE;
765 }
766 
CancelScan(const std::string scannerId)767 int32_t ScanServiceAbility::CancelScan(const std::string scannerId)
768 {
769     ManualStart();
770     std::lock_guard<std::mutex> autoLock(lock_);
771     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
772         SCAN_HILOGE("no permission to access scan service");
773         return E_SCAN_NO_PERMISSION;
774     }
775     if (openedScannerList_.find(scannerId) == openedScannerList_.end()) {
776         SCAN_HILOGE("scannerId %{private}s is not opened", scannerId.c_str());
777         return E_SCAN_INVALID_PARAMETER;
778     }
779     SCAN_HILOGI("ScanServiceAbility CancelScan start");
780     SaneStatus saneStatus = SaneManagerClient::GetInstance()->SaneCancel(scannerId);
781     if (saneStatus != SANE_STATUS_GOOD) {
782         SCAN_HILOGE("SaneCancel failed, status: [%{public}u]", saneStatus);
783         return ScanServiceUtils::ConvertErro(saneStatus);
784     }
785     std::queue<int32_t> emptyQueue;
786     scanQueue.swap(emptyQueue);
787     if (g_scannerState == SCANNER_SCANING) {
788         SCAN_HILOGW("ScannerState change to SCANNER_CANCELING");
789         g_scannerState = SCANNER_CANCELING;
790     }
791     SCAN_HILOGI("ScanServiceAbility CancelScan end");
792     return E_SCAN_NONE;
793 }
794 
On(const std::string taskId,const std::string & type,const sptr<IScanCallback> & listener)795 int32_t ScanServiceAbility::On(const std::string taskId, const std::string &type, const sptr<IScanCallback> &listener)
796 {
797     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
798         SCAN_HILOGE("no permission to access scan service");
799         return E_SCAN_NO_PERMISSION;
800     }
801     int32_t userId = GetCurrentUserId();
802     int32_t callerPid = IPCSkeleton::GetCallingPid();
803     std::string eventType = ScanServiceUtils::GetTaskEventId(taskId, type, userId, callerPid);
804 
805     SCAN_HILOGD("ScanServiceAbility::On started. type=%{public}s", eventType.c_str());
806     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
807     constexpr int32_t MAX_LISTENERS_COUNT = 1000;
808     if (registeredListeners_.size() > MAX_LISTENERS_COUNT) {
809         SCAN_HILOGE("Exceeded the maximum number of registration.");
810         return E_SCAN_GENERIC_FAILURE;
811     }
812     auto it = registeredListeners_.find(eventType);
813     if (it == registeredListeners_.end()) {
814         const auto temp = registeredListeners_.insert(std::make_pair(eventType, listener));
815         if (!temp.second) {
816             SCAN_HILOGE("ScanServiceAbility::On insert type=%{public}s object fail.", eventType.c_str());
817             return E_SCAN_SERVER_FAILURE;
818         }
819     } else {
820         SCAN_HILOGD("ScanServiceAbility::On Replace listener.");
821         it->second = listener;
822     }
823     SCAN_HILOGD("ScanServiceAbility::On end.");
824     return E_SCAN_NONE;
825 }
826 
Off(const std::string taskId,const std::string & type)827 int32_t ScanServiceAbility::Off(const std::string taskId, const std::string &type)
828 {
829     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
830         SCAN_HILOGE("no permission to access scan service");
831         return E_SCAN_NO_PERMISSION;
832     }
833     int32_t userId = GetCurrentUserId();
834     int32_t callerPid = IPCSkeleton::GetCallingPid();
835     std::string eventType = ScanServiceUtils::GetTaskEventId(taskId, type, userId, callerPid);
836     SCAN_HILOGD("ScanServiceAbility::Off started. type=%{public}s", eventType.c_str());
837     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
838     auto iter = registeredListeners_.find(eventType);
839     if (iter != registeredListeners_.end()) {
840         SCAN_HILOGD("ScanServiceAbility::Off delete type=%{public}s object message.", eventType.c_str());
841         registeredListeners_.erase(iter);
842         return E_SCAN_NONE;
843     }
844     return E_SCAN_INVALID_PARAMETER;
845 }
846 
SendDeviceInfo(const ScanDeviceInfo & info,std::string event)847 void ScanServiceAbility::SendDeviceInfo(const ScanDeviceInfo &info, std::string event)
848 {
849     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
850     SCAN_HILOGI("SendDeviceInfo [%{private}s], event = %{public}s",
851         info.deviceId.c_str(), event.c_str());
852     if (event.empty()) {
853         SCAN_HILOGE("SendDeviceInfo parm has nullptr");
854         return;
855     }
856 
857     for (auto [eventType, listener] : registeredListeners_) {
858         std::string type;
859         ScanServiceUtils::EncodeTaskEventId(eventType, type);
860         if (type == event && listener != nullptr) {
861             listener->OnCallback(info.GetDeviceState(), info);
862         }
863     }
864 }
865 
SendDeviceList(std::vector<ScanDeviceInfo> & infos,std::string event)866 void ScanServiceAbility::SendDeviceList(std::vector<ScanDeviceInfo> &infos, std::string event)
867 {
868     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
869 
870     if (event.empty()) {
871         SCAN_HILOGE("SendDeviceInfo parm has nullptr");
872         return;
873     }
874 
875     for (auto [eventType, listener] : registeredListeners_) {
876         std::string type;
877         ScanServiceUtils::EncodeTaskEventId(eventType, type);
878         if (type == event && listener != nullptr) {
879             listener->OnGetDevicesList(infos);
880         }
881     }
882 }
883 
SendDeviceInfoSync(const ScanDeviceInfoSync & info,std::string event)884 void ScanServiceAbility::SendDeviceInfoSync(const ScanDeviceInfoSync &info, std::string event)
885 {
886     std::lock_guard<std::recursive_mutex> lock(apiMutex_);
887 
888     if (event.empty()) {
889         SCAN_HILOGE("SendDeviceInfoSync parm has nullptr");
890         return;
891     }
892 
893     for (auto [eventType, listener] : registeredListeners_) {
894         std::string type;
895         ScanServiceUtils::EncodeTaskEventId(eventType, type);
896         if (type == event && listener != nullptr) {
897             listener->OnCallbackSync(info.GetDeviceState(), info);
898         }
899     }
900 }
901 
DisConnectUsbScanner(std::string serialNumber,std::string deviceId)902 void ScanServiceAbility::DisConnectUsbScanner(std::string serialNumber, std::string deviceId)
903 {
904     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
905         SCAN_HILOGE("no permission to access scan service");
906         return;
907     }
908     SCAN_HILOGD("DisConnectUsbScanner start deviceId:%{public}s", deviceId.c_str());
909     ScanDeviceInfoSync scanDeviceInfoSync;
910     scanDeviceInfoSync.serialNumber = serialNumber;
911     scanDeviceInfoSync.deviceId = deviceId;
912     scanDeviceInfoSync.discoverMode = "USB";
913     scanDeviceInfoSync.syncMode = "delete";
914     scanDeviceInfoSync.deviceState = 0;
915     SendDeviceInfoSync(scanDeviceInfoSync, SCAN_DEVICE_SYNC);
916 #ifdef DEBUG_ENABLE
917     SCAN_HILOGD("GetScannerList delete end serialNumber:%{private}s newDeviceId:%{public}s",
918                 serialNumber.c_str(), deviceId.c_str());
919 #endif
920 }
921 
UpdateScannerId(const ScanDeviceInfoSync & syncInfo)922 void ScanServiceAbility::UpdateScannerId(const ScanDeviceInfoSync& syncInfo)
923 {
924     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
925         SCAN_HILOGE("no permission to access scan service");
926         return;
927     }
928     SCAN_HILOGD("UpdateScannerId start newDeviceId:[%{private}s]", syncInfo.deviceId.c_str());
929     ScanDeviceInfoSync scanDeviceInfoSync = syncInfo;
930     std::lock_guard<std::mutex> autoLock(clearMapLock_);
931     if (scanDeviceInfoSync.discoverMode == "USB") {
932         auto it = saneGetUsbDeviceInfoMap.find(scanDeviceInfoSync.serialNumber);
933         if (it != saneGetUsbDeviceInfoMap.end()) {
934             it->second.deviceId = syncInfo.deviceId;
935         }
936         SendDeviceInfoSync(scanDeviceInfoSync, SCAN_DEVICE_SYNC);
937     } else if (scanDeviceInfoSync.discoverMode == "TCP") {
938         std::string oldIp;
939         ScanUtil::ExtractIpAddresses(scanDeviceInfoSync.oldDeviceId, oldIp);
940         auto it = saneGetTcpDeviceInfoMap.find(oldIp);
941         if (it != saneGetTcpDeviceInfoMap.end()) {
942             auto info = it->second;
943             saneGetTcpDeviceInfoMap.erase(it);
944             info.deviceId = scanDeviceInfoSync.deviceId;
945             saneGetTcpDeviceInfoMap.insert(std::make_pair(scanDeviceInfoSync.uniqueId, info));
946         }
947         SendDeviceInfoSync(scanDeviceInfoSync, SCAN_DEVICE_SYNC);
948     } else {
949         SCAN_HILOGE("invalid discover mode %{public}s", scanDeviceInfoSync.discoverMode.c_str());
950     }
951 #ifdef DEBUG_ENABLE
952     SCAN_HILOGD("GetScannerList UpdateUsbScannerId serialNumber:%{private}s newDeviceId:%{private}s",
953                 serialNumber.c_str(), newDeviceId.c_str());
954 #endif
955 }
956 
CheckPermission(const std::string & permissionName)957 bool ScanServiceAbility::CheckPermission(const std::string &permissionName)
958 {
959     AccessTokenID tokenId = IPCSkeleton::GetCallingTokenID();
960     TypeATokenTypeEnum tokenType = AccessTokenKit::GetTokenTypeFlag(tokenId);
961     if (tokenType == TOKEN_INVALID) {
962         SCAN_HILOGE("invalid token id");
963         return false;
964     }
965     int result = AccessTokenKit::VerifyAccessToken(tokenId, permissionName);
966     if (result != PERMISSION_GRANTED) {
967         if (permissionName == PERMISSION_NAME_PRINT) {
968             result = AccessTokenKit::VerifyAccessToken(tokenId, PERMISSION_NAME_PRINT);
969         }
970         SCAN_HILOGE("Current tokenId permission is %{public}d", result);
971     }
972     return result == PERMISSION_GRANTED;
973 }
974 
GetScanProgress(const std::string scannerId,ScanProgress & prog)975 int32_t ScanServiceAbility::GetScanProgress(const std::string scannerId, ScanProgress &prog)
976 {
977     ManualStart();
978     std::lock_guard<std::mutex> autoLock(lock_);
979     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
980         SCAN_HILOGE("no permission to access scan service");
981         return E_SCAN_NO_PERMISSION;
982     }
983     if (openedScannerList_.find(scannerId) == openedScannerList_.end()) {
984         SCAN_HILOGE("scannerId %{private}s is not opened", scannerId.c_str());
985         return E_SCAN_INVALID_PARAMETER;
986     }
987     if (scanQueue.empty()) {
988         SCAN_HILOGE("Not exist scan progress");
989         return E_SCAN_GENERIC_FAILURE;
990     }
991     int32_t frontPicId = scanQueue.front();
992     SCAN_HILOGD("frontPicId : [%{public}d]", frontPicId);
993     auto frontProg = scanTaskMap[frontPicId];
994     auto taskCode = frontProg.GetTaskCode();
995     if (taskCode != E_SCAN_NONE) {
996         SCAN_HILOGE("scanprogress exception occurred:[%{public}u]", taskCode);
997         scanQueue.pop();
998         return taskCode;
999     }
1000     auto scanProgress = frontProg.GetScanProgress();
1001     if (scanProgress == SCAN_PROGRESS_100) {
1002         SCAN_HILOGI("get scan picture successfully!");
1003         prog = frontProg;
1004         int32_t fd = open(prog.GetImageRealPath().c_str(), O_RDONLY);
1005         fdsan_exchange_owner_tag(fd, 0, SCAN_LOG_DOMAIN);
1006         prog.SetScanPictureFd(fd);
1007         imageFdMap_[prog.GetImageRealPath()] = fd;
1008         prog.Dump();
1009         scanQueue.pop();
1010         return E_SCAN_NONE;
1011     }
1012     int32_t randomNumber = GetRandomNumber(SCAN_PROGRESS_10, SCAN_PROGRESS_19);
1013     auto preTime = scanTaskMap[frontPicId].GetScanTime();
1014     if (GetElapsedSeconds(preTime) >= 1 && scanProgress < SCAN_PROGRESS_80) {
1015         scanTaskMap[frontPicId].SetScanProgress(scanProgress + randomNumber);
1016         scanTaskMap[frontPicId].SetScanTime(std::chrono::steady_clock::now());
1017     }
1018     prog = scanTaskMap[frontPicId];
1019     prog.Dump();
1020     return E_SCAN_NONE;
1021 }
1022 
AddScanner(const std::string & serialNumber,const std::string & discoverMode)1023 int32_t ScanServiceAbility::AddScanner(const std::string& serialNumber, const std::string& discoverMode)
1024 {
1025     ManualStart();
1026     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1027         SCAN_HILOGE("no permission to access scan service");
1028         return E_SCAN_NO_PERMISSION;
1029     }
1030     if (discoverMode != "USB" && discoverMode != "TCP") {
1031         SCAN_HILOGE("discoverMode is a invalid parameter.");
1032         return E_SCAN_INVALID_PARAMETER;
1033     }
1034     auto addScannerExe = [=]() {
1035         std::string uniqueId = discoverMode + serialNumber;
1036         ScanSystemData &scanData = ScanSystemData::GetInstance();
1037         std::lock_guard<std::mutex> autoLock(clearMapLock_);
1038         if (discoverMode == "USB") {
1039             auto usbIt = saneGetUsbDeviceInfoMap.find(serialNumber);
1040             if (usbIt == saneGetUsbDeviceInfoMap.end() || scanData.IsContainScanner(uniqueId)) {
1041                 SCAN_HILOGE("Failed to add usb scanner.");
1042                 return;
1043             }
1044             scanData.InsertScannerInfo(uniqueId, usbIt->second);
1045             if (!scanData.SaveScannerMap()) {
1046                 SCAN_HILOGE("ScanServiceAbility AddScanner SaveScannerMap fail");
1047                 return;
1048             }
1049             SendDeviceInfo(usbIt->second, SCAN_DEVICE_ADD);
1050         } else if (discoverMode == "TCP") {
1051             auto tcpIt = saneGetTcpDeviceInfoMap.find(serialNumber);
1052             if (tcpIt == saneGetTcpDeviceInfoMap.end() || scanData.IsContainScanner(uniqueId)) {
1053                 SCAN_HILOGE("Failed to add tcp scanner.");
1054                 return;
1055             }
1056             scanData.InsertScannerInfo(uniqueId, tcpIt->second);
1057             if (!scanData.SaveScannerMap()) {
1058                 SCAN_HILOGE("ScanServiceAbility AddScanner SaveScannerMap fail");
1059                 return;
1060             }
1061             SendDeviceInfo(tcpIt->second, SCAN_DEVICE_ADD);
1062         } else {
1063             SCAN_HILOGE("discoverMode is invalid.");
1064         }
1065     };
1066     serviceHandler_->PostTask(addScannerExe, ASYNC_CMD_DELAY);
1067     return E_SCAN_NONE;
1068 }
1069 
DeleteScanner(const std::string & serialNumber,const std::string & discoverMode)1070 int32_t ScanServiceAbility::DeleteScanner(const std::string& serialNumber, const std::string& discoverMode)
1071 {
1072     ManualStart();
1073     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1074         SCAN_HILOGE("no permission to access scan service");
1075         return E_SCAN_NO_PERMISSION;
1076     }
1077     SCAN_HILOGI("ScanServiceAbility DeleteScanner start");
1078 
1079     std::string uniqueId = discoverMode + serialNumber;
1080     ScanDeviceInfo scannerInfo;
1081     if (!ScanSystemData::GetInstance().QueryScannerInfoByUniqueId(uniqueId, scannerInfo)) {
1082         SCAN_HILOGE("ScanServiceAbility DeleteScanner QueryScannerInfoByUniqueId fail");
1083         return E_SCAN_INVALID_PARAMETER;
1084     }
1085     if (!ScanSystemData::GetInstance().DeleteScannerInfo(uniqueId)) {
1086         SCAN_HILOGE("ScanServiceAbility DeleteScanner DeleteScannerInfo fail");
1087         return E_SCAN_INVALID_PARAMETER;
1088     }
1089     if (!ScanSystemData::GetInstance().SaveScannerMap()) {
1090         SCAN_HILOGE("ScanServiceAbility DeleteScanner SaveScannerMap fail");
1091         return E_SCAN_GENERIC_FAILURE;
1092     }
1093     SendDeviceInfo(scannerInfo, SCAN_DEVICE_DEL);
1094     SCAN_HILOGI("ScanServiceAbility DeleteScanner end");
1095     return E_SCAN_NONE;
1096 }
1097 
GetAddedScanner(std::vector<ScanDeviceInfo> & allAddedScanner)1098 int32_t ScanServiceAbility::GetAddedScanner(std::vector<ScanDeviceInfo>& allAddedScanner)
1099 {
1100     ManualStart();
1101     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1102         SCAN_HILOGE("no permission to access scan service");
1103         return E_SCAN_NO_PERMISSION;
1104     }
1105     SCAN_HILOGI("ScanServiceAbility GetAddedScanner start");
1106     ScanSystemData::GetInstance().GetAddedScannerInfoList(allAddedScanner);
1107     SCAN_HILOGI("ScanServiceAbility GetAddedScanner end");
1108     return E_SCAN_NONE;
1109 }
1110 
OnStartScan(const std::string scannerId,const bool & batchMode)1111 int32_t ScanServiceAbility::OnStartScan(const std::string scannerId, const bool &batchMode)
1112 {
1113     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1114         SCAN_HILOGE("no permission to access scan service");
1115         return E_SCAN_NO_PERMISSION;
1116     }
1117     if (openedScannerList_.find(scannerId) == openedScannerList_.end()) {
1118         SCAN_HILOGE("scannerId %{private}s is not opened", scannerId.c_str());
1119         return E_SCAN_INVALID_PARAMETER;
1120     }
1121     std::string userCachedImageDir = ObtainUserCacheDirectory(GetCurrentUserId());
1122     if (!std::filesystem::exists(userCachedImageDir)) {
1123         SCAN_HILOGE("The user directory %{public}s does not exist.", userCachedImageDir.c_str());
1124         return E_SCAN_GENERIC_FAILURE;
1125     }
1126     std::queue<int32_t> emptyQueue;
1127     scanQueue.swap(emptyQueue);
1128     int32_t status = StartScan(scannerId, batchMode_);
1129     if (status != E_SCAN_NONE) {
1130         SCAN_HILOGE("Start Scan error");
1131         return status;
1132     }
1133     currentUseScannerUserId_ = GetCurrentUserId();
1134     batchMode_ = batchMode;
1135     g_scannerState = SCANNER_SCANING;
1136     auto exe = [=]() {
1137         StartScanTask(scannerId);
1138     };
1139     serviceHandler_->PostTask(exe, ASYNC_CMD_DELAY);
1140     SCAN_HILOGI("StartScan successfully");
1141     return E_SCAN_NONE;
1142 }
1143 
StartScan(const std::string scannerId,const bool & batchMode)1144 int32_t ScanServiceAbility::StartScan(const std::string scannerId, const bool &batchMode)
1145 {
1146     ManualStart();
1147     std::lock_guard<std::mutex> autoLock(lock_);
1148     if (!CheckPermission(PERMISSION_NAME_PRINT)) {
1149         SCAN_HILOGE("no permission to access scan service");
1150         return E_SCAN_NO_PERMISSION;
1151     }
1152     SCAN_HILOGI("ScanServiceAbility StartScan start");
1153 
1154     if (g_scannerState == SCANNER_CANCELING) {
1155         SCAN_HILOGE("scan task is canceling");
1156         return E_SCAN_DEVICE_BUSY;
1157     }
1158     SaneStatus saneStatus = SaneManagerClient::GetInstance()->SaneStart(scannerId);
1159     if (saneStatus != SANE_STATUS_GOOD) {
1160         SCAN_HILOGE("SaneStart failed, status is %{public}u", saneStatus);
1161         SaneManagerClient::GetInstance()->SaneCancel(scannerId);
1162         auto it = scanTaskMap.find(nextPicId);
1163         if (it != scanTaskMap.end() && it != scanTaskMap.begin()) {
1164             it--;
1165             (it->second).SetScanProgress(SCAN_PROGRESS_100);
1166         }
1167         return ScanServiceUtils::ConvertErro(saneStatus);
1168     }
1169     ScanProgress prog;
1170     scanTaskMap[nextPicId] = prog;
1171     scanQueue.push(nextPicId);
1172     scanTaskMap[nextPicId].SetPictureId(nextPicId);
1173     auto nowTime = std::chrono::steady_clock::now();
1174     scanTaskMap[nextPicId].SetScanTime(nowTime);
1175     nextPicId++;
1176     SCAN_HILOGI("ScanServiceAbility StartScan end");
1177     return E_SCAN_NONE;
1178 }
1179 
StartScanTask(const std::string scannerId)1180 void ScanServiceAbility::StartScanTask(const std::string scannerId)
1181 {
1182     SCAN_HILOGI("ScanServiceAbility StartScanTask start, batchMode_ = [%{public}d]", batchMode_);
1183     if (batchMode_) {
1184         SCAN_HILOGI("start batch mode scan");
1185         GeneratePictureBatch(scannerId);
1186     } else {
1187         SCAN_HILOGI("start single mode scan");
1188         GeneratePictureSingle(scannerId);
1189     }
1190     {
1191         std::lock_guard<std::mutex> autoLock(lock_);
1192         SCAN_HILOGI("StartScanTask finished, doning sane_cancel");
1193         SaneManagerClient::GetInstance()->SaneCancel(scannerId);
1194     }
1195     g_scannerState = SCANNER_READY;
1196     SCAN_HILOGI("ScanServiceAbility StartScanTask end");
1197 }
1198 
CreateAndOpenScanFile(std::string & outputFile)1199 bool ScanServiceAbility::CreateAndOpenScanFile(std::string &outputFile)
1200 {
1201     std::string outputDir = ObtainUserCacheDirectory(currentUseScannerUserId_);
1202     char canonicalPath[PATH_MAX] = { 0 };
1203     if (realpath(outputDir.c_str(), canonicalPath) == nullptr) {
1204         SCAN_HILOGE("The real output dir is null, errno:%{public}s", std::to_string(errno).c_str());
1205         return false;
1206     }
1207     outputDir = canonicalPath;
1208     std::ostringstream outputFileStream;
1209     int32_t nowScanId = nextPicId - 1;
1210     outputFileStream << outputDir << "/" << "scan_tmp" << std::to_string(nowScanId) << ".jpg";
1211     outputFile = outputFileStream.str();
1212     if ((ofp = fopen(outputFile.c_str(), "w")) == nullptr) {
1213         SCAN_HILOGE("file [%{private}s] open fail", outputFile.c_str());
1214         return false;
1215     }
1216     std::lock_guard<std::mutex> autoLock(lock_);
1217     auto it = scanTaskMap.find(nowScanId);
1218     if (it == scanTaskMap.end()) {
1219         SCAN_HILOGE("cannot find nowScanId %{private}d", nowScanId);
1220         return false;
1221     }
1222     it->second.SetImageRealPath(outputFile);
1223     return true;
1224 }
1225 
GeneratePictureBatch(const std::string & scannerId)1226 void ScanServiceAbility::GeneratePictureBatch(const std::string &scannerId)
1227 {
1228     bool firstScan = true;
1229     std::string outputFile;
1230     int32_t status = E_SCAN_NONE;
1231     do {
1232         if (!firstScan) {
1233             SCAN_HILOGI("not first scan");
1234             status = RestartScan(scannerId);
1235             if (status != E_SCAN_NONE) {
1236                 SCAN_HILOGW("RestartScan fail");
1237                 break;
1238             }
1239         }
1240         if (!CreateAndOpenScanFile(outputFile)) {
1241             status = E_SCAN_GENERIC_FAILURE;
1242             SCAN_HILOGE("CreateAndOpenScanFile fail");
1243             break;
1244         }
1245         status = DoScanTask(scannerId);
1246         firstScan = false;
1247     } while (status == E_SCAN_EOF);
1248     if (status == E_SCAN_NO_DOCS) {
1249         SCAN_HILOGI("GeneratePictureBatch exit successfully");
1250     } else {
1251         SCAN_HILOGE("GeneratePictureBatch fail, status = %{public}d", status);
1252     }
1253 }
1254 
GeneratePictureSingle(const std::string & scannerId)1255 void ScanServiceAbility::GeneratePictureSingle(const std::string &scannerId)
1256 {
1257     int32_t status = E_SCAN_NONE;
1258     std::string outputFile;
1259     if (!CreateAndOpenScanFile(outputFile)) {
1260         status = E_SCAN_GENERIC_FAILURE;
1261         SCAN_HILOGE("CreateAndOpenScanFile fail");
1262         return;
1263     }
1264     status = DoScanTask(scannerId);
1265     if (status == E_SCAN_EOF) {
1266         SCAN_HILOGI("GeneratePictureSingle exit successfully");
1267     } else {
1268         SCAN_HILOGE("GeneratePictureSingle fail, status = %{public}d", status);
1269     }
1270 }
1271 
DoScanTask(const std::string & scannerId)1272 int32_t ScanServiceAbility::DoScanTask(const std::string &scannerId)
1273 {
1274     bool isFirstFrame = true;
1275     int32_t scanStatus = E_SCAN_NONE;
1276     ScanParameters parm;
1277     struct jpeg_error_mgr jerr;
1278     do {
1279         SCAN_HILOGI("start DoScanTask");
1280         if (!isFirstFrame) {
1281             scanStatus = StartScan(scannerId, batchMode_);
1282             if (scanStatus != E_SCAN_NONE) {
1283                 SCAN_HILOGW("restart scanner fail");
1284                 break;
1285             }
1286         }
1287         scanStatus = GetScanParameters(scannerId, parm);
1288         if (scanStatus != E_SCAN_NONE) {
1289             SCAN_HILOGE("DoScanTask error, after GetScanParameters");
1290             break;
1291         }
1292         if (isFirstFrame) {
1293             scanStatus = WriteJpegHeader(parm, &jerr);
1294             if (scanStatus != E_SCAN_NONE) {
1295                 SCAN_HILOGE("StartScanTask error exit after WriteJpegHeader");
1296                 break;
1297             }
1298             jpegbuf = new (std::nothrow) JSAMPLE[parm.GetBytesPerLine() / sizeof(JSAMPLE)]{};
1299             if (jpegbuf == nullptr) {
1300                 SCAN_HILOGE("jpegbuf malloc fail");
1301                 break;
1302             }
1303         }
1304         GetPicFrame(scannerId, scanStatus, parm);
1305         if (scanStatus != E_SCAN_EOF) {
1306             SCAN_HILOGE("get scanframe fail");
1307             break;
1308         }
1309         isFirstFrame = false;
1310     } while (!(parm.GetLastFrame()));
1311     CleanUpAfterScan(scanStatus);
1312     return scanStatus;
1313 }
1314 
RestartScan(const std::string & scannerId)1315 int32_t ScanServiceAbility::RestartScan(const std::string &scannerId)
1316 {
1317     SCAN_HILOGI("not first scan");
1318     int32_t status = StartScan(scannerId, batchMode_);
1319     if (status == E_SCAN_NONE) {
1320         SCAN_HILOGI("ScanTask restart success");
1321         std::lock_guard<std::mutex> autoLock(lock_);
1322         auto it = scanTaskMap.find(nextPicId - 2);
1323         if (it != scanTaskMap.end()) {
1324             it->second.SetIsFinal(false);
1325         }
1326     } else if (status == E_SCAN_NO_DOCS) {
1327         SCAN_HILOGI("The feeder is out of paper.");
1328     } else {
1329         std::lock_guard<std::mutex> autoLock(lock_);
1330         SCAN_HILOGE("RestartScan fail");
1331         scanQueue.push(nextPicId);
1332         ScanProgress prog;
1333         auto result = scanTaskMap.insert({nextPicId, prog});
1334         if (result.second) {
1335             auto it = result.first;
1336             it->second.SetPictureId(nextPicId);
1337             auto nowTime = std::chrono::steady_clock::now();
1338             it->second.SetScanTime(nowTime);
1339         }
1340         nextPicId++;
1341     }
1342     return status;
1343 }
1344 
CleanUpAfterScan(int32_t scanStatus)1345 void ScanServiceAbility::CleanUpAfterScan(int32_t scanStatus)
1346 {
1347     int32_t nowScanId = nextPicId - 1;
1348     if (scanStatus != E_SCAN_EOF && scanStatus != E_SCAN_NO_DOCS) {
1349         std::lock_guard<std::mutex> autoLock(lock_);
1350         auto it = scanTaskMap.find(nowScanId);
1351         if (it != scanTaskMap.end()) {
1352             it->second.SetTaskCode(static_cast<ScanErrorCode>(scanStatus));
1353         }
1354         jpeg_destroy_compress(cinfoPtr);
1355         SCAN_HILOGE("DoScanTask fail, SetTaskCode : %{public}d", scanStatus);
1356     } else {
1357         std::lock_guard<std::mutex> autoLock(lock_);
1358         auto it = scanTaskMap.find(nowScanId);
1359         if (it != scanTaskMap.end()) {
1360             it->second.SetScanProgress(SCAN_PROGRESS_100);
1361         }
1362         jpeg_finish_compress(cinfoPtr);
1363         fflush(ofp);
1364         SCAN_HILOGD("End of normal scan");
1365     }
1366     DELETE_ARRAY_AND_NULLIFY(jpegbuf)
1367     if (ofp != nullptr) {
1368         fclose(ofp);
1369         ofp = nullptr;
1370     }
1371 }
1372 
WriteJpegHeader(ScanParameters & parm,struct jpeg_error_mgr * jerr)1373 int32_t ScanServiceAbility::WriteJpegHeader(ScanParameters &parm, struct jpeg_error_mgr* jerr)
1374 {
1375     ScanFrame format = parm.GetFormat();
1376     int32_t width = parm.GetPixelsPerLine();
1377     int32_t height = parm.GetLines();
1378     cinfoPtr->err = jpeg_std_error(jerr);
1379     cinfoPtr->err->error_exit = [](j_common_ptr cinfo) {
1380         g_isJpegWriteSuccess = false;
1381     };
1382     g_isJpegWriteSuccess = true;
1383     jpeg_create_compress(cinfoPtr);
1384     jpeg_stdio_dest(cinfoPtr, ofp);
1385 
1386     cinfoPtr->image_width = (JDIMENSION)width;
1387     cinfoPtr->image_height = (JDIMENSION)height;
1388     if (format == SCAN_FRAME_RGB) {
1389         cinfoPtr->in_color_space = JCS_RGB;
1390         cinfoPtr->input_components = CHANNEL_THREE;
1391         SCAN_HILOGI("generate RGB picture");
1392     } else if (format == SCAN_FRAME_GRAY) {
1393         cinfoPtr->in_color_space = JCS_GRAYSCALE;
1394         cinfoPtr->input_components = CHANNEL_ONE;
1395         SCAN_HILOGI("generate gray picture");
1396     } else {
1397         SCAN_HILOGE("not support this color");
1398         return E_SCAN_INVALID_PARAMETER;
1399     }
1400     jpeg_set_defaults(cinfoPtr);
1401     cinfoPtr->density_unit = 1;
1402     cinfoPtr->X_density = dpi;
1403     cinfoPtr->Y_density = dpi;
1404     cinfoPtr->write_JFIF_header = TRUE;
1405     SCAN_HILOGI("width:[%{public}d],height:[%{public}d],dpi:[%{public}d]", width, height, dpi);
1406     jpeg_set_quality(cinfoPtr, JPEG_QUALITY_SEVENTY_FIVE, TRUE);
1407     jpeg_start_compress(cinfoPtr, TRUE);
1408     SCAN_HILOGI("finish write jpegHeader");
1409     return E_SCAN_NONE;
1410 }
1411 
SetScanProgr(int64_t & totalBytes,const int64_t & hundredPercent,const int32_t & curReadSize)1412 void ScanServiceAbility::SetScanProgr(int64_t &totalBytes, const int64_t& hundredPercent, const int32_t& curReadSize)
1413 {
1414     if (hundredPercent == 0) {
1415         SCAN_HILOGE("hundredPercent equals zero.");
1416         return;
1417     }
1418     std::lock_guard<std::mutex> autoLock(lock_);
1419     int32_t nowScanId = nextPicId - 1;
1420     auto it = scanTaskMap.find(nowScanId);
1421     if (it == scanTaskMap.end()) {
1422         SCAN_HILOGW("cannot find %{public}d", nowScanId);
1423         return;
1424     }
1425     totalBytes += static_cast<int64_t>(curReadSize);
1426     int64_t progr = ((totalBytes * SCAN_PROGRESS_100) / hundredPercent);
1427     if (progr >= SCAN_PROGRESS_100) {
1428         progr = SCAN_PROGRESS_100 - 1;
1429     }
1430     if (progr > (it->second.GetScanProgress())) {
1431         it->second.SetScanProgress(static_cast<int32_t>(progr));
1432     }
1433 }
1434 
GetPicFrame(const std::string scannerId,int32_t & scanStatus,ScanParameters & parm)1435 void ScanServiceAbility::GetPicFrame(const std::string scannerId,
1436     int32_t &scanStatus, ScanParameters &parm)
1437 {
1438     int64_t totalBytes = 0;
1439     int jpegrow = 0;
1440     int64_t hundredPercent = ((int64_t)parm.GetBytesPerLine()) * parm.GetLines() * (((SaneFrame)parm.GetFormat()
1441         == SANE_FRAME_RGB || (SaneFrame)parm.GetFormat() == SANE_FRAME_GRAY) ? CHANNEL_ONE : CHANNEL_THREE);
1442     scanStatus = E_SCAN_NONE;
1443     while (scanStatus == E_SCAN_NONE) {
1444         SanePictureData pictureData;
1445         SaneStatus saneStatus = SaneManagerClient::GetInstance()->
1446             SaneRead(scannerId, buffer_size, pictureData);
1447         scanStatus = ScanServiceUtils::ConvertErro(saneStatus);
1448         if (pictureData.ret_ == SANE_READ_FAIL) {
1449             SCAN_HILOGE("sane_read failed, scanStatus: [%{public}d]", scanStatus);
1450             break;
1451         }
1452         auto ret = memcpy_s(saneReadBuf, buffer_size, pictureData.dataBuffer_.data(), pictureData.dataBuffer_.size());
1453         if (ret != ERR_OK) {
1454             scanStatus = E_SCAN_GENERIC_FAILURE;
1455             SCAN_HILOGE("memcpy_s failed, errorCode:[%{public}d]", ret);
1456             break;
1457         }
1458         SetScanProgr(totalBytes, hundredPercent, pictureData.dataBuffer_.size());
1459         if (!WritePicData(jpegrow, pictureData.dataBuffer_.size(), parm, scanStatus)) {
1460             SCAN_HILOGE("WritePicData fail");
1461             break;
1462         }
1463         if (scanStatus == SANE_STATUS_EOF) {
1464             SCAN_HILOGI("sane_read finished.");
1465             break;
1466         }
1467     }
1468 }
1469 
WritePicData(int & jpegrow,int32_t curReadSize,ScanParameters & parm,int32_t & scanStatus)1470 bool ScanServiceAbility::WritePicData(int &jpegrow, int32_t curReadSize,
1471     ScanParameters &parm, int32_t &scanStatus)
1472 {
1473     constexpr int bit = 1;
1474     int i = 0;
1475     int left = curReadSize;
1476     while (jpegrow + left >= parm.GetBytesPerLine()) {
1477         if (!g_isJpegWriteSuccess) {
1478             scanStatus = E_SCAN_NO_MEM;
1479             return false;
1480         }
1481         int ret = memcpy_s(jpegbuf + jpegrow, parm.GetBytesPerLine(),
1482             saneReadBuf + i, parm.GetBytesPerLine() - jpegrow);
1483         if (ret != ERR_OK) {
1484             scanStatus = E_SCAN_GENERIC_FAILURE;
1485             SCAN_HILOGE("memcpy_s failed");
1486             return false;
1487         }
1488         if (parm.GetDepth() != 1) {
1489             jpeg_write_scanlines(cinfoPtr, &jpegbuf, bit);
1490             i += parm.GetBytesPerLine() - jpegrow;
1491             left -= parm.GetBytesPerLine() - jpegrow;
1492             jpegrow = 0;
1493             continue;
1494         }
1495         constexpr int byteBits = 8;
1496         JSAMPLE *buf8 = (JSAMPLE *)malloc(parm.GetBytesPerLine() * byteBits);
1497         if (buf8 == nullptr) {
1498             scanStatus = E_SCAN_GENERIC_FAILURE;
1499             SCAN_HILOGE("pic buffer malloc fail");
1500             return false;
1501         }
1502         for (int col1 = 0; col1 < parm.GetBytesPerLine(); col1++) {
1503             for (int col8 = 0; col8 < byteBits; col8++) {
1504                 buf8[col1 * byteBits + col8] = jpegbuf[col1] & (1 << (byteBits - col8 - bit)) ? 0 : 0xff;
1505             }
1506         }
1507         jpeg_write_scanlines(cinfoPtr, &buf8, bit);
1508         free(buf8);
1509         i += parm.GetBytesPerLine() - jpegrow;
1510         left -= parm.GetBytesPerLine() - jpegrow;
1511         jpegrow = 0;
1512     }
1513     if (memcpy_s(jpegbuf + jpegrow, parm.GetBytesPerLine(), saneReadBuf + i, left) != ERR_OK) {
1514         scanStatus = E_SCAN_GENERIC_FAILURE;
1515         SCAN_HILOGE("memcpy_s failed");
1516         return false;
1517     }
1518     jpegrow += left;
1519     return true;
1520 }
1521 
GetCurrentUserId()1522 int32_t ScanServiceAbility::GetCurrentUserId()
1523 {
1524     constexpr int32_t UID_TRANSFORM_DIVISOR = 200000;
1525     int32_t userId = IPCSkeleton::GetCallingUid() / UID_TRANSFORM_DIVISOR;
1526     if (userId <= 0) {
1527         SCAN_HILOGD("scan sa calling, use current active userId");
1528         std::vector<int32_t> userIds;
1529         AccountSA::OsAccountManager::QueryActiveOsAccountIds(userIds);
1530         if (userIds.empty()) {
1531             SCAN_HILOGE("get use current active userId failed");
1532             userId = INVALID_USER_ID;
1533         } else {
1534             userId = userIds[0];
1535         }
1536     }
1537     SCAN_HILOGD("Current userId = %{public}d.", userId);
1538     return userId;
1539 }
1540 
ObtainUserCacheDirectory(const int32_t & userId)1541 std::string ScanServiceAbility::ObtainUserCacheDirectory(const int32_t& userId)
1542 {
1543     std::ostringstream oss;
1544     oss << "/data/service/el2/" << userId << "/print_service";
1545     return oss.str();
1546 }
1547 
1548 }  // namespace OHOS::Scan