windows-nt/Source/XPSP1/NT/printscan/print/spooler/oleprn/olecvt.cpp
2020-09-26 16:20:57 +08:00

279 lines
6.5 KiB
C++

// OleCvt.cpp : Implementation of COleCvt
#include "stdafx.h"
#include "oleprn.h"
#include "OleCvt.h"
/////////////////////////////////////////////////////////////////////////////
// COleCvt
STDMETHODIMP COleCvt::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IOleCvt,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
STDMETHODIMP COleCvt::OnStartPage (IUnknown* pUnk)
{
if(!pUnk)
return E_POINTER;
if (m_dwSafety & INTERFACESAFE_FOR_UNTRUSTED_CALLER)
return E_ACCESSDENIED;
CComPtr<IScriptingContext> spContext;
HRESULT hr;
// Get the IScriptingContext Interface
hr = pUnk->QueryInterface(IID_IScriptingContext, (void **)&spContext);
if(FAILED(hr))
return hr;
// Get Request Object Pointer
hr = spContext->get_Request(&m_piRequest);
if(FAILED(hr))
{
spContext.Release();
return hr;
}
// Get Response Object Pointer
hr = spContext->get_Response(&m_piResponse);
if(FAILED(hr))
{
m_piRequest.Release();
return hr;
}
// Get Server Object Pointer
hr = spContext->get_Server(&m_piServer);
if(FAILED(hr))
{
m_piRequest.Release();
m_piResponse.Release();
return hr;
}
// Get Session Object Pointer
hr = spContext->get_Session(&m_piSession);
if(FAILED(hr))
{
m_piRequest.Release();
m_piResponse.Release();
m_piServer.Release();
return hr;
}
// Get Application Object Pointer
hr = spContext->get_Application(&m_piApplication);
if(FAILED(hr))
{
m_piRequest.Release();
m_piResponse.Release();
m_piServer.Release();
m_piSession.Release();
return hr;
}
m_bOnStartPageCalled = TRUE;
return S_OK;
}
STDMETHODIMP COleCvt::OnEndPage ()
{
if (m_dwSafety & INTERFACESAFE_FOR_UNTRUSTED_CALLER)
return E_ACCESSDENIED;
m_bOnStartPageCalled = FALSE;
// Release all interfaces
m_piRequest.Release();
m_piResponse.Release();
m_piServer.Release();
m_piSession.Release();
m_piApplication.Release();
return S_OK;
}
HRESULT COleCvt::SetOleCvtScriptingError(DWORD dwError)
{
return (SetScriptingError(CLSID_OleCvt, IID_IOleCvt, dwError));
}
STDMETHODIMP COleCvt::get_ToUtf8(BSTR bstrUnicode, BSTR * pVal)
{
LPSTR pszUtf8 = NULL;
LPWSTR pwszUnicodeStr = NULL;
DWORD rc;
HRESULT hr = S_OK;
if (!pVal)
return E_POINTER;
*pVal = 0;
// Convert the input unicode string to utf8
if (! (rc = WideCharToMultiByte( CP_UTF8, 0, bstrUnicode, -1, NULL, 0, NULL, NULL ))) {
goto Cleanup;
}
// Allocate the string
if (! (pszUtf8 = (LPSTR) LocalAlloc (LPTR, rc)))
goto Cleanup;
if (! (rc = WideCharToMultiByte( CP_UTF8, 0, bstrUnicode, -1, pszUtf8, rc, NULL, NULL )))
goto Cleanup;
// Convert the string to unicode as if it is ANSI (preserve the UTF8 conversion)
if (! (rc = MultiByteToWideChar( 1252, 0, pszUtf8, -1, NULL, 0)))
goto Cleanup;
// Allocate the string
if (! (pwszUnicodeStr = (LPWSTR) LocalAlloc (LPTR, sizeof (WCHAR) * rc)))
goto Cleanup;
if (! (rc = MultiByteToWideChar( 1252, 0, pszUtf8, -1, pwszUnicodeStr, rc)))
goto Cleanup;
if (!(*pVal = SysAllocString (pwszUnicodeStr)))
goto Cleanup;
SetLastError (ERROR_SUCCESS);
Cleanup:
if (GetLastError () != ERROR_SUCCESS)
hr = SetOleCvtScriptingError (GetLastError ());
if (pszUtf8)
LocalFree (pszUtf8);
if (pwszUnicodeStr)
LocalFree (pwszUnicodeStr);
return hr;
}
STDMETHODIMP COleCvt::get_EncodeUnicodeName(BSTR bstrSrcName, BSTR * pDstName)
{
LPTSTR pszEncodedName = NULL;
DWORD dwSize = 0;
HRESULT hr = S_OK;
if (!bstrSrcName || !pDstName)
return E_POINTER;
EncodePrinterName (bstrSrcName, NULL, &dwSize);
if (! (pszEncodedName = (LPTSTR) LocalAlloc (LPTR, sizeof (TCHAR) * dwSize)))
goto Cleanup;
if (!EncodePrinterName (bstrSrcName, pszEncodedName, &dwSize))
goto Cleanup;
if (!(*pDstName = SysAllocString (pszEncodedName)))
goto Cleanup;
SetLastError (ERROR_SUCCESS);
Cleanup:
if (GetLastError () != ERROR_SUCCESS)
hr = SetOleCvtScriptingError (GetLastError ());
if (pszEncodedName) {
LocalFree (pszEncodedName);
}
return hr;
}
STDMETHODIMP COleCvt::get_DecodeUnicodeName(BSTR bstrSrcName, BSTR * pDstName)
{
LPTSTR pszDecodedName = NULL;
DWORD dwSize = 0;
HRESULT hr = S_OK;
if (!bstrSrcName || !pDstName)
return E_POINTER;
DecodePrinterName (bstrSrcName, NULL, &dwSize);
if (! (pszDecodedName = (LPTSTR) LocalAlloc (LPTR, sizeof (TCHAR) * dwSize)))
goto Cleanup;
if (!DecodePrinterName (bstrSrcName, pszDecodedName, &dwSize))
goto Cleanup;
if (!(*pDstName = SysAllocString (pszDecodedName)))
goto Cleanup;
SetLastError (ERROR_SUCCESS);
Cleanup:
if (GetLastError () != ERROR_SUCCESS)
hr = SetOleCvtScriptingError (GetLastError ());
if (pszDecodedName) {
LocalFree (pszDecodedName);
}
return hr;
}
// This function is to take the input string bstrString as if it wrer ANSI
// and then convert it back to unicode using whatever codepage specifed.
STDMETHODIMP COleCvt::get_ToUnicode(BSTR bstrString, long lCodePage, BSTR * pVal)
{
LPSTR pszStr = NULL;
LPWSTR pwszUnicodeStr = NULL;
DWORD rc;
HRESULT hr = S_OK;
if (!pVal)
return E_POINTER;
*pVal = 0;
// Convert the input unicode string to utf8
if (! (rc = WideCharToMultiByte(CP_ACP, 0, bstrString, -1, NULL, 0, NULL, NULL ))) {
goto Cleanup;
}
// Allocate the string
if (! (pszStr = (LPSTR) LocalAlloc (LPTR, rc)))
goto Cleanup;
if (! (rc = WideCharToMultiByte( CP_ACP, 0, bstrString, -1, pszStr, rc, NULL, NULL )))
goto Cleanup;
// Convert the string to unicode as if it is ANSI (preserve the UTF8 conversion)
if (! (rc = MultiByteToWideChar( lCodePage, 0, pszStr, -1, NULL, 0)))
goto Cleanup;
// Allocate the string
if (! (pwszUnicodeStr = (LPWSTR) LocalAlloc (LPTR, sizeof (WCHAR) * rc)))
goto Cleanup;
if (! (rc = MultiByteToWideChar( lCodePage, 0, pszStr, -1, pwszUnicodeStr, rc)))
goto Cleanup;
if (!(*pVal = SysAllocString (pwszUnicodeStr)))
goto Cleanup;
SetLastError (ERROR_SUCCESS);
Cleanup:
if (GetLastError () != ERROR_SUCCESS)
hr = SetOleCvtScriptingError (GetLastError ());
if (pszStr)
LocalFree (pszStr);
if (pwszUnicodeStr)
LocalFree (pwszUnicodeStr);
return hr;
}