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