Beispiel #1
0
HX_RESULT CSymbIHXDataFile::_Create(UINT16 uOpenMode, HXBOOL bCreateFile)
{
    HX_RESULT retVal = HXR_FAIL;

    Close();

    if (m_pFileName && (m_pFileName->GetSize() != 0) && GetSession())
    {
	OS_STRING_TYPE osFileName(m_pFileName->GetBuffer());
	TPtrC symbNameDesc((TText*) ((OS_TEXT_PTR) osFileName));
	TUint symbFileMode = TranslateOpenMode(uOpenMode);
	
	if (bCreateFile)
	{
	    m_symbLastError = m_symbFile.Create(m_symbSession, 
						symbNameDesc,
						symbFileMode);
	    if ((m_symbLastError != KErrNone) && 
		!(uOpenMode & HX_FILEFLAG_NOTRUNC))
	    {
		m_symbSession.Delete(symbNameDesc);
		m_symbLastError = m_symbFile.Create(m_symbSession, 
						    symbNameDesc,
						    symbFileMode);
	    }
	}
	else
	{
	    m_symbLastError = m_symbFile.Open(m_symbSession, 
					      symbNameDesc,
					      symbFileMode);
	}
	
	if (m_symbLastError == KErrNone)
	{
	    m_bOpen = TRUE;
	    retVal = HXR_OK;
	}
    }

    return retVal;
}
voidpf ZCALLBACK UHOpen64(voidpf opaque, const void* filename, int mode)
{
	UNREFERENCED_PARAMETER(filename);
	ULONG creationMode = IVirtualFs::fsRead | IVirtualFs::fsSharedRead | IVirtualFs::fsOpenExisting | IVirtualFs::fsAttrNormal;
	voidpf zipHandle = NULL;
	TranslateOpenMode(mode, &creationMode);

	IVirtualFs * file = static_cast<IVirtualFs*>(opaque);
	if (file == NULL) return zipHandle;

	ULONG fsType = 0;

	HRESULT hr = E_FAIL;
	if (SUCCEEDED(file->GetFsType(&fsType)) && fsType == IVirtualFs::archive)
	{
		void* handle;
		hr = file->GetHandle((LPVOID*)&handle);
		if (SUCCEEDED(hr))
			hr = file->ReCreate(handle, creationMode);
	}
	else
	{
		hr = file->ReCreate(NULL, creationMode);
	}

	if (SUCCEEDED(hr))
	{
		IFsStream* fileStream = NULL;
		if (SUCCEEDED(file->QueryInterface(__uuidof(IFsStream), (LPVOID*)&fileStream)))
		{
			file->AddRef();
			zipHandle = (voidpf)fileStream;
		}
	}

	return zipHandle;
}