home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2000 April
/
VPR0004A.BIN
/
OLS
/
SADKT100
/
sadkt100.lzh
/
SrcAlml.lzh
/
CommandSink.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1999-12-31
|
8KB
|
330 lines
// CommandSink.cpp : CCommandSink のインプリメンテーション
#include "stdafx.h"
#include "Ad_Alml.h"
#include "CommandSink.h"
/////////////////////////////////////////////////////////////////////////////
// CCommandSink
BOOL CCommandSink::SetObjectInfo(ISRAPL *pApl, DWORD dwCookie)
{
HRESULT hr;
ASSERT(pApl!=NULL && m_pApl==NULL);
m_pApl=pApl;
ASSERT(dwCookie>0 && m_dwCookie==0);
m_dwCookie=dwCookie;
hr = AtlAdvise(m_pApl, this->GetUnknown(), DIID__ISRAPLEvents, &m_dwAdvise);
if(FAILED(hr)){
m_pApl->Release();
m_pApl=NULL;
m_dwCookie=0;
MessageBox(NULL, "Advise Failed","", MB_OK);
return FALSE;
}
return TRUE;
}
void CCommandSink::Unadvise()
{
if(m_pApl==NULL)
return;
HRESULT hr=AtlUnadvise(m_pApl, DIID__ISRAPLEvents, m_dwAdvise);
if(FAILED(hr)){
MessageBox(NULL, "Unadvise Failed", "", MB_OK);
}
m_pApl->Release();
m_pApl=NULL;
}
//////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CCommandSink::OnAddinCommand(long lCookie, long lInnerNumber)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: この位置にインプリメント用のコードを追加してください
if(m_dwCookie!=(unsigned long)lCookie)
return S_OK;
switch(lInnerNumber){
case 1:
OnSendMailToAlMail();
break;
}
return S_OK;
}
STDMETHODIMP CCommandSink::OnNewInstance()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: この位置にインプリメント用のコードを追加してください
return S_OK;
}
STDMETHODIMP CCommandSink::OnPreOpen()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: この位置にインプリメント用のコードを追加してください
return S_OK;
}
STDMETHODIMP CCommandSink::OnPostOpen()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: この位置にインプリメント用のコードを追加してください
return S_OK;
}
STDMETHODIMP CCommandSink::OnPreSave()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: この位置にインプリメント用のコードを追加してください
return S_OK;
}
STDMETHODIMP CCommandSink::OnPostSave()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: この位置にインプリメント用のコードを追加してください
return S_OK;
}
STDMETHODIMP CCommandSink::OnCloseInstance()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: この位置にインプリメント用のコードを追加してください
return S_OK;
}
////////////////////////////////////////////////////////////////////////////////
void CCommandSink::GetModuleDir()
{
TCHAR szBuff[_MAX_PATH];
::GetModuleFileName(AfxGetInstanceHandle(), szBuff, sizeof(szBuff));
TCHAR *ptrStr=_tcsrchr(szBuff, _T('\\'));
if(ptrStr)
ptrStr[0]=_T('\0');
m_csModuleDir=szBuff;
}
void CCommandSink::OnSendMailToAlMail()
{
//メールを電信8号に送出します。
//--------- ISRMiscインターフェースを取得します。----------
ISRMisc *pIMisc=NULL;
if(FAILED(m_pApl->CreateMiscObject(&pIMisc)) || pIMisc==NULL){
MessageBox(NULL, _T("Failed to create ISRMisc"), AfxGetAppName(), MB_OK);
return;
}
//----------文書をメールとして解析します。---------
CComVariant vrMail;
if( FAILED(pIMisc->GetMailString(&vrMail))){
pIMisc->Release();
MessageBox(NULL, _T("文書の分析に失敗しました。"),AfxGetAppName(), MB_OK);
return;
}
SAFEARRAY *psa=vrMail.parray;
BSTR *bsStrArray;
SafeArrayAccessData(psa, (void**)&bsStrArray);
CString csMsg=bsStrArray[0];
CString csSubject=bsStrArray[1];
CString csTO=bsStrArray[2];
CString csCC=bsStrArray[3];
CString csBCC=bsStrArray[4];
CString csFrom=bsStrArray[5];
CString csMessageID=bsStrArray[6];
CString csInReplyTo=bsStrArray[7];
CString csReplyTo=bsStrArray[8];
SafeArrayUnaccessData(psa);
//---------インターフェース解放---------
pIMisc->Release();
//---------------------------------------
if(m_csModuleDir.IsEmpty())
GetModuleDir();
TCHAR szTmpFile[_MAX_PATH];
if(!GetTempFileName(m_csModuleDir,_T("ADA"), 0,szTmpFile)){
MessageBox(NULL, "Failed to create temporary file", AfxGetAppName(), MB_OK);
return;
}
CFile file;
file.Open(szTmpFile, CFile::modeWrite);
CString csTmp;
if(!csTO.IsEmpty()){
ChangeDelimita(csTO, _T(';'), _T(','));
csTmp=_T("TO: ");
csTmp +=csTO;
file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
file.Write("\r\n", 2);
}
if(!csCC.IsEmpty()){
ChangeDelimita(csCC, _T(';'), _T(','));
csTmp=_T("CC: ");
csTmp +=csCC;
file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
file.Write("\r\n", 2);
}
if(!csBCC.IsEmpty()){
ChangeDelimita(csBCC, _T(';'), _T(','));
csTmp=_T("BCC: ");
csTmp +=csBCC;
file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
file.Write("\r\n", 2);
}
if(!csFrom.IsEmpty()){
csTmp=_T("From: ");
csTmp +=csFrom;
file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
file.Write("\r\n", 2);
}
if(!csMessageID.IsEmpty()){
csTmp=_T("MESSAGE-ID: ");
csTmp +=csMessageID;
file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
file.Write("\r\n", 2);
}
if(!csInReplyTo.IsEmpty()){
csTmp=_T("IN-REPLY-TO: ");
csTmp +=csInReplyTo;
file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
file.Write("\r\n", 2);
}
if(!csReplyTo.IsEmpty()){
csTmp=_T("REPLY-TO: ");
csTmp +=csReplyTo;
file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
file.Write("\r\n", 2);
}
csTmp=_T("Subject: ");
csTmp +=csSubject;
file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
file.Write("\r\n", 2);
file.Write("\r\n", 2);
file.Write((LPVOID)(LPCTSTR)csMsg, csMsg.GetLength());
file.Close();
BOOL bNeedInput=FALSE;
do {
if(!GetAlMailPath(bNeedInput)){
CFile::Remove(szTmpFile);
return;
}
bNeedInput=TRUE;
}while(!BootAlMail(szTmpFile));
AfxGetApp()->WriteProfileString(_T("AlMail"), _T("Path"), m_csAlMailPath);
}
void CCommandSink::ChangeDelimita(CString& csSTR, TCHAR cOld, TCHAR cNew)
{
int nPos=csSTR.Find(cOld);
while(nPos>=0){
csSTR.SetAt(nPos, cNew);
nPos=csSTR.Find(cOld);
}
}
BOOL CCommandSink::GetAlMailPath(BOOL bNeedInput)
{
if(!bNeedInput){
if(!m_csAlMailPath.IsEmpty())
return TRUE;
m_csAlMailPath=AfxGetApp()->GetProfileString(_T("AlMail"), _T("Path"), _T(""));
if(!m_csAlMailPath.IsEmpty())
return TRUE;
}
char szFilter[]=_T("EXE Files(*.exe)|*.exe|All Files(*.*)|*.*||");
DWORD dwFlags=(OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR);
CFileDialog FileDlg(TRUE,
NULL,
NULL,
dwFlags,
szFilter,
NULL);
FileDlg.m_ofn.lpstrTitle=_T("Al-Mailの実行ファイル(AlMail.exe)を指定");
if(IDOK!=FileDlg.DoModal())
return FALSE;
m_csAlMailPath=FileDlg.GetPathName();
return TRUE;
}
BOOL CCommandSink::BootAlMail(LPCTSTR lpFilePath)
{
CString csCmdLine=m_csAlMailPath;
csCmdLine +=_T(" /file:\"");
csCmdLine +=lpFilePath;
csCmdLine +=_T("\"");
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.lpReserved = NULL;
si.lpReserved2 = NULL;
si.cbReserved2 = 0;
si.lpDesktop = NULL;
si.dwFlags = 0;
if(!CreateProcess( NULL, csCmdLine.GetBuffer(csCmdLine.GetLength()+1),
NULL, NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL, NULL,
&si, &pi )){
MessageBox(NULL, "Al-Mailの起動に失敗しました。もう一度パスを入力してください。", AfxGetAppName(), MB_OK);
return FALSE;
}
WaitForInputIdle(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
return TRUE;
}