Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: chrome/service/cloud_print/printer_info_cups.cc

Issue 2232002: Added CUPS options to the printer information. Options get uploaded to the cl... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/service/cloud_print/printer_info.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/service/cloud_print/printer_info.h" 5 #include "chrome/service/cloud_print/printer_info.h"
6 6
7 #include <cups/cups.h> 7 #include <cups/cups.h>
8 #include <list> 8 #include <list>
9 #include <map> 9 #include <map>
10 10
(...skipping 14 matching lines...) Expand all
25 static const char kCUPSPrinterInfoOpt[] = "printer-info"; 25 static const char kCUPSPrinterInfoOpt[] = "printer-info";
26 static const char kCUPSPrinterStateOpt[] = "printer-state"; 26 static const char kCUPSPrinterStateOpt[] = "printer-state";
27 27
28 void EnumeratePrinters(PrinterList* printer_list) { 28 void EnumeratePrinters(PrinterList* printer_list) {
29 DCHECK(printer_list); 29 DCHECK(printer_list);
30 printer_list->clear(); 30 printer_list->clear();
31 31
32 cups_dest_t* destinations = NULL; 32 cups_dest_t* destinations = NULL;
33 int num_dests = cupsGetDests(&destinations); 33 int num_dests = cupsGetDests(&destinations);
34 34
35 for (int i = 0; i < num_dests; i++) { 35 for (int printer_index = 0; printer_index < num_dests; printer_index++) {
36 const cups_dest_t& printer = destinations[printer_index];
37
36 PrinterBasicInfo printer_info; 38 PrinterBasicInfo printer_info;
37 printer_info.printer_name = destinations[i].name; 39 printer_info.printer_name = printer.name;
38 40
39 const char* info = cupsGetOption(kCUPSPrinterInfoOpt, 41 const char* info = cupsGetOption(kCUPSPrinterInfoOpt,
40 destinations[i].num_options, destinations[i].options); 42 printer.num_options, printer.options);
41 if (info != NULL) 43 if (info != NULL)
42 printer_info.printer_description = info; 44 printer_info.printer_description = info;
43 45
44 const char* state = cupsGetOption(kCUPSPrinterStateOpt, 46 const char* state = cupsGetOption(kCUPSPrinterStateOpt,
45 destinations[i].num_options, destinations[i].options); 47 printer.num_options, printer.options);
46 if (state != NULL) 48 if (state != NULL)
47 StringToInt(state, &printer_info.printer_status); 49 StringToInt(state, &printer_info.printer_status);
48 50
51 // Store printer options.
52 for (int opt_index = 0; opt_index < printer.num_options; opt_index++) {
53 printer_info.options[printer.options[opt_index].name] =
54 printer.options[opt_index].value;
55 }
56
49 printer_list->push_back(printer_info); 57 printer_list->push_back(printer_info);
50 } 58 }
51 59
52 cupsFreeDests(num_dests, destinations); 60 cupsFreeDests(num_dests, destinations);
61
62 DLOG(INFO) << "Enumerated " << printer_list->size() << " printers.";
53 } 63 }
54 64
55 bool GetPrinterCapsAndDefaults(const std::string& printer_name, 65 bool GetPrinterCapsAndDefaults(const std::string& printer_name,
56 PrinterCapsAndDefaults* printer_info) { 66 PrinterCapsAndDefaults* printer_info) {
57 DCHECK(printer_info); 67 DCHECK(printer_info);
58 68
69 DLOG(INFO) << "Getting Caps and Defaults for: " << printer_name;
70
59 static Lock ppd_lock; 71 static Lock ppd_lock;
60 // cupsGetPPD returns a filename stored in a static buffer in CUPS. 72 // cupsGetPPD returns a filename stored in a static buffer in CUPS.
61 // Protect this code with lock. 73 // Protect this code with lock.
62 ppd_lock.Acquire(); 74 ppd_lock.Acquire();
63 FilePath ppd_path(cupsGetPPD(printer_name.c_str())); 75 FilePath ppd_path(cupsGetPPD(printer_name.c_str()));
64 ppd_lock.Release(); 76 ppd_lock.Release();
65 77
66 std::string content; 78 std::string content;
67 bool res = file_util::ReadFileToString(ppd_path, &content); 79 bool res = file_util::ReadFileToString(ppd_path, &content);
68 80
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 } 131 }
120 132
121 bool SpoolPrintJob(const std::string& print_ticket, 133 bool SpoolPrintJob(const std::string& print_ticket,
122 const FilePath& print_data_file_path, 134 const FilePath& print_data_file_path,
123 const std::string& print_data_mime_type, 135 const std::string& print_data_mime_type,
124 const std::string& printer_name, 136 const std::string& printer_name,
125 const std::string& job_title, 137 const std::string& job_title,
126 PlatformJobId* job_id_ret) { 138 PlatformJobId* job_id_ret) {
127 DCHECK(job_id_ret); 139 DCHECK(job_id_ret);
128 140
141 DLOG(INFO) << "Spooling print job for: " << printer_name;
142
129 // We need to store options as char* string for the duration of the 143 // We need to store options as char* string for the duration of the
130 // cupsPrintFile call. We'll use map here to store options, since 144 // cupsPrintFile call. We'll use map here to store options, since
131 // Dictionary value from JSON parser returns wchat_t. 145 // Dictionary value from JSON parser returns wchat_t.
132 std::map<std::string, std::string> options; 146 std::map<std::string, std::string> options;
133 bool res = ParsePrintTicket(print_ticket, &options); 147 bool res = ParsePrintTicket(print_ticket, &options);
134 DCHECK(res); // If print ticket is invalid we still print using defaults. 148 DCHECK(res); // If print ticket is invalid we still print using defaults.
135 149
136 std::vector<cups_option_t> cups_options; 150 std::vector<cups_option_t> cups_options;
137 std::map<std::string, std::string>::iterator it; 151 std::map<std::string, std::string>::iterator it;
138 for (it = options.begin(); it != options.end(); ++it) { 152 for (it = options.begin(); it != options.end(); ++it) {
(...skipping 13 matching lines...) Expand all
152 return false; 166 return false;
153 167
154 *job_id_ret = job_id; 168 *job_id_ret = job_id;
155 return true; 169 return true;
156 } 170 }
157 171
158 bool GetJobDetails(const std::string& printer_name, 172 bool GetJobDetails(const std::string& printer_name,
159 PlatformJobId job_id, 173 PlatformJobId job_id,
160 PrintJobDetails *job_details) { 174 PrintJobDetails *job_details) {
161 DCHECK(job_details); 175 DCHECK(job_details);
176
177 DLOG(INFO) << "Getting job details for: " << printer_name <<
178 " job_id: " << job_id;
179
162 cups_job_t* jobs = NULL; 180 cups_job_t* jobs = NULL;
163 int num_jobs = cupsGetJobs(&jobs, printer_name.c_str(), 1, -1); 181 int num_jobs = cupsGetJobs(&jobs, printer_name.c_str(), 1, -1);
164 182
165 bool found = false; 183 bool found = false;
166 for (int i = 0; i < num_jobs; i++) { 184 for (int i = 0; i < num_jobs; i++) {
167 if (jobs[i].id == job_id) { 185 if (jobs[i].id == job_id) {
168 found = true; 186 found = true;
169 switch (jobs[i].state) { 187 switch (jobs[i].state) {
170 case IPP_JOB_PENDING : 188 case IPP_JOB_PENDING :
171 case IPP_JOB_HELD : 189 case IPP_JOB_HELD :
(...skipping 18 matching lines...) Expand all
190 } 208 }
191 } 209 }
192 210
193 cupsFreeJobs(num_jobs, jobs); 211 cupsFreeJobs(num_jobs, jobs);
194 return found; 212 return found;
195 } 213 }
196 214
197 bool GetPrinterInfo(const std::string& printer_name, PrinterBasicInfo* info) { 215 bool GetPrinterInfo(const std::string& printer_name, PrinterBasicInfo* info) {
198 DCHECK(info); 216 DCHECK(info);
199 217
218 DLOG(INFO) << "Getting printer info for: " << printer_name;
219
200 // This is not very efficient way to get specific printer info. CUPS 1.4 220 // This is not very efficient way to get specific printer info. CUPS 1.4
201 // supports cupsGetNamedDest() function. However, CUPS 1.4 is not available 221 // supports cupsGetNamedDest() function. However, CUPS 1.4 is not available
202 // everywhere (for example, it supported from Mac OS 10.6 only). 222 // everywhere (for example, it supported from Mac OS 10.6 only).
203 PrinterList printer_list; 223 PrinterList printer_list;
204 EnumeratePrinters(&printer_list); 224 EnumeratePrinters(&printer_list);
205 225
206 PrinterList::iterator it; 226 PrinterList::iterator it;
207 for (it = printer_list.begin(); it != printer_list.end(); ++it) { 227 for (it = printer_list.begin(); it != printer_list.end(); ++it) {
208 if (it->printer_name == printer_name) { 228 if (it->printer_name == printer_name) {
209 *info = *it; 229 *info = *it;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 bool PrinterChangeNotifier::GetCurrentPrinterInfo( 322 bool PrinterChangeNotifier::GetCurrentPrinterInfo(
303 PrinterBasicInfo* printer_info) { 323 PrinterBasicInfo* printer_info) {
304 if (!state_) { 324 if (!state_) {
305 return false; 325 return false;
306 } 326 }
307 DCHECK(printer_info); 327 DCHECK(printer_info);
308 return GetPrinterInfo(state_->printer_name(), printer_info); 328 return GetPrinterInfo(state_->printer_name(), printer_info);
309 } 329 }
310 } // namespace cloud_print 330 } // namespace cloud_print
311 331
OLDNEW
« no previous file with comments | « chrome/service/cloud_print/printer_info.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698