int API_E3(void *Request, void *Reply)
{
_SI=(unsigned)Request;
_DI=(unsigned)Reply;
_ES=_DS;
_AH=0xE3;
geninterrupt(0x21);
return(_AL);
}
void perror(int ern)
{
if (printdebug==1)
switch (ern)
{
case 0x00: printf("Success\n"); break;
case 0x96: printf("Server Out Of Memory\n"); break;
case 0x9C: printf("Invalid Path\n"); break;
case 0xD0: printf("Q Error\n"); break;
case 0xD1: printf("No Queue\n"); break;
case 0xD2: printf("No Q Server\n"); break;
case 0xD3: printf("No Q Rights\n"); break;
case 0xD5: printf("No Q Job\n"); break;
case 0xEC: printf("No Such Segment\n"); break;
case 0xEF: printf("Invalid name\n"); break;
case 0xF0: printf("Wildcard Not Allowed\n"); break;
case 0xF1: printf("Invalid Bindary Security\n"); break;
case 0xFB: printf("No Such Property\n"); break;
case 0xFC: printf("No Such Object\n"); break;
case 0xFE: printf("Server Bindary Locked\n"); break;
case 0xFF: printf("Bindary Failure\n"); break;
default: printf("Unknown error #%2x#2\n",ern); break;
}
else
switch (ern)
{
case 0x00:
case 0x96:
case 0x9C:
case 0xD0:
case 0xD1:
case 0xD2:
case 0xD3:
case 0xD5:
case 0xEC:
case 0xEF:
case 0xF0:
case 0xF1:
case 0xFB:
case 0xFC:
case 0xFE:
case 0xFF: break;
default: printf("Unknown error #%2x#2\n",ern); break;
}
}
int ScanBinderyObject (char *searchObjectName, WORD searchObjectType,
long *objectID, char *objectName, WORD *objectType,
char *objectHasProperties, char *objectFlag,
char *objectSecurity)
{
static long Last_ObjectID=0xFFFFFFFF;
struct scanBindReq Request;
struct scanBindRep Reply;
int result;
// memset ( & Request, NULL, sizeof(Request));
// memset ( & Reply, NULL, sizeof(Reply ));
zap(Request);
zap(Reply);
Request.Length= sizeof(Request)-2;
Request.Function= 0x37;
Request.LastObjectID= Last_ObjectID;
Request.ObjectType= searchObjectType;
Request.ObjectNameLength=strlen(searchObjectName);
strcpy(Request.ObjectName,searchObjectName);
Reply.Length=sizeof(Reply)-2;
result=API_E3(&Request,&Reply);
*objectID =Reply.ObjectID;
strcpy(objectName,Reply.ObjectName);
*objectType =Reply.ObjectType;
*objectHasProperties=Reply.ObjectHasProperties;
*objectFlag =Reply.ObjectFlag;
*objectSecurity =Reply.ObjectSecurity;
Last_ObjectID=*objectID;
return (result);
}
void GetPrintServerName(long qsid,char *sname)
{
struct getBindObjNameReq Request;
struct getBindObjNameRep Reply;
int result;
zap(Request);
zap(Reply);
Request.Length= sizeof(Request)-2;
Request.Function=0x36;
Request.ObjectID=qsid;
Reply.Length= sizeof(Reply )-2;
result=API_E3(&Request,&Reply);
if (result>0) {
perror(result);
strcpy(sname,"");
}
else {
strcpy(sname,Reply.ObjectName);
}
return;
}
void GetPrintServer (long qid,char *sname)
{
struct readQueueStatReq Request;
struct readQueueStatRep Reply;
int result;
zap(Request);
zap(Reply);
Request.Length=sizeof(Request)-2;
Request.Function=0x66;
Request.ObjectID=qid;
Reply.Length= sizeof(Reply )-2;
result=API_E3(&Request,&Reply);
if (result!=0) perror(result);
if (Reply.NumberOfServers>0) {
GetPrintServerName(Reply.ServerID[0],sname);
}
else {
strcpy(sname,"");
}
return;
}
void GetQueueLocation(LONG qid,char *qloc)
{
struct readPropValueReq Request;
struct readPropValueRep Reply;
int result;
char sname[100];
zap(Request);
zap(Reply);
zap(sname);
GetPrintServer(qid,sname);
Request.Length=sizeof(Request)-2;
Request.Function=0x3D;
Request.ObjectType=0x0700; // 0x0700 = Queue (Byte swapped)
Request.ObjectNameLength=sizeof(Request.ObjectName);
strcpy(Request.ObjectName,sname);
Request.SegmentNumber=1;
Request.PropertyNameLength=14;
strcpy(Request.PropertyName,"IDENTIFICATION");
Reply.Length=sizeof(Reply)-2;
if (sname[0]=='\0')
{
result=0;
}
else
{
result=API_E3(&Request,&Reply);
}
if (result!=0) {
perror(result);
strcpy(qloc,"");
}
else strcpy(qloc,Reply.PropertyValue);
return;
}
void GetServerLocation(LONG qsid, char *qloc)
{
struct readPropValueReq Request;
struct readPropValueRep Reply;
int result;
char stmp[100];
zap(Request);
zap(Reply);
zap(stmp);
GetPrintServerName(qsid,stmp);
Request.Length=sizeof(Request)-2;
Request.Function=0x3D;
Request.ObjectType=0x0700; // 0x0700 = Queue (Byte swapped)
Request.ObjectNameLength=sizeof(Request.ObjectName);
strcpy(Request.ObjectName,stmp);
Request.SegmentNumber=1;
Request.PropertyNameLength=14;
strcpy(Request.PropertyName,"IDENTIFICATION");
Reply.Length=sizeof(Reply)-2;
result=API_E3(&Request,&Reply);
if (result!=0)
{
perror(result);
strcpy(qloc,"");
}
else strcpy(qloc,Reply.PropertyValue);
return;
}
void GetQueueDefaultLocation(char *qname, char *qloc)
{
struct readPropValueReq Request;
struct readPropValueRep Reply;
int result;
union
{
char s[4];
LONG l;
} PServer;
zap(Request);
zap(Reply);
Request.Length=sizeof(Request)-2;
Request.Function=0x3D;
Request.ObjectType=0x0300; // 0x0300 = Print Queue (Byte swapped)
Request.ObjectNameLength=sizeof(Request.ObjectName);
strcpy(Request.ObjectName,qname);
Request.SegmentNumber=1;
Request.PropertyNameLength=9;
strcpy(Request.PropertyName,"Q_SERVERS");
Reply.Length=sizeof(Reply)-2;
result=API_E3(&Request,&Reply);
if (result!=0) {
if (result!=0xFC) perror(result);
strcpy(qloc,"");
}
else
{
PServer.s[0]=Reply.PropertyValue[0];
PServer.s[1]=Reply.PropertyValue[1];
PServer.s[2]=Reply.PropertyValue[2];
PServer.s[3]=Reply.PropertyValue[3];
GetServerLocation(PServer.l,qloc);
}
return;
}
int QueueServerReady (long qid)
{
struct readQueueStatReq Request;
struct readQueueStatRep Reply;
int result;
zap(Request);
zap(Reply);
Request.Length=sizeof(Request)-2;
Request.Function=0x66;
Request.ObjectID=qid;
Reply.Length= sizeof(Reply )-2;
result=API_E3(&Request,&Reply);
if (result!=0) perror(result);
result=0;
if (Reply.NumberOfServers>0) result=1;
return (result);
}