/*++ 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 #include #include #include #include #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, " "); } 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; } }