forked from Mirrors/wine-wine
itss: Implement IStorageImpl_OpenStorage.
parent
796c4dec7f
commit
6627b9029e
|
@ -829,6 +829,38 @@ struct chmFile *chm_openW(const WCHAR *filename)
|
||||||
return newHandle;
|
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 */
|
/* close an ITS archive */
|
||||||
void chm_close(struct chmFile *h)
|
void chm_close(struct chmFile *h)
|
||||||
{
|
{
|
||||||
|
|
|
@ -73,6 +73,7 @@ struct chmUnitInfo
|
||||||
};
|
};
|
||||||
|
|
||||||
struct chmFile* chm_openW(const WCHAR *filename);
|
struct chmFile* chm_openW(const WCHAR *filename);
|
||||||
|
struct chmFile *chm_dup(struct chmFile *oldHandle);
|
||||||
|
|
||||||
/* close an ITS archive */
|
/* close an ITS archive */
|
||||||
void chm_close(struct chmFile *h);
|
void chm_close(struct chmFile *h);
|
||||||
|
|
|
@ -391,10 +391,42 @@ static HRESULT WINAPI ITSS_IStorageImpl_OpenStorage(
|
||||||
IStorage** ppstg)
|
IStorage** ppstg)
|
||||||
{
|
{
|
||||||
ITSS_IStorageImpl *This = (ITSS_IStorageImpl *)iface;
|
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);
|
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(
|
static HRESULT WINAPI ITSS_IStorageImpl_CopyTo(
|
||||||
|
|
Loading…
Reference in New Issue