743 lines
13 KiB
C
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;
|
|
}
|
|
}
|