1
0
This repository has been archived on 2025-07-27. You can view files and clone it, but cannot push or open issues or pull requests.
Files
siadrive/SiaDrive/SiaDriveDlg.cpp
Scott E. Graves 4059be4ff1 Home test
2017-02-08 21:26:32 -06:00

454 lines
10 KiB
C++

// SiaDriveDlg.cpp : implementation file
//
#include "stdafx.h"
#include "SiaDriveApp.h"
#include "SiaDriveDlg.h"
#include "afxdialogex.h"
#include <stdbool.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
/* Home Test
whipped wizard hefty avatar gnome knuckle uptight jury ruling evenings urchins visited dating pioneer offend trying oyster setup maximum library mayor yearbook keep voyage excess bifocals kettle gutter aces
*/
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// Dialog Data
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CSiaDriveDlg dialog
BEGIN_DHTML_EVENT_MAP(CSiaDriveDlg)
DHTML_EVENT_ONCLICK(_T("ButtonOK"), OnButtonOK)
DHTML_EVENT_ONCLICK(_T("ButtonCancel"), OnButtonCancel)
DHTML_EVENT_ONCLICK(_T("CreateWalletButton"), OnButtonCreateWallet)
DHTML_EVENT_ONCLICK(_T("ConfirmSeedButton"), OnButtonConfirmSeed)
END_DHTML_EVENT_MAP()
CSiaDriveDlg::CSiaDriveDlg(CWnd* pParent /*=NULL*/)
: CDHtmlDialog(IDD_SIADRIVE_DIALOG, IDR_HTML_SIADRIVE_DIALOG, pParent),
_siaApi({L"localhost", 9980, L"1.1.0"})
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSiaDriveDlg::DoDataExchange(CDataExchange* pDX)
{
CDHtmlDialog::DoDataExchange(pDX);
DDX_DHtml_ElementInnerText(pDX, _T("ServerVersion"), _serverVersion);
DDX_DHtml_ElementInnerText(pDX, _T("ClientVersion"), _clientVersion);
DDX_DHtml_ElementInnerText(pDX, _T("WalletBalanceTotal"), _walletBalanceTotal);
DDX_DHtml_ElementInnerText(pDX, _T("WalletBalanceConfirmed"), _walletBalanceConfirmed);
DDX_DHtml_ElementInnerText(pDX, _T("WalletBalanceUnconfirmed"), _walletBalanceUnconfirmed);
DDX_DHtml_ElementInnerText(pDX, _T("WalletCreatedSeed"), _walletCreatedSeed);
}
BEGIN_MESSAGE_MAP(CSiaDriveDlg, CDHtmlDialog)
ON_WM_SYSCOMMAND()
ON_WM_TIMER()
END_MESSAGE_MAP()
// CSiaDriveDlg message handlers
BOOL CSiaDriveDlg::OnInitDialog()
{
CDHtmlDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
return TRUE; // return TRUE unless you set the focus to a control
}
void CSiaDriveDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDHtmlDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CSiaDriveDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDHtmlDialog::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CSiaDriveDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
HRESULT CSiaDriveDlg::OnButtonOK(IHTMLElement* /*pElement*/)
{
OnOK();
return S_OK;
}
HRESULT CSiaDriveDlg::OnButtonCancel(IHTMLElement* /*pElement*/)
{
OnCancel();
return S_OK;
}
HRESULT CSiaDriveDlg::OnButtonConfirmSeed(IHTMLElement* /*pElement*/)
{
_seedCreation = false;
_walletCreatedSeed = L"";
UpdateData(FALSE);
this->Navigate(this->m_strCurrentUrl);
return S_OK;
}
BOOL CSiaDriveDlg::PreTranslateMessage(MSG* pMsg)
{
//TODO: Implement copy/paste context menu
if ((pMsg->message == WM_RBUTTONDOWN) || (pMsg->message == WM_RBUTTONDBLCLK))
{
return TRUE;
}
return CDHtmlDialog::PreTranslateMessage(pMsg);
}
bool IsRefreshKeyMessage(const MSG *message)
{
return message
&& (message->message == WM_KEYUP)
&& (message->wParam == VK_F5);
}
HRESULT CSiaDriveDlg::TranslateAccelerator(MSG *message, const GUID * guid, DWORD dw)
{
return IsRefreshKeyMessage(message) ? E_FAIL : CDHtmlDialog::TranslateAccelerator(message, guid, dw);
}
void CSiaDriveDlg::OnDocumentComplete(LPDISPATCH, LPCTSTR)
{
KillTimer(IDT_UPDATE);
_serverVersion = L"x.x.x";
_clientVersion = L"1.0.0";
_walletBalanceConfirmed = L"";
_walletBalanceUnconfirmed = L"";
_walletBalanceTotal = L"";
UpdateData(FALSE);
if ((_connected = UpdateUi(false)))
{
switch (_siaConfig.GetUI_Main_TabIndex())
{
case WALLET_TAB:
{
DisplayWalletTab();
}
break;
}
}
SetTimer(IDT_UPDATE, 2000, nullptr);
}
void CSiaDriveDlg::OnTimer(UINT_PTR nIDEvent)
{
switch (nIDEvent)
{
case IDT_UPDATE:
{
UpdateUi();
}
break;
}
}
bool CSiaDriveDlg::DisplaySiaInfo()
{
_serverVersion = _siaApi.GetServerVersion().c_str();
if (_serverVersion)
{
SiaCurrency confirmed;
if (API_SUCCESS(SiaApiError, _siaApi.GetWallet()->GetConfirmedBalance(confirmed)))
{
SiaCurrency unconfirmed;
if (API_SUCCESS(SiaApiError, _siaApi.GetWallet()->GetUnonfirmedBalance(unconfirmed)))
{
SiaCurrency total = confirmed + unconfirmed;
_walletBalanceConfirmed = SiaCurrencyToString(confirmed).c_str();
_walletBalanceUnconfirmed = SiaCurrencyToString(unconfirmed).c_str();
_walletBalanceTotal = SiaCurrencyToString(total).c_str();
return true;
}
}
}
_serverVersion = L"x.x.x";
_walletBalanceConfirmed = _walletBalanceUnconfirmed = _walletBalanceTotal = L"";
return false;
}
bool CSiaDriveDlg::UpdateUi(const bool& refresh)
{
bool ret = DisplaySiaInfo();
if (ret)
{
if (_connected)
{
UpdateData(FALSE);
}
else if (!_seedCreation)
{
KillTimer(IDT_UPDATE);
this->Navigate(this->m_strCurrentUrl);
}
}
else if (refresh && !_seedCreation)
{
_connected = false;
KillTimer(IDT_UPDATE);
this->Navigate(this->m_strCurrentUrl);
}
return ret;
}
HRESULT CSiaDriveDlg::GetDomElementById(const CString& id, CComPtr<IHTMLDOMNode>& node)
{
CComPtr<IHTMLElement> elem;
return GetDomElementAndNodeById(id, node, elem);
}
HRESULT CSiaDriveDlg::GetDomElementAndNodeById(const CString& id, CComPtr<IHTMLDOMNode>& node, CComPtr<IHTMLElement>& elem)
{
HRESULT hr;
if (SUCCEEDED((hr = GetElement(id, &elem))))
{
hr = elem->QueryInterface(IID_IHTMLDOMNode, reinterpret_cast<void**>(&node));
}
return hr;
}
void CSiaDriveDlg::DisplayCreateWallet()
{
CComPtr<IHTMLDOMNode> mainNode;
if (SUCCEEDED(GetDomElementById(L"main_window", mainNode)))
{
CComPtr<IHTMLElement> div;
CComPtr<IHTMLDOMNode> walletCreateNode;
if (SUCCEEDED(GetDomElementAndNodeById(L"create_wallet", walletCreateNode, div)))
{
CComPtr<IHTMLDOMNode> parent;
if (SUCCEEDED(walletCreateNode->get_parentNode(&parent)))
{
CComPtr<IHTMLDOMNode> removedNode;
if (SUCCEEDED(parent->removeChild(walletCreateNode, &removedNode)))
{
CComPtr<IHTMLDOMNode> appendedNode;
if (SUCCEEDED(mainNode->appendChild(removedNode, &appendedNode)))
{
CComPtr<IHTMLStyle> style;
if (SUCCEEDED(div->get_style(&style)))
{
style->put_display(L"block");
}
}
}
}
}
}
}
void CSiaDriveDlg::RemoveElementById(const String& id)
{
CComPtr<IHTMLDOMNode> element;
if (SUCCEEDED(GetDomElementById(id.c_str(), element)))
{
CComPtr<IHTMLDOMNode> parent;
if (SUCCEEDED(element->get_parentNode(&parent)))
{
CComPtr<IHTMLDOMNode> removed;
parent->removeChild(element, &removed);
}
}
}
void CSiaDriveDlg::ClearCreateElements()
{
RemoveElementById(L"create_wallet");
RemoveElementById(L"disp_wallet_seed");
}
void CSiaDriveDlg::DisplayWalletTab()
{
if (_siaApi.GetWallet()->GetCreated())
{
ClearCreateElements();
if (_siaApi.GetWallet()->GetLocked())
{
DisplayUnlockWallet();
}
else
{
}
}
else
{
DisplayCreateWallet();
}
}
void CSiaDriveDlg::DisplaySeedCreated(const String& seed)
{
CComPtr<IHTMLDOMNode> mainNode;
if (SUCCEEDED(GetDomElementById(L"main_window", mainNode)))
{
CComPtr<IHTMLElement> div;
CComPtr<IHTMLDOMNode> dispWalletSeedNode;
if (SUCCEEDED(GetDomElementAndNodeById(L"disp_wallet_seed", dispWalletSeedNode, div)))
{
CComPtr<IHTMLDOMNode> parent;
if (SUCCEEDED(dispWalletSeedNode->get_parentNode(&parent)))
{
CComPtr<IHTMLDOMNode> removedNode;
if (SUCCEEDED(parent->removeChild(dispWalletSeedNode, &removedNode)))
{
CComPtr<IHTMLDOMNode> child;
if (SUCCEEDED(mainNode->get_firstChild(&child)))
{
CComPtr<IHTMLDOMNode> removed;
if (SUCCEEDED(mainNode->removeChild(child, &removed)))
{
CComPtr<IHTMLDOMNode> appendedNode;
if (SUCCEEDED(mainNode->appendChild(removedNode, &appendedNode)))
{
_walletCreatedSeed = seed.c_str();
UpdateData(FALSE);
CComPtr<IHTMLStyle> style;
if (SUCCEEDED(div->get_style(&style)))
{
style->put_display(L"block");
}
}
}
}
}
}
}
}
}
void CSiaDriveDlg::DisplayUnlockWallet()
{
}
HRESULT CSiaDriveDlg::OnButtonCreateWallet(IHTMLElement* pElement)
{
if (!_seedCreation)
{
_seedCreation = true;
KillTimer(IDT_UPDATE);
String seed;
if (API_SUCCESS(SiaApiError, _siaApi.GetWallet()->Create(SiaSeedLanguage::English, seed)))
{
DisplaySeedCreated(seed);
}
}
return S_OK;
}