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 UpdatePrintJobStateOnlyForSystemApp(const std::string &jobId, uint32_t state, uint32_t subState) override;
69     int32_t UpdateExtensionInfo(const std::string &extInfo) override;
70     int32_t RequestPreview(const PrintJob &jobinfo, std::string &previewResult) override;
71     int32_t QueryPrinterCapability(const std::string &printerId) override;
72     int32_t On(const std::string taskId, const std::string &type, const sptr<IPrintCallback> &listener) override;
73     int32_t Off(const std::string taskId, const std::string &type) override;
74     int32_t RegisterPrinterCallback(const std::string &type, const sptr<IPrintCallback> &listener) override;
75     int32_t UnregisterPrinterCallback(const std::string &type) override;
76     int32_t RegisterExtCallback(const std::string &extensionCID,
77         const sptr<IPrintExtensionCallback> &listener) override;
78     int32_t UnregisterAllExtCallback(const std::string &extensionId) override;
79     int32_t LoadExtSuccess(const std::string &extensionId) override;
80     int32_t QueryAllPrintJob(std::vector<PrintJob> &printJobs) override;
81     int32_t QueryPrintJobById(std::string &printJobId, PrintJob &printjob) override;
82     int32_t AddPrinterToCups(const std::string &printerUri, const std::string &printerName,
83         const std::string &printerMake) override;
84     int32_t QueryPrinterCapabilityByUri(const std::string &printerUri, const std::string &printerId,
85         PrinterCapability &printerCaps) override;
86     void SetHelper(const std::shared_ptr<PrintServiceHelper> &helper);
87     int32_t PrintByAdapter(const std::string jobName, const PrintAttributes &printAttributes,
88         std::string &taskId) override;
89     int32_t StartGetPrintFile(const std::string &jobId, const PrintAttributes &printAttributes,
90         const uint32_t fd) override;
91     int32_t NotifyPrintService(const std::string &jobId, const std::string &type) override;
92 
93     int32_t QueryPrinterInfoByPrinterId(const std::string &printerId, PrinterInfo &info) override;
94 
95     int32_t QueryAddedPrinter(std::vector<std::string> &printerNameList) override;
96 
97     int32_t QueryPrinterProperties(const std::string &printerId, const std::vector<std::string> &keyList,
98         std::vector<std::string> &valueList) override;
99     int32_t StartNativePrintJob(PrintJob &printJob) override;
100     int32_t UpdatePrintJobState(const std::string &jobId, uint32_t state, uint32_t subState);
101     void CancelUserPrintJobs(const int32_t userId);
102     void NotifyCurrentUserChanged(const int32_t userId);
103     int32_t NotifyPrintServiceEvent(std::string &jobId, uint32_t event) override;
104     int32_t GetPrinterPreference(const std::string &printerId, std::string &printerPreference) override;
105     int32_t SetPrinterPreference(const std::string &printerId, const std::string &printerPreference) override;
106     int32_t SetDefaultPrinter(const std::string &printerId, uint32_t type) override;
107     int32_t DeletePrinterFromCups(const std::string &printerUri, const std::string &printerName,
108         const std::string &printerMake) 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 
114 protected:
115     void OnStart() override;
116     void OnStop() override;
117 
118 private:
119     int32_t Init();
120     void InitServiceHandler();
121     void ManualStart();
122     std::string GetPrintJobOrderId();
123     bool StartAbility(const AAFwk::Want &want);
124     PrintExtensionInfo ConvertToPrintExtensionInfo(const AppExecFwk::ExtensionAbilityInfo &extInfo);
125     bool DelayStartDiscovery(const std::string &extensionId);
126     void SendPrinterDiscoverEvent(int event, const PrinterInfo &info);
127     void SendPrinterChangeEvent(int event, const PrinterInfo &info);
128     void SendPrinterEvent(const PrinterInfo &info);
129     void SendPrinterEventChangeEvent(PrinterEvent printerEvent, const PrinterInfo &info, bool isSignalUser = false);
130     void SendPrintJobEvent(const PrintJob &jobInfo);
131     void SendExtensionEvent(const std::string &extensionId, const std::string &extInfo);
132     bool CheckPermission(const std::string &permissionName);
133     void SendQueuePrintJob(const std::string &printerId);
134     void NotifyAppJobQueueChanged(const std::string &applyResult);
135     bool isEprint(const std::string &printerId);
136     void ReportHisysEvent(const std::shared_ptr<PrintJob> &jobInfo, const std::string &printerId, uint32_t subState);
137     void ReportCompletedPrint(const std::string &printerId);
138     void CheckJobQueueBlocked(const PrintJob &jobInfo);
139     int32_t CallSpooler(const std::vector<std::string> &fileList, const std::vector<uint32_t> &fdList,
140         std::string &taskId);
141     void notifyAdapterJobChanged(const std::string jobId, const uint32_t state, const uint32_t subState);
142     bool checkJobState(uint32_t state, uint32_t subState);
143     int32_t CheckAndSendQueuePrintJob(const std::string &jobId, uint32_t state, uint32_t subState);
144     void UpdateQueuedJobList(const std::string &jobId, const std::shared_ptr<PrintJob> &printJob);
145     void StartPrintJobCB(const std::string &jobId, const std::shared_ptr<PrintJob> &printJob);
146     void RegisterAdapterListener(const std::string &jobId);
147     int32_t AdapterGetFileCallBack(const std::string &jobId, uint32_t state, uint32_t subState);
148     bool UpdatePrintJobOptionByPrinterId(PrintJob &printJob);
149     std::shared_ptr<PrintJob> AddNativePrintJob(const std::string &jobId, PrintJob &printJob);
150     int32_t CallStatusBar();
151     bool StartPluginPrintIconExtAbility(const AAFwk::Want &want);
152     bool IsPrinterJobMapEmpty();
153     int32_t GetCurrentUserId();
154     void UpdatePrintUserMap();
155     void AddToPrintJobList(std::string jobId, const std::shared_ptr<PrintJob> &printjob);
156     std::shared_ptr<PrintUserData> GetCurrentUserData();
157     int32_t GetUserIdByJobId(const std::string jobId);
158     std::shared_ptr<PrintUserData> GetUserDataByJobId(const std::string jobId);
159     bool IsQueuedJobListEmpty(const std::string &jobId);
160     void SetPrintJobCanceled(PrintJob &jobinfo);
161     void UnloadSystemAbility();
162     void ReduceAppCount();
163     void InitPreferenceMap();
164     bool WritePreferenceToFile();
165     bool WritePrinterPreference(const std::string &printerId, PrinterCapability &printerCaps);
166     bool WriteEprinterPreference(const std::string &printerId, PrinterCapability &printerCaps);
167     bool ReadPreferenceFromFile(const std::string &printerId, std::string& printPreference);
168     int32_t BuildPrinterPreference(PrinterCapability &cap, PrinterPreference &printPreference);
169     void BuildPrinterPreferenceByDefault(nlohmann::json& capOpt, PreferenceSetting &printerDefaultAttr);
170     void BuildPrinterPreferenceByOption(std::string& key, std::string& supportedOpts,
171         std::vector<std::string>& optAttrs);
172     void BuildPrinterAttrComponentByJson(std::string& key, nlohmann::json& jsonArrObject,
173         std::vector<std::string> &printerAttrs);
174     bool CheckIsDefaultPrinter(const std::string &printerId);
175     bool CheckIsLastUsedPrinter(const std::string &printerId);
176     void SetLastUsedPrinter(const std::string &printerId);
177     int32_t DestroyExtension();
178     void DeletePrinterFromUserData(const std::string &printerId);
179     std::shared_ptr<PrintUserData> GetUserDataByUserId(int32_t userId);
180     PrintJobState DetermineUserJobStatus(const std::map<std::string, std::shared_ptr<PrintJob>> &jobList);
181     void NotifyAppDeletePrinter(const std::string &printerId);
182     void ChangeDefaultPrinterForDelete(std::shared_ptr<PrintUserData> &userData, const std::string &printerId);
183     bool UpdatePrinterCapability(const std::string &printerId, const PrinterInfo &info);
184     bool UpdatePrinterSystemData(const PrinterInfo &info);
185     uint32_t GetListeningState(const uint32_t subState);
186     uint32_t GetListeningState(uint32_t state, uint32_t subState);
187     bool CheckPrintJob(PrintJob &jobInfo);
188     bool CheckPrinterUriDifferent(const std::shared_ptr<PrinterInfo> &info);
189     int32_t AddSinglePrinterInfo(const PrinterInfo &info, const std::string &extensionId);
190     bool UpdateSinglePrinterInfo(const PrinterInfo &info, const std::string &extensionId);
191     bool RemoveSinglePrinterInfo(const std::string &printerId);
192     void HandlePrinterStateChangeRegister(const std::string &eventType);
193     void HandlePrinterChangeRegister(const std::string &eventType);
194     bool UpdateAddedPrinterInCups(const std::string &printerId, const std::string &printerUri);
195     int32_t HandleExtensionConnectPrinter(const std::string &printerId);
196     bool CheckUserIdInEventType(const std::string &type);
197 public:
198     bool AddVendorPrinterToDiscovery(const std::string &globalVendorName, const PrinterInfo &info) override;
199     bool UpdateVendorPrinterToDiscovery(const std::string &globalVendorName, const PrinterInfo &info) override;
200     bool RemoveVendorPrinterFromDiscovery(const std::string &globalVendorName, const std::string &printerId) override;
201     bool AddVendorPrinterToCupsWithPpd(const std::string &globalVendorName, const std::string &printerId,
202         const std::string &ppdData) override;
203     bool RemoveVendorPrinterFromCups(const std::string &vendorName, const std::string &printerId) override;
204     bool OnVendorStatusUpdate(const std::string &globalVendorName, const std::string &printerId,
205         const PrinterVendorStatus &status) override;
206     bool QueryPrinterCapabilityByUri(const std::string &uri, PrinterCapability &printerCap) override;
207     bool QueryPrinterStatusByUri(const std::string &uri, PrinterStatus &status) override;
208     std::shared_ptr<PrinterInfo> QueryDiscoveredPrinterInfoById(const std::string &printerId);
209 private:
210     int32_t StartExtensionDiscovery(const std::vector<std::string> &extensionIds);
211     int32_t StartPrintJobInternal(const std::shared_ptr<PrintJob> &printJob);
212     int32_t QueryVendorPrinterInfo(const std::string &globalPrinterId, PrinterInfo &info);
213     int32_t TryConnectPrinterByIp(const std::string &params);
214     std::string RenamePrinterWhenAdded(const PrinterInfo &info);
215 
216 private:
217     PrintSecurityGuardManager securityGuardManager_;
218     ServiceRunningState state_;
219     static std::mutex instanceLock_;
220     static sptr<PrintServiceAbility> instance_;
221     static std::shared_ptr<AppExecFwk::EventHandler> serviceHandler_;
222     static std::chrono::time_point<std::chrono::high_resolution_clock> startPrintTime_;
223     static std::string ingressPackage;
224 
225     std::recursive_mutex apiMutex_;
226     std::map<std::string, sptr<IPrintCallback>> registeredListeners_;
227     std::map<std::string, sptr<IPrintCallback>> adapterListenersByJobId_;
228     std::map<std::string, sptr<IPrintExtensionCallback>> extCallbackMap_;
229 
230     std::map<std::string, AppExecFwk::ExtensionAbilityInfo> extensionList_;
231     std::map<std::string, PrintExtensionState> extensionStateList_;
232     std::map<std::string, std::shared_ptr<PrintJob>> printJobList_;
233     std::map<std::string, std::shared_ptr<PrintJob>> queuedJobList_;
234     std::map<std::string, std::string, JobIdCmp> jobOrderList_;
235     std::map<std::string, PrintAttributes> printAttributesList_;
236 
237     std::map<std::string, std::unordered_map<std::string, bool>> printerJobMap_;
238 
239     std::string spoolerBundleName_;
240     std::string spoolerAbilityName_;
241 
242     std::mutex lock_;
243     uint64_t currentJobOrderId_;
244     std::shared_ptr<PrintServiceHelper> helper_;
245 
246     bool isJobQueueBlocked_;
247     std::map<int64_t, std::shared_ptr<PrintUserData>> printUserDataMap_;
248     PrintSystemData printSystemData_;
249     std::map<int32_t, std::shared_ptr<PrintUserData>> printUserMap_;
250     std::map<std::string, int32_t> userJobMap_;
251     int32_t currentUserId_;
252 
253     uint32_t printAppCount_;
254     uint32_t unloadCount_;
255     std::map<std::string, std::string> printerIdAndPreferenceMap_;
256     VendorManager vendorManager;
257 };
258 }  // namespace OHOS::Print
259 #endif  // PRINT_SYSTEM_ABILITY_H
260