// Copyright (c) 2012- PPSSPP Project.

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0 or later versions.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License 2.0 for more details.

// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/

// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.

#pragma once

#include <mutex>
#include <deque>
#include <map>
#include "Core/HLE/sceRtc.h"
#include "Common/Net/HTTPClient.h"
#include "Common/Net/Resolve.h"
#include "Common/Net/URL.h"


#pragma pack(push,1)

// Based on https://playstationdev.wiki/psvitadevwiki/index.php?title=Error_Codes
#define	SCE_NP_ERROR_ALREADY_INITIALIZED				0x80550001
#define	SCE_NP_ERROR_NOT_INITIALIZED					0x80550002
#define	SCE_NP_ERROR_INVALID_ARGUMENT					0x80550003

#define	SCE_NP_AUTH_ERROR_ALREADY_INITIALIZED			0x80550301
#define	SCE_NP_AUTH_ERROR_NOT_INITIALIZED				0x80550302
#define	SCE_NP_AUTH_ERROR_EINVAL						0x80550303
#define	SCE_NP_AUTH_ERROR_ENOMEM						0x80550304
#define	SCE_NP_AUTH_ERROR_ESRCH							0x80550305
#define	SCE_NP_AUTH_ERROR_EBUSY							0x80550306
#define	SCE_NP_AUTH_ERROR_ABORTED						0x80550307
#define	SCE_NP_AUTH_ERROR_INVALID_SERVICE_ID			0x80550308
#define	SCE_NP_AUTH_ERROR_INVALID_CREDENTIAL			0x80550309
#define	SCE_NP_AUTH_ERROR_INVALID_ENTITLEMENT_ID		0x8055030a
#define	SCE_NP_AUTH_ERROR_INVALID_DATA_LENGTH			0x8055030b
#define	SCE_NP_AUTH_ERROR_UNSUPPORTED_TICKET_VERSION	0x8055030c
#define	SCE_NP_AUTH_ERROR_STACKSIZE_TOO_SHORT			0x8055030d
#define	SCE_NP_AUTH_ERROR_TICKET_STATUS_CODE_INVALID	0x8055030e
#define	SCE_NP_AUTH_ERROR_TICKET_PARAM_NOT_FOUND		0x8055030f
#define	SCE_NP_AUTH_ERROR_INVALID_TICKET_VERSION		0x80550310
#define	SCE_NP_AUTH_ERROR_INVALID_ARGUMENT				0x80550311

#define	SCE_NP_AUTH_ERROR_SERVICE_END					0x80550400
#define	SCE_NP_AUTH_ERROR_SERVICE_DOWN					0x80550401
#define	SCE_NP_AUTH_ERROR_SERVICE_BUSY					0x80550402
#define	SCE_NP_AUTH_ERROR_SERVER_MAINTENANCE			0x80550403
#define SCE_NP_AUTH_ERROR_UNKNOWN						0x80550480

#define SCE_NP_MANAGER_ERROR_ALREADY_INITIALIZED		0x80550501
#define SCE_NP_MANAGER_ERROR_NOT_INITIALIZED			0x80550502
#define SCE_NP_MANAGER_ERROR_INVALID_ARGUMENT			0x80550503
#define SCE_NP_MANAGER_ERROR_OUT_OF_MEMORY				0x80550504
#define SCE_NP_MANAGER_ERROR_INVALID_TICKET_SIZE		0x80550505
#define SCE_NP_MANAGER_ERROR_INVALID_STATE				0x80550506
#define SCE_NP_MANAGER_ERROR_ABORTED					0x80550507
#define SCE_NP_MANAGER_ERROR_VARIANT_ACCOUNT_ID			0x80550508
#define SCE_NP_MANAGER_ERROR_ID_NOT_AVAIL				0x80550509
#define SCE_NP_MANAGER_ERROR_SIGNOUT					0x8055050a
#define SCE_NP_MANAGER_ERROR_NOT_SIGNIN 				0x8055050b

