#include "IrDscInfo.h"
#include "CBufferSegment.h"
#define super OSObject
OSDefineMetaClassAndStructors(TIrDscInfo, OSObject);
TIrDscInfo *
TIrDscInfo::tIrDscInfo()
{
TIrDscInfo *obj = new TIrDscInfo;
if (obj && !obj->init()) {
obj->release();
obj = nil;
}
return obj;
}
void
TIrDscInfo::free()
{
super::free();
}
bool
TIrDscInfo::init()
{
fDevAddr = 0;
fHints = 0;
fVersion = 0;
fCharset = 0;
bzero(fNickname, sizeof(fNickname));
bzero(fHintCount, sizeof(fHintCount));
if (!super::init()) return false;
return true;
}
void TIrDscInfo::SetServiceHints( ULong hints )
{
fHints |= hints;
for( int index = 0; index < kHintCount; index++ ) {
if( hints & ( 1<<index ) )
fHintCount[index]++;
}
}
void TIrDscInfo::RemoveServiceHints( ULong hints )
{
for( int index = 0; index < kHintCount; index++ ) {
ULong hintMask = 1<<index;
if( hints & hintMask ) {
fHintCount[index]--;
if( fHintCount[index] == 0 )
fHints &= ~hintMask;
}
}
}
IrDAErr TIrDscInfo::SetNickname(const char* name)
{
ULong nameLen;
nameLen = strlen(name);
if (nameLen > kMaxNicknameLen) {
return errBadArg;
}
strlcpy((char*)&fNickname[0], name, sizeof(fNickname));
return noErr;
}
void TIrDscInfo::GetNickname(UChar* name, int maxnamelen)
{
strlcpy((char*)name, (const char*)&fNickname[0], maxnamelen);
}
ULong TIrDscInfo::AddDevInfoToBuffer(UByte* buffer, ULong maxBytes)
{
#pragma unused(maxBytes)
UByte hintByte;
ULong index;
ULong hints;
ULong nameLen;
ULong devInfoLen = 0;
for (hints = fHints, index = 0; index < 4; index++) {
hintByte = (UByte)(hints & 0xFF);
hints >>= 8;
if (hints != 0) {
hintByte |= kDevInfoHintExtension1;
}
else hintByte &= ~kDevInfoHintExtension1;
*buffer++ = hintByte;
devInfoLen++;
if (hints == 0) break;
}
*buffer++ = GetCharacterSet();
devInfoLen++;
nameLen = Min(strlen((const char*)&fNickname[0]), kMaxNicknameLen - (devInfoLen - 2));
memcpy(buffer, fNickname, (unsigned int)nameLen);
devInfoLen += nameLen;
return devInfoLen;
}
IrDAErr TIrDscInfo::ExtractDevInfoFromBuffer(CBufferSegment *buffer)
{
UByte hintByte;
ULong index;
ULong bytesRead;
UByte devInfo[4 + 1 + kMaxNicknameLen];
fHints = 0;
fNickname[0] = 0;
bytesRead = buffer->Getn(&devInfo[0], sizeof(devInfo));
for (index = 0; index < bytesRead; ) {
hintByte = devInfo[index];
fHints |= (hintByte & ~kDevInfoHintExtension1) << (index * 8);
index++;
if ((hintByte & kDevInfoHintExtension1) == 0) break;
}
if (index < bytesRead) {
SetCharacterSet(devInfo[index++]);
}
memcpy(fNickname, &devInfo[index], (unsigned int)(bytesRead - index));
fNickname[bytesRead - index] = 0;
return noErr;
}