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