home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9303 / pastrick / spooler.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-06-02  |  4.5 KB  |  172 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      SPOOLER.PAS                       *)
  3. (*          Drucker-Spooler für Turbo-Vision              *)
  4. (*         (c) 1993 Jochen Schäfer & DMV-Verlag           *)
  5. (* ------------------------------------------------------ *)
  6. {$A+,B-,D+,E+,F-,G-,I+,K-,L+,N-,O-,P-,Q-,R-,S+,T-,V+,W-,X+}
  7. {$M 16384,0,655360}
  8.  
  9. UNIT Spooler;
  10.  
  11. INTERFACE
  12.  
  13. USES Objects;
  14.  
  15. CONST
  16.   spNotFound = 2;
  17.   
  18. TYPE
  19.   pSpoolerCollection = ^tSpoolerCollection;
  20.   tSpoolerCollection = OBJECT (tCollection)
  21.     PROCEDURE FreeItem(Item : Pointer); VIRTUAL;
  22.   END;
  23.  
  24.   pSpooler = ^tSpooler;
  25.   tSpooler = OBJECT (tObject)
  26.     CONSTRUCTOR Init(Entries : INTEGER; FileName : STRING);
  27.     DESTRUCTOR  Done;                             VIRTUAL;
  28.     PROCEDURE   Update;                           VIRTUAL;
  29.     PROCEDURE   Insert(FileName : pString);       VIRTUAL;
  30.     PROCEDURE   Delete(FileName : pString);       VIRTUAL;
  31.     PROCEDURE   Stop;                             VIRTUAL;
  32.     PROCEDURE   Go;                               VIRTUAL;
  33.     PROCEDURE   Error(Code, Info : INTEGER);      VIRTUAL;
  34.     PROCEDURE   GetItems(VAR List : pItemList);   VIRTUAL;
  35.     FUNCTION    Count : INTEGER;
  36.   PRIVATE
  37.     aList              : pSpoolerCollection;
  38.     Stop_Spooler, Wait : BOOLEAN;
  39.     FUNCTION Find(FileName : pString) : INTEGER;  VIRTUAL;
  40.   END;
  41.              
  42. IMPLEMENTATION
  43.  
  44. USES Dos;
  45.  
  46. VAR
  47.   aFile, Printer : Text;
  48.   Dummy          : pString;
  49.   ch             : CHAR;
  50.  
  51.   PROCEDURE tSpoolerCollection.FreeItem(Item : Pointer);
  52.   BEGIN
  53.     IF Item <> NIL THEN Dispose(pString(Item));
  54.   END;
  55.  
  56.   CONSTRUCTOR tSpooler.Init(Entries  : INTEGER;
  57.                             FileName : STRING);
  58.     (* Objekt, Dateien, Drucker, und Liste initialisieren *)
  59.   BEGIN
  60.     tObject.init;
  61.     aList := New(pSpoolerCollection, Init(Entries, 1));
  62.     Stop_Spooler := FALSE;
  63.     Wait         := FALSE;
  64.     Assign(aFile, '');
  65.     Assign(Printer, FileName);
  66.     Rewrite(Printer);
  67.   END;
  68.  
  69.   DESTRUCTOR tSpooler.Done;
  70.     (* Dateien und Drucker schließen *)
  71.   BEGIN
  72.     IF TextRec(aFile).Mode <> fmClosed THEN Close(aFile);
  73.     Close(Printer);
  74.     tObject.Done;
  75.   END;
  76.  
  77.   PROCEDURE tSpooler.Update;
  78.   BEGIN
  79.     IF TextRec(aFile).Mode = fmClosed THEN BEGIN
  80.       (* Wenn aFile fertiggedruckt ist, neue Datei öffnen *)
  81.       Dummy := aList^.at(0);
  82.       IF Dummy <> NIL THEN BEGIN
  83.         Assign(aFile, Dummy^);
  84.         Reset(aFile);
  85.       END;
  86.     END;
  87.     IF NOT Stop_Spooler THEN
  88.       (* Wenn aktiv, nächstes Zeichen lesen und drucken *)                
  89.     IF NOT EoF(aFile) THEN BEGIN
  90.       IF NOT Wait THEN
  91.         Read(aFile, ch);
  92.       {$I- }
  93.       Write(Printer, ch);
  94.       {$I+}
  95.       Wait := (IoResult <> 0);
  96.         (* Überprüfung, ob Drucker aktiv *)
  97.     END ELSE BEGIN
  98.       (* Wenn EoF, Datei schließen, FormFeed und Filename *)
  99.       (* aus Liste löschen                                *)
  100.       Close(aFile);
  101.       Write(Printer, #12);
  102.       Delete(Dummy);
  103.     END;
  104.   END;
  105.  
  106.   PROCEDURE tSpooler.Insert(FileName : pString);
  107.     (* Filename in Liste einfügen *)
  108.   BEGIN
  109.     aList^.Insert(FileName);
  110.   END;
  111.  
  112.   FUNCTION tSpooler.Find(FileName : pString) : INTEGER;
  113.     (* Finde zutreffenden Namen in Liste *)
  114.   VAR
  115.     i : INTEGER;
  116.   BEGIN
  117.     Find := -1;
  118.     FOR i := 0 TO aList^.Count-1 DO
  119.       IF pString(aList^.At(i))^ = FileName^ THEN
  120.         Find := i;
  121.   END;
  122.  
  123.   PROCEDURE tSpooler.Delete(FileName : pString);
  124.     (* Filename aus Liste löschen *)
  125.   VAR
  126.     Dummy : INTEGER;
  127.   BEGIN
  128.     Dummy := Find(FileName);
  129.     IF Dummy = -1 THEN
  130.       tSpooler.Error(spNotFound, 0)
  131.     ELSE BEGIN
  132.       IF (Dummy = 0) AND
  133.          (TextRec(aFile).Mode <> fmClosed) THEN
  134.         Close(aFile);
  135.       aList^.Free(aList^.At(Dummy));
  136.     END;
  137.   END;
  138.  
  139.   PROCEDURE tSpooler.Stop;
  140.     (* Spooler deaktivieren *)
  141.   BEGIN
  142.     Stop_Spooler := TRUE;
  143.   END;
  144.  
  145.   PROCEDURE tSpooler.Go;
  146.     (* Spooler aktivieren *)
  147.   BEGIN
  148.     Stop_Spooler := FALSE;
  149.   END;
  150.  
  151.   PROCEDURE tSpooler.Error(Code, Info : INTEGER);
  152.     (* Bei Fehler Programm anhalten *)
  153.   BEGIN
  154.     WriteLn('Runtime-Error ', Code:4, Info:4);
  155.     Halt(Code);
  156.   END;
  157.  
  158.   PROCEDURE tSpooler.GetItems(VAR List : pItemList);
  159.   BEGIN
  160.     List := aList^.Items;
  161.   END;
  162.  
  163.   FUNCTION tSpooler.Count : INTEGER;
  164.   BEGIN
  165.     Count := aList^.Count;
  166.   END;
  167.  
  168. END.
  169. (* ------------------------------------------------------ *)
  170. (*                 Ende von SPOOLER.PAS                   *)
  171.  
  172.