|
|
/***************************************************************************
Name : NEGOT.C Comment : Capability handling and negotiation
Revision Log Date Name Description -------- ----- --------------------------------------------------------- ***************************************************************************/ #define USE_DEBUG_CONTEXT DEBUG_CONTEXT_T30_MAIN
#include "prep.h"
#include "protocol.h"
#include "glbproto.h"
BYTE BestEncoding[8] = { 0, // none (error)
1, // MH only
2, // MR only
2, // MR & MH
4, // MMR only
4, // MMR & MH
4, // MMR & MR
4 // MMR & MR & MH
};
BOOL NegotiateCaps(PThrdGlbl pTG) { USHORT Res;
DEBUG_FUNCTION_NAME(_T("NegotiateCaps"));
memset(&pTG->Inst.SendParams, 0, sizeof(pTG->Inst.SendParams)); pTG->Inst.SendParams.bctype = SEND_PARAMS; pTG->Inst.SendParams.wBCSize = sizeof(BC); pTG->Inst.SendParams.wTotalSize = sizeof(BC);
pTG->Inst.awfi.Encoding = (MH_DATA | MR_DATA); if (!pTG->SrcHiRes) { pTG->Inst.awfi.AwRes = AWRES_mm080_038; } else { pTG->Inst.awfi.AwRes = (AWRES_mm080_038 | AWRES_mm080_077 | AWRES_200_200 | AWRES_300_300); }
/////// Encoding ///////
if(!(pTG->Inst.SendParams.Fax.Encoding = BestEncoding[(pTG->Inst.awfi.Encoding)&pTG->Inst.RemoteRecvCaps.Fax.Encoding])) { // No matching Encoding not supported
DebugPrintEx( DEBUG_ERR, "Negotiation failed: SendEnc %d CanRecodeTo %d" " RecvCapsEnc %d. No match", pTG->Inst.awfi.Encoding, pTG->Inst.awfi.Encoding, pTG->Inst.RemoteRecvCaps.Fax.Encoding); goto error; }
/////// Width ///////
// It is never set, so it always remains at 0 = WIDTH_A4
pTG->Inst.RemoteRecvCaps.Fax.PageWidth &= 0x0F; // castrate all A5/A6 widths
if(pTG->Inst.awfi.PageWidth> 0x0F) { // A5 or A6. Can quit or send as A4
DebugPrintEx(DEBUG_ERR,"Negotiation failed: A5/A6 images not supported"); goto error; }
if(pTG->Inst.RemoteRecvCaps.Fax.PageWidth < pTG->Inst.awfi.PageWidth) { // or do some scaling
DebugPrintEx(DEBUG_ERR,"Negotiation failed: Image too wide"); goto error; } else { pTG->Inst.SendParams.Fax.PageWidth = pTG->Inst.awfi.PageWidth; }
/////// Length ///////
// It is never set, so it always remains at 0 = LENGTH_A4
if(pTG->Inst.RemoteRecvCaps.Fax.PageLength < pTG->Inst.awfi.PageLength) { DebugPrintEx(DEBUG_ERR,"Negotiation failed: Image too long"); goto error; } else { pTG->Inst.SendParams.Fax.PageLength = pTG->Inst.awfi.PageLength; }
/////// Res ///////
Res = (USHORT) (pTG->Inst.awfi.AwRes & pTG->Inst.RemoteRecvCaps.Fax.AwRes); if(Res) // send native
{ pTG->Inst.SendParams.Fax.AwRes = Res; } else { switch(pTG->Inst.awfi.AwRes) { case AWRES_mm160_154: if(AWRES_400_400 & pTG->Inst.RemoteRecvCaps.Fax.AwRes) { pTG->Inst.SendParams.Fax.AwRes = AWRES_400_400; } else { DebugPrintEx( DEBUG_ERR, "Negotiation failed: 16x15.4 image and" " no horiz scaling"); goto error; } break;
case AWRES_mm080_154: if(pTG->Inst.SendParams.Fax.Encoding == MMR_DATA) { DebugPrintEx( DEBUG_ERR, "Negotiation failed: 8x15.4 image and" " no vert scaling"); goto error; } if(AWRES_mm080_077 & pTG->Inst.RemoteRecvCaps.Fax.AwRes) { pTG->Inst.SendParams.Fax.AwRes = AWRES_mm080_077; } else if(AWRES_200_200 & pTG->Inst.RemoteRecvCaps.Fax.AwRes) { pTG->Inst.SendParams.Fax.AwRes = AWRES_200_200; } else { pTG->Inst.SendParams.Fax.AwRes = AWRES_mm080_038; } break;
case AWRES_mm080_077: if(AWRES_200_200 & pTG->Inst.RemoteRecvCaps.Fax.AwRes) { pTG->Inst.SendParams.Fax.AwRes = AWRES_200_200; } else if(pTG->Inst.SendParams.Fax.Encoding == MMR_DATA) { DebugPrintEx( DEBUG_ERR, "Negotiation failed: 8x7.7 image and" " no vert scaling"); goto error; } else { pTG->Inst.SendParams.Fax.AwRes = AWRES_mm080_038; } break;
case AWRES_400_400: if(AWRES_mm160_154 & pTG->Inst.RemoteRecvCaps.Fax.AwRes) { pTG->Inst.SendParams.Fax.AwRes = AWRES_mm160_154; } else { DebugPrintEx( DEBUG_ERR, "Negotiation failed: 400dpi image and" " no horiz scaling"); goto error; } break;
case AWRES_300_300: { DebugPrintEx( DEBUG_ERR, "Negotiation failed: 300dpi image and" " no non-integer scaling"); goto error; } break;
case AWRES_200_200: if(AWRES_mm080_077 & pTG->Inst.RemoteRecvCaps.Fax.AwRes) { pTG->Inst.SendParams.Fax.AwRes = AWRES_mm080_077; } else if(pTG->Inst.SendParams.Fax.Encoding == MMR_DATA) { DebugPrintEx( DEBUG_ERR, "Negotiation failed: 200dpi image and" " no vert scaling"); goto error; } else { pTG->Inst.SendParams.Fax.AwRes = AWRES_mm080_038; } break;
} }
DebugPrintEx( DEBUG_MSG, "Negotiation Succeeded: Res=%d PageWidth=%d Len=%d" " Enc=%d", pTG->Inst.SendParams.Fax.AwRes, pTG->Inst.SendParams.Fax.PageWidth, pTG->Inst.SendParams.Fax.PageLength, pTG->Inst.SendParams.Fax.Encoding); return TRUE;
error: return FALSE; }
void InitCapsBC(PThrdGlbl pTG, LPBC lpbc, USHORT uSize, BCTYPE bctype) { DEBUG_FUNCTION_NAME(_T("InitCapsBC"));
memset(lpbc, 0, uSize); lpbc->bctype = bctype; // They should be set. This code here is correct--arulm
// +++ Following three lines are not in pcfax11
lpbc->wBCSize = sizeof(BC); lpbc->wTotalSize = sizeof(BC);
if (! pTG->SrcHiRes) { lpbc->Fax.AwRes = AWRES_mm080_038; } else { lpbc->Fax.AwRes = (AWRES_mm080_038 | AWRES_mm080_077 | AWRES_200_200 | AWRES_300_300); }
lpbc->Fax.Encoding = (MH_DATA | MR_DATA);
lpbc->Fax.PageWidth = WIDTH_A4; // can be upto A3
lpbc->Fax.PageLength = LENGTH_UNLIMITED; }
|