• 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 #include "os_account_manager.h"
39 #include "singleton.h"
40 #include "app_mgr_client.h"
41 
42 namespace OHOS::Print {
43 enum class ServiceRunningState { STATE_NOT_START, STATE_RUNNING };
44 class IKeyguardStateCallback;
45 
46 class PrintServiceAbility : public SystemAbility, public PrintServiceStub, public IPrintServiceAbility {
47     DECLARE_SYSTEM_ABILITY(PrintServiceAbility);
48 
49 public:
50     DISALLOW_COPY_AND_MOVE(PrintServiceAbility);
51     PrintServiceAbility(int32_t systemAbilityId, bool runOnCreate);
52     PrintServiceAbility() = default;
53     ~PrintServiceAbility();
54     static sptr<PrintServiceAbility> GetInstance();
55     int32_t StartService() override;
56     int32_t StartPrint(const std::vector<std::string> &fileList,
57         const std::vector<uint32_t> &fdList, std::string &taskId) override;
58     int32_t StopPrint(const std::string &taskId) override;
59     int32_t ConnectPrinter(const std::string &printerId) override;
60     int32_t DisconnectPrinter(const std::string &printerId) override;
61     int32_t StartDiscoverPrinter(const std::vector<std::string> &extensionList) override;
62     int32_t StopDiscoverPrinter() override;
63     int32_t QueryAllExtension(std::vector<PrintExtensionInfo> &extensionInfos) override;
64     int32_t StartPrintJob(PrintJob &jobinfo) override;
65     int32_t CancelPrintJob(const std::string &jobId) override;
66     int32_t RestartPrintJob(const std::string &jobId) override;
67     int32_t AddPrinters(const std::vector<PrinterInfo> &printerInfos) override;
68     int32_t RemovePrinters(const std::vector<std::string> &printerIds) override;
69     int32_t UpdatePrinters(const std::vector<PrinterInfo> &printerInfos) override;
70     int32_t UpdatePrinterState(const std::string &printerId, uint32_t state) override;
71     int32_t UpdatePrintJobStateForNormalApp(const std::string &jobId, uint32_t state, uint32_t subState) override;
72     int32_t UpdatePrintJobStateOnlyForSystemApp(const std::string &jobId, uint32_t state, uint32_t subState) override;
73     int32_t UpdateExtensionInfo(const std::string &extInfo) override;
74     int32_t RequestPreview(const PrintJob &jobinfo, std::string &previewResult) override;
75     int32_t QueryPrinterCapability(const std::string &printerId) override;
76     int32_t On(const std::string taskId, const std::string &type, const sptr<IPrintCallback> &listener) override;
77     int32_t Off(const std::string taskId, const std::string &type) override;
78     int32_t RegisterPrinterCallback(const std::string &type, const sptr<IPrintCallback> &listener) override;
79     int32_t UnregisterPrinterCallback(const std::string &type) override;
80     int32_t RegisterExtCallback(const std::string &extensionCID,
81         const sptr<IPrintExtensionCallback> &listener) override;
82     int32_t UnregisterAllExtCallback(const std::string &extensionId) override;
83     int32_t LoadExtSuccess(const std::string &extensionId) override;
84     int32_t QueryAllPrintJob(std::vector<PrintJob> &printJobs) override;
85     int32_t QueryAllActivePrintJob(std::vector<PrintJob> &printJobs) override;
86     int32_t QueryPrintJobById(std::string &printJobId, PrintJob &printjob) override;
87     int32_t AddPrinterToCups(const std::string &printerUri, const std::string &printerName,
88         const std::string &printerMake) override;
89     int32_t QueryPrinterCapabilityByUri(const std::string &printerUri, const std::string &printerId,
90         PrinterCapability &printerCaps) override;
91     void SetHelper(const std::shared_ptr<PrintServiceHelper> &helper);
92     int32_t PrintByAdapter(const std::string jobName, const PrintAttributes &printAttributes,
93         std::string &taskId) override;
94     int32_t StartGetPrintFile(const std::string &jobId, const PrintAttributes &printAttributes,
95         const uint32_t fd) override;
96     int32_t NotifyPrintService(const std::string &jobId, const std::string &type) override;
97 
98     int32_t QueryPrinterInfoByPrinterId(const std::string &printerId, PrinterInfo &info) override;
99 
100     int32_t QueryAddedPrinter(std::vector<std::string> &printerNameList) override;
101 
102     int32_t QueryPrinterProperties(const std::string &printerId, const std::vector<std::string> &keyList,
103         std::vector<std::string> &valueList) override;
104     int32_t StartNativePrintJob(PrintJob &printJob) override;
105     int32_t UpdatePrintJobState(const std::string &jobId, uint32_t state, uint32_t subState);
106     void CancelUserPrintJobs(const int32_t userId);
107     void NotifyCurrentUserChanged(const int32_t userId);
108     bool FlushCacheFileToUserData(const std::string &jobId);
109     bool DeleteCacheFileFromUserData(const std::string &jobId);
110     int32_t NotifyPrintServiceEvent(std::string &jobId, uint32_t event) override;
111     int32_t SetPrinterPreference(const std::string &printerId, const PrinterPreferences &preferences) override;
112     int32_t SetDefaultPrinter(const std::string &printerId, uint32_t type) override;
113     int32_t DeletePrinterFromCups(const std::string &printerName) override;
114     int32_t DiscoverUsbPrinters(std::vector<PrinterInfo> &printers) override;
115     int32_t AddPrinterToDiscovery(const PrinterInfo &printerInfo) override;
116     int32_t UpdatePrinterInDiscovery(const PrinterInfo &printerInfo) override;
117     int32_t RemovePrinterFromDiscovery(const std::string &printerId) override;
118     int32_t UpdatePrinterInSystem(const PrinterInfo &printerInfo) override;
119     bool QueryPPDInformation(const std::string &makeModel, std::string &ppdName) override;
120     void DelayEnterLowPowerMode();
121     void ExitLowPowerMode();
122     bool IsPrinterPpdUpdateRequired(const std::string& standardPrinterName, const std::string& ppdHashCode);
123 
124 protected:
125     void OnStart() override;
126     void OnStop() override;
127 
128 private:
129     int32_t Init();
130     void InitServiceHandler();
131     void ManualStart();
132     std::string GetPrintJobOrderId();
133     bool StartAbility(const AAFwk::Want &want);
134     PrintExtensionInfo ConvertToPrintExtensionInfo(const AppExecFwk::ExtensionAbilityInfo &extInfo);
135     bool DelayStartDiscovery(const std::string &extensionId);
136     int32_t SendPrinterDiscoverEvent(int event, const PrinterInfo &info);
137     int32_t SendPrinterChangeEvent(int event, const PrinterInfo &info);
138     void SendPrinterEvent(const PrinterInfo &info, const std::string userId = "");
139     int32_t SendPrinterEventChangeEvent(PrinterEvent printerEvent, const PrinterInfo &info, bool isSignalUser = false);
140     void SendPrintJobEvent(const PrintJob &jobInfo);
141     int32_t SendExtensionEvent(const std::string &extensionId, const std::string &extInfo);
142     bool CheckPermission(const std::string &permissionName);
143     bool SendQueuePrintJob(const std::string &printerId);
144     void NotifyAppJobQueueChanged(const std::string &applyResult);
145     bool isEprint(const std::string &printerId);
146     int32_t ReportHisysEvent(const std::shared_ptr<PrintJob> &jobInfo, const std::string &printerId, uint32_t subState);
147     void ReportCompletedPrint(const std::string &printerId);
148     void CheckJobQueueBlocked(const PrintJob &jobInfo);
149     int32_t CallSpooler(const std::vector<std::string> &fileList, const std::vector<uint32_t> &fdList,
150         std::string &taskId);
151     void notifyAdapterJobChanged(const std::string jobId, const uint32_t state, const uint32_t subState);
152     bool checkJobState(uint32_t state, uint32_t subState);
153     int32_t CheckAndSendQueuePrintJob(const std::string &jobId, uint32_t state, uint32_t subState);
154     void UpdateQueuedJobList(const std::string &jobId, const std::shared_ptr<PrintJob> &printJob);
155     void StartPrintJobCB(const std::string &jobId, const std::shared_ptr<PrintJob> &printJob);
156     void RegisterAdapterListener(const std::string &jobId);
157     int32_t AdapterGetFileCallBack(const std::string &jobId, uint32_t state, uint32_t subState);
158     bool UpdatePrintJobOptionByPrinterId(PrintJob &printJob);
159     std::shared_ptr<PrintJob> AddNativePrintJob(const std::string &jobId, PrintJob &printJob);
160     int32_t CallStatusBar();
161     bool StartPluginPrintIconExtAbility(const AAFwk::Want &want);
162     bool IsPrinterJobMapEmpty();
163     int32_t GetCurrentUserId();
164     std::string GetCallerUserName();
165     void UpdatePrintUserMap();
166     void AddToPrintJobList(std::string jobId, const std::shared_ptr<PrintJob> &printjob);
167     std::shared_ptr<PrintUserData> GetCurrentUserData();
168     int32_t GetUserIdByJobId(const std::string jobId);
169     std::shared_ptr<PrintUserData> GetUserDataByJobId(const std::string jobId);
170     bool IsQueuedJobListEmpty(const std::string &jobId);
171     void SetPrintJobCanceled(PrintJob &jobinfo);
172     bool UnloadSystemAbility();
173     bool CheckIsDefaultPrinter(const std::string &printerId);
174     bool CheckIsLastUsedPrinter(const std::string &printerId);
175     void SetLastUsedPrinter(const std::string &printerId);
176     int32_t DestroyExtension();
177     void DeletePrinterFromUserData(const std::string &printerId);
178     std::shared_ptr<PrintUserData> GetUserDataByUserId(int32_t userId);
179     PrintJobState DetermineUserJobStatus(const std::map<std::string, std::shared_ptr<PrintJob>> &jobList);
180     void NotifyAppDeletePrinter(const std::string &printerId);
181     void ChangeDefaultPrinterForDelete(std::shared_ptr<PrintUserData> &userData, const std::string &printerId);
182     bool UpdatePrinterCapability(const std::string &printerId, const PrinterInfo &info);
183     uint32_t GetListeningState(const uint32_t subState);
184     uint32_t GetListeningState(uint32_t state, uint32_t subState);
185     bool CheckPrintJob(PrintJob &jobInfo);
186     bool CheckPrinterUriDifferent(const std::shared_ptr<PrinterInfo> &info);
187     int32_t AddSinglePrinterInfo(const PrinterInfo &info, const std::string &extensionId);
188     bool UpdateSinglePrinterInfo(const PrinterInfo &info, const std::string &extensionId);
189     bool RemoveSinglePrinterInfo(const std::string &printerId);
190     void HandlePrinterStateChangeRegister(const std::string &eventType);
191     void HandlePrinterChangeRegister(const std::string &eventType);
192     bool UpdateAddedPrinterInCups(const std::string &printerId, const std::string &printerUri);
193     int32_t HandleExtensionConnectPrinter(const std::string &printerId);
194     bool CheckUserIdInEventType(const std::string &type);
195     void BuildPrinterPreference(PrinterInfo &printerInfo);
196     void ClosePrintJobFd(std::shared_ptr<PrintJob> printJob);
197     bool OpenCacheFileFd(const std::string &jobId, std::vector<uint32_t> &fdList);
198     int32_t QueryQueuedPrintJobById(const std::string &printJobId, PrintJob &printJob);
199     int32_t QueryHistoryPrintJobById(const std::string &printJobId, PrintJob &printJob);
200     bool AddPrintJobToHistoryList(const std::shared_ptr<PrintJob> &printjob);
201     void CancelPrintJobHandleCallback(const std::shared_ptr<PrintUserData> userData,
202         const sptr<IPrintExtensionCallback> cbFunc, const std::string &jobId);
203     void UpdatePrintJobOptionWithPrinterPreferences(Json::Value &options, PrinterInfo &printerInfo);
204     void UpdatePageSizeNameWithPrinterInfo(PrinterInfo &printerInfo, PrintPageSize &pageSize);
205     Json::Value ConvertModifiedPreferencesToJson(PrinterPreferences &preferences);
206     int32_t ConnectUsbPrinter(const std::string &printerId);
207     void RefreshPrinterInfoByPpd();
208     void CheckCupsServerAlive();
209     void RefreshPrinterPageSize(PrinterInfo& printerInfo);
210     int32_t BlockPrintJob(const std::string &jobId);
211     void BlockUserPrintJobs(const int32_t userId);
212     bool CheckPrintConstraint();
213     sptr<AppExecFwk::IAppMgr> GetAppManager();
214     bool IsAppAlive(const std::string &bundleName, int32_t pid);
215     void CallerAppsMonitor();
216     void StartUnloadThread();
217     std::vector<AppExecFwk::RunningProcessInfo> GetRunningProcessInformation(const std::string &bundleName);
218     bool QueryAddedPrinterInfoByPrinterId(const std::string &printerId, PrinterInfo &printer);
219 
220 public:
221     bool AddVendorPrinterToDiscovery(const std::string &globalVendorName, const PrinterInfo &info) override;
222     bool UpdateVendorPrinterToDiscovery(const std::string &globalVendorName, const PrinterInfo &info) override;
223     bool RemoveVendorPrinterFromDiscovery(const std::string &globalVendorName, const std::string &printerId) override;
224     bool AddVendorPrinterToCupsWithPpd(const std::string &globalVendorName, const std::string &printerId,
225         const std::string &ppdName, const std::string &ppdData) override;
226     bool RemoveVendorPrinterFromCups(const std::string &vendorName, const std::string &printerId) override;
227     bool OnVendorStatusUpdate(const std::string &globalVendorName, const std::string &printerId,
228         const PrinterVendorStatus &status) override;
229     bool QueryPrinterCapabilityByUri(const std::string &uri, PrinterCapability &printerCap) override;
230     bool QueryPrinterStatusByUri(const std::string &uri, PrinterStatus &status) override;
231     std::shared_ptr<PrinterInfo> QueryDiscoveredPrinterInfoById(const std::string &printerId) override;
232     std::shared_ptr<PrinterInfo> QueryConnectingPrinterInfoById(const std::string &printerId) override;
233     bool AddIpPrinterToSystemData(const std::string &globalVendorName, const PrinterInfo &info) override;
234     bool AddIpPrinterToCupsWithPpd(const std::string &globalVendorName, const std::string &printerId,
235         const std::string &ppdName, const std::string &ppdData) override;
236     std::vector<std::string> QueryAddedPrintersByIp(const std::string &printerIp) override;
237     int32_t DiscoverBackendPrinters(std::vector<PrinterInfo> &printers) override;
238 
239 private:
240     int32_t StartExtensionDiscovery(const std::vector<std::string> &extensionIds);
241     int32_t StartPrintJobInternal(const std::shared_ptr<PrintJob> &printJob);
242     int32_t QueryVendorPrinterInfo(const std::string &globalPrinterId, PrinterInfo &info);
243     int32_t TryConnectPrinterByIp(const std::string &params);
244     std::string RenamePrinterWhenAdded(const PrinterInfo &info);
245     void ReportPrinterIdle(const std::string &printerId);
246     void UnregisterPrintTaskCallback(const std::string &jobId, const uint32_t state, const uint32_t subState);
247     bool DoAddPrinterToCups(std::shared_ptr<PrinterInfo> printerInfo, const std::string &ppdName,
248         const std::string &ppdData);
249     bool DoAddPrinterToCupsEnable(const std::string &printerUri, const std::string &printerName,
250         std::shared_ptr<PrinterInfo> printerInfo, const std::string &ppdName, const std::string &ppdData);
251     void OnPrinterAddedToCups(std::shared_ptr<PrinterInfo> printerInfo, const std::string& ppdName);
252     bool DeletePrintJobFromHistoryList(const std::string jobId);
253 
254 private:
255     PrintSecurityGuardManager securityGuardManager_;
256     ServiceRunningState state_;
257     static std::mutex instanceLock_;
258     static sptr<PrintServiceAbility> instance_;
259     static std::chrono::time_point<std::chrono::high_resolution_clock> startPrintTime_;
260     static std::string ingressPackage;
261 
262     std::recursive_mutex apiMutex_;
263     std::map<std::string, sptr<IPrintCallback>> registeredListeners_;
264     std::map<std::string, sptr<IPrintCallback>> adapterListenersByJobId_;
265     std::map<std::string, sptr<IPrintExtensionCallback>> extCallbackMap_;
266 
267     std::map<std::string, AppExecFwk::ExtensionAbilityInfo> extensionList_;
268     std::map<std::string, PrintExtensionState> extensionStateList_;
269     std::map<std::string, std::shared_ptr<PrintJob>> printJobList_;
270     std::map<std::string, std::shared_ptr<PrintJob>> queuedJobList_;
271     std::map<std::string, std::string, JobIdCmp> jobOrderList_;
272     std::map<std::string, PrintAttributes> printAttributesList_;
273 
274     std::map<std::string, std::unordered_map<std::string, bool>> printerJobMap_;
275 
276     uint64_t currentJobOrderId_;
277     std::shared_ptr<PrintServiceHelper> helper_;
278     std::shared_ptr<AppExecFwk::EventHandler> serviceHandler_;
279 
280     bool isJobQueueBlocked_;
281     std::map<int64_t, std::shared_ptr<PrintUserData>> printUserDataMap_;
282     PrintSystemData printSystemData_;
283     std::map<int32_t, std::shared_ptr<PrintUserData>> printUserMap_;
284     std::map<std::string, int32_t> userJobMap_;
285     int32_t currentUserId_;
286 
287     uint32_t enterLowPowerCount_;
288     bool isLowPowerMode_;
289     VendorManager vendorManager;
290 
291     std::map<int32_t, std::string> callerMap_;
292     bool unloadThread = false;
293     std::recursive_mutex callerMapMutex_;
294 
295 #ifdef ENTERPRISE_ENABLE
296 private:
297     std::atomic<bool> isEnterprise_ = false;
298     std::atomic<int32_t> lastUserId_ = -1;
299 public:
300     void UpdateIsEnterprise();
301     bool IsEnterpriseEnable();
302     bool IsEnterprise();
303     void RefreshPrinterStatusOnSwitchUser();
304 #endif // ENTERPRISE_ENABLE
305 };
306 }  // namespace OHOS::Print
307 #endif  // PRINT_SYSTEM_ABILITY_H
308