#define SCE_NP_UTIL_ERROR_INVALID_ARGUMENT 				0x80550601 
#define SCE_NP_UTIL_ERROR_INSUFFICIENT					0x80550602 
#define SCE_NP_UTIL_ERROR_PARSER_FAILED					0x80550603 
#define SCE_NP_UTIL_ERROR_INVALID_PROTOCOL_ID			0x80550604 
#define SCE_NP_UTIL_ERROR_INVALID_NP_ID					0x80550605 
#define SCE_NP_UTIL_ERROR_INVALID_NP_ENV 				0x80550606 
#define SCE_NP_UTIL_ERROR_INVALID_NPCOMMID				0x80550607 
#define SCE_NP_UTIL_ERROR_INVALID_CHARACTER 			0x80550608 
#define SCE_NP_UTIL_ERROR_NOT_MATCH 					0x80550609 
#define SCE_NP_UTIL_ERROR_INVALID_TITLEID				0x8055060a 
#define SCE_NP_UTIL_ERROR_INVALID_ESCAPE_STRING			0x8055060c 
#define SCE_NP_UTIL_ERROR_UNKNOWN_TYPE					0x8055060d 
#define SCE_NP_UTIL_ERROR_UNKNOWN 						0x8055060e

#define SCE_NP_COMMUNITY_ERROR_ALREADY_INITIALIZED 							0x80550701
#define SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED 								0x80550702
#define SCE_NP_COMMUNITY_ERROR_OUT_OF_MEMORY 								0x80550703
#define SCE_NP_COMMUNITY_ERROR_INVALID_ARGUMENT 							0x80550704
#define SCE_NP_COMMUNITY_ERROR_NO_LOGIN 									0x80550705 	
#define SCE_NP_COMMUNITY_ERROR_TOO_MANY_OBJECTS 							0x80550706 	
#define SCE_NP_COMMUNITY_ERROR_ABORTED 										0x80550707 	
#define SCE_NP_COMMUNITY_ERROR_BAD_RESPONSE 								0x80550708 	
#define SCE_NP_COMMUNITY_ERROR_BODY_TOO_LARGE 								0x80550709 	
#define SCE_NP_COMMUNITY_ERROR_HTTP_SERVER 									0x8055070a 	
#define SCE_NP_COMMUNITY_ERROR_INVALID_SIGNATURE 							0x8055070b 	
#define SCE_NP_COMMUNITY_ERROR_INSUFFICIENT_ARGUMENT 						0x8055070c 	
#define SCE_NP_COMMUNITY_ERROR_UNKNOWN_TYPE 								0x8055070d 	
#define SCE_NP_COMMUNITY_ERROR_INVALID_ID 									0x8055070e 	
#define SCE_NP_COMMUNITY_ERROR_INVALID_ONLINE_ID 							0x8055070f 	
#define SCE_NP_COMMUNITY_ERROR_CONNECTION_HANDLE_ALREADY_EXISTS 			0x80550710 	
#define SCE_NP_COMMUNITY_ERROR_INVALID_TYPE 								0x80550711 	
#define SCE_NP_COMMUNITY_ERROR_TRANSACTION_ALREADY_END 						0x80550712 	
#define SCE_NP_COMMUNITY_ERROR_INVALID_PARTITION 							0x80550713 	
#define SCE_NP_COMMUNITY_ERROR_INVALID_ALIGNMENT 							0x80550714 	
#define SCE_NP_COMMUNITY_ERROR_CLIENT_HANDLE_ALREADY_EXISTS 				0x80550715 	
#define SCE_NP_COMMUNITY_ERROR_NO_RESOURCE 									0x80550716 	

