#include "CIrLSAP.h"
#include "IrIASClient.h"
#include "IrIASService.h"
#include "IrGlue.h"
#include "IrLSAPConn.h"
#include "CBufferSegment.h"
#include "IrDALog.h"
#if (hasTracing > 0 && hasIrLSAPTracing > 0)
enum IrLSAPTraceCodes
{
kLogNew = 1,
kLogFree,
kLogInit,
kUnexpectedEvent,
kDiscoverStartEvent,
kDiscoverCompleteEvent,
kLogDiscoverCompleteErr,
kLookupStartEvent,
kNSClientConnectedEvent,
kNSClientLookupReplyEvent,
kNSClientLookupDisconnectEvent,
kLookupCompleteEvent,
kConnectStartEvent,
kConnectCompleteEvent,
kListenStartEvent,
kListenCompleteEvent,
kLogListenCompleteErr,
kAcceptStartEvent,
kAcceptCompleteEvent,
kGetStartEvent,
kGetCompleteEvent,
kPutStartEvent,
kPutCompleteEvent,
kDisconnectStartEvent,
kDisconnectCompleteEvent,
kGetBackFromGrabEvent,
kGetAboutToEnqueueEvent,
kGetBackFromEnqueue,
kCheckCBOk,
kCheckCBBad,
kLSAPEventProcess,
kCancelPuts,
kCancelGets,
kCancelPutsComplete,
kCancelGetsComplete,
kEnqueueEvent,
kDequeueEventStart,
kDequeueEventEnd
};
static
EventTraceCauseDesc gTraceEvents[] = {
{kLogNew, "CIrLSAP: new obj="},
{kLogFree, "CIrLSAP: free obj="},
{kLogInit, "CIrLSAP: init, obj=,lsapid="},
{kUnexpectedEvent, "CIrLSAP: unexpected event"},
{kDiscoverStartEvent, "CIrLSAP: Discover request"},
{kDiscoverCompleteEvent, "CIrLSAP: Discover reply"},
{kLogDiscoverCompleteErr, "CirLSAP: Discover reply ERROR"},
{kLookupStartEvent, "CIrLSAP: Lookup request"},
{kNSClientConnectedEvent, "CIrLSAP: Lookup IAS Client Connected"},
{kNSClientLookupReplyEvent, "CIrLSAP: Lookup IAS Client Reply"},
{kNSClientLookupDisconnectEvent,"CIrLSAP: Lookup IAS Client Disconnected"},
{kLookupCompleteEvent, "CIrLSAP: Lookup complete"},
{kConnectStartEvent, "CIrLSAP: Connect request"},
{kConnectCompleteEvent, "CIrLSAP: Connect reply"},
{kListenStartEvent, "CIrLSAP: Listen request"},
{kListenCompleteEvent, "CIrLSAP: Listen reply"},
{kLogListenCompleteErr, "CIrLSAP: Listen reply ERROR"},
{kAcceptStartEvent, "CIrLSAP: Accept request"},
{kAcceptCompleteEvent, "CIrLSAP: Accept reply"},
{kGetStartEvent, "CIrLSAP: Get request"},
{kGetCompleteEvent, "CIrLSAP: Get reply"},
{kPutStartEvent, "CIrLSAP: Put request"},
{kPutCompleteEvent, "CIrLSAP: Put reply"},
{kDisconnectStartEvent, "CIrLSAP: Disconnect request"},
{kDisconnectCompleteEvent, "CIrLSAP: Disconnect complete"},
{kGetBackFromGrabEvent, "CIrLSAP: Get req back from grab event block"},
{kGetAboutToEnqueueEvent, "CIrLSAP: Get req about to enqueue event"},
{kGetBackFromEnqueue, "CIrLSAP: Get req back from enqueue event"},
{kCheckCBOk, "CIrLSAP: check of CB looks ok"},
{kCheckCBBad, "CIrLSAP: check of CB failed!"},
{kLSAPEventProcess, "CIrLSAP: Next State, event, state" },
{kCancelPuts, "CIrLSAP: cancel pending puts"},
{kCancelGets, "CIrLSAP: cancel pending gets"},
{kCancelPutsComplete, "CIrLSAP: cancel puts done"},
{kCancelGetsComplete, "CIrLSAP: cancel gets done"},
{kEnqueueEvent, "CIrLSAP: Event Queued"}, {kDequeueEventStart, "CIrLSAP: Event Start"},
{kDequeueEventEnd, "CIrLSAP: Event End"}
};
#define XTRACE(x, y, z) IrDALogAdd( x, y, (uintptr_t)z & 0xffff, gTraceEvents, true )
#else
#define XTRACE(x, y, z) ((void)0)
#endif
#define super TIrStream
OSDefineMetaClassAndAbstractStructors(CIrLSAP, TIrStream);
void
CIrLSAP::free()
{
TIASService *nameService;
XTRACE(kLogFree, 0, this);
if (fIrDA) {
nameService = fIrDA->GetNameService(); if (nameService) { nameService->RemoveAttribute(fClassName, fAttrName, kIASDeleteAttribute);
}
}
if (fDscInfo)
fDscInfo->RemoveServiceHints(fHints);
if (fLSAP) { fLSAP->release();
fLSAP = nil;
}
else { if (fIrDA) fIrDA->ReleaseLSAPId(fMyLSAPId); }
if (fNameClient) { fNameClient->release();
fNameClient = nil;
}
super::free();
}
Boolean CIrLSAP::Init(TIrGlue *irda, UInt32 desiredLSAPId, UInt8 * className, UInt8 * attributeName, ULong hints)
{
IrDAErr err;
XTRACE(kLogInit, 0, this);
XTRACE(kLogInit, 0, desiredLSAPId);
fState = kIrLSAPDisconnected;
fPeerAddr = 0;
fMyLSAPId = kAssignDynamicLSAPId;
fPeerLSAPId = 0;
fClassName[0] = 0; fAttrName[0] = 0; fConnectClassName[0] = 0;
fAttributeName[0] = 0; fHints = 0;
fConnected = false;
fDiscoverCount = 0;
fDscInfo = nil;
fNameClient = nil;
fLSAP = nil;
fDiscovery = nil;
fPendingDisconnect = false;
fDisconnectRequest = nil;
#if (hasTracing > 0 && hasIrLSAPTracing > 0)
if (!super::Init(irda, gTraceEvents, kEnqueueEvent)) return false;
#else
if (!super::Init(irda)) return false;
#endif
fDiscovery = fIrDA->GetDiscovery(); require(fDiscovery, Fail);
fDscInfo = fDiscovery->GetDiscoveryInfo(); require(fDscInfo, Fail);
fHints = hints; fDscInfo->SetServiceHints(fHints);
fMyLSAPId = desiredLSAPId;
if (className)
strlcpy((char *)&fClassName[0], (char *)className, sizeof(fClassName));
if (attributeName)
strlcpy((char * )&fAttrName[0], (char *)attributeName, sizeof(fAttrName));
err = fIrDA->RegisterMyNameAndLSAPId(fClassName, fAttrName, &fMyLSAPId);
nrequire(err, Fail);
XTRACE(kLogInit, 1, fMyLSAPId);
return true;
Fail:
return false;
}
#pragma mark Client Accessors
void CIrLSAP::SetPeerLAPAddr( UInt32 addr )
{
if( ! fConnected ) fPeerAddr = addr; }
#pragma mark Client Methods
IrDAErr CIrLSAP::Discover( UInt32 slots )
{
TIrDiscoverRequest * request;
XTRACE(kDiscoverStartEvent, 0, this);
if (GetState() != kIrLSAPDisconnected) { XTRACE(kDiscoverStartEvent, 0xffff, GetState());
return kIrDAErrWrongState; }
request = (TIrDiscoverRequest *)fIrDA->GrabEventBlock(kIrDiscoverRequestEvent, sizeof(TIrDiscoverRequest));
require( request, Fail_NewDiscoverRequest );
request->fNumSlots = slots;
request->fClient = this;
SetState( kIrLSAPDiscoverStart);
fDiscovery->EnqueueEvent( request );
return noErr;
Fail_NewDiscoverRequest:
return kIrDAErrNoMemory;
}
IrDAErr CIrLSAP::LSAPLookup(UInt8 * className, UInt8 * attributeName, UInt32 remoteAddr)
{
TIrConnLstnRequest * connectRequest;
XTRACE( kLookupStartEvent, remoteAddr >> 16, remoteAddr );
if (GetState() != kIrLSAPDisconnected) { XTRACE(kLookupStartEvent, 0xffff, GetState());
return kIrDAErrWrongState; }
fPeerAddr = remoteAddr;
strlcpy( ( char * )&fConnectClassName, ( const char * )className, sizeof(fConnectClassName));
strlcpy( ( char * )&fAttributeName, ( const char * )attributeName, sizeof(fAttributeName));
if (fNameClient == nil) { fNameClient = TIASClient::tIASClient(fIrDA, this); require( fNameClient, Fail_NewNameClient );
}
connectRequest = (TIrConnLstnRequest*)fIrDA->GrabEventBlock(kIrConnectRequestEvent, sizeof(TIrConnLstnRequest));
require( connectRequest, Fail_NewConnectRequest );
connectRequest->fDevAddr = remoteAddr;
connectRequest->fMyQOS = fIrDA->GetMyQOS();
connectRequest->fPeerQOS = fIrDA->GetPeerQOS();
connectRequest->fData = nil;
connectRequest->fClient = this;
SetState( kIrLSAPLookupStart ); fNameClient->EnqueueEvent(connectRequest);
return noErr;
Fail_NewConnectRequest:
Fail_NewNameClient:
return kIrDAErrNoMemory;
}
IrDAErr CIrLSAP::Connect( UInt32 remoteAddr, UInt32 lsapID, CBufferSegment *connectData )
{
fPeerAddr = remoteAddr;
return this->Connect(lsapID, connectData);
}
IrDAErr CIrLSAP::Connect( UInt32 lsapID, CBufferSegment *connectData )
{
fPeerLSAPId = lsapID; return this->Connect(connectData);
}
IrDAErr CIrLSAP::Connect( CBufferSegment *connectData )
{
IrDAErr err;
XTRACE( kConnectStartEvent, fPeerLSAPId, fPeerAddr );
XTRACE( kConnectStartEvent, 0, this );
if (GetState() != kIrLSAPDisconnected) { XTRACE(kConnectStartEvent, 0xffff, GetState());
return kIrDAErrWrongState; }
SetState(kIrLSAPConnectStart);
err = fIrDA->ConnectStart( this, fMyLSAPId, fPeerAddr, fPeerLSAPId,
connectData, &fLSAP );
if (err != noErr) { SetState(kIrLSAPDisconnected); }
return err;
}
IrDAErr CIrLSAP::DataPut( CBufferSegment * putBuffer )
{
TIrPutRequest *putRequest;
XTRACE( kPutStartEvent, fMyLSAPId, fPeerLSAPId );
XTRACE( kPutStartEvent, 0, this );
XTRACE( kPutStartEvent, 0, putBuffer);
if (GetState() != kIrLSAPConnected) {
XTRACE(kPutStartEvent, 0xffff, GetState());
return kIrDAErrWrongState; }
check(fConnected == true); check(putBuffer);
check(fLSAP);
fLastPutBuffer = putBuffer; putRequest = ( TIrPutRequest * )fIrDA->GrabEventBlock(kIrPutDataRequestEvent, sizeof(TIrPutRequest));
require( putRequest, AllocatePutRequestBlock );
putRequest->fData = putBuffer;
putRequest->fOffset = 0;
putRequest->fLength = putBuffer->GetSize();
putRequest->fClient = this;
fLSAP->EnqueueEvent( putRequest );
return noErr;
AllocatePutRequestBlock:
return kIrDAErrNoMemory;
}
IrDAErr CIrLSAP::DataGet( CBufferSegment * getBuffer )
{
TIrGetRequest *getRequest;
XTRACE( kGetStartEvent, fMyLSAPId, fPeerLSAPId );
XTRACE( kGetStartEvent, 0, this );
if (GetState() != kIrLSAPConnected) {
XTRACE(kGetStartEvent, 0xffff, GetState());
return kIrDAErrWrongState; }
check(getBuffer);
getRequest = ( TIrGetRequest * )fIrDA->GrabEventBlock(kIrGetDataRequestEvent, sizeof(TIrGetRequest));
require( getRequest, AllocatePutRequestBlock );
getRequest->fData = getBuffer;
getRequest->fOffset = 0;
getRequest->fLength = getBuffer->GetSize();
getRequest->fClient = this;
fLSAP->EnqueueEvent( getRequest );
return noErr;
AllocatePutRequestBlock:
return kIrDAErrNoMemory;
}
IrDAErr CIrLSAP::Listen(CBufferSegment *connectData)
{
IrDAErr err;
XTRACE( kListenStartEvent, 0, fMyLSAPId);
XTRACE( kListenStartEvent, 0, this);
XTRACE( kListenStartEvent, 0, connectData);
if (GetState() != kIrLSAPDisconnected) { XTRACE(kListenStartEvent, 0xffff, GetState());
return kIrDAErrWrongState; }
fLastListenBuffer = connectData; SetState( kIrLSAPListenStart );
err = fIrDA->ListenStart( this, fMyLSAPId, connectData, &fLSAP );
if (err != noErr) { SetState(kIrLSAPDisconnected); }
return err;
}
IrDAErr CIrLSAP::Accept(CBufferSegment *connectData)
{
TIrConnLstnRequest *acceptRequest;
XTRACE( kAcceptStartEvent, fMyLSAPId, fPeerLSAPId);
XTRACE( kAcceptStartEvent, fPeerAddr>>16, fPeerAddr );
XTRACE( kAcceptStartEvent, (uintptr_t)this>>16, this);
if (GetState() != kIrLSAPListenComplete) { XTRACE(kAcceptStartEvent, 0xffff, GetState());
return kIrDAErrWrongState; }
acceptRequest = ( TIrConnLstnRequest*) fIrDA->GrabEventBlock( kIrAcceptRequestEvent,
sizeof( TIrConnLstnRequest ) );
require( acceptRequest, Fail_NewAcceptRequest );
SetState( kIrLSAPAcceptStart );
acceptRequest->fData = connectData;
fLSAP->EnqueueEvent( acceptRequest );
return noErr;
Fail_NewAcceptRequest:
return kIrDAErrNoMemory;
}
void CIrLSAP::Disconnect()
{
XTRACE( kDisconnectStartEvent, fMyLSAPId, fPeerLSAPId );
XTRACE( kDisconnectStartEvent, 0, this );
if (GetState() == kIrLSAPDisconnected) { check(fConnected == false); XTRACE(kDisconnectStartEvent, 0xffff, GetState());
DisconnectComplete(); return; }
if (GetState() == kIrLSAPDiscoverStart || GetState() == kIrLSAPLookupStart) {
fPendingDisconnect = true;
return;
}
if (GetState() == kIrLSAPDisconnectStart)
return;
check(fDisconnectRequest == nil); fDisconnectRequest = (TIrDisconnectRequest*) fIrDA->GrabEventBlock(kIrDisconnectRequestEvent,
sizeof(TIrDisconnectRequest));
if (fDisconnectRequest == nil) return;
SetState( kIrLSAPDisconnectStart );
fLSAP->EnqueueEvent(fDisconnectRequest);
return;
}
IrDAErr CIrLSAP::CancelPuts( void )
{
TIrCancelPutEvent *cancelRequest;
XTRACE( kCancelPuts, 0, this);
if (GetState() != kIrLSAPConnected) { XTRACE(kCancelPuts, 0xffff, GetState());
return kIrDAErrWrongState; }
cancelRequest = (TIrCancelPutEvent *)fIrDA->GrabEventBlock(kIrCancelPutRequestEvent,
sizeof(TIrCancelPutEvent));
require(cancelRequest, AllocatePutRequestBlock);
cancelRequest->fClient = this;
fLSAP->EnqueueEvent(cancelRequest);
return noErr;
AllocatePutRequestBlock:
return kIrDAErrNoMemory;
}
IrDAErr CIrLSAP::CancelGets( void )
{
TIrCancelGetEvent *cancelRequest;
XTRACE( kCancelGets, 0, this);
if (GetState() != kIrLSAPConnected) { XTRACE(kCancelGets, 0xffff, GetState());
return kIrDAErrWrongState; }
cancelRequest = (TIrCancelGetEvent *)fIrDA->GrabEventBlock(kIrCancelGetRequestEvent,
sizeof(TIrCancelGetEvent));
require(cancelRequest, AllocateRequestBlock);
cancelRequest->fClient = this;
fLSAP->EnqueueEvent(cancelRequest);
return noErr;
AllocateRequestBlock:
return kIrDAErrNoMemory;
}
#pragma mark
void CIrLSAP::NextState( UInt32 event )
{
XTRACE( kLSAPEventProcess, ( UInt16 )event, GetState() );
XTRACE( kLSAPEventProcess, 0, this);
if (event == kIrConnectReplyEvent && GetState() == kIrLSAPLookupStart) {
HandleNameServerConnectComplete();
return;
}
switch (event) {
case kIrDisconnectReplyEvent:
HandleDisconnectComplete();
break;
case kIrDiscoverReplyEvent:
HandleDiscoverComplete();
break;
case kIrLookupReplyEvent:
HandleNameServerLookupComplete();
break;
case kIrReleaseReplyEvent:
HandleNameServerReleaseComplete();
break;
case kIrConnectReplyEvent:
HandleConnectComplete();
break;
case kIrListenReplyEvent:
HandleListenComplete();
break;
case kIrAcceptReplyEvent:
HandleAcceptComplete();
break;
case kIrGetDataReplyEvent:
HandleDataGetComplete();
break;
case kIrPutDataReplyEvent:
HandleDataPutComplete();
break;
case kIrCancelGetReplyEvent:
HandleCancelGetComplete();
break;
case kIrCancelPutReplyEvent:
HandleCancelPutComplete();
break;
default:
DebugLog("CIrLSAP::NextState: unexpected event");
break;
}
}
void CIrLSAP::HandleDiscoverComplete()
{
TIrDiscoverReply * reply = ( TIrDiscoverReply * )GetCurrentEvent();
UInt32 numFound; TIrDscInfo * dscInfo;
CList * fDiscoverList;
if (reply->fResult == noErr) { check (GetState() == kIrLSAPDiscoverStart);
if (GetState() != kIrLSAPDiscoverStart) {
XTRACE(kLogDiscoverCompleteErr, reply->fResult, GetState());
}
} else { check (GetState() == kIrLSAPDiscoverStart ||
GetState() == kIrLSAPDisconnected);
if (GetState() != kIrLSAPDiscoverStart && GetState() != kIrLSAPDisconnected)
XTRACE(kLogDiscoverCompleteErr, reply->fResult, GetState());
}
fDiscoverList = reply->fDiscoveredDevices;
numFound = fDiscoverList->GetArraySize();
XTRACE( kDiscoverCompleteEvent, numFound, reply->fResult );
if( numFound > 0 ) {
SInt32 index;
for( index = 0; index < fDiscoverList->GetArraySize(); index++ ) {
dscInfo = ( TIrDscInfo * )fDiscoverList->At( index );
fDiscoverInfo[index].serviceHints = dscInfo->GetServiceHints();
fDiscoverInfo[index].addr = dscInfo->GetDeviceAddr();
dscInfo->GetNickname( fDiscoverInfo[index].name, sizeof(fDiscoverInfo[index].name) );
}
}
SetState( kIrLSAPDisconnected ); DiscoverComplete( numFound, reply->fResult ); fIrDA->ReleaseEventBlock( reply );
if (fPendingDisconnect) {
XTRACE( kDiscoverCompleteEvent, 0xffff, 0xffff);
fPendingDisconnect = false;
DisconnectComplete(); }
}
void CIrLSAP::HandleDisconnectComplete()
{
TIrDisconnectReply * reply = ( TIrDisconnectReply * )GetCurrentEvent();
XTRACE( kDisconnectCompleteEvent, reply->fResult, GetState() );
fConnected = false;
SetState( kIrLSAPDisconnected );
DisconnectComplete();
if (fDisconnectRequest == reply) {
fIrDA->ReleaseEventBlock( reply );
fDisconnectRequest = nil;
}
}
#pragma mark ----- LSAP Lookup Engine ---
void CIrLSAP::HandleLSAPLookupComplete()
{
TIrLookupEvent *reply = (TIrLookupEvent*)GetCurrentEvent();
IrDAErr result = reply->fResult;
XTRACE(kLookupCompleteEvent, result, fPeerLSAPId );
if (result == noErr) { check(GetState() == kIrLSAPLookupStart);
} else { check(GetState() == kIrLSAPLookupStart
|| GetState() == kIrLSAPDisconnected);
}
if (result == noErr) {
fPeerLSAPId = reply->fPeerLSAPId; }
else {
fPeerLSAPId = 0;
}
SetState(kIrLSAPDisconnected);
LSAPLookupComplete(result, fPeerLSAPId); fIrDA->ReleaseEventBlock( reply );
if (fPendingDisconnect) {
XTRACE(kLookupCompleteEvent, 0xffff, 0xffff);
fPendingDisconnect = false;
DisconnectComplete(); }
}
void CIrLSAP::HandleNameServerConnectComplete()
{
TIrConnLstnReply * connectReply = ( TIrConnLstnReply * )GetCurrentEvent();
TIrLookupRequest * lookupRequest = ( TIrLookupRequest * )GetCurrentEvent();
XTRACE( kNSClientConnectedEvent, 0, connectReply->fResult );
check(GetState() == kIrLSAPLookupStart);
if (connectReply->fResult != noErr) {
this->HandleLSAPLookupComplete(); }
else {
lookupRequest->fEvent = kIrLookupRequestEvent;
lookupRequest->fClassName = fConnectClassName; lookupRequest->fAttrName = fAttributeName; fNameClient->EnqueueEvent(lookupRequest);
}
}
void CIrLSAP::HandleNameServerLookupComplete()
{
TIrLookupReply * lookupReply = ( TIrLookupReply * )GetCurrentEvent();
check(GetState() == kIrLSAPLookupStart);
fPeerLSAPId = 0;
if (lookupReply->fResult == noErr) {
if( lookupReply->fAttribute ) {
TIASElement * element = ( TIASElement * )lookupReply->fAttribute->First();
if( element ) {
if( element->GetInteger( &fPeerLSAPId ) != noErr ) {
fPeerLSAPId = 0;
}
}
lookupReply->fAttribute->release();
}
}
XTRACE( kNSClientLookupReplyEvent, fPeerLSAPId, lookupReply->fResult );
TIrDisconnectRequest * releaseRequest;
releaseRequest = (TIrDisconnectRequest*)lookupReply;
releaseRequest->fEvent = kIrReleaseRequestEvent;
releaseRequest->fResult = noErr;
fNameClient->EnqueueEvent(releaseRequest);
}
void CIrLSAP::HandleNameServerReleaseComplete()
{
TIrLookupReply * lookupReply = ( TIrLookupReply * )GetCurrentEvent();
XTRACE( kNSClientLookupDisconnectEvent, 0, fPeerLSAPId );
check(GetState() == kIrLSAPLookupStart);
lookupReply->fEvent = kIrLookupReplyEvent; lookupReply->fPeerLSAPId = fPeerLSAPId;
this->HandleLSAPLookupComplete();
}
#pragma mark ----- Data Handlers ---
void CIrLSAP::HandleConnectComplete()
{
TIrConnLstnReply *reply = (TIrConnLstnReply *)GetCurrentEvent();
IrDAErr result = reply->fResult;
XTRACE( kConnectCompleteEvent, result, 0 );
check( fLSAP == reply->fLSAPConn );
check(GetState() == kIrLSAPConnectStart ||
GetState() == kIrLSAPDisconnectStart ||
GetState() == kIrLSAPDisconnected);
if( result == noErr ) {
SetState( kIrLSAPConnected );
fConnected = true;
}
else{
SetState( kIrLSAPDisconnected );
fConnected = false;
}
reply->fPeerQOS = fIrDA->GetPeerQOS();
reply->fMyQOS = fIrDA->GetMyQOS();
ConnectComplete(result, reply->fMyQOS, reply->fPeerQOS, (CBufferSegment *)reply->fData);
fIrDA->ReleaseEventBlock( reply );
}
void CIrLSAP::HandleDataPutComplete()
{
TIrPutReply * reply = ( TIrPutReply * )GetCurrentEvent();
IrDAErr result = reply->fResult;
XTRACE( kPutCompleteEvent, result, 0 );
DataPutComplete(result, (CBufferSegment *)reply->fData); fIrDA->ReleaseEventBlock( reply );
}
void CIrLSAP::HandleListenComplete()
{
TIrConnLstnReply *reply = (TIrConnLstnReply*)GetCurrentEvent();
IrDAErr result = reply->fResult;
if (result == noErr) { check(GetState() == kIrLSAPListenStart);
} else {
#if defined(forDebug)
int state = GetState();
if (state != kIrLSAPListenStart &&
state != kIrLSAPDisconnectStart && state != kIrLSAPDisconnected)
DebugPrintf("CIrLSAP: listen complete %d, state %d", result, state);
#endif // forDebug
}
if (result == noErr) { fPeerLSAPId = reply->fLSAPId;
fPeerAddr = reply->fDevAddr;
}
XTRACE( kListenCompleteEvent, fPeerLSAPId, fPeerAddr );
XTRACE( kListenCompleteEvent, 0, this);
reply->fPeerQOS = fIrDA->GetPeerQOS();
reply->fMyQOS = fIrDA->GetMyQOS();
if (result == noErr)
SetState( kIrLSAPListenComplete );
else
SetState(kIrLSAPDisconnected);
check(fLastListenBuffer == reply->fData);
if (fLastListenBuffer != reply->fData) {
XTRACE(kLogListenCompleteErr, 0, fLastListenBuffer);
XTRACE(kLogListenCompleteErr, 0, reply->fData);
}
ListenComplete( result, fPeerAddr, fPeerLSAPId, reply->fMyQOS, reply->fPeerQOS, (CBufferSegment *)reply->fData);
fIrDA->ReleaseEventBlock( reply );
}
void CIrLSAP::HandleAcceptComplete()
{
TIrConnLstnReply * reply = (TIrConnLstnReply*)GetCurrentEvent();
IrDAErr result = reply->fResult;
XTRACE( kAcceptCompleteEvent, result, 0 );
check(GetState() == kIrLSAPAcceptStart);
if( result == noErr ) {
SetState( kIrLSAPConnected );
fConnected = true;
}
else {
SetState( kIrLSAPDisconnected );
fConnected = false;
}
AcceptComplete(result, (CBufferSegment *)reply->fData);
fIrDA->ReleaseEventBlock( reply );
}
void CIrLSAP::HandleDataGetComplete()
{
TIrGetReply * reply = ( TIrGetReply * )GetCurrentEvent();
IrDAErr result = reply->fResult;
XTRACE( kGetCompleteEvent, result, 0 );
DataGetComplete(result, (CBufferSegment *)reply->fData);
fIrDA->ReleaseEventBlock( reply );
}
void CIrLSAP::HandleCancelPutComplete()
{
TIrCancelPutReply * reply = ( TIrCancelPutReply * )GetCurrentEvent();
IrDAErr result = reply->fResult;
XTRACE( kCancelPutsComplete, 0, 0 );
CancelPutsComplete(result); fIrDA->ReleaseEventBlock( reply );
}
void CIrLSAP::HandleCancelGetComplete()
{
TIrCancelGetReply * reply = ( TIrCancelGetReply * )GetCurrentEvent();
IrDAErr result = reply->fResult;
XTRACE( kCancelGetsComplete, 0, 0 );
CancelGetsComplete(result); fIrDA->ReleaseEventBlock( reply );
}