Win32-EnumPrinters
view release on metacpan or search on metacpan
EnumPrinters.xs view on Meta::CPAN
if (st & STRING_LANGPAIR) {
hv_stores(hv, "DisplayName", wchar_to_sv(aTHX_ fi2->pDisplayName, 0));
hv_stores(hv, "LangId", newSViv(fi2->wLangId));
}
return sv;
}
MODULE = Win32::EnumPrinters PACKAGE = Win32::EnumPrinters
BOOT:
boot_constants(aTHX);
void
EnumPrinters(SV *flags = &PL_sv_undef, SV *name = &PL_sv_undef, IV level = 2)
PREINIT:
IV flags_iv;
wchar_t *name_wchar;
DWORD buffer_size = DEFAULT_BUFFER_SIZE;
PPCODE:
flags_iv = (SvOK(flags) ? sv_to_enum(aTHX_ flags) : PRINTER_ENUM_LOCAL);
name_wchar = (SvOK(name) ? sv_to_wchar(aTHX_ name) : NULL);
while (1) {
DWORD required = 0;
DWORD items = 0;
LPBYTE buffer = NULL;
Newx(buffer, buffer_size, BYTE);
SAVEFREEPV(buffer);
if (EnumPrintersW(flags_iv, name_wchar, level,
buffer, buffer_size,
&required, &items)) {
DWORD i;
for (i = 0; i < items; i++) {
SV *sv;
switch (level) {
case 1:
sv = pi1_to_sv(aTHX_ (PPRINTER_INFO_1W)buffer + i);
break;
case 2:
sv = pi2_to_sv(aTHX_ (PPRINTER_INFO_2W)buffer + i);
break;
/* case 3:
sv = pi3_to_sv(aTHX_ (PPRINTER_INFO_3W)buffer + i);
break; */
case 4:
sv = pi4_to_sv(aTHX_ (PPRINTER_INFO_4W)buffer + i);
break;
case 5:
sv = pi5_to_sv(aTHX_ (PPRINTER_INFO_5W)buffer + i);
break;
default:
Perl_warn(aTHX_ "level %d not supported", level);
sv = &PL_sv_undef;
break;
}
XPUSHs(sv);
}
XSRETURN(items);
}
else {
if (required > buffer_size) {
buffer_size = required;
continue;
}
XSRETURN(0);
}
}
SV *
GetDefaultPrinter()
PREINIT:
DWORD len = 0;
CODE:
RETVAL = &PL_sv_undef;
GetDefaultPrinterW(NULL, &len);
if (len) {
wchar_t *buffer;
Newx(buffer, len + 2, wchar_t);
if (GetDefaultPrinterW(buffer, &len))
RETVAL = wchar_to_sv(aTHX_ buffer, 0);
}
OUTPUT:
RETVAL
void
EnumForms(SV *printer, int level = 2)
PREINIT:
wchar_t *printer_wchar;
HANDLE handle = 0;
DWORD returned = 0;
PPCODE:
printer_wchar = sv_to_wchar(aTHX_ printer);
if (OpenPrinterW(printer_wchar, &handle, NULL)) {
DWORD buffer_size = DEFAULT_BUFFER_SIZE;
while(1) {
DWORD required = 0;
LPBYTE buffer = NULL;
Newx(buffer, buffer_size, BYTE);
SAVEFREEPV(buffer);
if (EnumFormsW(handle, level, buffer, buffer_size, &required, &returned)) {
int i;
for (i = i; i < returned; i++) {
SV *sv;
switch(level) {
case 1:
sv = fi1_to_sv(aTHX_ (PFORM_INFO_1W)buffer + i);
break;
case 2:
sv = fi2_to_sv(aTHX_ (PFORM_INFO_2W)buffer + i);
break;
default:
Perl_warn(aTHX_ "level %d not supported", level);
sv = &PL_sv_undef;
break;
}
XPUSHs(sv);
}
}
else {
if (required > buffer_size) {
buffer_size = required;
continue;
}
}
break;
}
ClosePrinter(handle);
}
XSRETURN(returned);
( run in 2.071 seconds using v1.01-cache-2.11-cpan-140bd7fdf52 )