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 ¶ms); 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