aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_flv/BackgroundDownloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_flv/BackgroundDownloader.cpp')
-rw-r--r--Src/Plugins/Input/in_flv/BackgroundDownloader.cpp129
1 files changed, 129 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_flv/BackgroundDownloader.cpp b/Src/Plugins/Input/in_flv/BackgroundDownloader.cpp
new file mode 100644
index 00000000..bcb3b716
--- /dev/null
+++ b/Src/Plugins/Input/in_flv/BackgroundDownloader.cpp
@@ -0,0 +1,129 @@
+#include "Main.h"
+#include "BackgroundDownloader.h"
+#include "..\..\..\Components\wac_network\wac_network_http_receiver_api.h"
+#include "api__in_flv.h"
+#include "api/service/waservicefactory.h"
+#include "../nu/AutoChar.h"
+
+#include <strsafe.h>
+
+#define HTTP_BUFFER_SIZE 65536
+
+// {C0A565DC-0CFE-405a-A27C-468B0C8A3A5C}
+static const GUID internetConfigGroupGUID =
+{
+ 0xc0a565dc, 0xcfe, 0x405a, { 0xa2, 0x7c, 0x46, 0x8b, 0xc, 0x8a, 0x3a, 0x5c }
+};
+
+
+static void SetUserAgent( api_httpreceiver *http )
+{
+ char agent[ 256 ] = { 0 };
+ StringCchPrintfA( agent, 256, "User-Agent: %S/%S", WASABI_API_APP->main_getAppName(), WASABI_API_APP->main_getVersionNumString() );
+ http->addheader( agent );
+}
+
+static int FeedHTTP( api_httpreceiver *http, Downloader::DownloadCallback *callback, int *downloaded )
+{
+ char downloadedData[ HTTP_BUFFER_SIZE ] = { 0 };
+ int result = 0;
+ int downloadSize = http->get_bytes( downloadedData, HTTP_BUFFER_SIZE );
+
+ *downloaded = downloadSize;
+ if ( downloadSize )
+ {
+ result = callback->OnData( downloadedData, downloadSize );
+ }
+
+ return result;
+}
+
+static void RunDownload( api_httpreceiver *http, Downloader::DownloadCallback *callback )
+{
+ int ret;
+ int downloaded = 0;
+ do
+ {
+ ret = http->run();
+ Sleep( 55 );
+ do
+ {
+ if ( FeedHTTP( http, callback, &downloaded ) != 0 )
+ return;
+ } while ( downloaded == HTTP_BUFFER_SIZE );
+ } while ( ret == HTTPRECEIVER_RUN_OK );
+
+ // finish off the data
+ do
+ {
+ if ( FeedHTTP( http, callback, &downloaded ) != 0 )
+ return;
+ } while ( downloaded );
+}
+
+
+bool Downloader::Download(const char *url, Downloader::DownloadCallback *callback, uint64_t startPosition)
+{
+ api_httpreceiver *http = 0;
+ waServiceFactory *sf = plugin.service->service_getServiceByGuid(httpreceiverGUID);
+ if (sf) http = (api_httpreceiver *)sf->getInterface();
+
+ if (!http)
+ return false;
+
+ int use_proxy = 1;
+ bool proxy80 = AGAVE_API_CONFIG->GetBool(internetConfigGroupGUID, L"proxy80", false);
+ if (proxy80 && strstr(url, ":") && (!strstr(url, ":80/") && strstr(url, ":80") != (url + strlen(url) - 3)))
+ use_proxy = 0;
+
+ const wchar_t *proxy = use_proxy?AGAVE_API_CONFIG->GetString(internetConfigGroupGUID, L"proxy", 0):0;
+
+ http->AllowCompression();
+ http->open(API_DNS_AUTODNS, HTTP_BUFFER_SIZE, (proxy && proxy[0]) ? (const char *)AutoChar(proxy) : NULL);
+ if (startPosition > 0)
+ {
+ char temp[128] = {0};
+ StringCchPrintfA(temp, 128, "Range: bytes=%d-", startPosition);
+ http->addheader(temp);
+ }
+ SetUserAgent(http);
+ http->connect(url);
+ int ret;
+
+ do
+ {
+ Sleep(55);
+ ret = http->run();
+ if (ret == -1) // connection failed
+ break;
+
+ // ---- check our reply code ----
+ int replycode = http->getreplycode();
+ switch (replycode)
+ {
+ case 0:
+ case 100:
+ break;
+ case 200:
+ {
+ if (callback->OnConnect(http) != 0)
+ {
+ sf->releaseInterface(http);
+ return false;
+ }
+
+ RunDownload(http, callback);
+ sf->releaseInterface(http);
+ return true;
+ }
+ break;
+ default:
+ sf->releaseInterface(http);
+ return false;
+ }
+ }
+ while (ret == HTTPRECEIVER_RUN_OK);
+ //const char *er = http->geterrorstr();
+ sf->releaseInterface(http);
+ return false;
+} \ No newline at end of file