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 <cups/cups-private.h> 23 #include <cups/ppd.h> 24 #include <nlohmann/json.hpp> 25 26 #include "singleton.h" 27 #include "print_service_ability.h" 28 #include "print_job.h" 29 30 namespace OHOS::Print { 31 using json = nlohmann::json; 32 typedef std::function<void()> CallbackFunc; 33 34 struct JobParameters { 35 uint32_t cupsJobId; 36 uint32_t borderless; 37 uint32_t numCopies; 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 printerAttrsOption_cupsOption; 53 }; 54 55 struct JobStatus { 56 char printer_state_reasons[1024]; 57 ipp_jstate_t job_state; 58 char job_state_reasons[1024]; 59 }; 60 struct JobMonitorParam { 61 PrintServiceAbility *serviceAbility; 62 std::string serviceJobId; 63 int cupsJobId; 64 std::string printerUri; 65 std::string printerName; 66 std::string printerId; 67 }; 68 struct MediaSize { 69 std::string name; 70 const float WidthInInches; 71 const float HeightInInches; 72 }; 73 74 class PrintCupsClient final : public DelayedSingleton<PrintCupsClient>, 75 public std::enable_shared_from_this<PrintCupsClient> { 76 public: 77 PrintCupsClient(); 78 ~PrintCupsClient(); 79 80 int32_t InitCupsResources(); 81 void StopCupsdService(); 82 void QueryPPDInformation(const char *makeModel, std::vector<std::string> &ppds); 83 int32_t AddPrinterToCups(const std::string &printerUri, const std::string &printerName, 84 const std::string &printerMake); 85 int32_t QueryPrinterCapabilityByUri(const std::string &printerUri, const std::string &printerId, 86 PrinterCapability &printerCaps); 87 int32_t DeleteCupsPrinter(const char *printerName); 88 void AddCupsPrintJob(const PrintJob &jobInfo); 89 void CancelCupsJob(std::string serviceJobId); 90 91 int32_t QueryAddedPrinterList(std::vector<std::string> &printerName); 92 ppd_file_t* GetPPDFile(const std::string &printerName); 93 int32_t SetDefaultPrinter(const std::string &printerName); 94 95 int32_t QueryPrinterAttrList(const std::string &printerName, const std::vector<std::string> &keyList, 96 std::vector<std::string> &valueList); 97 int32_t QueryPrinterInfoByPrinterId(const std::string& printerId, PrinterInfo &info); 98 int32_t DeletePrinterFromCups(const std::string &printerUri, const std::string &printerName, 99 const std::string &printerMake); 100 bool CheckPrinterOnline(JobMonitorParam *param, const uint32_t timeout = 3000); 101 102 private: 103 void StartCupsJob(JobParameters *jobParams, CallbackFunc callback); 104 void MonitorJobState(JobMonitorParam *param, CallbackFunc callback); 105 static void QueryJobState(http_t *http, JobMonitorParam *param, JobStatus *jobStatus); 106 static void JobStatusCallback(JobMonitorParam *param, JobStatus *jobStatus, bool isOffline); 107 static void ReportBlockedReason(JobMonitorParam *param, JobStatus *jobStatus); 108 static void SymlinkFile(std::string srcFilePath, std::string destFilePath); 109 static void SymlinkDirectory(const char *srcDir, const char *destDir); 110 static void CopyDirectory(const char *srcDir, const char *destDir); 111 static void ChangeFilterPermission(const std::string &path, mode_t mode); 112 static bool CheckPrinterMakeModel(JobParameters *jobParams); 113 bool VerifyPrintJob(JobParameters *jobParams, int &num_options, uint32_t &jobId, 114 cups_option_t *options, http_t *http); 115 static int FillBorderlessOptions(JobParameters *jobParams, int num_options, cups_option_t **options); 116 static int FillJobOptions(JobParameters *jobParams, int num_options, cups_option_t **options); 117 static float ConvertInchTo100MM(float num); 118 static void UpdateJobStatus(JobStatus *prevousJobStatus, JobStatus *jobStatus); 119 static void UpdatePrintJobStateInJobParams(JobParameters *jobParams, uint32_t state, uint32_t subState); 120 static std::string GetIpAddress(unsigned int number); 121 static bool IsIpConflict(const std::string &printerId, std::string &nic); 122 static void QueryJobStateAgain(http_t *http, JobMonitorParam *param, JobStatus *jobStatus); 123 static uint32_t GetBlockedSubstate(JobStatus *jobStatus); 124 125 int32_t StartCupsdService(); 126 void StartNextJob(); 127 void JobCompleteCallback(); 128 JobParameters* BuildJobParameters(const PrintJob &jobInfo); 129 std::string GetColorString(uint32_t colorCode); 130 std::string GetMedieSize(const PrintJob &jobInfo); 131 std::string GetDulpexString(uint32_t duplexCode); 132 void DumpJobParameters(JobParameters* jobParams); 133 bool IsCupsServerAlive(); 134 bool IsPrinterExist(const char *printerUri, const char *printerName, const char *ppdName); 135 136 void ParsePPDInfo(ipp_t *response, const char *ppd_make_model, const char *ppd_name, 137 std::vector<std::string> &ppds); 138 139 private: 140 std::vector<JobParameters*> jobQueue_; 141 JobParameters *currentJob_ = nullptr; 142 }; 143 } // namespace OHOS::Print 144 #endif // PRINT_CUPS_CLIENT_H