/* **********************************************************
 * Copyright (c) 2008 VMware, Inc.  All rights reserved.
 * **********************************************************/

/*
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * * Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 * * Neither the name of VMware, Inc. nor the names of its contributors may be
 *   used to endorse or promote products derived from this software without
 *   specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */

/* Copyright (c) 2003-2007 Determina Corp. */
/* Copyright (c) 2002-2003 Massachusetts Institute of Technology */
/* Copyright (c) 2002 Hewlett-Packard Company */

// LicenseDlg.cpp : implementation file
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.

#include "stdafx.h"
#include "Wizard.h"
#include "LicenseDlg.h"
#include <assert.h>

#ifdef _DEBUG
#    define new DEBUG_NEW
#    undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/* This text is verbatim from the modified PRBA provided by David Howard 4/2/08 */
static TCHAR LICENSE[] =
    _T("")
    _T("NOTICE: BY DOWNLOADING AND INSTALLING, COPYING OR OTHERWISE USING \r\n")
    _T("THE INTERFACES, SOFTWARE AND OTHER MATERIALS ON THIS CD, YOU \r\n")
    _T("AGREE TO BE BOUND BY THE TERMS OF THIS AGREEMENT.  IF YOU DO NOT \r\n")
    _T("AGREE TO THE TERMS OF THIS EULA, YOU MAY NOT DOWNLOAD, INSTALL, \r\n")
    _T("COPY OR USE THE INTERFACES, SOFTWARE OR OTHER MATERIALS ON THIS \r\n")
    _T("CD. \"YOU\" MEANS THE NATURAL PERSON OR THE ENTITY THAT IS \r\n")
    _T("AGREEING TO BE BOUND BY THIS EULA, THEIR EMPLOYEES AND THIRD \r\n")
    _T("PARTY CONTRACTORS THAT PROVIDE SERVICES TO YOU. YOU SHALL BE \r\n")
    _T("LIABLE FOR ANY FAILURE BY SUCH EMPLOYEES AND THIRD PARTY \r\n")
    _T("CONTRACTORS TO COMPLY WITH THE TERMS OF THIS AGREEMENT. \r\n")
    _T("  \r\n")
    _T("1. DEFINITIONS. \r\n")
    _T(" \r\n")
    _T("(a) \"Software\" shall mean the VMware software, in object code only, as set ")
    _T("\r\n")
    _T("forth in Exhibit A attached hereto. \r\n")
    _T(" \r\n")
    _T("(b) \"Documentation\" shall mean the printed or online written reference \r\n")
    _T("material, if any, that may be furnished to Licensee in conjunction with the \r\n")
    _T("Software, including, without limitation, instructions, testing guidelines, \r\n")
    _T("and end user guides. \r\n")
    _T(" \r\n")
    _T("(c) \"Intellectual Property Rights\" shall mean all intellectual property \r\n")
    _T("rights, including, without limitation, patent, copyright, trademark, and \r\n")
    _T("trade secret. \r\n")
    _T(" \r\n")
    _T("(d) \"Open Source Software\" shall mean various open source software \r\n")
    _T("components provided with the Software that are licensed to Licensee under \r\n")
    _T("the terms of the applicable license agreements included with such open \r\n")
    _T("source software components or other materials for the Software. \r\n")
    _T(" \r\n")
    _T("(e) \"Update(s)\" shall mean any modification, error correction, bug fix, \r\n")
    _T("patch or other update to or for the Software. \r\n")
    _T(" \r\n")
    _T("2. LICENSE GRANT, USE AND OWNERSHIP \r\n")
    _T(" \r\n")
    _T("(a) License.  Subject to the terms and conditions of this Agreement, VMware \r\n")
    _T("grants to Licensee a non-exclusive, revocable, non-transferable license \r\n")
    _T("(without the right to sublicense) to use the Software and Documentation \r\n")
    _T("solely for purposes of internal testing and evaluation, as well as \r\n")
    _T("development of Licensee products that communicate with the Software. \r\n")
    _T(" \r\n")
    _T("(b) Feedback. The purpose of this license is the internal testing and \r\n")
    _T("evaluation of the Software by Licensee and development by Licensee of \r\n")
    _T("Licensee products that communicate with the Software.  In furtherance of \r\n")
    _T("this purpose, Licensee shall from time to time provide feedback to VMware \r\n")
    _T("concerning the functionality and performance of the Software including, \r\n")
    _T("without limitation, identifying potential errors and improvements. \r\n")
    _T("Notwithstanding the foregoing, prior to Licensee disclosing to VMware any \r\n")
    _T("information in connection with this Agreement which Licensee considers \r\n")
    _T("proprietary or confidential, Licensee shall obtain VMware's prior written \r\n")
    _T("approval to disclose such information to VMware, and without such prior \r\n")
    _T("written approval from VMware, Licensee shall not disclose any such \r\n")
    _T("information to VMware.  Feedback and other information which is provided by \r\n")
    _T("Licensee to VMware in connection with the Software, Documentation, or this \r\n")
    _T("Agreement may be used by VMware to improve or enhance its products and, \r\n")
    _T("accordingly, VMware shall have a non-exclusive, perpetual, irrevocable, \r\n")
    _T("royalty-free, worldwide right and license to use, reproduce, disclose, \r\n")
    _T("sublicense, modify, make, have made, distribute, sell, offer for sale, \r\n")
    _T("display, perform, create derivative works, permit unmodified binary \r\n")
    _T("distribution and otherwise exploit such feedback and information without \r\n")
    _T("restriction. \r\n")
    _T(" \r\n")
    _T("(c) Restrictions.  Licensee shall not copy or use the Software (including \r\n")
    _T("the Documentation) or disseminate Confidential Information, as defined \r\n")
    _T("below, to any third party except as expressly permitted in this Agreement. \r\n")
    _T("Licensee will not, and will not permit any third party to, sublicense, \r\n")
    _T("rent, copy, modify, create derivative works of, translate, reverse \r\n")
    _T("engineer, decompile, disassemble, or otherwise reduce to human perceivable \r\n")
    _T("form any portion of the Software or Documentation.  In no event shall \r\n")
    _T("Licensee use the Software or Documentation for any commercial purpose \r\n")
    _T("except as expressly set forth in this Agreement.  The Software, \r\n")
    _T("Documentation, and all performance data and test results, including without \r\n")
    _T("limitation, benchmark test results (collectively \"Performance Data\"), \r\n")
    _T("relating to the Software are the Confidential Information of VMware, and \r\n")
    _T("will be treated in accordance with the terms of Section 4 of this \r\n")
    _T("Agreement.  Accordingly, Licensee shall not publish or disclose to any \r\n")
    _T("third party any Performance Data relating to the Software.  Licensee shall \r\n")
    _T("immediately cease all use of the Software and Documentation, upon notice \r\n")
    _T("from VMware. \r\n")
    _T(" \r\n")
    _T("(d) Ownership.  VMware shall own and retain all right, title and interest \r\n")
    _T("in and to the Intellectual Property Rights in the Software, Documentation, \r\n")
    _T("and any derivative works thereof, subject only to the license expressly set \r\n")
    _T("forth in Section 2(a) hereof.  Licensee does not acquire any other rights, \r\n")
    _T("express or implied, in the Software or Documentation.  VMWARE RESERVES ALL \r\n")
    _T("RIGHTS NOT EXPRESSLY GRANTED HEREUNDER. \r\n")
    _T(" \r\n")
    _T("(e) No Support Services.  VMware is under no obligation to support the \r\n")
    _T("Software in any way or to provide any Updates to Licensee.  In the event \r\n")
    _T("VMware, in its sole discretion, supplies any Update to Licensee, such \r\n")
    _T("Update shall be deemed Software hereunder and shall be subject to the terms \r\n")
    _T("and conditions of this Agreement. Upon VMware's release of any Update, \r\n")
    _T("Licensee shall immediately cease all use of the former version of the \r\n")
    _T("Software. \r\n")
    _T(" \r\n")
    _T("(f) Third-Party Software.  The Software enables a computer to run multiple \r\n")
    _T("instances of third-party guest operating systems and application programs. \r\n")
    _T("Licensee acknowledges that Licensee is responsible for obtaining any \r\n")
    _T("licenses necessary to operate any such third-party software, including \r\n")
    _T("guest operating systems. \r\n")
    _T(" \r\n")
    _T("(g) Open Source Software.  The terms and conditions of this Agreement shall \r\n")
    _T("not apply to any Open Source Software accompanying the Software.  Any such \r\n")
    _T("Open Source Software is provided under the terms of the open source license \r\n")
    _T("agreement or copyright notice accompanying such Open Source Software or in \r\n")
    _T("the open source licenses file accompanying the Software. \r\n")
    _T(" \r\n")
    _T("(h) Demonstration. Subject to the terms and conditions of this Agreement, \r\n")
    _T("VMware grants to Licensee a non-exclusive, revocable, non-transferable \r\n")
    _T("license (without the right to sublicense) to use the Software for \r\n")
    _T("demonstration to third parties, provided Licensee (i) has received prior \r\n")
    _T("written authorization from VMware for same, (ii) has had such third parties \r\n")
    _T("first sign a confidentiality agreement that contains nondisclosure \r\n")
    _T("restrictions substantially similar to those set forth in this Agreement, \r\n")
    _T("(iii) includes in such confidentiality agreement an acknowledgement that \r\n")
    _T("VMware does not promise or guarantee that features, functionality and/or \r\n")
    _T("modules in the Software will be included in any generally available version \r\n")
    _T("of the Software, or will be marketed separately for additional fees, and \r\n")
    _T("(iv) conducts such demonstration solely on Licensee's hardware and such \r\n")
    _T("hardware remains at all times in Licensee's possession and control. \r\n")
    _T(" \r\n")
    _T("3. TERM AND TERMINATION. This Agreement is effective as of the Effective \r\n")
    _T("Date and will continue for a one (1) year period (\"Initial Term\"), unless \r\n")
    _T("amended to establish a later expiration date (\"Subsequent Term\") by a \r\n")
    _T("written agreement signed by both parties, or until terminated as provided \r\n")
    _T("in this Agreement.  Either party may terminate this Agreement at any time \r\n")
    _T("for any reason or no reason by providing the other party advance written \r\n")
    _T("notice thereof.  Upon any expiration or termination of this Agreement, the \r\n")
    _T("rights and licenses granted to Licensee under this Agreement shall \r\n")
    _T("immediately terminate, and Licensee shall immediately cease using, and will \r\n")
    _T("return to VMware (or, at VMware's request, destroy), the Software, \r\n")
    _T("Documentation and all other tangible items in Licensee's possession or \r\n")
    _T("control that are proprietary to or contain Confidential Information.  The \r\n")
    _T("rights and obligations of the parties set forth in Sections 1, 2(b) 2(c), \r\n")
    _T("2(d), 2(e), 3, 4, 5, 6 and 7 shall survive termination or expiration of \r\n")
    _T("this Agreement for any reason. \r\n")
    _T(" \r\n")
    _T("4. CONFIDENTIALITY. \"Confidential Information\" shall mean all trade \r\n")
    _T("secrets, know-how, inventions, techniques, processes, algorithms, software \r\n")
    _T("programs, hardware, schematics, planned product features, functionality, \r\n")
    _T("methodology, performance and software source documents relating to the \r\n")
    _T("Software, and other information provided by VMware, whether disclosed \r\n")
    _T("orally, in writing, or by examination or inspection, other than information \r\n")
    _T("which Licensee can demonstrate (i) was already known to Licensee, other \r\n")
    _T("than under an obligation of confidentiality, at the time of disclosure; \r\n")
    _T("(ii) was generally available in the public domain at the time of disclosure \r\n")
    _T("to Licensee; (iii) became generally available in the public domain after \r\n")
    _T("disclosure other than through any act or omission of Licensee; (iv) was \r\n")
    _T("subsequently lawfully disclosed to Licensee by a third party without any \r\n")
    _T("obligation of confidentiality; or (v) was independently developed by \r\n")
    _T("Licensee without use of or reference to any information or materials \r\n")
    _T("disclosed by VMware or its suppliers.  Confidential Information shall \r\n")
    _T("include without limitation the Software, Documentation, Performance Data, \r\n")
    _T("any Updates, information relating to VMware products, product roadmaps, and \r\n")
    _T("other technical, business, financial and product development plans, \r\n")
    _T("forecasts and strategies.  Licensee shall not use any Confidential \r\n")
    _T("Information for any purpose other than as expressly authorized under this \r\n")
    _T("Agreement.  Except as otherwise set forth in this Agreement, in no event \r\n")
    _T("shall Licensee use the Software, Documentation or any other Confidential \r\n")
    _T("Information to develop, manufacture, market, sell, or distribute any \r\n")
    _T("product or service.  Licensee shall limit dissemination of Confidential \r\n")
    _T("Information to its employees who have a need to know such Confidential \r\n")
    _T("Information for purposes expressly authorized under this Agreement.  Except \r\n")
    _T("as otherwise set forth in this Agreement, in no event shall Licensee \r\n")
    _T("disclose any Confidential Information to any third party. Without limiting \r\n")
    _T("the foregoing, Licensee shall use at least the same degree of care that it \r\n")
    _T("uses to prevent the disclosure of its own confidential information of like \r\n")
    _T("importance, but in no event less than reasonable care, to prevent the \r\n")
    _T("disclosure of Confidential Information. \r\n")
    _T(" \r\n")
    _T("5. LIMITATION OF LIABILITY.  IT IS UNDERSTOOD THAT THE SOFTWARE, \r\n")
    _T("DOCUMENTATION AND ANY UPDATES ARE PROVIDED WITHOUT CHARGE FOR THE \r\n")
    _T("PURPOSES OF THIS AGREEMENT ONLY.  ACCORDINGLY, THE TOTAL \r\n")
    _T("LIABILITY OF VMWARE AND ITS SUPPLIERS ARISING OUT OF OR RELATED \r\n")
    _T("TO THIS AGREEMENT SHALL NOT EXCEED $100.  IN NO EVENT SHALL \r\n")
    _T("VMWARE OR ITS SUPPLIERS HAVE LIABILITY FOR ANY INDIRECT, \r\n")
    _T("INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES (INCLUDING, WITHOUT \r\n")
    _T("LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS \r\n")
    _T("INTERRUPTION, OR LOSS OF BUSINESS INFORMATION), HOWEVER CAUSED \r\n")
    _T("AND ON ANY THEORY OF LIABILITY, EVEN IF VMWARE OR ITS SUPPLIERS \r\n")
    _T("HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.  THESE \r\n")
    _T("LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL \r\n")
    _T("PURPOSE OF ANY LIMITED REMEDY. \r\n")
    _T(" \r\n")
    _T("6. WARRANTY DISCLAIMER.  IT IS UNDERSTOOD THAT THE SOFTWARE, \r\n")
    _T("DOCUMENTATION, AND ANY UPDATES MAY CONTAIN ERRORS AND ARE \r\n")
    _T("PROVIDED FOR THE PURPOSES OF THIS AGREEMENT ONLY.  THE SOFTWARE, \r\n")
    _T("DOCUMENTATION, AND ANY UPDATES ARE PROVIDED \"AS IS\" WITHOUT \r\n")
    _T("WARRANTY OF ANY KIND, WHETHER EXPRESS, IMPLIED, STATUTORY, OR \r\n")
    _T("OTHERWISE. VMWARE AND ITS SUPPLIERS SPECIFICALLY DISCLAIM ALL \r\n")
    _T("IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, AND \r\n")
    _T("FITNESS FOR A PARTICULAR PURPOSE.  \r\n")
    _T("Licensee acknowledges that VMware has not publicly \r\n")
    _T("announced the availability of the Software and/or Documentation, that \r\n")
    _T("VMware has not promised or guaranteed to Licensee that such Software and/or \r\n")
    _T("Documentation will be announced or made available to anyone in the future, \r\n")
    _T("that VMware has no express or implied obligation to Licensee to announce or \r\n")
    _T("introduce the Software and/or Documentation, and that VMware may not \r\n")
    _T("introduce a product similar or compatible with the Software and/or \r\n")
    _T("Documentation. Accordingly, Licensee acknowledges that any research or \r\n")
    _T("development that it performs regarding the Software or any product \r\n")
    _T("associated with the Software is done entirely at Licensee's own risk. \r\n")
    _T("Specifically, the Software may contain features, functionality or modules \r\n")
    _T("that may not be included in the generally available version of the Software \r\n")
    _T("and/or Documentation, or that may be marketed separately for additional \r\n")
    _T("fees. \r\n")
    _T(" \r\n")
    _T("7. OTHER PROVISIONS \r\n")
    _T(" \r\n")
    _T("(a) Governing Law.  This Agreement, and all disputes arising out of or \r\n")
    _T("related thereto, shall be governed by and construed under the laws of the \r\n")
    _T("State of California without reference to conflict of laws principles.  All \r\n")
    _T("such disputes shall be subject to the exclusive jurisdiction of the state \r\n")
    _T("and federal courts located in Santa Clara County, California, and the \r\n")
    _T("parties agree and submit to the personal and exclusive jurisdiction and \r\n")
    _T("venue of these courts. \r\n")
    _T(" \r\n")
    _T("(b) Assignment.  Licensee shall not assign this Agreement or any rights or \r\n")
    _T("obligations hereunder, directly or indirectly, by operation of law, merger, \r\n")
    _T("acquisition of stock or assets, or otherwise, without the prior written \r\n")
    _T("consent of VMware.  Subject to the foregoing, this Agreement shall inure to \r\n")
    _T("the benefit of and be binding upon the parties and their respective \r\n")
    _T("successors and permitted assigns. \r\n")
    _T(" \r\n")
    _T("(c) Export Regulations.  Licensee understands that VMware is subject to \r\n")
    _T("regulation by the U.S. government and its agencies, which prohibit export \r\n")
    _T("or diversion of certain technical products and information to certain \r\n")
    _T("countries and individuals.  Licensee warrants that it will comply in all \r\n")
    _T("respects with all export and re-export restrictions applicable to the \r\n")
    _T("technology and documentation provided hereunder. \r\n")
    _T(" \r\n")
    _T("(d) Entire Agreement.  This is the entire agreement between the parties \r\n")
    _T("relating to the subject matter hereof and all other terms are rejected. \r\n")
    _T("This Agreement supersedes all previous communications, representations, \r\n")
    _T("understandings and agreements, either oral or written, between the parties \r\n")
    _T("with respect to said subject matter.  The terms of this Agreement supersede \r\n")
    _T("any VMware end user license agreement that may accompany the Software \r\n")
    _T("and/or Documentation.  No waiver or modification of this Agreement shall be \r\n")
    _T("valid unless made in a writing signed by both parties.  The waiver of a \r\n")
    _T("breach of any term hereof shall in no way be construed as a waiver of any \r\n")
    _T("term or other breach hereof.  If any provision of this Agreement is held by \r\n")
    _T("a court of competent jurisdiction to be contrary to law the remaining \r\n")
    _T("provisions of this Agreement shall remain in full force and effect. \r\n")
    _T(" \r\n")
    _T("(e) Notices. All notices must be sent by (a) registered or certified mail, \r\n")
    _T("return receipt requested, (b) reputable overnight air courier, (c) \r\n")
    _T("facsimile with a confirmation copy sent by registered or certified mail, \r\n")
    _T("return receipt requested, or (d) served personally.  Notices are effective \r\n")
    _T("immediately when served personally, five (5) days after posting if sent by \r\n")
    _T("registered or certified mail, two (2) days after being sent by overnight \r\n")
    _T("courier, or one (1) day after being transmitted by facsimile.  Notices to \r\n")
    _T("either party shall be directed to the party's address set forth in this \r\n")
    _T("Agreement.  Either party may change its address for notification under this \r\n")
    _T("Agreement, by notifying the other party in accordance with this Section. \r\n")
    _T(" \r\n");

