OSDN Git Service

リッチエディット作成を一本化
[nlite/nlite.git] / nlib / nlib_myList.cpp
1 #include "StdAfx.h"
2 #include "nlib_include.h"
3
4
5
6 typedef enum {
7
8         NicoMyList_Root = 0,
9         NicoMyList_mylist,
10         NicoMyList_mylistitem,
11         NicoMyList_item,
12         NicoMyList_item_data,
13
14 }NicoMyListHierarchy;
15
16 typedef enum {
17         NicoMyListGroup_Root = 0,
18         NicoMyListGroup_mylistgrouphead,
19         NicoMyListGroup_mylistgroup,
20         NicoMyLIstGroup_mylist
21
22
23 }NicoMyListGroupHierarchy;
24
25 typedef struct{
26         UINT64 nord;
27         NLIB_RESULT errcode;
28         LPVOID option;
29         
30
31 }NMContainer,*NMContainer_P;
32
33 typedef struct {
34         NMContainer container;
35         NicoMyListCallBack callBack;
36         NicoMyListItem_P pitem;
37 }NicoMyListItemContainer,*NicoMyListItemContainer_P;
38
39
40 typedef struct {
41         NMContainer container;
42         NicoMyListGroupCallBack callBack;
43         NicoMyList_P pMyList;
44
45 }NicoMyListContainer,*NicoMyListContainer_P;
46
47
48 ///
49 ///\83}\83C\83\8a\83X\83g\88ê\97\97\8eæ\93¾\8b¤\92Ê\8f\88\97\9d
50 ///
51 static NLIB_RESULT NicoMyList_getMyListInternal(NicoVideoAuth_P pAuth,LPCTSTR objectName,NicoMyListCallBack callback,LPVOID option);
52
53 static NLIB_RESULT NicoMyList_common(NicoVideoAuth_P pAuth,LPCTSTR objectName,JSONStructEventHandler structHandler,JSONDataEventHandler dataHandler,JSONStructEndEventHandler endHandler,LPVOID item);
54
55 static NicoMyListItem_P NicoMyListItem_new();
56
57 static VOID NicoMyListItem_delete(NicoMyListItem_P *pitem);
58
59 static NicoMyList_P NicoMyList_new();
60
61 static VOID NicoMyList_delete(NicoMyList_P *pMyList);
62
63 static JSONVoid myListStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name);
64
65 static JSONVoid myListDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param);
66
67 static JSONVoid myListStructEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P param);
68
69 static JSONVoid myListItemStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name);
70
71 static JSONVoid myListItemDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param);
72
73 static JSONVoid myListItemDataEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P param);
74
75
76
77 static NLIB_RESULT jsonStrCpy(LPTSTR buf,LPCTSTR in,SIZE_T size);
78
79
80
81
82 //
83 //\83}\83N\83\8d
84 //
85 #define jsonToArray(arr,in) jsonStrCpy((arr),(in),sizeof(arr) / sizeof(arr[0]))
86
87 #define jsonDataDecimal(nmc,dt) if((valueType) == JSONTypeDecimal && wcscmp((name),(nmc)) == 0){(dt) = wcstoul((LPCTSTR)param,NULL,10);goto jsondataend;}
88 #define jsonDataString(nmc,dt,err)      if((valueType) == JSONTypeString && wcscmp((name),(nmc)) == 0){(err) = jsonToArray((dt),(LPCTSTR)param);goto jsondataend;}
89
90
91 ///
92 ///\82Æ\82è\82 \82¦\82¸\83}\83C\83\8a\83X\83g\88ê\97\97\8eæ\93¾
93 ///
94 NLIB_RESULT NicoMyList_getDefList(NicoVideoAuth_P pAuth,NicoMyListCallBack callback,LPVOID option){
95
96         
97         NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
98         
99         rslt = NicoMyList_getMyListInternal(pAuth,L"api/deflist/list",callback,option);
100
101         
102         return rslt;
103         
104 }
105
106 NLIB_DECLSPEC NLIB_RESULT NicoMyList_getMyList(NicoVideoAuth_P pAuth,LPCTSTR id,NicoMyListCallBack callback,LPVOID option){
107
108         TCHAR objectName[LENGTH_512];
109         NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
110         if(wcslen(id) > ARRAY_LENGTH(objectName) / 2){
111                 return NLIB_ERR_BUFFER_TOOLITTLE;
112         }
113
114         wsprintf(objectName,L"api/mylist/list?group_id=%s",id);
115         rslt = NicoMyList_getMyListInternal(pAuth,objectName,callback,option);
116
117         return rslt;
118 }
119
120
121 static NLIB_RESULT NicoMyList_getMyListInternal(NicoVideoAuth_P pAuth,LPCTSTR objectName,NicoMyListCallBack callback,LPVOID option){
122         NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
123         NicoMyListItemContainer itemContainer;
124         ZeroMemory(&itemContainer,sizeof(itemContainer));
125         itemContainer.callBack = callback;
126         itemContainer.container.option = option;
127         itemContainer.pitem =  NicoMyListItem_new();
128         rslt = NicoMyList_common(pAuth,objectName,myListItemStructEventHandler,myListItemDataEventHandler,myListItemDataEndEventHandler,&itemContainer);
129         NicoMyListItem_delete(&itemContainer.pitem);
130
131         return rslt;
132 }
133
134 NLIB_DECLSPEC NLIB_RESULT NicoMyList_getMyListGroup(NicoVideoAuth_P pAuth,NicoMyListGroupCallBack callback,LPVOID option){
135
136         NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
137         NicoMyListContainer listContainer;
138         ZeroMemory(&listContainer,sizeof(listContainer));
139         listContainer.callBack = callback;
140         listContainer.container.option = option;
141         listContainer.pMyList = NicoMyList_new();
142         
143         rslt = NicoMyList_common(pAuth,L"api/mylistgroup/list",myListStructEventHandler,myListDataEventHandler,myListStructEndEventHandler,&listContainer);
144         NicoMyList_delete(&listContainer.pMyList);
145         return rslt;
146 }
147 NLIB_DECLSPEC NLIB_RESULT NicoMyList_addItem(LPCTSTR video_id){
148
149         NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
150
151         TCHAR addApi[LENGTH_512] = {L"http://www.nicovideo.jp/mylist_add/video/"};
152         if(wcslen(video_id) > ARRAY_LENGTH(addApi) /2){
153
154                 goto buffererr;
155         }
156         wcscat(addApi,video_id);
157         
158         if(ShellExecute(NULL,L"open",addApi,NULL,NULL,SW_SHOWDEFAULT) <= (HINSTANCE)32){
159                 goto shellerr;
160         }
161         
162         rslt = NLIB_ERR_OK;
163
164         
165 end:
166         return rslt;
167
168 shellerr:
169         rslt = NLIB_ERR_SHELL_FAILED;
170         goto end;
171
172 buffererr:
173         rslt = NLIB_ERR_BUFFER_TOOLITTLE;
174         goto end;
175
176 }
177
178 //
179 //\83v\83\89\83C\83x\81[\83g\8aÖ\90\94
180 //
181
182 static NLIB_RESULT NicoMyList_common(NicoVideoAuth_P pAuth,LPCTSTR objectName,JSONStructEventHandler structHandler,JSONDataEventHandler dataHandler,JSONStructEndEventHandler endHandler,LPVOID item){
183
184         //\95Ï\90\94\90é\8c¾\81A\8f\89\8aú\89»
185         NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
186         //HINTERNET hNicoVideoSession = NULL;
187         HINTERNET hrequest = NULL;
188         TCHAR sendBuffer[LENGTH_512] = {L"Cookie: "};
189         JSONParser_P jsonParser = JSONParser_new();
190         
191
192         const UINT_PTR readBufSize = LENGTH_65536 * 30;
193
194         LPSTR readBuffer = (LPSTR)malloc(readBufSize);
195
196         DWORD readSize;
197
198         DWORD statusCode;
199         DWORD statusCodeSize = sizeof(statusCode);
200
201         
202
203         
204
205
206         
207         
208         wcscat(sendBuffer,pAuth->userSession);
209         //hNicoVideoSession = WinHttpConnect(hHttpSession,WWW_NICO_VIDEO_DOMEINNAME,INTERNET_DEFAULT_HTTP_PORT,0);
210
211         hrequest = WinHttpOpenRequest(hNicoVideoConnect,L"GET",objectName,L"1.1",(LPCTSTR)WINHTTP_NO_REFERER,(LPCTSTR*)WINHTTP_DEFAULT_ACCEPT_TYPES,0);
212
213         if(hrequest == NULL){
214                 goto networkerr;
215         }
216
217
218
219         if(WinHttpSendRequest(hrequest,sendBuffer,-1,WINHTTP_NO_REQUEST_DATA,0,0,0) == FALSE){
220
221                 goto networkerr;
222
223         }
224
225
226
227
228         
229
230         if(WinHttpReceiveResponse(hrequest,NULL) == FALSE){
231
232                 goto networkerr;
233
234         }
235
236
237         if (WinHttpQueryHeaders(hrequest,WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,WINHTTP_HEADER_NAME_BY_INDEX,&statusCode,&statusCodeSize,WINHTTP_NO_HEADER_INDEX) == FALSE){
238                 goto networkerr;
239         }
240
241         if (HTTP_STATUS_OK != statusCode){
242                 goto networkerr;
243         }
244
245         if(ReadHttpBody(hrequest,(LPBYTE)readBuffer,readBufSize,&readSize) == FALSE){
246                 goto networkerr;
247
248         }
249
250         readBuffer[readSize] = '\0';
251
252
253         
254         {
255                 JSONResult jsonResult;
256
257
258                 
259                 
260                 JSONParser_setEventHandler(jsonParser,structHandler,dataHandler,endHandler);
261                 jsonResult = JSONParser_Parse(jsonParser,readBuffer,JSON_ENCODE_UTF8,item);
262
263
264
265                 if(jsonResult != JSON_ERR_OK){
266
267                         goto jsonerr;
268                 }
269         }
270
271         rslt = NLIB_ERR_OK;
272
273 end:
274         free(readBuffer);
275         JSONParser_delete(&jsonParser);
276         WinHttpCloseHandle(hrequest);
277         
278
279         return rslt;
280
281 networkerr:
282         rslt = NLIB_ERR_FAILED_NETWORK;
283         goto end;
284 jsonerr:
285         rslt = NLIB_ERR_JSON_PARSE;
286         goto end;
287
288 }
289
290
291
292
293 static NicoMyListItem_P NicoMyListItem_new(){
294
295         NicoMyListItem_P self = (NicoMyListItem_P)calloc(1,sizeof(*self));
296
297         return self;
298 }
299
300 static VOID NicoMyListItem_delete(NicoMyListItem_P *pitem){
301
302         free(*pitem);
303         (*pitem) = NULL;
304
305         return;
306 }
307
308 static NicoMyList_P NicoMyList_new(){
309
310         return (NicoMyList_P)calloc(1,sizeof(NicoMyList));
311 }
312
313 static VOID NicoMyList_delete(NicoMyList_P *pMyList){
314
315         free(*pMyList);
316         (*pMyList) = NULL;
317         return;
318
319 }
320
321
322 static JSONVoid myListItemStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name){
323
324         NicoMyListHierarchy nord = NicoMyList_Root;
325
326         NicoMyListItemContainer_P self = (NicoMyListItemContainer_P)option;
327
328         switch(self->container.nord){
329
330         case MAKENORD(NicoMyList_Root):
331
332                 if(thisHierarchy == JSONTypeRoot && valueType == JSONTypeObject){
333
334                         nord = NicoMyList_mylist;
335
336                 }
337                 break;
338
339         case MAKENORD1(NicoMyList_Root,NicoMyList_mylist):
340
341                 if(thisHierarchy == JSONTypeObject && valueType == JSONTypeArray && wcscmp(name,L"mylistitem") == 0){
342
343                         nord = NicoMyList_mylistitem;
344
345                 }
346
347                 break;
348
349         case MAKENORD2(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem):
350
351                 if(thisHierarchy == JSONTypeArray && valueType == JSONTypeObject){
352
353                         nord = NicoMyList_item;
354
355                 }
356
357                 break;
358
359         case MAKENORD3(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem,NicoMyList_item):
360
361                 if(thisHierarchy == JSONTypeObject && valueType == JSONTypeObject && wcscmp(name,L"item_data") == 0){
362
363                         nord = NicoMyList_item_data;
364
365                 }
366
367                 break;
368
369         }
370
371         self->container.nord = MAKENORD1(self->container.nord,nord);
372         
373
374         return;
375 }
376
377
378 static JSONVoid myListItemDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param){
379
380         NicoMyListItemContainer_P self = (NicoMyListItemContainer_P)option;
381         
382         if(thisHierarchy == JSONTypeObject){
383                 switch(self->container.nord){
384
385                 case MAKENORD3(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem,NicoMyList_item):
386
387                         if(valueType == JSONTypeDecimal && wcscmp(name,L"create_time") == 0){
388
389                                 self->pitem->create_time = wcstoul((LPCTSTR)param,NULL,10);
390
391                         } else if(valueType == JSONTypeString && wcscmp(name,L"description") == 0){
392
393                                 self->container.errcode = jsonToArray(self->pitem->description,(LPCTSTR)param);
394
395                         } else if(valueType == JSONTypeString && wcscmp(name,L"item_id") == 0){
396
397                                 self->container.errcode = jsonToArray(self->pitem->item_id,(LPCTSTR)param);
398
399                         } else if(valueType == JSONTypeString && wcscmp(name,L"item_type") == 0){
400
401                                 self->container.errcode = jsonToArray(self->pitem->item_type,(LPCTSTR)param);
402
403                         } else if(valueType == JSONTypeDecimal && wcscmp(name,L"update_time") == 0){
404
405                                 self->pitem->update_time = wcstoul((LPCTSTR)param,NULL,10);
406
407                         } else if(valueType == JSONTypeDecimal && wcscmp(name,L"watch") == 0){
408
409                                 self->pitem->watch = wcstoul((LPCTSTR)param,NULL,10);
410                         }
411
412                         break;
413
414                 case MAKENORD4(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem,NicoMyList_item,NicoMyList_item_data):
415
416                         if(valueType == JSONTypeString && wcscmp(name,L"deleted") == 0){
417
418                                 self->container.errcode = jsonToArray(self->pitem->itemData.deleted,(LPCTSTR)param);
419
420                         } else if(valueType == JSONTypeDecimal && wcscmp(name,L"first_retrieve") == 0){
421
422                                 self->pitem->itemData.first_retrieve = wcstoul((LPCTSTR)param,NULL,10);
423
424                         } else if(valueType == JSONTypeString && wcscmp(name,L"group_type") == 0){
425
426                                 self->container.errcode = jsonToArray(self->pitem->itemData.group_type,(LPCTSTR)param);
427
428                         } else if(valueType == JSONTypeString && wcscmp(name,L"last_res_body") == 0){
429
430                                 self->container.errcode = jsonToArray(self->pitem->itemData.last_res_body,(LPCTSTR)param);
431
432                         } else if(valueType == JSONTypeString && wcscmp(name,L"length_seconds") == 0){
433
434                                 self->container.errcode = jsonToArray(self->pitem->itemData.length_seconds,(LPCTSTR)param);
435
436                         } else if(valueType == JSONTypeString && wcscmp(name,L"mylist_counter") == 0){
437
438                                 self->container.errcode = jsonToArray(self->pitem->itemData.mylist_counter,(LPCTSTR)param);
439
440                         } else if(valueType == JSONTypeString && wcscmp(name,L"num_res") == 0){
441
442                                 self->container.errcode = jsonToArray(self->pitem->itemData.num_res,(LPCTSTR)param);
443
444                         } else if(valueType == JSONTypeString && wcscmp(name,L"thumbnail_url") == 0){
445
446                                 self->container.errcode = jsonToArray(self->pitem->itemData.thumbnail_url,(LPCTSTR)param);
447
448                         } else if(valueType == JSONTypeString && wcscmp(name,L"title") == 0){
449
450                                 self->container.errcode = jsonToArray(self->pitem->itemData.title,(LPCTSTR)param);
451
452                         } else if(valueType == JSONTypeDecimal && wcscmp(name,L"update_time") == 0){
453
454                                 self->pitem->itemData.update_time = wcstoul((LPCTSTR)param,NULL,10);
455
456                         } else if(valueType == JSONTypeString && wcscmp(name,L"video_id") == 0){
457
458                                 self->container.errcode = jsonToArray(self->pitem->itemData.video_id,(LPCTSTR)param);
459
460                         } else if(valueType == JSONTypeString && wcscmp(name,L"view_counter") == 0){
461
462                                 self->container.errcode = jsonToArray(self->pitem->itemData.view_counter,(LPCTSTR)param);
463
464                         } else if(valueType == JSONTypeString && wcscmp(name,L"watch_id") == 0){
465
466                                 self->container.errcode = jsonToArray(self->pitem->itemData.watch_id,(LPCTSTR)param);
467
468                         }
469
470                         break;
471                 }
472         }
473         return;
474 }
475
476 static JSONVoid myListItemDataEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name){
477         NicoMyListItemContainer_P self = (NicoMyListItemContainer_P)option;
478         self->container.nord = UPNORD(self->container.nord);
479         if(MAKENORD2(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem) == self->container.nord){
480
481                 self->callBack(self->container.option,self->pitem);
482                 ZeroMemory(self->pitem,sizeof(*self->pitem));
483
484         }
485         return;
486 }
487
488 static JSONVoid myListStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name){
489
490         NicoMyListContainer_P nicoMyListContainer = (NicoMyListContainer_P)option;
491         NicoMyListGroupHierarchy nord;
492
493         switch(nicoMyListContainer->container.nord){
494
495         case MAKENORD(NicoMyListGroup_Root):
496
497                 nord = NicoMyListGroup_mylistgrouphead;
498
499                 break;
500
501
502         case MAKENORD1(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead):
503
504                 nord = NicoMyListGroup_mylistgroup;
505
506                 break;
507
508         case MAKENORD2(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead,NicoMyListGroup_mylistgroup):
509
510                 nord = NicoMyLIstGroup_mylist;
511
512                 break;
513         }
514         nicoMyListContainer->container.nord = MAKENORD1(nicoMyListContainer->container.nord,nord);
515
516         return;
517 }
518
519 static JSONVoid myListDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param){
520
521         NicoMyListContainer_P self = (NicoMyListContainer_P)option;
522
523         switch(self->container.nord){
524
525         case MAKENORD3(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead,NicoMyListGroup_mylistgroup,NicoMyLIstGroup_mylist):
526
527                 //\96Ê\93|\82É\82È\82Á\82½\82Ì\82Å\83}\83N\83\8d\82ð\8eg\82Á\82Ä\92l\82ð\93Ç\82Ý\8eæ\82é
528
529                 jsonDataDecimal(L"create_time",self->pMyList->create_time);
530
531                 jsonDataString(L"default_sort",self->pMyList->default_sort,self->container.errcode);
532
533                 jsonDataString(L"description",self->pMyList->description,self->container.errcode);
534
535                 jsonDataString(L"icon_id",self->pMyList->icon_id,self->container.errcode);
536
537                 jsonDataString(L"id",self->pMyList->id,self->container.errcode);
538
539                 jsonDataString(L"name",self->pMyList->name,self->container.errcode);
540
541                 jsonDataString(L"public",self->pMyList->publicType,self->container.errcode);
542
543                 jsonDataString(L"sort_order",self->pMyList->sort_order,self->container.errcode);
544
545                 jsonDataDecimal(L"update_time",self->pMyList->update_time);
546
547                 jsonDataString(L"user_id",self->pMyList->user_id,self->container.errcode);
548
549
550 jsondataend:
551
552
553                 break;
554
555         }
556
557         return;
558 }
559
560 static JSONVoid myListStructEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P param){
561
562         NicoMyListContainer_P self = (NicoMyListContainer_P)option;
563
564         self->container.nord = UPNORD(self->container.nord);
565
566         if(self->container.nord == MAKENORD2(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead,NicoMyListGroup_mylistgroup)){
567
568                 self->callBack(option,self->pMyList);
569                 ZeroMemory(self->pMyList,sizeof(*self->pMyList));
570
571         }
572
573         return;
574 }
575
576 static NLIB_RESULT jsonStrCpy(LPTSTR buf,LPCTSTR in,SIZE_T size){
577
578         NLIB_RESULT rslt = NLIB_ERR_OK;
579
580         if(wcslen(in) < size){
581
582                 wcscpy(buf,in);
583
584         }else {
585
586                 rslt = NLIB_ERR_BUFFER_TOOLITTLE;
587
588         }
589
590         return rslt;
591 }
592
593
594
595
596