summaryrefslogtreecommitdiff
path: root/src/network/network_content.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/network_content.h')
-rw-r--r--src/network/network_content.h79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/network/network_content.h b/src/network/network_content.h
new file mode 100644
index 000000000..bcbb05f8f
--- /dev/null
+++ b/src/network/network_content.h
@@ -0,0 +1,79 @@
+/* $Id$ */
+
+/** @file network_content.h Part of the network protocol handling content distribution. */
+
+#ifndef NETWORK_CONTENT_H
+#define NETWORK_CONTENT_H
+
+#if defined(ENABLE_NETWORK)
+
+#include "core/tcp_content.h"
+#include "../core/smallvec_type.hpp"
+
+/** Vector with content info */
+typedef SmallVector<ContentInfo *, 16> ContentVector;
+/** Iterator for the content vector */
+typedef ContentInfo **ContentIterator;
+
+/** Callbacks for notifying others about incoming data */
+struct ContentCallback {
+ /**
+ * We received a content info.
+ * @param ci the content info
+ */
+ virtual void OnReceiveContentInfo(ContentInfo *ci) {}
+
+ /**
+ * We have progress in the download of a file
+ * @param ci the content info of the file
+ * @param bytes the number of bytes downloaded since the previous call
+ */
+ virtual void OnDownloadProgress(ContentInfo *ci, uint bytes) {}
+
+ /**
+ * We have finished downloading a file
+ * @param cid the ContentID of the downloaded file
+ */
+ virtual void OnDownloadComplete(ContentID cid) {}
+
+ /** Silentium */
+ virtual ~ContentCallback() {}
+};
+
+/**
+ * Socket handler for the content server connection
+ */
+class ClientNetworkContentSocketHandler : public NetworkContentSocketHandler {
+protected:
+ SmallVector<ContentCallback *, 2> callbacks; ///< Callbacks to notify "the world"
+
+ FILE *curFile; ///< Currently downloaded file
+ ContentInfo *curInfo; ///< Information about the currently downloaded file
+
+ friend ClientNetworkContentSocketHandler *NetworkContent_Connect(ContentCallback *cb);
+ friend void NetworkContent_Disconnect(ContentCallback *cb);
+
+ DECLARE_CONTENT_RECEIVE_COMMAND(PACKET_CONTENT_SERVER_INFO);
+ DECLARE_CONTENT_RECEIVE_COMMAND(PACKET_CONTENT_SERVER_CONTENT);
+
+ ClientNetworkContentSocketHandler(SOCKET s, const struct sockaddr_in *sin);
+ ~ClientNetworkContentSocketHandler();
+public:
+ void RequestContentList(ContentType type);
+ void RequestContentList(uint count, const ContentID *content_ids);
+ void RequestContentList(ContentVector *cv, bool send_md5sum = true);
+
+ void RequestContent(uint count, const uint32 *content_ids);
+};
+
+ClientNetworkContentSocketHandler *NetworkContent_Connect(ContentCallback *cb);
+void NetworkContent_Disconnect(ContentCallback *cb);
+void NetworkContentLoop();
+
+void ShowNetworkContentListWindow(ContentVector *cv = NULL, ContentType type = CONTENT_TYPE_END);
+
+#else
+static inline void ShowNetworkContentListWindow() {}
+#endif /* ENABLE_NETWORK */
+
+#endif /* NETWORK_CONTENT_H */