aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/script/objects/sprivate.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/Wasabi/api/script/objects/sprivate.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Wasabi/api/script/objects/sprivate.cpp')
-rw-r--r--Src/Wasabi/api/script/objects/sprivate.cpp258
1 files changed, 258 insertions, 0 deletions
diff --git a/Src/Wasabi/api/script/objects/sprivate.cpp b/Src/Wasabi/api/script/objects/sprivate.cpp
new file mode 100644
index 00000000..515fbb08
--- /dev/null
+++ b/Src/Wasabi/api/script/objects/sprivate.cpp
@@ -0,0 +1,258 @@
+#include <precomp.h>
+#include "sprivate.h"
+#include "main.h"
+#include <api/application/api_application.h>
+#include "wa2frontend.h"
+#include <api.h>
+#include "../Agave/Language/api_language.h"
+#include "../../../../Components/wac_network/wac_network_http_receiver_api.h"
+#include "../nu/AutoWide.h"
+#include "../nu/AutoChar.h"
+#include "../nu/ns_wc.h"
+#include "../Winamp/buildtype.h"
+#include "../nu/refcount.h"
+#include <shlobj.h>
+#include <shlwapi.h>
+
+// {78BD6ED9-0DBC-4fa5-B5CD-5977E3A912F8}
+static const GUID SPrivate_script_object_guid =
+{ 0x78bd6ed9, 0xdbc, 0x4fa5, { 0xb5, 0xcd, 0x59, 0x77, 0xe3, 0xa9, 0x12, 0xf8 } };
+
+
+static SPrivateScriptObjectController _SPrivateController;
+ScriptObjectController *SPrivateController=&_SPrivateController;
+
+// -- Functions table -------------------------------------
+function_descriptor_struct SPrivateScriptObjectController::exportedFunction[] =
+{
+ {L"updateLinks", 2, (void*)SPrivate::vcpu_updateLinks },
+ {L"onLinksUpdated", 1, (void*)SPrivate::vcpu_onLinksUpdated },
+};
+// --------------------------------------------------------
+
+const wchar_t *SPrivateScriptObjectController::getClassName()
+{
+ return L"Private";
+}
+
+const wchar_t *SPrivateScriptObjectController::getAncestorClassName()
+{
+ return L"Object";
+}
+
+ScriptObjectController *SPrivateScriptObjectController::getAncestorController()
+{
+ return NULL;
+}
+
+ScriptObject *SPrivateScriptObjectController::instantiate()
+{
+ SPrivate *c = new SPrivate;
+ if (!c) return NULL;
+ return c->getScriptObject();
+}
+
+int SPrivateScriptObjectController::getInstantiable()
+{
+ return 1;
+}
+
+void SPrivateScriptObjectController::destroy(ScriptObject *o)
+{
+ SPrivate *obj = static_cast<SPrivate *>(o->vcpu_getInterface(SPrivate_script_object_guid));
+ ASSERT(obj != NULL);
+ obj->dlcb = false;
+ delete obj;
+}
+
+void *SPrivateScriptObjectController::encapsulate(ScriptObject *o)
+{
+ return NULL;
+}
+
+void SPrivateScriptObjectController::deencapsulate(void *o)
+{
+}
+
+int SPrivateScriptObjectController::getNumFunctions()
+{
+ return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
+}
+
+const function_descriptor_struct *SPrivateScriptObjectController::getExportedFunctions()
+{
+ return exportedFunction;
+}
+
+GUID SPrivateScriptObjectController::getClassGuid()
+{
+ return SPrivate_script_object_guid;
+}
+
+/*-----------------------------------*/
+
+static void DoAPC(PAPCFUNC apc, ULONG_PTR data)
+{
+ HANDLE hMainThread = WASABI_API_APP->main_getMainThreadHandle();
+ if (hMainThread)
+ {
+ QueueUserAPC(apc, hMainThread, data);
+ CloseHandle(hMainThread);
+ }
+}
+
+static void CALLBACK LinksUpdatedAPC(ULONG_PTR data)
+{
+ ScriptObject* scriptCallback = (ScriptObject *)data;
+ SPrivate::vcpu_onLinksUpdated(SCRIPT_CALL, scriptCallback);
+}
+
+class PDownloadCallback : public Countable<ifc_downloadManagerCallback>
+{
+public:
+ PDownloadCallback (const char *url, ScriptObject* scriptCallback)
+ {
+ this->scriptCallback = scriptCallback;
+ validSO = true;
+ }
+
+ ~PDownloadCallback ()
+ {
+ }
+
+
+ void OnFinish (DownloadToken token)
+ {
+ if (!validSO)
+ {
+ DeleteFileW(WAC_API_DOWNLOADMANAGER->GetLocation(token));
+ delete this;
+ return;
+ }
+
+ api_httpreceiver *http = WAC_API_DOWNLOADMANAGER->GetReceiver(token);
+ if (http)
+ {
+ int replyCode;
+ replyCode = http->getreplycode();
+ if (204 != replyCode)
+ {
+ BOOL succeeded;
+ HANDLE hDest;
+ const wchar_t *downloadDest;
+ wchar_t finalFileName[MAX_PATH] = {0};
+
+ downloadDest = WAC_API_DOWNLOADMANAGER->GetLocation(token);
+ succeeded = FALSE;
+
+ hDest = CreateFileW(downloadDest, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, NULL);
+ if (INVALID_HANDLE_VALUE != hDest)
+ {
+ LARGE_INTEGER fileSize;
+ if (FALSE != GetFileSizeEx(hDest, &fileSize) &&
+ 0 != fileSize.QuadPart)
+ {
+ succeeded = TRUE;
+ }
+
+ CloseHandle(hDest);
+
+ if (FALSE == succeeded)
+ {
+ DeleteFileW(downloadDest);
+ downloadDest = NULL;
+ }
+ }
+
+ if (FALSE != succeeded &&
+ NULL != (PathCombineW(finalFileName, WASABI_API_APP->path_getUserSettingsPath(), L"links.xml")))
+ {
+ // then move the file there
+ succeeded = MoveFileW(downloadDest, finalFileName);
+ if (FALSE == succeeded)
+ {
+ succeeded = CopyFileW(downloadDest, finalFileName, FALSE);
+ DeleteFileW(downloadDest);
+ }
+ if (FALSE != succeeded)
+ {
+ // hop back on the main thread for the callback
+ DoAPC(LinksUpdatedAPC, (ULONG_PTR)scriptCallback);
+ }
+ }
+ }
+ }
+ Release();
+ }
+
+ void OnError (DownloadToken token, int error)
+ {
+ Release();
+ }
+ void OnCancel (DownloadToken token)
+ {
+ Release();
+ }
+
+ void OnTick (DownloadToken token) {}
+
+ ScriptObject* scriptCallback;
+ bool validSO;
+ REFERENCE_COUNT_IMPLEMENTATION;
+
+protected:
+ RECVS_DISPATCH;
+};
+
+
+SPrivate::SPrivate()
+{
+ getScriptObject()->vcpu_setInterface(SPrivate_script_object_guid, static_cast<SPrivate *>(this));
+ getScriptObject()->vcpu_setClassName(L"Private");
+ getScriptObject()->vcpu_setController(SPrivateController);
+ dlcb = false;
+}
+SPrivate::~SPrivate()
+{
+}
+
+scriptVar SPrivate::vcpu_updateLinks(SCRIPT_FUNCTION_PARAMS, ScriptObject *object, scriptVar version, scriptVar bversion)
+{
+ SCRIPT_FUNCTION_INIT;
+
+ String url;
+
+ //if defined(BETA) || defined(INTERNAL)
+ const wchar_t *langIdentifier = WASABI_API_LNG?(WASABI_API_LNG->GetLanguageIdentifier(LANG_IDENT_STR)):0;
+ if (!langIdentifier)
+ langIdentifier = L"en-US";
+
+ url = StringPrintf("http://client.winamp.com/data/skins?o=links&sid=bento&version=%s&waversion=%s&build=%i&browserversion=%s&lang=%s", AutoChar(version.data.sdata), WASABI_API_APP->main_getVersionNumString(), WASABI_API_APP->main_getBuildNumber(),AutoChar(bversion.data.sdata), AutoChar(langIdentifier));
+ //url = StringPrintf("http://martin.skinconsortium.com/links.php?o=links&sid=bento&version=%s&waversion=%s&build=%i&browserversion=%s", AutoChar(version.data.sdata), WASABI_API_APP->main_getVersionNumString(), WASABI_API_APP->main_getBuildNumber(),AutoChar(bversion.data.sdata));
+
+ SPrivate *sp = static_cast<SPrivate *>(object->vcpu_getInterface(SPrivate_script_object_guid));
+ sp->dlcb = new PDownloadCallback(url, object);
+ WAC_API_DOWNLOADMANAGER->Download(url, sp->dlcb);
+
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar SPrivate::vcpu_onLinksUpdated(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
+{
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS0(o, SPrivateController);
+ SCRIPT_FUNCTION_CHECKABORTEVENT(o);
+ SCRIPT_EXEC_EVENT0(o);
+}
+
+
+#define CBCLASS PDownloadCallback
+START_DISPATCH;
+REFERENCE_COUNTED;
+VCB(IFC_DOWNLOADMANAGERCALLBACK_ONFINISH, OnFinish)
+VCB(IFC_DOWNLOADMANAGERCALLBACK_ONTICK, OnTick)
+VCB(IFC_DOWNLOADMANAGERCALLBACK_ONERROR, OnError)
+VCB(IFC_DOWNLOADMANAGERCALLBACK_ONCANCEL, OnCancel)
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file