aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_downloads/DownloadThread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Library/ml_downloads/DownloadThread.cpp')
-rw-r--r--Src/Plugins/Library/ml_downloads/DownloadThread.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_downloads/DownloadThread.cpp b/Src/Plugins/Library/ml_downloads/DownloadThread.cpp
new file mode 100644
index 00000000..563c9d3d
--- /dev/null
+++ b/Src/Plugins/Library/ml_downloads/DownloadThread.cpp
@@ -0,0 +1,65 @@
+#include "Main.h"
+
+#pragma warning(disable:4786)
+
+#include "DownloadThread.h"
+#include "api__ml_downloads.h"
+#include <api/service/waServiceFactory.h>
+#include "errors.h"
+#include <strsafe.h>
+
+DownloadThread::DownloadThread() : parser( 0 ), parserFactory( 0 )
+{
+ parserFactory = plugin.service->service_getServiceByGuid( obj_xmlGUID );
+ if ( parserFactory )
+ parser = (obj_xml *)parserFactory->getInterface();
+
+ if ( parser )
+ {
+ parser->xmlreader_setCaseSensitive();
+ parser->xmlreader_registerCallback( L"*", &xmlDOM );
+ parser->xmlreader_open();
+ }
+}
+
+DownloadThread::~DownloadThread()
+{
+ if ( parser )
+ {
+ parser->xmlreader_unregisterCallback( &xmlDOM );
+ parser->xmlreader_close();
+ }
+
+ if ( parserFactory && parser )
+ parserFactory->releaseInterface( parser );
+
+ parserFactory = 0;
+ parser = 0;
+}
+
+#define FILE_BUFFER_SIZE 32768
+void DownloadThread::DownloadFile( const wchar_t *fileName )
+{
+ if ( !parser )
+ return; // no sense in continuing if there's no parser available
+
+ HANDLE file = CreateFile( fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL );
+ if ( file == INVALID_HANDLE_VALUE )
+ return;
+
+ while ( true )
+ {
+ char data[ FILE_BUFFER_SIZE ] = { 0 };
+ DWORD bytesRead = 0;
+ if ( ReadFile( file, data, FILE_BUFFER_SIZE, &bytesRead, NULL ) && bytesRead )
+ {
+ parser->xmlreader_feed( (void *)data, bytesRead );
+ }
+ else
+ break;
+ }
+
+ CloseHandle( file );
+ parser->xmlreader_feed( 0, 0 );
+ ReadNodes( fileName );
+} \ No newline at end of file