2025-11-27 16:46:48 +09:00

143 lines
3.2 KiB
C++

// SendDataDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Communicator.h"
#include "SendDataDlg.h"
#include "OXBlob.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSendDataDlg dialog
CSendDataDlg::CSendDataDlg(COXCommMsg* pCommMsg, CWnd* pParent /*=NULL*/)
:
CDialog(CSendDataDlg::IDD, pParent),
m_pCommMsg(pCommMsg)
{
//{{AFX_DATA_INIT(CSendDataDlg)
m_sValue = _T("");
m_nType = 9;
//}}AFX_DATA_INIT
}
void CSendDataDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSendDataDlg)
DDX_Control(pDX, IDC_BROWSE, m_wndBrowse);
DDX_Control(pDX, IDC_LIST, m_wndList);
DDX_Text(pDX, IDC_VALUE, m_sValue);
DDX_Radio(pDX, IDC_EMPTY, m_nType);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSendDataDlg, CDialog)
//{{AFX_MSG_MAP(CSendDataDlg)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSendDataDlg message handlers
void CSendDataDlg::OnAdd()
{
UINT nOleType = 0;
COXVariant oleVariant;
BOOL bSuccess = FALSE;
CString sValue;
UpdateData(TRUE);
ASSERT((0 <= m_nType) && (m_nType < COXCommMsg::m_nArgumentTypesCount));
nOleType = COXCommMsg::m_types[m_nType];
// Assign as string and then let OLE convert it
oleVariant = m_sValue;
long nFileLength = 0;
TRY
{
if (nOleType == COXCommMsg::ATBlob)
{
COXBlob blob;
bSuccess = blob.ReadRaw(m_sValue);
nFileLength = blob.GetSize();
oleVariant = blob;
}
else if (nOleType != COXCommMsg::ATError)
{
oleVariant.ChangeType((VARTYPE)nOleType);
bSuccess = TRUE;
}
else
{
// Conversions to and from VT_ERROR is not available from OLE
// Use a VT_I4 instead
oleVariant.ChangeType(COXCommMsg::ATI4);
// ... Variant is a union, just change the type
// oleVariant.scode = oleVariant.lVal;
V_VT(&oleVariant) = (VARTYPE)nOleType;
bSuccess = TRUE;
}
}
END_TRY
if (bSuccess)
{
m_pCommMsg->Add(oleVariant);
// Convert back to string to visualize
CString sText;
TRY
{
if (nOleType == COXCommMsg::ATBlob)
sText.Format(_T("<binary of length %i>"), nFileLength);
else
{
if (V_VT(&oleVariant) == COXCommMsg::ATError)
// ... Variant is a union, just change the type
// oleVariant.lVal= oleVariant.scode ;
V_VT(&oleVariant) = COXCommMsg::ATI4;
oleVariant.ChangeType(COXCommMsg::ATStr);
sText = V_BSTR(&oleVariant);
}
}
END_TRY
sValue.Format(_T("%i. (%s) %s"),
m_wndList.GetCount() + 1,
(LPCTSTR)COXCommMsg::m_typeNames[m_nType],
(LPCTSTR)sText);
m_wndList.AddString(sValue);
m_wndList.SetTopIndex(m_wndList.GetCount() - 1);
}
else
{
AfxMessageBox(IDS_INVALID_VALUE, MB_ICONEXCLAMATION);
}
}
void CSendDataDlg::OnBrowse()
{
UpdateData(TRUE);
static TCHAR szFilter[] = _T("All Files (*.*) | *.* ||");
CFileDialog fileDlg(TRUE, NULL, _T("*.*"), NULL, szFilter);
if (fileDlg.DoModal() == IDOK)
{
m_sValue = fileDlg.GetPathName();
// ... Set to Blob type by default
m_nType = 12;
UpdateData(FALSE);
}
}