OSDN Git Service

488de335bf2ce6c4145ea5229a04046c415340ae
[yurina/yurina.git] / src / core / base / Storage.h
1 /*\r
2  *      “yurina”: yurina unpretentious renderer is not an anathema\r
3  *\r
4  *      This software is distributed under a BSD-style license.\r
5  *      See license.txt for more information.\r
6  */\r
7 \r
8 #pragma once\r
9 \r
10 #include "base/yurinaCommon.h"\r
11 #include "base/MountInformation.h"\r
12 //#include "base/YuriFile.h" // 循環参照回避\r
13 \r
14 namespace yurina\r
15 {\r
16         class MountInformation;\r
17         class YuriFile;\r
18 \r
19         /**\r
20          *      仮想ストレージ.\r
21          *      @attention マウント情報の扱いがスレッドアンセーフ\r
22          */\r
23         class Storage\r
24         {\r
25         public:\r
26                 enum FileMode\r
27                 {\r
28                         READ,\r
29                         WRITE,\r
30                         READ_WRITE,\r
31                         APPEND,\r
32                 };\r
33                 enum SeekOrigin\r
34                 {\r
35                         CURRENT = SEEK_CUR,\r
36                         END = SEEK_END,\r
37                         BEGIN = SEEK_SET,\r
38                 };\r
39         protected:\r
40                 static MountInformation mountInfo;\r
41                 /** ストレージの型を表すユニークな値.*/\r
42                 static const int ST_VIRTUAL = 0x00;\r
43                 /** 無効なストレージを表す値.*/\r
44                 static const int ST_INVALID = -1;\r
45                 int storageType;\r
46                 /** 現在マウントされているポイントの数. */\r
47                 int mountCount;\r
48         private:\r
49         public:\r
50                 Storage( void );\r
51                 virtual ~Storage( void );\r
52                 int getStorageType( void ) const { return storageType; }\r
53                 \r
54                 /**\r
55                  *      マウント情報を文字列化する. \r
56                  *      @attention 飽くまでデバッグ用(再帰を使用するので注意)\r
57                  */\r
58                 virtual YuriString toString( void ) const;\r
59 \r
60                 virtual bool mountOn( const FilePath &targetDirectory );\r
61 \r
62                 virtual bool unmount( const FilePath &targetDirectory );\r
63 \r
64                 /**\r
65                  *      ファイル/ディレクトリが存在するか確認する.\r
66                  *      @param path 確認するファイル/ディレクトリのパス\r
67                  *      @return 存在しない場合は偽\r
68                  *      @attention 戻り値が真であっても対象が有効である(開ける)保証はない.\r
69                  */\r
70                 virtual bool exists( const FilePath &path ) const;\r
71 \r
72                 /**\r
73                  *      ファイルのサイズを取得する.\r
74                  *      @param filePath サイズを取得するファイルのパス\r
75                  *      @return ファイルのサイズ. 失敗した場合は負数を返す\r
76                  */\r
77                 virtual off64_t getSizeOf( const FilePath &filePath ) const;\r
78 \r
79                 /**\r
80                  *      ファイルを開く.\r
81                  *      @param filePath 開くファイルのパス\r
82                  *      @param mode 開くモード\r
83                  *      @return 開いたファイル. 成功すると,ファイルの状態はOPENになる\r
84                  */\r
85                 virtual YuriFile open( const FilePath &filePath, FileMode mode ) const;\r
86                 \r
87                 /**\r
88                  *      ファイルを閉じる.\r
89                  *      @param file 閉じるファイル\r
90                  *      @return 成功した場合0,失敗した場合0以外\r
91                  *      @note 閉じるのに成功すると,ファイルの状態はCLOSEDになる\r
92                  */\r
93                 virtual int close( YuriFile &file ) const;\r
94 \r
95                 /**\r
96                  *      ファイルを開き,内容を読み込み,ファイルを閉じる.\r
97                  *      @param filePath 読み込むファイルのパス\r
98                  *      @param buffer[out] ファイル内容の出力先\r
99                  *      @param size 読み込むbyte数の最大値\r
100                  *      @param offset 読み込みを開始するファイル先頭からのオフセット\r
101                  *      @return 実際に読み込まれたbyte数.\r
102                  *      @note size に達する前にファイルの終端に達すると戻り値はsize以下になる\r
103                  *      @attention 32bit環境ではsizeは最大2GB\r
104                  */\r
105                 virtual size_t read( const FilePath &filePath, unsigned char *buffer,\r
106                                                                  size_t size, off64_t offset = 0 ) const;\r
107 \r
108                 /**\r
109                  *      ファイルの内容を読み込む.\r
110                  *      @param file 読み込むファイル\r
111                  *      @param buffer[out] ファイル内容の出力先\r
112                  *      @param size 読み込むbyte数の最大値\r
113                  *      @param offset 読み込みを開始するファイル先頭からのオフセット\r
114                  *      @return 実際に読み込まれたbyte数.\r
115                  *      @note size に達する前にファイルの終端に達すると戻り値はsize以下になる\r
116                  *      @attention sizeを省略すると失敗する. 32bit環境ではsizeは最大2GB\r
117                  */\r
118                 virtual size_t read( YuriFile &file, unsigned char *buffer, \r
119                                                                 size_t size, off64_t offset = 0 ) const;\r
120 \r
121                 /**\r
122                  *      指定された位置にファイルポインタを移動する.\r
123                  *      @param file 対象のファイル\r
124                  *      @param offset byte単位の移動量\r
125                  *      @param origin 起点\r
126                  *      @return 成功した場合0,失敗した場合0以外\r
127                  */\r
128                 virtual int seek( YuriFile &file, off64_t offset, SeekOrigin origin ) const;\r
129         protected:\r
130                 /**\r
131                  *      指定したストレージを全てアンマウントする.\r
132                  *      @param storage 対象ストレージ\r
133                  *      @return アンマウントに成功した回数\r
134                  *      @attention 全探索を行うので常用すべきでない\r
135                  */\r
136                 size_t unmountAll( const Storage *storage );\r
137         private:\r
138                 \r
139 \r
140         };\r
141 }\r
142 \r