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