FileHandlers.Mod 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. MODULE FileHandlers; (** AUTHOR "negelef"; PURPOSE "Open files according to file handlers"; *)
  2. IMPORT
  3. Files, Configuration, Strings, Commands, Streams;
  4. (** Opens the file path; corresponding file handlers are specified in Configuration.XML *)
  5. PROCEDURE OpenFile* (CONST path : ARRAY OF CHAR; err: Streams.Writer; caller: OBJECT);
  6. VAR config,filehandler: ARRAY 128 OF CHAR; name,filename, ext : Files.FileName; index: SIZE; res : WORD;
  7. context: Commands.Context; arg: Streams.StringReader; in: Streams.Reader; out: Streams.Writer;
  8. BEGIN
  9. Files.SplitExtension(path, name, ext);
  10. index := Strings.Find (ext, 0, '@');
  11. IF index >= 0 THEN Strings.Truncate (ext, index); END;
  12. Strings.LowerCase(ext);
  13. config := "Filehandlers.";
  14. (* get the right handler *)
  15. Strings.Append(config, ext);
  16. Strings.Append(config, ".Open");
  17. Configuration.Get(config, filehandler, res);
  18. IF (res # Configuration.Ok) THEN
  19. IF err # NIL THEN err.String ("Opening '"); err.String (ext); err.String ("' files not specified in Configuration.XML."); err.Ln END;
  20. RETURN
  21. END;
  22. (* construct the context *)
  23. context := Commands.GetContext ();
  24. IF context = NIL THEN
  25. in := NIL; out := NIL
  26. ELSE
  27. in := context.in; out := context.out
  28. END;
  29. filename := '"';
  30. Strings.Append(filename,path);
  31. Strings.Append(filename,'"');
  32. IF index >= 0 THEN ext[index] := '@'; Strings.Move (ext, index, Strings.Length (ext) - index, ext, 0); Strings.Append (filename, ext); END;
  33. NEW (arg, LEN (filename)); arg.Set (filename);
  34. NEW (context, in, arg, out, err, caller);
  35. (* call the command *)
  36. Commands.Activate (filehandler, context, {}, res, name);
  37. IF res # Commands.Ok THEN
  38. IF err # NIL THEN err.String (name); err.Ln END
  39. END;
  40. END OpenFile;
  41. (* Open a file *)
  42. PROCEDURE Open* (context: Commands.Context);
  43. VAR path: ARRAY Files.NameLength OF CHAR;
  44. BEGIN
  45. context.arg.Ln (path);
  46. Strings.TrimWS (path);
  47. OpenFile (path, context.error, context.caller);
  48. END Open;
  49. END FileHandlers.
  50. System.Free FileHandlers ~