/////////////////////////////////////////////////////////////////////////////
// CLicenseDlg property page

IMPLEMENT_DYNCREATE(CLicenseDlg, CPropertyPage)

CLicenseDlg::CLicenseDlg()
    : CPropertyPage(CLicenseDlg::IDD)
{
    //{{AFX_DATA_INIT(CLicenseDlg)
    m_License = _T("");
    //}}AFX_DATA_INIT
    m_psp.dwFlags |= PSP_HIDEHEADER;
    m_psp.dwFlags &= ~(PSP_HASHELP);
}

CLicenseDlg::~CLicenseDlg()
{
}

void
CLicenseDlg::DoDataExchange(CDataExchange *pDX)
{
    CPropertyPage::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CLicenseDlg)
    DDX_Control(pDX, IDC_LICENSE, m_LicenseEdit);
    DDX_Text(pDX, IDC_LICENSE, m_License);
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CLicenseDlg, CPropertyPage)
//{{AFX_MSG_MAP(CLicenseDlg)
ON_BN_CLICKED(IDC_AGREE, OnAgree)
ON_BN_CLICKED(IDC_DISAGREE, OnDisagree)
ON_BN_CLICKED(IDC_UNDERSTAND, OnUnderstand)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLicenseDlg message handlers

BOOL
CLicenseDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    m_FirstTime = TRUE;

    m_License.Format(_T("%s"), LICENSE);
    m_LicenseEdit.SetSel(0, 0);
    UpdateData(FALSE); // write to screen

    /* I had a hard time setting up the scroll-to-bottom-before-can-accept
     * functionality: I tried using a separate CScrollBar widget, like I ended
     * up doing for the DRstats viewer, and I got that working for scrolling
     * with the mouse (had to manually scroll the license text via LineScroll(),
     * and set the scroll parameters after calculating using a RECT for the
     * CEdit dimensions),
     * but I never was able to intercept keyboard scrolling, even trying:
        ON_WM_KEYUP()
        ON_WM_KEYDOWN()
        ON_EN_UPDATE(IDC_LICENSE, OnUpdateLicense)
     * But I found a hint online that all you have to do is subclass CEdit, so that's
     * what I do now, using LicEdit.
     */

    return TRUE;
}

