home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddespy.zip / IOS2P016.C next >
C/C++ Source or Header  |  1994-08-12  |  41KB  |  774 lines

  1. /* *******************************************************************
  2.    *** File:   IOS2P016.C                                          ***
  3.    *** Author: Harald (HaWi) Wilhelm                               ***
  4.    *** Date:   14.08.1994                                          ***
  5.    ******************************************************************* */
  6. #define  INCL_BASE
  7. #define  INCL_PM
  8. #include <os2.h>
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13.  
  14. #include "IOS2P016.H"
  15.  
  16. /* *******************************************************************
  17.    *** Function: main                                              ***
  18.    ******************************************************************* */
  19. INT main (VOID)
  20.    {
  21.    HAB hab ;
  22.    HMQ hmq ;
  23.    
  24.    if   ((hab = WinInitialize (QV_OS2)) != NULLHANDLE)                         /* Hello PM */
  25.         {
  26.         if   ((hmq = WinCreateMsgQueue (hab,                                   /* Create Message Queue */
  27.                                         0)) != NULLHANDLE)
  28.              {
  29.              WinDlgBox (HWND_DESKTOP,                                          /* Start Dialog */
  30.                         HWND_DESKTOP,
  31.                         DlgWndProc,
  32.                         NULLHANDLE,
  33.                         IDD_DDESPY,
  34.                         NULL) ;
  35.              WinDestroyMsgQueue (hmq) ;                                        /* Destroy Message Queue */
  36.              }
  37.         WinTerminate (hab) ;                                                   /* Bye PM */
  38.         }
  39.    return 0 ;
  40.    }
  41.  
  42. /* *******************************************************************
  43.    *** Function: DlgWndProc                                        ***
  44.    ******************************************************************* */
  45. MRESULT EXPENTRY DlgWndProc (HWND   hwndDlg,
  46.                              MSG    msg,
  47.                              MPARAM mp1,
  48.                              MPARAM mp2)
  49.    {
  50.    BOOL        f ;
  51.    CHAR        szBuffer [8192] ;
  52.    CONVCONTEXT cctxt ;
  53.    PDDEINIT    pddei ;
  54.    PDDESTRUCT  pdde ;
  55.    PDLG        pdlg ;
  56.    PSZ         psz ;
  57.    PSZ         pszStart ;
  58.    SHORT       s ;
  59.    
  60.    pdlg = WinQueryWindowPtr (hwndDlg,                                          /* Get Pointer to dialogs instance data */
  61.                              QWL_USER) ;
  62.    switch (msg)
  63.       {
  64.       case WM_COMMAND:
  65.            switch (COMMANDMSG (&msg)->cmd)
  66.               {
  67.               case DID_CANCEL:                                                 /* Close application */
  68.                    WinDismissDlg (hwndDlg,
  69.                                   DID_CANCEL) ;
  70.                    return (MRESULT) FALSE ;
  71.               case IDP_DDESPY1:                                                /* Query all running DDE server */
  72.                    WinSendMsg (hwndDlg,
  73.                                WMP_CLEAR,
  74.                                MPFROMLONG (1),
  75.                                MPVOID) ;
  76.                    pdlg->ulRequesttype = DDESPY_REQTYPAPP ;                    /* Save type of requested connection */
  77.                    memset (&cctxt,
  78.                            0,
  79.                            sizeof (CONVCONTEXT)) ;
  80.                    cctxt.cb = sizeof (CONVCONTEXT) ;
  81.                    cctxt.fsContext = DDECTXT_CASESENSITIVE ;
  82.                    cctxt.idCountry = 49 ;
  83.                    cctxt.usCodepage = 850 ;
  84.                    WinDdeInitiate (hwndDlg,                                    /* C'mon guys, who's there? */
  85.                                    "",
  86.                                    "",
  87.                                    &cctxt) ;
  88.                    return (MRESULT) FALSE ;
  89.               case IDP_DDESPY2:                                                /* Query all topics of selected application */
  90.                    WinSendMsg (hwndDlg,
  91.                                WMP_CLEAR,
  92.                                MPFROMLONG (2),
  93.                                MPVOID) ;
  94.                    if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox1,    /* Query application listbox */
  95.                                                         LM_QUERYSELECTION,
  96.                                                         MPFROMSHORT (LIT_FIRST),
  97.                                                         MPVOID))) != LIT_NONE)
  98.                         {
  99.                         WinSendMsg (pdlg->hwndListbox1,
  100.                                     LM_QUERYITEMTEXT,
  101.                                     MPFROM2SHORT (s, sizeof (pdlg->szApplication)),
  102.                                     MPFROMP (pdlg->szApplication)) ;
  103.                         pdlg->ulRequesttype = DDESPY_REQTYPTOP ;               /* Save type of requested connection */
  104.                         memset (&cctxt,
  105.                                 0,
  106.                                 sizeof (CONVCONTEXT)) ;
  107.                         cctxt.cb = sizeof (CONVCONTEXT) ;
  108.                         cctxt.fsContext = DDECTXT_CASESENSITIVE ;
  109.                         cctxt.idCountry = 49 ;
  110.                         cctxt.usCodepage = 850 ;
  111.                         WinDdeInitiate (hwndDlg,
  112.                                         pdlg->szApplication,
  113.                                         "",
  114.                                         &cctxt) ;
  115.                         }
  116.                    return (MRESULT) FALSE ;
  117.               case IDP_DDESPY3:                                                /* Query all Items of a given appilcation/topic */
  118.                    WinSendMsg (hwndDlg,                                        /* In fact only vlid for the System topic */
  119.                                WMP_CLEAR,
  120.                                MPFROMLONG (3),
  121.                                MPVOID) ;
  122.                    if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox1,    /* Query application listbox */
  123.                                                         LM_QUERYSELECTION,
  124.                                                         MPFROMSHORT (LIT_FIRST),
  125.                                                         MPVOID))) != LIT_NONE)
  126.                         {
  127.                         WinSendMsg (pdlg->hwndListbox1,
  128.                                     LM_QUERYITEMTEXT,
  129.                                     MPFROM2SHORT (s, sizeof (pdlg->szApplication)),
  130.                                     MPFROMP (pdlg->szApplication)) ;
  131.                         if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox2, /* Query topic listbox */
  132.                                                              LM_QUERYSELECTION,
  133.                                                              MPFROMSHORT (LIT_FIRST),
  134.                                                              MPVOID))) != LIT_NONE)
  135.                              {
  136.                              WinSendMsg (pdlg->hwndListbox2,
  137.                                          LM_QUERYITEMTEXT,
  138.                                          MPFROM2SHORT (s, sizeof (pdlg->szTopic)),
  139.                                          MPFROMP (pdlg->szTopic)) ;
  140.                              pdlg->ulRequesttype = DDESPY_REQTYPITM ;          /* Save type of requested connection */
  141.                              memset (&cctxt,
  142.                                      0,
  143.                                      sizeof (CONVCONTEXT)) ;
  144.                              cctxt.cb = sizeof (CONVCONTEXT) ;
  145.                              cctxt.fsContext = DDECTXT_CASESENSITIVE ;
  146.                              cctxt.idCountry = 49 ;
  147.                              cctxt.usCodepage = 850 ;
  148.                              WinDdeInitiate (hwndDlg,
  149.                                              pdlg->szApplication,
  150.                                              pdlg->szTopic,
  151.                                              &cctxt) ;
  152.                              }
  153.                         }
  154.                    return (MRESULT) FALSE ;
  155.               case IDP_DDESPY4:                                                /* REQUEST */
  156.                    WinSendMsg (hwndDlg,
  157.                                WMP_CLEAR,
  158.                                MPFROMLONG (4),
  159.                                MPVOID) ;
  160.                    if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox1,    /* Query application listbox */
  161.                                                         LM_QUERYSELECTION,
  162.                                                         MPFROMSHORT (LIT_FIRST),
  163.                                                         MPVOID))) != LIT_NONE)
  164.                         {
  165.                         WinSendMsg (pdlg->hwndListbox1,
  166.                                     LM_QUERYITEMTEXT,
  167.                                     MPFROM2SHORT (s, sizeof (pdlg->szApplication)),
  168.                                     MPFROMP (pdlg->szApplication)) ;
  169.                         if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox2, /* Query topic listbox */
  170.                                                              LM_QUERYSELECTION,
  171.                                                              MPFROMSHORT (LIT_FIRST),
  172.                                                              MPVOID))) != LIT_NONE)
  173.                              {
  174.                              WinSendMsg (pdlg->hwndListbox2,
  175.                                          LM_QUERYITEMTEXT,
  176.                                          MPFROM2SHORT (s, sizeof (pdlg->szTopic)),
  177.                                          MPFROMP (pdlg->szTopic)) ;
  178.                              *pdlg->szItem = '\0' ;
  179.                              if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox3, /* Query item listbox */
  180.                                                                   LM_QUERYSELECTION,
  181.                                                                   MPFROMSHORT (LIT_FIRST),
  182.                                                                   MPVOID))) != LIT_NONE)
  183.                                   {
  184.                                   WinSendMsg (pdlg->hwndListbox3,
  185.                                               LM_QUERYITEMTEXT,
  186.                                               MPFROM2SHORT (s, sizeof (pdlg->szItem)),
  187.                                               MPFROMP (pdlg->szItem)) ;
  188.                                   }
  189.                              else
  190.                                   {
  191.                                   WinQueryDlgItemText (hwndDlg,                /* if item listbox empty query entryfield */
  192.                                                        IDE_DDESPY1,
  193.                                                        sizeof (pdlg->szItem),
  194.                                                        pdlg->szItem) ;
  195.                                   }
  196.                              WinQueryDlgItemText (hwndDlg,                     /* query data (MLE) */
  197.                                                   IDF_DDESPY1,
  198.                                                   sizeof (pdlg->szData),
  199.                                                   pdlg->szData) ;
  200.                              pdlg->ulRequesttype = DDESPY_REQTYPREQ ;          /* save type of requested connection */
  201.                              memset (&cctxt,
  202.                                      0,
  203.                                      sizeof (CONVCONTEXT)) ;
  204.                              cctxt.cb = sizeof (CONVCONTEXT) ;
  205.                              cctxt.fsContext = DDECTXT_CASESENSITIVE ;
  206.                              cctxt.idCountry = 49 ;
  207.                              cctxt.usCodepage = 850 ;
  208.                              WinDdeInitiate (hwndDlg,
  209.                                              pdlg->szApplication,
  210.                                              pdlg->szTopic,
  211.                                              &cctxt) ;
  212.                              }
  213.                         }
  214.                    return (MRESULT) FALSE ;
  215.               case IDP_DDESPY5:                                                /* ADVISE */
  216.                    if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox1,
  217.                                                         LM_QUERYSELECTION,
  218.                                                         MPFROMSHORT (LIT_FIRST),
  219.                                                         MPVOID))) != LIT_NONE)
  220.                         {
  221.                         WinSendMsg (pdlg->hwndListbox1,
  222.                                     LM_QUERYITEMTEXT,
  223.                                     MPFROM2SHORT (s, sizeof (pdlg->szApplication)),
  224.                                     MPFROMP (pdlg->szApplication)) ;
  225.                         if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox2,
  226.                                                              LM_QUERYSELECTION,
  227.                                                              MPFROMSHORT (LIT_FIRST),
  228.                                                              MPVOID))) != LIT_NONE)
  229.                              {
  230.                              WinSendMsg (pdlg->hwndListbox2,
  231.                                          LM_QUERYITEMTEXT,
  232.                                          MPFROM2SHORT (s, sizeof (pdlg->szTopic)),
  233.                                          MPFROMP (pdlg->szTopic)) ;
  234.                              *pdlg->szItem = '\0' ;
  235.                              if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox3,
  236.                                                                   LM_QUERYSELECTION,
  237.                                                                   MPFROMSHORT (LIT_FIRST),
  238.                                                                   MPVOID))) != LIT_NONE)
  239.                                   {
  240.                                   WinSendMsg (pdlg->hwndListbox3,
  241.                                               LM_QUERYITEMTEXT,
  242.                                               MPFROM2SHORT (s, sizeof (pdlg->szItem)),
  243.                                               MPFROMP (pdlg->szItem)) ;
  244.                                   }
  245.                              else
  246.                                   {
  247.                                   WinQueryDlgItemText (hwndDlg,
  248.                                                        IDE_DDESPY1,
  249.                                                        sizeof (pdlg->szItem),
  250.                                                        pdlg->szItem) ;
  251.                                   }
  252.                              WinQueryDlgItemText (hwndDlg,
  253.                                                   IDF_DDESPY1,
  254.                                                   sizeof (pdlg->szData),
  255.                                                   pdlg->szData) ;
  256.                              pdlg->ulRequesttype = DDESPY_REQTYPPKE ;
  257.                              memset (&cctxt,
  258.                                      0,
  259.                                      sizeof (CONVCONTEXT)) ;
  260.                              cctxt.cb = sizeof (CONVCONTEXT) ;
  261.                              cctxt.fsContext = DDECTXT_CASESENSITIVE ;
  262.                              cctxt.idCountry = 49 ;
  263.                              cctxt.usCodepage = 850 ;
  264.                              WinDdeInitiate (hwndDlg,
  265.                                              pdlg->szApplication,
  266.                                              pdlg->szTopic,
  267.                                              &cctxt) ;
  268.                              }
  269.                         }
  270.                    return (MRESULT) FALSE ;
  271.               case IDP_DDESPY6:
  272.                    WinSendMsg (hwndDlg,
  273.                                WMP_CLEAR,
  274.                                MPFROMLONG (4),
  275.                                MPVOID) ;
  276.                    if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox1,
  277.                                                         LM_QUERYSELECTION,
  278.                                                         MPFROMSHORT (LIT_FIRST),
  279.                                                         MPVOID))) != LIT_NONE)
  280.                         {
  281.                         WinSendMsg (pdlg->hwndListbox1,
  282.                                     LM_QUERYITEMTEXT,
  283.                                     MPFROM2SHORT (s, sizeof (pdlg->szApplication)),
  284.                                     MPFROMP (pdlg->szApplication)) ;
  285.                         if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox2,
  286.                                                              LM_QUERYSELECTION,
  287.                                                              MPFROMSHORT (LIT_FIRST),
  288.                                                              MPVOID))) != LIT_NONE)
  289.                              {
  290.                              WinSendMsg (pdlg->hwndListbox2,
  291.                                          LM_QUERYITEMTEXT,
  292.                                          MPFROM2SHORT (s, sizeof (pdlg->szTopic)),
  293.                                          MPFROMP (pdlg->szTopic)) ;
  294.                              *pdlg->szItem = '\0' ;
  295.                              if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox3,
  296.                                                                   LM_QUERYSELECTION,
  297.                                                                   MPFROMSHORT (LIT_FIRST),
  298.                                                                   MPVOID))) != LIT_NONE)
  299.                                   {
  300.                                   WinSendMsg (pdlg->hwndListbox3,
  301.                                               LM_QUERYITEMTEXT,
  302.                                               MPFROM2SHORT (s, sizeof (pdlg->szItem)),
  303.                                               MPFROMP (pdlg->szItem)) ;
  304.                                   }
  305.                              else
  306.                                   {
  307.                                   WinQueryDlgItemText (hwndDlg,
  308.                                                        IDE_DDESPY1,
  309.                                                        sizeof (pdlg->szItem),
  310.                                                        pdlg->szItem) ;
  311.                                   }
  312.                              WinQueryDlgItemText (hwndDlg,
  313.                                                   IDF_DDESPY1,
  314.                                                   sizeof (pdlg->szData),
  315.                                                   pdlg->szData) ;
  316.                              pdlg->ulRequesttype = DDESPY_REQTYPADV ;
  317.                              WinEnableWindow (WinWindowFromID (hwndDlg,
  318.                                                                IDP_DDESPY1),
  319.                                               FALSE) ;
  320.                              WinEnableWindow (WinWindowFromID (hwndDlg,
  321.                                                                IDP_DDESPY2),
  322.                                               FALSE) ;
  323.                              WinEnableWindow (WinWindowFromID (hwndDlg,
  324.                                                                IDP_DDESPY3),
  325.                                               FALSE) ;
  326.                              WinEnableWindow (WinWindowFromID (hwndDlg,
  327.                                                                IDP_DDESPY4),
  328.                                               FALSE) ;
  329.                              WinEnableWindow (WinWindowFromID (hwndDlg,
  330.                                                                IDP_DDESPY5),
  331.                                               FALSE) ;
  332.                              WinEnableWindow (WinWindowFromID (hwndDlg,
  333.                                                                IDP_DDESPY6),
  334.                                               FALSE) ;
  335.                              WinEnableWindow (WinWindowFromID (hwndDlg,
  336.                                                                IDP_DDESPY7),
  337.                                               TRUE) ;
  338.                              memset (&cctxt,
  339.                                      0,
  340.                                      sizeof (CONVCONTEXT)) ;
  341.                              cctxt.cb = sizeof (CONVCONTEXT) ;
  342.                              cctxt.fsContext = DDECTXT_CASESENSITIVE ;
  343.                              cctxt.idCountry = 49 ;
  344.                              cctxt.usCodepage = 850 ;
  345.                              WinDdeInitiate (hwndDlg,
  346.                                              pdlg->szApplication,
  347.                                              pdlg->szTopic,
  348.                                              &cctxt) ;
  349.                              WinEnableWindow (WinWindowFromID (hwndDlg,
  350.                                                                IDP_DDESPY7),
  351.                                               TRUE) ;
  352.                              }
  353.                         }
  354.                    return (MRESULT) FALSE ;
  355.               case IDP_DDESPY7:
  356.                    WinEnableWindow (WinWindowFromID (hwndDlg,
  357.                                                      IDP_DDESPY1),
  358.                                     TRUE) ;
  359.                    WinEnableWindow (WinWindowFromID (hwndDlg,
  360.                                                      IDP_DDESPY2),
  361.                                     TRUE) ;
  362.                    WinEnableWindow (WinWindowFromID (hwndDlg,
  363.                                                      IDP_DDESPY3),
  364.                                     TRUE) ;
  365.                    WinEnableWindow (WinWindowFromID (hwndDlg,
  366.                                                      IDP_DDESPY4),
  367.                                     TRUE) ;
  368.                    WinEnableWindow (WinWindowFromID (hwndDlg,
  369.                                                      IDP_DDESPY5),
  370.                                     TRUE) ;
  371.                    WinEnableWindow (WinWindowFromID (hwndDlg,
  372.                                                      IDP_DDESPY6),
  373.                                     TRUE) ;
  374.                    WinEnableWindow (WinWindowFromID (hwndDlg,
  375.                                                      IDP_DDESPY7),
  376.                                     FALSE) ;
  377.                    WinDdePostMsg (pdlg->hwndServer,
  378.                                   hwndDlg,
  379.                                   WM_DDE_TERMINATE,
  380.                                   NULL,
  381.                                   DDEPM_RETRY) ;
  382.                    pdlg->hwndServer = NULLHANDLE ;
  383.                    return (MRESULT) FALSE ;
  384.               }
  385.            break ;
  386.       case WM_CONTROL:
  387.            switch (SHORT1FROMMP (mp1))
  388.               {
  389.               case IDL_DDESPY1:
  390.                    switch (SHORT2FROMMP (mp1))
  391.                       {
  392.                       case LN_SELECT:
  393.                            WinSendMsg (hwndDlg,
  394.                                        WMP_CLEAR,
  395.                                        MPFROMLONG (2),
  396.                                        MPVOID) ;
  397.                            WinEnableWindow (WinWindowFromID (hwndDlg,
  398.                                                              IDP_DDESPY3),
  399.                                             FALSE) ;
  400.                            break ;
  401.                       }
  402.                    break ;
  403.               case IDL_DDESPY2:
  404.                    switch (SHORT2FROMMP (mp1))
  405.                       {
  406.                       case LN_SELECT:
  407.                            WinSendMsg (hwndDlg,
  408.                                        WMP_CLEAR,
  409.                                        MPFROMLONG (3),
  410.                                        MPVOID) ;
  411.                            if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox2,
  412.                                                                 LM_QUERYSELECTION,
  413.                                                                 MPFROMSHORT (LIT_FIRST),
  414.                                                                 MPVOID))) != LIT_NONE)
  415.                                 {
  416.                                 WinSendMsg (pdlg->hwndListbox2,
  417.                                             LM_QUERYITEMTEXT,
  418.                                             MPFROM2SHORT (s, sizeof (szBuffer)),
  419.                                             MPFROMP (szBuffer)) ;
  420.                                 if   (stricmp (szBuffer,
  421.                                                SZDDESYS_TOPIC) == 0)
  422.                                      {
  423.                                      f = TRUE ;
  424.                                      }
  425.                                 else
  426.                                      {
  427.                                      f = FALSE ;
  428.                                      }
  429.                                 WinEnableWindow (WinWindowFromID (hwndDlg,
  430.                                                                   IDP_DDESPY3),
  431.                                                  f) ;
  432.                                 WinEnableWindow (WinWindowFromID (hwndDlg,
  433.                                                                   IDE_DDESPY1),
  434.                                                  !f) ;
  435.                                 }
  436.                            break ;
  437.                       }
  438.                    break ;
  439.               }
  440.            break ;
  441.       case WM_DDE_ACK:
  442.            if   (!PVOIDFROMMP (mp2))
  443.                 {
  444.                 return (MRESULT) FALSE ;
  445.                 }
  446.            pdde = PVOIDFROMMP (mp2) ;
  447.            f = FALSE ;
  448.            if   (pdde->fsStatus & DDE_FBUSY)
  449.                 {
  450.                 WinMessageBox (HWND_DESKTOP,
  451.                                HWND_DESKTOP,
  452.                                "DDE Server busy",
  453.                                "DDE Notification",
  454.                                0,
  455.                                MB_OK) ;
  456.                 }
  457.            else
  458.                 {
  459.                 if   (pdde->fsStatus & DDE_NOTPROCESSED)
  460.                      {
  461.                      WinMessageBox (HWND_DESKTOP,
  462.                                     HWND_DESKTOP,
  463.                                     "Unsupported DDE transaction data",
  464.                                     "DDE Notification",
  465.                                     0,
  466.                                     MB_OK) ;
  467.                      }
  468.                 else
  469.                      {
  470.                      if   (!(pdde->fsStatus & DDE_FACK))
  471.                           {
  472.                           f = TRUE ;
  473.                           }
  474.                      }
  475.                 }
  476.            if   (!f)
  477.                 {
  478.                 WinDdePostMsg (HWNDFROMMP (mp1),
  479.                                hwndDlg,
  480.                                WM_DDE_TERMINATE,
  481.                                NULL,
  482.                                DDEPM_RETRY) ;
  483.                 }
  484.            DosFreeMem (pdde) ;
  485.            return (MRESULT) FALSE ;
  486.       case WM_DDE_DATA:
  487.            if   (!PVOIDFROMMP (mp2))
  488.                 {
  489.                 return (MRESULT) FALSE ;
  490.                 }
  491.            pdde = PVOIDFROMMP (mp2) ;
  492.            switch (pdlg->ulRequesttype)
  493.               {
  494.               case DDESPY_REQTYPITM:
  495.                    strcpy (szBuffer,
  496.                            DDES_PABDATA (pdde)) ;
  497.                    pszStart = szBuffer ;
  498.                    psz = pszStart ;
  499.                    while (*psz)
  500.                       {
  501.                       if   ((*psz == '\t') &&
  502.                             (psz != pszStart))
  503.                            {
  504.                            *psz = '\0' ;
  505.                            if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox3,
  506.                                                                 LM_INSERTITEM,
  507.                                                                 MPFROMSHORT (LIT_END),
  508.                                                                 MPFROMP (pszStart)))) == 0)
  509.                                 {
  510.                                 WinSendMsg (pdlg->hwndListbox3,
  511.                                             LM_SELECTITEM,
  512.                                             MPFROMSHORT (s),
  513.                                             MPFROMSHORT (TRUE)) ;
  514.                                 }
  515.                            *psz = '\t' ;
  516.                            pszStart = psz + 1 ;
  517.                            }
  518.                       psz++ ;
  519.                       }
  520.                    if   (psz != pszStart)
  521.                         {
  522.                         if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox3,
  523.                                                              LM_INSERTITEM,
  524.                                                              MPFROMSHORT (LIT_END),
  525.                                                              MPFROMP (pszStart)))) == 0)
  526.                              {
  527.                              WinSendMsg (pdlg->hwndListbox3,
  528.                                          LM_SELECTITEM,
  529.                                          MPFROMSHORT (s),
  530.                                          MPFROMSHORT (TRUE)) ;
  531.                              }
  532.                         }
  533.                    WinDdePostMsg (HWNDFROMMP (mp1),
  534.                                   hwndDlg,
  535.                                   WM_DDE_TERMINATE,
  536.                                   NULL,
  537.                                   DDEPM_RETRY) ;
  538.                    break ;
  539.               case DDESPY_REQTYPADV:
  540.                    WinSetDlgItemText (hwndDlg,
  541.                                       IDF_DDESPY1,
  542.                                       DDES_PABDATA (pdde)) ;
  543.                    break ;
  544.               case DDESPY_REQTYPREQ:
  545.                    WinSetDlgItemText (hwndDlg,
  546.                                       IDF_DDESPY1,
  547.                                       DDES_PABDATA (pdde)) ;
  548.                    WinDdePostMsg (HWNDFROMMP (mp1),
  549.                                   hwndDlg,
  550.                                   WM_DDE_TERMINATE,
  551.                                   NULL,
  552.                                   DDEPM_RETRY) ;
  553.                    break ;
  554.               }
  555.            DosFreeMem (pdde) ;
  556.            return (MRESULT) FALSE ;
  557.       case WM_DDE_INITIATEACK:
  558.            if   (!PVOIDFROMMP (mp2))
  559.                 {
  560.                 return (MRESULT) FALSE ;
  561.                 }
  562.            pddei = PVOIDFROMMP (mp2) ;
  563.            switch (pdlg->ulRequesttype)
  564.               {
  565.               case DDESPY_REQTYPAPP:
  566.                    if   ((SHORT) SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox1,
  567.                                                            LM_SEARCHSTRING,
  568.                                                            MPFROM2SHORT (LSS_CASESENSITIVE, LIT_FIRST),
  569.                                                            MPFROMP (pddei->pszAppName))) == LIT_NONE)
  570.                         {
  571.                         if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox1,
  572.                                                              LM_INSERTITEM,
  573.                                                              MPFROMSHORT (LIT_END),
  574.                                                              MPFROMP (pddei->pszAppName)))) == 0)
  575.                              {
  576.                              WinSendMsg (pdlg->hwndListbox1,
  577.                                          LM_SELECTITEM,
  578.                                          MPFROMSHORT (s),
  579.                                          MPFROMSHORT (TRUE)) ;
  580.                              }
  581.                         }
  582.                    WinDdePostMsg (HWNDFROMMP (mp1),
  583.                                   hwndDlg,
  584.                                   WM_DDE_TERMINATE,
  585.                                   NULL,
  586.                                   DDEPM_RETRY) ;
  587.                    break ;
  588.               case DDESPY_REQTYPTOP:
  589.                    if   ((SHORT) SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox2,
  590.                                                            LM_SEARCHSTRING,
  591.                                                            MPFROM2SHORT (LSS_CASESENSITIVE, LIT_FIRST),
  592.                                                            MPFROMP (pddei->pszTopic))) == LIT_NONE)
  593.                         {
  594.                         if   ((s = SHORT1FROMMR (WinSendMsg (pdlg->hwndListbox2,
  595.                                                              LM_INSERTITEM,
  596.                                                              MPFROMSHORT (LIT_END),
  597.                                                              MPFROMP (pddei->pszTopic)))) == 0)
  598.                              {
  599.                              WinSendMsg (pdlg->hwndListbox2,
  600.                                          LM_SELECTITEM,
  601.                                          MPFROMSHORT (s),
  602.                                          MPFROMSHORT (TRUE)) ;
  603.                              }
  604.                         }
  605.                    WinDdePostMsg (HWNDFROMMP (mp1),
  606.                                   hwndDlg,
  607.                                   WM_DDE_TERMINATE,
  608.                                   NULL,
  609.                                   DDEPM_RETRY) ;
  610.                    break ;
  611.               case DDESPY_REQTYPITM:
  612.                    pdde = MakeDDESeg (HWNDFROMMP (mp1),
  613.                                       SZDDESYS_ITEM_SYSITEMS,
  614.                                       0,
  615.                                       CF_TEXT,
  616.                                       NULL,
  617.                                       0) ;
  618.                    WinDdePostMsg (HWNDFROMMP (mp1),
  619.                                   hwndDlg,
  620.                                   WM_DDE_REQUEST,
  621.                                   pdde,
  622.                                   DDEPM_RETRY) ;
  623.                    break ;
  624.               case DDESPY_REQTYPREQ:
  625.                    pdde = MakeDDESeg (HWNDFROMMP (mp1),
  626.                                       pdlg->szItem,
  627.                                       0,
  628.                                       CF_TEXT,
  629.                                       pdlg->szData,
  630.                                       strlen (pdlg->szData) + 1) ;
  631.                    WinDdePostMsg (HWNDFROMMP (mp1),
  632.                                   hwndDlg,
  633.                                   WM_DDE_REQUEST,
  634.                                   pdde,
  635.                                   DDEPM_RETRY) ;
  636.                    break ;
  637.               case DDESPY_REQTYPPKE:
  638.                    pdde = MakeDDESeg (HWNDFROMMP (mp1),
  639.                                       pdlg->szItem,
  640.                                       DDE_FACKREQ,
  641.                                       CF_TEXT,
  642.                                       pdlg->szData,
  643.                                       strlen (pdlg->szData) + 1) ;
  644.                    WinDdePostMsg (HWNDFROMMP (mp1),
  645.                                   hwndDlg,
  646.                                   WM_DDE_POKE,
  647.                                   pdde,
  648.                                   DDEPM_RETRY) ;
  649.                    break ;
  650.               case DDESPY_REQTYPADV:
  651.                    pdlg->hwndServer = HWNDFROMMP (mp1) ;
  652.                    pdde = MakeDDESeg (pdlg->hwndServer,
  653.                                       pdlg->szItem,
  654.                                       0,
  655.                                       CF_TEXT,
  656.                                       pdlg->szData,
  657.                                       strlen (pdlg->szData) + 1) ;
  658.                    WinDdePostMsg (pdlg->hwndServer,
  659.                                   hwndDlg,
  660.                                   WM_DDE_ADVISE,
  661.                                   pdde,
  662.                                   DDEPM_RETRY) ;
  663.                    break ;
  664.               }
  665.            return (MRESULT) FALSE ;
  666.       case WM_DDE_TERMINATE:
  667.            if   (HWNDFROMMP (mp1) == pdlg->hwndServer)
  668.                 {
  669.                 WinDdePostMsg (pdlg->hwndServer,
  670.                                hwndDlg,
  671.                                WM_DDE_TERMINATE,
  672.                                NULL,
  673.                                DDEPM_RETRY) ;
  674.                 pdlg->hwndServer = NULLHANDLE ;
  675.                 }
  676.            return (MRESULT) FALSE ;
  677.       case WM_DESTROY:
  678.            free (pdlg) ;                                                       /* free instance data for this dialog */
  679.            break ;
  680.       case WM_INITDLG:
  681.            pdlg = calloc (1,                                                   /* Allocate instance data for this dialog */
  682.                           sizeof (DLG)) ;
  683.            WinSetWindowPtr (hwndDlg,                                           /* Save instance data pointer in window words */
  684.                             QWL_USER,
  685.                             pdlg) ;
  686.            pdlg->hwndListbox1 = WinWindowFromID (hwndDlg,                      /* Query and save some window control handles */
  687.                                                  IDL_DDESPY1) ;
  688.            pdlg->hwndListbox2 = WinWindowFromID (hwndDlg,
  689.                                                  IDL_DDESPY2) ;
  690.            pdlg->hwndListbox3 = WinWindowFromID (hwndDlg,
  691.                                                  IDL_DDESPY3) ;
  692.            WinEnableWindow (WinWindowFromID (hwndDlg,                          /* TERMINATE not availale yet */
  693.                                              IDP_DDESPY7),
  694.                             FALSE) ;
  695.            return (MRESULT) FALSE ;
  696.       case WMP_CLEAR:                                                          /* Clear out the controls */
  697.            switch (LONGFROMMP (mp1))
  698.               {
  699.               case 1:
  700.                    WinSendMsg (pdlg->hwndListbox1,
  701.                                LM_DELETEALL,
  702.                                MPVOID,
  703.                                MPVOID) ;
  704.               case 2:
  705.                    WinSendMsg (pdlg->hwndListbox2,
  706.                                LM_DELETEALL,
  707.                                MPVOID,
  708.                                MPVOID) ;
  709.               case 3:
  710.                    WinSendMsg (pdlg->hwndListbox3,
  711.                                LM_DELETEALL,
  712.                                MPVOID,
  713.                                MPVOID) ;
  714.                    WinSetDlgItemText (hwndDlg,
  715.                                       IDE_DDESPY1,
  716.                                       "") ;
  717.               case 4:
  718.                    WinSetDlgItemText (hwndDlg,
  719.                                       IDF_DDESPY1,
  720.                                       "") ;
  721.               }
  722.            return (MRESULT) FALSE ;
  723.       }
  724.    return (WinDefDlgProc (hwndDlg,
  725.                           msg,
  726.                           mp1,
  727.                           mp2)) ;
  728.    }
  729.  
  730. /* *******************************************************************
  731.    *** Function: MakeDDESeg                                        ***
  732.    ******************************************************************* */
  733. PDDESTRUCT MakeDDESeg (HWND  hwndDest,                                         /* This function allocates memory for the DDE data area */
  734.                        PSZ   pszItemName,
  735.                        ULONG ulStatus,
  736.                        ULONG ulFormat,
  737.                        PVOID pvData,
  738.                        ULONG ulDataLen)
  739.    {
  740.    PDDESTRUCT pdde ;
  741.    PID        pid ;
  742.    TID        tid ;
  743.    ULONG      ul ;
  744.    ULONG      ulTotal ;
  745.  
  746.    ul = strlen (pszItemName) + 1 ;                                             /* Lenght Itemname + terminating \0 */
  747.    ulTotal = sizeof (DDESTRUCT) + ul + ulDataLen ;                             /* sizeof DDE data area plus sizeof data */
  748.    if (!DosAllocSharedMem ((PPVOID) &pdde,                                     /* allocate SharedMemory for DDE data area */
  749.                            NULL,
  750.                            ulTotal,
  751.                            PAG_COMMIT | PAG_READ | PAG_WRITE | OBJ_GIVEABLE))
  752.       {
  753.       WinQueryWindowProcess (hwndDest,                                         /* Query receiving process */
  754.                              &pid,
  755.                              &tid) ;
  756.       DosGiveSharedMem (&pdde,                                                 /* allow this process access to this SharedMemory */
  757.                         pid,
  758.                         PAG_READ | PAG_WRITE) ;
  759.       pdde->cbData = ulDataLen ;                                               /* copy data into DDE data area */
  760.       pdde->fsStatus = ulStatus ;
  761.       pdde->usFormat = ulFormat ;
  762.       pdde->offszItemName = sizeof (DDESTRUCT) ;
  763.       pdde->offabData = (ulDataLen && pvData) ? sizeof (DDESTRUCT) + ul : 0 ;
  764.       memcpy (DDES_PSZITEMNAME (pdde),
  765.               pszItemName,
  766.               strlen (pszItemName) + 1) ;
  767.       memcpy (DDES_PABDATA (pdde),
  768.               pvData,
  769.               ulDataLen) ;
  770.       return pdde ;                                                            /* return DDE data area */
  771.       }
  772.    return NULL ;                                                               /* error */
  773.    }
  774.