aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/VersionCheck.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/VersionCheck.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Winamp/VersionCheck.cpp')
-rw-r--r--Src/Winamp/VersionCheck.cpp313
1 files changed, 313 insertions, 0 deletions
diff --git a/Src/Winamp/VersionCheck.cpp b/Src/Winamp/VersionCheck.cpp
new file mode 100644
index 00000000..38e78cd8
--- /dev/null
+++ b/Src/Winamp/VersionCheck.cpp
@@ -0,0 +1,313 @@
+/** (c) Nullsoft, Inc. C O N F I D E N T I A L
+** Filename:
+** Project:
+** Description:
+** Author: Ben Allison benski@nullsoft.com
+** 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();
+ }
+ }
+} \ No newline at end of file