sync itss to wine 1.1.40

svn path=/trunk/; revision=45979
This commit is contained in:
Christoph von Wittich 2010-03-07 09:32:58 +00:00
parent 314b9e10be
commit 6534ce1c51
4 changed files with 73 additions and 7 deletions

View file

@ -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)
{

View file

@ -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);

View file

@ -16,7 +16,7 @@ DelReg=Classes.Reg, Misc.Reg
HKCR,"CLSID\%CLSID_ITStorage%",,,"Microsoft InfoTech IStorage System"
HKCR,"CLSID\%CLSID_ITStorage%\InProcServer32",,,"itss.dll"
HKCR,"CLSID\%CLSID_ITStorage%\InProcServer32","ThreadingModel",,"Both"
HKCR,"CLSID\%CLSID_ITStorage%\NotInsertable",,,""
HKCR,"CLSID\%CLSID_ITStorage%\NotInsertable",,16
HKCR,"CLSID\%CLSID_ITStorage%\ProgID",,,"MSITFS1.0"
HKCR,"CLSID\%CLSID_ITStorage%\VersionIndependentProgID",,,"MSITFS"
@ -28,7 +28,7 @@ HKCR,"MSITFS\CurVer",,,"MSITFS1.0"
HKCR,"CLSID\%CLSID_MSITStore%",,,"Microsoft InfoTech Protocol for IE 3.0"
HKCR,"CLSID\%CLSID_MSITStore%\InProcServer32",,,"itss.dll"
HKCR,"CLSID\%CLSID_MSITStore%\InProcServer32","ThreadingModel",,"Both"
HKCR,"CLSID\%CLSID_MSITStore%\NotInsertable",,,""
HKCR,"CLSID\%CLSID_MSITStore%\NotInsertable",,16
HKCR,"CLSID\%CLSID_MSITStore%\ProgID",,,"MSITFS1.0"
HKCR,"CLSID\%CLSID_MSITStore%\VersionIndependentProgID",,,"MSITFS"
@ -41,9 +41,9 @@ HKCR,"MSITStore\CurVer",,,"MSITStore1.0"
HKCR,"CLSID\%CLSID_ITSProtocol%",,,"Microsoft InfoTech Protocol for IE 4.0"
HKCR,"CLSID\%CLSID_ITSProtocol%\InProcServer32",,,"itss.dll"
HKCR,"CLSID\%CLSID_ITSProtocol%\InProcServer32","ThreadingModel",,"Both"
HKCR,"CLSID\%CLSID_ITSProtocol%\NotInsertable",,,""
HKCR,"CLSID\%CLSID_ITSProtocol%\NotInsertable",,16
HKCR,"CLSID\%CLSID_ITSProtocol%\ProgID",,,"MSITFS1.0"
HKCR,"CLSID\%CLSID_ITSProtocol%%\VersionIndependentProgID",,,"MSITFS"
HKCR,"CLSID\%CLSID_ITSProtocol%\VersionIndependentProgID",,,"MSITFS"
HKCR,"ITSProtocol","Microsoft InfoTech Protocols for IE 4.0"
HKCR,"ITSProtocol\CLSID",,,"%CLSID_ITSProtocol%"
@ -54,7 +54,7 @@ HKCR,"ITSProtocol\CurVer",,,"ITSProtocol1.0"
HKCR,"CLSID\%CLSID_MSFSStore%",,,"Microsoft InfoTech IStorage for Win32 Files"
HKCR,"CLSID\%CLSID_MSFSStore%\InProcServer32",,,"itss.dll"
HKCR,"CLSID\%CLSID_MSFSStore%\InProcServer32","ThreadingModel",,"Both"
HKCR,"CLSID\%CLSID_MSFSStore%\NotInsertable",,,""
HKCR,"CLSID\%CLSID_MSFSStore%\NotInsertable",,16
HKCR,"CLSID\%CLSID_MSFSStore%\ProgID",,,"MSITFS1.0"
HKCR,"CLSID\%CLSID_MSFSStore%\VersionIndependentProgID",,,"MSITFS"

View file

@ -391,10 +391,43 @@ 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;
chmfile = chm_dup( This->chmfile );
if( !chmfile )
return E_FAIL;
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));
return ITSS_create_chm_storage(chmfile, path, ppstg);
}
static HRESULT WINAPI ITSS_IStorageImpl_CopyTo(