home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / fsrc1241.zip / nlbrowser.c < prev    next >
C/C++ Source or Header  |  1999-02-14  |  72KB  |  1,674 lines

  1. /*---------------------------------------------------------------------------+
  2.  | Titel: NLBROWSER.C                                                        |
  3.  +-----------------------------------------+---------------------------------+
  4.  | Erstellt von: Michael Hohner            | Am: 20.10.1994                  |
  5.  +-----------------------------------------+---------------------------------+
  6.  | System: OS/2 2.x PM                                                       |
  7.  +---------------------------------------------------------------------------+
  8.  | Beschreibung:                                                             |
  9.  |                                                                           |
  10.  |     Nodelist-Browser f. FleetStreet                                       |
  11.  |                                                                           |
  12.  |                                                                           |
  13.  +---------------------------------------------------------------------------+
  14.  | Bemerkungen:                                                              |
  15.  +---------------------------------------------------------------------------*/
  16.  
  17. /*----------------------------- Header-Dateien ------------------------------*/
  18. #pragma strings(readonly)
  19.  
  20. #define INCL_PM
  21. #define INCL_BASE
  22. #include <os2.h>
  23. #include <string.h>
  24. #include <stdlib.h>
  25. #include <stdio.h>
  26. #include <ctype.h>
  27. #include "main.h"
  28. #include "resids.h"
  29. #include "messages.h"
  30. #include "structs.h"
  31. #include "msgheader.h"
  32. #include "areaman\areaman.h"
  33. #include "dialogids.h"
  34. #include "fltv7\fltv7.h"
  35. #include "fltv7\fltv7structs.h"
  36. #include "fltv7\v7browse.h"
  37. #include "utility.h"
  38. #include "lookups.h"
  39. #include "nodedrag.h"
  40. #include "nlbrowser.h"
  41. #include "dump\expt.h"
  42.  
  43. /*--------------------------------- Defines ---------------------------------*/
  44.  
  45. #ifndef CRA_SOURCE
  46. #define CRA_SOURCE  0x00004000L
  47. #endif
  48.  
  49.  
  50. /*---------------------------------- Typen ----------------------------------*/
  51.  
  52. typedef struct {
  53.             MINIRECORDCORE RecordCore;
  54.             PCHAR pchSysop;
  55.             PCHAR pchAddress;
  56.             PCHAR pchSystemName;
  57.             PCHAR pchLocation;
  58.             PCHAR pchPhone;
  59.             PCHAR pchModem;
  60.             ULONG ulBaud;
  61.             ULONG ulCallCost;
  62.             ULONG ulUserCost;
  63.             PCHAR pchFlags;
  64.          } NODERECORD, *PNODERECORD;
  65.  
  66. typedef struct {
  67.             MINIRECORDCORE RecordCore;
  68.             PNODEINDEX     pStartIndex;
  69.             PNAMEINDEX     pNStartIndex;
  70.             char           pchIndexText[100];
  71.          } INDEXRECORD, *PINDEXRECORD;
  72.  
  73. typedef struct {
  74.             BOOL         bNotify;
  75.             BOOL         bNoPoints;
  76.             ULONG        ulCurrentMode;
  77.             char         pchCurrentDomain[LEN_DOMAIN+1];
  78.             BOOL         bIcons;
  79.             HPOINTER     hptrFolder;
  80.             HPOINTER     hptrPlus;
  81.             HPOINTER     hptrMinus;
  82.             HPOINTER     hptrOneNode;
  83.             HSWITCH      hSwitch;
  84.             PINDEXRECORD pCurrentIndex;
  85.             char         pchTitleSysop[50];
  86.             char         pchTitleAddress[50];
  87.             char         pchTitleSystem[50];
  88.             char         pchTitleLocation[50];
  89.             char         pchTitlePhone[50];
  90.             char         pchTitleModem[50];
  91.             char         pchTitleBaud[50];
  92.             char         pchTitleCallcost[50];
  93.             char         pchTitleUsercost[50];
  94.             char         pchTitleFlags[50];
  95.             PNODEBROWSE  pNodeBrowse;
  96.             PNAMEBROWSE  pNameBrowse;
  97.             LONG         lMinX;
  98.             LONG         lMinY;
  99.             char         pchICnrTitle[100];
  100.             char         pchNCnrTitle[100];
  101.             ULONG        ulNumNodes;
  102.             PNODEDATA    pNodeData;
  103.          } NLBROWSERDATA, *PNLBROWSERDATA;
  104.  
  105. typedef struct {
  106.              HWND           hwnd;
  107.              PNLBROWSERDATA pBrowserData;
  108.              PDOMAINS       pDomain;
  109.          } THREADDATA, *PTHREADDATA;
  110.  
  111. /*---------------------------- Globale Variablen ----------------------------*/
  112.  
  113. extern HAB anchor;
  114. extern HWND client;
  115. extern HMODULE hmodLang;
  116. extern HWND hwndhelp;
  117. extern BROWSEROPTIONS BrowserOptions;
  118. extern PDOMAINS domains;
  119. extern BOOL bDoingBrowse;
  120.  
  121. #if 0
  122. static PFNWP OldContainerProc;
  123. #endif
  124.  
  125. /*--------------------------- Funktionsprototypen ---------------------------*/
  126.  
  127. /*----------------------- interne Funktionsprototypen -----------------------*/
  128.  
  129. static int SwitchBrowser(HWND hwnd, PNLBROWSERDATA pBrowserData);
  130. static int CloseOldBrowsemode(HWND hwnd, PNLBROWSERDATA pBrowserData);
  131. static void _Optlink OpenNodeBrowseThread(PVOID pParam);
  132. static void _Optlink OpenNameBrowseThread(PVOID pParam);
  133. static void NodeIndexReady(HWND hwnd, PNLBROWSERDATA pBrowserData);
  134. static void NameIndexReady(HWND hwnd, PNLBROWSERDATA pBrowserData);
  135. static void TitleWork(HWND hwnd, PNLBROWSERDATA pBrowserData);
  136. static void _Optlink ReadNetDataThread(PVOID pParam);
  137. static void _Optlink ReadNameDataThread(PVOID pParam);
  138. static void CleanupNodeContainer(HWND hwnd, PNLBROWSERDATA pBrowserData);
  139. static void OpenIndex(HWND hwnd, PNLBROWSERDATA pBrowserData, PINDEXRECORD pIndexRecord, BOOL bForce);
  140. static void NodeDataReady(HWND hwnd, PNLBROWSERDATA pBrowserData);
  141. static void InitNodeDrag(HWND hwndDlg, PCNRDRAGINIT pInit, PNLBROWSERDATA pBrowserData);
  142. #if 0
  143. static MRESULT EXPENTRY NewContainerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  144.  
  145.  
  146. static MRESULT EXPENTRY NewContainerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  147. {
  148.    switch(msg)
  149.    {
  150.       case WM_BUTTON2DOWN:
  151.          return (MRESULT) TRUE;
  152.  
  153.       default:
  154.          break;
  155.    }
  156.    return OldContainerProc(hwnd, msg, mp1, mp2);
  157. }
  158. #endif
  159.  
  160. /*---------------------------------------------------------------------------*/
  161. /* Funktionsname: NLBrowserProc                                              */
  162. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  163. /* Beschreibung: Fensterprozedur f. Nodelist-Browser                         */
  164. /*                                                                           */
  165. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  166. /* Parameter: WINPROC                                                        */
  167. /*                                                                           */
  168. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  169. /* Rückgabewerte: MRESULT                                                    */
  170. /*                                                                           */
  171. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  172. /* Sonstiges:                                                                */
  173. /*                                                                           */
  174. /*---------------------------------------------------------------------------*/
  175.  
  176. MRESULT EXPENTRY NLBrowserProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  177. {
  178.    PNLBROWSERDATA pBrowserData = (PNLBROWSERDATA) WinQueryWindowULong(hwnd, QWL_USER);
  179.    CNRINFO cnrinfo;
  180.    PFIELDINFO pFieldInfo, pFirstFieldInfo;
  181.    FIELDINFOINSERT FieldInfoInsert;
  182.    PDOMAINS pDomain;
  183.    MRESULT mrbuffer;
  184.    SWP swp;
  185.    static ULONG MinorVersion=0;
  186.  
  187.    switch(msg)
  188.    {
  189.       case WM_INITDLG:
  190.          pBrowserData = calloc(1, sizeof(NLBROWSERDATA));
  191.          WinSetWindowULong(hwnd, QWL_USER, (ULONG) pBrowserData);
  192.  
  193.          strcpy(pBrowserData->pchCurrentDomain, BrowserOptions.pchLastDomain);
  194.          pBrowserData->ulCurrentMode = BrowserOptions.ulLastMode;
  195.          pBrowserData->bIcons =        BrowserOptions.bIcons;
  196.          pBrowserData->bNoPoints =     BrowserOptions.bNoPoints;
  197.          WinCheckButton(hwnd, IDD_NLBROWSER+10, pBrowserData->bNoPoints);
  198.  
  199.          /* Switch-Listen-Eintrag */
  200.          pBrowserData->hSwitch=AddToWindowList(hwnd);
  201.  
  202.          /* Icons */
  203.          pBrowserData->hptrFolder= LoadIcon(IDIC_NETFOLDER);
  204.          pBrowserData->hptrOneNode= LoadIcon(IDIC_ONENODE);
  205.  
  206.          /* OS/2 3.0 and below: replace tree icons */
  207.          DosQuerySysInfo(QSV_VERSION_MINOR, QSV_VERSION_MINOR, &MinorVersion,
  208.                          sizeof(MinorVersion));
  209.  
  210.          if (MinorVersion < 40)
  211.          {
  212.             pBrowserData->hptrPlus=LoadIcon(IDIC_PLUS);
  213.             pBrowserData->hptrMinus=LoadIcon(IDIC_MINUS);
  214.          }
  215.  
  216.          SendMsg(hwnd, WM_SETICON, (MPARAM) pBrowserData->hptrFolder, NULL);
  217.  
  218.          /* Index-Container initialisieren */
  219.          cnrinfo.cb = sizeof(CNRINFO);
  220.          cnrinfo.flWindowAttr = CV_TREE | CA_DRAWICON | CA_TREELINE |
  221.                                 CA_CONTAINERTITLE | CA_TITLEREADONLY | CA_TITLESEPARATOR;
  222.          if (pBrowserData->bIcons)
  223.          {
  224.             WinCheckButton(hwnd, IDD_NLBROWSER+9, TRUE);
  225.             cnrinfo.flWindowAttr |= CV_ICON;
  226.          }
  227.          else
  228.          {
  229.             WinCheckButton(hwnd, IDD_NLBROWSER+9, FALSE);
  230.             cnrinfo.flWindowAttr |= CV_TEXT;
  231.          }
  232.          if (MinorVersion < 40)
  233.          {
  234.             cnrinfo.hptrCollapsed = pBrowserData->hptrPlus;
  235.             cnrinfo.hptrExpanded = pBrowserData->hptrMinus;
  236.          }
  237.          cnrinfo.pszCnrTitle = pBrowserData->pchICnrTitle;
  238.  
  239.          WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+1, CM_SETCNRINFO, &cnrinfo,
  240.                            MPFROMLONG(CMA_FLWINDOWATTR |
  241.                                       ((MinorVersion<40)?CMA_TREEICON:0) |
  242.                                       CMA_CNRTITLE));
  243.  
  244.          /* Node-Container initialisieren */
  245. #if 0
  246.          OldContainerProc=WinSubclassWindow(WinWindowFromID(WinWindowFromID(hwnd, IDD_NLBROWSER+2), CID_LEFTDVWND), NewContainerProc);
  247. #endif
  248.          pFirstFieldInfo = WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_ALLOCDETAILFIELDINFO,
  249.                                              MPFROMSHORT(10), NULL);
  250.          pFieldInfo = pFirstFieldInfo;
  251.  
  252.          pFieldInfo->cb=sizeof(FIELDINFO);
  253.          pFieldInfo->flData=CFA_STRING | CFA_HORZSEPARATOR | CFA_SEPARATOR;
  254.          pFieldInfo->flTitle=0;
  255.          LoadString(IDST_LU_ADDRESS, 50, pBrowserData->pchTitleAddress);
  256.          pFieldInfo->pTitleData= pBrowserData->pchTitleAddress;
  257.          pFieldInfo->offStruct= FIELDOFFSET(NODERECORD, pchAddress);
  258.          pFieldInfo=pFieldInfo->pNextFieldInfo;
  259.  
  260.          pFieldInfo->cb=sizeof(FIELDINFO);
  261.          pFieldInfo->flData=CFA_STRING | CFA_HORZSEPARATOR;
  262.          pFieldInfo->flTitle=0;
  263.          LoadString(IDST_LU_SYSOP, 50, pBrowserData->pchTitleSysop);
  264.          pFieldInfo->pTitleData= pBrowserData->pchTitleSysop;
  265.          pFieldInfo->offStruct= FIELDOFFSET(NODERECORD, pchSysop);
  266.          pFieldInfo=pFieldInfo->pNextFieldInfo;
  267.  
  268.          pFieldInfo->cb=sizeof(FIELDINFO);
  269.          pFieldInfo->flData=CFA_STRING | CFA_HORZSEPARATOR | CFA_SEPARATOR;
  270.          pFieldInfo->flTitle=0;
  271.          LoadString(IDST_LU_SYSTEM, 50, pBrowserData->pchTitleSystem);
  272.          pFieldInfo->pTitleData= pBrowserData->pchTitleSystem;
  273.          pFieldInfo->offStruct= FIELDOFFSET(NODERECORD, pchSystemName);
  274.          pFieldInfo=pFieldInfo->pNextFieldInfo;
  275.  
  276.          pFieldInfo->cb=sizeof(FIELDINFO);
  277.          pFieldInfo->flData=CFA_STRING | CFA_HORZSEPARATOR | CFA_SEPARATOR;
  278.          pFieldInfo->flTitle=0;
  279.          LoadString(IDST_LU_LOCATION, 50, pBrowserData->pchTitleLocation);
  280.          pFieldInfo->pTitleData= pBrowserData->pchTitleLocation;
  281.          pFieldInfo->offStruct= FIELDOFFSET(NODERECORD, pchLocation);
  282.          pFieldInfo=pFieldInfo->pNextFieldInfo;
  283.  
  284.          pFieldInfo->cb=sizeof(FIELDINFO);
  285.          pFieldInfo->flData=CFA_STRING | CFA_HORZSEPARATOR | CFA_SEPARATOR;
  286.          pFieldInfo->flTitle=0;
  287.          LoadString(IDST_LU_PHONE, 50, pBrowserData->pchTitlePhone);
  288.          pFieldInfo->pTitleData= pBrowserData->pchTitlePhone;
  289.          pFieldInfo->offStruct= FIELDOFFSET(NODERECORD, pchPhone);
  290.          pFieldInfo=pFieldInfo->pNextFieldInfo;
  291.  
  292.          pFieldInfo->cb=sizeof(FIELDINFO);
  293.          pFieldInfo->flData=CFA_STRING | CFA_HORZSEPARATOR | CFA_SEPARATOR;
  294.          pFieldInfo->flTitle=0;
  295.          LoadString(IDST_LU_MODEM, 50, pBrowserData->pchTitleModem);
  296.          pFieldInfo->pTitleData= pBrowserData->pchTitleModem;
  297.          pFieldInfo->offStruct= FIELDOFFSET(NODERECORD, pchModem);
  298.          pFieldInfo=pFieldInfo->pNextFieldInfo;
  299.  
  300.          pFieldInfo->cb=sizeof(FIELDINFO);
  301.          pFieldInfo->flData=CFA_ULONG | CFA_HORZSEPARATOR | CFA_SEPARATOR |
  302.                             CFA_RIGHT;
  303.          pFieldInfo->flTitle=0;
  304.          LoadString(IDST_LU_BAUD, 50, pBrowserData->pchTitleBaud);
  305.          pFieldInfo->pTitleData= pBrowserData->pchTitleBaud;
  306.          pFieldInfo->offStruct= FIELDOFFSET(NODERECORD, ulBaud);
  307.          pFieldInfo=pFieldInfo->pNextFieldInfo;
  308.  
  309.          pFieldInfo->cb=sizeof(FIELDINFO);
  310.          pFieldInfo->flData=CFA_ULONG | CFA_HORZSEPARATOR | CFA_SEPARATOR | CFA_RIGHT;
  311.          pFieldInfo->flTitle=0;
  312.          LoadString(IDST_LU_CALLCOST, 50, pBrowserData->pchTitleCallcost);
  313.          pFieldInfo->pTitleData= pBrowserData->pchTitleCallcost;
  314.          pFieldInfo->offStruct= FIELDOFFSET(NODERECORD, ulCallCost);
  315.          pFieldInfo=pFieldInfo->pNextFieldInfo;
  316.  
  317.          pFieldInfo->cb=sizeof(FIELDINFO);
  318.          pFieldInfo->flData=CFA_ULONG | CFA_HORZSEPARATOR | CFA_SEPARATOR | CFA_RIGHT;
  319.          pFieldInfo->flTitle=0;
  320.          LoadString(IDST_LU_USERCOST, 50, pBrowserData->pchTitleUsercost);
  321.          pFieldInfo->pTitleData= pBrowserData->pchTitleUsercost;
  322.          pFieldInfo->offStruct= FIELDOFFSET(NODERECORD, ulUserCost);
  323.          pFieldInfo=pFieldInfo->pNextFieldInfo;
  324.  
  325.          pFieldInfo->cb=sizeof(FIELDINFO);
  326.          pFieldInfo->flData=CFA_STRING | CFA_HORZSEPARATOR | CFA_SEPARATOR;
  327.          pFieldInfo->flTitle=0;
  328.          LoadString(IDST_LU_FLAGS, 50, pBrowserData->pchTitleFlags);
  329.          pFieldInfo->pTitleData= pBrowserData->pchTitleFlags;
  330.          pFieldInfo->offStruct= FIELDOFFSET(NODERECORD, pchFlags);
  331.  
  332.          /* Felder des Containers einfuegen */
  333.          FieldInfoInsert.cb=sizeof(FIELDINFOINSERT);
  334.          FieldInfoInsert.pFieldInfoOrder=(PFIELDINFO) CMA_FIRST;
  335.          FieldInfoInsert.fInvalidateFieldInfo=TRUE;
  336.          FieldInfoInsert.cFieldInfoInsert=10;
  337.  
  338.          WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_INSERTDETAILFIELDINFO,
  339.                            pFirstFieldInfo, &FieldInfoInsert);
  340.  
  341.          cnrinfo.cb = sizeof(CNRINFO);
  342.          cnrinfo.flWindowAttr = CV_DETAIL| CA_DETAILSVIEWTITLES |
  343.                                 CA_CONTAINERTITLE | CA_TITLEREADONLY | CA_TITLESEPARATOR;
  344.          cnrinfo.pFieldInfoLast = pFirstFieldInfo->pNextFieldInfo;
  345.          cnrinfo.xVertSplitbar  = BrowserOptions.lSplitbar;
  346.          cnrinfo.pszCnrTitle = pBrowserData->pchNCnrTitle;
  347.  
  348.          WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_SETCNRINFO, &cnrinfo,
  349.                            MPFROMLONG(CMA_FLWINDOWATTR | CMA_PFIELDINFOLAST |
  350.                                       CMA_CNRTITLE | CMA_XVERTSPLITBAR));
  351.  
  352.          /* Listbox mit Domains initialisieren */
  353.          pDomain = domains;
  354.          while (pDomain)
  355.          {
  356.             SHORT sItem;
  357.  
  358.             sItem = (SHORT) WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+6, LM_INSERTITEM,
  359.                                               MPFROMSHORT(LIT_SORTASCENDING), pDomain->domainname);
  360.             /* leeren Default durch ersten Domain ersetzen */
  361.             if (!pBrowserData->pchCurrentDomain[0])
  362.                strcpy(pBrowserData->pchCurrentDomain, pDomain->domainname);
  363.  
  364.             /* letzten Domain selektieren */
  365.             if (!stricmp(pDomain->domainname, pBrowserData->pchCurrentDomain))
  366.                WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+6, LM_SELECTITEM,
  367.                                  MPFROMSHORT(sItem), MPFROMLONG(TRUE));
  368.  
  369.             pDomain = pDomain->next;
  370.          }
  371.  
  372.          /* Radio-Buttons */
  373.          if (pBrowserData->ulCurrentMode == BROWSEMODE_NODE)
  374.             WinCheckButton(hwnd, IDD_NLBROWSER+7, TRUE);
  375.          else
  376.             WinCheckButton(hwnd, IDD_NLBROWSER+8, TRUE);
  377.  
  378.          /* minimale Fenstergroessen */
  379.          WinQueryWindowPos(WinWindowFromID(hwnd, IDD_NLBROWSER+2),
  380.                            &swp);
  381.          pBrowserData->lMinX = swp.x + swp.cx +2;
  382.          pBrowserData->lMinY = swp.y + 2 * WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR);
  383.  
  384.          RestoreWinPos(hwnd, &BrowserOptions.BrowserPos, TRUE, TRUE);
  385.          pBrowserData->bNotify = TRUE;
  386.  
  387.          SwitchBrowser(hwnd, pBrowserData);
  388.          SetInitialAccel(hwnd);
  389.          break;
  390.  
  391.       case WM_DESTROY:
  392.          CloseOldBrowsemode(hwnd, pBrowserData);
  393.  
  394.          WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_QUERYCNRINFO, &cnrinfo,
  395.                            MPFROMLONG(sizeof(cnrinfo)));
  396.          if (BrowserOptions.lSplitbar != cnrinfo.xVertSplitbar)
  397.          {
  398.             extern DIRTYFLAGS dirtyflags;
  399.  
  400.             BrowserOptions.lSplitbar = cnrinfo.xVertSplitbar;
  401.             dirtyflags.browserdirty = TRUE;
  402.          }
  403.          if (BrowserOptions.bIcons != pBrowserData->bIcons)
  404.          {
  405.             extern DIRTYFLAGS dirtyflags;
  406.  
  407.             BrowserOptions.bIcons = pBrowserData->bIcons;
  408.             dirtyflags.browserdirty = TRUE;
  409.          }
  410.          if (BrowserOptions.bNoPoints != pBrowserData->bNoPoints)
  411.          {
  412.             extern DIRTYFLAGS dirtyflags;
  413.  
  414.             BrowserOptions.bNoPoints = pBrowserData->bNoPoints;
  415.             dirtyflags.browserdirty = TRUE;
  416.          }
  417.          if (BrowserOptions.ulLastMode != pBrowserData->ulCurrentMode)
  418.          {
  419.             extern DIRTYFLAGS dirtyflags;
  420.  
  421.             BrowserOptions.ulLastMode = pBrowserData->ulCurrentMode;
  422.             dirtyflags.browserdirty = TRUE;
  423.          }
  424.          if (!BrowserOptions.pchLastDomain[0] ||
  425.              strcmp(BrowserOptions.pchLastDomain, pBrowserData->pchCurrentDomain))
  426.          {
  427.             extern DIRTYFLAGS dirtyflags;
  428.  
  429.             strcpy(BrowserOptions.pchLastDomain, pBrowserData->pchCurrentDomain);
  430.             dirtyflags.browserdirty = TRUE;
  431.          }
  432.  
  433.          if (pBrowserData->hptrFolder)
  434.             WinDestroyPointer(pBrowserData->hptrFolder);
  435.          if (pBrowserData->hptrOneNode)
  436.             WinDestroyPointer(pBrowserData->hptrOneNode);
  437.  
  438.          if (MinorVersion < 40)
  439.          {
  440.             if (pBrowserData->hptrPlus)
  441.                WinDestroyPointer(pBrowserData->hptrPlus);
  442.             if (pBrowserData->hptrMinus)
  443.                WinDestroyPointer(pBrowserData->hptrMinus);
  444.          }
  445.          RemoveFromWindowList(pBrowserData->hSwitch);
  446.          free(pBrowserData);
  447.          break;
  448.  
  449.       case WM_ACTIVATE:
  450.          if (mp1)
  451.             WinAssociateHelpInstance(hwndhelp, hwnd);
  452.          else
  453.             WinAssociateHelpInstance(hwndhelp, NULLHANDLE);
  454.          break;
  455.  
  456.       case WM_COMMAND:
  457.          if (SHORT1FROMMP(mp2) == CMDSRC_ACCELERATOR)
  458.             return RedirectCommand(mp1, mp2);
  459.  
  460.          if (!WinIsWindowEnabled(WinWindowFromID(hwnd, IDD_NLBROWSER+3)))
  461.             return (MRESULT) FALSE;
  462.  
  463.          WinPostMsg(client, BRSM_CLOSE, NULL, NULL);
  464.          break;
  465.  
  466.       case WM_CONTROL:
  467.          switch (SHORT1FROMMP(mp1))
  468.          {
  469.             case IDD_NLBROWSER+1:
  470.                if (SHORT2FROMMP(mp1) == CN_ENTER)
  471.                {
  472.                   PNOTIFYRECORDENTER pEnter = (PNOTIFYRECORDENTER) mp2;
  473.  
  474.                   if (!bDoingBrowse && pEnter && pEnter->pRecord)
  475.                      OpenIndex(hwnd, pBrowserData, (PINDEXRECORD) pEnter->pRecord, FALSE);
  476.                }
  477.                break;
  478.  
  479.             case IDD_NLBROWSER+2:
  480.                if (SHORT2FROMMP(mp1) == CN_INITDRAG)
  481.                {
  482.                   InitNodeDrag(hwnd, (PCNRDRAGINIT) mp2, pBrowserData);
  483.                }
  484.                break;
  485.  
  486.             case IDD_NLBROWSER+9:
  487.                if (SHORT2FROMMP(mp1) == BN_CLICKED ||
  488.                    SHORT2FROMMP(mp1) == BN_DBLCLICKED )
  489.                {
  490.                   pBrowserData->bIcons = WinQueryButtonCheckstate(hwnd, IDD_NLBROWSER+9);
  491.  
  492.                   WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+1, CM_QUERYCNRINFO, &cnrinfo,
  493.                                     MPFROMLONG(sizeof(cnrinfo)));
  494.                   if (pBrowserData->bIcons)
  495.                   {
  496.                      cnrinfo.flWindowAttr &= ~CV_TEXT;
  497.                      cnrinfo.flWindowAttr |= CV_ICON;
  498.                   }
  499.                   else
  500.                   {
  501.                      cnrinfo.flWindowAttr &= ~CV_ICON;
  502.                      cnrinfo.flWindowAttr |= CV_TEXT;
  503.                   }
  504.                   WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+1, CM_SETCNRINFO, &cnrinfo,
  505.                                     MPFROMLONG(CMA_FLWINDOWATTR));
  506.                }
  507.                break;
  508.  
  509.             case IDD_NLBROWSER+10:
  510.                if (SHORT2FROMMP(mp1) == BN_CLICKED ||
  511.                    SHORT2FROMMP(mp1) == BN_DBLCLICKED )
  512.                {
  513.                   if (WinQueryButtonCheckstate(hwnd, IDD_NLBROWSER+10))
  514.                      pBrowserData->bNoPoints = TRUE;
  515.                   else
  516.                      pBrowserData->bNoPoints = FALSE;
  517.                   if (pBrowserData->pCurrentIndex)
  518.                      OpenIndex(hwnd, pBrowserData, pBrowserData->pCurrentIndex, TRUE);
  519.                }
  520.                break;
  521.  
  522.             case IDD_NLBROWSER+6:
  523.                if (SHORT2FROMMP(mp1) == CBN_ENTER)
  524.                {
  525.                   char pchTemp[LEN_DOMAIN+1];
  526.                   SHORT sItem;
  527.  
  528.                   sItem = (SHORT) WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+6, LM_QUERYSELECTION,
  529.                                                     MPFROMSHORT(LIT_FIRST), NULL);
  530.                   if (sItem >= 0)
  531.                   {
  532.                      WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+6, LM_QUERYITEMTEXT,
  533.                                        MPFROM2SHORT(sItem, LEN_DOMAIN+1),
  534.                                        pchTemp);
  535.  
  536.                      if (stricmp(pBrowserData->pchCurrentDomain, pchTemp))
  537.                      {
  538.                         strcpy(pBrowserData->pchCurrentDomain, pchTemp);
  539.                         SwitchBrowser(hwnd, pBrowserData);
  540.                      }
  541.                   }
  542.                }
  543.                break;
  544.  
  545.             case IDD_NLBROWSER+7:
  546.             case IDD_NLBROWSER+8:
  547.                if (WinQueryButtonCheckstate(hwnd, IDD_NLBROWSER+7))
  548.                {
  549.                   if (pBrowserData->ulCurrentMode == BROWSEMODE_NAME)
  550.                   {
  551.                      pBrowserData->ulCurrentMode = BROWSEMODE_NODE;
  552.                      SwitchBrowser(hwnd, pBrowserData);
  553.                   }
  554.                }
  555.                else
  556.                {
  557.                   if (pBrowserData->ulCurrentMode == BROWSEMODE_NODE)
  558.                   {
  559.                      pBrowserData->ulCurrentMode = BROWSEMODE_NAME;
  560.                      SwitchBrowser(hwnd, pBrowserData);
  561.                   }
  562.                }
  563.                break;
  564.  
  565.             default:
  566.                break;
  567.          }
  568.          break;
  569.  
  570.       case WM_CLOSE:
  571.          if (!WinIsWindowEnabled(WinWindowFromID(hwnd, IDD_NLBROWSER+3)))
  572.             return (MRESULT) FALSE;
  573.  
  574.          WinPostMsg(client, BRSM_CLOSE, NULL, NULL);
  575.          break;
  576.  
  577.       case WM_QUERYTRACKINFO:
  578.          WinQueryWindowPos(hwnd, &swp);
  579.          if (swp.fl & SWP_MINIMIZE)
  580.             break;
  581.  
  582.          mrbuffer = WinDefDlgProc(hwnd, msg, mp1, mp2);
  583.          ((PTRACKINFO)mp2)->ptlMinTrackSize.x = pBrowserData->lMinX;
  584.          ((PTRACKINFO)mp2)->ptlMinTrackSize.y = pBrowserData->lMinY;
  585.          return mrbuffer;
  586.  
  587.       case WM_ADJUSTWINDOWPOS:
  588.          if (((PSWP)mp1)->fl & SWP_MINIMIZE)
  589.             WinShowWindow(WinWindowFromID(hwnd, IDD_NLBROWSER+3), FALSE);
  590.          if (((PSWP)mp1)->fl & (SWP_MAXIMIZE|SWP_RESTORE))
  591.             WinShowWindow(WinWindowFromID(hwnd, IDD_NLBROWSER+3), TRUE);
  592.          break;
  593.  
  594.       case WM_ADJUSTFRAMEPOS:
  595.          if (((PSWP)mp1)->fl & (SWP_SIZE|SWP_MINIMIZE|SWP_MAXIMIZE|SWP_RESTORE))
  596.          {
  597.             SWP swp, swp2;
  598.  
  599.             LONG lHeight = ((PSWP)mp1)->cy - WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR) -
  600.                            2 * WinQuerySysValue(HWND_DESKTOP, SV_CYBORDER);
  601.  
  602.             WinQueryWindowPos(WinWindowFromID(hwnd, IDD_NLBROWSER+1), &swp);
  603.  
  604.             /* Index-Container */
  605.             WinSetWindowPos(WinWindowFromID(hwnd, IDD_NLBROWSER+1),
  606.                             NULLHANDLE,
  607.                             0, 0,
  608.                             swp.cx, lHeight - swp.y,
  609.                             SWP_SIZE);
  610.  
  611.             /* Node-Container */
  612.             WinQueryWindowPos(WinWindowFromID(hwnd, IDD_NLBROWSER+2), &swp2);
  613.  
  614.             WinSetWindowPos(WinWindowFromID(hwnd, IDD_NLBROWSER+2),
  615.                             NULLHANDLE,
  616.                             0, 0,
  617.                             ((PSWP)mp1)->cx - swp.x - swp2.x-1, lHeight - swp.y,
  618.                             SWP_SIZE);
  619.          }
  620.          break;
  621.  
  622.       case WM_WINDOWPOSCHANGED:
  623.          if (pBrowserData && pBrowserData->bNotify)
  624.          {
  625.             extern DIRTYFLAGS dirtyflags;
  626.  
  627.             SaveWinPos(hwnd, (PSWP) mp1, &BrowserOptions.BrowserPos, &dirtyflags.browserdirty);
  628.          }
  629.          break;
  630.  
  631.       case BRSM_INDEX_READY:
  632.          if (pBrowserData->pNodeBrowse)
  633.             NodeIndexReady(hwnd, pBrowserData);
  634.          else
  635.             NameIndexReady(hwnd, pBrowserData);
  636.  
  637.          /* Controls einschalten */
  638.          WinEnableControl(hwnd, IDD_NLBROWSER+3, TRUE);
  639.          WinEnableControl(hwnd, IDD_NLBROWSER+6, TRUE);
  640.          WinEnableControl(hwnd, IDD_NLBROWSER+7, TRUE);
  641.          WinEnableControl(hwnd, IDD_NLBROWSER+8, TRUE);
  642.          if (pBrowserData->ulCurrentMode == BROWSEMODE_NODE)
  643.             WinEnableControl(hwnd, IDD_NLBROWSER+10, TRUE);
  644.          bDoingBrowse = FALSE;
  645.          break;
  646.  
  647.       case BRSM_DATA_READY:
  648.          NodeDataReady(hwnd, pBrowserData);
  649.          /* Controls einschalten */
  650.          WinEnableControl(hwnd, IDD_NLBROWSER+3, TRUE);
  651.          WinEnableControl(hwnd, IDD_NLBROWSER+6, TRUE);
  652.          WinEnableControl(hwnd, IDD_NLBROWSER+7, TRUE);
  653.          WinEnableControl(hwnd, IDD_NLBROWSER+8, TRUE);
  654.          if (pBrowserData->ulCurrentMode == BROWSEMODE_NODE)
  655.             WinEnableControl(hwnd, IDD_NLBROWSER+10, TRUE);
  656.          bDoingBrowse = FALSE;
  657.          break;
  658.  
  659.       case BRSM_INDEX_ERROR:
  660.       case BRSM_DATA_ERROR:
  661.          {
  662.             char pchTemplate[100]="";
  663.             char pchMessage[150]="";
  664.  
  665.             switch((ULONG) mp1)
  666.             {
  667.                case V7ERR_IDXOPENERR:
  668.                   LoadString(IDST_MSG_IDXOPENERR, sizeof(pchTemplate), pchTemplate);
  669.                   sprintf(pchMessage, pchTemplate, pBrowserData->pchCurrentDomain);
  670.                   WinMessageBox(HWND_DESKTOP, hwnd, pchMessage, NULL, IDD_IDXOPENERR,
  671.                                 MB_OK | MB_HELP | MB_MOVEABLE | MB_ERROR);
  672.                   break;
  673.  
  674.                case V7ERR_DATOPENERR:
  675.                   LoadString(IDST_MSG_DATOPENERR, sizeof(pchTemplate), pchTemplate);
  676.                   sprintf(pchMessage, pchTemplate, pBrowserData->pchCurrentDomain);
  677.                   WinMessageBox(HWND_DESKTOP, hwnd, pchMessage, NULL, IDD_DATOPENERR,
  678.                                 MB_OK | MB_HELP | MB_MOVEABLE | MB_ERROR);
  679.                   break;
  680.  
  681.                case V7ERR_IDXREADERR:
  682.                   LoadString(IDST_MSG_IDXREADERR, sizeof(pchTemplate), pchTemplate);
  683.                   sprintf(pchMessage, pchTemplate, pBrowserData->pchCurrentDomain);
  684.                   WinMessageBox(HWND_DESKTOP, hwnd, pchMessage, NULL, IDD_IDXREADERR,
  685.                                 MB_OK | MB_HELP | MB_MOVEABLE | MB_ERROR);
  686.                   break;
  687.  
  688.                case V7ERR_DATREADERR:
  689.                   LoadString(IDST_MSG_DATREADERR, sizeof(pchTemplate), pchTemplate);
  690.                   sprintf(pchMessage, pchTemplate, pBrowserData->pchCurrentDomain);
  691.                   WinMessageBox(HWND_DESKTOP, hwnd, pchMessage, NULL, IDD_DATREADERR,
  692.                                 MB_OK | MB_HELP | MB_MOVEABLE | MB_ERROR);
  693.                   break;
  694.  
  695.                default:
  696.                   break;
  697.             }
  698.  
  699.             /* Controls einschalten */
  700.             WinEnableControl(hwnd, IDD_NLBROWSER+3, TRUE);
  701.             WinEnableControl(hwnd, IDD_NLBROWSER+6, TRUE);
  702.             WinEnableControl(hwnd, IDD_NLBROWSER+7, TRUE);
  703.             WinEnableControl(hwnd, IDD_NLBROWSER+8, TRUE);
  704.             WinEnableControl(hwnd, IDD_NLBROWSER+10, TRUE);
  705.             bDoingBrowse = FALSE;
  706.          }
  707.          break;
  708.  
  709.       case WORKM_SWITCHACCELS:
  710.          SwitchAccels(hwnd, (ULONG) mp1);
  711.          break;
  712.  
  713.       default:
  714.          break;
  715.    }
  716.    return WinDefDlgProc(hwnd, msg, mp1, mp2);
  717. }
  718.  
  719. /*---------------------------------------------------------------------------*/
  720. /* Funktionsname: SwitchBrowser                                              */
  721. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  722. /* Beschreibung: Schaltet auf ein anderes Domain oder in einen anderen       */
  723. /*               Browse-Modus                                                */
  724. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  725. /* Parameter: hwnd: Dialog-Fenster                                           */
  726. /*            pBrowserData: Instanzdaten                                     */
  727. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  728. /* Rückgabewerte: 0  OK                                                      */
  729. /*                1  unbekannter Modus                                       */
  730. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  731. /* Sonstiges:                                                                */
  732. /*                                                                           */
  733. /*---------------------------------------------------------------------------*/
  734.  
  735. static int SwitchBrowser(HWND hwnd, PNLBROWSERDATA pBrowserData)
  736. {
  737.    PDOMAINS pDomain = domains;
  738.    static THREADDATA ThreadData;
  739.  
  740.  
  741.    /* Domain suchen */
  742.    while (pDomain && stricmp(pDomain->domainname, pBrowserData->pchCurrentDomain))
  743.       pDomain = pDomain->next;
  744.  
  745.    if (!pDomain)
  746.    {
  747.       return 1;  /* Domain nicht gefunden */
  748.    }
  749.  
  750.    if (pBrowserData->ulCurrentMode == BROWSEMODE_NODE)
  751.    {
  752.       CloseOldBrowsemode(hwnd, pBrowserData);
  753.       TitleWork(hwnd, pBrowserData);
  754.       pBrowserData->pNodeBrowse = calloc(1, sizeof(NODEBROWSE));
  755.  
  756.       /* Controls abschalten */
  757.       WinEnableControl(hwnd, IDD_NLBROWSER+3, FALSE);
  758.       WinEnableControl(hwnd, IDD_NLBROWSER+6, FALSE);
  759.       WinEnableControl(hwnd, IDD_NLBROWSER+7, FALSE);
  760.       WinEnableControl(hwnd, IDD_NLBROWSER+8, FALSE);
  761.  
  762.       ThreadData.hwnd = hwnd;
  763.       ThreadData.pDomain = pDomain;
  764.       ThreadData.pBrowserData = pBrowserData;
  765.  
  766.       _beginthread(OpenNodeBrowseThread, NULL, 16384, &ThreadData);
  767.  
  768.       return 0;
  769.    }
  770.    else
  771.       if (pBrowserData->ulCurrentMode == BROWSEMODE_NAME)
  772.       {
  773.          CloseOldBrowsemode(hwnd, pBrowserData);
  774.          TitleWork(hwnd, pBrowserData);
  775.          pBrowserData->pNameBrowse = calloc(1, sizeof(NAMEBROWSE));
  776.  
  777.          /* Controls abschalten */
  778.          WinEnableControl(hwnd, IDD_NLBROWSER+3, FALSE);
  779.          WinEnableControl(hwnd, IDD_NLBROWSER+6, FALSE);
  780.          WinEnableControl(hwnd, IDD_NLBROWSER+7, FALSE);
  781.          WinEnableControl(hwnd, IDD_NLBROWSER+8, FALSE);
  782.          WinEnableControl(hwnd, IDD_NLBROWSER+10, FALSE);
  783.  
  784.          ThreadData.hwnd = hwnd;
  785.          ThreadData.pDomain = pDomain;
  786.          ThreadData.pBrowserData = pBrowserData;
  787.  
  788.          _beginthread(OpenNameBrowseThread, NULL, 16384, &ThreadData);
  789.  
  790.          return 0;
  791.       }
  792.       else
  793.       {
  794.          return 1; /* unbekannter Modus */
  795.       }
  796. }
  797.  
  798. /*---------------------------------------------------------------------------*/
  799. /* Funktionsname: CloseOldBrowsemode                                         */
  800. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  801. /* Beschreibung: Beendet das Browsen, leert die Container, gibt Speicher frei*/
  802. /*                                                                           */
  803. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  804. /* Parameter: hwnd: Dialog-Fenster                                           */
  805. /*            pBrowserData: Instanzdaten                                     */
  806. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  807. /* Rückgabewerte: 0  OK                                                      */
  808. /*                                                                           */
  809. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  810. /* Sonstiges:                                                                */
  811. /*                                                                           */
  812. /*---------------------------------------------------------------------------*/
  813.  
  814. static int CloseOldBrowsemode(HWND hwnd, PNLBROWSERDATA pBrowserData)
  815. {
  816.    /* Index-Container leeren */
  817.    WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+1, CM_REMOVERECORD, NULL,
  818.                      MPFROM2SHORT(0, CMA_FREE | CMA_INVALIDATE));
  819.    pBrowserData->pCurrentIndex = NULL;
  820.  
  821.    /* Node-Container leeren */
  822.    CleanupNodeContainer(hwnd, pBrowserData);
  823.  
  824.    if (pBrowserData->pNodeBrowse)
  825.    {
  826.       FLTV7CloseNodeBrowse(pBrowserData->pNodeBrowse);
  827.       free(pBrowserData->pNodeBrowse);
  828.       pBrowserData->pNodeBrowse = NULL;
  829.    }
  830.  
  831.    if (pBrowserData->pNameBrowse)
  832.    {
  833.       FLTV7CloseNameBrowse(pBrowserData->pNameBrowse);
  834.       free(pBrowserData->pNameBrowse);
  835.       pBrowserData->pNameBrowse = NULL;
  836.    }
  837.  
  838.    return 0;
  839. }
  840.  
  841. /*---------------------------------------------------------------------------*/
  842. /* Funktionsname: OpenNodeBrowseThread                                       */
  843. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  844. /* Beschreibung: Initialisiert fuer das Browsen nach Nodenummern             */
  845. /*                                                                           */
  846. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  847. /* Parameter: pParam: Zeiger auf THREADDATA-Struktur                         */
  848. /*                                                                           */
  849. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  850. /* Rückgabewerte: -                                                          */
  851. /*                                                                           */
  852. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  853. /* Sonstiges:                                                                */
  854. /*                                                                           */
  855. /*---------------------------------------------------------------------------*/
  856.  
  857. static void _Optlink OpenNodeBrowseThread(PVOID pParam)
  858. {
  859.    PTHREADDATA pThreadData = pParam;
  860.    char pchIndexFile[LEN_PATHNAME+1];
  861.    char drive[_MAX_DRIVE];
  862.    char   dir[_MAX_DIR];
  863.    char fname[_MAX_FNAME];
  864.    char   ext[_MAX_EXT];
  865.    int rc;
  866.  
  867.    INSTALLEXPT("OpenNodeBrowse");
  868.  
  869.    bDoingBrowse = TRUE;
  870.  
  871.    _splitpath(pThreadData->pDomain->nodelistfile, drive, dir, fname, ext);
  872.    strcpy(ext, ".NDX");
  873.    _makepath(pchIndexFile, drive, dir, fname, ext);
  874.  
  875.  
  876.    switch(rc=FLTV7OpenNodeBrowse(pchIndexFile,
  877.                               pThreadData->pDomain->nodelistfile,
  878.                               pThreadData->pBrowserData->pNodeBrowse))
  879.    {
  880.       case 0:
  881.          WinPostMsg(pThreadData->hwnd, BRSM_INDEX_READY, NULL, NULL);
  882.          break;
  883.  
  884.       default:
  885.          WinPostMsg(pThreadData->hwnd, BRSM_INDEX_ERROR, MPFROMLONG(rc), NULL);
  886.          break;
  887.    }
  888.  
  889.    DEINSTALLEXPT;
  890.  
  891.    return;
  892. }
  893.  
  894. /*---------------------------------------------------------------------------*/
  895. /* Funktionsname: OpenNameBrowseThread                                       */
  896. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  897. /* Beschreibung: Initialisiert fuer das Browsen nach Namen                   */
  898. /*                                                                           */
  899. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  900. /* Parameter: pParam: Zeiger auf THREADDATA-Struktur                         */
  901. /*                                                                           */
  902. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  903. /* Rückgabewerte: -                                                          */
  904. /*                                                                           */
  905. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  906. /* Sonstiges:                                                                */
  907. /*                                                                           */
  908. /*---------------------------------------------------------------------------*/
  909.  
  910. static void _Optlink OpenNameBrowseThread(PVOID pParam)
  911. {
  912.    PTHREADDATA pThreadData = pParam;
  913.    int rc;
  914.  
  915.    INSTALLEXPT("OpenNameBrowse");
  916.  
  917.    bDoingBrowse = TRUE;
  918.  
  919.    switch(rc=FLTV7OpenNameBrowse(pThreadData->pDomain->indexfile,
  920.                                  pThreadData->pDomain->nodelistfile,
  921.                                  pThreadData->pBrowserData->pNameBrowse))
  922.    {
  923.       case 0:
  924.          WinPostMsg(pThreadData->hwnd, BRSM_INDEX_READY, NULL, NULL);
  925.          break;
  926.  
  927.       default:
  928.          WinPostMsg(pThreadData->hwnd, BRSM_INDEX_ERROR, MPFROMLONG(rc), NULL);
  929.          break;
  930.    }
  931.  
  932.    DEINSTALLEXPT;
  933.  
  934.    return;
  935. }
  936.  
  937. /*---------------------------------------------------------------------------*/
  938. /* Funktionsname: NodeIndexReady                                             */
  939. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  940. /* Beschreibung: Fuegt den eingelesenen Node-Index in den Index-Container    */
  941. /*               ein                                                         */
  942. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  943. /* Parameter: hwnd: Dialog-Fenster                                           */
  944. /*            pBrowserData: Instanzdaten                                     */
  945. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  946. /* Rückgabewerte: -                                                          */
  947. /*                                                                           */
  948. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  949. /* Sonstiges:                                                                */
  950. /*                                                                           */
  951. /*---------------------------------------------------------------------------*/
  952.  
  953. static void NodeIndexReady(HWND hwnd, PNLBROWSERDATA pBrowserData)
  954. {
  955.    CNRINFO cnrinfo;
  956.    HWND hwndCnr = WinWindowFromID(hwnd, IDD_NLBROWSER+1);
  957.    HWND hwndCnr2 = WinWindowFromID(hwnd, IDD_NLBROWSER+2);
  958.    char pchTemplate[100];
  959.    PZONEINDEX pZone;
  960.    PNETINDEX pNet;
  961.    ULONG ulNumNets;
  962.    PINDEXRECORD pZoneIndexRecord, pNetIndexRecord, pFirstNetIndexRecord;
  963.    RECORDINSERT RecordInsert;
  964.  
  965.    /* Titel f. Index-Container neu setzen */
  966.    SendMsg(hwndCnr, CM_QUERYCNRINFO, &cnrinfo, MPFROMLONG(sizeof(cnrinfo)));
  967.    LoadString(IDST_BRS_NODESTPL, sizeof(pchTemplate), pchTemplate);
  968.    sprintf(cnrinfo.pszCnrTitle, pchTemplate, pBrowserData->pNodeBrowse->ulNumNodes);
  969.    SendMsg(hwndCnr, CM_SETCNRINFO, &cnrinfo, MPFROMLONG(CMA_CNRTITLE));
  970.  
  971.    /* Titel f. Node-Container neu setzen */
  972.    SendMsg(hwndCnr2, CM_QUERYCNRINFO, &cnrinfo, MPFROMLONG(sizeof(cnrinfo)));
  973.    cnrinfo.pszCnrTitle[0]=' ';
  974.    cnrinfo.pszCnrTitle[1]=0;
  975.    SendMsg(hwndCnr2, CM_SETCNRINFO, &cnrinfo, MPFROMLONG(CMA_CNRTITLE));
  976.  
  977.  
  978.    /* Zonen einfuegen */
  979.    LoadString(IDST_BRS_ZONETPL, sizeof(pchTemplate), pchTemplate);
  980.    pZone = pBrowserData->pNodeBrowse->pZoneIndex;
  981.    while(pZone)
  982.    {
  983.       /* Folder f. Zone */
  984.       pZoneIndexRecord = SendMsg(hwndCnr, CM_ALLOCRECORD,
  985.                                     MPFROMLONG(sizeof(INDEXRECORD) - sizeof(MINIRECORDCORE)),
  986.                                     MPFROMLONG(1));
  987.       pZoneIndexRecord->RecordCore.flRecordAttr = CRA_COLLAPSED;
  988.       pZoneIndexRecord->RecordCore.pszIcon      = pZoneIndexRecord->pchIndexText;
  989.       pZoneIndexRecord->RecordCore.hptrIcon     = pBrowserData->hptrFolder;
  990.       pZoneIndexRecord->pStartIndex = NULL; /* nicht anwaehlbar */
  991.       LoadString(IDST_BRS_ZONETPL, sizeof(pchTemplate), pchTemplate);
  992.       sprintf(pZoneIndexRecord->pchIndexText, pchTemplate, pZone->usZone);
  993.  
  994.       RecordInsert.cb = sizeof(RecordInsert);
  995.       RecordInsert.pRecordOrder = (PRECORDCORE) CMA_END;
  996.       RecordInsert.pRecordParent = NULL;
  997.       RecordInsert.fInvalidateRecord = FALSE;
  998.       RecordInsert.zOrder = CMA_TOP;
  999.       RecordInsert.cRecordsInsert = 1;
  1000.       SendMsg(hwndCnr, CM_INSERTRECORD, pZoneIndexRecord, &RecordInsert);
  1001.  
  1002.       /* Netze der Zone */
  1003.       LoadString(IDST_BRS_NETTPL, sizeof(pchTemplate), pchTemplate);
  1004.       pNet = pZone->pNets;
  1005.       /* zaehlen */
  1006.       ulNumNets=0;
  1007.       while (pNet)
  1008.       {
  1009.          ulNumNets++;
  1010.          pNet = pNet->next;
  1011.       }
  1012.       if (ulNumNets)
  1013.       {
  1014.          pFirstNetIndexRecord = SendMsg(hwndCnr, CM_ALLOCRECORD,
  1015.                                            MPFROMLONG(sizeof(INDEXRECORD) - sizeof(MINIRECORDCORE)),
  1016.                                            MPFROMLONG(ulNumNets));
  1017.          pNetIndexRecord = pFirstNetIndexRecord;
  1018.          pNet = pZone->pNets;
  1019.          while (pNet)
  1020.          {
  1021.             pNetIndexRecord->RecordCore.flRecordAttr = CRA_COLLAPSED;
  1022.             pNetIndexRecord->RecordCore.pszIcon      = pNetIndexRecord->pchIndexText;
  1023.             pNetIndexRecord->RecordCore.hptrIcon     = pBrowserData->hptrFolder;
  1024.             pNetIndexRecord->pStartIndex = pNet->pStart; /* anwaehlbar */
  1025.             sprintf(pNetIndexRecord->pchIndexText, pchTemplate, pNet->usNet);
  1026.  
  1027.             pNetIndexRecord = (PINDEXRECORD) pNetIndexRecord->RecordCore.preccNextRecord;
  1028.             pNet = pNet->next;
  1029.          }
  1030.          RecordInsert.cb = sizeof(RecordInsert);
  1031.          RecordInsert.pRecordOrder = (PRECORDCORE) CMA_END;
  1032.          RecordInsert.pRecordParent = (PRECORDCORE) pZoneIndexRecord;
  1033.          RecordInsert.fInvalidateRecord = FALSE;
  1034.          RecordInsert.zOrder = CMA_TOP;
  1035.          RecordInsert.cRecordsInsert = ulNumNets;
  1036.          SendMsg(hwndCnr, CM_INSERTRECORD, pFirstNetIndexRecord, &RecordInsert);
  1037.       }
  1038.  
  1039.       pZone = pZone->next;
  1040.    }
  1041.    SendMsg(hwndCnr, CM_INVALIDATERECORD, NULL, NULL);
  1042.  
  1043.    return;
  1044. }
  1045.  
  1046. /*---------------------------------------------------------------------------*/
  1047. /* Funktionsname: NameIndexReady                                             */
  1048. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1049. /* Beschreibung: Fuegt den eingelesenen Namens-Index in den Index-Container  */
  1050. /*               ein                                                         */
  1051. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1052. /* Parameter: hwnd: Dialog-Fenster                                           */
  1053. /*            pBrowserData: Instanzdaten                                     */
  1054. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1055. /* Rückgabewerte: -                                                          */
  1056. /*                                                                           */
  1057. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1058. /* Sonstiges:                                                                */
  1059. /*                                                                           */
  1060. /*---------------------------------------------------------------------------*/
  1061.  
  1062. static void NameIndexReady(HWND hwnd, PNLBROWSERDATA pBrowserData)
  1063. {
  1064.    CNRINFO cnrinfo;
  1065.    HWND hwndCnr = WinWindowFromID(hwnd, IDD_NLBROWSER+1);
  1066.    ULONG ulNumNames=0;
  1067.    char pchTemplate[100];
  1068.    PINDEXRECORD pNameIndexRecord, pFirstNameIndexRecord;
  1069.    RECORDINSERT RecordInsert;
  1070.    int i;
  1071.  
  1072.    /* Titel f. Index-Container neu setzen */
  1073.    SendMsg(hwndCnr, CM_QUERYCNRINFO, &cnrinfo, MPFROMLONG(sizeof(cnrinfo)));
  1074.    LoadString(IDST_BRS_NAMESTPL, sizeof(pchTemplate), pchTemplate);
  1075.    sprintf(cnrinfo.pszCnrTitle, pchTemplate, pBrowserData->pNameBrowse->ulNumNames);
  1076.    SendMsg(hwndCnr, CM_SETCNRINFO, &cnrinfo, MPFROMLONG(CMA_CNRTITLE));
  1077.  
  1078.    /* Titel f. Node-Container neu setzen */
  1079.    WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_QUERYCNRINFO, &cnrinfo, MPFROMLONG(sizeof(cnrinfo)));
  1080.    cnrinfo.pszCnrTitle[0]=' ';
  1081.    cnrinfo.pszCnrTitle[1]=0;
  1082.    WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_SETCNRINFO, &cnrinfo, MPFROMLONG(CMA_CNRTITLE));
  1083.  
  1084.    /* Namen zaehlen */
  1085.    for (i=0; i< 28; i++)
  1086.    {
  1087.       if (pBrowserData->pNameBrowse->Alpha[i])
  1088.          ulNumNames++;
  1089.    }
  1090.  
  1091.    if (ulNumNames)
  1092.    {
  1093.       pFirstNameIndexRecord = SendMsg(hwndCnr, CM_ALLOCRECORD,
  1094.                                         MPFROMLONG(sizeof(INDEXRECORD) - sizeof(MINIRECORDCORE)),
  1095.                                         MPFROMLONG(ulNumNames));
  1096.       pNameIndexRecord = pFirstNameIndexRecord;
  1097.       for (i=0; i< 28; i++)
  1098.       {
  1099.          if (pBrowserData->pNameBrowse->Alpha[i])
  1100.          {
  1101.             pNameIndexRecord->RecordCore.flRecordAttr = CRA_COLLAPSED;
  1102.             pNameIndexRecord->RecordCore.pszIcon      = pNameIndexRecord->pchIndexText;
  1103.             pNameIndexRecord->RecordCore.hptrIcon     = pBrowserData->hptrFolder;
  1104.             pNameIndexRecord->pNStartIndex = pBrowserData->pNameBrowse->Alpha[i]; /* anwaehlbar */
  1105.             if (i > 0)
  1106.             {
  1107.                pNameIndexRecord->pchIndexText[0] = i + '@';
  1108.                pNameIndexRecord->pchIndexText[1] = 0;
  1109.             }
  1110.             else
  1111.                LoadString(IDST_BRS_OTHERNAME, sizeof(pNameIndexRecord->pchIndexText), pNameIndexRecord->pchIndexText);
  1112.  
  1113.             pNameIndexRecord = (PINDEXRECORD) pNameIndexRecord->RecordCore.preccNextRecord;
  1114.          }
  1115.       }
  1116.       RecordInsert.cb = sizeof(RecordInsert);
  1117.       RecordInsert.pRecordOrder = (PRECORDCORE) CMA_END;
  1118.       RecordInsert.pRecordParent = (PRECORDCORE) NULL;
  1119.       RecordInsert.fInvalidateRecord = FALSE;
  1120.       RecordInsert.zOrder = CMA_TOP;
  1121.       RecordInsert.cRecordsInsert = ulNumNames;
  1122.       SendMsg(hwndCnr, CM_INSERTRECORD, pFirstNameIndexRecord, &RecordInsert);
  1123.    }
  1124.    SendMsg(hwndCnr, CM_INVALIDATERECORD, NULL, NULL);
  1125.  
  1126.    return;
  1127. }
  1128.  
  1129. /*---------------------------------------------------------------------------*/
  1130. /* Funktionsname: TitleWork                                                  */
  1131. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1132. /* Beschreibung: Setzt "Bitte Warten" in beide Containertitel                */
  1133. /*                                                                           */
  1134. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1135. /* Parameter: hwnd: Dialog-Fenster                                           */
  1136. /*            pBrowserData: Instanzdaten                                     */
  1137. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1138. /* Rückgabewerte: -                                                          */
  1139. /*                                                                           */
  1140. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1141. /* Sonstiges:                                                                */
  1142. /*                                                                           */
  1143. /*---------------------------------------------------------------------------*/
  1144.  
  1145. static void TitleWork(HWND hwnd, PNLBROWSERDATA pBrowserData)
  1146. {
  1147.    CNRINFO cnrinfo;
  1148.  
  1149.    /* Index-Container */
  1150.    WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+1, CM_QUERYCNRINFO, &cnrinfo,
  1151.                      MPFROMLONG(sizeof(cnrinfo)));
  1152.    LoadString(IDST_BRS_WORKING, sizeof(pBrowserData->pchICnrTitle), pBrowserData->pchICnrTitle);
  1153.    WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+1, CM_SETCNRINFO, &cnrinfo,
  1154.                      MPFROMLONG(CMA_CNRTITLE));
  1155.  
  1156.    /* Node-Container */
  1157.    WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_QUERYCNRINFO, &cnrinfo,
  1158.                      MPFROMLONG(sizeof(cnrinfo)));
  1159.    LoadString(IDST_BRS_WORKING, sizeof(pBrowserData->pchNCnrTitle), pBrowserData->pchNCnrTitle);
  1160.    WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_SETCNRINFO, &cnrinfo,
  1161.                      MPFROMLONG(CMA_CNRTITLE));
  1162.    return;
  1163. }
  1164.  
  1165. /*---------------------------------------------------------------------------*/
  1166. /* Funktionsname: CleanupNodeContainer                                       */
  1167. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1168. /* Beschreibung: Entfernt alle Record aus dem Node-Container, gibt Speicher  */
  1169. /*               frei                                                        */
  1170. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1171. /* Parameter: hwnd: Dialog-Fenster                                           */
  1172. /*            pBrowserData: Instanzdaten                                     */
  1173. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1174. /* Rückgabewerte: -                                                          */
  1175. /*                                                                           */
  1176. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1177. /* Sonstiges:                                                                */
  1178. /*                                                                           */
  1179. /*---------------------------------------------------------------------------*/
  1180.  
  1181. static void CleanupNodeContainer(HWND hwnd, PNLBROWSERDATA pBrowserData)
  1182. {
  1183.    PNODERECORD pRecord=NULL;
  1184.  
  1185.    while(pRecord=WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_QUERYRECORD,
  1186.                                    pRecord, MPFROM2SHORT(pRecord?CMA_NEXT:CMA_FIRST, CMA_ITEMORDER)))
  1187.    {
  1188.       if (pRecord->pchAddress)
  1189.          free(pRecord->pchAddress);
  1190.       if (pRecord->pchModem)
  1191.          free(pRecord->pchModem);
  1192.       if (pRecord->pchFlags)
  1193.          free(pRecord->pchFlags);
  1194.    }
  1195.    WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_REMOVERECORD, NULL,
  1196.                      MPFROM2SHORT(0, CMA_FREE | CMA_INVALIDATE));
  1197.  
  1198.    pBrowserData->ulNumNodes = 0;
  1199.    if (pBrowserData->pNodeData)
  1200.    {
  1201.       free(pBrowserData->pNodeData);
  1202.       pBrowserData->pNodeData=NULL;
  1203.    }
  1204.  
  1205.    return;
  1206. }
  1207.  
  1208. /*---------------------------------------------------------------------------*/
  1209. /* Funktionsname: OpenIndex                                                  */
  1210. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1211. /* Beschreibung: Fuehrt Doppelklick auf Index-Icon aus                       */
  1212. /*                                                                           */
  1213. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1214. /* Parameter: hwnd: Dialog-Fenster                                           */
  1215. /*            pBrowserData: Instanzdaten                                     */
  1216. /*            pIndexRecord: Zeiger auf den Index-Record                      */
  1217. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1218. /* Rückgabewerte: -                                                          */
  1219. /*                                                                           */
  1220. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1221. /* Sonstiges:                                                                */
  1222. /*                                                                           */
  1223. /*---------------------------------------------------------------------------*/
  1224.  
  1225. static void OpenIndex(HWND hwnd, PNLBROWSERDATA pBrowserData, PINDEXRECORD pIndexRecord, BOOL bForce)
  1226. {
  1227.    CNRINFO cnrinfo;
  1228.    static THREADDATA ThreadData;
  1229.  
  1230.    if (pBrowserData->ulCurrentMode == BROWSEMODE_NAME ||
  1231.        (pBrowserData->ulCurrentMode == BROWSEMODE_NODE && pIndexRecord->pStartIndex))
  1232.    {
  1233.       /* Klick auf Index */
  1234.       if (bForce || pBrowserData->pCurrentIndex != pIndexRecord)
  1235.       {
  1236.          /* Neuer Index */
  1237.          if (pBrowserData->pCurrentIndex)
  1238.             /* In-Use vom vorherigen wegnehmen */
  1239.             WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+1, CM_SETRECORDEMPHASIS,
  1240.                               pBrowserData->pCurrentIndex,
  1241.                               MPFROM2SHORT(FALSE, CRA_INUSE));
  1242.  
  1243.          pBrowserData->pCurrentIndex = pIndexRecord;
  1244.          /* In-Use setzen */
  1245.          WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+1, CM_SETRECORDEMPHASIS,
  1246.                            pBrowserData->pCurrentIndex,
  1247.                            MPFROM2SHORT(TRUE, CRA_INUSE));
  1248.  
  1249.          /* Node-Container leeren */
  1250.          CleanupNodeContainer(hwnd, pBrowserData);
  1251.  
  1252.          /* Titel setzen */
  1253.          WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_QUERYCNRINFO, &cnrinfo,
  1254.                            MPFROMLONG(sizeof(cnrinfo)));
  1255.          LoadString(IDST_BRS_WORKING, sizeof(pBrowserData->pchNCnrTitle), pBrowserData->pchNCnrTitle);
  1256.          WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_SETCNRINFO, &cnrinfo,
  1257.                            MPFROMLONG(CMA_CNRTITLE));
  1258.  
  1259.          /* Controls abschalten */
  1260.          WinEnableControl(hwnd, IDD_NLBROWSER+3, FALSE);
  1261.          WinEnableControl(hwnd, IDD_NLBROWSER+6, FALSE);
  1262.          WinEnableControl(hwnd, IDD_NLBROWSER+7, FALSE);
  1263.          WinEnableControl(hwnd, IDD_NLBROWSER+8, FALSE);
  1264.          WinEnableControl(hwnd, IDD_NLBROWSER+10, FALSE);
  1265.  
  1266.          ThreadData.hwnd = hwnd;
  1267.          ThreadData.pBrowserData = pBrowserData;
  1268.  
  1269.          if (pBrowserData->ulCurrentMode == BROWSEMODE_NODE)
  1270.             _beginthread(ReadNetDataThread, NULL, 16384, &ThreadData);
  1271.          else
  1272.             _beginthread(ReadNameDataThread, NULL, 16384, &ThreadData);
  1273.       }
  1274.    }
  1275.    return;
  1276. }
  1277.  
  1278. /*---------------------------------------------------------------------------*/
  1279. /* Funktionsname: ReadNameDataThread                                         */
  1280. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1281. /* Beschreibung: Thread-Funktion zum Einlesen der Node-Daten fuer einen      */
  1282. /*               Anfangsbuchstaben.                                          */
  1283. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1284. /* Parameter: pParam: Zeiger auf THREADDATA-Struktur                         */
  1285. /*                                                                           */
  1286. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1287. /* Rückgabewerte: -                                                          */
  1288. /*                                                                           */
  1289. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1290. /* Sonstiges:                                                                */
  1291. /*                                                                           */
  1292. /*---------------------------------------------------------------------------*/
  1293.  
  1294. static void _Optlink ReadNameDataThread(PVOID pParam)
  1295. {
  1296.    PTHREADDATA pThreadData = pParam;
  1297.    ULONG ulNumNodes=0, i, j;
  1298.    UCHAR uchEndChar;
  1299.    PNAMEINDEX pNameIndex;
  1300.  
  1301.    INSTALLEXPT("ReadNameData");
  1302.  
  1303.    bDoingBrowse = TRUE;
  1304.  
  1305.    /* Nodes zaehlen */
  1306.    pNameIndex = pThreadData->pBrowserData->pCurrentIndex->pNStartIndex;
  1307.    if (pNameIndex->pchSysopName[0] < 'A')
  1308.       uchEndChar = '@';
  1309.    else
  1310.       uchEndChar = toupper(pNameIndex->pchSysopName[0]);
  1311.  
  1312.    while(pNameIndex < &(pThreadData->pBrowserData->pNameBrowse->pNameIndex[pThreadData->pBrowserData->pNameBrowse->ulNumNames]) &&
  1313.          toupper(pNameIndex->pchSysopName[0]) <= uchEndChar )
  1314.    {
  1315.       ulNumNodes++;
  1316.       pNameIndex++;
  1317.    }
  1318.  
  1319.    if (ulNumNodes)
  1320.    {
  1321.       /* Speicher fuer Node-Daten */
  1322.       pThreadData->pBrowserData->ulNumNodes = ulNumNodes;
  1323.       pThreadData->pBrowserData->pNodeData = calloc( ulNumNodes, sizeof(NODEDATA));
  1324.  
  1325.       /* Node-Daten einlesen */
  1326.       for (j=0; j<ulNumNodes; j++)
  1327.       {
  1328.          int sel=-1;
  1329.  
  1330.          /* Kürzesten Offset suchen */
  1331.  
  1332.          pNameIndex = pThreadData->pBrowserData->pCurrentIndex->pNStartIndex;
  1333.          for (i=0; i<ulNumNodes; i++)
  1334.          {
  1335.             if (!pThreadData->pBrowserData->pNodeData[i].SysopName[0] &&
  1336.                 (sel < 0 ||
  1337.                  pNameIndex->lDataOffs <
  1338.                   pThreadData->pBrowserData->pCurrentIndex->pNStartIndex[sel].lDataOffs))
  1339.                sel = i;
  1340.             pNameIndex++;
  1341.          }
  1342.  
  1343.          if (sel >= 0)
  1344.             FLTV7ReadNameData(pThreadData->pBrowserData->pNameBrowse,
  1345.                               &pThreadData->pBrowserData->pCurrentIndex->pNStartIndex[sel],
  1346.                               &pThreadData->pBrowserData->pNodeData[sel]);
  1347.       }
  1348.  
  1349.       WinPostMsg(pThreadData->hwnd, BRSM_DATA_READY, NULL, NULL);
  1350.    }
  1351.    else
  1352.       WinPostMsg(pThreadData->hwnd, BRSM_DATA_ERROR, NULL, NULL);
  1353.  
  1354.  
  1355.    DEINSTALLEXPT;
  1356.  
  1357.    return;
  1358. }
  1359.  
  1360. /*---------------------------------------------------------------------------*/
  1361. /* Funktionsname: ReadNetDataThread                                          */
  1362. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1363. /* Beschreibung: Thread-Funktion zum Einlesen der Node-Daten fuer ein Netz   */
  1364. /*                                                                           */
  1365. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1366. /* Parameter: pParam: Zeiger auf THREADDATA-Struktur                         */
  1367. /*                                                                           */
  1368. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1369. /* Rückgabewerte: -                                                          */
  1370. /*                                                                           */
  1371. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1372. /* Sonstiges:                                                                */
  1373. /*                                                                           */
  1374. /*---------------------------------------------------------------------------*/
  1375.  
  1376. static void _Optlink ReadNetDataThread(PVOID pParam)
  1377. {
  1378.    PTHREADDATA pThreadData = pParam;
  1379.    ULONG ulNumNodes=0, ulNumInsert=0, i, j;
  1380.    USHORT usZone, usNet;
  1381.    PNODEINDEX pNodeIndex;
  1382.  
  1383.    INSTALLEXPT("ReadNetData");
  1384.  
  1385.    bDoingBrowse = TRUE;
  1386.  
  1387.    /* Nodes zaehlen */
  1388.    pNodeIndex = pThreadData->pBrowserData->pCurrentIndex->pStartIndex;
  1389.    usZone = pNodeIndex->NodeAddr.usZone;
  1390.    usNet = pNodeIndex->NodeAddr.usNet;
  1391.  
  1392.    while(pNodeIndex < &(pThreadData->pBrowserData->pNodeBrowse->pNodeIndex[pThreadData->pBrowserData->pNodeBrowse->ulNumNodes]) &&
  1393.          pNodeIndex->NodeAddr.usZone == usZone &&
  1394.          pNodeIndex->NodeAddr.usNet  == usNet )
  1395.    {
  1396.       if (!pThreadData->pBrowserData->bNoPoints || !pNodeIndex->NodeAddr.usPoint)
  1397.          ulNumInsert++;
  1398.  
  1399.       ulNumNodes++;
  1400.       pNodeIndex++;
  1401.    }
  1402.  
  1403.    if (ulNumInsert)
  1404.    {
  1405.       /* Speicher fuer Node-Daten */
  1406.       pThreadData->pBrowserData->ulNumNodes = ulNumInsert;
  1407.       pThreadData->pBrowserData->pNodeData = calloc( ulNumInsert, sizeof(NODEDATA));
  1408.  
  1409.       /* Node-Daten einlesen */
  1410.       pNodeIndex = pThreadData->pBrowserData->pCurrentIndex->pStartIndex;
  1411.       for (i=0, j=0; i<ulNumNodes; i++)
  1412.       {
  1413.          if (!pThreadData->pBrowserData->bNoPoints || !pNodeIndex->NodeAddr.usPoint)
  1414.             FLTV7ReadNodeData(pThreadData->pBrowserData->pNodeBrowse, pNodeIndex, &pThreadData->pBrowserData->pNodeData[j++]);
  1415.          pNodeIndex++;
  1416.       }
  1417.  
  1418.       WinPostMsg(pThreadData->hwnd, BRSM_DATA_READY, NULL, NULL);
  1419.    }
  1420.    else
  1421.       WinPostMsg(pThreadData->hwnd, BRSM_DATA_ERROR, NULL, NULL);
  1422.  
  1423.    DEINSTALLEXPT;
  1424.  
  1425.    return;
  1426. }
  1427.  
  1428. /*---------------------------------------------------------------------------*/
  1429. /* Funktionsname: NodeDataReady                                              */
  1430. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1431. /* Beschreibung: Fuegt die eingelesenen Node-Daten in den Node-Container     */
  1432. /*               ein                                                         */
  1433. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1434. /* Parameter: hwnd: Dialog-Fenster                                           */
  1435. /*            pBrowserData: Instanzdaten                                     */
  1436. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1437. /* Rückgabewerte: -                                                          */
  1438. /*                                                                           */
  1439. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1440. /* Sonstiges:                                                                */
  1441. /*                                                                           */
  1442. /*---------------------------------------------------------------------------*/
  1443.  
  1444. static void NodeDataReady(HWND hwnd, PNLBROWSERDATA pBrowserData)
  1445. {
  1446.    PNODERECORD pRecord, pFirstRecord;
  1447.    RECORDINSERT RecordInsert;
  1448.    PNODEDATA pNodeData;
  1449.    CNRINFO cnrinfo;
  1450.  
  1451.    if (pBrowserData->ulNumNodes)
  1452.    {
  1453.       pFirstRecord = WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_ALLOCRECORD,
  1454.                                        MPFROMLONG(sizeof(NODERECORD) - sizeof(MINIRECORDCORE)),
  1455.                                        MPFROMLONG(pBrowserData->ulNumNodes));
  1456.       pRecord = pFirstRecord;
  1457.       pNodeData = pBrowserData->pNodeData;
  1458.       while (pRecord)
  1459.       {
  1460.          pRecord->RecordCore.flRecordAttr=0;
  1461.  
  1462.          pRecord->pchSysop = pNodeData->SysopName;
  1463.          pRecord->pchSystemName = pNodeData->SystemName;
  1464.          pRecord->pchLocation = pNodeData->Location;
  1465.          pRecord->pchPhone = pNodeData->PhoneNr;
  1466.          pRecord->ulBaud = pNodeData->BaudRate;
  1467.          pRecord->ulCallCost = pNodeData->CallCost;
  1468.          pRecord->ulUserCost = pNodeData->UserCost;
  1469.  
  1470.          pRecord->pchAddress = malloc(LEN_5DADDRESS+1);
  1471.          if (pNodeData->Address.usPoint)
  1472.             sprintf(pRecord->pchAddress, "%d:%d/%d.%d", pNodeData->Address.usZone,
  1473.                                                         pNodeData->Address.usNet,
  1474.                                                         pNodeData->Address.usNode,
  1475.                                                         pNodeData->Address.usPoint);
  1476.          else
  1477.             sprintf(pRecord->pchAddress, "%d:%d/%d", pNodeData->Address.usZone,
  1478.                                                      pNodeData->Address.usNet,
  1479.                                                      pNodeData->Address.usNode);
  1480.          pRecord->pchFlags=malloc(30);
  1481.          NLFlagsToString(pNodeData, pRecord->pchFlags);
  1482.  
  1483.          pRecord->pchModem= malloc(MAX_MODEMTYPES*(LEN_MODEMTYPE+2)+1);
  1484.          NLModemToString(pNodeData->ModemType, pRecord->pchModem);
  1485.  
  1486.          pRecord = (PNODERECORD) pRecord->RecordCore.preccNextRecord;
  1487.          pNodeData++;
  1488.       }
  1489.       RecordInsert.cb = sizeof(RECORDINSERT);
  1490.       RecordInsert.pRecordOrder = (PRECORDCORE) CMA_END;
  1491.       RecordInsert.pRecordParent = (PRECORDCORE) NULL;
  1492.       RecordInsert.fInvalidateRecord = TRUE;
  1493.       RecordInsert.zOrder = CMA_TOP;
  1494.       RecordInsert.cRecordsInsert = pBrowserData->ulNumNodes;
  1495.       WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_INSERTRECORD, pFirstRecord, &RecordInsert);
  1496.    }
  1497.  
  1498.    /* Titel anpassen */
  1499.    WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_QUERYCNRINFO, &cnrinfo,
  1500.                      MPFROMLONG(sizeof(cnrinfo)));
  1501.  
  1502.    if (pBrowserData->ulCurrentMode == BROWSEMODE_NODE)
  1503.    {
  1504.       sprintf(pBrowserData->pchNCnrTitle, "%d:%d", pBrowserData->pNodeData->Address.usZone,
  1505.                                                    pBrowserData->pNodeData->Address.usNet);
  1506.    }
  1507.    else
  1508.    {
  1509.       if (pBrowserData->pCurrentIndex->pNStartIndex->pchSysopName[0] < 'A')
  1510.          LoadString(IDST_BRS_OTHERNAME, sizeof(pBrowserData->pchNCnrTitle), pBrowserData->pchNCnrTitle);
  1511.       else
  1512.       {
  1513.          pBrowserData->pchNCnrTitle[0] = pBrowserData->pCurrentIndex->pNStartIndex->pchSysopName[0];
  1514.          pBrowserData->pchNCnrTitle[1] = 0;
  1515.       }
  1516.    }
  1517.    WinSendDlgItemMsg(hwnd, IDD_NLBROWSER+2, CM_SETCNRINFO, &cnrinfo,
  1518.                      MPFROMLONG(CMA_CNRTITLE));
  1519.  
  1520.    return;
  1521. }
  1522.  
  1523. /*---------------------------------------------------------------------------*/
  1524. /* Funktionsname: InitNodeDrag                                               */
  1525. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1526. /* Beschreibung: Startet das Drag-Drop eines Nodes aus dem Container         */
  1527. /*                                                                           */
  1528. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1529. /* Parameter: hwnd: Dialog-Fenster                                           */
  1530. /*            pInit: Init-Struktur des Containers                            */
  1531. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1532. /* Rückgabewerte: -                                                          */
  1533. /*                                                                           */
  1534. /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  1535. /* Sonstiges:                                                                */
  1536. /*                                                                           */
  1537. /*---------------------------------------------------------------------------*/
  1538.  
  1539. static void InitNodeDrag(HWND hwndDlg, PCNRDRAGINIT pInit, PNLBROWSERDATA pBrowserData)
  1540. {
  1541.    PNODERECORD pNodeRecord = (PNODERECORD) pInit->pRecord;
  1542.    HWND hwndCnr = WinWindowFromID(hwndDlg, IDD_NLBROWSER+2);
  1543.    PDRAGINFO pDraginfo;
  1544.    DRAGITEM dItem;
  1545.    DRAGIMAGE dImage[3];
  1546.    char pchTemp[LEN_5DADDRESS+LEN_USERNAME+2];
  1547.  
  1548.    if (!pNodeRecord)
  1549.       return;  /* Drag über whitespace */
  1550.  
  1551.    if (pNodeRecord->RecordCore.flRecordAttr & CRA_SELECTED)
  1552.    {
  1553.       /* selektiert -> alle anderen selektierten auch */
  1554.       ULONG ulNum=0, i=0;
  1555.       PNODERECORD pTemp=NULL;
  1556.  
  1557.       while (pTemp = SendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, pTemp?pTemp:MPFROMLONG(CMA_FIRST),
  1558.                                 MPFROMLONG(CRA_SELECTED)))
  1559.       {
  1560.          ulNum++;
  1561.          SendMsg(hwndCnr, CM_SETRECORDEMPHASIS, pTemp, MPFROM2SHORT(TRUE, CRA_SOURCE));
  1562.       }
  1563.       pDraginfo = DrgAllocDraginfo(ulNum);
  1564.       pDraginfo->usOperation=DO_DEFAULT;
  1565.       pDraginfo->hwndSource=hwndDlg;
  1566.  
  1567.       pTemp=NULL;
  1568.       while (pTemp = SendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, pTemp?pTemp:MPFROMLONG(CMA_FIRST),
  1569.                                 MPFROMLONG(CRA_SELECTED)))
  1570.       {
  1571.          /* Drag-Item vorbereiten*/
  1572.          dItem.hwndItem=hwndDlg;
  1573.          dItem.ulItemID= 0;
  1574.          dItem.hstrType=DrgAddStrHandle(NODEDRAGTYPE);
  1575.          dItem.hstrRMF=DrgAddStrHandle(NODERMF);
  1576.          dItem.hstrContainerName=DrgAddStrHandle(pBrowserData->pchCurrentDomain);
  1577.  
  1578.          strcpy(pchTemp, pTemp->pchAddress);
  1579.          strcat(pchTemp, " ");
  1580.          strcat(pchTemp, pTemp->pchSysop);
  1581.          dItem.hstrSourceName=DrgAddStrHandle(pchTemp);
  1582.          dItem.hstrTargetName=NULLHANDLE;
  1583.  
  1584.          dItem.fsControl= 0;
  1585.          dItem.fsSupportedOps=DO_COPYABLE;
  1586.          DrgSetDragitem(pDraginfo, &dItem, sizeof(dItem), i);
  1587.  
  1588.          i++;
  1589.       }
  1590.  
  1591.       for (i=0; i < ulNum && i <3; i++)
  1592.       {
  1593.          /* Drag-Image vorbereiten */
  1594.          dImage[i].cb=sizeof(DRAGIMAGE);
  1595.          if (ulNum == 2)
  1596.             dImage[i].hImage=pBrowserData->hptrOneNode;
  1597.          else
  1598.             dImage[i].hImage=pBrowserData->hptrOneNode;
  1599.          dImage[i].fl=DRG_ICON;
  1600.          dImage[i].cxOffset=i*10;
  1601.          dImage[i].cyOffset=i*10;
  1602.       }
  1603.  
  1604.       /* Und los gehts */
  1605. #if 0
  1606.       if (!DrgDrag(hwndDlg, pDraginfo, dImage, (ulNum <3)?ulNum:3, VK_ENDDRAG, NULL))
  1607.          DrgDeleteDraginfoStrHandles(pDraginfo);
  1608. #else
  1609.       DrgDrag(hwndDlg, pDraginfo, dImage, (ulNum <3)?ulNum:3, VK_ENDDRAG, NULL);
  1610. #endif
  1611.       DrgFreeDraginfo(pDraginfo);
  1612.  
  1613.       pTemp=NULL;
  1614.       while (pTemp = SendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, pTemp?pTemp:MPFROMLONG(CMA_FIRST),
  1615.                                 MPFROMLONG(CRA_SOURCE)))
  1616.       {
  1617.          /* Source-Emphasis ausschalten */
  1618.          SendMsg(hwndCnr, CM_SETRECORDEMPHASIS, pTemp,
  1619.                     MPFROM2SHORT(FALSE, CRA_SOURCE));
  1620.       }
  1621.    }
  1622.    else
  1623.    {
  1624.       /* nur ein Node */
  1625.       /* Source-Emphasis einschalten */
  1626.       SendMsg(hwndCnr, CM_SETRECORDEMPHASIS, pNodeRecord,
  1627.                  MPFROM2SHORT(TRUE, CRA_SOURCE));
  1628.  
  1629.       pDraginfo = DrgAllocDraginfo(1);
  1630.       pDraginfo->usOperation=DO_DEFAULT;
  1631.       pDraginfo->hwndSource=hwndDlg;
  1632.  
  1633.       /* Drag-Item vorbereiten*/
  1634.       dItem.hwndItem=hwndDlg;
  1635.       dItem.ulItemID= 0;
  1636.       dItem.hstrType=DrgAddStrHandle(NODEDRAGTYPE);
  1637.       dItem.hstrRMF=DrgAddStrHandle(NODERMF);
  1638.       dItem.hstrContainerName=DrgAddStrHandle(pBrowserData->pchCurrentDomain);
  1639.  
  1640.       strcpy(pchTemp, pNodeRecord->pchAddress);
  1641.       strcat(pchTemp, " ");
  1642.       strcat(pchTemp, pNodeRecord->pchSysop);
  1643.       dItem.hstrSourceName=DrgAddStrHandle(pchTemp);
  1644.       dItem.hstrTargetName=NULLHANDLE;
  1645.  
  1646.       dItem.fsControl= 0;
  1647.       dItem.fsSupportedOps=DO_COPYABLE;
  1648.       DrgSetDragitem(pDraginfo, &dItem, sizeof(dItem), 0);
  1649.  
  1650.       /* Drag-Image vorbereiten */
  1651.       dImage[0].cb=sizeof(DRAGIMAGE);
  1652.       dImage[0].hImage=pBrowserData->hptrOneNode;
  1653.       dImage[0].fl=DRG_ICON;
  1654.       dImage[0].cxOffset=0;
  1655.       dImage[0].cyOffset=0;
  1656.  
  1657.       /* Und los gehts */
  1658. #if 0
  1659.       if (!DrgDrag(hwndDlg, pDraginfo, dImage, 1, VK_ENDDRAG, NULL))
  1660.          DrgDeleteDraginfoStrHandles(pDraginfo);
  1661. #else
  1662.       DrgDrag(hwndDlg, pDraginfo, dImage, 1, VK_ENDDRAG, NULL);
  1663. #endif
  1664.       DrgFreeDraginfo(pDraginfo);
  1665.  
  1666.       /* Source-Emphasis ausschalten */
  1667.       SendMsg(hwndCnr, CM_SETRECORDEMPHASIS, pNodeRecord,
  1668.                  MPFROM2SHORT(FALSE, CRA_SOURCE));
  1669.    }
  1670.    return;
  1671. }
  1672. /*-------------------------------- Modulende --------------------------------*/
  1673.  
  1674.