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