#ifndef __IRLAPCONN_H
#define __IRLAPCONN_H
#include "IrDATypes.h"
#include "IrStream.h"
#include "IrEvent.h"
class TIrGlue;
class TIrLAP;
class TLSAPConn;
class TLMPDUHeader;
class CBufferSegment;
enum IrLAPConnStates
{
kIrLAPConnStandby,
kIrLAPConnConnectOrListen,
kIrLAPConnActive
};
class TIrLAPConn : public TIrStream
{
OSDeclareDefaultStructors(TIrLAPConn);
public:
static TIrLAPConn *tIrLAPConn(TIrGlue* irda);
void free(void);
Boolean Init(TIrGlue* irda);
void Reset();
void DoIdleDisconnect();
void Demultiplexor(CBufferSegment* inputBuffer);
ULong FillInLMPDUHeader(TIrPutRequest* putRequest, UByte* buffer);
void TimerComplete(ULong refCon);
private:
void NextState(ULong event);
void HandleStandbyStateEvent(ULong event);
void HandleConnectOrListenStateEvent(ULong event);
void HandleActiveStateEvent(ULong event);
void HandleGetDataRequest();
void CleanupPendingGetRequestsAndReplies(TLSAPConn* lsapConn, IrDAErr returnCode);
void CancelPendingGetRequests(TLSAPConn* lsapConn, IrDAErr returnCode);
void ReplyToInvalidFrame(TLMPDUHeader& header, UByte replyOpCode, UByte replyInfo);
Boolean ExtractHeader(CBufferSegment* inputBuffer, TLMPDUHeader& header, ULong& length);
Boolean DataDelivered(TIrGetRequest* getRequest, TLMPDUHeader& header, ULong headerLength, CBufferSegment* dataBuffer);
void StartIdleDisconnectTimer(void);
void StopIdleDisconnectTimer(void);
UByte fState;
Boolean fConnected;
ULong fPeerDevAddr;
CList* fLSAPConnList;
CList* fPendingGetRequests;
CList* fUnmatchedGetReplys;
CList* fPendingRequests; Boolean fDisconnectPending; };
#endif // __IRLAPCONN_H