Erich Hoover : itss: Implement IStorageImpl_OpenStorage.
Alexandre Julliard
julliard at winehq.org
Mon Feb 8 11:06:08 CST 2010
Module: wine
Branch: master
Commit: 6627b9029ebe0a29271faf6b0d36c6dbbd9c1fc1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6627b9029ebe0a29271faf6b0d36c6dbbd9c1fc1
Author: Erich Hoover <ehoover at mines.edu>
Date: Sun Feb 7 10:32:27 2010 -0700
itss: Implement IStorageImpl_OpenStorage.
---
dlls/itss/chm_lib.c | 32 ++++++++++++++++++++++++++++++++
dlls/itss/chm_lib.h | 1 +
dlls/itss/storage.c | 36 ++++++++++++++++++++++++++++++++++--
3 files changed, 67 insertions(+), 2 deletions(-)
diff --git a/dlls/itss/chm_lib.c b/dlls/itss/chm_lib.c
index a98c8ac..ada9be1 100644
--- a/dlls/itss/chm_lib.c
+++ b/dlls/itss/chm_lib.c
@@ -829,6 +829,38 @@ struct chmFile *chm_openW(const WCHAR *filename)
return newHandle;
}
+/* Duplicate an ITS archive handle */
+struct chmFile *chm_dup(struct chmFile *oldHandle)
+{
+ struct chmFile *newHandle=NULL;
+
+ newHandle = HeapAlloc(GetProcessHeap(), 0, sizeof(struct chmFile));
+ memcpy(newHandle, oldHandle, sizeof(struct chmFile));
+
+ /* duplicate fd handle */
+ DuplicateHandle(GetCurrentProcess(), oldHandle->fd,
+ GetCurrentProcess(), &(newHandle->fd),
+ 0, FALSE, DUPLICATE_SAME_ACCESS);
+ newHandle->lzx_state = NULL;
+ newHandle->cache_blocks = NULL;
+ newHandle->cache_block_indices = NULL;
+ newHandle->cache_num_blocks = 0;
+
+ /* initialize mutexes, if needed */
+ InitializeCriticalSection(&newHandle->mutex);
+ newHandle->mutex.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": chmFile.mutex");
+ InitializeCriticalSection(&newHandle->lzx_mutex);
+ newHandle->lzx_mutex.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": chmFile.lzx_mutex");
+ InitializeCriticalSection(&newHandle->cache_mutex);
+ newHandle->cache_mutex.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": chmFile.cache_mutex");
+
+ /* initialize cache */
+ chm_set_param(newHandle, CHM_PARAM_MAX_BLOCKS_CACHED,
+ CHM_MAX_BLOCKS_CACHED);
+
+ return newHandle;
+}
+
/* close an ITS archive */
void chm_close(struct chmFile *h)
{
diff --git a/dlls/itss/chm_lib.h b/dlls/itss/chm_lib.h
index 0b3718c..fcd17b5 100644
--- a/dlls/itss/chm_lib.h
+++ b/dlls/itss/chm_lib.h
@@ -73,6 +73,7 @@ struct chmUnitInfo
};
struct chmFile* chm_openW(const WCHAR *filename);
+struct chmFile *chm_dup(struct chmFile *oldHandle);
/* close an ITS archive */
void chm_close(struct chmFile *h);
diff --git a/dlls/itss/storage.c b/dlls/itss/storage.c
index de0acfa..fa92c4f 100644
--- a/dlls/itss/storage.c
+++ b/dlls/itss/storage.c
@@ -391,10 +391,42 @@ static HRESULT WINAPI ITSS_IStorageImpl_OpenStorage(
IStorage** ppstg)
{
ITSS_IStorageImpl *This = (ITSS_IStorageImpl *)iface;
+ static const WCHAR szRoot[] = { '/', 0 };
+ struct chmFile *chmfile;
+ WCHAR *path, *p;
+ DWORD len;
- FIXME("%p %s %p %u %p %u %p\n", This, debugstr_w(pwcsName),
+ TRACE("%p %s %p %u %p %u %p\n", This, debugstr_w(pwcsName),
pstgPriority, grfMode, snbExclude, reserved, ppstg);
- return E_NOTIMPL;
+
+ len = strlenW( This->dir ) + strlenW( pwcsName ) + 1;
+ path = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
+ strcpyW( path, This->dir );
+
+ if( pwcsName[0] == '/' || pwcsName[0] == '\\' )
+ {
+ p = &path[strlenW( path ) - 1];
+ while( ( path <= p ) && ( *p == '/' ) )
+ *p-- = 0;
+ }
+ strcatW( path, pwcsName );
+
+ for(p=path; *p; p++) {
+ if(*p == '\\')
+ *p = '/';
+ }
+
+ if(*--p == '/')
+ *p = 0;
+
+ strcatW( path, szRoot );
+
+ TRACE("Resolving %s\n", debugstr_w(path));
+
+ chmfile = chm_dup( This->chmfile );
+ if( !chmfile )
+ return E_FAIL;
+ return ITSS_create_chm_storage(chmfile, path, ppstg);
}
static HRESULT WINAPI ITSS_IStorageImpl_CopyTo(
More information about the wine-cvs
mailing list