From: Jarl F. <ja...@di...> - 2000-12-31 02:40:34
|
I have ported some of the PML stuff to the ptal API. until now I have ported getValue and setvalue, they are not thoroughly tested, but I can get the LCD lines at least :-) porting xojpanel..??? I was considering if it were best placed in ptal-mlc.c or maybe even a new ptal-mlc-pml.c, currenctly its a mix of pml.c and ptal.c I do not have the time to continue the development in January, but I might do something in February, hope the code is good for soemthing, at least inspiration :-) There are some open question: 1)What are the TWO bytes in the begining of PML values of type String? 2)How are the THREE bytes of errorcode (after the exec_code byte) supposed to be interpreted when such are sent as a reply? Jarl I will include my diff below: diff -N -ru cvshpoj/ptal/Makefile.in hpojexp/ptal/Makefile.in --- cvshpoj/ptal/Makefile.in Mon Dec 18 13:30:24 2000 +++ hpojexp/ptal/Makefile.in Sun Dec 31 04:04:16 2000 @@ -4,19 +4,20 @@ MAJORVER=0 MINORVER=1 +HEADERS=ptal.h ptal-internal.h pml.h SONOVER=libptal.so SOSHORT=$(SONOVER).$(MAJORVER) SOLONG=$(SOSHORT).$(MINORVER) -LIBCOMPS=ptal ptal-hpjd ptal-mlc ptal-providers +LIBCOMPS=pmloidentries pml ptal ptal-hpjd ptal-mlc ptal-providers SOCOMPS=$(addsuffix .o-shared,$(LIBCOMPS)) STCOMPS=$(addsuffix .o,$(LIBCOMPS)) CFLAGS=-O1 -Wall -g @DEFINES_CMDLINE@ @INCLUDE_CMDLINE@ @LIBRARY_CMDLINE@ -%.o-shared : %.c ptal.h ptal-internal.h +%.o-shared : %.c $(HEADERS) $(CC) $(CFLAGS) -fPIC -c -o $@ $< -%.o : %.c ptal.h ptal-internal.h +%.o : %.c $(HEADERS) $(CC) $(CFLAGS) -c -o $@ $< release: $(SOLONG) ptal-connect ptal-printd # ptal.a diff -N -ru cvshpoj/ptal/pml.c hpojexp/ptal/pml.c --- cvshpoj/ptal/pml.c Thu Jan 1 01:00:00 1970 +++ hpojexp/ptal/pml.c Sun Dec 31 03:06:52 2000 @@ -0,0 +1,359 @@ +/** + * \file pmllib.c + * + * PML functions. + * These functions start with the prefix PML. They can be used to deal with PML + * requests and replies in a more comfortable way. One problem with PML request/ + * replies is that you never know when the printer sends data; this is because + * it is possible to enable so-called "traps" on PML objects. This means that + * the printer informs the application if the value of a specific object has + * changed. Therefore, the following functions are divided in two parts: A + * stimulator part and a processor part. + * The stimulator functions can be used to send requests to the printer, but + * these functions do not receive the reply. The application is responsible + * for the reply by using PMLProcess(). PMLProcess reads data from the PML + * socket and decodes this data. If there is currently no data available + * PMLProcess() blocks until data arrives. To make sure that PMLProcess does + * not block, you must use select() to determine if data is ready to be + * processed. + * This has the advantage that you can wait for any file descriptors with the + * select statement, e.g. for X11 events or for keyboard events in a text-only + * environment. When data arrives from the printer, it is first read completely + * into a buffer. Depending on the buffer contents, one of the previously + * registered callback-functions gets called which may then process the data. + * + * @author Andreas Fester + * + */ + +#include <stdio.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <linux/ieee12844.h> +#include "pml.h" +#include "ptal-internal.h" + +#define DECODETYPE(p) ((p)[0] & 0xfc) +#define DECODELEN(p) ((((p)[0] & 0x03) << 8) | (p)[1]) +#define ENCODETYPELEN_MSB(t,l) ((t) | (((l) >> 8) & 0x03)) +#define ENCODETYPELEN_LSB(t,l) ((l) & 0xff) + + + +/* + * Decode an OID + * + * @return number of bytes used or negative if the object ID could be decoded, + */ + +int PMLdecodeObject(ptalPmlObject_t *_obj, unsigned char *buffer){ + + int type, len, r; + ptalPmlObject_t obj = 0; + *_obj = (ptalPmlObject_t) malloc(sizeof(struct ptalPmlObject_s)); + if (*_obj == NULL){ + PTAL_LOG_ERROR("%s:%d: No memory",__FILE__, __LINE__, 0,0,0,0); + return -1; + } + obj = *_obj; + + r =0; + type = DECODETYPE(buffer); + len = DECODELEN(buffer); + r+=2; + + + if (type != ObjectIdentifierDataType){ + PTAL_LOG_ERROR("%s:%d: Incorrect type: %2.2X",__FILE__, __LINE__, type,0,0,0); + return -1; + } + + obj->oid = (unsigned char*) calloc(len+1,sizeof(unsigned char)); + if (obj->oid == NULL){ + PTAL_LOG_DEBUG("%s:%d: No memory",__FILE__, __LINE__, 0,0,0,0); + free(obj); + return -1; + } + + memcpy(obj->oid, &(buffer[r]), len); + obj->oid = len; + /* TODO: obj->datatype = ; this must be looked up in a table */ + r+=len; + return r; +} + + +int PMLencodeObject(unsigned char *buffer, const ptalPmlObject_t obj){ + + int r; + + r =0; + buffer[r++] = ENCODETYPELEN_MSB(ObjectIdentifierDataType,obj->oidlength); + buffer[r++] = ENCODETYPELEN_LSB(ObjectIdentifierDataType,obj->oidlength); + + memcpy(&(buffer[r]), obj->oid, obj->oidlength); + r+=obj->oidlength; + return r; +} + + +static int decodeInt(char *p, int len){ + int intVal = 0; + switch (len) + { + case 0: break; + case 4: intVal |= p[3]; + case 3: intVal |= p[2] << 8; + case 2: intVal |= p[1] << 16; + case 1: intVal |= p[0] << 24; + } + /* shift the bits to their appropriate place */ + if (len < 4) + intVal >>= (4 - len) * 8; + + return intVal; +} + + +/* + * Decode a ValidValue + * + * @return the number of bytes read from the buffer: + * negative means error + */ + +int PMLdecodeValue(ptalPmlValue_t *_val, unsigned char *buffer){ + int type, len; + ptalPmlValue_t val = 0; + + *_val = (ptalPmlValue_t) malloc(sizeof(struct ptalPmlValue_s)); + if (*_val == NULL){ + PTAL_LOG_ERROR("%s:%d: No memory",__FILE__, __LINE__, 0,0,0,0); + return -1; + } + val = *_val;//just for convenience + /* get the type and the length from the buffer */ + type = DECODETYPE(buffer); + len = DECODELEN(buffer); + + /* decode the <ValidValue> */ + val->type = type; + + switch(type){ + case CollectionDataType : + val->integer = decodeInt(buffer+2, len); + val->data = 0; + return 2+len; + + case EnumerationDataType : + val->integer = decodeInt(buffer+2, len); + val->data = 0; + return 2+len; + + case SignedIntegerDataType : + val->integer = decodeInt(buffer+2, len); + val->data = 0; + return 2+len; + + case StringDataType : + /*There are two unknow bytes in a stringtype hence start two bytes + later, and subtract two from the len. */ + val->integer = len-2; + val->data = (char*) calloc(val->integer, sizeof(char));//let it be zero terminated. + if (val->data == NULL){ + PTAL_LOG_ERROR("%s:%d: No memory",__FILE__, __LINE__, 0,0,0,0); + return -1; + } + memcpy(val->data, buffer+2+2, val->integer); + return 2+len;//We have skipped the twobytes AND the string. + + case BinaryDataType : + val->integer = len; + val->data = (char*) calloc(val->integer, sizeof(char)); + if (val->data == NULL){ + PTAL_LOG_ERROR("%s:%d: No memory",__FILE__, __LINE__, 0,0,0,0); + return -1; + } + memcpy(val->data, buffer+2, val->integer); + return 2+len; + + case NullValueDataType : + val->integer = 0; + val->data = 0; + return 2; + } + + return NULL; +} + +int PMLencodeValue(unsigned char *buffer, const ptalPmlValue_t val){ + + unsigned int r, datalen; + unsigned char numdata[4]; + + /* calculate length of data */ + switch(val->type){ + case CollectionDataType : + case EnumerationDataType : + case SignedIntegerDataType : + if (val->integer == (val->integer & 0xff)){ + datalen =1; + numdata[0]= val->integer; + }else if (val->integer == (val->integer & 0xffff)){ + datalen =2; + numdata[1]= val->integer >> 8; + }else if (val->integer == (val->integer & 0xffffff)){ + datalen =3; + numdata[2]= val->integer >> 16; + }else if (val->integer == (val->integer & 0xffffffff)){ + datalen =4; + numdata[3]= val->integer >> 24; + }else{ + /*error*/ + } + break; + default: + datalen = val->integer; + break; + } + + r =0; + buffer[r++] = ENCODETYPELEN_MSB(val->type,datalen); + buffer[r++] = ENCODETYPELEN_LSB(val->type,datalen); + + switch(val->type){ + case CollectionDataType : + case EnumerationDataType : + case SignedIntegerDataType : + memcpy(&(buffer[r]), numdata, datalen); + break; + case StringDataType : + r+=2; /* skip the two unknown bytes ?? */ + default: + memcpy(&(buffer[r]), val->data, datalen); + } + + r+=datalen; + return r; +} + + +int PMLdecodeReply(unsigned char *replycode, + unsigned char *exec_out, + ptalPmlError_t *_err, + ptalPmlObject_t *_obj, + ptalPmlValue_t *_val, unsigned char *buffer){ + int used = 0; + int r = 0; + /* read the reply */ + *replycode = buffer[r++]; + /* read the execution outcome */ + *exec_out = buffer[r++]; + if ((*exec_out != ErrorCommandExecutionError) && + (*exec_out != ErrorObjectDoesNotSupportSpecifiedAction) && + (*exec_out != ErrorUnknownObjectIdentifier) && + (*exec_out != ErrorInvalidOrUnsupportedValue) && + (*exec_out != ErrorActionCanNotBePerformedNow) && + (*exec_out != ErrorPastEndOfSupportedObjects) && + (*exec_out != OKNearestLegalValueSubstituted) && + (*exec_out != OKEndOfSupportedObjects) && + (*exec_out != OK)) + { + /* here we handle ErrorUnknownRequest, ErrorBufferOverflow, + * ErrorSyntaxError and all possibly *unknown* errors + */ + /* + if (reply_fct != NULL) + reply_fct(reply, exec_out, NULL, NULL); + return 0; + */ + } + + /* if exec_out is OKEndOfSupportedObjects or OK, then + * we have pairs of <ObjectIdentifier><ValidValue>; + * Otherwise, we have triples of + * <ErrorCode><ObjectIdentifier><ValidValue> + */ + + /* read the object specific error code, if any */ + if ( (*exec_out != OK) && + (*exec_out != OKEndOfSupportedObjects)) + { + /* bypass <ErrorCode> TODO: is this correct?? + * opt + */ + *_err = (ptalPmlError_t) malloc(sizeof(struct ptalPmlValue_s)); + if (*_err == NULL){ + PTAL_LOG_ERROR("%s:%d: No memory",__FILE__, __LINE__, 0,0,0,0); + return -1; + } + + memcpy((*_err)->data, &(buffer[r]),3);/* three UNKNOWN error code bytes */ + r += 3; + } + + /* Decode object id; note that p and n are adjusted + * inside this function + */ + used = PMLdecodeObject(_obj, &(buffer[r])); + if(used < 0){ + return used; + } + r += used; + + /* Decode data; note that p and n are adjusted + * inside this function + */ + used = PMLdecodeValue(_val, &(buffer[r])); + if(used < 0){ + return used; + } + r += used; + return r; +} + +/** + * Converts a PML execution execution outcome into a + * human readable format. + * + * @param code The PML code which represents the execution outcome. + * + * @return A String containing the code in a human readable form. + * + */ +char *PMLExecutionToString(unsigned char code) +{ + switch (code) + { + case OK: return "<OK>"; + case OKEndOfSupportedObjects: return "<OKEndOfSupportedObjects>"; + case OKNearestLegalValueSubstituted: return "<OKNearestLegalValueSubstituted>"; + case ErrorUnknownRequest: return "<ErrorUnknownRequest>"; + case ErrorBufferOverflow: return "<ErrorBufferOverflow>"; + case ErrorCommandExecutionError: return "<ErrorCommandExecutionError>"; + case ErrorUnknownObjectIdentifier: return "<ErrorUnknownObjectIdentifier>"; + case ErrorObjectDoesNotSupportSpecifiedAction: return "<ErrorObjectDoesNotSupportSpecifiedAction>"; + case ErrorInvalidOrUnsupportedValue: return "<ErrorInvalidOrUnsupportedValue>"; + case ErrorPastEndOfSupportedObjects: return "<ErrorPastEndOfSupportedObjects>"; + case ErrorActionCanNotBePerformedNow: return "<ErrorActionCanNotBePerformedNow>"; + case ErrorSyntaxError: return "<ErrorSyntaxError>"; + + default: return (code >= 0x80) ? "<ReservedErrorValue>" : + "<ReservedOKValue>"; + } +} + +/** + * Converts a PML error code into a human readable format. + * + * @param code The PML code which represents the execution outcome. + * + * @return A String containing the code in a human readable form. + * + */ +char *PMLErrorToString(unsigned char code) +{ + return "No message is known for this code"; +} + diff -N -ru cvshpoj/ptal/pml.h hpojexp/ptal/pml.h --- cvshpoj/ptal/pml.h Thu Jan 1 01:00:00 1970 +++ hpojexp/ptal/pml.h Sun Dec 31 03:06:54 2000 @@ -0,0 +1,149 @@ +/* + * $Id: $ + * \file pml.h + * This header file declares the API for the PmlOid object. + */ + + +#ifndef __PTAL_MLC_PML_H__ +#define __PTAL_MLC_PML_H__ + +#include "ptal-internal.h" +/* PML definitions */ + +/* <Request> definitions */ +#define GetRequest 0x00 +#define GetNextRequest 0x01 +#define GetBlockRequest 0x02 +#define GetNextBlockRequest 0x03 +#define SetRequest 0x04 +#define EnableTrapRequest 0x05 +#define DisableTrapRequest 0x06 +#define TrapRequest 0x07 + +/* <Reply> definitions */ +#define GetReply 0x80 +#define GetNextReply 0x81 +#define GetBlockReply 0x82 +#define GetNextBlockReply 0x83 +#define SetReply 0x84 +#define EnableTrapReply 0x85 +#define DisableTrapReply 0x86 +#define TrapReply 0x87 + +/* <ExecutionOutcome> and <ErrorValue> definitions */ +#define OK 0x00 +#define OKEndOfSupportedObjects 0x01 +#define OKNearestLegalValueSubstituted 0x02 + +#define ErrorUnknownRequest 0x80 +#define ErrorBufferOverflow 0x81 +#define ErrorCommandExecutionError 0x82 +#define ErrorUnknownObjectIdentifier 0x83 +#define ErrorObjectDoesNotSupportSpecifiedAction 0x84 +#define ErrorInvalidOrUnsupportedValue 0x85 +#define ErrorPastEndOfSupportedObjects 0x86 +#define ErrorActionCanNotBePerformedNow 0x87 +#define ErrorSyntaxError 0x88 + +/* <DataType> Definitions; NOTE: the *upper* six bits are only used !!! */ +#define ObjectIdentifierDataType 0x00 // 0x00 +#define EnumerationDataType 0x04 // 0x01 +#define SignedIntegerDataType 0x08 // 0x02 +#define RealDataType 0x0C // 0x03 +#define StringDataType 0x10 // 0x04 +#define BinaryDataType 0x14 // 0x05 +#define ErrorCodeDataType 0x18 // 0x06 +#define NullValueDataType 0x1C // 0x07 +#define CollectionDataType 0x20 // 0x08 + +#define Roman8SymbolSet 0x0115; +#define Kana8SymbolSet 0x010b; +#define USUnicodeSymbolSet 0x024e; + + +/* Upload & Download state values for fax, image, configuration, ... */ +#define PML_UPDN_STATE_IDLE 1 +#define PML_UPDN_STATE_REQSTART 2 +#define PML_UPDN_STATE_XFERACTIVE 3 +#define PML_UPDN_STATE_ERRORABORT 4 +#define PML_UPDN_STATE_XFERDONE 5 +#define PML_UPDN_STATE_NEWPAGE 6 +#define PML_UPDN_STATE_DISABLED 7 + +#ifdef __cplusplus +extern "C" { +#endif + + /** + * PML Object identifier. + * + */ + typedef struct _PmlOid{ + /** Length of the object identifier */ + int len; + + /** Object identifier in binary notation */ + char *id; + + /** type of this object */ + int type; +}PmlOid; + +/** + * A named PML Object identifier. + */ +typedef struct _PmlOidEntry{ + PmlOid oid; + char *name; +}PmlOidEntry; + + +/** Values used by: OID_SCAN_COMPRESSION */ +enum { + /** Do not use any compression */ + NO_COMPRESSION = 1, + + /** Use default compression */ + DEFAULT_COMPRESSION = 2, + MH_COMPRESSION = 3, + MR_COMPRESSION = 4, + MMR_COMPRESSION = 5, + JPEG_COMPRESSION = 6 +}; + + /*** Values used by: + OID_SCAN_PIXEL_DATA_TYPE + OID_FAX_PIXEL_DATA_TYPE + OID_COPIER_PIXEL_DATA_TYPE +***/ + enum {BILEVEL_THRESHOLD = 1, + BILEVEL_HALFTONED = 2, + COLOR_3_BIT = 3, // Not used by Fax + GRAYSCALE_16 = 4, // Not used by Fax + GRAYSCALE_64 = 6, // Not used by Fax + GRAYSCALE_128 = 7, // Not used by Fax + GRAYSCALE_256 = 8, // Not used by Fax + COLOR_256 = 9, // Not used by Fax + COLOR_24_BIT = 24}; + + + extern PmlOidEntry OIDs[]; + extern int OIDEntries; + + + int PMLdecodeObject(ptalPmlObject_t *_obj, unsigned char *buffer); + int PMLencodeObject(unsigned char *buffer, const ptalPmlObject_t obj); + int PMLdecodeValue(ptalPmlValue_t *_val, unsigned char *buffer); + int PMLencodeValue(unsigned char *buffer, const ptalPmlValue_t val); + int PMLdecodeReply(unsigned char *replycode, + unsigned char *exec_out, + ptalPmlError_t *_err, + ptalPmlObject_t *_obj, + ptalPmlValue_t *_val, unsigned char *buffer); + +#ifdef __cplusplus +} +#endif + +#endif diff -N -ru cvshpoj/ptal/pmloidentries.c hpojexp/ptal/pmloidentries.c --- cvshpoj/ptal/pmloidentries.c Thu Jan 1 01:00:00 1970 +++ hpojexp/ptal/pmloidentries.c Sun Dec 31 03:06:52 2000 @@ -0,0 +1,258 @@ +#include "pml.h" + +PmlOidEntry OIDs[] = { + +{ {1, "\x00", 0}, "OID_NULL"}, +{ {1, "\x01", 0}, "OID_FIRST"}, +{ {4, "\x01\x01\x03\x02", StringDataType}, "OID_DEV_MODEL_NAME"}, +{ {4, "\x01\x01\x03\x06", StringDataType}, "OID_DEV_FIRMWARE_VERSION"}, +{ {4, "\x01\x01\x02\x11", BinaryDataType}, "OID_DEV_DATE_AND_TIME"}, +{ {4, "\x01\x01\x01\x0f", BinaryDataType}, "OID_DEV_PERMANENT_STORE"}, +{ {4, "\x01\x01\x01\x10", BinaryDataType}, "OID_DEV_TEMPORARY_STORE"}, +{ {4, "\x01\x01\x01\x11", SignedIntegerDataType}, "OID_DEV_DOWNLOAD_TIMEOUT"}, +{ {4, "\x01\x01\x01\x12", SignedIntegerDataType}, "OID_DEV_UPLOAD_TIMEOUT"}, +{ {4, "\x01\x01\x02\x04", CollectionDataType}, "OID_DEV_NOT_IDLE"}, +{ {5, "\x01\x01\x06\x01\x02", SignedIntegerDataType}, "OID_DEV_CANCEL_JOB"}, +{ {4, "\x01\x01\x05\x02", EnumerationDataType}, "OID_DEV_PRINT_INTERNAL_PAGE"}, +{ {5, "\x01\x01\x0b\x01\x02", SignedIntegerDataType}, "OID_DEV_ERROR1_CODE"}, +{ {4, "\x01\x01\x02\x06", EnumerationDataType}, "OID_DEV_CONTINUE"}, +{ {6, "\x01\x01\x06\x02\x01\x01", SignedIntegerDataType}, "OID_DEV_CURRENT_JOB_PARSING_ID"}, +{ {4, "\x01\x01\x02\x15", SignedIntegerDataType}, "OID_DEV_TOTAL_RAM_SIZE"}, +{ {5, "\x01\x04\x01\x04\x14", EnumerationDataType}, "OID_DEV_POWER_DOWN_STATE"}, +{ {4, "\x01\x01\x02\x0b", EnumerationDataType}, "OID_DEV_POWER_ON_RESET"}, +{ {7, "\x01\x01\x02\x14\x02\x01\x01", StringDataType}, "OID_STATUS_MSG_LINE1_PART1"}, +{ {6, "\x01\x01\x02\x14\x03\x01", SignedIntegerDataType}, "OID_STATUS_MSG_LINE1_INDEX"}, +{ {7, "\x01\x01\x02\x14\x02\x02\x01", StringDataType}, "OID_STATUS_MSG_LINE2_PART1"}, +{ {6, "\x01\x01\x02\x14\x03\x02", SignedIntegerDataType}, "OID_STATUS_MSG_LINE2_INDEX"}, +{ {4, "\x01\x01\x02\x27", EnumerationDataType}, "OID_STATUS_DEVICE_STATE"}, +{ {4, "\x01\x01\x02\x1b", EnumerationDataType}, "OID_DEV_REMOTE_DIAGNOSTICS"}, +{ {4, "\x01\x01\x02\x1c", EnumerationDataType}, "OID_DEV_TIME_DISPLAY"}, +{ {4, "\x01\x01\x02\x29", BinaryDataType}, "OID_DEV_KEY_PRESS_LOG"}, +{ {6, "\x01\x01\x06\x03\x01\x01", EnumerationDataType}, "OID_FAXJOB_ACTION"}, +{ {6, "\x01\x01\x06\x03\x01\x02", SignedIntegerDataType}, "OID_FAXJOB_ACTION_ID"}, +{ {6, "\x01\x01\x06\x03\x02\x01", SignedIntegerDataType}, "OID_FAXJOB_DOWNLOAD_ID"}, +{ {6, "\x01\x01\x06\x03\x02\x04", SignedIntegerDataType}, "OID_FAXJOB_UPLOAD_ID"}, +{ {7, "\x01\x01\x06\x03\x03\x09\x01", StringDataType}, "OID_FAXJOB_REMOTE_CSID"}, +{ {6, "\x01\x01\x06\x03\x02\x02", SignedIntegerDataType}, "OID_FAXJOB_RX_ID"}, +{ {7, "\x01\x01\x06\x03\x03\x01\x01", EnumerationDataType}, "OID_FAXJOB_RX_STATUS"}, +{ {7, "\x01\x01\x06\x03\x03\x02\x01", SignedIntegerDataType}, "OID_FAXJOB_RX_ERROR"}, +{ {7, "\x01\x01\x06\x03\x03\x06\x01", SignedIntegerDataType}, "OID_FAXJOB_RX_CURRENT_PAGE"}, +{ {7, "\x01\x01\x06\x03\x03\x07\x01", SignedIntegerDataType}, "OID_FAXJOB_RX_DURATION"}, +{ {6, "\x01\x01\x06\x03\x02\x03", SignedIntegerDataType}, "OID_FAXJOB_TX_ID"}, +{ {6, "\x01\x01\x06\x03\x01\x03", EnumerationDataType}, "OID_FAXJOB_TX_TYPE"}, +{ {7, "\x01\x01\x06\x03\x03\x03\x01", EnumerationDataType}, "OID_FAXJOB_TX_STATUS"}, +{ {7, "\x01\x01\x06\x03\x03\x04\x01", SignedIntegerDataType}, "OID_FAXJOB_TX_ERROR"}, +{ {7, "\x01\x01\x06\x03\x03\x05\x01", SignedIntegerDataType}, "OID_FAXJOB_TX_CURRENT_PAGE"}, +{ {7, "\x01\x01\x06\x03\x03\x08\x01", SignedIntegerDataType}, "OID_FAXJOB_TX_DURATION"}, +{ {5, "\x01\x02\x03\x02\x01", CollectionDataType}, "OID_FAX_NOT_READY_RECEIVE"}, +{ {5, "\x01\x04\x02\x02\x01", CollectionDataType}, "OID_FAX_NOT_READY_SEND"}, +{ {5, "\x01\x03\x07\x01\x06", EnumerationDataType}, "OID_FAX_DOWNLOAD"}, +{ {5, "\x01\x03\x07\x02\x06", SignedIntegerDataType}, "OID_FAX_DOWNLOAD_ERROR"}, +{ {5, "\x01\x03\x07\x02\x01", EnumerationDataType}, "OID_FAX_UPLOAD"}, +{ {5, "\x01\x03\x07\x02\x07", SignedIntegerDataType}, "OID_FAX_UPLOAD_ERROR"}, +{ {4, "\x01\x01\x03\x08", StringDataType}, "OID_FAX_LOCAL_PHONE_NUM"}, +{ {4, "\x01\x01\x03\x09", StringDataType}, "OID_FAX_STATION_NAME"}, +{ {5, "\x01\x03\x07\x01\x12", StringDataType}, "OID_FAX_PSTN_ACCESS_CODE"}, +{ {5, "\x01\x03\x07\x01\x01", SignedIntegerDataType}, "OID_FAX_RX_SCALE"}, +{ {5, "\x01\x03\x07\x01\x13", EnumerationDataType}, "OID_FAX_RX_DISPOSITION"}, +{ {5, "\x01\x03\x07\x01\x14", EnumerationDataType}, "OID_FAX_TX_CONFIRM_STAMPING"}, +{ {5, "\x01\x03\x07\x01\x0a", StringDataType}, "OID_FAX_TX_PHONE_NUMBER"}, +{ {5, "\x01\x03\x07\x01\x02", EnumerationDataType}, "OID_FAX_BEEP_ENABLE"}, +{ {5, "\x01\x03\x07\x01\x03", SignedIntegerDataType}, "OID_FAX_NOISE_VOLUME"}, +{ {5, "\x01\x03\x07\x01\x09", SignedIntegerDataType}, "OID_FAX_COUNTRY"}, +{ {5, "\x01\x03\x07\x01\x0f", StringDataType}, "OID_FAX_MERCURY_NUMBER"}, +{ {5, "\x01\x03\x07\x01\x0b", EnumerationDataType}, "OID_FAX_BLACKLISTED"}, +{ {5, "\x01\x03\x07\x01\x0c", EnumerationDataType}, "OID_FAX_BLACKLIST_DELETE"}, +{ {5, "\x01\x03\x07\x01\x11", EnumerationDataType}, "OID_FAX_FLASH_TYPE"}, +{ {5, "\x01\x03\x07\x01\x10", EnumerationDataType}, "OID_FAX_LINE_TYPE"}, +{ {6, "\x01\x01\x09\x02\x01\x01", EnumerationDataType}, "OID_FAX_ANSWER_MODE"}, +{ {5, "\x01\x03\x07\x01\x08", EnumerationDataType}, "OID_FAX_RING_ENABLE"}, +{ {6, "\x01\x01\x09\x02\x01\x02", SignedIntegerDataType}, "OID_FAX_NUM_RINGS_PICKUP"}, +{ {5, "\x01\x03\x07\x02\x02", SignedIntegerDataType}, "OID_FAX_MIN_RINGS_PICKUP"}, +{ {5, "\x01\x03\x07\x02\x03", SignedIntegerDataType}, "OID_FAX_MAX_RINGS_PICKUP"}, +{ {6, "\x01\x01\x09\x02\x01\x03", CollectionDataType}, "OID_FAX_RING_TYPE_PICKUP"}, +{ {5, "\x01\x03\x07\x01\x04", EnumerationDataType}, "OID_FAX_DISTINCTIVE_RING_DETECT"}, +{ {5, "\x01\x03\x07\x01\x05", EnumerationDataType}, "OID_FAX_BACKUP_RECEPTION"}, +{ {5, "\x01\x03\x07\x01\x07", EnumerationDataType}, "OID_FAX_SILENT_DETECTION"}, +{ {6, "\x01\x01\x09\x01\x01\x01", EnumerationDataType}, "OID_FAX_DIAL_MODE"}, +{ {5, "\x01\x03\x07\x02\x05", SignedIntegerDataType}, "OID_FAX_ADDITIONAL_WAIT"}, +{ {5, "\x01\x03\x07\x01\x0d", SignedIntegerDataType}, "OID_FAX_WHICH_REDIAL"}, +{ {5, "\x01\x03\x07\x01\x0e", SignedIntegerDataType}, "OID_FAX_REDIAL_TIME"}, +{ {5, "\x01\x03\x07\x02\x04", SignedIntegerDataType}, "OID_FAX_MAX_REDIALS"}, +{ {5, "\x01\x03\x07\x03\x01", BinaryDataType}, "OID_FAX_FWD_ENABLE_TIME"}, +{ {5, "\x01\x03\x07\x03\x02", BinaryDataType}, "OID_FAX_FWD_DISABLE_TIME"}, +{ {5, "\x01\x03\x07\x03\x03", StringDataType}, "OID_FAX_FWD_PHONE_NUMBER"}, +{ {5, "\x01\x04\x02\x05\x03", EnumerationDataType}, "OID_FAX_ALLOW_REDIALS"}, +{ {6, "\x01\x01\x09\x01\x01\x02", CollectionDataType}, "OID_FAX_REDIAL"}, +{ {6, "\x01\x01\x06\x04\x01\x01", EnumerationDataType}, "OID_FAX_LOG_ACTION"}, +{ {6, "\x01\x01\x06\x04\x01\x02", EnumerationDataType}, "OID_FAX_LOG_REPORTING"}, +{ {5, "\x01\x04\x02\x01\x02", SignedIntegerDataType}, "OID_FAX_CONTRAST"}, +{ {5, "\x01\x04\x02\x01\x01", BinaryDataType}, "OID_FAX_RESOLUTION"}, +{ {5, "\x01\x04\x02\x01\x03", EnumerationDataType}, "OID_FAX_PIXEL_DATA_TYPE"}, +{ {5, "\x01\x02\x02\x01\x01", SignedIntegerDataType}, "OID_SCAN_CONTRAST"}, +{ {5, "\x01\x02\x02\x01\x02", BinaryDataType}, "OID_SCAN_RESOLUTION"}, +{ {5, "\x01\x02\x02\x01\x03", EnumerationDataType}, "OID_SCAN_PIXEL_DATA_TYPE"}, +{ {5, "\x01\x02\x02\x01\x04", EnumerationDataType}, "OID_SCAN_COMPRESSION"}, +{ {5, "\x01\x02\x02\x01\x05", SignedIntegerDataType}, "OID_SCAN_COMPRESSION_FACTOR"}, +{ {5, "\x01\x02\x02\x01\x06", SignedIntegerDataType}, "OID_SCAN_UPLOAD_ERROR"}, +{ {5, "\x01\x02\x02\x01\x0c", EnumerationDataType}, "OID_SCAN_UPLOAD"}, +{ {5, "\x01\x02\x02\x01\x0d", BinaryDataType}, "OID_SCAN_DITHER_MATRIX"}, +{ {5, "\x01\x02\x02\x02\x01", CollectionDataType}, "OID_SCAN_NOT_READY_SOURCE"}, +{ {5, "\x01\x02\x02\x02\x02", SignedIntegerDataType}, "OID_SCAN_NUM_BRIGHTNESS_LEVELS"}, +{ {5, "\x01\x02\x02\x02\x03", StringDataType}, "OID_SCAN_RESOLUTION_RANGE"}, +{ {4, "\x01\x05\x01\x01", BinaryDataType}, "OID_COPIER_RESOLUTION"}, +{ {4, "\x01\x05\x01\x02", SignedIntegerDataType}, "OID_COPIER_CONTRAST"}, +{ {4, "\x01\x05\x01\x03", EnumerationDataType}, "OID_COPIER_PIXEL_DATA_TYPE"}, +{ {4, "\x01\x05\x01\x04", SignedIntegerDataType}, "OID_COPIER_REDUCTION"}, +{ {4, "\x01\x05\x01\x05", EnumerationDataType}, "OID_COPIER_SCAN_TO_PRINTER"}, +{ {4, "\x01\x05\x01\x06", SignedIntegerDataType}, "OID_COPIER_NUM_COPIES"}, +{ {4, "\x01\x05\x01\x07", EnumerationDataType}, "OID_COPIER_COLLATION"}, +{ {4, "\x01\x05\x02\x01", StringDataType}, "OID_COPIER_ZOOM_RANGE"}, +{ {4, "\x01\x01\x02\x2c", CollectionDataType}, "OID_CFG_STATUS"}, +{ {4, "\x01\x01\x01\x0b", EnumerationDataType}, "OID_CFG_DOWNLOAD"}, +{ {4, "\x01\x01\x02\x2b", SignedIntegerDataType}, "OID_CFG_DOWNLOAD_ERROR"}, +{ {4, "\x01\x01\x01\x0c", EnumerationDataType}, "OID_CFG_DOWNLOAD_DATA_TYPE"}, +{ {4, "\x01\x01\x01\x0d", EnumerationDataType}, "OID_CFG_UPLOAD"}, +{ {4, "\x01\x01\x02\x2d", SignedIntegerDataType}, "OID_CFG_UPLOAD_ERROR"}, +{ {4, "\x01\x01\x01\x0e", EnumerationDataType}, "OID_CFG_UPLOAD_DATA_TYPE"}, +{ {4, "\x01\x01\x05\x04", EnumerationDataType}, "OID_CFG_DELETE_DEMO_PAGES"}, +{ {5, "\x01\x03\x03\x0e\x0a", EnumerationDataType}, "OID_IMAGE_DOWNLOAD"}, +{ {5, "\x01\x03\x03\x0e\x0b", SignedIntegerDataType}, "OID_IMAGE_DOWNLOAD_ERROR"}, +{ {5, "\x01\x02\x02\x01\x07", BinaryDataType}, "OID_COLOR_CORRECTION_MATRIX"}, +{ {4, "\x01\x01\x01\x16", EnumerationDataType}, "OID_DATE_DISPLAY_FORMAT"}, +{ {4, "\x01\x05\x01\x08", EnumerationDataType}, "OID_COLOR_COPY_REQUEST"}, +{ {5, "\x01\x01\x06\x01\x0b", CollectionDataType}, "OID_STATUS_JOBS_ACTIVE"}, +{ {4, "\x01\x01\x02\x36", CollectionDataType}, "OID_STATUS_UI_DIALOGS_ACTIVE"}, +{ {4, "\x01\x01\x02\x37", EnumerationDataType}, "OID_STATUS_UI_CURRENT_CONTEXT"}, +{ {5, "\x01\x02\x02\x01\x0f", SignedIntegerDataType}, "OID_SCAN_SHARPEN_COEFF"}, +{ {5, "\x01\x02\x02\x01\x0e", BinaryDataType}, "OID_SCAN_ABC_THRESHOLDS"}, +{ {4, "\x01\x01\x03\x12", SignedIntegerDataType}, "OID_LIU_ID"}}; + +int OIDEntries = sizeof(OIDs) / sizeof(OIDs[0]); + + +PmlOid *OID_NULL = &OIDs[0].oid; +PmlOid *OID_FIRST = &OIDs[1].oid; +PmlOid *OID_DEV_MODEL_NAME = &OIDs[2].oid; +PmlOid *OID_DEV_FIRMWARE_VERSION = &OIDs[3].oid; +PmlOid *OID_DEV_DATE_AND_TIME = &OIDs[4].oid; +PmlOid *OID_DEV_PERMANENT_STORE = &OIDs[5].oid; +PmlOid *OID_DEV_TEMPORARY_STORE = &OIDs[6].oid; +PmlOid *OID_DEV_DOWNLOAD_TIMEOUT = &OIDs[7].oid; +PmlOid *OID_DEV_UPLOAD_TIMEOUT = &OIDs[8].oid; +PmlOid *OID_DEV_NOT_IDLE = &OIDs[9].oid; +PmlOid *OID_DEV_CANCEL_JOB = &OIDs[10].oid; +PmlOid *OID_DEV_PRINT_INTERNAL_PAGE = &OIDs[11].oid; +PmlOid *OID_DEV_ERROR1_CODE = &OIDs[12].oid; +PmlOid *OID_DEV_CONTINUE = &OIDs[13].oid; +PmlOid *OID_DEV_CURRENT_JOB_PARSING_ID = &OIDs[14].oid; +PmlOid *OID_DEV_TOTAL_RAM_SIZE = &OIDs[15].oid; +PmlOid *OID_DEV_POWER_DOWN_STATE = &OIDs[16].oid; +PmlOid *OID_DEV_POWER_ON_RESET = &OIDs[17].oid; +PmlOid *OID_STATUS_MSG_LINE1_PART1 = &OIDs[18].oid; +PmlOid *OID_STATUS_MSG_LINE1_INDEX = &OIDs[19].oid; +PmlOid *OID_STATUS_MSG_LINE2_PART1 = &OIDs[20].oid; +PmlOid *OID_STATUS_MSG_LINE2_INDEX = &OIDs[21].oid; +PmlOid *OID_STATUS_DEVICE_STATE = &OIDs[22].oid; +PmlOid *OID_DEV_REMOTE_DIAGNOSTICS = &OIDs[23].oid; +PmlOid *OID_DEV_TIME_DISPLAY = &OIDs[24].oid; +PmlOid *OID_DEV_KEY_PRESS_LOG = &OIDs[25].oid; +PmlOid *OID_FAXJOB_ACTION = &OIDs[26].oid; +PmlOid *OID_FAXJOB_ACTION_ID = &OIDs[27].oid; +PmlOid *OID_FAXJOB_DOWNLOAD_ID = &OIDs[28].oid; +PmlOid *OID_FAXJOB_UPLOAD_ID = &OIDs[29].oid; +PmlOid *OID_FAXJOB_REMOTE_CSID = &OIDs[30].oid; +PmlOid *OID_FAXJOB_RX_ID = &OIDs[31].oid; +PmlOid *OID_FAXJOB_RX_STATUS = &OIDs[32].oid; +PmlOid *OID_FAXJOB_RX_ERROR = &OIDs[33].oid; +PmlOid *OID_FAXJOB_RX_CURRENT_PAGE = &OIDs[34].oid; +PmlOid *OID_FAXJOB_RX_DURATION = &OIDs[35].oid; +PmlOid *OID_FAXJOB_TX_ID = &OIDs[36].oid; +PmlOid *OID_FAXJOB_TX_TYPE = &OIDs[37].oid; +PmlOid *OID_FAXJOB_TX_STATUS = &OIDs[38].oid; +PmlOid *OID_FAXJOB_TX_ERROR = &OIDs[39].oid; +PmlOid *OID_FAXJOB_TX_CURRENT_PAGE = &OIDs[40].oid; +PmlOid *OID_FAXJOB_TX_DURATION = &OIDs[41].oid; +PmlOid *OID_FAX_NOT_READY_RECEIVE = &OIDs[42].oid; +PmlOid *OID_FAX_NOT_READY_SEND = &OIDs[43].oid; +PmlOid *OID_FAX_DOWNLOAD = &OIDs[44].oid; +PmlOid *OID_FAX_DOWNLOAD_ERROR = &OIDs[45].oid; +PmlOid *OID_FAX_UPLOAD = &OIDs[46].oid; +PmlOid *OID_FAX_UPLOAD_ERROR = &OIDs[47].oid; +PmlOid *OID_FAX_LOCAL_PHONE_NUM = &OIDs[48].oid; +PmlOid *OID_FAX_STATION_NAME = &OIDs[49].oid; +PmlOid *OID_FAX_PSTN_ACCESS_CODE = &OIDs[50].oid; +PmlOid *OID_FAX_RX_SCALE = &OIDs[51].oid; +PmlOid *OID_FAX_RX_DISPOSITION = &OIDs[52].oid; +PmlOid *OID_FAX_TX_CONFIRM_STAMPING = &OIDs[53].oid; +PmlOid *OID_FAX_TX_PHONE_NUMBER = &OIDs[54].oid; +PmlOid *OID_FAX_BEEP_ENABLE = &OIDs[55].oid; +PmlOid *OID_FAX_NOISE_VOLUME = &OIDs[56].oid; +PmlOid *OID_FAX_COUNTRY = &OIDs[57].oid; +PmlOid *OID_FAX_MERCURY_NUMBER = &OIDs[58].oid; +PmlOid *OID_FAX_BLACKLISTED = &OIDs[59].oid; +PmlOid *OID_FAX_BLACKLIST_DELETE = &OIDs[60].oid; +PmlOid *OID_FAX_FLASH_TYPE = &OIDs[61].oid; +PmlOid *OID_FAX_LINE_TYPE = &OIDs[62].oid; +PmlOid *OID_FAX_ANSWER_MODE = &OIDs[63].oid; +PmlOid *OID_FAX_RING_ENABLE = &OIDs[64].oid; +PmlOid *OID_FAX_NUM_RINGS_PICKUP = &OIDs[65].oid; +PmlOid *OID_FAX_MIN_RINGS_PICKUP = &OIDs[66].oid; +PmlOid *OID_FAX_MAX_RINGS_PICKUP = &OIDs[67].oid; +PmlOid *OID_FAX_RING_TYPE_PICKUP = &OIDs[68].oid; +PmlOid *OID_FAX_DISTINCTIVE_RING_DETECT = &OIDs[69].oid; +PmlOid *OID_FAX_BACKUP_RECEPTION = &OIDs[70].oid; +PmlOid *OID_FAX_SILENT_DETECTION = &OIDs[71].oid; +PmlOid *OID_FAX_DIAL_MODE = &OIDs[72].oid; +PmlOid *OID_FAX_ADDITIONAL_WAIT = &OIDs[73].oid; +PmlOid *OID_FAX_WHICH_REDIAL = &OIDs[74].oid; +PmlOid *OID_FAX_REDIAL_TIME = &OIDs[75].oid; +PmlOid *OID_FAX_MAX_REDIALS = &OIDs[76].oid; +PmlOid *OID_FAX_FWD_ENABLE_TIME = &OIDs[77].oid; +PmlOid *OID_FAX_FWD_DISABLE_TIME = &OIDs[78].oid; +PmlOid *OID_FAX_FWD_PHONE_NUMBER = &OIDs[79].oid; +PmlOid *OID_FAX_ALLOW_REDIALS = &OIDs[80].oid; +PmlOid *OID_FAX_REDIAL = &OIDs[81].oid; +PmlOid *OID_FAX_LOG_ACTION = &OIDs[82].oid; +PmlOid *OID_FAX_LOG_REPORTING = &OIDs[83].oid; +PmlOid *OID_FAX_CONTRAST = &OIDs[84].oid; +PmlOid *OID_FAX_RESOLUTION = &OIDs[85].oid; +PmlOid *OID_FAX_PIXEL_DATA_TYPE = &OIDs[86].oid; +PmlOid *OID_SCAN_CONTRAST = &OIDs[87].oid; +PmlOid *OID_SCAN_RESOLUTION = &OIDs[88].oid; +PmlOid *OID_SCAN_PIXEL_DATA_TYPE = &OIDs[89].oid; +PmlOid *OID_SCAN_COMPRESSION = &OIDs[90].oid; +PmlOid *OID_SCAN_COMPRESSION_FACTOR = &OIDs[91].oid; +PmlOid *OID_SCAN_UPLOAD_ERROR = &OIDs[92].oid; +PmlOid *OID_SCAN_UPLOAD = &OIDs[93].oid; +PmlOid *OID_SCAN_DITHER_MATRIX = &OIDs[94].oid; +PmlOid *OID_SCAN_NOT_READY_SOURCE = &OIDs[95].oid; +PmlOid *OID_SCAN_NUM_BRIGHTNESS_LEVELS = &OIDs[96].oid; +PmlOid *OID_SCAN_RESOLUTION_RANGE = &OIDs[97].oid; +PmlOid *OID_COPIER_RESOLUTION = &OIDs[98].oid; +PmlOid *OID_COPIER_CONTRAST = &OIDs[99].oid; +PmlOid *OID_COPIER_PIXEL_DATA_TYPE = &OIDs[100].oid; +PmlOid *OID_COPIER_REDUCTION = &OIDs[101].oid; +PmlOid *OID_COPIER_SCAN_TO_PRINTER = &OIDs[102].oid; +PmlOid *OID_COPIER_NUM_COPIES = &OIDs[103].oid; +PmlOid *OID_COPIER_COLLATION = &OIDs[104].oid; +PmlOid *OID_COPIER_ZOOM_RANGE = &OIDs[105].oid; +PmlOid *OID_CFG_STATUS = &OIDs[106].oid; +PmlOid *OID_CFG_DOWNLOAD = &OIDs[107].oid; +PmlOid *OID_CFG_DOWNLOAD_ERROR = &OIDs[108].oid; +PmlOid *OID_CFG_DOWNLOAD_DATA_TYPE = &OIDs[109].oid; +PmlOid *OID_CFG_UPLOAD = &OIDs[110].oid; +PmlOid *OID_CFG_UPLOAD_ERROR = &OIDs[111].oid; +PmlOid *OID_CFG_UPLOAD_DATA_TYPE = &OIDs[112].oid; +PmlOid *OID_CFG_DELETE_DEMO_PAGES = &OIDs[113].oid; +PmlOid *OID_IMAGE_DOWNLOAD = &OIDs[114].oid; +PmlOid *OID_IMAGE_DOWNLOAD_ERROR = &OIDs[115].oid; +PmlOid *OID_COLOR_CORRECTION_MATRIX = &OIDs[116].oid; +PmlOid *OID_DATE_DISPLAY_FORMAT = &OIDs[117].oid; +PmlOid *OID_COLOR_COPY_REQUEST = &OIDs[118].oid; +PmlOid *OID_STATUS_JOBS_ACTIVE = &OIDs[119].oid; +PmlOid *OID_STATUS_UI_DIALOGS_ACTIVE = &OIDs[120].oid; +PmlOid *OID_STATUS_UI_CURRENT_CONTEXT = &OIDs[121].oid; +PmlOid *OID_SCAN_SHARPEN_COEFF = &OIDs[122].oid; +PmlOid *OID_SCAN_ABC_THRESHOLDS = &OIDs[123].oid; +PmlOid *OID_LIU_ID = &OIDs[124].oid; diff -N -ru cvshpoj/ptal/ptal-internal.h hpojexp/ptal/ptal-internal.h --- cvshpoj/ptal/ptal-internal.h Sun Nov 19 01:37:45 2000 +++ hpojexp/ptal/ptal-internal.h Sun Dec 31 03:06:54 2000 @@ -22,7 +22,6 @@ #include "ptal.h" - struct ptalProvider_s { char *name; @@ -104,39 +103,38 @@ - ptalDevice_t ptalDeviceAdd(ptalProvider_t provider,char *name,void *cbd); - - - #define PTAL_PML_MAX_VALUE_LEN 1024 #define PTAL_MAX_OID_LEN 32 - struct ptalPmlValue_s { - int type; - int lenValue; - char value[PTAL_PML_MAX_VALUE_LEN+1]; /* null terminated */ - int symbolSet; + int type; + int integer; /* Represents length when strvalue != 0. */ + char *data; /* cannot be nullterminated since it can be BINARY */ }; struct ptalPmlObject_s { - ptalPmlObject_t prev,next; - ptalDevice_t dev; - - char oid[PTAL_MAX_OID_LEN+1]; /* binary, null terminated */ - - int indexLastValue; - struct ptalPmlValue_s value[2]; - - int trapEnabled; - int trapCount; /* trap increments, enable/hasTrapped zeroes */ - ptalPmlObjectEnumerate_f *trapCallback; /* may be 0 even if trapped */ - void *cbd; /* callback data */ + /* private */ + ptalPmlObject_t prev,next; + int indexLastValue;//off what. + /* a semaphore is needed for the open/close feature */ + void *cbd; /* callback data */ + int datatype; + int oidlength; + unsigned char *oid; /* binary */ + + ptalChannel_t chan; + + int trapEnabled; + int trapCount; /* trap => increments, enable/hasTrapped => zeroes */ + ptalPmlObjectEnumerate_f *trapCallback; /* may be 0 even if trapped */ }; +struct ptalPmlError_s { + char data[3]; /* completely unknown of the information */ +}; #endif diff -N -ru cvshpoj/ptal/ptal.c hpojexp/ptal/ptal.c --- cvshpoj/ptal/ptal.c Mon Dec 18 13:28:43 2000 +++ hpojexp/ptal/ptal.c Sun Dec 31 03:06:52 2000 @@ -24,6 +24,7 @@ #include <string.h> #include <errno.h> #include "ptal-internal.h" +#include "pml.h" #define PTAL_FLUSH_LEN_BUFFER 4096 #define PTAL_FLUSH_TIMEOUT_SEC 4 @@ -523,7 +524,6 @@ serviceType,socketID,serviceName); } } - return cbd.chan; } @@ -707,8 +707,8 @@ } PTAL_LOG_DEBUG("ptalChannelRead(chan=0x%8.8X," - "buffer=0x%8.8X,count=%d) returns %d.\n", - (int)chan,(int)buffer,count,r,0,0); + "buffer=0x%8.8X,count=%d) returns %d.\n", + (int)chan,(int)buffer,count,r,0,0); return r; } @@ -872,7 +872,7 @@ r=chan->provider->channelWrite(chan,buffer,count); } else if (chan->fd==PTAL_NO_FD) { - PTAL_LOG_ERROR("ptalChannelRead(chan=0x%8.8X): " + PTAL_LOG_ERROR("ptalChannelWrite(chan=0x%8.8X): " "not open!\n", (int)chan,0,0,0,0,0); r=PTAL_ERROR; @@ -888,32 +888,207 @@ } -ptalPmlObject_t ptalPmlObjectAllocate(ptalDevice_t dev) { - +void ptalPmlObjectDump(ptalPmlObject_t obj,int level) { + fprintf(stderr,"obj=0x%8.8X, prev=0x%8.8X, next=0x%8.8X\n", + (int)obj,(int)obj->prev,(int)obj->next); + fprintf(stderr,"chan=0x%8.8X, prev=0x%8.8X, next=0x%8.8X\n", + (int)obj->chan,(int)obj->chan->prev,(int)obj->chan->next); + fprintf(stderr,"dev=0x%8.8X, provider=0x%8.8X <%s>\n", + (int)obj->chan->dev,(int)obj->chan->provider,obj->chan->provider->name); + fprintf(stderr,"indexLastValue=%d\n", + obj->indexLastValue); + fprintf(stderr,"cbd=0x%8.8X\n", + obj->cbd); + fprintf(stderr,"oid=%s\n", + obj->oid); + fprintf(stderr,"trapEnabled=%d\n", + obj->trapEnabled); + fprintf(stderr,"trapCount=%d\n", + obj->trapCount); + fprintf(stderr,"trapCallback=%d\n", + obj->trapCallback); + fprintf(stderr,"\n"); } -int ptalPmlObjectEnumerate(ptalDevice_t dev, - ptalPmlObjectEnumerate_f callback,void *cbd) { - +/* returns the first ptalPMLObject */ +ptalPmlObject_t ptalPmlObjectAllocate(ptalDevice_t dev, char* objectName) { + /* TODO: find the socket for PML (if any), currently assuming socket + 0x01 for PML communication since that's the one for HP OfficeJet */ + + /* Somehow there should be a list of Objects, but to what shall it + be rooted, the channel? */ + const int pmlSocket = 0x01; + int c; + ptalPmlObject_t obj = 0; + + ptalChannel_t chan = 0; + ptalDebugFlag = 10; + + PTAL_LOG_DEBUG("ptalPmlObjectAllocate(dev=0x%8.8X): starting\n",0,0,0,0,0,0); + + chan = ptalChannelFindOrAllocate(dev, PTAL_STYPE_GENERIC,pmlSocket ,"PML"); + if(!chan){ + PTAL_LOG_ERROR("ptalPmlObjectAllocate(dev=0x%8.8X): ptalChannelFindOrAllocate(dev=0x%8.8X, %d, %d, %s) returns 0\n", + (int)dev,(int)dev,PTAL_STYPE_GENERIC,pmlSocket,"PML",0); + return 0; + } + + /*calloc initialise and zeros the PML OIDs for the channel*/ + obj = (ptalPmlObject_t) calloc(1, sizeof(struct ptalPmlObject_s)); + if(!obj){ + PTAL_LOG_ERROR("ptalPmlObjectAllocate(dev=0x%8.8X): calloc(1, %d) returns 0\n", + (int)dev,(int)sizeof(struct ptalPmlObject_s),0,0,0,0); + return 0; + } + obj->chan = chan; + + /* Find oid by objectName. Linear search ..=:-( : */ + /* I think that the list of OIDs is device dependent */ + for(c = 0 ; c < OIDEntries; c++){ + if(strcmp(OIDs[c].name, objectName) == 0){ + obj->oid = (unsigned char*) calloc(OIDs[c].oid.len, sizeof(unsigned char)); + if(!obj->oid){ + PTAL_LOG_ERROR("ptalPmlObjectAllocate(dev=0x%8.8X): calloc(%d, %d) returns 0", + (int)dev,OIDs[c].oid.len,(int)sizeof(unsigned char),0,0,0); + free(obj); + return 0; + } + memcpy(obj->oid, OIDs[c].oid.id, OIDs[c].oid.len); + obj->oidlength = OIDs[c].oid.len; + obj->datatype = OIDs[c].oid.type; + break; + } + } + if(c == OIDEntries){/*OID by that name not found*/ + free(obj); + return 0; + } + return obj; } int ptalPmlObjectDeallocate(ptalPmlObject_t obj) { - + /* TODO: disconnect the list of PML objects */ + if(obj){ + if(obj->oid){ + free(obj->oid); + } + free(obj); + } } -int ptalPmlObjectSetID(ptalPmlObject_t obj,char *oid,int len) { +int ptalPmlObjectEnumerate(ptalDevice_t dev, + ptalPmlObjectEnumerate_f callback,void *cbd) { } -int ptalPmlObjectGetID(ptalPmlObject_t obj,char *buffer,int maxlen) { +int ptalPmlObjectGetValue(const ptalPmlObject_t obj, ptalPmlValue_t* _val, ptalPmlError_t* _err){ + ptalChannel_t chan; + unsigned char sendbuf[4096]; + unsigned char recvbuf[4096]; + int read, c, replycode, exec_code; + ptalPmlObject_t recvObj = 0; + + chan = ptalChannelFindOrAllocate(obj->chan->dev,PTAL_STYPE_GENERIC,1,"PML"); + ptalChannelSetPacketSizes(chan,4096, 4096); + PTAL_LOG_DEBUG("ptalChannelFindOrAllocate(dev=0x%8.8X," + "type=%d,socket=%d, name=%s) returns 0x%8.8X.\n", + (int)obj->chan->dev,(int)PTAL_STYPE_GENERIC,1,"PML",(int)chan,0); + + sendbuf[0] = GetRequest; + PMLencodeObject(&(sendbuf[1]), obj); + + ptalChannelOpenOrReopen(chan); + ptalChannelWrite(chan, sendbuf, strlen(obj->oid) + 3); + + read = ptalChannelRead(chan, recvbuf, 4096); + /* + fprintf(stderr, "Received: "); + for(c= 0; c < read; c++){ + fprintf(stderr, "%2.2X:", recvbuf[c]); + } + fprintf(stderr, "\n"); + fprintf(stderr, "Received: "); + for(c= 0; c < read; c++){ + fprintf(stderr, "%c", recvbuf[c]); + } + fprintf(stderr, "\n"); + */ + PMLdecodeReply(&replycode, &exec_code, _err, &recvObj, _val, recvbuf); + if(!(0x80 == replycode && 00 == exec_code)){ + fprintf(stderr, PMLExecutionToString(exec_code)); + } + + ptalChannelClose(chan); + return 0; +} + +int ptalPmlObjectSetValue(const ptalPmlObject_t obj, ptalPmlValue_t val, ptalPmlError_t* _err){ + ptalChannel_t chan; + unsigned char sendbuf[4096]; + unsigned char recvbuf[4096]; + int read, c, replycode, exec_code, encoded , r; + ptalPmlObject_t recvObj = 0; + ptalPmlValue_t recvVal = 0; + + if(obj->datatype != val->type){ + PTAL_LOG_ERROR("%s:%d: Invalid datatype in Object.\n",__FILE__,__LINE__,0,0,0,0); + return -1; + } + + chan = ptalChannelFindOrAllocate(obj->chan->dev,PTAL_STYPE_GENERIC,1,"PML"); + ptalChannelSetPacketSizes(chan,4096, 4096); + PTAL_LOG_DEBUG("ptalChannelFindOrAllocate(dev=0x%8.8X," + "type=%d,socket=%d, name=%s) returns 0x%8.8X.\n", + (int)obj->chan->dev,(int)PTAL_STYPE_GENERIC,1,"PML",(int)chan,0); + + r = 0; + sendbuf[0] = SetRequest; + r++; + encoded = PMLencodeObject(&(sendbuf[r]), obj); + if(encoded < 0){ + return encoded; + } + r+= encoded; + encoded = PMLencodeValue(&(sendbuf[r]), val); + if(encoded < 0){ + return encoded; + } + r+= encoded; + + ptalChannelOpenOrReopen(chan); + /* + fprintf(stderr, "Sending: "); + for(c= 0; c < r; c++){ + fprintf(stderr, "%2.2X:", sendbuf[c]); + } + fprintf(stderr, "\n"); + */ + ptalChannelWrite(chan, sendbuf, strlen(obj->oid) + 3); + + read = ptalChannelRead(chan, recvbuf, 4096); + /* + fprintf(stderr, "Received: "); + for(c= 0; c < read; c++){ + fprintf(stderr, "%2.2X:", recvbuf[c]); + } + fprintf(stderr, "\n"); + fprintf(stderr, "Received: "); + for(c= 0; c < read; c++){ + fprintf(stderr, "%c", recvbuf[c]); + } + fprintf(stderr, "\n"); + */ + PMLdecodeReply(&replycode, &exec_code, _err, &recvObj, &recvVal, recvbuf); + if(!(0x80 == replycode && 00 == exec_code)){ + fprintf(stderr, PMLExecutionToString(exec_code)); + } + ptalChannelClose(chan); + return 0; } - /* TODO: PML: -get(oid,pvalue) -set(oid,value) getnext(oid,pnextoid,pvalue) enable trap(oid,callback) disable trap(oid,callback) diff -N -ru cvshpoj/ptal/ptal.h hpojexp/ptal/ptal.h --- cvshpoj/ptal/ptal.h Sun Nov 19 01:37:47 2000 +++ hpojexp/ptal/ptal.h Sun Dec 31 03:06:54 2000 @@ -34,11 +34,16 @@ #define PTAL_MAX_SERVICE_NAME_LEN 40 - -typedef struct ptalProvider_s *ptalProvider_t; -typedef struct ptalDevice_s *ptalDevice_t; -typedef struct ptalChannel_s *ptalChannel_t; +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ptalProvider_s *ptalProvider_t; +typedef struct ptalDevice_s *ptalDevice_t; +typedef struct ptalChannel_s *ptalChannel_t; typedef struct ptalPmlObject_s *ptalPmlObject_t; +typedef struct ptalPmlValue_s *ptalPmlValue_t; +typedef struct ptalPmlError_s *ptalPmlError_t; typedef int ptalProviderEnumerate_f(char *name,void *cbd); typedef int ptalDeviceEnumerate_f(ptalDevice_t dev,void *cbd); @@ -103,8 +108,8 @@ struct timeval *startTimeout,struct timeval *continueTimeout); int ptalChannelWrite(ptalChannel_t chan,char *buffer,int count); - - - +#ifdef __cplusplus +} +#endif #endif |