1 /* 2 * Copyright (c) 2023 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_CUPS_CLIENT_H 17 #define PRINT_CUPS_CLIENT_H 18 19 #include <vector> 20 #include <string> 21 #include <functional> 22 #include <json/json.h> 23 24 #include "singleton.h" 25 #include "print_cups_wrapper.h" 26 #include "print_service_ability.h" 27 #include "print_job.h" 28 29 namespace OHOS::Print { 30 typedef std::function<void()> CallbackFunc; 31 32 struct JobParameters { 33 uint32_t cupsJobId; 34 uint32_t borderless; 35 uint32_t numCopies; 36 bool isAutoRotate; 37 bool isLandscape; 38 std::string duplex; 39 std::string printQuality; 40 std::string jobName; 41 std::string jobOriginatingUserName; 42 std::string printerId; 43 std::string printerName; 44 std::string printerUri; 45 std::string documentFormat; 46 std::string mediaSize; 47 std::string mediaType; 48 std::string color; 49 std::string serviceJobId; 50 std::vector<uint32_t> fdList; 51 PrintServiceAbility *serviceAbility; 52 std::string printerAttrsOptionCupsOption; 53 bool isCanceled = false; 54 Json::Value advancedOpsJson; 55 bool isReverse = false; 56 bool isCollate = true; 57 }; 58 59 enum StatePolicy { 60 STATE_POLICY_STANDARD = 0, 61 STATE_POLICY_BLOCK = 1, 62 STATE_POLICY_HINT = 2, 63 STATE_POLICY_DELAY = 3, 64 }; 65 struct JobStatus { 66 char printer_state_reasons[1024]; 67 ipp_jstate_t job_state; 68 char job_state_reasons[1024]; 69 }; 70 struct JobMonitorParam { 71 PrintServiceAbility *serviceAbility = nullptr; 72 std::string serviceJobId; 73 int cupsJobId = 0; 74 std::string printerUri; 75 std::string printerName; 76 std::string printerId; 77 http_t *http = nullptr; 78 79 StatePolicy policyArray[16] = {}; 80 ipp_jstate_t job_state = IPP_JOB_PENDING; 81 char job_state_reasons[1024] = {}; 82 char job_printer_state_reasons[1024] = {}; 83 bool isFirstQueryState = true; 84 int32_t timesOfSameState = -1; 85 bool isBlock = false; 86 uint32_t substate = 0; 87 bool isPrinterStopped = false; 88 std::string jobOriginatingUserName; 89 bool isCanceled = false; 90 bool isInterrupt = false; 91 JobMonitorParamJobMonitorParam92 JobMonitorParam() {} JobMonitorParamJobMonitorParam93 JobMonitorParam(PrintServiceAbility *serviceAbility, std::string serviceJobId, int cupsJobId, 94 std::string printerUri, std::string printerName, std::string printerId, http_t *http) 95 : serviceAbility(serviceAbility), serviceJobId(serviceJobId), cupsJobId(cupsJobId), 96 printerUri(printerUri), printerName(printerName), printerId(printerId), http(http) {} 97 ~JobMonitorParamJobMonitorParam98 ~JobMonitorParam() 99 { 100 if (http != nullptr) { httpClose(http); } 101 } 102 }; 103 struct MediaSize { 104 std::string name; 105 const float WidthInInches; 106 const float HeightInInches; 107 }; 108 109 std::string GetUsbPrinterSerial(const std::string &deviceUri); 110 std::vector<PrinterInfo>& GetUsbPrinters(); 111 void ClearUsbPrinters(); 112 std::vector<PrinterInfo>& GetBackendPrinters(); 113 void ClearBackendPrinters(); 114 void DeviceCb(const char *deviceClass, const char *deviceId, const char *deviceInfo, 115 const char *deviceMakeAndModel, const char *deviceUri, const char *deviceLocation, void *userData); 116 std::string StandardizePrinterUri(const std::string &printerUri, const std::string &ppdName); 117 118 class PrintCupsClient final : public DelayedSingleton<PrintCupsClient>, 119 public std::enable_shared_from_this<PrintCupsClient> { 120 public: 121 PrintCupsClient(); 122 ~PrintCupsClient(); 123 124 int32_t InitCupsResources(); 125 void StopCupsdService(); 126 #ifdef ENTERPRISE_ENABLE 127 void StopCupsdEnterpriseService(); 128 #endif // ENTERPRISE_ENABLE 129 bool IsCupsServerAlive(); 130 bool QueryPPDInformation(const std::string &makeModel, std::string &ppdName); 131 int32_t AddPrinterToCups(const std::string &printerUri, const std::string &printerName, 132 const std::string &printerMake); 133 int32_t AddPrinterToCupsWithSpecificPpd(const std::string &printerUri, const std::string &printerName, 134 const std::string &ppdName); 135 int32_t AddPrinterToCupsWithPpd(const std::string &printerUri, const std::string &printerName, 136 const std::string &ppdName, const std::string &ppdData); 137 int32_t QueryPrinterCapabilityByUri(const std::string &printerUri, const std::string &printerId, 138 PrinterCapability &printerCaps); 139 int32_t QueryPrinterStatusByUri(const std::string &printerUri, PrinterStatus &status); 140 int32_t DeleteCupsPrinter(const char *printerName); 141 void AddCupsPrintJob(const PrintJob &jobInfo, const std::string &userName); 142 void CancelCupsJob(std::string serviceJobId); 143 void InterruptCupsJob(std::string serviceJobId); 144 145 int32_t QueryAddedPrinterList(std::vector<std::string> &printerName); 146 ppd_file_t* GetPPDFile(const std::string &printerName); 147 int32_t SetDefaultPrinter(const std::string &printerName); 148 149 int32_t QueryPrinterAttrList(const std::string &printerName, const std::vector<std::string> &keyList, 150 std::vector<std::string> &valueList); 151 int32_t QueryPrinterInfoByPrinterId(const std::string& printerId, PrinterInfo &info); 152 int32_t DiscoverUsbPrinters(std::vector<PrinterInfo> &printers); 153 int32_t DiscoverBackendPrinters(std::vector<PrinterInfo> &printers); 154 int32_t QueryPrinterCapabilityFromPPD(const std::string &name, PrinterCapability &printerCaps, 155 const std::string &ppdName); 156 bool CheckPrinterOnline(std::shared_ptr<JobMonitorParam> monitorParams, const uint32_t timeout = 3000); 157 bool ModifyCupsPrinterUri(const std::string &printerName, const std::string &printerUri); 158 std::string GetPpdHashCode(const std::string& ppdName); 159 160 private: 161 bool HandleFiles(JobParameters *jobParams, uint32_t num_files, http_t *http, uint32_t jobId); 162 void StartCupsJob(JobParameters *jobParams, CallbackFunc callback); 163 static void SymlinkFile(std::string &srcFilePath, std::string &destFilePath); 164 static void SymlinkDirectory(const char *srcDir, const char *destDir); 165 static void CopyDirectory(const char *srcDir, const char *destDir); 166 static bool ChangeFilterPermission(const std::string &path, mode_t mode); 167 bool CheckPrinterMakeModel(JobParameters *jobParams, bool &driverMissing); 168 bool CheckPrinterDriverExist(const std::string &makeModel); 169 bool VerifyPrintJob(JobParameters *jobParams, int &num_options, uint32_t &jobId, 170 cups_option_t *options, http_t *http); 171 static int FillBorderlessOptions(JobParameters *jobParams, int num_options, cups_option_t **options); 172 static int FillLandscapeOptions(JobParameters *jobParams, int num_options, cups_option_t **options); 173 static int FillJobOptions(JobParameters *jobParams, int num_options, cups_option_t **options); 174 static float ConvertInchTo100MM(float num); 175 static void UpdatePrintJobStateInJobParams(JobParameters *jobParams, uint32_t state, uint32_t subState); 176 static std::string GetIpAddress(unsigned int number); 177 static bool IsIpConflict(const std::string &printerId, std::string &nic); 178 void StartMonitor(); 179 bool JobStatusCallback(std::shared_ptr<JobMonitorParam> monitorParams); 180 bool SpecialJobStatusCallback(std::shared_ptr<JobMonitorParam> monitorParams); 181 bool IsPrinterStopped(std::shared_ptr<JobMonitorParam> monitorParams); 182 bool GetBlockedAndUpdateSubstate(std::shared_ptr<JobMonitorParam> monitorParams, StatePolicy policy, 183 std::string substateString, PrintJobSubState jobSubstate); 184 uint32_t GetNewSubstate(uint32_t substate, PrintJobSubState singleSubstate); 185 bool QueryJobState(http_t *http, std::shared_ptr<JobMonitorParam> monitorParams); 186 bool UpdateJobState(std::shared_ptr<JobMonitorParam> monitorParams, ipp_t *response); 187 bool IfContinueToHandleJobState(std::shared_ptr<JobMonitorParam> monitorParams); 188 bool QueryJobStateAndCallback(std::shared_ptr<JobMonitorParam> monitorParams); 189 void BuildMonitorPolicy(std::shared_ptr<JobMonitorParam> monitorParams); 190 void ParseStateReasons(std::shared_ptr<JobMonitorParam> monitorParams); 191 192 int32_t StartCupsdServiceNotAlive(); 193 int32_t StartCupsdService(); 194 JobParameters *GetNextJob(); 195 void StartNextJob(); 196 void JobSentCallback(); 197 198 void UpdateJobParameterByOption(Json::Value& optionJson, JobParameters *params); 199 void UpdateJobParameterByBoolOption(Json::Value& optionJson, JobParameters *params); 200 JobParameters* BuildJobParameters(const PrintJob &jobInfo, const std::string &userName); 201 std::string GetColorString(uint32_t colorCode); 202 std::string GetMedieSize(const PrintJob &jobInfo); 203 std::string GetDulpexString(uint32_t duplexCode); 204 void DumpJobParameters(JobParameters* jobParams); 205 bool IsPrinterExist(const char *printerUri, const char *standardPrinterName, const char *ppdName); 206 207 void ParsePPDInfo(ipp_t *response, std::vector<std::string> &ppds); 208 ipp_t *QueryPrinterAttributesByUri(const std::string &printerUri, const std::string &nic, int num, 209 const char * const *pattrs); 210 bool ResumePrinter(const std::string &printerName); 211 bool CancelPrinterJob(int cupsJobId); 212 bool CancelPrinterJob(int cupsJobId, const std::string &name, const std::string &user); 213 bool IsIpAddress(const char* host); 214 static int FillAdvancedOptions(JobParameters *jobParams, int num_options, cups_option_t **options); 215 const std::string& GetCurCupsRootDir(); 216 const std::string& GetCurCupsdControlParam(); 217 218 private: 219 bool toCups_ = true; 220 IPrintAbilityBase* printAbility_ = nullptr; 221 std::vector<JobParameters*> jobQueue_; 222 JobParameters *currentJob_ = nullptr; 223 std::vector<std::shared_ptr<JobMonitorParam>> jobMonitorList_; 224 std::mutex jobMonitorMutex_; 225 }; 226 } // namespace OHOS::Print 227 #endif // PRINT_CUPS_CLIENT_H