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