Skip to content

Commit

Permalink
new method: getDefaultPrinterName, make printer parameter optional fo…
Browse files Browse the repository at this point in the history
…r printDirect or getPrinter, added example #44
  • Loading branch information
tojocky committed Feb 12, 2015
1 parent 78f0e9c commit 0dea170
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 19 deletions.
4 changes: 4 additions & 0 deletions examples/getDefaultPrinterName.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
var printer = require("../lib");

console.log('default printer name: ' + (printer.getDefaultPrinterName() || 'is not defined on your computer'));

2 changes: 1 addition & 1 deletion examples/print_raw.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
var printer = require("../lib");

printer.printDirect({data:"print from Node.JS buffer" // or simple String: "some text"
, printer:'Foxit Reader PDF Printer' // printer name
//, printer:'Foxit Reader PDF Printer' // printer name, if missing then will print to default printer
, type: 'RAW' // type: RAW, TEXT, PDF, JPEG, .. depends on platform
, success:function(jobID){
console.log("sent to printer with ID: "+jobID);
Expand Down
36 changes: 24 additions & 12 deletions lib/printer.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ module.exports.getSupportedJobCommands = printer_helper.getSupportedJobCommands;
*/
module.exports.getPrinter = getPrinter;

/// Return default printer name
module.exports.getDefaultPrinterName = printer_helper.getDefaultPrinterName;

/** get printer job info object
*/
module.exports.getJob = getJob;
Expand All @@ -40,6 +43,10 @@ module.exports.setJob = setJob;
*/
function getPrinter(printerName)
{
if(!printerName) {
printerName = printer_helper.getDefaultPrinterName();
}

return correctPrinterinfo(printer_helper.getPrinter(printerName));
}

Expand Down Expand Up @@ -77,15 +84,15 @@ function correctPrinterinfo(printer) {
else if(status == '5'){
status = 'STOPPED'
}

// correct date type
var k;
for(k in printer.options) {
if(/time$/.test(k) && printer.options[k] && !(printer.options[k] instanceof Date)) {
printer.options[k] = new Date(printer.options[k] * 1000);
}
}
}

printer.status = status;
}

Expand All @@ -100,11 +107,11 @@ parameters:
type - String, optional, only for wind32, data type, one of the RAW, TEXT
success - Function, optional, callback function
error - Function, optional, callback function if exists any error
or
data - String, mandatory, data to printer
printer - String, mandatory, mane of the printer
printer - String, optional, mane of the printer, if missing, will try to print to default printer
docname - String, optional, name of document showed in printer status
type - String, optional, data type, one of the RAW, TEXT
success - Function, optional, callback function with first argument job_id
Expand All @@ -117,7 +124,7 @@ function printDirect(parameters){
, type
, success
, error;

if(arguments.length==1){
//TODO: check parameters type
//if (typeof parameters )
Expand All @@ -134,27 +141,32 @@ function printDirect(parameters){
success = arguments[4];
error = arguments[5];
}

if(!success){
success = function(){};
}

if(!error){
error = function(err){
throw err;
};
}

if(!type){
type = "RAW";
}

// Set default printer name
if(!printer) {
printer = printer_helper.getDefaultPrinterName();
}

type = type.toUpperCase();

if(!docname){
docname = "node print job";
}

//TODO: check parameters type
if(printer_helper.printDirect){// call C++ binding
try{
Expand Down
1 change: 1 addition & 0 deletions src/node_printer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
void initNode(v8::Handle<v8::Object> exports) {
// only for node
NODE_SET_METHOD(exports, "getPrinters", getPrinters);
NODE_SET_METHOD(exports, "getDefaultPrinterName", getDefaultPrinterName);
NODE_SET_METHOD(exports, "getPrinter", getPrinter);
NODE_SET_METHOD(exports, "getJob", getJob);
NODE_SET_METHOD(exports, "setJob", setJob);
Expand Down
5 changes: 5 additions & 0 deletions src/node_printer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ MY_NODE_MODULE_CALLBACK(PrintDirect);
*/
MY_NODE_MODULE_CALLBACK(getPrinters);

/**
* Return default printer name, if null then default printer is not set
*/
MY_NODE_MODULE_CALLBACK(getDefaultPrinterName);

/** Retrieve printer info and jobs
* @param printer name String
*/
Expand Down
14 changes: 10 additions & 4 deletions src/node_printer_posix.cc
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ namespace
break;
}
}

result_printer_job->Set(V8_STRING_NEW_UTF8("format"), V8_STRING_NEW_UTF8(job_format.c_str()));
result_printer_job->Set(V8_STRING_NEW_UTF8("priority"), V8_VALUE_NEW(Number, job->priority));
result_printer_job->Set(V8_STRING_NEW_UTF8("size"), V8_VALUE_NEW(Number, job->size));
Expand All @@ -104,9 +104,9 @@ namespace
// A new status? report as unsupported
std::ostringstream s;
s << "unsupported job status: " << job->state;
result_printer_job_status->Set(i_status++, V8_STRING_NEW_UTF8(s.str()));
result_printer_job_status->Set(i_status++, V8_STRING_NEW_UTF8(s.str().c_str()));
}

result_printer_job->Set(V8_STRING_NEW_UTF8("status"), result_printer_job_status);

//Specific fields
Expand All @@ -118,7 +118,7 @@ namespace
// No error. return an empty string
return "";
}

/** Parse printer info object
* @return error string.
*/
Expand Down Expand Up @@ -195,6 +195,12 @@ MY_NODE_MODULE_CALLBACK(getPrinters)
MY_NODE_MODULE_RETURN_VALUE(result);
}

MY_NODE_MODULE_CALLBACK(getDefaultPrinterName)
{
MY_NODE_MODULE_HANDLESCOPE;
MY_NODE_MODULE_RETURN_VALUE(V8_STRING_NEW_UTF8(cupsGetDefault2(CUPS_HTTP_DEFAULT)));
}

MY_NODE_MODULE_CALLBACK(getPrinter)
{
MY_NODE_MODULE_HANDLESCOPE;
Expand Down
24 changes: 22 additions & 2 deletions src/node_printer_win.cc
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ namespace{
//DWORD PagesPrinted;
result_printer_job->Set(V8_STRING_NEW_UTF8("pagesPrinted"), V8_VALUE_NEW(Number, job->PagesPrinted));
}

/**
* Returns last error code and message string
*/
Expand Down Expand Up @@ -473,6 +473,26 @@ MY_NODE_MODULE_CALLBACK(getPrinters)
MY_NODE_MODULE_RETURN_VALUE(result);
}

MY_NODE_MODULE_CALLBACK(getDefaultPrinterName)
{
MY_NODE_MODULE_HANDLESCOPE;
DWORD bSize = 0;
GetDefaultPrinterW(NULL, &bSize);

if(bSize == 0) {
MY_NODE_MODULE_RETURN_VALUE(V8_STRING_NEW_UTF8(""))
}

MemValue<uint16_t> bPrinterName(bSize);
BOOL res = GetDefaultPrinterW(bPrinterName.get(), bSize);

if(!res) {
MY_NODE_MODULE_RETURN_VALUE(V8_STRING_NEW_UTF8(""))
}

MY_NODE_MODULE_RETURN_VALUE(V8_STRING_NEW_2BYTES((uint16_t*)bPrinterName.get()));
}

MY_NODE_MODULE_CALLBACK(getPrinter)
{
MY_NODE_MODULE_HANDLESCOPE;
Expand All @@ -484,7 +504,7 @@ MY_NODE_MODULE_CALLBACK(getPrinter)
if(!printerHandle)
{
std::string error_str("error on PrinterHandle: ");
error_str += getLastErrorCodeAndMessage();
error_str += getLastErrorCodeAndMessage();
RETURN_EXCEPTION_STR(error_str.c_str());
}
DWORD printers_size_bytes = 0, dummyBytes = 0;
Expand Down

0 comments on commit 0dea170

Please sign in to comment.