WiiFlow_Lite/source/gecko/wifi_gecko.c
2012-05-13 17:25:26 +00:00

134 lines
3.3 KiB
C

/****************************************************************************
* Copyright (C) 2010
* by Dimok
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any
* damages arising from the use of this software.
*
* Permission is granted to anyone to use this software for any
* purpose, including commercial applications, and to alter it and
* redistribute it freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you
* must not claim that you wrote the original software. If you use
* this software in a product, an acknowledgment in the product
* documentation would be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and
* must not be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*
* for WiiXplorer 2010
***************************************************************************/
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <network.h>
#include <errno.h>
#include "wifi_gecko.h"
// set to use TCP socket instead of UDP
#define WIFI_GECKO_USE_TCP (0)
static int connection = -1;
static int init = 0;
const char *dest_ip = NULL;
u16 dest_port = 0;
void WifiGecko_Init(const char *ip, const u16 port)
{
dest_ip = ip;
dest_port = port;
init = 1;
}
void WifiGecko_Close()
{
if (!init) return;
if(connection >= 0)
net_close(connection);
connection = -1;
}
int WifiGecko_Connect()
{
if (!init) return -2;
if(connection >= 0)
return connection;
if (dest_ip == NULL || dest_port == 0) return connection;
#if WIFI_GECKO_USE_TCP
connection = net_socket(PF_INET, SOCK_STREAM, 0);
#else
connection = net_socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
#endif
if (connection < 0)
return connection;
struct sockaddr_in connect_addr;
memset(&connect_addr, 0, sizeof(connect_addr));
#if WIFI_GECKO_USE_TCP
connect_addr.sin_family = PF_INET;
#else
connect_addr.sin_family = AF_INET;
#endif
connect_addr.sin_port = htons(dest_port);
inet_aton(dest_ip, &connect_addr.sin_addr);
if(net_connect(connection, (struct sockaddr*)&connect_addr, sizeof(connect_addr)) < 0)
{
WifiGecko_Close();
return -1;
}
// First time connect, send hello message
char *msg = "Wiiflow WiFi Gecko output console connected\n";
net_send(connection, msg, strlen(msg), 0);
return connection;
}
int WifiGecko_Send(const char * data, int datasize)
{
if (!init) return -2;
if(WifiGecko_Connect() < 0)
return connection;
int ret = 0, done = 0, blocksize = 1024;
while (done < datasize)
{
while(net_get_status() == -EBUSY);
if(blocksize > datasize-done)
blocksize = datasize-done;
ret = net_send(connection, data + done, blocksize, 0);
if (ret < 0)
{
WifiGecko_Close();
return ret;
}
else if(ret == 0)
{
break;
}
done += ret;
usleep (1000);
}
return ret;
}