mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 05:24:10 +08:00
324 lines
8.4 KiB
C++
324 lines
8.4 KiB
C++
// AVSXMLImageConverter.cpp : Implementation of CAVSXMLImageConverter
|
|
|
|
#include "stdafx.h"
|
|
#include "atldefine.h"
|
|
#include "ImageConverter.h"
|
|
#include "ImageConverterDefines.h"
|
|
|
|
|
|
STDMETHODIMP CAVSXMLImageConverter::Start(BSTR bstrXMLString)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
|
|
#ifdef _DEBUG // ñîõðàíÿåì âõîäíóþ XML â ôàéë C:\AVSImageConverterXML.xml
|
|
XmlUtils::CXmlWriter oWriter;
|
|
oWriter.SetXmlString(CString(bstrXMLString));
|
|
oWriter.SaveToFile(_T("C:\\AVSImageConverterXML.xml"), TRUE);
|
|
#endif
|
|
|
|
//ïðè ïîâòîðíîì âûçîâå ïîëíîñòüþ îñòàíàâëèâàåì ïðåäûäóùèé âûçîâ
|
|
if( IMAGECONVERTER_STATE_IDLE != m_oConvertManager.GetStatus() )
|
|
Stop();
|
|
|
|
//åñëè íå çàäàíî êîëè÷åñòâî ïîòîêîâ âûñòàâëÿåì ïî êîëè÷åñòâó ïðîöåññîðîâ
|
|
if( m_oConvertManager.GetTreadCount() <= 0 )
|
|
SetThreadType(-1);
|
|
|
|
m_oCurError.Clear();
|
|
//ïàðñèì xml
|
|
XmlUtils::CXmlReader oReader;
|
|
if( TRUE == oReader.OpenFromXmlString( CString(bstrXMLString) ))
|
|
if( TRUE == oReader.ReadRootNode( CString(L"ImageConverter") ))
|
|
if( TRUE == oReader.ReadNodeList( CString(L"Image") ) )
|
|
{
|
|
//îáíóëÿåì êîíâåðòåðû
|
|
m_oConvertManager.Clear();
|
|
m_oConvertManager.SetLogo(m_piLogoImage);
|
|
m_oConvertManager.SetLogoParam(m_nLogoParam);
|
|
m_oConvertManager.SetWM( m_bAddWM );
|
|
m_oConvertManager.SetCache( m_piFilesCache );
|
|
//äîáàâëÿåì êîíâåðòåðàì çàäà÷è
|
|
if( 0 != m_oConvertManager.AddTasks( oReader ) )
|
|
{
|
|
OnError( IMAGECONVERTER_ERROR_XML_FORMAT );
|
|
return S_FALSE;
|
|
}
|
|
if( 1 == m_oConvertManager.Start() )
|
|
OnComplete();
|
|
return S_OK;
|
|
}
|
|
return S_FALSE;
|
|
}
|
|
STDMETHODIMP CAVSXMLImageConverter::_OnTimer(void)
|
|
{
|
|
if( true == m_oConvertManager.IsSomeChange() )
|
|
{
|
|
//ïîëó÷àåì èçìåíåíèÿ
|
|
m_oConvertManager.Lock();
|
|
LONG nNewProcess = m_oConvertManager.GetProcess();
|
|
CAtlArray<LONG> aErrors;
|
|
m_oConvertManager.GetErrors( aErrors );
|
|
CAtlArray<CErrorItem> aErrors2;
|
|
m_oConvertManager.GetErrors2( aErrors2 );
|
|
bool bIsComplete = m_oConvertManager.GetIsComplete();
|
|
CAtlArray<CString> aCompleteFiles;
|
|
m_oConvertManager.GetCompleteFiles( aCompleteFiles );
|
|
m_oConvertManager.Free();
|
|
|
|
//Ñ÷èòàåì ïðîãðåññ îòëè÷åí îò çàïîìíåííîãî òî ãåíåðèì Event
|
|
if( m_lLastProcess != nNewProcess )
|
|
{
|
|
m_lLastProcess = nNewProcess;
|
|
OnProcess( nNewProcess );
|
|
}
|
|
|
|
for( INT32 i=0; i < (INT32)aCompleteFiles.GetCount(); i++)
|
|
{
|
|
CComBSTR bstrCompleteFile( aCompleteFiles[i] );
|
|
OnCompleteFile( bstrCompleteFile.m_str );
|
|
}
|
|
|
|
//ïðîâåðÿåì íå ïðîèçîøëî ëè îøèáîê
|
|
for( INT32 i=0; i < (INT32)aErrors.GetCount(); i++)
|
|
{
|
|
OnError(aErrors[i]);
|
|
Resume();
|
|
}
|
|
//îøèáêè ïî êîòîðûì ìîæíî ïîëó÷èòü äîïîëíèòåëüíóþ èíôîðìàöèþ ÷åðåç GetAdditionalParam
|
|
for( INT32 i=0; i < (INT32)aErrors2.GetCount(); i++)
|
|
{
|
|
m_oCurError = aErrors2[i];
|
|
OnError( aErrors2[i].nID );
|
|
Resume();
|
|
}
|
|
|
|
//ãåíåðèðóåì OnComplete
|
|
if( true == bIsComplete )
|
|
{
|
|
m_oConvertManager.Clear( );
|
|
OnComplete();
|
|
}
|
|
}
|
|
return S_OK;
|
|
}
|
|
STDMETHODIMP CAVSXMLImageConverter::Stop(void)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
m_oConvertManager.Stop();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CAVSXMLImageConverter::Suspend(void)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
m_oConvertManager.Suspend();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CAVSXMLImageConverter::Resume(void)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
m_oConvertManager.Resume();
|
|
return S_OK;
|
|
}
|
|
STDMETHODIMP CAVSXMLImageConverter::get_Status(LONG* pVal)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
|
|
if( NULL == pVal )
|
|
return S_FALSE;
|
|
|
|
(*pVal) = m_oConvertManager.GetStatus();
|
|
return S_OK;
|
|
}
|
|
STDMETHODIMP CAVSXMLImageConverter::SetAdditionalParam(BSTR ParamName, VARIANT ParamValue)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
|
|
CString sParamNameStr ( ParamName);
|
|
sParamNameStr.MakeLower();
|
|
|
|
if( sParamNameStr == _T("logo") )
|
|
{
|
|
IUnknown* piUnkInput = ParamValue.punkVal;
|
|
RELEASEINTERFACE( m_piLogoImage );
|
|
if(NULL != piUnkInput)
|
|
{
|
|
HRESULT hRes = piUnkInput->QueryInterface( MediaCore::IID_IAVSUncompressedVideoFrame, (void**)&m_piLogoImage );
|
|
if( false == SUCCEEDED(hRes ) || NULL == m_piLogoImage)
|
|
{
|
|
OnError( IMAGECONVERTER_ERROR_INPUT_DATA );
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
}
|
|
else if(sParamNameStr == _T("logoparams"))
|
|
{
|
|
m_nLogoParam = ParamValue.intVal;
|
|
m_oConvertManager.SetLogoParam( m_nLogoParam );
|
|
}
|
|
else if( sParamNameStr == _T("unregistered") )
|
|
{
|
|
if( VARIANT_TRUE == ParamValue.boolVal )
|
|
m_bAddWM = true;
|
|
else
|
|
m_bAddWM = false;
|
|
m_oConvertManager.SetWM( m_bAddWM );
|
|
}
|
|
else if( sParamNameStr == CString("oldphotomasksfolder") )
|
|
{
|
|
m_piImageSource->SetAdditionalParam(ParamName, ParamValue);
|
|
m_oConvertManager.SetAdditionalParam( ParamName, ParamValue.bstrVal );
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHODIMP CAVSXMLImageConverter::GetAdditionalParam(BSTR ParamName, VARIANT* ParamValue)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
CString sParamNameStr ( ParamName);
|
|
sParamNameStr.MakeLower();
|
|
|
|
if(sParamNameStr == _T("logo"))
|
|
{
|
|
IUnknown* piUnkOutput = NULL;
|
|
if( NULL != m_piLogoImage)
|
|
{
|
|
m_piLogoImage->QueryInterface( IID_IUnknown , (void**)&piUnkOutput);
|
|
ParamValue->vt = VT_UNKNOWN;
|
|
ParamValue->punkVal = piUnkOutput;
|
|
}
|
|
}
|
|
else if(sParamNameStr == _T("logoparams"))
|
|
{
|
|
ParamValue->vt = VT_INT;
|
|
ParamValue->intVal = m_nLogoParam;
|
|
}
|
|
else if( sParamNameStr == _T("unregistered") )
|
|
{
|
|
ParamValue->vt = VT_BOOL;
|
|
if( true == m_bAddWM)
|
|
ParamValue->intVal = VARIANT_TRUE;
|
|
else
|
|
ParamValue->intVal = VARIANT_FALSE;
|
|
}
|
|
else if( sParamNameStr == _T("errorfilename") )
|
|
{
|
|
ParamValue->vt = VT_BSTR;
|
|
ParamValue->bstrVal = m_oCurError.sFilename.AllocSysString();
|
|
}
|
|
else if( sParamNameStr == _T("sourcescomplete") )
|
|
{
|
|
ParamValue->vt = VT_I4;
|
|
ParamValue->lVal = m_oCurError.nSourcesComplete;
|
|
}
|
|
else if( sParamNameStr == _T("sourcesall") )
|
|
{
|
|
ParamValue->vt = VT_I4;
|
|
ParamValue->lVal = m_oCurError.nSourcesAll;
|
|
}
|
|
return S_OK;
|
|
}
|
|
STDMETHODIMP CAVSXMLImageConverter::GetCurrentPicture( LONG nWidth, LONG nHeight, IUnknown** ppVal )
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
if( NULL == ppVal )
|
|
return S_FALSE;
|
|
(*ppVal) = NULL;
|
|
|
|
CString sCurImage = m_oConvertManager.GetCurImageName();
|
|
if( _T("") != sCurImage )
|
|
{
|
|
BSTR bstrFile = sCurImage.AllocSysString();
|
|
HRESULT hRes = m_piImageSource->LoadImageW( bstrFile, nWidth, nHeight, ppVal );
|
|
SysFreeString( bstrFile );
|
|
return hRes;
|
|
}
|
|
return S_FALSE;
|
|
}
|
|
STDMETHODIMP CAVSXMLImageConverter::GetEstimatedTime(FLOAT* pVal)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
|
|
if(NULL != pVal)
|
|
{
|
|
(*pVal) = (FLOAT)m_oConvertManager.GetEstimatedTime();
|
|
return S_OK;
|
|
}
|
|
else
|
|
return S_FALSE;
|
|
}
|
|
STDMETHODIMP CAVSXMLImageConverter::GetElapsedTime(FLOAT* pVal)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
if(NULL != pVal)
|
|
{
|
|
(*pVal) = (FLOAT)m_oConvertManager.GetElapsedTime();
|
|
return S_OK;
|
|
}
|
|
else
|
|
return S_FALSE;
|
|
}
|
|
|
|
STDMETHODIMP CAVSXMLImageConverter::SetThreadType(LONG NewVal)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
SYSTEM_INFO siSysInfo;
|
|
DWORD dwProcNum;
|
|
INT32 nThreadCount;
|
|
switch( NewVal )
|
|
{
|
|
case -1:
|
|
GetSystemInfo( &siSysInfo );
|
|
nThreadCount = 3 * siSysInfo.dwNumberOfProcessors / 2;
|
|
break;
|
|
case 0:
|
|
nThreadCount = 1;
|
|
break;
|
|
case 1:
|
|
nThreadCount = 2;
|
|
GetSystemInfo( &siSysInfo );
|
|
dwProcNum = 3 * siSysInfo.dwNumberOfProcessors / 2;
|
|
if( (INT32)dwProcNum > nThreadCount)
|
|
nThreadCount = dwProcNum;
|
|
break;
|
|
default:
|
|
GetSystemInfo( &siSysInfo );
|
|
nThreadCount = 3 * siSysInfo.dwNumberOfProcessors / 2;
|
|
break;
|
|
}
|
|
m_oConvertManager.SetTreadCount( nThreadCount );
|
|
return S_OK;
|
|
}
|
|
STDMETHODIMP CAVSXMLImageConverter::SetThreadPriority(LONG NewVal)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
m_oConvertManager.SetThreadPriority( NewVal );
|
|
return S_OK;
|
|
}
|
|
STDMETHODIMP CAVSXMLImageConverter::get_FilesCache(IUnknown** pVal)
|
|
{
|
|
if( NULL == pVal )
|
|
return S_FALSE;
|
|
(*pVal) = NULL;
|
|
if( NULL == m_piFilesCache )
|
|
return S_OK;
|
|
|
|
return m_piFilesCache->QueryInterface( IID_IUnknown , (void**)pVal );
|
|
}
|
|
STDMETHODIMP CAVSXMLImageConverter::put_FilesCache(IUnknown* newVal)
|
|
{
|
|
CTemporaryCS oCS(&m_csThread);
|
|
|
|
RELEASEINTERFACE(m_piFilesCache);
|
|
if(NULL != newVal)
|
|
{
|
|
ImageStudio::IAVSImageCache* piFileCache = NULL;
|
|
HRESULT hRes = newVal->QueryInterface( ImageStudio::IID_IAVSImageCache, (void**)&piFileCache );
|
|
if( SUCCEEDED(hRes) && NULL != piFileCache )
|
|
m_piFilesCache = piFileCache;
|
|
else
|
|
return S_FALSE;
|
|
}
|
|
return S_OK;
|
|
} |