--- /dev/null
+#include "StdAfx.h"
+#include "nlib_include.h"
+
+
+
+typedef enum {
+
+ NicoMyList_Root = 0,
+ NicoMyList_mylist,
+ NicoMyList_mylistitem,
+ NicoMyList_item,
+ NicoMyList_item_data,
+
+}NicoMyListHierarchy;
+
+typedef enum {
+ NicoMyListGroup_Root = 0,
+ NicoMyListGroup_mylistgrouphead,
+ NicoMyListGroup_mylistgroup,
+ NicoMyLIstGroup_mylist
+
+
+}NicoMyListGroupHierarchy;
+
+typedef struct{
+ UINT64 nord;
+ NLIB_RESULT errcode;
+ LPVOID option;
+
+
+}NMContainer,*NMContainer_P;
+
+typedef struct {
+ NMContainer container;
+ NicoMyListCallBack callBack;
+ NicoMyListItem_P pitem;
+}NicoMyListItemContainer,*NicoMyListItemContainer_P;
+
+
+typedef struct {
+ NMContainer container;
+ NicoMyListGroupCallBack callBack;
+ NicoMyList_P pMyList;
+
+}NicoMyListContainer,*NicoMyListContainer_P;
+
+
+///
+///\83}\83C\83\8a\83X\83g\88ê\97\97\8eæ\93¾\8b¤\92Ê\8f\88\97\9d
+///
+static NLIB_RESULT NicoMyList_getMyListInternal(NicoVideoAuth_P pAuth,LPCTSTR objectName,NicoMyListCallBack callback,LPVOID option);
+
+static NLIB_RESULT NicoMyList_common(NicoVideoAuth_P pAuth,LPCTSTR objectName,JSONStructEventHandler structHandler,JSONDataEventHandler dataHandler,JSONStructEndEventHandler endHandler,LPVOID item);
+
+static NicoMyListItem_P NicoMyListItem_new();
+
+static VOID NicoMyListItem_delete(NicoMyListItem_P *pitem);
+
+static NicoMyList_P NicoMyList_new();
+
+static VOID NicoMyList_delete(NicoMyList_P *pMyList);
+
+static JSONVoid myListStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name);
+
+static JSONVoid myListDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param);
+
+static JSONVoid myListStructEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P param);
+
+static JSONVoid myListItemStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name);
+
+static JSONVoid myListItemDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param);
+
+static JSONVoid myListItemDataEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P param);
+
+
+
+static NLIB_RESULT jsonStrCpy(LPTSTR buf,LPCTSTR in,SIZE_T size);
+
+
+
+
+//
+//\83}\83N\83\8d
+//
+#define jsonToArray(arr,in) jsonStrCpy((arr),(in),sizeof(arr) / sizeof(arr[0]))
+
+#define jsonDataDecimal(nmc,dt) if((valueType) == JSONTypeDecimal && wcscmp((name),(nmc)) == 0){(dt) = wcstoul((LPCTSTR)param,NULL,10);goto jsondataend;}
+#define jsonDataString(nmc,dt,err) if((valueType) == JSONTypeString && wcscmp((name),(nmc)) == 0){(err) = jsonToArray((dt),(LPCTSTR)param);goto jsondataend;}
+
+
+///
+///\82Æ\82è\82 \82¦\82¸\83}\83C\83\8a\83X\83g\88ê\97\97\8eæ\93¾
+///
+NLIB_RESULT NicoMyList_getDefList(NicoVideoAuth_P pAuth,NicoMyListCallBack callback,LPVOID option){
+
+
+ NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
+
+ rslt = NicoMyList_getMyListInternal(pAuth,L"api/deflist/list",callback,option);
+
+
+ return rslt;
+
+}
+
+NLIB_DECLSPEC NLIB_RESULT NicoMyList_getMyList(NicoVideoAuth_P pAuth,LPCTSTR id,NicoMyListCallBack callback,LPVOID option){
+
+ TCHAR objectName[LENGTH_512];
+ NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
+ if(wcslen(id) > ARRAY_LENGTH(objectName) / 2){
+ return NLIB_ERR_BUFFER_TOOLITTLE;
+ }
+
+ wsprintf(objectName,L"api/mylist/list?group_id=%s",id);
+ rslt = NicoMyList_getMyListInternal(pAuth,objectName,callback,option);
+
+ return rslt;
+}
+
+
+static NLIB_RESULT NicoMyList_getMyListInternal(NicoVideoAuth_P pAuth,LPCTSTR objectName,NicoMyListCallBack callback,LPVOID option){
+ NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
+ NicoMyListItemContainer itemContainer;
+ ZeroMemory(&itemContainer,sizeof(itemContainer));
+ itemContainer.callBack = callback;
+ itemContainer.container.option = option;
+ itemContainer.pitem = NicoMyListItem_new();
+ rslt = NicoMyList_common(pAuth,objectName,myListItemStructEventHandler,myListItemDataEventHandler,myListItemDataEndEventHandler,&itemContainer);
+ NicoMyListItem_delete(&itemContainer.pitem);
+
+ return rslt;
+}
+
+NLIB_DECLSPEC NLIB_RESULT NicoMyList_getMyListGroup(NicoVideoAuth_P pAuth,NicoMyListGroupCallBack callback,LPVOID option){
+
+ NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
+ NicoMyListContainer listContainer;
+ ZeroMemory(&listContainer,sizeof(listContainer));
+ listContainer.callBack = callback;
+ listContainer.container.option = option;
+ listContainer.pMyList = NicoMyList_new();
+
+ rslt = NicoMyList_common(pAuth,L"api/mylistgroup/list",myListStructEventHandler,myListDataEventHandler,myListStructEndEventHandler,&listContainer);
+ NicoMyList_delete(&listContainer.pMyList);
+ return rslt;
+}
+NLIB_DECLSPEC NLIB_RESULT NicoMyList_addItem(LPCTSTR video_id){
+
+ NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
+
+ TCHAR addApi[LENGTH_512] = {L"http://www.nicovideo.jp/mylist_add/video/"};
+ if(wcslen(video_id) > ARRAY_LENGTH(addApi) /2){
+
+ goto buffererr;
+ }
+ wcscat(addApi,video_id);
+
+ if(ShellExecute(NULL,L"open",addApi,NULL,NULL,SW_SHOWDEFAULT) <= (HINSTANCE)32){
+ goto shellerr;
+ }
+
+ rslt = NLIB_ERR_OK;
+
+
+end:
+ return rslt;
+
+shellerr:
+ rslt = NLIB_ERR_SHELL_FAILED;
+ goto end;
+
+buffererr:
+ rslt = NLIB_ERR_BUFFER_TOOLITTLE;
+ goto end;
+
+}
+
+//
+//\83v\83\89\83C\83x\81[\83g\8aÖ\90\94
+//
+
+static NLIB_RESULT NicoMyList_common(NicoVideoAuth_P pAuth,LPCTSTR objectName,JSONStructEventHandler structHandler,JSONDataEventHandler dataHandler,JSONStructEndEventHandler endHandler,LPVOID item){
+
+ //\95Ï\90\94\90é\8c¾\81A\8f\89\8aú\89»
+ NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
+ //HINTERNET hNicoVideoSession = NULL;
+ HINTERNET hrequest = NULL;
+ TCHAR sendBuffer[LENGTH_512] = {L"Cookie: "};
+ JSONParser_P jsonParser = JSONParser_new();
+
+
+ const UINT_PTR readBufSize = LENGTH_65536 * 30;
+
+ LPSTR readBuffer = (LPSTR)malloc(readBufSize);
+
+ DWORD readSize;
+
+ DWORD statusCode;
+ DWORD statusCodeSize = sizeof(statusCode);
+
+
+
+
+
+
+
+
+ wcscat(sendBuffer,pAuth->userSession);
+ //hNicoVideoSession = WinHttpConnect(hHttpSession,WWW_NICO_VIDEO_DOMEINNAME,INTERNET_DEFAULT_HTTP_PORT,0);
+
+ hrequest = WinHttpOpenRequest(hNicoVideoConnect,L"GET",objectName,L"1.1",(LPCTSTR)WINHTTP_NO_REFERER,(LPCTSTR*)WINHTTP_DEFAULT_ACCEPT_TYPES,0);
+
+ if(hrequest == NULL){
+ goto networkerr;
+ }
+
+
+
+ if(WinHttpSendRequest(hrequest,sendBuffer,-1,WINHTTP_NO_REQUEST_DATA,0,0,0) == FALSE){
+
+ goto networkerr;
+
+ }
+
+
+
+
+
+
+ if(WinHttpReceiveResponse(hrequest,NULL) == FALSE){
+
+ goto networkerr;
+
+ }
+
+
+ if (WinHttpQueryHeaders(hrequest,WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,WINHTTP_HEADER_NAME_BY_INDEX,&statusCode,&statusCodeSize,WINHTTP_NO_HEADER_INDEX) == FALSE){
+ goto networkerr;
+ }
+
+ if (HTTP_STATUS_OK != statusCode){
+ goto networkerr;
+ }
+
+ if(ReadHttpBody(hrequest,(LPBYTE)readBuffer,readBufSize,&readSize) == FALSE){
+ goto networkerr;
+
+ }
+
+ readBuffer[readSize] = '\0';
+
+
+
+ {
+ JSONResult jsonResult;
+
+
+
+
+ JSONParser_setEventHandler(jsonParser,structHandler,dataHandler,endHandler);
+ jsonResult = JSONParser_Parse(jsonParser,readBuffer,JSON_ENCODE_UTF8,item);
+
+
+
+ if(jsonResult != JSON_ERR_OK){
+
+ goto jsonerr;
+ }
+ }
+
+ rslt = NLIB_ERR_OK;
+
+end:
+ free(readBuffer);
+ JSONParser_delete(&jsonParser);
+ WinHttpCloseHandle(hrequest);
+
+
+ return rslt;
+
+networkerr:
+ rslt = NLIB_ERR_FAILED_NETWORK;
+ goto end;
+jsonerr:
+ rslt = NLIB_ERR_JSON_PARSE;
+ goto end;
+
+}
+
+
+
+
+static NicoMyListItem_P NicoMyListItem_new(){
+
+ NicoMyListItem_P self = (NicoMyListItem_P)calloc(1,sizeof(*self));
+
+ return self;
+}
+
+static VOID NicoMyListItem_delete(NicoMyListItem_P *pitem){
+
+ free(*pitem);
+ (*pitem) = NULL;
+
+ return;
+}
+
+static NicoMyList_P NicoMyList_new(){
+
+ return (NicoMyList_P)calloc(1,sizeof(NicoMyList));
+}
+
+static VOID NicoMyList_delete(NicoMyList_P *pMyList){
+
+ free(*pMyList);
+ (*pMyList) = NULL;
+ return;
+
+}
+
+
+static JSONVoid myListItemStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name){
+
+ NicoMyListHierarchy nord = NicoMyList_Root;
+
+ NicoMyListItemContainer_P self = (NicoMyListItemContainer_P)option;
+
+ switch(self->container.nord){
+
+ case MAKENORD(NicoMyList_Root):
+
+ if(thisHierarchy == JSONTypeRoot && valueType == JSONTypeObject){
+
+ nord = NicoMyList_mylist;
+
+ }
+ break;
+
+ case MAKENORD1(NicoMyList_Root,NicoMyList_mylist):
+
+ if(thisHierarchy == JSONTypeObject && valueType == JSONTypeArray && wcscmp(name,L"mylistitem") == 0){
+
+ nord = NicoMyList_mylistitem;
+
+ }
+
+ break;
+
+ case MAKENORD2(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem):
+
+ if(thisHierarchy == JSONTypeArray && valueType == JSONTypeObject){
+
+ nord = NicoMyList_item;
+
+ }
+
+ break;
+
+ case MAKENORD3(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem,NicoMyList_item):
+
+ if(thisHierarchy == JSONTypeObject && valueType == JSONTypeObject && wcscmp(name,L"item_data") == 0){
+
+ nord = NicoMyList_item_data;
+
+ }
+
+ break;
+
+ }
+
+ self->container.nord = MAKENORD1(self->container.nord,nord);
+
+
+ return;
+}
+
+
+static JSONVoid myListItemDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param){
+
+ NicoMyListItemContainer_P self = (NicoMyListItemContainer_P)option;
+
+ if(thisHierarchy == JSONTypeObject){
+ switch(self->container.nord){
+
+ case MAKENORD3(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem,NicoMyList_item):
+
+ if(valueType == JSONTypeDecimal && wcscmp(name,L"create_time") == 0){
+
+ self->pitem->create_time = wcstoul((LPCTSTR)param,NULL,10);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"description") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->description,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"item_id") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->item_id,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"item_type") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->item_type,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeDecimal && wcscmp(name,L"update_time") == 0){
+
+ self->pitem->update_time = wcstoul((LPCTSTR)param,NULL,10);
+
+ } else if(valueType == JSONTypeDecimal && wcscmp(name,L"watch") == 0){
+
+ self->pitem->watch = wcstoul((LPCTSTR)param,NULL,10);
+ }
+
+ break;
+
+ case MAKENORD4(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem,NicoMyList_item,NicoMyList_item_data):
+
+ if(valueType == JSONTypeString && wcscmp(name,L"deleted") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->itemData.deleted,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeDecimal && wcscmp(name,L"first_retrieve") == 0){
+
+ self->pitem->itemData.first_retrieve = wcstoul((LPCTSTR)param,NULL,10);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"group_type") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->itemData.group_type,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"last_res_body") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->itemData.last_res_body,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"length_seconds") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->itemData.length_seconds,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"mylist_counter") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->itemData.mylist_counter,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"num_res") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->itemData.num_res,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"thumbnail_url") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->itemData.thumbnail_url,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"title") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->itemData.title,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeDecimal && wcscmp(name,L"update_time") == 0){
+
+ self->pitem->itemData.update_time = wcstoul((LPCTSTR)param,NULL,10);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"video_id") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->itemData.video_id,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"view_counter") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->itemData.view_counter,(LPCTSTR)param);
+
+ } else if(valueType == JSONTypeString && wcscmp(name,L"watch_id") == 0){
+
+ self->container.errcode = jsonToArray(self->pitem->itemData.watch_id,(LPCTSTR)param);
+
+ }
+
+ break;
+ }
+ }
+ return;
+}
+
+static JSONVoid myListItemDataEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name){
+ NicoMyListItemContainer_P self = (NicoMyListItemContainer_P)option;
+ self->container.nord = UPNORD(self->container.nord);
+ if(MAKENORD2(NicoMyList_Root,NicoMyList_mylist,NicoMyList_mylistitem) == self->container.nord){
+
+ self->callBack(self->container.option,self->pitem);
+ ZeroMemory(self->pitem,sizeof(*self->pitem));
+
+ }
+ return;
+}
+
+static JSONVoid myListStructEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name){
+
+ NicoMyListContainer_P nicoMyListContainer = (NicoMyListContainer_P)option;
+ NicoMyListGroupHierarchy nord;
+
+ switch(nicoMyListContainer->container.nord){
+
+ case MAKENORD(NicoMyListGroup_Root):
+
+ nord = NicoMyListGroup_mylistgrouphead;
+
+ break;
+
+
+ case MAKENORD1(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead):
+
+ nord = NicoMyListGroup_mylistgroup;
+
+ break;
+
+ case MAKENORD2(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead,NicoMyListGroup_mylistgroup):
+
+ nord = NicoMyLIstGroup_mylist;
+
+ break;
+ }
+ nicoMyListContainer->container.nord = MAKENORD1(nicoMyListContainer->container.nord,nord);
+
+ return;
+}
+
+static JSONVoid myListDataEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P name,JSONParameter param){
+
+ NicoMyListContainer_P self = (NicoMyListContainer_P)option;
+
+ switch(self->container.nord){
+
+ case MAKENORD3(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead,NicoMyListGroup_mylistgroup,NicoMyLIstGroup_mylist):
+
+ //\96Ê\93|\82É\82È\82Á\82½\82Ì\82Å\83}\83N\83\8d\82ð\8eg\82Á\82Ä\92l\82ð\93Ç\82Ý\8eæ\82é
+
+ jsonDataDecimal(L"create_time",self->pMyList->create_time);
+
+ jsonDataString(L"default_sort",self->pMyList->default_sort,self->container.errcode);
+
+ jsonDataString(L"description",self->pMyList->description,self->container.errcode);
+
+ jsonDataString(L"icon_id",self->pMyList->icon_id,self->container.errcode);
+
+ jsonDataString(L"id",self->pMyList->id,self->container.errcode);
+
+ jsonDataString(L"name",self->pMyList->name,self->container.errcode);
+
+ jsonDataString(L"public",self->pMyList->publicType,self->container.errcode);
+
+ jsonDataString(L"sort_order",self->pMyList->sort_order,self->container.errcode);
+
+ jsonDataDecimal(L"update_time",self->pMyList->update_time);
+
+ jsonDataString(L"user_id",self->pMyList->user_id,self->container.errcode);
+
+
+jsondataend:
+
+
+ break;
+
+ }
+
+ return;
+}
+
+static JSONVoid myListStructEndEventHandler(JSONVoid *option,JSONUInt thisHierarchy,JSONUInt valueType,JSONChar_P param){
+
+ NicoMyListContainer_P self = (NicoMyListContainer_P)option;
+
+ self->container.nord = UPNORD(self->container.nord);
+
+ if(self->container.nord == MAKENORD2(NicoMyListGroup_Root,NicoMyListGroup_mylistgrouphead,NicoMyListGroup_mylistgroup)){
+
+ self->callBack(option,self->pMyList);
+ ZeroMemory(self->pMyList,sizeof(*self->pMyList));
+
+ }
+
+ return;
+}
+
+static NLIB_RESULT jsonStrCpy(LPTSTR buf,LPCTSTR in,SIZE_T size){
+
+ NLIB_RESULT rslt = NLIB_ERR_OK;
+
+ if(wcslen(in) < size){
+
+ wcscpy(buf,in);
+
+ }else {
+
+ rslt = NLIB_ERR_BUFFER_TOOLITTLE;
+
+ }
+
+ return rslt;
+}
+
+
+
+
+
--- /dev/null
+#include "StdAfx.h"
+#include "nlib_include.h"
+
+
+
+
+
+
+static NicoLiveHeartBeatContainer heartBeatContainer;
+static CRITICAL_SECTION heartBeatCs;
+
+
+
+//
+//\83}\83N\83\8d
+//
+#define XMLSPACE L" \t\r\n"
+
+#define parseAttr(indexPtr,ans,ane,avs,ave)\
+ (ans) = (indexPtr);\
+ (ane) = wcspbrk((ans),XMLSPACE L"=");\
+ (avs) = wcsstr((ane),L"\"") + 1;\
+ (ave) = wcsstr((avs),L"\"");\
+ (indexPtr) = (ave) + 1
+
+#define skipXMLSPACE(indexPtr)\
+ for(;(*(indexPtr)) == L' ' || (*(indexPtr)) == '\t' || (*(indexPtr)) == '\r' || (*(indexPtr)) == '\n';indexPtr++)
+
+#define partString(ptr,start,end)\
+ ptr = start;\
+ end[0] = L'\0'
+
+
+#define convertXMLTEXT(buf,basePtr,convPtr,endPtr)\
+ (buf) = (basePtr);\
+ for(;(basePtr) < (endPtr);(basePtr)++,(convPtr)++){\
+ if(wcsncmp((basePtr),L"&",wcslen(L"&")) == 0){\
+ (convPtr)[0] = L'&';\
+ (basePtr) += wcslen(L"&") - 1;\
+ } else if(wcsncmp((basePtr),L"<",wcslen(L"<")) == 0){\
+ (convPtr)[0] = L'<';\
+ (basePtr) += wcslen(L"<") - 1;\
+ } else if(wcsncmp((basePtr),L">",wcslen(L">")) == 0){\
+ (convPtr)[0] = L'>';\
+ (basePtr) += wcslen(L">") - 1;\
+ } else if(wcsncmp((basePtr),L""",wcslen(L""")) == 0){\
+ (convPtr)[0] = L'\"';\
+ (basePtr) += wcslen(L""") - 1;\
+ } else if(wcsncmp((basePtr),L"'",wcslen(L"'")) == 0){\
+ (convPtr)[0] = L'\'';\
+ (basePtr) += wcslen(L"'") - 1;\
+ } else {\
+ (convPtr)[0] = (basePtr)[0];\
+ }\
+ }\
+ (convPtr)[0] = L'\0'
+
+#define getBaseVpos(server_time,base_time) (((server_time) - (base_time)) * 100)
+
+#define setMsec(mSec)\
+ timeBeginPeriod(1);\
+ (mSec) = timeGetTime();\
+ timeEndPeriod(1)
+
+#define NicoLiveStream_setVpos(nl,attr)\
+ (nl).chatManager.baseVpos = getBaseVpos((wcstoul((attr),NULL,0)),((nl).playerStatus.stream.base_time));\
+ setMsec((nl).chatManager.commentStartTime)
+
+
+
+
+//
+//\83v\83\89\83C\83x\81[\83g\8aÖ\90\94
+//
+
+///
+///\83v\83\8c\83C\83\84\81[\83X\83e\81[\83^\83X\8eæ\93¾
+///
+static INLINE NLIB_RESULT GetPlayerStatus(NicoLivePlayerStatus_P pPlayerStatus,LPCTSTR userSession,HINTERNET hConnect,LPVOID buffer);
+
+///
+///nicoLiveHistory\8eæ\93¾
+///
+static INLINE NLIB_RESULT GetNicoLiveHistory(NicoLiveStream_P self,HINTERNET hConnect);
+
+
+
+
+
+
+
+
+
+
+
+
+///
+///\83`\83\83\83b\83g\8eó\90M\83\8b\81[\83v\8aJ\8en\8aÖ\90\94
+///
+static unsigned int WINAPI NicoLiveRecvChat(void* lpBuffer);
+
+///
+///\83n\81[\83g\83r\81[\83g\91\97\90M\83\8b\81[\83v\8aÖ\90\94
+///
+static unsigned int WINAPI NicoLiveHeartBeatThread(void* lpBuffer);
+
+
+///
+///\83L\81[\83v\83A\83\89\83C\83u\91\97\90M\83\8b\81[\83v\8aÖ\90\94
+///
+static unsigned int WINAPI NicoLiveKeapALiveThread(void* lpBuffer);
+
+
+
+
+///
+///\83`\83\83\83b\83g\8eó\90M\83\8b\81[\83v\8aÖ\90\94
+///
+static BOOL NicoLiveRecvChatLoop(NicoLiveStream_P self);
+
+///
+///\83\8b\81[\83v
+///
+static unsigned int loopCommon(NicoLiveStream_P self,WSAEVENT sendEvent,WSAEVENT resetEvent ,NicoLiveOnSend nicoLiveOnSend,LPDWORD time);
+
+///
+///\83R\83\81\83\93\83g\89ð\90Í\8aÖ\90\94
+///
+static VOID NicoLiveParseComment(NicoLiveStream_P self,LPTSTR commentBuf,UINT_PTR endSize,LPTSTR* mailCountBuf,SIZE_T* mailCountBufSize,SIZE_T* commentBufSize);
+
+static void NicoLiveError(void *buf);
+
+static void NicoLiveSelfDisconnect(void *buf);
+
+static VOID OnSendHeartBeat(NicoLiveStream_P self);
+
+static VOID OnSendKeepAllive(NicoLiveStream_P self);
+///
+///\83\\83P\83b\83g\8eæ\93¾\8aÖ\90\94
+///
+static INLINE SOCKET GetConectedSocket(LPCTSTR nordName,LPCTSTR port,int socktype,int addr_famiry,int protocol);
+
+
+StreamStatus_P NicoLiveStream_getStreamStatus(NicoLiveStream_P self){
+
+ return &self->playerStatus.stream;
+}
+
+BOOL Initialize_NicoLive(){
+
+
+
+
+
+ //\83n\81[\83g\83r\81[\83g\83R\83\93\83e\83i\8f\89\8aú\89»
+ ZeroMemory(&heartBeatContainer,sizeof(heartBeatContainer));
+ heartBeatContainer.is_restrictSize = sizeof(TCHAR) * LENGTH_1024;
+ heartBeatContainer.is_restrictBuff = (LPTSTR)calloc(1,heartBeatContainer.is_restrictSize);
+ heartBeatContainer.heartBeat.is_restrict = heartBeatContainer.is_restrictBuff;
+
+ heartBeatContainer.ticketSize = sizeof(TCHAR) * LENGTH_1024;
+ heartBeatContainer.ticketBuff = (LPTSTR)calloc(1,heartBeatContainer.ticketSize);
+ heartBeatContainer.heartBeat.ticket = heartBeatContainer.ticketBuff;
+
+ InitializeCriticalSection(&heartBeatCs);
+
+
+ return TRUE;
+
+
+
+}
+
+
+extern BOOL Finalize_NicoLive(){
+
+
+ DeleteCriticalSection(&heartBeatCs);
+
+ //\83p\81[\83T\8cã\8f\88\97\9d
+ free(heartBeatContainer.is_restrictBuff);
+ free(heartBeatContainer.ticketBuff);
+
+
+
+
+
+
+
+
+
+ return TRUE;
+}
+
+
+NicoLiveStream_P NicoLiveStream_new(){
+ //\90¶\90¬&\8f\89\8aú\89»
+ NicoLiveStream_P self = (NicoLiveStream_P)calloc(1,sizeof(NicoLiveStream));
+
+ //\8f\89\8aú\92l\82Ì\90Ý\92è
+ self->chatManager.onHeartBeatSend = OnSendHeartBeat;
+
+ self->chatManager.onKeepAlliveSend = OnSendKeepAllive;
+
+ InitializeCriticalSection(&self->sessionManager.cs);
+
+ self->chatManager.heartBeatTime = 300000;
+
+ self->chatManager.heartBeatFlag = TRUE;
+
+ self->chatManager.keepAliveTime = 900000;
+
+ self->chatManager.keapALiveFlag = FALSE;
+
+ self->isConnecting = FALSE;
+
+ self->chatManager.endEvent = WSACreateEvent();
+
+ self->chatManager.startEvent = WSACreateEvent();
+
+ self->chatManager.deleteEvent = WSACreateEvent();
+
+ self->chatManager.setHeartBeatTimeEvent = WSACreateEvent();
+
+ self->chatManager.setKeepAliveTimeEvent = WSACreateEvent();
+
+ self->chatManager.resetEvents[0] = WSACreateEvent();
+
+ self->chatManager.resetEvents[1] = WSACreateEvent();
+
+ self->chatManager.resetEvents[2] = WSACreateEvent();
+
+
+
+
+
+ //\83X\83\8c\83b\83h\82Ì\8aJ\8en
+ self->chatManager.hRecvChatHandle = (HANDLE)_beginthreadex(NULL,0,NicoLiveRecvChat,self,0,&self->chatManager.recvChatThreadID);
+
+ self->chatManager.hHeartBeatHandle = (HANDLE)_beginthreadex(NULL,0,NicoLiveHeartBeatThread,self,0,&self->chatManager.heartBeatThreadID);
+
+ self->chatManager.hKeapALiveHandle = (HANDLE)_beginthreadex(NULL,0,NicoLiveKeapALiveThread,self,0,&self->chatManager.keapALiveThreadID);
+
+
+ return self;
+}
+
+
+
+//
+//\83j\83R\83j\83R\90¶\95ú\91\97\8aÖ\98A\8aÖ\90\94
+///////////////////////////////////////////////////
+
+VOID NicoLiveStream_delete(NicoLiveStream_P* self){
+
+ NicoLiveStream_disConnect((*self));
+
+ WSASetEvent((*self)->chatManager.deleteEvent);
+
+ if(INVALID_HANDLE_VALUE != (*self)->chatManager.hRecvChatHandle){
+ WaitForSingleObject( (*self)->chatManager.hRecvChatHandle, INFINITE );
+ CloseHandle((*self)->chatManager.hRecvChatHandle);
+ }
+
+ if(INVALID_HANDLE_VALUE != (*self)->chatManager.hHeartBeatHandle){
+
+ WaitForSingleObject((*self)->chatManager.hHeartBeatHandle,INFINITE);
+ CloseHandle((*self)->chatManager.hHeartBeatHandle);
+ }
+
+ if(INVALID_HANDLE_VALUE != (*self)->chatManager.hKeapALiveHandle){
+
+ WaitForSingleObject((*self)->chatManager.hKeapALiveHandle,INFINITE);
+ CloseHandle((*self)->chatManager.hKeapALiveHandle);
+
+ }
+
+
+
+
+
+
+
+ //\8cã\8f\88\97\9d&\94j\8aü
+
+ DeleteCriticalSection(&(*self)->sessionManager.cs);
+
+ WSACloseEvent((*self)->chatManager.setHeartBeatTimeEvent);
+
+ WSACloseEvent((*self)->chatManager.setKeepAliveTimeEvent);
+
+ WSACloseEvent((*self)->chatManager.endEvent);
+
+ WSACloseEvent((*self)->chatManager.startEvent);
+
+ WSACloseEvent((*self)->chatManager.deleteEvent);
+
+ WSACloseEvent((*self)->chatManager.resetEvents[0]);
+
+ WSACloseEvent((*self)->chatManager.resetEvents[1]);
+
+ WSACloseEvent((*self)->chatManager.resetEvents[2]);
+
+
+
+
+ free((*self));
+
+ (*self) = (NicoLiveStream_P)NULL;
+
+ return;
+}
+
+
+///
+///\83n\81[\83g\83r\81[\83g\82Ì\8aÔ\8au\82ð\90Ý\92è\81i\83~\83\8a\95b)
+///
+VOID NicoLiveStream_setHeartBeatMsec(NicoLiveStream_P self,DWORD msec){
+
+
+ self->chatManager.heartBeatTime = msec;
+ WSASetEvent(self->chatManager.setHeartBeatTimeEvent);
+ return;
+}
+
+///
+///\83n\81[\83g\83r\81[\83g\82Ì\8aÔ\8au\82ð\8eæ\93¾(\83~\83\8a\95b)
+///
+DWORD NicoLiveStream_getHeartBeatMsec(NicoLiveStream_P self){
+
+ return self->chatManager.heartBeatTime;
+
+
+}
+
+///
+///\83n\81[\83g\83r\81[\83g\97L\8cø\81E\96³\8cø\90Ý\92è
+///
+VOID NicoLiveStream_setHeartBeatFlag(NicoLiveStream_P self,BOOL flag){
+
+ self->chatManager.heartBeatFlag = flag;
+
+}
+
+
+///
+///\83n\81[\83g\83r\81[\83g\97L\8cø\83t\83\89\83O\8eæ\93¾
+///
+BOOL NicoLiveStream_getHeartBeatFlag(NicoLiveStream_P self){
+
+ return self->chatManager.heartBeatFlag;
+
+
+}
+
+
+///
+///\83L\81[\83v\83A\83\89\83C\83u\82Ì\8aÔ\8au\82ð\90Ý\92è(\83~\83\8a\95b)
+///
+VOID NicoLiveStream_setKeapALiveMsec(NicoLiveStream_P self,DWORD msec){
+
+
+ self->chatManager.keepAliveTime = msec;
+ WSASetEvent(self->chatManager.setKeepAliveTimeEvent);
+ return;
+
+}
+
+///
+///\83L\81[\83v\83A\83\89\83C\83u\82Ì\8aÔ\8au\82ð\8eæ\93¾(\83~\83\8a\95b)
+///
+DWORD NicoLiveStream_getKeapALiveMsec(NicoLiveStream_P self){
+
+ return self->chatManager.keepAliveTime;
+
+}
+
+
+///
+///\83L\81[\83v\83A\83\89\83C\83u\97L\8cø\81E\96³\8cø\90Ý\92è
+///
+VOID NicoLiveStream_setKeapALiveFlag(NicoLiveStream_P self,BOOL flag){
+
+ self->chatManager.keapALiveFlag = flag;
+}
+
+
+///
+///\83L\81[\83v\83A\83\89\83C\83u\83t\83\89\83O\8eæ\93¾
+///
+BOOL NicoLiveStream_getKeapALiveFlag(NicoLiveStream_P self){
+
+ return self->chatManager.keapALiveFlag;
+
+}
+
+VOID NicoLiveStrream_setResFrom(NicoLiveStream_P self,INT_PTR res){
+
+
+
+ self->res_from = (res < 0 || res > 1000) ? 0 : ((-1) * res);
+
+}
+
+INT_PTR NicoLiveStream_getResFrom(NicoLiveStream_P self){
+
+ return (-1) * self->res_from;
+}
+
+NLIB_RESULT NicoLiveStream_connect(NicoLiveStream_P self,NicoVideoAuth_P nicoVideoAuth,LPCTSTR url,NicoRecvCallBack callback,LPVOID option){
+
+#define NICOLIVE_CONNECTIONSTREAM_COOKIE_COUNT 1
+#define LIVENO_LENGTH LENGTH_NICOLIVEID
+
+ NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
+
+
+
+
+
+
+
+ //url\82©\82ç\90Ú\91±\94Ô\8d\86\82ð\92\8a\8fo
+ LPCTSTR pInputLiveNo = url;
+ LPCTSTR psrech = wcsstr(url,L"http://");
+ LPCTSTR pInputLiveNoEnd;
+ TCHAR liveNo[LIVENO_LENGTH] = {0};
+
+
+ if(self == NULL)goto end;
+
+ //\91O\82É\82Â\82È\82¢\82Å\82¢\82½\95ú\91\97\82ð\90Ø\92f
+ NicoLiveStream_disConnect(self);
+
+ if(psrech != NULL){
+
+ psrech += 7;
+
+ for(;psrech != NULL;psrech = wcsstr(psrech +1,L"/")){
+
+ pInputLiveNo = psrech + 1;
+
+
+ }
+ }
+
+ pInputLiveNoEnd = wcsstr(pInputLiveNo,L"?");
+
+ if(pInputLiveNoEnd == NULL){
+
+ pInputLiveNoEnd = pInputLiveNo + wcslen(pInputLiveNo);
+
+ }
+
+ if(pInputLiveNo == NULL){
+
+ rslt = NLIB_LIVENO_IS_NULL;
+ goto end;
+
+ }else if(pInputLiveNoEnd - pInputLiveNo + 2 >= LIVENO_LENGTH - 1){
+
+ rslt = NLIB_LIVENO_FAILED_TOOBIG;
+ goto end;
+
+ } else if((wcsncmp(pInputLiveNo,TEXT("lv"),2) == 0)||(( wcsncmp(pInputLiveNo,TEXT("co"),2) == 0) || (wcsncmp(pInputLiveNo,TEXT("ch"),2) == 0) )){
+
+
+ wcsncpy(liveNo,pInputLiveNo,pInputLiveNoEnd - pInputLiveNo);
+
+
+ } else if(_wtoi(pInputLiveNo) != 0){
+
+ wcscpy(liveNo,L"lv");
+ wcsncat(liveNo,pInputLiveNo,pInputLiveNoEnd - pInputLiveNo);
+
+ } else {
+
+ rslt = NLIB_LIVENO_FAILED_UNDEFEINE;
+ goto end;
+
+
+ }
+
+
+
+
+ wcsncpy(self->userSession,L"Cookie: ",sizeof(self->userSession) / sizeof(self->userSession[0]) - 1);
+ wcsncat(self->userSession,nicoVideoAuth->userSession,sizeof(self->userSession) / sizeof(self->userSession[0]) - 1);
+ self->userSession[sizeof(self->userSession) / sizeof(self->userSession[0]) - 1] = L'\0';
+
+
+
+
+ {
+ TCHAR objectName[LENGTH_256] = {L"api/getplayerstatus?v="};
+ wcsncat(objectName,liveNo,sizeof(objectName) / sizeof(objectName[0]));
+
+
+
+
+
+ self->sessionManager.getPlayerStatusSession = WinHttpOpenRequest(hWatchLiveNicoConnect,L"GET",objectName,L"1.1",(LPCTSTR)WINHTTP_NO_REFERER,(LPCTSTR*)WINHTTP_DEFAULT_ACCEPT_TYPES,0);
+ }
+
+ //\83v\83\8c\83C\83\84\81[\83X\83e\81[\83^\83X\8eæ\93¾
+ EnterCriticalSection(&self->sessionManager.cs);
+ rslt = GetPlayerStatus(&self->playerStatus,self->userSession,self->sessionManager.getPlayerStatusSession,self->sessionManager.buffer);
+ LeaveCriticalSection(&self->sessionManager.cs);
+
+ if(rslt != NLIB_ERR_OK){
+
+ goto end;
+ }
+
+
+
+ //\90¶\95ú\91\97\83I\83u\83W\83F\83N\83g\82É\8ae\88ø\90\94\82ð\90Ý\92è
+
+ self->callBack = callback;
+ self->option = option;
+
+
+ WSASetEvent(self->chatManager.startEvent);
+
+ self->isConnecting = TRUE;
+
+
+ rslt = NLIB_ERR_OK;
+ //nicoLiveHistory\82ð\8eæ\93¾(\95K\97v\82È\82µ\81H)
+ //GetNicoLiveHistory(self,hWatchLiveNicVideo);
+
+end:
+
+
+ return rslt;
+}
+
+
+NLIB_RESULT NicoLiveStream_sendHeartBeat(NicoLiveStream_P self){
+
+
+ NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
+
+ if(self->isConnecting == FALSE){
+ rslt = NLIB_ERR_NOT_LIVECONNECT;
+ goto end;
+ }
+ if(self == NULL || self->playerStatus.error != NLIB_ERR_OK){
+
+ rslt = NLIB_ERR_PLAYERSTATUS_ERROR;
+ goto end;
+
+ }
+
+
+ EnterCriticalSection(&self->sessionManager.cs);
+ {
+ //HINTERNET hWatchLiveNicoSession = NULL;
+ //HINTERNET hGetPlayerStatusRequest = NULL;
+ const UINT_PTR buflen = LENGTH_65536;
+ LPVOID buffer = self->sessionManager.buffer;
+
+ LPTSTR objectName = (LPTSTR)buffer;
+ LPTSTR indexPtr;
+ //LPTSTR sendBuffer = (LPTSTR)&objectName[LENGTH_4096];
+ LPSTR recvBuffer = (LPSTR)&objectName[LENGTH_4096];
+ DWORD readSize;
+ DWORD statusCode;
+ DWORD statusCodeSize = sizeof(statusCode);
+
+ //hWatchLiveNicoSession = hWatchLiveNicoConnect;
+
+ wcscpy(objectName,L"/api/heartbeat?v=");
+ indexPtr = objectName + wcslen(objectName);
+ wcscpy(indexPtr,self->playerStatus.stream.id);
+ //wcscpy(sendBuffer,L"Cookie: ");
+ //indexPtr = sendBuffer + wcslen(sendBuffer);
+ wcscpy(indexPtr,self->userSession);
+
+
+
+
+ if(self->sessionManager.heartBeatSession == NULL){
+ self->sessionManager.heartBeatSession = WinHttpOpenRequest(hWatchLiveNicoConnect,L"GET",objectName,L"1.1",(LPCTSTR)WINHTTP_NO_REFERER,(LPCTSTR*)WINHTTP_DEFAULT_ACCEPT_TYPES,0);
+
+ }
+ if(WinHttpSendRequest(self->sessionManager.heartBeatSession,self->userSession,-1,WINHTTP_NO_REQUEST_DATA,0,0,0) == FALSE){
+
+ rslt = NLIB_ERR_FAILED_NETWORK;
+ goto connectend;
+
+ }
+
+ if(WinHttpReceiveResponse(self->sessionManager.heartBeatSession,NULL) == FALSE){
+
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto connectend;
+
+ }
+
+
+ if (WinHttpQueryHeaders(self->sessionManager.heartBeatSession,WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,WINHTTP_HEADER_NAME_BY_INDEX,&statusCode,&statusCodeSize,WINHTTP_NO_HEADER_INDEX) == FALSE){
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto connectend;
+ }
+
+
+ if (HTTP_STATUS_OK != statusCode){
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto connectend;
+ }
+
+
+ //recvBuffer = (LPSTR)sendBuffer;
+
+
+ if(ReadHttpBody(self->sessionManager.heartBeatSession,(LPBYTE)recvBuffer,buflen,&readSize) == FALSE){
+
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto connectend;
+
+ }
+
+ {
+
+
+ EnterCriticalSection(&heartBeatCs);
+
+ XMLParse(&heartBeatContainer,recvBuffer,NicoLiveHeartBeat_ElementStartHandler,NicoLiveHeartBeat_ElementEndHandler,NicoLiveHeartBeat_CharacterDataHandler);
+
+ self->chatManager.baseVpos = getBaseVpos(heartBeatContainer.heartBeat.time, self->playerStatus.stream.base_time);
+ setMsec(self->chatManager.commentStartTime);
+
+ self->callBack(NICOLIVE_EVENT_SEND_HEARTBEAT,self,self->option,(NICOLIVE_PARAM)&heartBeatContainer.heartBeat,(NICOLIVE_PARAM)NULL);
+
+ ZeroMemory(&heartBeatContainer.heartBeat,sizeof(heartBeatContainer.heartBeat));
+
+ ZeroMemory(heartBeatContainer.is_restrictBuff,heartBeatContainer.is_restrictSize);
+
+ ZeroMemory(heartBeatContainer.ticketBuff,heartBeatContainer.ticketSize);
+
+ heartBeatContainer.heartBeat.is_restrict = heartBeatContainer.is_restrictBuff;
+
+ heartBeatContainer.heartBeat.ticket = heartBeatContainer.ticketBuff;
+
+ LeaveCriticalSection(&heartBeatCs);
+
+
+ }
+
+ rslt = NLIB_ERR_OK;
+connectend:
+ ZeroMemory(self->sessionManager.buffer,sizeof(self->sessionManager.buffer));
+ LeaveCriticalSection(&self->sessionManager.cs);
+
+
+
+
+ }
+end:
+
+
+ return rslt;
+}
+
+VOID NicoLiveStream_disConnect(NicoLiveStream_P self){
+
+ if(self == NULL)goto end;
+
+ while(WSAResetEvent(self->chatManager.startEvent) == FALSE);
+ while(WSASetEvent(self->chatManager.endEvent)== FALSE);
+
+
+
+
+
+ WSAWaitForMultipleEvents(sizeof(self->chatManager.resetEvents) / sizeof(self->chatManager.resetEvents[0]),self->chatManager.resetEvents,TRUE,WSA_INFINITE,FALSE);
+
+
+
+ //nicoLiveStream_Initialize(*self);
+ ZeroMemory(&self->playerStatus,sizeof(self->playerStatus));
+ WSAResetEvent(self->chatManager.endEvent);
+
+ WinHttpCloseHandle(self->sessionManager.getPlayerStatusSession);
+ self->sessionManager.getPlayerStatusSession = NULL;
+ WinHttpCloseHandle(self->sessionManager.heartBeatSession);
+ self->sessionManager.heartBeatSession = NULL;
+
+
+
+ self->isConnecting = FALSE;
+
+end:
+
+
+ return;
+
+
+
+}
+
+
+#define NICOLIVE_SENDCHATBUFLEN LENGTH_4096
+#define NICOLIVE_SENDFORMAT "<chat thread=\"%d\" ticket=\"%S\" postkey=\"%s\" user_id=\"%S\" premium=\"%d\" locale=\"%S\" vpos=\"%ld\"%s>%S</chat>"
+
+NLIB_RESULT NicoLiveStream_sendChat(NicoLiveStream_P self,LPCTSTR chatbuf,LPCTSTR *mail,LPCTSTR *extends){
+
+ NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
+ EnterCriticalSection(&self->sessionManager.cs);
+
+ {
+ const UINT_PTR buflen = LENGTH_65536 * 4;
+ LPVOID chunk = self->sessionManager.buffer;
+
+ LPSTR postKey;
+ LPSTR postKeyBuf = (LPSTR)chunk;
+ LPTSTR postKeyReqBuf = (LPTSTR)&postKeyBuf[NICOLIVE_SENDCHATBUFLEN];
+ LPTSTR cookieBuf = &postKeyReqBuf[NICOLIVE_SENDCHATBUFLEN];
+ DWORD statusCode;
+ DWORD statusCodeSize = sizeof(statusCode);
+ DWORD readSize;
+
+ //HINTERNET hWatchLiveNicoVideo = NULL;
+ HINTERNET hGetPostKeySession = NULL;
+
+
+ if(self->isConnecting == FALSE){
+ rslt = NLIB_ERR_NOT_LIVECONNECT;
+ goto errorend;
+ }
+ if(chatbuf == NULL || wcslen(chatbuf) >= LENGTH_1024){
+
+ rslt = NLIB_ERR_BUFFER_TOOLITTLE;
+ goto errorend;
+
+ }
+
+
+ //postkey\8eæ\93¾
+ _swprintf(postKeyReqBuf,L"api/getpostkey?thread=%u&block_no=%u",self->playerStatus.ms.thread,self->chatManager.chatNo / 100);
+
+ //hWatchLiveNicoVideo = WinHttpConnect(hHttpSession,WTEXT(WATCH_LIVE_NICO_VIDEO_DOMEINNAME),INTERNET_DEFAULT_HTTP_PORT,0);
+ hGetPostKeySession = WinHttpOpenRequest(hWatchLiveNicoConnect,L"GET",postKeyReqBuf,L"1.1",(LPCTSTR)WINHTTP_NO_REFERER,(LPCTSTR*)WINHTTP_DEFAULT_ACCEPT_TYPES,0);
+
+
+ //_swprintf(cookieBuf,L"Cookie: %s; %s",self->userSession,self->nicoLiveHistory);
+ _swprintf(cookieBuf,L"Cookie: %s",self->userSession);
+
+ if(WinHttpSendRequest(hGetPostKeySession,self->userSession,-1,WINHTTP_NO_REQUEST_DATA,0,0,0) == FALSE){
+
+ rslt = NLIB_ERR_LIVE_GETPOSTKEY_FAILED;
+ goto errorend;
+
+ }
+
+
+ if(WinHttpReceiveResponse(hGetPostKeySession,NULL) == FALSE){
+
+ rslt = NLIB_ERR_LIVE_GETPOSTKEY_FAILED;
+ goto errorend;
+
+ }
+
+
+ if (WinHttpQueryHeaders(hGetPostKeySession,WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,WINHTTP_HEADER_NAME_BY_INDEX,&statusCode,&statusCodeSize,WINHTTP_NO_HEADER_INDEX) == FALSE){
+ rslt = NLIB_ERR_LIVE_GETPOSTKEY_FAILED;
+ goto errorend;
+ }
+
+
+ if (HTTP_STATUS_OK != statusCode){
+ rslt = NLIB_ERR_LIVE_GETPOSTKEY_FAILED;
+ goto errorend;
+ }
+
+
+
+
+
+ if(ReadHttpBody(hGetPostKeySession,(LPBYTE)postKeyBuf,buflen,&readSize) == FALSE){
+
+ rslt = NLIB_ERR_LIVE_GETPOSTKEY_FAILED;
+ goto errorend;
+
+ }
+ postKeyBuf[readSize] = '\0';
+ postKey = strstr(postKeyBuf,"=") + 1;
+
+
+ {
+ LPSTR buffer = (LPSTR)&cookieBuf[NICOLIVE_SENDCHATBUFLEN];
+ LPSTR indexPtr;
+ LPSTR mailBuf;
+ LPSTR extendBuf;
+
+ //mail\83R\83}\83\93\83h\8dì\90¬
+ if(mail == NULL || mail[0] == NULL){
+
+ mailBuf = "";
+
+ } else {
+ INT_PTR len;
+ mailBuf = (LPSTR)postKeyReqBuf;
+ indexPtr = mailBuf;
+ strcpy(indexPtr,"mail=\"");
+ indexPtr += strlen(indexPtr);
+
+ len = NICOLIVE_SENDCHATBUFLEN - (indexPtr - mailBuf) - 1;
+ if(GetLenToMB(CP_UTF8,mail[0]) >= len){
+ rslt = NLIB_ERR_BUFFER_TOOLITTLE;
+ goto errorend;
+
+ }
+
+
+ WideToMB(CP_UTF8,mail[0],indexPtr,len);
+ indexPtr += strlen(indexPtr);
+
+
+ for(mail++;mail[0] != NULL;mail++){
+
+ indexPtr[0] = ' ';
+ indexPtr++;
+
+ len = NICOLIVE_SENDCHATBUFLEN - (indexPtr - mailBuf) - 1;
+
+ if(GetLenToMB(CP_UTF8,mail[0]) >= len){
+ rslt = NLIB_ERR_BUFFER_TOOLITTLE;
+ goto errorend;
+
+ }
+
+ WideToMB(CP_UTF8,mail[0],indexPtr,len);
+ indexPtr += strlen(indexPtr);
+
+ }
+
+ strcpy(indexPtr,"\"");
+
+
+
+
+ }
+
+ //\8ag\92£\91®\90«\8dì\90¬
+ if(extends == NULL || extends[0] == NULL){
+
+ extendBuf = "";
+
+ } else {
+ INT_PTR len;
+ extendBuf =(LPSTR)cookieBuf;
+ indexPtr = extendBuf;
+
+
+ len = NICOLIVE_SENDCHATBUFLEN - (indexPtr - extendBuf) - 1;
+
+ if(GetLenToMB(CP_UTF8,extends[0]) >= len){
+ rslt = NLIB_ERR_BUFFER_TOOLITTLE;
+ goto errorend;
+
+ }
+ WideToMB(CP_UTF8,extends[0],indexPtr,len);
+
+ indexPtr += strlen(indexPtr);
+
+ strcpy(indexPtr,"=\"");
+ indexPtr += strlen(indexPtr);
+
+
+ len = NICOLIVE_SENDCHATBUFLEN - (indexPtr - extendBuf) - 1;
+
+ if(GetLenToMB(CP_UTF8,extends[1]) >= len){
+ rslt = NLIB_ERR_BUFFER_TOOLITTLE;
+ goto errorend;
+
+ }
+ WideToMB(CP_UTF8,extends[1],indexPtr,len);
+
+
+ for(extends+= 2;extends[0] != NULL;extends+=2){
+
+ indexPtr[0] = ' ';
+ indexPtr++;
+
+ len = NICOLIVE_SENDCHATBUFLEN - (indexPtr - extendBuf) - 1;
+
+ if(GetLenToMB(CP_UTF8,extends[0]) >= len){
+ rslt = NLIB_ERR_BUFFER_TOOLITTLE;
+ goto errorend;
+
+ }
+ WideToMB(CP_UTF8,extends[0],indexPtr,len);
+
+ indexPtr += strlen(indexPtr);
+
+ indexPtr[0] = '=';
+ indexPtr++;
+
+
+ len = NICOLIVE_SENDCHATBUFLEN - (indexPtr - extendBuf) - 1;
+
+ if(GetLenToMB(CP_UTF8,extends[1]) >= len){
+ rslt = NLIB_ERR_BUFFER_TOOLITTLE;
+ goto errorend;
+
+ }
+ WideToMB(CP_UTF8,extends[1],indexPtr,len);
+
+
+
+ }
+ indexPtr += strlen(indexPtr);
+ strcpy(indexPtr,"\"");
+
+
+
+ }
+
+ //\83`\83\83\83b\83g\91\97\90M\83R\83\81\83\93\83g\8dì\90¬
+ {
+ indexPtr = buffer;
+ //\96{\93\96\82Í\82±\82¤\82µ\82½\82¢:"<chat thread=\"%d\" ticket=\"%S\" postkey=\"%s\" user_id=\"%S\" premium=\"%d\" locale=\"%S\" vpos=\"%ld\"%s>%S</chat>"
+ strcpy(indexPtr,"<chat thread=\"");
+ indexPtr += strlen(indexPtr);
+ sprintf(indexPtr,"%u",self->playerStatus.ms.thread);
+ indexPtr += strlen(indexPtr);
+ strcpy(indexPtr,"\" ticket=\"");
+ indexPtr += strlen(indexPtr);
+ WideToMB(CP_UTF8,self->ticket,indexPtr,NICOLIVE_SENDCHATBUFLEN - (indexPtr - buffer) - 1);
+ indexPtr += strlen(indexPtr);
+ strcpy(indexPtr,"\" postkey=\"");
+ indexPtr += strlen(indexPtr);
+ strcpy(indexPtr,postKey);
+ indexPtr += strlen(indexPtr);
+ strcpy(indexPtr,"\" user_id=\"");
+ indexPtr += strlen(indexPtr);
+ WideToMB(CP_UTF8,self->playerStatus.user.user_id,indexPtr,NICOLIVE_SENDCHATBUFLEN - (indexPtr - buffer) - 1);
+ indexPtr += strlen(indexPtr);
+ strcpy(indexPtr,"\" premium=\"");
+ indexPtr += strlen(indexPtr);
+ sprintf(indexPtr,"%u",self->playerStatus.user.is_premium);
+ indexPtr += strlen(indexPtr);
+ strcpy(indexPtr,"\" locale=\"");
+ indexPtr += strlen(indexPtr);
+ WideToMB(CP_UTF8,self->playerStatus.user.userDomain,indexPtr,NICOLIVE_SENDCHATBUFLEN - (indexPtr - buffer) - 1);
+ indexPtr += strlen(indexPtr);
+ strcpy(indexPtr,"\" vpos=\"");
+ indexPtr += strlen(indexPtr);
+
+
+ timeBeginPeriod(1);
+ sprintf(indexPtr,"%u",(self->chatManager.baseVpos + ((timeGetTime() - self->chatManager.commentStartTime) / 10)));
+ timeEndPeriod(1);
+
+ indexPtr += strlen(indexPtr);
+ strcpy(indexPtr,"\"");
+ indexPtr += strlen(indexPtr);
+
+ if(strlen(mailBuf) > 0 && strlen(extendBuf) > 0){
+
+ indexPtr[0] = ' ';
+ indexPtr++;
+ strcpy(indexPtr,mailBuf);
+ indexPtr += strlen(indexPtr);
+
+ indexPtr[0] = ' ';
+ indexPtr++;
+
+ strcpy(indexPtr,extendBuf);
+ indexPtr += strlen(indexPtr);
+
+
+ } else if(strlen(mailBuf) > 0){
+ indexPtr[0] = ' ';
+ indexPtr++;
+ strcpy(indexPtr,mailBuf);
+ indexPtr += strlen(indexPtr);
+
+ } else if(strlen(extendBuf) > 0){
+ indexPtr[0] = ' ';
+ indexPtr++;
+ strcpy(indexPtr,extendBuf);
+ indexPtr += strlen(indexPtr);
+ }
+ strcpy(indexPtr,">");
+ indexPtr += strlen(indexPtr);
+ {
+ LPTSTR sendBuf = (LPTSTR)&buffer[NICOLIVE_SENDCHATBUFLEN * 4];
+ LPTSTR sendPtr = sendBuf;
+ LPCTSTR endPtr= chatbuf + wcslen(chatbuf);
+
+
+ //convertTEXT(indexPtr,chatbuf,indexPtr,endPtr);
+
+ for(;(chatbuf) <= (endPtr);(chatbuf)++){
+ switch(chatbuf[0]){
+ case L'&':
+ wcscpy((sendBuf),L"&");
+ (sendBuf) += wcslen(sendBuf);
+ break;
+ case L'<':
+ wcscpy((sendBuf),L"<");
+ (sendBuf) += wcslen(sendBuf);
+ break;
+ case L'>':
+ wcscpy((sendBuf),L">");
+ (sendBuf) += wcslen(sendBuf);
+ break;
+ case L'\"':
+ wcscpy((sendBuf),L""");
+ (sendBuf) += wcslen(sendBuf);
+ break;
+ case L'\'':
+ wcscpy((sendBuf),L"'");
+ (sendBuf) += wcslen(sendBuf);
+ break;
+ default:
+ sendBuf[0] = chatbuf[0];
+ (sendBuf)++;
+ break;
+ }
+ }
+
+
+ WideToMB(CP_UTF8,sendPtr,indexPtr,NICOLIVE_SENDCHATBUFLEN * 4 - (indexPtr - buffer) - 1);
+ indexPtr += strlen(indexPtr);
+
+ }
+ strcpy(indexPtr,"</chat>");
+ indexPtr[strlen(indexPtr)] = '\0';
+
+
+
+ {
+ INT_PTR sendLen = 0;
+ INT_PTR sentLen = 0;
+ INT_PTR max = strlen(buffer) + 1;
+
+ do{
+ sendLen = send(self->chatManager.sock,buffer,max - sentLen,0);
+ sentLen += sendLen;
+ } while(sendLen > 0);
+
+ }
+ }
+ }
+
+ rslt = NLIB_ERR_OK;
+
+errorend:
+
+ WinHttpCloseHandle(hGetPostKeySession);
+
+ ZeroMemory(self->sessionManager.buffer,sizeof(self->sessionManager.buffer));
+ LeaveCriticalSection(&self->sessionManager.cs);
+ }
+
+
+
+ return rslt;
+
+}
+
+
+
+
+
+
+
+//
+//\83C\83\93\83\89\83C\83\93\8aÖ\90\94
+//
+
+
+
+NLIB_RESULT GetPlayerStatus(NicoLivePlayerStatus_P self,LPCTSTR userSession,HINTERNET hConnect,LPVOID buffer){
+
+ NLIB_RESULT rslt = NLIB_ERR_OK;
+
+
+ {
+
+ const UINT_PTR buflen = LENGTH_65536;
+
+ LPSTR recvBuffer = (LPSTR)buffer;
+ DWORD readSize;
+ DWORD statusCode;
+ DWORD statusCodeSize = sizeof(statusCode);
+
+
+
+
+ if(WinHttpSendRequest(hConnect,userSession,-1,WINHTTP_NO_REQUEST_DATA,0,0,0) == FALSE){
+
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto end;
+
+ }
+
+ if(WinHttpReceiveResponse(hConnect,NULL) == FALSE){
+
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto end;
+
+ }
+
+
+ if (WinHttpQueryHeaders(hConnect,WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,WINHTTP_HEADER_NAME_BY_INDEX,&statusCode,&statusCodeSize,WINHTTP_NO_HEADER_INDEX) == FALSE){
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto end;
+ }
+
+
+ if (HTTP_STATUS_OK != statusCode){
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto end;
+ }
+
+
+
+
+ if(ReadHttpBody(hConnect,(LPBYTE)recvBuffer,buflen,&readSize) == FALSE){
+
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto end;
+
+ }
+
+ recvBuffer[readSize] = '\0';
+
+ recvBuffer = strstr(recvBuffer,"<");
+
+ dumpln_mb(CP_UTF8,"%s",recvBuffer);
+
+
+ XMLParse(self,recvBuffer,NPlayerStatus_ElementStartHandler,NPlayerStatus_ElementEndHandler,NPlayerStatus_CharacterDataHandler);
+ rslt = self->error;
+ if(rslt != NLIB_ERR_OK){
+
+ goto end;
+ }
+ }
+
+end:
+
+
+
+
+
+ return rslt;
+
+}
+
+
+#define GETNICOLIVEHIS_OBJNAMELENGTH LENGTH_256
+#define GETNICOLIVEHIS_COOKIELENGTH LENGTH_512
+
+static INLINE NLIB_RESULT GetNicoLiveHistory(NicoLiveStream_P self,HINTERNET hConnect){
+
+ NLIB_RESULT rslt = NLIB_ERR_OK;
+
+ EnterCriticalSection(&self->sessionManager.cs);
+ {
+
+ HINTERNET hStreamBrowse = NULL;
+
+
+ TCHAR objectName[GETNICOLIVEHIS_OBJNAMELENGTH] = {L"/watch/"};
+ TCHAR cookie[GETNICOLIVEHIS_COOKIELENGTH] = {L"Cookie: "};
+ DWORD statusCode;
+ DWORD statusCodeSize = sizeof(statusCode);
+ DWORD chunkSize = LENGTH_65536;
+ LPVOID chunkMemory =self->sessionManager.buffer;
+
+
+
+ LPTSTR buffer = (LPTSTR)chunkMemory;
+
+
+
+ if((GETNICOLIVEHIS_OBJNAMELENGTH - wcslen(objectName) <= wcslen(self->playerStatus.stream.id)) || GETNICOLIVEHIS_COOKIELENGTH - wcslen(cookie) <= wcslen(self->userSession)){
+
+ rslt = NLIB_ERR_BUFFER_TOOLITTLE;
+ goto end;
+ }
+
+ wcscat(objectName,self->playerStatus.stream.id);
+ wcscat(cookie,self->userSession);
+
+
+
+
+
+ hStreamBrowse = WinHttpOpenRequest(hNicoVideoConnect,L"GET",objectName,L"1.1",(LPCTSTR)WINHTTP_NO_REFERER,(LPCTSTR*)WINHTTP_DEFAULT_ACCEPT_TYPES,0);
+
+
+
+
+ if(WinHttpSendRequest(hStreamBrowse,cookie,-1,WINHTTP_NO_REQUEST_DATA,0,0,0) == FALSE){
+
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto end;
+
+ }
+
+ if(WinHttpReceiveResponse(hStreamBrowse,NULL) == FALSE){
+
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto end;
+
+ }
+
+ if (WinHttpQueryHeaders(hStreamBrowse,WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,WINHTTP_HEADER_NAME_BY_INDEX,&statusCode,&statusCodeSize,WINHTTP_NO_HEADER_INDEX) == FALSE){
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto end;
+ }
+
+
+ if (HTTP_STATUS_OK != statusCode){
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto end;
+ }
+
+
+
+ if (WinHttpQueryHeaders(hStreamBrowse,WINHTTP_QUERY_SET_COOKIE,WINHTTP_HEADER_NAME_BY_INDEX,buffer,&chunkSize,WINHTTP_NO_HEADER_INDEX) == FALSE){
+ rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
+ goto end;
+ }
+
+ {
+ LPTSTR start =wcsstr(buffer,L"nicolivehistory=");
+
+ LPTSTR end = wcsstr(start,L";");
+
+ UINT_PTR length = end - start;
+
+ if(length >= sizeof(self->nicoLiveHistory)){
+ rslt = NLIB_ERR_BUFFER_TOOLITTLE;
+ goto end;
+
+ }
+
+ wcsncpy(self->nicoLiveHistory,start,length);
+ self->nicoLiveHistory[length] = L'\0';
+
+ }
+end:
+
+ WinHttpCloseHandle(hStreamBrowse);
+
+ }
+ ZeroMemory(self->sessionManager.buffer,sizeof(self->sessionManager.buffer));
+ LeaveCriticalSection(&self->sessionManager.cs);
+
+
+ return rslt;
+
+
+
+}
+
+
+
+
+
+
+
+
+static unsigned int WINAPI NicoLiveKeapALiveThread(void* lpBuffer){
+
+ unsigned int rslt = 0;
+
+ NicoLiveStream_P self = (NicoLiveStream_P)lpBuffer;
+
+ rslt = loopCommon(self,self->chatManager.setKeepAliveTimeEvent,self->chatManager.resetEvents[2],self->chatManager.onKeepAlliveSend,&self->chatManager.keepAliveTime);
+
+ _endthreadex(rslt);
+
+ return rslt;
+}
+
+static unsigned int WINAPI NicoLiveHeartBeatThread(void* lpBuffer){
+
+ unsigned int rslt = 0;
+
+ NicoLiveStream_P self = (NicoLiveStream_P)lpBuffer;
+
+
+ rslt = loopCommon(self,self->chatManager.setHeartBeatTimeEvent,self->chatManager.resetEvents[1],self->chatManager.onHeartBeatSend,&self->chatManager.heartBeatTime);
+
+
+
+ _endthreadex(rslt);
+
+ return rslt;
+}
+static unsigned int loopCommon(NicoLiveStream_P self,WSAEVENT sendEvent,WSAEVENT resetEvent ,NicoLiveOnSend nicoLiveOnSend,LPDWORD time){
+
+ unsigned int rslt = 0;
+ WSAEVENT events[3] = {self->chatManager.deleteEvent,self->chatManager.startEvent,self->chatManager.endEvent}; //\83C\83x\83\93\83g\94z\97ñ
+ WSAEVENT streamEvent[2] = {self->chatManager.endEvent,sendEvent};
+ DWORD dwResult; //\83C\83x\83\93\83g\8eó\90M\8c\8b\89Ê
+ DWORD endResult;
+
+ while(TRUE){
+restart:
+ WSASetEvent(resetEvent);
+
+ dwResult = WSAWaitForMultipleEvents(sizeof(events) / sizeof(events[0]),events,FALSE,WSA_INFINITE,FALSE);
+
+
+ //\83G\83\89\81[\82Ì\8fê\8d\87
+ if(dwResult == WSA_WAIT_FAILED){
+
+ goto err;
+ }
+
+
+ switch(dwResult - WSA_WAIT_EVENT_0){
+
+ case 0:
+
+ goto end;
+
+ case 1:
+ WSAResetEvent(resetEvent);
+ break;
+
+ case 2:
+ continue;
+
+
+ default:
+
+ goto err;
+
+ }
+
+ while(TRUE){
+ WSAResetEvent(sendEvent);
+ endResult = WSAWaitForMultipleEvents(sizeof(streamEvent) / sizeof(streamEvent[0]),streamEvent,FALSE,*time,FALSE);
+
+ if(endResult == WSA_WAIT_TIMEOUT){
+
+ nicoLiveOnSend(self);
+ //dumpln(TEXT("onSend"));
+
+ _heapmin();
+ } else{
+ switch(endResult - WSA_WAIT_EVENT_0){
+
+ case 0:
+ goto restart;
+
+ case 1:
+ break;
+
+ default:
+ goto err;
+ }
+ }
+ }
+
+
+
+
+ }
+
+end:
+ return rslt;
+
+err:
+ _beginthread(NicoLiveError,0,self);
+ rslt = 1;
+ goto end;
+}
+
+static VOID OnSendHeartBeat(NicoLiveStream_P self){
+
+ if(self->chatManager.heartBeatFlag){
+ NicoLiveStream_sendHeartBeat(self);
+ }
+
+}
+
+static VOID OnSendKeepAllive(NicoLiveStream_P self){
+
+ if(self->chatManager.keapALiveFlag && self->playerStatus.stream.is_owner == TRUE){
+ LPCTSTR mail[2] = {L"184",NULL};
+ NicoLiveStream_sendChat(self,L"/keapalive",mail,NULL);
+ }
+
+}
+
+#define NICOLIVE_RECEVE_CHAT_LENGTH LENGTH_2048
+#define NICOLIVE_REQUEST_CHAT_LENGTH LENGTH_256
+static unsigned int WINAPI NicoLiveRecvChat(void* lpBuffer){
+
+
+ unsigned int rslt = 0;
+
+ //LPTSTR user_id = NULL;
+ //LPTSTR name = NULL;
+ //LPTSTR chatBuf = NULL;
+
+
+
+ CHAR requestChat[NICOLIVE_REQUEST_CHAT_LENGTH]; //\91\97\90M\93d\95¶\97p\83o\83b\83t\83@
+ LPCSTR sendFormat = "<thread thread=\"%u\" res_from=\"%d\" version=\"20061206\" />"; //\91\97\90M\93d\95¶\83t\83H\81[\83}\83b\83g
+ NicoLiveStream_P self = (NicoLiveStream_P)lpBuffer; //\83j\83R\90¶\95ú\91\97\83I\83u\83W\83F\83N\83g
+ INT_PTR sendLen; //\91\97\90M\97p\95¶\8e\9a\90\94
+ INT_PTR sentLen; //\91\97\90M\8dÏ\82Ý\95¶\8e\9a\90\94
+ WSAEVENT events[3] = {self->chatManager.deleteEvent,self->chatManager.startEvent,self->chatManager.endEvent}; //\83C\83x\83\93\83g\94z\97ñ
+ DWORD dwResult; //\83C\83x\83\93\83g\8eó\90M\8c\8b\89Ê
+
+
+
+ while(TRUE){
+
+ WSASetEvent(self->chatManager.resetEvents[0]);
+
+ dwResult = WSAWaitForMultipleEvents(sizeof(events) / sizeof(events[0]),events,FALSE,WSA_INFINITE,FALSE);
+
+
+ //\83G\83\89\81[\82Ì\8fê\8d\87
+ if(dwResult == WSA_WAIT_FAILED){
+
+ goto err;
+ }
+
+
+ switch(dwResult - WSA_WAIT_EVENT_0){
+
+ case 0:
+
+ goto end;
+
+ case 1:
+ WSAResetEvent(self->chatManager.resetEvents[0]);
+ break;
+
+ case 2:
+ continue;
+
+ default:
+
+ goto err;
+
+ }
+
+
+ sendLen = 0;
+ sentLen = 0;
+
+ //\83\\83P\83b\83g\82Ì\90Ý\92è
+ self->chatManager.sock = GetConectedSocket(self->playerStatus.ms.addr,self->playerStatus.ms.port,SOCK_STREAM,AF_INET,IPPROTO_TCP);
+
+
+ //\83R\83\81\83\93\83g\8eó\90M\8aJ\8en\82Ì\89º\8f\80\94õ
+ if(self->chatManager.sock == INVALID_SOCKET){
+ self->error = NLIB_ERR_FAILED_NETWORK;
+ goto err;
+ }
+
+
+
+
+
+
+ if(NICOLIVE_REQUEST_CHAT_LENGTH <= _scprintf(sendFormat,self->playerStatus.ms.thread,self->res_from)){
+
+ self->error = NLIB_ERR_BUFFER_TOOLITTLE;
+ rslt = -1;
+ goto err;
+
+
+ }
+
+ sprintf(requestChat,sendFormat,self->playerStatus.ms.thread,self->res_from);
+
+
+ //
+ //\83R\83\81\83\93\83g\8eó\90M\97v\8b\81\91\97\90M\8f\88\97\9d
+ //
+ {
+ int len;
+ sendLen = strlen(requestChat) + 1;
+ do{
+ len = send(self->chatManager.sock,requestChat,sendLen,0);
+ if(len == SOCKET_ERROR){
+ self->error = NLIB_ERR_FAILED_NETWORK;
+ rslt = -1;
+
+ goto err;
+
+ }
+
+ sentLen = len;
+ }while(sentLen < sendLen);
+ }
+
+
+ if(NicoLiveRecvChatLoop(self) == FALSE){
+ goto err;
+ }
+
+
+ }
+
+
+
+
+err:
+
+ _beginthread(NicoLiveError,0,self);
+
+end:
+
+
+
+ closesocket(self->chatManager.sock);
+ _endthreadex(rslt);
+
+ return rslt;
+
+
+
+
+
+}
+
+
+
+
+
+static BOOL NicoLiveRecvChatLoop(NicoLiveStream_P self){
+
+
+ //
+ //\83R\83\81\83\93\83g\8eó\90M\8f\88\97\9d
+ //
+ BOOL rslt = TRUE; //\8c\8b\89Ê
+ LPTSTR commentBuf = NULL; //\83R\83\81\83\93\83g\83o\83b\83t\83@
+ LPTSTR* mailCountBuf = NULL; //\83\81\81[\83\8b\83|\83C\83\93\83^\83o\83b\83t\83@
+ INT_PTR recevedLen; //\8eó\90M\95¶\8e\9a\97ñ\92·
+ INT_PTR messageBufLen; //\83o\83b\83t\83@\92·
+
+
+
+ WSAEVENT hEventArray[2]; //\8eó\90M\81E\90Ø\92f\82ð\8c\9f\92m\82·\82é\83C\83x\83\93\83g\83I\83u\83W\83F\83N\83g\82Ì\94z\97ñ
+ WSANETWORKEVENTS netEvents; //\83l\83b\83g\83\8f\81[\83N\83C\83x\83\93\83g
+ DWORD dwResult; //\83C\83x\83\93\83g\82ª\83E\83F\83C\83g\8aÖ\90\94\82Ì\8c\8b\89Ê\82ð\8ai\94[\82·\82é\95Ï\90\94
+
+
+ SIZE_T commentBufSize = sizeof(TCHAR) * LENGTH_2048; //\83R\83\81\83\93\83g\83o\83b\83t\83@\92·
+ SIZE_T mailCountBufSize = sizeof(LPTSTR) * LENGTH_256; //\83\81\81[\83\8b\82Ì\83|\83C\83\93\83^\97p\83o\83b\83t\83@\92·
+
+
+ WSAEVENT hRecvEvent = NULL;
+
+ //\8eó\90M\8f\80\94õ\8f\88\97\9d
+ self->chatManager.commentCountSum = 0;
+ hRecvEvent = WSACreateEvent();
+ self->chatManager.recvBuf[0] = '\0';
+ WSAEventSelect(self->chatManager.sock, hRecvEvent, FD_READ | FD_CLOSE);
+ hEventArray[0] = hRecvEvent;
+ hEventArray[1] = self->chatManager.endEvent;
+
+ commentBuf = (LPTSTR)malloc(commentBufSize);
+ mailCountBuf = (LPTSTR*)malloc(mailCountBufSize);
+
+ //\90Ø\92f\82³\82ê\82é\82Ü\82Å\83\8b\81[\83v
+ while(1){
+
+
+
+ //\91O\82Ì\83R\83\81\83\93\83g\8eó\90M\8e\9e\82É\97]\82Á\82½\95¶\8e\9a\97ñ\82Ì\92·\82³\82ð\92²\82×\82é
+ messageBufLen = strlen(self->chatManager.recvBuf);
+
+ //\8eó\90M\82©\8fI\97¹\83C\83x\83\93\83g\82ð\8c\9f\92m\82·\82é\82Ü\82Å\91Ò\8b@
+ dwResult = WSAWaitForMultipleEvents(sizeof(hEventArray) / sizeof(hEventArray[0]),hEventArray,FALSE,WSA_INFINITE,FALSE);
+
+ //\83G\83\89\81[\82Ì\8fê\8d\87
+ if(dwResult == WSA_WAIT_FAILED){
+
+ goto err;
+ }
+
+
+
+ //\83R\83\81\83\93\83g\8eó\90M\83C\83x\83\93\83g\82ª\83V\83O\83i\83\8b\82É\82È\82Á\82½\8fê\8d\87
+ if(dwResult - WSA_WAIT_EVENT_0 == 0){
+
+ WSAEnumNetworkEvents(self->chatManager.sock,hRecvEvent,&netEvents);
+
+ //\93Ç\8eæ\83C\83x\83\93\83g\82Ì\8fê\8d\87\83R\83\81\83\93\83g\82ð\8eó\90M\82·\82é
+ if(netEvents.lNetworkEvents & FD_READ){
+
+
+ recevedLen = recv(self->chatManager.sock,&self->chatManager.recvBuf[messageBufLen],(sizeof(self->chatManager.recvBuf) - 1) - messageBufLen ,0);
+
+ if(recevedLen == SOCKET_ERROR){
+ self->error = NLIB_ERR_FAILED_NETWORK;
+
+ goto err;
+ }
+
+ self->chatManager.recvBuf[messageBufLen + recevedLen] = '\0';
+
+
+
+
+
+
+ NicoLiveParseComment(self,commentBuf,messageBufLen + recevedLen,mailCountBuf,&mailCountBufSize,&commentBufSize);
+
+
+
+
+
+ } else if(netEvents.lNetworkEvents && FD_CLOSE){
+
+ goto end;
+
+ }//if(netEvents.lNetworkEvents & FD_READ)
+
+ } else if(dwResult - WSA_WAIT_EVENT_0 == 1){
+
+ goto end;
+
+ }//if(dwResult - WSA_WAIT_EVENT_0 == 0)
+ }
+
+
+err:
+
+ rslt = FALSE;
+
+end:
+
+ free(commentBuf);
+ free(mailCountBuf);
+ WSACloseEvent(hRecvEvent);
+
+ return rslt;
+}
+
+
+
+
+static VOID NicoLiveParseComment(NicoLiveStream_P self,LPTSTR commentBuf,UINT_PTR endSize,LPTSTR* mailCountBuf,SIZE_T* mailCountBufSize,SIZE_T* commentBufSize){
+
+ LPTSTR indexPtr; //\89ð\90Í\8e\9e\82Ì\8ew\95W\83|\83C\83\93\83^
+ NicoLiveChat nicoLiveChat; //\83`\83\83\83b\83g\83R\83\81\83\93\83g\8ai\94[\97p\8d\\91¢\91Ì
+ NicoLiveThreadComment nicoLiveThreadComment; //\90Ú\91±\89\9e\93\9a\83R\83\81\83\93\83g\8ai\94[\97p\8d\\91¢\91Ì
+ NicoLiveSendResultComment nicoLiveSendResultComment; //\91\97\90M\89\9e\93\9a\83R\83\81\83\93\83g\8ai\94[\97p\8d\\91¢\91Ì
+ NicoLiveChat nicoLiveChatBase; //\83`\83\83\83b\83g\83R\83\81\83\93\83g\8aî\92ê\8d\\91¢\91Ì
+ NicoLiveThreadComment nicoLiveThreadCommentBase; //\90Ú\91±\89\9e\93\9a\83R\83\81\83\93\83g\8aî\92ê\8d\\91¢\91Ì
+ NicoLiveSendResultComment nicoLiveSendResultCommentBase;//\91\97\90M\89\9e\93\9a\83R\83\81\83\93\83g\8aî\92ê\8d\\91¢\91Ì
+ LPTSTR attrNameStart; //\91®\90«\96¼\8aJ\8en\83|\83C\83\93\83^
+ LPTSTR attrNameEnd; //\91®\90«\96¼\8fI\97¹\83|\83C\83\93\83^
+ LPTSTR attrValueStart; //\91®\90«\92l\8aJ\8en\83|\83C\83\93\83^
+ LPTSTR attrValueEnd; //\91®\90«\92l\8fI\97¹\83|\83C\83\93\83^
+ INT_PTR nameLen; //\91®\90«\82Ì\96¼\91O\82Ì\92·\82³
+ LPTSTR mailIndexPtr; //\83\81\81[\83\8b\91®\90«\92l\89ð\90Í\97p\8ew\95W\83|\83C\83\93\83^
+ LPTSTR xmlTextPtr; //xml\83e\83L\83X\83g\8c`\8e®\82Ì\83f\81[\83^\89ð\90Í\8e\9e\82É\8eg\97p\82·\82é\83|\83C\83\93\83^
+ LPTSTR xmlTextEnd; //xml\83e\83L\83X\83g\8fI\97¹\83|\83C\83\93\83^
+ LPTSTR* mailIndex; //\83\81\81[\83\8b\83R\83}\83\93\83h\83\8a\83X\83g\83|\83C\83\93\83^
+ BOOL isReceveChat = FALSE; //\83`\83\83\83b\83g\8eó\90M\83t\83\89\83O
+ SIZE_T commentSizeCh; //\8eó\90M\82µ\82½\83R\83\81\83\93\83g\82ð\83\86\83j\83R\81[\83h\82É\95Ï\8a·\82·\82é\82Æ\82«\82Ì\92·\82³
+ LPSTR recvBufTmp; //\8eó\90M\95¶\8e\9a\97ñ\91\80\8dì\97p\83|\83C\83\93\83^
+ LPSTR recvEndPoint; //\8eó\90M\95¶\8e\9a\97ñ\8fI\92[\83|\83C\83\93\83^
+
+
+
+ recvBufTmp = &self->chatManager.recvBuf[0];
+ recvEndPoint = &self->chatManager.recvBuf[endSize];
+
+
+ //\83R\83\81\83\93\83g\8aî\92ê\8d\\91¢\91Ì\8f\89\8aú\89»
+ nicoLiveChatBase.anonymity = L"";
+ nicoLiveChatBase.chatBuf = L"";
+ nicoLiveChatBase.date = L"";
+ nicoLiveChatBase.locale = L"";
+ nicoLiveChatBase.mail = mailCountBuf;
+ nicoLiveChatBase.name = L"";
+ nicoLiveChatBase.no = L"";
+ nicoLiveChatBase.premium = L"";
+ nicoLiveChatBase.thread = L"";
+ nicoLiveChatBase.user_id = L"";
+ nicoLiveChatBase.vpos = L"";
+ nicoLiveChatBase.mailCount = 0;
+
+
+
+ nicoLiveThreadCommentBase.last_res = L"";
+ nicoLiveThreadCommentBase.thread = L"";
+ nicoLiveThreadCommentBase.ticket = L"";
+
+
+ nicoLiveSendResultCommentBase.no = L"";
+ nicoLiveSendResultCommentBase.status = L"";
+ nicoLiveSendResultCommentBase.thread = L"";
+
+
+ //\8eó\90M\82µ\82½\83R\83\81\83\93\83g\82ð\82Ð\82Æ\82Â\82Ìxml\83m\81[\83h\82²\82Æ\82É\89ð\90Í\82·\82é
+ for (;recvBufTmp + strlen(recvBufTmp) < recvEndPoint;recvBufTmp += strlen(recvBufTmp) + 1){
+
+
+ commentSizeCh = sizeof(TCHAR) * GetLenToWide(CP_UTF8,recvBufTmp);
+ extendMalloc(commentBuf,LPTSTR,*commentBufSize,commentSizeCh);
+ MBToWide(CP_UTF8,recvBufTmp,commentBuf,*commentBufSize);
+
+ traceln(TEXT("comment:\r\n%s"),commentBuf);
+ //thread\83m\81[\83h\82Ì\8fê\8d\87
+ if((indexPtr = wcsstr(commentBuf,L"<thread ")) != NULL){
+
+ indexPtr += wcslen(L"<thread ");
+ skipXMLSPACE(indexPtr);
+
+
+
+
+ nicoLiveThreadComment = nicoLiveThreadCommentBase;
+
+ while(wcsncmp(indexPtr,L"/>",wcslen(L"/>")) != 0){
+ parseAttr(indexPtr,attrNameStart,attrNameEnd,attrValueStart,attrValueEnd);
+
+
+ nameLen = attrNameEnd - attrNameStart;
+ if(wcsncmp(attrNameStart,L"ticket",nameLen) == 0){
+
+
+ partString(nicoLiveThreadComment.ticket,attrValueStart,attrValueEnd);
+ wcscpy(self->ticket,nicoLiveThreadComment.ticket);
+
+ } else if(wcsncmp(attrNameStart,L"last_res",nameLen) == 0){
+
+ partString(nicoLiveThreadComment.last_res,attrValueStart,attrValueEnd);
+
+
+ } else if(wcsncmp(attrNameStart,L"thread",nameLen) == 0){
+
+ partString(nicoLiveThreadComment.thread,attrValueStart,attrValueEnd);
+ } else if(wcsncmp(attrNameStart,L"server_time",nameLen) == 0){
+
+ NicoLiveStream_setVpos((*self),attrValueStart);
+
+ partString(nicoLiveThreadComment.server_time,attrValueStart,attrValueEnd);
+ }
+
+ skipXMLSPACE(indexPtr);
+ }
+
+
+
+ self->callBack(NICOLIVE_EVENT_RECEVE_CONNECTRESULT,self,self->option,(NICOLIVE_PARAM)&nicoLiveThreadComment,self->chatManager.chatNo);
+
+ //chat\83m\81[\83h\82Ì\8fê\8d\87
+ } else if((indexPtr = wcsstr(commentBuf,L"<chat ")) != NULL){
+
+ indexPtr += wcslen(L"<chat ");
+ skipXMLSPACE(indexPtr);
+
+
+
+
+ nicoLiveChat = nicoLiveChatBase;
+
+ while(wcsncmp(indexPtr,L">",wcslen(L">"))){
+
+ parseAttr(indexPtr,attrNameStart,attrNameEnd,attrValueStart,attrValueEnd);
+
+ nameLen = attrNameEnd - attrNameStart;
+
+
+ if(wcsncmp(attrNameStart,L"no",nameLen) == 0){
+
+ partString(nicoLiveChat.no,attrValueStart,attrValueEnd);
+
+ } else if(wcsncmp(attrNameStart,L"date",nameLen) == 0){
+
+ NicoLiveStream_setVpos((*self),attrValueStart);
+
+ partString(nicoLiveChat.date,attrValueStart,attrValueEnd);
+
+ } else if(wcsncmp(attrNameStart,L"thread",nameLen) == 0){
+
+ partString(nicoLiveChat.thread,attrValueStart,attrValueEnd);
+
+ } else if(wcsncmp(attrNameStart,L"premium",nameLen) == 0){
+
+ partString(nicoLiveChat.premium,attrValueStart,attrValueEnd);
+
+ } else if(wcsncmp(attrNameStart,L"anonymity",nameLen) == 0){
+
+ partString(nicoLiveChat.anonymity,attrValueStart,attrValueEnd);
+
+
+ } else if(wcsncmp(attrNameStart,L"locale",nameLen) == 0){
+
+ partString(nicoLiveChat.locale,attrValueStart,attrValueEnd);
+
+ } else if(wcsncmp(attrNameStart,L"vpos",nameLen) == 0){
+
+ partString(nicoLiveChat.vpos,attrValueStart,attrValueEnd);
+
+ } else if(wcsncmp(attrNameStart,L"user_id",nameLen) == 0){
+
+ partString(nicoLiveChat.user_id,attrValueStart,attrValueEnd);
+
+ } else if(wcsncmp(attrNameStart,L"name",nameLen) == 0){
+
+ partString(nicoLiveChat.name,attrNameStart,attrValueEnd);
+
+ } else if(wcsncmp(attrNameStart,L"mail",nameLen) == 0){
+
+ nicoLiveChat.mailCount = 1;
+
+
+ for(mailIndexPtr = attrValueStart;mailIndexPtr <= attrValueEnd;mailIndexPtr++){
+
+ if(mailIndexPtr[0] == L' '){
+
+ nicoLiveChat.mailCount++;
+
+ }
+
+ }
+
+ extendMalloc(mailCountBuf,LPTSTR*,*mailCountBufSize,nicoLiveChat.mailCount);
+
+ nicoLiveChat.mail = mailCountBuf;
+ mailCountBuf[0] = NULL;
+
+ for(mailIndex = mailCountBuf,mailIndexPtr = attrValueStart,mailIndex[0] = mailIndexPtr;mailIndexPtr < attrValueEnd;mailIndexPtr++){
+
+
+ if(mailIndexPtr[0] == L' '){
+ mailIndex++;
+ mailIndex[0] = mailIndexPtr + 1;
+ mailIndexPtr[0] = L'\0';
+
+
+ }
+
+ }
+
+ mailIndexPtr[0] = L'\0';
+
+ }
+
+ skipXMLSPACE(indexPtr);
+ }
+
+ indexPtr++;
+ xmlTextPtr = indexPtr;
+ xmlTextEnd = wcsstr(indexPtr,L"<");
+ convertXMLTEXT(nicoLiveChat.chatBuf,indexPtr,xmlTextPtr,xmlTextEnd);
+
+
+
+ self->chatManager.chatNo = wcstoul(nicoLiveChat.no,NULL,10);
+
+
+
+ self->chatManager.commentCountSum++;
+ isReceveChat = TRUE;
+
+ check((_heapchk() == _HEAPOK),TEXT("\83q\81[\83v\83G\83\89\81[\82Å\82·"));
+
+ if((wcscmp(nicoLiveChat.chatBuf,L"/disconnect") == 0 && wcscmp(nicoLiveChat.premium,L"2") == 0)){
+
+
+ _beginthread(NicoLiveSelfDisconnect,0,self);
+ }
+ self->callBack(NICOLIVE_EVENT_RECEVE_CHAT,self,self->option,(NICOLIVE_PARAM)&nicoLiveChat,self->chatManager.commentCountSum);
+
+
+ //chat_result\83m\81[\83h\82Ì\8fê\8d\87
+ } else if((indexPtr = wcsstr(commentBuf,L"<chat_result ")) != NULL){
+
+ indexPtr += wcslen(L"<chat_result ");
+
+ nicoLiveSendResultComment = nicoLiveSendResultCommentBase;
+
+ while(wcsncmp(indexPtr,L"/>",wcslen(L"/>")) != 0){
+ parseAttr(indexPtr,attrNameStart,attrNameEnd,attrValueStart,attrValueEnd);
+
+
+ nameLen = attrNameEnd - attrNameStart;
+ if(wcsncmp(attrNameStart,L"no",nameLen) == 0){
+
+
+ partString(nicoLiveSendResultComment.no,attrValueStart,attrValueEnd);
+
+ } else if(wcsncmp(attrNameStart,L"status",nameLen) == 0){
+
+ partString(nicoLiveSendResultComment.status,attrValueStart,attrValueEnd);
+
+
+ } else if(wcsncmp(attrNameStart,L"thread",nameLen) == 0){
+
+ partString(nicoLiveSendResultComment.thread,attrValueStart,attrValueEnd);
+ }
+
+ skipXMLSPACE(indexPtr);
+ }
+
+ //\83L\81[\83v\83A\83\89\83C\83u\83\8a\83Z\83b\83g
+ WSASetEvent(self->chatManager.setKeepAliveTimeEvent);
+
+ self->callBack(NICOLIVE_EVENT_RECEVE_CHATSENDRESULT,self,self->option,(NICOLIVE_PARAM)&nicoLiveSendResultComment,(NICOLIVE_PARAM)NULL);
+
+ }
+
+ }
+
+ if(recvBufTmp == recvEndPoint && isReceveChat){
+ self->callBack(NICOLIVE_EVENT_RECEVE_CHATSETTLE,self,self->option,self->chatManager.chatNo,self->chatManager.commentCountSum);
+ }
+
+
+
+
+ strcpy(&self->chatManager.recvBuf[0],recvBufTmp);
+
+
+
+
+
+
+
+
+
+
+ return;
+
+}
+
+
+
+static void NicoLiveError(void *buf){
+
+ NicoLiveStream_P nl = (NicoLiveStream_P)buf;
+
+ nl->callBack(NICOLIVE_EVENT_ERR_CONNECT,nl,nl->option,(NICOLIVE_PARAM)NULL,(NICOLIVE_PARAM)NULL);
+
+ NicoLiveStream_disConnect(nl);
+
+
+ _endthread();
+ return;
+
+}
+
+static void NicoLiveSelfDisconnect(void *buf){
+
+ NicoLiveStream_P nl = (NicoLiveStream_P)buf;
+
+ dumpln(TEXT("selfdisconnect"),);
+
+ NicoLiveStream_disConnect(nl);
+
+ _heapmin();
+
+
+ _endthread();
+ return;
+
+}
+
+static INLINE SOCKET GetConectedSocket(LPCTSTR nordName,LPCTSTR port,int socktype,int addr_famiry,int protocol){
+
+
+ SOCKET rslt = INVALID_SOCKET;
+
+
+ PADDRINFOW res,res0;
+ ADDRINFOW hints;
+ ZeroMemory(&hints,sizeof(hints));
+ hints.ai_socktype = socktype;
+ hints.ai_family = addr_famiry;
+ hints.ai_protocol = protocol;
+ GetAddrInfoW(nordName,port,&hints,&res0);
+
+
+ for(res = res0; res != NULL;res = res->ai_next){
+
+
+
+
+ rslt = socket(res->ai_family,res->ai_socktype,res->ai_protocol);
+ if(rslt == INVALID_SOCKET){
+
+ continue;
+ }
+
+
+
+
+
+
+
+
+
+ if(connect(rslt,res->ai_addr,(int)res->ai_addrlen) == SOCKET_ERROR){
+ closesocket(rslt);
+ continue;
+ }
+
+
+
+
+
+
+ break;
+
+ }
+
+ if(res == NULL){
+ rslt = INVALID_SOCKET;
+ }
+
+
+ //res\8d\\91¢\91Ì\89ð\95ú
+ FreeAddrInfo(res0);
+
+
+ return rslt;
+
+}
+
+
+//
+//\83X\83g\83\8a\81[\83\80\83X\83e\81[\83^\83X\8aÖ\98A
+//
+
+///
+///\83X\83g\83\8a\81[\83\80\83X\83e\81[\83^\83X\82ÌID\82ð\8eæ\93¾
+///
+NLIB_DECLSPEC LPCTSTR StreamStatus_getId(StreamStatus_P self){
+
+ return self->id;
+}
+
+
+///
+///\83X\83g\83\8a\81[\83\80\83X\83e\81[\83^\83X\82Ì\83R\83~\83\85\83j\83e\83B\94Ô\8d\86\82ð\8eæ\93¾
+///
+NLIB_DECLSPEC LPCTSTR StreamStatus_getDefaultCommunity(StreamStatus_P self){
+
+ return self->default_community;
+}
+
+
+///
+///\83X\83g\83\8a\81[\83\80\83X\83e\81[\83^\83X\82Ì\83v\83\8d\83o\83C\83_\83^\83C\83v\82ð\8eæ\93¾
+///
+PROVIDERTYPE StreamStatus_getProviderType(StreamStatus_P self){
+
+ return self->provider_type;
+}
+
+
+///
+///\83X\83g\83\8a\81[\83\80\83X\83e\81[\83^\83X\82Ì\83I\81[\83i\81[\83t\83\89\83O\82ð\8eæ\93¾
+///
+BOOL StreamStatus_isOwner(StreamStatus_P self){
+
+ return self->is_owner;
+}
+
+///
+///\83X\83g\83\8a\81[\83\80\83X\83e\81[\83^\83X\82Ì\8aJ\8en\8e\9e\8d\8f\82ð\8eæ\93¾
+///
+time_t StreamStatus_getStartTime(StreamStatus_P self){
+
+ return self->start_time;
+}
+
+///
+///\83X\83g\83\8a\81[\83\80\83X\83e\81[\83^\83X\82Ì\8fI\97¹\8e\9e\8d\8f\82ð\8eæ\93¾
+///
+time_t StreamStatus_getEndTime(StreamStatus_P self){
+
+ return self->end_time;
+}
+
+///
+///\83X\83g\83\8a\81[\83\80\83X\83e\81[\83^\83X\82Ì\8aJ\8fê\8e\9e\8d\8f\82ð\8eæ\93¾
+///
+time_t StreamStatus_getOpenTime(StreamStatus_P self){
+
+ return self->open_time;
+
+}
+
+///
+///\83X\83g\83\8a\81[\83\80\83X\83e\81[\83^\83X\82Ì\83x\81[\83X\8e\9e\8d\8f\82ð\8eæ\93¾
+///
+time_t StreamStatus_getBaseTime(StreamStatus_P self){
+
+ return self->base_time;
+}
+
+
--- /dev/null
+#include "StdAfx.h"
+#include "nlib_include.h"
+
+
+
+enum NPlayerStatus_NORD{
+ NPlayerStatus_ROOT,
+ NPlayerStatus_GETPLAYERSTATUS,
+ NPlayerStatus_MS,
+ NPlayerStatus_STREAM,
+ NPlayerStatus_ERROR,
+ NPlayerStatus_ADDR,
+ NPlayerStatus_THREAD,
+ NPlayerStatus_OPEN_TIME,
+ NPlayerStatus_START_TIME,
+ NPlayerStatus_ID,
+ NPlayerStatus_CODE,
+ NPlayerStatus_PORT,
+ NPlayerStatus_PROVIDER,
+ NPlayerStatus_DEFAULT_COMMUNITY,
+ NPlayerStatus_IS_OWNER,
+ NPlayerStatus_END_TIME,
+ NPlayerStatus_NICOLIVE_API,
+ NPlayerStatus_USER,
+ NPlayerStatus_IS_PREMIUM,
+ NPlayerStatus_USER_ID,
+ NPlayerStatus_USER_DOMEIN,
+ NPlayerStatus_BASE_TIME
+};
+
+enum NicoLiveHeartBeat_NORD{
+ NicoLiveHeartBeat_ROOT,
+ NicoLiveHeartBeat_HEARTBEAT,
+ NicoLiveHeartBeat_WATCHCOUNT,
+ NicoLiveHeartBeat_COMMENTCOUNT,
+ NicoLiveHeartBeat_IS_RESTRICT,
+ NicoLiveHeartBeat_TICKET
+};
+
+enum StreamInfo_NORD{
+ StreamInfo_ROOT,
+ StreamInfo_GETPLAYERSTATUS,
+ StreamInfo_REQUEST_ID,
+ StreamInfo_STREAMINFO,
+ StreamInfo_TITLE,
+ StreamInfo_DESCRIPTION,
+ StreamInfo_PROVIDER_TYPE,
+ StreamInfo_DEFAULT_COMMUNITY,
+ StreamInfo_COMMUNITYINFO,
+ StreamInfo_NAME,
+ StreamInfo_THUMBNAIL,
+};
+
+
+
+#define StrCpyArray(buf,pszData,nLength) StrCpy(buf,sizeof(buf) / sizeof(buf[0]),pszData,nLength)
+
+static INLINE NLIB_RESULT StrCpy(LPTSTR buf,UINT_PTR buflen,LPCTSTR pszData,UINT_PTR nLength);
+
+///
+///UTF8\95Ï\8a·\93à\95\94\8aÖ\90\94
+///
+static INLINE VOID ToUTF8(LPSTR buf,LPCTSTR input,INT_PTR nLength,INT_PTR maxLength);
+
+
+
+
+
+extern void NPlayerStatus_ElementStartHandler(void *userData,const XML_Char *pszName,const XML_Char *atts[]){
+
+ UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
+ NicoLivePlayerStatus_P ps = (NicoLivePlayerStatus_P)userDataContainer->userData;
+
+
+
+ enum NPlayerStatus_NORD element = NPlayerStatus_ROOT;
+
+ switch (userDataContainer->nord){
+
+ //\90e\83m\81[\83h
+ case (MAKENORD(NPlayerStatus_ROOT)):
+
+
+ if(_tcscmp(pszName,TEXT("getplayerstatus")) == 0){
+
+
+
+ UINT_PTR index;
+
+ for(index = 0;atts[index] != NULL;index += 2){
+
+ if(_tcscmp(atts[index],TEXT("status")) == 0 && _tcscmp(atts[index + 1],TEXT("ok")) == 0){
+
+
+ ps->error = NLIB_ERR_OK;
+
+
+ }else if(_tcscmp(atts[index],TEXT("status")) == 0 && _tcscmp(atts[index + 1],TEXT("ok")) != 0){
+
+ ps->error = NLIB_ERR_PLAYERSTATUS_ERROR;
+ }
+
+
+ }
+
+ element = NPlayerStatus_GETPLAYERSTATUS;
+
+
+
+
+
+
+ } else if(_tcscmp(pszName,TEXT("nicolive_api")) == 0){
+
+ element = NPlayerStatus_NICOLIVE_API;
+
+ }
+ break;
+
+ //getplayerstatus or // NPlayerStatus_NICOLIVE_API
+ case (MAKENORD(NPlayerStatus_GETPLAYERSTATUS)):
+ case (MAKENORD(NPlayerStatus_NICOLIVE_API)):
+
+
+
+
+
+ if(_tcscmp(pszName,TEXT("ms"))== 0){
+
+ element = NPlayerStatus_MS;
+
+
+
+ } else if(_tcscmp(pszName,TEXT("stream"))== 0){
+
+ element = NPlayerStatus_STREAM;
+
+
+
+ }else if(_tcscmp(pszName,TEXT("user"))== 0){
+
+ element = NPlayerStatus_USER;
+
+ } else if(_tcscmp(pszName,TEXT("error"))== 0){
+
+ element = NPlayerStatus_ERROR;
+
+ }
+
+ break;
+ //getplayerstatus/ms
+ case (MAKENORD1(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_MS)):
+
+
+
+ if(_tcscmp(pszName,TEXT("addr")) == 0){
+
+ element = NPlayerStatus_ADDR;
+
+
+ } else if(_tcscmp(pszName,TEXT("port")) == 0){
+
+ element = NPlayerStatus_PORT;
+
+
+ } else if(_tcscmp(pszName,TEXT("thread")) == 0){
+
+
+ element = NPlayerStatus_THREAD;
+
+
+ }
+ break;
+
+ //getplayerstatus/stream
+ case (MAKENORD1(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM)):
+ if(_tcscmp(pszName,TEXT("open_time")) == 0){
+
+ element = NPlayerStatus_OPEN_TIME;
+
+
+ } else if(_tcscmp(pszName,TEXT("start_time")) == 0){
+
+ element = NPlayerStatus_START_TIME;
+
+ } else if(_tcscmp(pszName,TEXT("base_time")) == 0){
+
+ element = NPlayerStatus_BASE_TIME;
+
+ } else if(_tcscmp(pszName,TEXT("id")) == 0){
+
+ element = NPlayerStatus_ID;
+
+ } else if(_tcscmp(pszName,TEXT("provider_type")) == 0){
+
+ element = NPlayerStatus_PROVIDER;
+
+ } else if(_tcscmp(pszName,TEXT("default_community")) == 0){
+
+ element = NPlayerStatus_DEFAULT_COMMUNITY;
+
+ } else if(_tcscmp(pszName,TEXT("is_owner")) == 0){
+
+ element = NPlayerStatus_IS_OWNER;
+
+ } else if(_tcscmp(pszName,TEXT("end_time")) == 0){
+
+ element = NPlayerStatus_END_TIME;
+
+ }
+
+
+ break;
+
+ case (MAKENORD1(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_USER)):
+
+
+ if(_tcscmp(pszName,TEXT("is_premium")) == 0){
+
+ element = NPlayerStatus_IS_PREMIUM;
+
+ } else if(_tcscmp(pszName,TEXT("user_id")) == 0){
+
+ element = NPlayerStatus_USER_ID;
+
+ } else if(_tcscmp(pszName,TEXT("userDomain")) == 0){
+
+ element = NPlayerStatus_USER_DOMEIN;
+ }
+
+ break;
+
+ case (MAKENORD1(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_ERROR)):
+ case MAKENORD1(NPlayerStatus_NICOLIVE_API,NPlayerStatus_ERROR):
+
+ if(_tcscmp(pszName,TEXT("code")) == 0){
+
+ element = NPlayerStatus_CODE;
+
+ }
+
+ break;
+
+
+
+
+
+
+ }
+
+ userDataContainer->nord = MAKENORD1(userDataContainer->nord,element);
+
+ return;
+
+}
+
+
+void NPlayerStatus_CharacterDataHandler(void *userData,const XML_Char *pszData,int nLength){
+
+ UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
+ NicoLivePlayerStatus_P ps = (NicoLivePlayerStatus_P)userDataContainer->userData;
+
+
+ switch(userDataContainer->nord){
+
+ //getplayerstatus/ms/addr
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_MS,NPlayerStatus_ADDR):
+
+
+
+
+ ps->error = StrCpyArray(ps->ms.addr,pszData,nLength);
+
+
+ break;
+
+ //getplayerstatus/ms/port
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_MS,NPlayerStatus_PORT):
+
+
+
+
+ ps->error = StrCpyArray(ps->ms.port,pszData,nLength);
+
+
+
+
+ break;
+
+ //getplayerstatus/ms/thread
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_MS,NPlayerStatus_THREAD):
+
+ //ps->ms.thread = wtoin(pszData,nLength);
+ strToIntN(ps->ms.thread,pszData,nLength);
+
+
+ break;
+
+ //getplayerstatus/stream/open_time
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_OPEN_TIME):
+
+ //ps->stream.open_time = wtoin(pszData,nLength);
+ strToIntN(ps->stream.open_time,pszData,nLength);
+
+
+ break;
+
+ //getplayerstatus/stream/start_time
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_START_TIME):
+
+ //ps->stream.start_time = wtoin(pszData,nLength);
+ strToIntN(ps->stream.start_time,pszData,nLength);
+ //_tcscpy(start_time,elementValue);
+
+ break;
+
+ //getplayerstatus/stream/base_time
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_BASE_TIME):
+
+ strToIntN(ps->stream.base_time,pszData,nLength);
+
+ break;
+
+
+ //getplayerstatus/stream/id
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_ID):
+
+
+ ps->error = StrCpyArray(ps->stream.id,pszData,nLength);
+
+ break;
+
+
+
+ //getplayerstatus/user/is_premium
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_USER,NPlayerStatus_IS_PREMIUM):
+
+
+ strToIntN(ps->user.is_premium,pszData,nLength);
+
+ break;
+
+ //getplayerstatus/user/is_premium
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_USER,NPlayerStatus_USER_ID):
+
+
+ ps->error = StrCpyArray(ps->user.user_id,pszData,nLength);
+
+ break;
+
+ //getplayerstatus/user/userDomein
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_USER,NPlayerStatus_USER_DOMEIN):
+
+ ps->error = StrCpyArray(ps->user.userDomain,pszData,nLength);
+
+ break;
+
+ //getplayerstatus/stream/provider
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_PROVIDER):
+
+ if(_tcsncmp(pszData,TEXT("community"),nLength) == 0){
+
+ ps->stream.provider_type = COMMUNITY_PROVIDER_TYPE;
+
+ } else if(_tcsncmp(pszData,TEXT("channel"),nLength) == 0){
+
+ ps->stream.provider_type = CHANNEL_PROVIDER_TYPE;
+
+ }else if(_tcsncmp(pszData,TEXT("official"),nLength) == 0){
+
+ ps->stream.provider_type = OFFICIAL_PROVIDER_TYPE;
+
+ }
+
+ break;
+
+ //getplayerstatus/stream/default_community
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_DEFAULT_COMMUNITY):
+
+
+ ps->error = StrCpyArray(ps->stream.default_community,pszData,nLength);
+
+ break;
+
+ //getplayerstatus/stream/is_owner
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_IS_OWNER):
+
+ //ps->stream.is_owner = wtoin(pszData,nLength);
+ strToIntN(ps->stream.is_owner,pszData,nLength);
+ break;
+
+
+ //getplayerstatus/stream/end_time
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_END_TIME):
+
+ //ps->stream.end_time = wtoin(pszData,nLength);
+ strToIntN(ps->stream.end_time,pszData,nLength);
+
+ break;
+
+ //getplayerstatus/error/code
+ case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_ERROR,NPlayerStatus_CODE):
+ case MAKENORD2(NPlayerStatus_NICOLIVE_API,NPlayerStatus_ERROR,NPlayerStatus_CODE):
+
+
+
+ if(_tcsncmp(pszData,TEXT("invalid_lv"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_INVALID_LV;
+
+ }else if(_tcsncmp(pszData,TEXT("invalid_thread"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_INVALID_THREAD;
+
+ }else if( _tcsncmp(pszData,TEXT("notfound"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_NOTFOUND;
+
+ }else if(_tcsncmp(pszData,TEXT("notlogin"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_NOTLOGIN;
+
+ }else if(_tcsncmp(pszData,TEXT("not_permitted"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_NOT_PERMITTED;
+
+ }else if(_tcsncmp(pszData,TEXT("maintenance"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_MAINTENANCE;
+
+ }else if(_tcsncmp(pszData,TEXT("closed"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_CLOSED;
+
+ } else if(_tcsncmp(pszData,TEXT("unknown"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_UNKNOWN;
+
+ }else if(_tcsncmp(pszData,TEXT("unknown_error"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_UNKNOWN_ERROR;
+
+ } else if(_tcsncmp(pszData,TEXT("server_error"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_SERVER_ERROR;
+
+
+ } else if(_tcsncmp(pszData,TEXT("DELETED"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_DELETED;
+
+ } else if(_tcsncmp(pszData,TEXT("full"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_FULL;
+
+ } else if(_tcsncmp(pszData,TEXT("permission_denied"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_PERMISSION_DENIED;
+
+ }else if(_tcsncmp(pszData,TEXT("require_accept_print_timeshift_ticket"),nLength) == 0) {
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_REQUIRE_ACCEPT_PRINT_TIMESHIFT_TICKET;
+
+
+ }else if(_tcsncmp(pszData,TEXT("access_locked"),nLength) == 0) {
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_ACCESS_LOCKED;
+
+
+ }else if(_tcsncmp(pszData,TEXT("tsarchive"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_TSARCHIVE;
+
+ } else if(_tcsncmp(pszData,TEXT("usertimeshift"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_USERTIMESHIFT;
+
+ } else if(_tcsncmp(pszData,TEXT("require_community_member"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_REQUIRE_COMMUNITY_MEMBER;
+
+ } else if(_tcsncmp(pszData,TEXT("comingsoon"),nLength) == 0){
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_COMINGSOON;
+
+ } else {
+
+ errprint(TEXT("\96¢\92è\8b`\82Ì\83v\83\8c\83C\83\84\81[\83X\83e\81[\83^\83X\8eæ\93¾\83G\83\89\81[:%s"),pszData);
+
+ ps->error = NLIB_ERR_GETPLAYERSTATUS_UNDEFINED;
+
+ }
+
+
+
+
+ break;
+
+ }
+
+
+}
+
+
+
+extern void NPlayerStatus_ElementEndHandler(void *userData,const XML_Char *pszName){
+
+
+ UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
+ userDataContainer->nord = UPNORD(userDataContainer->nord);
+
+
+}
+
+
+
+
+void NicoLiveHeartBeat_ElementStartHandler(void *userData,const XML_Char *pszName,const XML_Char *atts[]){
+
+ UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
+ NicoLiveHeartBeatContainer_P hbc = (NicoLiveHeartBeatContainer_P)userDataContainer->userData;
+
+
+ enum NicoLiveHeartBeat_NORD element = NicoLiveHeartBeat_ROOT;
+
+ switch (userDataContainer->nord){
+
+ //\90e\83m\81[\83h
+ case (MAKENORD(NicoLiveHeartBeat_ROOT)):
+
+
+ if(_tcscmp(pszName,TEXT("heartbeat")) == 0){
+
+
+ UINT_PTR index;
+
+ for(index = 0;atts[index] != NULL;index += 2){
+
+ if(_tcscmp(atts[index],TEXT("status")) == 0 && _tcscmp(atts[index + 1],TEXT("ok")) == 0){
+
+
+ hbc->error = NLIB_ERR_OK;
+
+
+ }else if(_tcscmp(atts[index],TEXT("status")) == 0 && _tcscmp(atts[index + 1],TEXT("ok")) != 0){
+
+ hbc->error = NLIB_ERR_HEARTBEAT_ERROR;
+ }else if(_tcscmp(atts[index],TEXT("time")) == 0){
+
+ hbc->heartBeat.time = wcstoul(atts[index + 1],NULL,0);
+
+ }
+
+
+ }
+
+ element = NicoLiveHeartBeat_HEARTBEAT;
+ }
+
+
+
+ break;
+
+
+ case MAKENORD(NicoLiveHeartBeat_HEARTBEAT):
+
+ if(_tcscmp(pszName,TEXT("watchCount")) == 0){
+
+ element = NicoLiveHeartBeat_WATCHCOUNT;
+
+ } else if(_tcscmp(pszName,TEXT("commentCount")) == 0){
+
+ element = NicoLiveHeartBeat_COMMENTCOUNT;
+
+ } else if(_tcscmp(pszName,TEXT("is_restrict")) == 0){
+
+ element = NicoLiveHeartBeat_IS_RESTRICT;
+
+ } else if(_tcscmp(pszName,TEXT("ticket")) == 0){
+
+ element = NicoLiveHeartBeat_TICKET;
+
+ }
+
+
+ break;
+ }
+
+
+
+
+
+ userDataContainer->nord = MAKENORD1(userDataContainer->nord,element);
+
+
+
+}
+
+
+void NicoLiveHeartBeat_CharacterDataHandler(void *userData,const XML_Char *pszData,int nLength){
+
+
+ UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
+ NicoLiveHeartBeatContainer_P hbc = (NicoLiveHeartBeatContainer_P)userDataContainer->userData;
+
+
+ switch(userDataContainer->nord){
+
+ //heartbeat/watchCount
+ case MAKENORD1(NicoLiveHeartBeat_HEARTBEAT,NicoLiveHeartBeat_WATCHCOUNT):
+
+ strToIntN(hbc->heartBeat.watchCount,pszData,nLength);
+
+ break;
+
+ //heartbeat/commentCount
+ case MAKENORD1(NicoLiveHeartBeat_HEARTBEAT,NicoLiveHeartBeat_COMMENTCOUNT):
+
+ strToIntN(hbc->heartBeat.commentCount,pszData,nLength);
+
+ break;
+
+ //heartbeat/is_restrict
+ case MAKENORD1(NicoLiveHeartBeat_HEARTBEAT,NicoLiveHeartBeat_IS_RESTRICT):
+
+ extendMalloc(hbc->is_restrictBuff,LPTSTR,hbc->is_restrictSize,(INT_PTR)sizeof(TCHAR) * nLength);
+
+ wcsncpy(hbc->is_restrictBuff,pszData,nLength);
+
+ hbc->is_restrictBuff[nLength] = L'\0';
+
+ break;
+
+ //heartbeat/ticket
+ case MAKENORD1(NicoLiveHeartBeat_HEARTBEAT,NicoLiveHeartBeat_TICKET):
+
+ extendMalloc(hbc->ticketBuff,LPTSTR,hbc->ticketSize,(INT_PTR)sizeof(TCHAR) * nLength);
+
+ wcsncpy(hbc->ticketBuff,pszData,nLength);
+
+ hbc->ticketBuff[nLength] = L'\0';
+
+ break;
+
+
+ }
+
+}
+
+
+void NicoLiveHeartBeat_ElementEndHandler(void *userData,const XML_Char *pszName){
+
+ UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
+ userDataContainer->nord = UPNORD(userDataContainer->nord);
+
+
+}
+
+
+
+
+static INLINE VOID ToUTF8(LPSTR buf,LPCTSTR input,INT_PTR nLength,INT_PTR maxLength){
+
+
+ if(WideCharToMultiByte(CP_UTF8,0,input,nLength,(LPSTR)NULL,0,(LPCSTR)NULL,(LPBOOL)NULL) > maxLength){
+
+ return;
+
+ }
+
+ buf[WideCharToMultiByte(CP_UTF8,0,input,nLength,buf,maxLength,(LPCSTR)NULL,(LPBOOL)NULL)] = '\0';
+
+
+
+}
+
+
+static INLINE NLIB_RESULT StrCpy(LPTSTR buf,UINT_PTR buflen,LPCTSTR pszData,UINT_PTR nLength){
+
+ if(nLength >= buflen){
+ return NLIB_ERR_BUFFER_TOOLITTLE;
+ }
+
+ wcsncpy(buf,pszData,nLength);
+ buf[nLength] = L'\0';
+
+
+ return NLIB_ERR_OK;
+
+
+
+
+
+
+}
+