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 >
C/C++ Source or Header  |  1999-12-31  |  8KB  |  330 lines

  1. // CommandSink.cpp : CCommandSink のインプリメンテーション
  2. #include "stdafx.h"
  3. #include "Ad_Alml.h"
  4. #include "CommandSink.h"
  5.  
  6. /////////////////////////////////////////////////////////////////////////////
  7. // CCommandSink
  8.  
  9.  
  10. BOOL CCommandSink::SetObjectInfo(ISRAPL *pApl, DWORD dwCookie)
  11. {
  12.     HRESULT hr;
  13.  
  14.     ASSERT(pApl!=NULL && m_pApl==NULL);
  15.     m_pApl=pApl;
  16.  
  17.     ASSERT(dwCookie>0 && m_dwCookie==0);
  18.     m_dwCookie=dwCookie;
  19.  
  20.     hr = AtlAdvise(m_pApl, this->GetUnknown(), DIID__ISRAPLEvents, &m_dwAdvise);
  21.     if(FAILED(hr)){
  22.         m_pApl->Release();
  23.         m_pApl=NULL;
  24.         m_dwCookie=0;
  25.         MessageBox(NULL, "Advise Failed","", MB_OK);
  26.         return FALSE;
  27.     }
  28.     return TRUE;
  29. }
  30.  
  31.  
  32. void CCommandSink::Unadvise()
  33. {
  34.     if(m_pApl==NULL)
  35.         return;
  36.  
  37.     HRESULT hr=AtlUnadvise(m_pApl, DIID__ISRAPLEvents, m_dwAdvise);
  38.     if(FAILED(hr)){
  39.         MessageBox(NULL, "Unadvise Failed", "", MB_OK);
  40.     }
  41.     m_pApl->Release();
  42.     m_pApl=NULL;
  43. }
  44.  
  45. //////////////////////////////////////////////////////////////////////////////////
  46.  
  47.  
  48. STDMETHODIMP CCommandSink::OnAddinCommand(long lCookie, long lInnerNumber)
  49. {
  50.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  51.  
  52.     // TODO: この位置にインプリメント用のコードを追加してください
  53.     if(m_dwCookie!=(unsigned long)lCookie)
  54.         return S_OK;
  55.     
  56.     switch(lInnerNumber){
  57.         case    1:
  58.             OnSendMailToAlMail();
  59.             break;
  60.  
  61.     }
  62.  
  63.     return S_OK;
  64. }
  65.  
  66. STDMETHODIMP CCommandSink::OnNewInstance()
  67. {
  68.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  69.  
  70.     // TODO: この位置にインプリメント用のコードを追加してください
  71.  
  72.     return S_OK;
  73. }
  74.  
  75. STDMETHODIMP CCommandSink::OnPreOpen()
  76. {
  77.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  78.  
  79.     // TODO: この位置にインプリメント用のコードを追加してください
  80.  
  81.     return S_OK;
  82. }
  83.  
  84. STDMETHODIMP CCommandSink::OnPostOpen()
  85. {
  86.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  87.  
  88.     // TODO: この位置にインプリメント用のコードを追加してください
  89.  
  90.     return S_OK;
  91. }
  92.  
  93. STDMETHODIMP CCommandSink::OnPreSave()
  94. {
  95.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  96.  
  97.     // TODO: この位置にインプリメント用のコードを追加してください
  98.  
  99.     return S_OK;
  100. }
  101.  
  102. STDMETHODIMP CCommandSink::OnPostSave()
  103. {
  104.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  105.  
  106.     // TODO: この位置にインプリメント用のコードを追加してください
  107.  
  108.     return S_OK;
  109. }
  110.  
  111. STDMETHODIMP CCommandSink::OnCloseInstance()
  112. {
  113.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  114.  
  115.     // TODO: この位置にインプリメント用のコードを追加してください
  116.  
  117.     return S_OK;
  118. }
  119.  
  120.  
  121.  
  122. ////////////////////////////////////////////////////////////////////////////////
  123.  
  124. void CCommandSink::GetModuleDir()
  125. {
  126.     TCHAR szBuff[_MAX_PATH];
  127.     ::GetModuleFileName(AfxGetInstanceHandle(), szBuff, sizeof(szBuff));
  128.     TCHAR *ptrStr=_tcsrchr(szBuff, _T('\\'));
  129.     if(ptrStr)
  130.         ptrStr[0]=_T('\0');
  131.     m_csModuleDir=szBuff;            
  132. }
  133.  
  134.  
  135.  
  136.  
  137. void CCommandSink::OnSendMailToAlMail()
  138. {
  139.  
  140.     //メールを電信8号に送出します。
  141.  
  142.     //--------- ISRMiscインターフェースを取得します。----------
  143.     ISRMisc *pIMisc=NULL;
  144.     if(FAILED(m_pApl->CreateMiscObject(&pIMisc)) || pIMisc==NULL){
  145.         MessageBox(NULL, _T("Failed to create ISRMisc"), AfxGetAppName(), MB_OK);
  146.         return;
  147.     }
  148.  
  149.     //----------文書をメールとして解析します。---------    
  150.     CComVariant vrMail;
  151.     if( FAILED(pIMisc->GetMailString(&vrMail))){
  152.         pIMisc->Release();
  153.         MessageBox(NULL, _T("文書の分析に失敗しました。"),AfxGetAppName(), MB_OK);
  154.         return;
  155.     }
  156.     SAFEARRAY *psa=vrMail.parray;
  157.     BSTR *bsStrArray;
  158.     SafeArrayAccessData(psa, (void**)&bsStrArray);
  159.     CString csMsg=bsStrArray[0];
  160.     CString csSubject=bsStrArray[1];
  161.     CString csTO=bsStrArray[2];
  162.     CString csCC=bsStrArray[3];
  163.     CString csBCC=bsStrArray[4];
  164.     CString csFrom=bsStrArray[5];
  165.     CString csMessageID=bsStrArray[6];
  166.     CString csInReplyTo=bsStrArray[7];
  167.     CString csReplyTo=bsStrArray[8];
  168.     SafeArrayUnaccessData(psa);    
  169.     
  170.     //---------インターフェース解放---------
  171.     pIMisc->Release();
  172.     //---------------------------------------
  173.  
  174.     if(m_csModuleDir.IsEmpty())
  175.         GetModuleDir();
  176.         
  177.     TCHAR szTmpFile[_MAX_PATH];
  178.     if(!GetTempFileName(m_csModuleDir,_T("ADA"), 0,szTmpFile)){
  179.         MessageBox(NULL,  "Failed to create temporary file", AfxGetAppName(), MB_OK);
  180.         return;
  181.     }
  182.     
  183.     CFile file;
  184.     file.Open(szTmpFile, CFile::modeWrite);
  185.  
  186.     CString csTmp;
  187.     if(!csTO.IsEmpty()){
  188.         ChangeDelimita(csTO, _T(';'), _T(','));
  189.         csTmp=_T("TO: ");
  190.         csTmp +=csTO;
  191.         file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
  192.         file.Write("\r\n", 2);
  193.     }
  194.     if(!csCC.IsEmpty()){
  195.         ChangeDelimita(csCC, _T(';'), _T(','));
  196.         csTmp=_T("CC: ");
  197.         csTmp +=csCC;
  198.         file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
  199.         file.Write("\r\n", 2);
  200.     }
  201.     if(!csBCC.IsEmpty()){
  202.         ChangeDelimita(csBCC, _T(';'), _T(','));
  203.         csTmp=_T("BCC: ");
  204.         csTmp +=csBCC;
  205.         file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
  206.         file.Write("\r\n", 2);
  207.     }
  208.     if(!csFrom.IsEmpty()){
  209.         csTmp=_T("From: ");
  210.         csTmp +=csFrom;
  211.         file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
  212.         file.Write("\r\n", 2);
  213.     }
  214.     if(!csMessageID.IsEmpty()){
  215.         csTmp=_T("MESSAGE-ID: ");
  216.         csTmp +=csMessageID;
  217.         file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
  218.         file.Write("\r\n", 2);
  219.     }
  220.     if(!csInReplyTo.IsEmpty()){
  221.         csTmp=_T("IN-REPLY-TO: ");
  222.         csTmp +=csInReplyTo;
  223.         file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
  224.         file.Write("\r\n", 2);
  225.     }
  226.     if(!csReplyTo.IsEmpty()){
  227.         csTmp=_T("REPLY-TO: ");
  228.         csTmp +=csReplyTo;
  229.         file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
  230.         file.Write("\r\n", 2);
  231.     }
  232.     csTmp=_T("Subject: ");
  233.     csTmp +=csSubject;
  234.     file.Write((LPVOID)(LPCTSTR)csTmp, csTmp.GetLength());
  235.     file.Write("\r\n", 2);
  236.     
  237.     file.Write("\r\n", 2);
  238.     file.Write((LPVOID)(LPCTSTR)csMsg, csMsg.GetLength());
  239.     file.Close();
  240.  
  241.     BOOL bNeedInput=FALSE;
  242.     do {
  243.         if(!GetAlMailPath(bNeedInput)){
  244.             CFile::Remove(szTmpFile);
  245.             return;        
  246.         }
  247.         bNeedInput=TRUE;
  248.     }while(!BootAlMail(szTmpFile));
  249.  
  250.     AfxGetApp()->WriteProfileString(_T("AlMail"), _T("Path"), m_csAlMailPath);
  251.  
  252. }
  253.  
  254.  
  255. void CCommandSink::ChangeDelimita(CString& csSTR, TCHAR cOld, TCHAR cNew)
  256. {
  257.     int nPos=csSTR.Find(cOld);
  258.     while(nPos>=0){
  259.         csSTR.SetAt(nPos, cNew);
  260.         nPos=csSTR.Find(cOld);
  261.     }
  262. }
  263.  
  264. BOOL CCommandSink::GetAlMailPath(BOOL bNeedInput)
  265. {
  266.     if(!bNeedInput){
  267.         if(!m_csAlMailPath.IsEmpty())
  268.             return TRUE;
  269.  
  270.         m_csAlMailPath=AfxGetApp()->GetProfileString(_T("AlMail"), _T("Path"), _T(""));        
  271.         if(!m_csAlMailPath.IsEmpty())
  272.             return TRUE;
  273.     }
  274.  
  275.     char    szFilter[]=_T("EXE Files(*.exe)|*.exe|All Files(*.*)|*.*||");
  276.     DWORD    dwFlags=(OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR);
  277.     CFileDialog    FileDlg(TRUE,
  278.                         NULL,
  279.                         NULL,
  280.                         dwFlags,
  281.                         szFilter,
  282.                         NULL);
  283.  
  284.     FileDlg.m_ofn.lpstrTitle=_T("Al-Mailの実行ファイル(AlMail.exe)を指定");
  285.     if(IDOK!=FileDlg.DoModal())
  286.         return FALSE;
  287.  
  288.     m_csAlMailPath=FileDlg.GetPathName();
  289.     return TRUE;
  290.  
  291.  
  292. }
  293.  
  294. BOOL CCommandSink::BootAlMail(LPCTSTR lpFilePath)
  295. {
  296.     CString csCmdLine=m_csAlMailPath;
  297.     csCmdLine +=_T(" /file:\"");
  298.     csCmdLine +=lpFilePath;
  299.     csCmdLine +=_T("\""); 
  300.  
  301.    STARTUPINFO si = {0};
  302.    PROCESS_INFORMATION pi = {0};
  303.  
  304.     si.lpReserved = NULL;
  305.     si.lpReserved2 = NULL;
  306.     si.cbReserved2 = 0;
  307.     si.lpDesktop = NULL;
  308.     si.dwFlags = 0;
  309.  
  310.     if(!CreateProcess( NULL,  csCmdLine.GetBuffer(csCmdLine.GetLength()+1),
  311.         NULL,  NULL,
  312.         FALSE, 
  313.         NORMAL_PRIORITY_CLASS,
  314.         NULL, NULL,
  315.         &si,  &pi )){
  316.  
  317.         MessageBox(NULL, "Al-Mailの起動に失敗しました。もう一度パスを入力してください。", AfxGetAppName(), MB_OK); 
  318.         return FALSE;
  319.  
  320.     }
  321.  
  322.     WaitForInputIdle(pi.hProcess,INFINITE);
  323.     CloseHandle(pi.hProcess);
  324.     return TRUE;
  325.  
  326. }
  327.  
  328.  
  329.  
  330.