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 )