Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//
// MODULE: CHMREAD.CPP
//
// PURPOSE: Template file decoder
//
// PROJECT: Generic Troubleshooter DLL for Microsoft AnswerPoint
//
// COMPANY: Saltmine Creative, Inc. (206)-633-4743 [email protected]
//
// AUTHOR: Oleg Kalosha
//
// ORIGINAL DATE: 07.01.98
//
//
#include "stdafx.h"
#include "fs.h"
#include "apgts.h"
#include "chmread.h"
#define CHM_READ_BUFFER_INITIAL_SIZE 1024
// reads ALL stream (ppBuffer is reallocated)
// IN: szStreamName - file name within CHM file
// IN: szFileName - full oath and name of CHM file
// OUT: ppBuffer - data read
HRESULT ReadChmFile(LPCTSTR szFileName, LPCTSTR szStreamName, void** ppBuffer, DWORD* pdwRead) { HRESULT hr =S_OK; CFileSystem* pFileSystem =NULL; CSubFileSystem* pSubFileSystem =NULL; int i =0;
// Init ITSS.
pFileSystem = new CFileSystem(); if (! SUCCEEDED((hr = pFileSystem->Init())) ) { delete pFileSystem; return hr; // Unable to init the ITSS store.
}
// attempt to open the .CHM file.
if (! SUCCEEDED((hr = pFileSystem->Open(szFileName))) ) { delete pFileSystem; return hr; // Unable to open and init the ITSS store.
}
while (true, ++i) { ULONG read =0; // attempt to open the stream.
pSubFileSystem = new CSubFileSystem(pFileSystem); if (! SUCCEEDED((hr = pSubFileSystem->OpenSub(szStreamName))) ) { delete pSubFileSystem; delete pFileSystem; return hr; // Unable to open the specified stream.
}
// alloc
*ppBuffer = new char[i * CHM_READ_BUFFER_INITIAL_SIZE]; if (*ppBuffer == NULL) { delete pSubFileSystem; delete pFileSystem; return S_FALSE; // THOUGH need to return error indicating disability to allocate memory
} // read.
hr = pSubFileSystem->ReadSub(*ppBuffer, i * CHM_READ_BUFFER_INITIAL_SIZE, &read);
if (read < ULONG(i * CHM_READ_BUFFER_INITIAL_SIZE)) { *pdwRead = read; break; } else { delete pSubFileSystem; delete [] *ppBuffer; } }
delete pSubFileSystem; delete pFileSystem; return hr; }
bool GetNetworkRelatedResourceDirFromReg(CString network, CString* path) { HKEY hKey = 0; CString sub_key = CString(TSREGKEY_TL) + "\\" + network;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, sub_key, NULL, KEY_READ, &hKey)) { DWORD dwType = REG_SZ; TCHAR buf[MAXBUF] = {_T('\0')}; DWORD dwSize = MAXBUF - 1;
if (ERROR_SUCCESS == RegQueryValueEx(hKey, FRIENDLY_PATH, NULL, &dwType, (LPBYTE)buf, &dwSize)) { *path = buf; return true; } }
return false; }
bool IsNetworkRelatedResourceDirCHM(CString path) { path.TrimRight(); CString extension = path.Right(4 * sizeof(TCHAR)); return 0 == extension.CompareNoCase(CHM_DEFAULT); }
CString ExtractResourceDir(CString path) { // For example, from string
// "d:\TShooter Projects\TShootLocal\http\lan_chm\lan.chm"
// need to extract "d:\TShooter Projects\TShootLocal\http\lan_chm"
int index =0; CString strCHM = ExtractCHM(path); CString strRes;
if (strCHM.GetLength()) { index = path.Find(strCHM); if (index > 0 && path.GetAt(index-sizeof(_T('\\'))) == _T('\\')) strRes = path.Left(index-sizeof(_T('\\'))); else if (index == 0) strRes = ""; }
return strRes; }
CString ExtractFileName(CString path) { // Extracts file name (with extension)
int index =0;
if (-1 == (index = path.ReverseFind(_T('\\')))) { if (-1 == (index = path.ReverseFind(_T(':')))) index = 0; else index += sizeof(_T(':')); } else index += sizeof(_T('\\'));
return (LPCTSTR)path + index; }
CString ExtractCHM(CString path) { // For example, from string
// "d:\TShooter Projects\TShootLocal\http\lan_chm\lan.chm"
// need to extract "lan.chm"
if (!IsNetworkRelatedResourceDirCHM(path)) return ""; return ExtractFileName(path); }
|