// SiaDriveDlg.cpp : implementation file // #include "stdafx.h" #include "SiaDriveApp.h" #include "SiaDriveDlg.h" #include "afxdialogex.h" #include #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(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(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& node) { CComPtr elem; return GetDomElementAndNodeById(id, node, elem); } HRESULT CSiaDriveDlg::GetDomElementAndNodeById(const CString& id, CComPtr& node, CComPtr& elem) { HRESULT hr; if (SUCCEEDED((hr = GetElement(id, &elem)))) { hr = elem->QueryInterface(IID_IHTMLDOMNode, reinterpret_cast(&node)); } return hr; } void CSiaDriveDlg::DisplayCreateWallet() { CComPtr mainNode; if (SUCCEEDED(GetDomElementById(L"main_window", mainNode))) { CComPtr div; CComPtr walletCreateNode; if (SUCCEEDED(GetDomElementAndNodeById(L"create_wallet", walletCreateNode, div))) { CComPtr parent; if (SUCCEEDED(walletCreateNode->get_parentNode(&parent))) { CComPtr removedNode; if (SUCCEEDED(parent->removeChild(walletCreateNode, &removedNode))) { CComPtr appendedNode; if (SUCCEEDED(mainNode->appendChild(removedNode, &appendedNode))) { CComPtr style; if (SUCCEEDED(div->get_style(&style))) { style->put_display(L"block"); } } } } } } } void CSiaDriveDlg::RemoveElementById(const String& id) { CComPtr element; if (SUCCEEDED(GetDomElementById(id.c_str(), element))) { CComPtr parent; if (SUCCEEDED(element->get_parentNode(&parent))) { CComPtr 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 mainNode; if (SUCCEEDED(GetDomElementById(L"main_window", mainNode))) { CComPtr div; CComPtr dispWalletSeedNode; if (SUCCEEDED(GetDomElementAndNodeById(L"disp_wallet_seed", dispWalletSeedNode, div))) { CComPtr parent; if (SUCCEEDED(dispWalletSeedNode->get_parentNode(&parent))) { CComPtr removedNode; if (SUCCEEDED(parent->removeChild(dispWalletSeedNode, &removedNode))) { CComPtr child; if (SUCCEEDED(mainNode->get_firstChild(&child))) { CComPtr removed; if (SUCCEEDED(mainNode->removeChild(child, &removed))) { CComPtr appendedNode; if (SUCCEEDED(mainNode->appendChild(removedNode, &appendedNode))) { _walletCreatedSeed = seed.c_str(); UpdateData(FALSE); CComPtr 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; }