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