dbeu Thu Apr 5 05:36:01 2001 EDT
Modified files:
/php4/ext/printer php_printer.h printer.c printer.php
Log:
overhaul printer extension
# documentation is nearly finished
Index: php4/ext/printer/php_printer.h
diff -u php4/ext/printer/php_printer.h:1.7 php4/ext/printer/php_printer.h:1.8
--- php4/ext/printer/php_printer.h:1.7 Sun Feb 25 22:07:13 2001
+++ php4/ext/printer/php_printer.h Thu Apr 5 05:36:00 2001
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_printer.h,v 1.7 2001/02/26 06:07:13 andi Exp $ */
+/* $Id: php_printer.h,v 1.8 2001/04/05 12:36:00 dbeu Exp $ */
#ifndef PHP_PRINTER_H
#define PHP_PRINTER_H
@@ -29,12 +29,11 @@
PHP_MINIT_FUNCTION(printer);
PHP_MINFO_FUNCTION(printer);
+PHP_MSHUTDOWN_FUNCTION(printer);
-
PHP_FUNCTION(printer_open);
PHP_FUNCTION(printer_close);
PHP_FUNCTION(printer_write);
-PHP_FUNCTION(printer_name);
PHP_FUNCTION(printer_list);
PHP_FUNCTION(printer_set_option);
PHP_FUNCTION(printer_get_option);
@@ -50,45 +49,36 @@
PHP_FUNCTION(printer_create_brush);
PHP_FUNCTION(printer_delete_brush);
PHP_FUNCTION(printer_select_brush);
+PHP_FUNCTION(printer_create_font);
+PHP_FUNCTION(printer_delete_font);
+PHP_FUNCTION(printer_select_font);
PHP_FUNCTION(printer_logical_fontheight);
PHP_FUNCTION(printer_draw_roundrect);
PHP_FUNCTION(printer_draw_rectangle);
PHP_FUNCTION(printer_draw_text);
PHP_FUNCTION(printer_draw_elipse);
-PHP_FUNCTION(printer_create_font);
-PHP_FUNCTION(printer_delete_font);
-PHP_FUNCTION(printer_select_font);
+PHP_FUNCTION(printer_draw_line);
+PHP_FUNCTION(printer_draw_chord);
+PHP_FUNCTION(printer_draw_pie);
+PHP_FUNCTION(printer_draw_bmp);
+PHP_FUNCTION(printer_abort);
-
typedef struct {
HANDLE handle;
LPTSTR name;
LPDEVMODE device;
- LPVOID data;
DOC_INFO_1 info1;
DOCINFO info;
HDC dc;
} printer;
-typedef struct {
- HPEN pointer;
-} pen_struct;
-
-typedef struct {
- HBRUSH pointer;
-} brush_struct;
-
-typedef struct {
- HFONT pointer;
-} font_struct;
-
typedef struct {
- int printer_id;
-} php_printer_globals;
+ char *default_printer;
+} zend_printer_globals;
#ifdef ZTS
#define PRINTERG(v) (printer_globals->v)
-#define PRINTERLS_FETCH() php_printer_globals *printer_globals =
ts_resource(printer_globals_id)
+#define PRINTERLS_FETCH() zend_printer_globals *printer_globals =
+ts_resource(printer_globals_id)
#else
#define PRINTERG(v) (printer_globals.v)
#define PRINTERLS_FETCH()
Index: php4/ext/printer/printer.c
diff -u php4/ext/printer/printer.c:1.10 php4/ext/printer/printer.c:1.11
--- php4/ext/printer/printer.c:1.10 Tue Mar 13 06:24:25 2001
+++ php4/ext/printer/printer.c Thu Apr 5 05:36:00 2001
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: printer.c,v 1.10 2001/03/13 14:24:25 dbeu Exp $ */
+/* $Id: printer.c,v 1.11 2001/04/05 12:36:00 dbeu Exp $ */
#include "php.h"
#include "php_ini.h"
@@ -32,54 +32,53 @@
#ifdef ZTS
int printer_globals_id;
#else
-php_printer_globals printer_globals;
+zend_printer_globals printer_globals;
#endif
static int le_printer, le_brush, le_pen, le_font;
#ifdef PHP_WIN32
-/* windows headers */
#include <windows.h>
#include <wingdi.h>
#include <winspool.h>
-/* some protos */
-char *get_default_printer(void);
COLORREF hex_to_rgb(char * hex);
-int get_pen_style(char *style);
-int get_hatch_style(char *hatch);
+char *rgb_to_hex(COLORREF rgb);
static void destroy_ressources(zend_rsrc_list_entry *resource);
-DWORD _print_enumvalue(char * EnumStr);
-
+char *get_default_printer(void);
function_entry printer_functions[] = {
- PHP_FE(printer_open, NULL)
- PHP_FE(printer_close, NULL)
- PHP_FE(printer_write, NULL)
- PHP_FE(printer_name, NULL)
- PHP_FE(printer_list, NULL)
- PHP_FE(printer_set_option, NULL)
- PHP_FE(printer_get_option, NULL)
- PHP_FE(printer_create_dc, NULL)
- PHP_FE(printer_delete_dc, NULL)
- PHP_FE(printer_start_doc, NULL)
- PHP_FE(printer_end_doc, NULL)
- PHP_FE(printer_start_page, NULL)
- PHP_FE(printer_end_page, NULL)
- PHP_FE(printer_create_pen, NULL)
- PHP_FE(printer_delete_pen, NULL)
- PHP_FE(printer_select_pen, NULL)
- PHP_FE(printer_create_brush, NULL)
- PHP_FE(printer_delete_brush, NULL)
- PHP_FE(printer_select_brush, NULL)
- PHP_FE(printer_logical_fontheight, NULL)
- PHP_FE(printer_draw_roundrect, NULL)
- PHP_FE(printer_draw_rectangle, NULL)
- PHP_FE(printer_draw_text, NULL)
- PHP_FE(printer_draw_elipse, NULL)
- PHP_FE(printer_create_font, NULL)
- PHP_FE(printer_delete_font, NULL)
- PHP_FE(printer_select_font, NULL)
+ PHP_FE(printer_open, NULL)
+ PHP_FE(printer_close, NULL)
+ PHP_FE(printer_write, NULL)
+ PHP_FE(printer_list, NULL)
+ PHP_FE(printer_set_option, NULL)
+ PHP_FE(printer_get_option, NULL)
+ PHP_FE(printer_create_dc, NULL)
+ PHP_FE(printer_delete_dc, NULL)
+ PHP_FE(printer_start_doc, NULL)
+ PHP_FE(printer_end_doc, NULL)
+ PHP_FE(printer_start_page, NULL)
+ PHP_FE(printer_end_page, NULL)
+ PHP_FE(printer_create_pen, NULL)
+ PHP_FE(printer_delete_pen, NULL)
+ PHP_FE(printer_select_pen, NULL)
+ PHP_FE(printer_create_brush, NULL)
+ PHP_FE(printer_delete_brush, NULL)
+ PHP_FE(printer_select_brush, NULL)
+ PHP_FE(printer_create_font, NULL)
+ PHP_FE(printer_delete_font, NULL)
+ PHP_FE(printer_select_font, NULL)
+ PHP_FE(printer_logical_fontheight, NULL)
+ PHP_FE(printer_draw_roundrect, NULL)
+ PHP_FE(printer_draw_rectangle, NULL)
+ PHP_FE(printer_draw_text, NULL)
+ PHP_FE(printer_draw_elipse, NULL)
+ PHP_FE(printer_draw_line, NULL)
+ PHP_FE(printer_draw_chord, NULL)
+ PHP_FE(printer_draw_pie, NULL)
+ PHP_FE(printer_draw_bmp, NULL)
+ PHP_FE(printer_abort, NULL)
{NULL, NULL, NULL}
};
@@ -87,9 +86,9 @@
"printer",
printer_functions,
PHP_MINIT(printer),
+ PHP_MSHUTDOWN(printer),
NULL,
NULL,
- NULL,
PHP_MINFO(printer),
STANDARD_MODULE_PROPERTIES
};
@@ -101,42 +100,165 @@
PHP_MINFO_FUNCTION(printer)
{
- char *default_printer = get_default_printer();
+ PRINTERLS_FETCH();
php_info_print_table_start();
php_info_print_table_row(2, "Printer Support", "enabled");
- php_info_print_table_row(2, "Default printing device", default_printer ?
default_printer : "<b>not detected</b>");
- php_info_print_table_row(2, "Module state", "experimental");
- php_info_print_table_row(2, "RCS Version", "$Id: printer.c,v 1.10 2001/03/13
14:24:25 dbeu Exp $");
+ php_info_print_table_row(2, "Default printing device",
+PRINTERG(default_printer) ? PRINTERG(default_printer) : "<b>not detected</b>");
+ php_info_print_table_row(2, "Module state", "working");
+ php_info_print_table_row(2, "RCS Version", "$Id: printer.c,v 1.11 2001/04/05
+12:36:00 dbeu Exp $");
php_info_print_table_end();
+ DISPLAY_INI_ENTRIES();
}
+static PHP_INI_MH(OnUpdatePrinter)
+{
+ PRINTERLS_FETCH();
+
+ if(new_value != NULL && new_value != "") {
+ efree(PRINTERG(default_printer));
+ PRINTERG(default_printer) = estrdup(new_value);
+ }
+ return SUCCESS;
+}
+
+PHP_INI_BEGIN()
+ STD_PHP_INI_ENTRY("printer.default_printer", NULL, PHP_INI_ALL,
+OnUpdatePrinter, default_printer, zend_printer_globals, printer_globals)
+PHP_INI_END()
+
+#define COPIES 0
+#define MODE 1
+#define TITLE 2
+#define ORIENTATION 3
+#define YRESOLUTION 4
+#define XRESOLUTION 5
+#define PAPER_FORMAT 6
+#define PAPER_LENGTH 7
+#define PAPER_WIDTH 8
+#define SCALE 9
+#define BG_COLOR 10
+#define TEXT_COLOR 11
+#define TEXT_ALIGN 12
+#define DEVICENAME 13
+#define DRIVER_VERSION 14
+#define BRUSH_SOLID -1
+#define BRUSH_CUSTOM -2
+
+#define REGP_CONSTANT(a,b) REGISTER_LONG_CONSTANT(a, b, CONST_CS |
+CONST_PERSISTENT);
+
+static void php_printer_init(zend_printer_globals *printer_globals) {
+ printer_globals->default_printer = get_default_printer();
+}
+
PHP_MINIT_FUNCTION(printer)
{
- le_printer = zend_register_list_destructors_ex(destroy_ressources, NULL,
"printer", module_number);
- le_pen = zend_register_list_destructors_ex(destroy_ressources, NULL, "printer
pen", module_number);
- le_font = zend_register_list_destructors_ex(destroy_ressources, NULL, "printer
font", module_number);
- le_brush = zend_register_list_destructors_ex(destroy_ressources, NULL,
"printer brush", module_number);
+ ZEND_INIT_MODULE_GLOBALS(printer, php_printer_init, NULL);
+ REGISTER_INI_ENTRIES();
+ le_printer = zend_register_list_destructors_ex(destroy_ressources, NULL,
+"printer", module_number);
+ le_pen = zend_register_list_destructors_ex(NULL, NULL, "printer pen",
+module_number);
+ le_font = zend_register_list_destructors_ex(NULL, NULL, "printer
+font", module_number);
+ le_brush = zend_register_list_destructors_ex(NULL, NULL, "printer
+brush", module_number);
+
+ REGP_CONSTANT("PRINTER_COPIES", COPIES);
+ REGP_CONSTANT("PRINTER_MODE", MODE);
+ REGP_CONSTANT("PRINTER_TITLE", TITLE);
+ REGP_CONSTANT("PRINTER_DEVICENAME", DEVICENAME);
+ REGP_CONSTANT("PRINTER_DRIVERVERSION", DRIVER_VERSION);
+ REGP_CONSTANT("PRINTER_RESOLUTION_Y", YRESOLUTION);
+ REGP_CONSTANT("PRINTER_RESOLUTION_X", XRESOLUTION);
+ REGP_CONSTANT("PRINTER_SCALE", SCALE);
+ REGP_CONSTANT("PRINTER_BACKGROUND_COLOR", BG_COLOR);
+ REGP_CONSTANT("PRINTER_PAPER_LENGTH", PAPER_LENGTH);
+ REGP_CONSTANT("PRINTER_PAPER_WIDTH", PAPER_WIDTH);
+
+ REGP_CONSTANT("PRINTER_PAPER_FORMAT", PAPER_FORMAT);
+ REGP_CONSTANT("PRINTER_FORMAT_CUSTOM", 0);
+ REGP_CONSTANT("PRINTER_FORMAT_LETTER", DMPAPER_LETTER);
+ REGP_CONSTANT("PRINTER_FORMAT_LEGAL", DMPAPER_LEGAL);
+ REGP_CONSTANT("PRINTER_FORMAT_A3", DMPAPER_A3);
+ REGP_CONSTANT("PRINTER_FORMAT_A4", DMPAPER_A4);
+ REGP_CONSTANT("PRINTER_FORMAT_A5", DMPAPER_A5);
+ REGP_CONSTANT("PRINTER_FORMAT_B4", DMPAPER_B4);
+ REGP_CONSTANT("PRINTER_FORMAT_B5", DMPAPER_B5);
+ REGP_CONSTANT("PRINTER_FORMAT_FOLIO", DMPAPER_FOLIO);
+
+ REGP_CONSTANT("PRINTER_ORIENTATION", ORIENTATION);
+ REGP_CONSTANT("PRINTER_ORIENTATION_PORTRAIT", DMORIENT_PORTRAIT);
+ REGP_CONSTANT("PRINTER_ORIENTATION_LANDSCAPE", DMORIENT_LANDSCAPE);
+
+ REGP_CONSTANT("PRINTER_TEXT_COLOR", TEXT_COLOR);
+ REGP_CONSTANT("PRINTER_TEXT_ALIGN", TEXT_ALIGN);
+ REGP_CONSTANT("PRINTER_TA_BASELINE", TA_BASELINE);
+ REGP_CONSTANT("PRINTER_TA_BOTTOM", TA_BOTTOM);
+ REGP_CONSTANT("PRINTER_TA_TOP", TA_TOP);
+ REGP_CONSTANT("PRINTER_TA_CENTER", TA_CENTER);
+ REGP_CONSTANT("PRINTER_TA_LEFT", TA_LEFT);
+ REGP_CONSTANT("PRINTER_TA_RIGHT", TA_RIGHT);
+
+ REGP_CONSTANT("PRINTER_PEN_SOLID", PS_SOLID);
+ REGP_CONSTANT("PRINTER_PEN_DASH", PS_DASH);
+ REGP_CONSTANT("PRINTER_PEN_DOT", PS_DOT);
+ REGP_CONSTANT("PRINTER_PEN_DASHDOT", PS_DASHDOT);
+ REGP_CONSTANT("PRINTER_PEN_DASHDOTDOT", PS_DASHDOTDOT);
+ REGP_CONSTANT("PRINTER_PEN_INVISIBLE", PS_NULL);
+
+ REGP_CONSTANT("PRINTER_BRUSH_SOLID", BRUSH_SOLID);
+ REGP_CONSTANT("PRINTER_BRUSH_CUSTOM", BRUSH_CUSTOM);
+ REGP_CONSTANT("PRINTER_BRUSH_DIAGONAL", HS_BDIAGONAL);
+ REGP_CONSTANT("PRINTER_BRUSH_CROSS", HS_CROSS);
+ REGP_CONSTANT("PRINTER_BRUSH_DIAGCROSS", HS_DIAGCROSS);
+ REGP_CONSTANT("PRINTER_BRUSH_FDIAGONAL", HS_FDIAGONAL);
+ REGP_CONSTANT("PRINTER_BRUSH_HORIZONTAL", HS_HORIZONTAL);
+ REGP_CONSTANT("PRINTER_BRUSH_VERTICAL", HS_VERTICAL);
+
+ REGP_CONSTANT("PRINTER_FW_THIN", FW_THIN);
+ REGP_CONSTANT("PRINTER_FW_ULTRALIGHT", FW_ULTRALIGHT);
+ REGP_CONSTANT("PRINTER_FW_LIGHT", FW_LIGHT);
+ REGP_CONSTANT("PRINTER_FW_NORMAL", FW_NORMAL);
+ REGP_CONSTANT("PRINTER_FW_MEDIUM", FW_MEDIUM);
+ REGP_CONSTANT("PRINTER_FW_BOLD", FW_BOLD);
+ REGP_CONSTANT("PRINTER_FW_ULTRABOLD", FW_ULTRABOLD);
+ REGP_CONSTANT("PRINTER_FW_HEAVY", FW_HEAVY);
+
+ REGP_CONSTANT("PRINTER_ENUM_LOCAL", PRINTER_ENUM_LOCAL);
+ REGP_CONSTANT("PRINTER_ENUM_NAME", PRINTER_ENUM_NAME);
+ REGP_CONSTANT("PRINTER_ENUM_SHARED", PRINTER_ENUM_SHARED);
+ REGP_CONSTANT("PRINTER_ENUM_DEFAULT", PRINTER_ENUM_DEFAULT);
+ REGP_CONSTANT("PRINTER_ENUM_CONNECTIONS", PRINTER_ENUM_CONNECTIONS);
+ REGP_CONSTANT("PRINTER_ENUM_NETWORK", PRINTER_ENUM_NETWORK);
+ REGP_CONSTANT("PRINTER_ENUM_REMOTE", PRINTER_ENUM_REMOTE);
+
return SUCCESS;
}
-/* {{{ proto int proto(string printername)
- Return a handle or false if connection failed */
+PHP_MSHUTDOWN_FUNCTION(printer)
+{
+ UNREGISTER_INI_ENTRIES();
+ return SUCCESS;
+}
+
+
+
+/* {{{ proto mixed printer_open(string printername)
+ Return a handle to the printer or false if connection failed */
PHP_FUNCTION(printer_open)
{
pval **arg1;
printer *resource;
+ PRINTERLS_FETCH();
+ int argc = ZEND_NUM_ARGS();
resource = (printer *)emalloc(sizeof(printer));
- /* use the given printer */
- if( zend_get_parameters_ex(1, &arg1) != FAILURE ) {
+ if( argc == 1 && zend_get_parameters_ex(1, &arg1) != FAILURE ) {
convert_to_string_ex(arg1);
- resource->name = (*arg1)->value.str.val;
+ resource->name = Z_STRVAL_PP(arg1);
+ }
+ else if( argc == 0 ) {
+ resource->name = PRINTERG(default_printer);
}
- /* use detected default */
else {
- resource->name = get_default_printer();
+ WRONG_PARAM_COUNT;
}
@@ -144,12 +266,11 @@
resource->device = emalloc(DocumentProperties(NULL, NULL,
resource->name, NULL, NULL, 0));
DocumentProperties(NULL, resource->handle, resource->name,
resource->device, NULL, DM_OUT_BUFFER);
- /* set DOCINFO defaults */
- resource->info.lpszDocName = "PHP generated Document";
- resource->info.lpszOutput = NULL;
+ resource->info.lpszDocName = "PHP generated Document";
+ resource->info.lpszOutput = NULL;
resource->info.lpszDatatype = "TEXT";
- resource->info.fwType = 0;
- resource->info.cbSize = sizeof(resource->info);
+ resource->info.fwType = 0;
+ resource->info.cbSize = sizeof(resource->info);
resource->dc = CreateDC(NULL, resource->name, NULL, resource->device);
ZEND_REGISTER_RESOURCE(return_value, resource, le_printer);
}
@@ -161,7 +282,7 @@
/* }}} */
-/* {{{ proto bool proto(int handle)
+/* {{{ proto bool printer_close(resource connection)
Close the printer connection */
PHP_FUNCTION(printer_close)
{
@@ -175,6 +296,7 @@
ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
if( ClosePrinter(resource->handle) != 0 ) {
+ efree(resource->device);
RETURN_TRUE;
}
else {
@@ -185,14 +307,13 @@
/* }}} */
-/* {{{ proto bool printer_write(int handle,string content)
+/* {{{ proto bool printer_write(resource connection,string content)
Write directly to the printer */
PHP_FUNCTION(printer_write)
{
pval **arg1, **arg2;
printer *resource;
- LPDWORD recieved = NULL;
- int sd, sp = 0;
+ int sd, sp = 0, recieved;
if ( zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE ) {
WRONG_PARAM_COUNT;
@@ -201,18 +322,16 @@
ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
convert_to_string_ex(arg2);
- resource->data = estrdup((*arg2)->value.str.val);
- /* reflect DOCINFO to DOC_INFO_1 */
- resource->info1.pDocName = estrdup(resource->info.lpszDocName);
- resource->info1.pDatatype = estrdup(resource->info.lpszDatatype);
+ resource->info1.pDocName = (PSTR)resource->info.lpszDocName;
+ resource->info1.pDatatype = (PSTR)resource->info.lpszDatatype;
resource->info1.pOutputFile = NULL;
sd = StartDocPrinter(resource->handle, 1, (LPSTR)&resource->info1);
sp = StartPagePrinter(resource->handle);
if( sd && sp ) {
- WritePrinter(resource->handle, resource->data, strlen(resource->data),
(unsigned long*)&recieved);
+ WritePrinter(resource->handle, Z_STRVAL_PP(arg2), Z_STRLEN_PP(arg2),
+&recieved);
EndPagePrinter(resource->handle);
EndDocPrinter(resource->handle);
RETURN_TRUE;
@@ -224,72 +343,64 @@
}
/* }}} */
-
-/* {{{ proto string printer_name(int handle)
- Return the printer name */
-PHP_FUNCTION(printer_name)
-{
- pval **arg1;
- printer *resource;
-
- if ( zend_get_parameters_ex(1, &arg1) == FAILURE ) {
- WRONG_PARAM_COUNT;
- }
- ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
- RETURN_STRING(resource->name,1);
-}
-/* }}} */
-
-
-/* {{{ proto array printer_list(string EnumType [, string Name [, int Level]])
+/* {{{ proto array printer_list(int EnumType [, string Name [, int Level]])
Return an array of printers attached to the server */
PHP_FUNCTION(printer_list)
{
zval *Printer, *Printer_ptr, **arg1, **arg2, **arg3;
- char InfoBuffer[8192];
- LPTSTR Name;
+ char InfoBuffer[8192], *Name;
+
PRINTER_INFO_1 *P1;
PRINTER_INFO_2 *P2;
PRINTER_INFO_4 *P4;
PRINTER_INFO_5 *P5;
- DWORD bNeeded = sizeof(InfoBuffer), cReturned, i, EnumVal;
- int argc = ZEND_NUM_ARGS(), Level=1;
+ DWORD bNeeded = sizeof(InfoBuffer), cReturned, i;
+ int argc = ZEND_NUM_ARGS(), Level;
int LevvelsAllowed[] = {0, 1, 1, 0, 1, 1};
- if(zend_get_parameters_ex(argc, &arg1, &arg2, &arg3) == FAILURE) {
+ if( argc < 1 || argc > 3 || zend_get_parameters_ex(argc, &arg1, &arg2, &arg3)
+== FAILURE) {
WRONG_PARAM_COUNT;
}
- convert_to_string_ex(arg1);
- EnumVal = _print_enumvalue((*arg1)->value.str.val);
- if (argc > 1) {
- convert_to_string_ex(arg2);
- Name = (*arg2)->value.str.val;
- if (strlen(Name) == 0)
- Name = NULL;
- }
- if (argc > 2) {
- convert_to_long_ex(arg3);
- Level = (int)(*arg3)->value.lval;
- if (!LevvelsAllowed[Level]) {
- RETURN_FALSE;
- }
+ switch(argc) {
+ case 3:
+ convert_to_long_ex(arg3);
+ Level = (int)Z_LVAL_PP(arg3);
+ if(!LevvelsAllowed[Level]) {
+ php_error(E_WARNING, "Level not allowed");
+ RETURN_FALSE;
+ }
+ case 2:
+ convert_to_string_ex(arg2);
+ Name = estrdup(Z_STRVAL_PP(arg2));
+ Level = 1;
+ break;
+ case 1:
+ convert_to_long_ex(arg1);
+ Name = NULL;
+ Level = 1;
+ break;
}
- EnumPrinters(EnumVal, Name, Level, (LPBYTE)InfoBuffer, sizeof(InfoBuffer),
&bNeeded, &cReturned);
+
+ if(array_init(return_value) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ EnumPrinters(Z_LVAL_PP(arg1), Name, Level, (LPBYTE)InfoBuffer,
+sizeof(InfoBuffer), &bNeeded, &cReturned);
+
P1 = (PRINTER_INFO_1 *)InfoBuffer;
P2 = (PRINTER_INFO_2 *)InfoBuffer;
P4 = (PRINTER_INFO_4 *)InfoBuffer;
P5 = (PRINTER_INFO_5 *)InfoBuffer;
- if (array_init(return_value) == FAILURE) {
- return;
- }
- for (i = 0; i < cReturned; i++) {
+
+ for(i = 0; i < cReturned; i++) {
Printer = (pval *) emalloc(sizeof(pval));
array_init(Printer);
+
switch (Level) {
case 1:
add_assoc_string(Printer, "NAME", P1->pName, 1);
@@ -297,6 +408,7 @@
add_assoc_string(Printer, "COMMENT", P1->pComment, 1);
P1++;
break;
+
case 2:
if (P2->pServerName) add_assoc_string(Printer,
"SERVERNAME", P2->pServerName, 1);
if (P2->pPrinterName) add_assoc_string(Printer,
"PRINTERNAME", P2->pPrinterName, 1);
@@ -305,16 +417,10 @@
if (P2->pDriverName) add_assoc_string(Printer,
"DRIVERNAME", P2->pDriverName, 1);
if (P2->pComment) add_assoc_string(Printer, "COMMENT",
P2->pComment, 1);
if (P2->pLocation) add_assoc_string(Printer,
"LOCATION", P2->pLocation, 1);
-/*
- add_assoc_string(Printer, "DEVMODE", P2->pDevMode, 1);
-*/
if (P2->pSepFile) add_assoc_string(Printer, "SEPFILE",
P2->pSepFile, 1);
if (P2->pPrintProcessor) add_assoc_string(Printer,
"PRINTPROCESSOR", P2->pPrintProcessor, 1);
if (P2->pDatatype) add_assoc_string(Printer,
"DATATYPE", P2->pDatatype, 1);
if (P2->pParameters) add_assoc_string(Printer,
"PARAMETRES", P2->pParameters, 1);
-/*
- add_assoc_string(Printer, "SECURITYDESCRIPTOR",
P2->pSecurityDescriptor, 1);
-*/
add_assoc_long(Printer, "ATTRIBUTES", P2->Attributes);
add_assoc_long(Printer, "PRIORITY", P2->Priority);
add_assoc_long(Printer, "DEFAULTPRIORITY",
P2->DefaultPriority);
@@ -325,12 +431,14 @@
add_assoc_long(Printer, "AVERAGEPPM", P2->AveragePPM);
P2++;
break;
+
case 4:
add_assoc_string(Printer, "PRINTERNAME",
P4->pPrinterName, 1);
add_assoc_string(Printer, "SERVERNAME",
P4->pServerName, 1);
add_assoc_long(Printer, "ATTRIBUTES", P4->Attributes);
P4++;
break;
+
case 5:
add_assoc_string(Printer, "PRINTERNAME",
P5->pPrinterName, 1);
add_assoc_string(Printer, "PORTNAME", P5->pPortName,
1);
@@ -340,13 +448,19 @@
P5++;
break;
}
+
zend_hash_index_update(return_value->value.ht, i, (void *) &Printer,
sizeof(zval *), (void **) &Printer_ptr);
}
+
+ if(Name != NULL) {
+ efree(Name);
+ }
}
+
/* }}} */
-/* {{{ proto bool printer_set_option(int handle,string option,string value)
+/* {{{ proto bool printer_set_option(resource connection,string option,mixed value)
Configure the printer device */
PHP_FUNCTION(printer_set_option)
{
@@ -358,63 +472,88 @@
}
ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
- convert_to_string_ex(arg2);
+ convert_to_long_ex(arg2);
- if(!strcmp((*arg2)->value.str.val,"copies")) {
- convert_to_long_ex(arg3);
- resource->device->dmCopies = (short)(*arg3)->value.lval;
- }
- else if(!strcmp((*arg2)->value.str.val,"mode")) {
- convert_to_string_ex(arg3);
- resource->info.lpszDatatype = estrdup((*arg3)->value.str.val);
- }
- else if(!strcmp((*arg2)->value.str.val,"title")) {
- convert_to_string_ex(arg3);
- resource->info.lpszDocName = estrdup((*arg3)->value.str.val);
- }
- else if(!strcmp((*arg2)->value.str.val,"orientation")) {
- convert_to_long_ex(arg3);
- resource->device->dmOrientation = (short)(*arg3)->value.lval;
- }
- else if(!strcmp((*arg2)->value.str.val,"resolution")) {
- convert_to_long_ex(arg3);
- resource->device->dmYResolution = (short)(*arg3)->value.lval;
- }
- else if(!strcmp((*arg2)->value.str.val,"papersize")) {
- convert_to_long_ex(arg3);
- resource->device->dmPaperSize = (short)(*arg3)->value.lval;
- }
- else if(!strcmp((*arg2)->value.str.val,"paperlength")) {
- convert_to_long_ex(arg3);
- resource->device->dmPaperLength = (*arg3)->value.lval * 254;
- }
- else if(!strcmp((*arg2)->value.str.val,"paperwidth")) {
- convert_to_long_ex(arg3);
- resource->device->dmPaperWidth = (*arg3)->value.lval * 254;
- }
- else if(!strcmp((*arg2)->value.str.val,"scale")) {
- convert_to_long_ex(arg3);
- resource->device->dmScale = (short)(*arg3)->value.lval;
- }
- else if(!strcmp((*arg2)->value.str.val,"bgcolor")) {
- convert_to_string_ex(arg3);
- SetBkColor(resource->dc, hex_to_rgb((*arg3)->value.str.val));
- }
- else if(!strcmp((*arg2)->value.str.val,"textalign")) {
- convert_to_long_ex(arg3);
- SetTextAlign(resource->dc, (*arg3)->value.lval);
+ switch(Z_LVAL_PP(arg2)) {
+ case COPIES:
+ convert_to_long_ex(arg3);
+ resource->device->dmCopies =
+(short)Z_LVAL_PP(arg3);
+ break;
+
+ case MODE:
+ convert_to_string_ex(arg3);
+ resource->info.lpszDatatype = Z_STRVAL_PP(arg3);
+ resource->info.cbSize =
+sizeof(resource->info);
+ break;
+
+ case TITLE:
+ convert_to_string_ex(arg3);
+ resource->info.lpszDocName = Z_STRVAL_PP(arg3);
+ resource->info.cbSize =
+sizeof(resource->info);
+ break;
+
+ case ORIENTATION:
+ convert_to_long_ex(arg3);
+ resource->device->dmOrientation = (short)Z_LVAL_PP(arg3);
+ break;
+
+ case YRESOLUTION:
+ convert_to_long_ex(arg3);
+ resource->device->dmYResolution = (short)Z_LVAL_PP(arg3);
+ break;
+
+ case XRESOLUTION:
+ convert_to_long_ex(arg3);
+ resource->device->dmPrintQuality= (short)Z_LVAL_PP(arg3);
+ break;
+
+ case PAPER_FORMAT:
+ convert_to_long_ex(arg3);
+ resource->device->dmPaperSize = (short)Z_LVAL_PP(arg3);
+ break;
+
+ case PAPER_LENGTH:
+ convert_to_long_ex(arg3);
+ resource->device->dmPaperLength = Z_LVAL_PP(arg3) * 10;
+ break;
+
+ case PAPER_WIDTH:
+ convert_to_long_ex(arg3);
+ resource->device->dmPaperWidth = Z_LVAL_PP(arg3) * 10;
+ break;
+
+ case SCALE:
+ convert_to_long_ex(arg3);
+ resource->device->dmScale =
+(short)Z_LVAL_PP(arg3);
+ break;
+
+ case BG_COLOR:
+ convert_to_string_ex(arg3);
+ SetBkColor(resource->dc, hex_to_rgb(Z_STRVAL_PP(arg3)));
+ break;
+
+ case TEXT_COLOR:
+ convert_to_string_ex(arg3);
+ SetTextColor(resource->dc, hex_to_rgb(Z_STRVAL_PP(arg3)));
+ break;
+
+ case TEXT_ALIGN:
+ convert_to_string_ex(arg3);
+ SetTextAlign(resource->dc, Z_LVAL_PP(arg3));
+ break;
+
+ default:
+ php_error(E_WARNING,"unknown option passed to
+printer_set_option()");
+ RETURN_FALSE;
}
- else {
- php_error(E_WARNING,"unknown option passed to printer_set_option()");
- RETURN_FALSE;
- };
+
RETURN_TRUE;
}
/* }}} */
-/* {{{ proto mixed printer_get_option(int handle,string option)
+/* {{{ proto mixed printer_get_option(int handle, string option)
Get configured data */
PHP_FUNCTION(printer_get_option)
{
@@ -426,48 +565,58 @@
}
ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
- convert_to_string_ex(arg2);
+ convert_to_long_ex(arg2);
+
+ switch(Z_LVAL_PP(arg2)) {
+ case COPIES:
+ RETURN_LONG(resource->device->dmCopies);
- if(!strcmp((*arg2)->value.str.val,"copies")) {
- RETURN_LONG(resource->device->dmCopies);
- }
- else if(!strcmp((*arg2)->value.str.val,"mode")) {
- RETURN_STRING((char*)resource->info.lpszDatatype,1);
- }
- else if(!strcmp((*arg2)->value.str.val,"title")) {
- RETURN_STRING((char*)resource->info.lpszDocName,1);
- }
- else if(!strcmp((*arg2)->value.str.val,"orientation")) {
- RETURN_LONG(resource->device->dmOrientation);
- }
- else if(!strcmp((*arg2)->value.str.val,"resolution")) {
- RETURN_LONG(resource->device->dmYResolution);
- }
- else if(!strcmp((*arg2)->value.str.val,"papersize")) {
- RETURN_LONG(resource->device->dmPaperSize);
- }
- else if(!strcmp((*arg2)->value.str.val,"paperlength")) {
- RETURN_LONG(resource->device->dmPaperLength / 245);
- }
- else if(!strcmp((*arg2)->value.str.val,"paperwidth")){
- RETURN_LONG(resource->device->dmPaperWidth / 245);
- }
- else if(!strcmp((*arg2)->value.str.val,"driverversion")) {
- RETURN_LONG(resource->device->dmDriverVersion);
- }
- else if(!strcmp((*arg2)->value.str.val,"specversion")) {
- RETURN_LONG(resource->device->dmSpecVersion);
- }
- else if(!strcmp((*arg2)->value.str.val,"scale")) {
- RETURN_LONG(resource->device->dmScale);
- }
- else if(!strcmp((*arg2)->value.str.val,"devicename")) {
- RETURN_STRING(resource->name,1);
+ case MODE:
+ RETURN_STRING((char*)resource->info.lpszDatatype,1);
+
+ case TITLE:
+ RETURN_STRING((char*)resource->info.lpszDocName,1);
+
+ case ORIENTATION:
+ RETURN_LONG(resource->device->dmOrientation);
+
+ case YRESOLUTION:
+ RETURN_LONG(resource->device->dmYResolution);
+
+ case XRESOLUTION:
+ RETURN_LONG(resource->device->dmPrintQuality);
+
+ case PAPER_FORMAT:
+ RETURN_LONG(resource->device->dmPaperSize);
+
+ case PAPER_LENGTH:
+ RETURN_LONG(resource->device->dmPaperLength / 10);
+
+ case PAPER_WIDTH:
+ RETURN_LONG(resource->device->dmPaperWidth / 10);
+
+ case SCALE:
+ RETURN_LONG(resource->device->dmScale);
+
+ case BG_COLOR:
+ RETURN_STRING(rgb_to_hex(GetBkColor(resource->dc)), 0);
+
+ case TEXT_COLOR:
+ RETURN_STRING(rgb_to_hex(GetTextColor(resource->dc)), 0);
+
+ case TEXT_ALIGN:
+ RETURN_LONG(GetTextAlign(resource->dc));
+
+ case DEVICENAME:
+ RETURN_STRING(resource->name, 1);
+
+ case DRIVER_VERSION:
+ RETURN_LONG(resource->device->dmDriverVersion);
+
+ default:
+ php_error(E_WARNING,"unknown option passed to
+printer_get_option()");
+ RETURN_FALSE;
}
- else {
- php_error(E_WARNING,"unknown option passed to printer_get_option()");
- RETURN_FALSE;
- }
}
/* }}} */
@@ -486,7 +635,7 @@
ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
if( resource->dc != NULL ) {
- php_error(E_NOTICE,"Deleting old DeviceContext");
+ php_error(E_NOTICE, "Deleting old DeviceContext");
DeleteDC(resource->dc);
}
@@ -524,17 +673,24 @@
Start a document */
PHP_FUNCTION(printer_start_doc)
{
- pval **arg1;
+ pval **parameter[2];
printer *resource;
-
- if( zend_get_parameters_ex(1, &arg1) == FAILURE ) {
+ int argc = ZEND_NUM_ARGS();
+
+ if (argc > 2 || argc < 1 || zend_get_parameters_array_ex(argc, parameter) ==
+FAILURE) {
WRONG_PARAM_COUNT;
}
- ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
+ ZEND_FETCH_RESOURCE(resource, printer *, parameter[0], -1, "Printer Handle",
+le_printer);
+
+ if(argc == 2) {
+ convert_to_string_ex(parameter[1]);
+ resource->info.lpszDocName = Z_STRVAL_PP(parameter[1]);
+ resource->info.cbSize = sizeof(resource->info);
+ }
if(StartDoc(resource->dc, &resource->info) < 0) {
- php_error(E_ERROR,"couldn't allocate new print job");
+ php_error(E_WARNING, "couldn't allocate new print job");
RETURN_FALSE;
}
@@ -573,14 +729,14 @@
pval **arg1;
printer *resource;
- if( zend_get_parameters_ex(1, &arg1) == FAILURE ) {
- WRONG_PARAM_COUNT;
+ if( ZEND_NUM_ARGS() == 1 && zend_get_parameters_ex(1, &arg1) != FAILURE ) {
+ ;
}
ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
if(StartPage(resource->dc) < 0) {
- php_error(E_ERROR,"couldn't start a new page");
+ php_error(E_WARNING, "couldn't start a new page");
RETURN_FALSE;
}
@@ -603,7 +759,7 @@
ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
if(EndPage(resource->dc) < 0) {
- php_error(E_ERROR,"couldn't end the page");
+ php_error(E_WARNING, "couldn't end the page");
RETURN_FALSE;
}
@@ -612,52 +768,63 @@
/* }}} */
-/* {{{ proto int printer_create_pen(string style, int width,string color)
+/* {{{ proto mixed printer_create_pen(int style, int width, string color)
Create a pen */
PHP_FUNCTION(printer_create_pen)
{
pval **arg1, **arg2, **arg3;
- pen_struct *pen = emalloc(sizeof(pen_struct));
+ HPEN pen;
if( zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE ) {
WRONG_PARAM_COUNT;
}
- convert_to_string_ex(arg1);
- convert_to_string_ex(arg3);
+ pen = (HPEN)emalloc(sizeof(HPEN));
+
+ convert_to_long_ex(arg1);
convert_to_long_ex(arg2);
+ convert_to_string_ex(arg3);
+
+ pen = CreatePen(Z_LVAL_PP(arg1), Z_LVAL_PP(arg2),
+hex_to_rgb(Z_STRVAL_PP(arg3)));
- pen->pointer = CreatePen(get_pen_style((*arg1)->value.str.val),
(*arg2)->value.lval, hex_to_rgb((*arg3)->value.str.val));
+ if(pen == NULL) {
+ efree(pen);
+ RETURN_FALSE;
+ }
ZEND_REGISTER_RESOURCE(return_value, pen, le_pen);
}
/* }}} */
-/* {{{ proto void printer_delete_pen(int handle)
+/* {{{ proto bool printer_delete_pen(resource pen_handle)
Delete a pen */
PHP_FUNCTION(printer_delete_pen)
{
pval **arg1;
- pen_struct *pen;
-
+ HPEN pen;
+
if( zend_get_parameters_ex(1, &arg1) == FAILURE ) {
WRONG_PARAM_COUNT;
}
- ZEND_FETCH_RESOURCE(pen, pen_struct *, arg1, -1, "Pen Handle", le_pen);
+ ZEND_FETCH_RESOURCE(pen, HPEN, arg1, -1, "Pen Handle", le_pen);
+
+ if(DeleteObject(pen)) {
+ RETURN_TRUE;
+ }
- DeleteObject(pen->pointer);
+ RETURN_FALSE;
}
/* }}} */
-/* {{{ proto void printer_select_pen(int printerhandle, int penhandle)
+/* {{{ proto void printer_select_pen(resource printer_handle, resource pen_handle)
Select a pen */
PHP_FUNCTION(printer_select_pen)
{
pval **arg1, **arg2;
- pen_struct *pen;
+ HPEN pen;
printer *resource;
if( zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE ) {
@@ -665,32 +832,47 @@
}
ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
- ZEND_FETCH_RESOURCE(pen, pen_struct *, arg1, -1, "Pen Handle", le_pen);
+ ZEND_FETCH_RESOURCE(pen, HPEN, arg2, -1, "Pen Handle", le_pen);
- SelectObject(resource->dc, pen->pointer);
+ SelectObject(resource->dc, pen);
}
/* }}} */
-/* {{{ proto int printer_create_brush(int handle)
+/* {{{ proto mixed printer_create_brush(resource handle)
Create a brush */
PHP_FUNCTION(printer_create_brush)
{
pval **arg1, **arg2;
- brush_struct *brush = emalloc(sizeof(brush_struct));
+ HBRUSH brush;
+ HBITMAP bmp;
+ char* path;
- if( zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE ) {
+ if(zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE ) {
WRONG_PARAM_COUNT;
}
- convert_to_string_ex(arg1);
+ brush = (HBRUSH)emalloc(sizeof(HBRUSH));
+
+ convert_to_long_ex(arg1);
convert_to_string_ex(arg2);
- if(!strcmp((*arg1)->value.str.val,"solid")) {
- brush->pointer = CreateSolidBrush(hex_to_rgb((*arg2)->value.str.val));
+ switch(Z_LVAL_PP(arg1)) {
+ case BRUSH_SOLID:
+ brush = CreateSolidBrush(hex_to_rgb(Z_STRVAL_PP(arg2)));
+ break;
+ case BRUSH_CUSTOM:
+ virtual_filepath(Z_STRVAL_PP(arg2), &path);
+ bmp = LoadImage(0, path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
+ brush = CreatePatternBrush(bmp);
+ break;
+ default:
+ brush = CreateHatchBrush(Z_LVAL_PP(arg1),
+hex_to_rgb(Z_STRVAL_PP(arg2)));
}
- else {
- brush->pointer = CreateHatchBrush(hex_to_rgb((*arg2)->value.str.val),
get_hatch_style((*arg1)->value.str.val));
+
+ if(brush == NULL) {
+ efree(brush);
+ RETURN_FALSE;
}
ZEND_REGISTER_RESOURCE(return_value, brush, le_brush);
@@ -698,30 +880,34 @@
/* }}} */
-/* {{{ proto void printer_delete_brush(int handle)
+/* {{{ proto bool printer_delete_brush(resource brush_handle)
Delete a brush */
PHP_FUNCTION(printer_delete_brush)
{
pval **arg1;
- brush_struct *brush;
-
+ HBRUSH brush;
+
if( zend_get_parameters_ex(1, &arg1) == FAILURE ) {
WRONG_PARAM_COUNT;
}
+
+ ZEND_FETCH_RESOURCE(brush, HBRUSH, arg1, -1, "Brush Handle", le_brush);
- ZEND_FETCH_RESOURCE(brush, brush_struct *, arg1, -1, "Brush Handle", le_brush);
+ if(DeleteObject(brush)) {
+ RETURN_TRUE;
+ }
- DeleteObject(brush->pointer);
+ RETURN_FALSE;
}
/* }}} */
-/* {{{ proto int printer_select_brush(int handle)
+/* {{{ proto void printer_select_brush(resource printer_handle, resource brush_handle)
Select a brush */
PHP_FUNCTION(printer_select_brush)
{
pval **arg1, **arg2;
- brush_struct *brush;
+ HBRUSH brush;
printer *resource;
if( zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE ) {
@@ -729,14 +915,89 @@
}
ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
- ZEND_FETCH_RESOURCE(brush, brush_struct *, arg2, -1, "Brush Handle", le_brush);
+ ZEND_FETCH_RESOURCE(brush, HBRUSH, arg2, -1, "Brush Handle", le_brush);
- SelectObject(resource->dc, brush->pointer);
+ SelectObject(resource->dc, brush);
}
/* }}} */
-/* {{{ proto int printer_logical_fontheight(int handle, int)
+/* {{{ proto mixed printer_create_font(string face, int height, int width, int
+font_weight, bool italic, bool underline, bool strikeout, int orientaton)
+ Create a font */
+PHP_FUNCTION(printer_create_font)
+{
+ pval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7, **arg8;
+ HFONT font;
+ char *face;
+
+ if( zend_get_parameters_ex(8, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7,
+&arg8) == FAILURE ) {
+ WRONG_PARAM_COUNT;
+ }
+
+ font = (HFONT)emalloc(sizeof(HFONT));
+
+ convert_to_string_ex(arg1);
+ face = estrndup(Z_STRVAL_PP(arg1), 32);
+ convert_to_long_ex(arg2);
+ convert_to_long_ex(arg3);
+ convert_to_long_ex(arg4);
+ convert_to_boolean_ex(arg5);
+ convert_to_boolean_ex(arg6);
+ convert_to_boolean_ex(arg7);
+ convert_to_long_ex(arg8);
+
+ font = CreateFont(Z_LVAL_PP(arg2), Z_LVAL_PP(arg3), Z_LVAL_PP(arg8),
+Z_LVAL_PP(arg8), Z_LVAL_PP(arg4), Z_BVAL_PP(arg5), Z_BVAL_PP(arg6), Z_BVAL_PP(arg7),
+DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
+DEFAULT_PITCH | FF_ROMAN, face);
+ efree(face);
+
+ if(font == NULL) {
+ efree(font);
+ RETURN_FALSE;
+ }
+
+ ZEND_REGISTER_RESOURCE(return_value, font, le_font);
+}
+/* }}} */
+
+
+/* {{{ proto void printer_delete_font(int fonthandle)
+ Delete a font */
+PHP_FUNCTION(printer_delete_font)
+{
+ pval **arg1;
+ HFONT font;
+
+ if( zend_get_parameters_ex(1, &arg1) == FAILURE ) {
+ WRONG_PARAM_COUNT;
+ }
+
+ ZEND_FETCH_RESOURCE(font, HFONT, arg1, -1, "Font Handle", le_font);
+
+ DeleteObject(font);
+}
+/* }}} */
+
+
+/* {{{ proto void printer_select_font(int printerhandle, int fonthandle)
+ Select a font */
+PHP_FUNCTION(printer_select_font)
+{
+ pval **arg1, **arg2;
+ HFONT font;
+ printer *resource;
+
+ if( zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE ) {
+ WRONG_PARAM_COUNT;
+ }
+
+ ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
+le_printer);
+ ZEND_FETCH_RESOURCE(font, HFONT, arg2, -1, "Font Handle", le_font);
+
+ SelectObject(resource->dc, font);
+}
+/* }}} */
+
+
+/* {{{ proto int printer_logical_fontheight(int handle, int height)
Get the logical font height */
PHP_FUNCTION(printer_logical_fontheight)
{
@@ -751,13 +1012,13 @@
convert_to_long_ex(arg2);
- RETURN_LONG(MulDiv((*arg2)->value.lval, GetDeviceCaps(resource->dc,
LOGPIXELSY), 72));
+ RETURN_LONG(MulDiv(Z_LVAL_PP(arg2), GetDeviceCaps(resource->dc, LOGPIXELSY),
+72));
}
/* }}} */
-/* {{{ proto void printer_draw_roundrect()
- Draw a roundrect */
+/* {{{ proto void printer_draw_roundrect(resource handle, int ul_x, int ul_y, int
+lr_x, int lr_y, int width, int height)
+ Draw a roundrect */
PHP_FUNCTION(printer_draw_roundrect)
{
pval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7;
@@ -776,12 +1037,12 @@
convert_to_long_ex(arg6);
convert_to_long_ex(arg7);
- RoundRect(resource->dc, (*arg2)->value.lval, (*arg3)->value.lval,
(*arg4)->value.lval, (*arg5)->value.lval, (*arg6)->value.lval, (*arg7)->value.lval);
+ RoundRect(resource->dc, Z_LVAL_PP(arg2), Z_LVAL_PP(arg3), Z_LVAL_PP(arg4),
+Z_LVAL_PP(arg5), Z_LVAL_PP(arg6), Z_LVAL_PP(arg7));
}
/* }}} */
-/* {{{ proto void printer_draw_rectangle()
+/* {{{ proto void printer_draw_rectangle(resource handle, int ul_x, int ul_y, int
+lr_x, int lr_y)
Draw a rectangle */
PHP_FUNCTION(printer_draw_rectangle)
{
@@ -799,12 +1060,12 @@
convert_to_long_ex(arg4);
convert_to_long_ex(arg5);
- Rectangle(resource->dc, (*arg2)->value.lval, (*arg3)->value.lval,
(*arg4)->value.lval, (*arg5)->value.lval);
+ Rectangle(resource->dc, Z_LVAL_PP(arg2), Z_LVAL_PP(arg3), Z_LVAL_PP(arg4),
+Z_LVAL_PP(arg5));
}
/* }}} */
-/* {{{ proto void printer_draw_elipse(int left, int top, int right, int bottom)
+/* {{{ proto void printer_draw_elipse(resource handle, int ul_x, int ul_y, int lr_x,
+int lr_y)
Draw an elipse */
PHP_FUNCTION(printer_draw_elipse)
{
@@ -822,12 +1083,12 @@
convert_to_long_ex(arg4);
convert_to_long_ex(arg5);
- Ellipse(resource->dc, (*arg2)->value.lval, (*arg3)->value.lval,
(*arg4)->value.lval, (*arg5)->value.lval);
+ Ellipse(resource->dc, Z_LVAL_PP(arg2), Z_LVAL_PP(arg3), Z_LVAL_PP(arg4),
+Z_LVAL_PP(arg5));
}
/* }}} */
-/* {{{ proto void printer_draw_text()
+/* {{{ proto void printer_draw_text(resource handle, string text, int x, int y)
Draw text */
PHP_FUNCTION(printer_draw_text)
{
@@ -840,80 +1101,175 @@
ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
+ convert_to_string_ex(arg2);
+ convert_to_long_ex(arg3);
+ convert_to_long_ex(arg4);
+
+ ExtTextOut(resource->dc, Z_LVAL_PP(arg3), Z_LVAL_PP(arg4), ETO_OPAQUE, NULL,
+Z_STRVAL_PP(arg2), Z_STRLEN_PP(arg2), NULL);
+}
+/* }}} */
+
+
+/* {{{ proto void printer_draw_line(int handle, int fx, int fy, int tx, int ty)
+ Draw line from x, y to x, y*/
+PHP_FUNCTION(printer_draw_line)
+{
+ pval **arg1, **arg2, **arg3, **arg4, **arg5;
+ printer *resource;
+
+ if( zend_get_parameters_ex(5, &arg1, &arg2, &arg3, &arg4, &arg5) == FAILURE ) {
+ WRONG_PARAM_COUNT;
+ }
+
+ ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
+le_printer);
+
convert_to_long_ex(arg2);
convert_to_long_ex(arg3);
- convert_to_string_ex(arg4);
+ convert_to_long_ex(arg4);
+ convert_to_long_ex(arg5);
- ExtTextOut(resource->dc, (*arg2)->value.lval , (*arg3)->value.lval,
ETO_OPAQUE, NULL, (LPCSTR)(*arg4)->value.str.val, (*arg4)->value.str.len, NULL);
+ MoveToEx(resource->dc, Z_LVAL_PP(arg2), Z_LVAL_PP(arg3), NULL);
+ LineTo(resource->dc, Z_LVAL_PP(arg4), Z_LVAL_PP(arg5));
}
/* }}} */
-/* {{{ proto int printer_create_font()
- Create a font */
-PHP_FUNCTION(printer_create_font)
+/* {{{ proto void printer_draw_chord(resource handle, int rec_x, int rec_y, int
+rec_x1, int rec_y1, int rad_x, int rad_y, int rad_x1, int rad_y1)
+ Draw a chord*/
+PHP_FUNCTION(printer_draw_chord)
{
+ pval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7, **arg8, **arg9;
+ printer *resource;
+
+ if( zend_get_parameters_ex(9, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7,
+&arg8, &arg9) == FAILURE ) {
+ WRONG_PARAM_COUNT;
+ }
+
+ ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
+le_printer);
+
+ convert_to_long_ex(arg2);
+ convert_to_long_ex(arg3);
+ convert_to_long_ex(arg4);
+ convert_to_long_ex(arg5);
+ convert_to_long_ex(arg6);
+ convert_to_long_ex(arg7);
+ convert_to_long_ex(arg8);
+ convert_to_long_ex(arg9);
+
+ Chord(resource->dc, Z_LVAL_PP(arg2), Z_LVAL_PP(arg3), Z_LVAL_PP(arg4),
+Z_LVAL_PP(arg5), Z_LVAL_PP(arg6), Z_LVAL_PP(arg7), Z_LVAL_PP(arg8), Z_LVAL_PP(arg9));
}
/* }}} */
-/* {{{ proto void printer_delete_font(int fonthandle)
- Delete a font */
-PHP_FUNCTION(printer_delete_font)
+/* {{{ proto void printer_draw_pie(resource handle, int rec_x, int rec_y, int rec_x1,
+int rec_y1, int rad1_x, int rad1_y, int rad2_x, int rad2_y)
+ Draw a pie*/
+PHP_FUNCTION(printer_draw_pie)
{
- pval **arg1;
- font_struct *font;
+ pval **arg1, **arg2, **arg3, **arg4, **arg5, **arg6, **arg7, **arg8, **arg9;
+ printer *resource;
- if( zend_get_parameters_ex(1, &arg1) == FAILURE ) {
+ if( zend_get_parameters_ex(9, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7,
+&arg8, &arg9) == FAILURE ) {
WRONG_PARAM_COUNT;
}
-
- ZEND_FETCH_RESOURCE(font, font_struct *, arg1, -1, "Font Handle", le_font);
+
+ ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
+le_printer);
+
+ convert_to_long_ex(arg2);
+ convert_to_long_ex(arg3);
+ convert_to_long_ex(arg4);
+ convert_to_long_ex(arg5);
+ convert_to_long_ex(arg6);
+ convert_to_long_ex(arg7);
+ convert_to_long_ex(arg8);
+ convert_to_long_ex(arg9);
- DeleteObject(font->pointer);
+ Pie(resource->dc, Z_LVAL_PP(arg2), Z_LVAL_PP(arg3), Z_LVAL_PP(arg4),
+Z_LVAL_PP(arg5), Z_LVAL_PP(arg6), Z_LVAL_PP(arg7), Z_LVAL_PP(arg8), Z_LVAL_PP(arg9));
}
/* }}} */
-/* {{{ proto void printer_select_font(int printerhandle, int fonthandle)
- Select a font */
-PHP_FUNCTION(printer_select_font)
+/* {{{ proto mixed printer_draw_bmp(resource handle, string filename, int x, int y)
+ Draw a bitmap */
+PHP_FUNCTION(printer_draw_bmp)
{
- pval **arg1, **arg2;
- font_struct *font;
+ pval **arg1, **arg2, **arg3, **arg4;
printer *resource;
+ HBITMAP bmp;
+ BITMAP bmp_property;
+ HDC dummy;
+ char* path;
- if( zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE ) {
+ if(zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE ) {
WRONG_PARAM_COUNT;
}
ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
le_printer);
- ZEND_FETCH_RESOURCE(font, font_struct *, arg2, -1, "Font Handle", le_font);
+ convert_to_string_ex(arg2);
+ convert_to_long_ex(arg3);
+ convert_to_long_ex(arg4);
- SelectObject(resource->dc, font->pointer);
+ virtual_filepath(Z_STRVAL_PP(arg2), &path);
+
+ bmp = LoadImage(0, path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
+ SelectObject(resource->dc, bmp);
+
+
+ if((dummy = CreateCompatibleDC(NULL)) == NULL) {
+ RETURN_FALSE;
+ }
+
+ if(SelectObject(dummy, bmp) == NULL) {
+ DeleteDC(dummy);
+ RETURN_FALSE;
+ }
+
+ if (GetObject(bmp, sizeof(BITMAP), &bmp_property) == 0) {
+ DeleteDC(dummy);
+ RETURN_FALSE;
+ }
+
+ BitBlt(resource->dc, Z_LVAL_PP(arg3), Z_LVAL_PP(arg4), bmp_property.bmWidth,
+bmp_property.bmHeight, dummy, 0, 0, SRCCOPY);
+ DeleteDC(dummy);
+ DeleteObject(bmp);
+ RETURN_TRUE;
}
/* }}} */
-/* get the default printer */
-char *get_default_printer(void)
+
+/* {{{ proto void printer_abort(resource handle)
+ Abort printing*/
+PHP_FUNCTION(printer_abort)
{
+ pval **arg1;
+ printer *resource;
+
+ if( zend_get_parameters_ex(1, &arg1) == FAILURE ) {
+ WRONG_PARAM_COUNT;
+ }
+
+ ZEND_FETCH_RESOURCE(resource, printer *, arg1, -1, "Printer Handle",
+le_printer);
+
+ AbortPrinter(resource->handle);
+}
+/* }}} */
+
+
+char *get_default_printer(void) {
PRINTER_INFO_2 *printer;
DWORD need, received;
char *printer_name = NULL, *strtok_buf = NULL, buffer[250];
- /* nt/2000 */
if(GetVersion() < 0x80000000){
GetProfileString("windows", "device", ",,,", buffer, 250);
php_strtok_r(buffer, ",", &strtok_buf);
printer_name = estrdup(buffer);
}
- /* 9.x/me */
else {
EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, NULL, 0, &need, &received);
if(need > 0) {
printer = (PRINTER_INFO_2 *)emalloc(need+1);
EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, (LPBYTE)printer,
need, &need, &received);
- printer_name = printer->pDriverName;
+ printer_name = estrdup(printer->pDriverName);
efree(printer);
}
}
@@ -922,71 +1278,54 @@
}
-#define hex2dec(a) (a>='A')?a-'A'+10:a-'0'
+int hex2dec(char hex){
+ switch(hex) {
+ case 'F': case 'f':
+ return 15;
+ break;
+ case 'E': case 'e':
+ return 14;
+ break;
+ case 'D': case 'd':
+ return 13;
+ break;
+ case 'C': case 'c':
+ return 12;
+ break;
+ case 'B': case 'b':
+ return 11;
+ break;
+ case 'A': case 'a':
+ return 10;
+ default:
+ return (int)hex;
+ }
+}
/* convert a hexadecimal number to the rgb colorref */
COLORREF hex_to_rgb(char* hex)
{
- int r = 0,g = 0,b = 0, len;
+ int r = 0,g = 0,b = 0;
- len = strlen(hex);
- php_strtoupper(hex, len);
- if (len >= 2) {
- r = hex2dec(hex[0])*16 + hex2dec(hex[1]);
+ if(strlen(hex) < 6) {
+ return RGB(0,0,0);
}
- if (len >= 4) {
+ else {
+ r = hex2dec(hex[0])*16 + hex2dec(hex[1]);
g = hex2dec(hex[2])*16 + hex2dec(hex[3]);
- }
- if (len == 6) {
b = hex2dec(hex[4])*16 + hex2dec(hex[5]);
+ return RGB(r,g,b);
}
- return RGB(r,g,b);
}
-/* get a pen style */
-int get_pen_style(char *style)
+/* convert an rgb colorref to hex number */
+char *rgb_to_hex(COLORREF rgb)
{
- int PS = PS_SOLID;
- if(!strcmp(style,"solid")) PS = PS_SOLID;
- else if(!strcmp(style, "dash")) PS = PS_DASH;
- else if(!strcmp(style, "dot")) PS = PS_DOT;
- else if(!strcmp(style, "dashdot")) PS = PS_DASHDOT;
- else if(!strcmp(style, "dashdot2")) PS = PS_DASHDOTDOT;
- else if(!strcmp(style, "invisible")) PS = PS_NULL;
- else if(!strcmp(style, "inframe")) PS = PS_INSIDEFRAME;
- return PS;
-}
-
-/* get a hatch style brush */
-int get_hatch_style(char *hatch)
-{
- int HS = HS_BDIAGONAL;
- if(!strcmp(hatch, "bdiagonal")) HS = HS_BDIAGONAL;
- else if(!strcmp(hatch, "cross")) HS = HS_CROSS;
- else if(!strcmp(hatch, "diagcross")) HS = HS_DIAGCROSS;
- else if(!strcmp(hatch, "fdiagonal")) HS = HS_FDIAGONAL;
- else if(!strcmp(hatch, "horizontal")) HS = HS_HORIZONTAL;
- else if(!strcmp(hatch, "vertical")) HS = HS_VERTICAL;
- return HS;
-}
-
-/* get enumval of input, defaults to local */
-DWORD _print_enumvalue(char * EnumStr)
-{
- DWORD EV = PRINTER_ENUM_LOCAL;
- php_strtoupper(EnumStr, strlen(EnumStr));
- if(!strcmp(EnumStr, "PRINTER_ENUM_LOCAL")) EV = PRINTER_ENUM_LOCAL;
- else if(!strcmp(EnumStr, "PRINTER_ENUM_NAME")) EV = PRINTER_ENUM_NAME;
- else if(!strcmp(EnumStr, "PRINTER_ENUM_SHARED")) EV = PRINTER_ENUM_SHARED;
- else if(!strcmp(EnumStr, "PRINTER_ENUM_DEFAULT")) EV = PRINTER_ENUM_DEFAULT;
- else if(!strcmp(EnumStr, "PRINTER_ENUM_CONNECTIONS")) EV =
PRINTER_ENUM_CONNECTIONS;
- else if(!strcmp(EnumStr, "PRINTER_ENUM_NETWORK")) EV = PRINTER_ENUM_NETWORK;
- else if(!strcmp(EnumStr, "PRINTER_ENUM_REMOTE")) EV = PRINTER_ENUM_REMOTE;
- return EV;
-}
-
-
+ char* string = emalloc(sizeof(char)*6);
+ sprintf(string, "%02x%02x%02x", GetRValue(rgb), GetGValue(rgb),GetBValue(rgb));
+ return string;
+}
/* resource deallocation */
static void destroy_ressources(zend_rsrc_list_entry *resource)
{
@@ -994,7 +1333,6 @@
}
#endif
-
#endif
/*
* Local variables:
Index: php4/ext/printer/printer.php
diff -u php4/ext/printer/printer.php:1.1 php4/ext/printer/printer.php:1.2
--- php4/ext/printer/printer.php:1.1 Thu Nov 16 14:16:47 2000
+++ php4/ext/printer/printer.php Thu Apr 5 05:36:00 2001
@@ -1,15 +1,34 @@
-<?
- /* open connection to the std printer */
+<?php
$handle = printer_open();
- /* build a string which containtains the devicename and driverversion */
- $string = sprintf("device name: \"%s\"\ndriver version: \"%s\"",
- printer_get_option($handle, "devicename"),
- printer_get_option($handle, "driverversion"));
+ printer_start_doc($handle, "PHP Test");
+ printer_start_page($handle);
- /* handle data to the printer */
- printer_write($handle, $string);
+ $pen = printer_create_pen(PRINTER_PEN_SOLID, 2, "000000");
+ printer_select_pen($handle, $pen);
+
+ printer_draw_rectangle($handle, 10, 10, 1000, 175);
+
+ printer_delete_pen($pen);
+
+ $font = printer_create_font("Arial", 72, 48, PRINTER_FW_NORMAL, false, true,
+false,0);
+ printer_select_font($handle, $font);
+
+ printer_draw_text($handle, "Printing with PHP 4", 20, 50);
+
+ printer_delete_font($font);
+
+
+ $font = printer_create_font("Arial", 24, 12, PRINTER_FW_MEDIUM, false, false,
+false,0);
+ printer_select_font($handle, $font);
- /* close connection */
+ printer_set_option($handle, PRINTER_TEXT_COLOR, "000000");
+ printer_draw_text($handle, "PHP is simply the coolest scripting language!", 20, 200);
+
+ printer_delete_font($font);
+
+ printer_end_page($handle);
+ printer_end_doc($handle);
+
printer_close($handle);
?>
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]