/** (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