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