BOOL
CLicenseDlg::OnSetActive()
{
    if (!CheckWindowsVersion()) {
        CPropertyPage::EndDialog(IDCANCEL);
    }

    CPropertySheet *pSheet = (CPropertySheet *)GetParent();
    ASSERT_KINDOF(CPropertySheet, pSheet);
    if (m_FirstTime) {
        m_FirstTime = FALSE;

        //  Disable everything until the user scrolls the license text
        CButton *radio_all = (CButton *)GetDlgItem(IDC_DISAGREE);
        radio_all->SetCheck(1);
        CButton *understand = (CButton *)GetDlgItem(IDC_UNDERSTAND);
        understand->SetCheck(BST_UNCHECKED);
        OnUnderstand();
        understand->EnableWindow(FALSE);
        pSheet->SetWizardButtons(0);
        UpdateData(FALSE); // write to screen
    } else {
        pSheet->SetWizardButtons(PSWIZB_NEXT);
    }
    return CPropertyPage::OnSetActive();
}

BOOL
CLicenseDlg::CheckWindowsVersion()
{
    // make sure we're on an NT-based system
    TCHAR bad_os[64];
    OSVERSIONINFO version;
    version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    int res = GetVersionEx(&version);
    assert(res != 0);
    if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) {
        // WinNT or descendents: rather than continually update
        // the list of known versions here we assume they're all ok.
        if (version.dwMajorVersion == 4) {
            // Windows NT
        } else {
            // 2K or later
        }
        return TRUE;
    } else if (version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
        /* Win95 or Win98 */
        unsigned ver_high = (version.dwBuildNumber >> 24) & 0xff;
        unsigned ver_low = (version.dwBuildNumber >> 16) & 0xff;
        if (ver_low >= 90 || ver_high >= 5)
            _stprintf(bad_os, _T("Windows ME"));
        else if (ver_low >= 10 && ver_low < 90)
            _stprintf(bad_os, _T("Windows 98"));
        else if (ver_low < 5)
            _stprintf(bad_os, _T("Windows 31 / WfWg"));
        else if (ver_low < 10)
            _stprintf(bad_os, _T("Windows 98"));
        else
            assert(false);
    } else {
        /* Win32S on Windows 3.1 */
        _stprintf(bad_os, _T("Win32s"));
    }
    TCHAR msg[128];
    _stprintf(msg, _T("DynamoRIO does not support %s"), bad_os);
    MessageBox(msg, _T("Fatal Error"), MB_OK | MYMBFLAGS);
    return FALSE;
}

