diff --git a/JGE/JGE.vcproj b/JGE/JGE.vcproj
index dbf28d76e..2311b6a7c 100644
--- a/JGE/JGE.vcproj
+++ b/JGE/JGE.vcproj
@@ -388,6 +388,10 @@
RelativePath=".\src\JMD2Model.cpp"
>
+
+
@@ -416,6 +420,10 @@
RelativePath=".\src\JResourceManager.cpp"
>
+
+
@@ -583,6 +591,10 @@
RelativePath=".\include\JMD2Model.h"
>
+
+
@@ -611,6 +623,10 @@
RelativePath="include\JResourceManager.h"
>
+
+
diff --git a/JGE/Makefile b/JGE/Makefile
index e8928fba5..281f803b8 100644
--- a/JGE/Makefile
+++ b/JGE/Makefile
@@ -7,6 +7,7 @@ GENERIC_OBJS = src/JApp.o src/JGBKFont.o \
src/JGE.o src/JGui.o src/JLBFont.o \
src/JGameObject.o src/JSpline.o src/JAnimator.o \
src/JResourceManager.o src/JFileSystem.o \
+ src/JNetwork.o src/JSocket.o \
src/JParticle.o src/JParticleEmitter.o src/JParticleEffect.o \
src/JParticleSystem.o \
src/unzip/ioapi.o src/unzip/mztools.o src/unzip/unzip.o \
diff --git a/JGE/include/JNetwork.h b/JGE/include/JNetwork.h
new file mode 100644
index 000000000..7a94e1b3a
--- /dev/null
+++ b/JGE/include/JNetwork.h
@@ -0,0 +1,43 @@
+#ifndef _JNETWORK_H_
+#define _JNETWORK_H_
+
+#ifdef WIN32
+#elif defined (LINUX)
+#else
+#endif
+
+#include "JGE.h"
+#include
+using namespace std;
+
+class JNetwork{
+private:
+ static JNetwork * mInstance;
+ static int connected_to_ap;
+public:
+ JNetwork();
+ static JNetwork * GetInstance();
+ static void EndInstance();
+ static string serverIP;
+ int receive(char * buffer, int length);
+ int send(char * buffer, int length);
+ int connect(string serverIP = "");
+ static int isConnected();
+#if defined (WIN32) || defined (LINUX)
+ static int net_thread(LPVOID param);
+#else
+ static int net_thread(SceSize args, void *argp);
+ static int connect_to_apctl(int config);
+#endif
+
+private:
+
+#if defined (WIN32) || defined (LINUX)
+ static DWORD netthread;
+#else
+ static int netthread;
+#endif
+
+};
+
+#endif
\ No newline at end of file
diff --git a/JGE/include/JSocket.h b/JGE/include/JSocket.h
new file mode 100644
index 000000000..56b7336d6
--- /dev/null
+++ b/JGE/include/JSocket.h
@@ -0,0 +1,30 @@
+#ifndef _JSOCKET_H_
+#define _JSOCKET_H_
+
+#include
+using namespace std;
+
+//TODO config ?
+#define SERVER_PORT 20666
+
+class JSocket{
+public:
+ queue received_data;
+ queue tosend_data;
+ static JSocket * mInstance;
+ int start_server(const char *szIpAddr);
+ int start_client(const char *szIpAddr);
+
+ JSocket();
+ ~JSocket();
+ static int connected;
+private:
+ void init();
+ void readWrite(int sock);
+#if defined (WIN32) || defined (LINUX)
+#else
+ int make_socket(uint16_t port);
+#endif
+};
+
+#endif
\ No newline at end of file
diff --git a/JGE/src/JNetwork.cpp b/JGE/src/JNetwork.cpp
new file mode 100644
index 000000000..04a13158f
--- /dev/null
+++ b/JGE/src/JNetwork.cpp
@@ -0,0 +1,213 @@
+/*
+ PSP Network function calls
+
+
+*/
+
+#if defined (WIN32) || defined (LINUX)
+#else
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#endif
+
+#include "../include/JNetwork.h"
+#include "../include/JSocket.h"
+
+JNetwork* JNetwork::mInstance = NULL;
+string JNetwork::serverIP = "";
+
+JNetwork * JNetwork::GetInstance(){
+ if (!mInstance) mInstance = new JNetwork();
+ return mInstance;
+}
+
+void JNetwork::EndInstance(){
+ SAFE_DELETE(mInstance);
+}
+
+
+
+#if defined (WIN32) || defined (LINUX)
+ DWORD JNetwork::netthread = 0;
+ int JNetwork::connected_to_ap = 1;
+#else
+ int JNetwork::connected_to_ap = 0;
+ int JNetwork::netthread = 0;
+#endif
+
+int JNetwork::isConnected(){
+ if (connected_to_ap !=1) return 0;
+ return JSocket::connected;
+}
+
+JNetwork::JNetwork(){
+}
+
+int JNetwork::receive(char * buffer, int length){
+ JSocket * socket = JSocket::mInstance;
+ if (!socket) return 0;
+ int size = 0;
+ while(!socket->received_data.empty() && size < length){
+ buffer[size] = socket->received_data.front();
+ socket->received_data.pop();
+ size++;
+ }
+ return size;
+}
+
+int JNetwork::send(char * buffer, int length){
+ JSocket * socket = JSocket::mInstance;
+ if (!socket) return 0;
+ for (int i = 0; i < length; i++){
+ socket->tosend_data.push(buffer[i]);
+ }
+ return length;
+}
+
+
+
+#ifdef WIN32
+int JNetwork::net_thread(LPVOID param)
+{
+ do
+ {
+ JSocket::mInstance = new JSocket();
+ JSocket * s = JSocket::mInstance;
+ if (JNetwork::serverIP.size()){
+ OutputDebugString(JNetwork::serverIP.c_str());
+ s->start_client(JNetwork::serverIP.c_str());
+
+ }else{
+ s->start_server(""); //IP address useless for server ?
+
+ }
+ }
+ while(0);
+
+ return 0;
+}
+
+
+int JNetwork::connect(string serverIP){
+ if(netthread) return 0;
+
+ JNetwork::serverIP = serverIP;
+ /* Create a user thread to do the real work */
+ HANDLE hthread;
+ hthread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)net_thread,0,0,&netthread);
+ return netthread;
+}
+
+#else
+int net_thread(SceSize args, void *argp)
+{
+
+
+ do
+ {
+ JSocket::mInstance = new JSocket();
+ JSocket * s = JSocket::mInstance;
+ if (JNetwork::serverIP.size()){
+ s->start_client(JNetwork::serverIP.c_str());
+
+ }else{
+ // connected, get my IPADDR and run test
+ SceNetApctlInfo szMyIPAddr;
+ if (sceNetApctlGetInfo(8, &szMyIPAddr) != 0){
+ }else{
+ s->start_server(szMyIPAddr.ip);
+ }
+
+ }
+ }
+ while(0);
+
+ return 0;
+}
+
+
+int JNetwork::connect(string serverIP){
+ int err;
+ if(netthread) return 0;
+ if((err = pspSdkInetInit())){
+ printf("JGE Error, could not initialise the network %08X\n", err);
+ return err;
+ }
+
+ if(JNetwork::connect_to_apctl(1)){
+ JNetwork::serverIP = serverIP;
+ /* Create a user thread to do the real work */
+ netthread = sceKernelCreateThread("net_thread", net_thread, 0x18, 0x10000, PSP_THREAD_ATTR_USER, NULL);
+
+ if(netthread < 0)
+ {
+ printf("Error, could not create thread\n");
+ sceKernelSleepThread();
+ }
+
+ sceKernelStartThread(netthread, 0, NULL);
+ return netthread;
+ }
+
+ return 0;
+}
+
+
+/* Connect to an access point */
+int JNetwork::connect_to_apctl(int config)
+{
+ int err;
+ int stateLast = -1;
+
+ /* Connect using the first profile */
+ err = sceNetApctlConnect(config);
+ if (err != 0)
+ {
+ printf("JGE: sceNetApctlConnect returns %08X\n", err);
+ return 0;
+ }
+
+ printf("JGE: Connecting...\n");
+ while (1)
+ {
+ int state;
+ err = sceNetApctlGetState(&state);
+ if (err != 0)
+ {
+ printf("JGE: sceNetApctlGetState returns $%x\n", err);
+ break;
+ }
+ if (state > stateLast)
+ {
+ printf(" connection state %d of 4\n", state);
+ stateLast = state;
+ }
+ if (state == 4){
+ connected_to_ap = 1;
+ break; // connected with static IP
+ }
+ // wait a little before polling again
+ sceKernelDelayThread(50*1000); // 50ms
+ }
+ printf("JGE: Connected!\n");
+
+ if(err != 0)
+ {
+ return 0;
+ }
+
+ return 1;
+}
+#endif
\ No newline at end of file
diff --git a/JGE/src/JSocket.cpp b/JGE/src/JSocket.cpp
new file mode 100644
index 000000000..e6ffcd437
--- /dev/null
+++ b/JGE/src/JSocket.cpp
@@ -0,0 +1,211 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "../include/JGE.h"
+
+#include "../include/JSocket.h"
+JSocket * JSocket::mInstance = NULL;
+
+#define SERVER_PORT 20666
+
+void JSocket::init(){
+ sceUtilityLoadNetModule(1);
+ sceUtilityLoadNetModule(3);
+}
+
+JSocket::JSocket(){
+ init();
+}
+
+JSocket::~JSocket(){
+ pspSdkInetTerm();
+ sceNetApctlDisconnect();
+ sceNetApctlTerm();
+}
+
+
+int JSocket::make_socket(uint16_t port)
+{
+ int sock;
+ int ret;
+ struct sockaddr_in name;
+
+ sock = socket(PF_INET, SOCK_STREAM, 0);
+ if(sock < 0)
+ {
+ return -1;
+ }
+
+ name.sin_family = AF_INET;
+ name.sin_port = htons(port);
+ name.sin_addr.s_addr = htonl(INADDR_ANY);
+ ret = bind(sock, (struct sockaddr *) &name, sizeof(name));
+ if(ret < 0)
+ {
+ return -1;
+ }
+
+ return sock;
+}
+
+
+void JSocket::readWrite(int val){
+ char data[1024];
+ int readbytes;
+ readbytes = read(val, data, sizeof(data));
+ if(readbytes < 0)
+ {
+ printf("Socket %d closed\n", val);
+ close(val);
+ }
+ else
+ {
+ for (int i = 0; i < readbytes; i++){
+ received_data.push(data[i]);
+ }
+ }
+
+ //Write
+ unsigned int size = 0;
+ while(!tosend_data.empty()){
+ size++;
+ if (size > sizeof(data)){
+ write(val,data,sizeof(data));
+ size = 0;
+ }
+ data[size-1] = tosend_data.front();
+ tosend_data.pop();
+ }
+ if (size) write(val,data,size);
+}
+
+/* Start a client */
+int JSocket::start_client(const char *szIpAddr){
+ int sock;
+ sockaddr_in addrListen;
+ int error;
+
+ sock = sceNetInetSocket(AF_INET, SOCK_STREAM, 0);
+ if (sock <= 0){
+ printf("socket returned $%x\n", sock);
+ sceKernelDelayThread(500*1000);
+ return sock;
+ }
+
+ addrListen.sin_family = AF_INET;
+ addrListen.sin_addr.s_addr = inet_addr(szIpAddr);
+ addrListen.sin_port = htons(SERVER_PORT);
+
+ int err = sceNetInetConnect(sock, (sockaddr *)&addrListen, sizeof(addrListen));
+ if (err != 0){
+ printf("Unable to connect!\n");
+ printf("connect returned $%x\n", err);
+ printf(" errno=$%x\n", sceNetInetGetErrno());
+ sceKernelDelayThread(500*1000);
+ return err;
+ }
+
+ while(1){
+ readWrite(sock);
+ }
+ return 0;
+}
+
+/* Start a server */
+int JSocket::start_server(const char *szIpAddr)
+{
+ int ret;
+ int sock;
+ int _new = -1;
+ struct sockaddr_in client;
+ size_t size;
+ int readbytes;
+
+ fd_set set;
+ fd_set setsave;
+
+ /* Create a socket for listening */
+ sock = make_socket(SERVER_PORT);
+ if(sock < 0)
+ {
+ printf("Error creating server socket\n");
+ return sock;
+ }
+
+ ret = listen(sock, 1);
+ if(ret < 0)
+ {
+ printf("Error calling listen\n");
+ return ret;
+ }
+
+ printf("Listening for connections ip %s port %d\n", szIpAddr, SERVER_PORT);
+
+ FD_ZERO(&set);
+ FD_SET(sock, &set);
+ setsave = set;
+
+ while(1)
+ {
+ int i;
+ set = setsave;
+ if(select(FD_SETSIZE, &set, NULL, NULL, NULL) < 0)
+ {
+ printf("select error\n");
+ return -1;
+ }
+
+ for(i = 0; i < FD_SETSIZE; i++)
+ {
+ if(FD_ISSET(i, &set))
+ {
+ int val = i;
+
+ if(val == sock)
+ {
+ _new = accept(sock, (struct sockaddr *) &client, &size);
+ if(_new < 0)
+ {
+ printf("Error in accept %s\n", strerror(errno));
+ close(sock);
+ return _new;
+ }
+
+ printf("New connection %d from %s:%d\n", val,
+ inet_ntoa(client.sin_addr),
+ ntohs(client.sin_port));
+
+ write(_new, "123567", strlen("123567"));
+
+ FD_SET(_new, &setsave);
+ }
+ else
+ {
+ readWrite(val);
+ }
+ }
+ }
+ }
+
+ close(sock);
+ return 0;
+}
+
+
+
+
+
diff --git a/JGE/src/win/JSocket_Win.cpp b/JGE/src/win/JSocket_Win.cpp
new file mode 100644
index 000000000..ce5cd8c8e
--- /dev/null
+++ b/JGE/src/win/JSocket_Win.cpp
@@ -0,0 +1,230 @@
+#pragma comment(lib,"WSOCK32.LIB")
+#include
+#include
+#include
+#include
+#include
+
+#include "../../include/JSocket.h"
+JSocket * JSocket::mInstance = NULL;
+
+#define SERVER_PORT 20666
+unsigned char ADRESSE_IP_SERVEUR [4] = {127,0,0,1};
+
+
+int JSocket::connected = 0;
+
+void JSocket::init(){
+ //TODO ?
+}
+
+JSocket::JSocket(){
+ init();
+}
+
+JSocket::~JSocket(){
+ //TODO ?
+}
+
+
+void JSocket::readWrite(int val){
+ char data[1024];
+
+ fd_set set;
+ FD_ZERO(&set);
+ FD_SET(val, &set);
+ struct timeval tv;
+ int result = select(0, &set, NULL, NULL, &tv);
+ if( result< 0)
+ {
+ printf("Socket %d closed\n", val);
+ closesocket(val);
+ connected= 0;
+ printf("select error\n");
+ return;
+ }
+
+ if (result > 0){
+ OutputDebugString("Receiving!\n");
+ int readbytes = recv(val, data, sizeof(data),0);
+ if(readbytes < 0)
+ {
+ int error = WSAGetLastError();
+ if (error != WSAEWOULDBLOCK){
+ printf("Socket %d closed\n", val);
+ closesocket(val);
+ connected= 0;
+ }
+ }
+ else
+ {
+ OutputDebugString("received Data!!!\n");
+ for (int i = 0; i < readbytes; i++){
+ received_data.push(data[i]);
+ OutputDebugString("getting byte\n");
+ }
+ }
+ }
+
+ //Write
+ int size = 0;
+ while(!tosend_data.empty()){
+ size++;
+ if (size > sizeof(data)){
+ send(val,data,sizeof(data),0);
+ size = 0;
+ }
+ data[size-1] = tosend_data.front();
+ tosend_data.pop();
+ }
+ if (size) {
+ send(val,data,size-1,0);
+ OutputDebugString("sending Data\n");
+ }
+}
+
+/* Start a client */
+int JSocket::start_client(const char *szIpAddr){
+ SOCKET Desc_Socket_Cliente;
+ SOCKADDR_IN Adresse_Socket_Serveur;
+ WORD wVersionRequested;
+ WSADATA wsaData;
+
+ struct hostent *hostentptr;
+
+ wVersionRequested=MAKEWORD(1,1);
+ WSAStartup(wVersionRequested,&wsaData);
+
+ Desc_Socket_Cliente=socket(AF_INET,SOCK_STREAM,0);
+ unsigned int addr_dest = inet_addr(szIpAddr);
+ hostentptr=gethostbyaddr((char*) &addr_dest,4,AF_INET);
+
+ ZeroMemory(&Adresse_Socket_Serveur,sizeof(Adresse_Socket_Serveur));
+
+ Adresse_Socket_Serveur.sin_family=(*hostentptr).h_addrtype;
+ Adresse_Socket_Serveur.sin_port=htons(SERVER_PORT);
+ Adresse_Socket_Serveur.sin_addr=*((struct in_addr*)(*hostentptr).h_addr);
+
+ int result = connect(
+ Desc_Socket_Cliente,
+ (const struct sockaddr*)&Adresse_Socket_Serveur,
+ sizeof(Adresse_Socket_Serveur));
+
+OutputDebugString("client state 0\n");
+
+ if (result != 0){
+ connected = 0;
+ return 0;
+ }
+
+OutputDebugString("client state 1\n");
+
+
+ connected = 1;
+
+while(1){
+ readWrite(Desc_Socket_Cliente);
+/* Nb_Caracteres_Recus=recv(Desc_Socket_Cliente,Message_Recu,sizeof(Message_Recu),0);
+ if(Nb_Caracteres_Recus<=0){
+ //continuer=FALSE;
+ }else{
+ strcpy(message,Message_Recu);
+ len=strlen(message);
+ }
+ */
+}
+#
+closesocket(Desc_Socket_Cliente);
+WSACleanup();
+return 0;
+}
+
+/* Start a server */
+int JSocket::start_server(const char *szIpAddr){
+ OutputDebugString("server state 0\n");
+ connected= 0;
+ int Code_Retour;
+ SOCKET Desc_Socket_Connection;
+ SOCKADDR_IN Adresse_Socket_Connection;
+ WORD wVersionRequested;
+ WSADATA wsaData;
+
+ wVersionRequested=MAKEWORD(1,1);
+
+ Code_Retour=WSAStartup(wVersionRequested,&wsaData);
+
+ if(Code_Retour!=0){
+ perror("WSAStartup\t");
+ _getch();
+ WSACleanup();
+ return Code_Retour;
+ }
+ OutputDebugString("server state 1\n");
+/* printf("la version supportee est : %d.%d\n",
+LOBYTE(wsaData.wHighVersion),
+HIBYTE(wsaData.wHighVersion)
+);*/
+
+ Desc_Socket_Connection=socket( AF_INET, SOCK_STREAM,0);
+
+//printf("valeur de la socket = %d\n",Desc_Socket_Connection);
+
+ ZeroMemory(&Adresse_Socket_Connection,sizeof(Adresse_Socket_Connection));
+ Adresse_Socket_Connection.sin_family=AF_INET;
+ Adresse_Socket_Connection.sin_port=htons(SERVER_PORT);
+
+ Code_Retour=bind(Desc_Socket_Connection,
+ (struct sockaddr*)&Adresse_Socket_Connection,
+ sizeof(Adresse_Socket_Connection));
+
+
+
+ if(Code_Retour!=0){
+ perror("bind\t");
+ _getch();
+ closesocket(Desc_Socket_Connection);
+ WSACleanup();
+ return Code_Retour;
+ }
+ OutputDebugString("server state 3\n");
+
+ Code_Retour=listen(Desc_Socket_Connection,1);
+ if(Code_Retour!=0){
+ perror("listen\n");
+ WSACleanup();
+ return Code_Retour;
+ }
+ OutputDebugString("server state 4\n");
+ printf("serveur en attente d'une connection\n\n");
+ printf("***************arret du serveur par**************\n\n");
+ connected = 1;
+ while(1){
+ SOCKET * pt_Nouveau_Socket_Serveur;
+ SOCKADDR_IN Adresse_Socket_Cliente;
+ int Longueur_Adresse;
+
+ pt_Nouveau_Socket_Serveur = new SOCKET;
+
+ Longueur_Adresse = sizeof(Adresse_Socket_Cliente);
+
+ int val=accept(
+ Desc_Socket_Connection,
+ (struct sockaddr*)&Adresse_Socket_Cliente,
+ &Longueur_Adresse);
+ printf("connection accepte depuis le port client %d\n", ntohs(Adresse_Socket_Cliente.sin_port));
+ OutputDebugString("connection accepte depuis le port client\n");
+
+
+ while(1)
+ {
+ readWrite(val);
+ }
+ closesocket(*pt_Nouveau_Socket_Serveur);
+ return 0;
+ }
+}
+
+
+
+
+