aboutsummaryrefslogtreecommitdiff
path: root/Src/filereader/ProgressiveHTTPReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/filereader/ProgressiveHTTPReader.cpp')
-rw-r--r--Src/filereader/ProgressiveHTTPReader.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/Src/filereader/ProgressiveHTTPReader.cpp b/Src/filereader/ProgressiveHTTPReader.cpp
new file mode 100644
index 00000000..16ad697a
--- /dev/null
+++ b/Src/filereader/ProgressiveHTTPReader.cpp
@@ -0,0 +1,88 @@
+/** (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:
+ **/
+/* implementation ideas, notes and todos
+
+Memory mapped file to use as temporary storage
+mark downloaded pages with bitfield vector
+use content length header
+use content-disposition for filename, if available (instead of temp filename)
+
+*/
+#include "ProgressiveHTTPReader.h"
+#include <windows.h>
+
+int ProgressiveHTTPReader::isMine(const wchar_t *filename, int mode)
+{
+ return 0; // only want to use the progressive downloader/reader on demand.
+}
+
+int ProgressiveHTTPReader::open(const wchar_t *filename, int mode)
+{
+ pagePosition.QuadPart=0;
+
+ SYSTEM_INFO info;
+ GetSystemInfo(&info);
+ pageSize = info.dwPageSize;
+
+ char tempPath[MAX_PATH];
+ GetTempPathA(MAX_PATH, tempPath);
+ GetTempFileNameA(tempPath, "phr", 0, tempPath);
+
+ hFile=CreateFile((LPCWSTR)tempPath, GENERIC_WRITE|GENERIC_READ, 0, 0, CREATE_ALWAYS, 0, 0);
+
+
+ LARGE_INTEGER contentLength;
+ contentLength.QuadPart = 100*1024*1024; // TODO: use content length header for filesize
+
+ hMap=CreateFileMapping(hFile, 0, PAGE_READWRITE, contentLength.HighPart, contentLength.LowPart, 0);
+ // TODO: spawn a thread and start downloading data..
+ // thread should get a duplicate file handle
+
+ return 1;
+}
+
+void ProgressiveHTTPReader::IncrementPosition(uint64_t inc)
+{
+ pagePosition.QuadPart += offset;
+ pagePosition.QuadPart += inc;
+ offset = (uint32_t)(pagePosition.QuadPart & (uint64_t)pageSize);
+ pagePosition.QuadPart-=offset;
+}
+
+size_t ProgressiveHTTPReader::GetPageNumber() const
+{
+ return (size_t)(pagePosition.QuadPart / (uint64_t)pageSize);
+}
+
+size_t ProgressiveHTTPReader::read(__int8 *buffer, size_t length)
+{
+ /* TODO:
+ is this area of the file downloaded yet? If so, just return it as is
+ otherwise, what should we do? return what we can? or sit and wait until we get the data?
+ */
+ while (length)
+ {
+ // if page is available
+ {
+ // TODO: calculate maximum length we can map
+ MapViewOfFile(hMap, FILE_MAP_READ, pagePosition.HighPart, pagePosition.LowPart, pageSize);
+ // map page
+ // copy to buffer
+ // increment buffer
+ // decrement length
+ // increment position
+ }
+ //else
+ {
+ // queue up read request to background thread
+ // wait for signal
+ continue;
+ }
+ }
+ return 0;
+} \ No newline at end of file