mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2024-11-26 05:24:21 +01:00
Somewhat working networking (hey - hardcoding!)
This commit is contained in:
parent
f31320b774
commit
83d797ede3
@ -24,6 +24,11 @@
|
|||||||
#define TMP_PATH "tmp"
|
#define TMP_PATH "tmp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* TODO: */
|
||||||
|
extern int fixme_tmp_network_client;
|
||||||
|
extern int fixme_tmp_network_server;
|
||||||
|
|
||||||
|
|
||||||
static struct timeval tv_start;
|
static struct timeval tv_start;
|
||||||
static const char *main_menu_messages[] = {
|
static const char *main_menu_messages[] = {
|
||||||
"Invoke key sequence", /* 0 */
|
"Invoke key sequence", /* 0 */
|
||||||
@ -96,6 +101,12 @@ void C64::c64_ctor1(void)
|
|||||||
strncpy(this->server_hostname, "localhost",
|
strncpy(this->server_hostname, "localhost",
|
||||||
sizeof(this->server_hostname));
|
sizeof(this->server_hostname));
|
||||||
this->server_port = 19760;
|
this->server_port = 19760;
|
||||||
|
|
||||||
|
if (fixme_tmp_network_server)
|
||||||
|
this->network_server = new NetworkServer(this->server_port);
|
||||||
|
if (fixme_tmp_network_client)
|
||||||
|
this->network_client = new NetworkClient(this->server_hostname,
|
||||||
|
this->server_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
void C64::c64_ctor2(void)
|
void C64::c64_ctor2(void)
|
||||||
@ -549,6 +560,10 @@ void C64::Run(void)
|
|||||||
|
|
||||||
void C64::VBlank(bool draw_frame)
|
void C64::VBlank(bool draw_frame)
|
||||||
{
|
{
|
||||||
|
/* From Acorn port */
|
||||||
|
static uint64_t lastFrame;
|
||||||
|
static uint32_t now;
|
||||||
|
|
||||||
#if defined(GEKKO)
|
#if defined(GEKKO)
|
||||||
WPAD_ScanPads();
|
WPAD_ScanPads();
|
||||||
#endif
|
#endif
|
||||||
@ -577,33 +592,17 @@ void C64::VBlank(bool draw_frame)
|
|||||||
TheCIA2->CountTOD();
|
TheCIA2->CountTOD();
|
||||||
|
|
||||||
// Update window if needed
|
// Update window if needed
|
||||||
if (draw_frame) {
|
if (draw_frame && this->network_client == NULL) {
|
||||||
TheDisplay->Update();
|
TheDisplay->Update();
|
||||||
#if 0
|
|
||||||
// Calculate time between VBlanks, display speedometer
|
|
||||||
struct timeval tv;
|
|
||||||
gettimeofday(&tv, NULL);
|
|
||||||
if ((tv.tv_usec -= tv_start.tv_usec) < 0) {
|
|
||||||
tv.tv_usec += 1000000;
|
|
||||||
tv.tv_sec -= 1;
|
|
||||||
}
|
|
||||||
tv.tv_sec -= tv_start.tv_sec;
|
|
||||||
double elapsed_time = (double)tv.tv_sec * 1000000 + tv.tv_usec;
|
|
||||||
speed_index = 20000 / (elapsed_time + 1) * 100;
|
|
||||||
|
|
||||||
// Limit speed to 100% if desired
|
|
||||||
if ((speed_index > 100)) {
|
|
||||||
usleep((unsigned long)(20000 - elapsed_time));
|
|
||||||
speed_index = 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
gettimeofday(&tv_start, NULL);
|
|
||||||
|
|
||||||
TheDisplay->Speedometer((int)speed_index);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
if (this->network_server) {
|
static int frms = 1;
|
||||||
/* Perhaps accept a new connection */
|
frms--;
|
||||||
|
if (this->network_server && frms == 0) {
|
||||||
|
static uint32_t last_time_update;
|
||||||
|
static size_t bytes_sent;
|
||||||
|
|
||||||
|
frms = 6;
|
||||||
|
/* Perhaps accept a new connection */
|
||||||
this->network_server->CheckNewConnection();
|
this->network_server->CheckNewConnection();
|
||||||
|
|
||||||
for (int i = 0; i < this->network_server->n_clients; i++) {
|
for (int i = 0; i < this->network_server->n_clients; i++) {
|
||||||
@ -613,6 +612,27 @@ void C64::VBlank(bool draw_frame)
|
|||||||
remote->EncodeDisplay(master, remote->screen);
|
remote->EncodeDisplay(master, remote->screen);
|
||||||
remote->SendUpdate();
|
remote->SendUpdate();
|
||||||
remote->ResetNetworkUpdate();
|
remote->ResetNetworkUpdate();
|
||||||
|
|
||||||
|
bytes_sent += remote->GetBytesSent();
|
||||||
|
}
|
||||||
|
if (now - last_time_update > 1000)
|
||||||
|
{
|
||||||
|
printf("%.2f kbytes / second\n",
|
||||||
|
((bytes_sent * 1000.0) / ((float)now - last_time_update)) / 1024.0);
|
||||||
|
for (int i = 0; i < this->network_server->n_clients; i++)
|
||||||
|
this->network_server->clients[i]->ResetBytesSent();
|
||||||
|
bytes_sent = 0;
|
||||||
|
last_time_update = now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (this->network_client) {
|
||||||
|
/* Got something? */
|
||||||
|
if (this->network_client->ReceiveUpdateBlock())
|
||||||
|
{
|
||||||
|
this->network_client->DecodeUpdate(
|
||||||
|
this->network_client->screen);
|
||||||
|
TheDisplay->Update(this->network_client->screen);
|
||||||
|
this->network_client->ResetNetworkUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this->have_a_break) {
|
if (this->have_a_break) {
|
||||||
@ -676,12 +696,10 @@ void C64::VBlank(bool draw_frame)
|
|||||||
if (this->quit_thyself)
|
if (this->quit_thyself)
|
||||||
ThePrefs.Save(PREFS_PATH);
|
ThePrefs.Save(PREFS_PATH);
|
||||||
}
|
}
|
||||||
/* From Acorn port */
|
|
||||||
static uint64_t lastFrame;
|
|
||||||
#if defined(GEKKO)
|
#if defined(GEKKO)
|
||||||
uint32_t now = ticks_to_millisecs(gettime());
|
now = ticks_to_millisecs(gettime());
|
||||||
#else
|
#else
|
||||||
uint32_t now = SDL_GetTicks();
|
now = SDL_GetTicks();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ( (now - lastFrame) < ThePrefs.MsPerFrame) {
|
if ( (now - lastFrame) < ThePrefs.MsPerFrame) {
|
||||||
|
@ -82,6 +82,7 @@ public:
|
|||||||
void FakeKeyPress(int kc, uint8 *CIA_key_matrix, uint8 *CIA_rev_matrix);
|
void FakeKeyPress(int kc, uint8 *CIA_key_matrix, uint8 *CIA_rev_matrix);
|
||||||
void TranslateKey(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick);
|
void TranslateKey(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick);
|
||||||
void UpdateKeyMatrix(int c64_key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix);
|
void UpdateKeyMatrix(int c64_key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix);
|
||||||
|
void Update(uint8 *src_pixels);
|
||||||
#endif
|
#endif
|
||||||
bool NumLock(void);
|
bool NumLock(void);
|
||||||
void InitColors(uint8 *colors);
|
void InitColors(uint8 *colors);
|
||||||
|
@ -176,9 +176,8 @@ void C64Display::NewPrefs(Prefs *prefs)
|
|||||||
* Redraw bitmap
|
* Redraw bitmap
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void C64Display::Update(void)
|
void C64Display::Update(uint8 *src_pixels)
|
||||||
{
|
{
|
||||||
Uint8 *src_pixels = (Uint8*)screen;
|
|
||||||
const Uint16 src_pitch = DISPLAY_X;
|
const Uint16 src_pitch = DISPLAY_X;
|
||||||
|
|
||||||
if (ThePrefs.DisplayOption == 0) {
|
if (ThePrefs.DisplayOption == 0) {
|
||||||
@ -228,6 +227,10 @@ void C64Display::Update(void)
|
|||||||
SDL_Flip(real_screen);
|
SDL_Flip(real_screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void C64Display::Update()
|
||||||
|
{
|
||||||
|
this->Update((Uint8*)screen);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Draw string into surface using the C64 ROM font
|
* Draw string into surface using the C64 ROM font
|
||||||
|
@ -17,7 +17,7 @@ DESTDIR =
|
|||||||
|
|
||||||
CXX = g++
|
CXX = g++
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS =-DFRODO_SC -g -O2 -I/usr/include/SDL -I$(DEVKITPRO)/libogc/include -D_GNU_SOURCE=1 -D_REENTRANT -DHAVE_SDL -DORBIT2=1 -pthread -I/usr/include/libglade-2.0 -I/usr/include/gtk-2.0 -I/usr/include/libxml2 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/pixman-1 -I/usr/include/libgnomeui-2.0 -I/usr/include/libart-2.0 -I/usr/include/gconf/2 -I/usr/include/gnome-keyring-1 -I/usr/include/libgnome-2.0 -I/usr/include/libbonoboui-2.0 -I/usr/include/libgnomecanvas-2.0 -I/usr/include/gnome-vfs-2.0 -I/usr/lib/gnome-vfs-2.0/include -I/usr/include/orbit-2.0 -I/usr/include/libbonobo-2.0 -I/usr/include/bonobo-activation-2.0 -I/usr/include/gail-1.0 -I./ -DKBD_LANG=0
|
CFLAGS =-DFRODO_SC -g -I/usr/include/SDL -I$(DEVKITPRO)/libogc/include -D_GNU_SOURCE=1 -D_REENTRANT -DHAVE_SDL -DORBIT2=1 -pthread -I/usr/include/libglade-2.0 -I/usr/include/gtk-2.0 -I/usr/include/libxml2 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/pixman-1 -I/usr/include/libgnomeui-2.0 -I/usr/include/libart-2.0 -I/usr/include/gconf/2 -I/usr/include/gnome-keyring-1 -I/usr/include/libgnome-2.0 -I/usr/include/libbonoboui-2.0 -I/usr/include/libgnomecanvas-2.0 -I/usr/include/gnome-vfs-2.0 -I/usr/lib/gnome-vfs-2.0/include -I/usr/include/orbit-2.0 -I/usr/include/libbonobo-2.0 -I/usr/include/bonobo-activation-2.0 -I/usr/include/gail-1.0 -I./ -DKBD_LANG=0
|
||||||
DEFS = -DHAVE_CONFIG_H -DDATADIR=\"$(datadir)/frodo/\" -DBINDIR=\"$(bindir)/\" -DHAVE_SDL
|
DEFS = -DHAVE_CONFIG_H -DDATADIR=\"$(datadir)/frodo/\" -DBINDIR=\"$(bindir)/\" -DHAVE_SDL
|
||||||
LDFLAGS = -Wl,-E
|
LDFLAGS = -Wl,-E
|
||||||
LIBS = -L/usr/lib -lSDL -lSDL_ttf -pthread -lglade-2.0 -lxml2 -lgnomeui-2 -lSM -lICE -lbonoboui-2 -lgnomevfs-2 -lgnomecanvas-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-activation -lORBit-2 -lart_lgpl_2 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lpango-1.0 -lcairo -lgconf-2 -lgthread-2.0 -lrt -lgmodule-2.0 -ldl -lgobject-2.0 -lglib-2.0
|
LIBS = -L/usr/lib -lSDL -lSDL_ttf -pthread -lglade-2.0 -lxml2 -lgnomeui-2 -lSM -lICE -lbonoboui-2 -lgnomevfs-2 -lgnomecanvas-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-activation -lORBit-2 -lart_lgpl_2 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lpango-1.0 -lcairo -lgconf-2 -lgthread-2.0 -lrt -lgmodule-2.0 -ldl -lgobject-2.0 -lglib-2.0
|
||||||
|
@ -22,8 +22,8 @@
|
|||||||
#include "Network.h"
|
#include "Network.h"
|
||||||
#include "Display.h"
|
#include "Display.h"
|
||||||
|
|
||||||
#define N_SQUARES_W 20
|
#define N_SQUARES_W 16
|
||||||
#define N_SQUARES_H 20
|
#define N_SQUARES_H 8
|
||||||
|
|
||||||
#define SQUARE_W (DISPLAY_X / N_SQUARES_W)
|
#define SQUARE_W (DISPLAY_X / N_SQUARES_W)
|
||||||
#define SQUARE_H (DISPLAY_Y / N_SQUARES_H)
|
#define SQUARE_H (DISPLAY_Y / N_SQUARES_H)
|
||||||
@ -40,6 +40,7 @@ Network::Network()
|
|||||||
/* "big enough" static buffer */
|
/* "big enough" static buffer */
|
||||||
this->ud = (NetworkUpdate*)malloc( size );
|
this->ud = (NetworkUpdate*)malloc( size );
|
||||||
this->ResetNetworkUpdate();
|
this->ResetNetworkUpdate();
|
||||||
|
this->bytes_sent = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Network::~Network()
|
Network::~Network()
|
||||||
@ -53,9 +54,9 @@ size_t Network::EncodeDisplayRaw(struct NetworkDisplayUpdate *dst, Uint8 *screen
|
|||||||
const int raw_w = SQUARE_W / 2;
|
const int raw_w = SQUARE_W / 2;
|
||||||
dst->type = DISPLAY_UPDATE_RAW;
|
dst->type = DISPLAY_UPDATE_RAW;
|
||||||
|
|
||||||
for (int y = y_start; y < y_start + SQUARE_W; y++)
|
for (int y = y_start; y < y_start + SQUARE_H; y++)
|
||||||
{
|
{
|
||||||
for (int x = x_start; x < x_start + SQUARE_H; x += 2)
|
for (int x = x_start; x < x_start + SQUARE_W; x += 2)
|
||||||
{
|
{
|
||||||
Uint8 a = screen[ y * DISPLAY_X + x ];
|
Uint8 a = screen[ y * DISPLAY_X + x ];
|
||||||
Uint8 b = screen[ y * DISPLAY_X + (x + 1) ];
|
Uint8 b = screen[ y * DISPLAY_X + (x + 1) ];
|
||||||
@ -77,9 +78,9 @@ size_t Network::EncodeDisplayRLE(struct NetworkDisplayUpdate *dst, Uint8 *screen
|
|||||||
|
|
||||||
dst->type = DISPLAY_UPDATE_RLE;
|
dst->type = DISPLAY_UPDATE_RLE;
|
||||||
|
|
||||||
for (int y = y_start; y < y_start + SQUARE_W; y++)
|
for (int y = y_start; y < y_start + SQUARE_H; y++)
|
||||||
{
|
{
|
||||||
for (int x = x_start; x < x_start + SQUARE_H; x++)
|
for (int x = x_start; x < x_start + SQUARE_W; x++)
|
||||||
{
|
{
|
||||||
if (color != screen[ y * DISPLAY_X + x ] ||
|
if (color != screen[ y * DISPLAY_X + x ] ||
|
||||||
len >= 255)
|
len >= 255)
|
||||||
@ -94,6 +95,13 @@ size_t Network::EncodeDisplayRLE(struct NetworkDisplayUpdate *dst, Uint8 *screen
|
|||||||
len++;
|
len++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (len != 0)
|
||||||
|
{
|
||||||
|
dst->data[out] = len;
|
||||||
|
dst->data[out + 1] = color;
|
||||||
|
|
||||||
|
out += 2;
|
||||||
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
@ -141,12 +149,13 @@ bool Network::DecodeDisplayRLE(Uint8 *screen, struct NetworkDisplayUpdate *src,
|
|||||||
int p = 0;
|
int p = 0;
|
||||||
int x = x_start;
|
int x = x_start;
|
||||||
int y = y_start;
|
int y = y_start;
|
||||||
|
int sz = src->size - sizeof(NetworkDisplayUpdate);
|
||||||
|
|
||||||
/* Something is wrong if this is true... */
|
/* Something is wrong if this is true... */
|
||||||
if (src->size % 2 != 0)
|
if (sz % 2 != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
while (p < src->size)
|
while (p < sz)
|
||||||
{
|
{
|
||||||
Uint8 len = src->data[p];
|
Uint8 len = src->data[p];
|
||||||
Uint8 color = src->data[p+1];
|
Uint8 color = src->data[p+1];
|
||||||
@ -173,9 +182,9 @@ bool Network::DecodeDisplayRaw(Uint8 *screen, struct NetworkDisplayUpdate *src,
|
|||||||
{
|
{
|
||||||
const int raw_w = SQUARE_W / 2;
|
const int raw_w = SQUARE_W / 2;
|
||||||
|
|
||||||
for (int y = y_start; y < y_start + SQUARE_W; y++)
|
for (int y = y_start; y < y_start + SQUARE_H; y++)
|
||||||
{
|
{
|
||||||
for (int x = x_start; x < x_start + SQUARE_H; x += 2)
|
for (int x = x_start; x < x_start + SQUARE_W; x += 2)
|
||||||
{
|
{
|
||||||
Uint8 v = src->data[(y - y_start) * raw_w + (x - x_start) / 2];
|
Uint8 v = src->data[(y - y_start) * raw_w + (x - x_start) / 2];
|
||||||
Uint8 a = v >> 4;
|
Uint8 a = v >> 4;
|
||||||
@ -216,7 +225,7 @@ bool Network::CompareSquare(Uint8 *a, Uint8 *b)
|
|||||||
Uint8 va = a[ y * DISPLAY_X + x ];
|
Uint8 va = a[ y * DISPLAY_X + x ];
|
||||||
Uint8 vb = b[ y * DISPLAY_X + x ];
|
Uint8 vb = b[ y * DISPLAY_X + x ];
|
||||||
|
|
||||||
if (va == vb)
|
if (va != vb)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -305,7 +314,7 @@ void Network::ResetNetworkUpdate(void)
|
|||||||
|
|
||||||
this->ud->type = HEADER;
|
this->ud->type = HEADER;
|
||||||
this->ud->size = sizeof(NetworkUpdate);
|
this->ud->size = sizeof(NetworkUpdate);
|
||||||
this->cur_ud = (Uint8*)(this->ud + sizeof(NetworkUpdate));
|
this->cur_ud = (Uint8*)(this->ud->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -323,6 +332,15 @@ bool Network::ReceiveUpdateBlock(int sock)
|
|||||||
return this->ReceiveUpdate(this->ud, sock, NULL);
|
return this->ReceiveUpdate(this->ud, sock, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Network::AddNetworkUpdate(NetworkUpdate *update)
|
||||||
|
{
|
||||||
|
size_t sz = update->size;
|
||||||
|
|
||||||
|
this->cur_ud += sz;
|
||||||
|
this->ud->size += sz;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Network::MarshalData(NetworkUpdate *ud)
|
void Network::MarshalData(NetworkUpdate *ud)
|
||||||
{
|
{
|
||||||
Uint8 *p = ud->data;
|
Uint8 *p = ud->data;
|
||||||
@ -330,7 +348,7 @@ void Network::MarshalData(NetworkUpdate *ud)
|
|||||||
int sz = ud->size;
|
int sz = ud->size;
|
||||||
|
|
||||||
ud->size = htons(ud->size);
|
ud->size = htons(ud->size);
|
||||||
while (len < ud->size)
|
while (len < sz)
|
||||||
{
|
{
|
||||||
p = p + len;
|
p = p + len;
|
||||||
|
|
||||||
@ -343,7 +361,7 @@ void Network::MarshalData(NetworkUpdate *ud)
|
|||||||
{
|
{
|
||||||
NetworkDisplayUpdate *tmp = (NetworkDisplayUpdate *)p;
|
NetworkDisplayUpdate *tmp = (NetworkDisplayUpdate *)p;
|
||||||
|
|
||||||
len = tmp->size;
|
len += tmp->size;
|
||||||
tmp->size = htons(tmp->size);
|
tmp->size = htons(tmp->size);
|
||||||
} break;
|
} break;
|
||||||
case JOYSTICK_UPDATE:
|
case JOYSTICK_UPDATE:
|
||||||
@ -375,8 +393,8 @@ void Network::DeMarshalData(NetworkUpdate *ud)
|
|||||||
{
|
{
|
||||||
NetworkDisplayUpdate *tmp = (NetworkDisplayUpdate *)p;
|
NetworkDisplayUpdate *tmp = (NetworkDisplayUpdate *)p;
|
||||||
|
|
||||||
len = tmp->size;
|
tmp->size = ntohs(tmp->size);
|
||||||
tmp->size = ntohl(tmp->size);
|
len += tmp->size;
|
||||||
} break;
|
} break;
|
||||||
case JOYSTICK_UPDATE:
|
case JOYSTICK_UPDATE:
|
||||||
len = sizeof(NetworkJoystickUpdate);
|
len = sizeof(NetworkJoystickUpdate);
|
||||||
@ -388,6 +406,28 @@ void Network::DeMarshalData(NetworkUpdate *ud)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Network::DecodeUpdate(uint8 *screen)
|
||||||
|
{
|
||||||
|
unsigned int cookie;
|
||||||
|
NetworkUpdate *p;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (p = this->IterateFirst(this->ud, &cookie); p;
|
||||||
|
p = this->IterateNext(this->ud, &cookie))
|
||||||
|
{
|
||||||
|
switch(p->type)
|
||||||
|
{
|
||||||
|
case DISPLAY_UPDATE_RAW:
|
||||||
|
case DISPLAY_UPDATE_RLE:
|
||||||
|
this->DecodeDisplayUpdate(screen, (NetworkDisplayUpdate*)p);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NetworkUpdate *Network::IterateFirst(NetworkUpdate *p, unsigned int *cookie)
|
NetworkUpdate *Network::IterateFirst(NetworkUpdate *p, unsigned int *cookie)
|
||||||
{
|
{
|
||||||
Uint8 *p8 = (Uint8*)p;
|
Uint8 *p8 = (Uint8*)p;
|
||||||
@ -398,15 +438,15 @@ NetworkUpdate *Network::IterateFirst(NetworkUpdate *p, unsigned int *cookie)
|
|||||||
return NULL;
|
return NULL;
|
||||||
*cookie = *cookie + cur->size;
|
*cookie = *cookie + cur->size;
|
||||||
|
|
||||||
return (NetworkUpdate *)p->data;
|
return cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkUpdate *Network::IterateNext(NetworkUpdate *p, unsigned int *cookie)
|
NetworkUpdate *Network::IterateNext(NetworkUpdate *p, unsigned int *cookie)
|
||||||
{
|
{
|
||||||
NetworkUpdate *cur = (NetworkUpdate *)(p->data + *cookie);
|
NetworkUpdate *cur = (NetworkUpdate *)(((Uint8*)p) + *cookie);
|
||||||
|
|
||||||
/* End of iteration */
|
/* End of iteration */
|
||||||
if ( *cookie >= p->size )
|
if ( *cookie >= p->size || cur->size == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
*cookie = *cookie + cur->size;
|
*cookie = *cookie + cur->size;
|
||||||
@ -439,5 +479,4 @@ NetworkClient::~NetworkClient()
|
|||||||
free(this->screen);
|
free(this->screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#include "NetworkUnix.h"
|
#include "NetworkUnix.h"
|
||||||
|
@ -95,6 +95,8 @@ public:
|
|||||||
|
|
||||||
size_t DecodeSoundUpdate(struct NetworkSoundUpdate *src, char *buf);
|
size_t DecodeSoundUpdate(struct NetworkSoundUpdate *src, char *buf);
|
||||||
|
|
||||||
|
bool DecodeUpdate(uint8 *screen);
|
||||||
|
|
||||||
void ResetNetworkUpdate(void);
|
void ResetNetworkUpdate(void);
|
||||||
|
|
||||||
bool SendUpdate(int sock);
|
bool SendUpdate(int sock);
|
||||||
@ -103,6 +105,14 @@ public:
|
|||||||
|
|
||||||
bool ReceiveUpdateBlock(int sock);
|
bool ReceiveUpdateBlock(int sock);
|
||||||
|
|
||||||
|
size_t GetBytesSent() {
|
||||||
|
return this->bytes_sent;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResetBytesSent() {
|
||||||
|
this->bytes_sent = 0;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
size_t EncodeDisplayRLE(struct NetworkDisplayUpdate *dst, Uint8 *screen,
|
size_t EncodeDisplayRLE(struct NetworkDisplayUpdate *dst, Uint8 *screen,
|
||||||
int x, int y);
|
int x, int y);
|
||||||
@ -117,11 +127,8 @@ private:
|
|||||||
|
|
||||||
NetworkUpdate *IterateNext(NetworkUpdate *p, unsigned int *cookie);
|
NetworkUpdate *IterateNext(NetworkUpdate *p, unsigned int *cookie);
|
||||||
|
|
||||||
void AddNetworkUpdate(struct NetworkUpdate *update)
|
void AddNetworkUpdate(struct NetworkUpdate *update);
|
||||||
{
|
|
||||||
this->cur_ud += update->size;
|
|
||||||
this->ud->size += update->size;
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Compare two display squares.
|
* Compare two display squares.
|
||||||
*
|
*
|
||||||
@ -145,6 +152,7 @@ private:
|
|||||||
|
|
||||||
NetworkUpdate *ud;
|
NetworkUpdate *ud;
|
||||||
Uint8 *cur_ud;
|
Uint8 *cur_ud;
|
||||||
|
size_t bytes_sent;
|
||||||
};
|
};
|
||||||
|
|
||||||
class NetworkClient : public Network
|
class NetworkClient : public Network
|
||||||
|
@ -7,8 +7,9 @@
|
|||||||
/* From glibc docs */
|
/* From glibc docs */
|
||||||
static int make_socket (uint16_t port)
|
static int make_socket (uint16_t port)
|
||||||
{
|
{
|
||||||
int sock;
|
|
||||||
struct sockaddr_in name;
|
struct sockaddr_in name;
|
||||||
|
int sock;
|
||||||
|
int d = 1;
|
||||||
|
|
||||||
/* Create the socket. */
|
/* Create the socket. */
|
||||||
sock = socket (PF_INET, SOCK_STREAM, 0);
|
sock = socket (PF_INET, SOCK_STREAM, 0);
|
||||||
@ -18,6 +19,11 @@ static int make_socket (uint16_t port)
|
|||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR, &d, sizeof(int)) < 0) {
|
||||||
|
perror("setsockopt");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Give the socket a name. */
|
/* Give the socket a name. */
|
||||||
name.sin_family = AF_INET;
|
name.sin_family = AF_INET;
|
||||||
name.sin_port = htons (port);
|
name.sin_port = htons (port);
|
||||||
@ -89,6 +95,7 @@ bool NetworkServer::CheckNewConnection()
|
|||||||
else if ( v == 0 )
|
else if ( v == 0 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
size = sizeof(client_name);
|
||||||
client_sock = accept(this->listen_sock, (struct sockaddr*)&client_name, &size);
|
client_sock = accept(this->listen_sock, (struct sockaddr*)&client_name, &size);
|
||||||
if (client_sock < 0)
|
if (client_sock < 0)
|
||||||
{
|
{
|
||||||
@ -96,7 +103,6 @@ bool NetworkServer::CheckNewConnection()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Nej men vobb! En klient har konnektat!\n");
|
|
||||||
/* And add the new one! */
|
/* And add the new one! */
|
||||||
this->AddClient(client_sock);
|
this->AddClient(client_sock);
|
||||||
|
|
||||||
@ -125,7 +131,11 @@ NetworkClient::NetworkClient(const char *hostname, int port)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkClient::NetworkClient(this->sock);
|
this->screen = (Uint8 *)malloc(DISPLAY_X * DISPLAY_Y);
|
||||||
|
assert(this->screen);
|
||||||
|
|
||||||
|
/* Assume black screen */
|
||||||
|
memset(this->screen, 0, DISPLAY_X * DISPLAY_Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Network::ReceiveUpdate(NetworkUpdate *dst, int sock, struct timeval *tv)
|
bool Network::ReceiveUpdate(NetworkUpdate *dst, int sock, struct timeval *tv)
|
||||||
@ -137,7 +147,7 @@ bool Network::ReceiveUpdate(NetworkUpdate *dst, int sock, struct timeval *tv)
|
|||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
FD_SET(sock, &fds);
|
FD_SET(sock, &fds);
|
||||||
|
|
||||||
v = select(1, &fds, NULL, NULL, tv);
|
v = select(sock + 1, &fds, NULL, NULL, tv);
|
||||||
if (v < 0)
|
if (v < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Select failed\n");
|
fprintf(stderr, "Select failed\n");
|
||||||
@ -160,6 +170,8 @@ bool Network::SendUpdate(int sock)
|
|||||||
int sz = src->size;
|
int sz = src->size;
|
||||||
bool out = true;
|
bool out = true;
|
||||||
|
|
||||||
|
this->bytes_sent += sz;
|
||||||
|
|
||||||
this->MarshalData(src);
|
this->MarshalData(src);
|
||||||
sz = write(sock, (void*)src, sz);
|
sz = write(sock, (void*)src, sz);
|
||||||
if (sz < src->size)
|
if (sz < src->size)
|
||||||
|
10
Src/main_x.h
10
Src/main_x.h
@ -100,11 +100,17 @@ Frodo::Frodo()
|
|||||||
/*
|
/*
|
||||||
* Process command line arguments
|
* Process command line arguments
|
||||||
*/
|
*/
|
||||||
|
int fixme_tmp_network_client = 0;
|
||||||
|
int fixme_tmp_network_server = 0;
|
||||||
|
|
||||||
void Frodo::ArgvReceived(int argc, char **argv)
|
void Frodo::ArgvReceived(int argc, char **argv)
|
||||||
{
|
{
|
||||||
if (argc == 2)
|
if (argc == 2 &&
|
||||||
strncpy(prefs_path, argv[1], 255);
|
strcmp(argv[1], "-s") == 0)
|
||||||
|
fixme_tmp_network_server = 1;
|
||||||
|
if (argc == 2 &&
|
||||||
|
strcmp(argv[1], "-c") == 0)
|
||||||
|
fixme_tmp_network_client = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user