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: 31100 $
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       @param[in]    mode    設定する排他モード @ref ExclusiveMode
72                             EM_NONE は指定できません。排他モードを解除するには @ref LeaveExclusiveState を使用してください。
73 
74       @return       成功の可否を返します。
75       @retval       ResultLockedByOtherProcess      他のプロセスが排他状態の変更をロック中。リトライで成功する可能性あり。
76       @retval       ResultExclusiveByOtherProcess   他のプロセスが既に上書きできない排他モードに設定している。
77       @retval       ResultExclusiveByOwnProcess     自プロセスで既に排他モードに設定している。
78       @retval       ResultOperationDenied           スリープへの遷移処理など優先度の高い別の処理を行うため操作が拒否された。
79       @retval       ResultInvalidEnumValue          mode の値が不正
80     */
81     Result EnterExclusiveState(ExclusiveMode mode);
82 
83     /*!
84       :private
85 
86       @brief        ネットワークデーモンの排他モードを取得します。
87 
88 
89       @param[out]   mode    取得する排他モード @ref ExclusiveMode
90 
91       @return       成功の可否を返します。
92 
93     */
94     Result QueryExclusiveMode(ExclusiveMode& mode);
95 
96     /*!
97       :private
98 
99       @brief        ネットワークデーモンの排他モードを解除します。
100 
101                     自プロセスが設定した排他モードでない場合は失敗します。
102                     @ref Finalize の呼び出し時やプロセスの終了時には自動的に呼び出されます。
103 
104       @return       成功の可否を返します。
105       @retval       ResultExclusiveByOtherProcess   他のプロセスが既に排他モードに設定している。
106     */
107     Result LeaveExclusiveState(void);
108 
109     /*!
110       :private
111 
112       @brief        他のプロセスから排他モードが変更されないようにロックします。
113 
114                     カウントで管理されているのでネストして使うことができます。
115                     ロック中は他のプロセスからローカル通信等を使用することができなくなりますので、
116                     使用には注意してください。
117 
118                     @ref Finalize の呼び出し時やプロセスの終了時にはロックは自動的に解除されます。
119 
120       @return       成功の可否を返します。
121       @retval       ResultLockedByOtherProcess      他のプロセスが排他状態の変更をロック中。リトライで成功する可能性あり。
122     */
123     Result LockState(void);
124 
125     /*!
126       :private
127 
128       @brief        排他モードのロックを解除します。
129 
130                     LockState を呼び出した回数分だけ呼び出す必要があります。
131 
132       @return       成功の可否を返します。
133       @retval       ResultNotLocked                 ロックされていません。
134       @retval       ResultLockedByOtherProcess      他のプロセスが排他状態の変更をロック中。リトライで成功する可能性あり。
135     */
136     Result UnlockState(void);
137 
138     /*!
139       @brief        各ネットワークデーモンの自律動作をまとめて停止させます。
140 
141                     @ref Suspend 繰り返し呼ぶとの同じです。
142 
143       @param[in]    mask    対象のデーモンを指定します。
144 
145       @return       成功の可否を返します。
146       @retval       ResultInvalidOperation          停止操作の回数が多すぎます。
147     */
148     Result SuspendDaemons(bit32 mask = CONTROL_MASK_DEFAULT);
149 
150     /*!
151       @brief        各ネットワークデーモンの自律動作停止をまとめて解除します。
152 
153                     @ref Resume を繰り返し呼ぶとの同じです。
154 
155       @param[in]    mask    対象のデーモンを指定します。
156 
157       @return       成功の可否を返します。
158       @retval       ResultNotSuspended              自プロセスからは停止指示は出ていません。
159     */
160     Result ResumeDaemons(bit32 mask = CONTROL_MASK_DEFAULT);
161 
162     /*!
163       @brief        ネットワークデーモンの自律動作を停止させます。
164 
165                     停止の完了を待たずに処理を返します。
166                     <br/>
167                     デーモンの停止要求はカウンタで管理されているのでネストして使用することができます。カウンタ値は各プロセスで独立です。
168                     <br/>
169                     他のプロセスがデーモンを停止している場合は、停止させているプロセス全てが停止を解除するか終了するかしなければ
170                     デーモンは自律動作しません。
171                     <br/>
172                     すべてのデーモンを停止しても、アクセスポイントの検索と自動接続は停止されません。
173                     自動接続を含むすべてのバックグラウンド動作を完全に停止する場合は @ref SuspendScheduler を使用してください。
174 
175       @param[in]    name    対象のデーモンを指定します。
176 
177       @return       成功の可否を返します。
178       @retval       ResultAlreadySuspended          プロセスごとに管理している停止カウントが不正です。
179                                                     通常このエラーは発生しません。
180       @retval       ResultInvalidOperation          停止操作の回数が多すぎます。
181     */
182     Result Suspend(DaemonName name);
183 
184     /*!
185       @brief        ネットワークデーモンの自律動作停止を解除します。
186 
187                     自プロセスが @ref Suspend を複数回呼び出している場合は、@ref Resume をその回数分呼び出さないと停止は解除されません。
188 
189       @param[in]    name    対象のデーモンを指定します。
190 
191       @return       成功の可否を返します。
192       @retval       ResultNotSuspended              自プロセスからは停止指示は出ていません。
193     */
194     Result Resume(DaemonName name);
195 
196     /*!
197       @brief        各ネットワークデーモンのスケジューリング、つまりデーモンマネージャ自身の動作を一時停止します。
198 
199                     スケジューリングが停止している間はネットワークへの自律接続およびすべてのデーモンの自律動作が停止します。
200                     特定のデーモンのみを停止したい場合は @ref Suspend, @ref SuspendDaemons を使用してください。
201 
202                     スケジューリングの停止要求はカウンタで管理されているのでネストして使用することができます。カウンタ値は各プロセスで独立です。
203 
204       @param[in]    bAsync      true を指定すると停止処理の完了を待たずに処理を返します。
205                                 停止の完了を知る必要が無く、早く次の処理を行いたい場合に指定します。
206 
207       @return       成功の可否を返します。
208       @retval       ResultInvalidOperation          停止操作の回数が多すぎます。
209     */
210     Result SuspendScheduler(bool bAsync = false);
211 
212     /*!
213       @brief        デーモンのスケジューリング停止状態を解除します。
214 
215                     自プロセスが @ref SuspendScheduler を複数回呼び出している場合は、@ref ResumeScheduler をその回数分呼び出さないと停止は解除されません。
216 
217       @return       成功の可否を返します。
218       @retval       ResultNotSuspended              自プロセスからは停止指示は出ていません。
219     */
220     Result ResumeScheduler(void);
221 
222     /*!
223       @brief        ネットワークデーモン動作許可設定を SDK 既定の状態にします。
224 
225                     この関数は弱シンボル関数 @ref nninitSetupDaemons から nnMain に入る前に自動的に呼び出され、
226                     デーモンの動作許可設定を行います。
227 
228                     現バージョンの SDK では、デフォルトですべてのネットワークデーモンが動作します。(何もしません。)
229     */
230     void SetupDaemonsDefault(void);
231 }
232 }
233 
234 #endif // __cplusplus
235 
236 #endif // NN_NDM_NDM_USERCONTROL_H_
237