mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 03:42:47 +08:00
246 lines
5.9 KiB
C++
246 lines
5.9 KiB
C++
// FontManager.h : Declaration of the CFontManager
|
|
|
|
#pragma once
|
|
|
|
#include "..\Interfaces\IASCWinFonts.h"
|
|
#include "Font\WinFont.h"
|
|
#include "Font\WinFontStorage.h"
|
|
|
|
#include "..\Interfaces\BaseThread.h"
|
|
#include "../../../Common/OfficeDrawing/File.h"
|
|
|
|
#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
|
|
|
|
// CASCWinFonts
|
|
|
|
[
|
|
coclass,
|
|
default(IASCWinFonts),
|
|
threading(apartment),
|
|
vi_progid("AVSOfficeWinFonts.WinFonts"),
|
|
progid("AVSOfficeWinFonts.WinFonts.1"),
|
|
version(1.0),
|
|
uuid("051DCF8B-2932-4f04-A50F-5BDDC1DF3384"),
|
|
helpstring("WinFonts Class")
|
|
]
|
|
class ATL_NO_VTABLE CASCWinFonts : public IASCWinFonts
|
|
{
|
|
|
|
private:
|
|
|
|
WinFontsStatusStorage m_oSS;
|
|
|
|
CWinFontsInfoStorage *m_pInfoStorage;
|
|
CWinFontsStatusStorage *m_pStatusStorage;
|
|
|
|
CString m_strInputFontDirectory;
|
|
CString m_strDumpFontSelectionFile; // "debug" teamlab server fonts
|
|
|
|
public:
|
|
CASCWinFonts()
|
|
{
|
|
m_strDumpFontSelectionFile = _T("");
|
|
m_strInputFontDirectory = _T("");
|
|
}
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
HRESULT FinalConstruct()
|
|
{
|
|
m_pStatusStorage = NULL;
|
|
m_pInfoStorage = NULL;
|
|
|
|
|
|
m_pStatusStorage = new CWinFontsStatusStorage( STATUS_STORAGE_NAME );
|
|
do
|
|
{
|
|
bool bGetMaster = false;
|
|
m_pStatusStorage->GetStatus( &bGetMaster, &m_oSS );
|
|
|
|
if ( STIF_BROKEN == m_oSS.m_sStatus || STIF_ERROR == m_oSS.m_sStatus )
|
|
{
|
|
m_oSS.m_sStatus = STIF_CREATING;
|
|
m_pStatusStorage->WriteStruct( &m_oSS );
|
|
|
|
//FT_Library pLibrary = NULL;
|
|
//CString sXml;
|
|
|
|
//if( !FT_Init_FreeType( &pLibrary ) )
|
|
//{
|
|
// sXml = CWinFontList::GetWinFontsXml( pLibrary );
|
|
// FT_Done_FreeType( pLibrary );
|
|
//}
|
|
|
|
//m_oSS.m_sStatus = STIF_AVAILABLE;
|
|
//WinFontsInfoStorage oInfo;
|
|
//BSTR bsXml = sXml.AllocSysString();
|
|
//oInfo.GenerateInfo( bsXml );
|
|
//LONG64 lLen = oInfo.GetLength();
|
|
|
|
//oInfo.m_lCount = 1;
|
|
//m_oSS.m_lLength = lLen;
|
|
|
|
FT_Library pLibrary = NULL;
|
|
BYTE* pData;
|
|
LONG lLen2;
|
|
|
|
|
|
if( !FT_Init_FreeType( &pLibrary ) )
|
|
{
|
|
if (_T("") == m_strInputFontDirectory)
|
|
{
|
|
pData = CWinFontList::GetWinFontsData( pLibrary, lLen2 );
|
|
}
|
|
else
|
|
{
|
|
CWinFontList oList(pLibrary, m_strInputFontDirectory);
|
|
oList.ToBuffer(&pData, & lLen2);
|
|
}
|
|
FT_Done_FreeType( pLibrary );
|
|
}
|
|
|
|
m_oSS.m_sStatus = STIF_AVAILABLE;
|
|
WinFontsInfoStorage oInfo;
|
|
oInfo.GenerateInfo( pData, lLen2 );
|
|
|
|
if (_T("") != m_strDumpFontSelectionFile)
|
|
{
|
|
CFile oFile;
|
|
if (S_OK == oFile.CreateFile(m_strDumpFontSelectionFile))
|
|
{
|
|
oFile.WriteFile((BYTE*)pData, (DWORD)lLen2);
|
|
oFile.CloseFile();
|
|
}
|
|
}
|
|
|
|
LONG64 lLen = lLen2;
|
|
|
|
oInfo.m_lCount = 1;
|
|
m_oSS.m_lLength = lLen;
|
|
|
|
|
|
RELEASEOBJECT(m_pInfoStorage);
|
|
m_pInfoStorage = new CWinFontsInfoStorage( STATUS_STORAGE_NAME, lLen );
|
|
|
|
m_pInfoStorage->WriteStruct( &oInfo );
|
|
m_pStatusStorage->WriteStruct( &m_oSS );
|
|
|
|
RELEASEARRAYOBJECTS(pData);
|
|
}
|
|
else if ( STIF_CREATING == m_oSS.m_sStatus )
|
|
{
|
|
Sleep ( 100 );
|
|
}
|
|
else if ( STIF_AVAILABLE == m_oSS.m_sStatus )
|
|
{
|
|
RELEASEOBJECT(m_pInfoStorage);
|
|
m_pInfoStorage = new CWinFontsInfoStorage( STATUS_STORAGE_NAME, m_oSS.m_lLength );
|
|
|
|
WinFontsInfoStorage oInfo;
|
|
m_pInfoStorage->ReadStruct( &oInfo );
|
|
}
|
|
}
|
|
while ( STIF_CREATING == m_oSS.m_sStatus );
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
void FinalRelease()
|
|
{
|
|
RELEASEOBJECT(m_pStatusStorage);
|
|
RELEASEOBJECT(m_pInfoStorage);
|
|
}
|
|
|
|
void ReInit()
|
|
{
|
|
FT_Library pLibrary = NULL;
|
|
BYTE* pData;
|
|
LONG lLen2;
|
|
|
|
if( !FT_Init_FreeType( &pLibrary ) )
|
|
{
|
|
if (_T("") == m_strInputFontDirectory)
|
|
{
|
|
pData = CWinFontList::GetWinFontsData( pLibrary, lLen2 );
|
|
}
|
|
else
|
|
{
|
|
CWinFontList oList(pLibrary, m_strInputFontDirectory);
|
|
oList.ToBuffer(&pData, &lLen2, m_strInputFontDirectory);
|
|
}
|
|
FT_Done_FreeType( pLibrary );
|
|
}
|
|
|
|
if (_T("") != m_strDumpFontSelectionFile)
|
|
{
|
|
CFile oFile;
|
|
if (S_OK == oFile.CreateFile(m_strDumpFontSelectionFile))
|
|
{
|
|
oFile.WriteFile((BYTE*)pData, (DWORD)lLen2);
|
|
oFile.CloseFile();
|
|
}
|
|
}
|
|
}
|
|
|
|
private:
|
|
|
|
public:
|
|
|
|
//----- IASCGraphicsBase ----------------------------------------------------------------------------
|
|
STDMETHOD(SetAdditionalParam)(BSTR ParamName, VARIANT ParamValue)
|
|
{
|
|
CString sParamName = ParamName;
|
|
if ( _T("DumpBinaryPath") == sParamName && VT_BSTR == ParamValue.vt )
|
|
{
|
|
m_strDumpFontSelectionFile = (CString)ParamValue.bstrVal;
|
|
ReInit();
|
|
}
|
|
if ( _T("InputFontsPath") == sParamName && VT_BSTR == ParamValue.vt )
|
|
{
|
|
m_strInputFontDirectory = (CString)ParamValue.bstrVal;
|
|
}
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetAdditionalParam)(BSTR ParamName, VARIANT* ParamValue)
|
|
{
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(CreateDublicate)(IASCGraphicsBase** ppGraphicsBase)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
};
|
|
|
|
class CThreadFonts : public CBaseThread
|
|
{
|
|
private:
|
|
IASCWinFonts* m_pFonts;
|
|
|
|
public:
|
|
CThreadFonts() : CBaseThread(0)
|
|
{
|
|
m_pFonts = NULL;
|
|
StartWork(THREAD_PRIORITY_NORMAL);
|
|
}
|
|
~CThreadFonts()
|
|
{
|
|
StopWork();
|
|
RELEASEINTERFACE(m_pFonts);
|
|
}
|
|
|
|
protected:
|
|
virtual DWORD ThreadProc()
|
|
{
|
|
CoInitialize(NULL);
|
|
CoCreateInstance(__uuidof(CASCWinFonts), NULL, CLSCTX_INPROC, __uuidof(IASCWinFonts), (void**)&m_pFonts);
|
|
CoUninitialize();
|
|
|
|
m_bRunThread = FALSE;
|
|
return 0;
|
|
}
|
|
};
|
|
|