#include <node.h>
#include <v8.h>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
//#include <iostream>
v8:: Handle < v8:: Value > MultiConcat( const v8:: Arguments & args) {
v8:: HandleScope scope;
v8:: Handle < v8:: String > string = v8:: String :: New ( "" ) ;
if ( ! args[ 0 ] - > IsArray( ) )
{
return scope.Close ( args[ 0 ] ) ;
}
v8:: Handle < v8:: Array > array = v8:: Handle < v8:: Array > :: Cast ( args[ 0 ] ) ;
for ( unsigned int i = 0 ; i < array- > Length( ) ; i++ )
{
string = v8:: String :: Concat ( string, array- > Get( i) - > ToString( ) ) ;
}
return scope.Close ( string) ;
}
v8:: Handle < v8:: Value > Method( const v8:: Arguments & args) {
// v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8:: HandleScope scope;
DWORD dwSizeNeeded;
DWORD dwNumItems;
LPPRINTER_INFO_2 lpInfo = NULL ;
EnumPrintersW( PRINTER_ENUM_LOCAL, NULL , 2 , NULL , 0 , & dwSizeNeeded, & dwNumItems) ;
lpInfo = ( LPPRINTER_INFO_2) HeapAlloc( GetProcessHeap( ) , HEAP_ZERO_MEMORY, dwSizeNeeded) ;
if ( lpInfo == NULL )
{
return scope.Close ( v8:: String :: New ( "{\" error\" : \" Not enough memory to enumerate printers.\" }" ) ) ;
}
if ( EnumPrintersW( PRINTER_ENUM_LOCAL, // what to enumerate
NULL , // printer name (NULL for all)
2 , // level
( LPBYTE) lpInfo, // buffer
dwSizeNeeded, // size of buffer
& dwSizeNeeded, // returns size
& dwNumItems // return num. items
) == 0 )
{
return scope.Close ( v8:: String :: New ( "{\" error\" : \" EnumPrinters() failed.\" }" ) ) ;
}
v8:: Handle < v8:: Array > printerList = v8:: Array :: New ( dwNumItems) ;
for ( unsigned int i = 0 ; i < dwNumItems; i++ )
{
v8:: Handle < v8:: Array > printer = v8:: Array :: New ( 10 ) ;
printer- > Set( v8:: Integer :: New ( 0 ) , v8:: String :: New ( "\" printer\" :" ) ) ;
printer- > Set( v8:: Integer :: New ( 1 ) , reinterpret_cast < char * > ( lpInfo[ i] .pPrinterName ) ) ;
printer- > Set( v8:: Integer :: New ( 2 ) , v8:: String :: New ( "\" port\" :" ) ) ;
printer- > Set( v8:: Integer :: New ( 3 ) , reinterpret_cast < char * > ( lpInfo[ i] .pPortName ) ) ;
printer- > Set( v8:: Integer :: New ( 4 ) , v8:: String :: New ( "\" driver\" :" ) ) ;
printer- > Set( v8:: Integer :: New ( 5 ) , reinterpret_cast < char * > ( lpInfo[ i] .pDriverName ) ) ;
printer- > Set( v8:: Integer :: New ( 6 ) , v8:: String :: New ( "\" comments\" :" ) ) ;
printer- > Set( v8:: Integer :: New ( 7 ) , reinterpret_cast < char * > ( lpInfo[ i] .pComment ) ) ;
printer- > Set( v8:: Integer :: New ( 8 ) , v8:: String :: New ( "\" location\" :" ) ) ;
printer- > Set( v8:: Integer :: New ( 9 ) , reinterpret_cast < char * > ( lpInfo[ i] .pLocation ) ) ;
printerList- > Set( i, printer) ;
}
// free memory
HeapFree( GetProcessHeap( ) , 0 , lpInfo) ;
return scope.Close ( printerList) ;
}
void init( v8:: Handle < v8:: Object > target) {
target- > Set( v8:: String :: NewSymbol ( "getPrinters" ) ,
v8:: FunctionTemplate :: New ( Method) - > GetFunction( )
) ;
}
NODE_MODULE( printers, init)
I2luY2x1ZGUgPG5vZGUuaD4KI2luY2x1ZGUgPHY4Lmg+CgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGNvbmlvLmg+CiNpbmNsdWRlIDx0Y2hhci5oPgovLyNpbmNsdWRlIDxpb3N0cmVhbT4KCgp2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gTXVsdGlDb25jYXQoY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncyl7Cgl2ODo6SGFuZGxlU2NvcGUgc2NvcGU7Cgl2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IHN0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygiIik7CgoJaWYoISBhcmdzWzBdLT5Jc0FycmF5KCkpCgl7CgkJcmV0dXJuIHNjb3BlLkNsb3NlKGFyZ3NbMF0pOwoJfQoKCXY4OjpIYW5kbGU8djg6OkFycmF5PiBhcnJheSA9IHY4OjpIYW5kbGU8djg6OkFycmF5Pjo6Q2FzdChhcmdzWzBdKTsKCglmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgYXJyYXktPkxlbmd0aCgpOyBpKyspCgl7CgkJc3RyaW5nID0gdjg6OlN0cmluZzo6Q29uY2F0KHN0cmluZywgYXJyYXktPkdldChpKS0+VG9TdHJpbmcoKSk7Cgl9CgoJcmV0dXJuIHNjb3BlLkNsb3NlKHN0cmluZyk7Cn0KCgoKCgoKdjg6OkhhbmRsZTx2ODo6VmFsdWU+IE1ldGhvZChjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKXsKLy8Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSB2ODo6SXNvbGF0ZTo6R2V0Q3VycmVudCgpOwoJdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwoKCURXT1JECQkJCWR3U2l6ZU5lZWRlZDsKCURXT1JECQkJCWR3TnVtSXRlbXM7CglMUFBSSU5URVJfSU5GT18yCWxwSW5mbyA9IE5VTEw7CgoJRW51bVByaW50ZXJzVyhQUklOVEVSX0VOVU1fTE9DQUwsIE5VTEwsIDIsIE5VTEwsIDAsICZkd1NpemVOZWVkZWQsICZkd051bUl0ZW1zKTsKCglscEluZm8gPSAoTFBQUklOVEVSX0lORk9fMikgSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIGR3U2l6ZU5lZWRlZCk7CglpZihscEluZm8gPT0gTlVMTCkKCXsKCQlyZXR1cm4gc2NvcGUuQ2xvc2Uodjg6OlN0cmluZzo6TmV3KCJ7XCJlcnJvclwiOiBcIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGVudW1lcmF0ZSBwcmludGVycy5cIn0iKSk7Cgl9CgoJaWYoRW51bVByaW50ZXJzVyhQUklOVEVSX0VOVU1fTE9DQUwsCS8vIHdoYXQgdG8gZW51bWVyYXRlCgkJCSAgICBOVUxMLAkJCQkJCS8vIHByaW50ZXIgbmFtZSAoTlVMTCBmb3IgYWxsKQoJCQkgICAgMiwJCQkJCQkJLy8gbGV2ZWwKCQkJICAgIChMUEJZVEUpbHBJbmZvLAkJCQkvLyBidWZmZXIKCQkJICAgIGR3U2l6ZU5lZWRlZCwJCQkJLy8gc2l6ZSBvZiBidWZmZXIKCQkJICAgICZkd1NpemVOZWVkZWQsCQkJCS8vIHJldHVybnMgc2l6ZQoJCQkgICAgJmR3TnVtSXRlbXMJCQkJCS8vIHJldHVybiBudW0uIGl0ZW1zCgkJCSAgKSA9PSAwKQoJewoJCXJldHVybiBzY29wZS5DbG9zZSh2ODo6U3RyaW5nOjpOZXcoIntcImVycm9yXCI6IFwiRW51bVByaW50ZXJzKCkgZmFpbGVkLlwifSIpKTsKCX0KCgl2ODo6SGFuZGxlPHY4OjpBcnJheT4gcHJpbnRlckxpc3QgPSB2ODo6QXJyYXk6Ok5ldyhkd051bUl0ZW1zKTsKCglmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZHdOdW1JdGVtczsgaSsrKQoJewoJCXY4OjpIYW5kbGU8djg6OkFycmF5PiBwcmludGVyID0gdjg6OkFycmF5OjpOZXcoMTApOwoKCQlwcmludGVyLT5TZXQodjg6OkludGVnZXI6Ok5ldygwKSwgdjg6OlN0cmluZzo6TmV3KCJcInByaW50ZXJcIjoiKSk7CgkJcHJpbnRlci0+U2V0KHY4OjpJbnRlZ2VyOjpOZXcoMSksIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGxwSW5mb1tpXS5wUHJpbnRlck5hbWUpKTsKCQlwcmludGVyLT5TZXQodjg6OkludGVnZXI6Ok5ldygyKSwgdjg6OlN0cmluZzo6TmV3KCJcInBvcnRcIjoiKSk7CgkJcHJpbnRlci0+U2V0KHY4OjpJbnRlZ2VyOjpOZXcoMyksIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGxwSW5mb1tpXS5wUG9ydE5hbWUpKTsKCQlwcmludGVyLT5TZXQodjg6OkludGVnZXI6Ok5ldyg0KSwgdjg6OlN0cmluZzo6TmV3KCJcImRyaXZlclwiOiIpKTsKCQlwcmludGVyLT5TZXQodjg6OkludGVnZXI6Ok5ldyg1KSwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obHBJbmZvW2ldLnBEcml2ZXJOYW1lKSk7CgkJcHJpbnRlci0+U2V0KHY4OjpJbnRlZ2VyOjpOZXcoNiksIHY4OjpTdHJpbmc6Ok5ldygiXCJjb21tZW50c1wiOiIpKTsKCQlwcmludGVyLT5TZXQodjg6OkludGVnZXI6Ok5ldyg3KSwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obHBJbmZvW2ldLnBDb21tZW50KSk7CgkJcHJpbnRlci0+U2V0KHY4OjpJbnRlZ2VyOjpOZXcoOCksIHY4OjpTdHJpbmc6Ok5ldygiXCJsb2NhdGlvblwiOiIpKTsKCQlwcmludGVyLT5TZXQodjg6OkludGVnZXI6Ok5ldyg5KSwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obHBJbmZvW2ldLnBMb2NhdGlvbikpOwoKCQlwcmludGVyTGlzdC0+U2V0KGksIHByaW50ZXIpOwoJfQoKCS8vIGZyZWUgbWVtb3J5CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBscEluZm8pOwoKCXJldHVybiBzY29wZS5DbG9zZShwcmludGVyTGlzdCk7Cn0KCnZvaWQgaW5pdCh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHRhcmdldCl7Cgl0YXJnZXQtPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2woImdldFByaW50ZXJzIiksCgkJdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhNZXRob2QpLT5HZXRGdW5jdGlvbigpCgkpOwp9Ck5PREVfTU9EVUxFKHByaW50ZXJzLCBpbml0KQ==