home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / dreamscape / source / Dreamscape / Headers / objects / h / fileopen < prev    next >
Encoding:
Text File  |  1996-09-06  |  2.6 KB  |  89 lines

  1.  
  2. // objects.h.fileopen
  3.  
  4. // Dreamscape - C++ class library for RISC OS
  5. // Copyright (c) 1996 Mark Seaborn <mseaborn@argonet.co.uk>
  6. //
  7. // This library is free software; you can redistribute it and/or
  8. // modify it under the terms of the GNU Library General Public
  9. // License as published by the Free Software Foundation; either
  10. // version 2 of the License, or (at your option) any later version.
  11. // See the Dreamscape documentation for more information.
  12.  
  13. #ifndef dreamscape_fileopen_H
  14. #define dreamscape_fileopen_H
  15.  
  16. #include "list.h"
  17.  
  18. #include "loader.h"
  19. #include "wimpmsg.h"
  20. #include "dataload.h"
  21.  
  22. class FileOpenerInfo {
  23. public:
  24.   FileOpenerInfo(): size(0), double_clicked(0), control(0), alt(0) {}
  25.  
  26.   Filetype type;
  27.   int size;
  28.   unsigned double_clicked: 1;
  29.   unsigned control: 1;
  30.   unsigned alt: 1;
  31. };
  32.  
  33. class FileOpener {
  34.   static class Initialise: public DataLoadProtocol::Client {
  35.   public:
  36.     Initialise();
  37.  
  38.     void *accept_data(const DataLoadProtocol::Info &info);
  39.     void *accept_file(const DataLoadProtocol::Info &info);
  40.     void load_data(const DataLoadProtocol::Info &info, istream &stream,
  41.         void *handle);
  42.     void load_file(const DataLoadProtocol::Info &info, const char *filename,
  43.         void *handle);
  44.   } init;
  45.   friend Initialise;
  46.  
  47.   static FileOpener *openers;
  48.   FileOpener *next;
  49.  
  50.   static bool message_data_open(const wimp_message *message, void *handle);
  51.  
  52. public:
  53.   FileOpener();
  54.   virtual ~FileOpener();
  55.  
  56.   typedef Loader<const char *, FileOpenerInfo> FileLoader;
  57.   typedef Loader<istream &, FileOpenerInfo> DataLoader;
  58.   typedef LoaderOneType<const char *, FileOpenerInfo> FileLoaderOneType;
  59.   typedef LoaderOneType<istream &, FileOpenerInfo> DataLoaderOneType;
  60.  
  61. private:
  62.   struct FLNode { FileLoader *l; FLNode *next; } *file_loaders;
  63.   struct DLNode { DataLoader *l; DLNode *next; } *data_loaders;
  64.   struct FLTempData { FileOpenerInfo i; FileLoader *l; };
  65.   struct DLTempData { FileOpenerInfo i; DataLoader *l; };
  66.   static void fill_in_loader_info(FileOpenerInfo &i,
  67.         const DataLoadProtocol::Info &info);
  68.  
  69. public:
  70.   void add_file_loader(FileLoader *loader);
  71.   void remove_file_loader(FileLoader *loader);
  72.   void add_data_loader(DataLoader *loader);
  73.   void remove_data_loader(DataLoader *loader);
  74.  
  75.   static bool load(const char *filename);
  76.   static bool load(istream &stream, Filetype type, int size = 0);
  77.   static bool load(const char *filename, const FileOpenerInfo &info);
  78.   static bool load(istream &stream, const FileOpenerInfo &info);
  79. };
  80.  
  81. class SimpleDataOpener: public FileOpener::DataLoaderOneType {
  82.   FileOpener opener;
  83. public:
  84.   SimpleDataOpener(Filetype type): FileOpener::DataLoaderOneType(type)
  85.     { opener.add_data_loader(this); }
  86. };
  87.  
  88. #endif
  89.