home *** CD-ROM | disk | FTP | other *** search
-
- // objects.h.fileopen
-
- // Dreamscape - C++ class library for RISC OS
- // Copyright (c) 1996 Mark Seaborn <mseaborn@argonet.co.uk>
- //
- // This library is free software; you can redistribute it and/or
- // modify it under the terms of the GNU Library General Public
- // License as published by the Free Software Foundation; either
- // version 2 of the License, or (at your option) any later version.
- // See the Dreamscape documentation for more information.
-
- #ifndef dreamscape_fileopen_H
- #define dreamscape_fileopen_H
-
- #include "list.h"
-
- #include "loader.h"
- #include "wimpmsg.h"
- #include "dataload.h"
-
- class FileOpenerInfo {
- public:
- FileOpenerInfo(): size(0), double_clicked(0), control(0), alt(0) {}
-
- Filetype type;
- int size;
- unsigned double_clicked: 1;
- unsigned control: 1;
- unsigned alt: 1;
- };
-
- class FileOpener {
- static class Initialise: public DataLoadProtocol::Client {
- public:
- Initialise();
-
- void *accept_data(const DataLoadProtocol::Info &info);
- void *accept_file(const DataLoadProtocol::Info &info);
- void load_data(const DataLoadProtocol::Info &info, istream &stream,
- void *handle);
- void load_file(const DataLoadProtocol::Info &info, const char *filename,
- void *handle);
- } init;
- friend Initialise;
-
- static FileOpener *openers;
- FileOpener *next;
-
- static bool message_data_open(const wimp_message *message, void *handle);
-
- public:
- FileOpener();
- virtual ~FileOpener();
-
- typedef Loader<const char *, FileOpenerInfo> FileLoader;
- typedef Loader<istream &, FileOpenerInfo> DataLoader;
- typedef LoaderOneType<const char *, FileOpenerInfo> FileLoaderOneType;
- typedef LoaderOneType<istream &, FileOpenerInfo> DataLoaderOneType;
-
- private:
- struct FLNode { FileLoader *l; FLNode *next; } *file_loaders;
- struct DLNode { DataLoader *l; DLNode *next; } *data_loaders;
- struct FLTempData { FileOpenerInfo i; FileLoader *l; };
- struct DLTempData { FileOpenerInfo i; DataLoader *l; };
- static void fill_in_loader_info(FileOpenerInfo &i,
- const DataLoadProtocol::Info &info);
-
- public:
- void add_file_loader(FileLoader *loader);
- void remove_file_loader(FileLoader *loader);
- void add_data_loader(DataLoader *loader);
- void remove_data_loader(DataLoader *loader);
-
- static bool load(const char *filename);
- static bool load(istream &stream, Filetype type, int size = 0);
- static bool load(const char *filename, const FileOpenerInfo &info);
- static bool load(istream &stream, const FileOpenerInfo &info);
- };
-
- class SimpleDataOpener: public FileOpener::DataLoaderOneType {
- FileOpener opener;
- public:
- SimpleDataOpener(Filetype type): FileOpener::DataLoaderOneType(type)
- { opener.add_data_loader(this); }
- };
-
- #endif
-