aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/verchk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Winamp/verchk.cpp')
-rw-r--r--Src/Winamp/verchk.cpp285
1 files changed, 285 insertions, 0 deletions
diff --git a/Src/Winamp/verchk.cpp b/Src/Winamp/verchk.cpp
new file mode 100644
index 00000000..fee83d96
--- /dev/null
+++ b/Src/Winamp/verchk.cpp
@@ -0,0 +1,285 @@
+/** (c) Nullsoft, Inc. C O N F I D E N T I A L
+ ** Filename:
+ ** Project:
+ ** Description:
+ ** Author:
+ ** Created:
+ **/
+
+#include "Main.h"
+#if 0
+static int (__stdcall *p_recv)(SOCKET s, char FAR* buf, int len, int flags);
+
+
+static int g_nvck;
+
+static int recv_string(SOCKET s, char *str, int maxlen)
+{
+ int p=0;
+ do
+ {
+ int t=0;
+ while (t!=1)
+ {
+ t=p_recv(s,str+p,1,0);
+ if (t != 1)
+ {
+ str[0]=0;
+ return -1;
+ }
+ if (str[p] == '\r') t=0;
+ }
+ } while (str[p] != '\n' && ++p < maxlen-1);
+ str[p--]=0;
+ while (str[p] == '\n' && p > 0)
+ {
+ str[p--]=0;
+ }
+ if (p < 0) p = 0;
+ return p;
+}
+
+
+static DWORD WINAPI _Thread(void *p666)
+{
+ char *rf_url = (char *)p666;
+ HINSTANCE hws = LoadLibrary("wsock32.dll");
+ SOCKET sock;
+ char *proxy;
+ char connect_host[MAX_PATH];
+ unsigned short connect_port;
+ int success=0;
+ int (__stdcall *select)(int nfds,fd_set FAR * readfds,fd_set FAR * writefds,fd_set FAR * exceptfds,const struct timeval FAR * timeout);
+ int (__stdcall *WSAGetLastError)(void);
+ int (__stdcall *WSACleanup)(void);
+ int (__stdcall *WSAStartup)(WORD wVersionRequested,LPWSADATA lpWSAData);
+ int (__stdcall *closesocket)(SOCKET s);
+ int (__stdcall *send)(SOCKET s,const char FAR *buf,int len,int flags);
+ SOCKET (__stdcall *socket)(int af, int type,int protocol);
+ int (__stdcall *connect)( SOCKET s, const struct sockaddr FAR *name, int namelen );
+
+ unsigned long (__stdcall *inet_addr)(const char FAR *cp );
+ struct hostent FAR * (__stdcall *gethostbyname)(const char FAR *name);
+ int (__stdcall *ioctlsocket)(SOCKET s,long cmd,u_long FAR *argp);
+ u_short (__stdcall *htons)(u_short hostshort);
+
+ if (hws)
+ {
+ WSAGetLastError=(void*)GetProcAddress(hws,"WSAGetLastError");
+ WSACleanup=(void*)GetProcAddress(hws,"WSACleanup");
+ WSAStartup=(void*)GetProcAddress(hws,"WSAStartup");
+ closesocket=(void*)GetProcAddress(hws,"closesocket");
+ send=(void*)GetProcAddress(hws,"send");
+ p_recv=(void*)GetProcAddress(hws,"recv");
+ select=(void*)GetProcAddress(hws,"select");
+ connect=(void*)GetProcAddress(hws,"connect");
+ socket=(void*)GetProcAddress(hws,"socket");
+ inet_addr=(void*)GetProcAddress(hws,"inet_addr");
+ gethostbyname=(void*)GetProcAddress(hws,"gethostbyname");
+ ioctlsocket=(void*)GetProcAddress(hws,"ioctlsocket");
+ htons=(void*)GetProcAddress(hws,"htons");
+ }
+
+ if (!hws || !p_recv || !WSACleanup ||
+ !WSAStartup || !closesocket || !send ||
+ !connect || !socket || !inet_addr ||
+ !gethostbyname || !ioctlsocket || !htons || !select || !WSAGetLastError)
+ {
+ if (hws) FreeLibrary(hws);
+ return 0;
+ }
+
+ {
+ WSADATA wsaData;
+ if (WSAStartup(MAKEWORD(1, 1), &wsaData))
+ {
+ FreeLibrary(hws);
+ return 0;
+ }
+ }
+
+ // determine if proxy server used
+ proxy=config_proxy;
+ while (*proxy == ' ' || *proxy == '\t') proxy++;
+
+ if (*proxy)
+ {
+ lstrcpyn(connect_host,proxy,sizeof(connect_host)/sizeof(*connect_host));
+ }
+ else
+ {
+ lstrcpyn(connect_host,"www.winamp.com",sizeof(connect_host)/sizeof(*connect_host));
+ }
+ connect_port=80;
+
+
+ if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET)
+ {
+ WSACleanup();
+ FreeLibrary(hws);
+ return 0;
+ }
+
+ {
+ int t;
+ struct sockaddr_in blah;
+ struct hostent *he;
+ memset((char *)&blah,0,sizeof(blah));
+ blah.sin_family=AF_INET;
+ blah.sin_addr.s_addr=inet_addr(connect_host);
+ blah.sin_port=htons(connect_port);
+
+ if (blah.sin_addr.s_addr == INADDR_NONE)
+ {
+ if ((he = gethostbyname(connect_host)) != NULL)
+ memcpy((char *)&blah.sin_addr, he->h_addr, he->h_length);
+ else if ((blah.sin_addr.s_addr = inet_addr(connect_host))==INADDR_NONE)
+ {
+ closesocket(sock);
+ WSACleanup();
+ FreeLibrary(hws);
+ return 0;
+ }
+ }
+ t=connect(sock,(struct sockaddr *)&blah,16);
+ if (t==-1) goto cleanup;
+ }
+ {
+ char send_string[2048];
+ char request_file[1024];
+ StringCchCopy(send_string,2048,rf_url);
+ if (*proxy)
+ {
+ StringCchPrintf(request_file,1024, "http://www.winamp.com%s",rf_url);
+ }
+ else StringCchCopy(request_file,1024,rf_url);
+ StringCchPrintf(send_string,2048,"GET %s HTTP/1.0\r\n"
+ "User-Agent: Winamp/%s\r\n"
+ "Host: www.winamp.com\r\n"
+ "Accept: */*\r\n\r\n",request_file,app_version);
+// MessageBox(NULL,send_string,"SENDING:",0);
+ send(sock,send_string,lstrlen(send_string),0);
+ }
+
+ { // get the standard HTTP 1.0 200 OK
+ char buf[1024];
+ int x = recv_string(sock,buf,sizeof(buf));
+// MessageBox(NULL,buf,buf,0);
+ if (x < 0 || !strstr(buf,"OK")) goto cleanup;
+ }
+
+ if (g_nvck&2) stats_clear();
+ while (1)
+ {
+ char buf[1024],*p;
+ int x = recv_string(sock,buf,sizeof(buf));
+ if (x < 0) goto cleanup;
+ if (buf[0] == '\r' || !buf[0]) break;
+
+ {
+ p=buf;
+ while (*p && *p != ':') p++;
+ if (*p == ':')
+ {
+ *p++=0;
+ while (*p == ' ' || *p == '\t') p++;
+ }
+ else p=NULL;
+ }
+ }
+
+ {
+ int is_upd=0;
+ char obuf[32768]="";
+ char buf[1024];
+ int x = recv_string(sock,buf,sizeof(buf));
+ if (x < 0 || buf[1] != '.') goto cleanup;
+ if (buf[0] > app_version[0]) is_upd=1;
+ else if (buf[0] == app_version[0])
+ {
+ int r2;
+ char oldver[4];
+ int oldlen;
+ oldlen = lstrlen(app_version+2);
+ if ( oldlen == 3 )
+ {
+ oldver[0]=*(app_version+2);
+ oldver[1]=*(app_version+3);
+ oldver[2]=*(app_version+4);
+ }
+ if ( oldlen == 2 )
+ {
+ oldver[0]=*(app_version+2);
+ oldver[1]=*(app_version+3);
+ oldver[2]='0';
+ }
+ if ( oldlen == 1 )
+ {
+ oldver[0]=*(app_version+2);
+ oldver[1]='0';
+ oldver[2]='0';
+ }
+ oldver[3]=0;
+ r2=atoi(oldver);
+ if (atoi(buf+2)>r2) is_upd=1;
+ }
+
+ if (!is_upd)
+ {
+ if ((g_nvck&1)&&config_newverchk) config_newverchk=getDay();
+ goto cleanup;
+ }
+ while (lstrlen(obuf)<32768-sizeof(buf)*2)
+ {
+ x=recv_string(sock,buf,sizeof(buf));
+ if (x < 0) break;
+ StringCchCat(obuf,32768,buf);
+ StringCchCat(obuf,32768,"\r\n");
+ }
+ if (g_nvck&1)
+ {
+ if (MessageBox(NULL,obuf,getString(IDS_WINAMP_UPDATE_MSG,NULL,0),MB_YESNO) == IDYES)
+ {
+ myOpenURL(NULL, L"http://www.winamp.com/getwinamp/");
+ }
+ else
+ {
+ if ((g_nvck&1)&&config_newverchk) config_newverchk=getDay();
+ }
+ }
+ }
+cleanup:
+ closesocket(sock);
+ WSACleanup();
+ FreeLibrary(hws);
+ return 0;
+}
+
+void newversioncheck(void)
+{
+ DWORD id;
+ static char s[512];
+ int stats[NUM_STATS]={0,};
+ int x;
+ g_nvck=(config_newverchk2?2:0)|(config_newverchk?1:0);
+ if (g_nvck&3)
+ {
+ StringCchPrintf(s,512,"/update/latest-version.jhtml?v=%s",app_version);
+ if (g_nvck&2)
+ {
+ stats_get(stats);
+ StringCchCat(s,512,"&ID=");
+ stats_getuidstr(s+lstrlen(s));
+ for (x = 0; x < NUM_STATS; x ++)
+ {
+ StringCchPrintf(s+lstrlen(s),512-lstrlen(s),"&st%d=%d",x+1,stats[x]);
+ }
+ StringCchPrintf(s+lstrlen(s),512-lstrlen(s),"&regv=%d",g_regver);
+ }
+
+ // MessageBox(NULL,s,"metric",0);
+ CloseHandle(CreateThread(NULL,0,_Thread,(LPVOID)s,0,&id));
+ }
+}
+
+#endif