1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     lyt_ArcResourceAccessor.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision: 23638 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_LYT_ARCRESOURCEACCESSOR_H_
17 #define NW_LYT_ARCRESOURCEACCESSOR_H_
18 
19 #include <nw/types.h>
20 
21 #include <nw/ut/ut_LinkList.h>
22 #include <nw/lyt/lyt_FontContainer.h>
23 #include <nw/lyt/lyt_ResourceAccessor.h>
24 #include <nw/lyt/lyt_TextureContainer.h>
25 #include <nw/lyt/lyt_Arc.h>
26 #include <cstddef>
27 
28 namespace nw
29 {
30 namespace lyt
31 {
32 
33 //---------------------------------------------------------------------------
34 //! :category リソースアクセサ
35 //!
36 //! @brief アーカイブリソースにアクセスするためのクラスです。
37 //!
38 //! @since 2009/09/18 初版。
39 //---------------------------------------------------------------------------
40 class ArcResourceAccessor : public ResourceAccessor
41 {
42 public:
43     //! パス名の最大長です。
44     static const int ROOTPATH_MAX = 64;
45 
46     //----------------------------------------
47     //! @name コンストラクタ/デストラクタ
48     //@{
49 
50     //! @brief コンストラクタです。
51     //!
52     //! @since 2009/09/18 初版。
53     //!
54     ArcResourceAccessor();
55 
56     //@}
57 
58     //----------------------------------------
59     //! @name 設定/取得
60     //@{
61 
62     //! @brief アーカイブデータを登録します。
63     //!
64     //! @param archiveStart アーカイブデータへのポインタです。
65     //! @param resourceRootDirectory リソース検索のルートとなるディレクトリ名です。
66     //!
67     //! @return 登録に成功したら true、失敗したら falseを返します。
68     //!
69     //! @since 2009/09/18 初版。
70     //!
71     bool Attach(
72         void* archiveStart,
73         const char* resourceRootDirectory
74     );
75 
76     //! @brief 登録したアーカイブデータの登録を解除します。
77     //!
78     //! @return 登録されていたアーカイブデータへのポインタを返します。
79     //!
80     //! @since 2009/09/18 初版。
81     //!
82     void* Detach();
83 
84     virtual void* GetResource(
85         ResType resType,
86         const char* name,
87         u32* pSize = 0
88     );
89 
90     //! @brief アクセサにアーカイブが設定されているかどうかを判定します。
91     //!
92     //! @return すでにアーカイブが設定されている場合は true を返します。
93     //!
94     //! @since 2009/09/18 初版。
95     //!
IsAttached()96     bool IsAttached() const
97     {
98         return m_ArcBuf != 0;
99     }
100 
101     //! @brief アーカイブの先頭アドレスを取得します。
102     //!
103     //! @return
104     //! 設定されているアーカイブの先頭アドレスを返します。
105     //! アーカイブが設定されていない場合は NULL を返します。
106     //!
107     //! @since 2009/09/18 初版。
108     //!
GetArchiveDataStart()109     const void* GetArchiveDataStart() const
110     {
111         return m_ArcBuf;
112     }
113 
114     //! @brief フォントオブジェクトを登録します。
115     //!
116     //! @details
117     //! フォントオブジェクトをリソースアクセサに設定し、
118     //! GetFont() の検索対象に含まれるようにします。
119     //!
120     //! @param name  フォントリソースの名前です。
121     //! @param pFont フォントオブジェクトへのポインタです。
122     //!
123     //! @return 登録キーを返します。キーは登録の抹消に使用します。
124     //!
125     //! @sa UnregistFont
126     //!
127     //! @since 2010/01/26 初版。
128     //!
129     FontKey RegistFont(const char* name, font::Font* pFont);
130 
131     //! @brief フォントオブジェクトの登録を解除します。
132     //!
133     //! @param key  フォントの登録時に取得した登録キーを指定します。
134     //!
135     //! @sa RegistFont
136     //!
137     //! @since 2010/01/26 初版。
138     //!
139     void UnregistFont(FontKey key);
140 
141     //! @brief テクスチャを登録します。
142     //!
143     //! @details
144     //! テクスチャをリソースアクセサに設定し、
145     //! GetTexture() の検索対象に含まれるようにします。
146     //!
147     //! @param name  テクスチャの名前です。
148     //! @param textureInfo  テクスチャ情報です。
149     //!
150     //! @return 登録キーを返します。キーは登録の抹消に使用します。
151     //!
152     //! @sa UnregistTexture
153     //!
154     //! @since 2010/01/26 初版。
155     //!
156     TextureKey RegistTexture(const char* name, const TextureInfo& textureInfo);
157 
158     //! @brief テクスチャの登録を解除します。
159     //!
160     //! @param key  テクスチャの登録時に取得した登録キーを指定します。
161     //!
162     //! @sa RegistTexture
163     //!
164     //! @since 2010/01/26 初版。
165     //!
166     void UnregistTexture(TextureKey key);
167 
168     //! @brief テクスチャ情報を取得します。
169     //!
170     //! @details
171     //! name で指定したテクスチャリソース名と関連付けられた
172     //! テクスチャ情報を取得します。
173     //!
174     //! テクスチャを所有していない場合には LoadTexture() でロードを試みます。
175     //!
176     //! @param name テクスチャリソースの名前です。
177     //!
178     //! @return テクスチャ情報を返します。
179     //! テクスチャを所有していない場合にはロードを試みます。
180     //! ロードできなかった場合にはテクスチャオブジェクトには無効な値
181     //! (TextureInfo::INVALID) が設定されます。
182     //!
183     //! @sa LoadTexture
184     //!
185     //! @since 2010/06/18 初版。
186     //!
187     virtual const TextureInfo GetTexture(const char* name);
188 
189     //! @brief フォントを取得します。
190     //!
191     //! @details
192     //! name で指定したフォントリソース名と関連付けられた
193     //! フォントオブジェクトを取得します。
194     //!
195     //! 指定されたフォントが登録されていなかった場合には
196     //! LoadFont() により生成したフォントを登録します。
197     //!
198     //! @param name フォントリソースの名前です。
199     //!
200     //! @return フォントへのポインタを返します。
201     //!
202     //! @sa LoadFont
203     //!
204     //! @since 2010/07/16 初版。
205     //!
206     virtual font::Font* GetFont(const char* name);
207 
208     //@}
209 
210 private:
211     ARCHandle m_ArcHandle;
212     void* m_ArcBuf;
213     FontContainer m_FontList;
214     TextureContainer m_TextureList;
215     wchar_t m_ResRootDir[ROOTPATH_MAX];
216     wchar_t m_ResNameWork[ROOTPATH_MAX];
217 };
218 
219 class MultiArcResourceAccessor;
220 
221 //---------------------------------------------------------------------------
222 //! :category リソースアクセサ
223 //!
224 //! @brief アーカイブの情報を保持するためのクラスです。
225 //!
226 //! @since 2009/09/18 初版。
227 //---------------------------------------------------------------------------
228 class ArcResourceLink
229 {
230     friend class MultiArcResourceAccessor;
231 
232 public:
233     //! パス名の最大長です。
234     static const int ROOTPATH_MAX = ArcResourceAccessor::ROOTPATH_MAX;
235 
236     //----------------------------------------
237     //! @name コンストラクタ/デストラクタ
238     //@{
239 
240     //! @brief コンストラクタです。
241     //!
242     //! @since 2009/09/18 初版。
243     //!
ArcResourceLink()244     ArcResourceLink()
245     {
246     }
247 
248     //@}
249 
250     //----------------------------------------
251     //! @name 設定/取得
252     //@{
253 
254     //! @brief アーカイブを設定し、初期化します。
255     //!
256     //! @details
257     //! アーカイブのフォーマットが正しくなければ失敗します。
258     //!
259     //! @param archiveStart アーカイブの先頭アドレスです。
260     //! @param resourceRootDirectory リソースのルートディレクトリ名です。
261     //!
262     //! @return アーカイブの設定が成功した場合は true を、失敗した場合は false を返します。
263     //!
264     //! @since 2009/09/18 初版。
265     //!
266     bool Set(
267         void* archiveStart,
268         const char* resourceRootDirectory
269     );
270 
271     //! @brief アーカイブの先頭アドレスを取得します。
272     //!
273     //! @return 設定されているアーカイブの先頭アドレスを返します。
274     //!
275     //! @since 2009/09/18 初版。
276     //!
277     const void* GetArchiveDataStart() const;
278 
279     //! @brief リソースのルートディレクトリ名を取得します。
280     //!
281     //! @return リソースのルートディレクトリ名を返します。
282     //!
283     //! @since 2009/09/18 初版。
284     //!
GetResRootDir()285     const wchar_t* GetResRootDir() const
286     {
287         return m_ResRootDir;
288     }
289 
290     //@}
291 
292     //! :private
293     //! リストのリンク情報です。
294     ut::LinkListNode m_Link;
295 
296 private:
GetArcHandle()297     ARCHandle* GetArcHandle()
298     {
299         return &m_ArcHandle;
300     }
301 
302     ARCHandle m_ArcHandle;
303     wchar_t m_ResRootDir[ROOTPATH_MAX];
304 };
305 
306 namespace internal
307 {
308 
309 typedef ut::LinkList<ArcResourceLink, offsetof(ArcResourceLink, m_Link)> ArcResourceList;
310 
311 }   // namespace internal
312 
313 //---------------------------------------------------------------------------
314 //! :category リソースアクセサ
315 //!
316 //! @brief 複数のアーカイブリソースにアクセスするためのクラスです。
317 //!
318 //! @since 2009/09/18 初版。
319 //---------------------------------------------------------------------------
320 class MultiArcResourceAccessor : public ResourceAccessor
321 {
322 public:
323     //! パス名の最大長です。
324     static const int ROOTPATH_MAX = ArcResourceAccessor::ROOTPATH_MAX;
325 
326     //----------------------------------------
327     //! @name コンストラクタ/デストラクタ
328     //@{
329 
330     //! @brief コンストラクタです。
331     //!
332     //! @since 2009/09/18 初版。
333     //!
334     MultiArcResourceAccessor();
335 
336     //! @brief デストラクタです。
337     //!
338     //! @since 2009/09/18 初版。
339     //!
340     virtual ~MultiArcResourceAccessor();
341 
342     //@}
343 
344     //----------------------------------------
345     //! @name 設定/取得
346     //@{
347 
348     //! @brief アーカイブ情報を登録します。
349     //!
350     //! @details
351     //! ArcResourceLink を登録します。
352     //!
353     //! @param pLink ArcResourceLinkオブジェクトへのポインタです。
354     //!
355     //! @since 2009/09/18 初版。
356     //!
357     void Attach(ArcResourceLink* pLink);
358 
359     //! @brief 指定したアーカイブデータの登録を解除します。
360     //!
361     //! @param archiveStart アーカイブデータへのポインタ。
362     //!
363     //! @return 登録が解除できた場合、ArcResourceLink オブジェクトへのポインタを
364     //! 返します。解除できなかった場合、NULLを返します。
365     //!
366     //! @since 2009/09/18 初版。
367     //!
368     ArcResourceLink* Detach(const void* archiveStart);
369 
370     //! @brief 指定したアーカイブ情報の登録を解除します。
371     //!
372     //! @details
373     //! ArcResourceLink の登録を解除します。
374     //!
375     //! @param pLink ArcResourceLink オブジェクトへのポインタです。
376     //!
377     //! @since 2009/09/18 初版。
378     //!
379     void Detach(ArcResourceLink* pLink);
380 
381     //! @brief 登録されているすべてのアーカイブ情報を登録解除します。
382     //!
383     //! @sa Detach
384     //!
385     //! @since 2009/09/18 初版。
386     //!
387     void DetachAll();
388 
389     virtual void* GetResource(
390         ResType resType,
391         const char* name,
392         u32* pSize = 0
393     );
394 
395     //! @brief フォントオブジェクトを登録します。
396     //!
397     //! @details
398     //! フォントオブジェクトをリソースアクセサに設定し、
399     //! GetFont() の検索対象に含まれるようにします。
400     //!
401     //! @param name  フォントリソースの名前です。
402     //! @param pFont フォントオブジェクトへのポインタです。
403     //!
404     //! @return 登録キーを返します。キーは登録の抹消に使用します。
405     //!
406     //! @sa UnregistFont
407     //!
408     //! @since 2010/01/26 初版。
409     //!
410     FontKey RegistFont(const char* name, font::Font* pFont);
411 
412     //! @brief フォントオブジェクトの登録を解除します。
413     //!
414     //! @param key  フォントの登録時に取得した登録キーを指定します。
415     //!
416     //! @sa RegistFont
417     //!
418     //! @since 2010/01/26 初版。
419     //!
420     void UnregistFont(FontKey key);
421 
422     //! @brief テクスチャを登録します。
423     //!
424     //! @details
425     //! テクスチャをリソースアクセサに設定し、
426     //! GetTexture() の検索対象に含まれるようにします。
427     //!
428     //! @param name  テクスチャの名前です。
429     //! @param textureInfo テクスチャ情報です。
430     //!
431     //! @return 登録キーを返します。キーは登録の抹消に使用します。
432     //!
433     //! @sa UnregistTexture
434     //!
435     //! @since 2010/01/26 初版。
436     //!
437     TextureKey RegistTexture(const char* name, const TextureInfo& textureInfo);
438 
439     //! @brief テクスチャの登録を解除します。
440     //!
441     //! @param key  テクスチャの登録時に取得した登録キーを指定します。
442     //!
443     //! @sa RegistTexture
444     //!
445     //! @since 2010/01/26 初版。
446     //!
447     void UnregistTexture(TextureKey key);
448 
449     //! @brief テクスチャ情報を取得します。
450     //!
451     //! @details
452     //! name で指定したテクスチャリソース名と関連付けられた
453     //! テクスチャ情報を取得します。
454     //!
455     //! テクスチャを所有していない場合には LoadTexture() でロードを試みます。
456     //!
457     //! @param name テクスチャリソースの名前です。
458     //!
459     //! @return テクスチャ情報を返します。
460     //! テクスチャを所有していない場合にはロードを試みます。
461     //! ロードできなかった場合にはテクスチャオブジェクトには無効な値
462     //! (TextureInfo::INVALID) が設定されます。
463     //!
464     //! @sa LoadTexture
465     //!
466     //! @since 2010/06/18 初版。
467     //!
468     virtual const TextureInfo GetTexture(const char* name);
469 
470     //! @brief フォントを取得します。
471     //!
472     //! @details
473     //! name で指定したフォントリソース名と関連付けられた
474     //! フォントオブジェクトを取得します。
475     //!
476     //! 指定されたフォントが登録されていなかった場合には
477     //! LoadFont() により生成したフォントを登録します。
478     //!
479     //! @param name フォントリソースの名前です。
480     //!
481     //! @return フォントへのポインタを返します。
482     //!
483     //! @sa LoadFont
484     //!
485     //! @since 2010/07/16 初版。
486     //!
487     virtual font::Font* GetFont(const char* name);
488 
489     //@}
490 
491 private:
492     internal::ArcResourceList m_ArcList;
493     FontContainer m_FontList;
494     TextureContainer m_TextureList;
495     wchar_t m_ResNameWork[ROOTPATH_MAX];
496 };
497 
498 }   // namespace lyt
499 }   // namespace nw
500 
501 /* NW_LYT_ARCRESOURCEACCESSOR_H_ */
502 #endif
503