• 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 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 <json/json.h>
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 "vendor_manager.h"
38 
39 namespace OHOS::Print {
40 enum class ServiceRunningState { STATE_NOT_START, STATE_RUNNING };
41 class IKeyguardStateCallback;
42 
43 class PrintServiceAbility : public SystemAbility, public PrintServiceStub, public IPrintServiceAbility {
44     DECLARE_SYSTEM_ABILITY(PrintServiceAbility);
45 
46 public:
47     DISALLOW_COPY_AND_MOVE(PrintServiceAbility);
48     PrintServiceAbility(int32_t systemAbilityId, bool runOnCreate);
49     PrintServiceAbility();
50     ~PrintServiceAbility();
51     static sptr<PrintServiceAbility> GetInstance();
52     int32_t StartService() override;
53     int32_t StartPrint(const std::vector<std::string> &fileList,
54         const std::vector<uint32_t> &fdList, std::string &taskId) override;
55     int32_t StopPrint(const std::string &taskId) override;
56     int32_t ConnectPrinter(const std::string &printerId) override;
57     int32_t DisconnectPrinter(const std::string &printerId) override;
58     int32_t StartDiscoverPrinter(const std::vector<std::string> &extensionList) override;
59     int32_t StopDiscoverPrinter() override;
60     int32_t QueryAllExtension(std::vector<PrintExtensionInfo> &extensionInfos) override;
61     int32_t StartPrintJob(PrintJob &jobinfo) override;
62     int32_t CancelPrintJob(const std::string &jobId) override;
63     int32_t AddPrinters(const std::vector<PrinterInfo> &printerInfos) override;
64     int32_t RemovePrinters(const std::vector<std::string> &printerIds) override;
65     int32_t UpdatePrinters(const std::vector<PrinterInfo> &printerInfos) override;
66     int32_t UpdatePrinterState(const std::string &printerId, uint32_t state) override;
67     int32_t UpdatePrintJobStateForNormalApp(const std::string &jobId, uint32_t state, uint32_t subState) 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 SetPrinterPreference(const std::string &printerId, const PrinterPreferences &preferences) override;
105     int32_t SetDefaultPrinter(const std::string &printerId, uint32_t type) override;
106     int32_t DeletePrinterFromCups(const std::string &printerName) override;
107     int32_t DiscoverUsbPrinters(std::vector<PrinterInfo> &printers) override;
108     int32_t AddPrinterToDiscovery(const PrinterInfo &printerInfo) override;
109     int32_t UpdatePrinterInDiscovery(const PrinterInfo &printerInfo) override;
110     int32_t RemovePrinterFromDiscovery(const std::string &printerId) override;
111     int32_t UpdatePrinterInSystem(const PrinterInfo &printerInfo) override;
112     bool QueryPPDInformation(const char *makeModel, std::vector<std::string> &ppds) 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     int32_t SendPrinterDiscoverEvent(int event, const PrinterInfo &info);
127     int32_t SendPrinterChangeEvent(int event, const PrinterInfo &info);
128     void SendPrinterEvent(const PrinterInfo &info);
129     int32_t SendPrinterEventChangeEvent(PrinterEvent printerEvent, const PrinterInfo &info, bool isSignalUser = false);
130     void SendPrintJobEvent(const PrintJob &jobInfo);
131     int32_t SendExtensionEvent(const std::string &extensionId, const std::string &extInfo);
132     bool CheckPermission(const std::string &permissionName);
133     bool SendQueuePrintJob(const std::string &printerId);
134     void NotifyAppJobQueueChanged(const std::string &applyResult);
135     bool isEprint(const std::string &printerId);
136     int32_t 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     bool CheckIsDefaultPrinter(const std::string &printerId);
164     bool CheckIsLastUsedPrinter(const std::string &printerId);
165     void SetLastUsedPrinter(const std::string &printerId);
166     int32_t DestroyExtension();
167     void DeletePrinterFromUserData(const std::string &printerId);
168     std::shared_ptr<PrintUserData> GetUserDataByUserId(int32_t userId);
169     PrintJobState DetermineUserJobStatus(const std::map<std::string, std::shared_ptr<PrintJob>> &jobList);
170     void NotifyAppDeletePrinter(const std::string &printerId);
171     void ChangeDefaultPrinterForDelete(std::shared_ptr<PrintUserData> &userData, const std::string &printerId);
172     bool UpdatePrinterCapability(const std::string &printerId, const PrinterInfo &info);
173     uint32_t GetListeningState(const uint32_t subState);
174     uint32_t GetListeningState(uint32_t state, uint32_t subState);
175     bool CheckPrintJob(PrintJob &jobInfo);
176     bool CheckPrinterUriDifferent(const std::shared_ptr<PrinterInfo> &info);
177     int32_t AddSinglePrinterInfo(const PrinterInfo &info, const std::string &extensionId);
178     bool UpdateSinglePrinterInfo(const PrinterInfo &info, const std::string &extensionId);
179     bool RemoveSinglePrinterInfo(const std::string &printerId);
180     void HandlePrinterStateChangeRegister(const std::string &eventType);
181     void HandlePrinterChangeRegister(const std::string &eventType);
182     bool UpdateAddedPrinterInCups(const std::string &printerId, const std::string &printerUri);
183     int32_t HandleExtensionConnectPrinter(const std::string &printerId);
184     bool CheckUserIdInEventType(const std::string &type);
185     void BuildCupsPrinterInfo(const std::shared_ptr<PrinterInfo> &printerInfo, CupsPrinterInfo &info);
186 public:
187     bool AddVendorPrinterToDiscovery(const std::string &globalVendorName, const PrinterInfo &info) override;
188     bool UpdateVendorPrinterToDiscovery(const std::string &globalVendorName, const PrinterInfo &info) override;
189     bool RemoveVendorPrinterFromDiscovery(const std::string &globalVendorName, const std::string &printerId) override;
190     bool AddVendorPrinterToCupsWithPpd(const std::string &globalVendorName, const std::string &printerId,
191         const std::string &ppdData) override;
192     bool AddVendorPrinterToCupsWithSpecificPpd(const std::string &globalVendorName,
193         const std::string &printerId, const std::string &ppdData) override;
194     bool RemoveVendorPrinterFromCups(const std::string &vendorName, const std::string &printerId) override;
195     bool OnVendorStatusUpdate(const std::string &globalVendorName, const std::string &printerId,
196         const PrinterVendorStatus &status) override;
197     bool QueryPrinterCapabilityByUri(const std::string &uri, PrinterCapability &printerCap) override;
198     bool QueryPrinterStatusByUri(const std::string &uri, PrinterStatus &status) override;
199     std::shared_ptr<PrinterInfo> QueryDiscoveredPrinterInfoById(const std::string &printerId) override;
200     bool AddIpPrinterToSystemData(const std::string &globalVendorName, const PrinterInfo &info) override;
201     bool AddIpPrinterToCupsWithPpd(const std::string &globalVendorName, const std::string &printerId,
202         const std::string &ppdData) override;
203 private:
204     int32_t StartExtensionDiscovery(const std::vector<std::string> &extensionIds);
205     int32_t StartPrintJobInternal(const std::shared_ptr<PrintJob> &printJob);
206     int32_t QueryVendorPrinterInfo(const std::string &globalPrinterId, PrinterInfo &info);
207     int32_t TryConnectPrinterByIp(const std::string &params);
208     std::string RenamePrinterWhenAdded(const PrinterInfo &info);
209     void ReportPrinterIdle(const std::string &printerId);
210     void UnregisterPrintTaskCallback(const std::string &jobId, const uint32_t state, const uint32_t subState);
211 
212 private:
213     PrintSecurityGuardManager securityGuardManager_;
214     ServiceRunningState state_;
215     static std::mutex instanceLock_;
216     static sptr<PrintServiceAbility> instance_;
217     static std::shared_ptr<AppExecFwk::EventHandler> serviceHandler_;
218     static std::chrono::time_point<std::chrono::high_resolution_clock> startPrintTime_;
219     static std::string ingressPackage;
220 
221     std::recursive_mutex apiMutex_;
222     std::map<std::string, sptr<IPrintCallback>> registeredListeners_;
223     std::map<std::string, sptr<IPrintCallback>> adapterListenersByJobId_;
224     std::map<std::string, sptr<IPrintExtensionCallback>> extCallbackMap_;
225 
226     std::map<std::string, AppExecFwk::ExtensionAbilityInfo> extensionList_;
227     std::map<std::string, PrintExtensionState> extensionStateList_;
228     std::map<std::string, std::shared_ptr<PrintJob>> printJobList_;
229     std::map<std::string, std::shared_ptr<PrintJob>> queuedJobList_;
230     std::map<std::string, std::string, JobIdCmp> jobOrderList_;
231     std::map<std::string, PrintAttributes> printAttributesList_;
232 
233     std::map<std::string, std::unordered_map<std::string, bool>> printerJobMap_;
234 
235     std::string spoolerBundleName_;
236     std::string spoolerAbilityName_;
237 
238     std::mutex lock_;
239     uint64_t currentJobOrderId_;
240     std::shared_ptr<PrintServiceHelper> helper_;
241 
242     bool isJobQueueBlocked_;
243     std::map<int64_t, std::shared_ptr<PrintUserData>> printUserDataMap_;
244     PrintSystemData printSystemData_;
245     std::map<int32_t, std::shared_ptr<PrintUserData>> printUserMap_;
246     std::map<std::string, int32_t> userJobMap_;
247     int32_t currentUserId_;
248 
249     uint32_t printAppCount_;
250     uint32_t unloadCount_;
251     VendorManager vendorManager;
252 };
253 }  // namespace OHOS::Print
254 #endif  // PRINT_SYSTEM_ABILITY_H
255