COMMON.CPP

/////////////////////////////////////////////////////////////////////////////// 
//
// File Name
// COMMON.CPP
//
// Description
//
// Author
// Irving De la Cruz
//
// Revision: 1.7
//
// Written for Microsoft Windows Developer Support
// Copyright (c) 1995-1996 Microsoft Corporation. All rights reserved.
//
#include <WINDOWS.H>
#include "TRACES.H"
#include "WINDSGBL.H"
#include "WDSADM.H"
#include "COMMON.H"

// Remark this line to turn verbose tracing OFF
//#define DO_INFO_TRACES
#ifdef DO_INFO_TRACES
#define InfoTrace(a) TraceInfoMessage(a)
#else
#define InfoTrace(a) 0
#endif // DO_INFO_TRACES


extern "C"
{
extern HINSTANCE ghInstance;
extern TCHAR g_szAppTitle[];
}

///////////////////////////////////////////////////////////////////////////////
// InsertNewDLMNodeA()
//
// Parameters
//
// Purpose
//
// Return Value
//
void WINAPI InsertNewDLMNodeA (DLM_INFO_A Info, DLM_XMIT_LIST_A * pList)
{
DLM_LIST_A * pNewNode = (DLM_LIST_A *)midl_user_allocate (sizeof (DLM_LIST_A));
if (NULL == pNewNode)
{
TraceMessage ("InsertNewDLMNodeA: Failed to allocate new node");
return;
}
pNewNode->Info = Info;
pNewNode->pNext = NULL;

DLM_XMIT_LIST_A * pCurrent = pList;
while (pCurrent->pNext)
{
pCurrent = pCurrent->pNext;
}
pCurrent->pNext = pNewNode;
}

///////////////////////////////////////////////////////////////////////////////
// DLM_XMIT_LIST_A_to_xmit()
//
// Parameters
//
// Purpose
//
// Return Value
//
void __RPC_USER DLM_XMIT_LIST_A_to_xmit (DLM_XMIT_LIST_A __RPC_FAR * pList,
DLM_ARRAY_A __RPC_FAR * __RPC_FAR * ppArray)
{
InfoTrace ("DLM_XMIT_LIST_A_to_xmit: Function invoked");

DLM_XMIT_LIST_A * pHead = pList; // save pointer to start
DLM_ARRAY_A * pArray;

// Count the number of member in the list
ULONG ulCount = 0;
for (; pList != NULL; pList = pList->pNext)
{
ulCount++;
}

*ppArray = NULL;

// Allocate the memory for the array using the MIDL memory allocator (which we implement)
pArray = (DLM_ARRAY_A *)midl_user_allocate (sizeof(DLM_ARRAY_A) + (ulCount * sizeof(DLM_INFO_A)));
if (NULL == pArray)
{
TraceMessage ("DLM_XMIT_LIST_A_to_xmit: Failed to allocate XMIT array");
return;
}
pArray->dwCount = ulCount;

// Copy the linked list of members into the allocated array.
for (ulCount = 0, pList = pHead; pList != NULL; pList = pList->pNext)
{
pArray->pMembers[ulCount++] = pList->Info;
}

// Return the array allocated to the RPC stubs
*ppArray = pArray;
}

///////////////////////////////////////////////////////////////////////////////
// DLM_XMIT_LIST_A_from_xmit()
//
// Parameters
//
// Purpose
//
// Return Value
//
void __RPC_USER DLM_XMIT_LIST_A_from_xmit (DLM_ARRAY_A __RPC_FAR * pArray,
DLM_XMIT_LIST_A __RPC_FAR * pList)
{
InfoTrace ("DLM_XMIT_LIST_A_from_xmit: Function invoked");

if (pArray->dwCount <= 0)
{
pList = NULL;
return;
}

if (pList == NULL)
{
InsertNewDLMNodeA (pArray->pMembers[0], pList);
}
else
{
DLM_XMIT_LIST_A_free_inst (pList);
pList->Info = pArray->pMembers[0];
pList->pNext = NULL;
}

for (UINT i=1; i<pArray->dwCount; i++)
{
InsertNewDLMNodeA (pArray->pMembers[i], pList);
}
}

