_BUILDING AN INTERNET GLOBAL PHONE_ by Sing Li Listing One ////////////////////////////////////////////////////////////////////////////// // Internet Global Phone Project // mainfrm.cpp : implementation of the CMainFrame class // // Very little modification to the AppWizard generated MFC skeleton. ////////////////////////////////////////////////////////////////////////////// // Copyright (c) 1993-1994 microWonders Inc. All rights reserved. // // AN OPEN INVITION TO BUILD UPON AND CONTRIBUTE TO THE PUBLIC TECHNOLOGY POOL: // You are encouraged to redistribute, and build upon the technologies // presented in this source module and the accompanying article in // Dr. Dobb's Journal provided all the conditions listed in the MUSTREAD.TXT // file, included with this distribution, are met. ////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "mphone.h" #include "mainfrm.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() //}}AFX_MSG_MAP // Global help commands ON_COMMAND(ID_HELP_INDEX, CFrameWnd::OnHelpIndex) ON_COMMAND(ID_HELP_USING, CFrameWnd::OnHelpUsing) ON_COMMAND(ID_HELP, CFrameWnd::OnHelp) ON_COMMAND(ID_CONTEXT_HELP, CFrameWnd::OnContextHelp) ON_COMMAND(ID_DEFAULT_HELP, CFrameWnd::OnHelpIndex) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // arrays of IDs used to initialize control bars // toolbar buttons - IDs are command buttons static UINT BASED_CODE buttons[] = { // same order as in the bitmap 'toolbar.bmp' // ID_FILE_NEW, ID_FILE_OPEN, // ID_FILE_SAVE, // ID_SEPARATOR, // ID_EDIT_CUT, // ID_EDIT_COPY, // ID_EDIT_PASTE, // ID_SEPARATOR, // ID_FILE_PRINT, // ID_APP_ABOUT, // ID_CONTEXT_HELP, ID_SEPARATOR, ID_PHONE_RECORD, ID_PHONE_SEND }; static UINT BASED_CODE indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { // TODO: add member initialization code here } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadBitmap(IDR_MAINFRAME) || !m_wndToolBar.SetButtons(buttons, sizeof(buttons)/sizeof(UINT))) { TRACE("Failed to create toolbar\n"); return -1; // fail to create } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE("Failed to create status bar\n"); return -1; // fail to create } return 0; } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers Listing Two // phonedoc.cpp : implementation of the CPhoneDoc class // // no change from MFC generated skeleton // #include "stdafx.h" #include "mphone.h" #include "phonedoc.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPhoneDoc IMPLEMENT_DYNCREATE(CPhoneDoc, CDocument) BEGIN_MESSAGE_MAP(CPhoneDoc, CDocument) //{{AFX_MSG_MAP(CPhoneDoc) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP END_MESSAGE_MAP() BEGIN_DISPATCH_MAP(CPhoneDoc, CDocument) //{{AFX_DISPATCH_MAP(CPhoneDoc) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_DISPATCH_MAP END_DISPATCH_MAP() ///////////////////////////////////////////////////////////////////////////// // CPhoneDoc construction/destruction CPhoneDoc::CPhoneDoc() { } CPhoneDoc::~CPhoneDoc() { } BOOL CPhoneDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: add reinitialization code here // (SDI documents will reuse this document) return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CPhoneDoc serialization void CPhoneDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } } ///////////////////////////////////////////////////////////////////////////// // CPhoneDoc diagnostics #ifdef _DEBUG void CPhoneDoc::AssertValid() const { CDocument::AssertValid(); } void CPhoneDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CPhoneDoc commands Listing Three ////////////////////////////////////////////////////////////////////////////// // Internet Global Phone Project // mphone.cpp : implementation file for the IGP application CWinApp class // // Very little modification to the AppWizard generated MFC skeleton. Note only // the mapping of the CWinApp Idle loop to the CPhoneView Idle loop to handle // the background audio compression/de-compression threads. ////////////////////////////////////////////////////////////////////////////// // Copyright (c) 1993-1994 microWonders Inc. All rights reserved. // // AN OPEN INVITION TO BUILD UPON AND CONTRIBUTE TO THE PUBLIC TECHNOLOGY POOL: // You are encouraged to redistribute, and build upon the technologies // presented in this source module and the accompanying article in // Dr. Dobb's Journal provided all the conditions listed in the MUSTREAD.TXT // file, included with this distribution, are met. ////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "mmsystem.h" #include "mphone.h" #include "mainfrm.h" #include "phonedoc.h" #include "wsmin.h" #include "socket.h" #include "talksock.h" #include "phonevw.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPhoneApp BEGIN_MESSAGE_MAP(CPhoneApp, CWinApp) //{{AFX_MSG_MAP(CPhoneApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPhoneApp construction CPhoneApp::CPhoneApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CPhoneApp object CPhoneApp NEAR theApp; ///////////////////////////////////////////////////////////////////////////// // CPhoneApp initialization BOOL CPhoneApp::InitInstance() { // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. SetDialogBkColor(); // Set dialog background color to gray LoadStdProfileSettings(); // Load standard INI file options // (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CPhoneDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CPhoneView)); AddDocTemplate(pDocTemplate); // create a new (empty) document OnFileNew(); if (m_lpCmdLine[0] != '\0') { // TODO: add command line processing here } return TRUE; } ///////////////////////////////////////////////////////////////////////////// // Idle Processing for Compression and Decompression BOOL CPhoneApp::OnIdle(LONG lCount) { BOOL bMore = CWinApp::OnIdle(lCount); // do compression or decompression every moment we have if (m_OnlyView) { bMore = ((CPhoneView *)(m_OnlyView))->DoIdleProcessing(); // neat! } return bMore; // return TRUE as long as there is any more idle tasks } ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // Implementation protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //{{AFX_MSG(CAboutDlg) // No message handlers //}}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() // App command to run the dialog void CPhoneApp::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.DoModal(); } ///////////////////////////////////////////////////////////////////////////// // CPhoneApp commands Example 1: (a) Pseudocode for the IGP client; (b) pseudocode for IGP server while (not end conversation) grab a small buffer from built in dsp compress the small buffer connect to server tcp socket establish protocol parameters send the small buffer disconnect end while (b) while true listen for connection if connection then establish protocol parameters receive a small buffer decompress the small buffer play the result on the built-in DSP endif end while