• 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 <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