#include #include #include #include #include #include #include #include char MainWindow::szClassName[]="FTP Interpreter v2.01"; char MainWindow::szMenuName[]="FTP"; MainWindow::MainWindow(HINSTANCE hInstance) : mhInstance(hInstance), mlpEditWindow(0) { mPaintHandler.setCallback(this,&MainWindow::paintHandler); mDestroyHandler.setCallback(this,&MainWindow::destroyHandler); mCommandHandler.setCallback(this,&MainWindow::commandHandler); mKeyDownHandler.setCallback(this,&MainWindow::keyDownHandler); mSizeHandler.setCallback(this,&MainWindow::sizeHandler); mCreateHandler.setCallback(this,&MainWindow::createHandler); mTimerHandler.setCallback(this,&MainWindow::timerHandler); mSetFocusHandler.setCallback(this,&MainWindow::setFocusHandler); mLineHandler.setCallback(this,&MainWindow::lineHandler); mCompletionHandler.setCallback(this,&MainWindow::completionHandler); mFTPThread.setCompletionHandler(&mCompletionHandler); insertHandlers(); registerClass(); ::CreateWindow(szClassName,szClassName, WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_DLGFRAME|WS_CLIPCHILDREN, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,mhInstance,(LPSTR)this); show(SW_SHOW); update(); Rect editRect; editRect.right(width()); editRect.bottom(height()); KeyControl keyControl; keyControl.canScroll(TRUE); mlpEditWindow=new EditWindow(*this,editRect); mEditMonitor=mlpEditWindow; mEditMonitor.enter(); mlpEditWindow->setFont(Font("MS LineDraw",12,Font::PitchFixed|Font::WeightBold)); mEditMonitor->setKeyControl(keyControl); mEditMonitor->setLineHandler(&mLineHandler); processCommandLine(); mEditMonitor.leave(); } MainWindow::~MainWindow() { mFTPThread.stop(); if(mlpEditWindow){delete mlpEditWindow;mlpEditWindow=0;} destroy(); } void MainWindow::insertHandlers(void) { insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler); insertHandler(VectorHandler::PaintHandler,&mPaintHandler); insertHandler(VectorHandler::CommandHandler,&mCommandHandler); insertHandler(VectorHandler::SizeHandler,&mSizeHandler); insertHandler(VectorHandler::KeyDownHandler,&mKeyDownHandler); insertHandler(VectorHandler::CreateHandler,&mCreateHandler); insertHandler(VectorHandler::TimerHandler,&mTimerHandler); insertHandler(VectorHandler::SetFocusHandler,&mSetFocusHandler); } void MainWindow::removeHandlers(void) { removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler); removeHandler(VectorHandler::PaintHandler,&mPaintHandler); removeHandler(VectorHandler::CommandHandler,&mCommandHandler); removeHandler(VectorHandler::SizeHandler,&mSizeHandler); removeHandler(VectorHandler::KeyDownHandler,&mKeyDownHandler); removeHandler(VectorHandler::CreateHandler,&mCreateHandler); removeHandler(VectorHandler::TimerHandler,&mTimerHandler); removeHandler(VectorHandler::SetFocusHandler,&mSetFocusHandler); } void MainWindow::registerClass(void)const { WNDCLASS wndClass; if(::GetClassInfo(mhInstance,className(),(WNDCLASS FAR*)&wndClass))return; wndClass.style =CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS|CS_OWNDC; wndClass.lpfnWndProc =(WNDPROC)Window::WndProc; wndClass.cbClsExtra =0; wndClass.cbWndExtra =sizeof(MainWindow*); wndClass.hInstance =mhInstance; wndClass.hIcon =::LoadIcon(NULL,IDI_APPLICATION); wndClass.hCursor =::LoadCursor(NULL,IDC_ARROW); wndClass.hbrBackground =(HBRUSH)::GetStockObject(BLACK_BRUSH); wndClass.lpszMenuName =szMenuName; wndClass.lpszClassName =szClassName; ::RegisterClass(&wndClass); assert(0!=::GetClassInfo(mhInstance,className(),(WNDCLASS FAR*)&wndClass)); } CallbackData::ReturnType MainWindow::destroyHandler(CallbackData &/*someCallbackData*/) { removeHandlers(); ::PostQuitMessage(0); return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::sizeHandler(CallbackData &/*someCallbackData*/) { if(mlpEditWindow) { mEditMonitor.enter(); ::MoveWindow((HWND)*((EditWindow*)mEditMonitor),0,0,width(),height(),TRUE); mEditMonitor.leave(); } return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::commandHandler(CallbackData &someCallbackData) { switch(someCallbackData.wParam()) { case CM_EXIT : postMessage(*this,WM_CLOSE,0,0L); break; case CM_REMOTEHOST : handleRemoteHost(); break; default : break; } return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::keyDownHandler(CallbackData &/*someCallbackData*/) { return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::paintHandler(CallbackData &/*someCallbackData*/) { return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::createHandler(CallbackData &/*someCallbackData*/) { setTimer(TimerID,250); return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::timerHandler(CallbackData &/*someCallbackData*/) { killTimer(TimerID); mEditMonitor.enter(); mEditMonitor->setFocus(); mEditMonitor->setText(mWSASystem.description()); mEditMonitor->setText(mWSASystem.systemStatus()); mFTPThread.setDisplay(mEditMonitor); mEditMonitor->setFocus(); mEditMonitor.leave(); return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::lineHandler(CallbackData &/*someCallbackData*/) { String lineString; mEditMonitor.enter(); mEditMonitor->getText(lineString,mlpEditWindow->currentLine()-1); mEditMonitor.leave(); lineString.trimRight(); if(lineString==String("quit"))postMessage(*this,WM_CLOSE,0,0L); mFTPThread.interpretLine(lineString); return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::setFocusHandler(CallbackData &/*someCallbackData*/) { if(mlpEditWindow) { mEditMonitor.enter(); mEditMonitor->setFocus(); mEditMonitor.leave(); } return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::completionHandler(CallbackData &someCallbackData) { switch((FTPThread::CompletionCode)someCallbackData.lParam()) { case FTPThread::LineComplete : mEditMonitor.enter(); mEditMonitor->setText(">>Ready."); mEditMonitor.leave(); break; case FTPThread::FileComplete : postMessage(*this,WM_CLOSE,0,0L); break; } return (CallbackData::ReturnType)FALSE; } void MainWindow::processCommandLine(void) { String commandLine(::GetCommandLine()); commandLine=commandLine.betweenString(' ',0); if(commandLine.isNull())return; FileHandle cmdFile(commandLine,FileHandle::Read,FileHandle::ShareRead); if(!cmdFile.isOkay()){mFTPThread.interpretLine(commandLine);return;} cmdFile.close(); mFTPThread.interpretFile(commandLine); } void MainWindow::message(const String &messageString) { mEditMonitor.enter(); mEditMonitor->setText(messageString); mEditMonitor.leave(); } void MainWindow::message(Block &messageStrings) { for(short itemIndex=0;itemIndexsetText(messageStrings[itemIndex]); mEditMonitor.leave(); } } void MainWindow::handleRemoteHost(void) { HostDialog hostDialog; if(!hostDialog.performDialog())return; mFTPThread.interpretLine(String("open ")+hostDialog.remoteHost()); }