]> Chaos Git - corbenik/ctrulib.git/commitdiff
HTTPC : added support for a handful of http:C commands. example will follow.
authorsmea <smealum@gmail.com>
Wed, 23 Jul 2014 04:13:40 +0000 (21:13 -0700)
committersmea <smealum@gmail.com>
Wed, 23 Jul 2014 04:13:40 +0000 (21:13 -0700)
libctru/include/ctr/HTTPC.h [new file with mode: 0644]
libctru/source/GSP.c
libctru/source/HTTPC.c [new file with mode: 0644]

diff --git a/libctru/include/ctr/HTTPC.h b/libctru/include/ctr/HTTPC.h
new file mode 100644 (file)
index 0000000..3ceeb66
--- /dev/null
@@ -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
index 7aa56f7d42da20acc8fb95cfb6a366ce50aba586..e1b591de02e66d2544b0d97491e8cf53f270be3e 100644 (file)
@@ -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 (file)
index 0000000..3671bf3
--- /dev/null
@@ -0,0 +1,130 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctr/types.h>
+#include <ctr/HTTPC.h>
+#include <ctr/svc.h>
+
+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];
+}