diff --git a/zsnes/src/win/zfilew.c b/zsnes/src/win/zfilew.c index 0bce8f5a..0254b81e 100644 --- a/zsnes/src/win/zfilew.c +++ b/zsnes/src/win/zfilew.c @@ -15,6 +15,18 @@ //along with this program; if not, write to the Free Software //Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Enable use of network loaded games with zsnes:// file names +#define CCBETA + +// Enable debug of network loaded games +//#define CCDEBUG + +#ifdef CCBETA +#include +#include +#include +#include "resource.h" +#endif #include #include @@ -24,12 +36,65 @@ #include #include + +#ifdef CCDEBUG +FILE * ZFILELog = NULL; + +void ZLog_Message (char *Message, ...) +{ + char Msg[400]; + va_list ap; + + va_start(ap,Message); + vsprintf(Msg,Message,ap ); + va_end(ap); + + strcat(Msg,"\r\n\0"); + fwrite(Msg,strlen(Msg),1,ZFILELog); + fflush(ZFILELog); +} + + +void ZStart_Log (void) +{ + char LogFileName[255]; +// [4/15/2001] char *p; + + strcpy(LogFileName,"zfile.log\0"); + + ZFILELog = fopen(LogFileName,"wb"); +} + +void ZStop_Log(void) +{ + if(ZFILELog) + { + fclose(ZFILELog); + ZFILELog=NULL; + } +} + +#else +#define ZLog_Message() +#define ZStart_Log() +#define ZStop_Log() +#endif + + #define DWORD unsigned int #define BYTE unsigned char + FILE *FILEHANDLE[16]; DWORD CurrentHandle=0; +#ifdef CCBETA +int FILETYPE[16]; // 0 = normal file 1 = network file +int FILESIZE[16]; // 0 = normal file else network size +char * FILEDATA[16]; // 0 = normal file else network data +int FILECURPOS[16]; // network currrent position +#endif + //Indicate whether the file must be opened using //zlib or not (used for gzip support) BYTE TextFile; @@ -90,8 +155,361 @@ BYTE * ZFileDelFName; // return current position +#ifdef CCBETA + +/* Additional code to handle remote roms */ + +SOCKET gameServerSocket; /* tcp socket for the game Server */ +SOCKADDR_IN gameServerAddress; /* address of the game server */ + +int InitTCPFile() +{ + char blah[255]; + WORD versionneeded = MAKEWORD(2,2); + WSADATA wsadata; + + /* Startup winsock */ + WSAStartup(versionneeded, &wsadata); + + /* Verify version number and exit on wrong version */ + if (wsadata.wVersion != versionneeded) + { + return(-1); + } + gameServerSocket=INVALID_SOCKET; + return(0); +} + +int ConnectGameServer(char *servername, unsigned int port) +{ + char blah[255]; + int retval,i; + LPHOSTENT host1; + unsigned long addr1; + int yesip; + WSADATA wsadata; + int timeout=1000; + + host1 = gethostbyname(servername); + if (host1 == NULL) + { + return(-1); + } + + gameServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if(gameServerSocket == INVALID_SOCKET) + { + return(-2); + } + + /* initialize server address */ + gameServerAddress.sin_family = AF_INET; + gameServerAddress.sin_addr = *( (LPIN_ADDR) *host1->h_addr_list ); + gameServerAddress.sin_port = htons((unsigned short)port); + + retval = connect( gameServerSocket, + (LPSOCKADDR)&gameServerAddress, + sizeof(struct sockaddr)); + if (retval == SOCKET_ERROR) + { + sprintf(blah,"Could not connect to other side"); + MessageBox(NULL,blah, + "Error", + MB_SYSTEMMODAL|MB_OK); + closesocket(gameServerSocket); + return(-3); + } + + setsockopt(gameServerSocket,SOL_SOCKET,SO_RCVTIMEO, + &timeout,sizeof(timeout)); + return 0; +} + +sendCommand(char *dptr, int dsize) +{ + int retval,i; + retval = send(gameServerSocket,dptr,dsize,0); + if (retval == SOCKET_ERROR) + { + closesocket(gameServerSocket); + return(-1); + } + return(0); +} + +receiveData(char *dptr, int dsize) +{ + int retval; + /* get data with the socket */ + retval = recv(gameServerSocket,dptr,dsize,0); + if (retval == SOCKET_ERROR) + { + closesocket(gameServerSocket); + return(-1); + } + return(retval); +} + + +int checkconnection=0; + +extern char fname[512]; + +void CCExit(void) +{ + char temp[512]; + if(checkconnection) + { + ZLog_Message("Disconnecting from server"); + checkconnection=0; +// sprintf(temp,"cl"); +// sendCommand(temp,strlen(temp)); +// receiveData(temp,512); + closesocket(gameServerSocket); + return; + } +} + +extern char romloadskip; +extern unsigned int pressed; + +// Function given by Jereth +LPTHREAD_START_ROUTINE MonitorThreadProc(SOCKET s) +{ + unsigned char * keys; + + unsigned int clockstart; + unsigned int clocknow; + char temp[512]; + char error[255]; + int destruct = 10; + char sec[] = " seconds"; + fd_set socketTest; + struct timeval timeOut = {0,0}; + FD_ZERO(&socketTest); + FD_SET(s,&socketTest); + ZLog_Message("Starting monitor thread"); + for(;;) + { + if(checkconnection) + { + if(!strstr(&fname[1],"zsnes://")) + { + ZLog_Message("Disconnecting from server"); + checkconnection=0; +// sprintf(temp,"cl"); +// sendCommand(temp,strlen(temp)); +// receiveData(temp,512); + closesocket(gameServerSocket); + return 0; + } + sprintf(temp,"hi"); + sendCommand(temp,strlen(temp)); + receiveData(temp,512); + if(!strstr(temp,"ok")) + { + HMODULE hModule = GetModuleHandle(NULL); + HWND hwndNCD; + if(destruct>0) + hwndNCD = CreateDialog(hModule, MAKEINTRESOURCE + (IDD_NO_CONNECT), NULL, NULL); + while(destruct > 0) + { + if (destruct == 10) + clockstart = timeGetTime(); + + if (destruct == 1) + { + sec[7] = 0; + } + + wsprintf(error, "This message will self-destruct in %d%s%s", destruct, sec, "."); + SetDlgItemText(hwndNCD, IDC_DESTRUCT,error); + clocknow = timeGetTime(); + while(clocknow < (clockstart+1000)) + { + clocknow = timeGetTime(); + } + clockstart+=1000; + destruct--; + } + + DestroyWindow(hwndNCD); + + keys = (unsigned char *)&pressed; + keys[1]=1; + romloadskip=1; + } + Sleep(1000); + } + } + return 0; +} + + +DWORD ThreadId; +HANDLE theMonitor; + + +OpenConnection(char *User, char *Password, char *FileName) +{ + HWND hwndNCD; + char temp[513]; + int cur=0; + HMODULE hModule = GetModuleHandle(NULL); + + ZLog_Message("Need to open %s",FileName); + + ZLog_Message("Starting winsock"); + if(InitTCPFile()!=0) + { +// printf("Winsock version 2.2 is needed\n"); + return(0); + } + + ZLog_Message("Connection to server"); + + if(ConnectGameServer("www.consoleclassix.com",11001)<0) + { +// printf("Error connecting to the game server\n"); + return(0); + } + + ZLog_Message("Sending user name"); + + sprintf(temp,"%s",User); + sendCommand(temp,strlen(temp)); + receiveData(temp,512); + + if(!strstr(temp,"ok")) return 0; + + ZLog_Message("Sending password"); + + sprintf(temp,"%s",Password); + sendCommand(temp,strlen(temp)); + receiveData(temp,512); + + if(!strstr(temp,"ok")) + { + ZLog_Message("Sending user name"); + + sprintf(temp,"%s",User); + sendCommand(temp,strlen(temp)); + receiveData(temp,512); + + if(!strstr(temp,"ok")) return 0; + + ZLog_Message("Sending password"); + + sprintf(temp,"%s",Password); + sendCommand(temp,strlen(temp)); + receiveData(temp,512); + if(!strstr(temp,"ok")) return 0; + } + + ZLog_Message("Sending IP"); + + sprintf(temp,"255.255.255.255"); + sendCommand(temp,strlen(temp)); + receiveData(temp,512); + + ZLog_Message("Sending op"); + + sprintf(temp,"op"); + sendCommand(temp,strlen(temp)+1); + receiveData(temp,512); + + ZLog_Message("Sending file name: %s",FileName); + + sprintf(temp,"%s",FileName); + sendCommand(temp,strlen(temp)); + receiveData(temp,512); + + ZLog_Message("Sending ok reply"); + + sprintf(temp,"ok"); + sendCommand(temp,strlen(temp)); + receiveData(temp,512); + + sscanf(temp,"%d",&FILESIZE[CurrentHandle]); + + FILEDATA[CurrentHandle]=(char *) malloc(FILESIZE[CurrentHandle]); + FILECURPOS[CurrentHandle]=0; + sprintf(temp,"ok"); + sendCommand(temp,strlen(temp)); + + ZLog_Message("Reading file"); + + hwndNCD = CreateDialog(hModule, MAKEINTRESOURCE + (IDD_LOADING), NULL, NULL); + + + + while(cur512) return 0xFFFFFFFF; + for(i=0;i512) return 0xFFFFFFFF; + for(i=0;i512) return 0xFFFFFFFF; + for(i=0;i512) return 0xFFFFFFFF; + for(i=0;i=FILESIZE[ZFileReadHandle]) return 0; + if((FILECURPOS[ZFileReadHandle]+ZFileReadSize)>FILESIZE[ZFileReadHandle]) + { + ZFileReadSize=FILESIZE[ZFileReadHandle]-FILECURPOS[ZFileReadHandle]; + } + ZLog_Message("Copying len:%d",ZFileReadSize); + + memcpy(ZFileReadBlock,FILEDATA[ZFileReadHandle]+FILECURPOS[ZFileReadHandle], + ZFileReadSize); + FILECURPOS[ZFileReadHandle]+=ZFileReadSize; + + ZLog_Message("File read done"); + + return ZFileReadSize; + } + else + { +#endif + if (TextFile) + return(fread(ZFileReadBlock, + 1, + ZFileReadSize, + FILEHANDLE[ZFileReadHandle])); + else + return(gzread(FILEHANDLE[ZFileReadHandle], + ZFileReadBlock, + ZFileReadSize)); +#ifdef CCBETA + } +#endif } DWORD ZFileWrite() { - int res=0; - if (TextFile) - res = fwrite(ZFileWriteBlock, - 1, - ZFileWriteSize, - FILEHANDLE[ZFileWriteHandle]); - else - res = gzwrite(FILEHANDLE[ZFileWriteHandle], - ZFileWriteBlock, - ZFileWriteSize); - - if (res!=ZFileWriteSize) - return(0xFFFFFFFF); +#ifdef CCBETA + ZLog_Message("ZFileWrite %d",ZFileWriteHandle); + if(FILETYPE[ZFileWriteHandle]==1) + { + } + else + { +#endif + int res=0; + if (TextFile) + res = fwrite(ZFileWriteBlock, + 1, + ZFileWriteSize, + FILEHANDLE[ZFileWriteHandle]); + else + res = gzwrite(FILEHANDLE[ZFileWriteHandle], + ZFileWriteBlock, + ZFileWriteSize); + + if (res!=ZFileWriteSize) + return(0xFFFFFFFF); +#ifdef CCBETA + } +#endif return(0); } DWORD ZFileTell() { - int res = 0; - if (TextFile) { - res = ftell(FILEHANDLE[ZFileTellHandle]); - if (res == -1) fprintf(stderr, "Oups!! gzTell\n"); - return(res); - } else return gztell(FILEHANDLE[ZFileTellHandle]); +#ifdef CCBETA + ZLog_Message("ZFileTell %d",ZFileTellHandle); + + if(FILETYPE[ZFileTellHandle]==1) + { + return(FILECURPOS[ZFileTellHandle]); + } + else + { +#endif + int res = 0; + if (TextFile) { + res = ftell(FILEHANDLE[ZFileTellHandle]); + if (res == -1) fprintf(stderr, "Oups!! gzTell\n"); + return(res); + } else return gztell(FILEHANDLE[ZFileTellHandle]); +#ifdef CCBETA + } +#endif } diff --git a/zsnes/src/win/zsnes.rc b/zsnes/src/win/zsnes.rc index 54f989d4..19fefb5a 100644 --- a/zsnes/src/win/zsnes.rc +++ b/zsnes/src/win/zsnes.rc @@ -1 +1,143 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. IDR_MAINFRAME ICON DISCARDABLE "ZSNES.ICO" + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_NO_CONNECT DIALOG DISCARDABLE 0, 0, 197, 49 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Connection Broken" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "You must maintain internet connection to use Console Classix.", + IDC_STATIC,7,9,183,8 + CTEXT "",IDC_DESTRUCT,7,31,183,8 + LTEXT "Please check your connection and try again.",IDC_STATIC, + 32,20,132,8 +END + +IDD_LOADING DIALOG DISCARDABLE 0, 0, 190, 57 +STYLE DS_SYSMODAL | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Loading the game from the server.",IDC_STATIC,41,3,107, + 8 + CTEXT "",IDC_PARTDONE,25,34,141,8 + LTEXT "Please wait.",IDC_STATIC,76,12,38,8 + CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,28,21,135,10 +END + +IDD_USERPASS DIALOG DISCARDABLE 0, 0, 186, 95 +STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION +CAPTION "User information" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,68,74,50,14 + LTEXT "User :",IDC_USER,48,27,20,8 + LTEXT "Pass :",IDC_PASS,48,52,20,8 + EDITTEXT IDC_EDITUSER,79,21,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDITPASS,79,46,40,14,ES_PASSWORD | ES_AUTOHSCROLL +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_LOADING, DIALOG + BEGIN + BOTTOMMARGIN, 55 + END + + IDD_USERPASS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 179 + VERTGUIDE, 48 + VERTGUIDE, 79 + TOPMARGIN, 7 + BOTTOMMARGIN, 88 + HORZGUIDE, 35 + HORZGUIDE, 60 + END +END +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED +