home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c221 / 7.ddi / MWHC.007 / M7 < prev    next >
Encoding:
Text File  |  1991-09-17  |  24.3 KB  |  932 lines

  1. /****************************************************************************
  2.  
  3.     PROGRAM: CLIENT
  4.  
  5.     PURPOSE: Illustrates client side of DDE conversation
  6.  
  7.     MODULES:
  8.  
  9.         CLIENT.C   Window and dialog procedures.
  10.     CLIDATA.C  Maintains conversation data.
  11.         CLIDDE.C   Processes incoming and outgoing DDE messages.
  12.  
  13. ****************************************************************************/
  14.  
  15. #include "windows.h"
  16.  
  17. #include "dde.h"
  18. #include "clires.h"
  19. #include "client.h"
  20. #include <string.h>
  21. #include <stdlib.h>
  22.  
  23. static int    nInstCount;
  24. static HWND   hwndRequestDlg;
  25.  
  26. static BOOL   bInInitiate = FALSE;
  27. static BOOL   bInRequestDlg = FALSE;
  28. static BOOL   bTerminating = FALSE;
  29.  
  30. static char  szSelectedApplication[APP_MAX_SIZE+1];
  31. static char  szSelectedTopic[TOPIC_MAX_SIZE+1];
  32. static char  szSelectedItem[ITEM_MAX_SIZE+1];
  33. static char  szSelectedValue[VALUE_MAX_SIZE+1];
  34. static HWND  hwndSelectedClientDDE;
  35. static int   cfSelectedFormat;
  36.  
  37. long FAR PASCAL MainWndProc(HWND, WORD, WORD, LONG);
  38. BOOL            InitApplication(HANDLE);
  39. void            InitAddedInstance(HANDLE, HANDLE);
  40. BOOL            InitInstance(HANDLE, int);
  41. int  NEAR    DoDialog(char *, FARPROC);
  42. BOOL FAR PASCAL AboutDlgProc(HWND, unsigned, WORD, LONG);
  43. BOOL FAR PASCAL AdviseDlgProc(HWND, unsigned, WORD, LONG);
  44. BOOL FAR PASCAL ClearDlgProc(HWND, unsigned, WORD, LONG);
  45. BOOL FAR PASCAL ExecuteDlgProc(HWND, unsigned, WORD, LONG);
  46. BOOL FAR PASCAL InitiateDlgProc(HWND, unsigned, WORD, LONG);
  47. BOOL FAR PASCAL PokeDlgProc(HWND, unsigned, WORD, LONG);
  48. BOOL FAR PASCAL RequestDlgProc(HWND, unsigned, WORD, LONG);
  49. BOOL FAR PASCAL TerminateDlgProc(HWND, unsigned, WORD, LONG);
  50. BOOL FAR PASCAL UnadviseDlgProc(HWND, unsigned, WORD, LONG);
  51. void        AddConversationsToBox(HWND, unsigned);
  52. void NEAR    GetSelectedConversation(HWND, unsigned, unsigned);
  53.     
  54.  
  55. /****************************************************************************
  56.  
  57.     FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
  58.  
  59.     PURPOSE: Calls initialization functions and processes message loop
  60.  
  61. ****************************************************************************/
  62.  
  63. int PASCAL WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
  64. HANDLE hInstance;
  65. HANDLE hPrevInstance;
  66. LPSTR lpCmdLine;
  67. int nCmdShow;
  68. {
  69.     MSG msg;
  70.  
  71.     if (!hPrevInstance)
  72.     {
  73.         if (!InitApplication(hInstance))
  74.            return (FALSE);
  75.     }
  76.     else
  77.     {
  78.         InitAddedInstance(hInstance, hPrevInstance);
  79.     }
  80.  
  81.     if (!InitInstance(hInstance, nCmdShow))
  82.         return (FALSE);
  83.  
  84.     while (GetMessage(&msg, NULL, NULL, NULL)) 
  85.     {
  86.     TranslateMessage(&msg);
  87.     DispatchMessage(&msg);
  88.     }
  89.     return (msg.wParam);
  90. }
  91.  
  92.  
  93. /****************************************************************************
  94.  
  95.     FUNCTION: InitApplication(HANDLE)
  96.  
  97.     PURPOSE: Initializes window data and registers window classes
  98.  
  99. ****************************************************************************/
  100.  
  101. BOOL InitApplication(hInstance)
  102. HANDLE hInstance;
  103. {
  104.     WNDCLASS  wc;
  105.  
  106.     nInstCount = 1;
  107.  
  108.     wc.style = NULL;
  109.     wc.lpfnWndProc = MainWndProc;
  110.     wc.cbClsExtra = 0;
  111.     wc.cbWndExtra = 0;
  112.     wc.hInstance = hInstance;
  113.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  114.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  115.     wc.hbrBackground = GetStockObject(WHITE_BRUSH); 
  116.     wc.lpszMenuName =  "ClientMenu";
  117.     wc.lpszClassName = "ClientWClass";
  118.  
  119.     if (!RegisterClass(&wc))
  120.     return (FALSE);
  121.  
  122.     wc.style = NULL;
  123.     wc.lpfnWndProc = DDEWndProc;
  124.     wc.cbClsExtra = 0;
  125.     wc.cbWndExtra = 0;
  126.     wc.hInstance = hInstance;
  127.     wc.hIcon = NULL;
  128.     wc.hCursor = NULL;
  129.     wc.hbrBackground = NULL;
  130.     wc.lpszMenuName =  NULL;
  131.     wc.lpszClassName = "ClientDDEWndClass";
  132.  
  133.     return (RegisterClass(&wc));
  134. }
  135.  
  136.  
  137. /****************************************************************************
  138.  
  139.     FUNCTION: InitAddedInstance
  140.  
  141.     PURPOSE:  Increment instance counter.
  142.  
  143. ****************************************************************************/
  144. void InitAddedInstance(hInstance, hPrevInstance)
  145.     HANDLE  hInstance;
  146.     HANDLE  hPrevInstance;
  147. {
  148.     GetInstanceData(hPrevInstance, (NPSTR)&nInstCount, sizeof(int));
  149.     nInstCount++;
  150.     return;
  151. }
  152.  
  153.  
  154.  
  155. /****************************************************************************
  156.  
  157.     FUNCTION:  InitInstance(HANDLE, int)
  158.  
  159.     PURPOSE:  Saves instance handle and creates main window
  160.  
  161. ****************************************************************************/
  162.  
  163. BOOL InitInstance(hInstance, nCmdShow)
  164.     HANDLE          hInstance;
  165.     int             nCmdShow;
  166. {
  167.     hInst = hInstance;
  168.  
  169.     hwndMain = CreateWindow(
  170.         "ClientWClass",
  171.         "Client",
  172.         WS_OVERLAPPEDWINDOW,
  173.         CW_USEDEFAULT,
  174.         CW_USEDEFAULT,
  175.         CW_USEDEFAULT,
  176.         CW_USEDEFAULT,
  177.         NULL,
  178.         NULL,
  179.         hInstance,
  180.         NULL
  181.     );
  182.  
  183.     if (!hwndMain)
  184.         return (FALSE);
  185.  
  186.     InitDataTextMetrics();
  187.     InitAckTimeOut();        /* in module CLIDDE */
  188.  
  189.     MoveWindow(hwndMain,
  190.         xDelta*(5+nInstCount), 
  191.         ((nInstCount-1)&1)*nVertRes/2 + yDelta*nInstCount,
  192.         xDelta*30, 
  193.         yDelta*12,
  194.         FALSE);
  195.  
  196.     if ((cfLink = RegisterClipboardFormat("Link")) == NULL)
  197.     return (FALSE);
  198.  
  199.     ShowWindow(hwndMain, nCmdShow);
  200.     UpdateWindow(hwndMain);
  201.  
  202.     return (TRUE);
  203.  
  204. }
  205.  
  206. /****************************************************************************
  207.  
  208.     FUNCTION: MainWndProc(HWND, WORD, WORD, LONG)
  209.  
  210.     PURPOSE:  Processes messages for client application.
  211.           DDE messages are handled by DDEWndProc in CLIDDE.C.
  212.  
  213. ****************************************************************************/
  214.  
  215. long FAR PASCAL MainWndProc(hwnd, message, wParam, lParam)
  216. HWND hwnd;
  217. WORD message;
  218. WORD wParam;
  219. LONG lParam;
  220. {
  221.     switch (message) 
  222.     {
  223.         case WM_PAINT:
  224.         PaintConvData(hwnd);
  225.             return (0L);
  226.  
  227.         case WM_INITMENU:
  228.             if (wParam == GetMenu(hwnd))
  229.             {
  230.         if (IsClipboardFormatAvailable(cfLink))
  231.             EnableMenuItem(wParam, IDM_PASTELINK, MF_ENABLED);
  232.         else
  233.             EnableMenuItem(wParam, IDM_PASTELINK, MF_GRAYED);
  234.             }
  235.             return (0L);
  236.  
  237.         case WM_COMMAND:
  238.             switch (wParam) 
  239.             {
  240.         case IDM_INITIATE:
  241.                     /* If we are in the process of terminating, no new
  242.                        conversations are allowed */
  243.                     if (!bTerminating) 
  244.                     {
  245.             DoDialog("Initiate", (FARPROC)InitiateDlgProc);
  246.                     }
  247.                     return 0L;
  248.  
  249.                 case IDM_TERMINATE:
  250.             DoDialog("Terminate", (FARPROC)TerminateDlgProc);
  251.                     return 0L;
  252.  
  253.                 case IDM_ADVISE:
  254.             DoDialog("Advise", (FARPROC)AdviseDlgProc);
  255.                     return 0L;
  256.  
  257.                 case IDM_UNADVISE:
  258.             DoDialog("Unadvise", (FARPROC)UnadviseDlgProc);
  259.                     return 0L;
  260.  
  261.                 case IDM_REQUEST:
  262.             DoDialog("Request", (FARPROC)RequestDlgProc);
  263.                     return 0L;
  264.  
  265.                 case IDM_POKE:
  266.             DoDialog("Poke", (FARPROC)PokeDlgProc);
  267.                     return 0L;
  268.  
  269.                 case IDM_PASTELINK:
  270.             DoPasteLink();
  271.                     return 0L;
  272.  
  273.                 case IDM_CLEAR:
  274.             DoDialog("Clear", (FARPROC)ClearDlgProc);
  275.                     return 0L;
  276.  
  277.         case IDM_EXECUTE:
  278.             DoDialog("Execute", (FARPROC)ExecuteDlgProc);
  279.             return 0L;
  280.  
  281.         case IDM_ABOUT:
  282.             DoDialog("About", (FARPROC)AboutDlgProc);
  283.             break;
  284.  
  285.                 default:
  286.                     return (DefWindowProc(hwnd, message, wParam, lParam));
  287.             }
  288.             break;
  289.  
  290.         case WM_DESTROY:
  291.             /* Terminate all DDE conversations before destroying 
  292.                client window */
  293.         bTerminating = TRUE;
  294.         TerminateConversations();
  295.             PostQuitMessage(0);
  296.             break;
  297.         
  298.     default:
  299.         return (DefWindowProc(hwnd, message, wParam, lParam));
  300.     }
  301.     return (0L);
  302. }
  303.  
  304.  
  305. /****************************************************************************
  306.  
  307.     FUNCTION: DoDialog
  308.  
  309.     PURPOSE:  Creates dialog given dialog i.d.
  310.  
  311. ****************************************************************************/
  312. int NEAR DoDialog(szDialog, lpfnDlgProc)
  313.     char   * szDialog;
  314.     FARPROC  lpfnDlgProc;
  315. {
  316.     int      nReturn;
  317.  
  318.     lpfnDlgProc = MakeProcInstance(lpfnDlgProc, hInst);
  319.     nReturn = DialogBox(hInst, 
  320.     szDialog,
  321.     hwndMain,
  322.         lpfnDlgProc);
  323.     FreeProcInstance(lpfnDlgProc);
  324.     return  (nReturn);
  325. }
  326.  
  327.  
  328.  
  329. /****************************************************************************
  330.  
  331.     FUNCTION: AboutDlgProc(HWND, unsigned, WORD, LONG)
  332.  
  333.     PURPOSE:  Processes messages for "About" dialog box
  334.  
  335. ****************************************************************************/
  336.  
  337. BOOL FAR PASCAL AboutDlgProc(hDlg, message, wParam, lParam)
  338.     HWND hDlg;
  339.     unsigned message;
  340.     WORD wParam;
  341.     LONG lParam;
  342. {
  343.     switch (message) {
  344.     case WM_INITDIALOG:
  345.         return (TRUE);
  346.  
  347.     case WM_COMMAND:
  348.         if (wParam == IDOK || wParam == IDCANCEL) {
  349.         EndDialog(hDlg, TRUE);
  350.         return (TRUE);
  351.         }
  352.         break;
  353.     }
  354.     return (FALSE);
  355. }
  356.  
  357.  
  358.  
  359. /****************************************************************************
  360.  
  361.     FUNCTION: AdviseDlgProc
  362.  
  363.     PURPOSE:  Processes messages for the Advise dialog.
  364.  
  365. ****************************************************************************/
  366. BOOL FAR PASCAL AdviseDlgProc(hdlg, message, wParam, lParam)
  367.     HWND      hdlg;
  368.     unsigned  message;
  369.     WORD      wParam;
  370.     LONG      lParam;
  371. {
  372.     HWND  hwndServerDDE;
  373.  
  374.     switch (message) 
  375.     {
  376.         case WM_INITDIALOG:
  377.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  378.             return (TRUE);
  379.  
  380.         case WM_COMMAND:
  381.             switch (wParam) 
  382.             {
  383.                 case IDC_OK:
  384.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  385.                     GetDlgItemText(hdlg, 
  386.                         IDC_ITEM,
  387.                         (LPSTR)szSelectedItem,
  388.                         ITEM_MAX_SIZE);
  389.             if (DoesAdviseAlreadyExist(hwndSelectedClientDDE,
  390.                                                szSelectedItem))
  391.                         MessageBox(hdlg, "Advisory already established",
  392.                             "Client", MB_ICONEXCLAMATION | MB_OK);
  393.                     else {
  394.             hwndServerDDE
  395.                 = GetHwndServerDDE(hwndSelectedClientDDE);
  396.             SendAdvise(hwndSelectedClientDDE,
  397.                 hwndServerDDE,
  398.                 szSelectedItem);
  399.             }
  400.             return (TRUE);
  401.  
  402.                 case IDC_CANCEL:
  403.                     EndDialog(hdlg, FALSE);
  404.             return (FALSE);
  405.             }
  406.  
  407.         default:
  408.             return (FALSE);
  409.     }
  410.     return (FALSE);
  411. }
  412.  
  413.  
  414.  
  415. /****************************************************************************
  416.  
  417.     FUNCTION: ClearDlgProc
  418.  
  419.     PURPOSE:  Processes messages for the Clear dialog.
  420.  
  421. ****************************************************************************/
  422. BOOL FAR PASCAL ClearDlgProc(hdlg, message, wParam, lParam)
  423.     HWND      hdlg;
  424.     unsigned  message;
  425.     WORD      wParam;
  426.     LONG      lParam;
  427. {
  428.     HWND  hwndServerDDE;
  429.  
  430.     switch (message) 
  431.     {
  432.         case WM_INITDIALOG:
  433.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  434.             return (TRUE);
  435.  
  436.         case WM_COMMAND:
  437.             switch (wParam) 
  438.             {
  439.                 case IDC_OK:
  440.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  441.                     GetDlgItemText(hdlg, 
  442.                         IDC_ITEM,
  443.                         (LPSTR)szSelectedItem,
  444.                         ITEM_MAX_SIZE);
  445.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  446.             SendUnadvise(hwndSelectedClientDDE,
  447.             hwndServerDDE,
  448.             szSelectedItem);
  449.                     EndDialog(hdlg, TRUE);
  450.             return (TRUE);
  451.  
  452.                 case IDC_CANCEL:
  453.                     EndDialog(hdlg, FALSE);
  454.                     return (TRUE);
  455.             }
  456.         default:
  457.             return (FALSE);
  458.     }
  459.     return (FALSE);
  460. }
  461.  
  462.  
  463.  
  464. /****************************************************************************
  465.  
  466.     FUNCTION: ExecuteDlgProc
  467.  
  468.     PURPOSE:  Processes messages for the Execute dialog.
  469.  
  470. ****************************************************************************/
  471. BOOL FAR PASCAL ExecuteDlgProc(hdlg, message, wParam, lParam)
  472.     HWND      hdlg;
  473.     unsigned  message;
  474.     WORD      wParam;
  475.     LONG      lParam;
  476. {
  477.     HWND  hwndServerDDE;
  478.     char  szExecuteString[EXECUTE_STRING_MAX_SIZE+1];
  479.  
  480.     switch (message) 
  481.     {
  482.         case WM_INITDIALOG:
  483.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  484.             return (TRUE);
  485.  
  486.         case WM_COMMAND:
  487.             switch (wParam) 
  488.             {
  489.                 case IDC_OK:
  490.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  491.                     GetDlgItemText(hdlg, 
  492.             IDC_EXECUTE_STRING,
  493.             (LPSTR)szExecuteString,
  494.             EXECUTE_STRING_MAX_SIZE);
  495.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  496.             SendExecute(hwndSelectedClientDDE,
  497.             hwndServerDDE,
  498.             szExecuteString);
  499.             return (TRUE);
  500.  
  501.                 case IDC_CANCEL:
  502.                     EndDialog(hdlg, FALSE);
  503.             return (TRUE);
  504.             }
  505.  
  506.         default:
  507.             return (FALSE);
  508.     }
  509.     return (FALSE);
  510. }
  511.  
  512.  
  513.  
  514.  
  515. /****************************************************************************
  516.  
  517.     FUNCTION: InitiateDlgProc
  518.  
  519.     PURPOSE:  Processes messages for the Initiate dialog.
  520.  
  521. ****************************************************************************/
  522. BOOL FAR PASCAL InitiateDlgProc(hdlg, message, wParam, lParam)
  523.     HWND      hdlg;
  524.     unsigned  message;
  525.     WORD      wParam;
  526.     LONG      lParam;
  527. {
  528.     HWND      hwndClientDDE;
  529.  
  530.     switch (message) 
  531.     {
  532.         case WM_INITDIALOG:
  533.             return (TRUE);
  534.  
  535.         case WM_COMMAND:
  536.             switch (wParam) 
  537.             {
  538.                 case IDC_OK:
  539.                     GetDlgItemText(hdlg, 
  540.                         IDC_APPLICATION,
  541.                         (LPSTR)szSelectedApplication,
  542.                         APP_MAX_SIZE);
  543.                     GetDlgItemText(hdlg, 
  544.                         IDC_TOPIC,
  545.                         (LPSTR)szSelectedTopic,
  546.                         TOPIC_MAX_SIZE);
  547.                     EndDialog(hdlg, TRUE);
  548.             if ((hwndClientDDE
  549.             = SendInitiate(szSelectedApplication, szSelectedTopic)) != 0)
  550.             {
  551.             LetUserPickConversation(hwndClientDDE);
  552.             InvalidateRect(hwndMain, NULL, TRUE);
  553.             }
  554.             return (TRUE);
  555.                         
  556.                 case IDC_CANCEL:
  557.                     EndDialog(hdlg, FALSE);
  558.                     return (TRUE);
  559.             }
  560.         default:
  561.             return (FALSE);
  562.     }
  563.     return (FALSE);
  564. }
  565.  
  566.  
  567.  
  568.  
  569. /****************************************************************************
  570.  
  571.     FUNCTION: PokeDlgProc
  572.  
  573.     PURPOSE:  Processes messages for the Poke dialog.
  574.  
  575. ****************************************************************************/
  576. BOOL FAR PASCAL PokeDlgProc(hdlg, message, wParam, lParam)
  577.     HWND      hdlg;
  578.     unsigned  message;
  579.     WORD      wParam;
  580.     LONG      lParam;
  581. {
  582.     HWND  hwndServerDDE;
  583.  
  584.     switch (message) 
  585.     {
  586.         case WM_INITDIALOG:
  587.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  588.             return (TRUE);
  589.  
  590.         case WM_COMMAND:
  591.             switch (wParam) 
  592.             {
  593.                 case IDC_OK:
  594.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  595.                     GetDlgItemText(hdlg, 
  596.                         IDC_ITEM,
  597.                         (LPSTR)szSelectedItem,
  598.                         ITEM_MAX_SIZE);
  599.                     GetDlgItemText(hdlg,
  600.                         IDC_VALUE,
  601.                         (LPSTR)szSelectedValue,
  602.                         VALUE_MAX_SIZE);
  603.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  604.             SendPoke(hwndSelectedClientDDE,
  605.             hwndServerDDE,
  606.                         szSelectedItem,
  607.                         szSelectedValue);
  608.             return (TRUE);
  609.  
  610.                 case IDC_CANCEL:
  611.                     EndDialog(hdlg, FALSE);
  612.             return (TRUE);
  613.             }
  614.  
  615.         default:
  616.             return (FALSE);
  617.     }
  618.     return (FALSE);
  619. }
  620.  
  621.  
  622. /****************************************************************************
  623.  
  624.     FUNCTION: RequestDlgProc
  625.  
  626.     PURPOSE:  Processes messages for the Request dialog.
  627.  
  628. ****************************************************************************/
  629. BOOL FAR PASCAL RequestDlgProc(hdlg, message, wParam, lParam)
  630.     HWND      hdlg;
  631.     unsigned  message;
  632.     WORD      wParam;
  633.     LONG      lParam;
  634. {
  635.     HWND  hwndServerDDE;
  636.  
  637.     switch (message) 
  638.     {
  639.         case WM_INITDIALOG:
  640.             hwndRequestDlg = hdlg;
  641.             bInRequestDlg = TRUE;
  642.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  643.             return (TRUE);
  644.  
  645.         case WM_COMMAND:
  646.             switch (wParam) 
  647.             {
  648.                 case IDC_OK:
  649.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  650.                     GetDlgItemText(hdlg, 
  651.                         IDC_ITEM,
  652.                         (LPSTR)szSelectedItem,
  653.                         ITEM_MAX_SIZE);
  654.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  655.             SendRequest(hwndSelectedClientDDE,
  656.             hwndServerDDE,
  657.             szSelectedItem);
  658.             return (TRUE);
  659.  
  660.                 case IDC_CANCEL:
  661.                     bInRequestDlg = FALSE;
  662.                     EndDialog(hdlg, FALSE);
  663.                     return (TRUE);
  664.             }
  665.             break;
  666.  
  667.         case WM_DESTROY:
  668.             bInRequestDlg = FALSE;
  669.             return (FALSE);
  670.  
  671.         default:
  672.             return (FALSE);
  673.     }
  674.     return (FALSE);
  675. }
  676.  
  677.  
  678.  
  679. /****************************************************************************
  680.  
  681.     FUNCTION: TerminateDlgProc
  682.  
  683.     PURPOSE:  Processes messages for the Terminate dialog.
  684.  
  685. ****************************************************************************/
  686. BOOL FAR PASCAL TerminateDlgProc(hdlg, message, wParam, lParam)
  687.     HWND      hdlg;
  688.     unsigned  message;
  689.     WORD      wParam;
  690.     LONG      lParam;
  691. {
  692.     HWND hwndServerDDE;
  693.  
  694.     switch (message) 
  695.     {
  696.         case WM_INITDIALOG:
  697.         AddConversationsToBox(hdlg, LB_ADDSTRING);
  698.             return (TRUE);
  699.         
  700.         case WM_COMMAND:
  701.             switch (wParam) 
  702.             {
  703.                 case IDC_OK:
  704.             GetSelectedConversation(hdlg, LB_GETCURSEL, LB_GETTEXT);
  705.                     EndDialog(hdlg, TRUE);
  706.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  707.             SendTerminate(hwndSelectedClientDDE, hwndServerDDE);
  708.             return (TRUE);
  709.  
  710.                 case IDC_CANCEL:
  711.                     EndDialog(hdlg, FALSE);
  712.             return (TRUE);
  713.             }
  714.         default:
  715.             return (FALSE);
  716.     }
  717.     return (FALSE);
  718. }
  719.  
  720.  
  721.  
  722.  
  723. /****************************************************************************
  724.  
  725.     FUNCTION: UnadviseDlgProc
  726.  
  727.     PURPOSE:  Processes messages for the Unadvise dialog.
  728.  
  729. ****************************************************************************/
  730. BOOL FAR PASCAL UnadviseDlgProc(hdlg, message, wParam, lParam)
  731.     HWND      hdlg;
  732.     unsigned  message;
  733.     WORD      wParam;
  734.     LONG      lParam;
  735. {
  736.     HWND  hwndServerDDE;
  737.  
  738.     switch (message) 
  739.     {
  740.         case WM_INITDIALOG:
  741.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  742.             return (TRUE);
  743.  
  744.         case WM_COMMAND:
  745.             switch (wParam) 
  746.             {
  747.                 case IDC_OK:
  748.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  749.                     GetDlgItemText(hdlg, 
  750.                         IDC_ITEM,
  751.                         (LPSTR)szSelectedItem,
  752.                         ITEM_MAX_SIZE);
  753.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  754.             SendUnadvise(hwndSelectedClientDDE,
  755.             hwndServerDDE,
  756.                         szSelectedItem);
  757.             return (TRUE);
  758.  
  759.                 case IDC_CANCEL:
  760.                     EndDialog(hdlg, FALSE);
  761.                     return (TRUE);
  762.             }
  763.         default:
  764.             return (FALSE);
  765.     }
  766.     return (FALSE);
  767. }
  768.  
  769.  
  770.  
  771. /****************************************************************
  772.  
  773.     FUNCTION: AddConversationsToBox
  774.  
  775.     PURPOSE:  Add server, app, topic info to client list box
  776.    
  777.  
  778. ****************************************************************/
  779. void AddConversationsToBox(hdlg, nAddMessage)
  780.     HWND      hdlg;
  781.     unsigned  nAddMessage;  /* LB_ADDSTRING or CB_ADDSTRING */
  782. {
  783.     HWND  hwndClientDDE;
  784.     HWND  hctlServerList;
  785.     char  szConvInfo[CONVINFO_MAX_SIZE+1];
  786.     char  szApp[APP_MAX_SIZE+1];
  787.     char  szTopic[TOPIC_MAX_SIZE+1];
  788.  
  789.     hctlServerList = GetDlgItem(hdlg, IDC_CONVBOX);
  790.     SendMessage(hctlServerList,
  791.         nAddMessage == LB_ADDSTRING ? LB_RESETCONTENT : CB_RESETCONTENT,
  792.         0,
  793.         0L);
  794.     hwndClientDDE = NULL;
  795.     while (1)
  796.     {
  797.     if ((hwndClientDDE = GetNextConv(hwndClientDDE)) == 0)
  798.         break;
  799.     itoa((int)hwndClientDDE, szConvInfo, 16);
  800.     strupr(szConvInfo);
  801.     strcat(szConvInfo,"->");
  802.     itoa((int)GetHwndServerDDE(hwndClientDDE),
  803.         szConvInfo+strlen(szConvInfo),
  804.         16);
  805.     strcat(szConvInfo," ");
  806.     GetAppAndTopic(hwndClientDDE, szApp, szTopic);
  807.     strcat(szConvInfo, szApp);
  808.     strcat(szConvInfo, " | ");
  809.     strcat(szConvInfo, szTopic);
  810.  
  811.         SendMessage(hctlServerList,
  812.             nAddMessage,
  813.             0,
  814.         (LONG)szConvInfo);
  815.     }
  816.     if (nAddMessage == CB_ADDSTRING)
  817.     {
  818.     SendMessage(hctlServerList, CB_SETCURSEL, 0, 0L);
  819.     }
  820.     return;
  821. }
  822.  
  823.  
  824. /*********************************************************************
  825.  
  826.     FUNCTION: IsInRequestDlg
  827.  
  828.     PURPOSE:  Returns whether the user is in the Request dialog or not.
  829.  
  830. *********************************************************************/
  831. BOOL IsInRequestDlg()
  832. {
  833.     return (bInRequestDlg);
  834. }
  835.  
  836.  
  837.  
  838. /*********************************************************************
  839.  
  840.     FUNCTION: GetSelectedConversation
  841.  
  842.     PURPOSE:  Gets the user's selection from the conversation list
  843.           box, and returns result in hwndSelectedClientDDE.
  844.  
  845. *********************************************************************/
  846. void NEAR GetSelectedConversation(hdlg, nCurSelMessage, nGetTextMessage)
  847.     HWND      hdlg;
  848.     unsigned  nCurSelMessage;
  849.     unsigned  nGetTextMessage;
  850. {
  851.     HWND hctlConvBox;
  852.     int  nIndex;
  853.     char szConvInfo[CONVINFO_MAX_SIZE+1];
  854.     char * pcBlank;
  855.     
  856.  
  857.     hctlConvBox = GetDlgItem(hdlg, IDC_CONVBOX);
  858.     if ((nIndex = SendMessage(hctlConvBox, nCurSelMessage, 0, 0L))
  859.         != LB_ERR)
  860.     {
  861.     szConvInfo[0] = 0;
  862.     SendMessage(hctlConvBox,
  863.             nGetTextMessage, 
  864.             nIndex, 
  865.         (LONG)szConvInfo);
  866.     /* find '-' in 'hwnd->hwnd' list box entry */
  867.     if ((pcBlank = strchr(szConvInfo, '-')) == 0)
  868.             return;
  869.         *pcBlank = 0;  /* terminate hwnd numeric value */
  870.     hwndSelectedClientDDE = HexToInt(szConvInfo);
  871.      }
  872.      return;
  873. }
  874.  
  875.  
  876.  
  877. /****************************************************************
  878.  
  879.     FUNCTION: InitDataTextMetrics
  880.  
  881.     PURPOSE:  Get font information
  882.  
  883. ****************************************************************/
  884. void InitDataTextMetrics()
  885. {
  886.     HDC hDC;
  887.     TEXTMETRIC tm;
  888.    
  889.     hDC = GetDC(hwndMain);
  890.     GetTextMetrics(hDC, (LPTEXTMETRIC)&tm);
  891.     nHorzRes = GetDeviceCaps(hDC, HORZRES);
  892.     nVertRes = GetDeviceCaps(hDC, VERTRES);
  893.     ReleaseDC(hwndMain, hDC);
  894.     yDelta = tm.tmHeight + tm.tmExternalLeading;
  895.     xDelta = tm.tmAveCharWidth;
  896.     return;
  897. }
  898.  
  899.  
  900. /*********************************************************************
  901.  
  902.     FUNCTION: RequestSatisfied
  903.  
  904.     PURPOSE:  Updates Request dialog box with value requested from
  905.           server.
  906.  
  907. *********************************************************************/
  908. void RequestSatisfied(lpszValue)
  909.     LPSTR lpszValue;
  910. {
  911.     HWND hctlValue;
  912.  
  913.     hctlValue = GetDlgItem(hwndRequestDlg, IDC_VALUE);
  914.     SetWindowText(hctlValue, lpszValue);
  915.     return;
  916. }
  917.  
  918.  
  919. /*********************************************************************
  920.  
  921.     FUNCTION: SetSelectedValue
  922.  
  923.     PURPOSE:  Set specified value.
  924.  
  925. *********************************************************************/
  926. void SetSelectedValue(lpszSelectedValue)
  927.     LPSTR lpszSelectedValue;
  928. {
  929.     lstrcpy((LPSTR)szSelectedValue, lpszSelectedValue);
  930.     return;
  931. }
  932.