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