+int getNetworkBuffer8BitInteger(struct NetworkBuffer *nb)
+{
+ int num_bytes = 1;
+
+ if (nb->pos + num_bytes > nb->size)
+ return 0;
+
+ int value = getNetwork8BitInteger(&nb->buffer[nb->pos]);
+
+ nb->pos += num_bytes;
+
+ return value;
+}
+
+void putNetworkBuffer8BitInteger(struct NetworkBuffer *nb, int value)
+{
+ int num_bytes = 1;
+
+ if (nb->pos + num_bytes > nb->max_size)
+ increaseNetworkBuffer(nb, num_bytes);
+
+ nb->pos += putNetwork8BitInteger(&nb->buffer[nb->pos], value);
+ nb->size = nb->pos;
+}
+
+int getNetworkBuffer16BitInteger(struct NetworkBuffer *nb)
+{
+ int num_bytes = 2;
+
+ if (nb->pos + num_bytes > nb->size)
+ return 0;
+
+ int value = getNetwork16BitInteger(&nb->buffer[nb->pos]);
+
+ nb->pos += num_bytes;
+
+ return value;
+}
+
+void putNetworkBuffer16BitInteger(struct NetworkBuffer *nb, int value)
+{
+ int num_bytes = 2;
+
+ if (nb->pos + num_bytes > nb->max_size)
+ increaseNetworkBuffer(nb, num_bytes);
+
+ nb->pos += putNetwork16BitInteger(&nb->buffer[nb->pos], value);
+ nb->size = nb->pos;
+}
+
+int getNetworkBuffer32BitInteger(struct NetworkBuffer *nb)
+{
+ int num_bytes = 4;
+
+ if (nb->pos + num_bytes > nb->size)
+ return 0;
+
+ int value = getNetwork32BitInteger(&nb->buffer[nb->pos]);
+
+ nb->pos += num_bytes;
+
+ return value;
+}
+
+void putNetworkBuffer32BitInteger(struct NetworkBuffer *nb, int value)
+{
+ int num_bytes = 4;
+
+ if (nb->pos + num_bytes > nb->max_size)
+ increaseNetworkBuffer(nb, num_bytes);
+
+ nb->pos += putNetwork32BitInteger(&nb->buffer[nb->pos], value);
+ nb->size = nb->pos;
+}
+
+char *getNetworkBufferString(struct NetworkBuffer *nb)
+{
+ char *s = getNetworkString(&nb->buffer[nb->pos]);
+
+ nb->pos += strlen(s) + 1;
+
+ return s;
+}
+
+void putNetworkBufferString(struct NetworkBuffer *nb, char *s)
+{
+ int num_bytes = strlen(s) + 1;
+
+ if (nb->pos + num_bytes > nb->max_size)
+ increaseNetworkBuffer(nb, num_bytes);
+
+ nb->pos += putNetworkString(&nb->buffer[nb->pos], s);
+ nb->size = nb->pos;
+}
+
+int getNetworkBufferFile(struct NetworkBuffer *nb, char *filename)
+{
+ FILE *file;
+ int num_bytes = getNetworkBuffer32BitInteger(nb);
+ int i;
+
+ if (!(file = fopen(filename, MODE_WRITE)))
+ {
+ Warn("cannot write file '%s' from network buffer", filename);
+
+ return 0;
+ }
+
+ for (i = 0; i < num_bytes; i++)
+ {
+ int b = getNetworkBuffer8BitInteger(nb);
+
+ putFile8Bit(file, b);
+ }
+
+ fclose(file);
+
+ return num_bytes;
+}
+
+int putNetworkBufferFile(struct NetworkBuffer *nb, char *filename)
+{
+ File *file;
+ int filesize_pos = nb->pos;
+ int num_bytes = 0;
+
+ // will be replaced with file size
+ putNetworkBuffer32BitInteger(nb, 0);
+
+ if (!(file = openFile(filename, MODE_READ)))
+ {
+ Warn("cannot read file '%s' to network buffer", filename);
+
+ return 0;
+ }
+
+ while (1)
+ {
+ int b = getFile8Bit(file);
+
+ if (checkEndOfFile(file))
+ break;
+
+ putNetworkBuffer8BitInteger(nb, b);
+
+ num_bytes++;
+ }
+
+ closeFile(file);
+
+ // set file size
+ putNetwork32BitInteger(&nb->buffer[filesize_pos], num_bytes);
+
+ return num_bytes;
+}
+
+void dumpNetworkBuffer(struct NetworkBuffer *nb)
+{
+ int i;
+
+ Debug("network:buffer", "network buffer maximum size: %d\n", nb->max_size);
+ Debug("network:buffer", "network buffer size: %d\n", nb->size);
+ Debug("network:buffer", "network buffer position : %d\n", nb->pos);
+
+ for (i = 0; i < nb->size; i++)
+ {
+ if ((i % 16) == 0)
+ DebugContinued("network:buffer", "\n");
+
+ DebugContinued("", "%02x ", nb->buffer[i]);
+ }
+
+ DebugContinued("network:buffer", "\n");
+}
+
+static void SendNetworkBufferToAllButOne(struct NetworkBuffer *nb,
+ struct NetworkServerPlayerInfo *except)