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: 26808 $
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     //! @brief TextureContainer を取得します。
209     //!
210     //! @return
211     //! 登録されたテクスチャを保持する TextureContainer への参照を返します。
212     //!
213     //! @since 2010/12/03 初版。
214     //!
GetTextureContainer()215     TextureContainer& GetTextureContainer()
216     {
217         return m_TextureList;
218     }
219 
220     //! @brief TextureContainer を取得します。
221     //!
222     //! @returns
223     //! 登録されたテクスチャを保持する TextureContainer への参照を返します。
224     //!
225     //! @since 2010/12/03 初版。
226     //!
GetTextureContainer()227     const TextureContainer& GetTextureContainer() const
228     {
229         return m_TextureList;
230     }
231 
232     //! @brief FontContainer を取得します。
233     //!
234     //! @return
235     //! 登録されたフォントを保持する FontContainer への参照を返します。
236     //!
237     //! @since 2010/12/03 初版。
238     //!
GetFontContainer()239     FontContainer& GetFontContainer()
240     {
241         return m_FontList;
242     }
243 
244     //! @brief FontContainer を取得します。
245     //!
246     //! @return
247     //! 登録されたフォントを保持する FontContainer への参照を返します。
248     //!
249     //! @since 2010/12/03 初版。
250     //!
GetFontContainer()251     const FontContainer& GetFontContainer() const
252     {
253         return m_FontList;
254     }
255 
256     //@}
257 
258 protected:
259     //! @details :private
260     ARCHandle m_ArcHandle;
261 
262     //! @details :private
263     void* m_ArcBuf;
264 
265     //! @details :private
266     FontContainer m_FontList;
267 
268     //! @details :private
269     TextureContainer m_TextureList;
270 
271     //! @details :private
272     wchar_t m_ResRootDir[ROOTPATH_MAX];
273 
274     //! @details :private
275     wchar_t m_ResNameWork[ROOTPATH_MAX];
276 };
277 
278 class MultiArcResourceAccessor;
279 
280 //---------------------------------------------------------------------------
281 //! :category リソースアクセサ
282 //!
283 //! @brief アーカイブの情報を保持するためのクラスです。
284 //!
285 //! @since 2009/09/18 初版。
286 //---------------------------------------------------------------------------
287 class ArcResourceLink
288 {
289     friend class MultiArcResourceAccessor;
290 
291 public:
292     //! パス名の最大長です。
293     static const int ROOTPATH_MAX = ArcResourceAccessor::ROOTPATH_MAX;
294 
295     //----------------------------------------
296     //! @name コンストラクタ/デストラクタ
297     //@{
298 
299     //! @brief コンストラクタです。
300     //!
301     //! @since 2009/09/18 初版。
302     //!
ArcResourceLink()303     ArcResourceLink()
304     {
305     }
306 
307     //@}
308 
309     //----------------------------------------
310     //! @name 設定/取得
311     //@{
312 
313     //! @brief アーカイブを設定し、初期化します。
314     //!
315     //! @details
316     //! アーカイブのフォーマットが正しくなければ失敗します。
317     //!
318     //! @param archiveStart アーカイブの先頭アドレスです。
319     //! @param resourceRootDirectory リソースのルートディレクトリ名です。
320     //!
321     //! @return アーカイブの設定が成功した場合は true を、失敗した場合は false を返します。
322     //!
323     //! @since 2009/09/18 初版。
324     //!
325     bool Set(
326         void* archiveStart,
327         const char* resourceRootDirectory
328     );
329 
330     //! @brief アーカイブの先頭アドレスを取得します。
331     //!
332     //! @return 設定されているアーカイブの先頭アドレスを返します。
333     //!
334     //! @since 2009/09/18 初版。
335     //!
336     const void* GetArchiveDataStart() const;
337 
338     //! @brief リソースのルートディレクトリ名を取得します。
339     //!
340     //! @return リソースのルートディレクトリ名を返します。
341     //!
342     //! @since 2009/09/18 初版。
343     //!
GetResRootDir()344     const wchar_t* GetResRootDir() const
345     {
346         return m_ResRootDir;
347     }
348 
349     //@}
350 
351     //! :private
352     //! リストのリンク情報です。
353     ut::LinkListNode m_Link;
354 
355 protected:
356     //! @details :private
GetArcHandle()357     ARCHandle* GetArcHandle()
358     {
359         return &m_ArcHandle;
360     }
361 
362     //! @details :private
363     ARCHandle m_ArcHandle;
364 
365     //! @details :private
366     wchar_t m_ResRootDir[ROOTPATH_MAX];
367 };
368 
369 namespace internal
370 {
371 
372 typedef ut::LinkList<ArcResourceLink, offsetof(ArcResourceLink, m_Link)> ArcResourceList;
373 
374 }   // namespace internal
375 
376 //---------------------------------------------------------------------------
377 //! :category リソースアクセサ
378 //!
379 //! @brief 複数のアーカイブリソースにアクセスするためのクラスです。
380 //!
381 //! @since 2009/09/18 初版。
382 //---------------------------------------------------------------------------
383 class MultiArcResourceAccessor : public ResourceAccessor
384 {
385 public:
386     //! パス名の最大長です。
387     static const int ROOTPATH_MAX = ArcResourceAccessor::ROOTPATH_MAX;
388 
389     //----------------------------------------
390     //! @name コンストラクタ/デストラクタ
391     //@{
392 
393     //! @brief コンストラクタです。
394     //!
395     //! @since 2009/09/18 初版。
396     //!
397     MultiArcResourceAccessor();
398 
399     //! @brief デストラクタです。
400     //!
401     //! @since 2009/09/18 初版。
402     //!
403     virtual ~MultiArcResourceAccessor();
404 
405     //@}
406 
407     //----------------------------------------
408     //! @name 設定/取得
409     //@{
410 
411     //! @brief アーカイブ情報を登録します。
412     //!
413     //! @details
414     //! ArcResourceLink を登録します。
415     //!
416     //! @param pLink ArcResourceLinkオブジェクトへのポインタです。
417     //!
418     //! @since 2009/09/18 初版。
419     //!
420     void Attach(ArcResourceLink* pLink);
421 
422     //! @brief 指定したアーカイブデータの登録を解除します。
423     //!
424     //! @param archiveStart アーカイブデータへのポインタ。
425     //!
426     //! @return 登録が解除できた場合、ArcResourceLink オブジェクトへのポインタを
427     //! 返します。解除できなかった場合、NULLを返します。
428     //!
429     //! @since 2009/09/18 初版。
430     //!
431     ArcResourceLink* Detach(const void* archiveStart);
432 
433     //! @brief 指定したアーカイブ情報の登録を解除します。
434     //!
435     //! @details
436     //! ArcResourceLink の登録を解除します。
437     //!
438     //! @param pLink ArcResourceLink オブジェクトへのポインタです。
439     //!
440     //! @since 2009/09/18 初版。
441     //!
442     void Detach(ArcResourceLink* pLink);
443 
444     //! @brief 登録されているすべてのアーカイブ情報を登録解除します。
445     //!
446     //! @sa Detach
447     //!
448     //! @since 2009/09/18 初版。
449     //!
450     void DetachAll();
451 
452     virtual void* GetResource(
453         ResType resType,
454         const char* name,
455         u32* pSize = 0
456     );
457 
458     //! @brief フォントオブジェクトを登録します。
459     //!
460     //! @details
461     //! フォントオブジェクトをリソースアクセサに設定し、
462     //! GetFont() の検索対象に含まれるようにします。
463     //!
464     //! @param name  フォントリソースの名前です。
465     //! @param pFont フォントオブジェクトへのポインタです。
466     //!
467     //! @return 登録キーを返します。キーは登録の抹消に使用します。
468     //!
469     //! @sa UnregistFont
470     //!
471     //! @since 2010/01/26 初版。
472     //!
473     FontKey RegistFont(const char* name, font::Font* pFont);
474 
475     //! @brief フォントオブジェクトの登録を解除します。
476     //!
477     //! @param key  フォントの登録時に取得した登録キーを指定します。
478     //!
479     //! @sa RegistFont
480     //!
481     //! @since 2010/01/26 初版。
482     //!
483     void UnregistFont(FontKey key);
484 
485     //! @brief テクスチャを登録します。
486     //!
487     //! @details
488     //! テクスチャをリソースアクセサに設定し、
489     //! GetTexture() の検索対象に含まれるようにします。
490     //!
491     //! @param name  テクスチャの名前です。
492     //! @param textureInfo テクスチャ情報です。
493     //!
494     //! @return 登録キーを返します。キーは登録の抹消に使用します。
495     //!
496     //! @sa UnregistTexture
497     //!
498     //! @since 2010/01/26 初版。
499     //!
500     TextureKey RegistTexture(const char* name, const TextureInfo& textureInfo);
501 
502     //! @brief テクスチャの登録を解除します。
503     //!
504     //! @param key  テクスチャの登録時に取得した登録キーを指定します。
505     //!
506     //! @sa RegistTexture
507     //!
508     //! @since 2010/01/26 初版。
509     //!
510     void UnregistTexture(TextureKey key);
511 
512     //! @brief テクスチャ情報を取得します。
513     //!
514     //! @details
515     //! name で指定したテクスチャリソース名と関連付けられた
516     //! テクスチャ情報を取得します。
517     //!
518     //! テクスチャを所有していない場合には LoadTexture() でロードを試みます。
519     //!
520     //! @param name テクスチャリソースの名前です。
521     //!
522     //! @return テクスチャ情報を返します。
523     //! テクスチャを所有していない場合にはロードを試みます。
524     //! ロードできなかった場合にはテクスチャオブジェクトには無効な値
525     //! (TextureInfo::INVALID) が設定されます。
526     //!
527     //! @sa LoadTexture
528     //!
529     //! @since 2010/06/18 初版。
530     //!
531     virtual const TextureInfo GetTexture(const char* name);
532 
533     //! @brief フォントを取得します。
534     //!
535     //! @details
536     //! name で指定したフォントリソース名と関連付けられた
537     //! フォントオブジェクトを取得します。
538     //!
539     //! 指定されたフォントが登録されていなかった場合には
540     //! LoadFont() により生成したフォントを登録します。
541     //!
542     //! @param name フォントリソースの名前です。
543     //!
544     //! @return フォントへのポインタを返します。
545     //!
546     //! @sa LoadFont
547     //!
548     //! @since 2010/07/16 初版。
549     //!
550     virtual font::Font* GetFont(const char* name);
551 
552     //! @brief TextureContainer を取得します。
553     //!
554     //! @return
555     //! 登録されたテクスチャを保持する TextureContainer への参照を返します。
556     //!
557     //! @since 2010/12/03 初版。
558     //!
GetTextureContainer()559     TextureContainer& GetTextureContainer()
560     {
561         return m_TextureList;
562     }
563 
564     //! @brief TextureContainer を取得します。
565     //!
566     //! @returns
567     //! 登録されたテクスチャを保持する TextureContainer への参照を返します。
568     //!
569     //! @since 2010/12/03 初版。
570     //!
GetTextureContainer()571     const TextureContainer& GetTextureContainer() const
572     {
573         return m_TextureList;
574     }
575 
576     //! @brief FontContainer を取得します。
577     //!
578     //! @return
579     //! 登録されたフォントを保持する FontContainer への参照を返します。
580     //!
581     //! @since 2010/12/03 初版。
582     //!
GetFontContainer()583     FontContainer& GetFontContainer()
584     {
585         return m_FontList;
586     }
587 
588     //! @brief FontContainer を取得します。
589     //!
590     //! @return
591     //! 登録されたフォントを保持する FontContainer への参照を返します。
592     //!
593     //! @since 2010/12/03 初版。
594     //!
GetFontContainer()595     const FontContainer& GetFontContainer() const
596     {
597         return m_FontList;
598     }
599 
600     //@}
601 
602 protected:
603     //! @details :private
604     internal::ArcResourceList m_ArcList;
605 
606     //! @details :private
607     FontContainer m_FontList;
608 
609     //! @details :private
610     TextureContainer m_TextureList;
611 
612     //! @details :private
613     wchar_t m_ResNameWork[ROOTPATH_MAX];
614 };
615 
616 }   // namespace lyt
617 }   // namespace nw
618 
619 /* NW_LYT_ARCRESOURCEACCESSOR_H_ */
620 #endif
621