home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / d / d020_1_4 / 5.ddi / DDE / CLIENT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-01  |  24.4 KB  |  941 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, unsigned, 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.     HDC         hDC;
  168.     TEXTMETRIC  tm;
  169.  
  170.     hInst = hInstance;
  171.  
  172.     hwndMain = CreateWindow(
  173.         "ClientWClass",
  174.         "Client",
  175.         WS_OVERLAPPEDWINDOW,
  176.         CW_USEDEFAULT,
  177.         CW_USEDEFAULT,
  178.         CW_USEDEFAULT,
  179.         CW_USEDEFAULT,
  180.         NULL,
  181.         NULL,
  182.         hInstance,
  183.         NULL
  184.     );
  185.  
  186.     if (!hwndMain)
  187.         return (FALSE);
  188.  
  189.     InitDataTextMetrics();
  190.     InitAckTimeOut();        /* in module CLIDDE */
  191.  
  192.     MoveWindow(hwndMain,
  193.         xDelta*(5+nInstCount), 
  194.         ((nInstCount-1)&1)*nVertRes/2 + yDelta*nInstCount,
  195.         xDelta*30, 
  196.         yDelta*12,
  197.         FALSE);
  198.  
  199.     if (!(cfLink = RegisterClipboardFormat("Link")))
  200.     return (FALSE);
  201.  
  202.     ShowWindow(hwndMain, nCmdShow);
  203.     UpdateWindow(hwndMain);
  204.  
  205.     return (TRUE);
  206.  
  207. }
  208.  
  209. /****************************************************************************
  210.  
  211.     FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG)
  212.  
  213.     PURPOSE:  Processes messages for client application.
  214.           DDE messages are handled by DDEWndProc in CLIDDE.C.
  215.  
  216. ****************************************************************************/
  217.  
  218. long FAR PASCAL MainWndProc(hwnd, message, wParam, lParam)
  219. HWND hwnd;
  220. unsigned message;
  221. WORD wParam;
  222. LONG lParam;
  223. {
  224.     char  szApplication[APP_MAX_SIZE+1];
  225.     char  szTopic[TOPIC_MAX_SIZE+1];
  226.  
  227.     switch (message) 
  228.     {
  229.         case WM_PAINT:
  230.         PaintConvData(hwnd);
  231.             return (0L);
  232.  
  233.         case WM_INITMENU:
  234.             if (wParam == GetMenu(hwnd))
  235.             {
  236.         if (IsClipboardFormatAvailable(cfLink))
  237.             EnableMenuItem(wParam, IDM_PASTELINK, MF_ENABLED);
  238.         else
  239.             EnableMenuItem(wParam, IDM_PASTELINK, MF_GRAYED);
  240.             }
  241.             return (0L);
  242.  
  243.         case WM_COMMAND:
  244.             switch (wParam) 
  245.             {
  246.         case IDM_INITIATE:
  247.                     /* If we are in the process of terminating, no new
  248.                        conversations are allowed */
  249.                     if (!bTerminating) 
  250.                     {
  251.             DoDialog("Initiate", InitiateDlgProc);
  252.                     }
  253.                     return 0L;
  254.  
  255.                 case IDM_TERMINATE:
  256.             DoDialog("Terminate", TerminateDlgProc);
  257.                     return 0L;
  258.  
  259.                 case IDM_ADVISE:
  260.             DoDialog("Advise", AdviseDlgProc);
  261.                     return 0L;
  262.  
  263.                 case IDM_UNADVISE:
  264.             DoDialog("Unadvise", UnadviseDlgProc);
  265.                     return 0L;
  266.  
  267.                 case IDM_REQUEST:
  268.             DoDialog("Request", RequestDlgProc);
  269.                     return 0L;
  270.  
  271.                 case IDM_POKE:
  272.             DoDialog("Poke", PokeDlgProc);
  273.                     return 0L;
  274.  
  275.                 case IDM_PASTELINK:
  276.             DoPasteLink();
  277.                     return 0L;
  278.  
  279.                 case IDM_CLEAR:
  280.             DoDialog("Clear", ClearDlgProc);
  281.                     return 0L;
  282.  
  283.         case IDM_EXECUTE:
  284.             DoDialog("Execute", ExecuteDlgProc);
  285.             return 0L;
  286.  
  287.         case IDM_ABOUT:
  288.             DoDialog("About", AboutDlgProc);
  289.             break;
  290.  
  291.                 default:
  292.                     return (DefWindowProc(hwnd, message, wParam, lParam));
  293.             }
  294.             break;
  295.  
  296.         case WM_DESTROY:
  297.             /* Terminate all DDE conversations before destroying 
  298.                client window */
  299.         bTerminating = TRUE;
  300.         TerminateConversations();
  301.             PostQuitMessage(0);
  302.             break;
  303.         
  304.     default:
  305.         return (DefWindowProc(hwnd, message, wParam, lParam));
  306.     }
  307.     return (0L);
  308. }
  309.  
  310.  
  311. /****************************************************************************
  312.  
  313.     FUNCTION: DoDialog
  314.  
  315.     PURPOSE:  Creates dialog given dialog i.d.
  316.  
  317. ****************************************************************************/
  318. int NEAR DoDialog(szDialog, lpfnDlgProc)
  319.     char   * szDialog;
  320.     FARPROC  lpfnDlgProc;
  321. {
  322.     int      nReturn;
  323.  
  324.     lpfnDlgProc = MakeProcInstance(lpfnDlgProc, hInst);
  325.     nReturn = DialogBox(hInst, 
  326.     szDialog,
  327.     hwndMain,
  328.         lpfnDlgProc);
  329.     FreeProcInstance(lpfnDlgProc);
  330.     return  (nReturn);
  331. }
  332.  
  333.  
  334.  
  335. /****************************************************************************
  336.  
  337.     FUNCTION: AboutDlgProc(HWND, unsigned, WORD, LONG)
  338.  
  339.     PURPOSE:  Processes messages for "About" dialog box
  340.  
  341. ****************************************************************************/
  342.  
  343. BOOL FAR PASCAL AboutDlgProc(hDlg, message, wParam, lParam)
  344.     HWND hDlg;
  345.     unsigned message;
  346.     WORD wParam;
  347.     LONG lParam;
  348. {
  349.     switch (message) {
  350.     case WM_INITDIALOG:
  351.         return (TRUE);
  352.  
  353.     case WM_COMMAND:
  354.         if (wParam == IDOK || wParam == IDCANCEL) {
  355.         EndDialog(hDlg, TRUE);
  356.         return (TRUE);
  357.         }
  358.         break;
  359.     }
  360.     return (FALSE);
  361. }
  362.  
  363.  
  364.  
  365. /****************************************************************************
  366.  
  367.     FUNCTION: AdviseDlgProc
  368.  
  369.     PURPOSE:  Processes messages for the Advise dialog.
  370.  
  371. ****************************************************************************/
  372. BOOL FAR PASCAL AdviseDlgProc(hdlg, message, wParam, lParam)
  373.     HWND      hdlg;
  374.     unsigned  message;
  375.     WORD      wParam;
  376.     LONG      lParam;
  377. {
  378.     HWND  hwndServerDDE;
  379.  
  380.     switch (message) 
  381.     {
  382.         case WM_INITDIALOG:
  383.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  384.             return (TRUE);
  385.  
  386.         case WM_COMMAND:
  387.             switch (wParam) 
  388.             {
  389.                 case IDC_OK:
  390.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  391.                     GetDlgItemText(hdlg, 
  392.                         IDC_ITEM,
  393.                         (LPSTR)szSelectedItem,
  394.                         ITEM_MAX_SIZE);
  395.             if (DoesAdviseAlreadyExist(hwndSelectedClientDDE,
  396.                                                szSelectedItem))
  397.                         MessageBox(hdlg, "Advisory already established",
  398.                             "Client", MB_ICONEXCLAMATION | MB_OK);
  399.                     else
  400.             hwndServerDDE
  401.                 = GetHwndServerDDE(hwndSelectedClientDDE);
  402.             SendAdvise(hwndSelectedClientDDE,
  403.                 hwndServerDDE,
  404.                 szSelectedItem);
  405.             return (TRUE);
  406.  
  407.                 case IDC_CANCEL:
  408.                     EndDialog(hdlg, FALSE);
  409.             return (FALSE);
  410.             }
  411.  
  412.         default:
  413.             return (FALSE);
  414.     }
  415.     return (FALSE);
  416. }
  417.  
  418.  
  419.  
  420. /****************************************************************************
  421.  
  422.     FUNCTION: ClearDlgProc
  423.  
  424.     PURPOSE:  Processes messages for the Clear dialog.
  425.  
  426. ****************************************************************************/
  427. BOOL FAR PASCAL ClearDlgProc(hdlg, message, wParam, lParam)
  428.     HWND      hdlg;
  429.     unsigned  message;
  430.     WORD      wParam;
  431.     LONG      lParam;
  432. {
  433.     HWND  hwndServerDDE;
  434.     HWND  hctlItemBox;
  435.     int   nIndex;
  436.  
  437.     switch (message) 
  438.     {
  439.         case WM_INITDIALOG:
  440.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  441.             return (TRUE);
  442.  
  443.         case WM_COMMAND:
  444.             switch (wParam) 
  445.             {
  446.                 case IDC_OK:
  447.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  448.                     GetDlgItemText(hdlg, 
  449.                         IDC_ITEM,
  450.                         (LPSTR)szSelectedItem,
  451.                         ITEM_MAX_SIZE);
  452.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  453.             SendUnadvise(hwndSelectedClientDDE,
  454.             hwndServerDDE,
  455.             szSelectedItem);
  456.                     EndDialog(hdlg, TRUE);
  457.             return (TRUE);
  458.  
  459.                 case IDC_CANCEL:
  460.                     EndDialog(hdlg, FALSE);
  461.                     return (TRUE);
  462.             }
  463.         default:
  464.             return (FALSE);
  465.     }
  466.     return (FALSE);
  467. }
  468.  
  469.  
  470.  
  471. /****************************************************************************
  472.  
  473.     FUNCTION: ExecuteDlgProc
  474.  
  475.     PURPOSE:  Processes messages for the Execute dialog.
  476.  
  477. ****************************************************************************/
  478. BOOL FAR PASCAL ExecuteDlgProc(hdlg, message, wParam, lParam)
  479.     HWND      hdlg;
  480.     unsigned  message;
  481.     WORD      wParam;
  482.     LONG      lParam;
  483. {
  484.     HWND  hwndServerDDE;
  485.     char  szExecuteString[EXECUTE_STRING_MAX_SIZE+1];
  486.  
  487.     switch (message) 
  488.     {
  489.         case WM_INITDIALOG:
  490.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  491.             return (TRUE);
  492.  
  493.         case WM_COMMAND:
  494.             switch (wParam) 
  495.             {
  496.                 case IDC_OK:
  497.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  498.                     GetDlgItemText(hdlg, 
  499.             IDC_EXECUTE_STRING,
  500.             (LPSTR)szExecuteString,
  501.             EXECUTE_STRING_MAX_SIZE);
  502.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  503.             SendExecute(hwndSelectedClientDDE,
  504.             hwndServerDDE,
  505.             szExecuteString);
  506.             return (TRUE);
  507.  
  508.                 case IDC_CANCEL:
  509.                     EndDialog(hdlg, FALSE);
  510.             return (TRUE);
  511.             }
  512.  
  513.         default:
  514.             return (FALSE);
  515.     }
  516.     return (FALSE);
  517. }
  518.  
  519.  
  520.  
  521.  
  522. /****************************************************************************
  523.  
  524.     FUNCTION: InitiateDlgProc
  525.  
  526.     PURPOSE:  Processes messages for the Initiate dialog.
  527.  
  528. ****************************************************************************/
  529. BOOL FAR PASCAL InitiateDlgProc(hdlg, message, wParam, lParam)
  530.     HWND      hdlg;
  531.     unsigned  message;
  532.     WORD      wParam;
  533.     LONG      lParam;
  534. {
  535.     HWND      hwndClientDDE;
  536.  
  537.     switch (message) 
  538.     {
  539.         case WM_INITDIALOG:
  540.             return (TRUE);
  541.  
  542.         case WM_COMMAND:
  543.             switch (wParam) 
  544.             {
  545.                 case IDC_OK:
  546.                     GetDlgItemText(hdlg, 
  547.                         IDC_APPLICATION,
  548.                         (LPSTR)szSelectedApplication,
  549.                         APP_MAX_SIZE);
  550.                     GetDlgItemText(hdlg, 
  551.                         IDC_TOPIC,
  552.                         (LPSTR)szSelectedTopic,
  553.                         TOPIC_MAX_SIZE);
  554.                     EndDialog(hdlg, TRUE);
  555.             if (hwndClientDDE
  556.             = SendInitiate(szSelectedApplication, szSelectedTopic))
  557.             {
  558.             LetUserPickConversation(hwndClientDDE);
  559.             InvalidateRect(hwndMain, NULL, TRUE);
  560.             }
  561.             return (TRUE);
  562.                         
  563.                 case IDC_CANCEL:
  564.                     EndDialog(hdlg, FALSE);
  565.                     return (TRUE);
  566.             }
  567.         default:
  568.             return (FALSE);
  569.     }
  570.     return (FALSE);
  571. }
  572.  
  573.  
  574.  
  575.  
  576. /****************************************************************************
  577.  
  578.     FUNCTION: PokeDlgProc
  579.  
  580.     PURPOSE:  Processes messages for the Poke dialog.
  581.  
  582. ****************************************************************************/
  583. BOOL FAR PASCAL PokeDlgProc(hdlg, message, wParam, lParam)
  584.     HWND      hdlg;
  585.     unsigned  message;
  586.     WORD      wParam;
  587.     LONG      lParam;
  588. {
  589.     HWND  hwndServerDDE;
  590.  
  591.     switch (message) 
  592.     {
  593.         case WM_INITDIALOG:
  594.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  595.             return (TRUE);
  596.  
  597.         case WM_COMMAND:
  598.             switch (wParam) 
  599.             {
  600.                 case IDC_OK:
  601.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  602.                     GetDlgItemText(hdlg, 
  603.                         IDC_ITEM,
  604.                         (LPSTR)szSelectedItem,
  605.                         ITEM_MAX_SIZE);
  606.                     GetDlgItemText(hdlg,
  607.                         IDC_VALUE,
  608.                         (LPSTR)szSelectedValue,
  609.                         VALUE_MAX_SIZE);
  610.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  611.             SendPoke(hwndSelectedClientDDE,
  612.             hwndServerDDE,
  613.                         szSelectedItem,
  614.                         szSelectedValue);
  615.             return (TRUE);
  616.  
  617.                 case IDC_CANCEL:
  618.                     EndDialog(hdlg, FALSE);
  619.             return (TRUE);
  620.             }
  621.  
  622.         default:
  623.             return (FALSE);
  624.     }
  625.     return (FALSE);
  626. }
  627.  
  628.  
  629. /****************************************************************************
  630.  
  631.     FUNCTION: RequestDlgProc
  632.  
  633.     PURPOSE:  Processes messages for the Request dialog.
  634.  
  635. ****************************************************************************/
  636. BOOL FAR PASCAL RequestDlgProc(hdlg, message, wParam, lParam)
  637.     HWND      hdlg;
  638.     unsigned  message;
  639.     WORD      wParam;
  640.     LONG      lParam;
  641. {
  642.     HWND  hwndServerDDE;
  643.  
  644.     switch (message) 
  645.     {
  646.         case WM_INITDIALOG:
  647.             hwndRequestDlg = hdlg;
  648.             bInRequestDlg = TRUE;
  649.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  650.             return (TRUE);
  651.  
  652.         case WM_COMMAND:
  653.             switch (wParam) 
  654.             {
  655.                 case IDC_OK:
  656.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  657.                     GetDlgItemText(hdlg, 
  658.                         IDC_ITEM,
  659.                         (LPSTR)szSelectedItem,
  660.                         ITEM_MAX_SIZE);
  661.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  662.             SendRequest(hwndSelectedClientDDE,
  663.             hwndServerDDE,
  664.             szSelectedItem);
  665.             return (TRUE);
  666.  
  667.                 case IDC_CANCEL:
  668.                     bInRequestDlg = FALSE;
  669.                     EndDialog(hdlg, FALSE);
  670.                     return (TRUE);
  671.             }
  672.             break;
  673.  
  674.         case WM_DESTROY:
  675.             bInRequestDlg = FALSE;
  676.             return (FALSE);
  677.  
  678.         default:
  679.             return (FALSE);
  680.     }
  681.     return (FALSE);
  682. }
  683.  
  684.  
  685.  
  686. /****************************************************************************
  687.  
  688.     FUNCTION: TerminateDlgProc
  689.  
  690.     PURPOSE:  Processes messages for the Terminate dialog.
  691.  
  692. ****************************************************************************/
  693. BOOL FAR PASCAL TerminateDlgProc(hdlg, message, wParam, lParam)
  694.     HWND      hdlg;
  695.     unsigned  message;
  696.     WORD      wParam;
  697.     LONG      lParam;
  698. {
  699.     HWND hwndServerDDE;
  700.  
  701.     switch (message) 
  702.     {
  703.         case WM_INITDIALOG:
  704.         AddConversationsToBox(hdlg, LB_ADDSTRING);
  705.             return (TRUE);
  706.         
  707.         case WM_COMMAND:
  708.             switch (wParam) 
  709.             {
  710.                 case IDC_OK:
  711.             GetSelectedConversation(hdlg, LB_GETCURSEL, LB_GETTEXT);
  712.                     EndDialog(hdlg, TRUE);
  713.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  714.             SendTerminate(hwndSelectedClientDDE, hwndServerDDE);
  715.             return (TRUE);
  716.  
  717.                 case IDC_CANCEL:
  718.                     EndDialog(hdlg, FALSE);
  719.             return (TRUE);
  720.             }
  721.         default:
  722.             return (FALSE);
  723.     }
  724.     return (FALSE);
  725. }
  726.  
  727.  
  728.  
  729.  
  730. /****************************************************************************
  731.  
  732.     FUNCTION: UnadviseDlgProc
  733.  
  734.     PURPOSE:  Processes messages for the Unadvise dialog.
  735.  
  736. ****************************************************************************/
  737. BOOL FAR PASCAL UnadviseDlgProc(hdlg, message, wParam, lParam)
  738.     HWND      hdlg;
  739.     unsigned  message;
  740.     WORD      wParam;
  741.     LONG      lParam;
  742. {
  743.     HWND  hctlItemBox;
  744.     int   nIndex;
  745.     HWND  hwndServerDDE;
  746.  
  747.     switch (message) 
  748.     {
  749.         case WM_INITDIALOG:
  750.         AddConversationsToBox(hdlg, CB_ADDSTRING);
  751.             return (TRUE);
  752.  
  753.         case WM_COMMAND:
  754.             switch (wParam) 
  755.             {
  756.                 case IDC_OK:
  757.             GetSelectedConversation(hdlg, CB_GETCURSEL, CB_GETLBTEXT);
  758.                     GetDlgItemText(hdlg, 
  759.                         IDC_ITEM,
  760.                         (LPSTR)szSelectedItem,
  761.                         ITEM_MAX_SIZE);
  762.             hwndServerDDE = GetHwndServerDDE(hwndSelectedClientDDE);
  763.             SendUnadvise(hwndSelectedClientDDE,
  764.             hwndServerDDE,
  765.                         szSelectedItem);
  766.             return (TRUE);
  767.  
  768.                 case IDC_CANCEL:
  769.                     EndDialog(hdlg, FALSE);
  770.                     return (TRUE);
  771.             }
  772.         default:
  773.             return (FALSE);
  774.     }
  775.     return (FALSE);
  776. }
  777.  
  778.  
  779.  
  780. /****************************************************************
  781.  
  782.     FUNCTION: AddConversationsToBox
  783.  
  784.     PURPOSE:  Add server, app, topic info to client list box
  785.    
  786.  
  787. ****************************************************************/
  788. void AddConversationsToBox(hdlg, nAddMessage)
  789.     HWND      hdlg;
  790.     unsigned  nAddMessage;  /* LB_ADDSTRING or CB_ADDSTRING */
  791. {
  792.     HWND  hwndClientDDE;
  793.     HWND  hctlServerList;
  794.     char  szConvInfo[CONVINFO_MAX_SIZE+1];
  795.     char  szApp[APP_MAX_SIZE+1];
  796.     char  szTopic[TOPIC_MAX_SIZE+1];
  797.  
  798.     hctlServerList = GetDlgItem(hdlg, IDC_CONVBOX);
  799.     SendMessage(hctlServerList,
  800.         nAddMessage == LB_ADDSTRING ? LB_RESETCONTENT : CB_RESETCONTENT,
  801.         0,
  802.         0L);
  803.     hwndClientDDE = NULL;
  804.     while (1)
  805.     {
  806.     if (!(hwndClientDDE = GetNextConv(hwndClientDDE)))
  807.         break;
  808.     itoa((int)hwndClientDDE, szConvInfo, 16);
  809.     strupr(szConvInfo);
  810.     strcat(szConvInfo,"->");
  811.     itoa((int)GetHwndServerDDE(hwndClientDDE),
  812.         szConvInfo+strlen(szConvInfo),
  813.         16);
  814.     strcat(szConvInfo," ");
  815.     GetAppAndTopic(hwndClientDDE, szApp, szTopic);
  816.     strcat(szConvInfo, szApp);
  817.     strcat(szConvInfo, " | ");
  818.     strcat(szConvInfo, szTopic);
  819.  
  820.         SendMessage(hctlServerList,
  821.             nAddMessage,
  822.             0,
  823.         (LONG)(LPSTR)szConvInfo);
  824.     }
  825.     if (nAddMessage == CB_ADDSTRING)
  826.     {
  827.     SendMessage(hctlServerList, CB_SETCURSEL, 0, 0L);
  828.     }
  829.     return;
  830. }
  831.  
  832.  
  833. /*********************************************************************
  834.  
  835.     FUNCTION: IsInRequestDlg
  836.  
  837.     PURPOSE:  Returns whether the user is in the Request dialog or not.
  838.  
  839. *********************************************************************/
  840. BOOL IsInRequestDlg()
  841. {
  842.     return (bInRequestDlg);
  843. }
  844.  
  845.  
  846.  
  847. /*********************************************************************
  848.  
  849.     FUNCTION: GetSelectedConversation
  850.  
  851.     PURPOSE:  Gets the user's selection from the conversation list
  852.           box, and returns result in hwndSelectedClientDDE.
  853.  
  854. *********************************************************************/
  855. void NEAR GetSelectedConversation(hdlg, nCurSelMessage, nGetTextMessage)
  856.     HWND      hdlg;
  857.     unsigned  nCurSelMessage;
  858.     unsigned  nGetTextMessage;
  859. {
  860.     HWND hctlConvBox;
  861.     int  nIndex;
  862.     char szConvInfo[CONVINFO_MAX_SIZE+1];
  863.     char * pcBlank;
  864.     
  865.  
  866.     hctlConvBox = GetDlgItem(hdlg, IDC_CONVBOX);
  867.     if ((nIndex = SendMessage(hctlConvBox, nCurSelMessage, 0, 0L))
  868.         != LB_ERR)
  869.     {
  870.     szConvInfo[0] = 0;
  871.     SendMessage(hctlConvBox,
  872.             nGetTextMessage, 
  873.             nIndex, 
  874.         (LONG)(LPSTR)szConvInfo);
  875.     /* find '-' in 'hwnd->hwnd' list box entry */
  876.     if (!(pcBlank = strchr(szConvInfo, '-')))
  877.             return;
  878.         *pcBlank = 0;  /* terminate hwnd numeric value */
  879.     hwndSelectedClientDDE = HexToInt(szConvInfo);
  880.      }
  881.      return;
  882. }
  883.  
  884.  
  885.  
  886. /****************************************************************
  887.  
  888.     FUNCTION: InitDataTextMetrics
  889.  
  890.     PURPOSE:  Get font information
  891.  
  892. ****************************************************************/
  893. void InitDataTextMetrics()
  894. {
  895.     HDC hDC;
  896.     TEXTMETRIC tm;
  897.    
  898.     hDC = GetDC(hwndMain);
  899.     GetTextMetrics(hDC, (LPTEXTMETRIC)&tm);
  900.     nHorzRes = GetDeviceCaps(hDC, HORZRES);
  901.     nVertRes = GetDeviceCaps(hDC, VERTRES);
  902.     ReleaseDC(hwndMain, hDC);
  903.     yDelta = tm.tmHeight + tm.tmExternalLeading;
  904.     xDelta = tm.tmAveCharWidth;
  905.     return;
  906. }
  907.  
  908.  
  909. /*********************************************************************
  910.  
  911.     FUNCTION: RequestSatisfied
  912.  
  913.     PURPOSE:  Updates Request dialog box with value requested from
  914.           server.
  915.  
  916. *********************************************************************/
  917. void RequestSatisfied(lpszValue)
  918.     LPSTR lpszValue;
  919. {
  920.     HWND hctlValue;
  921.  
  922.     hctlValue = GetDlgItem(hwndRequestDlg, IDC_VALUE);
  923.     SetWindowText(hctlValue, lpszValue);
  924.     return;
  925. }
  926.  
  927.  
  928. /*********************************************************************
  929.  
  930.     FUNCTION: SetSelectedValue
  931.  
  932.     PURPOSE:  Set specified value.
  933.  
  934. *********************************************************************/
  935. void SetSelectedValue(lpszSelectedValue)
  936.     LPSTR lpszSelectedValue;
  937. {
  938.     lstrcpy((LPSTR)szSelectedValue, lpszSelectedValue);
  939.     return;
  940. }
  941.