#define SCE_NP_COMMUNITY_SERVER_ERROR_BAD_REQUEST 							0x80550801 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_TICKET 						0x80550802 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_SIGNATURE 					0x80550803 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_NPID 							0x80550805 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN 							0x80550806 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_INTERNAL_SERVER_ERROR 				0x80550807 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_VERSION_NOT_SUPPORTED 				0x80550808 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_SERVICE_UNAVAILABLE 					0x80550809 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_PLAYER_BANNED 						0x8055080a 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_CENSORED 								0x8055080b 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_RECORD_FORBIDDEN 				0x8055080c 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_USER_PROFILE_NOT_FOUND 				0x8055080d 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_UPLOADER_DATA_NOT_FOUND 				0x8055080e 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_QUOTA_MASTER_NOT_FOUND 				0x8055080f 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_TITLE_NOT_FOUND 				0x80550810 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_BLACKLISTED_USER_ID 					0x80550811 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_GAME_RANKING_NOT_FOUND 				0x80550812 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_STORE_NOT_FOUND 				0x80550814 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_NOT_BEST_SCORE 						0x80550815 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_LATEST_UPDATE_NOT_FOUND 				0x80550816 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_BOARD_MASTER_NOT_FOUND 		0x80550817 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_GAME_DATA_MASTER_NOT_FOUND 	0x80550818 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_ANTICHEAT_DATA 				0x80550819 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_TOO_LARGE_DATA 						0x8055081a 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_NO_SUCH_USER_NPID 					0x8055081b 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_ENVIRONMENT 					0x8055081d 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_ONLINE_NAME_CHARACTER 		0x8055081f 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_ONLINE_NAME_LENGTH 			0x80550820 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_ABOUT_ME_CHARACTER			0x80550821 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_ABOUT_ME_LENGTH 				0x80550822 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_SCORE 						0x80550823 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_OVER_THE_RANKING_LIMIT 				0x80550824 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_FAIL_TO_CREATE_SIGNATURE				0x80550826 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_MASTER_INFO_NOT_FOUND			0x80550827 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_OVER_THE_GAME_DATA_LIMIT				0x80550828 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_SELF_DATA_NOT_FOUND 					0x8055082a
#define SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED 					0x8055082b 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_GAME_DATA_ALREADY_EXISTS 				0x8055082c 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_MATCHING_BEFORE_SERVICE 				0x805508a0 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_MATCHING_END_OF_SERVICE				0x805508a1 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_MATCHING_MAINTENANCE 					0x805508a2 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_BEFORE_SERVICE				0x805508a3 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_END_OF_SERVICE				0x805508a4 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_MAINTENANCE 					0x805508a5 	
#define SCE_NP_COMMUNITY_SERVER_ERROR_NO_SUCH_TITLE 						0x805508a6 
#define SCE_NP_COMMUNITY_SERVER_ERROR_TITLE_USER_STORAGE_BEFORE_SERVICE 	0x805508aa 
#define SCE_NP_COMMUNITY_SERVER_ERROR_TITLE_USER_STORAGE_END_OF_SERVICE 	0x805508ab 
#define SCE_NP_COMMUNITY_SERVER_ERROR_TITLE_USER_STORAGE_MAINTENANCE		0x805508ac 
#define SCE_NP_COMMUNITY_SERVER_ERROR_FSR_BEFORE_SERVICE 					0x805508ad 
#define SCE_NP_COMMUNITY_SERVER_ERROR_FSR_END_OF_SERVICE					0x805508ae 
#define SCE_NP_COMMUNITY_SERVER_ERROR_FSR_MAINTENANCE 						0x805508af 
#define SCE_NP_COMMUNITY_SERVER_ERROR_UBS_BEFORE_SERVICE					0x805508b1 
#define SCE_NP_COMMUNITY_SERVER_ERROR_UBS_END_OF_SERVICE					0x805508b2 
#define SCE_NP_COMMUNITY_SERVER_ERROR_UBS_MAINTENANCE 						0x805508b3
#define SCE_NP_COMMUNITY_SERVER_ERROR_UNSPECIFIED 							0x805508ff

// Based on https://gist.githubusercontent.com/raw/4140449/PS%20Vita (Might be slightly different with PSP?)
#define SCE_NP_TROPHY_ERROR_UNKNOWN 						0x80551600
#define SCE_NP_TROPHY_ERROR_NOT_INITIALIZED 				0x80551601
#define SCE_NP_TROPHY_ERROR_ALREADY_INITIALIZED 			0x80551602
#define SCE_NP_TROPHY_ERROR_NO_MEMORY 						0x80551603
#define SCE_NP_TROPHY_ERROR_INVALID_ARGUMENT 				0x80551604
#define SCE_NP_TROPHY_ERROR_INSUFFICIENT_BUFFER				0x80551605
#define SCE_NP_TROPHY_ERROR_EXCEEDS_MAX 					0x80551606
#define SCE_NP_TROPHY_ERROR_ABORT 							0x80551607
#define SCE_NP_TROPHY_ERROR_INVALID_HANDLE					0x80551608
#define SCE_NP_TROPHY_ERROR_INVALID_CONTEXT					0x80551609
#define SCE_NP_TROPHY_ERROR_INVALID_NPCOMMID 				0x8055160a
#define SCE_NP_TROPHY_ERROR_INVALID_NPCOMMSIGN 				0x8055160b

