home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9303 / netz / tpnet / ipxtestw.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-06-02  |  9.8 KB  |  315 lines

  1. (*========================================================*)
  2. (*                       IPXTESTD.PAS                     *)
  3. (*            (C) 1993 G. Blumert & DMV-Verlag            *)
  4. (*--------------------------------------------------------*)
  5. (* Compiler:                                              *)
  6. (*   Turbo-/Borland Pascal fⁿr Windows                    *)
  7. (* Demo-Anwendung zur Demonstration einer Netzwerkan-     *)
  8. (* wendung.                                               *)
  9. (* Programm in ein Netzwerkverzeichnis kopieren und von   *)
  10. (* verschiedenen Arbeitsstationen aus aufrufen            *)
  11. (* Setzt das Vorhandensein eines Novell-Netzwerks voraus! *)
  12. (*              LΣuft nicht im Real-Mode!                 *)
  13. (*========================================================*)
  14.  
  15. PROGRAM IPXTest;
  16. {$X+,B-}
  17. {$R IPXTEST.RES}
  18. USES
  19.   MyWinDos, WinDos, IPX, NetLog, {$IFDEF Ver70} Objects,
  20.   OWindows,  (* Oh-Borland *) {$ELSE} WObjects, {$ENDIF}
  21.   Strings, WinProcs, WinTypes, DPMI;
  22.  
  23. CONST
  24.   cm_NewFile1     = 1001;  (* Fenster fⁿr Datei 1 ÷ffnen  *)
  25.   cm_NewFile2     = 1002;  (* Fenster fⁿr Datei 2 ÷ffnen  *)
  26.   cm_NewFile3     = 1003;  (* Fenster fⁿr Datei 3 ÷ffnen  *)
  27.   cm_SendCommand  = 1004;  (* Nachricht an andere Fenster *)
  28.  
  29.   (* Wenn TRUE, wird gerade die Message wm_ActivateApp    *)
  30.   (* bearbeitet.                                          *)
  31.   (* Der Aufruf von MessageBox wⁿrde in diesem Fall in    *)
  32.   (* eine Endlosschleife fⁿhren.                          *)
  33.   IsLoggedOut: BOOLEAN = FALSE;
  34.  
  35. TYPE
  36.   pIPXApp = ^tIPXApp;
  37.   tIPXApp = OBJECT(tApplication)
  38.     CONSTRUCTOR Init(aName: pChar);
  39.     PROCEDURE   InitApplication; VIRTUAL;
  40.     PROCEDURE   InitMainWindow;  VIRTUAL;
  41.   PRIVATE
  42.     FirstInstance: BOOLEAN;(* Programm schon im Speicher? *)
  43.   END;
  44.  
  45.   pIPXMDIWin = ^tIPXMDIWin;
  46.   tIPXMDIWin = OBJECT(tMDIWindow)
  47.     LogColl : pLogColl;
  48.                     (* Liste der Fenster, die IPX nutzen  *)
  49.     CONSTRUCTOR Init;
  50.     DESTRUCTOR Done; VIRTUAL;
  51.     PROCEDURE SetupWindow; VIRTUAL;
  52.     PROCEDURE NewChild(aFileNum: INTEGER);
  53.     PROCEDURE cmNewFile1(VAR Msg: tMessage);
  54.               VIRTUAL cm_First+cm_NewFile1;
  55.     PROCEDURE cmNewFile2(VAR Msg: tMessage);
  56.               VIRTUAL cm_First+cm_NewFile2;
  57.     PROCEDURE cmNewFile3(VAR Msg: tMessage);
  58.               VIRTUAL cm_First+cm_NewFile3;
  59.     PROCEDURE wmActivateApp(VAR Msg: tMessage);
  60.               VIRTUAL wm_First+wm_ActivateApp;
  61.   PRIVATE
  62.     WinNum: INTEGER;
  63.     FirstActivation: BOOLEAN;
  64.   END;
  65.  
  66.   pIPXWin = ^tIPXWin;                     (* Demo-Fenster *)
  67.   tIPXWin = OBJECT(tWindow)
  68.     UserColl: pUserColl;
  69.     WinNum : INTEGER;
  70.     FileNum: INTEGER;
  71.     IsActive: BOOLEAN;
  72.     CONSTRUCTOR Init(aNumber: INTEGER; aFileNum: LongInt);
  73.     FUNCTION CanClose: BOOLEAN; VIRTUAL;
  74.     PROCEDURE wmCommandReceived(VAR Msg: tMessage);
  75.               VIRTUAL wm_CommandReceived;
  76.     PROCEDURE wmLoggedIn(VAR Msg: tMessage);
  77.               VIRTUAL wm_LoggedIn;
  78.     PROCEDURE wmLoggedOut(VAR Msg: tMessage);
  79.               VIRTUAL wm_LoggedOut;
  80.     PROCEDURE cmSendCommand(VAR Msg: tMessage);
  81.               VIRTUAL cm_First+cm_SendCommand;
  82.   END;
  83.  
  84. CONSTRUCTOR tIPXWin.Init(aNumber: INTEGER;
  85.                          aFileNum: LongInt);
  86. VAR
  87.   fName    : PathStr;
  88.   fName0   : ARRAY[0..fsPathName+20] OF CHAR;
  89.   WinNumStr: STRING[4];
  90.       (* Reicht fⁿr Nummern bis 9999 - das sollte reichen *)
  91. BEGIN
  92.   Str(aNumber, WinNumStr);
  93.   fName := ParamStr(0);
  94.   WHILE fName[Length(fName)] <> '\' DO Dec(fName[0]);
  95.   fName := fName + 'IPXTEST.LG' + CHAR(aFileNum + Ord('0'));
  96.   tWindow.Init(Application^.MainWindow,
  97.                StrPCopy(fName0, 'Fenster ' + WinNumStr +
  98.                ' - ' + fName));
  99.   FileNum := aFileNum;
  100.   WinNum  := aNumber;
  101.   (* Wenn das Einloggen nicht klappt, Fenster ungⁿltig    *)
  102.   (* machen                                               *)
  103.   UserColl :=
  104.     pIPXMDIWin(Application^.MainWindow)^.LogColl^.LogIn(
  105.                                               fName, @Self);
  106.   IF UserColl = NIL THEN Status := em_InvalidWindow;
  107.   IsActive := Status <> em_InvalidWindow
  108. END;
  109.  
  110. (* Das Schlie▀en wird nur nach erfolgreichem Ausloggen    *)
  111. (* gestattet - was zwar fatal ist, wenn der Server        *)
  112. (* abgeschmiert ist, aber dann sind die Daten ja sowieso  *)
  113. (* beim Teufel . . .                                      *)
  114. FUNCTION tIPXWin.CanClose: BOOLEAN;
  115. VAR
  116.   Msg: ARRAY[0..50] OF CHAR;
  117. BEGIN
  118.   IF NOT pIPXMDIWin(
  119.            Application^.MainWindow)^.LogColl^.LogOut(@Self)
  120.            THEN BEGIN
  121.     wvSprintF(Msg,
  122.               'Fenster %d:'#13'Datei %d konnte nicht ' +
  123.               'ausloggen!',
  124.               WinNum);
  125.     MessageBox(GetFocus, Msg, 'Fehler',
  126.                mb_OK OR mb_IconExclamation);
  127.     CanClose := FALSE
  128.   END ELSE BEGIN
  129.     CanClose := TRUE;
  130.     IsActive := FALSE
  131.   END
  132. END;
  133.  
  134. PROCEDURE tIPXWin.wmCommandReceived(VAR Msg: tMessage);
  135. VAR
  136.   MsgStr: ARRAY[0..50] OF CHAR;
  137. BEGIN
  138.   wvSprintF(MsgStr,
  139.             'Fenster %d:'#13'Datei %d wurde bearbeitet!',
  140.             WinNum);
  141.   MessageBox(GetFocus, MsgStr, 'Achtung',
  142.              mb_OK OR mb_IconInformation);
  143.   Msg.Result := -1;
  144.   BuffColl^.ClearPacket(POINTER(Msg.lParam))
  145. END;
  146.  
  147. PROCEDURE tIPXWin.wmLoggedIn(VAR Msg: tMessage);
  148. VAR
  149.   MsgStr: ARRAY[0..50] OF CHAR;
  150. BEGIN
  151.   UserColl^.AddUser(PIPX_Packet(Msg.lParam));
  152.   IF NOT IsLoggedOut THEN BEGIN
  153.     wvSprintF(MsgStr,
  154.               'Fenster %d:'#13'Datei %d hat einen ' +
  155.               'weiteren Nutzer', WinNum);
  156.     MessageBox(0, MsgStr, 'Achtung',
  157.                mb_OK OR mb_IconInformation
  158.                      OR mb_SystemModal)
  159.   END;
  160.   Msg.Result := -1;
  161.   BuffColl^.ClearPacket(POINTER(Msg.lParam))
  162. END;
  163.  
  164. PROCEDURE tIPXWin.wmLoggedOut(VAR Msg: tMessage);
  165. VAR
  166.   MsgStr: ARRAY[0..50] OF CHAR;
  167. BEGIN
  168.   UserColl^.DeleteUser(PIPX_Packet(Msg.lParam));
  169.   IF NOT IsLoggedOut THEN BEGIN
  170.     wvSprintF(MsgStr, 'Fenster %d:'#13'Datei %d hat ' +
  171.               'einen Nutzer weniger!', WinNum);
  172.     MessageBox(0, MsgStr, 'Achtung',
  173.                mb_OK OR mb_IconInformation);
  174.   END;
  175.   Msg.Result := -1;
  176.   BuffColl^.ClearPacket(POINTER(Msg.lParam))
  177. END;
  178.  
  179. PROCEDURE tIPXWin.cmSendCommand(VAR Msg: tMessage);
  180. BEGIN
  181.   UserColl^.SendCommand(wm_CommandReceived, NIL)
  182. END;
  183.  
  184. CONSTRUCTOR tIPXMDIWin.Init;
  185. BEGIN
  186.   tMDIWindow.Init('IPX-Demo',
  187.                   LoadMenu(hInstance, 'DemoMenu'));
  188.   ChildMenuPos := 2;
  189.   WinNum := 1;   (* Erste zu vergebende Fensternummer = 1 *)
  190.   LogColl := New(pLogColl, Init);
  191.   IF LogColl = NIL THEN BEGIN
  192.     Status := em_InvalidWindow;
  193.     PostQuitMessage(1)
  194.   END;
  195.   FirstActivation := TRUE
  196. END;
  197.  
  198. DESTRUCTOR tIPXMDIWin.Done;
  199. BEGIN
  200.   IF LogColl <> NIL THEN BEGIN
  201.     Dispose(LogColl, Done);
  202.     LogColl := NIL
  203.   END;
  204.   tMDIWindow.Done
  205. END;
  206.  
  207. PROCEDURE tIPXMDIWin.SetupWindow;
  208. VAR
  209.   i: INTEGER;
  210. BEGIN
  211.   tMDIWindow.SetupWindow;
  212.   FOR i := 1 TO 3 DO NewChild(i)
  213. END;
  214.  
  215. PROCEDURE tIPXMDIWin.NewChild(aFileNum: INTEGER);
  216. BEGIN
  217.   Application^.MakeWindow(New(pIPXWin,
  218.                           Init(WinNum, aFileNum)));
  219.   Inc(WinNum)
  220. END;
  221.  
  222. PROCEDURE tIPXMDIWin.cmNewFile1(VAR Msg: tMessage);
  223. BEGIN
  224.   NewChild(1)
  225. END;
  226.  
  227. PROCEDURE tIPXMDIWin.cmNewFile2(VAR Msg: tMessage);
  228. BEGIN
  229.   NewChild(2)
  230. END;
  231.  
  232. PROCEDURE tIPXMDIWin.cmNewFile3(VAR Msg: tMessage);
  233. BEGIN
  234.   NewChild(3)
  235. END;
  236.  
  237. (* Inaktiviert das Programm, insbesondere die             *)
  238. (* ListenForPacket-Routine, wenn ein Taskwechsel          *)
  239. (* vorgenommen wird. Ist ein DOS-Fenster aktiv, glitscht  *)
  240. (* der Rechner sonst bei Empfang eine Packets ab.         *)
  241. (* Es darf nicht MessageBox aufgerufen werden, um das     *)
  242. (* Ausloggen anzuzeigen. Dann wⁿrde die Anwendung nΣmlich *)
  243. (* wieder aktiviert und unschlie▀end deaktiviert, mit     *)
  244. (* den entsprechenden wm_ActivateApp-Messages, und zwar   *)
  245. (* so lange, bis der Anwender den Reset-Schalter gefunden *)
  246. (* hat.                                                   *)
  247. (* Bei erneuter Aktivierung mu▀ ⁿberprⁿft werden, ob die  *)
  248. (* von den Fenstern dargestellten Daten noch gⁿltig sind. *)
  249. (* Bei Auftreten von Fehlern sollte PostMessage           *)
  250. (* aufgerufen werden, so da▀ "bei Gelegenheit" eine       *)
  251. (* Meldung angezeigt wird.                                *)
  252.  
  253. PROCEDURE tIPXMDIWin.wmActivateApp(VAR Msg: tMessage);
  254.  
  255.   PROCEDURE DoLogOut(Item: pUserColl); FAR;
  256.   BEGIN
  257.     Item^.LogOut;
  258.     Item^.FreeAll
  259.   END;
  260.  
  261.   PROCEDURE DoLogIn(Item: pUserColl); FAR;
  262.   BEGIN
  263.     WITH Item^ DO LogIn(Parent,FileName^)
  264.   END;
  265.  
  266. BEGIN
  267.   IF Msg.wParam = 0 THEN BEGIN
  268.     IF LogColl <> NIL THEN BEGIN   (* Anwendung wird      *)
  269.       IsLoggedOut := TRUE;         (* deaktiviert         *)
  270.       LogColl^.ForEach(@DoLogOut);
  271.       LogColl^.StopListening;
  272.       DefWndProc(Msg)
  273.     END;
  274.   END ELSE BEGIN
  275.     DefWndProc(Msg);
  276.     IF NOT FirstActivation THEN BEGIN
  277.                     (* die erste wm_ActivateApp - Meldung *)
  278.       LogColl^.StartListening;              (* ignorieren *)
  279.       LogColl^.ForEach(@DoLogIn);
  280.       IsLoggedOut := FALSE
  281.     END ELSE FirstActivation := FALSE
  282.   END
  283. END;
  284.  
  285. CONSTRUCTOR tIPXApp.Init(aName: pChar);
  286. BEGIN
  287.   tApplication.Init(aName);
  288.   FirstInstance := FALSE
  289. END;
  290.  
  291. (* Wird nur von der ersten Instanz einer Anwendung        *)
  292. (* aufgerufen                                             *)
  293. PROCEDURE tIPXApp.InitApplication;
  294. BEGIN FirstInstance := TRUE END;
  295.  
  296. PROCEDURE tIPXApp.InitMainWindow;
  297. BEGIN
  298.   IF GetWinFlags AND wf_PMode = 0 THEN
  299.                                    (* Kurz und schmerzlos *)
  300.    FatalAppExit(0,
  301.               'Diese Anwendung lΣuft nicht im Real-Modus!');
  302.   IF NOT FirstInstance THEN
  303.    FatalAppExit(0,
  304.         'Diese Anwendung darf nur einmal gestartet werden!')
  305.   ELSE
  306.     MainWindow := New(pIPXMDIWin,Init)
  307. END;
  308.  
  309. VAR
  310.   TestApp: tIPXApp;
  311. BEGIN
  312.   IF TestApp.Init('IPX-Demo') THEN TestApp.Run;
  313.   TestApp.Done;
  314. END.
  315.