UTIL.CPP
//**************************************************************************** 
//  Module:     NMCHAT.EXE 
//  File:       UTIL.CPP 
//  Content:     
//               
// 
//  Copyright (c) Microsoft Corporation 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" 
 
 
//**************************************************************************** 
// 
// VOID SendText(void) 
// 
// Send the line of text in the edit control. 
// 
//**************************************************************************** 
 
VOID SendText(void) 
{ 
UINT  cb; 
TCHAR sz[MAX_PATH]; 
 
#ifdef NM2_CHAT_PROTOCOL 
BYTE   buffer[CB_NM2_HDR + (MAX_PATH*2)]; 
 
// Get the text line 
cb = SendMessage(ghwndEdit, WM_GETTEXT, (WPARAM) MAX_PATH, (LPARAM) sz); 
SendMessage(ghwndEdit, EM_SETSEL, (WPARAM) 0, (LPARAM)-1); 
SendMessage(ghwndEdit, WM_SETTEXT, (WPARAM) 0, (LPARAM) ""); 
 
if ((0 != cb) && (NULL != g_pChannelData)) 
{ 
INmMember * pMember = GetSelectedMember(); 
if ((pMember != NULL) && (S_OK == pMember->IsSelf())) 
{ 
// Local Member => Everyone => Broadcast 
pMember = NULL; 
} 
 
cb++; // include final null 
#ifdef UNICODE 
lstrcpy(&buffer[CB_NM2_HDR], sz); 
#else 
cb = MultiByteToWideChar(CP_ACP, 0, sz, cb, (LPWSTR) &buffer[CB_NM2_HDR], MAX_PATH); 
cb *= 2; // adjust for UNICODE 
#endif /* !UNICODE */ 
 
// Add special prefix 
cb += CB_NM2_HDR; 
ZeroMemory(buffer, CB_NM2_HDR); 
* ((LPDWORD) buffer) = CB_NM2_HDR; 
 
g_pChannelData->SendData(pMember, cb, buffer, 0); 
} 
 
#else 
// Get the text line 
cb = SendMessage(ghwndEdit, WM_GETTEXT, (WPARAM) CCHMAX(sz), (LPARAM) sz); 
SendMessage(ghwndEdit, EM_SETSEL, (WPARAM) 0, (LPARAM)-1); 
SendMessage(ghwndEdit, WM_SETTEXT, (WPARAM) 0, (LPARAM) ""); 
 
if ((0 != cb) && (NULL != g_pChannelData)) 
{ 
INmMember * pMember = GetSelectedMember(); 
if ((pMember != NULL) && (S_OK == pMember->IsSelf())) 
{ 
// Local Member => Everyone => Broadcast 
pMember = NULL; 
} 
 
cb++; // include final null 
g_pChannelData->SendData(pMember, cb, (LPBYTE) sz, 0); 
} 
#endif /* NM2_CHAT_PROTOCOL */ 
} 
 
 
//**************************************************************************** 
// 
// VOID ClearText(void) 
// 
//**************************************************************************** 
 
VOID ClearText(void) 
{ 
ListView_DeleteAllItems(ghwndMsg); 
} 
 
 
//**************************************************************************** 
// 
// VOID SizeMsgWindow(int dx, int dy) 
// 
//**************************************************************************** 
 
VOID SizeMsgWindow(int dx, int dy) 
{ 
MoveWindow(ghwndEdit, XP_LEFT, dy - DYP_EDIT, dx, DYP_EDIT, TRUE); 
dy -= (YP_TOP + DYP_EDIT); 
 
MoveWindow(ghwndUser, XP_LEFT, YP_TOP, DXP_USER, dy, TRUE); 
dx -= DXP_USER; 
 
MoveWindow(ghwndMsg, XP_LEFT + DXP_USER, YP_TOP, dx, dy, TRUE); 
} 
 
 
//**************************************************************************** 
// 
// VOID RecalcMsgWindow(void) 
// 
//**************************************************************************** 
 
VOID RecalcMsgWindow(void) 
{ 
RECT rc; 
 
GetClientRect(ghwndMain, &rc); 
SizeMsgWindow(rc.right, rc.bottom); 
} 
 
 
//**************************************************************************** 
// 
// LPVOID LpvAlloc(int cb) 
// 
// Return a pointer to an allocated array of bytes 
// 
//**************************************************************************** 
 
LPVOID LpvAlloc(int cb) 
{ 
return LocalAlloc(LMEM_FIXED, cb); 
} 
 
 
//**************************************************************************** 
// 
// LPTSTR PszAlloc(int cch) 
// 
//**************************************************************************** 
 
LPTSTR PszAlloc(int cch) 
{ 
return (LPTSTR) LocalAlloc(LMEM_FIXED, sizeof(TCHAR) * (cch+1)); 
} 
 
 
//**************************************************************************** 
// 
// VOID FreePlpv(LPVOID plpv) 
// 
// Free the data pointed to by plpv and set *plpv to NULL 
// 
//**************************************************************************** 
 
VOID FreePlpv(LPVOID plpv) 
{ 
if ((plpv == NULL) || (*(VOID FAR * FAR *)plpv == NULL)) { 
return; 
} 
 
LocalFree(*(VOID FAR * FAR *)plpv); 
*(VOID FAR * FAR *)plpv = NULL; 
} 
 
 
//**************************************************************************** 
// 
// VOID MaybeDeleteObject(HGDIOBJ * phgdi) 
// 
// Check usage count, delete if we can 
// 
//**************************************************************************** 
 
VOID MaybeDeleteObject(HGDIOBJ * phgdi) 
{ 
if (*phgdi == hgdiNil) 
return; 
 
DeleteObject(*phgdi); 
*phgdi = hgdiNil; 
}