• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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