#define SCE_NP_BASIC_ERROR_BASE 							0x80551d00 
#define SCE_NP_BASIC_ERROR_UNKNOWN							0x80551d01 
#define SCE_NP_BASIC_ERROR_INVALID_ARGUMENT					0x80551d02 
#define SCE_NP_BASIC_ERROR_OUT_OF_MEMORY 					0x80551d03 
#define SCE_NP_BASIC_ERROR_NOT_INITIALIZED					0x80551d04 
#define SCE_NP_BASIC_ERROR_ALREADY_INITIALIZED				0x80551d05 
#define SCE_NP_BASIC_ERROR_SIGNED_OUT						0x80551d06 
#define SCE_NP_BASIC_ERROR_NOT_ONLINE						0x80551d07 
#define SCE_NP_BASIC_ERROR_DATA_NOT_FOUND 					0x80551d08 
#define SCE_NP_BASIC_ERROR_BUSY 							0x80551d09 
#define SCE_NP_BASIC_ERROR_NOT_READY_TO_COMMUNICATE 		0x80551d0a 
#define SCE_NP_BASIC_ERROR_NO_COMM_ID_SUPPLIED				0x80551d0b

// Based on https://github.com/RPCS3/rpcs3/blob/psp2/rpcs3/Emu/PSP2/Modules/sceNpCommon.h
enum SceNpServiceState : s32
{
	SCE_NP_SERVICE_STATE_UNKNOWN = 0,
	SCE_NP_SERVICE_STATE_SIGNED_OUT,
	SCE_NP_SERVICE_STATE_SIGNED_IN,
	SCE_NP_SERVICE_STATE_ONLINE
};

struct SceNpCommunicationId
{
	char data[9];
	char term;
	u8 num;
	char dummy;
};

struct SceNpCommunicationPassphrase
{
	u8 data[128];
};

struct SceNpCommunicationSignature
{
	u8 data[160];
};

struct SceNpCommunicationConfig
{
	PSPPointer<SceNpCommunicationId> commId;
	PSPPointer<SceNpCommunicationPassphrase> commPassphrase;
	PSPPointer<SceNpCommunicationSignature> commSignature;
};

// Part of BCP 47 Code (ie. "fr" for France/French)?
struct SceNpCountryCode
{
	char data[2];
	char term;
	char padding[1];
};

// Username?
struct SceNpOnlineId
{
	char data[16];
	char term;
	char dummy[3];
};

struct SceNpId
{
	SceNpOnlineId handle;
	u8 opt[8];
	u8 reserved[8];
};

struct SceNpAvatarUrl
{
	char data[127];
	char term;
};

struct SceNpUserInformation
{
	SceNpId userId;
	SceNpAvatarUrl icon;
	u8 reserved[52];
};

// Language Code (ie. 1033 for "en-US")?
struct SceNpMyLanguages
{
	s32_le language1;
	s32_le language2;
	s32_le language3;
	u8 padding[4];
};

struct SceNpAvatarImage
{
	u8 data[200 * 1024];
	u32_le size;
	u8 reserved[12];
};

enum SceNpAvatarSizeType : s32
{
	SCE_NP_AVATAR_SIZE_LARGE,
	SCE_NP_AVATAR_SIZE_MIDDLE,
	SCE_NP_AVATAR_SIZE_SMALL
};

struct SceNpAboutMe
{
	char data[64];
};

struct SceNpDate
{
	u16_le year;
	u8 month;
	u8 day;
};

union SceNpTicketParam
{
	s32_le _s32;
	s64_le _s64;
	u32_le _u32;
	u64_le _u64;
	SceNpDate date;
	u8 data[256];
};

struct SceNpTicketVersion
{
	u16_le major;
	u16_le minor;
};

struct NpAuthHandler {
	u32 entryPoint;
	u32 argument;
};

union NpAuthArgs {
	u32_le data[3]; // id, result, ArgAddr
	struct {
		s32_le id;
		s32_le result;
		u32_le argAddr;
	};
};

using SceNpAuthCallback = s32(s32 id, s32 result, PSPPointer<void> arg);

struct SceNpAuthRequestParameter
{
	u32_le size; // Size of this struct
	SceNpTicketVersion version; // Highest ticket version supported by this game/device? so PSN server can return supported ticket
	u32_le serviceIdAddr; //PSPPointer<char> serviceId; // null-terminated string
	u32_le cookieAddr; //PSPPointer<char> cookie; // null-terminated string?
	u32_le cookieSize;
	u32_le entitlementIdAddr; //PSPPointer<char> entitlementId; // null-terminated string
	u32_le consumedCount; // related to entitlement?
	u32 ticketCbAddr; //PSPPointer<SceNpAuthCallback> ticketCb
	u32_le cbArgAddr; //PSPPointer<void> cbArg
};

struct SceNpEntitlementId
{
	u8 data[32];
};

