// WebMessagecpp : implementation file
//

#include "stdafx.h"
#include "WebMessage.h"
#include "WebMessageDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CAboutDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:
    //{{AFX_MSG(CAboutDlg)
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
        // No message handlers
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWebMessageDlg dialog

CWebMessageDlg::CWebMessageDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CWebMessageDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CWebMessageDlg)
    m_szMessage = _T("");
    m_szNumber = _T("");
    m_szPassword = _T("gSZJ8R");
    m_szUserName = _T("david.mccabe");
    m_nContact = 0;
    //}}AFX_DATA_INIT

    CString         s;

    s.LoadString(IDS_DEFAULTUSER);
    m_szUserName = AfxGetApp()->GetProfileString("Settings", "UserName", s);
    s.LoadString(IDS_DEFAULTPASS);
    m_szPassword = AfxGetApp()->GetProfileString("Settings", "Password", s);
    s.LoadString(IDS_DEFAULTNUMBER);
    m_szNumber = AfxGetApp()->GetProfileString("Settings", "Number", s);
    
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CWebMessageDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CWebMessageDlg)
    DDX_Control(pDX, IDC_CONTACT, m_pContact);
    DDX_Text(pDX, IDC_MESSAGE, m_szMessage);
    DDX_Text(pDX, IDC_NUMBER, m_szNumber);
    DDX_Text(pDX, IDC_PASSWORD, m_szPassword);
    DDX_Text(pDX, IDC_USERNAME, m_szUserName);
    DDX_CBIndex(pDX, IDC_CONTACT, m_nContact);
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CWebMessageDlg, CDialog)
    //{{AFX_MSG_MAP(CWebMessageDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_EN_CHANGE(IDC_MESSAGE, OnChangeMessage)
    ON_CBN_SELCHANGE(IDC_CONTACT, OnSelchangeContact)
    ON_EN_CHANGE(IDC_NUMBER, OnChangeNumber)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWebMessageDlg message handlers

BOOL CWebMessageDlg::OnInitDialog()
{
    CString s;

    CDialog::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)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        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 applications main window is not a dialog
    SetIcon(m_hIcon, TRUE);         // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
    
    // TODO: Add extra initialization here
    
    GetDlgItem(IDOK)->EnableWindow(FALSE);
    ((CEdit*)GetDlgItem(IDC_MESSAGE))->SetLimitText(120);
    ((CEdit*)GetDlgItem(IDC_NUMBER))->SetLimitText(11);

    m_barStatus.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM, CRect(0, 0, 0, 0), this, 100);
    s.LoadString(IDP_LOADING);
    m_barStatus.SetText(s, 0, 0);

    CWaitCursor c;

    ShowWindow(SW_SHOW);
    UpdateWindow();

    // Get contacts from Outlook
    CLSID clsid;

    if (CLSIDFromProgID(OLESTR("Outlook.Application"), &clsid) != NOERROR)
    {
        AfxMessageBox(IDP_UNABLE_TO_CREATE);
        EndDialog(IDABORT);
        return FALSE;
    }

    // try to get the active Outlook object before creating a new one
    LPUNKNOWN lpUnk;
    LPDISPATCH lpDispatch;
    if (GetActiveObject(clsid, NULL, &lpUnk) == NOERROR)
    {   
        if (lpUnk->QueryInterface(IID_IDispatch, (LPVOID*)&lpDispatch) != NOERROR)
        {   AfxMessageBox(IDP_UNABLE_TO_CREATE);
            EndDialog(IDABORT);
            lpUnk->Release();
            return FALSE;
        }
        lpUnk->Release();
        m_cOutlookApp.AttachDispatch(lpDispatch);
    }
    else
    {   
        COleException   e;
    
        if (!m_cOutlookApp.CreateDispatch(clsid, &e))
        {   AfxMessageBox(IDP_UNABLE_TO_CREATE);
            EndDialog(IDABORT);
            return FALSE;
        }
    }

    lpDispatch = m_cOutlookApp.GetNamespace("MAPI");
    if (!lpDispatch)
    {   AfxMessageBox(IDP_UNABLE_TO_CREATE);
        EndDialog(IDABORT);
        return FALSE;
    }
    m_cNameSpace.AttachDispatch(lpDispatch);

