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