void
CLicenseDlg::OnAgree()
{
    CPropertySheet *pSheet = (CPropertySheet *)GetParent();
    ASSERT_KINDOF(CPropertySheet, pSheet);
    // enable Next
    pSheet->SetWizardButtons(PSWIZB_NEXT);
}

void
CLicenseDlg::OnDisagree()
{
    CPropertySheet *pSheet = (CPropertySheet *)GetParent();
    ASSERT_KINDOF(CPropertySheet, pSheet);
    // disable Next
    pSheet->SetWizardButtons(0);
}

void
CLicenseDlg::OnUnderstand()
{
    CPropertySheet *pSheet = (CPropertySheet *)GetParent();
    ASSERT_KINDOF(CPropertySheet, pSheet);
    CButton *button = (CButton *)GetDlgItem(IDC_UNDERSTAND);
    if (button->GetCheck()) {
        // enable Radio Buttons
        GetDlgItem(IDC_AGREE)->EnableWindow(TRUE);
        GetDlgItem(IDC_DISAGREE)->EnableWindow(TRUE);
    } else {
        // disable Next and Radio Buttons
        pSheet->SetWizardButtons(0);
        // disable Radio Buttons
        GetDlgItem(IDC_AGREE)->EnableWindow(FALSE);
        GetDlgItem(IDC_DISAGREE)->EnableWindow(FALSE);
    }
}

