My Project
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules
httpc.c
Go to the documentation of this file.
1 #include <3ds.h>
2 
4 
6 {
7  Result ret=0;
8 
9  if(__httpc_servhandle)return 0;
10  if((ret=srvGetServiceHandle(&__httpc_servhandle, "http:C")))return ret;
11 
12  //*((u32*)0x600) = __httpc_servhandle;
13 
15  if(ret!=0)return ret;
16 
17  return 0;
18 }
19 
20 void httpcExit()
21 {
22  if(__httpc_servhandle==0)return;
23 
25 }
26 
27 Result httpcOpenContext(httpcContext *context, char* url, u32 use_defaultproxy)
28 {
29  Result ret=0;
30 
31  ret = HTTPC_CreateContext(__httpc_servhandle, url, &context->httphandle);
32  if(ret!=0)return ret;
33 
34  ret = srvGetServiceHandle(&context->servhandle, "http:C");
35  if(ret!=0)return ret;
36 
38  if(ret!=0)return ret;
39 
40  if(use_defaultproxy==0)return 0;
41 
42  ret = HTTPC_SetProxyDefault(context->servhandle, context->httphandle);
43  if(ret!=0)return ret;
44 
45  return 0;
46 }
47 
49 {
50  Result ret=0;
51 
52  ret = HTTPC_CloseContext(context->servhandle, context->httphandle);
53 
54  svcCloseHandle(context->servhandle);
55 
56  return ret;
57 }
58 
59 Result httpcAddRequestHeaderField(httpcContext *context, char* name, char* value)
60 {
61  return HTTPC_AddRequestHeaderField(context->servhandle, context->httphandle, name, value);
62 }
63 
65 {
66  return HTTPC_BeginRequest(context->servhandle, context->httphandle);
67 }
68 
69 Result httpcReceiveData(httpcContext *context, u8* buffer, u32 size)
70 {
71  return HTTPC_ReceiveData(context->servhandle, context->httphandle, buffer, size);
72 }
73 
75 {
76  return HTTPC_GetRequestState(context->servhandle, context->httphandle, out);
77 }
78 
79 Result httpcGetDownloadSizeState(httpcContext *context, u32* downloadedsize, u32* contentsize)
80 {
81  return HTTPC_GetDownloadSizeState(context->servhandle, context->httphandle, downloadedsize, contentsize);
82 }
83 
85 {
86  return HTTPC_GetResponseStatusCode(context->servhandle, context->httphandle, out);
87 }
88 
89 Result httpcDownloadData(httpcContext *context, u8* buffer, u32 size, u32 *downloadedsize)
90 {
91  Result ret=0;
92  u32 contentsize=0;
93  u32 pos=0, sz=0;
94 
95  if(downloadedsize)*downloadedsize = 0;
96 
97  ret=httpcGetDownloadSizeState(context, NULL, &contentsize);
98  if(ret!=0)return ret;
99 
100  while(pos < size)
101  {
102  sz = size - pos;
103 
104  ret=httpcReceiveData(context, &buffer[pos], sz);
105 
107  {
108  ret=httpcGetDownloadSizeState(context, &pos, NULL);
109  if(ret!=0)return ret;
110  }
111  else if(ret!=0)
112  {
113  return ret;
114  }
115  else
116  {
117  pos+= sz;
118  }
119 
120  if(downloadedsize)*downloadedsize = pos;
121  }
122 
123  return 0;
124 }
125 
127 {
128  u32* cmdbuf=getThreadCommandBuffer();
129 
130  cmdbuf[0]=0x10044; //request header code
131  cmdbuf[1]=0x1000; //unk
132  cmdbuf[2]=0x20;//processID header, following word is set to processID by the arm11kernel.
133  cmdbuf[4]=0;
134  cmdbuf[5]=0;//Some sort of handle.
135 
136  Result ret=0;
137  if((ret=svcSendSyncRequest(handle)))return ret;
138 
139  return cmdbuf[1];
140 }
141 
142 Result HTTPC_CreateContext(Handle handle, char* url, Handle* contextHandle)
143 {
144  u32* cmdbuf=getThreadCommandBuffer();
145  u32 l=strlen(url)+1;
146 
147  cmdbuf[0]=0x20082; //request header code
148  cmdbuf[1]=l;
149  cmdbuf[2]=0x01; //unk
150  cmdbuf[3]=(l<<4)|0xA;
151  cmdbuf[4]=(u32)url;
152 
153  Result ret=0;
154  if((ret=svcSendSyncRequest(handle)))return ret;
155 
156  if(contextHandle)*contextHandle=cmdbuf[2];
157 
158  return cmdbuf[1];
159 }
160 
162 {
163  u32* cmdbuf=getThreadCommandBuffer();
164 
165  cmdbuf[0]=0x80042; //request header code
166  cmdbuf[1]=contextHandle;
167  cmdbuf[2]=0x20; //unk, constant afaict
168 
169  Result ret=0;
170  if((ret=svcSendSyncRequest(handle)))return ret;
171 
172  return cmdbuf[1];
173 }
174 
176 {
177  u32* cmdbuf=getThreadCommandBuffer();
178 
179  cmdbuf[0]=0xe0040; //request header code
180  cmdbuf[1]=contextHandle;
181 
182  Result ret=0;
183  if((ret=svcSendSyncRequest(handle)))return ret;
184 
185  return cmdbuf[1];
186 }
187 
188 Result HTTPC_CloseContext(Handle handle, Handle contextHandle)
189 {
190  u32* cmdbuf=getThreadCommandBuffer();
191 
192  cmdbuf[0]=0x30040; //request header code
193  cmdbuf[1]=contextHandle;
194 
195  Result ret=0;
196  if((ret=svcSendSyncRequest(handle)))return ret;
197 
198  return cmdbuf[1];
199 }
200 
201 Result HTTPC_AddRequestHeaderField(Handle handle, Handle contextHandle, char* name, char* value)
202 {
203  u32* cmdbuf=getThreadCommandBuffer();
204 
205  int l1=strlen(name)+1;
206  int l2=strlen(value)+1;
207 
208  cmdbuf[0]=0x1100c4; //request header code
209  cmdbuf[1]=contextHandle;
210  cmdbuf[2]=l1;
211  cmdbuf[3]=l2;
212  cmdbuf[4]=(l1<<14)|0xC02;
213  cmdbuf[5]=(u32)name;
214  cmdbuf[6]=(l1<<4)|0xA;
215  cmdbuf[7]=(u32)value;
216 
217  Result ret=0;
218  if((ret=svcSendSyncRequest(handle)))return ret;
219 
220  return cmdbuf[1];
221 }
222 
223 Result HTTPC_BeginRequest(Handle handle, Handle contextHandle)
224 {
225  u32* cmdbuf=getThreadCommandBuffer();
226 
227  cmdbuf[0]=0x90040; //request header code
228  cmdbuf[1]=contextHandle;
229 
230  Result ret=0;
231  if((ret=svcSendSyncRequest(handle)))return ret;
232 
233  return cmdbuf[1];
234 }
235 
236 Result HTTPC_ReceiveData(Handle handle, Handle contextHandle, u8* buffer, u32 size)
237 {
238  u32* cmdbuf=getThreadCommandBuffer();
239 
240  cmdbuf[0]=0xB0082; //request header code
241  cmdbuf[1]=contextHandle;
242  cmdbuf[2]=size;
243  cmdbuf[3]=(size<<4)|12;
244  cmdbuf[4]=(u32)buffer;
245 
246  Result ret=0;
247  if((ret=svcSendSyncRequest(handle)))return ret;
248 
249  return cmdbuf[1];
250 }
251 
253 {
254  u32* cmdbuf=getThreadCommandBuffer();
255 
256  cmdbuf[0]=0x50040; //request header code
257  cmdbuf[1]=contextHandle;
258 
259  Result ret=0;
260  if((ret=svcSendSyncRequest(handle)))return ret;
261 
262  *out = cmdbuf[2];
263 
264  return cmdbuf[1];
265 }
266 
267 Result HTTPC_GetDownloadSizeState(Handle handle, Handle contextHandle, u32* downloadedsize, u32* contentsize)
268 {
269  u32* cmdbuf=getThreadCommandBuffer();
270 
271  cmdbuf[0]=0x60040; //request header code
272  cmdbuf[1]=contextHandle;
273 
274  Result ret=0;
275  if((ret=svcSendSyncRequest(handle)))return ret;
276 
277  if(downloadedsize)*downloadedsize = cmdbuf[2];
278  if(contentsize)*contentsize = cmdbuf[3];
279 
280  return cmdbuf[1];
281 }
282 
283 Result HTTPC_GetResponseStatusCode(Handle handle, Handle contextHandle, u32* out)
284 {
285  u32* cmdbuf=getThreadCommandBuffer();
286 
287  cmdbuf[0]=0x220040; //request header code
288  cmdbuf[1]=contextHandle;
289 
290  Result ret=0;
291  if((ret=svcSendSyncRequest(handle)))return ret;
292 
293  *out = cmdbuf[2];
294 
295  return cmdbuf[1];
296 }
297 
#define HTTPC_RESULTCODE_DOWNLOADPENDING
Definition: httpc.h:13
s32 Result
Definition: types.h:42
Result HTTPC_InitializeConnectionSession(Handle handle, Handle contextHandle)
Definition: httpc.c:161
s32 svcCloseHandle(Handle handle)
Handle __httpc_servhandle
Definition: httpc.c:3
Result srvGetServiceHandle(Handle *out, const char *name)
Definition: srv.c:109
Result HTTPC_CloseContext(Handle handle, Handle contextHandle)
Definition: httpc.c:188
Result HTTPC_GetResponseStatusCode(Handle handle, Handle contextHandle, u32 *out)
Definition: httpc.c:283
u32 Handle
Definition: types.h:41
Result HTTPC_AddRequestHeaderField(Handle handle, Handle contextHandle, char *name, char *value)
Definition: httpc.c:201
u32 * getThreadCommandBuffer(void)
uint8_t u8
Definition: types.h:21
uint64_t u64
Definition: types.h:24
Result HTTPC_GetRequestState(Handle handle, Handle contextHandle, httpcReqStatus *out)
Definition: httpc.c:252
Result HTTPC_CreateContext(Handle handle, char *url, Handle *contextHandle)
Definition: httpc.c:142
uint32_t u32
Definition: types.h:23
Result httpcGetResponseStatusCode(httpcContext *context, u32 *out, u64 delay)
Definition: httpc.c:84
Result httpcReceiveData(httpcContext *context, u8 *buffer, u32 size)
Definition: httpc.c:69
Result HTTPC_GetDownloadSizeState(Handle handle, Handle contextHandle, u32 *downloadedsize, u32 *contentsize)
Definition: httpc.c:267
Result httpcBeginRequest(httpcContext *context)
Definition: httpc.c:64
Result httpcGetRequestState(httpcContext *context, httpcReqStatus *out)
Definition: httpc.c:74
void httpcExit()
Definition: httpc.c:20
Result httpcInit()
Definition: httpc.c:5
Handle servhandle
Definition: httpc.h:4
httpcReqStatus
Definition: httpc.h:8
Result httpcGetDownloadSizeState(httpcContext *context, u32 *downloadedsize, u32 *contentsize)
Definition: httpc.c:79
s32 svcSendSyncRequest(Handle session)
Result httpcOpenContext(httpcContext *context, char *url, u32 use_defaultproxy)
Definition: httpc.c:27
Result httpcAddRequestHeaderField(httpcContext *context, char *name, char *value)
Definition: httpc.c:59
Result HTTPC_SetProxyDefault(Handle handle, Handle contextHandle)
Definition: httpc.c:175
u32 httphandle
Definition: httpc.h:5
Result HTTPC_BeginRequest(Handle handle, Handle contextHandle)
Definition: httpc.c:223
Result httpcCloseContext(httpcContext *context)
Definition: httpc.c:48
Result HTTPC_ReceiveData(Handle handle, Handle contextHandle, u8 *buffer, u32 size)
Definition: httpc.c:236
Result httpcDownloadData(httpcContext *context, u8 *buffer, u32 size, u32 *downloadedsize)
Definition: httpc.c:89
Result HTTPC_Initialize(Handle handle)
Definition: httpc.c:126