aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_downloads/DownloadsParse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Library/ml_downloads/DownloadsParse.cpp')
-rw-r--r--Src/Plugins/Library/ml_downloads/DownloadsParse.cpp179
1 files changed, 179 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_downloads/DownloadsParse.cpp b/Src/Plugins/Library/ml_downloads/DownloadsParse.cpp
new file mode 100644
index 00000000..627fb52b
--- /dev/null
+++ b/Src/Plugins/Library/ml_downloads/DownloadsParse.cpp
@@ -0,0 +1,179 @@
+#include "Main.h"
+#include "DownloadsParse.h"
+#include "Downloaded.h"
+#include "Defaults.h"
+#include "ParseUtil.h"
+#include <wchar.h>
+#include <locale.h>
+
+static __time64_t filetime( const wchar_t *file )
+{
+ if ( !file || !*file )
+ return 0;
+
+ WIN32_FIND_DATAW f = { 0 };
+
+ HANDLE h = FindFirstFileW( file, &f );
+ if ( h == INVALID_HANDLE_VALUE )
+ {
+ /*wchar_t tmp[128] = {0};
+ wsprintf(tmp,L"%d",GetLastError());
+ MessageBox(0,file,tmp,0);*/
+ return 0;
+ }
+
+ FindClose( h );
+ SYSTEMTIME s = { 0 };
+ FileTimeToSystemTime( &f.ftCreationTime, &s );
+
+ tm t = { 0 };
+ t.tm_year = s.wYear - 1900;
+ t.tm_mon = s.wMonth - 1;
+ t.tm_mday = s.wDay;
+ t.tm_hour = s.wHour;
+ t.tm_min = s.wMinute;
+ t.tm_sec = s.wMinute;
+ __time64_t ret = _mktime64(&t);
+ /*wchar_t tmp[128] = {0};
+ wsprintf(tmp,L"%d",ret);
+ MessageBox(0,tmp,0,0);*/
+
+ return ret;
+}
+
+size_t GetFileSize(LPCWSTR path)
+{
+ WIN32_FIND_DATAW data = {0};
+ if (path && *path)
+ {
+ HANDLE h = FindFirstFileW(path, &data);
+ if (h == INVALID_HANDLE_VALUE)
+ return -1;
+ FindClose(h);
+ }
+ return data.nFileSizeLow/* | (__int64)data.nFileSizeHigh << 32*/;
+}
+
+static void ReadDownload( const XMLNode *item )
+{
+ DownloadedFile newDownloaded;
+
+ const wchar_t *source = GetContent( item, L"source" );
+ if ( !source ) source = GetContent( item, L"channel" );
+ newDownloaded.SetSource( source );
+
+ const wchar_t *title = GetContent( item, L"title" );
+ if ( !title ) title = GetContent( item, L"item" );;
+ newDownloaded.SetTitle( title );
+
+ const wchar_t *url = GetContent( item, L"url" );
+ newDownloaded.SetURL( url );
+
+ const wchar_t *path = GetContent( item, L"path" );
+ newDownloaded.SetPath( path );
+
+ // TODO ideally should be able to cope with __int64
+ // but the db is setup for int currently...
+ const wchar_t *size = GetContent( item, L"size" );
+ if ( size && size[ 0 ] )
+ {
+ size_t val = _wtoi( size );
+ if ( val > 0 ) newDownloaded.totalSize = val;
+ else if ( !val )
+ {
+ val = GetFileSize( path );
+ if ( val > 0 ) newDownloaded.totalSize = val;
+ else newDownloaded.totalSize = -1;
+ dirty++;
+ }
+ }
+ else
+ {
+ size_t val = GetFileSize( path );
+ if ( val > 0 ) newDownloaded.totalSize = val;
+ else newDownloaded.totalSize = -1;
+ dirty++;
+ }
+
+ const wchar_t *downloadDate = GetContent( item, L"downloadDate" );
+ if ( downloadDate && downloadDate[ 0 ] )
+ {
+ __time64_t val = (__time64_t)_wtoi( downloadDate );
+ if ( time > 0 ) newDownloaded.downloadDate = val;
+ }
+ else
+ {
+ __time64_t val = filetime( newDownloaded.path );
+ if ( time > 0 ) newDownloaded.downloadDate = val;
+ }
+
+ const wchar_t *status = GetContent( item, L"downloadStatus" );
+ if ( status && status[ 0 ] )
+ {
+ newDownloaded.downloadStatus = _wtoi( status );
+ }
+ else
+ {
+ newDownloaded.downloadStatus = DownloadedFile::DOWNLOAD_SUCCESS;
+ }
+
+ downloadedFiles.downloadList.push_back( newDownloaded );
+}
+
+void DownloadsParse::ReadNodes( const wchar_t *url )
+{
+ XMLNode::NodeList::const_iterator itr;
+ const XMLNode *curNode = xmlDOM.GetRoot();
+
+ if ( curNode->Present( L"winamp:preferences" ) )
+ curNode = curNode->Get( L"winamp:preferences" );
+
+ curNode = curNode->Get( L"downloads" );
+ if ( curNode )
+ {
+ const wchar_t *prop = curNode->GetProperty( L"downloadsTitleWidth" );
+ if ( prop && prop[ 0 ] )
+ downloadsTitleWidth = _wtoi( prop );
+ if ( downloadsTitleWidth <= 0 )
+ downloadsTitleWidth = DOWNLOADSTITLEWIDTHDEFAULT;
+
+ prop = curNode->GetProperty( L"downloadsProgressWidth" );
+ if ( prop && prop[ 0 ] )
+ downloadsProgressWidth = _wtoi( prop );
+ if ( downloadsProgressWidth <= 0 )
+ downloadsProgressWidth = DOWNLOADSPROGRESSWIDTHDEFAULT;
+
+ prop = curNode->GetProperty( L"downloadsDateWidth" );
+ if ( prop && prop[ 0 ] )
+ downloadsDateWidth = _wtoi( prop );
+ if ( downloadsDateWidth <= 0 )
+ downloadsDateWidth = DOWNLOADSDATEWIDTHDEFAULTS;
+
+ prop = curNode->GetProperty( L"downloadsSourceWidth" );
+ if ( prop && prop[ 0 ] )
+ downloadsSourceWidth = _wtoi( prop );
+ if ( downloadsSourceWidth <= 0 )
+ downloadsSourceWidth = DOWNLOADSSOURCEWIDTHDEFAULT;
+
+ prop = curNode->GetProperty( L"downloadsPathWidth" );
+ if ( prop && prop[ 0 ] )
+ downloadsPathWidth = _wtoi( prop );
+ if ( downloadsPathWidth <= 0 )
+ downloadsPathWidth = DOWNLOADSPATHWIDTHDEFAULTS;
+
+ prop = curNode->GetProperty( L"downloadsItemSort" );
+ if ( prop && prop[ 0 ] )
+ downloadsItemSort = _wtoi( prop );
+
+ prop = curNode->GetProperty( L"downloadsSortAscending" );
+ if ( prop && prop[ 0 ] )
+ downloadsSortAscending = !PropertyIsFalse( curNode, L"downloadsSortAscending" );
+
+ const XMLNode::NodeList *downloadsList = curNode->GetList( L"download" );
+ if ( downloadsList )
+ {
+ for ( itr = downloadsList->begin(); itr != downloadsList->end(); itr++ )
+ ReadDownload( *itr );
+ }
+ }
+}