diff --git a/.gitignore b/.gitignore index 09c9e31..7144853 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,8 @@ **.vcxproj **.vcxproj.filters **.vcxproj.user -**.csproj \ No newline at end of file +**.csproj + +# Generated build files +Makefile +**.make \ No newline at end of file diff --git a/NetworkLibrary/src/metrics/bandwidth_metric.cpp b/NetworkLibrary/src/metrics/bandwidth_metric.cpp new file mode 100644 index 0000000..ce94613 --- /dev/null +++ b/NetworkLibrary/src/metrics/bandwidth_metric.cpp @@ -0,0 +1,79 @@ +#include "bandwidth_metric.h" + +#include "logger.h" + +namespace NetLib +{ + namespace Metrics + { + BandwidthMetric::BandwidthMetric() + : _updateRate( 1.0f ) + , _timeUntilNextUpdate( 1.0f ) + , _inProgressValue( 0 ) + , _currentValue( 0 ) + , _maxValue( 0 ) + { + } + + uint32 BandwidthMetric::GetValue( const std::string& value_type ) const + { + uint32 result = 0; + + if ( value_type == "MAX" ) + { + result = _maxValue; + } + else if ( value_type == "CURRENT" ) + { + result = _currentValue; + } + else + { + LOG_WARNING( "Unknown value type '%s' for BandwidthMetric", value_type.c_str() ); + } + + return result; + } + + void BandwidthMetric::SetUpdateRate( float32 update_rate ) + { + _updateRate = update_rate; + _timeUntilNextUpdate = _updateRate; + } + + void BandwidthMetric::Update( float32 elapsed_time ) + { + if ( _timeUntilNextUpdate <= elapsed_time ) + { + // Update current + _currentValue = _inProgressValue; + _inProgressValue = 0; + + // Update max + if ( _currentValue > _maxValue ) + { + _maxValue = _currentValue; + } + + _timeUntilNextUpdate = _updateRate; + } + else + { + _timeUntilNextUpdate -= elapsed_time; + } + } + + void BandwidthMetric::AddValueSample( uint32 value, const std::string& sample_type ) + { + _inProgressValue += value; + } + + void BandwidthMetric::Reset() + { + _inProgressValue = 0; + _currentValue = 0; + _maxValue = 0; + _timeUntilNextUpdate = _updateRate; + } + } // namespace Metrics +} // namespace NetLib diff --git a/NetworkLibrary/src/metrics/bandwidth_metric.h b/NetworkLibrary/src/metrics/bandwidth_metric.h new file mode 100644 index 0000000..c9b732c --- /dev/null +++ b/NetworkLibrary/src/metrics/bandwidth_metric.h @@ -0,0 +1,32 @@ +#pragma once +#include "metrics/i_metric.h" + +namespace NetLib +{ + namespace Metrics + { + /// + /// Base class for bandwidth metrics (upload and download). + /// Tracks current bandwidth usage and maximum bandwidth over time. + /// + class BandwidthMetric : public IMetric + { + public: + BandwidthMetric(); + + uint32 GetValue( const std::string& value_type ) const override; + void SetUpdateRate( float32 update_rate ) override; + void Update( float32 elapsed_time ) override; + void AddValueSample( uint32 value, const std::string& sample_type = "NONE" ) override; + void Reset() override; + + protected: + float32 _timeUntilNextUpdate; + float32 _updateRate; + + uint32 _inProgressValue; + uint32 _currentValue; + uint32 _maxValue; + }; + } +} diff --git a/NetworkLibrary/src/metrics/download_bandwidth_metric.cpp b/NetworkLibrary/src/metrics/download_bandwidth_metric.cpp index c581345..e3ee2c5 100644 --- a/NetworkLibrary/src/metrics/download_bandwidth_metric.cpp +++ b/NetworkLibrary/src/metrics/download_bandwidth_metric.cpp @@ -1,86 +1,14 @@ #include "download_bandwidth_metric.h" -#include "logger.h" - #include "metrics/metric_names.h" namespace NetLib { namespace Metrics { - DownloadBandwidthMetric::DownloadBandwidthMetric() - : _updateRate( 1.0f ) - , _timeUntilNextUpdate( 1.0f ) - , _inProgressValue( 0 ) - , _currentValue( 0 ) - , _maxValue( 0 ) - { - } - void DownloadBandwidthMetric::GetName( std::string& out_name_buffer ) const { out_name_buffer.assign( DOWNLOAD_BANDWIDTH_METRIC ); } - - uint32 DownloadBandwidthMetric::GetValue( const std::string& value_type ) const - { - uint32 result = 0; - - if ( value_type == "MAX" ) - { - result = _maxValue; - } - else if ( value_type == "CURRENT" ) - { - result = _currentValue; - } - else - { - LOG_WARNING( "Unknown value type '%s' for UploadBandwidthMetric", value_type.c_str() ); - } - - return result; - } - - void DownloadBandwidthMetric::SetUpdateRate( float32 update_rate ) - { - _updateRate = update_rate; - _timeUntilNextUpdate = _updateRate; - } - - void DownloadBandwidthMetric::Update( float32 elapsed_time ) - { - if ( _timeUntilNextUpdate <= elapsed_time ) - { - // Update current - _currentValue = _inProgressValue; - _inProgressValue = 0; - - // Update max - if ( _currentValue > _maxValue ) - { - _maxValue = _currentValue; - } - - _timeUntilNextUpdate = _updateRate; - } - else - { - _timeUntilNextUpdate -= elapsed_time; - } - } - - void DownloadBandwidthMetric::AddValueSample( uint32 value, const std::string& sample_type ) - { - _inProgressValue += value; - } - - void DownloadBandwidthMetric::Reset() - { - _inProgressValue = 0; - _currentValue = 0; - _maxValue = 0; - _timeUntilNextUpdate = _updateRate; - } } // namespace Metrics } // namespace NetLib diff --git a/NetworkLibrary/src/metrics/download_bandwidth_metric.h b/NetworkLibrary/src/metrics/download_bandwidth_metric.h index 24820ca..0049f0f 100644 --- a/NetworkLibrary/src/metrics/download_bandwidth_metric.h +++ b/NetworkLibrary/src/metrics/download_bandwidth_metric.h @@ -1,29 +1,14 @@ #pragma once -#include "metrics/i_metric.h" +#include "metrics/bandwidth_metric.h" namespace NetLib { namespace Metrics { - class DownloadBandwidthMetric : public IMetric + class DownloadBandwidthMetric : public BandwidthMetric { public: - DownloadBandwidthMetric(); - void GetName( std::string& out_name_buffer ) const override; - uint32 GetValue( const std::string& value_type ) const override; - void SetUpdateRate( float32 update_rate ) override; - void Update( float32 elapsed_time ) override; - void AddValueSample( uint32 value, const std::string& sample_type = "NONE" ) override; - void Reset() override; - - private: - float32 _timeUntilNextUpdate; - float32 _updateRate; - - uint32 _inProgressValue; - uint32 _currentValue; - uint32 _maxValue; }; } } diff --git a/NetworkLibrary/src/metrics/upload_bandwidth_metric.cpp b/NetworkLibrary/src/metrics/upload_bandwidth_metric.cpp index 65b9289..a4cb1e0 100644 --- a/NetworkLibrary/src/metrics/upload_bandwidth_metric.cpp +++ b/NetworkLibrary/src/metrics/upload_bandwidth_metric.cpp @@ -1,86 +1,14 @@ #include "upload_bandwidth_metric.h" -#include "logger.h" - #include "metrics/metric_names.h" namespace NetLib { namespace Metrics { - UploadBandwidthMetric::UploadBandwidthMetric() - : _updateRate( 1.0f ) - , _timeUntilNextUpdate( 1.0f ) - , _inProgressValue( 0 ) - , _currentValue( 0 ) - , _maxValue( 0 ) - { - } - void UploadBandwidthMetric::GetName( std::string& out_name_buffer ) const { out_name_buffer.assign( UPLOAD_BANDWIDTH_METRIC ); } - - uint32 UploadBandwidthMetric::GetValue( const std::string& value_type ) const - { - uint32 result = 0; - - if ( value_type == "MAX" ) - { - result = _maxValue; - } - else if ( value_type == "CURRENT" ) - { - result = _currentValue; - } - else - { - LOG_WARNING( "Unknown value type '%s' for UploadBandwidthMetric", value_type.c_str() ); - } - - return result; - } - - void UploadBandwidthMetric::SetUpdateRate( float32 update_rate ) - { - _updateRate = update_rate; - _timeUntilNextUpdate = _updateRate; - } - - void UploadBandwidthMetric::Update( float32 elapsed_time ) - { - if ( _timeUntilNextUpdate <= elapsed_time ) - { - // Update current - _currentValue = _inProgressValue; - _inProgressValue = 0; - - // Update max - if ( _currentValue > _maxValue ) - { - _maxValue = _currentValue; - } - - _timeUntilNextUpdate = _updateRate; - } - else - { - _timeUntilNextUpdate -= elapsed_time; - } - } - - void UploadBandwidthMetric::AddValueSample( uint32 value, const std::string& sample_type ) - { - _inProgressValue += value; - } - - void UploadBandwidthMetric::Reset() - { - _inProgressValue = 0; - _currentValue = 0; - _maxValue = 0; - _timeUntilNextUpdate = _updateRate; - } } // namespace Metrics } // namespace NetLib diff --git a/NetworkLibrary/src/metrics/upload_bandwidth_metric.h b/NetworkLibrary/src/metrics/upload_bandwidth_metric.h index c0e9d90..df3a35d 100644 --- a/NetworkLibrary/src/metrics/upload_bandwidth_metric.h +++ b/NetworkLibrary/src/metrics/upload_bandwidth_metric.h @@ -1,29 +1,14 @@ #pragma once -#include "metrics/i_metric.h" +#include "metrics/bandwidth_metric.h" namespace NetLib { namespace Metrics { - class UploadBandwidthMetric : public IMetric + class UploadBandwidthMetric : public BandwidthMetric { public: - UploadBandwidthMetric(); - void GetName( std::string& out_name_buffer ) const override; - uint32 GetValue( const std::string& value_type ) const override; - void SetUpdateRate( float32 update_rate ) override; - void Update( float32 elapsed_time ) override; - void AddValueSample( uint32 value, const std::string& sample_type = "NONE" ) override; - void Reset() override; - - private: - float32 _timeUntilNextUpdate; - float32 _updateRate; - - uint32 _inProgressValue; - uint32 _currentValue; - uint32 _maxValue; }; } } diff --git a/NetworkLibrary/src/transmission_channels/reliable_ordered_channel.cpp b/NetworkLibrary/src/transmission_channels/reliable_ordered_channel.cpp index 3a21f64..5e06e38 100644 --- a/NetworkLibrary/src/transmission_channels/reliable_ordered_channel.cpp +++ b/NetworkLibrary/src/transmission_channels/reliable_ordered_channel.cpp @@ -159,18 +159,7 @@ namespace NetLib return result; } - bool ReliableOrderedChannel::AddMessageToSend( std::unique_ptr< Message > message ) - { - assert( message != nullptr ); - - if ( !IsMessageSuitable( message->GetHeader() ) ) - { - return false; - } - _unsentMessages.push_back( std::move( message ) ); - return true; - } bool ReliableOrderedChannel::ArePendingMessagesToSend() const { @@ -285,26 +274,7 @@ namespace NetLib return true; } - bool ReliableOrderedChannel::ArePendingReadyToProcessMessages() const - { - return !_readyToProcessMessages.empty(); - } - const Message* ReliableOrderedChannel::GetReadyToProcessMessage() - { - if ( !ArePendingReadyToProcessMessages() ) - { - return nullptr; - } - - std::unique_ptr< Message > message( std::move( _readyToProcessMessages.front() ) ); - _readyToProcessMessages.pop(); - - Message* messageToReturn = message.get(); - _processedMessages.push( std::move( message ) ); - - return messageToReturn; - } bool ReliableOrderedChannel::AreUnackedMessagesToResend() const { diff --git a/NetworkLibrary/src/transmission_channels/reliable_ordered_channel.h b/NetworkLibrary/src/transmission_channels/reliable_ordered_channel.h index 65b1577..1576cd9 100644 --- a/NetworkLibrary/src/transmission_channels/reliable_ordered_channel.h +++ b/NetworkLibrary/src/transmission_channels/reliable_ordered_channel.h @@ -39,14 +39,11 @@ namespace NetLib bool CreateAndSendPacket( Socket& socket, const Address& address, Metrics::MetricsHandler* metrics_handler ) override; - bool AddMessageToSend( std::unique_ptr< Message > message ) override; bool ArePendingMessagesToSend() const override; std::unique_ptr< Message > GetMessageToSend( Metrics::MetricsHandler* metrics_handler ); bool AddReceivedMessage( std::unique_ptr< Message > message, Metrics::MetricsHandler* metrics_handler ) override; - bool ArePendingReadyToProcessMessages() const override; - const Message* GetReadyToProcessMessage() override; void ProcessACKs( uint32 acks, uint16 lastAckedMessageSequenceNumber, Metrics::MetricsHandler* metrics_handler ) override; @@ -79,7 +76,7 @@ namespace NetLib /// /// The header of the message to check. /// True if it is suitable, False otherwise. - bool IsMessageSuitable( const MessageHeader& header ) const; + bool IsMessageSuitable( const MessageHeader& header ) const override; ////////// // ACKS diff --git a/NetworkLibrary/src/transmission_channels/transmission_channel.cpp b/NetworkLibrary/src/transmission_channels/transmission_channel.cpp index ad81963..0212ca7 100644 --- a/NetworkLibrary/src/transmission_channels/transmission_channel.cpp +++ b/NetworkLibrary/src/transmission_channels/transmission_channel.cpp @@ -2,6 +2,7 @@ #include +#include "communication/message.h" #include "communication/message_factory.h" namespace NetLib @@ -39,6 +40,40 @@ namespace NetLib return *this; } + bool TransmissionChannel::AddMessageToSend( std::unique_ptr< Message > message ) + { + assert( message != nullptr ); + + if ( !IsMessageSuitable( message->GetHeader() ) ) + { + return false; + } + + _unsentMessages.push_back( std::move( message ) ); + return true; + } + + bool TransmissionChannel::ArePendingReadyToProcessMessages() const + { + return !_readyToProcessMessages.empty(); + } + + const Message* TransmissionChannel::GetReadyToProcessMessage() + { + if ( !ArePendingReadyToProcessMessages() ) + { + return nullptr; + } + + std::unique_ptr< Message > message( std::move( _readyToProcessMessages.front() ) ); + _readyToProcessMessages.pop(); + + Message* messageToReturn = message.get(); + _processedMessages.push( std::move( message ) ); + + return messageToReturn; + } + void TransmissionChannel::FreeProcessedMessages() { MessageFactory& messageFactory = MessageFactory::GetInstance(); diff --git a/NetworkLibrary/src/transmission_channels/transmission_channel.h b/NetworkLibrary/src/transmission_channels/transmission_channel.h index 7775a12..7e5bab7 100644 --- a/NetworkLibrary/src/transmission_channels/transmission_channel.h +++ b/NetworkLibrary/src/transmission_channels/transmission_channel.h @@ -8,6 +8,7 @@ namespace NetLib { class Message; + struct MessageHeader; class MessageFactory; class Socket; class Address; @@ -53,7 +54,7 @@ namespace NetLib /// /// The message pending to be sent. /// True if the message was stored correclt, False otherwise. - virtual bool AddMessageToSend( std::unique_ptr< Message > message ) = 0; + bool AddMessageToSend( std::unique_ptr< Message > message ); /// /// Checks if there are any messages pending to be sent through the network. @@ -69,8 +70,8 @@ namespace NetLib /// True if the message was stored correclt, False otherwise. virtual bool AddReceivedMessage( std::unique_ptr< Message > message, Metrics::MetricsHandler* metrics_handler ) = 0; - virtual bool ArePendingReadyToProcessMessages() const = 0; - virtual const Message* GetReadyToProcessMessage() = 0; + bool ArePendingReadyToProcessMessages() const; + const Message* GetReadyToProcessMessage(); void FreeProcessedMessages(); virtual void ProcessACKs( uint32 acks, uint16 lastAckedMessageSequenceNumber, @@ -94,6 +95,14 @@ namespace NetLib uint16 GetNextMessageSequenceNumber() const { return _nextMessageSequenceNumber; } void IncreaseMessageSequenceNumber() { ++_nextMessageSequenceNumber; }; + /// + /// Checks if a message is suitable for this transmission channel type. + /// Must be implemented by derived classes to validate message properties. + /// + /// The message header to validate. + /// True if the message is suitable for this channel, False otherwise. + virtual bool IsMessageSuitable( const MessageHeader& header ) const = 0; + private: TransmissionChannelType _type; uint16 _nextMessageSequenceNumber; diff --git a/NetworkLibrary/src/transmission_channels/unreliable_ordered_transmission_channel.cpp b/NetworkLibrary/src/transmission_channels/unreliable_ordered_transmission_channel.cpp index 981b6b6..7ac39d4 100644 --- a/NetworkLibrary/src/transmission_channels/unreliable_ordered_transmission_channel.cpp +++ b/NetworkLibrary/src/transmission_channels/unreliable_ordered_transmission_channel.cpp @@ -104,18 +104,7 @@ namespace NetLib return result; } - bool UnreliableOrderedTransmissionChannel::AddMessageToSend( std::unique_ptr< Message > message ) - { - assert( message != nullptr ); - - if ( !IsMessageSuitable( message->GetHeader() ) ) - { - return false; - } - _unsentMessages.push_back( std::move( message ) ); - return true; - } bool UnreliableOrderedTransmissionChannel::ArePendingMessagesToSend() const { @@ -175,26 +164,7 @@ namespace NetLib return true; } - bool UnreliableOrderedTransmissionChannel::ArePendingReadyToProcessMessages() const - { - return ( !_readyToProcessMessages.empty() ); - } - const Message* UnreliableOrderedTransmissionChannel::GetReadyToProcessMessage() - { - if ( !ArePendingReadyToProcessMessages() ) - { - return nullptr; - } - - std::unique_ptr< Message > message( std::move( _readyToProcessMessages.front() ) ); - _readyToProcessMessages.pop(); - - Message* messageToReturn = message.get(); - _processedMessages.push( std::move( message ) ); - - return messageToReturn; - } void UnreliableOrderedTransmissionChannel::ProcessACKs( uint32 acks, uint16 lastAckedMessageSequenceNumber, Metrics::MetricsHandler* metrics_handler ) diff --git a/NetworkLibrary/src/transmission_channels/unreliable_ordered_transmission_channel.h b/NetworkLibrary/src/transmission_channels/unreliable_ordered_transmission_channel.h index 6d81b05..21a6145 100644 --- a/NetworkLibrary/src/transmission_channels/unreliable_ordered_transmission_channel.h +++ b/NetworkLibrary/src/transmission_channels/unreliable_ordered_transmission_channel.h @@ -18,15 +18,12 @@ namespace NetLib bool CreateAndSendPacket( Socket& socket, const Address& address, Metrics::MetricsHandler* metrics_handler ) override; - bool AddMessageToSend( std::unique_ptr< Message > message ) override; bool ArePendingMessagesToSend() const override; std::unique_ptr< Message > GetMessageToSend( Metrics::MetricsHandler* metrics_handler ); uint32 GetSizeOfNextUnsentMessage() const; bool AddReceivedMessage( std::unique_ptr< Message > message, Metrics::MetricsHandler* metrics_handler ) override; - bool ArePendingReadyToProcessMessages() const override; - const Message* GetReadyToProcessMessage() override; void ProcessACKs( uint32 acks, uint16 lastAckedMessageSequenceNumber, Metrics::MetricsHandler* metrics_handler ) override; @@ -46,6 +43,6 @@ namespace NetLib /// /// The header of the message to check. /// True if it is suitable, False otherwise. - bool IsMessageSuitable( const MessageHeader& header ) const; + bool IsMessageSuitable( const MessageHeader& header ) const override; }; } // namespace NetLib diff --git a/NetworkLibrary/src/transmission_channels/unreliable_unordered_transmission_channel.cpp b/NetworkLibrary/src/transmission_channels/unreliable_unordered_transmission_channel.cpp index c8bbd65..a2017e3 100644 --- a/NetworkLibrary/src/transmission_channels/unreliable_unordered_transmission_channel.cpp +++ b/NetworkLibrary/src/transmission_channels/unreliable_unordered_transmission_channel.cpp @@ -96,18 +96,7 @@ namespace NetLib return result; } - bool UnreliableUnorderedTransmissionChannel::AddMessageToSend( std::unique_ptr< Message > message ) - { - assert( message != nullptr ); - - if ( !IsMessageSuitable( message->GetHeader() ) ) - { - return false; - } - _unsentMessages.push_back( std::move( message ) ); - return true; - } bool UnreliableUnorderedTransmissionChannel::ArePendingMessagesToSend() const { @@ -156,26 +145,7 @@ namespace NetLib return true; } - bool UnreliableUnorderedTransmissionChannel::ArePendingReadyToProcessMessages() const - { - return ( !_readyToProcessMessages.empty() ); - } - const Message* UnreliableUnorderedTransmissionChannel::GetReadyToProcessMessage() - { - if ( !ArePendingReadyToProcessMessages() ) - { - return nullptr; - } - - std::unique_ptr< Message > message( std::move( _readyToProcessMessages.front() ) ); - _readyToProcessMessages.pop(); - - Message* messageToReturn = message.get(); - _processedMessages.push( std::move( message ) ); - - return messageToReturn; - } void UnreliableUnorderedTransmissionChannel::ProcessACKs( uint32 acks, uint16 lastAckedMessageSequenceNumber, Metrics::MetricsHandler* metrics_handler ) diff --git a/NetworkLibrary/src/transmission_channels/unreliable_unordered_transmission_channel.h b/NetworkLibrary/src/transmission_channels/unreliable_unordered_transmission_channel.h index f15ca20..db881de 100644 --- a/NetworkLibrary/src/transmission_channels/unreliable_unordered_transmission_channel.h +++ b/NetworkLibrary/src/transmission_channels/unreliable_unordered_transmission_channel.h @@ -23,15 +23,12 @@ namespace NetLib bool CreateAndSendPacket( Socket& socket, const Address& address, Metrics::MetricsHandler* metrics_handler ) override; - bool AddMessageToSend( std::unique_ptr< Message > message ) override; bool ArePendingMessagesToSend() const override; std::unique_ptr< Message > GetMessageToSend( Metrics::MetricsHandler* metrics_handler ); uint32 GetSizeOfNextUnsentMessage() const; bool AddReceivedMessage( std::unique_ptr< Message > message, Metrics::MetricsHandler* metrics_handler ) override; - bool ArePendingReadyToProcessMessages() const override; - const Message* GetReadyToProcessMessage() override; void ProcessACKs( uint32 acks, uint16 lastAckedMessageSequenceNumber, Metrics::MetricsHandler* metrics_handler ) override; @@ -45,6 +42,6 @@ namespace NetLib /// /// The header of the message to check. /// True if it is suitable, False otherwise. - bool IsMessageSuitable( const MessageHeader& header ) const; + bool IsMessageSuitable( const MessageHeader& header ) const override; }; } // namespace NetLib diff --git a/_codeql_detected_source_root b/_codeql_detected_source_root new file mode 120000 index 0000000..945c9b4 --- /dev/null +++ b/_codeql_detected_source_root @@ -0,0 +1 @@ +. \ No newline at end of file diff --git a/premake5.lua b/premake5.lua index f74f997..f92094b 100644 --- a/premake5.lua +++ b/premake5.lua @@ -9,8 +9,8 @@ PROJECT_DATA = COMMON = { NAME = "Common", - PATH = ROOT_PATH "common/", - PREMAKE_PATH = ROOT_PATH "common/common_premake5.lua" + PATH = ROOT_PATH "Common/", + PREMAKE_PATH = ROOT_PATH "Common/common_premake5.lua" }, ENGINE = {