OpenTTD Source  20241124-master-g9399a92a4f
network_content.h
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD 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, version 2.
4  * OpenTTD 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.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #ifndef NETWORK_CONTENT_H
11 #define NETWORK_CONTENT_H
12 
13 #include "core/tcp_content.h"
14 #include "core/http.h"
15 #include <unordered_map>
16 #include "../core/container_func.hpp"
17 
19 typedef std::vector<ContentInfo *> ContentVector;
21 typedef std::vector<const ContentInfo *> ConstContentVector;
22 
26 typedef const ContentInfo * const * ConstContentIterator;
27 
34  virtual void OnConnect([[maybe_unused]] bool success) {}
35 
39  virtual void OnDisconnect() {}
40 
45  virtual void OnReceiveContentInfo([[maybe_unused]] const ContentInfo *ci) {}
46 
52  virtual void OnDownloadProgress([[maybe_unused]] const ContentInfo *ci, [[maybe_unused]] int bytes) {}
53 
58  virtual void OnDownloadComplete([[maybe_unused]] ContentID cid) {}
59 
61  virtual ~ContentCallback() = default;
62 };
63 
68 protected:
69  typedef std::vector<ContentID> ContentIDList;
70  std::vector<ContentCallback *> callbacks;
73  std::unordered_multimap<ContentID, ContentID> reverse_dependency_map;
74  std::vector<char> http_response;
76 
77  std::optional<FileHandle> curFile;
79  bool isConnecting;
80  bool isCancelled;
81  std::chrono::steady_clock::time_point lastActivity;
82 
83  friend class NetworkContentConnecter;
84 
85  bool Receive_SERVER_INFO(Packet &p) override;
86  bool Receive_SERVER_CONTENT(Packet &p) override;
87 
88  ContentInfo *GetContent(ContentID cid) const;
90 
91  void OnConnect(bool success) override;
92  void OnDisconnect() override;
93  void OnReceiveContentInfo(const ContentInfo *ci) override;
94  void OnDownloadProgress(const ContentInfo *ci, int bytes) override;
95  void OnDownloadComplete(ContentID cid) override;
96 
97  void OnFailure() override;
98  void OnReceiveData(std::unique_ptr<char[]> data, size_t length) override;
99  bool IsCancelled() const override;
100 
101  bool BeforeDownload();
102  void AfterDownload();
103 
104  void DownloadSelectedContentHTTP(const ContentIDList &content);
105  void DownloadSelectedContentFallback(const ContentIDList &content);
106 public:
108  static constexpr std::chrono::seconds IDLE_TIMEOUT = std::chrono::seconds(60);
109 
112 
113  void Connect();
114  void SendReceive();
115  NetworkRecvStatus CloseConnection(bool error = true) override;
116  void Cancel();
117 
118  void RequestContentList(ContentType type);
119  void RequestContentList(uint count, const ContentID *content_ids);
120  void RequestContentList(ContentVector *cv, bool send_md5sum = true);
121 
122  void DownloadSelectedContent(uint &files, uint &bytes, bool fallback = false);
123 
124  void Select(ContentID cid);
125  void Unselect(ContentID cid);
126  void SelectAll();
127  void SelectUpgrade();
128  void UnselectAll();
129  void ToggleSelectedState(const ContentInfo *ci);
130 
131  void ReverseLookupDependency(ConstContentVector &parents, const ContentInfo *child) const;
132  void ReverseLookupTreeDependency(ConstContentVector &tree, const ContentInfo *child) const;
134 
136  uint Length() const { return (uint)this->infos.size(); }
138  ConstContentIterator Begin() const { return this->infos.data(); }
140  ConstContentIterator Get(uint32_t index) const { return this->infos.data() + index; }
142  ConstContentIterator End() const { return this->Begin() + this->Length(); }
143 
144  void Clear();
145 
147  void AddCallback(ContentCallback *cb) { include(this->callbacks, cb); }
149  void RemoveCallback(ContentCallback *cb) { this->callbacks.erase(std::find(this->callbacks.begin(), this->callbacks.end(), cb)); }
150 };
151 
153 
155 
156 void ShowMissingContentWindow(const struct GRFConfig *list);
157 
158 #endif /* NETWORK_CONTENT_H */
Socket handler for the content server connection.
ConstContentIterator Begin() const
Get the begin of the content inf iterator.
void SelectUpgrade()
Select everything that's an update for something we've got.
void DownloadSelectedContentHTTP(const ContentIDList &content)
Initiate downloading the content over HTTP.
std::chrono::steady_clock::time_point lastActivity
The last time there was network activity.
void DownloadSelectedContent(uint &files, uint &bytes, bool fallback=false)
Actually begin downloading the content we selected.
bool isCancelled
Whether the download has been cancelled.
void ToggleSelectedState(const ContentInfo *ci)
Toggle the state of a content info and check its dependencies.
ClientNetworkContentSocketHandler()
Create a socket handler to handle the connection.
bool isConnecting
Whether we're connecting.
void RemoveCallback(ContentCallback *cb)
Remove a callback.
static constexpr std::chrono::seconds IDLE_TIMEOUT
The idle timeout; when to close the connection because it's idle.
void OnReceiveData(std::unique_ptr< char[]> data, size_t length) override
We're receiving data.
void Select(ContentID cid)
Select a specific content id.
int http_response_index
Where we are, in the response, with handling it.
NetworkRecvStatus CloseConnection(bool error=true) override
Disconnect from the content server.
ContentIDList requested
ContentIDs we already requested (so we don't do it again)
void UnselectAll()
Unselect everything that we've not downloaded so far.
void RequestContentList(ContentType type)
Request the content list for the given type.
std::vector< char > http_response
The HTTP response to the requests we've been doing.
void ReverseLookupTreeDependency(ConstContentVector &tree, const ContentInfo *child) const
Reverse lookup the dependencies of all parents over a given child.
void DownloadContentInfo(ContentID cid)
Download information of a given Content ID if not already tried.
bool Receive_SERVER_INFO(Packet &p) override
Server sending list of content info: uint8_t type (invalid ID == does not exist) uint32_t id uint32_t...
void SendReceive()
Check whether we received/can send some data from/to the content server and when that's the case hand...
ContentVector infos
All content info we received.
void OnFailure() override
An error has occurred and the connection has been closed.
ContentInfo * GetContent(ContentID cid) const
Get the content info based on a ContentID.
void AddCallback(ContentCallback *cb)
Add a callback to this class.
bool Receive_SERVER_CONTENT(Packet &p) override
Server sending list of content info: uint32_t unique id uint32_t file size (0 == does not exist) stri...
void Connect()
Connect with the content server.
std::unordered_multimap< ContentID, ContentID > reverse_dependency_map
Content reverse dependency map.
bool BeforeDownload()
Handle the opening of the file before downloading.
void Clear()
Clear all downloaded content information.
ContentInfo * curInfo
Information about the currently downloaded file.
std::optional< FileHandle > curFile
Currently downloaded file.
void CheckDependencyState(ContentInfo *ci)
Check the dependencies (recursively) of this content info.
std::vector< ContentID > ContentIDList
List of content IDs to (possibly) select.
void AfterDownload()
Handle the closing and extracting of a file after downloading it has been done.
bool IsCancelled() const override
Check if there is a request to cancel the transfer.
std::vector< ContentCallback * > callbacks
Callbacks to notify "the world".
ConstContentIterator End() const
Get the end of the content inf iterator.
~ClientNetworkContentSocketHandler()
Clear up the mess ;)
void DownloadSelectedContentFallback(const ContentIDList &content)
Initiate downloading the content over the fallback protocol.
void Unselect(ContentID cid)
Unselect a specific content id.
void Cancel()
Cancel the current download.
void OnDisconnect() override
Callback for when the connection got disconnected.
ConstContentIterator Get(uint32_t index) const
Get the nth position of the content inf iterator.
void ReverseLookupDependency(ConstContentVector &parents, const ContentInfo *child) const
Reverse lookup the dependencies of (direct) parents over a given child.
void SelectAll()
Select everything we can select.
uint Length() const
Get the number of content items we know locally.
Connect to the content server.
Base socket handler for all Content TCP sockets.
Definition: tcp_content.h:22
bool include(Container &container, typename Container::const_reference &item)
Helper function to append an item to a container if it is not already contained.
NetworkRecvStatus
Status of a network client; reasons why a client has quit.
Definition: core.h:23
Basic functions to send and receive HTTP packets.
ClientNetworkContentSocketHandler _network_content_client
The client we use to connect to the server.
void ShowNetworkContentListWindow(ContentVector *cv=nullptr, ContentType type1=CONTENT_TYPE_END, ContentType type2=CONTENT_TYPE_END)
Show the content list window with a given set of content.
std::vector< const ContentInfo * > ConstContentVector
Vector with constant content info.
std::vector< ContentInfo * > ContentVector
Vector with content info.
const ContentInfo *const * ConstContentIterator
Iterator for the constant content vector.
ContentInfo ** ContentIterator
Iterator for the content vector.
void ShowMissingContentWindow(const GRFConfig *list)
Show the content list window with all missing grfs from the given list.
Callbacks for notifying others about incoming data.
virtual void OnConnect([[maybe_unused]] bool success)
Callback for when the connection has finished.
virtual void OnDisconnect()
Callback for when the connection got disconnected.
virtual void OnDownloadProgress([[maybe_unused]] const ContentInfo *ci, [[maybe_unused]] int bytes)
We have progress in the download of a file.
virtual void OnDownloadComplete([[maybe_unused]] ContentID cid)
We have finished downloading a file.
virtual void OnReceiveContentInfo([[maybe_unused]] const ContentInfo *ci)
We received a content info.
virtual ~ContentCallback()=default
Silentium.
Container for all important information about a piece of content.
Information about GRF, used in the game and (part of it) in savegames.
Callback for when the HTTP handler has something to tell us.
Definition: http.h:20
Internal entity of a packet.
Definition: packet.h:42
Basic functions to receive and send TCP packets to/from the content server.
ContentType
The values in the enum are important; they are used as database 'keys'.
@ CONTENT_TYPE_END
Helper to mark the end of the types.
ContentID
Unique identifier for the content.