1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     ndm_UserControl.h
4 
5   Copyright (C)2009 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: 33682 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_NDM_NDM_USERCONTROL_H_
17 #define NN_NDM_NDM_USERCONTROL_H_
18 
19 #include <nn/ndm/CTR/ndm_Types.h>
20 
21 #ifdef __cplusplus
22 
23 namespace nn{
24 namespace ndm{
25     using namespace CTR;
26 
27     namespace {
28         const char PORT_NAME_USER[]         = "ndm:u";
29     }
30 
31     /*!
32       @brief        ネットワークデーモン制御ライブラリを初期化します。
33 
34                     内部で呼び出した回数をカウンタで管理しているため繰り返し呼ぶことが可能です。
35                     複数回 Initialize を呼び出した場合は、同じ回数 @ref Finalize を呼び出してください。
36 
37       @return       成功の可否
38     */
39     Result Initialize(void);
40 
41     /*!
42       @brief        ネットワークデーモン制御ライブラリを終了します。
43 
44                     ライブラリを終了すると、@ref SuspendScheduler や @ref SuspendDaemon などの停止操作はすべて取り消されます。
45                     <br/>
46                     ただし、取り消しが行われるのは内部のカウンタが 0 になり、本当に内部で終了処理が行われた時だけです。
47                     @ref Initialize を複数回呼び出していた場合は、同じ回数だけ Finalize を呼び出さない限り終了処理は行われません。
48                     他のライブラリの内部で @ref Initialize が呼ばれている場合がありますので、
49                     Finalize を呼び出す前にはそれまでに行った停止操作を @ref ResumeScheduler や @ref ResumeDaemon などを使用して明示的に取り消すようにしてください。
50                     <br/>
51                     なお、アプリケーションが終了時にはライブラリの終了処理が自動的に行われます。
52 
53       @return       成功の可否を返します。
54       @retval       ResultNotInitialized            初期化されていません。
55     */
56     Result Finalize(void);
57 
58     /*!
59       :private
60 
61       @brief        ネットワークデーモンを排他モードに設定します。排他モードに完全に遷移するまでブロックします。
62 
63                     他のプロセスが既に排他モードに設定していた場合、排他モードを上書きし排他権を奪い取ることができます。ただし、ローカル通信 @ref EM_LOCAL は奪い取れません。
64                     自プロセスが既に排他モードに設定した場合はエラーになります。一度 @ref LeaveExclusiveState を呼び出してください。
65 
66                     バックグラウンドで自律的に行われている通信が設定した排他モードと競合する場合、バックグラウンドの通信はすぐに停止されます。
67                     しかし、排他モードに応じた通信モードへの切り替えは明示的には行われません。スケジューラもしくはアプリケーションの指示により切り替えられます。<br/>
68                     例えば、すれちがい通信中に EM_INFRA が設定されるとすれちがい通信は即停止しますが、
69                     インフラストラクチャ通信がすぐに開始されるわけではありません。インフラストラクチャ通信はデーモンによる自律接続もしくはアプリケーションによる接続要求により開始されます。
70 
71                     @ref Suspend, @ref SuspendDaemons, @ref SuspendScheduler などによって自プロセス・他プロセスがデーモンの自律動作を停止させている場合、
72                     排他モードに遷移させてもデーモンは動作しないままになります。
73 
74       @param[in]    mode    設定する排他モード @ref ExclusiveMode
75                             EM_NONE は指定できません。排他モードを解除するには @ref LeaveExclusiveState を使用してください。
76 
77       @return       成功の可否を返します。
78       @retval       ResultLockedByOtherProcess      他のプロセスが排他状態の変更をロック中。リトライで成功する可能性あり。
79       @retval       ResultExclusiveByOtherProcess   他のプロセスが既に上書きできない排他モードに設定している。
80       @retval       ResultExclusiveByOwnProcess     自プロセスで既に排他モードに設定している。
81       @retval       ResultOperationDenied           スリープへの遷移処理など優先度の高い別の処理を行うため操作が拒否された。
82       @retval       ResultInvalidEnumValue          mode の値が不正
83     */
84     Result EnterExclusiveState(ExclusiveMode mode);
85 
86     /*!
87       :private
88 
89       @brief        ネットワークデーモンの排他モードを取得します。
90 
91 
92       @param[out]   mode    取得する排他モード @ref ExclusiveMode
93 
94       @return       成功の可否を返します。
95 
96     */
97     Result QueryExclusiveMode(ExclusiveMode& mode);
98 
99     /*!
100       :private
101 
102       @brief        ネットワークデーモンの排他モードを解除します。
103 
104                     自プロセスが設定した排他モードでない場合は失敗します。
105                     @ref Finalize の呼び出し時やプロセスの終了時には自動的に呼び出されます。
106 
107       @return       成功の可否を返します。
108       @retval       ResultExclusiveByOtherProcess   他のプロセスが既に排他モードに設定している。
109     */
110     Result LeaveExclusiveState(void);
111 
112     /*!
113       :private
114 
115       @brief        他のプロセスから排他モードが変更されないようにロックします。
116 
117                     カウントで管理されているのでネストして使うことができます。
118                     ロック中は他のプロセスからローカル通信等を使用することができなくなりますので、
119                     使用には注意してください。
120 
121                     @ref Finalize の呼び出し時やプロセスの終了時にはロックは自動的に解除されます。
122 
123       @return       成功の可否を返します。
124       @retval       ResultLockedByOtherProcess      他のプロセスが排他状態の変更をロック中。リトライで成功する可能性あり。
125     */
126     Result LockState(void);
127 
128     /*!
129       :private
130 
131       @brief        排他モードのロックを解除します。
132 
133                     LockState を呼び出した回数分だけ呼び出す必要があります。
134 
135       @return       成功の可否を返します。
136       @retval       ResultNotLocked                 ロックされていません。
137       @retval       ResultLockedByOtherProcess      他のプロセスが排他状態の変更をロック中。リトライで成功する可能性あり。
138     */
139     Result UnlockState(void);
140 
141     /*!
142       @brief        各ネットワークデーモンの自律動作をまとめて停止させます。
143 
144                     @ref Suspend 繰り返し呼ぶとの同じです。<br/>
145                     アプレットで使用してはいけません。
146 
147       @param[in]    mask    対象のデーモンを @ref DaemonMask 型で指定します。
148 
149       @return       成功の可否を返します。
150       @retval       ResultInvalidOperation          停止操作の回数が多すぎます。
151     */
152     Result SuspendDaemons(bit32 mask = CONTROL_MASK_DEFAULT);
153 
154     /*!
155       @brief        各ネットワークデーモンの自律動作停止をまとめて解除します。
156 
157                     @ref Resume を繰り返し呼ぶとの同じです。
158 
159       @param[in]    mask    対象のデーモンを @ref DaemonMask 型で指定します。
160 
161       @return       成功の可否を返します。
162       @retval       ResultNotSuspended              自プロセスからは停止指示は出ていません。
163     */
164     Result ResumeDaemons(bit32 mask = CONTROL_MASK_DEFAULT);
165 
166     /*!
167       @brief        ネットワークデーモンの自律動作を停止させます。
168 
169                     停止の完了を待たずに処理を返します。
170                     <br/>
171                     デーモンの停止要求はカウンタで管理されているのでネストして使用することができます。カウンタ値は各プロセスで独立です。
172                     <br/>
173                     他のプロセスがデーモンを停止している場合は、停止させているプロセス全てが停止を解除するか終了するかしなければ
174                     デーモンは自律動作しません。
175                     <br/>
176                     すべてのデーモンを停止しても、アクセスポイントの検索と自動接続は停止されません。
177                     自動接続を含むすべてのバックグラウンド動作を完全に停止する場合は @ref SuspendScheduler を使用してください。
178 
179       @param[in]    name    対象のデーモンを指定します。
180 
181       @return       成功の可否を返します。
182       @retval       ResultAlreadySuspended          プロセスごとに管理している停止カウントが不正です。
183                                                     通常このエラーは発生しません。
184       @retval       ResultInvalidOperation          停止操作の回数が多すぎます。
185     */
186     Result Suspend(DaemonName name);
187 
188     /*!
189       @brief        ネットワークデーモンの自律動作停止を解除します。
190 
191                     自プロセスが @ref Suspend を複数回呼び出している場合は、@ref Resume をその回数分呼び出さないと停止は解除されません。
192 
193       @param[in]    name    対象のデーモンを指定します。
194 
195       @return       成功の可否を返します。
196       @retval       ResultNotSuspended              自プロセスからは停止指示は出ていません。
197     */
198     Result Resume(DaemonName name);
199 
200     /*!
201       @brief        各ネットワークデーモンのスケジューリング、つまりデーモンマネージャ自身の動作を一時停止します。
202 
203                     スケジューリングが停止している間はネットワークへの自律接続およびすべてのデーモンの自律動作が停止します。
204                     スケジューリングの停止要求はカウンタで管理されているのでネストして使用することができます。カウンタ値は各プロセスで独立です。
205                     <br/>
206                     SuspendScheduler を製品に組み込んで使用することは推奨されません。
207                     強い理由がない限り、特定のデーモンのみを停止する @ref Suspend, @ref SuspendDaemons を使用してください。
208 
209       @param[in]    bAsync      true を指定すると停止処理の完了を待たずに処理を返します。
210                                 停止の完了を知る必要が無く、早く次の処理を行いたい場合に指定します。
211 
212       @return       成功の可否を返します。
213       @retval       ResultInvalidOperation          停止操作の回数が多すぎます。
214     */
215     Result SuspendScheduler(bool bAsync = false);
216 
217     /*!
218       @brief        デーモンのスケジューリング停止状態を解除します。
219 
220                     自プロセスが @ref SuspendScheduler を複数回呼び出している場合は、@ref ResumeScheduler をその回数分呼び出さないと停止は解除されません。
221 
222       @return       成功の可否を返します。
223       @retval       ResultNotSuspended              自プロセスからは停止指示は出ていません。
224     */
225     Result ResumeScheduler(void);
226 
227     /*!
228       @brief        ネットワークデーモン動作許可設定を SDK 既定の状態にします。
229 
230                     この関数は弱シンボル関数 @ref nninitSetupDaemons から nnMain に入る前に自動的に呼び出され、
231                     デーモンの動作許可設定を行います。
232 
233                     現バージョンの SDK では、デフォルトですべてのネットワークデーモンが動作します。(何もしません。)
234 
235       @return       なし
236     */
237     void SetupDaemonsDefault(void);
238 }
239 }
240 
241 #endif // __cplusplus
242 
243 #endif // NN_NDM_NDM_USERCONTROL_H_
244