Annotation of os232sdk/toolkt20/c/samples/spy/queues.c, revision 1.1.1.1

1.1       root        1: /****************************** Module Header ******************************\
                      2: * Module Name:  queues.c - Spy code to manager the queue list dialog.
                      3: *
                      4: * Created: Microsoft, IBM Corporation 1990
                      5: *
                      6: \***************************************************************************/
                      7: 
                      8: #define INCL_WIN
                      9: #define INCL_WINSYS
                     10: #define INCL_DOSPROCESS
                     11: #include <os2.h>
                     12: #include <stdio.h>
                     13: #include <string.h>
                     14: #include "spy.h"
                     15: #include "spyhk32.h"
                     16: #include <time.h>
                     17: #include <stdlib.h>
                     18: 
                     19: /* This is a real hack, estimate size of WND Structure */
                     20: #define SIZEOFWND   34
                     21: #define MAXMSGBYTES 100
                     22: 
                     23: /************* GLOBAL VARIABLES         */
                     24: HMQ      hmqDlgDisp;
                     25: SHORT   chmqWatched = 0;
                     26: SHORT   chmqInList = 0;
                     27: 
                     28: 
                     29: 
                     30: /************* PROCEDURE DECLARATIONS   */
                     31: MRESULT EXPENTRY SpyQueuesDlgProc();
                     32: 
                     33: void    InitQueueList(void);
                     34: void    DisplayQueueInfoForWindow(HWND, HWND);
                     35: void    DisplayQueueInfo(HWND, HMQ);
                     36: void    SelectQueueFromText(HWND hwndDlg);
                     37: void    BuildQueueWatchList(void);
                     38: 
                     39: 
                     40: 
                     41: /**************************** Public Function ******************************\
                     42: * MRESULT EXPENTRY SpyQueuesDlgProc(hwnd, msg, mp1, mp2)
                     43: *
                     44: * Effects: The Spy Windows Dialog procedure
                     45: *
                     46: * Return value: none
                     47: \***************************************************************************/
                     48: MRESULT EXPENTRY SpyQueuesDlgProc(hwnd, msg, mp1, mp2)
                     49: HWND hwnd;
                     50: USHORT msg;
                     51: MPARAM mp1;
                     52: MPARAM mp2;
                     53: {
                     54:     BOOL        fSelect = TRUE;
                     55:     SHORT       cQueues;
                     56:     HWND        hwndPoint;
                     57:     HMQ         hmqDisp;
                     58:     HMQ         hmqItem;   /* from handle of list item */
                     59:     USHORT      iItemFocus; /* Index to item that has the focus */
                     60: 
                     61:     switch (msg) {
                     62: 
                     63:     case WM_INITDLG:
                     64:         /* Initialize the dialog items */
                     65:         hwndWindowLB = WinWindowFromID(hwnd, DID_WINDOWLIST);
                     66:         InitQueueList();
                     67:         hmqDlgDisp = NULL;
                     68:         fTrackingListBox = TRUE;
                     69:         break;
                     70: 
                     71:     case WM_CHAR:
                     72:         /*
                     73:          * Handle VK_ENTER and VK_NEWLINE if our Edit control has
                     74:          * the focus and it is a keydown
                     75:          */
                     76:         if (!(SHORT1FROMMP(mp1) & KC_KEYUP) &&
                     77:                 (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) &&
                     78:                 ( (SHORT2FROMMP(mp2) == VK_ENTER) ||
                     79:                   (SHORT2FROMMP(mp2) == VK_NEWLINE) )) {
                     80: 
                     81: 
                     82:             if (WinQueryFocus(HWND_DESKTOP, FALSE) ==
                     83:                     WinWindowFromID(hwnd, DID_WHANDLE)) {
                     84:                 SelectQueueFromText(hwnd);
                     85:                 break;
                     86:             }
                     87:         }
                     88: 
                     89:         /* Normaly pass to dialog procedure to handle message */
                     90:         return(WinDefDlgProc(hwnd, msg, mp1, mp2));
                     91:         break;
                     92: 
                     93:     case WM_COMMAND:
                     94:         switch (SHORT1FROMMP(mp1)) {
                     95:         case DID_OK:
                     96:             BuildQueueWatchList();
                     97: 
                     98:         case DID_CANCEL:
                     99:             /* Now dismiss the dialog */
                    100:             WinDismissDlg(hwnd, SHORT1FROMMP(mp1));
                    101:             break;
                    102:         case DID_WUNSELALL:
                    103:             fSelect = FALSE;
                    104:         case DID_WSELALL:
                    105:             cQueues = (SHORT) WinSendMsg(hwndWindowLB, LM_QUERYITEMCOUNT,
                    106:                 0L, 0L);
                    107: 
                    108:             fTrackingListBox = FALSE;
                    109:             while (cQueues) {
                    110:                 /* Loop through all windows, selecting or unselcting all */
                    111:                 WinSendMsg(hwndWindowLB, LM_SELECTITEM, (MPARAM)--cQueues,
                    112:                     (MPARAM)fSelect);
                    113:             }
                    114:             fTrackingListBox = TRUE;
                    115:             break;
                    116: 
                    117:         case DID_WSELMOUSE:
                    118:             /* Call function to track mouse, returns window handle */
                    119:             hwndPoint = HwndSelWinWithMouse(hwnd, DisplayQueueInfoForWindow,
                    120:                     FALSE);
                    121:             if (hwndPoint == NULL)
                    122:                 break;    /* No window to process */
                    123: 
                    124:             /*
                    125:              * Now find the window in the list, Make the item visible
                    126:              * and set the item as selected.
                    127:              */
                    128:             hmqDisp = (HMQ)WinQueryWindowULong(hwndPoint, QWL_HMQ);
                    129:             cQueues = (SHORT) WinSendMsg(hwndWindowLB, LM_QUERYITEMCOUNT,
                    130:                     0L, 0L);
                    131: 
                    132:             while (cQueues) {
                    133:                 /*
                    134:                  * Loop through all windows until we wind the right
                    135:                  * one with the correct window handle
                    136:                  */
                    137:                 hmqItem = (HMQ)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
                    138:                         (MPARAM)--cQueues, 0L);
                    139: 
                    140:                 if (hmqItem == hmqDisp) {
                    141:                     /* found the right item, move it to top */
                    142:                     WinSendMsg(hwndWindowLB, LM_SETTOPINDEX, (MPARAM)cQueues, 0L);
                    143:                     WinSendMsg(hwndWindowLB, LM_SELECTITEM, (MPARAM)cQueues,
                    144:                             (MPARAM)TRUE);
                    145:                     break;
                    146:                 }
                    147:             }
                    148:             break;
                    149:         }
                    150:         break;
                    151: 
                    152: 
                    153:     default:
                    154:         /*
                    155:          * Default is to see if the listbox has changed its focus
                    156:          * item number.  If it has, then we want to display the information
                    157:          * about the window that the listbox cursor is over.  There is no
                    158:          * legal way to do this, One approach appears to temporary set the
                    159:          * listbox to be a single selection listbox, then query its selection
                    160:          * and set it back into multiple selection mode.
                    161:          */
                    162:         if (fTrackingListBox && hwndWindowLB != NULL) {
                    163: 
                    164:             WinSetWindowBits(hwndWindowLB, QWL_STYLE, 0L, LS_MULTIPLESEL);
                    165:             iItemFocus = (USHORT)WinSendMsg(hwndWindowLB, LM_QUERYSELECTION,
                    166:                     (MPARAM)LIT_FIRST, 0L);
                    167:             WinSetWindowBits(hwndWindowLB, QWL_STYLE, LS_MULTIPLESEL,
                    168:                     LS_MULTIPLESEL);
                    169: 
                    170:             if (iItemFocus != iCurItemFocus) {
                    171:                 iCurItemFocus = iItemFocus;
                    172:                 if (iItemFocus != (USHORT)-1) {
                    173: 
                    174:                     hmqDisp = (HMQ)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
                    175:                             (MPARAM)iItemFocus, 0L);
                    176:                     DisplayQueueInfo(hwnd, hmqDisp);
                    177:                 }
                    178:             }
                    179:         }
                    180:         return(WinDefDlgProc(hwnd, msg, mp1, mp2));
                    181:     }
                    182:     return 0L;
                    183: }
                    184: 
                    185: 
                    186: 
                    187: 
                    188: /**************************** Private Function ******************************\
                    189: * InitQueueList ()
                    190: *
                    191: * Effects: Builds the list of Queues displayed in the queues dialog
                    192: *
                    193: *
                    194: * Return value:
                    195: \***************************************************************************/
                    196: void InitQueueList()
                    197: {
                    198:     HENUM       henum;
                    199:     char        szClassName[50];    /* Class name of window */
                    200:     HWND        hwnd;
                    201:     ULONG       ulHMQ;
                    202:     PID         pidWindow;
                    203:     TID         tidWindow;
                    204:     SHORT       item;
                    205:     HMQ         *ahmqWatched;
                    206:     HMQ         *phmqT;
                    207:     SHORT       chmqAlloc;
                    208:     SHORT       i;
                    209: 
                    210:     /*
                    211:      * We will enumerate through all of the OBJECT windows looking for
                    212:      * windows that have the  WC_QUEUE type.
                    213:      */
                    214:     if (chmqWatched > 0) {
                    215:         ahmqWatched = (HMQ *)WinAllocMem(hHeap, sizeof(HMQ) * chmqWatched);
                    216:         chmqAlloc = chmqWatched;
                    217:         if (ahmqWatched != NULL)
                    218:             chmqWatched = SpyGetQueueList(chmqWatched, ahmqWatched);
                    219:     } else
                    220:         ahmqWatched = NULL;
                    221: 
                    222:     henum = WinBeginEnumWindows(HWND_OBJECT);
                    223:     if (henum == NULL)
                    224:         return;
                    225: 
                    226:     chmqInList = 0;
                    227:     while ((hwnd = WinGetNextWindow(henum)) != NULL) {
                    228:         WinLockWindow(hwnd, FALSE);
                    229:         WinQueryClassName(hwnd, sizeof(szClassName),
                    230:             (PSZ)szClassName);
                    231: 
                    232:         if (strcmp(szClassName, "#32767") == 0) {
                    233:             /*
                    234:              * We found an HMQ, add it to our list, Do not add our own
                    235:              * HMQ to the list!.
                    236:              */
                    237:             ulHMQ = (ULONG)WinQueryWindowULong(hwnd, QWL_HMQ);
                    238:             if ((HMQ)ulHMQ != hmqSpy) {
                    239:                 WinQueryWindowProcess(hwnd, &pidWindow, &tidWindow);
                    240: 
                    241:                 /* Reuse szClassName */
                    242:                 sprintf(szClassName, "0x%04x (PID:%d TID:%d)",
                    243:                         (USHORT)ulHMQ, (SHORT)pidWindow, (SHORT)tidWindow);
                    244: 
                    245:                 item = (USHORT)WinSendMsg(hwndWindowLB, LM_INSERTITEM,
                    246:                         (MPARAM)LIT_END, (MPARAM)(PSZ)szClassName);
                    247: 
                    248:                 /* Set the item handle to the handle of the window */
                    249:                 WinSendMsg(hwndWindowLB, LM_SETITEMHANDLE, (MPARAM)item,
                    250:                         (MPARAM)ulHMQ);
                    251:                 chmqInList++;
                    252: 
                    253:                 /*
                    254:                  * Now see if we should select the item
                    255:                  */
                    256:                 if (phmqT = ahmqWatched) {
                    257:                     for (i = 0; i < chmqWatched; i++) {
                    258:                         if ((HMQ)ulHMQ == *phmqT++) {
                    259:                             WinSendMsg(hwndWindowLB, LM_SELECTITEM, (MPARAM)item,
                    260:                                     (MPARAM)TRUE);
                    261:                             break;
                    262:                         }
                    263:                     }
                    264:                 }
                    265:             }
                    266:         }
                    267: 
                    268:     }
                    269: 
                    270:     WinEndEnumWindows(henum);
                    271: 
                    272:     if (ahmqWatched)
                    273:         WinFreeMem(hHeap, (char *)ahmqWatched, chmqAlloc * sizeof(HMQ));
                    274: }
                    275: 
                    276: 
                    277: 
                    278: /**************************** Private Function *****************************\
                    279: * DisplayQueueInfoForWindow(HWND hwndDialog, HWND hwnd)
                    280: *
                    281: * Effects: Displays the information about the selected window in the dialog
                    282: *
                    283: *
                    284: * Return value:
                    285: \***************************************************************************/
                    286: void DisplayQueueInfoForWindow(hwndDlg, hwndDisp)
                    287: HWND            hwndDlg;
                    288: HWND            hwndDisp;
                    289: {
                    290: HMQ             hmqDisp;
                    291: 
                    292:     /* simply get the HMQ for the window and call display function */
                    293:     hmqDisp = (HMQ)WinQueryWindowULong(hwndDisp, QWL_HMQ);
                    294:     DisplayQueueInfo(hwndDlg, hmqDisp);
                    295: }
                    296: 
                    297: 
                    298: 
                    299: 
                    300: /**************************** Private Function *****************************\
                    301: * DisplayQueueInfo(HWND hwndDialog, HWND hwnd)
                    302: *
                    303: * Effects: Displays the information about the selected window in the dialog
                    304: *
                    305: *
                    306: * Return value:
                    307: \***************************************************************************/
                    308: void DisplayQueueInfo(hwndDlg, hmqDisp)
                    309: HWND            hwndDlg;
                    310: HMQ             hmqDisp;
                    311: {
                    312:     HWND        hwnd;
                    313:     HMQ         hmqWindow;
                    314:     HENUM       henum;
                    315:     char        szTemp[50];
                    316:     PID         pidWindow;
                    317:     TID         tidWindow;
                    318: 
                    319: 
                    320:     if (hmqDisp != hmqDlgDisp)
                    321:     {
                    322:         hmqDlgDisp = hmqDisp;
                    323: 
                    324:         /*
                    325:          * See if we can find a top level window for this HMQ
                    326:          */
                    327:         henum = WinBeginEnumWindows(HWND_DESKTOP);
                    328:         if (henum == NULL)
                    329:             return;
                    330: 
                    331:         while ((hwnd = WinGetNextWindow(henum)) != NULL) {
                    332:             WinLockWindow(hwnd, FALSE);
                    333:             hmqWindow = (HMQ)WinQueryWindowULong(hwnd, QWL_HMQ);
                    334: 
                    335:             if (hmqWindow == hmqDisp)
                    336:                 break;
                    337:         }
                    338:         WinEndEnumWindows(henum);
                    339: 
                    340: 
                    341:         if (hwnd == NULL) {
                    342:             /*
                    343:              * No top level windows found look for object window.
                    344:              */
                    345:             henum = WinBeginEnumWindows(HWND_OBJECT);
                    346:             if (henum == NULL)
                    347:                 return;
                    348: 
                    349:             while ((hwnd = WinGetNextWindow(henum)) != NULL) {
                    350:                 WinLockWindow(hwnd, FALSE);
                    351:                 hmqWindow = (HMQ)WinQueryWindowULong(hwnd, QWL_HMQ);
                    352: 
                    353:                 if (hmqWindow == hmqDisp)
                    354:                     break;
                    355:             }
                    356:             WinEndEnumWindows(henum);
                    357:             if (hwnd == NULL)
                    358:                 return;
                    359:         }
                    360: 
                    361:         /* output information to window now */
                    362:         sprintf(szTemp, "0x%04x", (SHORT)hmqDisp);
                    363:         WinSetDlgItemText(hwndDlg, DID_WHMQ, (PSZ)szTemp);
                    364: 
                    365:         sprintf(szTemp, "0x%04x", (SHORT)hwnd);
                    366:         WinSetDlgItemText(hwndDlg, DID_WHANDLE, (PSZ)szTemp);
                    367: 
                    368:         /*
                    369:          * Warning, we only query the text if the window is not an object
                    370:          * window.  If it is an object window, the message queue may not
                    371:          * be processing messages, which could hang us
                    372:          */
                    373:         if (WinIsChild(hwnd, HWND_OBJECT))
                    374:             szTemp[0] = '\0';   /* No text available */
                    375:         else
                    376:             WinQueryWindowText(hwnd, sizeof(szTemp), (PSZ)szTemp);
                    377:         WinSetDlgItemText(hwndDlg, DID_WTEXT, (PSZ)szTemp);
                    378: 
                    379:         WinQueryWindowProcess(hwnd, &pidWindow, &tidWindow);
                    380:         sprintf(szTemp, "%d", (SHORT)pidWindow);
                    381:         WinSetDlgItemText(hwndDlg, DID_WPID, (PSZ)szTemp);
                    382:         sprintf(szTemp, "%d", (SHORT)tidWindow);
                    383:         WinSetDlgItemText(hwndDlg, DID_WTID, (PSZ)szTemp);
                    384:     }
                    385: }
                    386: 
                    387: 
                    388: 
                    389: /***************************** Private Function ****************************\
                    390: * void SelectQueueFromText(hwndDlg)
                    391: *
                    392: * Effects:
                    393: *   Updates the text that is displayed in the message text line
                    394: *
                    395: * History:
                    396: *   27-September-1988 KurtE
                    397: \***************************************************************************/
                    398: void SelectQueueFromText(hwndDlg)
                    399: HWND    hwndDlg;
                    400: {
                    401:     char    szTemp[80];
                    402:     HMQ     hmqSelect;
                    403:     SHORT   cItems;
                    404:     SHORT   i;
                    405: 
                    406: 
                    407:     /* First get the edit text from the string */
                    408:     WinQueryDlgItemText(hwndDlg, DID_WHANDLE, sizeof(szTemp),
                    409:             (PSZ)szTemp);
                    410: 
                    411:     hmqSelect = (HMQ)UConvertStringToNum(szTemp);
                    412: 
                    413:     cItems = (SHORT)WinSendMsg(hwndWindowLB, LM_QUERYITEMCOUNT,
                    414:             0L, 0L);
                    415: 
                    416:     for (i=0; i < cItems; i++) {
                    417:         if ((HMQ)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
                    418:                 (MPARAM)i, 0L) == hmqSelect)
                    419:             break;  /* found it */
                    420:     }
                    421: 
                    422:     if (i < cItems) {
                    423:         /*
                    424:          * found the hmq, bring to top, and select it
                    425:          */
                    426:         WinSendMsg(hwndWindowLB, LM_SETTOPINDEX,
                    427:                 MPFROMSHORT(i),  (MPARAM)0L);
                    428: 
                    429:         /* Always set it on */
                    430:         WinSendMsg(hwndWindowLB, LM_SELECTITEM,
                    431:                 MPFROMSHORT(i), MPFROMSHORT(TRUE));
                    432: 
                    433:     } else {
                    434:         WinAlarm(HWND_DESKTOP, WA_WARNING);
                    435:         WinSetDlgItemText(hwndDlg, DID_WHANDLE, (PSZ)"");
                    436:     }
                    437: 
                    438: }
                    439: 
                    440: 
                    441: 
                    442: 
                    443: /**************************** Private Function *****************************\
                    444: * BuildQueueWatchList()
                    445: *
                    446: * Effects: Updates the list of windows to be watched from the listbox
                    447: *
                    448: *
                    449: * Return value:
                    450: \***************************************************************************/
                    451: void BuildQueueWatchList()
                    452: {
                    453: 
                    454:     USHORT  itemPrevious;
                    455:     USHORT  item;
                    456: 
                    457:     HMQ     *ahmqList;
                    458:     HMQ     *phmqT;
                    459: 
                    460: 
                    461:     ahmqList = (HMQ *)WinAllocMem(hHeap, sizeof(HMQ) * chmqInList);
                    462:     if ((phmqT = ahmqList) == NULL)
                    463:         return;     /* Error */
                    464: 
                    465: 
                    466:     /*
                    467:      * Simply loop through asking for the next selected item in the
                    468:      * list.  Make sure not to overrun our list.
                    469:      */
                    470:     itemPrevious = (USHORT)LIT_FIRST;
                    471:     chmqWatched = 0;
                    472: 
                    473:     while ((item = (USHORT)WinSendMsg(hwndWindowLB, LM_QUERYSELECTION,
                    474:             (MPARAM)itemPrevious, 0L)) != (USHORT)LIT_NONE) {
                    475:         /*
                    476:          * Get the items handle, which has the value of the window handle
                    477:          */
                    478:         *phmqT++ = (HMQ)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
                    479:                 (MPARAM)item, 0L);
                    480:         chmqWatched++;
                    481: 
                    482:         itemPrevious = item;    /* Where to cointinue the search */
                    483:     }
                    484: 
                    485:     SpySetQueueList (chmqWatched, ahmqList);
                    486: 
                    487:     WinFreeMem(hHeap, (char *)ahmqList, sizeof(HMQ) * chmqInList);
                    488: }
                    489: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.