1 /*---------------------------------------------------------------------------*
2 
3 Copyright (C) 2013-2014 Nintendo. All rights reserved.
4 
5 These coded instructions, statements, and computer programs contain
6 proprietary information of Nintendo of America Inc. and/or Nintendo
7 Company Ltd., and are protected by Federal copyright law.  They may
8 not be disclosed to third parties or copied or duplicated in any form,
9 in whole or in part, without the prior written consent of Nintendo.
10 
11  *---------------------------------------------------------------------------*/
12 
13 #ifndef NN_EC_API_H_
14 #define NN_EC_API_H_
15 
16 #include <nn/ec/ec_Types.h>
17 #include <nn/ec/ec_DateTime.h>
18 #include <nn/ec/ec_Money.h>
19 #include <nn/ec/ec_Option.h>
20 
21 namespace nn { namespace ec {
22 
23 //! @addtogroup nn_ec_api
24 //! @{
25 
26 //! @name           Library Initialization and Finalization
27 //! @{
28 
29 /*!
30 @brief      Initializes the library.
31 
32 Initialize the following libraries beforehand. @n
33 If you want to specify an allocator and options, specify them before you call this function.
34 
35 @li Socket library (SO)
36 @li SSL library (NSSL)
37 @li HTTP library (CURL)
38 @li Account library (ACT)
39 @li Automatic connection library (AC)
40 
41 @return The result of processing.
42 
43 @retval Result::IsSuccess Indicates success.
44 @retval     ResultInvalidCountry    Cannot get the system's country setting.
45 @retval     ResultInvalidLanguage   Cannot get the system's language setting.
46 @retval     ResultInvalidMeta       Cannot get the application's metadata.
47 
48 @see        SetAllocator
49 @see        SetOption
50 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48711786">Programming Manual</a>
51 */
52 nn::Result Initialize(u32 version = NN_EC_VERSION);
53 
54 /*!
55 @brief      Finalizes the library.
56 
57 This function calls <tt>@ref Cancel</tt> and waits until the communication process ends.
58 
59 @return The result of processing.
60 
61 @retval Result::IsSuccess Indicates success.
62 
63 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48711829">Programming Manual</a>
64 */
65 nn::Result Finalize();
66 
67 //! @}
68 //! @name       Settings
69 //! @{
70 
71 /*!
72 @brief      Sets the allocator.
73 
74 This library allocates and frees memory from multiple threads. @n
75 The allocation or freeing of memory is handled exclusively in the library. It makes no difference whether the allocator is thread-safe or thread-unsafe. @n
76 If the allocator is shared with another module, however, make it thread-safe.
77 
78 When not setting an allocator, this library uses <tt>MEMAllocFromDefaultHeapEx</tt> and <tt>MEMFreeToDefaultHeap</tt>.
79 
80 If called after <tt>@ref Initialize</tt>, the function returns <tt>@ref ResultAlreadyInitialized</tt>.
81 
82 @param[in]  pAllocate           Memory allocation function.
83 @param[in]  pFree               Memory-freeing function.
84 
85 @return The result of processing.
86 
87 @retval Result::IsSuccess Indicates success.
88 @retval     ResultAlreadyInitialized    The library is already initialized.
89 @retval ResultInvalidArgument  Indicates that an argument is invalid.
90 */
91 nn::Result SetAllocator(AllocateFunction pAllocate, FreeFunction pFree);
92 
93 /*!
94 @brief      Sets the options.
95 
96 See <tt>@ref Option</tt> for the options that can be set.
97 
98 If called after <tt>@ref Initialize</tt>, the function returns <tt>@ref ResultAlreadyInitialized</tt>.
99 
100 @param[in] option              Options.
101 @param[in] pValue  The flag to set.
102 
103 @return The result of processing.
104 
105 @retval Result::IsSuccess Indicates success.
106 @retval     ResultAlreadyInitialized    The library is already initialized.
107 @retval ResultInvalidArgument  Indicates that an argument is invalid.
108 */
109 nn::Result SetOption(Option option, void* pValue);
110 
111 /*!
112 @brief      Sets the application.
113 
114 If you want to list or purchase items for another title, set the information for that title in this function. @n
115 If you are not handling items for other titles, you do not need to call this function.
116 
117 If the EC applet starts immediately after this function has been called, communication processes might take place inside the EC applet startup function.
118 
119 If the application is modified, any license information that was synchronized with <tt>@ref SynchronizeAocRights</tt> is cleared.
120 
121 @param[in] uniqueId  Specifies the unique ID of the title.
122 @param[in] tin Specifies the TIN.
123 
124 @return The result of processing.
125 
126 @retval Result::IsSuccess Indicates success.
127 @retval ResultNotInitialized  Indicates that the library is not initialized.
128 @retval     ResultExcluded          The EC applet is running.
129 
130 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48925036">Programming Manual</a>
131 */
132 nn::Result SetApplication(u32 uniqueId, u32 tin);
133 
134 /*!
135 @brief      Sets the download callback for metadata.
136 
137 This function blocks while the metadata download callback is being called.
138 
139 @param[in] pCallback  Specifies the callback. @n
140 You can clear this setting by specifying <tt>NULL</tt>.
141 @param[in] pContext  Specifies the callback parameters.
142 
143 @return The result of processing.
144 
145 @retval Result::IsSuccess Indicates success.
146 
147 @see        Item::DownloadIconAsync
148 @see        Item::DownloadPromotionImageAsync
149 @see        ItemList::DownloadIconsAsync
150 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48923120">Programming Manual</a>
151 */
152 nn::Result SetMetadataDownloadCallback(DownloadCallback pCallback, void* pContext);
153 
154 /*!
155 @brief Creates a memory cache for metadata.
156 
157 When you create a memory cache, you can store the downloaded metadata in that memory cache.
158 
159 If the metadata download function finds data in the memory cache, it retrieves the data from the cache. This improves performance when repeatedly downloading the same metadata.
160 
161 If the memory cache runs out of space, data is removed from the cache starting from the data that has not been accessed for the longest time.
162 
163 @param[in] size  Specifies the size of the memory cache.
164 
165 @return The result of processing.
166 
167 @retval Result::IsSuccess Indicates success.
168 @retval ResultNotInitialized  Indicates that the library is not initialized.
169 @retval ResultInvalidArgument  Indicates that an argument is invalid.
170 
171 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48923255">Programming Manual</a>
172 
173 */
174 nn::Result CreateMetadataCache(size_t size);
175 
176 /*!
177 @brief Deletes a metadata memory cache.
178 
179 @return The result of processing.
180 
181 @retval Result::IsSuccess Indicates success.
182 @retval ResultNotInitialized  Indicates that the library is not initialized.
183 
184 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48923255">Programming Manual</a>
185 */
186 nn::Result DeleteMetadataCache();
187 
188 //! @}
189 //! @name Session
190 //! @{
191 
192 /*!
193 @brief Logs in to the eShop server.
194 
195 This function gets a service token via the account library and then establishes a session between the client and the eShop server.
196 
197 The session established this way may be invalidated by the eShop server for certain reasons. @n
198 Some communication API functions call this function to re-establish a session when an invalid session error has been detected.
199 
200 The application must be connected to the network in advance.
201 
202 This function blocks because it involves communication.
203 
204 @return The result of processing.
205 
206 @retval Result::IsSuccess Indicates success.
207 @retval ResultNotInitialized  Indicates that the library is not initialized.
208 @retval     ResultNotConnected      Not connected to the Internet.
209 @retval     ResultCanceled          The communication process was canceled.
210 @retval     ResultExcluded          The EC applet is running.
211 @retval     ResultEshopNotInitialized       The Nintendo eShop initialization sequence has not completed.
212 @retval ResultNeedsNetworkUpdate  Specifies that a system update is required.
213 @retval     ResultNotInService              The service is not available.
214 @retval     ResultResponseError     A response error occurred.
215 @retval     ResultCurlError         A communication error occurred.
216 @retval     ResultServerError       A server error occurred.
217 @retval     ResultNetworkUpdateCheckError   An error occurred when checking for system update.
218 @retval     nn::act::Result*                An error occurred in the account library. @n
219 For more information, see <tt>nn::act::AcquireIndependentServiceToken</tt>.
220 
221 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48712023">Programming Manual</a>
222 */
223 nn::Result Login();
224 
225 /*!
226 @brief Gets the time of the eShop server.
227 
228 This function uses the time when the client logged in to the eShop server and the internal clock to calculate the eShop server time. @n
229 The function cannot get the time before logging in. @n
230 In addition, accuracy of the time is not guaranteed if one or more days have elapsed since logging in.
231 
232 The time might be off by a number of milliseconds to a number of seconds, depending on network latency and the accuracy of the eShop server clock.
233 
234 Use this function when comparing the current time with the release date of an item.
235 
236 @param[out] pServerTime         The server time (UTC).
237 
238 @return The result of processing.
239 
240 @retval Result::IsSuccess Indicates success.
241 @retval ResultNotInitialized  Indicates that the library is not initialized.
242 @retval ResultInvalidArgument  Indicates that an argument is invalid.
243 @retval     ResultNotLoggedIn       Not logged in to the eShop server.
244 
245 @see        Item::GetReleaseDate
246 */
247 nn::Result GetServerTime(DateTime* pServerTime);
248 
249 //! @}
250 //! @name Communication
251 //! @{
252 
253 /*!
254 @brief Cancels the communication process.
255 
256 The communication API functions in this library block until the communication process ends. Call this function from a different thread from the one running communication process.
257 
258 When you cancel communication with this function, all subsequent communication API functions return <tt>@ref ResultCanceled</tt>. @n
259 To exit the canceled state, use <tt>@ref ResetCancel</tt>.
260 
261 Note that this function cannot cancel the downloading of metadata. @n
262 To cancel this kind of process, use <tt>@ref CancelMetadataDownload</tt>.
263 
264 This function calls <tt>nn::act::Cancel</tt>. Keep this in mind when you call this function while an account communication API function is being called.
265 
266 @return The result of processing.
267 
268 @retval Result::IsSuccess Indicates success.
269 @retval ResultNotInitialized  Indicates that the library is not initialized.
270 @retval     ResultExcluded          The EC applet is running.
271 
272 */
273 nn::Result Cancel();
274 
275 /*!
276 @brief Resets the canceled state.
277 
278 Calling this function makes communication API functions available again after communication was canceled. @n
279 Terminating the application without calling this function after a cancellation does not cause any problems.
280 
281 @return The result of processing.
282 
283 @retval Result::IsSuccess Indicates success.
284 @retval ResultNotInitialized  Indicates that the library is not initialized.
285 */
286 nn::Result ResetCancel();
287 
288 /*!
289 @brief      Cancels the downloading of metadata.
290 
291 Calling this function cancels all metadata download processes. @n
292 It also clears all messages registered in the download queue.
293 
294 @return The result of processing.
295 
296 @retval Result::IsSuccess Indicates success.
297 @retval ResultNotInitialized  Indicates that the library is not initialized.
298 */
299 nn::Result CancelMetadataDownload();
300 
301 //! @}
302 //! @name License Information
303 //! @{
304 
305 /*!
306 @brief Updates license information for downloadable content to the most recent state.
307 
308 This function is used when license information is updated, such as when purchasing or redeeming items. @n
309 Note that license information can be updated due to external factors while the application is running. (For example, due to the purchase of items on Nintendo eShop.)
310 
311 This function blocks because it involves communication.
312 
313 @return The result of processing.
314 
315 @retval Result::IsSuccess Indicates success.
316 @retval     ResultInternalError     An internal error occurred.
317 @retval ResultNotInitialized  Indicates that the library is not initialized.
318 @retval     ResultNotLoggedIn       Not logged in to the eShop server.
319 @retval     ResultNotConnected      Not connected to the Internet.
320 @retval     ResultCanceled          The communication process was canceled.
321 @retval     ResultExcluded          The EC applet is running.
322 @retval     ResultResponseError     A response error occurred.
323 @retval     ResultCurlError         A communication error occurred.
324 @retval     ResultServerError       A server error occurred.
325 @retval     Other                  Sometime an error generated by <tt>@ref Login</tt> is returned.
326 
327 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48712026">Programming Manual</a>
328 */
329 nn::Result SynchronizeAocRights();
330 
331 /*!
332 @private
333 @brief      Gets the content list held by the specified data title.
334 
335 If a Nintendo 3DS system is linked with the Nintendo Network ID, you can get the content lists held by 3DS data titles.
336 
337 This function blocks because it involves communication.
338 
339 @param[out] pContentIndexes     A list of content indexes.
340 @param[out] pNum                The number of pieces of content.
341 @param[in]  num                 The number of pieces of content you want to get.
342 @param[in]  uniqueId             The unique ID of the data title.
343 @param[in]  variation           The variation of the data title.
344 @param[in]  platformType        The platform type of the data title.
345 
346 @return The result of processing.
347 
348 @retval Result::IsSuccess Indicates success.
349 @retval ResultNotInitialized  Indicates that the library is not initialized.
350 @retval     ResultNotLoggedIn       Not logged in to the eShop server.
351 @retval     ResultNotConnected      Not connected to the Internet.
352 @retval     ResultCanceled          The communication process was canceled.
353 @retval     ResultExcluded          The EC applet is running.
354 @retval     ResultResponseError     A response error occurred.
355 @retval     ResultCurlError         A communication error occurred.
356 @retval     ResultServerError       A server error occurred.
357 @retval     Other                  Sometime an error generated by <tt>@ref Login</tt> is returned.
358 
359 */
360 nn::Result GetOwnedContents(u16* pContentIndexes, u32* pNum, u32 num, u32 uniqueId, u8 variation, PlatformType platformType);
361 
362 //! @}
363 //! @name Balance
364 //! @{
365 
366 /*!
367 @brief Gets the current balance.
368 
369 This function blocks because it involves communication.
370 
371 @param[out] pBalance  Stores the balance.
372 
373 @return The result of processing.
374 
375 @retval Result::IsSuccess Indicates success.
376 @retval ResultNotInitialized  Indicates that the library is not initialized.
377 @retval     ResultNotLoggedIn       Not logged in to the eShop server.
378 @retval ResultInvalidArgument  Indicates that an argument is invalid.
379 @retval     ResultNotConnected      Not connected to the Internet.
380 @retval     ResultCanceled          The communication process was canceled.
381 @retval     ResultExcluded          The EC applet is running.
382 @retval     ResultResponseError     A response error occurred.
383 @retval     ResultCurlError         A communication error occurred.
384 @retval     ResultServerError       A server error occurred.
385 @retval     Other                  Sometime an error generated by <tt>@ref Login</tt> is returned.
386 
387 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48712048">Programming Manual</a>
388 */
389 nn::Result GetBalance(Money* pBalance);
390 
391 //! @}
392 //! @name Version
393 //! @{
394 
395 /*!
396 @brief Checks whether a data title is the latest version.
397 
398 This function blocks because it involves communication.
399 
400 @param[out] pIsLatestVersion Stores whether it is the latest version.
401 
402 @return The result of processing.
403 
404 @retval Result::IsSuccess Indicates success.
405 @retval     ResultInternalError     An internal error occurred.
406 @retval ResultNotInitialized  Indicates that the library is not initialized.
407 @retval     ResultNotLoggedIn       Not logged in to the eShop server.
408 @retval ResultInvalidArgument  Indicates that an argument is invalid.
409 @retval     ResultNotConnected      Not connected to the Internet.
410 @retval     ResultCanceled          The communication process was canceled.
411 @retval     ResultExcluded          The EC applet is running.
412 @retval     ResultResponseError     A response error occurred.
413 @retval     ResultCurlError         A communication error occurred.
414 @retval     ResultServerError       A server error occurred.
415 
416 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48712081">Programming Manual</a>
417 */
418 nn::Result CheckDataTitleUpdate(bool* pIsLatestVersion);
419 
420 //! @}
421 //! @name Error Handling
422 //! @{
423 
424 /*!
425 @brief Gets the error code from the processing result.
426 
427 If the result of the process was <tt>@ref ResultServerError</tt>, the error code retrieved by this function must not be configured in the error viewer.
428 
429 @param[in] result  Specifies the <tt>result</tt>.
430 
431 @return       The error code.
432 
433 @see        GetLastServerErrorMessage
434 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48925064">Programming Manual</a>
435 */
436 s32 GetErrorCode(const nn::Result& result);
437 
438 /*!
439 @brief Gets the message for the last server error that occurred.
440 
441 If the result of a process was <tt>ResultServerError</tt>, configure the error viewer with the title and message retrieved with this function and display them to the user. @n
442 You do not, however, need to do this for processes that do not affect the system as a whole when they fail, such as background communication and metadata downloading.
443 
444 This function blocks while communication is taking place.
445 
446 @param[out] pTitle  Stores the title to set in error viewer. @n
447 There must be at least <tt>@ref SERVER_ERROR_TITLE_SIZE </tt> elements in the buffer.
448 @param[out] pMessage  Stores the message to set in error viewer. @n
449 There must be at least <tt>@ref SERVER_ERROR_MESSAGE_SIZE </tt> elements in the buffer.
450 
451 @return The result of processing.
452 
453 @retval Result::IsSuccess Indicates success.
454 @retval ResultNotInitialized  Indicates that the library is not initialized.
455 @retval ResultInvalidArgument  Indicates that an argument is invalid.
456 
457 @see        <a class="el" href="../../Doc/EcdkProgrammingManual/contents/Pages/Page_48711722.html#PageId_48925064">Programming Manual</a>
458 */
459 nn::Result GetLastServerErrorMessage(char16* pTitle, char16* pMessage);
460 
461 //! @}
462 
463 //! @}
464 
465 }} // namespace nn::ec
466 
467 #endif // NN_EC_API_H_
468