OSDN Git Service

2011/10/26 0:11:48
[nlite/nlite.git] / nlib / nlib_myList.c
1 #include "nlib_include.h"
2
3
4 typedef enum {
5
6         NicoMyList_Root = 0,
7         NicoMyList_mylist,
8         NicoMyList_mylistitem,
9         NicoMyList_item,
10         NicoMyList_item_data,
11
12 }NicoMyListHierarchy;
13
14 typedef struct {
15         UINT64 nord;
16         NLIB_RESULT errcode;
17         NicoMyListItem_P pitem;
18
19
20 }NicoMyListItemContainer,*NicoMyListItemContainer_P;
21
22 ///
23 ///\83}\83C\83\8a\83X\83g\88ê\97\97\8eæ\93¾\8b¤\92Ê\8f\88\97\9d
24 ///
25 static NLIB_RESULT NicoMyList_getList(NicoVideoAuth_P pAuth,LPCWSTR objectName,NicoMyListCallBack callback);
26
27 static NicoMyListItem_P NicoMyListItem_new();
28
29 static VOID NicoMyListItem_delete(NicoMyListItem_P *pitem);
30
31 static JSONVoid myListItemStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name);
32
33 static JSONVoid myListItemDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param);
34
35 static JSONVoid myListItemDataEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P param);
36
37 ///
38 ///\82Æ\82è\82 \82¦\82¸\83}\83C\83\8a\83X\83g\88ê\97\97\8eæ\93¾
39 ///
40 NLIB_RESULT NicoMyList_getDefList(NicoVideoAuth_P pAuth,NicoMyListCallBack callback){
41
42         NLIB_RESULT rslt = NLIB_ERR_OK;
43
44         rslt = NicoMyList_getList(pAuth,L"api/deflist/list",callback);
45         
46
47
48 end:
49         
50
51         return rslt;
52 }
53
54
55
56 //
57 //\83v\83\89\83C\83x\81[\83g\8aÖ\90\94
58 //
59
60 static NLIB_RESULT NicoMyList_getList(NicoVideoAuth_P pAuth,LPCWSTR objectName,NicoMyListCallBack callback){
61
62         //\95Ï\90\94\90é\8c¾\81A\8f\89\8aú\89»
63         NLIB_RESULT rslt = NLIB_ERR_OK;
64         HINTERNET hNicoVideoSession = NULL;
65         HINTERNET hGetMyList = NULL;
66         WCHAR sendBuffer[LENGTH_512] = {L"Cookie: "};
67         DWORD statusCode;
68         DWORD statusCodeSize = sizeof(statusCode);
69         DWORD readSize;
70         LPSTR readBuffer = NULL;
71         JSONParser_P jsonParser = NULL;
72         NicoMyListItemContainer itemContainer;
73
74         ZeroMemory(&itemContainer,sizeof(itemContainer));
75
76         wcscat(sendBuffer,pAuth->userSession);
77         hNicoVideoSession = WinHttpConnect(hHttpSession,WWW_NICO_VIDEO_DOMEINNAME,INTERNET_DEFAULT_HTTP_PORT,0);
78
79         hGetMyList = WinHttpOpenRequest(hNicoVideoSession,L"GET",objectName,L"1.1",(LPCWSTR)WINHTTP_NO_REFERER,(LPCWSTR*)WINHTTP_DEFAULT_ACCEPT_TYPES,0);
80
81
82         if(WinHttpSendRequest(hGetMyList,sendBuffer,-1,WINHTTP_NO_REQUEST_DATA,0,0,0) == FALSE){
83
84                 goto networkerr;
85
86         }
87         
88         readBuffer = (LPSTR)malloc(LENGTH_65536 * 30);
89
90         jsonParser = JSONParser_new();
91
92         JSONParser_setEventHandler(jsonParser,myListItemStructEventHandler,myListItemDataEventHandler,myListItemDataEndEventHandler);
93
94         itemContainer.pitem = NicoMyListItem_new();
95
96         if(WinHttpReceiveResponse(hGetMyList,NULL) == FALSE){
97
98                 goto networkerr;
99
100         }
101
102
103         if (WinHttpQueryHeaders(hGetMyList,WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,WINHTTP_HEADER_NAME_BY_INDEX,&statusCode,&statusCodeSize,WINHTTP_NO_HEADER_INDEX) == FALSE){
104                 goto networkerr;
105         }
106
107         if (HTTP_STATUS_OK != statusCode){
108                 goto networkerr;
109         }
110
111         if(ReadHttpBody(hGetMyList,(LPBYTE)readBuffer,CHUNKMEMORY_MAXSIZE,&readSize) == FALSE){
112                 goto networkerr;
113
114         }
115
116         readBuffer[readSize] = '\0';
117
118         if(JSONParser_Parse(jsonParser,readBuffer,JSON_ENCODE_UTF8,&itemContainer) != JSON_ERR_OK){
119
120                 goto jsonerr;
121         }
122
123
124
125
126 end:
127         free(readBuffer);
128         JSONParser_delete(&jsonParser);
129         NicoMyListItem_delete(&itemContainer.pitem);
130         WinHttpCloseHandle(hNicoVideoSession);
131         WinHttpCloseHandle(hGetMyList);
132
133         return rslt;
134
135 networkerr:
136         rslt = NLIB_ERR_FAILED_NETWORK;
137         goto end;
138 jsonerr:
139         rslt = NLIB_ERR_JSON_PARSE;
140         goto end;
141 }
142
143 static NicoMyListItem_P NicoMyListItem_new(){
144
145         NicoMyListItem_P self = (NicoMyListItem_P)calloc(1,sizeof(*self));
146
147         return self;
148 }
149
150 static VOID NicoMyListItem_delete(NicoMyListItem_P *pitem){
151
152         free(*pitem);
153         (*pitem) = NULL;
154
155         return;
156 }
157
158
159 static JSONVoid myListItemStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name){
160
161         NicoMyListHierarchy nord = NicoMyList_Root;
162
163         NicoMyListItemContainer_P self = (NicoMyListItemContainer_P)option;
164
165         switch(self->nord){
166
167         case MAKENORD(NicoMyList_Root):
168
169                 if(thisHierarchy == JSONTypeRoot && valueType == JSONTypeObject){
170
171                         nord = NicoMyList_mylist;
172
173                 }
174                 break;
175
176         case MAKENORD1(NicoMyList_Root,NicoMyList_mylist):
177
178                 if(thisHierarchy == JSONTypeObject && valueType == JSONTypeArray && wcscmp(name,L"mylistitem") == 0){
179
180                         nord = NicoMyList_mylistitem;
181
182                 }
183
184                 break;
185
186         case MAKENORD2(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem):
187
188                 if(thisHierarchy == JSONTypeArray && valueType == JSONTypeObject){
189
190                         nord = NicoMyList_item;
191
192                 }
193
194                 break;
195
196         case MAKENORD3(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem,NicoMyList_item):
197
198                 if(thisHierarchy == JSONTypeObject && valueType == JSONTypeObject && wcscmp(name,L"item_data") == 0){
199
200                         nord = NicoMyList_item_data;
201
202                 }
203
204                 break;
205
206         }
207
208         self->nord = MAKENORD1(self->nord,nord);
209         
210
211         return;
212 }
213
214
215 static JSONVoid myListItemDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param){
216
217         switch(valueType){
218
219
220         case JSONTypeDecimal:
221
222                 dumpln(TEXT("name:[%s]:param[%s]"),name,(LPCWSTR)param);
223
224                 break;
225
226         case JSONTypeString:
227
228                 dumpln(TEXT("name:[%s]:param[%s]"),name,(LPCWSTR)param);
229                 
230                 break;
231         }
232         return;
233 }
234
235 static JSONVoid myListItemDataEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name){
236
237         UPNORD(((NicoMyListItemContainer_P)option)->nord);
238
239         return;
240 }