/////////////////////////////////////////////////////////////////////////////
// LicEdit

BEGIN_MESSAGE_MAP(LicEdit, CEdit)
//{{AFX_MSG_MAP(LicEdit)
ON_WM_VSCROLL()
ON_CONTROL_REFLECT(EN_VSCROLL, OnEnVscroll)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void
LicEdit::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar)
{
    // TODO: Add your message handler code here and/or call default
    SCROLLINFO info;
    info.cbSize = sizeof(SCROLLINFO);
    GetScrollInfo(SB_VERT, &info, SIF_RANGE | SIF_POS | SIF_PAGE);

    if (info.nPos + info.nPage > (unsigned int)info.nMax) {
        // If user scrolls to bottom, enable moving on
        GetParent()->GetDlgItem(IDC_UNDERSTAND)->EnableWindow(TRUE);
    }

    CEdit::OnVScroll(nSBCode, nPos, pScrollBar);
}

void
LicEdit::OnEnVscroll()
{
    SCROLLINFO info;
    info.cbSize = sizeof(SCROLLINFO);
    GetScrollInfo(SB_VERT, &info, SIF_RANGE | SIF_POS | SIF_PAGE);

    if (info.nPos + info.nPage > (unsigned int)info.nMax) {
        // If user scrolls to bottom, enable moving on
        GetParent()->GetDlgItem(IDC_UNDERSTAND)->EnableWindow(TRUE);
    }
}