//****************************************************************************
// Module: NMUI.EXE
// File: INIT.CPP
// Content:
//
//
// Copyright (c) Microsoft Corporation 1995-1997
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//****************************************************************************
#include "precomp.h"
TCHAR gszAppTitle[] = TEXT("NetMeeting UI Test Application");
// string constants (no change for international)
TCHAR gszAppClassName[] = TEXT("NMUI");
TCHAR gszAppName[] = TEXT("NmUi");
TCHAR gszIniName[] = TEXT("NmUi.ini");
// Section Names
TCHAR gszMainWnd[] = TEXT("MainWnd");
TCHAR gszSbar[] = TEXT("SBar");
TCHAR gszTbar[] = TEXT("TBar");
TCHAR gszChat[] = TEXT("Chat");
TCHAR gszMsg[] = TEXT("Messages");
TCHAR gszMsgFont[] = TEXT("Message Font");
TCHAR gszAddr[] = TEXT("Addr");
TCHAR gszAddrType[] = TEXT("AddrType");
TCHAR gszConferenceName[] = TEXT("Conference Name");
TCHAR gszFileName[] = TEXT("Filename");
TCHAR gszIniCallType[] = TEXT("CallType");
TCHAR gszIniAutoMonitor[] = TEXT("AutoMonitor");
TCHAR gszIniAutoHost[] = TEXT("AutoHost");
TCHAR gszIniAutoCall[] = TEXT("AutoCall");
TCHAR gszIniAutoChat[] = TEXT("AutoChat");
TCHAR gszIniInit[] = TEXT("Init");
TCHAR gszIniMsgTrace[] = TEXT("Trace Msgs");
TCHAR gszIniMsgObjects[] = TEXT("Object Msgs");
TCHAR gszIniMsgNotify[] = TEXT("Notify Msgs");
// See ILV_*
static COL _rgColMember[] = {
{80, "Name"},
{40, "Ver"},
{60, "Caps"},
{60, "Audio"},
{60, "Video"},
{60, "Ft"},
{90, "App Sharing"},
{40, "MCU"},
{40, "Local"},
{80, "IP Addr"},
{80, "ID"},
};
//****************************************************************************
//
// VOID ReadPref(void)
//
// Reads the current preferences from the NmUi.ini file.
//
//****************************************************************************
VOID ReadPref(void)
{
ClearStruct(&gPref);
gPref.fSbar = GetIniBool(gszSbar, TRUE);
gPref.fTbar = GetIniBool(gszTbar, TRUE);
gPref.fMsg = GetIniBool(gszMsg, TRUE);
gPref.fChat = GetIniBool(gszChat, TRUE);
gPref.pszConferenceName = GetIniStr(gszConferenceName, TEXT("NmUi Conference"));
gPref.pszAddr = GetIniStr(gszAddr, TEXT("User 1"));
gPref.nmAddrType = (NM_ADDR_TYPE) GetIniInt(gszAddrType, NM_ADDR_UNKNOWN);
gPref.nmCallType = (NM_CALL_TYPE) GetIniInt(gszIniCallType, (int) NM_CALL_DEFAULT);
GetIniHex(gszMainWnd, &gPref.wpMain, sizeof(WINDOWPLACEMENT));
GetIniHex(gszMsgFont, &gPref.lf, sizeof(LOGFONT));
gPref.fAutoMonitor= GetIniBool(gszIniAutoMonitor, FALSE);
gPref.fAutoHost = GetIniBool(gszIniAutoHost, FALSE);
gPref.fAutoCall = GetIniBool(gszIniAutoCall, FALSE);
gPref.fAutoChat = GetIniBool(gszIniAutoChat, FALSE);
gPref.fMsgTrace = GetIniBool(gszIniMsgTrace, TRUE);
gPref.fMsgObjects = GetIniBool(gszIniMsgObjects, FALSE);
gPref.fMsgNotify = GetIniBool(gszIniMsgNotify, TRUE);
gPref.iInit = GetIniInt(gszIniInit, NM_INIT_NORMAL);
gPref.pszFileName = GetIniStr(gszFileName, TEXT("C:\\autoexec.bat"));
}
//****************************************************************************
//
// VOID WritePref(void)
//
// Write the current preferences
//
//****************************************************************************
VOID WritePref(void)
{
WriteIniBool(gszSbar, gPref.fSbar);
WriteIniBool(gszTbar, gPref.fTbar);
WriteIniBool(gszMsg, gPref.fMsg);
WriteIniBool(gszChat, gPref.fChat);
WriteIniStr(gszConferenceName, gPref.pszConferenceName);
FreePlpv(&gPref.pszConferenceName);
WriteIniStr(gszFileName, gPref.pszFileName);
FreePlpv(&gPref.pszFileName);
WriteIniStr(gszAddr, gPref.pszAddr);
FreePlpv(&gPref.pszAddr);
WriteIniInt(gszAddrType, (int) gPref.nmAddrType);
WriteIniInt(gszIniCallType, (int) gPref.nmCallType);
if (NULL != ghwndMain)
{
gPref.wpMain.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(ghwndMain, &gPref.wpMain);
}
WriteIniHex(gszMainWnd, &gPref.wpMain, sizeof(WINDOWPLACEMENT));
WriteIniHex(gszMsgFont, &gPref.lf, sizeof(LOGFONT));
WriteIniTbar();
WriteIniBool(gszIniAutoMonitor, gPref.fAutoMonitor);
WriteIniBool(gszIniAutoHost, gPref.fAutoHost);
WriteIniBool(gszIniAutoCall, gPref.fAutoCall);
WriteIniBool(gszIniAutoChat, gPref.fAutoChat);
WriteIniInt(gszIniInit, gPref.iInit);
WriteIniBool(gszIniMsgTrace, gPref.fMsgTrace);
WriteIniBool(gszIniMsgObjects, gPref.fMsgObjects);
WriteIniBool(gszIniMsgNotify, gPref.fMsgNotify);
}
//****************************************************************************
//
// BOOL FCreateLView(void)
//
//****************************************************************************
BOOL FCreateLView(void)
{
ghwndLView = CreateWindow(TEXT("SysListView32"), NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | WS_CLIPSIBLINGS | LVS_REPORT,
0, 0, 0, 0,
ghwndMain, (HMENU) IDW_LVIEW, ghInst, NULL);
if (ghwndLView == NULL)
return FALSE;
ListView_SetExtendedListViewStyle(ghwndLView, LVS_EX_FULLROWSELECT);
// Initialize column data
{
int iCol;
LPCOL lpCol;
LV_COLUMN lvc;
lpCol = _rgColMember;
ClearStruct(&lvc);
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
for (iCol = 0; iCol < ARRAY_ELEMENTS(_rgColMember); iCol++)
{
lvc.iSubItem = iCol;
lvc.cx = lpCol->dwWidth;
lvc.pszText = lpCol->lpsz;
if (ListView_InsertColumn(ghwndLView, iCol, &lvc) == -1)
return FALSE;
lpCol++;
}
}
return TRUE;
}
//****************************************************************************
//
// BOOL FCreateMsgWindow(void)
//
// Create the main message window
//
//****************************************************************************
BOOL FCreateMsgWindow(void)
{
ghwndMsg = CreateWindow(TEXT("LISTBOX"), NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | WS_CLIPSIBLINGS |
LBS_USETABSTOPS | LBS_NOINTEGRALHEIGHT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS ,
0, 0, 0, 0,
ghwndMain, (HMENU) IDW_MSG, ghInst, NULL);
if (ghwndMsg == NULL)
return FALSE;
// set the font for the window
ghfontEntry = CreateFontIndirect(&gPref.lf);
if (ghfontEntry == hfontNil)
return TRUE;
SendMessage(ghwndMsg, WM_SETFONT, (WPARAM) ghfontEntry, MAKELPARAM(TRUE, 0));
return TRUE;
}
WNDPROC lpProcEdit = NULL;
VOID CmdChat(void);
LRESULT FAR PASCAL SubClsEdit(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT FAR PASCAL SubClsEdit(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if ((uMsg == WM_CHAR) && (VK_RETURN == wParam))
{
CmdChat();
return 0L;
}
return CallWindowProc(lpProcEdit, hwnd, uMsg, wParam, lParam);
}
//****************************************************************************
//
// BOOL FCreateChatWindow(void)
//
//****************************************************************************
BOOL FCreateChatWindow(void)
{
ghwndChat = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPSIBLINGS | WS_TABSTOP |
ES_AUTOHSCROLL,
0, 0, DXP_SEND, DYP_SEND,
ghwndMain, (HMENU) IDW_CHAT, ghInst, NULL);
if (ghwndChat == NULL)
return FALSE;
// set the font for the window
ghwndSend = CreateWindow(TEXT("BUTTON"), TEXT("Send To"),
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPSIBLINGS | WS_TABSTOP |
BS_DEFPUSHBUTTON,
0, 0, DXP_SEND, DYP_SEND,
ghwndMain, (HMENU) IDW_SEND, ghInst, NULL);
if (ghwndSend == NULL)
return FALSE;
lpProcEdit = (WNDPROC) GetWindowLong(ghwndChat, GWL_WNDPROC);
SetWindowLong(ghwndChat, GWL_WNDPROC, (LONG)(WNDPROC) SubClsEdit);
ghwndUList = CreateWindow(TEXT("COMBOBOX"), TEXT("Everyone"),
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPSIBLINGS | WS_VSCROLL | WS_TABSTOP |
CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED,
0, 0, DXP_ULIST, DYP_ULIST,
ghwndMain, (HMENU) IDL_USERS, ghInst, NULL);
if (ghwndUList == NULL)
return FALSE;
return TRUE;
}
//****************************************************************************
//
// BOOL FInitMain(void)
//
// Initialize the window data and register the window class
//
//****************************************************************************
BOOL FInitMain(void)
{
TCHAR szTitle[MAX_PATH];
WNDCLASS wc;
ASSERT(NULL != ghInst);
ghAccelTable = LoadAccelerators(ghInst, MAKEINTRESOURCE(ID_APPACCEL));
LoadString(ghInst, IDS_APP_TITLE, szTitle, CCHMAX(szTitle));
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = ghInst;
wc.hIcon = LoadIcon(ghInst, MAKEINTRESOURCE(ICO_MAIN));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName = MAKEINTRESOURCE(IDM_APP);
wc.lpszClassName = gszAppClassName;
// Register the window class and return FALSE if unsuccesful.
if (!RegisterClass(&wc))
return FALSE;
// MAIN WINDOW
// Create a main window for this application instance.
ghwndMain = CreateWindow(gszAppClassName, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, ghInst, NULL);
if (ghwndMain == NULL)
return FALSE;
ghMenu = GetMenu(ghwndMain);
if (NULL == ghMenu)
return FALSE;
if (!FCreateSbar() || !FCreateTbar() ||
!FCreateLView() || !FCreateMsgWindow() || !FCreateChatWindow())
return FALSE;
ShowHwnd(ghwndTbar, gPref.fTbar, IDM_VIEW_TBAR);
ShowHwnd(ghwndSbar, gPref.fSbar, IDM_VIEW_SBAR);
if (gPref.wpMain.length != 0)
SetWindowPlacement(ghwndMain, &gPref.wpMain);
return TRUE;
}
//****************************************************************************
//
// BOOL FInitApp(LPSTR lpszCmd, int nCmdShow)
//
// Initialize the application after checking command line, etc.
//
//****************************************************************************
BOOL FInitApp(LPSTR lpszCmd, int nCmdShow)
{
InitCommonControls();
if (FAILED(CoInitialize(NULL)))
return FALSE;
ReadPref();
if (!FInitMain())
return FALSE;
ASSERT(NULL != ghwndMain);
ShowWindow(ghwndMain, nCmdShow);
UpdateWindow(ghwndMain);
TRACE_MSG("System Initialized");
OnStartup();
return TRUE;
}
//****************************************************************************
//
// VOID FreeAllComObjects(void)
//
//****************************************************************************
VOID FreeAllComObjects(void)
{
// Release all objects to which this app has a reference
FreeAs();
FreeFt();
FreeDataChannel();
FreeAllUsers();
FreeChannels();
FreeCalls();
FreeConferences();
FreeConfMgr();
}