/* PaperBin.prg This a direct copy of PapeSize.prg posted by Rick Miller with the necessary changes so as to be able to identify the available paper sources. 2020-08-09 This program will return the binName and PapeBin information for the default printer. The number returned for each option could then be used for a report. This is really not a production program, but meant to be used by a developer to help as needed. Output is to the output pane of the Command Window. Usage: do :dUFLP:PapeBin or to use a printer other than the default, you would need to know the name of the printer: cPrinter = "HP LaserJet 1020" do :dUFLP:PapeBin with cPrinter Includes: getBins() getPrinterDefault() */ #define DC_PAPERNAMES 16 #define DC_PAPERS 2 #define DC_BINNAMES 12 #define DC_BINS 6 #define ZEROS(n) replicate(chr(0), n) parameters cDevice initExterns() if not type("argVector(1)") == "C" cDevice := getPrinterDefault() ? cDevice endif local a, i a = getBins( cDevice, "") for i = 1 to int((a.size + 1) / 2) ? a[i, 2] ?? " - " ?? a[i, 1] endfor return //------------------------------------------------------------// // return a 2 column array of paper bins for a printerName. // column 1 = paperName , // column 2 = PapeBin . function getBins(cDevice, cPort) local aRet, cName, i, ii, lpDevMode, nPair, nWord,; sPaperName, sPapeBin lpDevMode = 0 // get the number of PapeBin/paperName pairs. nPair = RMM_DeviceCapability(; cDevice,; cPort,; DC_BINS,; null,; lpDevMode) if nPair > 0 // create empty PapeBin buffer of proper length. sPapeBin = ZEROS(nPair * 2) // fill the PapeBin buffer. RMM_DeviceCapability(; cDevice,; cPort,; DC_BINS,; sPapeBin,; lpDevMode) // create empty paperName buffer of proper length. sPaperName = ZEROS(nPair * 64) // fill the paperName buffer. RMM_DeviceCapability(; cDevice,; cPort,; DC_BINNAMES,; sPaperName,; lpDevMode) // create the return array. aRet = new array(nPair, 2) for i = 0 to nPair - 1 // loop through and assign the array values. // store the PapeBin number into nX. nWord = getWord(sPapeBin, i * 2) cName = "" for ii = 0 to 63 // loop through reading the paperName buffer. if sPaperName.getByte((i * 64) + ii) == 0 // ran into a string terminator. // assign ii to exit the loop. ii := 64 else // add the character to c. cName += chr(sPaperName.getByte( ; (i * 64) + ii)) endif endfor // assign the pair to a row in the array. aRet[i + 1, 1] = cName // paperName. aRet[i + 1, 2] = nWord // PapeBin. endfor else aRet = new array() endif return aRet //------------------------------------------------------------// // return the windows default printer as a string. function getPrinterDefault Local sBuff, cRet, nLen sBuff = ZEROS(250) nLen = RMM_GetWinIniString( ; "windows", "device", ; ",,,", sBuff, sBuff.length) cRet = sBuff.left(sBuff.indexOf(",")) return cRet.rightTrim() //------------------------------------------------------------// // return a WORD from the string sValu starting at nByte. function getWord(sValu, nByte) return int(sValu.getByte(nByte) + ; bitlshift(sValu.getByte(nByte + 1), 8)) //------------------------------------------------------------// function initExterns if not type("RMM_DeviceCapability") == "FP" extern CINT RMM_DeviceCapability( ; CSTRING, CSTRING, CWORD, CPTR, CPTR); winspool.drv from 'DeviceCapabilitiesA' endif if not type("RMM_GetWinIniString") == "FP" extern CULONG RMM_GetWinIniString( ; CSTRING, CSTRING, CSTRING, CSTRING, CULONG); kernel32 from "GetProfileStringA" endif return // end of file: PapeBin.prg