Annotation of q_a/samples/guigrep/guigrep.c, revision 1.1.1.1

1.1       root        1: 
                      2: /*************************************************************************/
                      3: /*                                                                       */
                      4: /*           NT-based multithreaded file browser                         */
                      5: /*           Ruediger R. Asche                                           */
                      6: /*           Copyright (c) 1992,1993 Microsoft Corporation               */
                      7: /*                                                                       */
                      8: /*************************************************************************/
                      9: 
                     10: /*************************************************************************/
                     11: /*                                                                       */
                     12: /*           Description:                                                */
                     13: /*           This file manager extension will perform the following:     */
                     14: /*           - user clicks "search". This will open the target window    */
                     15: /*             which has an edit control embedded in it and send a       */
                     16: /*             WM_LAUNCH message to that window.                         */
                     17: /*           - The window function then dispatches the "master thread"   */
                     18: /*             which will, in turn, dispatch a new thread for every      */
                     19: /*             file selected by the user. The master thread waits until  */
                     20: /*             all file threads have finished, then send a WM_FREEAGAIN  */
                     21: /*             message to the main window which will then display the    */
                     22: /*             results and clean up.                                     */
                     23: /*                                                                       */
                     24: /*************************************************************************/
                     25: 
                     26: 
                     27: /*************************************************************************/
                     28: /*                                                                       */
                     29: /*           Includes                                                    */
                     30: /*                                                                       */
                     31: /*************************************************************************/
                     32: 
                     33: 
                     34: extern "C"
                     35: {
                     36: #include <windows.h>
                     37: #include <string.h>
                     38: #include <ctype.h>
                     39: #include <stdlib.h>
                     40: #include "guigrep.h"
                     41: #include "wfext.h"
                     42: }
                     43: 
                     44: /*************************************************************************/
                     45: /*                                                                       */
                     46: /*           Global variables                                            */
                     47: /*                                                                       */
                     48: /*************************************************************************/
                     49: 
                     50: memory *MasterBlock;
                     51: growmemory *ResultBlock;
                     52: HWND hWndGlobal;
                     53: int iHitCount=0;
                     54: char szGlobalSearchString[MAXLINELEN];
                     55: unsigned int iGlobalSStLen;
                     56: int iFinishedFiles;
                     57: BOOL bCaseInsens=FALSE;
                     58: HINSTANCE hOurselves;
                     59: WNDPROC lpfnOldEditProc;
                     60: char lpszCRLF[]="\r\n";
                     61: int ilpszCRLF = strlen("\r\n");
                     62: BOOL bObjectExists = FALSE;
                     63: 
                     64: /*************************************************************************/
                     65: /*                                                                       */
                     66: /*           Symbolic equals.                                            */
                     67: /*                                                                       */
                     68: /*************************************************************************/
                     69: 
                     70: #define WNDCLASSNAME "SearchWndClass"
                     71: 
                     72: /*************************************************************************/
                     73: /*                                                                       */
                     74: /*           Forward function declarations                               */
                     75: /*                                                                       */
                     76: /*************************************************************************/
                     77: 
                     78: 
                     79: BOOL APIENTRY About(
                     80:        HWND hDlg,
                     81:        UINT message,
                     82:        UINT wParam,
                     83:        LONG lParam);
                     84: 
                     85: 
                     86: 
                     87: long Poll_On_Threads(LONG lParam);
                     88: 
                     89: 
                     90: /*************************************************************************/
                     91: /*                                                                       */
                     92: /* A generic window class that carries an edit child in its entire       */
                     93: /* client area wherever it goes.                                                                                 */
                     94: /*                                                                       */
                     95: /*************************************************************************/
                     96: 
                     97: 
                     98: LONG APIENTRY ColorWndProc(
                     99:        HWND hWnd,
                    100:        UINT message,
                    101:        UINT wParam,
                    102:        LONG lParam)
                    103: {
                    104:     static char szBuf[13];
                    105:     static char szPathName[MAX_PATH];
                    106: 
                    107:     RECT   rcClient;
                    108:        static HWND hWndHitBox,hWndFileMan;
                    109:        HINSTANCE hInst = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
                    110:     switch (message) {
                    111:        case WM_CREATE:
                    112:            AppendMenu(GetSystemMenu(hWnd,FALSE),MF_STRING, IDM_ABOUT, "About...");
                    113:            hWndHitBox = CreateWindow("EDIT","",WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_AUTOHSCROLL |
                    114:                                               DS_LOCALEDIT|ES_MULTILINE | WS_BORDER|WS_VSCROLL|WS_HSCROLL,
                    115:                                                 0,0,1,1,hWnd, NULL, hInst,
                    116:                                                 NULL);
                    117:          if (!hWndHitBox)
                    118:             {MessageBox(hWnd,"Unable to create Child Window!","Browse Extension",MB_OK);
                    119:              return(-1);
                    120:             };
                    121: 
                    122:                  CloseHandle((HANDLE)SendMessage(hWndHitBox,EM_GETHANDLE,0,0));
                    123:          ShowWindow(hWndHitBox,SW_SHOWNORMAL);
                    124:                  break;
                    125:        case WM_SIZE:
                    126:            GetClientRect(hWnd,&rcClient);
                    127:            MoveWindow(hWndHitBox,rcClient.left,rcClient.top,
                    128:                                   rcClient.right, rcClient.bottom, TRUE);
                    129:            break;
                    130:        case WM_LAUNCH:
                    131:                hWndFileMan = (HWND)lParam;
                    132:                         { static THREADPBLOCK tpbParms;
                    133:                           int iPollThreadID;
                    134:                           tpbParms.hWndGlobal = hWnd;
                    135:                           tpbParms.hWndFileBox = hWndFileMan;
                    136:                           SendMessage(hWndHitBox,LB_RESETCONTENT,0,0);
                    137:                           ResultBlock = new growmemory(4*4096,4096);
                    138:                           bObjectExists=TRUE;
                    139:                           HANDLE hNewThread=CreateThread(NULL,0,
                    140:                             (LPTHREAD_START_ROUTINE)Poll_On_Threads,(LPVOID)&tpbParms,0,(LPDWORD)&iPollThreadID);
                    141:                 };
                    142:                   break;
                    143:        case WM_ADDITEM:
                    144:          { char szBuf[40];
                    145:            wsprintf(szBuf,"Finished %d File(s)",(int)lParam);
                    146:      SetWindowText(hWnd,szBuf);
                    147:          };
                    148:                break;
                    149:     case WM_FREEAGAIN:
                    150:                SendMessage(hWndHitBox,EM_SETHANDLE,(WPARAM)ResultBlock->GetHandle(),0);
                    151:                InvalidateRect(hWndHitBox,NULL,FALSE);
                    152:                break;
                    153: 
                    154:        case WM_SYSCOMMAND:
                    155:          if (wParam == IDM_ABOUT)
                    156:                   DialogBox(hOurselves,
                    157:                             "AboutBox",
                    158:                             hWnd,
                    159:                             (DLGPROC)About);
                    160:                   else
                    161:            return (DefWindowProc(hWnd, message, wParam, lParam));
                    162:                break;
                    163: 
                    164:        case WM_DESTROY:
                    165:         bObjectExists=FALSE;
                    166:         delete(ResultBlock);
                    167:         break;
                    168:        default:
                    169:            return (DefWindowProc(hWnd, message, wParam, lParam));
                    170:     }
                    171:     return (NULL);
                    172: }
                    173: 
                    174: 
                    175: /*************************************************************************/
                    176: /*                                                                       */
                    177: /*           The inevitable about box...                                 */
                    178: /*                                                                       */
                    179: /*************************************************************************/
                    180: 
                    181: 
                    182: BOOL APIENTRY About(
                    183:        HWND hDlg,
                    184:        UINT message,
                    185:        WPARAM wParam,
                    186:        LPARAM lParam)
                    187: {
                    188:     switch (message) {
                    189:        case WM_INITDIALOG:
                    190:            return (TRUE);
                    191: 
                    192:        case WM_COMMAND:
                    193:            if (LOWORD(wParam) == IDOK
                    194:                || LOWORD(wParam) == IDCANCEL) {
                    195:                EndDialog(hDlg, TRUE);
                    196:                return (TRUE);
                    197:            }
                    198:            break;
                    199:     }
                    200:     return (FALSE);
                    201:        UNREFERENCED_PARAMETER(lParam);
                    202: }
                    203: 
                    204: /*************************************************************************/
                    205: /*                                                                       */
                    206: /*           The DLL Entry and exit dispatcher.                          */
                    207: /*                                                                       */
                    208: /*************************************************************************/
                    209: 
                    210: 
                    211: 
                    212: extern "C"
                    213: {
                    214: BOOL WINAPI DllMain (HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved)
                    215: {
                    216:   switch (dwReason)
                    217:   {
                    218:     case DLL_PROCESS_ATTACH:
                    219:     {
                    220:     WNDCLASS  wc;
                    221:     hOurselves=hDLL;
                    222: 
                    223:     wc.style = NULL;
                    224:     wc.lpfnWndProc = (WNDPROC)ColorWndProc;
                    225:     wc.cbClsExtra = 0;
                    226:     wc.cbWndExtra = 0;
                    227:     wc.hInstance = (HINSTANCE)GetCurrentProcess();
                    228:     wc.hIcon = LoadIcon(hDLL, "GrepIcon");
                    229:     wc.hCursor = LoadCursor(NULL,IDC_ARROW);
                    230:     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
                    231:     wc.lpszMenuName =  NULL;
                    232:     wc.lpszClassName = WNDCLASSNAME;
                    233: 
                    234:     if (!RegisterClass(&wc))
                    235:     {
                    236:     MessageBox(GetFocus(),"Unable to create class",
                    237:                 "Browse extension",MB_OK);
                    238:     return(NULL);
                    239:     }
                    240:     };
                    241:    };
                    242:    return( TRUE );
                    243: }
                    244: }
                    245: 
                    246: /*************************************************************************/
                    247: /*                                                                       */
                    248: /*           Dialog box function for the "Select string" dialog          */
                    249: /*                                                                       */
                    250: /*************************************************************************/
                    251: 
                    252: 
                    253: 
                    254: BOOL APIENTRY StringProc(
                    255:        HWND hDlg,
                    256:        UINT message,
                    257:        WPARAM wParam,
                    258:        LPARAM lParam)
                    259: {   HWND hEditControl;
                    260:     switch (message)
                    261:            {
                    262:        case WM_INITDIALOG:
                    263:            hEditControl = GetDlgItem(hDlg, IDM_STRINGEDIT);
                    264:            SetWindowText(hEditControl,szGlobalSearchString);
                    265:                SendMessage(GetDlgItem(hDlg,IDM_CASESENS),BM_SETCHECK,bCaseInsens,0);
                    266:            return (TRUE);
                    267: 
                    268:        case WM_COMMAND:
                    269:          switch (LOWORD(wParam))
                    270:           {
                    271:                 case IDM_CANCEL:
                    272:                   EndDialog(hDlg,FALSE);
                    273:                   return(TRUE);
                    274:                   break;
                    275:             case IDM_TERMBOX:
                    276:                  {int iLoopVar, iLen;
                    277:               bCaseInsens = SendMessage(GetDlgItem(hDlg,IDM_CASESENS),BM_GETCHECK,0,0);
                    278:               hEditControl = GetDlgItem(hDlg,IDM_STRINGEDIT);
                    279:               GetWindowText(hEditControl,szGlobalSearchString,MAXLINELEN);
                    280:                   if (bCaseInsens)
                    281:                    { iLen = strlen(szGlobalSearchString);
                    282:                    for (iLoopVar = 0; iLoopVar < iLen;iLoopVar++)
                    283:                         if (IsCharUpper(szGlobalSearchString[iLoopVar]))
                    284:                         szGlobalSearchString[iLoopVar] = (char)_tolower((int)szGlobalSearchString[iLoopVar]);
                    285:                        };
                    286:                   EndDialog(hDlg, TRUE);
                    287:                  }
                    288:               break;
                    289: 
                    290:            }
                    291:            break;
                    292:     }
                    293:     return (FALSE);
                    294:        UNREFERENCED_PARAMETER(lParam);
                    295: }
                    296: 
                    297: 
                    298: long TraverseFileCaseInsens(HANDLE hFile, LPSTR lpFilNam, LPSTR lpFileView)
                    299: {
                    300:   unsigned int iGlobalSearchString, iCurrentBuffPt, iPrefixLength;
                    301:   BOOL bMatch;
                    302:   LPSTR lpLineBuff;
                    303:   unsigned int iLineCt = 0;
                    304:   DWORD dwFileSize, dwCurrentFilePt;
                    305: 
                    306:   dwFileSize = GetFileSize(hFile,NULL);
                    307:   lpLineBuff = MasterBlock->Alloc(MAXLINELEN);
                    308:   if (!lpLineBuff)
                    309:    {
                    310:    MessageBox(GetFocus(),lpFilNam,"Out of memory processing:",MB_OK);
                    311:    return (-1);
                    312:    };
                    313: /**************************************************************************/
                    314: /*    Initialize variables:                                               */
                    315: /*    lpLineBuff contains the buffer in which we store the whole line.    */
                    316: /*    If the line doesn't match, we "recycle" the buffer by using it      */
                    317: /*    for the next line; if it does, we send it off.                      */
                    318: /*    iCurrentBuff is the length of the line we currently work on,        */
                    319: /*    and iGlobalSearchString describes how far in the global search      */
                    320: /*    string we have progreesed so far matching.                          */
                    321: /**************************************************************************/
                    322: 
                    323:   strcpy(lpLineBuff,lpFilNam);
                    324:   strcat(lpLineBuff," <    >: ");
                    325:   iPrefixLength = strlen(lpLineBuff);
                    326:   iCurrentBuffPt = iPrefixLength-1;
                    327:   iGlobalSearchString = 0;
                    328:   bMatch = FALSE;
                    329: /**************************************************************************/
                    330: /*    Now go through the mapping character by character                   */
                    331: /**************************************************************************/
                    332: 
                    333:   for (dwCurrentFilePt=0;
                    334:        dwCurrentFilePt<dwFileSize;
                    335:        dwCurrentFilePt++)
                    336: 
                    337:     { if (iCurrentBuffPt >= MAXLINELEN)
                    338:                {MessageBox(GetFocus(),"File not readable!",lpFilNam,MB_OK);
                    339:                 return(-1);
                    340:                };
                    341: 
                    342:       iCurrentBuffPt++;
                    343:       lpLineBuff[iCurrentBuffPt]= lpFileView[dwCurrentFilePt];
                    344:      if (lpLineBuff[iCurrentBuffPt] == '\n')
                    345:        {
                    346: 
                    347:         iLineCt++;
                    348:        if (bMatch)
                    349:               {
                    350: /**************************************************************************/
                    351: /*    A match has occurred!                                               */
                    352: /*    At this point, lpLineBuff points to the string that contains the    */
                    353: /*    matching line; iCurrentBuffPt its length.                           */
                    354: /**************************************************************************/
                    355: 
                    356:                OemToChar(lpLineBuff,lpLineBuff);
                    357:                wsprintf(&lpLineBuff[strlen(lpFilNam)+2],"%4d",iLineCt);
                    358:                lpLineBuff[strlen(lpFilNam)+6] = '>';
                    359:                iHitCount++;
                    360:                ResultBlock->add(lpLineBuff,iCurrentBuffPt-1);
                    361:                strcpy(lpLineBuff, lpFilNam);
                    362:                wsprintf(&lpLineBuff[strlen(lpFilNam)]," <    >: ");
                    363: 
                    364:               };
                    365: /**************************************************************************/
                    366: /*    The FOR-logic will increment the pointer,                           */
                    367: /*    so we reduce it by one because we use it in the NEXT iteration.     */
                    368: /**************************************************************************/
                    369: 
                    370:        iCurrentBuffPt = iPrefixLength -1;
                    371:        iGlobalSearchString = 0;
                    372:        bMatch = FALSE;
                    373:        }
                    374:      else
                    375: 
                    376:        { if (iGlobalSearchString < iGlobalSStLen)
                    377:            if ( /* This is the only difference to case-sensitive... */
                    378:                        (IsCharUpper(lpLineBuff[iCurrentBuffPt]) ? (char)_tolower(lpLineBuff[iCurrentBuffPt])
                    379:                          : lpLineBuff[iCurrentBuffPt]) == szGlobalSearchString[iGlobalSearchString])
                    380:               { iGlobalSearchString++;
                    381:                 bMatch = TRUE;
                    382:               }
                    383:            else
                    384:               { bMatch = FALSE;
                    385:                 iGlobalSearchString = 0;
                    386: 
                    387:               };
                    388: 
                    389:         };
                    390: 
                    391:         };
                    392: return(TRUE);
                    393: }
                    394: 
                    395: /**************************************************************************/
                    396: /*    The case sensitive traversal function is basically the same         */
                    397: /*    as the case-insensitive one, just one line difference.              */
                    398: /*    The reason why we separate this is that at runtime it is much more  */
                    399: /*    efficient not to have to test for case-insensitivity on each and    */
                    400: /*    every character we test...                                          */
                    401: /**************************************************************************/
                    402: 
                    403: 
                    404: long TraverseFileCaseSens(HANDLE hFile, LPSTR lpFilNam, LPSTR lpFileView)
                    405: {
                    406:   unsigned int iGlobalSearchString, iCurrentBuffPt, iPrefixLength;
                    407:   BOOL bMatch;
                    408:   LPSTR lpLineBuff;
                    409:   unsigned int iLineCt = 0;
                    410:   DWORD dwFileSize, dwCurrentFilePt;
                    411: 
                    412:   dwFileSize = GetFileSize(hFile,NULL);
                    413:   lpLineBuff = MasterBlock->Alloc(MAXLINELEN);
                    414:   if (!lpLineBuff)
                    415:    {
                    416:    MessageBox(GetFocus(),lpFilNam,"Out of memory processing:",MB_OK);
                    417:    return (-1);
                    418:    };
                    419: 
                    420:   strcpy(lpLineBuff,lpFilNam);
                    421:   strcat(lpLineBuff," <    >: ");
                    422:   iPrefixLength = strlen(lpLineBuff);
                    423:   iCurrentBuffPt = iPrefixLength-1;
                    424:   iGlobalSearchString = 0;
                    425:   bMatch = FALSE;
                    426:   for (dwCurrentFilePt=0;
                    427:        dwCurrentFilePt<dwFileSize;
                    428:        dwCurrentFilePt++)
                    429: 
                    430:     { if (iCurrentBuffPt >= MAXLINELEN)
                    431:                {MessageBox(GetFocus(),"File not readable!",lpFilNam,MB_OK);
                    432:                 return(-1);
                    433:                };
                    434: 
                    435:       iCurrentBuffPt++;
                    436:       lpLineBuff[iCurrentBuffPt]= lpFileView[dwCurrentFilePt];
                    437:      if (lpLineBuff[iCurrentBuffPt] == '\n')
                    438:        {
                    439: 
                    440:         iLineCt++;
                    441:        if (bMatch)
                    442:               {
                    443:                OemToChar(lpLineBuff,lpLineBuff);
                    444:                wsprintf(&lpLineBuff[strlen(lpFilNam)+2],"%4d",iLineCt);
                    445:                lpLineBuff[strlen(lpFilNam)+6] = '>';
                    446:                iHitCount++;
                    447:                ResultBlock->add(lpLineBuff,iCurrentBuffPt-1);
                    448:                strcpy(lpLineBuff, lpFilNam);
                    449:                wsprintf(&lpLineBuff[strlen(lpFilNam)]," <    >: ");
                    450: 
                    451:               };
                    452:        iCurrentBuffPt = iPrefixLength -1;
                    453:        iGlobalSearchString = 0;
                    454:        bMatch = FALSE;
                    455:        }
                    456:      else
                    457: 
                    458:        { if (iGlobalSearchString < iGlobalSStLen)
                    459:            if (lpLineBuff[iCurrentBuffPt] == szGlobalSearchString[iGlobalSearchString])
                    460:               { iGlobalSearchString++;
                    461:                 bMatch = TRUE;
                    462:               }
                    463:            else
                    464:               { bMatch = FALSE;
                    465:                 iGlobalSearchString = 0;
                    466: 
                    467:               };
                    468: 
                    469:         };
                    470: 
                    471:         };
                    472: 
                    473: return(TRUE);
                    474: }
                    475: 
                    476: 
                    477: 
                    478: 
                    479: long ProcessFileCommonCode (LPTHREADPBLOCK tpArgs)
                    480: { FMS_GETFILESEL gfsSelection;
                    481:   LPSTR lpFilNam;
                    482:   HANDLE hFile, hMappedFile;
                    483:   LPSTR lpFileView;
                    484:   unsigned int iLineCt = 0;
                    485: /**************************************************************************/
                    486: /*    Set up file mapping etc.                                            */
                    487: /**************************************************************************/
                    488:   SendMessage(tpArgs->hWndFileBox,FM_GETFILESEL,tpArgs->iLoop,(LPARAM)&gfsSelection);
                    489:   lpFilNam = MasterBlock->Alloc(1+strlen(gfsSelection.szName));
                    490:                strcpy(lpFilNam,gfsSelection.szName);
                    491: 
                    492:   if ((hFile = CreateFile(lpFilNam, GENERIC_READ, FILE_SHARE_READ, NULL,
                    493:                                OPEN_ALWAYS, FILE_ATTRIBUTE_READONLY, NULL))
                    494:       == INVALID_HANDLE_VALUE)
                    495:        return(FALSE);
                    496:   if (!(hMappedFile = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,0)))
                    497:        {MessageBox(GetFocus(),"Could not open file mapping!",lpFilNam,MB_OK);
                    498:        return(FALSE);
                    499:        };
                    500:   if (!(lpFileView = (LPSTR)MapViewOfFile(hMappedFile,FILE_MAP_READ,0,0,0)))
                    501:        {MessageBox(GetFocus(),"Could not map file view",lpFilNam,MB_OK);
                    502:        return(FALSE);
                    503:        };
                    504: /**************************************************************************/
                    505: /*    Now traverse file                                                   */
                    506: /**************************************************************************/
                    507:   if (bCaseInsens)
                    508:     TraverseFileCaseInsens(hFile,lpFilNam,lpFileView);
                    509:   else
                    510:     TraverseFileCaseSens(hFile,lpFilNam,lpFileView);
                    511: 
                    512: /**************************************************************************/
                    513: /*    Clean up.                                                   */
                    514: /**************************************************************************/
                    515: 
                    516:   if (!UnmapViewOfFile(lpFileView))
                    517:         MessageBox(GetFocus(),"UnmapViewOfFile Failure",lpFilNam,MB_OK);
                    518:   if (!CloseHandle(hMappedFile))
                    519:    MessageBox(GetFocus(),"CloseHandle Failure...",lpFilNam,MB_OK);
                    520:   if (!CloseHandle(hFile))
                    521:    MessageBox(GetFocus(),"CloseHandle Failure...",lpFilNam,MB_OK);
                    522: 
                    523: iFinishedFiles++;
                    524: SendMessage(hWndGlobal,WM_ADDITEM,(WPARAM)iHitCount,iFinishedFiles);
                    525:   return(1);
                    526: 
                    527: }
                    528: 
                    529: 
                    530: 
                    531: /*************************************************************************/
                    532: /*                                                                       */
                    533: /*          This is the "master thread." Its only purpose is to          */
                    534: /*          dispatch one thread for each file selected, then wait for    */
                    535: /*          completition of all threads, and return to the main window.  */
                    536: /*          This has been made a separate thread due to possible         */
                    537: /*          deadlock conditions that might occurr if it was in the       */
                    538: /*          main window function.                                        */
                    539: /*                                                                       */
                    540: /*          Since there is no system-provided way to limit the number    */
                    541: /*          of threads AND it doesn't make sense to have zillions        */
                    542: /*          of threads in the system, there is a mechanism that          */
                    543: /*          limits the number of threads to a certain limit (currently   */
                    544: /*          30). Would make sense to devise some kind of a fancy         */
                    545: /*          algorithm to compute the number of threads dynamically.      */
                    546: /*                                                                       */
                    547: /*************************************************************************/
                    548: 
                    549: 
                    550: 
                    551: long Poll_On_Threads(LONG lParam)
                    552: { int iLoop, iEndLoop,iThread,iArrayIndex;
                    553:   char tempFilBuf[80];
                    554:   static HANDLE aThreads[MAX_CONCURRENT_THREADS];
                    555:   HWND hWndFileBox;
                    556:   LPTHREADPBLOCK lpTB = (LPTHREADPBLOCK)lParam;
                    557:   iHitCount = 0;
                    558:   iFinishedFiles = 0;
                    559:   iGlobalSStLen = strlen(szGlobalSearchString);
                    560:   hWndFileBox = lpTB->hWndFileBox;
                    561:   hWndGlobal =  lpTB->hWndGlobal;
                    562:   MasterBlock = new memory(150000);
                    563:   iEndLoop = SendMessage(hWndFileBox,FM_GETSELCOUNT,0,0);
                    564:   if (iEndLoop == 0)
                    565:    { MessageBox(hWndFileBox,"No files selected","Browser extension",MB_OK);
                    566:      return(0);
                    567:    };
                    568:   for (iLoop = 0; iLoop < iEndLoop; iLoop++)
                    569:        {HANDLE hNewThread;
                    570: 
                    571:                if (iLoop < MAX_CONCURRENT_THREADS)
                    572:                                     iArrayIndex = iLoop;
                    573:                else
                    574:                        {
                    575:                         iArrayIndex = WaitForMultipleObjects(
                    576:                                   MAX_CONCURRENT_THREADS,aThreads,FALSE,INFINITE);
                    577:                         if (iArrayIndex == -1)
                    578:                                {MessageBeep(0);
                    579:                                          return(-1);
                    580:                                 };
                    581: 
                    582:                         CloseHandle(aThreads[iArrayIndex]);
                    583:            };
                    584:                lpTB = (LPTHREADPBLOCK)MasterBlock->Alloc(sizeof(THREADPBLOCK));
                    585:                lpTB->hWndFileBox=hWndFileBox;
                    586:        lpTB->iLoop = iLoop;
                    587:            hNewThread = CreateThread(NULL,0,
                    588:                (LPTHREAD_START_ROUTINE) ProcessFileCommonCode,
                    589:                     (LPVOID)lpTB,0,(LPDWORD)&iThread);
                    590:        if (!hNewThread)
                    591:           MessageBox(GetFocus(),"Failed","CreateThread",MB_OK);
                    592:                aThreads[iArrayIndex] = hNewThread;
                    593: 
                    594: 
                    595:         };
                    596: /* We are now processing the last few threads. Clean up. */
                    597:        iEndLoop = min(iEndLoop,MAX_CONCURRENT_THREADS);
                    598:        WaitForMultipleObjects(iEndLoop, aThreads,TRUE,INFINITE);
                    599:        for (iLoop = 0; iLoop < iEndLoop ; iLoop++)
                    600:          if (!CloseHandle(aThreads[iLoop]))
                    601:            MessageBox(GetFocus(),"Can't delete thread!","",MB_OK);
                    602:        wsprintf(tempFilBuf,"Total Hits: %d",iHitCount);
                    603:        SetWindowText(hWndGlobal,tempFilBuf);
                    604:        delete (MasterBlock);
                    605:        SendMessage(hWndGlobal,WM_FREEAGAIN,0,0);
                    606:     return(0);
                    607: }
                    608: 
                    609: /********************************************************************/
                    610: /* Following is the relevant stuff for the file manager extensions. */
                    611: /********************************************************************/
                    612: 
                    613: LONG WINAPI FMExtensionProc(HWND hWndFileMan, WORD wMsg, LONG lParam)
                    614: {
                    615:   static HMENU hSubMenu;
                    616:   static UINT wDelta;
                    617:   static HWND hWnd;
                    618:  switch (wMsg)
                    619:  {
                    620: 
                    621: /* this message is sent to the extension proc to update its toolbar to
                    622:    add custom buttons as accelarators for the extension menu. */
                    623: 
                    624:   case FMEVENT_TOOLBARLOAD:
                    625:    {
                    626:      static EXT_BUTTON ExtButtons[1] =
                    627:      { { IDM_STARTGREP-100, 0 , 0} };   /* This must correspond to the wMsg parameter passed to the extension proc */
                    628: 
                    629: #define lpTB ((LPFMS_TOOLBARLOAD) lParam)
                    630: 
                    631:   lpTB->dwSize = sizeof(FMS_TOOLBARLOAD);
                    632:   lpTB->lpButtons = (LPEXT_BUTTON) &ExtButtons;
                    633:   lpTB->cButtons = 1;
                    634:   lpTB->cBitmaps = 1;
                    635:   lpTB->idBitmap = IDM_STARTGREP;       /* Must correspond to the bitmap identifier */
                    636:   return(TRUE);
                    637:    };
                    638: 
                    639: /* this message is sent to the extension proc to associate a help string with
                    640:    a menu item. */
                    641: 
                    642:   case FMEVENT_HELPSTRING:
                    643:    strcpy(((LPFMS_HELPSTRING)lParam)->szHelp,"Search for a string in multiple files");
                    644:    return (TRUE);
                    645: 
                    646:   case FMEVENT_LOAD:
                    647:    if (!hOurselves)
                    648:          return(NULL);
                    649: 
                    650:           hSubMenu = LoadMenu(hOurselves,"FileManMenu");
                    651:           wDelta = ((LPFMS_LOAD)lParam)->wMenuDelta;
                    652:           ((LPFMS_LOAD)lParam)->dwSize= sizeof(FMS_LOAD);
                    653:           strcpy(((LPFMS_LOAD)lParam)->szMenuName,"S&earch");
                    654:           ((LPFMS_LOAD)lParam)->hMenu = hSubMenu;
                    655: 
                    656: 
                    657:           return (LONG) hSubMenu;
                    658:   default:
                    659:        switch (wMsg+100)
                    660:        {
                    661:              case IDM_DEFGREP:
                    662:                   DialogBox(hOurselves,
                    663:                             "StringDialog",
                    664:                             hWndFileMan,
                    665:                             (DLGPROC)StringProc);
                    666:                   break;
                    667: 
                    668:                case IDM_STARTGREP:
                    669:                if (strlen(szGlobalSearchString) == 0)
                    670:                   if (!DialogBox(hOurselves,
                    671:                             "StringDialog",
                    672:                             hWndFileMan,
                    673:                             (DLGPROC)StringProc))
                    674:                          break;
                    675:        if (IsWindow(hWndGlobal))
                    676:         {MessageBox(GetFocus(),"No more than one window supported","Close hit window",MB_OK);
                    677:          break;
                    678:         };
                    679:     hWnd = CreateWindow(
                    680:        WNDCLASSNAME,
                    681:        "Windows NT File Search Extension",
                    682:        WS_OVERLAPPEDWINDOW,
                    683:        CW_USEDEFAULT,
                    684:        CW_USEDEFAULT,
                    685:        CW_USEDEFAULT,
                    686:        CW_USEDEFAULT,
                    687:        NULL,
                    688:        NULL,
                    689:        (HINSTANCE)GetCurrentProcess(),
                    690:        NULL
                    691:     );
                    692:        SendMessage(hWnd,WM_LAUNCH,0,(LONG)hWndFileMan);
                    693:     ShowWindow(hWnd, SW_SHOWNORMAL);
                    694:     UpdateWindow(hWnd);
                    695:     break;
                    696:     default:
                    697:     break;
                    698:     };
                    699:   return(0);
                    700:  };
                    701: }
                    702: 
                    703: 

unix.superglobalmegacorp.com

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