@esslassi/electron-printer 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,210 +1,347 @@
1
- #include "windows_printer.h"
2
- #include <vector>
3
-
4
- std::string WindowsPrinter::GetPrinterStatus(DWORD status)
5
- {
6
- if (status & PRINTER_STATUS_OFFLINE)
7
- return "offline";
8
- if (status & PRINTER_STATUS_ERROR)
9
- return "error";
10
- if (status & PRINTER_STATUS_PAPER_JAM)
11
- return "paper-jam";
12
- if (status & PRINTER_STATUS_PAPER_OUT)
13
- return "paper-out";
14
- if (status & PRINTER_STATUS_MANUAL_FEED)
15
- return "manual-feed";
16
- if (status & PRINTER_STATUS_PAPER_PROBLEM)
17
- return "paper-problem";
18
- if (status & PRINTER_STATUS_BUSY)
19
- return "busy";
20
- if (status & PRINTER_STATUS_PRINTING)
21
- return "printing";
22
- if (status & PRINTER_STATUS_OUTPUT_BIN_FULL)
23
- return "output-bin-full";
24
- if (status & PRINTER_STATUS_NOT_AVAILABLE)
25
- return "not-available";
26
- if (status & PRINTER_STATUS_WAITING)
27
- return "waiting";
28
- if (status & PRINTER_STATUS_PROCESSING)
29
- return "processing";
30
- if (status & PRINTER_STATUS_INITIALIZING)
31
- return "initializing";
32
- if (status & PRINTER_STATUS_WARMING_UP)
33
- return "warming-up";
34
- if (status & PRINTER_STATUS_TONER_LOW)
35
- return "toner-low";
36
- if (status & PRINTER_STATUS_NO_TONER)
37
- return "no-toner";
38
- if (status & PRINTER_STATUS_PAGE_PUNT)
39
- return "page-punt";
40
- if (status & PRINTER_STATUS_USER_INTERVENTION)
41
- return "user-intervention";
42
- if (status & PRINTER_STATUS_OUT_OF_MEMORY)
43
- return "out-of-memory";
44
- if (status & PRINTER_STATUS_DOOR_OPEN)
45
- return "door-open";
46
- return "ready";
47
- }
48
-
49
- std::wstring WindowsPrinter::Utf8ToWide(const std::string &str)
50
- {
51
- std::wstring wstr;
52
- int len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
53
- if (len > 0)
54
- {
55
- wstr.resize(len - 1);
56
- MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, &wstr[0], len);
57
- }
58
- return wstr;
59
- }
60
-
61
- std::string WindowsPrinter::WideToUtf8(LPWSTR wstr)
62
- {
63
- if (!wstr)
64
- return "";
65
-
66
- int len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
67
- if (len <= 0)
68
- return "";
69
-
70
- std::vector<char> buffer(len);
71
- WideCharToMultiByte(CP_UTF8, 0, wstr, -1, buffer.data(), len, NULL, NULL);
72
- return std::string(buffer.data());
73
- }
74
-
75
- PrinterInfo WindowsPrinter::GetPrinterDetails(const std::string &printerName, bool isDefault)
76
- {
77
- PrinterInfo info;
78
- info.name = printerName;
79
- info.isDefault = isDefault;
80
-
81
- HANDLE hPrinter;
82
- std::wstring wPrinterName = Utf8ToWide(printerName);
83
-
84
- if (OpenPrinterW((LPWSTR)wPrinterName.c_str(), &hPrinter, NULL))
85
- {
86
- DWORD needed;
87
- GetPrinterW(hPrinter, 2, NULL, 0, &needed);
88
- if (needed > 0)
89
- {
90
- std::vector<BYTE> buffer(needed);
91
- if (GetPrinterW(hPrinter, 2, buffer.data(), needed, &needed))
92
- {
93
- PRINTER_INFO_2W *pInfo = (PRINTER_INFO_2W *)buffer.data();
94
- info.status = GetPrinterStatus(pInfo->Status);
95
-
96
- if (pInfo->pLocation)
97
- info.details["location"] = WideToUtf8(pInfo->pLocation);
98
- if (pInfo->pComment)
99
- info.details["comment"] = WideToUtf8(pInfo->pComment);
100
- if (pInfo->pDriverName)
101
- info.details["driver"] = WideToUtf8(pInfo->pDriverName);
102
- if (pInfo->pPortName)
103
- info.details["port"] = WideToUtf8(pInfo->pPortName);
104
- }
105
- }
106
- ClosePrinter(hPrinter);
107
- }
108
-
109
- return info;
110
- }
111
-
112
- std::vector<PrinterInfo> WindowsPrinter::GetPrinters()
113
- {
114
- std::vector<PrinterInfo> printers;
115
- DWORD needed = 0, returned = 0;
116
-
117
- EnumPrintersW(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 2, NULL, 0, &needed, &returned);
118
- if (needed > 0)
119
- {
120
- std::vector<BYTE> buffer(needed);
121
- if (EnumPrintersW(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 2, buffer.data(), needed, &needed, &returned))
122
- {
123
- PRINTER_INFO_2W *pInfo = (PRINTER_INFO_2W *)buffer.data();
124
- for (DWORD i = 0; i < returned; i++)
125
- {
126
- std::string name = WideToUtf8(pInfo[i].pPrinterName);
127
- bool isDefault = false;
128
-
129
- wchar_t defaultPrinter[256];
130
- DWORD size = sizeof(defaultPrinter) / sizeof(defaultPrinter[0]);
131
- if (GetDefaultPrinterW(defaultPrinter, &size))
132
- {
133
- isDefault = (wcscmp(pInfo[i].pPrinterName, defaultPrinter) == 0);
134
- }
135
-
136
- printers.push_back(GetPrinterDetails(name, isDefault));
137
- }
138
- }
139
- }
140
-
141
- return printers;
142
- }
143
-
144
- PrinterInfo WindowsPrinter::GetSystemDefaultPrinter()
145
- {
146
- wchar_t printerName[256];
147
- DWORD size = sizeof(printerName) / sizeof(printerName[0]);
148
-
149
- if (GetDefaultPrinterW(printerName, &size))
150
- {
151
- std::string name = WideToUtf8(printerName);
152
- return GetPrinterDetails(name, true);
153
- }
154
-
155
- return PrinterInfo();
156
- }
157
-
158
- bool WindowsPrinter::PrintDirect(const std::string &printerName, const std::vector<uint8_t> &data, const std::string &dataType)
159
- {
160
- HANDLE hPrinter;
161
- std::wstring wPrinterName = Utf8ToWide(printerName);
162
- std::wstring wDataType = Utf8ToWide(dataType);
163
-
164
- if (!OpenPrinterW((LPWSTR)wPrinterName.c_str(), &hPrinter, NULL))
165
- {
166
- return false;
167
- }
168
-
169
- DOC_INFO_1W docInfo;
170
- wchar_t docName[] = L"Node.js Print Job";
171
- docInfo.pDocName = docName;
172
- docInfo.pOutputFile = NULL;
173
- docInfo.pDatatype = const_cast<LPWSTR>(wDataType.c_str());
174
-
175
- if (StartDocPrinterW(hPrinter, 1, (LPBYTE)&docInfo))
176
- {
177
- if (StartPagePrinter(hPrinter))
178
- {
179
- DWORD bytesWritten;
180
- void *buffer = const_cast<void *>(static_cast<const void *>(data.data()));
181
- if (WritePrinter(hPrinter, buffer, static_cast<DWORD>(data.size()), &bytesWritten))
182
- {
183
- EndPagePrinter(hPrinter);
184
- EndDocPrinter(hPrinter);
185
- ClosePrinter(hPrinter);
186
- return true;
187
- }
188
- }
189
- EndDocPrinter(hPrinter);
190
- }
191
-
192
- ClosePrinter(hPrinter);
193
- return false;
194
- }
195
-
196
- PrinterInfo WindowsPrinter::GetStatusPrinter(const std::string &printerName)
197
- {
198
- wchar_t defaultPrinter[256];
199
- DWORD size = sizeof(defaultPrinter) / sizeof(defaultPrinter[0]);
200
- bool isDefault = false;
201
-
202
- if (GetDefaultPrinterW(defaultPrinter, &size))
203
- {
204
- std::string defaultPrinterName = WideToUtf8(defaultPrinter);
205
- isDefault = (printerName == defaultPrinterName);
206
- }
207
-
208
- PrinterInfo printer = GetPrinterDetails(printerName, isDefault);
209
- return printer;
210
- }
1
+ #include "windows_printer.h"
2
+
3
+ #include <vector>
4
+ #include <string>
5
+ #include <map>
6
+ #include <fstream>
7
+ #include <sstream>
8
+ #include <algorithm>
9
+
10
+ static std::string ToUpper(std::string s) {
11
+ std::transform(s.begin(), s.end(), s.begin(), [](unsigned char c) { return (char)std::toupper(c); });
12
+ return s;
13
+ }
14
+
15
+ std::wstring WindowsPrinter::Utf8ToWide(const std::string &str)
16
+ {
17
+ std::wstring wstr;
18
+ int len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
19
+ if (len > 0)
20
+ {
21
+ wstr.resize(len - 1);
22
+ MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, &wstr[0], len);
23
+ }
24
+ return wstr;
25
+ }
26
+
27
+ std::string WindowsPrinter::WideToUtf8(LPWSTR wstr)
28
+ {
29
+ if (!wstr)
30
+ return "";
31
+
32
+ int len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
33
+ if (len <= 0)
34
+ return "";
35
+
36
+ std::vector<char> buffer(len);
37
+ WideCharToMultiByte(CP_UTF8, 0, wstr, -1, buffer.data(), len, NULL, NULL);
38
+ return std::string(buffer.data());
39
+ }
40
+
41
+ static std::time_t SystemTimeToTimeT(const SYSTEMTIME &st)
42
+ {
43
+ FILETIME ft;
44
+ if (!SystemTimeToFileTime(&st, &ft)) return 0;
45
+
46
+ ULARGE_INTEGER ull;
47
+ ull.LowPart = ft.dwLowDateTime;
48
+ ull.HighPart = ft.dwHighDateTime;
49
+
50
+ // Windows FILETIME is 100-ns since Jan 1, 1601 (UTC)
51
+ // Convert to Unix epoch (seconds since Jan 1, 1970)
52
+ const unsigned long long EPOCH_DIFFERENCE = 116444736000000000ULL; // 100ns
53
+ if (ull.QuadPart < EPOCH_DIFFERENCE) return 0;
54
+
55
+ unsigned long long unix100ns = ull.QuadPart - EPOCH_DIFFERENCE;
56
+ return (std::time_t)(unix100ns / 10000000ULL);
57
+ }
58
+
59
+ std::vector<std::string> WindowsPrinter::MapJobStatus(DWORD status)
60
+ {
61
+ std::vector<std::string> out;
62
+
63
+ if (status & JOB_STATUS_PAUSED) out.push_back("PAUSED");
64
+ if (status & JOB_STATUS_PRINTING) out.push_back("PRINTING");
65
+ if (status & JOB_STATUS_SPOOLING) out.push_back("PENDING");
66
+ if (status & JOB_STATUS_DELETING) out.push_back("CANCELLED");
67
+ if (status & JOB_STATUS_DELETED) out.push_back("CANCELLED");
68
+ if (status & JOB_STATUS_ERROR) out.push_back("ABORTED");
69
+ if (status & JOB_STATUS_OFFLINE) out.push_back("PENDING");
70
+ if (status & JOB_STATUS_PAPEROUT) out.push_back("PENDING");
71
+ if (status & JOB_STATUS_PRINTED) out.push_back("PRINTED");
72
+
73
+ if (out.empty()) out.push_back("PENDING");
74
+ return out;
75
+ }
76
+
77
+ static bool ReadAllBytes(const std::string &path, std::vector<uint8_t> &out)
78
+ {
79
+ std::ifstream f(path, std::ios::binary);
80
+ if (!f) return false;
81
+ f.seekg(0, std::ios::end);
82
+ std::streamsize size = f.tellg();
83
+ if (size < 0) return false;
84
+ f.seekg(0, std::ios::beg);
85
+
86
+ out.resize((size_t)size);
87
+ if (size > 0)
88
+ f.read((char*)out.data(), size);
89
+
90
+ return true;
91
+ }
92
+
93
+ std::vector<PrinterDetailsNative> WindowsPrinter::GetPrinters()
94
+ {
95
+ std::vector<PrinterDetailsNative> printers;
96
+
97
+ DWORD needed = 0, returned = 0;
98
+ EnumPrintersW(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 2, NULL, 0, &needed, &returned);
99
+ if (needed == 0) return printers;
100
+
101
+ std::vector<BYTE> buffer(needed);
102
+ if (!EnumPrintersW(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 2, buffer.data(), needed, &needed, &returned))
103
+ return printers;
104
+
105
+ wchar_t defaultPrinter[512];
106
+ DWORD defaultSize = (DWORD)(sizeof(defaultPrinter) / sizeof(defaultPrinter[0]));
107
+ std::string defaultName;
108
+ if (GetDefaultPrinterW(defaultPrinter, &defaultSize))
109
+ defaultName = WideToUtf8(defaultPrinter);
110
+
111
+ PRINTER_INFO_2W *pInfo = (PRINTER_INFO_2W *)buffer.data();
112
+
113
+ for (DWORD i = 0; i < returned; i++)
114
+ {
115
+ PrinterDetailsNative p;
116
+ p.name = WideToUtf8(pInfo[i].pPrinterName);
117
+ p.isDefault = (!defaultName.empty() && p.name == defaultName);
118
+
119
+ // options: keep it clean and stable
120
+ if (pInfo[i].pLocation) p.options["location"] = WideToUtf8(pInfo[i].pLocation);
121
+ if (pInfo[i].pComment) p.options["comment"] = WideToUtf8(pInfo[i].pComment);
122
+ if (pInfo[i].pDriverName) p.options["driver"] = WideToUtf8(pInfo[i].pDriverName);
123
+ if (pInfo[i].pPortName) p.options["port"] = WideToUtf8(pInfo[i].pPortName);
124
+
125
+ printers.push_back(std::move(p));
126
+ }
127
+
128
+ return printers;
129
+ }
130
+
131
+ PrinterDetailsNative WindowsPrinter::GetPrinter(const std::string &printerName)
132
+ {
133
+ // Build from GetPrinters (stable + consistent)
134
+ auto list = GetPrinters();
135
+ for (auto &p : list)
136
+ {
137
+ if (p.name == printerName) return p;
138
+ }
139
+
140
+ PrinterDetailsNative p;
141
+ p.name = printerName;
142
+ p.isDefault = false;
143
+ return p;
144
+ }
145
+
146
+ std::string WindowsPrinter::GetDefaultPrinterName()
147
+ {
148
+ wchar_t printerName[512];
149
+ DWORD size = (DWORD)(sizeof(printerName) / sizeof(printerName[0]));
150
+ if (GetDefaultPrinterW(printerName, &size))
151
+ return WideToUtf8(printerName);
152
+ return "";
153
+ }
154
+
155
+ DriverOptions WindowsPrinter::GetPrinterDriverOptions(const std::string &printerName)
156
+ {
157
+ // Windows driver option enumeration is complex (DEVMODE / DocumentProperties).
158
+ // For now: return empty, still satisfies your TS typing.
159
+ // You can enhance later with DEVMODE-driven options.
160
+ (void)printerName;
161
+ return DriverOptions{};
162
+ }
163
+
164
+ std::string WindowsPrinter::GetSelectedPaperSize(const std::string &printerName)
165
+ {
166
+ HANDLE hPrinter = NULL;
167
+ std::wstring wName = Utf8ToWide(printerName);
168
+
169
+ if (!OpenPrinterW((LPWSTR)wName.c_str(), &hPrinter, NULL))
170
+ return "";
171
+
172
+ // Query DEVMODE size
173
+ LONG dmSize = DocumentPropertiesW(NULL, hPrinter, (LPWSTR)wName.c_str(), NULL, NULL, 0);
174
+ if (dmSize <= 0)
175
+ {
176
+ ClosePrinter(hPrinter);
177
+ return "";
178
+ }
179
+
180
+ std::vector<BYTE> dmBuffer((size_t)dmSize);
181
+ DEVMODEW *dm = (DEVMODEW *)dmBuffer.data();
182
+
183
+ LONG res = DocumentPropertiesW(NULL, hPrinter, (LPWSTR)wName.c_str(), dm, NULL, DM_OUT_BUFFER);
184
+ if (res != IDOK)
185
+ {
186
+ ClosePrinter(hPrinter);
187
+ return "";
188
+ }
189
+
190
+ std::string paper;
191
+
192
+ if ((dm->dmFields & DM_FORMNAME) && dm->dmFormName[0] != L'\0')
193
+ {
194
+ paper = WideToUtf8(dm->dmFormName);
195
+ }
196
+ else if (dm->dmFields & DM_PAPERSIZE)
197
+ {
198
+ // Fallback: return numeric code as string (still useful)
199
+ paper = std::to_string((int)dm->dmPaperSize);
200
+ }
201
+
202
+ ClosePrinter(hPrinter);
203
+ return paper;
204
+ }
205
+
206
+ std::vector<std::string> WindowsPrinter::GetSupportedPrintFormats()
207
+ {
208
+ // On Windows spooler, “RAW” is always safe. PDF/JPEG/PS conversion is not guaranteed without extra pipeline.
209
+ return { "RAW", "TEXT", "COMMAND" };
210
+ }
211
+
212
+ int WindowsPrinter::PrintDirect(const std::string &printerName,
213
+ const std::vector<uint8_t> &data,
214
+ const std::string &type,
215
+ const StringMap &options)
216
+ {
217
+ (void)options;
218
+
219
+ HANDLE hPrinter = NULL;
220
+ std::wstring wPrinterName = Utf8ToWide(printerName);
221
+
222
+ if (!OpenPrinterW((LPWSTR)wPrinterName.c_str(), &hPrinter, NULL))
223
+ return 0;
224
+
225
+ std::string t = ToUpper(type);
226
+ // Windows expects a spool datatype string. For our types:
227
+ // RAW/TEXT/COMMAND => use RAW to send bytes directly.
228
+ std::wstring wDataType = Utf8ToWide("RAW");
229
+
230
+ DOC_INFO_1W docInfo;
231
+ wchar_t docName[] = L"Node Print Job";
232
+ docInfo.pDocName = docName;
233
+ docInfo.pOutputFile = NULL;
234
+ docInfo.pDatatype = (LPWSTR)wDataType.c_str();
235
+
236
+ DWORD jobId = StartDocPrinterW(hPrinter, 1, (LPBYTE)&docInfo);
237
+ if (jobId == 0)
238
+ {
239
+ ClosePrinter(hPrinter);
240
+ return 0;
241
+ }
242
+
243
+ if (!StartPagePrinter(hPrinter))
244
+ {
245
+ EndDocPrinter(hPrinter);
246
+ ClosePrinter(hPrinter);
247
+ return 0;
248
+ }
249
+
250
+ DWORD bytesWritten = 0;
251
+ BOOL ok = WritePrinter(hPrinter, (LPVOID)data.data(), (DWORD)data.size(), &bytesWritten);
252
+
253
+ EndPagePrinter(hPrinter);
254
+ EndDocPrinter(hPrinter);
255
+ ClosePrinter(hPrinter);
256
+
257
+ if (!ok || bytesWritten != (DWORD)data.size())
258
+ return 0;
259
+
260
+ return (int)jobId;
261
+ }
262
+
263
+ int WindowsPrinter::PrintFile(const std::string &printerName,
264
+ const std::string &filename)
265
+ {
266
+ std::vector<uint8_t> data;
267
+ if (!ReadAllBytes(filename, data))
268
+ return 0;
269
+
270
+ // PrintFile typing does not include type, so we treat it as RAW bytes.
271
+ StringMap emptyOpts;
272
+ return PrintDirect(printerName, data, "RAW", emptyOpts);
273
+ }
274
+
275
+ JobDetailsNative WindowsPrinter::GetJob(const std::string &printerName, int jobId)
276
+ {
277
+ JobDetailsNative j;
278
+ j.id = jobId;
279
+ j.printerName = printerName;
280
+
281
+ HANDLE hPrinter = NULL;
282
+ std::wstring wPrinterName = Utf8ToWide(printerName);
283
+ if (!OpenPrinterW((LPWSTR)wPrinterName.c_str(), &hPrinter, NULL))
284
+ return j;
285
+
286
+ DWORD needed = 0;
287
+ GetJobW(hPrinter, (DWORD)jobId, 2, NULL, 0, &needed);
288
+ if (needed == 0)
289
+ {
290
+ ClosePrinter(hPrinter);
291
+ return j;
292
+ }
293
+
294
+ std::vector<BYTE> buffer(needed);
295
+ if (!GetJobW(hPrinter, (DWORD)jobId, 2, buffer.data(), needed, &needed))
296
+ {
297
+ ClosePrinter(hPrinter);
298
+ return j;
299
+ }
300
+
301
+ JOB_INFO_2W *ji = (JOB_INFO_2W *)buffer.data();
302
+
303
+ j.name = ji->pDocument ? WideToUtf8(ji->pDocument) : "";
304
+ j.user = ji->pUserName ? WideToUtf8(ji->pUserName) : "";
305
+ j.format = "RAW";
306
+ j.priority = (int)ji->Priority;
307
+ j.size = (int)ji->Size;
308
+ j.status = MapJobStatus(ji->Status);
309
+
310
+ // Times
311
+ j.creationTime = SystemTimeToTimeT(ji->Submitted);
312
+ j.processingTime = j.creationTime;
313
+ j.completedTime = 0;
314
+
315
+ ClosePrinter(hPrinter);
316
+ return j;
317
+ }
318
+
319
+ void WindowsPrinter::SetJob(const std::string &printerName, int jobId, const std::string &command)
320
+ {
321
+ HANDLE hPrinter = NULL;
322
+ std::wstring wPrinterName = Utf8ToWide(printerName);
323
+ if (!OpenPrinterW((LPWSTR)wPrinterName.c_str(), &hPrinter, NULL))
324
+ return;
325
+
326
+ std::string cmd = ToUpper(command);
327
+
328
+ if (cmd == "CANCEL")
329
+ {
330
+ SetJobW(hPrinter, (DWORD)jobId, 0, NULL, JOB_CONTROL_CANCEL);
331
+ }
332
+ else if (cmd == "PAUSE")
333
+ {
334
+ SetJobW(hPrinter, (DWORD)jobId, 0, NULL, JOB_CONTROL_PAUSE);
335
+ }
336
+ else if (cmd == "RESUME")
337
+ {
338
+ SetJobW(hPrinter, (DWORD)jobId, 0, NULL, JOB_CONTROL_RESUME);
339
+ }
340
+
341
+ ClosePrinter(hPrinter);
342
+ }
343
+
344
+ std::vector<std::string> WindowsPrinter::GetSupportedJobCommands()
345
+ {
346
+ return { "CANCEL", "PAUSE", "RESUME" };
347
+ }
@@ -1,35 +1,64 @@
1
- #ifndef WINDOWS_PRINTER_H
2
- #define WINDOWS_PRINTER_H
3
-
4
- #define NOMINMAX
5
- #include <windows.h>
6
- #include <winspool.h>
7
- #include <cstdint>
8
- #include "printer_interface.h"
9
- #include <vector>
10
-
11
- // Desabilita todas as macros do Windows que podem interferir
12
- #ifdef GetDefaultPrinter
13
- #undef GetDefaultPrinter
14
- #endif
15
-
16
- #ifdef GetPrinter
17
- #undef GetPrinter
18
- #endif
19
-
20
- class WindowsPrinter : public PrinterInterface
21
- {
22
- private:
23
- std::string GetPrinterStatus(DWORD status);
24
- std::wstring Utf8ToWide(const std::string &str);
25
- std::string WideToUtf8(LPWSTR wstr);
26
-
27
- public:
28
- virtual PrinterInfo GetPrinterDetails(const std::string &printerName, bool isDefault = false) override;
29
- virtual std::vector<PrinterInfo> GetPrinters() override;
30
- virtual PrinterInfo GetSystemDefaultPrinter() override;
31
- virtual bool PrintDirect(const std::string &printerName, const std::vector<uint8_t> &data, const std::string &dataType) override;
32
- virtual PrinterInfo GetStatusPrinter(const std::string &printerName) override;
33
- };
34
-
1
+ #ifndef WINDOWS_PRINTER_H
2
+ #define WINDOWS_PRINTER_H
3
+
4
+ #include "printer_interface.h"
5
+
6
+ #include <windows.h>
7
+ #include <winspool.h>
8
+
9
+ /* Now remove macro pollution */
10
+ #ifdef GetDefaultPrinter
11
+ #undef GetDefaultPrinter
12
+ #endif
13
+
14
+ #ifdef GetDefaultPrinter
15
+ #undef GetDefaultPrinter
16
+ #endif
17
+
18
+ #ifdef GetPrinter
19
+ #undef GetPrinter
20
+ #endif
21
+
22
+ #ifdef GetJob
23
+ #undef GetJob
24
+ #endif
25
+
26
+ #ifdef SetJob
27
+ #undef SetJob
28
+ #endif
29
+
30
+ #include <vector>
31
+ #include <string>
32
+ #include <cstdint>
33
+
34
+ class WindowsPrinter : public PrinterInterface
35
+ {
36
+ private:
37
+ std::wstring Utf8ToWide(const std::string &str);
38
+ std::string WideToUtf8(LPWSTR wstr);
39
+ std::vector<std::string> MapJobStatus(DWORD status);
40
+
41
+ public:
42
+ std::vector<PrinterDetailsNative> GetPrinters() override;
43
+ PrinterDetailsNative GetPrinter(const std::string &printerName) override;
44
+ std::string GetDefaultPrinterName() override;
45
+
46
+ DriverOptions GetPrinterDriverOptions(const std::string &printerName) override;
47
+ std::string GetSelectedPaperSize(const std::string &printerName) override;
48
+
49
+ int PrintDirect(const std::string &printerName,
50
+ const std::vector<uint8_t> &data,
51
+ const std::string &type,
52
+ const StringMap &options) override;
53
+
54
+ int PrintFile(const std::string &printerName,
55
+ const std::string &filename) override;
56
+
57
+ std::vector<std::string> GetSupportedPrintFormats() override;
58
+
59
+ JobDetailsNative GetJob(const std::string &printerName, int jobId) override;
60
+ void SetJob(const std::string &printerName, int jobId, const std::string &command) override;
61
+ std::vector<std::string> GetSupportedJobCommands() override;
62
+ };
63
+
35
64
  #endif