//===== Copyright © 1996-2009, Valve Corporation, All rights reserved. ======// // // Purpose: // //===========================================================================// #ifndef X360_NETMGR_H #define X360_NETMGR_H #ifdef _X360 #ifdef _WIN32 #pragma once #endif abstract_class IX360NetworkEvents { public: // // A packet has arrived and we have created a secure association for the IN_ADDR, // converted to XNADDR and paired it with our registered XNKID/XNKEY. // // Handler must either: // // - open peer connection in passive mode // we have already completed a secure key exchange (we are in CONNECTED // state), just use ConnectionPeerOpenPassive // and return true from OnX360NetConnectionlessPacket // // or: // - return false, in which case the secure association will be // unregistered and the remote side end of the secure connection // will get into unrecoverable LOST state // virtual bool OnX360NetConnectionlessPacket( netpacket_t *pkt, KeyValues *msg ) = 0; // // A packet has been received from a remote peer and successfully unpacked, // connection is still alive. // virtual void OnX360NetPacket( KeyValues *msg ) = 0; // // Connection with remote peer has been disconnected, connection object // and all connection records have already been removed, secure association // unregistered. // virtual void OnX360NetDisconnected( XUID xuidRemote ) = 0; }; class CX360NetworkMgr : public IConnectionlessPacketHandler { public: explicit CX360NetworkMgr( IX360NetworkEvents *pListener, INetSupport::NetworkSocket_t eSocket ); public: void SetListener( IX360NetworkEvents *pListener ); public: enum UpdateResult_t { UPDATE_SUCCESS, UPDATE_LISTENER_CHANGED, UPDATE_DESTROYED }; UpdateResult_t Update(); void Destroy(); void DebugPrint(); bool IsUpdating() const; public: bool ConnectionPeerOpenPassive( XUID xuidRemote, netpacket_t *pktIncoming, XNKID *pxnkidSession = NULL ); bool ConnectionPeerOpenActive( XUID xuidRemote, XSESSION_INFO const &xRemote ); void ConnectionPeerUpdateXuid( XUID xuidRemoteOld, XUID xuidRemoteNew ); void ConnectionPeerClose( XUID xuidRemote ); void ConnectionPeerClose( netpacket_t *pktIncoming ); void ConnectionPeerSendConnectionless( XUID xuidRemote, KeyValues *pMsg ); void ConnectionPeerSendMessage( KeyValues *pMsg ); char const * ConnectionPeerGetAddress( XUID xuidRemote ); // // IConnectionlessPacketHandler // protected: virtual bool ProcessConnectionlessPacket( netpacket_t *packet ); // // INetChannelHandler-delegates // public: void OnConnectionClosing( INetChannel *pNetChannel ); void OnConnectionMessage( KeyValues *pMsg ); protected: IX360NetworkEvents *m_pListener; INetSupport::NetworkSocket_t m_eSocket; protected: struct ConnectionMessageHandler_t : public INetChannelHandler { explicit ConnectionMessageHandler_t( CX360NetworkMgr *pMgr, INetChannel *pChannel ) : m_pMgr( pMgr ), m_pChannel( pChannel ) {} public: virtual void ConnectionStart(INetChannel *chan); virtual void ConnectionClosing(const char *reason) { m_pMgr->OnConnectionClosing( m_pChannel ); } virtual void ConnectionCrashed(const char *reason) { ConnectionClosing( reason ); } virtual void PacketStart(int incoming_sequence, int outgoing_acknowledged) {} virtual void PacketEnd( void ) {} virtual void FileRequested(const char *fileName, unsigned int transferID, bool isReplayDemoFile) {} // other side request a file for download virtual void FileReceived(const char *fileName, unsigned int transferID, bool isReplayDemoFile) {} // we received a file virtual void FileDenied(const char *fileName, unsigned int transferID, bool isReplayDemoFile) {} // a file request was denied by other side virtual void FileSent(const char *fileName, unsigned int transferID, bool isReplayDemoFile) {} // we sent a file virtual bool ChangeSplitscreenUser( int nSplitScreenUserSlot ) { return true; } public: CX360NetworkMgr *m_pMgr; INetChannel *m_pChannel; }; struct ConnectionInfo_t { XUID m_xuid; IN_ADDR m_inaddr; XNADDR m_xnaddr; INetChannel *m_pNetChannel; ConnectionMessageHandler_t *m_pHandler; }; CUtlMap< XUID, ConnectionInfo_t > m_arrConnections; enum State_t { STATE_IDLE, // network mgr is idle STATE_UPDATING, // network mgr is in the middle of an update frame function STATE_DESTROY_DEFERRED, // network mgr has been destroyed while in the middle of an update } m_eState; UpdateResult_t m_eUpdateResult; }; #endif #endif