123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- /** (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),"®v=%d",g_regver);
- }
- // MessageBox(NULL,s,"metric",0);
- CloseHandle(CreateThread(NULL,0,_Thread,(LPVOID)s,0,&id));
- }
- }
- #endif
|