Commit a621c993 authored by Sergey.Kirillov's avatar Sergey.Kirillov Committed by Alexander Trofimov

git-svn-id:...

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@52220 954022d7-b5bf-4e40-9824-e11837661b57
parent e9c1cfc2
......@@ -15,7 +15,7 @@ ASCOfficeFB2File/AVSOfficeFB2FileTest/AVSOfficeFB2FileTest/bin/Release/AVSOffice
ASCOfficeFB2File/AVSOfficeFB2FileTest/AVSOfficeFB2FileTest/bin/Release/AVSOfficeFB2FileTest.pdb svn_mime_002dtype=application%2Foctet-stream
ASCOfficeFB2File/AVSOfficeFB2FileTest/AVSOfficeFB2FileTest/bin/Release/AVSOfficeFB2FileTest.vshost.exe svn_mime_002dtype=application%2Foctet-stream
ASCOfficeFB2File/AVSOfficeFB2FileTest/AVSOfficeFB2FileTest/bin/Release/Interop.AVSOfficeFB2File.dll svn_mime_002dtype=application%2Foctet-stream
AVSOfficeFile/Watermark.h svn_mime_002dtype=application%2Foctet-stream
ASCOfficeFile/Watermark.h svn_mime_002dtype=application%2Foctet-stream
AVSOfficeHtmlFile/HTMLReaderLib/docs/HTML[!!-~]Reader[!!-~]C++[!!-~]Class[!!-~]Library[!!-~]-[!!-~]CodeProject_files/AddTo_Delicious.png svn_mime_002dtype=application%2Foctet-stream
AVSOfficeHtmlFile/HTMLReaderLib/docs/HTML[!!-~]Reader[!!-~]C++[!!-~]Class[!!-~]Library[!!-~]-[!!-~]CodeProject_files/AddTo_Digg.png svn_mime_002dtype=application%2Foctet-stream
AVSOfficeHtmlFile/HTMLReaderLib/docs/HTML[!!-~]Reader[!!-~]C++[!!-~]Class[!!-~]Library[!!-~]-[!!-~]CodeProject_files/AddTo_Facebook.png svn_mime_002dtype=application%2Foctet-stream
......
// AVSOfficeFile.cpp : Implementation of DLL Exports.
#include "stdafx.h"
#include "resource.h"
#include "OfficeFile.h"
#include "AVSOfficeFormatChecker.h"
// The module attribute causes DllMain, DllRegisterServer and DllUnregisterServer to be automatically implemented for you
[ module(dll, uuid = "{74cbf220-bf08-11de-8a39-0800200c9a66}",
name = "AVSOfficeFile",
helpstring = "AVSOfficeFile 1.0 Type Library",
resource_name = "IDR_AVSOFFICEFILE") ]
class CAVSOfficeFileModule
{
public:
// Override CAtlDllModuleT members
};
//Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
#define COMPONENT_NAME "OfficeFile"
#include "../../../../Common/FileInfo.h"
#include "version.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
LANGUAGE 25, 1
#pragma code_page(1251)
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#ifndef _MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION INTVER
PRODUCTVERSION INTVER
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904e4"
BEGIN
VALUE "CompanyName", COMPANY_NAME
VALUE "FileDescription", FILE_DESCRIPTION_ACTIVEX
VALUE "FileVersion", STRVER
VALUE "InternalName", COMPONENT_FILE_NAME_DLL
VALUE "LegalCopyright", LEGAL_COPYRIGHT
VALUE "LegalTrademarks", LEGAL_COPYRIGHT
VALUE "OriginalFilename", COMPONENT_FILE_NAME_DLL
VALUE "ProductName", FILE_DESCRIPTION_ACTIVEX
VALUE "ProductVersion", STRVER
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0409, 1252
END
END
#endif // !_MAC
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE
BEGIN
IDS_PROJNAME "AVSOfficeFile"
END
IDR_AVSOFFICEFILE REGISTRY "AVSOfficeFile.rgs"
////////////////////////////////////////////////////////////////////////////
#endif
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
HKCR
{
NoRemove AppID
{
'%APPID%' = s 'AVSOfficeFile'
'AVSOfficeFile.DLL'
{
val AppID = s '%APPID%'
}
}
}

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual C++ Express 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AVSOfficeFile", "AVSOfficeFile.vcproj", "{CF852DB8-5A50-4C30-B683-5503D8DAF7B3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
ReleaseASC|Win32 = ReleaseASC|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CF852DB8-5A50-4C30-B683-5503D8DAF7B3}.Debug|Win32.ActiveCfg = Debug|Win32
{CF852DB8-5A50-4C30-B683-5503D8DAF7B3}.Debug|Win32.Build.0 = Debug|Win32
{CF852DB8-5A50-4C30-B683-5503D8DAF7B3}.Release|Win32.ActiveCfg = Release|Win32
{CF852DB8-5A50-4C30-B683-5503D8DAF7B3}.Release|Win32.Build.0 = Release|Win32
{CF852DB8-5A50-4C30-B683-5503D8DAF7B3}.ReleaseASC|Win32.ActiveCfg = ReleaseASC|Win32
{CF852DB8-5A50-4C30-B683-5503D8DAF7B3}.ReleaseASC|Win32.Build.0 = ReleaseASC|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
Name="AVSOfficeFile"
ProjectGUID="{CF852DB8-5A50-4C30-B683-5503D8DAF7B3}"
RootNamespace="AVSOfficeFile"
Keyword="AtlProj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2"
UseOfATL="1"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="false"
TargetEnvironment="1"
GenerateStublessProxies="true"
TypeLibraryName="$(IntDir)/AVSOfficeFile.tlb"
HeaderFileName="AVSOfficeFile.h"
DLLDataFileName=""
InterfaceIdentifierFileName="AVSOfficeFile_i.c"
ProxyFileName="AVSOfficeFile_p.c"
ValidateParameters="false"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\..\..\Common;..\..\Common;..\..\AVSImageStudio3\Common"
PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;_USRDLL;_ATL_ATTRIBUTES"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="2"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"
AdditionalIncludeDirectories="$(IntDir)"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
RegisterOutput="true"
IgnoreImportLibrary="true"
LinkIncremental="2"
MergedIDLBaseFileName="_AVSOfficeFile.idl"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
CommandLine=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2"
UseOfATL="1"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="false"
TargetEnvironment="1"
GenerateStublessProxies="true"
TypeLibraryName="$(IntDir)/AVSOfficeFile.tlb"
HeaderFileName="AVSOfficeFile.h"
DLLDataFileName=""
InterfaceIdentifierFileName="AVSOfficeFile_i.c"
ProxyFileName="AVSOfficeFile_p.c"
ValidateParameters="false"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
AdditionalIncludeDirectories="..\..\..\..\Common;..\..\Common;..\..\AVSImageStudio3\Common"
PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;_USRDLL;_ATL_ATTRIBUTES"
RuntimeLibrary="2"
UsePrecompiledHeader="2"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"
AdditionalIncludeDirectories="$(IntDir)"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
RegisterOutput="true"
IgnoreImportLibrary="true"
LinkIncremental="1"
MergedIDLBaseFileName="_AVSOfficeFile.idl"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
Description="Copy to redist"
CommandLine="copy $(TargetPath) ..\..\..\..\AVS\Redist\AVSOfficeStudio\AVSOfficeFile.dll"
/>
</Configuration>
<Configuration
Name="ReleaseASC|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2"
UseOfATL="1"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine="..\..\..\..\AVS\Redist\VersionControl.exe &quot;$(SolutionDir)\version.h&quot;"
ExcludedFromBuild="true"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="false"
TargetEnvironment="1"
GenerateStublessProxies="true"
TypeLibraryName="$(IntDir)/AVSOfficeFile.tlb"
HeaderFileName="AVSOfficeFile.h"
DLLDataFileName=""
InterfaceIdentifierFileName="AVSOfficeFile_i.c"
ProxyFileName="AVSOfficeFile_p.c"
ValidateParameters="false"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
AdditionalIncludeDirectories="..\..\..\..\Common;..\..\Common;..\..\AVSImageStudio3\Common"
PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;_USRDLL;_ATL_ATTRIBUTES;AVS_REMOVE_REG"
RuntimeLibrary="2"
UsePrecompiledHeader="2"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG;ASCBUILD"
Culture="1033"
AdditionalIncludeDirectories="$(IntDir)"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
RegisterOutput="true"
IgnoreImportLibrary="true"
OutputFile="$(OutDir)\ASCOfficeFile.dll"
LinkIncremental="1"
MergedIDLBaseFileName="_AVSOfficeFile.idl"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
Description="Copy to redist"
CommandLine="copy $(TargetPath) ..\..\..\..\ASC\Redist\ASCOfficeStudio\ASCOfficeFile.dll"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\AVSOfficeFile.cpp"
>
</File>
<File
RelativePath=".\stdafx.cpp"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"
/>
</FileConfiguration>
<FileConfiguration
Name="ReleaseASC|Win32"
>
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"
/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\AVSOfficeFormatChecker.h"
>
</File>
<File
RelativePath=".\FormatChecker.h"
>
</File>
<File
RelativePath=".\OfficeEventsTemplate.h"
>
</File>
<File
RelativePath=".\OfficeFile.h"
>
</File>
<File
RelativePath=".\OfficeFileConverter.h"
>
</File>
<File
RelativePath=".\OfficeFileEvents.h"
>
</File>
<File
RelativePath=".\Resource.h"
>
</File>
<File
RelativePath=".\stdafx.h"
>
</File>
<File
RelativePath=".\StorageConverters.h"
>
</File>
<File
RelativePath="..\AVSOfficeUniversalConverter\Utils.h"
>
</File>
<File
RelativePath=".\version.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
RelativePath=".\AVSOfficeFile.rc"
>
</File>
<File
RelativePath=".\AVSOfficeFile.rgs"
>
</File>
</Filter>
<Filter
Name="Common"
>
<File
RelativePath="..\Common\OfficeDefines.h"
>
</File>
<File
RelativePath="..\Common\OfficeFileErrorDescription.h"
>
</File>
<File
RelativePath="..\Common\OfficeFileFormats.h"
>
</File>
<File
RelativePath="..\Common\OfficeFileTemplate.h"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
#pragma once
#include "resource.h"
#include "..\Common\OfficeFileFormats.h"
#include "TemporaryCS.h"
[
object,
uuid("498741e0-b8a1-11de-8a39-0800200c9a66"),
dual, helpstring("IAVSDocumentConverter Interface"),
pointer_default(unique)
]
__interface IAVSOfficeFormatChecker : IDispatch
{
[id(10), helpstring("method copy")] HRESULT GetFileFormat([in] BSTR bstrFilename, [out,retval] LONG* pnFormat);
[id(30), helpstring("method copy")] HRESULT CanConvert([in] LONG nSource, [in] LONG nDestination ,[out,retval] VARIANT_BOOL* pbResult);
[id(40), helpstring("method copy")] HRESULT CanView([in] LONG nFileFormat, [out,retval] VARIANT_BOOL* pbResult);
};
[
coclass,
default(IAVSOfficeFormatChecker),
event_receiver(native),
threading(apartment),
vi_progid("AVSOfficeUniversalConverter.AVSDocume"),
progid("AVSOfficeUniversalConverter.AVSDocu.1"),
version(1.0),
uuid("58bf6fc0-b8a1-11de-8a39-0800200c9a66"),
helpstring("AVSOfficeFormatChecker Class")
]
class ATL_NO_VTABLE CAVSOfficeFormatChecker : public IAVSOfficeFormatChecker
{
private:CRITICAL_SECTION m_csThread;
public:
CAVSOfficeFormatChecker()
{
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
InitializeCriticalSection(&m_csThread);
return S_OK;
}
void FinalRelease()
{
DeleteCriticalSection(&m_csThread);
}
public:
STDMETHOD(GetFileFormat)( BSTR bstrFilename, LONG* pnFormat)
{
AVSOfficeFormatChecker avsOfficeFormatChecker;
CTemporaryCS oCS(&m_csThread);
if( NULL == pnFormat )
return S_FALSE;
(*pnFormat) =avsOfficeFormatChecker.GetFileFormat( CString(bstrFilename) );
return S_OK;
}
STDMETHOD(CanConvert)( LONG nSource, LONG nDestination , VARIANT_BOOL* bResult)
{
CTemporaryCS oCS(&m_csThread);
AVSOfficeFormatChecker avsOfficeFormatChecker;
if( NULL == bResult )
return S_FALSE;
if( false == avsOfficeFormatChecker.CanConvert( nSource, nDestination ) )
(*bResult) = VARIANT_FALSE;
else
(*bResult) = VARIANT_TRUE;
return S_OK;
}
STDMETHOD(CanView)( LONG nFileFormat , VARIANT_BOOL* bResult)
{
AVSOfficeFormatChecker avsOfficeFormatChecker;
CTemporaryCS oCS(&m_csThread);
if( NULL == bResult )
return S_FALSE;
if( false == avsOfficeFormatChecker.CanView( nFileFormat ) )
(*bResult) = VARIANT_FALSE;
else
(*bResult) = VARIANT_TRUE;
return S_OK;
}
};
\ No newline at end of file
#pragma once
#include "../Common/OfficeFileFormats.h"
#include "../Common/OfficeFileErrorDescription.h"
#include <string>
#include "XmlUtils.h"
#import "./../../Redist/AVSOfficeStudio/AVSOfficeUtils.dll" raw_interfaces_only
class AVSOfficeFormatChecker{
private: AVSOfficeUtils::IOfficeUtils2* m_pOfficeUtils;
private: static const long mc_aFormatTable[][2];
private: static const int mc_nFormatTableSize;
private: static const long mc_aViewTable[];
private: static const int mc_nViewTableSize;
public: AVSOfficeFormatChecker()
{
m_pOfficeUtils = NULL;
CoCreateInstance(__uuidof(AVSOfficeUtils::COfficeUtils),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(AVSOfficeUtils::IOfficeUtils2),
(void **)&(m_pOfficeUtils));
}
public: ~AVSOfficeFormatChecker()
{
if (m_pOfficeUtils != NULL)
{
m_pOfficeUtils->Release();
m_pOfficeUtils = NULL;
}
}
//nSource - define
//nDestination - define
public: bool CanConvert( long nSource, long nDestination )
{
////
//for( int i = 0; i < mc_nFormatTableSize; i++ )
//{
// if( mc_aFormatTable[i][0] == nSource && mc_aFormatTable[i][1] == nDestination )
// {
// return true;
// }
//}
//// docx
//bool bDocxContainer = false;
//for( int i = 0; i < mc_nFormatTableSize; i++ )
//{
// if( mc_aFormatTable[i][0] == nSource && mc_aFormatTable[i][1] == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX )
// {
// bDocxContainer = true;
// break;
// }
//}
//if( true == bDocxContainer )
// for( int i = 0; i < mc_nFormatTableSize; i++ )
// {
// if( mc_aFormatTable[i][0] == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX && mc_aFormatTable[i][1] == nDestination )
// return true;
// }
//// xlsx
//bool bXlsxContainer = false;
//for( int i = 0; i < mc_nFormatTableSize; i++ )
//{
// if( mc_aFormatTable[i][0] == nSource && mc_aFormatTable[i][1] == AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX )
// {
// bXlsxContainer = true;
// break;
// }
//}
//if( true == bXlsxContainer )
// for( int i = 0; i < mc_nFormatTableSize; i++ )
// {
// if( mc_aFormatTable[i][0] == AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX && mc_aFormatTable[i][1] == nDestination )
// return true;
// }
//return false;
return true;
}
public: bool CanView( long nSource )
{
////
//for( int i = 0; i < mc_nViewTableSize; i++ )
// if( mc_aViewTable[i] == nSource )
// return true;
//return false;
return true;
}
//sFileName -
//return - , ,
public: long GetFileFormat( CString sFileName )
{
long lError;
long format = AVS_OFFICESTUDIO_FILE_UNKNOWN;
// ,
// txt
if( TRUE == IsEmptyFile( sFileName, lError ) )
return AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT;
//
if( TRUE == IsRTFFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF;
else if( TRUE == IsPDFFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF;
else if ( TRUE == IsFB2File( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2;
else if( TRUE == IsDJVUFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU;
else if( TRUE == IsMOBIFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI;
else
format = IsImageFile(sFileName, lError);
if (format != AVS_OFFICESTUDIO_FILE_UNKNOWN)
return format;
//
IStorage* storage = IsStorageType( sFileName );
if (storage != NULL)
{
if( TRUE == IsDOCFile( storage, lError ) )
format = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC;
else if( TRUE == IsXLSFile( storage, lError ) )
format = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS;
else if( TRUE == IsPPTFile( storage, lError ) )
format = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT;
else if( TRUE == IsMS_OFFCRYPTOFile( storage, lError ) )
format = AVS_OFFICESTUDIO_FILE_OTHER_MS_OFFCRYPTO;
storage->Release();
}
else if (IsArchiveType( sFileName ))
{
if ( TRUE == IsDOCXFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX;
else if ( TRUE == IsXLSXFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX;
else if ( TRUE == IsPPTXFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX;
else if ( TRUE == IsODTFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT;
else if ( TRUE == IsODPFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP;
else if ( TRUE == IsODSFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS;
else if ( TRUE == IsEPUBFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB;
else if ( TRUE == IsXPSFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS;
}
//
else
{
TCHAR tBuffer[256];
_tsplitpath( sFileName, NULL,NULL,NULL, tBuffer );
CString sExtention( tBuffer );
CharLower( sExtention.GetBuffer() );
sExtention.ReleaseBuffer();
if ( _T(".mht") == sExtention )
format = AVS_OFFICESTUDIO_FILE_DOCUMENT_MHT;
else if ( _T(".txt") == sExtention || _T(".xml") == sExtention || _T(".xslt") == sExtention )
format = AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT;
else if( _T(".csv") == sExtention )
format = AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV;
else if( _T(".svg") == sExtention )
format = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SVG;
else if ( _T(".html") == sExtention || _T(".htm") == sExtention )
format = AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML;
else
{
// html
//
if ( TRUE == IsHtmlFile( sFileName, lError ) )
format = AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML;
}
}
return format;
}
private: BOOL IsEmptyFile(const CString &sFilePath, long &lError)
{
lError = NOERROR;
HANDLE hFile;
hFile = ::CreateFile( sFilePath , GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE==hFile)
{
lError = AVS_ERROR_FILEACCESS;
return FALSE;
}
DWORD dwDataSize = GetFileSize(hFile, NULL);
::CloseHandle(hFile);
if(INVALID_FILE_SIZE != dwDataSize && 0 == dwDataSize)
return TRUE;
return FALSE;
}
private: BOOL IsRTFFile(const CString &sFilePath, long &lError)
{
lError = NOERROR;
BYTE pBuffer[ 5 ];
DWORD dwBytesRead;
HANDLE hFile;
hFile = ::CreateFile( sFilePath , GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE==hFile)
{
lError = AVS_ERROR_FILEACCESS;
return FALSE;
}
::ReadFile( hFile, pBuffer, 5, &dwBytesRead, NULL );
::CloseHandle(hFile);
if( (5 <= dwBytesRead) && '{' == pBuffer[0] && '\\' == pBuffer[1] && 'r' == pBuffer[2] && 't' == pBuffer[3] && 'f' == pBuffer[4] )
return TRUE;
return FALSE;
}
private: BOOL IsMOBIFile(const CString &sFilePath, long &lError)
{
lError = NOERROR;
BYTE pBuffer[ 70 ];
DWORD dwBytesRead;
HANDLE hFile;
hFile = ::CreateFile( sFilePath , GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE==hFile)
{
lError = AVS_ERROR_FILEACCESS;
return FALSE;
}
::ReadFile( hFile, pBuffer, 70, &dwBytesRead, NULL );
::CloseHandle(hFile);
if (70 > dwBytesRead)
return FALSE;
if ((pBuffer[60] == (BYTE)'B') &&
(pBuffer[61] == (BYTE)'O') &&
(pBuffer[62] == (BYTE)'O') &&
(pBuffer[63] == (BYTE)'K') &&
(pBuffer[64] == (BYTE)'M') &&
(pBuffer[65] == (BYTE)'O') &&
(pBuffer[66] == (BYTE)'B') &&
(pBuffer[67] == (BYTE)'I'))
return TRUE;
if ((pBuffer[60] == (BYTE)'T') &&
(pBuffer[61] == (BYTE)'E') &&
(pBuffer[62] == (BYTE)'X') &&
(pBuffer[63] == (BYTE)'t') &&
(pBuffer[64] == (BYTE)'R') &&
(pBuffer[65] == (BYTE)'E') &&
(pBuffer[66] == (BYTE)'A') &&
(pBuffer[67] == (BYTE)'d'))
return TRUE;
return FALSE;
}
private: BOOL IsPDFFile(const CString &sFilePath, long &lError)
{
lError = NOERROR;
BYTE pBuffer[ 20 ];
DWORD dwBytesRead;
HANDLE hFile;
hFile = ::CreateFile(sFilePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (INVALID_HANDLE_VALUE == hFile)
{
lError = AVS_ERROR_FILEACCESS;
return FALSE;
}
::ReadFile(hFile, pBuffer, 19, &dwBytesRead, NULL);
::CloseHandle(hFile);
pBuffer[dwBytesRead] = '\0';
char* pFirst = strstr( (char*)pBuffer, "%PDF-" );
if( NULL != pFirst )
return TRUE;
return FALSE;
}
private: BOOL IsDJVUFile(const CString &sFilePath, long &lError)
{
lError = NOERROR;
BYTE pBuffer[ 8 ];
DWORD dwBytesRead;
HANDLE hFile;
hFile = ::CreateFile(sFilePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (INVALID_HANDLE_VALUE == hFile)
{
lError = AVS_ERROR_FILEACCESS;
return FALSE;
}
::ReadFile(hFile, pBuffer, 8, &dwBytesRead, NULL);
::CloseHandle(hFile);
//djvu
//Hex: 41 54 26 54 46 4f 52 4d
//ASCII: AT&TFORM
if ( 8 <= dwBytesRead )
{
if ( (0x41 == pBuffer[0]) && (0x54 == pBuffer[1]) && (0x26 == pBuffer[2]) && (0x54 == pBuffer[3]) && (0x46 == pBuffer[4]) && (0x4f == pBuffer[5]) && (0x52 == pBuffer[6]) && (0x4d == pBuffer[7]))
return TRUE;
}
return FALSE;
}
private: BOOL IsDOCFile(IStorage* storage, long &lError)
{
lError = NOERROR;
IStream* stream = NULL;
HRESULT hresult = storage->OpenStream( L"WordDocument", NULL, ( STGM_READ | STGM_DIRECT | STGM_SHARE_EXCLUSIVE ),
NULL, &stream );
if ( stream != NULL )
stream->Release();
return hresult == S_OK? TRUE: FALSE;
}
private: int IsImageFile(const CString &sFilePath, long &lError)
{
lError = NOERROR;
BYTE pBuffer[ 44 ];
DWORD dwBytesRead;
HANDLE hFile;
hFile = ::CreateFile(sFilePath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (INVALID_HANDLE_VALUE == hFile)
{
return AVS_OFFICESTUDIO_FILE_UNKNOWN;
}
::ReadFile(hFile, pBuffer, 44, &dwBytesRead, NULL);
::CloseHandle(hFile);
//jpeg
// Hex: FF D8 FF
if ( (3 <= dwBytesRead) && (0xFF == pBuffer[0]) && (0xD8 == pBuffer[1]) && (0xFF == pBuffer[2]) )
return AVS_OFFICESTUDIO_FILE_IMAGE_JPG;
//bmp ( http://ru.wikipedia.org/wiki/BMP )
//Hex: 42 4D
//ASCII: BM
//Hex (position 6) : 00 00
//Hex (position 26): 01 00
//Hex (position 28): 00 || 01 || 04 || 08 || 10 || 18 || 20
//Hex (position 29): 00
//Hex (position 30): 00 || 01 || 02 || 03 || 04 || 05
//Hex (position 31): 00 00 00
if ( (34 <= dwBytesRead) && (0x42 == pBuffer[0]) && (0x4D == pBuffer[1]) &&
(0x00 == pBuffer[6]) && (0x00 == pBuffer[7]) && (0x01 == pBuffer[26]) && (0x00 == pBuffer[27]) &&
( (0x00 == pBuffer[28]) || (0x01 == pBuffer[28]) || (0x04 == pBuffer[28]) || (0x08 == pBuffer[28]) ||
(0x10 == pBuffer[28]) || (0x18 == pBuffer[28]) || (0x20 == pBuffer[28]) ) && (0x00 == pBuffer[29]) &&
( (0x00 == pBuffer[30]) || (0x01 == pBuffer[30]) || (0x02 == pBuffer[30]) || (0x03 == pBuffer[30]) ||
(0x04 == pBuffer[30]) || (0x05 == pBuffer[30]) ) && (0x00 == pBuffer[31]) && (0x00 == pBuffer[32]) && (0x00 == pBuffer[33]) )
return AVS_OFFICESTUDIO_FILE_IMAGE_BMP;
//gif
//Hex: 47 49 46 38
//ASCII: GIF8
//or for GIF87a...
//Hex: 47 49 46 38 37 61
//ASCII: GIF87a
//or for GIF89a...
//Hex: 47 49 46 38 39 61
//ASCII: GIF89a
if ( (4 <= dwBytesRead) && (0 == strncmp( (char *)pBuffer, "GIF8", 4)))
return AVS_OFFICESTUDIO_FILE_IMAGE_GIF;
if ( (6 <= dwBytesRead) && ( (0 == strncmp( (char *)pBuffer, "GIF87a", 6)) || (0 == strncmp((char *)pBuffer, "GIF89a", 6)) ) )
return AVS_OFFICESTUDIO_FILE_IMAGE_GIF;
//png
//Hex: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
//ASCII: .PNG........IHDR
if ( (16 <= dwBytesRead) && (0x89 == pBuffer[0]) && (0x50 == pBuffer[1]) && (0x4E == pBuffer[2]) && (0x47 == pBuffer[3])
&& (0x0D == pBuffer[4]) && (0x0A == pBuffer[5]) && (0x1A == pBuffer[6]) && (0x0A == pBuffer[7])
&& (0x00 == pBuffer[8]) && (0x00 == pBuffer[9]) && (0x00 == pBuffer[10]) && (0x0D == pBuffer[11])
&& (0x49 == pBuffer[12]) && (0x48 == pBuffer[13]) && (0x44 == pBuffer[14]) && (0x52 == pBuffer[15]))
return AVS_OFFICESTUDIO_FILE_IMAGE_PNG;
//CR2
//Hex: 49 49 2A 00 10 00 00 00 43 52
//ASCII: II*.....CR
if ( (10 <= dwBytesRead ) && (0x49 == pBuffer[0]) && (0x49 == pBuffer[1]) && (0x2A == pBuffer[2])
&& (0x00 == pBuffer[3]) && (0x10 == pBuffer[4]) && (0x00 == pBuffer[5]) && (0x00 == pBuffer[6])
&& (0x00 == pBuffer[7]) && (0x43 == pBuffer[8]) && (0x52 == pBuffer[9]) )
return AVS_OFFICESTUDIO_FILE_IMAGE_CR2;
//tiff
//Hex: 49 49 2A 00
//ASCII:
//or for big endian
//Hex: 4D 4D 00 2A
//ASCII: MM.*
//or for little endian
//Hex: 49 49 2A 00
//ASCII: II*
if ( 4 <= dwBytesRead )
{
if ( ( (0x49 == pBuffer[0]) && (0x49 == pBuffer[1]) && (0x2A == pBuffer[2]) && (0x00 == pBuffer[3]) ) ||
( (0x4D == pBuffer[0]) && (0x4D == pBuffer[1]) && (0x00 == pBuffer[2]) && (0x2A == pBuffer[3]) ) ||
( (0x49 == pBuffer[0]) && (0x49 == pBuffer[1]) && (0x2A == pBuffer[2]) && (0x00 == pBuffer[3]) ))
return AVS_OFFICESTUDIO_FILE_IMAGE_TIFF;
}
//wmf
//Hex: D7 CD C6 9A 00 00
//or for Windows 3.x
//Hex: 01 00 09 00 00 03
if ( 6 <= dwBytesRead )
{
if ( ((0xD7 == pBuffer[0]) && (0xCD == pBuffer[1]) && (0xC6 == pBuffer[2]) && (0x9A == pBuffer[3])&& (0x00 == pBuffer[4]) && (0x00 == pBuffer[5]) ) ||
((0x01 == pBuffer[0]) && (0x00 == pBuffer[1]) && (0x09 == pBuffer[2]) && (0x00 == pBuffer[3]) && (0x00 == pBuffer[4]) && (0x03 == pBuffer[5]) ))
return AVS_OFFICESTUDIO_FILE_IMAGE_WMF;
}
//emf ( http://wvware.sourceforge.net/caolan/ora-wmf.html )
//Hex: 01 00 00 00
//Hex (position 40): 20 45 4D 46
if ( (44 <= dwBytesRead) && (0x01 == pBuffer[0]) && (0x00 == pBuffer[1]) && (0x00 == pBuffer[2]) && (0x00 == pBuffer[3]) &&
(0x20 == pBuffer[40]) && (0x45 == pBuffer[41]) && (0x4D == pBuffer[42]) && (0x46 == pBuffer[43]) )
return AVS_OFFICESTUDIO_FILE_IMAGE_EMF;
//pcx ( http://www.fileformat.info/format/pcx/corion.htm )
//Hex (position 0): 0A
//Hex (position 1): 00 || 01 || 02 || 03 || 04 || 05
//Hex (position 3): 01 || 02 || 04 || 08 ( Bytes per pixel )
if ( (4 <= dwBytesRead) && (0x0A == pBuffer[0]) && (0x00 == pBuffer[1] || 0x01 == pBuffer[1] ||
0x02 == pBuffer[1] || 0x03 == pBuffer[1] || 0x04 == pBuffer[1] || 0x05 == pBuffer[1] ) &&
( 0x01 == pBuffer[3] || 0x02 == pBuffer[3] || 0x04 == pBuffer[3] || 0x08 == pBuffer[3] ))
return AVS_OFFICESTUDIO_FILE_IMAGE_PCX;
//tga ( http://www.fileformat.info/format/tga/corion.htm )
//DATA TYPE 1-COLOR-MAPPED IMAGES : Hex (position 1) : 01 01
//DATA TYPE 2-TRUE-COLOR IMAGES : Hex (position 1) : 00 02
//DATA TYPE 3-BLACK AND WHITE(UNMAPPED) IMAGES : Hex (position 1) : 00 03
//DATA TYPE 9-RUN-LENGTH ENCODED(RLE),COLOR-MAPPED IMAGES : Hex (position 1) : 01 09
//DATA TYPE 10-RUN-LENGTH ENCODED(RLE),TRUE-COLOR IMAGES : Hex (position 1) : 00 0A
//DATA TYPE 11-RUN-LENGTH ENCODED(RLE),BLACK AND WHITE IMAGES : Hex (position 1) : 00 0B
// + Bytes per pixel : Hex (position 16): 0x08 || 0x10 || 0x18 || 0x20
if ( (17 <= dwBytesRead) && ( (0x01 == pBuffer[1] && 0x01 == pBuffer[2]) || (0x00 == pBuffer[1] && 0x02 == pBuffer[2]) ||
(0x00 == pBuffer[1] && 0x03 == pBuffer[2]) || (0x01 == pBuffer[1] && 0x09 == pBuffer[2]) ||
(0x00 == pBuffer[1] && 0x0A == pBuffer[2]) || (0x00 == pBuffer[1] && 0x0B == pBuffer[2]) )
&& ( 0x08 == pBuffer[16] || 0x10 == pBuffer[16] || 0x18 == pBuffer[16] || 0x20 == pBuffer[16] ))
return AVS_OFFICESTUDIO_FILE_IMAGE_TGA;
//ras
//Hex: 59 A6 6A 95
//ASCII: Y
if ( (4 <= dwBytesRead ) && (0x59 == pBuffer[0]) && (0xA6 == pBuffer[1]) && (0x6A == pBuffer[2])&& (0x95 == pBuffer[3]))
return AVS_OFFICESTUDIO_FILE_IMAGE_RAS;
//ipod
//(None or Unknown)
//psd
//Hex: 38 42 50 53 00 01 00 00 00 00 00 00 00
//ASCII: 8BPS
if ( (13 <= dwBytesRead ) && (0x38 == pBuffer[0]) && (0x42 == pBuffer[1]) && (0x50 == pBuffer[2])
&& (0x53 == pBuffer[3]) && (0x00 == pBuffer[4]) && (0x01 == pBuffer[5]) && (0x00 == pBuffer[6])
&& (0x00 == pBuffer[7]) && (0x00 == pBuffer[8]) && (0x00 == pBuffer[9]) && (0x00 == pBuffer[10])
&& (0x00 == pBuffer[11]) && (0x00 == pBuffer[12]))
return AVS_OFFICESTUDIO_FILE_IMAGE_PSD;
return AVS_OFFICESTUDIO_FILE_UNKNOWN;
}
private: BOOL IsXLSFile(IStorage* storage, long &lError)
{
lError = NOERROR;
IStream* stream = NULL;
HRESULT hresult = storage->OpenStream( L"Workbook", NULL, ( STGM_READ | STGM_DIRECT | STGM_SHARE_EXCLUSIVE ),
NULL, &stream );
if ( stream != NULL )
stream->Release();
return hresult == S_OK? TRUE: FALSE;
}
private: BOOL IsPPTFile(IStorage* storage, long &lError)
{
lError = NOERROR;
IStream* stream = NULL;
HRESULT hresult = storage->OpenStream( L"PowerPoint Document", NULL, ( STGM_READ | STGM_DIRECT | STGM_SHARE_EXCLUSIVE ),
NULL, &stream );
if ( stream != NULL )
stream->Release();
return hresult == S_OK? TRUE: FALSE;
}
private: BOOL IsMS_OFFCRYPTOFile(IStorage* storage, long &lError)
{
lError = NOERROR;
IStorage* storageDataSpaces = NULL;
HRESULT hresult = storage->OpenStorage( L"\006DataSpaces", NULL, STGM_SHARE_EXCLUSIVE, NULL, 0, &(storageDataSpaces) );
if ( storageDataSpaces != NULL )
storageDataSpaces->Release();
return hresult == S_OK? TRUE: FALSE;
}
private: IStorage* IsStorageType(const CString &sFilePath)
{
IStorage* storage;
storage = NULL;
StgOpenStorage( sFilePath, NULL, STGM_READ | STGM_TRANSACTED | STGM_SHARE_DENY_NONE,
NULL, 0, &(storage) );
return storage;
}
private: BOOL IsArchiveType(const CString &sFilePath)
{
HRESULT hresult = S_FALSE;
if (m_pOfficeUtils != NULL)
{
CStringW sTemp = sFilePath;
BSTR bstrFilePath = sTemp.AllocSysString();
hresult = m_pOfficeUtils->IsArchive(bstrFilePath);
SysFreeString( bstrFilePath );
}
return hresult == S_OK? TRUE: FALSE;
}
private: BOOL IsDOCXFile(const CString &sFilePath, long &lError)
{
lError = NOERROR;
HRESULT hresult = S_FALSE;
if (m_pOfficeUtils != NULL)
{
CStringW sTemp = sFilePath;
BSTR bstrFilePath = sTemp.AllocSysString();
hresult = m_pOfficeUtils->IsFileExistInArchive(bstrFilePath, L"word/document.xml");
SysFreeString( bstrFilePath );
}
return hresult == S_OK? TRUE: FALSE;
}
private: BOOL IsXPSFile(const CString &sFilePath, long &lError)
{
HRESULT hresult = S_FALSE;
if (m_pOfficeUtils != NULL)
{
BYTE* pBuffer = NULL;
const char *xpsFormatLine = "http://schemas.microsoft.com/xps/2005/06/fixedrepresentation";
CStringW sTemp = sFilePath;
BSTR bstrFilePath = sTemp.AllocSysString();
hresult = m_pOfficeUtils->LoadFileFromArchive(bstrFilePath, L"_rels/.rels", &pBuffer);
if (hresult == S_OK && pBuffer != NULL)
{
if (!strstr((char*)pBuffer, xpsFormatLine))
hresult = S_FALSE;
}
else
{// XPS
hresult = m_pOfficeUtils->LoadFileFromArchive(bstrFilePath, L"_rels/.rels/[0].piece", &pBuffer);
if (hresult != S_OK || pBuffer == NULL)
hresult = S_FALSE;
}
SysFreeString( bstrFilePath );
RELEASEHEAP(pBuffer);
}
return hresult == S_OK? TRUE: FALSE;
}
private: BOOL IsXLSXFile(const CString &sFilePath, long &lError)
{
lError = NOERROR;
HRESULT hresult = S_FALSE;
if (m_pOfficeUtils != NULL)
{
CStringW sTemp = sFilePath;
BSTR bstrFilePath = sTemp.AllocSysString();
hresult = m_pOfficeUtils->IsFileExistInArchive(bstrFilePath, L"xl/workbook.xml");
SysFreeString( bstrFilePath );
}
return hresult == S_OK? TRUE: FALSE;
}
private: BOOL IsPPTXFile(const CString &sFilePath, long &lError)
{
lError = NOERROR;
HRESULT hresult = S_FALSE;
if (m_pOfficeUtils != NULL)
{
CStringW sTemp = sFilePath;
BSTR bstrFilePath = sTemp.AllocSysString();
hresult = m_pOfficeUtils->IsFileExistInArchive(bstrFilePath, L"ppt/presentation.xml");
SysFreeString( bstrFilePath );
}
return hresult == S_OK? TRUE: FALSE;
}
private: BOOL IsODTFile(const CString &sFilePath, long &lError)
{
HRESULT hresult = S_FALSE;
if (m_pOfficeUtils != NULL)
{
BYTE* pBuffer = NULL;
const char *odtFormatLine = "application/vnd.oasis.opendocument.text";
CStringW sTemp = sFilePath;
BSTR bstrFilePath = sTemp.AllocSysString();
hresult = m_pOfficeUtils->LoadFileFromArchive(bstrFilePath, L"mimetype", &pBuffer);
if (hresult == S_OK && pBuffer != NULL)
{
if (!strstr((char*)pBuffer, odtFormatLine))
hresult = S_FALSE;
}
SysFreeString( bstrFilePath );
RELEASEHEAP(pBuffer);
}
return hresult == S_OK? TRUE: FALSE;
}
private: BOOL IsODPFile(const CString &sFilePath, long &lError)
{
HRESULT hresult = S_FALSE;
if (m_pOfficeUtils != NULL)
{
BYTE* pBuffer = NULL;
const char *odtFormatLine = "application/vnd.oasis.opendocument.presentation";
CStringW sTemp = sFilePath;
BSTR bstrFilePath = sTemp.AllocSysString();
hresult = m_pOfficeUtils->LoadFileFromArchive(bstrFilePath, L"mimetype", &pBuffer);
if (hresult == S_OK && pBuffer != NULL)
{
if (!strstr((char*)pBuffer, odtFormatLine))
hresult = S_FALSE;
}
SysFreeString( bstrFilePath );
RELEASEHEAP(pBuffer);
}
return hresult == S_OK? TRUE: FALSE;
}
private: BOOL IsODSFile(const CString &sFilePath, long &lError)
{
HRESULT hresult = S_FALSE;
if (m_pOfficeUtils != NULL)
{
BYTE* pBuffer = NULL;
const char *odtFormatLine = "application/vnd.oasis.opendocument.spreadsheet";
CStringW sTemp = sFilePath;
BSTR bstrFilePath = sTemp.AllocSysString();
hresult = m_pOfficeUtils->LoadFileFromArchive(bstrFilePath, L"mimetype", &pBuffer);
if (hresult == S_OK && pBuffer != NULL)
{
if (!strstr((char*)pBuffer, odtFormatLine))
hresult = S_FALSE;
}
SysFreeString( bstrFilePath );
RELEASEHEAP(pBuffer);
}
return hresult == S_OK? TRUE: FALSE;
}
private: BOOL IsEPUBFile(const CString &sFilePath, long &lError)
{
HRESULT hresult = S_FALSE;
if (m_pOfficeUtils != NULL)
{
BYTE* pBuffer = NULL;
const char *odtFormatLine = "application/epub+zip";
CStringW sTemp = sFilePath;
BSTR bstrFilePath = sTemp.AllocSysString();
hresult = m_pOfficeUtils->LoadFileFromArchive(bstrFilePath, L"mimetype", &pBuffer);
if (hresult == S_OK && pBuffer != NULL)
{
if (!strstr((char*)pBuffer, odtFormatLine))
hresult = S_FALSE;
}
SysFreeString( bstrFilePath );
RELEASEHEAP(pBuffer);
}
return hresult == S_OK? TRUE: FALSE;
}
private: BOOL IsFB2File(const CString &sFilePath, long &lError)
{
HRESULT hresult = S_FALSE;
lError = NOERROR;
BYTE pBuffer[ 100 ];
DWORD dwBytesRead;
HANDLE hFile;
hFile = ::CreateFile(sFilePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (INVALID_HANDLE_VALUE == hFile)
{
lError = AVS_ERROR_FILEACCESS;
return FALSE;
}
::ReadFile(hFile, pBuffer, 100, &dwBytesRead, NULL);
::CloseHandle(hFile);
bool tagOpen = false;
//FB2 File is XML-file with rootElement - FictionBook
for (size_t i = 0; i < 100 - 11; i++)
{
if (0x3C == pBuffer[i])
tagOpen = true;
else if (0x3E == pBuffer[i])
tagOpen = false;
else if (tagOpen && 0x46 == pBuffer[i] && 0x69 == pBuffer[i + 1] && 0x63 == pBuffer[i + 2]
&& 0x74 == pBuffer[i + 3] && 0x69 == pBuffer[i + 4] && 0x6F == pBuffer[i + 5]
&& 0x6E == pBuffer[i + 6] && 0x42 == pBuffer[i + 7] && 0x6F == pBuffer[i + 8]
&& 0x6F == pBuffer[i + 9] && 0x6B == pBuffer[i + 10])
return TRUE;
}
return FALSE;
}
private: BOOL IsSVGFile(const CString &sFilePath, long &lError)
{
// :
//
// svg ( html drawing <img alt="" datasvg="%3Csvg%20width%3D%...)
HRESULT hresult = S_FALSE;
lError = NOERROR;
BYTE pBuffer[ 2000 ];
DWORD dwBytesRead;
HANDLE hFile;
hFile = ::CreateFile(sFilePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (INVALID_HANDLE_VALUE == hFile)
{
lError = AVS_ERROR_FILEACCESS;
return FALSE;
}
::ReadFile(hFile, pBuffer, 2000, &dwBytesRead, NULL);
::CloseHandle(hFile);
bool tagOpen = false;
//SVG File is XML-file with rootElement - svg
for (size_t i = 0; i < dwBytesRead - 2; i++)
{
if (0x3C == pBuffer[i])
tagOpen = true;
else if (0x3E == pBuffer[i])
tagOpen = false;
else if (tagOpen && 0x73 == pBuffer[i] && 0x76 == pBuffer[i + 1] && 0x67 == pBuffer[i + 2])
return TRUE;
}
return FALSE;
}
private: BOOL IsHtmlFile(const CString &sFilePath, long &lError)
{
HRESULT hresult = S_FALSE;
lError = NOERROR;
BYTE pBuffer[ 2000 ];
DWORD dwBytesRead;
HANDLE hFile;
hFile = ::CreateFile(sFilePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (INVALID_HANDLE_VALUE == hFile)
{
lError = AVS_ERROR_FILEACCESS;
return FALSE;
}
::ReadFile(hFile, pBuffer, 2000, &dwBytesRead, NULL);
::CloseHandle(hFile);
bool tagOpen = false;
//Html File is XML-file with rootElement - html
for (size_t i = 0; i < dwBytesRead - 2; i++)
{
if (0x3C == pBuffer[i] && (0x48 == pBuffer[i + 1] || 0x68 == pBuffer[i + 1]) && (0x54 == pBuffer[i + 2] || 0x74 == pBuffer[i + 2]) && (0x4d == pBuffer[i + 3] || 0x6d == pBuffer[i + 3]) && (0x4c == pBuffer[i + 4] || 0x6c == pBuffer[i + 4]))
return TRUE;
}
return FALSE;
}
//nSource - define
//nDestination - define
//aOutputFormats - define
//return - false - true - 1-
public: bool GetAvailableFormats( long nSource, CAtlArray<long>& aOutputFormats )
{
aOutputFormats.RemoveAll();
for( int i = 0; i < mc_nFormatTableSize; i++ )
if( mc_aFormatTable[i][0] == nSource )
aOutputFormats.Add( mc_aFormatTable[i][1] );
return aOutputFormats.GetCount() > 0;
}
//nIndex - 1 GetAvailableFormatCount(...)
//nSource - define
//return - define ,
public: long GetAvailableFormat( int nIndex, long nSource)
{
int nResultCount = 0;
for( int i = 0; i < mc_nFormatTableSize; i++ )
if( mc_aFormatTable[i][0] == nSource )
if( ++nResultCount == nIndex )
return mc_aFormatTable[i][1];
return AVS_OFFICESTUDIO_FILE_UNKNOWN;
}
//nSource - define
//return - ,
public: int GetAvailableFormatCount( long nSource )
{
int nResultCount = 0;
for( int i = 0; i < mc_nFormatTableSize; i++ )
if( mc_aFormatTable[i][0] == nSource )
nResultCount++;
return nResultCount;
}
private:
AVSOfficeUtils::IOfficeUtils* pOfficeUtils;
};
__declspec(selectany) const long AVSOfficeFormatChecker::mc_aFormatTable[][2] = {
//Source //Destination
//AVS_OFFICESTUDIO_FILE_DOCUMENT, AVS_OFFICESTUDIO_FILE_DOCUMENT,
//AVS_OFFICESTUDIO_FILE_DOCUMENT, AVS_OFFICESTUDIO_FILE_PRESENTATION,
//AVS_OFFICESTUDIO_FILE_SPREADSHEET, AVS_OFFICESTUDIO_FILE_SPREADSHEET,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_DOCUMENT_MHT,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_IMAGE_JPG,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_IMAGE_TIFF,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_IMAGE_TGA,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_IMAGE_GIF,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_IMAGE_PNG,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_IMAGE_EMF,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_DOCUMENT_MHT, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_IMAGE_GIF, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_IMAGE_JPG, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_IMAGE_PNG, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_IMAGE_TGA, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_IMAGE_TIFF, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX, AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX,
AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX, AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS,
AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS, AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX,
AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT, AVS_OFFICESTUDIO_FILE_IMAGE_JPG,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT, AVS_OFFICESTUDIO_FILE_IMAGE_TIFF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT, AVS_OFFICESTUDIO_FILE_IMAGE_TGA,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT, AVS_OFFICESTUDIO_FILE_IMAGE_GIF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT, AVS_OFFICESTUDIO_FILE_IMAGE_PNG,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT, AVS_OFFICESTUDIO_FILE_IMAGE_EMF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, AVS_OFFICESTUDIO_FILE_IMAGE_JPG,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, AVS_OFFICESTUDIO_FILE_IMAGE_TIFF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, AVS_OFFICESTUDIO_FILE_IMAGE_TGA,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, AVS_OFFICESTUDIO_FILE_IMAGE_GIF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, AVS_OFFICESTUDIO_FILE_IMAGE_PNG,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, AVS_OFFICESTUDIO_FILE_IMAGE_EMF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP, AVS_OFFICESTUDIO_FILE_IMAGE_JPG,
AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP, AVS_OFFICESTUDIO_FILE_IMAGE_TIFF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP, AVS_OFFICESTUDIO_FILE_IMAGE_TGA,
AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP, AVS_OFFICESTUDIO_FILE_IMAGE_GIF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP, AVS_OFFICESTUDIO_FILE_IMAGE_PNG,
AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP, AVS_OFFICESTUDIO_FILE_IMAGE_EMF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_OTHER_EXTRACT_IMAGE,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC, AVS_OFFICESTUDIO_FILE_OTHER_EXTRACT_IMAGE,
AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT, AVS_OFFICESTUDIO_FILE_OTHER_EXTRACT_IMAGE,
AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML, AVS_OFFICESTUDIO_FILE_OTHER_EXTRACT_IMAGE,
AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF, AVS_OFFICESTUDIO_FILE_OTHER_EXTRACT_IMAGE,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF, AVS_OFFICESTUDIO_FILE_OTHER_EXTRACT_IMAGE,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF, AVS_OFFICESTUDIO_FILE_IMAGE_JPG,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF, AVS_OFFICESTUDIO_FILE_IMAGE_TIFF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF, AVS_OFFICESTUDIO_FILE_IMAGE_TGA,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF, AVS_OFFICESTUDIO_FILE_IMAGE_GIF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF, AVS_OFFICESTUDIO_FILE_IMAGE_PNG,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF, AVS_OFFICESTUDIO_FILE_IMAGE_EMF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU, AVS_OFFICESTUDIO_FILE_IMAGE_JPG,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU, AVS_OFFICESTUDIO_FILE_IMAGE_TIFF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU, AVS_OFFICESTUDIO_FILE_IMAGE_TGA,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU, AVS_OFFICESTUDIO_FILE_IMAGE_GIF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU, AVS_OFFICESTUDIO_FILE_IMAGE_PNG,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU, AVS_OFFICESTUDIO_FILE_IMAGE_EMF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU, AVS_OFFICESTUDIO_FILE_IMAGE_EMF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS, AVS_OFFICESTUDIO_FILE_IMAGE_JPG,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS, AVS_OFFICESTUDIO_FILE_IMAGE_TIFF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS, AVS_OFFICESTUDIO_FILE_IMAGE_TGA,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS, AVS_OFFICESTUDIO_FILE_IMAGE_GIF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS, AVS_OFFICESTUDIO_FILE_IMAGE_PNG,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS, AVS_OFFICESTUDIO_FILE_IMAGE_EMF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS, AVS_OFFICESTUDIO_FILE_IMAGE_EMF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB,
AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2, AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF,
AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP, AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF
};
__declspec(selectany) const int AVSOfficeFormatChecker::mc_nFormatTableSize = sizeof( mc_aFormatTable ) / (2 * sizeof( long ) );
__declspec(selectany) const long AVSOfficeFormatChecker::mc_aViewTable[] = {
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX,
AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC,
AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT,
AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML,
AVS_OFFICESTUDIO_FILE_DOCUMENT_MHT,
AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF,
AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT,
AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX,
AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF,
AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB,
AVS_OFFICESTUDIO_FILE_IMAGE_GIF,
AVS_OFFICESTUDIO_FILE_IMAGE_JPG,
AVS_OFFICESTUDIO_FILE_IMAGE_PNG,
AVS_OFFICESTUDIO_FILE_IMAGE_TGA,
AVS_OFFICESTUDIO_FILE_IMAGE_TIFF,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF,
AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS,
AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX,
AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU,
AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS
};
__declspec(selectany) const int AVSOfficeFormatChecker::mc_nViewTableSize = sizeof( mc_aViewTable ) / ( sizeof( long ) );
#pragma once
#include "TemporaryCS.h"
//class CVideoFile3;
template <class T, class Reciever>
class COfficeEventTemplate : public T
{
protected: CRITICAL_SECTION m_csThread;
public:
COfficeEventTemplate(Reciever *pReciever)
: m_pReciever(pReciever)
{
InitializeCriticalSection(&m_csThread);
m_cnt = 0;
m_dwAdvise = 0;
};
virtual ~COfficeEventTemplate(void)
{
DeleteCriticalSection(&m_csThread);
}
STDMETHOD(GetTypeInfoCount)(UINT*) { return E_NOTIMPL; }
STDMETHOD(GetTypeInfo)(UINT, LCID, ITypeInfo**) { return E_NOTIMPL; }
STDMETHOD(GetIDsOfNames)(REFIID, LPOLESTR*, UINT, LCID, DISPID*) { return E_NOTIMPL; }
STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppv) {
if ((iid == __uuidof(T)) ||
(iid == __uuidof(IDispatch)) ||
(iid == __uuidof(IUnknown)))
*ppv = this;
else {
*ppv = 0;
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
STDMETHOD_(ULONG,AddRef)() {
return InterlockedIncrement(&m_cnt);
}
STDMETHOD_(ULONG,Release)() {
InterlockedDecrement(&m_cnt);
if (m_cnt!=0) return m_cnt;
delete this;
return 0;
}
BOOL Advise(IUnknown *pFile)
{
CTemporaryCS oCS(&m_csThread);
if (NULL==pFile)
return FALSE;
IConnectionPointContainer* pContainer;
IConnectionPoint* pCP;
HRESULT hr = pFile->QueryInterface(IID_IConnectionPointContainer, (void**)&pContainer);
if (NULL!=pContainer)
{
pContainer->FindConnectionPoint(__uuidof(T), &pCP);
if (NULL!=pCP)
{
pCP->Advise(this, &m_dwAdvise);
pCP->Release();
pCP = NULL;
}
pContainer->Release();
pContainer = NULL;
}
return TRUE;
}
BOOL UnAdvise(IUnknown *pFile)
{
CTemporaryCS oCS(&m_csThread);
if ((NULL==pFile)||(0==m_dwAdvise))
return FALSE;
IConnectionPointContainer* pContainer;
IConnectionPoint* pCP;
HRESULT hr = pFile->QueryInterface(IID_IConnectionPointContainer, (void**)&pContainer);
if (NULL!=pContainer)
{
hr = pContainer->FindConnectionPoint(__uuidof(T), &pCP);
if (NULL!=pCP)
{
hr = pCP->Unadvise(m_dwAdvise);
pCP->Release();
pCP = NULL;
}
pContainer->Release();
pContainer = NULL;
}
return TRUE;
}
public:
Reciever* m_pReciever;
protected:
LONG m_cnt;
DWORD m_dwAdvise;
};
// AVSOfficeFile.h : Declaration of the CAVSOfficeFile
#pragma once
#include "resource.h" // main symbols
#include "..\Common\OfficeFileErrorDescription.h"
#include "..\Common\OfficeDefines.h"
#include "..\AVSOfficeUniversalConverter\Utils.h"
#include "XmlUtils.h"
#include "FormatChecker.h"
#include "OfficeFileEvents.h"
#include "TemporaryCS.h"
#include "OfficeFileConverter.h"
// XML
#include "../Common/RSA/XMLDecoder.h"
#include <math.h>
#define PIX_TO_MM( Value, DPI ) float( 1.0 * Value * (10 * ONE_INCH ) / DPI )
#define PROGRESS_LOAD 0.5
#define PROGRESS_COMMAND 0.5
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
#endif
#define STRING_TO_BOOL( sArg, bRes )\
if( _T("") != sArg )\
{\
sArg.MakeLower();\
if( _T("0") == sArg || _T("false") == sArg )\
bRes = false;\
else\
bRes = true;\
}
// _IAVSOfficeFileTemplateEvents
[
dispinterface,
uuid("2c0401b0-bfa6-11de-8a39-0800200c9a66"),
helpstring("_IAVSOfficeFileTemplateEvents Interface")
]
__interface _IAVSOfficeFileEvents
{
////Max Value nPercent == 1000000
////Example 23,56 % == 235600
//[id(1), helpstring("method OnProgress")] HRESULT OnProgress([in] LONG nID, [in] LONG nPercent);
[id(0)] HRESULT OnError(LONG lError);
[id(1)] HRESULT OnCompleteParseFile();
[id(5)] HRESULT OnProgressParseFile([in] LONG nID, LONG lProgressPage, [in, out, ref] SHORT* Cancel);
[id(6)] HRESULT OnProgressParsePage(LONG lProgress);
[id(7)] HRESULT OnCompleteParsePage();
};
// CAVSOfficeFile
[
coclass,
default(IAVSOfficeFile, _IAVSOfficeFileEvents),
threading(apartment),
event_source(com),
vi_progid("AVSOfficeFile.AVSDocume"),
progid("AVSOfficeFile.AVSDocu.1"),
version(1.0),
uuid("69cd4f40-bf08-11de-8a39-0800200c9a66"),
helpstring("AVSOfficeFile Class")
]
class ATL_NO_VTABLE CAVSOfficeFile : public IAVSOfficeFile
{
private: long m_nRendererError; //
private: HANDLE m_hViewerStop; // CommandRenderer
private: AVSGraphics::IAVSDocumentPainter* m_piOfficeViewer;
//private: AVSGraphics::IAVSDocumentRenderer* m_piWatermarkRenderer;
private: IAVSOfficeFileConverter* m_piFileConverter;
private: COfficeEventViewer< AVSGraphics::_IAVSDocumentPainterEvents, CAVSOfficeFile >* m_oEventViewer ;
private: CString m_sFileInfo;
private: bool m_bIsEdited;
private: CString m_sFilename;
private: CString m_sTitle;
private: CString m_sSubject;
private: CString m_sAuthor;
private: CString m_sKeywords;
private: CString m_sComments;
private: CString m_sTemplate;
private: CString m_sLastAuthor;
private: CString m_sRevisionNumber;
private: CString m_sAppName;
private: CString m_sCategory;
private: CString m_sSource;
private: int m_nWidth;
private: int m_nHeight;
private: int m_nResizeMode;
private: long m_nMaxFilesCount;
private: CString m_sWatermark;
private: CString m_sPassword;
private: CRITICAL_SECTION m_csThread;
private: int m_nLOGPIXELSX;
private: int m_nLOGPIXELSY;
private: CXMLDecoder m_oDecoder;
private: bool m_bPdfLoad;
private: bool m_bStopParse;
private: bool m_bParseFileComplete;
private: long m_nPermissions;
private: long m_nStatus;
private: CAtlMap<long, CString> m_mapThumbnails;
private: CString m_sThumbnailsPath;
private: CString m_sTempPath;
private: CString m_sOpenOptions;
private: long m_nLastProgress;
private: int m_nImagesCount;
private: int m_nLastError;
private: CAtlArray<CString> m_aRelsWalked;
private: CAtlArray<CString> m_aImagesToExtract;
public:
CAVSOfficeFile():m_piFileConverter(NULL),m_piOfficeViewer(NULL)
{
m_nMaxFilesCount = 0;
m_nResizeMode = 1;
m_nWidth = -1;
m_nHeight = -1;
m_bStopParse = false;
m_sPassword = _T("");
m_nStatus = c_shOfficeFileIdle;
CoCreateInstance( __uuidof(CAVSOfficeFileConverter), NULL ,CLSCTX_INPROC_SERVER, __uuidof(IAVSOfficeFileConverter), (void **)(&m_piFileConverter) );
m_oEventViewer = new COfficeEventViewer< AVSGraphics::_IAVSDocumentPainterEvents, CAVSOfficeFile >(this);
m_oEventViewer->AddRef();
m_hViewerStop = CreateEvent( NULL, FALSE, FALSE, NULL);
Clear();
//dpi
HDC hDCScreen = GetDC(NULL);
m_nLOGPIXELSX = GetDeviceCaps(hDCScreen, LOGPIXELSX);
m_nLOGPIXELSY = GetDeviceCaps(hDCScreen, LOGPIXELSY);
ReleaseDC(NULL, hDCScreen);
}
__event __interface _IAVSOfficeFileEvents;
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
#ifdef _DEBUG
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW );
_CrtSetBreakAlloc(-1);
#endif
InitializeCriticalSection(&m_csThread);
return S_OK;
}
void FinalRelease()
{
CloseFile();
RELEASEINTERFACE( m_piOfficeViewer );
RELEASEINTERFACE( m_piFileConverter );
RELEASEINTERFACE( m_oEventViewer );
RELEASEHANDLE( m_hViewerStop );
DeleteCriticalSection(&m_csThread);
}
public:
void OnProgressDocumentEx( LONG nID, LONG nPercent, SHORT* pnCancel)
{
if( 0 == pnCancel )
return;
if( true == m_bStopParse )
(*pnCancel) = c_shProgressCancel;
else
{
(*pnCancel) = c_shProgressContinue;
OnProgressDocument( nID, nPercent );
}
}
void OnProgressDocument( LONG nID, LONG nPercent)
{
if( true == m_bStopParse )
return;
SHORT nCancel;
long nCurProgress;
if( true == m_bPdfLoad )
nCurProgress = nPercent;
else
nCurProgress = PROGRESS_LOAD * nPercent;
if( nCurProgress > m_nLastProgress )
{
m_nLastProgress = nCurProgress;
OnProgressParseFile( nID, nCurProgress, &nCancel );
}
}
void OnCompletePageDocument()
{
if( true == m_bStopParse )
return;
OnCompletePageViewer();
}
void OnErrorViewer(LONG lError)
{
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileOpen;
m_nLastError = lError;
if( true != m_bStopParse )
OnError(lError);
SetEvent( m_hViewerStop );
}
void OnStopViewer()
{
//
m_oEventViewer->UnAdvise( m_piOfficeViewer );
//
AVSGraphics::IAVSDocumentRendererPtr punkRenderer = NULL;
m_piFileConverter->get_CommandRenderer( (IUnknown**)&punkRenderer );
if( NULL != m_piOfficeViewer )
m_piOfficeViewer->RemoveRenderer( punkRenderer );
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileParsingComplete;
if( true != m_bStopParse )
OnCompleteParseFile();
SetEvent( m_hViewerStop );
}
void OnProgressViewer(LONG lProgressPage)
{
if( true == m_bStopParse )
return;
SHORT nCancel = 0;
long nCurProgress = c_nMaxProgressPercent * (PROGRESS_LOAD + PROGRESS_COMMAND * lProgressPage / 100 );
if( nCurProgress > m_nLastProgress )
{
m_nLastProgress = nCurProgress;
OnProgressParseFile( 0, nCurProgress, &nCancel );
}
if( 0 != nCancel && NULL != m_piOfficeViewer)
m_piOfficeViewer->Stop();
}
void OnProgressParse( LONG lType, LONG lProgress )
{
if( true != m_bStopParse )
OnProgressParsePage( lProgress );
}
void OnNewPageViewer(double dWidthMm, double dHeightMm)
{
}
void OnCompletePageViewer()
{
if( true != m_bStopParse )
OnCompleteParsePage();
}
public:
STDMETHOD(OpenFile)( BSTR bstrFilename, BSTR bstrOptions )
{
CTemporaryCS oCS(&m_csThread);
CString strOptins = m_oDecoder.DecryptXML( bstrOptions );
CComBSTR cbstrOpt(strOptins);
//
CloseFile();
//
if( ::GetFileAttributes( bstrFilename ) == DWORD(-1) )
return AVS_ERROR_FILEACCESS;
m_sFilename = bstrFilename;
LONG nFileType = AVS_OFFICESTUDIO_FILE_UNKNOWN;
// bstrOptions
XmlUtils::CXmlReader oXmlOptionsReader;
if( TRUE == oXmlOptionsReader.OpenFromXmlString( cbstrOpt.m_str ) )
if( TRUE == oXmlOptionsReader.ReadNodeList( _T("*") ) )
{
for( int i = 0; i < oXmlOptionsReader.GetLengthList(); i++ )
{
CString sNodeName = oXmlOptionsReader.ReadNodeName( i );
if( _T("FileType") == sNodeName )
{
CString sFileType = oXmlOptionsReader.ReadNodeText( i );
if( _T("") != sFileType )
nFileType = Strings::ToInteger( sFileType );
}
else if( _T("Password") == sNodeName )
{
m_sPassword = oXmlOptionsReader.ReadNodeText( i );
}
else
{
// OfficeFile .
m_sOpenOptions.Append( oXmlOptionsReader.ReadNodeXml( i ) );
}
}
}
if( AVS_OFFICESTUDIO_FILE_UNKNOWN == nFileType )
{
m_piFileConverter->get_FileType( &nFileType );
AVSOfficeFormatChecker avsOfficeFormatChecker;
if( AVS_OFFICESTUDIO_FILE_UNKNOWN == nFileType )
m_piFileConverter->put_FileType( avsOfficeFormatChecker.GetFileFormat( m_sFilename ) );
//// info
//LoadStructuredStorageInformation( CString( bstrFilename ) );
//
m_piFileConverter->get_FileType( &nFileType );
}
HRESULT hRes = S_OK;
//pdf
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFileType )
{
AVSOfficePDFFile::IPDFFilePtr piPdfFile;
if( SUCCEEDED( piPdfFile.CreateInstance( __uuidof(AVSOfficePDFFile::CPDFFile) ) ) )
{
//Pdf
CString sPdfOptions = _T("<Options>");
sPdfOptions.Append( _T("<CheckPassword/>") );
sPdfOptions.AppendFormat( _T("<FileType>%d</FileType>"), nFileType );
if( false == m_sPassword.IsEmpty() )
sPdfOptions.AppendFormat( _T("<Password>%s</Password>"), Utils::PrepareToXML( m_sPassword ) );
sPdfOptions.Append( m_sOpenOptions );
sPdfOptions.Append( _T("</Options>") );
CString sTempDir = Utils::CreateTempDir( m_sTempPath );
BSTR bstrTempDir = sTempDir.AllocSysString();
BSTR bstrPdfOptions = sPdfOptions.AllocSysString();
hRes = piPdfFile->LoadFromFile( bstrFilename, bstrTempDir, bstrPdfOptions );
SysFreeString( bstrPdfOptions );
SysFreeString( bstrTempDir );
Utils::RemoveDirOrFile( sTempDir );
if( SUCCEEDED( hRes ) ) //
{
// permissions
VARIANT vtPermissions;
if( SUCCEEDED( piPdfFile->GetAdditionalParam( _T("Permissions"), &vtPermissions ) ) )
m_nPermissions = vtPermissions.lVal;
VARIANT vtImagesCount; vtImagesCount.lVal = 0;
if( SUCCEEDED( piPdfFile->GetAdditionalParam( _T("ImagesCount"), &vtImagesCount ) ) )
m_nImagesCount = vtImagesCount.lVal;
}
}
}
if( SUCCEEDED( hRes ) )
m_nStatus = c_shOfficeFileOpen;
return hRes;
}
STDMETHOD(CloseFile)()
{
CTemporaryCS oCS(&m_csThread);
long nLastStatus = m_nStatus;
StopParse();
if( nLastStatus >= c_shOfficeFileParsing )
{
RELEASEINTERFACE( m_piFileConverter );
CoCreateInstance( __uuidof(CAVSOfficeFileConverter), NULL ,CLSCTX_INPROC_SERVER, __uuidof(IAVSOfficeFileConverter), (void **)(&m_piFileConverter) );
RELEASEINTERFACE( m_piOfficeViewer );
if( NULL != m_piFileConverter )
{
CComBSTR bstrTemp( m_sTempPath );
m_piFileConverter->put_TempDirectory( bstrTemp.m_str );
}
}
Clear();
m_nStatus = c_shOfficeFileIdle;
return S_OK;
}
STDMETHOD(StartParse)()
{
CTemporaryCS oCS(&m_csThread);
if( m_nStatus >= c_shOfficeFileParsing )
return S_OK;
if( "" == m_sFilename )
return S_FALSE;
m_nStatus = c_shOfficeFileParsing;
m_bStopParse = false;
DWORD dwTemp;
HANDLE hParseThread = CreateThread(NULL, 0, &_ThreadProc, (void*)this, 0, &dwTemp);
if( NULL == hParseThread )
{
m_nStatus = c_shOfficeFileIdle;
return S_FALSE;
}
else
{
RELEASEHANDLE( hParseThread );
return S_OK;
}
}
STDMETHOD(StopParse)()
{
CTemporaryCS oCS(&m_csThread);
m_bStopParse = true;
LONG nCurFileType;
m_piFileConverter->get_FileType( &nCurFileType );
HRESULT hRes = S_OK;
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF != nCurFileType && AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU != nCurFileType && AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS != nCurFileType && c_shOfficeFileParsing == m_nStatus && NULL != m_piOfficeViewer )
hRes = m_piOfficeViewer->Stop();
while( c_shOfficeFileParsing == m_nStatus )
Sleep( 200 );
return hRes;
}
STDMETHOD(SuspendParse)()
{
CTemporaryCS oCS(&m_csThread);
LONG nCurFileType;
m_piFileConverter->get_FileType( &nCurFileType );
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF != nCurFileType && AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU != nCurFileType && AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS != nCurFileType && c_shOfficeFileParsing == m_nStatus && NULL != m_piOfficeViewer )
return m_piOfficeViewer->Suspend();
else
return S_OK;
}
STDMETHOD(ResumeParse)()
{
CTemporaryCS oCS(&m_csThread);
LONG nCurFileType;
m_piFileConverter->get_FileType( &nCurFileType );
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF != nCurFileType && AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU != nCurFileType && AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS != nCurFileType && c_shOfficeFileParsing == m_nStatus && NULL != m_piOfficeViewer )
return m_piOfficeViewer->Resume();
else
return S_OK;
}
STDMETHOD(ReadPage)( LONG nPageNumber, IUnknown** ppunkMediaData )
{
CTemporaryCS oCS(&m_csThread);
if( NULL == ppunkMediaData )
return S_FALSE;
(*ppunkMediaData) = NULL;
AVSGraphics::IAVSDocumentRendererPtr piCommandRenderer = NULL;
m_piFileConverter->get_CommandRenderer( (IUnknown**)&piCommandRenderer );
if( NULL == piCommandRenderer )
return S_FALSE;
double fPageWidthMm = 0;
double fPageHeightMm = 0;
if( SUCCEEDED( piCommandRenderer->GetPageSize(nPageNumber, &fPageWidthMm, &fPageHeightMm) ) )
{
AVSGraphics::IAVSGraphicsRenderer* piGdiplusRenderer = NULL;
//AVSOfficeEditor::IAVSGdiplusRenderer* piGdiplusRenderer = NULL;
MediaCore::IAVSUncompressedVideoFrame* piImage = NULL;
UpdateGdiPlusRenderer( fPageWidthMm, fPageHeightMm, &piImage ,&piGdiplusRenderer);
if( m_nWidth > 0 && m_nHeight > 0 )
{
VARIANT vtDPI;
vtDPI.vt = VT_R8;
vtDPI.dblVal = ONE_INCH * 10 * m_nWidth / fPageWidthMm ;
piCommandRenderer->SetAdditionalParam( _T("DPIX"), vtDPI );
vtDPI.dblVal = ONE_INCH * 10 * m_nHeight / fPageHeightMm ;
piCommandRenderer->SetAdditionalParam( _T("DPIY"), vtDPI );
}
piCommandRenderer->DrawPage( nPageNumber, piGdiplusRenderer );
// watermark
LONG nPageWidth = LONG( TO_FLOAT * fPageWidthMm );
LONG nPageHeight = LONG( TO_FLOAT * fPageHeightMm );
m_piFileConverter->DrawWatermark( piGdiplusRenderer, nPageWidth, nPageHeight );
RELEASEINTERFACE(piGdiplusRenderer);
if( NULL != piImage )
piImage->QueryInterface( __uuidof(IUnknown), (void**)ppunkMediaData);
RELEASEINTERFACE(piImage);
}
return S_OK;
}
STDMETHOD(DrawPage)( LONG nPageNumber, IUnknown* punkMediaData )
{
CTemporaryCS oCS(&m_csThread);
AVSGraphics::IAVSDocumentRendererPtr piCommandRenderer = NULL;
m_piFileConverter->get_CommandRenderer( (IUnknown**)&piCommandRenderer );
if( NULL != piCommandRenderer )
{
CAtlMap<long, CString>::CPair *pPair = NULL;
pPair = m_mapThumbnails.Lookup( nPageNumber );
bool bLoadFromCache = false;
if( NULL != pPair )
{// Thumbnail
HANDLE hThumbnailHandle = CreateFile ( pPair->m_value, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if ( INVALID_HANDLE_VALUE != hThumbnailHandle )
{
long nCacheBufferSize = 0;
DWORD dwBytesRead = 0;
if ( TRUE == ReadFile( hThumbnailHandle, &nCacheBufferSize, ( DWORD ) sizeof(long), &dwBytesRead, NULL ) )
if ( dwBytesRead == sizeof( long ) && nCacheBufferSize > 0 )
{
MediaCore::IAVSUncompressedVideoFrame * piFrame = NULL;
if( SUCCEEDED( punkMediaData->QueryInterface( __uuidof( MediaCore::IAVSUncompressedVideoFrame ), (void**)&piFrame ) ) )
{
long nMinBufSize = nCacheBufferSize < piFrame->BufferSize ? nCacheBufferSize : piFrame->BufferSize;
if ( TRUE == ReadFile ( hThumbnailHandle, piFrame->Buffer, ( DWORD ) nMinBufSize, &dwBytesRead, NULL ) )
{
if ( dwBytesRead == nMinBufSize )
bLoadFromCache = true;
}
RELEASEINTERFACE( piFrame );
}
}
RELEASEHANDLE( hThumbnailHandle );
}
}
if( false == bLoadFromCache )
{//
AVSGraphics::IAVSGraphicsRenderer* piGdiplusRenderer = NULL;
CoCreateInstance( __uuidof( AVSGraphics::CAVSGraphicsRenderer ), NULL ,CLSCTX_INPROC_SERVER, __uuidof(AVSGraphics::IAVSGraphicsRenderer), (void **)(&piGdiplusRenderer) );
//AVSOfficeEditor::IAVSGdiplusRenderer* piGdiplusRenderer = NULL;
//CoCreateInstance( __uuidof( AVSOfficeEditor::CAVSGdiplusRenderer ), NULL ,CLSCTX_INPROC_SERVER, __uuidof(AVSOfficeEditor::IAVSGdiplusRenderer), (void **)(&piGdiplusRenderer) );
if( NULL != piGdiplusRenderer )
{
MediaCore::IAVSUncompressedVideoFrame* piGraphicFrame = NULL;
punkMediaData->QueryInterface( __uuidof( MediaCore::IAVSUncompressedVideoFrame ), (void**)&piGraphicFrame );
// FontManager
VARIANT vtVariant;
vtVariant.vt = VT_UNKNOWN;
vtVariant.punkVal = NULL;
piGdiplusRenderer->SetAdditionalParam( L"FontManager", vtVariant );
piGdiplusRenderer->CreateFromMediaData( punkMediaData, 0, 0, piGraphicFrame->Width, piGraphicFrame->Height );
RELEASEINTERFACE( piGraphicFrame );
//
MediaCore::IAVSUncompressedVideoFrame * piFrame = NULL;
FLOAT fPageWidthMm = 0;
FLOAT fPageHeightMm = 0;
if( SUCCEEDED( punkMediaData->QueryInterface( __uuidof( MediaCore::IAVSUncompressedVideoFrame ), (void**)&piFrame ) ) )
{
//memset( piFrame->Buffer, 255, piFrame->BufferSize);
fPageWidthMm = PIX_TO_MM( piFrame->Width, m_nLOGPIXELSX );
fPageHeightMm = PIX_TO_MM( piFrame->Height, m_nLOGPIXELSY );
double fPageWidthMm2 = 0;
double fPageHeightMm2 = 0;
if( SUCCEEDED( piCommandRenderer->GetPageSize(nPageNumber, &fPageWidthMm2, &fPageHeightMm2) ) )
{
if( piFrame->Width > 0 && piFrame->Height > 0 )
{
VARIANT vtDPI;
vtDPI.vt = VT_R8;
vtDPI.dblVal = ONE_INCH * 10 * piFrame->Width / fPageWidthMm2 ;
piCommandRenderer->SetAdditionalParam( _T("DPIX"), vtDPI );
vtDPI.dblVal = ONE_INCH * 10 * piFrame->Height / fPageHeightMm2 ;
piCommandRenderer->SetAdditionalParam( _T("DPIY"), vtDPI );
}
}
//
piCommandRenderer->DrawPage( nPageNumber, piGdiplusRenderer );
// watermark
LONG nPageWidth = LONG( TO_FLOAT * fPageWidthMm );
LONG nPageHeight = LONG( TO_FLOAT * fPageWidthMm );
m_piFileConverter->DrawWatermark( piGdiplusRenderer, nPageWidth, nPageHeight );
RELEASEINTERFACE( piGdiplusRenderer );
// thumbnail
if( _T("") == m_sThumbnailsPath )
m_sThumbnailsPath = Utils::CreateTempDir( m_sTempPath );
// : long , -
CString sThumbnailFilename = Utils::CreateTempFile( m_sThumbnailsPath );
bool bError = true;
HANDLE hThumbnailHandle = CreateFile ( sThumbnailFilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if ( INVALID_HANDLE_VALUE != hThumbnailHandle )
{
DWORD dwBytesWrite = 0;
long nBufSize = piFrame->BufferSize;
if ( TRUE == WriteFile ( hThumbnailHandle, &nBufSize, ( DWORD ) sizeof(long), &dwBytesWrite, NULL ) )
if ( dwBytesWrite == sizeof( long ) )
if ( TRUE == WriteFile ( hThumbnailHandle, piFrame->Buffer, ( DWORD ) piFrame->BufferSize, &dwBytesWrite, NULL ) )
if ( dwBytesWrite == piFrame->BufferSize )
bError = false;
RELEASEHANDLE( hThumbnailHandle );
}
if( false == bError )
m_mapThumbnails.SetAt( nPageNumber, sThumbnailFilename );
else
Utils::RemoveDirOrFile( sThumbnailFilename );
RELEASEINTERFACE( piFrame );
}
}
}
}
return S_OK;
}
STDMETHOD(PrintPage)( LONG nPageNumber, LONG* pHDC, BSTR bstrXMLMode )
{
AVSGraphics::IAVSDocumentRendererPtr piCommandRenderer = NULL;
m_piFileConverter->get_CommandRenderer( (IUnknown**)&piCommandRenderer );
AVSGraphics::IAVSEffectPainterPtr piEffectPainter = NULL;
piEffectPainter.CreateInstance( __uuidof(AVSGraphics::CAVSEffectPainter) );
if( NULL == piCommandRenderer || NULL == piEffectPainter )
return S_FALSE;
long nPageCount = 0;
piCommandRenderer->get_PageCount( &nPageCount );
if( -1 != nPageNumber && ( nPageNumber < 0 || nPageNumber >= nPageCount || NULL == pHDC ) )
return S_FALSE;
HDC hPrintDC = *((HDC*)pHDC);
AVSGraphics::IAVSGraphicsRendererPtr piHDCRenderer;
piHDCRenderer.CreateInstance( __uuidof(AVSGraphics::CAVSGraphicsRenderer) );
//AVSOfficeEditor::IAVSHDCRendererPtr piHDCRenderer;
//piHDCRenderer.CreateInstance( __uuidof(AVSOfficeEditor::CAVSHDCRenderer) );
if( NULL == piHDCRenderer )
return AVS_ERROR_UNEXPECTED;
int nMode = -1;
int nWidthPix = -1;
int nHeightPix = -1;
bool bZoomEnable = false;
bool bRotateEnable = false;
bool bPrintableArea = false;
// xml
CString strXml = m_oDecoder.DecryptXML( bstrXMLMode );
CString sWaterMarks;
XmlUtils::CXmlReader oXmlReader;
if( TRUE == oXmlReader.OpenFromXmlString( strXml ) )
if( TRUE == oXmlReader.ReadRootNode( _T("PrintSettings") ) )
{
CString sWidth = oXmlReader.ReadNodeValue( _T("Width") );
if( _T("") != sWidth )
nWidthPix = Strings::ToInteger( sWidth );
CString sHeight = oXmlReader.ReadNodeValue( _T("Height") );
if( _T("") != sHeight )
nHeightPix = Strings::ToInteger( sHeight );
CString sMode = oXmlReader.ReadNodeValue( _T("Mode") );
if( _T("") != sMode )
nMode = Strings::ToInteger( sMode );
XML::IXMLDOMNodePtr oNode;
oXmlReader.GetNode( oNode );
oXmlReader.ReadNode( _T("Mode") );
CString sZoomEnable = oXmlReader.ReadNodeAttribute( _T("ZoomEnable") );
STRING_TO_BOOL( sZoomEnable, bZoomEnable );
CString sRotateEnable = oXmlReader.ReadNodeAttribute( _T("RotateEnable") );
STRING_TO_BOOL( sRotateEnable, bRotateEnable );
CString sPrintableArea = oXmlReader.ReadNodeAttribute( _T("PrintableAreaEnable") );
STRING_TO_BOOL( sPrintableArea, bPrintableArea );
oXmlReader.OpenFromXmlNode( oNode );
oXmlReader.ReadNode( _T("Watermarks") );
sWaterMarks = oXmlReader.ReadNodeXml();
}
if( -1 == nPageNumber )
{//
long nPrintDpiX = GetDeviceCaps( hPrintDC, LOGPIXELSX);
long nPrintDpiY = GetDeviceCaps( hPrintDC, LOGPIXELSY);
long nPrintOffsetX = GetDeviceCaps( hPrintDC, PHYSICALOFFSETX);
long nPrintOffsetY = GetDeviceCaps( hPrintDC, PHYSICALOFFSETY);
//for( int i = 0; i < nPageCount; i++ )
//{
// //
// double dLeftPix = 0;
// double dTopPix = 0;
// double dWidthPix = 0;
// double dHeightPix = 0;
// double dAngel = 0;
// PrepareForPrint( i, pHDC,
// nWidthPix, nHeightPix, nMode, bZoomEnable, bRotateEnable, bPrintableArea,
// dLeftPix, dTopPix, dWidthPix, dHeightPix, dAngel );
// //piHDCRenderer->
//}
}
else
{//
double dLeftPix = 0;
double dTopPix = 0;
double dWidthPix = 0;
double dHeightPix = 0;
double dAngel = 0;
double dPrintWidthMM;
double dPrintHeightMM;
PrepareForPrint( nPageNumber, pHDC,
nWidthPix, nHeightPix, nMode, bZoomEnable, bRotateEnable, bPrintableArea,
dLeftPix, dTopPix, dWidthPix, dHeightPix, dAngel, dPrintWidthMM, dPrintHeightMM );
//
piHDCRenderer->CreateFromHDC( pHDC, NULL, dPrintWidthMM, dPrintHeightMM ,dLeftPix, dTopPix , dWidthPix, dHeightPix, dAngel );
piCommandRenderer->DrawPage( nPageNumber ,piHDCRenderer );
BSTR bstrWaterMarks = sWaterMarks.AllocSysString();
if( SUCCEEDED( piEffectPainter->SetXml( bstrWaterMarks ) ) )
piEffectPainter->Draw( piHDCRenderer );
SysFreeString( bstrWaterMarks );
piHDCRenderer->BitBlt( pHDC );
}
return S_OK;
}
bool PrepareForPrint( LONG nPageNumber, LONG* pHDC,
long nWidthPix, long nHeightPix, int nMode, bool bZoomEnable, bool bRotateEnable, bool bPrintableArea,
double& dLeftPix, double& dTopPix, double& dWidthPix, double& dHeightPix, double& dAngel, double& fPrintWidthMM, double& fPrintHeightMM )
{
AVSGraphics::IAVSDocumentRendererPtr piCommandRenderer = NULL;
m_piFileConverter->get_CommandRenderer( (IUnknown**)&piCommandRenderer );
if( NULL == piCommandRenderer )
return S_FALSE;
double fPageWidth = 0;
double fPageHeight = 0;
piCommandRenderer->GetPageSize( nPageNumber, &fPageWidth, &fPageHeight );
if( 0 == fPageWidth || fPageHeight == 0 )
return false;
HDC hPrintDC = *((HDC*)pHDC);
long nPrintDpiX = GetDeviceCaps( hPrintDC, LOGPIXELSX);
long nPrintDpiY = GetDeviceCaps( hPrintDC, LOGPIXELSY);
long nPrintOffsetX = GetDeviceCaps( hPrintDC, PHYSICALOFFSETX);
long nPrintOffsetY = GetDeviceCaps( hPrintDC, PHYSICALOFFSETY);
long nPrintWidthPix; //
long nPrintHeightPix;
long nPrintPageWidthPix; //
long nPrintPageHeightPix;
if( -1 == nWidthPix || -1 == nHeightPix )
{
nPrintWidthPix = GetDeviceCaps( hPrintDC, PHYSICALWIDTH);
nPrintHeightPix = GetDeviceCaps( hPrintDC, PHYSICALHEIGHT);
nPrintPageWidthPix = GetDeviceCaps( hPrintDC, HORZRES );
nPrintPageHeightPix = GetDeviceCaps( hPrintDC, VERTRES);
}
else
{
nPrintWidthPix = nWidthPix;
nPrintHeightPix = nHeightPix;
nPrintPageWidthPix = nWidthPix;
nPrintPageHeightPix = nHeightPix;
}
if( true == bPrintableArea )
{//
//
nPrintWidthPix = nPrintPageWidthPix;
nPrintHeightPix = nPrintPageHeightPix;
//
nPrintOffsetX = 0;
nPrintOffsetY = 0;
}
//
fPrintWidthMM = 10 * ONE_INCH * nPrintWidthPix / nPrintDpiX;
fPrintHeightMM = 10 * ONE_INCH * nPrintHeightPix / nPrintDpiX;
if( c_nPrintType100 == nMode )
{
dWidthPix = nPrintDpiX * fPageWidth / ( 10 * ONE_INCH );
dHeightPix = nPrintDpiX * fPageHeight / ( 10 * ONE_INCH );
if( true == bRotateEnable && ( nPrintWidthPix < dWidthPix || nPrintHeightPix < dHeightPix ))
{
if( nPrintWidthPix < dHeightPix || nPrintHeightPix < dWidthPix )
{
//
double dWidth1 = nPrintWidthPix < dWidthPix ? nPrintWidthPix : dWidthPix;
double dHeight1 = nPrintHeightPix < dHeightPix ? nPrintHeightPix : dHeightPix;
double dWidth2 = nPrintWidthPix < dHeightPix ? nPrintWidthPix : dHeightPix;
double dHeight2 = nPrintHeightPix < dWidthPix ? nPrintHeightPix : dWidthPix;
if( dWidth1 * dHeight1 >= dWidth2 * dHeight2 )
{
dLeftPix = 0;
dTopPix = 0;
}
else
{
dLeftPix = nPrintWidthPix - ( dHeightPix + dWidthPix ) / 2;
dTopPix = dWidthPix / 2 - dHeightPix / 2;
dAngel = M_PI_2;//90
}
}
else
{
// ,
dLeftPix = nPrintWidthPix - (dHeightPix + dWidthPix ) / 2;
dTopPix = nPrintHeightPix / 2 - dHeightPix / 2;
dAngel = M_PI_2;//90
}
}
else
{
if( dWidthPix < nPrintWidthPix ) // ,
dLeftPix = nPrintWidthPix / 2 - dWidthPix / 2;
else
dLeftPix = 0;
dTopPix = 0;
}
}
else if( c_nPrintTypeStrech == nMode )
{
if( bRotateEnable && (fPageWidth / fPageHeight - 1 ) * ( fPrintWidthMM / fPrintHeightMM - 1 ) < 0 )
{//
dWidthPix = nPrintHeightPix;
dHeightPix = nPrintWidthPix;
dLeftPix = nPrintWidthPix / 2 - dWidthPix / 2;
dTopPix = nPrintHeightPix / 2 - dHeightPix / 2;
dAngel = M_PI_2;//90
}
else
{
dWidthPix = nPrintWidthPix;
dHeightPix = nPrintHeightPix;
dLeftPix = 0;
dTopPix = 0;
}
}
else
{
if( bZoomEnable && bRotateEnable )
{
bool bRotate = false;
if( (fPageWidth / fPageHeight - 1 ) * ( fPrintWidthMM / fPrintHeightMM - 1 ) < 0 )
{//
double dTemp = fPrintWidthMM;
fPrintWidthMM = fPrintHeightMM;
fPrintHeightMM = dTemp;
dAngel = M_PI_2;//90
bRotate = true;
}
float fFitX = 0;
float fFitY = 0;
float fFitWidth = 0;
float fFitHeight = 0;
FitToPage( fPageWidth, fPageHeight, fPrintWidthMM, fPrintHeightMM, fFitX, fFitY, fFitWidth, fFitHeight );
dWidthPix = nPrintDpiX * fFitWidth / ( 10 * ONE_INCH );
dHeightPix = nPrintDpiY * fFitHeight / ( 10 * ONE_INCH );
if( true == bRotate )
{
dLeftPix = nPrintWidthPix / 2 - dWidthPix / 2;
dTopPix = nPrintHeightPix / 2 - dHeightPix / 2;
}
else
{
dLeftPix = nPrintDpiX * fFitX / ( 10 * ONE_INCH );
dTopPix = nPrintDpiY * fFitY / ( 10 * ONE_INCH );
}
}
else if( bZoomEnable )
{
float fFitX = 0;
float fFitY = 0;
float fFitWidth = 0;
float fFitHeight = 0;
FitToPage( fPageWidth, fPageHeight, fPrintWidthMM, fPrintHeightMM, fFitX, fFitY, fFitWidth, fFitHeight );
dWidthPix = nPrintDpiX * fFitWidth / ( 10 * ONE_INCH );
dHeightPix = nPrintDpiY * fFitHeight / ( 10 * ONE_INCH );
dLeftPix = nPrintDpiX * fFitX / ( 10 * ONE_INCH );
dTopPix = nPrintDpiY * fFitY / ( 10 * ONE_INCH );
dAngel = 0;
}
else if( bRotateEnable )
{
//
if( fPrintWidthMM < fPageWidth || fPrintHeightMM < fPageHeight )
{
//
if( fPrintHeightMM < fPageWidth || fPrintWidthMM < fPageHeight )
{
//,
float fFitX1 = 0;
float fFitY1 = 0;
float fFitWidth1 = 0;
float fFitHeight1 = 0;
FitToPage( fPageWidth, fPageHeight, fPrintWidthMM, fPrintHeightMM, fFitX1, fFitY1, fFitWidth1, fFitHeight1 );
float fFitX2 = 0;
float fFitY2 = 0;
float fFitWidth2 = 0;
float fFitHeight2 = 0;
FitToPage( fPageWidth, fPageHeight, fPrintHeightMM, fPrintWidthMM, fFitX2, fFitY2, fFitWidth2, fFitHeight2 );
if( fFitWidth1 * fFitHeight1 < fFitWidth2 * fFitHeight2 )
{//
dAngel = M_PI_2;//90
dWidthPix = nPrintDpiX * fFitWidth2 / ( 10 * ONE_INCH );
dHeightPix = nPrintDpiY * fFitHeight2 / ( 10 * ONE_INCH );
dLeftPix = nPrintWidthPix / 2 - dWidthPix / 2;
dTopPix = nPrintHeightPix / 2 - dHeightPix / 2;
}
else
{
dAngel = 0;
dWidthPix = nPrintDpiX * fFitWidth1 / ( 10 * ONE_INCH );
dHeightPix = nPrintDpiY * fFitHeight1 / ( 10 * ONE_INCH );
dLeftPix = nPrintDpiX * fFitX1 / ( 10 * ONE_INCH );
dTopPix = nPrintDpiY * fFitY1 / ( 10 * ONE_INCH );
}
}
else
{//
dWidthPix = nPrintDpiX * fPageWidth / ( 10 * ONE_INCH );
dHeightPix = nPrintDpiY * fPageHeight / ( 10 * ONE_INCH );
dLeftPix = nPrintWidthPix - (dHeightPix + dWidthPix ) / 2;
dTopPix = nPrintHeightPix / 2 - dHeightPix / 2;
dAngel = M_PI_2;//90
}
}
else
{
dWidthPix = nPrintDpiX * fPageWidth / ( 10 * ONE_INCH );
dHeightPix = nPrintDpiY * fPageHeight / ( 10 * ONE_INCH );
dLeftPix = nPrintWidthPix / 2 - dWidthPix / 2; //
dTopPix = 0; //
dAngel = 0;
}
}
else
{
//
if( fPrintWidthMM < fPageWidth || fPrintHeightMM < fPageHeight )
{
float fFitX = 0;
float fFitY = 0;
float fFitWidth = 0;
float fFitHeight = 0;
FitToPage( fPageWidth, fPageHeight, fPrintWidthMM, fPrintHeightMM, fFitX, fFitY, fFitWidth, fFitHeight );
dWidthPix = nPrintDpiX * fFitWidth / ( 10 * ONE_INCH );
dHeightPix = nPrintDpiY * fFitHeight / ( 10 * ONE_INCH );
dLeftPix = nPrintDpiX * fFitX / ( 10 * ONE_INCH );
dTopPix = nPrintDpiY * fFitY / ( 10 * ONE_INCH );
}
else
{
dWidthPix = nPrintDpiX * fPageWidth / ( 10 * ONE_INCH );
dHeightPix = nPrintDpiY * fPageHeight / ( 10 * ONE_INCH );
dLeftPix = nPrintWidthPix / 2 - dWidthPix / 2; //
dTopPix = 0; //
}
}
}
dLeftPix -= nPrintOffsetX;
dTopPix -= nPrintOffsetY;
return true;
}
STDMETHOD(GetPageCount)( LONG* pnPageCount )
{
CTemporaryCS oCS(&m_csThread);
AVSGraphics::IAVSDocumentRendererPtr piCommandRenderer = NULL;
m_piFileConverter->get_CommandRenderer( (IUnknown**)&piCommandRenderer );
if( NULL == pnPageCount || NULL == piCommandRenderer )
return S_FALSE;
(*pnPageCount) = 0;
return piCommandRenderer->get_PageCount(pnPageCount);
}
STDMETHOD(GetPageSize)( LONG lPageNumber, DOUBLE* pfWidth, DOUBLE* pfHeight )
{
CTemporaryCS oCS(&m_csThread);
AVSGraphics::IAVSDocumentRendererPtr piCommandRenderer = NULL;
m_piFileConverter->get_CommandRenderer( (IUnknown**)&piCommandRenderer );
if( NULL == pfWidth || NULL == pfHeight || NULL == piCommandRenderer )
return S_FALSE;
(*pfWidth) = 0;
(*pfHeight) = 0;
return piCommandRenderer->GetPageSize(lPageNumber, pfWidth, pfHeight);
}
STDMETHOD(GetInternalInteface)( IUnknown** ppunkFileConverter )
{
CTemporaryCS oCS(&m_csThread);
if( NULL == ppunkFileConverter )
return S_FALSE;
(*ppunkFileConverter) = NULL;
return m_piFileConverter->QueryInterface(IID_IUnknown, (void**)ppunkFileConverter);
}
STDMETHOD(get_FileType)(LONG* pnType)
{
CTemporaryCS oCS(&m_csThread);
if( NULL == pnType )
return S_FALSE;
return m_piFileConverter->get_FileType(pnType);
}
STDMETHOD(put_FileType)(LONG nType)
{
CTemporaryCS oCS(&m_csThread);
return m_piFileConverter->put_FileType(nType);
}
STDMETHOD(get_OfficeViewer)( IUnknown** ppunkVal )
{
CTemporaryCS oCS(&m_csThread);
if( NULL == ppunkVal )
return S_FALSE;
return m_piOfficeViewer->QueryInterface( __uuidof( IUnknown ), (void**)ppunkVal );
}
STDMETHOD(put_OfficeViewer)( IUnknown* punkVal )
{
CTemporaryCS oCS(&m_csThread);
if( NULL == punkVal )
return S_FALSE;
RELEASEINTERFACE(m_piOfficeViewer);
AVSGraphics::IAVSDocumentPainter* piOfficeView = NULL;
return punkVal->QueryInterface( __uuidof( AVSGraphics::IAVSDocumentPainter ) , (void**)&m_piOfficeViewer );
}
STDMETHOD(get_FileInfo)( BSTR* pbstrInfo )
{
CTemporaryCS oCS(&m_csThread);
if( NULL == pbstrInfo )
return S_FALSE;
(*pbstrInfo) = m_sFileInfo.AllocSysString();
return S_OK;
}
STDMETHOD(put_FileInfo)( BSTR bstrInfo )
{
CTemporaryCS oCS(&m_csThread);
m_sFileInfo = CString(bstrInfo);
return S_OK;
}
STDMETHOD(get_IsEdited)( VARIANT_BOOL* pvIsEdited)
{
CTemporaryCS oCS(&m_csThread);
if( NULL == pvIsEdited )
return S_FALSE;
if( true == m_bIsEdited )
(*pvIsEdited) = VARIANT_TRUE;
else
(*pvIsEdited) = VARIANT_FALSE;
return S_OK;
}
STDMETHOD(get_Title)( BSTR* pbstrVal )
{
CTemporaryCS oCS(&m_csThread);
if( NULL == pbstrVal )
return S_FALSE;
(*pbstrVal) = NULL;
(*pbstrVal) = m_sTitle.AllocSysString();
return S_OK;
}
STDMETHOD(put_Title)( BSTR bstrVal )
{
CTemporaryCS oCS(&m_csThread);
m_sTitle = CString( bstrVal );
SaveStructuredStorageInformation(m_sFilename, PIDSI_TITLE, m_sTitle);
return S_OK;
}
STDMETHOD(get_Subject)( BSTR* pbstrVal )
{
CTemporaryCS oCS(&m_csThread);
if( NULL == pbstrVal )
return S_FALSE;
(*pbstrVal) = NULL;
(*pbstrVal) = m_sSubject.AllocSysString();
return S_OK;
}
STDMETHOD(put_Subject)( BSTR bstrVal )
{
CTemporaryCS oCS(&m_csThread);
m_sSubject = CString( bstrVal );
SaveStructuredStorageInformation(m_sFilename, PIDSI_SUBJECT, m_sSubject);
return S_OK;
}
STDMETHOD(get_Keywords)( BSTR* pbstrVal )
{
CTemporaryCS oCS(&m_csThread);
if( NULL == pbstrVal )
return S_FALSE;
(*pbstrVal) = NULL;
(*pbstrVal) = m_sKeywords.AllocSysString();
return S_OK;
}
STDMETHOD(put_Keywords)( BSTR bstrVal )
{
CTemporaryCS oCS(&m_csThread);
m_sKeywords = CString( bstrVal );
SaveStructuredStorageInformation(m_sFilename, PIDSI_KEYWORDS, m_sKeywords);
return S_OK;
}
STDMETHOD(get_Comments)( BSTR* pbstrVal )
{
CTemporaryCS oCS(&m_csThread);
if( NULL == pbstrVal )
return S_FALSE;
(*pbstrVal) = NULL;
(*pbstrVal) = m_sComments.AllocSysString();
return S_OK;
}
STDMETHOD(put_Comments)( BSTR bstrVal )
{
CTemporaryCS oCS(&m_csThread);
m_sComments = CString( bstrVal );
SaveStructuredStorageInformation(m_sFilename, PIDSI_COMMENTS, m_sComments);
return S_OK;
}
STDMETHOD(get_Author)( BSTR* pbstrVal )
{
CTemporaryCS oCS(&m_csThread);
if( NULL == pbstrVal )
return S_FALSE;
(*pbstrVal) = NULL;
(*pbstrVal) = m_sAuthor.AllocSysString();
return S_OK;
}
STDMETHOD(put_Author)( BSTR bstrVal )
{
CTemporaryCS oCS(&m_csThread);
m_sAuthor = CString( bstrVal );
SaveStructuredStorageInformation(m_sFilename, PIDSI_AUTHOR, m_sAuthor);
return S_OK;
}
STDMETHOD(get_RevisionNumber)( BSTR* pbstrVal )
{
CTemporaryCS oCS(&m_csThread);
if( NULL == pbstrVal )
return S_FALSE;
(*pbstrVal) = NULL;
(*pbstrVal) = m_sRevisionNumber.AllocSysString();
return S_OK;
}
STDMETHOD(put_RevisionNumber)( BSTR bstrVal )
{
CTemporaryCS oCS(&m_csThread);
m_sRevisionNumber = CString( bstrVal );
SaveStructuredStorageInformation(m_sFilename, PIDSI_REVNUMBER, m_sRevisionNumber);
return S_OK;
}
STDMETHOD(get_Width)( LONG* pnVal )
{
if( NULL == pnVal )
return false;
(*pnVal) = m_nWidth;
return S_OK;
}
STDMETHOD(put_Width)( LONG nVal )
{
m_nWidth = nVal;
return S_OK;
}
STDMETHOD(get_Height)( LONG* pnVal )
{
if( NULL == pnVal )
return false;
(*pnVal) = m_nHeight;
return S_OK;
}
STDMETHOD(put_Height)( LONG nVal )
{
m_nHeight = nVal;
return S_OK;
}
STDMETHOD(get_ResizeMode)( LONG* pnVal )
{
if( NULL == pnVal )
return false;
(*pnVal) = m_nResizeMode;
return S_OK;
}
STDMETHOD(put_ResizeMode)( LONG nVal )
{
m_nResizeMode = nVal;
return S_OK;
}
STDMETHOD(get_Watermark)( BSTR* pbstrVal )
{
if( NULL == pbstrVal )
return S_FALSE;
(*pbstrVal) = m_sWatermark.AllocSysString();
return S_OK;
}
STDMETHOD(put_Watermark)( BSTR bstrVal )
{
m_sWatermark = CString(bstrVal);
m_piFileConverter->put_Watermark(bstrVal);
return S_OK;
}
STDMETHOD(get_IsParseFileComplete)( VARIANT_BOOL* pvIsParseFileComplete )
{
if( NULL == pvIsParseFileComplete )
return S_FALSE;
if( false == m_bParseFileComplete )
(*pvIsParseFileComplete) = VARIANT_FALSE;
else
(*pvIsParseFileComplete) = VARIANT_TRUE;
return S_OK;
}
STDMETHOD(SetAdditionalParam)( BSTR ParamName, VARIANT ParamValue)
{
CString sParamName; sParamName = ParamName;
if (g_csBlowfishKeyParamName == sParamName)
{
if (!m_oDecoder.SetBlowfishKey(ParamValue.punkVal))
return S_FALSE;
}
return S_OK;
}
STDMETHOD(GetAdditionalParam)( BSTR ParamName, VARIANT* ParamValue)
{
if (NULL == ParamValue)
return S_FALSE;
CString sParamName; sParamName = ( CString ) ParamName; sParamName.MakeLower();
if ( L"imagescount" == sParamName )
{
ParamValue->vt = VT_I4;
ParamValue->lVal = m_nImagesCount;
}
else if( L"lasterror" == sParamName )
{
ParamValue->vt = VT_I4;
ParamValue->lVal = m_nLastError;
}
return S_OK;
}
STDMETHOD(get_MaxFilesCount)( LONG *pnVal)
{
if( NULL == pnVal )
return S_FALSE;
(*pnVal) = m_nMaxFilesCount;
return S_OK;
}
STDMETHOD(put_MaxFilesCount)( LONG nVal)
{
m_nMaxFilesCount = nVal;
return S_OK;
}
STDMETHOD(get_TempDirectory)( BSTR* pbstrDir )
{
return m_piFileConverter->get_TempDirectory(pbstrDir);
}
STDMETHOD(put_TempDirectory)( BSTR bstrDir )
{
m_sTempPath = CString( bstrDir );
return m_piFileConverter->put_TempDirectory(bstrDir);;
}
STDMETHOD(get_Password)( BSTR* pbstrPassword )
{
if( NULL == pbstrPassword )
return S_FALSE;
(*pbstrPassword) = m_sPassword.AllocSysString();
return S_OK;
}
STDMETHOD(put_Password)( BSTR bstrPassword )
{
m_sPassword = CString( bstrPassword );
return S_OK;
}
STDMETHOD(get_Permissions)( LONG* pnPermissions )
{
if( NULL == pnPermissions )
return S_FALSE;
(*pnPermissions) = m_nPermissions;
return S_OK;
}
STDMETHOD(get_Status)( LONG* pVal)
{
if( NULL == pVal )
return S_FALSE;
(*pVal) = m_nStatus;
return S_OK;
}
STDMETHOD(get_CommandRenderer)( IUnknown** ppunkRend )
{
return m_piFileConverter->get_CommandRenderer( ppunkRend );
}
private: void UpdateGdiPlusRenderer(float dWidthMm, float dHeightMm,MediaCore::IAVSUncompressedVideoFrame** piImage,AVSGraphics::IAVSGraphicsRenderer** piRend )
{
(*piImage) = NULL;
(*piRend) = NULL;
CoCreateInstance( __uuidof( MediaCore::CAVSUncompressedVideoFrame ), NULL ,CLSCTX_INPROC_SERVER, __uuidof(MediaCore::IAVSUncompressedVideoFrame ), (void **)piImage );
//dpi
HDC hDCScreen = GetDC(NULL);
int nLOGPIXELSX = GetDeviceCaps(hDCScreen, LOGPIXELSX);
int nLOGPIXELSY = GetDeviceCaps(hDCScreen, LOGPIXELSY);
ReleaseDC(NULL, hDCScreen);
//
long nWidthPix = (long)(nLOGPIXELSX * dWidthMm / (10 * ONE_INCH ) );
long nHeightPix = (long)(nLOGPIXELSY * dWidthMm * dHeightMm / (10 * dWidthMm * ONE_INCH));
//
if (( m_nWidth > 0 ) && (m_nHeight > 0))
{
if( m_nResizeMode == 1 )
{
if( nWidthPix * m_nHeight > m_nWidth * nHeightPix )
{
nHeightPix = m_nWidth * nHeightPix / nWidthPix;
nWidthPix = m_nWidth;
}
else
{
nWidthPix = m_nHeight * nWidthPix / nHeightPix;
nHeightPix = m_nHeight;
}
}
else
{
nWidthPix = m_nWidth;
nHeightPix = m_nHeight;
}
}
(*piImage)->Width = nWidthPix;
(*piImage)->Height = nHeightPix;
(*piImage)->put_Stride(0, nWidthPix * 4);
(*piImage)->AspectRatioX = nWidthPix;
(*piImage)->AspectRatioY = nHeightPix;
(*piImage)->DataSize = 4 * nWidthPix * nHeightPix;
(*piImage)->ColorSpace = 64 + (1 << 31);
(*piImage)->AllocateBuffer(-1);
memset((*piImage)->Buffer, 255, (*piImage)->BufferSize);
CoCreateInstance( __uuidof( AVSGraphics::CAVSGraphicsRenderer ), NULL ,CLSCTX_INPROC_SERVER, __uuidof(AVSGraphics::IAVSGraphicsRenderer), (void **)piRend );
// FontManager
VARIANT vtVariant;
vtVariant.vt = VT_UNKNOWN;
vtVariant.punkVal = NULL;
(*piRend)->SetAdditionalParam( L"FontManager", vtVariant );
(*piRend)->put_Width((float)dWidthMm);
(*piRend)->put_Height((float)dHeightMm);
(*piRend)->CreateFromMediaData( (*piImage), 0, 0, nWidthPix, nHeightPix );
}
private: void Clear()
{
if(NULL != m_piFileConverter)
{
m_piFileConverter->put_CommandRenderer( NULL );
m_piFileConverter->put_Watermark( NULL );
}
m_nRendererError = 0;
m_nLastProgress = -1;
m_sFileInfo = _T("");
m_bIsEdited = false;
m_bPdfLoad = false;
m_sFilename = _T("");
m_sTitle = _T("");
m_sTitle = _T("");
m_sSubject = _T("");
m_sCategory = _T("");
m_sKeywords = _T("");
m_sComments = _T("");
m_sSource = _T("");
m_sAuthor = _T("");
m_sRevisionNumber = _T("");
//m_sPassword = _T("");
m_sOpenOptions = _T("");
m_bParseFileComplete = false;
m_nPermissions = PERMISSION_PRINT | PERMISSION_CHANGE | PERMISSION_COPY;
m_nImagesCount = 0;
m_nLastError = S_OK;
// thumbnail
if( _T("") != m_sThumbnailsPath )
{
Utils::RemoveDirOrFile( m_sThumbnailsPath );
m_sThumbnailsPath.Empty();
}
m_mapThumbnails.RemoveAll();
}
private: void LoadStructuredStorageInformation( CString sFilename )
{
// docx, pptx, xslx
LONG nFileType = AVS_OFFICESTUDIO_FILE_UNKNOWN;
m_piFileConverter->get_FileType( &nFileType );
if( AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFileType || AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX == nFileType || AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFileType)
{
//
BSTR bstrFilename = m_sFilename.AllocSysString();
CString sOptions = _T("<Options>");
sOptions.AppendFormat( _T("<FileType>%d</FileType>"), nFileType );
if( false == m_sPassword.IsEmpty() )
sOptions.AppendFormat( _T("<Password>%s</Password>"), Utils::PrepareToXML( m_sPassword ) );
sOptions.Append( m_sOpenOptions );
sOptions.Append( _T("</Options>") );
BSTR bstrOptions = sOptions.AllocSysString();
HRESULT hRes = m_piFileConverter->LoadFromFile( bstrFilename, L"", bstrOptions );
SysFreeString(bstrFilename);
SysFreeString(bstrOptions);
if( FAILED( hRes ) )
return;
BSTR bstrTempDir;
m_piFileConverter->get_TempDirectory(&bstrTempDir);
CString sTempDir( bstrTempDir );
SysFreeString( bstrTempDir );
if( "" == sTempDir )
return;
XmlUtils::CXmlReader oXmlReader;
// Rels
if( TRUE == oXmlReader.OpenFromFile( sTempDir + _T("\\[Content_Types].xml") ) )
if( TRUE == oXmlReader.ReadRootNode( _T("Types") ) )
{
CString sCorePath;
oXmlReader.ReadNodeList( _T("Override") );
for( int i = 0; i < oXmlReader.GetLengthList(); i++ )
{
CString sType = oXmlReader.ReadNodeAttribute(i , _T("ContentType") );
if( _T("application/vnd.openxmlformats-package.core-properties+xml") == sType )
{
sCorePath = oXmlReader.ReadNodeAttribute(i , _T("PartName") );
//
if( sCorePath.GetLength() > 0 && ( sCorePath[0] != '/' || sCorePath[0] != '\\' ) )
sCorePath.Insert(0, '/');
}
}
if( false == sCorePath.IsEmpty() )
{
if( TRUE == oXmlReader.OpenFromFile( sTempDir + sCorePath ) )
if( TRUE == oXmlReader.ReadRootNode( _T("cp:coreProperties") ) )
{
oXmlReader.ReadNodeList( _T("*") );
for( int i = 0; i < oXmlReader.GetLengthList(); i++)
{
CString sNodeName = oXmlReader.ReadNodeName(i);
CString sValue = oXmlReader.ReadNodeText(i);
if ( _T("dc:title") == sNodeName )
m_sTitle = sValue;
else if( _T("dc:subject") == sNodeName )
m_sSubject = sValue;
else if( _T("keywords") == sNodeName || _T("cp:keywords") == sNodeName)
m_sKeywords = sValue;
else if( _T("dc:subject") == sNodeName )
m_sSubject = sValue;
else if( _T("dc:creator") == sNodeName )
m_sAuthor = sValue;
else if( _T("revision") == sNodeName || _T("cp:revision") == sNodeName)
m_sRevisionNumber = sValue;
else if( _T("dc:description") == sNodeName )
m_sComments = sValue;
}
}
}
}
}
else
{
//
IStoragePtr piStorage = NULL;
BSTR bstrFilename = sFilename.AllocSysString();
HRESULT hRes = StgOpenStorageEx(bstrFilename, STGM_READ|STGM_SHARE_DENY_WRITE,
STGFMT_ANY, 0, NULL, NULL,
IID_IPropertySetStorage, (void**)&piStorage);
SysFreeString( bstrFilename );
if( FAILED(hRes) )
return;
IPropertySetStoragePtr piPropertySetStorage = NULL;
hRes = piStorage->QueryInterface( IID_IPropertySetStorage, (void**)&piPropertySetStorage );
if( FAILED(hRes) )
return;
// Summary
IPropertyStoragePtr piPropertyStorage;
hRes = piPropertySetStorage->Open(FMTID_SummaryInformation, STGM_READ|STGM_SHARE_EXCLUSIVE, &piPropertyStorage);
if( FAILED(hRes) )
return;
//
PROPSPEC aPropertyID[9];
PROPVARIANT aPropertyValue[9];
// ID
for( int i = 0; i < 9; i++ )
aPropertyID[i].ulKind = PRSPEC_PROPID;
//
// ID
aPropertyID[0].propid = PIDSI_TITLE;//#define PIDSI_TITLE 0x00000002L // VT_LPSTR
aPropertyID[1].propid = PIDSI_SUBJECT;//#define PIDSI_SUBJECT 0x00000003L // VT_LPSTR
aPropertyID[2].propid = PIDSI_AUTHOR;//#define PIDSI_AUTHOR 0x00000004L // VT_LPSTR
aPropertyID[3].propid = PIDSI_KEYWORDS;//#define PIDSI_KEYWORDS 0x00000005L // VT_LPSTR
aPropertyID[4].propid = PIDSI_COMMENTS;//#define PIDSI_COMMENTS 0x00000006L // VT_LPSTR
aPropertyID[5].propid = PIDSI_TEMPLATE;//#define PIDSI_TEMPLATE 0x00000007L // VT_LPSTR
aPropertyID[6].propid = PIDSI_LASTAUTHOR;//#define PIDSI_LASTAUTHOR 0x00000008L // VT_LPSTR
aPropertyID[7].propid = PIDSI_REVNUMBER;//#define PIDSI_REVNUMBER 0x00000009L // VT_LPSTR
aPropertyID[8].propid = PIDSI_APPNAME;//#define PIDSI_APPNAME 0x00000012L // VT_LPSTR
//aPropertyID[9].propid = PIDSI_EDITTIME;//#define PIDSI_EDITTIME 0x0000000aL // VT_FILETIME (UTC)
//aPropertyID[10].propid = PIDSI_LASTPRINTED;//#define PIDSI_LASTPRINTED 0x0000000bL // VT_FILETIME (UTC)
//aPropertyID[11].propid = PIDSI_CREATE_DTM;//#define PIDSI_CREATE_DTM 0x0000000cL // VT_FILETIME (UTC)
//aPropertyID[12].propid = PIDSI_LASTSAVE_DTM;//#define PIDSI_LASTSAVE_DTM 0x0000000dL // VT_FILETIME (UTC)
//aPropertyID[13].propid = PIDSI_PAGECOUNT;//#define PIDSI_PAGECOUNT 0x0000000eL // VT_I4
//aPropertyID[14].propid = PIDSI_WORDCOUNT;//#define PIDSI_WORDCOUNT 0x0000000fL // VT_I4
//aPropertyID[15].propid = PIDSI_CHARCOUNT;//#define PIDSI_CHARCOUNT 0x00000010L // VT_I4
//aPropertyID[16].propid = PIDSI_DOC_SECURITY;//#define PIDSI_DOC_SECURITY 0x00000013L // VT_I4
//#define PIDSI_THUMBNAIL 0x00000011L // VT_CF
//
hRes = piPropertyStorage->ReadMultiple( 9, aPropertyID, aPropertyValue);
if( FAILED(hRes) )
return;
m_sTitle = aPropertyValue[0].pszVal;
m_sSubject = aPropertyValue[1].pszVal;
m_sAuthor = aPropertyValue[2].pszVal;
m_sKeywords = aPropertyValue[3].pszVal;
m_sComments = aPropertyValue[4].pszVal;
m_sTemplate = aPropertyValue[5].pszVal;
m_sLastAuthor = aPropertyValue[6].pszVal;
m_sRevisionNumber = aPropertyValue[7].pszVal;
m_sAppName = aPropertyValue[8].pszVal;
//FILETIME ft1 = aPropertyValue[9].filetime;
//FILETIME ft2 = aPropertyValue[10].filetime;
//FILETIME ft3 = aPropertyValue[11].filetime;
//FILETIME ft4 = aPropertyValue[12].filetime;
//int n1 = aPropertyValue[13].intVal;
//int n2 = aPropertyValue[14].intVal;
//int n3 = aPropertyValue[15].intVal;
//int n4 = aPropertyValue[16].intVal;
}
}
private: void SaveStructuredStorageInformation( CString sFilename, PROPID oID, CString sValue )
{
IStoragePtr piStorage = NULL;
//
BSTR bstrFilename = sFilename.AllocSysString();
HRESULT hRes = StgOpenStorageEx(bstrFilename, STGM_SHARE_EXCLUSIVE|STGM_READWRITE,
STGFMT_ANY, 0, NULL, NULL,
IID_IPropertySetStorage, (void**)&piStorage);
SysFreeString( bstrFilename );
if( FAILED(hRes) )
return;
IPropertySetStoragePtr piPropertySetStorage = NULL;
hRes = piStorage->QueryInterface( IID_IPropertySetStorage, (void**)&piPropertySetStorage );
if( FAILED( hRes ) )
return;
// Summary
IPropertyStoragePtr piPropertyStorage;
hRes = piPropertySetStorage->Open(FMTID_SummaryInformation, STGM_READWRITE|STGM_SHARE_EXCLUSIVE, &piPropertyStorage);
if( FAILED( hRes ) )
{
hRes = piPropertySetStorage->Create(FMTID_SummaryInformation, NULL, PROPSETFLAG_DEFAULT, STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, &piPropertyStorage);
if( FAILED( hRes ) )
return;
}
//
PROPSPEC aPropertyID[1];
PROPVARIANT aPropertyValue[1];
// ID
aPropertyID[0].ulKind = PRSPEC_PROPID;
aPropertyID[0].propid = oID;
//
aPropertyValue[0].vt = VT_LPWSTR;
aPropertyValue[0].pwszVal = sValue.GetBuffer();
//
hRes = piPropertyStorage->WriteMultiple( 1, aPropertyID, aPropertyValue, PID_FIRST_USABLE);
if( FAILED( hRes ) )
return;
piPropertyStorage->Commit(STGC_DEFAULT);
sValue.ReleaseBuffer();
}
static DWORD WINAPI _ThreadProc(void* pv)
{
CAVSOfficeFile *pThis = (CAVSOfficeFile *)pv;
return pThis->ThreadProc();
}
private: DWORD ThreadProc()
{
if( NULL == m_piFileConverter )
{
m_nLastError = AVS_ERROR_UNEXPECTED;
OnError( AVS_ERROR_UNEXPECTED );
return 0;
}
CoInitialize( NULL );
RELEASEINTERFACE( m_piOfficeViewer );
CoCreateInstance( __uuidof(AVSGraphics::CAVSDocumentPainter), NULL ,CLSCTX_INPROC_SERVER, __uuidof(AVSGraphics::IAVSDocumentPainter), (void **)(&m_piOfficeViewer) );
m_bStopParse = false;
m_bParseFileComplete = false;
HRESULT hRes = S_OK;
long nFileType;
long nConverterStatus = 0;
//
m_piFileConverter->get_Status( &nConverterStatus );
while( CONVERTER_LOAD_PROG == nConverterStatus )
{
Sleep( 200 );
m_piFileConverter->get_Status( &nConverterStatus );
}
m_piFileConverter->get_FileType( &nFileType );
VARIANT_BOOL vbIsLoadComplete = VARIANT_FALSE;
m_piFileConverter->get_IsLoadComplete( &vbIsLoadComplete );
// CommandsRenderer Viewer .
AVSGraphics::IAVSDocumentRendererPtr piConverterComRen = NULL;
m_piFileConverter->get_CommandRenderer( (IUnknown**)&piConverterComRen );
long nPageCount = 0;
piConverterComRen->get_PageCount( &nPageCount );
if( nPageCount > 0 )
{
for( int i = 0; i < nPageCount; i++ )
{
if( true == m_bStopParse )
break;
SHORT nCancel;
OnCompleteParsePage();
OnProgressParseFile( 0, (long)( c_nMaxProgressPercent * ( 1.0 * (i + 1) / nPageCount ) ), &nCancel );
}
// pdf , docx
BSTR bstrTempDir = NULL;
m_piFileConverter->get_TempDirectory( &bstrTempDir );
UpdateImagesCount( (CString)bstrTempDir, nFileType );
SysFreeString( bstrTempDir );
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileParsingComplete;
OnCompleteParseFile();
CoUninitialize();
return 0;
}
//pdf DrawingXml, load
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFileType || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU == nFileType || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS == nFileType )
{
//
COfficeFileConvEvents< _IAVSOfficeFileConverterEvents, CAVSOfficeFile >* oFileConvEvents = new COfficeFileConvEvents< _IAVSOfficeFileConverterEvents, CAVSOfficeFile >(this);
oFileConvEvents->AddRef();
oFileConvEvents->Advise( m_piFileConverter );
m_bPdfLoad = true;
//Pdf
CString sPdfOptions = _T("<Options>");
sPdfOptions.AppendFormat( _T("<FileType>%d</FileType>"), nFileType );
if( false == m_sPassword.IsEmpty() )
sPdfOptions.AppendFormat( _T("<Password>%s</Password>"), Utils::PrepareToXML( m_sPassword ) );
sPdfOptions.Append( m_sOpenOptions );
sPdfOptions.Append( _T("<Display/>") );
sPdfOptions.Append( _T("</Options>") );
//
BSTR bstrFilename = m_sFilename.AllocSysString();
BSTR bstrOptions = sPdfOptions.AllocSysString();
hRes = m_piFileConverter->LoadFromFile( bstrFilename, L"", bstrOptions );
SysFreeString(bstrFilename);
SysFreeString(bstrOptions);
if( FAILED( hRes ) )
{
m_bParseFileComplete = true;
//
oFileConvEvents->UnAdvise( m_piFileConverter );
RELEASEINTERFACE( oFileConvEvents );
m_nStatus = c_shOfficeFileOpen;
m_nLastError = hRes;
OnError( hRes );
CoUninitialize();
return 1;
}
VARIANT_BOOL bComplete = VARIANT_FALSE;
while( VARIANT_FALSE == bComplete)
{
m_piFileConverter->get_IsLoadComplete( &bComplete );
Sleep(200);
}
//
oFileConvEvents->UnAdvise( m_piFileConverter );
RELEASEINTERFACE( oFileConvEvents );
m_bPdfLoad = false;
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileParsingComplete;
// OnCompleteParsePage COfficeFileConvEvents
OnCompleteParseFile();
CoUninitialize();
return 0;
}
else
{
// load
if( VARIANT_FALSE == vbIsLoadComplete )
{
//
COfficeFileConvEvents< _IAVSOfficeFileConverterEvents, CAVSOfficeFile >* oFileConvEvents = new COfficeFileConvEvents< _IAVSOfficeFileConverterEvents, CAVSOfficeFile >(this);
oFileConvEvents->AddRef();
oFileConvEvents->Advise( m_piFileConverter );
BSTR bstrFilename = m_sFilename.AllocSysString();
CString sOptions = _T("<Options>");
sOptions.AppendFormat( _T("<FileType>%d</FileType>"), nFileType );
if( false == m_sPassword.IsEmpty() )
sOptions.AppendFormat( _T("<Password>%s</Password>"), Utils::PrepareToXML( m_sPassword ) );
sOptions.Append( m_sOpenOptions );
sOptions.Append( _T("</Options>") );
BSTR bstrOptions = sOptions.AllocSysString();
hRes = m_piFileConverter->LoadFromFile( bstrFilename, L"", bstrOptions );
SysFreeString(bstrFilename);
SysFreeString(bstrOptions);
//
oFileConvEvents->UnAdvise( m_piFileConverter );
RELEASEINTERFACE( oFileConvEvents );
if( FAILED( hRes ) )
{
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileOpen;
m_nLastError = hRes;
OnError( hRes );
CoUninitialize();
return 1;
}
}
if( true == m_bStopParse )
{
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileOpen;
CoUninitialize();
return 0;
}
// pdf , docx
BSTR bstrTempDir = NULL;
m_piFileConverter->get_TempDirectory( &bstrTempDir );
UpdateImagesCount( (CString)bstrTempDir, nFileType );
SysFreeString( bstrTempDir );
////load CommandRenderer ,
//RELEASEINTERFACE(m_piCommandsRenderer);
//m_piFileConverter->put_CommandRenderer( NULL );
//m_piFileConverter->put_Watermark( NULL );
BSTR bstrDrawingXml;
hRes = m_piFileConverter->get_DrawingXml(&bstrDrawingXml);
if( FAILED( hRes ) )
{
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileOpen;
m_nLastError = hRes;
OnError( hRes );
CoUninitialize();
return 1;
}
if( true == m_bStopParse )
{
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileOpen;
CoUninitialize();
return 0;
}
CString sEncodedXml = CString(bstrDrawingXml);
SysFreeString(bstrDrawingXml);
// xml
VARIANT vEncoder;
vEncoder.vt = VT_UNKNOWN;
hRes = m_piFileConverter->GetAdditionalParam( L"decoderkey", &vEncoder);
//
BSTR bstrAdditionalParamName = g_csBlowfishKeyParamName.AllocSysString();
hRes = m_piOfficeViewer->SetAdditionalParam( bstrAdditionalParamName, vEncoder);
SysFreeString(bstrAdditionalParamName);
RELEASEINTERFACE( vEncoder.punkVal );
if( FAILED( hRes ) )
{
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileOpen;
m_nLastError = hRes;
OnError( hRes );
CoUninitialize();
return 1;
}
// xml
BSTR bstrEncodedXml = sEncodedXml.AllocSysString();
hRes = m_piOfficeViewer->SetXml(bstrEncodedXml);
SysFreeString(bstrEncodedXml);
if( FAILED( hRes ) )
{
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileOpen;
m_nLastError = hRes;
OnError( hRes );
CoUninitialize();
return 1;
}
m_piOfficeViewer->AddRenderer( piConverterComRen );
if( true == m_bStopParse )
{
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileOpen;
CoUninitialize();
return 0;
}
//
m_oEventViewer->Advise( m_piOfficeViewer );
hRes = m_piOfficeViewer->Start();
if( FAILED( hRes ) )
{
m_bParseFileComplete = true;
m_nStatus = c_shOfficeFileOpen;
m_nLastError = hRes;
OnError( hRes );
CoUninitialize();
return 1;
}
//
WaitForSingleObject( m_hViewerStop, INFINITE );
RELEASEINTERFACE( m_piOfficeViewer );
CoUninitialize();
return 0;
}
}
private: void FitToPage( float fSourceWidth, float fSourceHeight, float fTargetWidth, float fTargetHeight, float& fResX, float& fResY, float& fResWidth, float& fResHeight )
{
if( fSourceWidth * fTargetHeight > fTargetWidth * fSourceHeight )
{
fResHeight = fTargetWidth * fSourceHeight / fSourceWidth;
fResWidth = fTargetWidth;
fResX = 0;
fResY = fTargetHeight / 2 - fResHeight / 2;
}
else
{
fResWidth = fTargetHeight * fSourceWidth / fSourceHeight;
fResHeight = fTargetHeight;
fResY = 0;
fResX = fTargetWidth / 2 - fResWidth / 2;
}
}
private: void UpdateImagesCount( CString sDirectory, LONG nFiletype )
{
// PDF Open
// ( docx)
if( 0 != (AVS_OFFICESTUDIO_FILE_DOCUMENT & nFiletype) || 0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFiletype) )
{
m_aRelsWalked.RemoveAll();
m_aImagesToExtract.RemoveAll();
m_nImagesCount = 0;
NormalizePath( sDirectory, true );
UpdateDocxImagesCountFromRels( sDirectory + _T("_rels/.rels"), sDirectory );
}
}
private: void UpdateDocxImagesCountFromRels( CString sSourceRels, CString sSourcePath )
{
//
TCHAR buffer[1024];
GetFullPathName( sSourceRels, 1024, buffer, NULL );
sSourceRels = CString( buffer );
XmlUtils::CXmlReader oXmlReader;
//
if( ::GetFileAttributes( sSourceRels ) != DWORD(-1) )
{
for( int i = 0; i < m_aRelsWalked.GetCount(); i++ )
if( m_aRelsWalked[i] == sSourceRels )
return;
m_aRelsWalked.Add( sSourceRels );
if( TRUE == oXmlReader.OpenFromFile( sSourceRels ) )
if( TRUE == oXmlReader.ReadRootNode( _T("Relationships") ) )
if( TRUE == oXmlReader.ReadNodeList( _T("Relationship") ) )
{
for( int i = 0; i < oXmlReader.GetLengthList(); i++ )
{
CString sTargetMode = oXmlReader.ReadNodeAttribute( i, _T("TargetMode") );
if( _T("External") != sTargetMode )
{
CString sType = oXmlReader.ReadNodeAttribute( i, _T("Type") );
CString sTargetRel = oXmlReader.ReadNodeAttribute( i, _T("Target") );
NormalizePath( sTargetRel, false );
CString sTargetFile = sSourcePath + sTargetRel;
TCHAR tDrive[256];
TCHAR tDir[256];
TCHAR tFilename[256];
TCHAR tExt[256];
_tsplitpath( sTargetFile, tDrive, tDir, tFilename, tExt );
CString sDrive = CString( tDrive );
CString sDir = CString( tDir );
CString sFilename = CString( tFilename );
CString sExt = CString( tExt );
if( _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/image") == sType )
{
//
GetFullPathName( sTargetFile, 1024, buffer, NULL );
sTargetFile = CString( buffer );
bool bDuplicate = false;
for( int j = 0; j < m_aImagesToExtract.GetCount(); j++ )
if( m_aImagesToExtract[j] == sTargetFile )
{
bDuplicate = true;
break;
}
if( false == bDuplicate )
{
m_aImagesToExtract.Add( sTargetFile );
m_nImagesCount++;
}
}
else// rels
UpdateDocxImagesCountFromRels( sDrive + sDir + _T("_rels/") + sFilename + sExt + _T(".rels"), sDrive + sDir );
}
}
}
}
}
// bEnd == true ( '/' '\'), bEnd == false ( '/' '\')
private: void NormalizePath( CString& sPath, bool bEnd = true )
{
int nPathLen = sPath.GetLength();
if( nPathLen > 0 ) // sPath '/' '\'
{
if( true == bEnd )
{
TCHAR tcLastChar = sPath[ nPathLen - 1 ];
if( '\\' != tcLastChar && '/' != tcLastChar )
sPath.AppendChar( '/' );
}
else
{
TCHAR tcFirstChar = sPath[ nPathLen - 1 ];
if( '\\' == tcFirstChar || '/' == tcFirstChar )
sPath = sPath.Right( sPath.GetLength() - 1 );
}
}
}
};
#pragma once
#include "OfficeFileEvents.h"
#include "..\Common\OfficeFileTemplate.h"
#include "StringUtils.h"
#include "MediaFormatDefine.h"
#include "StorageConverters.h"
#include "../Common/RSA/XMLDecoder.h"
#include "OfficeRendererTemplate.h"
#include "GdiPlusEx.h"
//#define AVS_REMOVE_REG
#ifdef AVS_REMOVE_REG
#include "Registration.h"
#endif
#define ONE_INCH 2.54
#define TO_FLOAT 10000
#define CONVERTER_IDLE 0
#define CONVERTER_LOAD_PROG 1
#define CONVERTER_LOAD_COMP 2
#define CONVERTER_SAVE_PROG 3
#define CONVERTER_SAVE_COMP 4
// IAVSOfficeFile
[
object,
uuid("4b1363f0-d80d-11de-8a39-0800200c9a66"),
dual, helpstring("IAVSOfficeFileTemplate Interface"),
pointer_default(unique)
]
__interface IAVSOfficeFileConverter : public IAVSOfficeFileTemplate
{
[id(10), propget] HRESULT FileType( [out, retval] LONG* pnType );
[id(10), propput] HRESULT FileType( [in] LONG nType );
[id(20), propget] HRESULT DrawingXml( [out, retval] BSTR* pbstrXml );
[id(60), propget] HRESULT CommandRenderer( [out, retval] IUnknown** ppunkRend );
[id(60), propput] HRESULT CommandRenderer( [in] IUnknown* punkRend );
[id(70), propget] HRESULT Watermark( [out, retval] BSTR* pbstrVal );
[id(70), propput] HRESULT Watermark( [in] BSTR bstrVal );
[id(80)] HRESULT DrawWatermark( [in] IUnknown* punkImage,[in] LONG nWidth,[in] LONG nHeight );
[id(90), propget] HRESULT TempDirectory( [out, retval] BSTR* pbstrDir );
[id(90), propput] HRESULT TempDirectory( [in] BSTR bstrDir );
[id(100), propget] HRESULT IsLoadComplete( [out, retval] VARIANT_BOOL* pvIsLoadComplete );
[id(110), propget] HRESULT Status([out, retval] LONG* pVal);
[id(120)] HRESULT SetAdditionalParam([in] BSTR ParamName, [in] VARIANT ParamValue);
[id(130)] HRESULT GetAdditionalParam([in] BSTR ParamName, [out, retval] VARIANT* ParamValue);
};
// _IAVSOfficeFileConverterEvents
[
dispinterface,
uuid("ae195a70-f231-11de-8a39-0800200c9a66"),
helpstring("_IAVSOfficeFileConverterEvents Interface")
]
__interface _IAVSOfficeFileConverterEvents
{
[id(1), helpstring("method OnProgress")] HRESULT OnProgress([in] LONG nID, [in] LONG nPercent);
[id(2), helpstring("method OnProgressEx")] HRESULT OnProgressEx( [in] LONG nID, [in] LONG nPercent, [in, out, ref] SHORT* Cancel );
[id(10), helpstring("method OnCompletePage")] HRESULT OnCompletePage();
};
[
coclass,
default(IAVSOfficeFileConverter, _IAVSOfficeFileConverterEvents),
threading(apartment),
event_source(com),
vi_progid("AVSOfficeFile.AVSDocume"),
progid("AVSOfficeFile.AVSDocu.1"),
version(1.0),
uuid("6dec3f60-d80c-11de-8a39-0800200c9a66"),
helpstring("AVSOfficeFile Class")
]
class ATL_NO_VTABLE CAVSOfficeFileConverter : public IAVSOfficeFileConverter
{
private: long m_nRendererError; //
private: HANDLE m_hViewerStop; //
private: int m_nFileType;
private: int m_nOpenFileType;
private: CString m_sDrawingXML;
private: CString m_sMetadata;
private: AVSGraphics::IAVSDocumentPainter* m_piOfficeViewer;
private: AVSGraphics::IAVSDocumentRenderer* m_piCommandsRenderer;
private: CString m_sWatermark;
private: bool m_bIsInternalTemDir;
private: CString m_sTempDirectory;
private: CString m_sRootTempDirectory; //
private: CRITICAL_SECTION m_csThread;
private: StorageConverters m_oStorageConverters;
private: CCommandRendererEvents< AVSGraphics::_IAVSDocumentRendererEvents, CAVSOfficeFileConverter >* m_oCommandRendererEvent;
private: LPSTREAM m_pStream;
private: long m_nStatus; //CONVERTER_IDLE - ; CONVERTER_WORK -
#ifdef AVS_REMOVE_REG
private: CRegistratorServer* m_poRegServer;
#endif
private: double m_dMaxProgress; //
private: double m_dMinProgress; //
private: bool m_bCanceled; // SHORT* Cancel OnProgressDocumentEx c_shProgressCancel
private: long m_nLastProgress;
private: long m_nLastProgressEx;
private: IUnknown* m_piDecoderKey;
private: int m_nMaxPageLoad;
private: int m_nSaveMode;//
private: IUnknownPtr m_piSaveRenderer;//
private: bool m_bSaveRendererStopped;//
private: CGdiPlusInit m_oGdiPlusInit;
public:
CAVSOfficeFileConverter():m_piCommandsRenderer(NULL),m_oCommandRendererEvent(NULL),m_piDecoderKey(NULL)
{
m_sWatermark = "";
m_piOfficeViewer = NULL;
m_piSaveRenderer = NULL;
CoCreateInstance( __uuidof(AVSGraphics::CAVSDocumentRenderer), NULL ,CLSCTX_INPROC_SERVER, __uuidof(AVSGraphics::IAVSDocumentRenderer), (void **)(&m_piCommandsRenderer) );
m_hViewerStop = CreateEvent( NULL, FALSE, FALSE, NULL);
#ifdef AVS_REMOVE_REG
m_poRegServer = new CRegistratorServer();
#endif
Clear();
m_nFileType = AVS_OFFICESTUDIO_FILE_UNKNOWN;
m_oCommandRendererEvent = new CCommandRendererEvents< AVSGraphics::_IAVSDocumentRendererEvents, CAVSOfficeFileConverter >(this);
m_oCommandRendererEvent->AddRef();
}
__event __interface _IAVSOfficeFileConverterEvents;
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
InitializeCriticalSection(&m_csThread);
return S_OK;
}
void FinalRelease()
{
RELEASEINTERFACE( m_oCommandRendererEvent );
RELEASEINTERFACE( m_piCommandsRenderer );
RELEASEHANDLE( m_hViewerStop );
Clear();
DeleteCriticalSection(&m_csThread);
#ifdef AVS_REMOVE_REG
RELEASEOBJECT( m_poRegServer );
#endif
}
public:
void OnProgressDocumentEx( LONG nID, LONG nPercent, SHORT* Cancel )
{
long nCurProgress = GetProgress( nPercent );
if( nCurProgress > m_nLastProgressEx )
{
m_nLastProgressEx = nCurProgress;
OnProgressEx( nID, nCurProgress, Cancel );
}
//
if( -1 != m_nMaxPageLoad )
{
long nPageCount = 0;
if( NULL != m_piCommandsRenderer )
m_piCommandsRenderer->get_PageCount( &nPageCount );
if( nPageCount >= m_nMaxPageLoad )
(*Cancel) = c_shProgressCancel;//
}
if( c_shProgressContinue != (*Cancel) )
m_bCanceled = true;
}
void OnProgressDocument( LONG nID, LONG nPercent)
{
long nCurProgress = GetProgress( nPercent );
if( nCurProgress > m_nLastProgress )
{
m_nLastProgress = nCurProgress;
OnProgress( nID, nCurProgress );
}
}
void OnCompletePageDocument()
{
OnCompletePage();
}
void OnErrorViewer(LONG lError)
{
m_nRendererError = lError;
//
SetEvent( m_hViewerStop );
}
void OnStopViewer()
{
//
SetEvent( m_hViewerStop );
}
void OnProgressViewer(LONG lProgressPage)
{
OnProgress( 0, GetProgress( lProgressPage * 10000 ) );
}
void OnNewPageViewer(double dWidthMm, double dHeightMm)
{
if( -1 != m_nMaxPageLoad )
{
long nPageCount = 0;
if( NULL != m_piCommandsRenderer )
m_piCommandsRenderer->get_PageCount( &nPageCount );
//if( nPageCount >= m_nMaxPageLoad && NULL != m_piOfficeViewer )
//m_piOfficeViewer->Stop();
}
}
void OnCompletePageViewer()
{
}
void OnProgressParse( LONG lType, LONG lProgress )
{
}
public:
STDMETHOD(LoadFromFile)( BSTR bstrSrcFileName, BSTR bstrDstPath, BSTR bstrXMLOptions)
{
// gdiplus
if (!m_oGdiPlusInit.IsValid())
{
if (!m_oGdiPlusInit.Init())
return AVS_ERROR_UNEXPECTED;
}
m_bCanceled = false;
m_nLastProgress = -1;
m_nLastProgressEx = -1;
//
if( ::GetFileAttributes( bstrSrcFileName ) == INVALID_FILE_ATTRIBUTES )
return AVS_ERROR_FILEACCESS;
//CTemporaryCS oCS(&m_csThread);
CString sFilename(bstrSrcFileName);
CString sDstPath(bstrDstPath);
CString sOptions(bstrXMLOptions);
Clear();
m_nStatus = CONVERTER_LOAD_PROG;
int nOpenFileType = AVS_OFFICESTUDIO_FILE_UNKNOWN;
AVSOfficeFormatChecker avsOfficeFormatChecker;
bool bNoStandartOpen = false;
long nNoStandartType = AVS_OFFICESTUDIO_FILE_UNKNOWN;
CString sNoStandartPath;
// bstrXMLOptions FileType
//bool bFileTypeInOptions = false;
XmlUtils::CXmlReader oOptionsReader;
if( TRUE == oOptionsReader.OpenFromXmlString( bstrXMLOptions ) )
if( TRUE == oOptionsReader.ReadRootNode( _T("Options") ) )
{
CString sFileType = oOptionsReader.ReadNodeValue( _T("FileType") );
if( _T("") != sFileType )
{
nOpenFileType = Strings::ToInteger( sFileType );
//bFileTypeInOptions = true;
}
CString sMaxPageLoad = oOptionsReader.ReadNodeValue( _T("MaxPageLoad") );
if( _T("") != sMaxPageLoad )
m_nMaxPageLoad = Strings::ToInteger( sMaxPageLoad );
if( TRUE == oOptionsReader.ReadNode( _T("NoStandartOpen") ) )
{
bNoStandartOpen = true;
sNoStandartPath = oOptionsReader.ReadNodeAttribute( _T("destinationpath") );
nNoStandartType = Strings::ToInteger( oOptionsReader.ReadNodeAttribute( _T("destinationtype") ) );
}
}
if( AVS_OFFICESTUDIO_FILE_UNKNOWN == nOpenFileType )
nOpenFileType = avsOfficeFormatChecker.GetFileFormat( sFilename );
if( _T("") != sDstPath )
m_sTempDirectory = sDstPath;
else
{
m_sTempDirectory = Utils::CreateTempDir( m_sRootTempDirectory );
if( _T("") == m_sTempDirectory )
{
m_nStatus = CONVERTER_IDLE;
return AVS_OFFICEFILE_ERROR_CREATE_TEMP;
}
m_bIsInternalTemDir = true;
}
CString sXMLOptions( bstrXMLOptions );
//
IAVSOfficeFileTemplate* piConverter = NULL;
if( FALSE == m_oStorageConverters.GetConverter( nOpenFileType , &piConverter) )
{
m_nStatus = CONVERTER_IDLE;
return AVS_ERROR_FILEFORMAT;
}
//
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >* oEventDocuments = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >(this);
oEventDocuments->AddRef();
oEventDocuments->Advise( piConverter );
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >* oEventDocuments2 = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >(this);
oEventDocuments2->AddRef();
oEventDocuments2->Advise( piConverter );
HRESULT hRes = S_OK;
bool bDisplay = true;// pdf ( Display, ExtractImages)
if( -1 != sXMLOptions.Find( _T("Display") ) )
bDisplay = true;
else
bDisplay = false;
m_dMinProgress = 0;
m_dMaxProgress = 1;
// pdf CommandRender
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nOpenFileType && true == bDisplay )
{
RELEASEINTERFACE( m_piCommandsRenderer );
CoCreateInstance( __uuidof(AVSGraphics::CAVSDocumentRenderer), NULL ,CLSCTX_INPROC_SERVER, __uuidof(AVSGraphics::IAVSDocumentRenderer), (void **)(&m_piCommandsRenderer) );
AVSOfficePDFFile::IPDFFile* piPdfFile = NULL;
piConverter->QueryInterface( __uuidof(AVSOfficePDFFile::IPDFFile), (void**)&piPdfFile );
if( NULL != piPdfFile )
piPdfFile->put_CommandRenderer( m_piCommandsRenderer );
RELEASEINTERFACE(piPdfFile);
m_oCommandRendererEvent->Advise( m_piCommandsRenderer );
//
BSTR bstrTempFolder = m_sTempDirectory.AllocSysString();
BSTR bstrFilename = sFilename.AllocSysString();
hRes = piConverter->LoadFromFile( bstrFilename, bstrTempFolder ,bstrXMLOptions );
SysFreeString( bstrTempFolder );
SysFreeString( bstrFilename );
// CommandsRenderer
m_oCommandRendererEvent->UnAdvise( m_piCommandsRenderer );
}
else if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU == nOpenFileType )
{
if( NULL != m_piCommandsRenderer )
RELEASEINTERFACE( m_piCommandsRenderer );
CoCreateInstance( __uuidof(AVSGraphics::CAVSDocumentRenderer), NULL ,CLSCTX_INPROC_SERVER, __uuidof(AVSGraphics::IAVSDocumentRenderer), (void **)(&m_piCommandsRenderer) );
OfficeDjVu::IDjVuFile* piDjVuFile = NULL;
piConverter->QueryInterface( __uuidof(OfficeDjVu::IDjVuFile), (void**)&piDjVuFile );
if( NULL != piDjVuFile )
{
piDjVuFile->put_DocumentRenderer( m_piCommandsRenderer );
}
RELEASEINTERFACE(piDjVuFile);
m_oCommandRendererEvent->Advise( m_piCommandsRenderer );
//
BSTR bstrTempFolder = m_sTempDirectory.AllocSysString();
BSTR bstrFilename = sFilename.AllocSysString();
hRes = piConverter->LoadFromFile( bstrFilename, bstrTempFolder ,bstrXMLOptions );
SysFreeString( bstrTempFolder );
SysFreeString( bstrFilename );
// CommandsRenderer
m_oCommandRendererEvent->UnAdvise( m_piCommandsRenderer );
}
else if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS == nOpenFileType )
{
if( NULL != m_piCommandsRenderer )
RELEASEINTERFACE( m_piCommandsRenderer );
CoCreateInstance( __uuidof(AVSGraphics::CAVSDocumentRenderer), NULL ,CLSCTX_INPROC_SERVER, __uuidof(AVSGraphics::IAVSDocumentRenderer), (void **)(&m_piCommandsRenderer) );
OfficeXPS::IXPSFile* piXpsFile = NULL;
piConverter->QueryInterface( __uuidof(OfficeXPS::IXPSFile), (void**)&piXpsFile );
if( NULL != piXpsFile )
{
piXpsFile->put_DocumentRenderer( m_piCommandsRenderer );
}
RELEASEINTERFACE(piXpsFile);
m_oCommandRendererEvent->Advise( m_piCommandsRenderer );
//
BSTR bstrTempFolder = m_sTempDirectory.AllocSysString();
BSTR bstrFilename = sFilename.AllocSysString();
hRes = piConverter->LoadFromFile( bstrFilename, bstrTempFolder ,bstrXMLOptions );
SysFreeString( bstrTempFolder );
SysFreeString( bstrFilename );
// CommandsRenderer
m_oCommandRendererEvent->UnAdvise( m_piCommandsRenderer );
}
else if( 0 != (AVS_OFFICESTUDIO_FILE_SPREADSHEET & nOpenFileType) &&
( false == bNoStandartOpen || AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML == nNoStandartType) )
{
if( AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML == nNoStandartType )
{
m_dMinProgress = 0.000;
m_dMaxProgress = 0.500;
}
else
{
m_dMinProgress = 0.000;
m_dMaxProgress = 0.333;
}
SHORT shCancel = c_shProgressContinue;
OnProgressDocumentEx( 0 , 0, &shCancel );
if( c_shProgressContinue == shCancel )
{
// XLSX
CString sXlsxPath = Utils::CreateTempDir( m_sTempDirectory );
if( true == sXlsxPath.IsEmpty() )
hRes == AVS_OFFICEFILE_ERROR_CREATE_TEMP;
IAVSOfficeFileTemplate* piXlsxConverter = NULL;
if( SUCCEEDED( hRes ) )
{
if( AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS == nOpenFileType )
{
if( FALSE == m_oStorageConverters.GetConverter( AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS , &piXlsxConverter) )
hRes = AVS_ERROR_UNEXPECTED;
}
else
{
if( FALSE == m_oStorageConverters.GetConverter( AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX , &piXlsxConverter) )
hRes = AVS_ERROR_UNEXPECTED;
}
}
if( SUCCEEDED( hRes ) )
{
//
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >* oSubEventDocuments = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >(this);
oSubEventDocuments->AddRef();
oSubEventDocuments->Advise( piXlsxConverter );
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >* oSubEventDocuments2 = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >(this);
oSubEventDocuments2->AddRef();
oSubEventDocuments2->Advise( piXlsxConverter );
BSTR bstrTempFolder = sXlsxPath.AllocSysString();
BSTR bstrFilename = sFilename.AllocSysString();
hRes = piConverter->LoadFromFile( bstrFilename, bstrTempFolder , L"" );
SysFreeString( bstrTempFolder );
SysFreeString( bstrFilename );
//
oSubEventDocuments->UnAdvise( piXlsxConverter );
RELEASEINTERFACE(oSubEventDocuments);
oSubEventDocuments2->UnAdvise( piXlsxConverter );
RELEASEINTERFACE(oSubEventDocuments2);
}
// xlsx -> html -> docx
RELEASEINTERFACE( piConverter );
if( false == m_bCanceled )
{
if( AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML == nNoStandartType )
{
m_dMinProgress = 0.500;
m_dMaxProgress = 1;
}
else
{
m_dMinProgress = 0.333;
m_dMaxProgress = 0.666;
}
OnProgressDocumentEx( 0 , 0, &shCancel );
if( c_shProgressContinue == shCancel && SUCCEEDED( hRes ) )
{
//XLSX -> HTML
CString sHtmlDir = _T("");
CString sHtmlFile = _T("");
if( false == bNoStandartOpen )
{
sHtmlDir = Utils::CreateTempDir( m_sTempDirectory );
if( true == sHtmlDir.IsEmpty() )
hRes == AVS_OFFICEFILE_ERROR_CREATE_TEMP;
sHtmlFile = sHtmlDir + _T("\\Temp.htm");
}
else
sHtmlFile = sNoStandartPath;
if( SUCCEEDED( hRes ) )
{
IAVSOfficeFileTemplate* piConverter = NULL;
if( FALSE == SUCCEEDED (CoCreateInstance( __uuidof( WSHtmlFile::CWSHtmlFile ) , NULL, CLSCTX_INPROC_SERVER, __uuidof(IAVSOfficeFileTemplate), (void **)(&piConverter) ) ) )
hRes = AVS_ERROR_FILEFORMAT;
if( SUCCEEDED( hRes ) )
{
//
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >* oSubEventDocuments = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >(this);
oSubEventDocuments->AddRef();
oSubEventDocuments->Advise( piConverter );
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >* oSubEventDocuments2 = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >(this);
oSubEventDocuments2->AddRef();
oSubEventDocuments2->Advise( piConverter );
BSTR bstrTempFolder = sXlsxPath.AllocSysString();
BSTR bstrFilename = sHtmlFile.AllocSysString();
hRes = piConverter->SaveToFile( bstrFilename, bstrTempFolder , L"<Options><FileType>257</FileType><HTML><SingleFile val = \"true\"/></HTML></Options>" );
SysFreeString( bstrTempFolder );
SysFreeString( bstrFilename );
//
oSubEventDocuments->UnAdvise( piConverter );
RELEASEINTERFACE(oSubEventDocuments);
oSubEventDocuments2->UnAdvise( piConverter );
RELEASEINTERFACE(oSubEventDocuments2);
}
RELEASEINTERFACE( piConverter );
}
if( false == bNoStandartOpen && false == m_bCanceled )
{
m_dMinProgress = 0.666;
m_dMaxProgress = 1;
OnProgressDocumentEx( 0 , 0, &shCancel );
//HTML -> DOCX
if( c_shProgressContinue == shCancel && SUCCEEDED( hRes ) )
{
IAVSOfficeFileTemplate* piConverter = NULL;
if( FALSE == m_oStorageConverters.GetConverter( AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML , &piConverter) )
hRes = AVS_ERROR_FILEFORMAT;
if( SUCCEEDED( hRes ) )
{
//
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >* oSubEventDocuments = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >(this);
oSubEventDocuments->AddRef();
oSubEventDocuments->Advise( piConverter );
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >* oSubEventDocuments2 = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >(this);
oSubEventDocuments2->AddRef();
oSubEventDocuments2->Advise( piConverter );
BSTR bstrTempFolder = m_sTempDirectory.AllocSysString();
BSTR bstrFilename = sHtmlFile.AllocSysString();
hRes = piConverter->LoadFromFile( bstrFilename, bstrTempFolder , L"<Options><FileType>70</FileType></Options>" );
SysFreeString( bstrTempFolder );
SysFreeString( bstrFilename );
//
oSubEventDocuments->UnAdvise( piConverter );
RELEASEINTERFACE(oSubEventDocuments);
oSubEventDocuments2->UnAdvise( piConverter );
RELEASEINTERFACE(oSubEventDocuments2);
}
RELEASEINTERFACE( piConverter );
}
}
m_dMinProgress = 1;
m_dMaxProgress = 1;
OnProgressDocumentEx( 0 , 0, &shCancel );
Utils::RemoveDirOrFile( sHtmlDir );
}
}
Utils::RemoveDirOrFile( sXlsxPath );
}
}
else
{
//
BSTR bstrTempFolder = m_sTempDirectory.AllocSysString();
BSTR bstrFilename = sFilename.AllocSysString();
hRes = piConverter->LoadFromFile( bstrFilename, bstrTempFolder ,bstrXMLOptions );
SysFreeString( bstrTempFolder );
SysFreeString( bstrFilename );
if(SUCCEEDED(hRes))
{
//
if(AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nOpenFileType)
{
OfficeEpub::IOfficeEpubFile* piEpubFile = NULL;
piConverter->QueryInterface( __uuidof(OfficeEpub::IOfficeEpubFile), (void**)&piEpubFile );
if(NULL != piEpubFile)
{
VARIANT vtMetadata;
if(SUCCEEDED(piEpubFile->GetAdditionalParam(_T("Metadata"), &vtMetadata)) && VT_BSTR == vtMetadata.vt)
{
m_sMetadata = CString(vtMetadata.bstrVal);
SysFreeString(vtMetadata.bstrVal);
}
RELEASEINTERFACE(piEpubFile);
}
}
else if(AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2 == nOpenFileType)
{
OfficeFB2::IFB2File* piFb2File = NULL;
piConverter->QueryInterface( __uuidof(OfficeFB2::IFB2File), (void**)&piFb2File );
if(NULL != piFb2File)
{
VARIANT vtMetadata;
if(SUCCEEDED(piFb2File->GetAdditionalParam(_T("Metadata"), &vtMetadata)) && VT_BSTR == vtMetadata.vt)
{
m_sMetadata = CString(vtMetadata.bstrVal);
SysFreeString(vtMetadata.bstrVal);
}
RELEASEINTERFACE(piFb2File);
}
}
else if(AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI == nOpenFileType)
{
EBOOKWriter::IOfficeMobiFile* piMobiFile = NULL;
piConverter->QueryInterface( __uuidof(EBOOKWriter::IOfficeMobiFile), (void**)&piMobiFile );
if(NULL != piMobiFile)
{
VARIANT vtMetadata;
if(SUCCEEDED(piMobiFile->GetAdditionalParam(_T("Metadata"), &vtMetadata)) && VT_BSTR == vtMetadata.vt)
{
m_sMetadata = CString(vtMetadata.bstrVal);
SysFreeString(vtMetadata.bstrVal);
}
RELEASEINTERFACE(piMobiFile);
}
}
}
}
//
oEventDocuments->UnAdvise( piConverter );
RELEASEINTERFACE(oEventDocuments);
oEventDocuments2->UnAdvise( piConverter );
RELEASEINTERFACE(oEventDocuments2);
if( FAILED( hRes ) )
{
m_nStatus = CONVERTER_IDLE;
RELEASEINTERFACE(piConverter);
return hRes;
}
// PPT PPTX
if( AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT == nOpenFileType )
{
AVSOfficePPTFile::IAVSOfficePPTFile* piPptFile = NULL;
piConverter->QueryInterface( __uuidof(AVSOfficePPTFile::IAVSOfficePPTFile), (void**)&piPptFile );
if( NULL != piPptFile )
{
BSTR bstrDrawingXml;
hRes = piPptFile->get_DrawingXml(&bstrDrawingXml);
if( FAILED( hRes ) )
{
m_nStatus = CONVERTER_IDLE;
RELEASEINTERFACE(piConverter);
RELEASEINTERFACE(piPptFile);
return hRes;
}
m_sDrawingXML = CString (bstrDrawingXml);
VARIANT vDecoder;
BSTR bstrAdditionalParamName = g_csBlowfishKeyParamName.AllocSysString();
hRes = piPptFile->GetAdditionalParam( bstrAdditionalParamName, &vDecoder );
SysFreeString( bstrAdditionalParamName );
if( FAILED( hRes ) )
{
m_nStatus = CONVERTER_IDLE;
RELEASEINTERFACE(piConverter);
RELEASEINTERFACE(piPptFile);
return hRes;
}
RELEASEINTERFACE( m_piDecoderKey );
vDecoder.punkVal->QueryInterface( __uuidof( IUnknown ), (void**)&m_piDecoderKey );
RELEASEINTERFACE( vDecoder.punkVal );
}
RELEASEINTERFACE(piPptFile);
}
else if( AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nOpenFileType )
{
AVSOfficePPTXFile::IAVSOfficePPTXFile* piPptxFile = NULL;
piConverter->QueryInterface( __uuidof(AVSOfficePPTXFile::IAVSOfficePPTXFile), (void**)&piPptxFile );
if( NULL != piPptxFile )
{
BSTR bstrDrawingXml;
hRes = piPptxFile->get_DrawingXml(&bstrDrawingXml);
if( FAILED( hRes ) )
{
m_nStatus = CONVERTER_IDLE;
RELEASEINTERFACE(piConverter);
RELEASEINTERFACE(piPptxFile);
return hRes;
}
m_sDrawingXML = CString (bstrDrawingXml);
VARIANT vDecoder;
BSTR bstrAdditionalParamName = g_csBlowfishKeyParamName.AllocSysString();
hRes = piPptxFile->GetAdditionalParam( bstrAdditionalParamName, &vDecoder );
if( FAILED( hRes ) )
{
m_nStatus = CONVERTER_IDLE;
RELEASEINTERFACE(piConverter);
RELEASEINTERFACE(piPptxFile);
return hRes;
}
RELEASEINTERFACE( m_piDecoderKey );
vDecoder.punkVal->QueryInterface( __uuidof( IUnknown ), (void**)&m_piDecoderKey );
RELEASEINTERFACE( vDecoder.punkVal );
}
RELEASEINTERFACE(piPptxFile);
}
else if( AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP == nOpenFileType )
{
AVSOfficeOdpFile::IAVSOfficeODPFile* piOdpFile = NULL;
piConverter->QueryInterface( __uuidof(AVSOfficeOdpFile::IAVSOfficeODPFile), (void**)&piOdpFile );
if( NULL != piOdpFile )
{
BSTR bstrDrawingXml;
hRes = piOdpFile->get_DrawingXml(&bstrDrawingXml);
if( FAILED( hRes ) )
{
m_nStatus = CONVERTER_IDLE;
RELEASEINTERFACE(piConverter);
RELEASEINTERFACE(piOdpFile);
return hRes;
}
m_sDrawingXML = CString (bstrDrawingXml);
VARIANT vDecoder;
BSTR bstrAdditionalParamName = g_csBlowfishKeyParamName.AllocSysString();
hRes = piOdpFile->GetAdditionalParam( bstrAdditionalParamName, &vDecoder );
if( FAILED( hRes ) )
{
m_nStatus = CONVERTER_IDLE;
RELEASEINTERFACE(piConverter);
RELEASEINTERFACE(piOdpFile);
return hRes;
}
RELEASEINTERFACE( m_piDecoderKey );
vDecoder.punkVal->QueryInterface( __uuidof( IUnknown ), (void**)&m_piDecoderKey );
RELEASEINTERFACE( vDecoder.punkVal );
}
RELEASEINTERFACE(piOdpFile);
}
RELEASEINTERFACE(piConverter);
if( FAILED( hRes ) )
{
m_nStatus = CONVERTER_IDLE;
return hRes;
}
m_nFileType = AVS_OFFICESTUDIO_FILE_UNKNOWN;
m_nOpenFileType = nOpenFileType;
m_nStatus = CONVERTER_LOAD_COMP;
return S_OK;
}
STDMETHOD(SaveToFile)( BSTR bstrDstFileName, BSTR bstrSrcPath, BSTR bstrXMLOptions)
{
// gdiplus
if (!m_oGdiPlusInit.IsValid())
{
if (!m_oGdiPlusInit.Init())
return AVS_ERROR_UNEXPECTED;
}
m_bCanceled = false;
m_bSaveRendererStopped = false;
m_nLastProgress = -1;
m_nLastProgressEx = -1;
DWORD dwFileAttr = ::GetFileAttributes( bstrDstFileName );
//if( dwFileAttr != INVALID_FILE_ATTRIBUTES && 0 == (dwFileAttr & FILE_ATTRIBUTE_DIRECTORY ) )
//{
// //
// HANDLE hFile = CreateFile( bstrDstFileName, GENERIC_EXECUTE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// if( INVALID_HANDLE_VALUE == hFile )
// return AVS_ERROR_FILEACCESS;
// RELEASEHANDLE( hFile );
//}
//CTemporaryCS oCS(&m_csThread);
CString sOptions(bstrXMLOptions);
CString sSourceDirectory;
if( "" != CString(bstrSrcPath) )
sSourceDirectory = CString( bstrSrcPath );
else
sSourceDirectory = m_sTempDirectory;
m_nStatus = CONVERTER_SAVE_PROG;
int nDestFormat;
bool bLoadInCommandRenderer = false;
long nDocxRendererMode = -1;
long nEpubRendererMode = -1;
bool bNoStandartSave = false;
int nHtmlRendererMode = -1;
// bstrXMLOptions FileType
bool bFileTypeInOptions = false;
CString sWatermark = _T("");
XmlUtils::CXmlReader oOptionsReader;
if( TRUE == oOptionsReader.OpenFromXmlString( bstrXMLOptions ) )
if( TRUE == oOptionsReader.ReadRootNode( _T("Options") ) )
{
CString sXml = oOptionsReader.ReadNodeXml();
CString sFileType = oOptionsReader.ReadNodeValue( _T("FileType") );
if( _T("") != sFileType )
{
nDestFormat = Strings::ToInteger( sFileType );
bFileTypeInOptions = true;
}
CString sDocxRendererMode = oOptionsReader.ReadNodeValue( _T("DocxRendererMode") );
if( _T("") != sDocxRendererMode )
nDocxRendererMode = Strings::ToInteger( sDocxRendererMode );
CString sEpubRendererMode = oOptionsReader.ReadNodeValue( _T("EpubRendererMode") );
if( _T("") != sEpubRendererMode )
nEpubRendererMode = Strings::ToInteger( sEpubRendererMode );
CString sHtmlRendererMode = oOptionsReader.ReadNodeValue( _T("HtmlRendererMode") );
if( _T("") != sHtmlRendererMode )
nHtmlRendererMode = Strings::ToInteger( sHtmlRendererMode );
XML::IXMLDOMNodePtr pXmlNode = NULL;
oOptionsReader.GetNode( pXmlNode );
XmlUtils::CXmlReader oSubReader;
if( TRUE == oSubReader.OpenFromXmlNode( pXmlNode ) )
if( TRUE == oSubReader.ReadNode( _T("Watermarks") ) )
{
XML::IXMLDOMNodePtr pXmlNode = NULL;
oSubReader.GetNode(pXmlNode);
if(NULL != pXmlNode)
{
IXMLDOMNodeListPtr piChilds = pXmlNode->GetchildNodes();
long nLength = 0;
if(NULL != piChilds && SUCCEEDED(piChilds->get_length(&nLength)) && nLength > 0)
sWatermark = oSubReader.ReadNodeXml();
}
}
XmlUtils::CXmlReader oSubReader2;
if( TRUE == oSubReader2.OpenFromXmlNode( pXmlNode ) )
if( TRUE == oSubReader2.ReadNode( _T("HtmlOptions") ) )
if(_T("0") == oSubReader2.ReadNodeValue(_T("ToolbarEmbed")))
{
nDestFormat = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRMenu;
bFileTypeInOptions = true;
}
if( -1 != sXml.Find( _T("LoadInCommandRenderer") ) )
bLoadInCommandRenderer = true;
if( -1 != sXml.Find( _T("NoStandartSave") ) )
bNoStandartSave = true;
}
AVSOfficeFormatChecker avsOfficeFormatChecker;
if( false == bFileTypeInOptions )
{
if( AVS_OFFICESTUDIO_FILE_UNKNOWN == m_nFileType )
nDestFormat = avsOfficeFormatChecker.GetFileFormat( CString( bstrDstFileName ) );
else
nDestFormat = m_nFileType;
}
// Epub DocxRenderer
if( AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nDestFormat )
{
if( -1 != nEpubRendererMode )
nDocxRendererMode = nEpubRendererMode;
else
nDocxRendererMode = TextFormatting::c_nWordProcessing;
}
//
CString sFileConverterOptions;
sFileConverterOptions.AppendFormat( _T("<Options><FileType>%d</FileType>"), nDestFormat);
XmlUtils::CXmlReader oXmlReader;
if( TRUE == oXmlReader.OpenFromXmlString( sOptions ) )
{
oXmlReader.ReadNodeList( _T("*") );
for( int i = 0; i < oXmlReader.GetLengthList(); i++ )
{
CString sNodeName = oXmlReader.ReadNodeName( i );
if( _T("WaterMarks") != sNodeName )
sFileConverterOptions.Append( oXmlReader.ReadNodeXml( i ) );
}
}
sFileConverterOptions.Append( _T("</Options>") );
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM & nDestFormat || AVS_OFFICESTUDIO_FILE_IMAGE & nDestFormat ||
AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nDestFormat || AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2 == nDestFormat ||
AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI == nDestFormat || ( ( 0 != (AVS_OFFICESTUDIO_FILE_DOCUMENT & nDestFormat) ) && true == bLoadInCommandRenderer ) )
{
long nPageCount = 0;
m_piCommandsRenderer->get_PageCount( &nPageCount );
AVSGraphics::IAVSDocumentRendererPtr piCommandsRenderer = NULL;
bool bRenderDoc = false;
if( nPageCount > 0 )
m_piCommandsRenderer->QueryInterface( __uuidof(AVSGraphics::IAVSDocumentRenderer), (void**)&piCommandsRenderer);
else
{
bRenderDoc = true;
m_dMinProgress = 0;
m_dMaxProgress = 0.500;
CString sTemp = m_sTempDirectory;
m_sTempDirectory = sSourceDirectory;
// Xml
BSTR bstrDrawingXML = NULL;
get_DrawingXml( &bstrDrawingXML );
if( NULL == bstrDrawingXML )
return AVS_OFFICEFILE_ERROR_SAVE_EMPTY;
// Painter
RELEASEINTERFACE( m_piOfficeViewer );
CoCreateInstance( __uuidof(AVSGraphics::CAVSDocumentPainter), NULL ,CLSCTX_INPROC_SERVER, __uuidof(AVSGraphics::IAVSDocumentPainter), (void **)(&m_piOfficeViewer) );
//
VARIANT vDecoder;
vDecoder.vt = VT_UNKNOWN;
vDecoder.punkVal = m_piDecoderKey;
BSTR bstrAdditionalParamName = g_csBlowfishKeyParamName.AllocSysString();
m_piOfficeViewer->SetAdditionalParam( bstrAdditionalParamName, vDecoder);
SysFreeString(bstrAdditionalParamName);
// Xml viewer
m_piOfficeViewer->SetXml( bstrDrawingXML );
SysFreeString( bstrDrawingXML );
m_piCommandsRenderer->QueryInterface( __uuidof(AVSGraphics::IAVSDocumentRenderer), (void**)&piCommandsRenderer);
//
m_piOfficeViewer->AddRenderer( piCommandsRenderer );
//
COfficeEventViewer< AVSGraphics::_IAVSDocumentPainterEvents, CAVSOfficeFileConverter >* poEventViewer = new COfficeEventViewer< AVSGraphics::_IAVSDocumentPainterEvents, CAVSOfficeFileConverter >(this);
poEventViewer->AddRef();
poEventViewer->Advise( m_piOfficeViewer );
//m_poEventViewer->Advise( m_piOfficeViewer );
m_piOfficeViewer->Start();
//
WaitForSingleObject( m_hViewerStop, INFINITE );
//
poEventViewer->UnAdvise( m_piOfficeViewer );
RELEASEINTERFACE(poEventViewer);
m_piOfficeViewer->RemoveRenderer( piCommandsRenderer );
RELEASEINTERFACE( m_piOfficeViewer );
//
if( 0 != m_nRendererError)
return m_nRendererError;
}
// Options
CAtlArray<int> aDocumentPages;
bool bDocumentPages = false;
//
oXmlReader.OpenFromXmlString( sOptions );
if( TRUE == oXmlReader.ReadNode( _T("DocumentPages") ) )
{
oXmlReader.ReadNodeList( _T("Page") );
for( int i = 0; i < oXmlReader.GetLengthList(); i++ )
{
CString sValue = oXmlReader.ReadNodeText(i);
if( _T("") != sValue )
aDocumentPages.Add( Strings::ToInteger(sValue) );
}
if( aDocumentPages.GetCount() > 0 )
{
//
qsort (aDocumentPages.GetData(), aDocumentPages.GetCount(), sizeof(int), compare);
bDocumentPages = true;
}
}
piCommandsRenderer->get_PageCount( &nPageCount );
// HTMLR
if( 0 == nPageCount && AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLR != nDestFormat && AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRMenu != nDestFormat && AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRCanvas != nDestFormat)
return S_OK;
if( aDocumentPages.GetCount() == 0 )
for( int i = 0; i < nPageCount; i++ )
aDocumentPages.Add( i );
//
IAVSOfficeFileTemplate* piConverter = NULL;
EBOOKWriter::IAVSEBOOKWriterPtr piEbookConverter = NULL;
HTMLRenderer::IAVSHTMLRendererPtr piHtmlRenderer = NULL;
HTMLRenderer::IAVSHTMLRenderer2Ptr piHtmlRenderer2 = NULL;
AVSOfficePDFWriter::IPDFRendererPtr piPDFRenderer = NULL;
if(c_nSaveModeNone == m_nSaveMode || 0 != (c_nSaveModeStart & m_nSaveMode))
{
if(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLR == nDestFormat || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRMenu == nDestFormat)
{
if(FAILED(piHtmlRenderer.CreateInstance( __uuidof(HTMLRenderer::CAVSHTMLRenderer))) || NULL == piHtmlRenderer)
return AVS_ERROR_FILEFORMAT;
if(c_nSaveModeNone != m_nSaveMode)
m_piSaveRenderer = piHtmlRenderer;
}
else if(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRCanvas == nDestFormat)
{
if(FAILED(piHtmlRenderer2.CreateInstance( __uuidof(HTMLRenderer::CAVSHTMLRenderer3))) || NULL == piHtmlRenderer2)
return AVS_ERROR_FILEFORMAT;
if(c_nSaveModeNone != m_nSaveMode)
m_piSaveRenderer = piHtmlRenderer2;
}
else if(AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nDestFormat || AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2 == nDestFormat || AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI == nDestFormat)
{
if(FAILED(piEbookConverter.CreateInstance(__uuidof(EBOOKWriter::CAVSEBOOKWriter))) || NULL == piEbookConverter )
return AVS_ERROR_FILEFORMAT;
if(c_nSaveModeNone != m_nSaveMode)
m_piSaveRenderer = piEbookConverter;
}
else if(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nDestFormat)
{
if(FAILED(piPDFRenderer.CreateInstance(__uuidof(AVSOfficePDFWriter::CPDFWriter))) || NULL == piPDFRenderer )
return AVS_ERROR_FILEFORMAT;
if(c_nSaveModeNone != m_nSaveMode)
m_piSaveRenderer = piPDFRenderer;
}
else
{
if( FALSE == m_oStorageConverters.GetConverter( nDestFormat , &piConverter))
return AVS_ERROR_FILEFORMAT;
if(c_nSaveModeNone != m_nSaveMode)
m_piSaveRenderer = piConverter;
}
}
else
{
if(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLR == nDestFormat || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRMenu == nDestFormat)
{
if(NULL != m_piSaveRenderer)
m_piSaveRenderer->QueryInterface(__uuidof(HTMLRenderer::IAVSHTMLRenderer), (void**)&piHtmlRenderer);
if(NULL == piHtmlRenderer)
return AVS_ERROR_FILEFORMAT;
}
else if(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRCanvas == nDestFormat)
{
if(NULL != m_piSaveRenderer)
m_piSaveRenderer->QueryInterface(__uuidof(HTMLRenderer::IAVSHTMLRenderer2), (void**)&piHtmlRenderer2);
if(NULL == piHtmlRenderer2)
return AVS_ERROR_FILEFORMAT;
}
else if(AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nDestFormat || AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2 == nDestFormat || AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI == nDestFormat)
{
if(NULL != m_piSaveRenderer)
m_piSaveRenderer->QueryInterface(__uuidof(EBOOKWriter::IAVSEBOOKWriter), (void**)&piEbookConverter);
if(NULL == piEbookConverter)
return AVS_ERROR_FILEFORMAT;
}
else if(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nDestFormat)
{
if(NULL != m_piSaveRenderer)
m_piSaveRenderer->QueryInterface(__uuidof(AVSOfficePDFWriter::IPDFRenderer), (void**)&piPDFRenderer);
if(NULL == piPDFRenderer)
return AVS_ERROR_FILEFORMAT;
}
else
{
if(NULL != m_piSaveRenderer)
m_piSaveRenderer->QueryInterface(__uuidof(IAVSOfficeFileTemplate), (void**)&piConverter);
if(NULL == piConverter)
return AVS_ERROR_FILEFORMAT;
}
}
AVSGraphics::IAVSEffectPainterPtr piEffectPainter = NULL;
if(_T("") != sWatermark && SUCCEEDED(piEffectPainter.CreateInstance(__uuidof(AVSGraphics::CAVSEffectPainter))) && NULL != piEffectPainter)
{
BSTR bstrWatermark = sWatermark.AllocSysString();
piEffectPainter->SetXml( bstrWatermark );
SysFreeString( bstrWatermark );
}
// CommandRenderer
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nDestFormat )
{
sFileConverterOptions = CheckPdfOutline( sFileConverterOptions, aDocumentPages );
// dpi
VARIANT vtDPI;
vtDPI.vt = VT_R8;
vtDPI.dblVal = 72;
piCommandsRenderer->SetAdditionalParam( _T("DPIX"), vtDPI );
vtDPI.dblVal = 72;
piCommandsRenderer->SetAdditionalParam( _T("DPIY"), vtDPI );
}
else if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF == nDestFormat )
{
FlashStudio::ISWFOfficeFile* piSwfFile = NULL;
piConverter->QueryInterface( __uuidof(FlashStudio::ISWFOfficeFile), (void**)&piSwfFile );
if( NULL != piSwfFile )
{
piSwfFile->put_CommandRenderer( piCommandsRenderer );
if( NULL != piEffectPainter )
{
VARIANT vtEffectPainter;
vtEffectPainter.vt = VT_UNKNOWN;
vtEffectPainter.punkVal = piEffectPainter;
piSwfFile->SetAdditionalParam( L"EffectPainter", vtEffectPainter );
}
}
// dpi
VARIANT vtDPI;
vtDPI.vt = VT_R8;
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIX"), vtDPI );
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIY"), vtDPI );
RELEASEINTERFACE( piSwfFile );
}
else if( AVS_OFFICESTUDIO_FILE_IMAGE & nDestFormat )
{
AVSOfficeImageFile::IOfficeImageFilePtr piImageFile = NULL;
piConverter->QueryInterface( __uuidof(AVSOfficeImageFile::IOfficeImageFile), (void**)&piImageFile );
if( NULL != piImageFile )
{
piImageFile->put_CommandRenderer( piCommandsRenderer );
if( NULL != piEffectPainter )
{
VARIANT vtEffectPainter;
vtEffectPainter.vt = VT_UNKNOWN;
vtEffectPainter.punkVal = piEffectPainter;
piImageFile->SetAdditionalParam( L"EffectPainter", vtEffectPainter );
}
VARIANT vtParam;
vtParam.vt = VT_I4;
vtParam.lVal = m_nSaveMode;
piImageFile->SetAdditionalParam(_T("SaveMode"), vtParam);
}
// dpi
VARIANT vtDPI;
vtDPI.vt = VT_R8;
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIX"), vtDPI );
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIY"), vtDPI );
}
else if( AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nDestFormat || AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2 == nDestFormat || AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI == nDestFormat )
{
if( NULL != piEbookConverter )
{
piEbookConverter->put_CommandRenderer( piCommandsRenderer );
if( NULL != piEffectPainter )
{
VARIANT vtEffectPainter;
vtEffectPainter.vt = VT_UNKNOWN;
vtEffectPainter.punkVal = piEffectPainter;
piEbookConverter->SetAdditionalParam( L"EffectPainter", vtEffectPainter );
}
}
// dpi
VARIANT vtDPI;
vtDPI.vt = VT_R8;
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIX"), vtDPI );
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIY"), vtDPI );
}
else if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLR == nDestFormat || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRMenu == nDestFormat )
{
if( NULL != piHtmlRenderer )
{
if( NULL != piEffectPainter )
{
VARIANT vtEffectPainter;
vtEffectPainter.vt = VT_UNKNOWN;
vtEffectPainter.punkVal = piEffectPainter;
piHtmlRenderer->SetAdditionalParam( L"EffectPainter", vtEffectPainter );
}
}
// dpi
VARIANT vtDPI;
vtDPI.vt = VT_R8;
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIX"), vtDPI );
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIY"), vtDPI );
}
else if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRCanvas == nDestFormat )
{
if( NULL != piHtmlRenderer2 )
{
if( NULL != piEffectPainter )
{
VARIANT vtEffectPainter;
vtEffectPainter.vt = VT_UNKNOWN;
vtEffectPainter.punkVal = piEffectPainter;
piHtmlRenderer2->SetAdditionalParam( L"EffectPainter", vtEffectPainter );
}
}
// dpi
VARIANT vtDPI;
vtDPI.vt = VT_R8;
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIX"), vtDPI );
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIY"), vtDPI );
}
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLR == nDestFormat || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRMenu == nDestFormat )
{
HRESULT hRes = S_OK;
if( NULL != piHtmlRenderer )
{
if(c_nSaveModeNone == m_nSaveMode || 0 != (c_nSaveModeStart & m_nSaveMode))
{
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS == m_nOpenFileType )
{
VARIANT vSourceType;
vSourceType.vt = VT_I4;
vSourceType.lVal = 1;//c_nPDFWriter
piHtmlRenderer->SetAdditionalParam( _T("SourceRendererType"), vSourceType);
}
if( -1 != nHtmlRendererMode )
piHtmlRenderer->put_Mode(nHtmlRendererMode);
else if(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRMenu == nDestFormat)
piHtmlRenderer->put_Mode(12);//
piHtmlRenderer->CreateOfficeFile( bstrDstFileName );
}
long m_nPageCount = 0;
if(bDocumentPages)
m_nPageCount = aDocumentPages.GetCount();
else
piCommandsRenderer->get_PageCount( &m_nPageCount );
for( int i = 0; i < m_nPageCount; i++ )
{
if( bDocumentPages )
{
//
bool bSaveThisPage = false;
for( int j = 0; j < aDocumentPages.GetCount(); j++ )
{
if( i <= aDocumentPages[j] )
{
if( i == aDocumentPages[j] )
bSaveThisPage = true;
break;// , aDocumentPages -
}
}
if( false == bSaveThisPage )
continue;
}
if( true == m_bCanceled )
break;
piHtmlRenderer->NewPage();
piHtmlRenderer->BeginCommand(c_nPageType);
hRes = piCommandsRenderer->DrawPage( i, piHtmlRenderer );
piHtmlRenderer->EndCommand(c_nPageType);
SHORT shCancel = c_shProgressContinue;
OnProgressDocumentEx( 0, long(c_nMaxProgressPercent * ( 1.0 * ( i + 1 ) / m_nPageCount )), &shCancel );
if( FAILED( hRes ) )
m_bCanceled = true;
}
if(m_bCanceled || c_nSaveModeNone == m_nSaveMode || 0 != (c_nSaveModeCommit & m_nSaveMode))
{
m_bSaveRendererStopped = true;
piHtmlRenderer->CloseFile();
}
}
}
else if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_HTMLRCanvas == nDestFormat )
{
HRESULT hRes = S_OK;
if( NULL != piHtmlRenderer2 )
{
if(c_nSaveModeNone == m_nSaveMode || 0 != (c_nSaveModeStart & m_nSaveMode))
{
VARIANT vSourceType;
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS == m_nOpenFileType )
{
vSourceType.vt = VT_I4;
vSourceType.lVal = 1;//c_nPDFWriter
piHtmlRenderer2->SetAdditionalParam( _T("SourceRendererType"), vSourceType);
}
vSourceType.vt = VT_I4;
vSourceType.lVal = m_nOpenFileType;
piHtmlRenderer2->SetAdditionalParam( _T("SourceType"), vSourceType);
if( -1 != nHtmlRendererMode )
piHtmlRenderer2->put_Mode(nHtmlRendererMode);
piHtmlRenderer2->CreateOfficeFile( bstrDstFileName );
}
long m_nPageCount = 0;
if(bDocumentPages)
m_nPageCount = aDocumentPages.GetCount();
else
piCommandsRenderer->get_PageCount( &m_nPageCount );
for( int i = 0; i < m_nPageCount; i++ )
{
if( bDocumentPages )
{
//
bool bSaveThisPage = false;
for( int j = 0; j < aDocumentPages.GetCount(); j++ )
{
if( i <= aDocumentPages[j] )
{
if( i == aDocumentPages[j] )
bSaveThisPage = true;
break;// , aDocumentPages -
}
}
if( false == bSaveThisPage )
continue;
}
if( true == m_bCanceled )
break;
piHtmlRenderer2->NewPage();
piHtmlRenderer2->BeginCommand(c_nPageType);
hRes = piCommandsRenderer->DrawPage( i, piHtmlRenderer2 );
piHtmlRenderer2->EndCommand(c_nPageType);
SHORT shCancel = c_shProgressContinue;
OnProgressDocumentEx( 0, long(c_nMaxProgressPercent * ( 1.0 * ( i + 1 ) / m_nPageCount )), &shCancel );
if( FAILED( hRes ) )
m_bCanceled = true;
}
if(m_bCanceled || c_nSaveModeNone == m_nSaveMode || 0 != (c_nSaveModeCommit & m_nSaveMode))
{
m_bSaveRendererStopped = true;
piHtmlRenderer2->CloseFile();
}
}
}
else if(AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nDestFormat || AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2 == nDestFormat || AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI == nDestFormat)
{
HRESULT hRes = S_OK;
if( NULL != piEbookConverter )
{
if(c_nSaveModeNone == m_nSaveMode || 0 != (c_nSaveModeStart & m_nSaveMode))
{
//
if(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == m_nOpenFileType || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS == m_nOpenFileType)
piEbookConverter->put_SrcFileType(1);
else
piEbookConverter->put_SrcFileType(0);
//
BSTR bstrOptions = sFileConverterOptions.AllocSysString();
piEbookConverter->Initialize(bstrOptions);
SysFreeString(bstrOptions);
//
BSTR bstrMetadata = m_sMetadata.AllocSysString();
piEbookConverter->SetMetadata(bstrMetadata);
SysFreeString(bstrMetadata);
//Output format
long nEBookFiletype = 0;
switch(nDestFormat)
{
case AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB:nEBookFiletype=0;break;
case AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2:nEBookFiletype=1;break;
case AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI:nEBookFiletype=2;break;
}
piEbookConverter->CreateOfficeFile (bstrDstFileName, nEBookFiletype);
}
// CommandsRenderer'
long m_nPageCount = 0;
if(bDocumentPages)
m_nPageCount = aDocumentPages.GetCount();
else
piCommandsRenderer->get_PageCount( &m_nPageCount );
for( int i = 0; i < m_nPageCount; i++ )
{
if( bDocumentPages )
{
//
bool bSaveThisPage = false;
for( int j = 0; j < aDocumentPages.GetCount(); j++ )
{
if( i <= aDocumentPages[j] )
{
if( i == aDocumentPages[j] )
bSaveThisPage = true;
break;// , aDocumentPages -
}
}
if( false == bSaveThisPage )
continue;
}
if( true == m_bCanceled )
break;
piEbookConverter->NewPage();
piEbookConverter->BeginCommand(c_nPageType);
// , ebook
if(0 != (AVS_OFFICESTUDIO_FILE_PRESENTATION & m_nOpenFileType))
{
double dPageWidthMm = 0;
double dPageHeightMm = 0;
piCommandsRenderer->GetPageSize( i, &dPageWidthMm, &dPageHeightMm);
//
MediaCore::IAVSUncompressedVideoFrame* piImage = NULL;
AVSGraphics::IAVSGraphicsRenderer* piGdiplusRenderer = NULL;
UpdateGdiPlusRenderer(dPageWidthMm, dPageHeightMm, &piImage, &piGdiplusRenderer);
//
hRes = m_piCommandsRenderer->DrawPage(i, piGdiplusRenderer);
if (NULL != piEffectPainter)
piEffectPainter->Draw((IUnknown*)piGdiplusRenderer);
RELEASEINTERFACE(piGdiplusRenderer);
hRes = piEbookConverter->DrawImage(piImage, 0, 0, dPageWidthMm, dPageHeightMm);
RELEASEINTERFACE(piImage);
}
else
hRes = piCommandsRenderer->DrawPage( i, piEbookConverter );
piEbookConverter->EndCommand(c_nPageType);
SHORT shCancel = c_shProgressContinue;
OnProgressDocumentEx( 0, long(c_nMaxProgressPercent * ( 1.0 * ( i + 1 ) / m_nPageCount )), &shCancel );
if( FAILED( hRes ) )
m_bCanceled = true;
}
if(m_bCanceled || c_nSaveModeNone == m_nSaveMode || 0 != (c_nSaveModeCommit & m_nSaveMode))
{
m_bSaveRendererStopped = true;
piEbookConverter->CloseFile();
}
}
}
else if(AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nDestFormat)
{
HRESULT hRes = S_OK;
AVSOfficePDFWriter::IPDFWriter * piPDFWriter = NULL;
piPDFRenderer->QueryInterface( __uuidof( AVSOfficePDFWriter::IPDFWriter ), (void**)&piPDFWriter );
if( NULL != piPDFWriter && NULL != piPDFRenderer )
{
if(c_nSaveModeNone == m_nSaveMode || 0 != (c_nSaveModeStart & m_nSaveMode))
piPDFWriter->CreatePDF();
long m_nPageCount = 0;
if(bDocumentPages)
m_nPageCount = aDocumentPages.GetCount();
else
piCommandsRenderer->get_PageCount( &m_nPageCount );
for( int i = 0; i < m_nPageCount; i++ )
{
if( bDocumentPages )
{
//
bool bSaveThisPage = false;
for( int j = 0; j < aDocumentPages.GetCount(); j++ )
{
if( i <= aDocumentPages[j] )
{
if( i == aDocumentPages[j] )
bSaveThisPage = true;
break;// , aDocumentPages -
}
}
if( false == bSaveThisPage )
continue;
}
if( true == m_bCanceled )
break;
piPDFRenderer->NewPage();
piPDFRenderer->BeginCommand(c_nPageType);
//
hRes = m_piCommandsRenderer->DrawPage(i, piPDFRenderer);
if (NULL != piEffectPainter)
piEffectPainter->Draw((IUnknown*)piPDFRenderer);
piPDFRenderer->EndCommand(c_nPageType);
SHORT shCancel = c_shProgressContinue;
OnProgressDocumentEx( 0, long(c_nMaxProgressPercent * ( 1.0 * ( i + 1 ) / m_nPageCount )), &shCancel );
if( FAILED( hRes ) )
m_bCanceled = true;
}
if(m_bCanceled || c_nSaveModeNone == m_nSaveMode || 0 != (c_nSaveModeCommit & m_nSaveMode))
{
m_bSaveRendererStopped = true;
BSTR bstrFileConverterOptions = sFileConverterOptions.AllocSysString();
PdfReadWriterOptions( bstrFileConverterOptions, piPDFWriter );
SysFreeString(bstrFileConverterOptions);
piPDFWriter->SaveToFile( bstrDstFileName );
piPDFWriter->DeletePDF();
}
}
}
else if( 0 != (AVS_OFFICESTUDIO_FILE_DOCUMENT & nDestFormat) && true == bLoadInCommandRenderer )
{
// dpi
VARIANT vtDPI;
vtDPI.vt = VT_R8;
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIX"), vtDPI );
vtDPI.dblVal = 96;
piCommandsRenderer->SetAdditionalParam( _T("DPIY"), vtDPI );
if( AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nDestFormat )
{
if( false == bRenderDoc )
{
m_dMinProgress = 0;
m_dMaxProgress = 1;
}
else
{
m_dMinProgress = 0.500;
m_dMaxProgress = 1;
}
HRESULT hRes = S_OK;
//
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >* oEventDocuments = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >(this);
oEventDocuments->AddRef();
oEventDocuments->Advise( piConverter );
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >* oEventDocuments2 = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >(this);
oEventDocuments2->AddRef();
oEventDocuments2->Advise( piConverter );
// docx
BSTR bstrPath = m_sTempDirectory.AllocSysString();
BSTR bstrOptions = sFileConverterOptions.AllocSysString();
hRes = piConverter->SaveToFile( bstrDstFileName, bstrPath, bstrOptions );
SysFreeString(bstrOptions);
SysFreeString(bstrPath);
//
oEventDocuments->UnAdvise( piConverter );
RELEASEINTERFACE(oEventDocuments);
oEventDocuments2->UnAdvise( piConverter );
RELEASEINTERFACE(oEventDocuments2);
if( FAILED( hRes ) )
return hRes;
}
else
{
DocxRenderer::IAVSDocxRendererPtr piDocxRenderer;
piDocxRenderer.CreateInstance( __uuidof( DocxRenderer::CAVSDocxRenderer ) );
if( NULL != piDocxRenderer )
{
if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS == m_nOpenFileType )
{
VARIANT vSourceType;
vSourceType.vt = VT_I4;
vSourceType.lVal = 1;//c_nPDFWriter
piDocxRenderer->SetAdditionalParam( _T("SourceRendererType"), vSourceType);
}
CString sNewTempFolder = Utils::CreateTempDir( m_sTempDirectory );
if( _T("") != sNewTempFolder )
{
CString sDocxRendererOptions = _T("<DocxRenderer");
sDocxRendererOptions.AppendFormat( _T(" destinationpath=\"%s\""), sNewTempFolder );
if( -1 != nDocxRendererMode )
sDocxRendererOptions.AppendFormat( _T(" textformatting=\"%d\""), nDocxRendererMode );
sDocxRendererOptions.Append( _T("/>") );
//
BSTR bstrDocxRendererOptions = sDocxRendererOptions.AllocSysString();
piDocxRenderer->Initialize( bstrDocxRendererOptions );
SysFreeString( bstrDocxRendererOptions );
if( false == bRenderDoc )
{
m_dMinProgress = 0;
m_dMaxProgress = 0.500;
}
else
{
m_dMinProgress = 0.500;
m_dMaxProgress = 0.750;
}
HRESULT hRes = S_OK;
long m_nPageCount = 0;
if(bDocumentPages)
m_nPageCount = aDocumentPages.GetCount();
else
piCommandsRenderer->get_PageCount( &m_nPageCount );
for( int i = 0; i < m_nPageCount; i++ )
{
if( bDocumentPages )
{
//
bool bSaveThisPage = false;
for( int j = 0; j < aDocumentPages.GetCount(); j++ )
{
if( i <= aDocumentPages[j] )
{
if( i == aDocumentPages[j] )
bSaveThisPage = true;
break;// , aDocumentPages -
}
}
if( false == bSaveThisPage )
continue;
}
if( true == m_bCanceled )
break;
piDocxRenderer->NewPage();
piDocxRenderer->BeginCommand(c_nPageType);
hRes = piCommandsRenderer->DrawPage( i, piDocxRenderer );
piDocxRenderer->EndCommand(c_nPageType);
SHORT shCancel = c_shProgressContinue;
OnProgressDocumentEx( 0, long(c_nMaxProgressPercent * ( 1.0 * ( i + 1 ) / m_nPageCount )), &shCancel );
if( FAILED( hRes ) )
m_bCanceled = true;
}
if( false == m_bCanceled )
{
hRes = piDocxRenderer->Save();
if( FAILED( hRes ) )
m_bCanceled = true;
if( false == bRenderDoc )
{
m_dMinProgress = 0.500;
m_dMaxProgress = 1;
}
else
{
m_dMinProgress = 0.750;
m_dMaxProgress = 1;
}
if( false == m_bCanceled )
{
//
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >* oEventDocuments = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >(this);
oEventDocuments->AddRef();
oEventDocuments->Advise( piConverter );
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >* oEventDocuments2 = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >(this);
oEventDocuments2->AddRef();
oEventDocuments2->Advise( piConverter );
//m_poEventDocuments->Advise( piConverter );
// docx
BSTR bstrPath = sNewTempFolder.AllocSysString();
BSTR bstrOptions = sFileConverterOptions.AllocSysString();
hRes = piConverter->SaveToFile( bstrDstFileName, bstrPath, bstrOptions );
SysFreeString(bstrOptions);
SysFreeString(bstrPath);
//
//m_poEventDocuments->UnAdvise( piConverter );
oEventDocuments->UnAdvise( piConverter );
RELEASEINTERFACE(oEventDocuments);
oEventDocuments2->UnAdvise( piConverter );
RELEASEINTERFACE(oEventDocuments2);
RELEASEINTERFACE(piConverter);
}
}
Utils::RemoveDirOrFile( sNewTempFolder );
if( FAILED( hRes ) )
return hRes;
}
}
}
}
else
{
m_dMinProgress = 0;
m_dMaxProgress = 1;
//
OnProgressDocument(0, 0);
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >* poEventViewer = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >(this);
poEventViewer->AddRef();
poEventViewer->Advise( piConverter );
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >* oEventDocuments2 = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >(this);
oEventDocuments2->AddRef();
oEventDocuments2->Advise( piConverter );
//
BSTR bstrPath = sSourceDirectory.AllocSysString();
BSTR bstrOptions = sFileConverterOptions.AllocSysString();
HRESULT hRes = piConverter->SaveToFile( bstrDstFileName, bstrPath, bstrOptions );
SysFreeString( bstrOptions );
SysFreeString( bstrPath );
//
if(c_nSaveModeNone != m_nSaveMode)
{
AVSOfficeImageFile::IOfficeImageFilePtr piImageFile = NULL;
piConverter->QueryInterface( __uuidof(AVSOfficeImageFile::IOfficeImageFile), (void**)&piImageFile );
if( NULL != piImageFile )
{
VARIANT vtParam;
piImageFile->GetAdditionalParam(_T("SaveRendererStopped"), &vtParam);
if( VT_I4 == vtParam.vt)
{
if(0 != vtParam.lVal)
m_bSaveRendererStopped = true;
}
}
}
//
poEventViewer->UnAdvise( piConverter );
RELEASEINTERFACE(poEventViewer);
oEventDocuments2->UnAdvise( piConverter );
RELEASEINTERFACE(oEventDocuments2);
RELEASEINTERFACE( piConverter );
if( FAILED( hRes ) )
return hRes;
}
}
else
{
m_dMinProgress = 0;
m_dMaxProgress = 1;
//if( false == AVSOfficeFormatChecker::CanConvert( m_nOpenFileType, nDestFormat ) )
// return AVS_OFFICEFILE_ERROR_UNSUPPORTED_LOAD_FORMAT;
if( false == bNoStandartSave )
{
//
if( CString(bstrSrcPath) == "" && "" == sSourceDirectory )
return AVS_OFFICEFILE_ERROR_SAVE_EMPTY;
//
if( ::GetFileAttributes( sSourceDirectory ) == INVALID_FILE_ATTRIBUTES )
return AVS_OFFICEFILE_ERROR_SAVE_EMPTY;
}
//
IAVSOfficeFileTemplate* piConverter = NULL;
if( FALSE == m_oStorageConverters.GetConverter( nDestFormat , &piConverter) )
return AVS_ERROR_FILEFORMAT;
//
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >* oEventDocuments = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents, CAVSOfficeFileConverter >(this);
oEventDocuments->AddRef();
oEventDocuments->Advise( piConverter );
COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >* oEventDocuments2 = new COfficeEventDocuments< _IAVSOfficeFileTemplateEvents2, CAVSOfficeFileConverter >(this);
oEventDocuments2->AddRef();
oEventDocuments2->Advise( piConverter );
//m_poEventDocuments->Advise( piConverter );
// docx
HRESULT hRes = S_OK;
BSTR bstrPath = sSourceDirectory.AllocSysString();
BSTR bstrOptions = sFileConverterOptions.AllocSysString();
hRes = piConverter->SaveToFile( bstrDstFileName, bstrPath, bstrOptions );
SysFreeString(bstrOptions);
SysFreeString(bstrPath);
//
//m_poEventDocuments->UnAdvise( piConverter );
oEventDocuments->UnAdvise( piConverter );
RELEASEINTERFACE(oEventDocuments);
oEventDocuments2->UnAdvise( piConverter );
RELEASEINTERFACE(oEventDocuments2);
RELEASEINTERFACE(piConverter);
if( FAILED( hRes ) )
return hRes;
}
m_nStatus = CONVERTER_SAVE_COMP;
return S_OK;
}
STDMETHOD(get_FileType)(LONG* pnType)
{
//CTemporaryCS oCS(&m_csThread);
if( NULL == pnType )
return S_FALSE;
if( AVS_OFFICESTUDIO_FILE_UNKNOWN != m_nFileType )
(*pnType) = m_nFileType;
else
(*pnType) = m_nOpenFileType;
return S_OK;
}
STDMETHOD(put_FileType)(LONG nType)
{
//CTemporaryCS oCS(&m_csThread);
m_nFileType = nType;
return S_OK;
}
STDMETHOD(get_DrawingXml)( BSTR* pbstrXml )
{
HRESULT hRes = S_OK;
//CTemporaryCS oCS(&m_csThread);
if( NULL == pbstrXml )
return S_FALSE;
if( "" != m_sDrawingXML)
(*pbstrXml) = m_sDrawingXML.AllocSysString();
else
{
// IOfficeFOFile
AVSOfficeFOFile::IOfficeFOFilePtr piFOFile = NULL;
piFOFile.CreateInstance( __uuidof( AVSOfficeFOFile::COfficeFOFile ) );
if( NULL == piFOFile )
return AVS_ERROR_UNEXPECTED;
BSTR bstrFoXml;
BSTR bstrTempDir = m_sTempDirectory.AllocSysString();
hRes = piFOFile->GetFOXml( bstrTempDir, pbstrXml );
SysFreeString( bstrTempDir );
if( SUCCEEDED( hRes ) )
{
//
VARIANT vDecoder;
BSTR bstrAdditionalParamName = g_csBlowfishKeyParamName.AllocSysString();
hRes = piFOFile->GetAdditionalParam( bstrAdditionalParamName, &vDecoder );
SysFreeString( bstrAdditionalParamName );
if( SUCCEEDED( hRes ) )
{
RELEASEINTERFACE( m_piDecoderKey );
vDecoder.punkVal->QueryInterface( __uuidof( IUnknown ), (void**)&m_piDecoderKey );
RELEASEINTERFACE( vDecoder.punkVal );
}
}
}
m_sDrawingXML = _T("");
return hRes;
}
STDMETHOD(get_CommandRenderer)( IUnknown** ppunkRend )
{
//CTemporaryCS oCS(&m_csThread);
if( NULL == ppunkRend )
return S_FALSE;
(*ppunkRend) = NULL;
if( NULL == m_piCommandsRenderer )
return S_OK;
HRESULT hRes = m_piCommandsRenderer->QueryInterface( __uuidof( AVSGraphics::IAVSDocumentRenderer ), (void**)ppunkRend );
return hRes;
}
STDMETHOD(put_CommandRenderer)( IUnknown* ppunkRend )
{
//CTemporaryCS oCS(&m_csThread);
RELEASEINTERFACE(m_piCommandsRenderer);
if( NULL != ppunkRend )
ppunkRend->QueryInterface(__uuidof( AVSGraphics::IAVSDocumentRenderer ), (void**)&m_piCommandsRenderer );
else
CoCreateInstance( __uuidof(AVSGraphics::CAVSDocumentRenderer), NULL ,CLSCTX_INPROC_SERVER, __uuidof(AVSGraphics::IAVSDocumentRenderer), (void **)(&m_piCommandsRenderer) );
return S_OK;
}
STDMETHOD(get_Watermark)( BSTR* pbstrVal )
{
if( NULL == pbstrVal )
return S_FALSE;
(*pbstrVal) = m_sWatermark.AllocSysString();
return S_OK;
}
STDMETHOD(put_Watermark)( BSTR bstrVal )
{
m_sWatermark = CString(bstrVal);
return S_OK;
}
STDMETHOD(DrawWatermark)( IUnknown* punkImage, LONG nWidth, LONG nHeight)
{
return S_OK;
}
STDMETHOD(get_TempDirectory)( BSTR* pbstrDir )
{
//CTemporaryCS oCS(&m_csThread);
if( NULL == pbstrDir )
return S_FALSE;
(*pbstrDir) = m_sTempDirectory.AllocSysString();
return S_OK;
}
STDMETHOD(put_TempDirectory)( BSTR bstrDir )
{
//CTemporaryCS oCS(&m_csThread);
CString sNewTempDir( bstrDir );
if( m_sRootTempDirectory != sNewTempDir && true == m_bIsInternalTemDir )
Clear();
m_sRootTempDirectory = sNewTempDir;
return S_OK;
}
STDMETHOD(get_IsLoadComplete)( VARIANT_BOOL* pvIsLoadComplete )
{
if( NULL == pvIsLoadComplete )
return S_FALSE;
if( m_nStatus < CONVERTER_LOAD_COMP )
(*pvIsLoadComplete) = VARIANT_FALSE;
else
(*pvIsLoadComplete) = VARIANT_TRUE;
return S_OK;
}
STDMETHOD(get_Status)( LONG* pVal)
{
if( NULL == pVal )
return S_FALSE;
(*pVal) = m_nStatus;
return S_OK;
}
STDMETHOD(SetAdditionalParam)(BSTR ParamName, VARIANT ParamValue)
{
CComBSTR ParamStr = ParamName;
ParamStr.ToLower();
if (ParamStr == L"savemode")
{
if( VT_I4 == ParamValue.vt)
m_nSaveMode = ParamValue.lVal;
}
else if (ParamStr == L"saverenderer")
{
if( VT_UNKNOWN == ParamValue.vt && NULL != ParamValue.punkVal)
ParamValue.punkVal->QueryInterface( __uuidof(IUnknown) , (void**)(&m_piSaveRenderer) );
}
return S_OK;
}
STDMETHOD(GetAdditionalParam)(BSTR ParamName, VARIANT* ParamValue)
{
CComBSTR ParamStr = ParamName;
ParamStr.ToLower();
if (ParamStr == L"decoderkey")
{
(*ParamValue).vt = VT_UNKNOWN;
(*ParamValue).punkVal = NULL;
if( NULL != m_piDecoderKey )
m_piDecoderKey->QueryInterface( __uuidof(IUnknown) , (void**)(&(*ParamValue).punkVal) );
}
else if (ParamStr == L"saverenderer")
{
(*ParamValue).vt = VT_UNKNOWN;
(*ParamValue).punkVal = NULL;
if( NULL != m_piSaveRenderer )
m_piSaveRenderer->QueryInterface( __uuidof(IUnknown) , (void**)(&(*ParamValue).punkVal) );
}
else if (ParamStr == L"saverendererstopped")
{
(*ParamValue).vt = VT_I4;
(*ParamValue).lVal = m_bSaveRendererStopped;
}
return S_OK;
}
private: void Clear()
{
m_nStatus = CONVERTER_IDLE;
m_nRendererError = 0;
m_nOpenFileType = AVS_OFFICESTUDIO_FILE_UNKNOWN;
m_sDrawingXML = _T("");
m_sMetadata = _T("");
RELEASEINTERFACE( m_piDecoderKey );
if( true == m_bIsInternalTemDir )
Utils::RemoveDirOrFile( m_sTempDirectory );
m_sTempDirectory = _T("");
m_bIsInternalTemDir = false;
m_bCanceled = false;
m_nLastProgress = -1;
m_nLastProgressEx = -1;
m_nMaxPageLoad = -1;
m_nSaveMode = c_nSaveModeNone;
m_piSaveRenderer = NULL;
m_bSaveRendererStopped = false;
}
private: CString CheckPdfOutline( CString Options, CAtlArray<int>& aPages )
{
CAtlArray<int> aSortedPages;
aSortedPages.Append( aPages );
// ))
for( int i = 0 ; i < aSortedPages.GetCount(); i++ )
for( int j = i ; j < aSortedPages.GetCount(); j++ )
if( aSortedPages[i] > aSortedPages[j] )
{
int nTemp = aSortedPages[i];
aSortedPages[i] = aSortedPages[j];
aSortedPages[j] = nTemp;
}
CString sResult = _T("<Options>");
XmlUtils::CXmlReader oXmlReader;
if( TRUE == oXmlReader.OpenFromXmlString( Options ) )
{
oXmlReader.ReadNodeList( _T("*") );
for( int i = 0; i < oXmlReader.GetLengthList(); i++)
{
CString sNodeName = oXmlReader.ReadNodeName(i);
if( _T("PDFOptions") == sNodeName )
{
sResult.Append( _T("<PDFOptions>") );
XML::IXMLDOMNodePtr oNode;
oXmlReader.GetNode( i , oNode );
XmlUtils::CXmlReader oXmlSubReader;
oXmlSubReader.OpenFromXmlNode( oNode );
oXmlSubReader.ReadNodeList( _T("*") );
for( int i = 0; i < oXmlSubReader.GetLengthList(); i++ )
{
CString sNodeName = oXmlSubReader.ReadNodeName(i);
if( _T("Outline") == sNodeName )
{
sResult.Append( _T("<Outline>") );
XML::IXMLDOMNodePtr oNode;
oXmlSubReader.GetNode( i , oNode );
sResult.Append( RecursiveCheckPdfOutline( oNode, aSortedPages) );
sResult.Append( _T("</Outline>") );
}
else
sResult.Append(oXmlSubReader.ReadNodeXml(i));
}
sResult.Append( _T("</PDFOptions>") );
}
else
sResult.Append( oXmlReader.ReadNodeXml(i) );
}
}
sResult.Append( _T("</Options>") );
return sResult;
}
private: CString RecursiveCheckPdfOutline( XML::IXMLDOMNodePtr oNode, CAtlArray<int>& aPages )
{
CString sResult;
XmlUtils::CXmlReader oXmlReader;
if( TRUE == oXmlReader.OpenFromXmlNode( oNode ) )
{
oXmlReader.ReadNodeList( _T("Chapter") );
for( int i = 0; i < oXmlReader.GetLengthList(); i++ )
{
CString sName = oXmlReader.ReadNodeAttribute(i, _T("name") );
CString sPage = oXmlReader.ReadNodeAttribute(i, _T("page") );
if( _T("") == sPage )
continue;
int nPage = Strings::ToInteger( sPage );
int nExist = -1;
for( int i = 0; i < aPages.GetCount(); i++ )
if( aPages[i] == nPage )
{
nExist = i;
break;
}
if( -1 != nExist )
{
sResult.AppendFormat( _T("<Chapter name=\"%s\" page=\"%d\" >"), Utils::PrepareToXML( sName ), nExist );
XML::IXMLDOMNodePtr oNode;
oXmlReader.GetNode( i , oNode );
sResult.Append( RecursiveCheckPdfOutline( oNode, aPages ) );
sResult.Append( _T("</Chapter>") );
}
}
}
return sResult;
}
private: static int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
private: long GetProgress( long nCurProgress )
{
return (long)(c_nMaxProgressPercent * (m_dMinProgress + ( m_dMaxProgress - m_dMinProgress ) * nCurProgress / c_nMaxProgressPercent));
}
private: long PdfReadWriterOptions(BSTR bsXMLOptions, AVSOfficePDFWriter::IPDFWriter *pWriter)
{
HRESULT hRes = S_OK;
if ( NULL == pWriter )
return S_OK;
//<Options>
// <FileType>513</FileType>
// <PDFOptions>
// <Outline>
// <Chapter name="toPage2" page="1" />
// <Chapter name="toPage3" page="2" />
// <Chapter name="toPage1" page="0" />
// <Chapter name="toPage4" page="3" />
// </Outline>
// <Encryption>
// <OwnerPassword value="Password" />
// <UserPassword value="Password" print="false" modify="false" copy="false" />
// </Encryption>
// </PDFOptions>
//</Options>
CString sXml( bsXMLOptions );
XmlUtils::CXmlNode oOptionsNode;
oOptionsNode.FromXmlString( sXml );
if ( -1 != oOptionsNode.GetName().Find( _T("Options") ) )
{
XmlUtils::CXmlNode oPDFOptionsNode;
oOptionsNode.GetNode( _T("PDFOptions") , oPDFOptionsNode);
if ( -1 != oPDFOptionsNode.GetName().Find( _T("PDFOptions") ) )
{
XmlUtils::CXmlNode oOutlineNode, oEncryptionNode;
if ( oPDFOptionsNode.GetNode( _T("Outline"), oOutlineNode ) )
{
CString sOutline = oOutlineNode.GetXml();
BSTR bsOutline = sOutline.AllocSysString();
if ( FAILED( hRes = pWriter->MakeOutlineFromXml( bsOutline ) ) )
{
::SysFreeString( bsOutline );
return hRes;
}
}
if ( oPDFOptionsNode.GetNode( _T("Encryption"), oEncryptionNode ) )
{
XmlUtils::CXmlNode oUser, oOwner;
CString sOwner, sUser;
long nPermissions = 0;
if ( oEncryptionNode.GetNode( _T("OwnerPassword"), oOwner ) )
{
sOwner = oOwner.GetAttribute( _T("value"), _T("") );
}
if ( oEncryptionNode.GetNode( _T("UserPassword"), oUser ) )
{
sUser = oUser.GetAttribute( _T("value"), _T("") );
CString sPrint = oUser.GetAttribute( _T("print") );
CString sModify = oUser.GetAttribute( _T("modify") );
CString sCopy = oUser.GetAttribute( _T("copy") );
// 3
if ( -1 == sPrint.Find( _T("0") ) )
nPermissions += 4;
// 4
if ( -1 == sModify.Find( _T("0") ) )
nPermissions += 8;
// 5
if ( -1 == sCopy.Find( _T("0") ) )
nPermissions += 16;
}
BSTR bsOwner = sOwner.AllocSysString();
BSTR bsUser = sUser.AllocSysString();
if ( FAILED( hRes = pWriter->SetPDFPassword( bsOwner, bsUser ) ) )
{
::SysFreeString( bsOwner );
::SysFreeString( bsUser );
return hRes;
}
::SysFreeString( bsOwner );
::SysFreeString( bsUser );
if ( FAILED( hRes = pWriter->SetPDFPermission( nPermissions ) ) )
return hRes;
}
}
}
return S_OK;
}
private: void UpdateGdiPlusRenderer(double dWidthMm, double dHeightMm, MediaCore::IAVSUncompressedVideoFrame** piImage, AVSGraphics::IAVSGraphicsRenderer** piRend)
{
(*piImage) = NULL;
(*piRend) = NULL;
CoCreateInstance(__uuidof( MediaCore::CAVSUncompressedVideoFrame), NULL ,CLSCTX_INPROC_SERVER, __uuidof(MediaCore::IAVSUncompressedVideoFrame), (void **)piImage);
// dpi
int nLOGPIXELSX = 96;
int nLOGPIXELSY = 96;
//
long nWidthPix = (long)(nLOGPIXELSX * dWidthMm / (10 * ONE_INCH));
long nHeightPix = (long)(nLOGPIXELSY * dWidthMm * dHeightMm / (10 * dWidthMm * ONE_INCH));
(*piImage)->Width = nWidthPix;
(*piImage)->Height = nHeightPix;
(*piImage)->put_Stride(0, nWidthPix * 4);
(*piImage)->AspectRatioX = nWidthPix;
(*piImage)->AspectRatioY = nHeightPix;
(*piImage)->DataSize = 4 * nWidthPix * nHeightPix;
(*piImage)->ColorSpace = 64 + (1 << 31);
(*piImage)->AllocateBuffer(-1);
memset((*piImage)->Buffer, 255, (*piImage)->BufferSize);
CoCreateInstance(__uuidof( AVSGraphics::CAVSGraphicsRenderer), NULL ,CLSCTX_INPROC_SERVER, __uuidof(AVSGraphics::IAVSGraphicsRenderer), (void **)piRend);
// FontManager
VARIANT vtVariant;
vtVariant.vt = VT_UNKNOWN;
vtVariant.punkVal = NULL;
(*piRend)->SetAdditionalParam( L"FontManager", vtVariant );
(*piRend)->put_Width(dWidthMm);
(*piRend)->put_Height(dHeightMm);
(*piRend)->CreateFromMediaData(*piImage, 0, 0, nWidthPix, nHeightPix );
}
};
#pragma once
#include "OfficeEventsTemplate.h"
template <class T, class Reciever>
class COfficeEventDocuments : public COfficeEventTemplate<T,Reciever>
{
public:
COfficeEventDocuments(Reciever *pReciever):COfficeEventTemplate(pReciever)
{
m_cnt = 0;
m_dwAdvise = 0;
};
HRESULT OnProgress( LONG nID, LONG nPercent)
{
m_pReciever->OnProgressDocument( nID, nPercent );
return S_OK;
}
HRESULT OnProgressEx( LONG nID, LONG nPercent, SHORT* Cancel)
{
m_pReciever->OnProgressDocumentEx( nID, nPercent, Cancel );
return S_OK;
}
STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
//CTemporaryCS oCS(&m_csThread);
HRESULT hr;
VARIANTARG varg0;
VARIANTARG varg1;
VARIANTARG varg2;
switch(dispIdMember) {
case 1:
VariantInit(&varg0);
VariantInit(&varg1);
hr = DispGetParam(pDispParams,0,VT_I4,&varg0,puArgErr);
hr = DispGetParam(pDispParams,1,VT_I4,&varg1,puArgErr);
OnProgress( varg0.lVal, varg1.lVal );
return(S_OK);
break;
case 2:
VariantInit(&varg0);
VariantInit(&varg1);
VariantInit(&varg2);
hr = DispGetParam(pDispParams,0,VT_I4,&varg0,puArgErr);
hr = DispGetParam(pDispParams,1,VT_I4,&varg1,puArgErr);
hr = DispGetParam(pDispParams,2,VT_I2,&varg2,puArgErr);
OnProgressEx( varg0.lVal, varg1.lVal, &varg2.iVal );
if (pDispParams->rgvarg[0].vt & VT_BYREF) // implemented now for last VT_I2 arg only
{
SHORT* p = (SHORT*)pDispParams->rgvarg[0].byref;
if (p) *p = varg2.iVal;
}
return(S_OK);
break;
default:
return(E_NOTIMPL);
}
}
};
template <class T, class Reciever>
class COfficeEventViewer : public COfficeEventTemplate<T,Reciever>
{
public:
COfficeEventViewer(Reciever *pReciever):COfficeEventTemplate(pReciever)
{
m_cnt = 0;
m_dwAdvise = 0;
};
HRESULT OnError(LONG lError)//[id(0)]
{
m_pReciever->OnErrorViewer( lError );
return S_OK;
}
HRESULT OnStop()//[id(1)]
{
m_pReciever->OnStopViewer();
return S_OK;
}
HRESULT OnProgress(LONG lProgressPage)//[id(5)]
{
m_pReciever->OnProgressViewer( lProgressPage );
return S_OK;
}
HRESULT OnProgressParce(LONG lType, LONG lProgress)//[id(6)]
{
m_pReciever->OnProgressParse( lType, lProgress );
return S_OK;
}
HRESULT OnNewPage(double dWidthMm, double dHeightMm)//[id(10)]
{
m_pReciever->OnNewPageViewer(dWidthMm, dHeightMm);
return S_OK;
}
HRESULT OnCompletePage() //[id(11)]
{
m_pReciever->OnCompletePageViewer();
return S_OK;
}
STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
//CTemporaryCS oCS(&m_csThread);
HRESULT hr;
VARIANTARG varg0;
VARIANTARG varg1;
switch(dispIdMember) {
case 0:
VariantInit(&varg0);
hr = DispGetParam(pDispParams,0,VT_I4,&varg0,puArgErr);
OnError( varg0.lVal);
return(S_OK);
break;
case 1:
OnStop( );
return(S_OK);
break;
case 5:
VariantInit(&varg0);
hr = DispGetParam(pDispParams,0,VT_I4,&varg0,puArgErr);
OnProgress( varg0.lVal );
return(S_OK);
break;
case 6:
VariantInit(&varg0);
VariantInit(&varg1);
hr = DispGetParam(pDispParams,0,VT_R8,&varg0,puArgErr);
hr = DispGetParam(pDispParams,1,VT_R8,&varg1,puArgErr);
OnProgressParce( varg0.lVal, varg1.lVal );
return(S_OK);
break;
case 10:
VariantInit(&varg0);
VariantInit(&varg1);
hr = DispGetParam(pDispParams,0,VT_R8,&varg0,puArgErr);
hr = DispGetParam(pDispParams,1,VT_R8,&varg1,puArgErr);
OnNewPage( varg0.dblVal, varg1.dblVal );
return(S_OK);
break;
case 11:
OnCompletePage();
return(S_OK);
break;
default:
return(E_NOTIMPL);
}
}
};
template <class T, class Reciever>
class COfficeFileConvEvents : public COfficeEventTemplate<T,Reciever>
{
public:
COfficeFileConvEvents(Reciever *pReciever):COfficeEventTemplate(pReciever)
{
m_cnt = 0;
m_dwAdvise = 0;
};
HRESULT OnProgressEx( LONG nID, LONG nPercent, SHORT* Cancel)
{
m_pReciever->OnProgressDocumentEx( nID, nPercent, Cancel );
return S_OK;
}
HRESULT OnProgress( LONG nID, LONG nPercent)
{
m_pReciever->OnProgressDocument( nID, nPercent );
return S_OK;
}
HRESULT OnCompletePage()
{
m_pReciever->OnCompletePageDocument();
return S_OK;
}
STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
//CTemporaryCS oCS(&m_csThread);
HRESULT hr;
VARIANTARG varg0;
VARIANTARG varg1;
VARIANTARG varg2;
switch(dispIdMember) {
case 1:
VariantInit(&varg0);
VariantInit(&varg1);
hr = DispGetParam(pDispParams,0,VT_I4,&varg0,puArgErr);
hr = DispGetParam(pDispParams,1,VT_I4,&varg1,puArgErr);
OnProgress( varg0.lVal, varg1.lVal );
return(S_OK);
break;
case 2:
VariantInit(&varg0);
VariantInit(&varg1);
VariantInit(&varg2);
hr = DispGetParam(pDispParams,0,VT_I4,&varg0,puArgErr);
hr = DispGetParam(pDispParams,1,VT_I4,&varg1,puArgErr);
hr = DispGetParam(pDispParams,2,VT_I2,&varg2,puArgErr);
OnProgressEx( varg0.lVal, varg1.lVal, &varg2.iVal );
if (pDispParams->rgvarg[0].vt & VT_BYREF) // implemented now for last VT_I2 arg only
{
SHORT* p = (SHORT*)pDispParams->rgvarg[0].byref;
if (p) *p = varg2.iVal;
}
return(S_OK);
break;
case 10:
OnCompletePage();
return(S_OK);
break;
default:
return(E_NOTIMPL);
}
}
};
template <class T, class Reciever>
class CCommandRendererEvents : public COfficeEventTemplate<T,Reciever>
{
public:
CCommandRendererEvents(Reciever *pReciever):COfficeEventTemplate(pReciever)
{
m_cnt = 0;
m_dwAdvise = 0;
};
HRESULT OnCompletePageDocument()
{
m_pReciever->OnCompletePageDocument();
return S_OK;
}
STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
//CTemporaryCS oCS(&m_csThread);
switch(dispIdMember) {
case 100:
return(S_OK);
break;
case 101:
OnCompletePageDocument();
return(S_OK);
break;
default:
return(E_NOTIMPL);
}
}
};
\ No newline at end of file
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by AVSOfficeFile.rc
//
#define IDS_PROJNAME 100
#define IDR_AVSOFFICEFILE 101
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 201
#define _APS_NEXT_COMMAND_VALUE 32768
#define _APS_NEXT_CONTROL_VALUE 201
#define _APS_NEXT_SYMED_VALUE 102
#endif
#endif
#pragma once
#include "stdafx.h"
#include "../Common/OfficeFileTemplate.h"
class StorageConverters
{
//----------------------------- Public Members --------------------------------
//----------------------------- Public Methods --------------------------------
public: BOOL GetConverter( int nFormat , IAVSOfficeFileTemplate** ppiOutConverter)
{
if( AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC == nFormat )
return GetInterface( __uuidof(AVSOfficeDocFile::COfficeDocFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormat )
return GetInterface( __uuidof(AVSOfficeDocxFile::COfficeDocxFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML == nFormat || AVS_OFFICESTUDIO_FILE_DOCUMENT_MHT == nFormat )
return GetInterface( __uuidof(AVSOfficeHtmlFile::CHtmlFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT == nFormat )
return GetInterface( __uuidof(AVSOfficeOdtFile::COdtFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF == nFormat )
return GetInterface( __uuidof(AVSOfficeRtfFile::CRtfFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT == nFormat )
return GetInterface( __uuidof(AVSOfficeTxtFile::CTxtFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_IMAGE & nFormat )
return GetInterface( __uuidof(AVSOfficeImageFile::COfficeImageFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormat )
return GetInterface( __uuidof(AVSOfficePDFFile::CPDFFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS == nFormat )
return GetInterface( __uuidof(AVSOfficeXlsFile::CXlsFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX == nFormat )
return GetInterface( __uuidof(AVSOfficeDocxFile::COfficeDocxFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_PRESENTATION_PPT == nFormat )
return GetInterface( __uuidof(AVSOfficePPTFile::CAVSOfficePPTFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormat )
return GetInterface( __uuidof(AVSOfficePPTXFile::CAVSOfficePPTXFile),ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP == nFormat )
return GetInterface( __uuidof(AVSOfficeOdpFile::CAVSOfficeODPFile ), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_DOCUMENT_EPUB == nFormat )
return GetInterface( __uuidof(OfficeEpub::COfficeEpubFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF == nFormat )
return GetInterface( __uuidof(FlashStudio::CSWFOfficeFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2 == nFormat )
return GetInterface( __uuidof(OfficeFB2::CFB2File), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_DJVU == nFormat )
return GetInterface( __uuidof(OfficeDjVu::CDjVuFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_XPS == nFormat )
return GetInterface( __uuidof(OfficeXPS::CXPSFile), ppiOutConverter );
else if( AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI == nFormat )
return GetInterface( __uuidof(EBOOKWriter::COfficeMobiFile), ppiOutConverter );
return FALSE;
}
public: BOOL GetConverter( CString sFilename , IAVSOfficeFileTemplate** ppiOutConverter)
{
AVSOfficeFormatChecker avsOfficeFormatChecker;
int nType = avsOfficeFormatChecker.GetFileFormat( sFilename );
return GetConverter( nType, ppiOutConverter );
}
//----------------------------- Private Methods --------------------------------
private: BOOL GetInterface(REFCLSID rclsid, IAVSOfficeFileTemplate** ppiOutConverter)
{
if( NULL == *ppiOutConverter )
{
bool bRews = SUCCEEDED (CoCreateInstance(rclsid, NULL, CLSCTX_INPROC_SERVER, __uuidof(IAVSOfficeFileTemplate), (void **)(ppiOutConverter) ) );
if( false == bRews )
return FALSE;
}
return TRUE;
}
};
\ No newline at end of file
Binary files a/AVSOfficeFile/Watermark.h and /dev/null differ
// stdafx.cpp : source file that includes just the standard includes
// AVSOfficeFile.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently
#pragma once
#ifndef STRICT
#define STRICT
#endif
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows XP or later.
#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later.
#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
#endif
#define _CRT_SECURE_NO_DEPRECATE
#define _ATL_APARTMENT_THREADED
#define _ATL_NO_AUTOMATIC_NAMESPACE
#define USE_ATL_CSTRING
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
#pragma warning(disable: 4244 4267 4683)
#include <atlbase.h>
#include <atlcom.h>
#include <atlwin.h>
#include <atltypes.h>
#include <atlctl.h>
#include <atlhost.h>
#include "atldefine.h"
using namespace ATL;
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
#import "../../../Redist/AVSOfficeStudio/AVSOfficeDocFile.dll" rename_namespace("AVSOfficeDocFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeDocxFile.dll" rename_namespace("AVSOfficeDocxFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeHtmlFile.dll" rename_namespace("AVSOfficeHtmlFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeOdtFile.dll" rename_namespace("AVSOfficeOdtFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeRtfFile.dll" rename_namespace("AVSOfficeRtfFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeTxtFile.dll" rename_namespace("AVSOfficeTxtFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeImageFile.dll" rename_namespace("AVSOfficeImageFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficePDFFile.dll" rename_namespace("AVSOfficePDFFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeXlsFile.dll" rename_namespace("AVSOfficeXlsFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeEpubFile.dll" rename_namespace("OfficeEpub"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeDjVuFile.dll" rename_namespace("OfficeDjVu"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeFB2File.dll" rename_namespace("OfficeFB2"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSSWFRenderer.dll" rename_namespace("FlashStudio"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeWSHtmlFile.dll" rename_namespace("WSHtmlFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeDocxRenderer.dll" rename_namespace("DocxRenderer"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSHTMLRenderer.dll" rename_namespace("HTMLRenderer"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeXPSFile.dll" rename_namespace("OfficeXPS"), raw_interfaces_only
#import "../../../Redist/AVSGraphics.dll" rename_namespace("AVSGraphics"), raw_interfaces_only
//#import "../../../Redist/AVSOfficeStudio/AVSOfficeEditor.dll" rename_namespace("AVSOfficeEditor"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficePPTXFile.dll" rename_namespace("AVSOfficePPTXFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficePDFWriter.dll" rename_namespace("AVSOfficePDFWriter"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeFOFile.dll" rename_namespace("AVSOfficeFOFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficePPTFile.dll" rename_namespace("AVSOfficePPTFile"), raw_interfaces_only
#import "../../../Redist/AVSOfficeStudio/AVSOfficeOdpFile.dll" rename_namespace("AVSOfficeOdpFile"), raw_interfaces_only
#import "../../../Redist/AVSMediaCore3.dll" named_guids rename_namespace("MediaCore"), exclude("tagRECT")
#import "../../../Redist/AVSMediaFormatSettings3.dll" named_guids rename_namespace("MediaFormat"), exclude("tagRECT")
#import "../../../Redist/AVSImageStudio3.dll" rename_namespace("ImageStudio")
#import "../../../Redist/AVSOfficeStudio/AVSEBOOKWriter.dll" rename_namespace("EBOOKWriter"), raw_interfaces_only
#define _USE_MATH_DEFINES
#pragma once
//1
//0
//0
//110
#define INTVER 1,0,0,110
#define STRVER "1,0,0,110\0"
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment