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: 35505 $
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     関数の実行結果を返します。以下に挙げる Result を返します。
746         @retval     ResultSuccess               処理に成功しました。
747      */
PrepareToCloseApplication(void)748     inline Result PrepareToCloseApplication(void)
749     {
750         return detail::PrepareToCloseApplication();
751     }
752 
753     /*!
754         @brief      アプリケーションを終了します。
755         @param[in]  pParam      パラメータバッファ
756         @param[in]  paramSize   パラメータバッファサイズ
757         @param[in]  handle      ハンドル
758         @return     関数の実行結果を返します。以下に挙げる Result を返します。
759         @retval     ResultSuccess               処理に成功しました。
760      */
761     inline Result CloseApplication( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
762     {
763         return detail::CloseApplication( pParam, paramSize, handle );
764     }
765     /*!
766         @}
767      */
768 
769     // Obsolete な関数。
PrepareToClosePreloadedApplication(void)770     inline Result PrepareToClosePreloadedApplication(void)
771     {
772         return detail::PrepareToCloseApplication( true );
773     }
774     inline Result ClosePreloadedApplication( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
775     {
776         return detail::CloseApplication( pParam, paramSize, handle );
777     }
778 
779     //================================================================
780     // ホームメニュー
781     //================================================================
782     /*!
783         @name   ホームメニュー
784         @{
785      */
786     /*! :private
787         @brief      ホームメニューへ移行する準備を行います。
788 
789                     この関数の後に CloseApplication() を呼ぶことでホームメニューへ移行します。
790 
791                     通常アプリケーションがこの関数を呼ぶことはありません。
792 
793         @return     処理結果を返します。
794      */
PrepareToJumpToHomeMenu(void)795     inline Result PrepareToJumpToHomeMenu(void)
796     {
797         return detail::PrepareToJumpToHomeMenu();
798     }
799 
800     /*! :private
801         @brief      ホームメニューへ移行します。
802 
803                     この関数の前に PrepareToJumpToHomeMenu() が呼ばれている必要があります。
804 
805                     この関数を呼んだ後に、WaitForStarting() で起動待ちを行ってください。
806 
807                     通常アプリケーションがこの関数を呼ぶことはありません。
808 
809         @param[in]  pParam      ホームメニューへ送るパラメータバッファ
810         @param[in]  paramSize   ホームメニューへ送るパラメータバッファのサイズ
811         @param[in]  handle      ホームメニューへ送るハンドル
812         @return     処理結果を返します。
813      */
814     inline Result JumpToHomeMenu( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
815     {
816         return detail::JumpToHomeMenu( pParam, paramSize, handle );
817     }
818     /*!
819         @}
820      */
821 
822     //================================================================
823     // アプリケーションジャンプ
824     //================================================================
825     /*!
826         @name   アプリケーションジャンプ
827         @{
828      */
829     inline Result PrepareToJumpToOtherApplication( ProgramId programId, nn::fs::MediaType mediaType=nn::fs::MEDIA_TYPE_NAND )
830     {
831         return detail::PrepareToJumpToOtherApplication( programId, mediaType );
832     }
PrepareToJumpToCallerApplication(void)833     inline Result PrepareToJumpToCallerApplication(void)
834     {
835         return detail::PrepareToJumpToCallerApplication();
836     }
PrepareToJumpToSelfApplication(void)837     inline Result PrepareToJumpToSelfApplication(void)
838     {
839         return detail::PrepareToJumpToSelfApplication();
840     }
841     /*! :private
842         @brief      自身を終了し、他のアプリケーションを起動します。
843         @param[in]  pParam      起動するアプリケーションに渡す DeliverArg バッファ
844         @param[in]  pHmacBuf    起動するアプリケーションに渡す HMAC バッファ
845         @return     処理結果を返します。
846      */
847     inline Result JumpToOtherApplication( const u8 pParam[]=NULL, const u8 pHmacBuf[]=NULL )
848     {
849         return detail::JumpToOtherApplication( pParam, pHmacBuf );
850     }
851     /*! :private
852         @brief      自身を終了し、呼び元のアプリケーションを起動します。
853         @param[in]  pParam      起動するアプリケーションに渡す DeliverArg バッファ
854         @param[in]  pHmacBuf    起動するアプリケーションに渡す HMAC バッファ
855         @return     処理結果を返します。
856      */
857     inline Result JumpToCallerApplication( const u8 pParam[]=NULL, const u8 pHmacBuf[]=NULL )
858     {
859         return detail::JumpToCallerApplication( pParam, pHmacBuf );
860     }
861     /*! :private
862         @brief      自身を終了し、もう一度自身のアプリケーションを起動します。
863 
864                     この自己ジャンプの処理を挟んでも、JumpToCallerApplication() で戻る
865                     呼び元は変わりません。
866 
867         @param[in]  pParam      起動するアプリケーションに渡す DeliverArg バッファ
868         @param[in]  pHmacBuf    起動するアプリケーションに渡す HMAC バッファ
869         @return     処理結果を返します。
870      */
871     inline Result JumpToSelfApplication( const u8 pParam[]=NULL, const u8 pHmacBuf[]=NULL )
872     {
873         return detail::JumpToSelfApplication( pParam, pHmacBuf );
874     }
875     /*!
876         @}
877      */
878 
879     //================================================================
880     // 非公開
881     //================================================================
882     /*! :private
883         @brief      VRAM のシステム領域を退避させます。
884         @return     処理結果を返します。
885      */
SaveVramSysArea(void)886     inline nn::Result SaveVramSysArea(void)
887     {
888         return detail::SaveVramSysArea();
889     }
890 
891     /*! :private
892         @brief      VRAM のシステム領域を復元します。
893         @return     処理結果を返します。
894      */
RestoreVramSysArea(void)895     inline nn::Result RestoreVramSysArea(void)
896     {
897         return detail::RestoreVramSysArea();
898     }
899     /*!
900         @}
901      */
902 
903 }
904 }
905 }
906 
907 /*!
908    @defgroup nn_applet applet
909 
910    @brief  APPLET を扱うモジュールです。
911 
912    @{
913 */
914 
915 #include <nn/util/detail/util_CLibImpl.h>
916 
917 
918 /*! :private
919   @brief   APPLET ライブラリの初期化を行い、APPLET を登録します。
920 
921   @detail  対応する C++ 関数 @ref nn::applet::CTR::Initialize() を参照してください。
922 */
923 NN_EXTERN_C inline nn::Result nnappletInitialize( AppletAttr appletAttr = NN_APPLET_DEFAULT_APPLET_ATTRIBUTE)
924 {
925     return nn::applet::CTR::Initialize(appletAttr);
926 }
927 /*! :private
928     @brief   APPLET ライブラリにおける mutex をロックします。
929 
930     @detail  対応する C++ 関数 @ref nn::applet::CTR::Lock() を参照してください。
931 */
nnappletLock(void)932 NN_EXTERN_C inline void nnappletLock(void)
933 {
934     nn::applet::CTR::Lock();
935 }
936 /*! :private
937     @brief   APPLET ライブラリにおける mutex のロックを試みます。
938 
939     @detail  対応する C++ 関数 @ref nn::applet::CTR::TryLock() を参照してください。
940 */
941 NN_EXTERN_C inline bool nnappletTryLock(nn::fnd::TimeSpan timeout=NN_APPLET_NO_WAIT)
942 {
943     return nn::applet::CTR::TryLock(timeout);
944 }
945 /*! :private
946     @brief   APPLET ライブラリにおける mutex をアンロックします。
947 
948     @detail  対応する C++ 関数 @ref nn::applet::CTR::Unlock() を参照してください。
949 */
nnappletUnlock(void)950 NN_EXTERN_C inline void nnappletUnlock(void)
951 {
952     nn::applet::CTR::Unlock();
953 }
954 
955 //----------------------------------------------------------------
956 /*! :private
957   @brief   登録されている APPLET の数を数えます。
958 
959   @detail  対応する C++ 関数 @ref nn::applet::CTR::CountRegisteredApplet() を参照してください。
960 */
nnappletCountRegisteredApplet(void)961 NN_EXTERN_C inline int nnappletCountRegisteredApplet(void)
962 {
963     return nn::applet::CTR::CountRegisteredApplet();
964 }
965 /*! :private
966   @brief   APPLET が登録されているかを調べます。
967 
968   @detail  対応する C++ 関数 @ref nn::applet::CTR::IsRegistered() を参照してください。
969 */
nnappletIsRegistered(AppletId appletId)970 NN_EXTERN_C inline bool nnappletIsRegistered( AppletId appletId )
971 {
972     return nn::applet::CTR::IsRegistered( appletId );
973 }
974 
975 NN_EXTERN_C inline bool nnappletWaitForRegister( AppletId appletId, nn::fnd::TimeSpan span=NN_APPLET_WAIT_INFINITE )
976 {
977     return nn::applet::CTR::WaitForRegister( appletId, span );
978 }
979 
980     /*!
981   @brief   アプレットが現在動作選択されて active かを調べます。
982 
983   @detail  対応する C++ 関数 @ref nn::applet::CTR::IsActive() を参照してください。
984 */
nnappletIsActive(void)985 NN_EXTERN_C inline bool nnappletIsActive(void)
986 {
987     return nn::applet::CTR::IsActive();
988 }
989 
990 NN_EXTERN_C inline void nnappletAssignGpuRight(bool flag=true)
991 {
992     nn::applet::CTR::AssignGpuRight(flag);
993 }
nnappletReleaseGpuRight(void)994 NN_EXTERN_C inline void nnappletReleaseGpuRight(void)
995 {
996     nn::applet::CTR::AssignGpuRight(false);
997 }
998 
999 /*! :private
1000     @brief   APPLET が現在描画権限を与えられているかを調べます。
1001 
1002     @detail  対応する C++ 関数 @ref nn::applet::CTR::IsGpuRightGiven() を参照してください。
1003 */
nnappletIsGpuRightGiven(void)1004 NN_EXTERN_C inline bool nnappletIsGpuRightGiven(void)
1005 {
1006     return nn::applet::CTR::IsGpuRightGiven();
1007 }
1008 
nnappletAttachTransferMemoryHandle(nn::os::TransferMemoryBlock * transferMemory,nn::Handle handle,size_t size,bit32 otherPermission)1009 NN_EXTERN_C inline void nnappletAttachTransferMemoryHandle( nn::os::TransferMemoryBlock* transferMemory, nn::Handle handle, size_t size, bit32 otherPermission )
1010 {
1011     nn::applet::CTR::AttachTransferMemoryHandle( transferMemory, handle, size, otherPermission );
1012 }
1013 
1014 
1015 /*!
1016     @}
1017 */
1018 
1019 #endif  // ifndef NN_APPLET_CTR_APPLET_API_H_
1020