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: 33198 $
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     登録されていれば 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 
385                     この関数は、ライブラリアプレットやホームメニューなどから切り替わった後に、
386                     自らが描画を行うことを宣言するものです。
387 
388                     通常、アプリケーションが呼ぶ必要はありません。
389 
390         @param[in]  flag        true なら描画権限を取得、false なら描画権限を放棄
391      */
392     inline void AssignGpuRight( bool flag = true )
393     {
394         detail::AssignGpuRight(flag);
395     }
396 
397     /*!
398         @brief      アプリケーションが他のプログラムに描画を切り替えることを宣言します。
399 
400                     この関数は、ライブラリアプレットやホームメニューなどに切り替わる際に、
401                     アプリケーションでの描画をやめることを宣言するものです。
402 
403                     通常、アプリケーションが呼ぶ必要はありません。
404      */
ReleaseGpuRight(void)405     inline void ReleaseGpuRight(void)
406     {
407         detail::AssignGpuRight(false);
408     }
409     /*!
410         @}
411      */
412 
413     //================================================================
414     // DSP使用権
415     //================================================================
416     /*!
417         @name   DSP使用権
418         @{
419      */
420     /*! :private
421         @brief      DSP の使用権を取得、放棄します。
422 
423                     必要に応じて、内部で DSP 処理を中断、再開します。
424 
425                     通常、アプリケーションが呼ぶ必要はありません。
426 
427         @param[in]  flag        true なら再開、false なら中断
428      */
429     inline void AssignDspRight( bool flag = true )
430     {
431         detail::AssignDspRight(flag);
432     }
433 
434     /*! :private
435         @brief      DSP の使用権を放棄します。
436 
437                     必要に応じて、内部で DSP での処理を一時中断します。
438 
439                     通常、アプリケーションが呼ぶ必要はありません。
440      */
ReleaseDspRight(void)441     inline void ReleaseDspRight( void )
442     {
443         detail::AssignDspRight(false);
444     }
445     /*!
446         @}
447      */
448 
449     /*! :private
450         @brief      共有メモリハンドルをアタッチします。
451         @param[out] transferMemory    共有メモリブロックポインタ
452         @param[in]  handle          ハンドル
453         @param[in]  size            共有メモリのサイズ
454         @param[in]  readOnly        読み取り専用フラグ
455      */
AttachTransferMemoryHandle(os::TransferMemoryBlock * transferMemory,nn::Handle handle,size_t size,bit32 otherPermission)456     inline void AttachTransferMemoryHandle( os::TransferMemoryBlock* transferMemory, nn::Handle handle, size_t size, bit32 otherPermission )
457     {
458         detail::AttachTransferMemoryHandle( transferMemory, handle, size, otherPermission );
459     }
460 
461     //================================================================
462     // CAMERAの起動制御
463     //================================================================
464     /*!
465         @name   CAMERAの起動制御
466         @{
467      */
468     /*! :private
469         @brief      CAMERA を Release 前の状態に戻します。
470      */
471     inline void AssignCameraRight( bool flag = true )
472     {
473         detail::AssignCameraRight(flag);
474     }
475 
476     /*! :private
477         @brief      CAMERA をスタンバイ状態に落とします。
478      */
ReleaseCameraRight(void)479     inline void ReleaseCameraRight( void )
480     {
481         detail::AssignCameraRight(false);
482     }
483     /*!
484         @}
485      */
486 
487     //================================================================
488     // メッセージ
489     //================================================================
490     /*!
491         @name   メッセージ
492         @{
493      */
494     /*! :private
495         @brief      アプレットへのメッセージ送信を行います。
496         @param[in]  receiverId  宛先のアプレット ID
497         @param[in]  pParam      アプレットへ送るパラメータバッファ
498         @param[in]  paramSize   アプレットへ送るパラメータバッファのサイズ
499         @param[in]  handle      アプレットへ送るハンドル
500         @param[in]  timeout     タイムアウト時間
501         @return     処理結果を返します。
502      */
503     inline Result SendMessage( AppletId receiverId, const u8* pParam, size_t paramSize, nn::Handle handle=NN_APPLET_HANDLE_NONE, nn::fnd::TimeSpan timeout=WAIT_INFINITE )
504     {
505         return detail::SendMessage( receiverId, pParam, paramSize, handle, timeout );
506     }
507 
508     /*! :private
509         @brief      アプレットへのメッセージ送信を行います。
510         @param[in]  receiverId  宛先のアプレット ID
511         @param[in]  pParam      アプレットへ送るパラメータバッファ
512         @param[in]  paramSize   アプレットへ送るパラメータバッファサイズ
513         @param[in]  handle      アプレットへ送るハンドル
514         @return     処理結果を返します。
515      */
516     inline Result TrySendMessage( AppletId receiverId, const u8* pParam, size_t paramSize, nn::Handle handle=NN_APPLET_HANDLE_NONE )
517     {
518         return detail::TrySendMessage( receiverId, pParam, paramSize, handle );
519     }
520     /*!
521         @}
522      */
523 
524     /*! :private
525         @brief      現在のホームボタンの状態を取得します。
526 
527                     GetHomeButtonState 関数よりも正確な値が得られます。
528                     通常、アプリケーションがこの関数を用いることはありません。
529 
530         @return     状態を返します。
531      */
GetAbsoluteHomeButtonState(void)532     inline AppletHomeButtonState GetAbsoluteHomeButtonState(void)
533     {
534         return detail::GetAbsoluteHomeButtonState();
535     }
536     /*! :private
537         @brief      ホームボタンの状態をクリアします。
538 
539                     通常、アプリケーションがこの関数を用いることはありません。
540      */
ClearAbsoluteHomeButtonState(void)541     inline void ClearAbsoluteHomeButtonState(void)
542     {
543         return detail::ClearAbsoluteHomeButtonState();
544     }
545 
546     //================================================================
547     // シャットダウン
548     //================================================================
549     /*!
550         @name   シャットダウン
551         @{
552      */
553     /*! :private
554         @brief      シャットダウン状態を取得します。
555         @return     状態を返します。
556      */
GetShutdownState(void)557     inline AppletShutdownState GetShutdownState(void)
558     {
559         return detail::GetShutdownState();
560     }
561 
562     /*! :private
563         @brief      シャットダウン状態をクリアします。
564      */
ClearShutdownState(void)565     inline void ClearShutdownState(void)
566     {
567         detail::ClearShutdownState();
568     }
569     /*!
570         @}
571      */
572 
573     //================================================================
574     // 終了状態
575     //================================================================
IsExitNotificationReceived(void)576     inline bool IsExitNotificationReceived(void)
577     {
578         return detail::IsExitNotificationReceived();
579     }
580 
581     //================================================================
582     // 電源ボタン
583     //================================================================
584     /*!
585         @name   電源ボタン
586         @{
587      */
588     /*! :private
589         @brief      電源ボタンの状態を取得します。
590 
591         @return     状態を返します。
592                     取得できる状態は applet::POWER_BUTTON_STATE_NONE (電源ボタンは押されていない)、
593                     applet::POWER_BUTTON_STATE_CLICK (電源ボタンがクリックされた) です。
594 
595                     アプリケーションはこの値を調べるのではなく、
596                     IsExpectedToProcessPowerButton() を用いてください。
597      */
GetPowerButtonState(void)598     inline AppletPowerButtonState GetPowerButtonState(void)
599     {
600         return detail::GetPowerButtonState();
601     }
602 
603     /*! :private
604         @brief      電源ボタンの状態をクリアします。
605      */
ClearPowerButtonState(void)606     inline void ClearPowerButtonState(void)
607     {
608         detail::ClearPowerButtonState();
609     }
610 
611     bool IsReceivedWakeupByCancel(void);
612 
613     /*!
614         @brief      電源ボタンの状態を調べます。
615 
616         @return     状態を返します。
617      */
IsExpectedToProcessPowerButton(void)618     inline bool IsExpectedToProcessPowerButton(void)
619     {
620         return ( GetPowerButtonState() != POWER_BUTTON_STATE_NONE )? true: false;
621     }
622     /*!
623         @}
624      */
625 
626     //================================================================
627     // 終了要求
628     //================================================================
GetOrderToCloseState(void)629     inline AppletOrderToCloseState GetOrderToCloseState(void)
630     {
631         return detail::GetOrderToCloseState();
632     }
ClearOrderToCloseState(void)633     inline void ClearOrderToCloseState(void)
634     {
635         detail::ClearOrderToCloseState();
636     }
637 
638     /*!
639         @name   アプリケーション終了
640         @{
641      */
642     /*!
643         @brief      アプリケーションが終了すべきかを調べます。
644 
645         @return     状態を返します。
646      */
IsExpectedToCloseApplication(void)647     inline bool IsExpectedToCloseApplication(void)
648     {
649         return ( GetOrderToCloseState() != ORDER_TO_CLOSE_STATE_NONE ||
650                  IsReceivedWakeupByCancel() )? true: false;
651     }
652 
653     //================================================================
654     // ライブラリアプレット・プリロードと終了
655     //================================================================
656     /*!
657         @name   ライブラリアプレットのプリロードと終了
658         @{
659      */
660     /*! :private
661         @brief      起動するライブラリアプレットのプリロードを行います。
662 
663                     プリロード完了まで待つ場合は WaitForLibraryAppletPreloaded() を
664                     呼んで下さい。
665 
666                     通常アプリケーションがこの関数を直接呼ぶことはありません。
667 
668         @param[in]  id          ライブラリアプレットのアプレット ID
669         @return     処理結果を返します。
670      */
PreloadLibraryApplet(AppletId id)671     inline Result PreloadLibraryApplet( AppletId id )
672     {
673         return detail::PreloadLibraryApplet(id);
674     }
675     /*!
676         @}
677      */
678 
679     /*! :private
680         @brief      プリロードされているライブラリアプレットを終了します。
681 
682                     ライブラリアプレットがあるときだけ終了します。
683                     ないときに呼び出しても構いません。
684 
685                     通常アプリケーションがこの関数を呼ぶことはありません。
686 
687         @return     処理結果を返します。
688      */
689     inline Result CancelLibraryAppletIfRegistered( bool isApplicationEnd, AppletWakeupState *pWakeupState=NULL )
690     {
691         return detail::CancelLibraryAppletIfRegistered( isApplicationEnd, pWakeupState );
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         @return     処理結果を返します。
757      */
PrepareToCloseApplication(void)758     inline Result PrepareToCloseApplication(void)
759     {
760         return detail::PrepareToCloseApplication();
761     }
762 
763     /*!
764         @brief      アプリケーションを終了します。
765         @param[in]  pParam      パラメータバッファ
766         @param[in]  paramSize   パラメータバッファサイズ
767         @param[in]  handle      ハンドル
768         @return     処理結果を返します。
769      */
770     inline Result CloseApplication( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
771     {
772         return detail::CloseApplication( pParam, paramSize, handle );
773     }
774     /*!
775         @}
776      */
777 
778     // Obsolete な関数。
PrepareToClosePreloadedApplication(void)779     inline Result PrepareToClosePreloadedApplication(void)
780     {
781         return detail::PrepareToCloseApplication( true );
782     }
783     inline Result ClosePreloadedApplication( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
784     {
785         return detail::CloseApplication( pParam, paramSize, handle );
786     }
787 
788     //================================================================
789     // ホームメニュー
790     //================================================================
791     /*!
792         @name   ホームメニュー
793         @{
794      */
795     /*! :private
796         @brief      ホームメニューへ移行する準備を行います。
797 
798                     この関数の後に CloseApplication() を呼ぶことでホームメニューへ移行します。
799 
800                     通常アプリケーションがこの関数を呼ぶことはありません。
801 
802         @return     処理結果を返します。
803      */
PrepareToJumpToHomeMenu(void)804     inline Result PrepareToJumpToHomeMenu(void)
805     {
806         return detail::PrepareToJumpToHomeMenu();
807     }
808 
809     /*! :private
810         @brief      ホームメニューへ移行します。
811 
812                     この関数の前に PrepareToJumpToHomeMenu() が呼ばれている必要があります。
813 
814                     この関数を呼んだ後に、WaitForStarting() で起動待ちを行ってください。
815 
816                     通常アプリケーションがこの関数を呼ぶことはありません。
817 
818         @param[in]  pParam      ホームメニューへ送るパラメータバッファ
819         @param[in]  paramSize   ホームメニューへ送るパラメータバッファのサイズ
820         @param[in]  handle      ホームメニューへ送るハンドル
821         @return     処理結果を返します。
822      */
823     inline Result JumpToHomeMenu( const u8* pParam=NULL, size_t paramSize=0, Handle handle=NN_APPLET_HANDLE_NONE )
824     {
825         return detail::JumpToHomeMenu( pParam, paramSize, handle );
826     }
827     /*!
828         @}
829      */
830 
831     //================================================================
832     // アプリケーションジャンプ
833     //================================================================
834     /*!
835         @name   アプリケーションジャンプ
836         @{
837      */
838     inline Result PrepareToJumpToOtherApplication( ProgramId programId, nn::fs::MediaType mediaType=nn::fs::MEDIA_TYPE_NAND )
839     {
840         return detail::PrepareToJumpToOtherApplication( programId, mediaType );
841     }
PrepareToJumpToCallerApplication(void)842     inline Result PrepareToJumpToCallerApplication(void)
843     {
844         return detail::PrepareToJumpToCallerApplication();
845     }
PrepareToJumpToSelfApplication(void)846     inline Result PrepareToJumpToSelfApplication(void)
847     {
848         return detail::PrepareToJumpToSelfApplication();
849     }
850     /*! :private
851         @brief      自身を終了し、他のアプリケーションを起動します。
852         @param[in]  pParam      起動するアプリケーションに渡す DeliverArg バッファ
853         @param[in]  pHmacBuf    起動するアプリケーションに渡す HMAC バッファ
854         @return     処理結果を返します。
855      */
856     inline Result JumpToOtherApplication( const u8 pParam[]=NULL, const u8 pHmacBuf[]=NULL )
857     {
858         return detail::JumpToOtherApplication( pParam, pHmacBuf );
859     }
860     /*! :private
861         @brief      自身を終了し、呼び元のアプリケーションを起動します。
862         @param[in]  pParam      起動するアプリケーションに渡す DeliverArg バッファ
863         @param[in]  pHmacBuf    起動するアプリケーションに渡す HMAC バッファ
864         @return     処理結果を返します。
865      */
866     inline Result JumpToCallerApplication( const u8 pParam[]=NULL, const u8 pHmacBuf[]=NULL )
867     {
868         return detail::JumpToCallerApplication( pParam, pHmacBuf );
869     }
870     /*! :private
871         @brief      自身を終了し、もう一度自身のアプリケーションを起動します。
872 
873                     この自己ジャンプの処理を挟んでも、JumpToCallerApplication() で戻る
874                     呼び元は変わりません。
875 
876         @param[in]  pParam      起動するアプリケーションに渡す DeliverArg バッファ
877         @param[in]  pHmacBuf    起動するアプリケーションに渡す HMAC バッファ
878         @return     処理結果を返します。
879      */
880     inline Result JumpToSelfApplication( const u8 pParam[]=NULL, const u8 pHmacBuf[]=NULL )
881     {
882         return detail::JumpToSelfApplication( pParam, pHmacBuf );
883     }
884     /*!
885         @}
886      */
887 
888     //================================================================
889     // 非公開
890     //================================================================
891     /*! :private
892         @brief      VRAM のシステム領域を退避させます。
893         @return     処理結果を返します。
894      */
SaveVramSysArea(void)895     inline nn::Result SaveVramSysArea(void)
896     {
897         return detail::SaveVramSysArea();
898     }
899 
900     /*! :private
901         @brief      VRAM のシステム領域を復元します。
902         @return     処理結果を返します。
903      */
RestoreVramSysArea(void)904     inline nn::Result RestoreVramSysArea(void)
905     {
906         return detail::RestoreVramSysArea();
907     }
908     /*!
909         @}
910      */
911 
912 }
913 }
914 }
915 
916 /*!
917    @defgroup nn_applet applet
918 
919    @brief  APPLET を扱うモジュールです。
920 
921    @{
922 */
923 
924 #include <nn/util/detail/util_CLibImpl.h>
925 
926 
927 /*! :private
928   @brief   APPLET ライブラリの初期化を行い、APPLET を登録します。
929 
930   @detail  対応する C++ 関数 @ref nn::applet::CTR::Initialize() を参照してください。
931 */
932 NN_EXTERN_C inline nn::Result nnappletInitialize( AppletAttr appletAttr = NN_APPLET_DEFAULT_APPLET_ATTRIBUTE)
933 {
934     return nn::applet::CTR::Initialize(appletAttr);
935 }
936 /*! :private
937     @brief   APPLET ライブラリにおける mutex をロックします。
938 
939     @detail  対応する C++ 関数 @ref nn::applet::CTR::Lock() を参照してください。
940 */
nnappletLock(void)941 NN_EXTERN_C inline void nnappletLock(void)
942 {
943     nn::applet::CTR::Lock();
944 }
945 /*! :private
946     @brief   APPLET ライブラリにおける mutex のロックを試みます。
947 
948     @detail  対応する C++ 関数 @ref nn::applet::CTR::TryLock() を参照してください。
949 */
950 NN_EXTERN_C inline bool nnappletTryLock(nn::fnd::TimeSpan timeout=NN_APPLET_NO_WAIT)
951 {
952     return nn::applet::CTR::TryLock(timeout);
953 }
954 /*! :private
955     @brief   APPLET ライブラリにおける mutex をアンロックします。
956 
957     @detail  対応する C++ 関数 @ref nn::applet::CTR::Unlock() を参照してください。
958 */
nnappletUnlock(void)959 NN_EXTERN_C inline void nnappletUnlock(void)
960 {
961     nn::applet::CTR::Unlock();
962 }
963 
964 //----------------------------------------------------------------
965 /*! :private
966   @brief   登録されている APPLET の数を数えます。
967 
968   @detail  対応する C++ 関数 @ref nn::applet::CTR::CountRegisteredApplet() を参照してください。
969 */
nnappletCountRegisteredApplet(void)970 NN_EXTERN_C inline int nnappletCountRegisteredApplet(void)
971 {
972     return nn::applet::CTR::CountRegisteredApplet();
973 }
974 /*! :private
975   @brief   APPLET が登録されているかを調べます。
976 
977   @detail  対応する C++ 関数 @ref nn::applet::CTR::IsRegistered() を参照してください。
978 */
nnappletIsRegistered(AppletId appletId)979 NN_EXTERN_C inline bool nnappletIsRegistered( AppletId appletId )
980 {
981     return nn::applet::CTR::IsRegistered( appletId );
982 }
983 
984 NN_EXTERN_C inline bool nnappletWaitForRegister( AppletId appletId, nn::fnd::TimeSpan span=NN_APPLET_WAIT_INFINITE )
985 {
986     return nn::applet::CTR::WaitForRegister( appletId, span );
987 }
988 
989     /*!
990   @brief   APPLET が現在動作選択されて active かを調べます。
991 
992   @detail  対応する C++ 関数 @ref nn::applet::CTR::IsActive() を参照してください。
993 */
nnappletIsActive(void)994 NN_EXTERN_C inline bool nnappletIsActive(void)
995 {
996     return nn::applet::CTR::IsActive();
997 }
998 
999 NN_EXTERN_C inline void nnappletAssignGpuRight(bool flag=true)
1000 {
1001     nn::applet::CTR::AssignGpuRight(flag);
1002 }
nnappletReleaseGpuRight(void)1003 NN_EXTERN_C inline void nnappletReleaseGpuRight(void)
1004 {
1005     nn::applet::CTR::AssignGpuRight(false);
1006 }
1007 
1008 /*! :private
1009     @brief   APPLET が現在描画権限を与えられているかを調べます。
1010 
1011     @detail  対応する C++ 関数 @ref nn::applet::CTR::IsGpuRightGiven() を参照してください。
1012 */
nnappletIsGpuRightGiven(void)1013 NN_EXTERN_C inline bool nnappletIsGpuRightGiven(void)
1014 {
1015     return nn::applet::CTR::IsGpuRightGiven();
1016 }
1017 
nnappletAttachTransferMemoryHandle(nn::os::TransferMemoryBlock * transferMemory,nn::Handle handle,size_t size,bit32 otherPermission)1018 NN_EXTERN_C inline void nnappletAttachTransferMemoryHandle( nn::os::TransferMemoryBlock* transferMemory, nn::Handle handle, size_t size, bit32 otherPermission )
1019 {
1020     nn::applet::CTR::AttachTransferMemoryHandle( transferMemory, handle, size, otherPermission );
1021 }
1022 
1023 
1024 /*!
1025     @}
1026 */
1027 
1028 #endif  // ifndef NN_APPLET_CTR_APPLET_API_H_
1029