windows-nt/Source/XPSP1/NT/printscan/ui/wiaacmgr/postplug/postplug.cpp
2020-09-26 16:20:57 +08:00

339 lines
11 KiB
C++

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 2000
*
* TITLE: POSTPLUG.CPP
*
* VERSION: 1.0
*
* AUTHOR: ShaunIv
*
* DATE: 4/11/2000
*
* DESCRIPTION:
*
*******************************************************************************/
#include "precomp.h"
#pragma hdrstop
#include <atlimpl.cpp>
#include "postplug.h"
#include "geturldlg.h"
#include "simreg.h"
CHttpPostPlugin::~CHttpPostPlugin(void)
{
DllRelease();
}
CHttpPostPlugin::CHttpPostPlugin()
: m_cRef(1),
m_pImageTransferPluginProgressCallback(NULL),
m_nCurrentPluginId(-1)
{
DllAddRef();
CSimpleReg reg( HKEY_CURRENT_USER, CSimpleString( IDS_COMMUNITIES_ACCOUNTS_KEY, g_hInstance ), false, KEY_READ );
if (reg.OK())
{
reg.EnumValues( EnumCommunitiesProc, reinterpret_cast<LPARAM>(this) );
}
m_CommunityInfoArray.Append( CCommunityInfo( TEXT(""), CSimpleString( IDS_COMMUNITY_PICK, g_hInstance ) ) );
}
bool CHttpPostPlugin::EnumCommunitiesProc( CSimpleReg::CValueEnumInfo &enumInfo )
{
CHttpPostPlugin *pHttpPostPlugin = reinterpret_cast<CHttpPostPlugin*>(enumInfo.lParam);
if (pHttpPostPlugin)
{
if (enumInfo.strName.Length())
{
CSimpleString strCommunityName = enumInfo.reg.Query( enumInfo.strName, TEXT("") );
if (strCommunityName.Length())
{
pHttpPostPlugin->m_CommunityInfoArray.Append( CCommunityInfo( enumInfo.strName, strCommunityName ) );
}
}
}
return true;
}
STDMETHODIMP CHttpPostPlugin::QueryInterface( REFIID riid, LPVOID *ppvObject )
{
if (IsEqualIID( riid, IID_IUnknown ))
{
*ppvObject = static_cast<IImageTransferPlugin*>(this);
}
else if (IsEqualIID( riid, IID_IImageTransferPlugin ))
{
*ppvObject = static_cast<IImageTransferPlugin*>(this);
}
else
{
*ppvObject = NULL;
return (E_NOINTERFACE);
}
reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();
return(S_OK);
}
STDMETHODIMP_(ULONG) CHttpPostPlugin::AddRef()
{
return(InterlockedIncrement(&m_cRef));
}
STDMETHODIMP_(ULONG) CHttpPostPlugin::Release()
{
LONG nRefCount = InterlockedDecrement(&m_cRef);
if (!nRefCount)
{
delete this;
}
return(nRefCount);
}
STDMETHODIMP CHttpPostPlugin::GetPluginCount( ULONG *pnCount )
{
if (!pnCount)
{
return E_POINTER;
}
//
// Calculate the number of plugin destinations this object provides
//
*pnCount = m_CommunityInfoArray.Size();
return S_OK;
}
STDMETHODIMP CHttpPostPlugin::GetPluginName( ULONG nPluginId, BSTR *pbstrName )
{
if (nPluginId >= m_CommunityInfoArray.Size())
{
return E_INVALIDARG;
}
if (!pbstrName)
{
return E_POINTER;
}
*pbstrName = SysAllocString(CSimpleStringConvert::WideString(CSimpleString().Format( IDS_MSN_COMMUNITIES, g_hInstance, m_CommunityInfoArray[nPluginId].CommunityName().String())));
if (NULL == *pbstrName)
{
return E_OUTOFMEMORY;
}
return S_OK;
}
STDMETHODIMP CHttpPostPlugin::GetPluginDescription( ULONG nPluginId, BSTR *pbstrDescription )
{
if (nPluginId >= m_CommunityInfoArray.Size())
{
return E_INVALIDARG;
}
if (!pbstrDescription)
{
return E_POINTER;
}
*pbstrDescription = SysAllocString(CSimpleStringConvert::WideString(CSimpleString(IDS_MSN_COMMUNITIES_DESCRIPTION,g_hInstance)));
if (NULL == *pbstrDescription)
{
return E_OUTOFMEMORY;
}
return S_OK;
}
STDMETHODIMP CHttpPostPlugin::GetPluginIcon( ULONG nPluginId, HICON *phIcon, int nWidth, int nHeight )
{
if (nPluginId >= m_CommunityInfoArray.Size())
{
return E_INVALIDARG;
}
if (!phIcon)
{
return E_POINTER;
}
*phIcon = NULL;
HICON hIcon = reinterpret_cast<HICON>(LoadImage( g_hInstance, MAKEINTRESOURCE(IDI_MSN_COMMUNITIES), IMAGE_ICON, nWidth, nHeight, LR_DEFAULTCOLOR ));
if (hIcon)
{
*phIcon = CopyIcon(hIcon);
DestroyIcon(hIcon);
}
return S_OK;
}
STDMETHODIMP CHttpPostPlugin::OpenConnection( HWND hwndParent, ULONG nPluginId, IImageTransferPluginProgressCallback *pImageTransferPluginProgressCallback )
{
if (nPluginId >= m_CommunityInfoArray.Size())
{
return E_INVALIDARG;
}
if (!pImageTransferPluginProgressCallback)
{
return E_INVALIDARG;
}
m_pImageTransferPluginProgressCallback = pImageTransferPluginProgressCallback;
m_nCurrentPluginId = nPluginId;
if (!m_CommunityInfoArray[m_nCurrentPluginId].CommunityId().Length())
{
CGetCommunityUrlDialog::CData UrlData;
UrlData.MruRegistryKey( CSimpleString( IDS_COMMUNITIES_MRU_KEY, g_hInstance ) );
UrlData.MruRegistryValue( CSimpleString( IDS_COMMUNITIES_MRU_VALUE, g_hInstance ) );
INT_PTR nResult = DialogBoxParam( g_hInstance, MAKEINTRESOURCE(IDD_GETCOMMUNITY), hwndParent, CGetCommunityUrlDialog::DialogProc, reinterpret_cast<LPARAM>(&UrlData) );
if (IDOK != nResult)
{
return S_FALSE;
}
//
// Save the community id
//
int nCurrentPluginId = m_CommunityInfoArray.Append( CCommunityInfo( UrlData.Url(), UrlData.Url() ) );
if (nCurrentPluginId < 0)
{
return E_OUTOFMEMORY;
}
m_nCurrentPluginId = nCurrentPluginId;
}
//
// Open the connection with m_HttpFilePoster
//
CSimpleStringAnsi straCommunityId = CSimpleStringConvert::AnsiString(m_CommunityInfoArray[m_nCurrentPluginId].CommunityId());
if (straCommunityId.Length())
{
m_HttpFilePoster.Initialize( "http://content.communities.msn.com/isapi/fetch.dll?action=add_photo", hwndParent );
m_HttpFilePoster.AddFormData( "ID_Community", straCommunityId.String());
m_HttpFilePoster.AddFormData( "ID_Topic", "1" );
}
else
{
return E_OUTOFMEMORY;
}
return S_OK;
}
STDMETHODIMP CHttpPostPlugin::AddFile( BSTR bstrFilename, BSTR bstrDescription, const GUID &guidImageFormat, BOOL bDelete )
{
HRESULT hr;
CSimpleString strFilename(CSimpleStringConvert::NaturalString(CSimpleStringWide(bstrFilename)));
if (strFilename.Length())
{
HANDLE hFile = CreateFile( strFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if (hFile)
{
DWORD dwFileSize = GetFileSize( hFile, NULL );
if (dwFileSize)
{
//
// What do we get back from addfile? Are there any errors?
//
m_HttpFilePoster.AddFile( CStdString(CSimpleStringConvert::AnsiString(strFilename).String()),
CStdString(CSimpleStringConvert::AnsiString(CSimpleStringWide(bstrDescription)).String()),
dwFileSize,
bDelete );
hr = S_OK;
}
else
{
hr = E_FAIL;
}
CloseHandle(hFile);
}
else
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
}
else
{
hr = E_INVALIDARG;
}
return hr;
}
UINT CHttpPostPlugin::ProgressProc( CProgressInfo *pProgressInfo )
{
UINT bCancelled = FALSE;
if (pProgressInfo)
{
CHttpPostPlugin *pHttpPostPlugin = reinterpret_cast<CHttpPostPlugin*>(pProgressInfo->lParam);
if (pHttpPostPlugin)
{
CComPtr<IImageTransferPluginProgressCallback> pImageTransferPluginProgressCallback = pHttpPostPlugin->m_pImageTransferPluginProgressCallback;
if (pImageTransferPluginProgressCallback)
{
switch (pProgressInfo->dwStatus)
{
case TRANSFER_SESSION_INITIATE:
pImageTransferPluginProgressCallback->SetOverallPercent(0);
pImageTransferPluginProgressCallback->SetFilePercent(0);
break;
case TRANSFER_FILE_INITATE:
pImageTransferPluginProgressCallback->SetCurrentFile(pProgressInfo->dwDoneFiles);
pImageTransferPluginProgressCallback->SetOverallPercent(pProgressInfo->dwOverallPercent);
pImageTransferPluginProgressCallback->SetFilePercent(0);
break;
case TRANSFER_FILE_TRANSFERING:
pImageTransferPluginProgressCallback->SetFilePercent(pProgressInfo->dwCurrentPercent);
pImageTransferPluginProgressCallback->SetOverallPercent(pProgressInfo->dwOverallPercent);
break;
case TRANSFER_FILE_COMPLETE:
pImageTransferPluginProgressCallback->SetFilePercent(100);
pImageTransferPluginProgressCallback->SetOverallPercent(pProgressInfo->dwOverallPercent);
break;
case TRANSFER_SESSION_COMPLETE:
pImageTransferPluginProgressCallback->SetFilePercent(100);
pImageTransferPluginProgressCallback->SetOverallPercent(100);
break;
}
if (!SUCCEEDED(pImageTransferPluginProgressCallback->Cancelled(&bCancelled)))
{
bCancelled = FALSE;
}
}
}
}
return bCancelled ? 1 : 0;
}
STDMETHODIMP CHttpPostPlugin::TransferFiles( BSTR bstrGlobalDescription )
{
CProgressInfo ProgressInfo;
ProgressInfo.pfnProgress = ProgressProc;
ProgressInfo.lParam = reinterpret_cast<LPARAM>(this);
m_HttpFilePoster.AddFormData( "Message_Body", CSimpleStringConvert::AnsiString(CSimpleStringWide(bstrGlobalDescription)).String());
return m_HttpFilePoster.ForegroundUpload(&ProgressInfo);
}
STDMETHODIMP CHttpPostPlugin::OpenDestination(void)
{
CSimpleStringAnsi straCommunityId = CSimpleStringConvert::AnsiString(m_CommunityInfoArray[m_nCurrentPluginId].CommunityId());
if (straCommunityId.Length())
{
CSimpleStringAnsi strDestinationExecuteName("http://content.communities.msn.com/isapi/fetch.dll?action=get_album&ID_Topic=1&ID_Community=");
if (strDestinationExecuteName.Length())
{
strDestinationExecuteName += straCommunityId;
if (strDestinationExecuteName.Length())
{
ShellExecuteA( NULL, "open", strDestinationExecuteName, "", "", SW_SHOWNORMAL );
return S_OK;
}
}
}
return E_FAIL;
}
STDMETHODIMP CHttpPostPlugin::CloseConnection(void)
{
m_pImageTransferPluginProgressCallback = NULL;
m_nCurrentPluginId = -1;
return S_OK;
}