1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     applet_API.h
4 
5   Copyright (C)2010 Nintendo Co., Ltd.  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   $Rev: 31392 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_APPLET_CTR_APPLET_API_H_
17 #define NN_APPLET_CTR_APPLET_API_H_
18 
19 #include <nn/os.h>
20 #include <nn/applet/CTR/applet_Parameters.h>
21 
22 #include <nn/gx.h>
23 #include <nn/hid.h>
24 #include <nn/fs/fs_Parameters.h>
25 
26 /*! @file
27     @blief APPLET に関する API の宣言
28 */
29 namespace nn {
30 namespace applet {
31 namespace CTR {
32 namespace detail {
33 
34     using namespace nn::applet::CTR;
35 
36     //---- 初期化・終了
37     Result Initialize( AppletAttr appletAttr = DEFAULT_APPLET_ATTRIBUTE );
38     void   Enable(bool isSleepEnabled=true);
39 
40     void   Lock(void);
41     bool   TryLock( nn::fnd::TimeSpan timeout=NO_WAIT);
42     void   Unlock(void);
43 
44     int    CountRegisteredApplet(void);
45     bool   IsRegistered( AppletId appletId );
46     bool   WaitForRegister( AppletId appletId, nn::fnd::TimeSpan span );
47     bool   IsActive(void);
48     void   SetActive(void);
49     void   SetInactive(void);
50     nn::Result SaveVramSysArea(void);
51     nn::Result RestoreVramSysArea(void);
52 
53     //================
54     // GPU権利
55     void   AssignGpuRight( bool flag=true );
ReleaseGpuRight(void)56     inline void ReleaseGpuRight(void)
57     {
58         AssignGpuRight(false);
59     }
60     bool   IsGpuRightGiven(void);
61 
62     //================
63     // DSP権利
64     void   AssignDspRight( bool flag = true );
ReleaseDspRight(void)65     inline void ReleaseDspRight( void )
66     {
67         AssignDspRight(false);
68     }
69     //================
70     // CAMERAの起動制御
71     void   AssignCameraRight( bool flag = true );
ReleaseCameraRight(void)72     inline void ReleaseCameraRight( void )
73     {
74         AssignCameraRight(false);
75     }
76 
77     //================
78     // sheredMemory のアタッチ
79     void AttachTransferMemoryHandle( os::TransferMemoryBlock* transferMemory, nn::Handle handle, size_t size, bit32 otherPermission );
80 
81     //================
82     // アプレットへのユーザメッセージ送り
83     Result SendMessage( AppletId receiverId, const u8* pParam, size_t paramSize, nn::Handle handle=NN_APPLET_HANDLE_NONE, nn::fnd::TimeSpan timeout=WAIT_INFINITE );
84     Result TrySendMessage( AppletId receiverId, const u8* pParam, size_t paramSize, nn::Handle handle=NN_APPLET_HANDLE_NONE );
85 
86 
87     //================
88     // ホームボタン状態
89     AppletHomeButtonState GetAbsoluteHomeButtonState(void);
90     void ClearAbsoluteHomeButtonState(void);
91 
92     // シャットダウン通知状態
93     AppletShutdownState GetShutdownState(void);
94     void ClearShutdownState(void);
95 
96     // 電源ボタンクリック通知
97     AppletPowerButtonState GetPowerButtonState(void);
98     void ClearPowerButtonState(void);
99 
100     //================
101     // ライブラリアプレットのプリロード
102     Result PreloadLibraryApplet( AppletId id );
103 
104     // ライブラリアプレット起動
105     Result PrepareToStartLibraryApplet( AppletId id );
106     Result StartLibraryApplet( AppletId id, const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE );
107 
108     // 起動キャンセル
109     Result CancelLibraryApplet( bool isApplicationEnd=false );
110     Result CancelLibraryAppletIfRegistered( bool isApplicationEnd=false );
111 
112     // アプリケーション終了
113     Result PrepareToCloseApplication( bool isCancelPreload=false );
114     Result CloseApplication( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE );
115 
116     // ホームメニュー移行準備
117     Result PrepareToJumpToHomeMenu(void);
118     Result JumpToHomeMenu( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE );
119 
120     // アプリケーションジャンプ
121     Result PrepareToJumpToOtherApplication( ProgramId programId, nn::fs::MediaType mediaType=nn::fs::MEDIA_TYPE_NAND );
122     Result PrepareToJumpToCallerApplication(void);
123     Result PrepareToJumpToSelfApplication(void);
124     Result JumpToOtherApplication(  const u8 pParam[], const u8 pHmacBuf[] );
125     Result JumpToCallerApplication( const u8 pParam[], const u8 pHmacBuf[] );
126     Result JumpToSelfApplication(   const u8 pParam[], const u8 pHmacBuf[] );
127 
128 
129     //================
130     // 引数受け取り
131     bool ReceiveDeliverArg( u8 pParam[], u8 pHmacBuf[], bit32* pUniqueId );
132     AppletWakeupState GetInitialWakeupState(void);
133     bool GetInitialParam( u8* pParam, size_t paramSize, s32* pReadSize );
134 
135     //================
136     Result GetSharedFont(Handle* pHandle, uptr* pAddr);
137     Result GetWirelessRebootInfo(u8* pInfo, size_t size);
138     Result Wrap(void* pWrappedBuffer, const void* pData, size_t dataSize, s32 idOffset, size_t idSize);
139     Result Unwrap(void* pData, const void* pWrapped, size_t wrappedSize, s32 idOffset, size_t idSize);
140 }
141 }
142 }
143 }
144 
145 namespace nn {
146 namespace applet {
147 namespace CTR {
148 
149     using namespace nn::applet::CTR;
150 
151     //================================================================
152     // 初期化
153     //================================================================
154     /*!
155         @name   初期化
156         @{
157      */
158     /*!
159         @brief      APPLET ライブラリの初期化を行います。
160 
161         @param[in]  appletAttr  アプレットライブラリを初期化する際のオプションです。指定せずにデフォルト引数を使ってください。
162         @return     初期化処理の結果を返します。
163      */
164     inline Result Initialize(AppletAttr appletAttr = NN_APPLET_DEFAULT_APPLET_ATTRIBUTE )
165     {
166         return detail::Initialize( appletAttr );
167     }
168     /*!
169         @brief      アプレットライブラリに関する機能を有効にします。
170 
171         @param[in]  isSleepEnabled  スリープを可能にするかどうかを指定するオプションです。
172         @return     なし。
173      */
174     inline void Enable(bool isSleepEnabled=true)
175     {
176         detail::Enable(isSleepEnabled);
177     }
178     /*!
179         @}
180      */
181 
182     //================================================================
183     // 排他制御
184     //================================================================
185     /*!
186         @name   排他制御
187         @{
188      */
189     /*! :private
190         @brief      APPLET ライブラリにおける mutex をロックします。
191      */
Lock(void)192     inline void Lock(void)
193     {
194         detail::Lock();
195     }
196 
197     /*! :private
198         @brief      APPLET ライブラリにおける mutex のロックを試みます。
199 
200                     timeout は ロックできなかった場合に待つ時間の最大値です。
201                     0 (NN_APPLET_NO_WAIT) を指定すると即座に終了します。
202 
203         @param[in]  timeout     タイムアウト時間を指定します。
204 
205         @return     ロックできれば true を、出来なければ false を返します。
206      */
207     inline bool TryLock(nn::fnd::TimeSpan timeout = NN_APPLET_NO_WAIT)
208     {
209         return detail::TryLock(timeout);
210     }
211 
212     /*! :private
213         @brief      APPLET ライブラリにおける mutex をアンロックします。
214      */
Unlock(void)215     inline void Unlock(void)
216     {
217         detail::Unlock();
218     }
219     /*!
220         @}
221      */
222 
223     //================================================================
224     // 情報取得
225     //================================================================
226     /*!
227         @name   情報取得
228         @{
229      */
230     /*!
231         @brief      DeliverArg および HMAC 情報、送信 UniqueId を取得します。
232 
233         @param[out] pParam      受信用 DeliverArg バッファ
234         @param[out] pHmacBuf    受信用 HMAC バッファ
235         @param[out] pUniqueId   受信用 送信UniqueId バッファ
236     */
ReceiveDeliverArg(u8 pParam[],u8 pHmacBuf[],bit32 * pUniqueId)237     inline bool ReceiveDeliverArg( u8 pParam[], u8 pHmacBuf[], bit32* pUniqueId )
238     {
239         return detail::ReceiveDeliverArg( pParam, pHmacBuf, pUniqueId );
240     }
241 
242     /*!
243         @brief      アプリケーション起動時の Wakeup情報を取得します。
244 
245                     アプリケーションは、applet::Initialize() の中で一旦ウェイト状態になり、
246                     起床されるのを待ちます。
247                     起床したときに、どのような起こされ方をしたかを Wakeup情報( AppletWakeupState 列挙型 )
248                     として取得することが出来ます。
249 
250                     ここで取得する可能性のある値は applet::WAKEUP_TO_START (通常の起動要求)、
251                     applet::WAKEUP_BY_CANCEL (終了要求による起床)、
252                     applet::WAKEUP_BY_POWER_BUTTON_CLICK (電源ボタン押しによる起床)
253                     があります。
254 
255                     このうち applet::WAKEUP_BY_CANCEL、applet::WAKEUP_BY_POWER_BUTTON_CLICK であった
256                     場合は、すぐにアプリケーションを終了してください。
257 
258                     アプリケーション終了については
259                     applet::PrepareToClosePreloadedApplication() と
260                     applet::ClosePreloadedApplication() (この関数からは戻りません)
261                     を参照してください。
262 
263         @return     アプリケーション起動時の Wakeup情報
264     */
GetInitialWakeupState(void)265     inline AppletWakeupState GetInitialWakeupState(void)
266     {
267         return detail::GetInitialWakeupState();
268     }
269 
270     // 初期パラメータを取得
271     // (未使用)
GetInitialParam(u8 * pParam,size_t paramSize,s32 * pReadSize)272     inline bool GetInitialParam( u8* pParam, size_t paramSize, s32* pReadSize )
273     {
274         return detail::GetInitialParam( pParam, paramSize, pReadSize );
275     }
276 
277 
278     /*! :private
279         @brief      登録されている APPLET の数を数えます。
280 
281                     アプリケーション自体も 1 つと数えます。
282 
283         @return     登録されている APPLET の数を返します。
284      */
CountRegisteredApplet(void)285     inline int CountRegisteredApplet(void)
286     {
287         return detail::CountRegisteredApplet();
288     }
289 
290     /*! :private
291         @brief      指定した ID のアプレットが登録されているか確認します。
292         @param[in]  appletId    アプレット ID
293         @return     登録されていれば true を、されていなければ false 返します。
294      */
IsRegistered(AppletId appletId)295     inline bool IsRegistered( AppletId appletId )
296     {
297         return detail::IsRegistered( appletId );
298     }
299 
300     /*!
301         @brief      アプリケーションが現在動作中かを調べます。
302 
303         @detail     アプリケーションプログラムが動作しているときは active ですが、
304                     ライブラリアプレットを呼び出したり、ホームメニューに遷移して、
305                     動作が中断されているときは activeではありません。
306 
307                     コールバックなどは activeでなくても呼び出されます。
308                     例えばスリープ問い合わせコールバックもその一つです。
309                     そのコールバック中で、現在アプリケーションが動作中かを
310                     判定するのにもこの関数を使用することができます。
311 
312         @return     active ならば true を、そうでないならば false を返します。
313      */
IsActive(void)314     inline bool IsActive(void)
315     {
316         return detail::IsActive();
317     }
318 
319     /*! :private
320         @brief      アプリケーションをアクティブにします。
321 
322                     アプリケーションが自ら呼ぶことは行わないでください。
323      */
SetActive(void)324     inline void SetActive(void)
325     {
326         detail::SetActive();
327     }
328 
329     /*! :private
330         @brief      アプリケーションを非アクティブにします。
331 
332                     アプリケーションが自ら呼ぶことは行わないでください。
333     */
SetInactive(void)334     inline void SetInactive(void)
335     {
336         detail::SetInactive();
337     }
338 
339     /*! :private
340         @brief      アプリケーションがライブラリの初期化を行ったか取得します。
341 
342         @return     初期化済みならば true を返します。
343      */
344     bool IsInitialized();
345 
346     /*! :private
347         @brief      アプリケーションのアプレット ID を取得します。
348                     アプリケーションでは返る値が固定です。
349 
350         @return     アプレット ID を返します。
351      */
352     AppletId   GetId(void);
353 
354     /*! :private
355         @brief      アプリケーションのアプレットアトリビュートを取得します。
356 
357                     取得できるのは Initialize() 時に指定したアトリビュートとなります。
358 
359         @return     アトリビュートを返します。
360      */
361     AppletAttr GetAttribute(void);
362     /*!
363         @}
364      */
365 
366     // :private
367     AppletAttr GetAppletType(void);
368 
369     //================================================================
370     // 動作制御
371     //================================================================
372     /*!
373         @name   動作制御
374         @{
375      */
376     /*!
377         @brief      指定した ID のアプレットが登録されるのを、指定時間だけ待ちます。
378 
379                     NN_APPLET_WAIT_INFINITE を指定した場合は、登録完了まで待ちます。
380                     すなわち返り値は必ず true となります。
381 
382                     NN_APPLET_NO_WAIT を指定した場合は、処理がすぐに戻ります。
383                     登録されていたかどうかで返り値は true か false になります。
384 
385         @param[in]  appletId    アプレット ID
386         @param[in]  span        待ち時間の上限
387         @return     登録されていれば true を、されていなければ false を返します。
388      */
389     inline bool WaitForRegister( AppletId appletId, nn::fnd::TimeSpan span = NN_APPLET_WAIT_INFINITE )
390     {
391         return detail::WaitForRegister( appletId, span );
392     }
393 
394     //================================================================
395     // 描画権
396     //================================================================
397     /*!
398         @name   描画権
399         @{
400      */
401     /*! :private
402         @brief      アプリケーションが描画権限を与えられているかを調べます。
403 
404         @return     描画権限を与えられていれば true を、そうでなければ false を返します。
405      */
IsGpuRightGiven(void)406     inline bool IsGpuRightGiven(void)
407     {
408         return detail::IsGpuRightGiven();
409     }
410 
411     /*!
412         @brief      アプリケーションが描画することを宣言します。
413 
414                     この関数は、ライブラリアプレットやホームメニューなどから切り替わった後に、
415                     自らが描画を行うことを宣言するものです。
416 
417                     通常、アプリケーションが呼ぶ必要はありません。
418 
419         @param[in]  flag        true なら描画権限を取得、false なら描画権限を放棄
420      */
421     inline void AssignGpuRight( bool flag = true )
422     {
423         detail::AssignGpuRight(flag);
424     }
425 
426     /*!
427         @brief      アプリケーションが他のプログラムに描画を切り替えることを宣言します。
428 
429                     この関数は、ライブラリアプレットやホームメニューなどに切り替わる際に、
430                     アプリケーションでの描画をやめることを宣言するものです。
431 
432                     通常、アプリケーションが呼ぶ必要はありません。
433      */
ReleaseGpuRight(void)434     inline void ReleaseGpuRight(void)
435     {
436         detail::AssignGpuRight(false);
437     }
438     /*!
439         @}
440      */
441 
442     //================================================================
443     // DSP使用権
444     //================================================================
445     /*!
446         @name   DSP使用権
447         @{
448      */
449     /*! :private
450         @brief      DSP の使用権を取得、放棄します。
451 
452                     必要に応じて、内部で DSP 処理を中断、再開します。
453 
454                     通常、アプリケーションが呼ぶ必要はありません。
455 
456         @param[in]  flag        true なら再開、false なら中断
457      */
458     inline void AssignDspRight( bool flag = true )
459     {
460         detail::AssignDspRight(flag);
461     }
462 
463     /*! :private
464         @brief      DSP の使用権を放棄します。
465 
466                     必要に応じて、内部で DSP での処理を一時中断します。
467 
468                     通常、アプリケーションが呼ぶ必要はありません。
469      */
ReleaseDspRight(void)470     inline void ReleaseDspRight( void )
471     {
472         detail::AssignDspRight(false);
473     }
474     /*!
475         @}
476      */
477 
478     /*! :private
479         @brief      共有メモリハンドルをアタッチします。
480         @param[out] transferMemory    共有メモリブロックポインタ
481         @param[in]  handle          ハンドル
482         @param[in]  size            共有メモリのサイズ
483         @param[in]  readOnly        読み取り専用フラグ
484      */
AttachTransferMemoryHandle(os::TransferMemoryBlock * transferMemory,nn::Handle handle,size_t size,bit32 otherPermission)485     inline void AttachTransferMemoryHandle( os::TransferMemoryBlock* transferMemory, nn::Handle handle, size_t size, bit32 otherPermission )
486     {
487         detail::AttachTransferMemoryHandle( transferMemory, handle, size, otherPermission );
488     }
489 
490     //================================================================
491     // CAMERAの起動制御
492     //================================================================
493     /*!
494         @name   CAMERAの起動制御
495         @{
496      */
497     /*! :private
498         @brief      CAMERA を Release 前の状態に戻します。
499      */
500     inline void AssignCameraRight( bool flag = true )
501     {
502         detail::AssignCameraRight(flag);
503     }
504 
505     /*! :private
506         @brief      CAMERA をスタンバイ状態に落とします。
507      */
ReleaseCameraRight(void)508     inline void ReleaseCameraRight( void )
509     {
510         detail::AssignCameraRight(false);
511     }
512     /*!
513         @}
514      */
515 
516     //================================================================
517     // メッセージ
518     //================================================================
519     /*!
520         @name   メッセージ
521         @{
522      */
523     /*! :private
524         @brief      アプレットへのメッセージ送信を行います。
525         @param[in]  receiverId  宛先のアプレット ID
526         @param[in]  pParam      アプレットへ送るパラメータバッファ
527         @param[in]  paramSize   アプレットへ送るパラメータバッファのサイズ
528         @param[in]  handle      アプレットへ送るハンドル
529         @param[in]  timeout     タイムアウト時間
530         @return     処理結果を返します。
531      */
532     inline Result SendMessage( AppletId receiverId, const u8* pParam, size_t paramSize, nn::Handle handle=NN_APPLET_HANDLE_NONE, nn::fnd::TimeSpan timeout=WAIT_INFINITE )
533     {
534         return detail::SendMessage( receiverId, pParam, paramSize, handle, timeout );
535     }
536 
537     /*! :private
538         @brief      アプレットへのメッセージ送信を行います。
539         @param[in]  receiverId  宛先のアプレット ID
540         @param[in]  pParam      アプレットへ送るパラメータバッファ
541         @param[in]  paramSize   アプレットへ送るパラメータバッファサイズ
542         @param[in]  handle      アプレットへ送るハンドル
543         @return     処理結果を返します。
544      */
545     inline Result TrySendMessage( AppletId receiverId, const u8* pParam, size_t paramSize, nn::Handle handle=NN_APPLET_HANDLE_NONE )
546     {
547         return detail::TrySendMessage( receiverId, pParam, paramSize, handle );
548     }
549     /*!
550         @}
551      */
552 
553     /*! :private
554         @brief      現在のホームボタンの状態を取得します。
555 
556                     GetHomeButtonState 関数よりも正確な値が得られます。
557                     通常、アプリケーションがこの関数を用いることはありません。
558 
559         @return     状態を返します。
560      */
GetAbsoluteHomeButtonState(void)561     inline AppletHomeButtonState GetAbsoluteHomeButtonState(void)
562     {
563         return detail::GetAbsoluteHomeButtonState();
564     }
565     /*! :private
566         @brief      ホームボタンの状態をクリアします。
567 
568                     通常、アプリケーションがこの関数を用いることはありません。
569      */
ClearAbsoluteHomeButtonState(void)570     inline void ClearAbsoluteHomeButtonState(void)
571     {
572         return detail::ClearAbsoluteHomeButtonState();
573     }
574 
575     //================================================================
576     // シャットダウン
577     //================================================================
578     /*!
579         @name   シャットダウン
580         @{
581      */
582     /*! :private
583         @brief      シャットダウン状態を取得します。
584         @return     状態を返します。
585      */
GetShutdownState(void)586     inline AppletShutdownState GetShutdownState(void)
587     {
588         return detail::GetShutdownState();
589     }
590 
591     /*! :private
592         @brief      シャットダウン状態をクリアします。
593      */
ClearShutdownState(void)594     inline void ClearShutdownState(void)
595     {
596         detail::ClearShutdownState();
597     }
598     /*!
599         @}
600      */
601 
602     //================================================================
603     // 電源ボタン
604     //================================================================
605     /*!
606         @name   電源ボタン
607         @{
608      */
609     /*! :private
610         @brief      電源ボタンの状態を取得します。
611 
612         @return     状態を返します。
613                     取得できる状態は applet::POWER_BUTTON_STATE_NONE (電源ボタンは押されていない)、
614                     applet::POWER_BUTTON_STATE_CLICK (電源ボタンがクリックされた) です。
615 
616                     アプリケーションはこの値を調べるのではなく、
617                     IsExpectedToProcessPowerButton() を用いてください。
618      */
GetPowerButtonState(void)619     inline AppletPowerButtonState GetPowerButtonState(void)
620     {
621         return detail::GetPowerButtonState();
622     }
623 
624     /*! :private
625         @brief      電源ボタンの状態をクリアします。
626      */
ClearPowerButtonState(void)627     inline void ClearPowerButtonState(void)
628     {
629         detail::ClearPowerButtonState();
630     }
631 
632     /*!
633         @brief      電源ボタンの状態を調べます。
634 
635                     返り値が true になったときは、電源ボタンがクリックされたことを示します。
636                     その場合、アプリケーションは速やかに終了してください。
637 
638                     false だった場合は電源ボタンのクリックを検出していないので何も行わないで
639                     ください。
640 
641                     この関数は定期的に(通常、毎フレーム)呼び出してください。
642 
643         @return     状態を返します。
644 
645                     true の場合は電源ボタンがクリックされたことを、
646                     false の場合は電源ボタンが押されていないことを示します。
647      */
IsExpectedToProcessPowerButton(void)648     inline bool IsExpectedToProcessPowerButton(void)
649     {
650         return ( GetPowerButtonState() != POWER_BUTTON_STATE_NONE )? true: false;
651     }
652     /*!
653         @}
654      */
655 
656     //================================================================
657     // ライブラリアプレット・プリロードと終了
658     //================================================================
659     /*!
660         @name   ライブラリアプレットのプリロードと終了
661         @{
662      */
663     /*! :private
664         @brief      起動するライブラリアプレットのプリロードを行います。
665 
666                     プリロード完了まで待つ場合は WaitForLibraryAppletPreloaded() を
667                     呼んで下さい。
668 
669                     通常アプリケーションがこの関数を直接呼ぶことはありません。
670 
671         @param[in]  id          ライブラリアプレットのアプレット ID
672         @return     処理結果を返します。
673      */
PreloadLibraryApplet(AppletId id)674     inline Result PreloadLibraryApplet( AppletId id )
675     {
676         return detail::PreloadLibraryApplet(id);
677     }
678 
679     /*! :private
680         @brief      プリロードされているライブラリアプレットを終了します。
681 
682                     ライブラリアプレットがあるときだけ終了します。
683                     ないときに呼び出しても構いません。
684 
685                     通常アプリケーションがこの関数を呼ぶことはありません。
686 
687         @return     処理結果を返します。
688      */
689     inline Result CancelLibraryAppletIfRegistered( bool isApplicationEnd=false )
690     {
691         return detail::CancelLibraryAppletIfRegistered( isApplicationEnd );
692     }
693     /*!
694         @}
695      */
696 
697     //================================================================
698     // ライブラリアプレット・起動
699     //================================================================
700     /*!
701         @name   ライブラリアプレット起動
702         @{
703      */
704     /*! :private
705         @brief      ライブラリアプレットを起動する準備を行います。
706 
707                     ライブラリアプレットを呼び出す準備を行う関数です。
708 
709                     この関数が呼ばれた後に StartLibraryApplet() を呼ぶことでライブラリアプレットを起動します。
710 
711                     通常アプリケーションがこの関数を呼ぶことはありません。
712 
713         @param[in]  id          ライブラリアプレットのアプレット ID
714         @return     処理結果を返します。
715      */
PrepareToStartLibraryApplet(AppletId id)716     inline Result PrepareToStartLibraryApplet( AppletId id )
717     {
718         return detail::PrepareToStartLibraryApplet(id);
719     }
720 
721     /*! :private
722         @brief      ライブラリアプレットを起動します。
723 
724                     ライブラリアプレットを呼び出す関数です。
725 
726                     この関数の前に PrepareToStartLibraryApplet() が呼ばれている必要があります。
727 
728                     この関数を呼んだ後に、WaitForStarting() で起動待ちを行ってください。
729 
730                     通常アプリケーションがこの関数を呼ぶことはありません。
731 
732         @param[in]  id          ライブラリアプレットのアプレット ID
733         @param[in]  pParam      ライブラリアプレットに送るパラメータバッファ
734         @param[in]  paramSize   ライブラリアプレットに送るパラメータバッファサイズ
735         @param[in]  handle      ライブラリアプレットに送るハンドル
736         @return     処理結果を返します。
737      */
738     inline Result StartLibraryApplet( AppletId id, const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
739     {
740         return detail::StartLibraryApplet(id, pParam, paramSize, handle);
741     }
742 
743     /*!
744         @}
745      */
746 
747     //================================================================
748     // アプリケーション終了
749     //================================================================
750     /*!
751         @name   アプリケーション終了
752         @{
753      */
754     /*!
755         @brief      アプリケーションを終了する準備を行います。
756 
757                     この関数の後に CloseApplication() を呼び出すことでアプリケーションが終了します。
758 
759                     ホームメニューなどシステム側に遷移する場合、その対象がまだ読み込まれて
760                     いなければこの関数で読み込みを行います。
761 
762         @return     処理結果を返します。
763      */
PrepareToCloseApplication(void)764     inline Result PrepareToCloseApplication(void)
765     {
766         return detail::PrepareToCloseApplication();
767     }
768 
769     /*!
770         @brief      アプリケーションを終了します。
771 
772                     この関数の前に PrepareToCloseApplication() が呼ばれている必要があります。
773 
774                     この関数からは戻ってきません。
775 
776         @param[in]  pParam      パラメータバッファ
777         @param[in]  paramSize   パラメータバッファサイズ
778         @param[in]  handle      ハンドル
779         @return     処理結果を返します。
780      */
781     inline Result CloseApplication( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
782     {
783         return detail::CloseApplication( pParam, paramSize, handle );
784     }
785     /*!
786         @}
787      */
788 
PrepareToClosePreloadedApplication(void)789     inline Result PrepareToClosePreloadedApplication(void)
790     {
791         return detail::PrepareToCloseApplication( true );
792     }
793     inline Result ClosePreloadedApplication( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
794     {
795         return detail::CloseApplication( pParam, paramSize, handle );
796     }
797 
798     //================================================================
799     // ホームメニュー
800     //================================================================
801     /*!
802         @name   ホームメニュー
803         @{
804      */
805     /*! :private
806         @brief      ホームメニューへ移行する準備を行います。
807 
808                     この関数の後に CloseApplication() を呼ぶことでホームメニューへ移行します。
809 
810                     通常アプリケーションがこの関数を呼ぶことはありません。
811 
812         @return     処理結果を返します。
813      */
PrepareToJumpToHomeMenu(void)814     inline Result PrepareToJumpToHomeMenu(void)
815     {
816         return detail::PrepareToJumpToHomeMenu();
817     }
818 
819     /*! :private
820         @brief      ホームメニューへ移行します。
821 
822                     この関数の前に PrepareToJumpToHomeMenu() が呼ばれている必要があります。
823 
824                     この関数を呼んだ後に、WaitForStarting() で起動待ちを行ってください。
825 
826                     通常アプリケーションがこの関数を呼ぶことはありません。
827 
828         @param[in]  pParam      ホームメニューへ送るパラメータバッファ
829         @param[in]  paramSize   ホームメニューへ送るパラメータバッファのサイズ
830         @param[in]  handle      ホームメニューへ送るハンドル
831         @return     処理結果を返します。
832      */
833     inline Result JumpToHomeMenu( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
834     {
835         return detail::JumpToHomeMenu( pParam, paramSize, handle );
836     }
837     /*!
838         @}
839      */
840 
841     //================================================================
842     // アプリケーションジャンプ
843     //================================================================
844     /*!
845         @name   アプリケーションジャンプ
846         @{
847      */
848     inline Result PrepareToJumpToOtherApplication( ProgramId programId, nn::fs::MediaType mediaType=nn::fs::MEDIA_TYPE_NAND )
849     {
850         return detail::PrepareToJumpToOtherApplication( programId, mediaType );
851     }
PrepareToJumpToCallerApplication(void)852     inline Result PrepareToJumpToCallerApplication(void)
853     {
854         return detail::PrepareToJumpToCallerApplication();
855     }
PrepareToJumpToSelfApplication(void)856     inline Result PrepareToJumpToSelfApplication(void)
857     {
858         return detail::PrepareToJumpToSelfApplication();
859     }
860     /*! :private
861         @brief      自身を終了し、他のアプリケーションを起動します。
862         @param[in]  pParam      起動するアプリケーションに渡す DeliverArg バッファ
863         @param[in]  pHmacBuf    起動するアプリケーションに渡す HMAC バッファ
864         @return     処理結果を返します。
865      */
866     inline Result JumpToOtherApplication( const u8 pParam[]=NULL, const u8 pHmacBuf[]=NULL )
867     {
868         return detail::JumpToOtherApplication( pParam, pHmacBuf );
869     }
870     /*! :private
871         @brief      自身を終了し、呼び元のアプリケーションを起動します。
872         @param[in]  pParam      起動するアプリケーションに渡す DeliverArg バッファ
873         @param[in]  pHmacBuf    起動するアプリケーションに渡す HMAC バッファ
874         @return     処理結果を返します。
875      */
876     inline Result JumpToCallerApplication( const u8 pParam[]=NULL, const u8 pHmacBuf[]=NULL )
877     {
878         return detail::JumpToCallerApplication( pParam, pHmacBuf );
879     }
880     /*! :private
881         @brief      自身を終了し、もう一度自身のアプリケーションを起動します。
882 
883                     この自己ジャンプの処理を挟んでも、JumpToCallerApplication() で戻る
884                     呼び元は変わりません。
885 
886         @param[in]  pParam      起動するアプリケーションに渡す DeliverArg バッファ
887         @param[in]  pHmacBuf    起動するアプリケーションに渡す HMAC バッファ
888         @return     処理結果を返します。
889      */
890     inline Result JumpToSelfApplication( const u8 pParam[]=NULL, const u8 pHmacBuf[]=NULL )
891     {
892         return detail::JumpToSelfApplication( pParam, pHmacBuf );
893     }
894     /*!
895         @}
896      */
897 
898     //================================================================
899     // 非公開
900     //================================================================
901     /*! :private
902         @brief      VRAM のシステム領域を退避させます。
903         @return     処理結果を返します。
904      */
SaveVramSysArea(void)905     inline nn::Result SaveVramSysArea(void)
906     {
907         return detail::SaveVramSysArea();
908     }
909 
910     /*! :private
911         @brief      VRAM のシステム領域を復元します。
912         @return     処理結果を返します。
913      */
RestoreVramSysArea(void)914     inline nn::Result RestoreVramSysArea(void)
915     {
916         return detail::RestoreVramSysArea();
917     }
918     /*!
919         @}
920      */
921 
922 }
923 }
924 }
925 
926 /*!
927    @defgroup nn_applet applet
928 
929    @brief  APPLET を扱うモジュールです。
930 
931    @{
932 */
933 
934 #include <nn/util/detail/util_CLibImpl.h>
935 
936 
937 /*!
938   @brief   APPLET ライブラリの初期化を行い、APPLET を登録します。
939 
940   @detail  対応する C++ 関数 @ref nn::applet::CTR::Initialize() を参照してください。
941 */
942 NN_EXTERN_C inline nn::Result nnappletInitialize( AppletAttr appletAttr = NN_APPLET_DEFAULT_APPLET_ATTRIBUTE)
943 {
944     return nn::applet::CTR::Initialize(appletAttr);
945 }
946 /*! :private
947     @brief   APPLET ライブラリにおける mutex をロックします。
948 
949     @detail  対応する C++ 関数 @ref nn::applet::CTR::Lock() を参照してください。
950 */
nnappletLock(void)951 NN_EXTERN_C inline void nnappletLock(void)
952 {
953     nn::applet::CTR::Lock();
954 }
955 /*! :private
956     @brief   APPLET ライブラリにおける mutex のロックを試みます。
957 
958     @detail  対応する C++ 関数 @ref nn::applet::CTR::TryLock() を参照してください。
959 */
960 NN_EXTERN_C inline bool nnappletTryLock(nn::fnd::TimeSpan timeout=NN_APPLET_NO_WAIT)
961 {
962     return nn::applet::CTR::TryLock(timeout);
963 }
964 /*! :private
965     @brief   APPLET ライブラリにおける mutex をアンロックします。
966 
967     @detail  対応する C++ 関数 @ref nn::applet::CTR::Unlock() を参照してください。
968 */
nnappletUnlock(void)969 NN_EXTERN_C inline void nnappletUnlock(void)
970 {
971     nn::applet::CTR::Unlock();
972 }
973 
974 //----------------------------------------------------------------
975 /*! :private
976   @brief   登録されている APPLET の数を数えます。
977 
978   @detail  対応する C++ 関数 @ref nn::applet::CTR::CountRegisteredApplet() を参照してください。
979 */
nnappletCountRegisteredApplet(void)980 NN_EXTERN_C inline int nnappletCountRegisteredApplet(void)
981 {
982     return nn::applet::CTR::CountRegisteredApplet();
983 }
984 /*! :private
985   @brief   APPLET が登録されているかを調べます。
986 
987   @detail  対応する C++ 関数 @ref nn::applet::CTR::IsRegistered() を参照してください。
988 */
nnappletIsRegistered(AppletId appletId)989 NN_EXTERN_C inline bool nnappletIsRegistered( AppletId appletId )
990 {
991     return nn::applet::CTR::IsRegistered( appletId );
992 }
993 
994 NN_EXTERN_C inline bool nnappletWaitForRegister( AppletId appletId, nn::fnd::TimeSpan span=NN_APPLET_WAIT_INFINITE )
995 {
996     return nn::applet::CTR::WaitForRegister( appletId, span );
997 }
998 
999     /*!
1000   @brief   APPLET が現在動作選択されて active かを調べます。
1001 
1002   @detail  対応する C++ 関数 @ref nn::applet::CTR::IsActive() を参照してください。
1003 */
nnappletIsActive(void)1004 NN_EXTERN_C inline bool nnappletIsActive(void)
1005 {
1006     return nn::applet::CTR::IsActive();
1007 }
1008 
1009 NN_EXTERN_C inline void nnappletAssignGpuRight(bool flag=true)
1010 {
1011     nn::applet::CTR::AssignGpuRight(flag);
1012 }
nnappletReleaseGpuRight(void)1013 NN_EXTERN_C inline void nnappletReleaseGpuRight(void)
1014 {
1015     nn::applet::CTR::AssignGpuRight(false);
1016 }
1017 
1018 /*! :private
1019     @brief   APPLET が現在描画権限を与えられているかを調べます。
1020 
1021     @detail  対応する C++ 関数 @ref nn::applet::CTR::IsGpuRightGiven() を参照してください。
1022 */
nnappletIsGpuRightGiven(void)1023 NN_EXTERN_C inline bool nnappletIsGpuRightGiven(void)
1024 {
1025     return nn::applet::CTR::IsGpuRightGiven();
1026 }
1027 
nnappletAttachTransferMemoryHandle(nn::os::TransferMemoryBlock * transferMemory,nn::Handle handle,size_t size,bit32 otherPermission)1028 NN_EXTERN_C inline void nnappletAttachTransferMemoryHandle( nn::os::TransferMemoryBlock* transferMemory, nn::Handle handle, size_t size, bit32 otherPermission )
1029 {
1030     nn::applet::CTR::AttachTransferMemoryHandle( transferMemory, handle, size, otherPermission );
1031 }
1032 
1033 
1034 /*!
1035     @}
1036 */
1037 
1038 #endif  // ifndef NN_APPLET_CTR_APPLET_API_H_
1039