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 
16 #ifndef SCAN_SERVICE_ABILITY_H
17 #define SCAN_SERVICE_ABILITY_H
18 
19 #include <mutex>
20 #include <string>
21 #include <vector>
22 #include <functional>
23 #include <queue>
24 #include <chrono>
25 
26 #include "ability_manager_client.h"
27 #include "event_handler.h"
28 #include "extension_ability_info.h"
29 #include "iscan_callback.h"
30 #include "iremote_object.h"
31 #include "scan_constant.h"
32 #include "scan_service_stub.h"
33 #include "system_ability.h"
34 #ifdef SANE_ENABLE
35 #include "sane/sane.h"
36 #include "sane/saneopts.h"
37 #endif
38 #include "scanner_info.h"
39 #include "scan_mdns_service.h"
40 #include "scan_option_descriptor.h"
41 #include "jpeglib.h"
42 namespace OHOS::Scan {
43 enum class ServiceRunningState { STATE_NOT_START, STATE_RUNNING };
44 class ScanServiceAbility : public SystemAbility, public ScanServiceStub {
45     DECLARE_SYSTEM_ABILITY(ScanServiceAbility);
46 public:
47     DISALLOW_COPY_AND_MOVE(ScanServiceAbility);
48     ScanServiceAbility(int32_t systemAbilityId, bool runOnCreate);
49     ScanServiceAbility();
50     ~ScanServiceAbility();
51     static sptr<ScanServiceAbility> GetInstance();
52     int32_t InitScan(int32_t &scanVersion) override;
53     int32_t ExitScan() override;
54     int32_t GetScannerList() override;
55     int32_t StopDiscover() override;
56     int32_t OpenScanner(const std::string scannerId) override;
57     int32_t CloseScanner(const std::string scannerId) override;
58     int32_t GetScanOptionDesc(const std::string scannerId, const int32_t optionIndex,
59         ScanOptionDescriptor &desc) override;
60     int32_t OpScanOptionValue(const std::string scannerId, const int32_t optionIndex,
61         const ScanOptionOpType op, ScanOptionValue &value, int32_t &info) override;
62     int32_t GetScanParameters(const std::string scannerId, ScanParameters &para) override;
63     int32_t StartScan(const std::string scannerId, const bool &batchMode) override;
64     int32_t GetSingleFrameFD(const std::string scannerId, uint32_t &size, uint32_t fd) override;
65     int32_t CancelScan(const std::string scannerId) override;
66     int32_t SetScanIOMode(const std::string scannerId, const bool isNonBlocking) override;
67     int32_t GetScanSelectFd(const std::string scannerId, int32_t &fd) override;
68     int32_t On(const std::string taskId, const std::string &type, const sptr<IScanCallback> &listener) override;
69     int32_t Off(const std::string taskId, const std::string &type) override;
70     int32_t GetScannerState(int32_t &scannerState) override;
71     int32_t GetScanProgress(const std::string scannerId, ScanProgress &prog) override;
72     int32_t AddScanner(const std::string& serialNumber, const std::string& discoverMode) override;
73     int32_t DeleteScanner(const std::string& serialNumber, const std::string& discoverMode) override;
74     int32_t GetAddedScanner(std::vector<ScanDeviceInfo>& allAddedScanner) override;
75     int32_t UpdateScannerName(const std::string& serialNumber,
76         const std::string& discoverMode, const std::string& deviceName) override;
77     int32_t OnStartScan(const std::string scannerId, const bool &batchMode);
78     void DisConnectUsbScanner(std::string serialNumber, std::string newDeviceId); // public
79     void UpdateScannerId(const ScanDeviceInfoSync& usbSyncInfo); // public
80 
81 private:
82 #ifdef SANE_ENABLE
83     int32_t ActionSetAuto(SANE_Handle &scannerHandle, const int32_t &optionIndex);
84     int32_t ActionGetValue(SANE_Handle &scannerHandle, ScanOptionValue &value, const int32_t &optionIndex);
85     int32_t ActionSetValueHelper(ScanOptionValue &value, void *saneValueBuf, int32_t valueSize, uint32_t bufSize);
86     int32_t ActionSetValue(SANE_Handle &scannerHandle, ScanOptionValue &value,
87         const int32_t &optionIndex, int32_t &info);
88     int32_t SelectScanOptionDesc(const SANE_Option_Descriptor* &optionDesc, ScanOptionDescriptor &desc);
89 #endif
90     int32_t DoScanTask(const std::string scannerId, ScanProgress* scanProPtr);
91     void StartScanTask(const std::string scannerId);
92     void SendDeviceInfoTCP(const ScanDeviceInfoTCP &info, std::string event);
93     void SendDeviceInfo(const ScanDeviceInfo &info, std::string event);
94     void SendDeviceInfoSync(const ScanDeviceInfoSync &info, std::string event);
95     void SendInitEvent(int32_t &scanVersion, std::string event);
96     void SendDeviceSearchEnd(std::string &info, std::string event);
97     void SetScannerSerialNumber(ScanDeviceInfo &info);
98     void SaneGetScanner();
99     void SyncScannerInfo(ScanDeviceInfo &info);
100 public:
101     static std::map<std::string, ScanDeviceInfoTCP> scanDeviceInfoTCPMap_;
102     static std::map<std::string, ScanDeviceInfo> saneGetUsbDeviceInfoMap;
103     static std::map<std::string, ScanDeviceInfo> saneGetTcpDeviceInfoMap;
104     static std::map<std::string, std::string> usbSnMap;
105     void UnloadSystemAbility();
106     static int32_t appCount_;
107 protected:
108     void OnStart() override;
109     void OnStop() override;
110 
111 private:
112     int32_t ServiceInit();
113     void InitServiceHandler();
114     void ManualStart();
115     int32_t ReInitScan(int32_t &scanVersion);
116     bool CheckPermission(const std::string &permissionName);
117     void SendGetFrameResEvent(const bool isGetSucc, const int32_t sizeRead);
118 #ifdef SANE_ENABLE
119     void SetScanOptionDescriptor(ScanOptionDescriptor &desc, const SANE_Option_Descriptor *optionDesc);
120     SANE_Handle GetScanHandle(const std::string &scannerId);
121 #endif
122     int32_t WriteJpegHeader(ScanParameters &parm, struct jpeg_error_mgr* jerr);
123     void GeneratePicture(const std::string &scannerId, std::string &file_name,
124         std::string &output_file, int32_t &status, ScanProgress* &scanProPtr);
125     void GetPicFrame(const std::string scannerId, ScanProgress *scanProPtr,
126         int32_t &scanStatus, ScanParameters &parm);
127     bool WritePicData(int &jpegrow, int32_t curReadSize, ScanParameters &parm, ScanProgress *scanProPtr);
128     void GeneratePictureBatch(const std::string &scannerId, std::string &file_name,
129         std::string &output_file, int32_t &status, ScanProgress* &scanProPtr);
130     void GeneratePictureSingle(const std::string &scannerId, std::string &file_name,
131         std::string &output_file, int32_t &status, ScanProgress* &scanProPtr);
132     void AddFoundUsbScanner(ScanDeviceInfo &info);
133     void AddFoundTcpScanner(ScanDeviceInfo &info);
134 #ifdef SANE_ENABLE
135     bool SetScannerInfo(const SANE_Device** &currentDevice, ScanDeviceInfo &info);
136 #endif
137     bool GetUsbDevicePort(const std::string &deviceId, std::string &firstId, std::string &secondId);
138     bool GetTcpDeviceIp(const std::string &deviceId, std::string &ip);
139     void CleanScanTask(const std::string &scannerId);
140     void SendDeviceList(std::vector<ScanDeviceInfo> &info, std::string event);
141     int32_t GetCurrentUserId();
142     std::string ObtainUserCacheDirectory(const int32_t& userId);
143 #ifdef SANE_ENABLE
144     std::map<std::string, SANE_Handle> scannerHandleList_;
145 #endif
146     ServiceRunningState state_;
147     std::mutex lock_;
148     std::mutex clearMapLock_;
149     static std::mutex instanceLock_;
150     static sptr<ScanServiceAbility> instance_;
151     static std::shared_ptr<AppExecFwk::EventHandler> serviceHandler_;
152     static std::map<std::string, sptr<IScanCallback>> registeredListeners_;
153     std::recursive_mutex apiMutex_;
154     std::recursive_mutex scanMutex_;
155     uint64_t currentJobId_;
156     int32_t currentUseScannerUserId_;
157     std::map<std::string, int32_t> imageFdMap_;
158 #ifdef SANE_ENABLE
159     std::function<void(SANE_Handle scannerHandle, uint32_t fd)> getSingleFrameFDExe;
160 #endif
161     std::function<void()> cyclicCallExe;
162     std::queue<int32_t> scanQueue;
163     std::map<int32_t, ScanProgress> scanTaskMap;
164     std::vector<ScanDeviceInfo> deviceInfos;
165     int32_t nextPicId = 1;
166     int32_t buffer_size;
167     bool batchMode_ = false;
168     uint8_t *saneReadBuf;
169     struct jpeg_compress_struct *cinfoPtr;
170     FILE *ofp = nullptr;
171     bool isCancel = false;
172     int32_t dpi = 0;
173     JSAMPLE *jpegbuf = nullptr;
174 };
175 } // namespace OHOS::Scan
176 #endif // SCAN_SYSTEM_ABILITY_H