//***************************************************************************** //* (C) Copyright 1995 Gregory Consulting Limited //* //* This file is Copyrighted and is subject to the rules outlined in the //* software agreement accompanying this CDROM and book. You are free to //* modify this code as you see fit according to those rules. //* //* THIS IS SAMPLE CODE! No warranties are expressed or implied, you're //* using it at your own risk. In addition, the resulting program may //* not be fully functional. Support for some features are left out so //* that they can be added by you, the reader. //* //***************************************************************************** // mainfrm.cpp : implementation of the CMainFrame class // #include "stdafx.h" #include "qsend.h" #include "mainfrm.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() //}}AFX_MSG_MAP ON_MESSAGE(WM_SOCKET_LISTEN, OnListeningSocket) 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, }; static UINT BASED_CODE indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { pListeningSocket = 0; } CMainFrame::~CMainFrame() { delete pListeningSocket; } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CMDIFrameWnd::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 } Listen(); return 0; } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CMDIFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CMDIFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers LRESULT CMainFrame::OnListeningSocket(WPARAM amount, LPARAM buffer) { if ((int)amount > 0) { } else { // if amount < 0 it is a receive command switch ( (SocketReceiveCmd)amount ) { case SocketStatusChanged: break; case NewSocketAccepted: // the only function of this listening socket is to tell us where // to find the data socket that the server connected to. After that // we work with the data socket QSocket *pSockRecv = (QSocket *)buffer; { CSocketFile sockFile(pSockRecv); CArchive arRecv(&sockFile, CArchive::load); POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition( ); if (pos) // should have one template { CDocTemplate *pTemplate = (CDocTemplate *)AfxGetApp()->GetNextDocTemplate(pos); CDocument *pDocument = pTemplate->OpenDocumentFile(NULL); // get a new document arRecv.m_pDocument = pDocument; pDocument->Serialize(arRecv); pDocument->UpdateAllViews(NULL); pDocument->SetModifiedFlag(TRUE); } } delete pSockRecv; break; } } return 0; } void CMainFrame::Listen() { delete pListeningSocket; pListeningSocket = new QSocket; SOCKADDR_IN sock_address; int addr_size = sizeof(sock_address); sock_address.sin_family = AF_INET; sock_address.sin_addr.s_addr = htonl(INADDR_ANY); sock_address.sin_port = htons(QSEND_PORT); pListeningSocket->Bind((SOCKADDR*)&sock_address, addr_size); pListeningSocket->SetReceiveTarget(this, WM_SOCKET_LISTEN); pListeningSocket->Listen(); }