diff options
author | Shauren <shauren.trinity@gmail.com> | 2014-10-13 17:22:24 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2014-10-13 17:22:24 +0200 |
commit | 1ef31ba752ed2ab7bcc30c11265d217b383dec4b (patch) | |
tree | 25401cc984834098cf8760e97520c91599d0ba54 /src | |
parent | 42f5017261b577691e1d728cd209f8e51cde2f0b (diff) |
Battle.net: Implemented cache stream items
Diffstat (limited to 'src')
-rw-r--r-- | src/server/bnetserver/Packets/CachePackets.cpp | 83 | ||||
-rw-r--r-- | src/server/bnetserver/Packets/CachePackets.h | 37 | ||||
-rw-r--r-- | src/server/bnetserver/Packets/PacketManager.cpp | 4 | ||||
-rw-r--r-- | src/server/bnetserver/Server/ModuleManager.cpp | 3 | ||||
-rw-r--r-- | src/server/bnetserver/Server/Session.cpp | 11 | ||||
-rw-r--r-- | src/server/bnetserver/Server/Session.h | 3 | ||||
-rw-r--r-- | src/server/bnetserver/Server/SessionManager.cpp | 2 | ||||
-rw-r--r-- | src/server/bnetserver/Server/SessionManager.h | 2 |
8 files changed, 141 insertions, 4 deletions
diff --git a/src/server/bnetserver/Packets/CachePackets.cpp b/src/server/bnetserver/Packets/CachePackets.cpp new file mode 100644 index 00000000000..cd5aa05fed6 --- /dev/null +++ b/src/server/bnetserver/Packets/CachePackets.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "CachePackets.h" + +void Battlenet::Cache::GetStreamItemsRequest::Read() +{ + if (_stream.Read<bool>(1)) + { + _stream.Read<uint16>(11); // padding + ItemName = _stream.ReadFourCC(); + Channel = _stream.ReadFourCC(); + } + else + _stream.Read<uint16>(16); + + _stream.Read<bool>(1); // StreamDirection + ReferenceTime = _stream.Read<int32>(32) - std::numeric_limits<int32>::min(); + Locale = _stream.ReadFourCC(); + Index = _stream.Read<uint32>(32); + _stream.Read<uint8>(6); // Module count, always 0 +} + +std::string Battlenet::Cache::GetStreamItemsRequest::ToString() const +{ + std::ostringstream stream; + stream << "Battlenet::Cache::GetStreamItemsRequest Channel: " << Channel << ", ItemName: " << ItemName + << ", Locale: " << Locale << ", Index: " << Index; + return stream.str(); +} + +void Battlenet::Cache::GetStreamItemsRequest::CallHandler(Session* session) +{ + session->HandleGetStreamItemsRequest(*this); +} + +Battlenet::Cache::GetStreamItemsResponse::~GetStreamItemsResponse() +{ + for (size_t i = 0; i < Modules.size(); ++i) + delete Modules[i]; +} + +void Battlenet::Cache::GetStreamItemsResponse::Write() +{ + _stream.Write(0, 16); + _stream.Write(Modules.size(), 6); + for (ModuleInfo const* info : Modules) + { + _stream.WriteBytes(info->Type.c_str(), 4); + _stream.WriteFourCC(info->Region); + _stream.WriteBytes(info->ModuleId, 32); + _stream.WriteBytes(info->Data, 4); + } + + _stream.Write(Index, 32); + _stream.Write(0, 17); // padding + _stream.Write(1, 16); + _stream.Write(0, 2); +} + +std::string Battlenet::Cache::GetStreamItemsResponse::ToString() const +{ + std::ostringstream stream; + stream << "Battlenet::Cache::GetStreamItemsResponse modules " << Modules.size(); + for (ModuleInfo const* module : Modules) + stream << std::endl << "Battlenet::ModuleInfo Locale " << module->Region.c_str() << ", ModuleId " << ByteArrayToHexStr(module->ModuleId, 32) << ", Data " << ByteArrayToHexStr(module->Data, module->DataSize); + + return stream.str(); +} diff --git a/src/server/bnetserver/Packets/CachePackets.h b/src/server/bnetserver/Packets/CachePackets.h index 2e473df4e72..ba4153fe623 100644 --- a/src/server/bnetserver/Packets/CachePackets.h +++ b/src/server/bnetserver/Packets/CachePackets.h @@ -29,7 +29,7 @@ namespace Battlenet CMSG_GATEWAY_LOOKUP_REQUEST = 0x2, // Not implemented CMSG_CONNECT_REQUEST = 0x4, // Not implemented CMSG_DATA_CHUNK = 0x7, // Not implemented - SMSG_GET_STREAM_ITEMS_REQUEST = 0x9, // Not implemented + CMSG_GET_STREAM_ITEMS_REQUEST = 0x9, // Not implemented SMSG_GATEWAY_LOOKUP_RESPONSE = 0x3, // Not implemented SMSG_CONNECT_RESPONSE = 0x4, // Not implemented @@ -37,6 +37,41 @@ namespace Battlenet SMSG_RESULT = 0x8, // Not implemented SMSG_GET_STREAM_ITEMS_RESPONSE = 0x9 // Not implemented }; + + class GetStreamItemsRequest final : public ClientPacket + { + public: + GetStreamItemsRequest(PacketHeader const& header, BitStream& stream) : ClientPacket(header, stream) + { + ASSERT(header == PacketHeader(CMSG_GET_STREAM_ITEMS_REQUEST, CACHE) && "Invalid packet header for GetStreamItemsRequest"); + } + + void Read() override; + std::string ToString() const override; + void CallHandler(Session* session); + + std::string Channel; + std::string ItemName; + std::string Locale; + uint32 Index; + int32 ReferenceTime; + }; + + class GetStreamItemsResponse final : public ServerPacket + { + public: + GetStreamItemsResponse() : ServerPacket(PacketHeader(SMSG_GET_STREAM_ITEMS_RESPONSE, CACHE)) + { + } + + ~GetStreamItemsResponse(); + + void Write() override; + std::string ToString() const override; + + uint32 Index; + std::vector<ModuleInfo*> Modules; + }; } } diff --git a/src/server/bnetserver/Packets/PacketManager.cpp b/src/server/bnetserver/Packets/PacketManager.cpp index af31b596192..019cf48ac30 100644 --- a/src/server/bnetserver/Packets/PacketManager.cpp +++ b/src/server/bnetserver/Packets/PacketManager.cpp @@ -217,13 +217,13 @@ void Battlenet::PacketManager::RegisterCachePackets() REGISTER_CLIENT_PACKET_NAME(PacketHeader(Cache::CMSG_GATEWAY_LOOKUP_REQUEST, CACHE), "Cache::GatewayLookupRequest"); REGISTER_CLIENT_PACKET_NAME(PacketHeader(Cache::CMSG_CONNECT_REQUEST, CACHE), "Cache::ConnectRequest"); REGISTER_CLIENT_PACKET_NAME(PacketHeader(Cache::CMSG_DATA_CHUNK, CACHE), "Cache::DataChunk"); - REGISTER_CLIENT_PACKET_NAME(PacketHeader(Cache::SMSG_GET_STREAM_ITEMS_REQUEST, CACHE), "Cache::GetStreamItemsRequest"); + REGISTER_CLIENT_PACKET(PacketHeader(Cache::CMSG_GET_STREAM_ITEMS_REQUEST, CACHE), Cache::GetStreamItemsRequest); REGISTER_SERVER_PACKET_NAME(PacketHeader(Cache::SMSG_GATEWAY_LOOKUP_RESPONSE, CACHE), "Cache::GatewayLookupResponse"); REGISTER_SERVER_PACKET_NAME(PacketHeader(Cache::SMSG_CONNECT_RESPONSE, CACHE), "Cache::ConnectResponse"); REGISTER_SERVER_PACKET_NAME(PacketHeader(Cache::SMSG_PUBLISH_LIST_RESPONSE, CACHE), "Cache::PublishListResponse"); REGISTER_SERVER_PACKET_NAME(PacketHeader(Cache::SMSG_RESULT, CACHE), "Cache::Result"); - REGISTER_SERVER_PACKET_NAME(PacketHeader(Cache::SMSG_GET_STREAM_ITEMS_RESPONSE, CACHE), "Cache::GetStreamItemsResponse"); + REGISTER_SERVER_PACKET(PacketHeader(Cache::SMSG_GET_STREAM_ITEMS_RESPONSE, CACHE), Cache::GetStreamItemsResponse); } void Battlenet::PacketManager::RegisterProfilePackets() diff --git a/src/server/bnetserver/Server/ModuleManager.cpp b/src/server/bnetserver/Server/ModuleManager.cpp index 8dc43136739..05cee2ff42e 100644 --- a/src/server/bnetserver/Server/ModuleManager.cpp +++ b/src/server/bnetserver/Server/ModuleManager.cpp @@ -51,7 +51,8 @@ void Battlenet::ModuleManager::Load() Battlenet::ModuleInfo* Battlenet::ModuleManager::CreateModule(std::string const& os, std::string const& name) const { ModuleKey key { os, name }; - ASSERT(_modules.count(key)); + if (!_modules.count(key)) + return nullptr; return new ModuleInfo(*_modules.at(key)); } diff --git a/src/server/bnetserver/Server/Session.cpp b/src/server/bnetserver/Server/Session.cpp index 7090c1f0ca7..9a5f60b296e 100644 --- a/src/server/bnetserver/Server/Session.cpp +++ b/src/server/bnetserver/Server/Session.cpp @@ -477,6 +477,17 @@ void Battlenet::Session::HandleSocialNetworkCheckConnected(Friends::SocialNetwor AsyncWrite(socialNetworkCheckConnectedResult); } +void Battlenet::Session::HandleGetStreamItemsRequest(Cache::GetStreamItemsRequest const& getStreamItemsRequest) +{ + if (ModuleInfo* module = sModuleMgr->CreateModule(getStreamItemsRequest.Locale, getStreamItemsRequest.ItemName)) + { + Cache::GetStreamItemsResponse* getStreamItemsResponse = new Cache::GetStreamItemsResponse(); + getStreamItemsResponse->Index = getStreamItemsRequest.Index; + getStreamItemsResponse->Modules.push_back(module); + AsyncWrite(getStreamItemsResponse); + } +} + inline std::string PacketToStringHelper(Battlenet::ClientPacket const* packet) { if (sLog->ShouldLog("session.packets", LOG_LEVEL_TRACE)) diff --git a/src/server/bnetserver/Server/Session.h b/src/server/bnetserver/Server/Session.h index b2546c70cc6..a2c587841a4 100644 --- a/src/server/bnetserver/Server/Session.h +++ b/src/server/bnetserver/Server/Session.h @@ -81,6 +81,9 @@ namespace Battlenet // Friends void HandleSocialNetworkCheckConnected(Friends::SocialNetworkCheckConnected const& socialNetworkCheckConnected); + // Cache + void HandleGetStreamItemsRequest(Cache::GetStreamItemsRequest const& getStreamItemsRequest); + void Start() override; void UpdateRealms(std::vector<Realm const*>& realms, std::vector<RealmId>& deletedRealms); diff --git a/src/server/bnetserver/Server/SessionManager.cpp b/src/server/bnetserver/Server/SessionManager.cpp index caa17364038..8dcee55ec6c 100644 --- a/src/server/bnetserver/Server/SessionManager.cpp +++ b/src/server/bnetserver/Server/SessionManager.cpp @@ -40,10 +40,12 @@ void Battlenet::SessionManager::AddSession(Session* session) { std::unique_lock<boost::shared_mutex> lock(_sessionMutex); _sessions[{ session->GetAccountId(), session->GetGameAccountId() }] = session; + _sessionsByAccountId[session->GetAccountId()].push_back(session); } void Battlenet::SessionManager::RemoveSession(Session* session) { std::unique_lock<boost::shared_mutex> lock(_sessionMutex); _sessions.erase({ session->GetAccountId(), session->GetGameAccountId() }); + _sessionsByAccountId[session->GetAccountId()].remove(session); } diff --git a/src/server/bnetserver/Server/SessionManager.h b/src/server/bnetserver/Server/SessionManager.h index 4f8e0d9fa97..bbd78c052d2 100644 --- a/src/server/bnetserver/Server/SessionManager.h +++ b/src/server/bnetserver/Server/SessionManager.h @@ -44,6 +44,7 @@ namespace Battlenet { typedef SocketMgr<Session> BaseSocketMgr; typedef std::map<SessionInfo, Session*> SessionMap; + typedef std::map<uint32, std::list<Session*>> SessionByAccountMap; public: static SessionManager& Instance() @@ -74,6 +75,7 @@ namespace Battlenet static void OnSocketAccept(tcp::socket&& sock); SessionMap _sessions; + SessionByAccountMap _sessionsByAccountId; boost::shared_mutex _sessionMutex; }; } |