From c4382042d633168019137580aaa5bef1eaa7d103 Mon Sep 17 00:00:00 2001 From: smea Date: Tue, 22 Jul 2014 21:13:40 -0700 Subject: [PATCH] HTTPC : added support for a handful of http:C commands. example will follow. --- libctru/include/ctr/HTTPC.h | 13 ++++ libctru/source/GSP.c | 2 +- libctru/source/HTTPC.c | 130 ++++++++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 libctru/include/ctr/HTTPC.h create mode 100644 libctru/source/HTTPC.c diff --git a/libctru/include/ctr/HTTPC.h b/libctru/include/ctr/HTTPC.h new file mode 100644 index 0000000..3ceeb66 --- /dev/null +++ b/libctru/include/ctr/HTTPC.h @@ -0,0 +1,13 @@ +#ifndef HTTPC_H +#define HTTPC_H + +Result HTTPC_Initialize(Handle handle); +Result HTTPC_InitializeConnectionSession(Handle handle, Handle contextHandle); +Result HTTPC_CreateContext(Handle handle, char* url, Handle* contextHandle); +Result HTTPC_CloseContext(Handle handle, Handle contextHandle); +Result HTTPC_SetProxyDefault(Handle handle, Handle contextHandle); +Result HTTPC_AddRequestHeaderField(Handle handle, Handle contextHandle, char* name, char* value); +Result HTTPC_BeginRequest(Handle handle, Handle contextHandle); +Result HTTPC_ReceiveData(Handle handle, Handle contextHandle, u8* buffer, u32 size); + +#endif diff --git a/libctru/source/GSP.c b/libctru/source/GSP.c index 7aa56f7..e1b591d 100644 --- a/libctru/source/GSP.c +++ b/libctru/source/GSP.c @@ -275,7 +275,7 @@ Result GSPGPU_submitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8], Handle* u8 commandIndex=cmdBufHeader&0xFF; u8 totalCommands=(cmdBufHeader>>8)&0xFF; - if(totalCommands>15)return -2; + if(totalCommands>=15)return -2; u8 nextCmd=(commandIndex+totalCommands)%15; //there are 15 command slots u32* dst=&sharedGspCmdBuf[8*(1+nextCmd)]; diff --git a/libctru/source/HTTPC.c b/libctru/source/HTTPC.c new file mode 100644 index 0000000..3671bf3 --- /dev/null +++ b/libctru/source/HTTPC.c @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include +#include + +Result HTTPC_Initialize(Handle handle) +{ + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=0x10044; //request header code + cmdbuf[1]=0x1000; //unk + cmdbuf[2]=0x20; //unk + + Result ret=0; + if((ret=svc_sendSyncRequest(handle)))return ret; + + return cmdbuf[1]; +} + +Result HTTPC_CreateContext(Handle handle, char* url, Handle* contextHandle) +{ + u32* cmdbuf=getThreadCommandBuffer(); + u32 l=strlen(url)+1; + + cmdbuf[0]=0x20082; //request header code + cmdbuf[1]=l; + cmdbuf[2]=0x01; //unk + cmdbuf[3]=(l<<4)|0xA; + cmdbuf[4]=(u32)url; + + Result ret=0; + if((ret=svc_sendSyncRequest(handle)))return ret; + + if(contextHandle)*contextHandle=cmdbuf[2]; + + return cmdbuf[1]; +} + +Result HTTPC_InitializeConnectionSession(Handle handle, Handle contextHandle) +{ + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=0x80042; //request header code + cmdbuf[1]=contextHandle; + cmdbuf[2]=0x20; //unk, constant afaict + + Result ret=0; + if((ret=svc_sendSyncRequest(handle)))return ret; + + return cmdbuf[1]; +} + +Result HTTPC_SetProxyDefault(Handle handle, Handle contextHandle) +{ + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=0xe0040; //request header code + cmdbuf[1]=contextHandle; + + Result ret=0; + if((ret=svc_sendSyncRequest(handle)))return ret; + + return cmdbuf[1]; +} + +Result HTTPC_CloseContext(Handle handle, Handle contextHandle) +{ + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=0x30040; //request header code + cmdbuf[1]=contextHandle; + + Result ret=0; + if((ret=svc_sendSyncRequest(handle)))return ret; + + return cmdbuf[1]; +} + +Result HTTPC_AddRequestHeaderField(Handle handle, Handle contextHandle, char* name, char* value) +{ + u32* cmdbuf=getThreadCommandBuffer(); + + int l1=strlen(name)+1; + int l2=strlen(value)+1; + + cmdbuf[0]=0x1100c4; //request header code + cmdbuf[1]=contextHandle; + cmdbuf[2]=l1; + cmdbuf[3]=l2; + cmdbuf[4]=(l1<<14)|0xC02; + cmdbuf[5]=(u32)name; + cmdbuf[6]=(l1<<4)|0xA; + cmdbuf[7]=(u32)value; + + Result ret=0; + if((ret=svc_sendSyncRequest(handle)))return ret; + + return cmdbuf[1]; +} + +Result HTTPC_BeginRequest(Handle handle, Handle contextHandle) +{ + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=0x90040; //request header code + cmdbuf[1]=contextHandle; + + Result ret=0; + if((ret=svc_sendSyncRequest(handle)))return ret; + + return cmdbuf[1]; +} + +Result HTTPC_ReceiveData(Handle handle, Handle contextHandle, u8* buffer, u32 size) +{ + u32* cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=0xB0082; //request header code + cmdbuf[1]=contextHandle; + cmdbuf[2]=size; + cmdbuf[3]=(size<<4)|12; + cmdbuf[4]=(u32)buffer; + + Result ret=0; + if((ret=svc_sendSyncRequest(handle)))return ret; + + return cmdbuf[1]; +}