123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- /** (c) Nullsoft, Inc. C O N F I D E N T I A L
- ** Filename:
- ** Project:
- ** Description:
- ** Author: Ben Allison [email protected]
- ** Created:
- **/
- #include "Main.h"
- #include "resource.h"
- #include "api.h"
- #include "language.h"
- #include "..\Components\wac_network\wac_network_http_receiver_api.h"
- #include "api/service/waServiceFactory.h"
- #include "Browser.h"
- #include "../nu/AutoUrl.h"
- #include "../nu/threadname.h"
- #include "stats.h"
- #include "../nu/threadpool/TimerHandle.hpp"
- #include "../WAT/WAT.h"
- extern UpdateBrowser *updateBrowser;
- class VersionCheckCallback : public ifc_downloadManagerCallback
- {
- public:
- void OnInit(DownloadToken token)
- {
- api_httpreceiver *http = WAC_API_DOWNLOADMANAGER->GetReceiver(token);
- if (http)
- {
- http->AllowCompression();
- http->addheader("Accept: */*");
- }
- }
- int IsCharDigit(char digit)
- {
- WORD type=0;
- GetStringTypeExA(LOCALE_USER_DEFAULT, CT_CTYPE1, &digit, 1, &type);
- return type&C1_DIGIT;
- }
- void OnFinish(DownloadToken token)
- {
- api_httpreceiver *http = WAC_API_DOWNLOADMANAGER->GetReceiver(token);
- if (http && http->getreplycode() == 200)
- {
- char *buf;
- size_t size;
- if (WAC_API_DOWNLOADMANAGER->GetBuffer(token, (void **)&buf, &size) == 0)
- {
- // buf[size] = 0;
- char *p = buf;
- while (size && (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n'))
- {
- p++;
- size--;
- }
- char newVer[6] = {0,};
- if (size >= 3 && p[1] == '.')
- {
- size_t i = 0;
- while (size && i != 6 && (i == 1 || IsCharDigit(p[i])))
- {
- newVer[i] = p[i];
- newVer[i + 1] = 0;
- size--;
- i++;
- }
- p += i;
- while (size && (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n'))
- {
- size--;
- p++;
- }
- char curVer_tmp[ 6 ] = APP_VERSION;
- char curVer[ 6 ] = { 0 };
- i = 0;
- size_t j = 0;
- bool l_has_point = false;
- while ( i != 6 && j != 6 )
- {
- if ( IsCharDigit( curVer_tmp[ j ] ) )
- {
- curVer[ i ] = curVer_tmp[ j ];
- i++;
- }
- j++;
- if ( !IsCharDigit( curVer_tmp[ j ] ) && !l_has_point )
- {
- curVer[ i ] = curVer_tmp[ j ];
- l_has_point = true;
-
- i++;
- j++;
- }
- }
- while (lstrlenA(curVer) < 5)
- StringCchCatA(curVer, 6, "0");
- while (lstrlenA(newVer) < 5)
- StringCchCatA(newVer, 6, "0");
- int verDif = strcmp(newVer, curVer);
- //#if defined(BETA) || defined(NIGHTLY)
- // if (verDif == 0)
- // verDif = 1; // if this is a BETA version, then we should upgrade if the versions are equal
- //#endif
- if (verDif == 0) // same version
- {
- char updateNumber[32] = "";
- char *u = updateNumber;
- while (size && u != (updateNumber + 31) && *p && *p != '\r' && *p != '\n')
- {
- size--;
- *u++ = *p++;
- *u = 0;
- }
- int update = atoi(updateNumber);
- if (update > config_newverchk3)
- {
- if (config_newverchk3) // only display update if we've already established a serial #
- verDif = 1;
- config_newverchk3 = update;
- }
- }
- if (verDif > 0) // same version or older
- {
- while (size && (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n'))
- {
- size--;
- p++;
- }
- if (size)
- {
- char *disp = (char *)calloc(size + 1, sizeof(char));
- memcpy(disp, p, size);
- disp[size]=0;
- if (!_strnicmp(p, "http://", 7))
- {
- PostMessageW(hMainWindow, WM_WA_IPC, (WPARAM)disp, IPC_UPDATE_URL);
- }
- else
- {
- if (MessageBoxA(NULL, disp, getString(IDS_WINAMP_UPDATE_MSG,NULL,0), MB_YESNO) == IDYES)
- {
- wa::strings::wa_string l_url_new_version( disp );
- myOpenURL( NULL, l_url_new_version.GetW().c_str() );
- }
- free(disp);
- }
- }
- }
- }
- }
- }
- config_newverchk = getDay();
- }
- void OnError(DownloadToken token)
- {
- config_newverchk = getDay();
- }
- RECVS_DISPATCH;
- };
- #define CBCLASS VersionCheckCallback
- START_DISPATCH;
- VCB( IFC_DOWNLOADMANAGERCALLBACK_ONINIT, OnInit )
- VCB( IFC_DOWNLOADMANAGERCALLBACK_ONFINISH, OnFinish )
- END_DISPATCH;
- #undef CBCLASS
- static VersionCheckCallback versionCheckCallback;
- static void CheckVersion(int allowedChannel = 0)
- {
- if ( WAC_API_DOWNLOADMANAGER )
- {
- char url[ 1024 ] = { 0 };
- char *urlend = 0;
- size_t urlend_size = 0;
- wa::strings::wa_string l_winamp_product_ver( STR_WINAMP_PRODUCTVER );
- l_winamp_product_ver.replaceAll( ",", "." );
- StringCchPrintfExA( url, 1024, &urlend, &urlend_size, 0, "http://client.winamp.com/update/latest-version.php?v=%s", l_winamp_product_ver.GetA().c_str() );
- char uid[ 512 ] = "";
- stats_getuidstr( uid );
- if ( uid[ 0 ] )
- StringCchPrintfExA( urlend, urlend_size, &urlend, &urlend_size, 0, "&ID=%s", uid );
- const wchar_t *langIdentifier = langManager ? ( langManager->GetLanguageIdentifier( LANG_IDENT_STR ) ) : 0;
- if ( langIdentifier )
- StringCchPrintfA( urlend, urlend_size, "&lang=%s", (char *)AutoUrl( langIdentifier ) );
- OSVERSIONINFOEX info;
- ZeroMemory( &info, sizeof( OSVERSIONINFOEX ) );
- info.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX );
- GetVersionEx( (LPOSVERSIONINFO)&info );
- char l_os_version[ 32 ];
-
- sprintf( l_os_version, "&osver=%u.%u.%u", info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber );
- strcat( url, l_os_version );
- char szAllowedChannel[32];
- sprintf(szAllowedChannel, "&allowedchannel=%d", allowedChannel);
- strcat(url, szAllowedChannel);
- WAC_API_DOWNLOADMANAGER->DownloadEx( url, &versionCheckCallback, api_downloadManager::DOWNLOADEX_BUFFER );
- }
- }
- bool DoVerChk(int verchk)
- {
- return verchk == 1 || (verchk > 1 && verchk + 1 < (int)getDay());
- }
- class PingCallback : public ifc_downloadManagerCallback
- {
- public:
- void OnInit(DownloadToken token)
- {
- api_httpreceiver *http = WAC_API_DOWNLOADMANAGER->GetReceiver(token);
- if (http)
- http->addheader("Accept: */*");
- }
- RECVS_DISPATCH;
- };
- #define CBCLASS PingCallback
- START_DISPATCH;
- VCB(IFC_DOWNLOADMANAGERCALLBACK_ONINIT, OnInit)
- END_DISPATCH;
- #undef CBCLASS
- static PingCallback pingCallback;
- void Ping(const char *url)
- {
- if (WAC_API_DOWNLOADMANAGER)
- WAC_API_DOWNLOADMANAGER->DownloadEx(url, &pingCallback, api_downloadManager::DOWNLOADEX_BUFFER);
- }
- void newversioncheck(void)
- {
- if (isInetAvailable())
- {
- if (DoVerChk(config_newverchk))
- {
- // go ahead and call this on the main thread to ensure that the GUID gets created w/o a race condition
- char uid[512]="";
- stats_getuidstr(uid);
- CheckVersion(config_newverchk_rc);
- }
- if (DoVerChk(config_newverchk2))
- {
- char _url[MAX_URL] = {0};
- char *url=_url;
- size_t urlsize=MAX_URL;
- StringCchPrintfExA(url, urlsize, &url, &urlsize, 0,"http://client.winamp.com/update/client_session.php?v=%s",APP_VERSION);
- char uid[512]="";
- stats_getuidstr(uid);
- if (uid[0])
- StringCchPrintfExA(url, urlsize, &url, &urlsize, 0,"&ID=%s", uid);
- int values[Stats::NUM_STATS] = {0, };
- stats.GetStats(values);
- for (int x = 0; x < Stats::NUM_STATS; x ++)
- {
- StringCchPrintfExA(url, urlsize, &url, &urlsize, 0,"&st%d=%d", x + 1, values[x]);
- }
- wchar_t stat_str[256] = {0};
- stats.GetString("skin", stat_str, 256);
- if (stat_str[0])
- StringCchPrintfExA(url, urlsize, &url, &urlsize, 0,"&skin=%s",(char *)AutoUrl(stat_str));
- stats.GetString("colortheme", stat_str, 256);
- if (stat_str[0])
- StringCchPrintfExA(url, urlsize, &url, &urlsize, 0,"&ct=%s",(char *)AutoUrl(stat_str));
- stats.GetString("pmp", stat_str, 256);
- if (stat_str[0])
- StringCchPrintfExA(url, urlsize, &url, &urlsize, 0,"&pmp=%s",(char *)AutoUrl(stat_str));
- const wchar_t *langIdentifier = langManager?(langManager->GetLanguageIdentifier(LANG_IDENT_STR)):0;
- if (langIdentifier)
- StringCchPrintfExA(url, urlsize, &url, &urlsize, 0, "&lang=%s", (char *)AutoUrl(langIdentifier));
- Ping(_url);
- config_newverchk2 = getDay();
- }
- }
- }
|