// SiaDriveDlg.cpp : implementation file // #include "stdafx.h" #include "SiaDriveApp.h" #include "SiaDriveDlg.h" #include "afxdialogex.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif // 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; 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; } /* austere teeming factual pause lymph huddle wounded otter poaching tiers roomy arrow stacking howls dozen seeded dented uttered website jaded wipeout giving knife salads jailed calamity legion jabbed ability */ 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::DisplayWalletTab() { if (_siaApi.GetWallet()->GetCreated()) { 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; }