#include "ttp.h"
#include "ttppdu.h"
#include "CBufferSegment.h"
#include "IrDALog.h"
#if(hasTracing > 0 && hasTTPPduTracing > 0)
enum IrTinyTPpduTraceCodes
{
kPduConnect = 1,
kPduConnectParse,
kPduGetMax,
kPduData,
kPduDataParse,
kBufferHideRest
};
static
EventTraceCauseDesc gTraceEvents[] = {
{kPduConnect, "TinyTPpdu: connect"},
{kPduConnectParse, "TinyTPpdu: connect parse"},
{kPduGetMax, "TinyTPpdu: Get Sdu Max"},
{kPduData, "TinyTPpdu: data"},
{kPduDataParse, "TinyTPpdu: data parse, ttp byte=, bufsize="},
{kBufferHideRest, "TinyTPpdu: buffer hide rest"}
};
#define XTRACE(x, y, z) IrDALogAdd( x, y, z, gTraceEvents, true )
#else
#define XTRACE(x, y, z) ((void)0)
#endif
TTPBuf *
ttp_pdu_connect(int p, int initialCredit, int maxSduSize, TTPBuf *data)
{
TTPBuf *m; int datalen; UInt32 byte;
XTRACE(kPduConnect, initialCredit, maxSduSize);
if (maxSduSize == 0) { if (p) { DebugLog("IrDA-TTPPDU: Request to send zero value maxsdu"); }
p = 0;
}
if (data) datalen = BufSize(data); else datalen = 0;
m = BufAlloc(1000); require(m, NoMem);
byte = ((p & 0x01) << 7) | (initialCredit & 0x7f);
BufPut(m, byte);
if (p > 0) { BufPut(m, 4);
BufPut(m, PiMaxSduSize); BufPut(m, 2); BufPut(m, (maxSduSize >> 8) & 0xff); BufPut(m, maxSduSize & 0xff); }
if (datalen) { BufSeekStart(data); while (datalen--) { BufPut(m, BufGet(data));
}
}
BufHideRest(m); XTRACE(kPduConnect, 0, BufSize(m)); NoMem:
return m;
}
void
ttp_pdu_connect_parse(
TTPBuf *data, int *p, int *n, unsigned char *plist) {
unsigned char flag;
XTRACE(kPduConnectParse, 0, 0);
flag = BufGet(data); BufHideStart(data, 1); *p = (flag >> 7) & 0x01; *n = flag & 0x7f;
if (*p) { int plen, i;
plen = BufGet(data); BufHideStart(data, 1); if (plen > 60) return; *plist++ = plen; for (i = 0 ; i < plen; i++) {
*plist++ = BufGet(data); BufHideStart(data, 1); }
}
else *plist = 0;
XTRACE(kPduConnectParse, *p, *n);
}
Boolean
ttp_pdu_connect_get_max_sdu_size(unsigned char *plist, UInt32 *max)
{
int plen;
UInt32 temp;
UInt32 pi; UInt32 pl; UInt32 i;
XTRACE(kPduGetMax, 0, *plist);
plen = *plist++; while (plen > 0) { pi = *plist++; pl = *plist++; plen -= (2 + pl); if (pi == PiMaxSduSize) { if (pl > sizeof(UInt32)) return false; temp = 0;
for (i = 0; i < pl ; i++) { temp = temp << 8;
temp |= *plist++;
}
XTRACE(kPduGetMax, 1, temp);
*max = temp;
return true;
}
} return false;
}
TTPBuf *
ttp_pdu_data(Boolean m, int credit, TTPBuf *data)
{ int len;
TTPBuf *outbuf; unsigned char byte;
XTRACE(kPduData, m, credit);
if (data) len = BufSize(data); else len = 0;
outbuf = BufAlloc(1 + len); require(outbuf, NoMem);
byte = credit & 0x7f; if (m) byte |= 0x80; BufPut(outbuf, byte);
if (len) { int count;
UInt8 *base;
base = BufBase(data); check(base);
BufSeekStart(data); count = outbuf->Putn(base, len); check(count == len);
}
BufHideRest(outbuf); NoMem:
return outbuf;
}
void
ttp_pdu_data_setbyte(Boolean m, int credit, TTPBuf *data)
{
unsigned char byte;
unsigned char *wptr;
check(data);
byte = credit & 0x7f; if (m) byte |= 0x80; wptr = BufBase(data); check(wptr);
*wptr =byte; }
void
ttp_pdu_data_parse(TTPBuf *userData, Boolean *m, int *credit)
{
unsigned char byte;
check(userData);
byte = BufGet(userData); BufHideStart(userData, 1); if (byte >> 7) *m = true; else *m = false;
*credit = (byte & 0x7f); XTRACE(kPduDataParse, byte, BufSize(userData));
}
void
BufHideRest(TTPBuf *data)
{ int size, length;
length = data->Position();
size = BufSize(data); check(size);
XTRACE (kBufferHideRest, 1, length);
XTRACE (kBufferHideRest, 2, size);
BufHideEnd(data, size-length); BufSeekStart(data);
XTRACE( kBufferHideRest, 3, BufSize(data));
}