// FB2File.cpp : Implementation of CWSHtmlFile
#include "stdafx.h"
#include "FB2File.h"
#include "FB2Document/FB2Document.h"
#include "DocxDocument/DocxDocument.h"
#include "Converter/Converter.h"
#include
#include
#include
#include
// CFB2File
HRESULT CFB2File::FinalConstruct()
{
m_pOfficeUtils = NULL;
return CoCreateInstance(__uuidof(AVSOfficeUtils::COfficeUtils),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(AVSOfficeUtils::IOfficeUtils),
(void **)&(m_pOfficeUtils));
}
void CFB2File::FinalRelease()
{
if (m_pOfficeUtils != NULL )
{
m_pOfficeUtils->Release();
m_pOfficeUtils = NULL;
}
}
STDMETHODIMP CFB2File::LoadFromFile(BSTR sSrcFileName, BSTR sDstPath, BSTR sXMLOptions)
{
//надо ли вставлять содержание
bool bGenerateContent = false;
try
{
MSXML2::IXMLDOMDocumentPtr pXmlOpt( L"Msxml2.DOMDocument");
if (pXmlOpt->loadXML(sXMLOptions) == VARIANT_TRUE)
{
MSXML2::IXMLDOMNodePtr pXmlGenerateContent = pXmlOpt->selectSingleNode(L"Options/FB2Options/GenerateContent/@val");
if(NULL != pXmlGenerateContent )
{
CString sGenerateContent = pXmlGenerateContent->Gettext();
sGenerateContent.MakeLower();
if( _T("0") == sGenerateContent || _T("false") ==sGenerateContent )
bGenerateContent = false;
else
bGenerateContent = true;
}
}
}
catch(...)
{
}
CString fb2File = sSrcFileName;
CString docxPath = sDstPath;
CString fb2Path = docxPath + _T("/FB2");
CreateDirectoryW( docxPath, NULL );
CreateDirectoryW( fb2Path, NULL );
CopyFileW( fb2File, fb2Path + _T("\\1"), FALSE );
CString fb2FileInDir;
fb2FileInDir = (fb2Path + _T("\\1"));
CString origin = docxPath + _T("/Origin");
createOriginDocx(origin);
bool SetContent = true;
try
{
FB2Converter::FB2Document fb2;
FB2Converter::DocxDocument docx(origin, SetContent,bGenerateContent);
FB2Converter::Converter converter(bGenerateContent);
bool res;
res = fb2.Read(fb2FileInDir);
m_sMetadata = fb2.m_strMeta;
res = docx.Read();
res = converter.Convert(fb2, docx);
res = docx.Write(docxPath);
//копируем footer1.xml
CopyFileW(origin + _T("\\word\\footer1.xml"), docxPath + _T("\\word\\footer1.xml"), FALSE);
}
catch(...)
{
RemoveDir(fb2Path);
RemoveDir(origin);
return S_FALSE;
}
RemoveDir(fb2Path);
RemoveDir(origin);
return S_OK;
}
STDMETHODIMP CFB2File::SaveToFile(BSTR sDstFileName, BSTR sSrcPath, BSTR sXMLOptions)
{
return S_OK;
}
STDMETHODIMP CFB2File::SetAdditionalParam( BSTR ParamName, VARIANT ParamValue)
{
return S_OK;
}
STDMETHODIMP CFB2File::GetAdditionalParam( BSTR ParamName, VARIANT* ParamValue)
{
CComBSTR ParamStr = ParamName;
if (ParamStr == L"Metadata")
{
(*ParamValue).vt = VT_BSTR;
(*ParamValue).bstrVal = m_sMetadata.AllocSysString();
}
;
return S_OK;
}
void CFB2File::createOriginDocx(const CString path) const
{
CString docxFile = path + _T("/origin.docx");
CreateDirectoryW( path, NULL );
LoadFromResource(MAKEINTRESOURCE(IDR_DOCX_TEMPLATE), L"Document", _bstr_t(docxFile));
m_pOfficeUtils->ExtractToDirectory(_bstr_t(docxFile), _bstr_t(path), NULL, 0);
DeleteFileW(docxFile);
}
const unsigned long CFB2File::LoadFromResource(LPCWSTR lpResName, LPCWSTR lpResType, LPCWSTR fileName) const
{
HMODULE hMod = GetModuleHandle(_T("AVSOfficeFB2File.dll"));
if (hMod)
{
HRSRC hRes = FindResource(hMod, lpResName, lpResType);
if (hRes)
{
HGLOBAL hGlob = LoadResource(hMod, hRes);
if (hGlob)
{
BYTE *lpbArray = (BYTE*)LockResource(hGlob);
if (lpbArray)
{
const DWORD dwFileSize = SizeofResource(hMod, hRes);
if (dwFileSize != 0)
{
int hFile = 0;
if (!_wsopen_s(&hFile, fileName, (O_BINARY | O_CREAT | _O_RDWR ), _SH_DENYNO, S_IWRITE))
{
_write(hFile, lpbArray, dwFileSize);
_close(hFile);
}
}
}
}
}
}
return GetLastError();
}
int CFB2File::RemoveDir(const CString sPath )
{
DWORD dwFileAttrib = ::GetFileAttributes( sPath );
if( dwFileAttrib != INVALID_FILE_ATTRIBUTES )
{
DWORD dwResult = 0;
if( 0 != (FILE_ATTRIBUTE_DIRECTORY & dwFileAttrib) )
{
HANDLE Handle;
WIN32_FIND_DATA FindData;
DWORDLONG Result = 0;
Handle = FindFirstFile( ( sPath + _T("\\*.*") ), &FindData );
if ( Handle == INVALID_HANDLE_VALUE )
return 0;
do
{
BOOL bRes = TRUE;
if( ( CString( FindData.cFileName ) != _T(".") ) && ( CString( FindData.cFileName ) != _T("..") ) )
if( FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
Result += RemoveDir( sPath + _T("\\") + FindData.cFileName ); //
else
bRes = DeleteFile( sPath + _T("\\") + FindData.cFileName );
if( FALSE == bRes )
dwResult += 1;
}
while( FindNextFile( Handle, &FindData ) != 0 );
FindClose( Handle );
BOOL bRes = RemoveDirectory( sPath );
if( FALSE == bRes )
dwResult += 1;
}
else
{
if( FALSE == DeleteFile( sPath ) )
dwResult = 1;
}
return dwResult;
}// 0 - все закончилось хорошо
return 0;
}