• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
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 #include "scanner_info.h"
35 #include "scan_mdns_service.h"
36 #include "scan_option_descriptor.h"
37 #include "jpeglib.h"
38 namespace OHOS::Scan {
39 enum class ServiceRunningState { STATE_NOT_START, STATE_RUNNING };
40 class ScanServiceAbility : public SystemAbility, public ScanServiceStub {
41     DECLARE_SYSTEM_ABILITY(ScanServiceAbility);
42 public:
43     DISALLOW_COPY_AND_MOVE(ScanServiceAbility);
44     ScanServiceAbility(int32_t systemAbilityId, bool runOnCreate);
45     ScanServiceAbility();
46     ~ScanServiceAbility();
47     static sptr<ScanServiceAbility> GetInstance();
48     int32_t InitScan(int32_t &scanVersion) override;
49     int32_t ExitScan() override;
50     int32_t GetScannerList() override;
51     int32_t StopDiscover() override;
52     int32_t OpenScanner(const std::string scannerId) override;
53     int32_t CloseScanner(const std::string scannerId) override;
54     int32_t GetScanOptionDesc(const std::string scannerId, const int32_t optionIndex,
55         ScanOptionDescriptor &desc) override;
56     int32_t OpScanOptionValue(const std::string scannerId, const int32_t optionIndex,
57         const ScanOptionOpType op, ScanOptionValue &value, int32_t &info) override;
58     int32_t GetScanParameters(const std::string scannerId, ScanParameters &para) override;
59     int32_t StartScan(const std::string scannerId, const bool &batchMode) override;
60     int32_t GetSingleFrameFD(const std::string scannerId, uint32_t &size, uint32_t fd) override;
61     int32_t CancelScan(const std::string scannerId) override;
62     int32_t SetScanIOMode(const std::string scannerId, const bool isNonBlocking) override;
63     int32_t GetScanSelectFd(const std::string scannerId, int32_t &fd) override;
64     int32_t On(const std::string taskId, const std::string &type, const sptr<IScanCallback> &listener) override;
65     int32_t Off(const std::string taskId, const std::string &type) override;
66     int32_t GetScannerState(int32_t &scannerState) override;
67     int32_t GetScanProgress(const std::string scannerId, ScanProgress &prog) override;
68     int32_t AddScanner(const std::string& serialNumber, const std::string& discoverMode) override;
69     int32_t DeleteScanner(const std::string& serialNumber, const std::string& discoverMode) override;
70     int32_t GetAddedScanner(std::vector<ScanDeviceInfo>& allAddedScanner) override;
71     int32_t UpdateScannerName(const std::string& serialNumber,
72         const std::string& discoverMode, const std::string& deviceName) override;
73     int32_t OnStartScan(const std::string scannerId, const bool &batchMode);
74     void DisConnectUsbScanner(std::string serialNumber, std::string newDeviceId); // public
75     void UpdateScannerId(const ScanDeviceInfoSync& usbSyncInfo); // public
76 
77 private:
78     int32_t ActionSetAuto(const std::string &scannerId, const int32_t &optionIndex);
79     int32_t ActionGetValue(const std::string &scannerId, ScanOptionValue &value, const int32_t &optionIndex);
80     int32_t ActionSetValue(const std::string &scannerId, ScanOptionValue &value,
81                            const int32_t &optionIndex, int32_t &info);
82     int32_t DoScanTask(const std::string& scannerId);
83     void StartScanTask(const std::string scannerId);
84     void SendDeviceInfoTCP(const ScanDeviceInfoTCP &info, std::string event);
85     void SendDeviceInfo(const ScanDeviceInfo &info, std::string event);
86     void SendDeviceInfoSync(const ScanDeviceInfoSync &info, std::string event);
87     void SendInitEvent(int32_t &scanVersion, std::string event);
88     void SendDeviceSearchEnd(std::string &info, std::string event);
89     void SetScannerSerialNumber(ScanDeviceInfo &info);
90     void SaneGetScanner();
91     void SetScannerSerialNumberByTCP(ScanDeviceInfo &info);
92     void SetScannerSerialNumberByUSB(ScanDeviceInfo &info);
93 public:
94     static std::map<std::string, ScanDeviceInfo> saneGetUsbDeviceInfoMap;
95     static std::map<std::string, ScanDeviceInfo> saneGetTcpDeviceInfoMap;
96     static std::map<std::string, std::string> usbSnMap;
97     void UnloadSystemAbility();
98     static int32_t appCount_;
99 protected:
100     void OnStart() override;
101     void OnStop() override;
102 
103 private:
104     int32_t ServiceInit();
105     void InitServiceHandler();
106     void ManualStart();
107     int32_t ReInitScan();
108     bool CheckPermission(const std::string &permissionName);
109     int32_t WriteJpegHeader(ScanParameters &parm, struct jpeg_error_mgr* jerr);
110     void GeneratePicture(const std::string &scannerId, std::string &fileName,
111         std::string &outputFile, int32_t &status, ScanProgress* &scanProPtr);
112     void GetPicFrame(const std::string scannerId,
113         int32_t &scanStatus, ScanParameters &parm);
114     bool WritePicData(int &jpegrow, int32_t curReadSize, ScanParameters &parm, int32_t &scanStatus);
115     void GeneratePictureBatch(const std::string &scannerId);
116     void GeneratePictureSingle(const std::string &scannerId);
117     bool GetUsbDevicePort(const std::string &deviceId, std::string &firstId, std::string &secondId);
118     bool GetTcpDeviceIp(const std::string &deviceId, std::string &ip);
119     void CleanScanTask(const std::string &scannerId);
120     void SendDeviceList(std::vector<ScanDeviceInfo> &info, std::string event);
121     int32_t GetCurrentUserId();
122     std::string ObtainUserCacheDirectory(const int32_t& userId);
123     void SetScanProgr(int64_t &totalBytes, const int64_t& hundredPercent,
124         const int32_t& curReadSize);
125     bool CreateAndOpenScanFile(std::string &outputFile);
126     void AddFoundScanner(ScanDeviceInfo& info);
127     void CleanUpAfterScan(int32_t scanStatus);
128     int32_t RestartScan(const std::string &scannerId);
129     std::set<std::string> openedScannerList_;
130     ServiceRunningState state_;
131     std::mutex lock_;
132     std::mutex clearMapLock_;
133     static std::mutex instanceLock_;
134     static sptr<ScanServiceAbility> instance_;
135     static std::shared_ptr<AppExecFwk::EventHandler> serviceHandler_;
136     static std::map<std::string, sptr<IScanCallback>> registeredListeners_;
137     std::recursive_mutex apiMutex_;
138     std::recursive_mutex scanMutex_;
139     uint64_t currentJobId_;
140     int32_t currentUseScannerUserId_;
141     std::map<std::string, int32_t> imageFdMap_;
142     std::function<void()> cyclicCallExe;
143     std::queue<int32_t> scanQueue;
144     std::map<int32_t, ScanProgress> scanTaskMap;
145     std::vector<ScanDeviceInfo> deviceInfos_;
146     int32_t nextPicId = 1;
147     int32_t buffer_size;
148     bool batchMode_ = false;
149     uint8_t *saneReadBuf;
150     struct jpeg_compress_struct *cinfoPtr;
151     FILE *ofp = nullptr;
152     bool isCancel = false;
153     int32_t dpi = 0;
154     JSAMPLE *jpegbuf = nullptr;
155 };
156 } // namespace OHOS::Scan
157 #endif // SCAN_SYSTEM_ABILITY_H