///////////////////////////////////////////////////////////////////////////////
// DLM_XMIT_LIST_A_free_inst()
//
// Parameters
//
// Purpose
//
// Return Value
//
void __RPC_USER DLM_XMIT_LIST_A_free_inst (DLM_XMIT_LIST_A __RPC_FAR * pList)
{
InfoTrace ("DLM_XMIT_LIST_A_free_inst: Function invoked");
// Don't delete the first node.
DLM_XMIT_LIST_A * pNextNode, *pNode = pList->pNext;
ZeroMemory (pList, sizeof(DLM_XMIT_LIST_A));

while (pNode)
{
pNextNode = pNode->pNext;
midl_user_free (pNode);
pNode = pNextNode;
}
}

///////////////////////////////////////////////////////////////////////////////
// DLM_XMIT_LIST_A_free_xmit()
//
// Parameters
//
// Purpose
//
// Return Value
//
void __RPC_USER DLM_XMIT_LIST_A_free_xmit (DLM_ARRAY_A __RPC_FAR * pArray)
{
InfoTrace ("DLM_XMIT_LIST_A_free_xmit: Function invoked");
midl_user_free (pArray);
}

///////////////////////////////////////////////////////////////////////////////
// InsertNewDLMNodeW()
//
// Parameters
//
// Purpose
//
// Return Value
//
void WINAPI InsertNewDLMNodeW (DLM_INFO_W Info, DLM_XMIT_LIST_W * pList)
{
DLM_LIST_W * pNewNode = (DLM_LIST_W *)midl_user_allocate (sizeof (DLM_LIST_W));
if (NULL == pNewNode)
{
TraceMessage ("InsertNewDLMNodeW: Failed to allocate new node");
return;
}
pNewNode->Info = Info;
pNewNode->pNext = NULL;

DLM_XMIT_LIST_W * pCurrent = pList;
while (pCurrent->pNext)
{
pCurrent = pCurrent->pNext;
}
pCurrent->pNext = pNewNode;
}

///////////////////////////////////////////////////////////////////////////////
// DLM_XMIT_LIST_W_to_xmit()
//
// Parameters
//
// Purpose
//
// Return Value
//
void __RPC_USER DLM_XMIT_LIST_W_to_xmit (DLM_XMIT_LIST_W __RPC_FAR * pList,
DLM_ARRAY_W __RPC_FAR * __RPC_FAR * ppArray)
{
InfoTrace ("DLM_XMIT_LIST_W_to_xmit: Function invoked");

DLM_XMIT_LIST_W * pHead = pList; // save pointer to start
DLM_ARRAY_W * pArray;

// Count the number of member in the list
ULONG ulCount = 0;
for (; pList != NULL; pList = pList->pNext)
{
ulCount++;
}

*ppArray = NULL;

// Allocate the memory for the array using the MIDL memory allocator (which we implement)
pArray = (DLM_ARRAY_W *)midl_user_allocate (sizeof(DLM_ARRAY_W) + (ulCount * sizeof(DLM_INFO_W)));
if (NULL == pArray)
{
TraceMessage ("DLM_XMIT_LIST_W_to_xmit: Failed to allocate XMIT array");
return;
}
pArray->dwCount = ulCount;

// Copy the linked list of members into the allocated array.
for (ulCount = 0, pList = pHead; pList != NULL; pList = pList->pNext)
{
pArray->pMembers[ulCount++] = pList->Info;
}

// Return the array allocated to the RPC stubs
*ppArray = pArray;
}

///////////////////////////////////////////////////////////////////////////////
// DLM_XMIT_LIST_W_from_xmit()
//
// Parameters
//
// Purpose
//
// Return Value
//
void __RPC_USER DLM_XMIT_LIST_W_from_xmit (DLM_ARRAY_W __RPC_FAR * pArray,
DLM_XMIT_LIST_W __RPC_FAR * pList)
{
InfoTrace ("DLM_XMIT_LIST_W_from_xmit: Function invoked");

if (pArray->dwCount <= 0)
{
pList = NULL;
return;
}

if (pList == NULL)
{
InsertNewDLMNodeW (pArray->pMembers[0], pList);
}
else
{
DLM_XMIT_LIST_W_free_inst (pList);
pList->Info = pArray->pMembers[0];
pList->pNext = NULL;
}

for (UINT i=1; i<pArray->dwCount; i++)
{
InsertNewDLMNodeW (pArray->pMembers[i], pList);
}
}