struct SceNpEntitlement
{
	SceNpEntitlementId id;
	u64_le createdDate;
	u64_le expireDate;
	u32_le type;
	s32_le remainingCount;
	u32_le consumedCount;
	u8 padding[4];
};

#define	TICKET_VER_2_0	0x21000000;
#define	TICKET_VER_2_1	0x21010000;
#define	TICKET_VER_3_0	0x31000000;
#define	TICKET_VER_4_0	0x41000000;

#define	NUMBER_PARAMETERS			12

#define	PARAM_TYPE_NULL				0
#define	PARAM_TYPE_INT				1
#define	PARAM_TYPE_LONG				2
#define	PARAM_TYPE_STRING			4 // PSP returns maximum 255 bytes
#define	PARAM_TYPE_DATE				7
#define	PARAM_TYPE_STRING_ASCII		8 // PSP returns maximum 255 bytes, can contains control code

#define	SECTION_TYPE_BODY			0x3000
#define	SECTION_TYPE_FOOTER			0x3002

// Tickets data are in big-endian based on captured packets
struct SceNpTicketParamData
{
	u16_be type; // 0(NULL), 1(32-bit int), 2(64-bi long), 4(ansi string?), 7(date/timestamp), 8(ascii string)
	u16_be length; // size of the following data value
	//u8 value[]; // optional data of length size
};

struct SceNpTicketHeader
{
	u32_be version; // Version contents byte are: V1 0M 00 00, where V = major version, M = minor version according to https://www.psdevwiki.com/ps3/X-I-5-Ticket
	s32_be size; // total ticket size (excluding this 8-bytes header struct)
};

// Section contents byte are: 30 XX 00 YY, where XX = section type, YY = section size according to https://www.psdevwiki.com/ps3/X-I-5-Ticket
// A section can contain other sections or param data, thus sharing their enum/def?
struct SceNpTicketSection
{
	u16_be type; // section type? ie. 30 XX where known XX are 00(Body), 02(Footer), 10, 11
	u16_be size; // total section size (excluding this 4-bytes section delimiter struct)
};

struct SceNpTicket
{
	SceNpTicketHeader header;
	SceNpTicketSection section; // Body or Parameter sections?
	//SceNpTicketParamData parameters[]; // a list of TicketParamData following the section
	//u8 unknownBytes[]; // optional data?
};

struct SceNpAuthMemoryStat {
	int npMemSize;     // Memory allocated by the NP utility. Pool Size?
	int npMaxMemSize;  // Maximum memory used by the NP utility.
	int npFreeMemSize; // Free memory available to use by the NP utility.
};

#pragma pack(pop)


#define	PARENTAL_CONTROL_DISABLED	0
#define	PARENTAL_CONTROL_ENABLED	1

#define	STATUS_ACCOUNT_SUSPENDED					0x80
#define	STATUS_ACCOUNT_CHAT_RESTRICTED				0x100
#define	STATUS_ACCOUNT_PARENTAL_CONTROL_ENABLED		0x200

#define NP_SIGNIN_STATUS_NONE		0 // SIGNEDOUT?
#define NP_SIGNIN_STATUS_SUCCESS	1
#define NP_SIGNIN_STATUS_CANCELED	2
#define NP_SIGNIN_STATUS_FAILED		3 // ERROR/ABORTED/SIGNEDOUT?

// Used by PSPNpSigninDialog.cpp
extern int npSigninState;
extern PSPTimeval npSigninTimestamp;

// Used by sceNet.cpp since we're borrowing Apctl's PSPThread to process NP events & callbacks.
// TODO: NP events should be processed on it's own PSPThread
extern std::recursive_mutex npAuthEvtMtx;

// Used by sceNp2.cpp
extern SceNpCommunicationId npTitleId;

void __NpInit();

int NpGetNpId(SceNpId* npid);
bool NpAuthProcessEvents();

int sceNpAuthGetMemoryStat(u32 memStatAddr);
int sceNpAuthCreateStartRequest(u32 paramAddr);
int sceNpAuthGetTicket(u32 requestId, u32 bufferAddr, u32 length);
int sceNpAuthGetEntitlementById(u32 ticketBufferAddr, u32 ticketLength, u32 entitlementIdAddr, u32 arg4);
int sceNpAuthAbortRequest(int requestId);
int sceNpAuthDestroyRequest(int requestId);

void Register_sceNp();
void Register_sceNpService();
void Register_sceNpAuth();
void Register_sceNpCommerce2();
