1 /*---------------------------------------------------------------------------*
2   Project:  WiiConnect24
3   File:     NWC24Dl.h
4 
5   Copyright (C) 2006 Nintendo  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   $Log: NWC24Dl.h,v $
14   Revision 1.30  2008/01/31 08:53:19  adachi_hiroaki
15   Added NWC24_DL_URL_MAX.
16 
17   Revision 1.29  2007/10/01 08:15:47  hirose_kazuki
18   Added definition of NWC24_DL_INTERVAL_MIN_2ND.
19 
20   Revision 1.28  2007/09/20 00:44:22  adachi_hiroaki
21   Copied SSL-RootCA definitions from ssl.h.
22 
23   Revision 1.27  2007/09/03 06:54:13  adachi_hiroaki
24   Changed definitions for priority.
25 
26   Revision 1.26  2007/08/31 09:07:57  adachi_hiroaki
27   Changed NWC24_DL_INTERVAL_MIN.
28 
29   Revision 1.25  2007/08/29 04:56:34  adachi_hiroaki
30   Added functions for handling multiple tasks by one application.
31 
32   Revision 1.24  2007/07/13 12:20:52  adachi_hiroaki
33   Removed flags.
34 
35   Revision 1.23  2007/07/13 11:57:01  adachi_hiroaki
36   Reorganized headers.
37 
38   Revision 1.22  2007/07/13 02:11:08  adachi_hiroaki
39   Added NWC24GetNumRegDlTasks() and NWC24DeleteDlTasksForOptOut().
40 
41   Revision 1.21  2007/07/02 08:23:31  adachi_hiroaki
42   Changed NWC24_DL_RETRYMARGIN_MIN to 30.
43 
44   Revision 1.20  2007/06/20 10:36:31  adachi_hiroaki
45   Added NWC24SetDlRootCA()/NWC24GetDlRootCA().
46 
47   Revision 1.19  2007/06/09 07:06:12  adachi_hiroaki
48   Added NWC24ClearDlKeys().
49 
50   Revision 1.18  2007/06/08 05:46:47  adachi_hiroaki
51   Moved NWC24_DL_TASKNUM_MAX.
52 
53   Revision 1.17  2007/06/05 01:39:16  adachi_hiroaki
54   Added NWC24GetNumDlTasks().
55 
56   Revision 1.16  2007/06/04 06:34:58  adachi_hiroaki
57   Supported opt-in/out flags.
58 
59   Revision 1.15  2007/05/29 06:03:21  adachi_hiroaki
60   Changed NWC24_DLTYPE_MAX.
61 
62   Revision 1.14  2007/05/28 05:43:37  adachi_hiroaki
63   Changed default task types.
64 
65   Revision 1.13  2007/04/10 04:46:47  adachi_hiroaki
66   Added some flags.
67 
68   Revision 1.12  2007/03/13 05:32:06  adachi_hiroaki
69   Added NWC24GetDlError() and NWC24ClearDlError().
70 
71   Revision 1.11  2006/12/29 01:33:21  adachi_hiroaki
72   Added NWC24GetDlAppId().
73 
74   Revision 1.10  2006/12/14 09:43:25  adachi_hiroaki
75   Added NWC24_DL_FLAG_STANDBYMODE_ONLY.
76   Changed definition of NWC24DlType for the future.
77 
78   Revision 1.9  2006/12/13 04:27:54  adachi_hiroaki
79   Added definition for data encryption.
80 
81   Revision 1.8  2006/11/14 06:57:19  adachi_hiroaki
82   Increased NWC24_DL_RETRYMARGIN_MAX again.
83 
84   Revision 1.7  2006/11/11 19:00:29  adachi_hiroaki
85   Increased NWC24_DL_RETRYMARGIN_MAX.
86 
87   Revision 1.6  2006/10/24 01:38:36  adachi_hiroaki
88   Added NWC24*DlServerInterval().
89 
90   Revision 1.5  2006/10/17 02:46:18  adachi_hiroaki
91   Added NWC24_DL_FLAG_RAW_CONTENT.
92 
93   Revision 1.4  2006/10/07 05:35:00  adachi_hiroaki
94   Added NWC24SetDlPublicKey(), NWC24*DlFlags().
95 
96   Revision 1.3  2006/10/04 02:44:05  adachi_hiroaki
97   Added filename management functions.
98 
99   Revision 1.2  2006/09/28 11:37:58  adachi_hiroaki
100   Full spec candidate.
101 
102   Revision 1.1  2006/09/20 08:19:46  adachi_hiroaki
103   Initial check in.
104 
105 
106  *---------------------------------------------------------------------------*/
107 
108 /*---------------------------------------------------------------------------*
109     NWC24 Message API
110  *---------------------------------------------------------------------------*/
111 #ifndef NWC24DL_H__
112 #define NWC24DL_H__
113 
114 #include <revolution/nwc24/NWC24Types.h>
115 #include <revolution/nwc24/NWC24Err.h>
116 
117 /*---------------------------------------------------------------------------*
118     Macros
119  *---------------------------------------------------------------------------*/
120 #define NWC24_DL_PRIORITY_LOWEST                255
121 #define NWC24_DL_PRIORITY_DEFAULT               192
122 #define NWC24_DL_PRIORITY_LIMIT                 128
123 #define NWC24_DL_PRIORITY_HIGHEST               0
124 
125 #define NWC24_DL_INTERVAL_MAX                   (60*24*7)
126 #define NWC24_DL_INTERVAL_MIN                   (60*6)
127 #define NWC24_DL_INTERVAL_MIN_2ND               (60*24)
128 #define NWC24_DL_INTERVAL_DEFAULT               (60*24*2)
129 
130 #define NWC24_DL_RETRYMARGIN_MIN                (30)
131 #define NWC24_DL_RETRYMARGIN_MAX                (60*24*14)
132 #define NWC24_DL_RETRYMARGIN_DEFAULT            (60*24)
133 #define NWC24_DL_RETRYMARGIN_INFINITY           (65535)
134 
135 #define NWC24_DL_COUNT_MIN                      (1)
136 #define NWC24_DL_COUNT_MAX                      (100)
137 #define NWC24_DL_COUNT_DEFAULT                  (1)
138 
139 #define NWC24_DL_URL_MAX                        236
140 
141 #define NWC24_DL_ITOR_ASCENDING                 0x00000000UL
142 #define NWC24_DL_ITOR_DESCENDING                0x80000000UL
143 
144 #define NWC24_DL_IT_OPERATION_MASK              0x0000ffffUL
145 #define NWC24_DL_IT_ORDER_MASK                  0x80000000UL
146 
147 #define NWC24_DL_TASKNUM_MAX                    120         // changed from 32
148 #define NWC24_DL_TASK_SIZE                      512
149 #define NWC24_DL_VF_SIZE_MIN                    (10*1024)
150 
151 #define NWC24_DL_FLAG_SEND_USERINFO             (1UL <<  0UL)
152 #define NWC24_DL_FLAG_USE_MYPUBLICKEY           (1UL <<  1UL)
153 #define NWC24_DL_FLAG_RAW_CONTENT               (1UL <<  2UL)
154 #define NWC24_DL_FLAG_USE_MYSECRETKEY           (1UL <<  3UL)
155 #define NWC24_DL_FLAG_GROUP_WRITABLE            (1UL <<  6UL)
156 
157 #define NWC24_DL_FLAG_RESERVED_30               (1UL << 30UL)
158 #define NWC24_DL_FLAG_RESERVED_31               (1UL << 31UL)
159 
160 #define NWC24_DL_STFLAG_TRAILING_FILENAME       (1UL <<  0UL)
161 #define NWC24_DL_STFLAG_TRAILING_URL            (1UL <<  1UL)
162 
163 #define NWC24_DL_STFLAG_INTELLIGENT_UPDATE      (1UL <<  8UL)
164 #define NWC24_DL_STFLAG_RETICENT_UPDATE         (1UL <<  9UL)
165 #define NWC24_DL_STFLAG_ALWAYS_INCREMENT        (1UL << 10UL)
166 
167 
168 #define NWC24_DL_STID_INVALID                   255
169 
170 #define NWC24_DL_OPTFLAG_NONE                   (0x00)
171 #define NWC24_DL_OPTFLAG_OPT_OUT                (0x01)
172 #define NWC24_DL_OPTFLAG_OPT_IN                 (0x02)
173 #define NWC24_DL_OPTMASK_OPT_INOUT              \
174                           (NWC24_DL_OPTFLAG_OPT_OUT | NWC24_DL_OPTFLAG_OPT_IN)
175 
176 /* copied from ssl.h */
177 #define NWC24_DL_ROOTCA_ID_NINTENDO_0           (0)
178 #define NWC24_DL_ROOTCA_ID_NINTENDO_1           (1)
179 #define NWC24_DL_ROOTCA_ID_RSA_1024             (2)
180 #define NWC24_DL_ROOTCA_ID_RSA_2048             (3)
181 #define NWC24_DL_ROOTCA_ID_MAX                  (4)
182 
183 #define NWC24_DL_PUBLICKEY_LENGTH               (2048 / 8)
184 #define NWC24_DL_SECRETKEY_LENGTH               (128 / 8)
185 
186 /*---------------------------------------------------------------------------*
187     Type definitions
188  *---------------------------------------------------------------------------*/
189 
190 typedef enum
191 {
192     NWC24_DLTYPE_MULTIPART_V1   = 0,
193     NWC24_DLTYPE_OCTETSTREAM_V1 = 1,
194     NWC24_DLTYPE_MULTIPART_V2   = 2,
195     NWC24_DLTYPE_OCTETSTREAM_V2 = 3,
196     NWC24_DLTYPE_MAX,
197     NWC24_DLTYPE_MULTIPART      = NWC24_DLTYPE_MULTIPART_V2,
198     NWC24_DLTYPE_OCTETSTREAM    = NWC24_DLTYPE_OCTETSTREAM_V2
199 } NWC24DlType;
200 #define NWC24_DLTYPE_EMPTY                      255
201 
202 typedef struct NWC24DlTask
203 {
204     // 512 bytes
205     u8      data[ NWC24_DL_TASK_SIZE ];
206 
207 } NWC24DlTask;
208 
209 typedef s32(*NWC24DlIterationPredicator) (u16 id);
210 
211 typedef enum
212 {
213     NWC24_DL_ITOP_LASTACCESS            = 0,
214     NWC24_DL_ITOP_LASTACCESS_ASCENDING  = NWC24_DL_ITOP_LASTACCESS | NWC24_DL_ITOR_ASCENDING,
215     NWC24_DL_ITOP_LASTACCESS_DESCENDING = NWC24_DL_ITOP_LASTACCESS | NWC24_DL_ITOR_DESCENDING,
216     NWC24_DL_ITOP_NEXTTIME              = 1,
217     NWC24_DL_ITOP_NEXTTIME_ASCENDING    = NWC24_DL_ITOP_NEXTTIME | NWC24_DL_ITOR_ASCENDING,
218     NWC24_DL_ITOP_NEXTTIME_DESCENDING   = NWC24_DL_ITOP_NEXTTIME | NWC24_DL_ITOR_DESCENDING,
219     NWC24_DL_ITOP_PRIORITY              = 2,
220     NWC24_DL_ITOP_PRIORITY_ASCENDING    = NWC24_DL_ITOP_PRIORITY | NWC24_DL_ITOR_ASCENDING,
221     NWC24_DL_ITOP_PRIORITY_DESCENDING   = NWC24_DL_ITOP_PRIORITY | NWC24_DL_ITOR_DESCENDING
222 } NWC24DlIterateOperation;
223 
224 
225 typedef enum
226 {
227     NWC24_DL_STTYPE_NONE,
228     NWC24_DL_STTYPE_INCREMENT,
229     NWC24_DL_STTYPE_TIME_HOUR,
230     NWC24_DL_STTYPE_TIME_DAYOFWEEK,
231     NWC24_DL_STTYPE_TIME_DAY,
232     NWC24_DL_STTYPE_MAX
233 } NWC24DlSubTaskType;
234 
235 typedef struct NWC24DlIterateContext
236 {
237     s32     operation;
238     s32     lastValue;
239     s32     filterValue;
240     s32     lastId;
241     BOOL    isFirst;
242     BOOL    isValid;
243 } NWC24DlIterateContext;
244 
245 /*---------------------------------------------------------------------------*
246     API Prototypes
247  *---------------------------------------------------------------------------*/
248 #ifdef __cplusplus
249 extern "C" {
250 #endif
251 
252 /*---------------------------------------------------------------------------*
253     Task management APIs
254  *---------------------------------------------------------------------------*/
255 NWC24Err NWC24CheckDlTask( const NWC24DlTask* taskPublic, BOOL wantWrite );
256 NWC24Err NWC24InitDlTask( NWC24DlTask* taskPublic, NWC24DlType type );
257 NWC24Err NWC24AddDlTask( NWC24DlTask* taskPublic );
258 NWC24Err NWC24UpdateDlTask( NWC24DlTask* taskPublic );
259 NWC24Err NWC24GetDlTask( NWC24DlTask* taskPublic, u16 id );
260 NWC24Err NWC24DeleteDlTask( NWC24DlTask* taskPublic );
261 NWC24Err NWC24DumpDlTask( const NWC24DlTask* taskPublic );
262 NWC24Err NWC24CreateDlVf( const NWC24DlTask* taskPublic, u32 size );
263 NWC24Err NWC24MountDlVf( NWC24DlTask* taskPublic, const char* drive );
264 NWC24Err NWC24MountDlVfInHome( const char* drive );
265 NWC24Err NWC24GetDlTaskMineEx( NWC24DlTask* taskPublic, u32 param );
266 NWC24Err NWC24GetDlTaskMine( NWC24DlTask* taskPublic );
267 NWC24Err NWC24GetDlTaskIdByAppId( u16* id, u32 appId );
268 NWC24Err NWC24GetDlTaskIdByAppIdEx( u16* id, u32 appId, u32 param );
269 NWC24Err NWC24GetDlTaskByAppId( NWC24DlTask* taskPublic, u32 appId );
270 NWC24Err NWC24GetDlTaskByAppIdEx( NWC24DlTask* taskPublic, u32 appId, u32 param );
271 void     NWC24EnableDlLaxParameterChecking( BOOL enable );
272 NWC24Err NWC24GetDlHomeDir( const NWC24DlTask* taskPublic, char* buf, u32 len );
273 NWC24Err NWC24SetDlKeys( const u8 publicKey[NWC24_DL_PUBLICKEY_LENGTH],
274                          const u8 secretKey[NWC24_DL_SECRETKEY_LENGTH] );
275 NWC24Err NWC24ClearDlKeys( void );
276 
277 NWC24Err NWC24GetNumDlTasks( u32* numTasks );
278 NWC24Err NWC24GetNumRegDlTasks( u32* numTasks );
279 NWC24Err NWC24DeleteDlTasksForOptOut( u32 appId, BOOL all );
280 
281 NWC24Err NWC24GetDlVfPath( char* buf, u32 len );
282 NWC24Err NWC24GetDlVfPathByTask( const NWC24DlTask* taskPublic, char* buf, u32 len );
283 // Obsoleted
284 NWC24Err NWC24SetDlPublicKey( const NWC24DlTask* taskPublic,
285                               const u8 publicKey[NWC24_DL_PUBLICKEY_LENGTH] );
286 NWC24Err NWC24SetDlSecretKey( const NWC24DlTask* taskPublic,
287                                const u8 secretKey[NWC24_DL_SECRETKEY_LENGTH] );
288 NWC24Err NWC24GetDlVfName( const NWC24DlTask* taskPublic, char* buf, u32 len );
289 
290 
291 /*---------------------------------------------------------------------------*
292     Task accessor APIs
293  *---------------------------------------------------------------------------*/
294 NWC24Err NWC24GetDlId( const NWC24DlTask* taskPublic, u16 *id );
295 NWC24Err NWC24GetDlType( const NWC24DlTask* taskPublic, NWC24DlType *type );
296 NWC24Err NWC24SetDlPriority( NWC24DlTask* taskPublic, u8 priority );
297 NWC24Err NWC24GetDlPriority( const NWC24DlTask* taskPublic, u8* priority );
298 NWC24Err NWC24SetDlInterval( NWC24DlTask* taskPublic, u16 min );
299 NWC24Err NWC24GetDlInterval( const NWC24DlTask* taskPublic, u16* min );
300 NWC24Err NWC24SetDlServerInterval( const NWC24DlTask* taskPublic, u32 min );
301 NWC24Err NWC24GetDlServerInterval( const NWC24DlTask* taskPublic, u32* min );
302 NWC24Err NWC24SetDlRetryMargin( NWC24DlTask* taskPublic, u16 min );
303 NWC24Err NWC24GetDlRetryMargin( const NWC24DlTask* taskPublic, u16* min );
304 NWC24Err NWC24SetDlUrl( NWC24DlTask* taskPublic, const char* url );
305 NWC24Err NWC24GetDlUrl( const NWC24DlTask* taskPublic, char* url, s32 len );
306 NWC24Err NWC24SetDlCount( NWC24DlTask* taskPublic, s16 count );
307 NWC24Err NWC24GetDlCount( const NWC24DlTask* taskPublic, s16* count );
308 NWC24Err NWC24GetDlNextTime( NWC24DlTask* taskPublic, s64* sec );
309 NWC24Err NWC24GetDlLastUpdate( const NWC24DlTask* taskPublic, s64* sec );
310 NWC24Err NWC24SetDlFilename( NWC24DlTask* taskPublic, const char* filename );
311 NWC24Err NWC24GetDlFilename( const NWC24DlTask* taskPublic, char* filename, s32 len );
312 NWC24Err NWC24SetDlFlags( NWC24DlTask* taskPublic, u32 flags );
313 NWC24Err NWC24GetDlFlags( const NWC24DlTask* taskPublic, u32* flags );
314 NWC24Err NWC24GetDlAppId( const NWC24DlTask* taskPublic, u32* appId );
315 NWC24Err NWC24ClearDlError( NWC24DlTask* taskPublic );
316 NWC24Err NWC24GetDlError( const NWC24DlTask* taskPublic, s32* code, s32* count );
317 
318 NWC24Err NWC24SetDlOptOutFlags( NWC24DlTask* taskPublic, u8 optFlags );
319 NWC24Err NWC24GetDlOptOutFlags( NWC24DlTask* taskPublic, u8* optFlags );
320 
321 NWC24Err NWC24SetDlRootCA( NWC24DlTask* taskPublic, u8 rootCaId );
322 NWC24Err NWC24GetDlRootCA( NWC24DlTask* taskPublic, u8* rootCaId );
323 
324 NWC24Err NWC24SetDlUserParameter( NWC24DlTask* taskPublic, u32 param );
325 NWC24Err NWC24GetDlUserParameter( const NWC24DlTask* taskPublic, u32* param );
326 
327 
328 /*---------------------------------------------------------------------------*
329     Task iteration APIs
330  *---------------------------------------------------------------------------*/
331 NWC24Err NWC24IterateDlTask( u16* id, BOOL isBegin );
332 NWC24Err NWC24InitDlIterateContext( NWC24DlIterateContext* context,
333                                     NWC24DlIterateOperation operation );
334 NWC24Err NWC24IterateDlTaskEx( NWC24DlIterateContext* context,
335                                u16* id );
336 
337 /*---------------------------------------------------------------------------*/
338 #ifdef __cplusplus
339 }
340 #endif
341 
342 #endif  // NWC24DL_H__
343 
344