windows-nt/Source/XPSP1/NT/net/tapi/apps/tb/widget.c
2020-09-26 16:20:57 +08:00

743 lines
13 KiB
C

/*++ BUILD Version: 0000 // Increment this if a change has global effects
Copyright (c) 1994-95 Microsoft Corporation
Module Name:
widget.c
Abstract:
Widget creation/management/deletion support for TAPI Browser util.
Author:
Dan Knudson (DanKn) 23-Aug-1994
Revision History:
--*/
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include "tb.h"
#include "vars.h"
void
UpdateWidgetList(
void
)
{
int i;
LRESULT lSel = SendMessage (ghwndList1, LB_GETCURSEL, 0, 0);
PMYWIDGET pWidget = aWidgets, pSelWidget = (PMYWIDGET) NULL;
if (lSel != LB_ERR)
{
pSelWidget = (PMYWIDGET) SendMessage(
ghwndList1,
LB_GETITEMDATA,
(WPARAM) lSel,
0
);
}
SendMessage (ghwndList1, LB_RESETCONTENT, 0, 0);
for (i = 0; pWidget; i++)
{
char buf[64];
switch (pWidget->dwType)
{
case WT_LINEAPP:
sprintf (buf, "LineApp=x%lx", ((PMYLINEAPP) pWidget)->hLineApp);
break;
case WT_LINE:
{
PMYLINE pLine = (PMYLINE) pWidget;
sprintf(
buf,
" Line=x%lx id=%ld ",
pLine->hLine,
pLine->dwDevID
);
if (pLine->dwPrivileges & LINECALLPRIVILEGE_NONE)
{
strcat (buf, "DialOut");
}
else
{
if (pLine->dwPrivileges & LINECALLPRIVILEGE_OWNER)
{
strcat (buf, "DialInOut");
}
if (pLine->dwPrivileges & LINECALLPRIVILEGE_MONITOR)
{
strcat (buf, " Monitor");
}
}
if (pLine->dwPrivileges & LINEOPENOPTION_PROXY)
{
strcat (buf, " Proxy");
}
break;
}
case WT_CALL:
{
PMYCALL pCall = (PMYCALL) pWidget;
if (pCall->hCall)
{
int i;
for (i = 0; aCallStates[i].dwVal != 0xffffffff; i++)
{
if (pCall->dwCallState == aCallStates[i].dwVal)
{
break;
}
}
sprintf(
buf,
" Call=x%lx %s %s",
pCall->hCall,
aCallStates[i].lpszVal,
(pCall->bMonitor ? "Monitor" : "Owner")
);
}
else
{
strcpy (buf, " <MakeCall reply pending>");
}
break;
}
case WT_PHONEAPP:
sprintf (buf, "PhoneApp=x%lx", ((PMYPHONEAPP) pWidget)->hPhoneApp);
break;
case WT_PHONE:
sprintf(
buf,
" Phone=x%lx id=%ld",
((PMYPHONE) pWidget)->hPhone,
((PMYPHONE) pWidget)->dwDevID
);
break;
}
SendMessage (ghwndList1, LB_INSERTSTRING, (WPARAM) -1, (LPARAM) buf);
SendMessage (ghwndList1, LB_SETITEMDATA, (WPARAM) i, (LPARAM) pWidget);
pWidget = pWidget->pNext;
}
//
// Restore selection if appropriate
//
if ((lSel != LB_ERR) && ((lSel = (LONG) GetWidgetIndex (pSelWidget)) >= 0))
{
SendMessage (ghwndList1, LB_SETCURSEL, (WPARAM) lSel, 0);
}
}
void
InsertWidgetInList(
PMYWIDGET pNewWidget,
PMYWIDGET pWidgetInsertBefore
)
{
pNewWidget->pNext = pWidgetInsertBefore;
if ((aWidgets == NULL) || (pWidgetInsertBefore == aWidgets))
{
aWidgets = pNewWidget;
}
else
{
PMYWIDGET pPrevWidget = aWidgets;
while (pPrevWidget->pNext &&
(pPrevWidget->pNext != pWidgetInsertBefore))
{
pPrevWidget = pPrevWidget->pNext;
}
pPrevWidget->pNext = pNewWidget;
}
UpdateWidgetList();
}
BOOL
RemoveWidgetFromList(
PMYWIDGET pWidgetToRemove
)
{
if (aWidgets == NULL)
{
goto RemoveWidgetFromList_error;
}
if (pWidgetToRemove == aWidgets)
{
aWidgets = pWidgetToRemove->pNext;
}
else
{
PMYWIDGET pPrevWidget = aWidgets;
while (pPrevWidget->pNext && (pPrevWidget->pNext != pWidgetToRemove))
{
pPrevWidget = pPrevWidget->pNext;
}
if (pPrevWidget->pNext == NULL)
{
goto RemoveWidgetFromList_error;
}
pPrevWidget->pNext = pWidgetToRemove->pNext;
}
free (pWidgetToRemove);
UpdateWidgetList();
return TRUE;
RemoveWidgetFromList_error:
ShowStr ("Error: pWidget x%lx not found in list", pWidgetToRemove);
return FALSE;
}
PMYLINEAPP
AllocLineApp(
void
)
{
PMYLINEAPP pNewLineApp = (PMYLINEAPP) malloc (sizeof(MYLINEAPP));
if (pNewLineApp)
{
PMYWIDGET pWidget = aWidgets;
memset (pNewLineApp, 0, sizeof(MYLINEAPP));
pNewLineApp->Widget.dwType = WT_LINEAPP;
//
// Insert new line app after all existing line apps, lines, & calls,
// and before any existing phone apps
//
while (pWidget && (pWidget->dwType != WT_PHONEAPP))
{
// assert (pWidget->dwType != WT_PHONE)
pWidget = pWidget->pNext;
}
InsertWidgetInList ((PMYWIDGET) pNewLineApp, pWidget);
}
return pNewLineApp;
}
PMYLINEAPP
GetLineApp(
HLINEAPP hLineApp
)
{
PMYWIDGET pWidget = aWidgets;
while (pWidget)
{
if (pWidget->dwType == WT_LINEAPP)
{
PMYLINEAPP pLineApp = (PMYLINEAPP) pWidget;
if (pLineApp->hLineApp == hLineApp)
{
break;
}
}
pWidget = pWidget->pNext;
}
return ((PMYLINEAPP) pWidget);
}
VOID
FreeLineApp(
PMYLINEAPP pLineApp
)
{
PMYWIDGET pWidget = pLineApp->Widget.pNext;
// BUGBUG chk validity of pLineApp
if (RemoveWidgetFromList ((PMYWIDGET) pLineApp))
{
while (pWidget &&
(pWidget->dwType != WT_LINEAPP) &&
(pWidget->dwType != WT_PHONEAPP))
{
PMYWIDGET pWidget2 = pWidget->pNext;
// assert (pWidget->dwType != WT_PHONE)
RemoveWidgetFromList (pWidget);
pWidget = pWidget2;
}
}
}
PMYLINE
AllocLine(
PMYLINEAPP pLineApp
)
{
PMYLINE pNewLine = (PMYLINE) malloc (sizeof(MYLINE));
if (pNewLine)
{
PMYWIDGET pWidget = (PMYWIDGET) pLineApp->Widget.pNext;
memset (pNewLine, 0, sizeof(MYLINE));
pNewLine->Widget.dwType = WT_LINE;
pNewLine->pLineApp = pLineApp;
//
// Insert new line after all existing lines & calls on specfied
// line app, but before the next line app or phone app
//
while (pWidget &&
(pWidget->dwType != WT_LINEAPP) &&
(pWidget->dwType != WT_PHONEAPP))
{
pWidget = pWidget->pNext;
}
InsertWidgetInList ((PMYWIDGET) pNewLine, pWidget);
}
return pNewLine;
}
PMYLINE
GetLine(
HLINE hLine
)
{
PMYWIDGET pWidget = aWidgets;
while (pWidget)
{
if (pWidget->dwType == WT_LINE)
{
PMYLINE pLine = (PMYLINE) pWidget;
if (pLine->hLine == hLine)
{
break;
}
}
pWidget = pWidget->pNext;
}
return ((PMYLINE) pWidget);
}
VOID
FreeLine(
PMYLINE pLine
)
{
PMYWIDGET pWidget = pLine->Widget.pNext;
if (RemoveWidgetFromList ((PMYWIDGET) pLine))
{
while (pWidget &&
(pWidget->dwType == WT_CALL))
{
PMYWIDGET pWidget2 = pWidget->pNext;
RemoveWidgetFromList (pWidget);
pWidget = pWidget2;
}
}
}
PMYCALL
AllocCall(
PMYLINE pLine
)
{
PMYCALL pNewCall = (PMYCALL) malloc (sizeof(MYCALL));
if (pNewCall)
{
PMYWIDGET pWidget = (PMYWIDGET) pLine->Widget.pNext;
memset (pNewCall, 0, sizeof(MYCALL));
pNewCall->Widget.dwType = WT_CALL;
pNewCall->pLine = pLine;
//
// Insert new call after all existing calls on specified line,
// and before the next line, line app, or phone app
//
while (pWidget && (pWidget->dwType == WT_CALL))
{
pWidget = pWidget->pNext;
}
InsertWidgetInList ((PMYWIDGET) pNewCall, pWidget);
}
return pNewCall;
}
PMYCALL
GetCall(
HCALL hCall
)
{
PMYWIDGET pWidget = aWidgets;
while (pWidget)
{
if (pWidget->dwType == WT_CALL)
{
PMYCALL pCall = (PMYCALL) pWidget;
if (pCall->hCall == hCall)
{
break;
}
}
pWidget = pWidget->pNext;
}
return ((PMYCALL) pWidget);
}
VOID
FreeCall(
PMYCALL pCall
)
{
// BUGBUG chk validity of pCall
RemoveWidgetFromList ((PMYWIDGET) pCall);
}
VOID
MoveCallToLine(
PMYCALL pCall,
HLINE hLine
)
{
//
// This func gets called when a user has invoked an op that requires
// creating a call, and we did an AllocCall() based on the currently
// selected line/calls, but in the call params dlg the user overrode
// the default hLine/hCall, and so we need to move the call widget
// in the global list from under the orig specified line widget to
// the line widget corresponding to the specified "hLine". (Note that
// this is not a simple matter of free-ing & realloc-ing another call,
// since TAPI saved the &pCall->hCall.)
//
PMYWIDGET pWidget = aWidgets;
//
// Remove call widget from the global list
//
while (pWidget->pNext != (PMYWIDGET) pCall)
{
pWidget = pWidget->pNext;
}
pWidget->pNext = pCall->Widget.pNext;
//
// Find the right place to insert it in list, then insert it
//
pWidget = (PMYWIDGET) GetLine (hLine);
pCall->pLine = (PMYLINE) pWidget;
while (pWidget->pNext && (pWidget->pNext->dwType == WT_CALL))
{
pWidget = pWidget->pNext;
}
pCall->Widget.pNext = pWidget->pNext;
pWidget->pNext = (PMYWIDGET) pCall;
UpdateWidgetList();
}
PMYPHONEAPP
AllocPhoneApp(
void
)
{
PMYPHONEAPP pNewPhoneApp = (PMYPHONEAPP) malloc (sizeof(MYPHONEAPP));
if (pNewPhoneApp)
{
PMYWIDGET pWidget = aWidgets;
memset (pNewPhoneApp, 0, sizeof(MYPHONEAPP));
pNewPhoneApp->Widget.dwType = WT_PHONEAPP;
//
// Insert new phone app at end of list
//
InsertWidgetInList ((PMYWIDGET) pNewPhoneApp, (PMYWIDGET) NULL);
}
return pNewPhoneApp;
}
PMYPHONEAPP
GetPhoneApp(
HPHONEAPP hPhoneApp
)
{
PMYWIDGET pWidget = aWidgets;
while (pWidget)
{
if (pWidget->dwType == WT_PHONEAPP)
{
PMYPHONEAPP pPhoneApp = (PMYPHONEAPP) pWidget;
if (pPhoneApp->hPhoneApp == hPhoneApp)
{
break;
}
}
pWidget = pWidget->pNext;
}
return ((PMYPHONEAPP) pWidget);
}
VOID
FreePhoneApp(
PMYPHONEAPP pPhoneApp
)
{
PMYWIDGET pWidget = pPhoneApp->Widget.pNext;
if (RemoveWidgetFromList ((PMYWIDGET) pPhoneApp))
{
while (pWidget && (pWidget->dwType == WT_PHONE))
{
PMYWIDGET pWidget2 = pWidget->pNext;
RemoveWidgetFromList (pWidget);
pWidget = pWidget2;
}
}
}
PMYPHONE
AllocPhone(
PMYPHONEAPP pPhoneApp
)
{
PMYPHONE pNewPhone = (PMYPHONE) malloc (sizeof(MYPHONE));
if (pNewPhone)
{
PMYWIDGET pWidget = (PMYWIDGET) pPhoneApp->Widget.pNext;
memset (pNewPhone, 0, sizeof(MYPHONE));
pNewPhone->Widget.dwType = WT_PHONE;
pNewPhone->pPhoneApp = pPhoneApp;
//
// Insert new phone after all phones on the specified phone app,
// and before the next phone app
//
while (pWidget && (pWidget->dwType == WT_PHONE))
{
pWidget = pWidget->pNext;
}
InsertWidgetInList ((PMYWIDGET) pNewPhone, pWidget);
}
return pNewPhone;
}
PMYPHONE
GetPhone(
HPHONE hPhone
)
{
PMYWIDGET pWidget = aWidgets;
while (pWidget)
{
if (pWidget->dwType == WT_PHONE)
{
PMYPHONE pPhone = (PMYPHONE) pWidget;
if (pPhone->hPhone == hPhone)
{
break;
}
}
pWidget = pWidget->pNext;
}
return ((PMYPHONE) pWidget);
}
VOID
FreePhone(
PMYPHONE pPhone
)
{
RemoveWidgetFromList ((PMYWIDGET) pPhone);
}
int
GetWidgetIndex(
PMYWIDGET pWidget
)
{
int i;
PMYWIDGET pWidget2 = aWidgets;
for (i = 0; (pWidget2 && (pWidget != pWidget2)); i++)
{
pWidget2 = pWidget2->pNext;
}
if (!pWidget2)
{
i = -1;
}
return i;
}
void
SelectWidget(
PMYWIDGET pWidget
)
{
int i;
PMYWIDGET pWidget2 = aWidgets;
for (i = 0; pWidget2; i++)
{
if (pWidget == pWidget2)
{
SendMessage (ghwndList1, LB_SETCURSEL, (WPARAM) i, 0);
break;
}
pWidget2 = pWidget2->pNext;
}
}