| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- /*
- * Copyright (c) 2014, Oculus VR, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- */
- /// \file
- /// \brief \b RakNet's plugin functionality system, version 2. You can derive from this to create your own plugins.
- ///
- #ifndef __PLUGIN_INTERFACE_2_H
- #define __PLUGIN_INTERFACE_2_H
- #include "NativeFeatureIncludes.h"
- #include "RakNetTypes.h"
- #include "Export.h"
- #include "PacketPriority.h"
- namespace RakNet {
- /// Forward declarations
- class RakPeerInterface;
- class TCPInterface;
- struct Packet;
- struct InternalPacket;
- /// \defgroup PLUGIN_INTERFACE_GROUP PluginInterface2
- /// \defgroup PLUGINS_GROUP Plugins
- /// \ingroup PLUGIN_INTERFACE_GROUP
- /// For each message that arrives on an instance of RakPeer, the plugins get an opportunity to process them first. This enumeration represents what to do with the message
- /// \ingroup PLUGIN_INTERFACE_GROUP
- enum PluginReceiveResult
- {
- /// The plugin used this message and it shouldn't be given to the user.
- RR_STOP_PROCESSING_AND_DEALLOCATE=0,
- /// This message will be processed by other plugins, and at last by the user.
- RR_CONTINUE_PROCESSING,
- /// The plugin is going to hold on to this message. Do not deallocate it but do not pass it to other plugins either.
- RR_STOP_PROCESSING
- };
- /// Reasons why a connection was lost
- /// \ingroup PLUGIN_INTERFACE_GROUP
- enum PI2_LostConnectionReason
- {
- /// Called RakPeer::CloseConnection()
- LCR_CLOSED_BY_USER,
- /// Got ID_DISCONNECTION_NOTIFICATION
- LCR_DISCONNECTION_NOTIFICATION,
- /// GOT ID_CONNECTION_LOST
- LCR_CONNECTION_LOST
- };
- /// Returns why a connection attempt failed
- /// \ingroup PLUGIN_INTERFACE_GROUP
- enum PI2_FailedConnectionAttemptReason
- {
- FCAR_CONNECTION_ATTEMPT_FAILED,
- FCAR_ALREADY_CONNECTED,
- FCAR_NO_FREE_INCOMING_CONNECTIONS,
- FCAR_SECURITY_PUBLIC_KEY_MISMATCH,
- FCAR_CONNECTION_BANNED,
- FCAR_INVALID_PASSWORD,
- FCAR_INCOMPATIBLE_PROTOCOL,
- FCAR_IP_RECENTLY_CONNECTED,
- FCAR_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY,
- FCAR_OUR_SYSTEM_REQUIRES_SECURITY,
- FCAR_PUBLIC_KEY_MISMATCH
- };
- /// RakNet's plugin system. Each plugin processes the following events:
- /// -Connection attempts
- /// -The result of connection attempts
- /// -Each incoming message
- /// -Updates over time, when RakPeer::Receive() is called
- ///
- /// \ingroup PLUGIN_INTERFACE_GROUP
- class RAK_DLL_EXPORT PluginInterface2
- {
- public:
- PluginInterface2();
- virtual ~PluginInterface2();
- /// Called when the interface is attached
- virtual void OnAttach(void) {}
- /// Called when the interface is detached
- virtual void OnDetach(void) {}
- /// Update is called every time a packet is checked for .
- virtual void Update(void) {}
- /// OnReceive is called for every packet.
- /// \param[in] packet the packet that is being returned to the user
- /// \return True to allow the game and other plugins to get this message, false to absorb it
- virtual PluginReceiveResult OnReceive(Packet *packet) {(void) packet; return RR_CONTINUE_PROCESSING;}
- /// Called when RakPeer is initialized
- virtual void OnRakPeerStartup(void) {}
- /// Called when RakPeer is shutdown
- virtual void OnRakPeerShutdown(void) {}
- /// Called when a connection is dropped because the user called RakPeer::CloseConnection() for a particular system
- /// \param[in] systemAddress The system whose connection was closed
- /// \param[in] rakNetGuid The guid of the specified system
- /// \param[in] lostConnectionReason How the connection was closed: manually, connection lost, or notification of disconnection
- virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ){(void) systemAddress; (void) rakNetGUID; (void) lostConnectionReason;}
- /// Called when we got a new connection
- /// \param[in] systemAddress Address of the new connection
- /// \param[in] rakNetGuid The guid of the specified system
- /// \param[in] isIncoming If true, this is ID_NEW_INCOMING_CONNECTION, or the equivalent
- virtual void OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming) {(void) systemAddress; (void) rakNetGUID; (void) isIncoming;}
- /// Called when a connection attempt fails
- /// \param[in] packet Packet to be returned to the user
- /// \param[in] failedConnectionReason Why the connection failed
- virtual void OnFailedConnectionAttempt(Packet *packet, PI2_FailedConnectionAttemptReason failedConnectionAttemptReason) {(void) packet; (void) failedConnectionAttemptReason;}
- /// Queried when attached to RakPeer
- /// Return true to call OnDirectSocketSend(), OnDirectSocketReceive(), OnReliabilityLayerNotification(), OnInternalPacket(), and OnAck()
- /// If true, then you cannot call RakPeer::AttachPlugin() or RakPeer::DetachPlugin() for this plugin, while RakPeer is active
- virtual bool UsesReliabilityLayer(void) const {return false;}
- /// Called on a send to the socket, per datagram, that does not go through the reliability layer
- /// \pre To be called, UsesReliabilityLayer() must return true
- /// \param[in] data The data being sent
- /// \param[in] bitsUsed How many bits long \a data is
- /// \param[in] remoteSystemAddress Which system this message is being sent to
- virtual void OnDirectSocketSend(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress) {(void) data; (void) bitsUsed; (void) remoteSystemAddress;}
-
- /// Called on a receive from the socket, per datagram, that does not go through the reliability layer
- /// \pre To be called, UsesReliabilityLayer() must return true
- /// \param[in] data The data being sent
- /// \param[in] bitsUsed How many bits long \a data is
- /// \param[in] remoteSystemAddress Which system this message is being sent to
- virtual void OnDirectSocketReceive(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress) {(void) data; (void) bitsUsed; (void) remoteSystemAddress;}
- /// Called when the reliability layer rejects a send or receive
- /// \pre To be called, UsesReliabilityLayer() must return true
- /// \param[in] bitsUsed How many bits long \a data is
- /// \param[in] remoteSystemAddress Which system this message is being sent to
- virtual void OnReliabilityLayerNotification(const char *errorMessage, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress, bool isError) {(void) errorMessage; (void) bitsUsed; (void) remoteSystemAddress; (void) isError;}
-
- /// Called on a send or receive of a message within the reliability layer
- /// \pre To be called, UsesReliabilityLayer() must return true
- /// \param[in] internalPacket The user message, along with all send data.
- /// \param[in] frameNumber The number of frames sent or received so far for this player depending on \a isSend . Indicates the frame of this user message.
- /// \param[in] remoteSystemAddress The player we sent or got this packet from
- /// \param[in] time The current time as returned by RakNet::GetTimeMS()
- /// \param[in] isSend Is this callback representing a send event or receive event?
- virtual void OnInternalPacket(InternalPacket *internalPacket, unsigned frameNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time, int isSend) {(void) internalPacket; (void) frameNumber; (void) remoteSystemAddress; (void) time; (void) isSend;}
- /// Called when we get an ack for a message we reliably sent
- /// \pre To be called, UsesReliabilityLayer() must return true
- /// \param[in] messageNumber The numerical identifier for which message this is
- /// \param[in] remoteSystemAddress The player we sent or got this packet from
- /// \param[in] time The current time as returned by RakNet::GetTimeMS()
- virtual void OnAck(unsigned int messageNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time) {(void) messageNumber; (void) remoteSystemAddress; (void) time;}
- /// System called RakPeerInterface::PushBackPacket
- /// \param[in] data The data being sent
- /// \param[in] bitsUsed How many bits long \a data is
- /// \param[in] remoteSystemAddress The player we sent or got this packet from
- virtual void OnPushBackPacket(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress) {(void) data; (void) bitsUsed; (void) remoteSystemAddress;}
- RakPeerInterface *GetRakPeerInterface(void) const {return rakPeerInterface;}
- RakNetGUID GetMyGUIDUnified(void) const;
- /// \internal
- void SetRakPeerInterface( RakPeerInterface *ptr );
- #if _RAKNET_SUPPORT_TCPInterface==1
- /// \internal
- void SetTCPInterface( TCPInterface *ptr );
- #endif
- protected:
- // Send through either rakPeerInterface or tcpInterface, whichever is available
- void SendUnified( const RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast );
- void SendUnified( const char * data, const int length, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast );
- bool SendListUnified( const char **data, const int *lengths, const int numParameters, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast );
- Packet *AllocatePacketUnified(unsigned dataSize);
- void PushBackPacketUnified(Packet *packet, bool pushAtHead);
- void DeallocPacketUnified(Packet *packet);
- // Filled automatically in when attached
- RakPeerInterface *rakPeerInterface;
- #if _RAKNET_SUPPORT_TCPInterface==1
- TCPInterface *tcpInterface;
- #endif
- };
- } // namespace RakNet
- #endif
|