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 PRINT_SERVICE_ABILITY_H
17 #define PRINT_SERVICE_ABILITY_H
18 
19 #include <mutex>
20 #include <string>
21 #include <vector>
22 #include <unordered_map>
23 #include <nlohmann/json.hpp>
24 
25 #include "ability_manager_client.h"
26 #include "event_handler.h"
27 #include "extension_ability_info.h"
28 #include "iprint_callback.h"
29 #include "iremote_object.h"
30 #include "print_constant.h"
31 #include "print_service_stub.h"
32 #include "system_ability.h"
33 #include "print_security_guard_manager.h"
34 #include "print_service_helper.h"
35 #include "print_user_data.h"
36 #include "print_system_data.h"
37 #include "print_attribute_preference.h"
38 #include "vendor_manager.h"
39 
40 namespace OHOS::Print {
41 enum class ServiceRunningState { STATE_NOT_START, STATE_RUNNING };
42 class IKeyguardStateCallback;
43 
44 class PrintServiceAbility : public SystemAbility, public PrintServiceStub, public IPrintServiceAbility {
45     DECLARE_SYSTEM_ABILITY(PrintServiceAbility);
46 
47 public:
48     DISALLOW_COPY_AND_MOVE(PrintServiceAbility);
49     PrintServiceAbility(int32_t systemAbilityId, bool runOnCreate);
50     PrintServiceAbility();
51     ~PrintServiceAbility();
52     static sptr<PrintServiceAbility> GetInstance();
53     int32_t StartService() override;
54     int32_t StartPrint(const std::vector<std::string> &fileList,
55         const std::vector<uint32_t> &fdList, std::string &taskId) override;
56     int32_t StopPrint(const std::string &taskId) override;
57     int32_t ConnectPrinter(const std::string &printerId) override;
58     int32_t DisconnectPrinter(const std::string &printerId) override;
59     int32_t StartDiscoverPrinter(const std::vector<std::string> &extensionList) override;
60     int32_t StopDiscoverPrinter() override;
61     int32_t QueryAllExtension(std::vector<PrintExtensionInfo> &extensionInfos) override;
62     int32_t StartPrintJob(PrintJob &jobinfo) override;
63     int32_t CancelPrintJob(const std::string &jobId) override;
64     int32_t AddPrinters(const std::vector<PrinterInfo> &printerInfos) override;
65     int32_t RemovePrinters(const std::vector<std::string> &printerIds) override;
66     int32_t UpdatePrinters(const std::vector<PrinterInfo> &printerInfos) override;
67     int32_t UpdatePrinterState(const std::string &printerId, uint32_t state) override;
68     int32_t UpdatePrintJobStateForNormalApp(const std::string &jobId, uint32_t state, uint32_t subState) override;
69     int32_t UpdatePrintJobStateOnlyForSystemApp(const std::string &jobId, uint32_t state, uint32_t subState) override;
70     int32_t UpdateExtensionInfo(const std::string &extInfo) override;
71     int32_t RequestPreview(const PrintJob &jobinfo, std::string &previewResult) override;
72     int32_t QueryPrinterCapability(const std::string &printerId) override;
73     int32_t On(const std::string taskId, const std::string &type, const sptr<IPrintCallback> &listener) override;
74     int32_t Off(const std::string taskId, const std::string &type) override;
75     int32_t RegisterPrinterCallback(const std::string &type, const sptr<IPrintCallback> &listener) override;
76     int32_t UnregisterPrinterCallback(const std::string &type) override;
77     int32_t RegisterExtCallback(const std::string &extensionCID,
78         const sptr<IPrintExtensionCallback> &listener) override;
79     int32_t UnregisterAllExtCallback(const std::string &extensionId) override;
80     int32_t LoadExtSuccess(const std::string &extensionId) override;
81     int32_t QueryAllPrintJob(std::vector<PrintJob> &printJobs) override;
82     int32_t QueryPrintJobById(std::string &printJobId, PrintJob &printjob) override;
83     int32_t AddPrinterToCups(const std::string &printerUri, const std::string &printerName,
84         const std::string &printerMake) override;
85     int32_t QueryPrinterCapabilityByUri(const std::string &printerUri, const std::string &printerId,
86         PrinterCapability &printerCaps) override;
87     void SetHelper(const std::shared_ptr<PrintServiceHelper> &helper);
88     int32_t PrintByAdapter(const std::string jobName, const PrintAttributes &printAttributes,
89         std::string &taskId) override;
90     int32_t StartGetPrintFile(const std::string &jobId, const PrintAttributes &printAttributes,
91         const uint32_t fd) override;
92     int32_t NotifyPrintService(const std::string &jobId, const std::string &type) override;
93 
94     int32_t QueryPrinterInfoByPrinterId(const std::string &printerId, PrinterInfo &info) override;
95 
96     int32_t QueryAddedPrinter(std::vector<std::string> &printerNameList) override;
97 
98     int32_t QueryPrinterProperties(const std::string &printerId, const std::vector<std::string> &keyList,
99         std::vector<std::string> &valueList) override;
100     int32_t StartNativePrintJob(PrintJob &printJob) override;
101     int32_t UpdatePrintJobState(const std::string &jobId, uint32_t state, uint32_t subState);
102     void CancelUserPrintJobs(const int32_t userId);
103     void NotifyCurrentUserChanged(const int32_t userId);
104     int32_t NotifyPrintServiceEvent(std::string &jobId, uint32_t event) override;
105     int32_t GetPrinterPreference(const std::string &printerId, std::string &printerPreference) override;
106     int32_t SetPrinterPreference(const std::string &printerId, const std::string &printerPreference) override;
107     int32_t SetDefaultPrinter(const std::string &printerId, uint32_t type) override;
108     int32_t DeletePrinterFromCups(const std::string &printerName) override;
109     int32_t DiscoverUsbPrinters(std::vector<PrinterInfo> &printers) override;
110     int32_t AddPrinterToDiscovery(const PrinterInfo &printerInfo) override;
111     int32_t UpdatePrinterInDiscovery(const PrinterInfo &printerInfo) override;
112     int32_t RemovePrinterFromDiscovery(const std::string &printerId) override;
113     int32_t UpdatePrinterInSystem(const PrinterInfo &printerInfo) override;
114     bool QueryPPDInformation(const char *makeModel, std::vector<std::string> &ppds) override;
115 
116 protected:
117     void OnStart() override;
118     void OnStop() override;
119 
120 private:
121     int32_t Init();
122     void InitServiceHandler();
123     void ManualStart();
124     std::string GetPrintJobOrderId();
125     bool StartAbility(const AAFwk::Want &want);
126     PrintExtensionInfo ConvertToPrintExtensionInfo(const AppExecFwk::ExtensionAbilityInfo &extInfo);
127     bool DelayStartDiscovery(const std::string &extensionId);
128     int32_t SendPrinterDiscoverEvent(int event, const PrinterInfo &info);
129     int32_t SendPrinterChangeEvent(int event, const PrinterInfo &info);
130     void SendPrinterEvent(const PrinterInfo &info);
131     int32_t SendPrinterEventChangeEvent(PrinterEvent printerEvent, const PrinterInfo &info, bool isSignalUser = false);
132     void SendPrintJobEvent(const PrintJob &jobInfo);
133     int32_t SendExtensionEvent(const std::string &extensionId, const std::string &extInfo);
134     bool CheckPermission(const std::string &permissionName);
135     bool SendQueuePrintJob(const std::string &printerId);
136     void NotifyAppJobQueueChanged(const std::string &applyResult);
137     bool isEprint(const std::string &printerId);
138     int32_t ReportHisysEvent(const std::shared_ptr<PrintJob> &jobInfo, const std::string &printerId, uint32_t subState);
139     void ReportCompletedPrint(const std::string &printerId);
140     void CheckJobQueueBlocked(const PrintJob &jobInfo);
141     int32_t CallSpooler(const std::vector<std::string> &fileList, const std::vector<uint32_t> &fdList,
142         std::string &taskId);
143     void notifyAdapterJobChanged(const std::string jobId, const uint32_t state, const uint32_t subState);
144     bool checkJobState(uint32_t state, uint32_t subState);
145     int32_t CheckAndSendQueuePrintJob(const std::string &jobId, uint32_t state, uint32_t subState);
146     void UpdateQueuedJobList(const std::string &jobId, const std::shared_ptr<PrintJob> &printJob);
147     void StartPrintJobCB(const std::string &jobId, const std::shared_ptr<PrintJob> &printJob);
148     void RegisterAdapterListener(const std::string &jobId);
149     int32_t AdapterGetFileCallBack(const std::string &jobId, uint32_t state, uint32_t subState);
150     bool UpdatePrintJobOptionByPrinterId(PrintJob &printJob);
151     std::shared_ptr<PrintJob> AddNativePrintJob(const std::string &jobId, PrintJob &printJob);
152     int32_t CallStatusBar();
153     bool StartPluginPrintIconExtAbility(const AAFwk::Want &want);
154     bool IsPrinterJobMapEmpty();
155     int32_t GetCurrentUserId();
156     void UpdatePrintUserMap();
157     void AddToPrintJobList(std::string jobId, const std::shared_ptr<PrintJob> &printjob);
158     std::shared_ptr<PrintUserData> GetCurrentUserData();
159     int32_t GetUserIdByJobId(const std::string jobId);
160     std::shared_ptr<PrintUserData> GetUserDataByJobId(const std::string jobId);
161     bool IsQueuedJobListEmpty(const std::string &jobId);
162     void SetPrintJobCanceled(PrintJob &jobinfo);
163     void UnloadSystemAbility();
164     void ReduceAppCount();
165     void InitPreferenceMap();
166     bool WritePreferenceToFile();
167     bool WritePrinterPreference(const std::string &printerId, PrinterCapability &printerCaps);
168     bool WriteEprinterPreference(const std::string &printerId, PrinterCapability &printerCaps);
169     bool ReadPreferenceFromFile(const std::string &printerId, std::string& printPreference);
170     int32_t BuildPrinterPreference(PrinterCapability &cap, PrinterPreference &printPreference);
171     void BuildPrinterPreferenceByDefault(nlohmann::json& capOpt, PreferenceSetting &printerDefaultAttr);
172     void BuildPrinterPreferenceByOption(std::string& key, std::string& supportedOpts,
173         std::vector<std::string>& optAttrs);
174     void BuildPrinterAttrComponentByJson(std::string& key, nlohmann::json& jsonArrObject,
175         std::vector<std::string> &printerAttrs);
176     bool CheckIsDefaultPrinter(const std::string &printerId);
177     bool CheckIsLastUsedPrinter(const std::string &printerId);
178     void SetLastUsedPrinter(const std::string &printerId);
179     int32_t DestroyExtension();
180     void DeletePrinterFromUserData(const std::string &printerId);
181     std::shared_ptr<PrintUserData> GetUserDataByUserId(int32_t userId);
182     PrintJobState DetermineUserJobStatus(const std::map<std::string, std::shared_ptr<PrintJob>> &jobList);
183     void NotifyAppDeletePrinter(const std::string &printerId);
184     void ChangeDefaultPrinterForDelete(std::shared_ptr<PrintUserData> &userData, const std::string &printerId);
185     bool UpdatePrinterCapability(const std::string &printerId, const PrinterInfo &info);
186     bool UpdatePrinterSystemData(const PrinterInfo &info);
187     uint32_t GetListeningState(const uint32_t subState);
188     uint32_t GetListeningState(uint32_t state, uint32_t subState);
189     bool CheckPrintJob(PrintJob &jobInfo);
190     bool CheckPrinterUriDifferent(const std::shared_ptr<PrinterInfo> &info);
191     int32_t AddSinglePrinterInfo(const PrinterInfo &info, const std::string &extensionId);
192     bool UpdateSinglePrinterInfo(const PrinterInfo &info, const std::string &extensionId);
193     bool RemoveSinglePrinterInfo(const std::string &printerId);
194     void HandlePrinterStateChangeRegister(const std::string &eventType);
195     void HandlePrinterChangeRegister(const std::string &eventType);
196     bool UpdateAddedPrinterInCups(const std::string &printerId, const std::string &printerUri);
197     int32_t HandleExtensionConnectPrinter(const std::string &printerId);
198     bool CheckUserIdInEventType(const std::string &type);
199 public:
200     bool AddVendorPrinterToDiscovery(const std::string &globalVendorName, const PrinterInfo &info) override;
201     bool UpdateVendorPrinterToDiscovery(const std::string &globalVendorName, const PrinterInfo &info) override;
202     bool RemoveVendorPrinterFromDiscovery(const std::string &globalVendorName, const std::string &printerId) override;
203     bool AddVendorPrinterToCupsWithPpd(const std::string &globalVendorName, const std::string &printerId,
204         const std::string &ppdData) override;
205     bool AddVendorPrinterToCupsWithSpecificPpd(const std::string &globalVendorName,
206         const std::string &printerId, const std::string &ppdData) override;
207     bool RemoveVendorPrinterFromCups(const std::string &vendorName, const std::string &printerId) override;
208     bool OnVendorStatusUpdate(const std::string &globalVendorName, const std::string &printerId,
209         const PrinterVendorStatus &status) override;
210     bool QueryPrinterCapabilityByUri(const std::string &uri, PrinterCapability &printerCap) override;
211     bool QueryPrinterStatusByUri(const std::string &uri, PrinterStatus &status) override;
212     std::shared_ptr<PrinterInfo> QueryDiscoveredPrinterInfoById(const std::string &printerId) override;
213 private:
214     int32_t StartExtensionDiscovery(const std::vector<std::string> &extensionIds);
215     int32_t StartPrintJobInternal(const std::shared_ptr<PrintJob> &printJob);
216     int32_t QueryVendorPrinterInfo(const std::string &globalPrinterId, PrinterInfo &info);
217     int32_t TryConnectPrinterByIp(const std::string &params);
218     std::string RenamePrinterWhenAdded(const PrinterInfo &info);
219     void ConnectIppOverUsbPrinter(const std::string &printerId);
220 
221 private:
222     PrintSecurityGuardManager securityGuardManager_;
223     ServiceRunningState state_;
224     static std::mutex instanceLock_;
225     static sptr<PrintServiceAbility> instance_;
226     static std::shared_ptr<AppExecFwk::EventHandler> serviceHandler_;
227     static std::chrono::time_point<std::chrono::high_resolution_clock> startPrintTime_;
228     static std::string ingressPackage;
229 
230     std::recursive_mutex apiMutex_;
231     std::map<std::string, sptr<IPrintCallback>> registeredListeners_;
232     std::map<std::string, sptr<IPrintCallback>> adapterListenersByJobId_;
233     std::map<std::string, sptr<IPrintExtensionCallback>> extCallbackMap_;
234 
235     std::map<std::string, AppExecFwk::ExtensionAbilityInfo> extensionList_;
236     std::map<std::string, PrintExtensionState> extensionStateList_;
237     std::map<std::string, std::shared_ptr<PrintJob>> printJobList_;
238     std::map<std::string, std::shared_ptr<PrintJob>> queuedJobList_;
239     std::map<std::string, std::string, JobIdCmp> jobOrderList_;
240     std::map<std::string, PrintAttributes> printAttributesList_;
241 
242     std::map<std::string, std::unordered_map<std::string, bool>> printerJobMap_;
243 
244     std::string spoolerBundleName_;
245     std::string spoolerAbilityName_;
246 
247     std::mutex lock_;
248     uint64_t currentJobOrderId_;
249     std::shared_ptr<PrintServiceHelper> helper_;
250 
251     bool isJobQueueBlocked_;
252     std::map<int64_t, std::shared_ptr<PrintUserData>> printUserDataMap_;
253     PrintSystemData printSystemData_;
254     std::map<int32_t, std::shared_ptr<PrintUserData>> printUserMap_;
255     std::map<std::string, int32_t> userJobMap_;
256     int32_t currentUserId_;
257 
258     uint32_t printAppCount_;
259     uint32_t unloadCount_;
260     std::map<std::string, std::string> printerIdAndPreferenceMap_;
261     std::recursive_mutex printerPreferenceMapMutex_;
262     VendorManager vendorManager;
263 };
264 }  // namespace OHOS::Print
265 #endif  // PRINT_SYSTEM_ABILITY_H
266