summaryrefslogtreecommitdiffhomepage
path: root/StarsEx/DataLoader.h
blob: f3fbb322399679d029d7c707cce10f5fa630e01f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*  Starshatter: The Open Source Project
    Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors
    Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors
    Copyright (c) 1997-2006, Destroyer Studios LLC.

    AUTHOR:       John DiCamillo

*/

#ifndef DataLoader_h
#define DataLoader_h

#include "Archive.h"
#include "DataSource.h"
#include "Types.h"
#include "List.h"
#include "Text.h"

// +--------------------------------------------------------------------+

class Bitmap;
class Sound;

// +--------------------------------------------------------------------+

class DataLoader
{
public:
    static constexpr int FAILED {-1};
    static const char* TYPENAME() { return "DataLoader"; }

    DataLoader();
    virtual ~DataLoader();

    static DataLoader*   GetLoader() { return loader; }
    static void          Initialize();
    static void          Close();

    const char* LastError() const;

    void        UseFileSystem(bool use=true);
    void        EnableMedia(bool enable=true);

    int         MountDatafile(const char* name, int pos=-1);
    int         UnmountSource(int src);

    void        SetDataPath(const char* path);
    const char* GetDataPath() const { return datapath; }

    bool  IsFileSystemEnabled() const { return work_directory_source != nullptr; }
    bool  IsMediaLoadEnabled()  const { return enable_media;   }

    bool  FindFile(const char* fname);
    int   ListFiles(const char* filter, List<Text>& list, bool recurse=false);
    int   ListArchiveFiles(int src, const char* filter, List<Text>& list);
    int   LoadBuffer(const char* name, BYTE*&  buf, bool null_terminate=false, bool optional=false);
    int   LoadBitmap(const char* name, Bitmap& bmp, int type=0, bool optional=false);
    int   CacheBitmap(const char* name, Bitmap*& bmp, int type=0, bool optional=false);
    int   LoadTexture(const char* name, Bitmap*& bmp, int type=0, bool preload_cache=false, bool optional=false);
    int   LoadSound(const char* fname, Sound*& snd, DWORD flags=0, bool optional=false);
    int   LoadStream(const char* fname, Sound*& snd, bool optional=false);

    void  ReleaseBuffer(BYTE*& buf);
    int   fread(void* buffer, size_t size, size_t count, BYTE*& stream);

private:
    int   LoadIndexed(const char* name, Bitmap& bmp, int type);
    int   LoadHiColor(const char* name, Bitmap& bmp, int type);
    int   LoadAlpha(  const char* name, Bitmap& bmp, int type);

    int   LoadPartialFile(const char* fname, BYTE*& buf, int max_load, bool optional=false);
    int   LoadOggStream(const char* fname, Sound*& snd);

    Text        datapath;
    bool        enable_media;

    Text last_error;

    List<DataSource> sources;
    DataSource* work_directory_source;
    static DataLoader* loader;
};

// +--------------------------------------------------------------------+

#endif  // DataLoader_h