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** ¤tDevice, 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 ¶)
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, ¶meters);
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