// (C) Фролов Г.В., 1995
// Адрес E-mail: frolov@glas.apc.org

// Определяем главный модуль приложения
#define MAIN_MODULE

#include <windows.h>
#include <mem.h>
#include <bwcc.h>
#include "tele.h"

// Имя класса главного окна приложения
char	szClassName[] = "WMODEM";

// Заголовок главного окна приложения
char	szWindowTitle[] = "Телетайп";

//===============================================
// Функция WinMain
//===============================================
#pragma argsused

int PASCAL
WinMain(	HINSTANCE hInstance,
			HINSTANCE hPrevInstance,
			LPSTR     lpszCmdLine,
			int       nCmdShow)
{
	MSG  msg;   // структура для работы с сообщениями
	HWND hwnd;  // идентификатор главного окна приложения

	// Проверяем, не запускалось ли это приложение ранее
	if(!hPrevInstance)
	{
		// Сохраняем в глобальной переменной hInst идентификатор приложения
		hInst = hInstance;

		// Если не запускалось, вызываем функцию InitApp
		if(!InitApp(hInstance))
			return FALSE;
	}
	else
	{
		MessageBeep(MB_ICONASTERISK);

		BWCCMessageBox( NULL,
			"Можно запускать только одну копию приложения",
			"Ошибка", MB_OK | MB_ICONSTOP);

		return FALSE;
	}

	// Создаем главное окно приложения
	hwnd = CreateWindow(
		szClassName, 
		szWindowTitle,
		WS_OVERLAPPED | WS_VISIBLE,
		CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, NULL,
		hInstance,
		NULL);    

	// Если создать окно не удалось, завершаем приложение
	if(!hwnd)
	{
		MessageBeep(MB_ICONASTERISK);

		BWCCMessageBox( NULL,
			"Ошибка при создании главного окна приложения",
			"Ошибка", MB_OK | MB_ICONSTOP);

		return FALSE;
	}

	// Рисуем окно
	ShowWindow(hwnd, nCmdShow);

   // Передаем функции окна сообщение WM_PAINT
	UpdateWindow(hwnd);

	// Запускаем цикл обработки сообщений
	while (GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}



// =====================================
// Функция InitApp
// =====================================
BOOL
InitApp(HINSTANCE hInstance)
{
	ATOM aWndClass;		// атом для кода возврата
	WNDCLASS wndclass;	// структура для регистрации
								// класса окна

	// Запмсываем нулевые значения во все поля структуры
	memset(&wndclass, 0, sizeof(wndclass));

	wndclass.style				= CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc		= (WNDPROC) WndProc;
	wndclass.cbClsExtra		= 0;
	wndclass.cbWndExtra		= 0;
	wndclass.hInstance		= hInstance;
	wndclass.hIcon				= LoadIcon(hInstance, "PHONE");
	wndclass.hCursor			= LoadCursor( NULL, IDC_ARROW );
	wndclass.hbrBackground	= GetStockObject( WHITE_BRUSH );
	wndclass.lpszMenuName	= (LPSTR) "APP_MENU";
	wndclass.lpszClassName	= (LPSTR) szClassName;

	// Регистрируем класс окна szClassName
	aWndClass = RegisterClass(&wndclass);

	// Возвращаем результат регистрации класса
	return(aWndClass != 0);
}

// =====================================
// Функция окна WndProc
// =====================================
LRESULT CALLBACK _export
WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
	switch( message ) 
	{
		case WM_CREATE:
      {
			// Определяем параметры окна
			InitTTY( hwnd );

			// Отправляем сообщение WM_CONNECT
			PostMessage( hwnd,WM_CONNECT,0,0L );
			return 0;
      }

		case WM_CONNECT:
      {
			// Открываем и инициализируем COM-порт
			idOpenCommPort = InitCommPort(hwnd);

			// В случае ошибки отображаем сообщение и завершаем приложение
			if (idOpenCommPort < 0)
			{
				MessageBeep(MB_ICONASTERISK);
				BWCCMessageBox(hwnd,"COM-порт не открыт","Ошибка",
					MB_ICONSTOP | MB_OK);

				PostMessage(hwnd,WM_CLOSE,0,0L);
			}
			return 0;
      }

		case WM_COMMNOTIFY:
      {
			// Вызываем обработчик сообщения WM_COMMNOTIFY
			ProcessCommNotify( hwnd, wParam, LOWORD( lParam ));
			return 0;
      }

		case WM_SETFOCUS:
      {
			// Приложение получило фокус ввода
			SetFocusTTY(hwnd);
			return 0;
      }

		case WM_KILLFOCUS:
      {
			// Приложение потеряло фокус ввода
			KillFocusTTY(hwnd);
			return 0;
      }

		case WM_CHAR:
		{
      	// Пользователь нажал на клавишу клавиатуры
			UserChat(hwnd, message, wParam, lParam);
			return 0;
      }

		case WM_COMMAND:
      {
			switch ( wParam )
			{
				case CM_EXIT:
            {
					PostMessage( hwnd, WM_CLOSE, 0, 0L );
					break;
            }

				case CM_ABOUT:
            {
					About(hwnd);
					break;
            }
			}
			return 0;
      }

		case WM_CLOSE:
		{
      	// Закрываем COM-порт и завершаем приложение 
			CloseCommPort(idOpenCommPort);

			DestroyWindow( hwnd );
			PostQuitMessage( 0 );
			return 0;
      }

		default:
			return( DefWindowProc( hwnd, message, wParam, lParam ) );
	}
}

// =====================================
// Функция About
// =====================================
void About(HWND hwnd)
{
	BWCCMessageBox(hwnd,
			"Телекоммуникационная программа\n\n"
			"(C) Фролов Г.В., 1994",
			"Информация",
			MB_OK | MB_ICONINFORMATION);

   return;
}
