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