///////////////////////////////////////////////////////////////////////////////
// DLM_XMIT_LIST_W_free_inst()
//
// Parameters
//
// Purpose
//
// Return Value
//
void __RPC_USER DLM_XMIT_LIST_W_free_inst (DLM_XMIT_LIST_W __RPC_FAR * pList)
{
InfoTrace ("DLM_XMIT_LIST_W_free_inst: Function invoked");
// Don't delete the first node.
DLM_XMIT_LIST_W * pNextNode, * pNode = pList->pNext;
ZeroMemory (pList, sizeof(DLM_XMIT_LIST_W));

while (pNode)
{
pNextNode = pNode->pNext;
midl_user_free (pNode);
pNode = pNextNode;
}
}

///////////////////////////////////////////////////////////////////////////////
// DLM_XMIT_LIST_W_free_xmit()
//
// Parameters
//
// Purpose
//
// Return Value
//
void __RPC_USER DLM_XMIT_LIST_W_free_xmit (DLM_ARRAY_W __RPC_FAR * pArray)
{
InfoTrace ("DLM_XMIT_LIST_W_free_xmit: Function invoked");
midl_user_free (pArray);
}

///////////////////////////////////////////////////////////////////////////////
// PrivateMessageBox()
//
// Parameters
// ids String ID of a string in the resource string table
// hOwnerWnd Window who will own the Message Box
// uFlags Flags (options) for the message box
//
// Purpose
// This function display a message box with a string loaded from the
// string table of this app. The ID of the string is passed in the ids
// parameter. The dialog box is modal with respect to the window
// identified in hOwnerWnd. The options to display the dialog box are
// passed in uFlags
//
// Return Value
// ID of the button pressed in the message box dialog box
//
int WINAPI PrivateMessageBox (UINT ids, HWND hOwnerWnd, UINT uFlags)
{
// Default response
int nResponse = -1;
// Get the string from the string table. The size of the buffer is the
// maximum number of character allowed in the character buffer, without
// the accounting for the NULL terminator
TCHAR szBuffer[256];
// Set the cursor to an arrow, in case it wasn't.
HCURSOR hPrevCursor = SetCursor (LoadCursor (NULL, MAKEINTRESOURCE(IDC_ARROW)));
if (LoadString (ghInstance, ids, szBuffer, 255))
{
if (0 == uFlags)
{
uFlags = MB_OK | MB_ICONSTOP;
}
uFlags |= MB_SETFOREGROUND;
nResponse = MessageBox (hOwnerWnd, szBuffer, g_szAppTitle, uFlags);
}
// Before returning, reset the cursor to the previous state
SetCursor (hPrevCursor);
return nResponse;
}

///////////////////////////////////////////////////////////////////////////////
// CenterDialogBox()
//
// Parameters
// hDlg Handle to the dialog (or window) that we want to center.
//
// Purpose
// This function centers a window, vertically and horizontally,
// with respect to the desktop (or screen)
//
// Return Value
// None.
//
void WINAPI CenterDialogBox (HWND hDlg)
{
POINT pt;
RECT r1, r2;
int iWidth, iHeight;
GetWindowRect (GetDesktopWindow(), &r1);
GetWindowRect (hDlg, &r2);
iWidth = r2.right - r2.left;
iHeight = r2.bottom - r2.top;
pt.x = (r1.right - r1.left) / 2;
pt.y = (r1.bottom - r1.top) / 2;
pt.x = pt.x - (iWidth / 2);
pt.y = pt.y - (iHeight / 2);
MoveWindow (hDlg, pt.x, pt.y, iWidth, iHeight, FALSE);
}

///////////////////////////////////////////////////////////////////////////////
// midl_user_allocate()
//
// Parameters
// len Size (in bytes) of the memory block to allocate for the
// RPC object
//
// Purpose
// Allocates memory as needed by the RPC runtime library.
// The stubs or runtime libraries may need to allocate memory.
// By convention, they call a user-specified function named
// midl_user_allocate.
//
// Return Value
// Pointer to a block of memory of len byte in size
//
void __RPC_FAR * __RPC_API midl_user_allocate (size_t len)
{
LPVOID pVoid = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, (DWORD)len);
if (NULL == pVoid)
{
TraceMessage ("midl_user_allocate: Failed to allocated RPC memory block");
}
return pVoid;
}

///////////////////////////////////////////////////////////////////////////////
// midl_user_free()
//
// Parameters
// ptr Pointer to memory block to release
//
// Purpose
// Free memory as needed by the RPC runtime library.
// The stubs or runtime libraries may need to free memory.
// By convention, they call a user-specified function named
// midl_user_free.
//
// Return Value
// None
//
void __RPC_API midl_user_free (void __RPC_FAR * ptr)
{
HeapFree (GetProcessHeap(), 0, ptr);
}

// End of file for COMMON.CPP