#define olFolderContacts    10

    lpDispatch = m_cNameSpace.GetDefaultFolder(olFolderContacts);
    if (!lpDispatch)
    {   AfxMessageBox(IDP_UNABLE_TO_CREATE);
        EndDialog(IDABORT);
        return FALSE;
    }
    m_cMAPIFolder.AttachDispatch(lpDispatch);

    lpDispatch = m_cMAPIFolder.GetItems();
    if (!lpDispatch)
    {   AfxMessageBox(IDP_UNABLE_TO_CREATE);
        EndDialog(IDABORT);
        return FALSE;
    }
    m_cItems.AttachDispatch(lpDispatch);

    long        i;
    COleVariant var;

    for (i = 1; i <= m_cItems.GetCount(); i++)
    {
        try
        {
            var = i;
            lpDispatch = m_cItems.Item(var);
            if (!lpDispatch)
            {   AfxMessageBox(IDP_UNABLE_TO_CREATE);
                EndDialog(IDABORT);
                return FALSE;
            }
            
            _DContactItem   cContact(lpDispatch);

            s = cContact.GetMobileTelephoneNumber();
            s.TrimLeft();
            if (s.GetLength())                      // any mobile number?
            {   
                s = cContact.GetNickName();
                s.TrimLeft();
                if (!s.GetLength())     // no nick name
                    s = cContact.GetLastNameAndFirstName();
                int n = m_pContact.AddString(s);

                m_pContact.SetItemData(n, i);
            }
        }
        catch(CException *)
        {
        }
    }

    m_nContact = AfxGetApp()->GetProfileInt("Settings", "Contact", 0);
    ((CComboBox*)GetDlgItem(IDC_CONTACT))->SetCurSel(m_nContact);

    s.LoadString(IDP_READY);
    m_barStatus.SetText(s, 0, 0);

    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CWebMessageDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::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 CWebMessageDlg::OnPaint() 
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (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
    {
        CDialog::OnPaint();
    }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CWebMessageDlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
}

void CWebMessageDlg::OnChangeMessage() 
{
    // TODO: If this is a RICHEDIT control, the control will not
    // send this notification unless you override the CDialog::OnInitDialog()
    // function to send the EM_SETEVENTMASK message to the control
    // with the ENM_CHANGE flag ORed into the lParam mask.
    
    // TODO: Add your control notification handler code here
    if (((CEdit*)GetDlgItem(IDC_MESSAGE))->LineLength() > 0)
        GetDlgItem(IDOK)->EnableWindow(TRUE);
    else
        GetDlgItem(IDOK)->EnableWindow(FALSE);
}

void CWebMessageDlg::OnOK() 
{
    BOOL    b;
    CString s;

    UpdateData();

    s.LoadString(IDP_SENDING);
    m_barStatus.SetText(s, 0, 0);
    b = DoSendMessage();
    s.LoadString(IDP_READY);
    m_barStatus.SetText(s, 0, 0);
    if (b)
        CDialog::OnOK();
}

