2 #include "nlib_include.h"
10 NicoMyList_mylistitem,
17 NicoMyListGroup_Root = 0,
18 NicoMyListGroup_mylistgrouphead,
19 NicoMyListGroup_mylistgroup,
20 NicoMyLIstGroup_mylist
23 }NicoMyListGroupHierarchy;
31 }NMContainer,*NMContainer_P;
34 NMContainer container;
35 NicoMyListCallBack callBack;
36 NicoMyListItem_P pitem;
37 }NicoMyListItemContainer,*NicoMyListItemContainer_P;
41 NMContainer container;
42 NicoMyListGroupCallBack callBack;
45 }NicoMyListContainer,*NicoMyListContainer_P;
49 ///
\83}
\83C
\83\8a\83X
\83g
\88ê
\97\97\8eæ
\93¾
\8b¤
\92Ê
\8f\88\97\9d
51 static NLIB_RESULT NicoMyList_getMyListInternal(NicoVideoAuth_P pAuth,LPCTSTR objectName,NicoMyListCallBack callback,LPVOID option);
53 static NLIB_RESULT NicoMyList_common(NicoVideoAuth_P pAuth,LPCTSTR objectName,JSONStructEventHandler structHandler,JSONDataEventHandler dataHandler,JSONStructEndEventHandler endHandler,LPVOID item);
55 static NicoMyListItem_P NicoMyListItem_new();
57 static VOID NicoMyListItem_delete(NicoMyListItem_P *pitem);
59 static NicoMyList_P NicoMyList_new();
61 static VOID NicoMyList_delete(NicoMyList_P *pMyList);
63 static JSONVoid myListStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name);
65 static JSONVoid myListDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param);
67 static JSONVoid myListStructEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P param);
69 static JSONVoid myListItemStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name);
71 static JSONVoid myListItemDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param);
73 static JSONVoid myListItemDataEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P param);
77 static NLIB_RESULT jsonStrCpy(LPTSTR buf,LPCTSTR in,SIZE_T size);
85 #define jsonToArray(arr,in) jsonStrCpy((arr),(in),sizeof(arr) / sizeof(arr[0]))
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;}
92 ///
\82Æ
\82è
\82 \82¦
\82¸
\83}
\83C
\83\8a\83X
\83g
\88ê
\97\97\8eæ
\93¾
94 NLIB_RESULT NicoMyList_getDefList(NicoVideoAuth_P pAuth,NicoMyListCallBack callback,LPVOID option){
97 NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
99 rslt = NicoMyList_getMyListInternal(pAuth,L"api/deflist/list",callback,option);
106 NLIB_DECLSPEC NLIB_RESULT NicoMyList_getMyList(NicoVideoAuth_P pAuth,LPCTSTR id,NicoMyListCallBack callback,LPVOID option){
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;
114 wsprintf(objectName,L"api/mylist/list?group_id=%s",id);
115 rslt = NicoMyList_getMyListInternal(pAuth,objectName,callback,option);
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);
134 NLIB_DECLSPEC NLIB_RESULT NicoMyList_getMyListGroup(NicoVideoAuth_P pAuth,NicoMyListGroupCallBack callback,LPVOID option){
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();
143 rslt = NicoMyList_common(pAuth,L"api/mylistgroup/list",myListStructEventHandler,myListDataEventHandler,myListStructEndEventHandler,&listContainer);
144 NicoMyList_delete(&listContainer.pMyList);
147 NLIB_DECLSPEC NLIB_RESULT NicoMyList_addItem(LPCTSTR video_id){
149 NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
151 TCHAR addApi[LENGTH_512] = {L"http://www.nicovideo.jp/mylist_add/video/"};
152 if(wcslen(video_id) > ARRAY_LENGTH(addApi) /2){
156 wcscat(addApi,video_id);
158 if(ShellExecute(NULL,L"open",addApi,NULL,NULL,SW_SHOWDEFAULT) <= (HINSTANCE)32){
169 rslt = NLIB_ERR_SHELL_FAILED;
173 rslt = NLIB_ERR_BUFFER_TOOLITTLE;
179 //
\83v
\83\89\83C
\83x
\81[
\83g
\8aÖ
\90\94
182 static NLIB_RESULT NicoMyList_common(NicoVideoAuth_P pAuth,LPCTSTR objectName,JSONStructEventHandler structHandler,JSONDataEventHandler dataHandler,JSONStructEndEventHandler endHandler,LPVOID item){
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();
192 const UINT_PTR readBufSize = LENGTH_65536 * 30;
194 LPSTR readBuffer = (LPSTR)malloc(readBufSize);
199 DWORD statusCodeSize = sizeof(statusCode);
208 wcscat(sendBuffer,pAuth->userSession);
209 //hNicoVideoSession = WinHttpConnect(hHttpSession,WWW_NICO_VIDEO_DOMEINNAME,INTERNET_DEFAULT_HTTP_PORT,0);
211 hrequest = WinHttpOpenRequest(hNicoVideoConnect,L"GET",objectName,L"1.1",(LPCTSTR)WINHTTP_NO_REFERER,(LPCTSTR*)WINHTTP_DEFAULT_ACCEPT_TYPES,0);
213 if(hrequest == NULL){
219 if(WinHttpSendRequest(hrequest,sendBuffer,-1,WINHTTP_NO_REQUEST_DATA,0,0,0) == FALSE){
230 if(WinHttpReceiveResponse(hrequest,NULL) == FALSE){
237 if (WinHttpQueryHeaders(hrequest,WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,WINHTTP_HEADER_NAME_BY_INDEX,&statusCode,&statusCodeSize,WINHTTP_NO_HEADER_INDEX) == FALSE){
241 if (HTTP_STATUS_OK != statusCode){
245 if(ReadHttpBody(hrequest,(LPBYTE)readBuffer,readBufSize,&readSize) == FALSE){
250 readBuffer[readSize] = '\0';
255 JSONResult jsonResult;
260 JSONParser_setEventHandler(jsonParser,structHandler,dataHandler,endHandler);
261 jsonResult = JSONParser_Parse(jsonParser,readBuffer,JSON_ENCODE_UTF8,item);
265 if(jsonResult != JSON_ERR_OK){
275 JSONParser_delete(&jsonParser);
276 WinHttpCloseHandle(hrequest);
282 rslt = NLIB_ERR_FAILED_NETWORK;
285 rslt = NLIB_ERR_JSON_PARSE;
293 static NicoMyListItem_P NicoMyListItem_new(){
295 NicoMyListItem_P self = (NicoMyListItem_P)calloc(1,sizeof(*self));
300 static VOID NicoMyListItem_delete(NicoMyListItem_P *pitem){
308 static NicoMyList_P NicoMyList_new(){
310 return (NicoMyList_P)calloc(1,sizeof(NicoMyList));
313 static VOID NicoMyList_delete(NicoMyList_P *pMyList){
322 static JSONVoid myListItemStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name){
324 NicoMyListHierarchy nord = NicoMyList_Root;
326 NicoMyListItemContainer_P self = (NicoMyListItemContainer_P)option;
328 switch(self->container.nord){
330 case MAKENORD(NicoMyList_Root):
332 if(thisHierarchy == JSONTypeRoot && valueType == JSONTypeObject){
334 nord = NicoMyList_mylist;
339 case MAKENORD1(NicoMyList_Root,NicoMyList_mylist):
341 if(thisHierarchy == JSONTypeObject && valueType == JSONTypeArray && wcscmp(name,L"mylistitem") == 0){
343 nord = NicoMyList_mylistitem;
349 case MAKENORD2(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem):
351 if(thisHierarchy == JSONTypeArray && valueType == JSONTypeObject){
353 nord = NicoMyList_item;
359 case MAKENORD3(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem,NicoMyList_item):
361 if(thisHierarchy == JSONTypeObject && valueType == JSONTypeObject && wcscmp(name,L"item_data") == 0){
363 nord = NicoMyList_item_data;
371 self->container.nord = MAKENORD1(self->container.nord,nord);
378 static JSONVoid myListItemDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param){
380 NicoMyListItemContainer_P self = (NicoMyListItemContainer_P)option;
382 if(thisHierarchy == JSONTypeObject){
383 switch(self->container.nord){
385 case MAKENORD3(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem,NicoMyList_item):
387 if(valueType == JSONTypeDecimal && wcscmp(name,L"create_time") == 0){
389 self->pitem->create_time = wcstoul((LPCTSTR)param,NULL,10);
391 } else if(valueType == JSONTypeString && wcscmp(name,L"description") == 0){
393 self->container.errcode = jsonToArray(self->pitem->description,(LPCTSTR)param);
395 } else if(valueType == JSONTypeString && wcscmp(name,L"item_id") == 0){
397 self->container.errcode = jsonToArray(self->pitem->item_id,(LPCTSTR)param);
399 } else if(valueType == JSONTypeString && wcscmp(name,L"item_type") == 0){
401 self->container.errcode = jsonToArray(self->pitem->item_type,(LPCTSTR)param);
403 } else if(valueType == JSONTypeDecimal && wcscmp(name,L"update_time") == 0){
405 self->pitem->update_time = wcstoul((LPCTSTR)param,NULL,10);
407 } else if(valueType == JSONTypeDecimal && wcscmp(name,L"watch") == 0){
409 self->pitem->watch = wcstoul((LPCTSTR)param,NULL,10);
414 case MAKENORD4(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem,NicoMyList_item,NicoMyList_item_data):
416 if(valueType == JSONTypeString && wcscmp(name,L"deleted") == 0){
418 self->container.errcode = jsonToArray(self->pitem->itemData.deleted,(LPCTSTR)param);
420 } else if(valueType == JSONTypeDecimal && wcscmp(name,L"first_retrieve") == 0){
422 self->pitem->itemData.first_retrieve = wcstoul((LPCTSTR)param,NULL,10);
424 } else if(valueType == JSONTypeString && wcscmp(name,L"group_type") == 0){
426 self->container.errcode = jsonToArray(self->pitem->itemData.group_type,(LPCTSTR)param);
428 } else if(valueType == JSONTypeString && wcscmp(name,L"last_res_body") == 0){
430 self->container.errcode = jsonToArray(self->pitem->itemData.last_res_body,(LPCTSTR)param);
432 } else if(valueType == JSONTypeString && wcscmp(name,L"length_seconds") == 0){
434 self->container.errcode = jsonToArray(self->pitem->itemData.length_seconds,(LPCTSTR)param);
436 } else if(valueType == JSONTypeString && wcscmp(name,L"mylist_counter") == 0){
438 self->container.errcode = jsonToArray(self->pitem->itemData.mylist_counter,(LPCTSTR)param);
440 } else if(valueType == JSONTypeString && wcscmp(name,L"num_res") == 0){
442 self->container.errcode = jsonToArray(self->pitem->itemData.num_res,(LPCTSTR)param);
444 } else if(valueType == JSONTypeString && wcscmp(name,L"thumbnail_url") == 0){
446 self->container.errcode = jsonToArray(self->pitem->itemData.thumbnail_url,(LPCTSTR)param);
448 } else if(valueType == JSONTypeString && wcscmp(name,L"title") == 0){
450 self->container.errcode = jsonToArray(self->pitem->itemData.title,(LPCTSTR)param);
452 } else if(valueType == JSONTypeDecimal && wcscmp(name,L"update_time") == 0){
454 self->pitem->itemData.update_time = wcstoul((LPCTSTR)param,NULL,10);
456 } else if(valueType == JSONTypeString && wcscmp(name,L"video_id") == 0){
458 self->container.errcode = jsonToArray(self->pitem->itemData.video_id,(LPCTSTR)param);
460 } else if(valueType == JSONTypeString && wcscmp(name,L"view_counter") == 0){
462 self->container.errcode = jsonToArray(self->pitem->itemData.view_counter,(LPCTSTR)param);
464 } else if(valueType == JSONTypeString && wcscmp(name,L"watch_id") == 0){
466 self->container.errcode = jsonToArray(self->pitem->itemData.watch_id,(LPCTSTR)param);
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){
481 self->callBack(self->container.option,self->pitem);
482 ZeroMemory(self->pitem,sizeof(*self->pitem));
488 static JSONVoid myListStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name){
490 NicoMyListContainer_P nicoMyListContainer = (NicoMyListContainer_P)option;
491 NicoMyListGroupHierarchy nord;
493 switch(nicoMyListContainer->container.nord){
495 case MAKENORD(NicoMyListGroup_Root):
497 nord = NicoMyListGroup_mylistgrouphead;
502 case MAKENORD1(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead):
504 nord = NicoMyListGroup_mylistgroup;
508 case MAKENORD2(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead,NicoMyListGroup_mylistgroup):
510 nord = NicoMyLIstGroup_mylist;
514 nicoMyListContainer->container.nord = MAKENORD1(nicoMyListContainer->container.nord,nord);
519 static JSONVoid myListDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param){
521 NicoMyListContainer_P self = (NicoMyListContainer_P)option;
523 switch(self->container.nord){
525 case MAKENORD3(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead,NicoMyListGroup_mylistgroup,NicoMyLIstGroup_mylist):
527 //
\96Ê
\93|
\82É
\82È
\82Á
\82½
\82Ì
\82Å
\83}
\83N
\83\8d\82ð
\8eg
\82Á
\82Ä
\92l
\82ð
\93Ç
\82Ý
\8eæ
\82é
529 jsonDataDecimal(L"create_time",self->pMyList->create_time);
531 jsonDataString(L"default_sort",self->pMyList->default_sort,self->container.errcode);
533 jsonDataString(L"description",self->pMyList->description,self->container.errcode);
535 jsonDataString(L"icon_id",self->pMyList->icon_id,self->container.errcode);
537 jsonDataString(L"id",self->pMyList->id,self->container.errcode);
539 jsonDataString(L"name",self->pMyList->name,self->container.errcode);
541 jsonDataString(L"public",self->pMyList->publicType,self->container.errcode);
543 jsonDataString(L"sort_order",self->pMyList->sort_order,self->container.errcode);
545 jsonDataDecimal(L"update_time",self->pMyList->update_time);
547 jsonDataString(L"user_id",self->pMyList->user_id,self->container.errcode);
560 static JSONVoid myListStructEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P param){
562 NicoMyListContainer_P self = (NicoMyListContainer_P)option;
564 self->container.nord = UPNORD(self->container.nord);
566 if(self->container.nord == MAKENORD2(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead,NicoMyListGroup_mylistgroup)){
568 self->callBack(option,self->pMyList);
569 ZeroMemory(self->pMyList,sizeof(*self->pMyList));
576 static NLIB_RESULT jsonStrCpy(LPTSTR buf,LPCTSTR in,SIZE_T size){
578 NLIB_RESULT rslt = NLIB_ERR_OK;
580 if(wcslen(in) < size){
586 rslt = NLIB_ERR_BUFFER_TOOLITTLE;