// Post the message to orange.co.uk
BOOL CWebMessageDlg::DoSendMessage() 
{
    HINTERNET   hOpen, hConnect, hReq;
    DWORD       dwSize, dwCode;
    int         i;
    CString     szPostData, szReturned, s;
static  char    szData[4096];

    if (!(hOpen = InternetOpen("WebMessage", INTERNET_OPEN_TYPE_PRECONFIG, NULL, 0, 0)))
    {   AfxMessageBox(IDS_CANTOPEN);
        return FALSE;
    }

    if (!(hConnect = InternetConnect(hOpen, "www.orange.co.uk", INTERNET_DEFAULT_HTTP_PORT, "",  "", INTERNET_SERVICE_HTTP, 0  , 0)))
    {   AfxMessageBox(IDS_CANTCONNECT);
        InternetCloseHandle (hOpen);
        return FALSE;
    }

    if (!InternetSetOption(hConnect, INTERNET_OPTION_USERNAME, (LPVOID) (LPCSTR) m_szUserName, m_szUserName.GetLength()))
    {   AfxMessageBox(IDS_CANTSETUSERNAME);
        InternetCloseHandle (hConnect);
        InternetCloseHandle (hOpen);
        return FALSE;
    }

    if (!InternetSetOption (hConnect, INTERNET_OPTION_PASSWORD, (LPVOID) (LPCSTR) m_szPassword, m_szPassword.GetLength()))
    {   AfxMessageBox(IDS_CANTSETPASSWORD);
        InternetCloseHandle (hConnect);
        InternetCloseHandle (hOpen);
        return FALSE;
    }

    if (!(hReq = HttpOpenRequest(hConnect, "POST", "/cgi-bin/register/sms.pl", HTTP_VERSION, "", NULL, INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE, 0)))
    {   AfxMessageBox(IDS_CANTOPENREQUEST);
        InternetCloseHandle (hConnect);
        InternetCloseHandle (hOpen);
        return FALSE;
    }

    // Build the POST data
    szPostData = "FRAMES&messagetype=Local&number=";
    szPostData += m_szNumber;
    szPostData += "&message=";

    // URL encode the data
    for (i = 0; i < m_szMessage.GetLength(); i++)
    {
        if (isalnum(m_szMessage.GetAt(i)))
            szPostData += m_szMessage.GetAt(i);
        else
        {   s.Format("%%%02X", m_szMessage.GetAt(i));
            szPostData += s;
        }
    }

    szPostData += "\n";
#ifdef _DEBUG
    if (AfxMessageBox(szPostData, MB_OKCANCEL) == IDCANCEL)
    {   InternetCloseHandle (hReq);
        InternetCloseHandle (hConnect);
        InternetCloseHandle (hOpen);
        return FALSE;
    }
#endif

    if (!HttpSendRequest (hReq, NULL, 0, (LPVOID) (LPCSTR) szPostData, szPostData.GetLength()))
    {   AfxMessageBox(IDS_CANTSENDREQUEST);
        InternetCloseHandle (hReq);
        InternetCloseHandle (hConnect);
        InternetCloseHandle (hOpen);
        return FALSE;
    }

    dwSize = sizeof (DWORD);
    if ( !HttpQueryInfo (hReq, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwCode, &dwSize, NULL))
    {   AfxMessageBox(IDS_CANTQUERYINFO);
        InternetCloseHandle (hReq);
        InternetCloseHandle (hConnect);
        InternetCloseHandle (hOpen);
        return FALSE;
    }

    do
    {
        if (!InternetReadFile (hReq, (LPVOID)szData, sizeof(szData) - 1, &dwSize) )
        {   AfxMessageBox(IDS_CANTREAD);
            InternetCloseHandle (hReq);
            InternetCloseHandle (hConnect);
            InternetCloseHandle (hOpen);
            return FALSE;
        }

        if (dwSize > 0)
        {
            szData [dwSize] = '\0'; 
            szReturned += szData;
        }
    }
    while (dwSize > 0);

#ifdef _DEBUG
    AfxMessageBox(szReturned);
#endif

    InternetCloseHandle (hReq);
    InternetCloseHandle (hConnect);
    InternetCloseHandle (hOpen);

    if (szReturned.Find("not a valid destination number") != -1)
    {   AfxMessageBox(IDS_INVALIDDEST);
        return FALSE;
    }
    else if (szReturned.Find("has been sent successfully") == -1)
    {   AfxMessageBox(IDS_ERRORSENDING);
        return FALSE;
    }

    AfxGetApp()->WriteProfileString("Settings", "UserName", m_szUserName);
    AfxGetApp()->WriteProfileString("Settings", "Password", m_szPassword);
    AfxGetApp()->WriteProfileString("Settings", "Number", m_szNumber);
    AfxGetApp()->WriteProfileInt("Settings", "Contact", m_nContact);

    return TRUE;
}

void CWebMessageDlg::OnSelchangeContact() 
{
    COleVariant var;
    LPDISPATCH  lpDispatch;

    UpdateData();

    if (m_nContact <= 0)
        return;

    var = (LONG) m_pContact.GetItemData(m_nContact);
    lpDispatch = m_cItems.Item(var);
    if (!lpDispatch)
    {   AfxMessageBox(IDP_UNABLE_TO_CREATE);
        return;
    }
    
    _DContactItem   cContact(lpDispatch);

    CString s = cContact.GetMobileTelephoneNumber();
    LPCTSTR lps = s;
    long    i;

    BOOL    ZeroFound = FALSE;

    m_szNumber = _T("");
    for (i = 0; i < s.GetLength(); i++)
    {
        if (!ZeroFound && (lps[i] == _T('0')))
            ZeroFound = TRUE;
        if (ZeroFound && _istdigit(lps[i]))
            m_szNumber += lps[i];
    }

    UpdateData(FALSE);
}

void CWebMessageDlg::OnChangeNumber() 
{
    m_pContact.SetCurSel(0);
}