-//NlibProperty nlibProperty;
static NicoLiveHeartBeatContainer heartBeatContainer;
static CRITICAL_SECTION heartBeatCs;
-static DWORD heartBeatTime = 300000;
-
-static BOOL heartBeatFlag = TRUE;
-
-
-static DWORD keapALiveTime = 300000;
-
-static BOOL keapALiveFlag = TRUE;
//
(convPtr)[0] = L'\0'
-
+/*
#define convertTEXT(buf,basePtr,convPtr,endPtr)\
(buf) = (convPtr);\
for(;(basePtr) < (endPtr);(basePtr)++){\
}\
}\
(convPtr)[0] = '\0'
-
+*/
static void NicoLiveError(void *buf);
-
+static void NicoLiveSelfDisconnect(void *buf);
///
///\83\\83P\83b\83g\8eæ\93¾\8aÖ\90\94
///
self->chatManager.deleteEvent = WSACreateEvent();
+ self->chatManager.setHeartBeatTimeEvent = WSACreateEvent();
+
+ self->chatManager.setKeepAliveTimeEvent = WSACreateEvent();
+
self->chatManager.resetEvents[0] = WSACreateEvent();
self->chatManager.resetEvents[1] = WSACreateEvent();
self->chatManager.hKeapALiveHandle = (HANDLE)_beginthreadex(NULL,0,NicoLiveKeapALiveThread,self,0,&self->chatManager.keapALiveThreadID);
+ self->chatManager.heartBeatTime = 300000;
+
+ self->chatManager.heartBeatFlag = TRUE;
+
+ self->chatManager.keepAliveTime = 300000;
+
+ self->chatManager.keapALiveFlag = TRUE;
+
dumpln(TEXT("size%d"),sizeof(NicoLiveStream));
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);
}
- CloseHandle((*self)->chatManager.hRecvChatHandle);
+
- CloseHandle((*self)->chatManager.hHeartBeatHandle);
+
- CloseHandle((*self)->chatManager.hKeapALiveHandle);
+
//\8cã\8f\88\97\9d&\94j\8aü
+ WSACloseEvent((*self)->chatManager.setHeartBeatTimeEvent);
+
+ WSACloseEvent((*self)->chatManager.setKeepAliveTimeEvent);
+
WSACloseEvent((*self)->chatManager.endEvent);
WSACloseEvent((*self)->chatManager.startEvent);
- //closesocket(self->chatManager.sock);
-
-
-
-
- //nicoLiveStream_Finalize((**self));
free((*self));
///
///\83n\81[\83g\83r\81[\83g\82Ì\8aÔ\8au\82ð\90Ý\92è\81i\83~\83\8a\95b)
///
-VOID SetHeartBeatMsec(DWORD msec){
-
-
- heartBeatTime = msec;
+VOID SetHeartBeatMsec(NicoLiveStream_P self,DWORD msec){
+ WSASetEvent(self->chatManager.setHeartBeatTimeEvent);
+ self->chatManager.heartBeatTime = msec;
+ return;
}
///
///\83n\81[\83g\83r\81[\83g\82Ì\8aÔ\8au\82ð\8eæ\93¾(\83~\83\8a\95b)
///
-DWORD GetHeartBeatMsec(){
+DWORD GetHeartBeatMsec(NicoLiveStream_P self){
- return heartBeatTime;
+ return self->chatManager.heartBeatTime;
}
///
///\83n\81[\83g\83r\81[\83g\97L\8cø\81E\96³\8cø\90Ý\92è
///
-VOID SetHeartBeatFlag(BOOL flag){
+VOID SetHeartBeatFlag(NicoLiveStream_P self,BOOL flag){
- heartBeatFlag = flag;
+ self->chatManager.heartBeatFlag = flag;
}
///
///\83n\81[\83g\83r\81[\83g\97L\8cø\83t\83\89\83O\8eæ\93¾
///
-BOOL GetHeartBeatFlag(){
+BOOL GetHeartBeatFlag(NicoLiveStream_P self){
- return heartBeatFlag;
+ return self->chatManager.heartBeatFlag;
}
///
///\83L\81[\83v\83A\83\89\83C\83u\82Ì\8aÔ\8au\82ð\90Ý\92è(\83~\83\8a\95b)
///
-VOID SetKeapALiveMsec(DWORD msec){
+VOID SetKeapALiveMsec(NicoLiveStream_P self,DWORD msec){
- keapALiveTime = msec;
+ WSASetEvent(self->chatManager.setKeepAliveTimeEvent);
+ self->chatManager.keepAliveTime = msec;
+
+ return;
}
///
///\83L\81[\83v\83A\83\89\83C\83u\82Ì\8aÔ\8au\82ð\8eæ\93¾(\83~\83\8a\95b)
///
-DWORD GetKeapALiveMsec(){
+DWORD GetKeapALiveMsec(NicoLiveStream_P self){
- return keapALiveTime;
+ return self->chatManager.keepAliveTime;
}
///
///\83L\81[\83v\83A\83\89\83C\83u\97L\8cø\81E\96³\8cø\90Ý\92è
///
-VOID SetKeapALiveFlag(BOOL flag){
+VOID SetKeapALiveFlag(NicoLiveStream_P self,BOOL flag){
- keapALiveFlag = flag;
+ self->chatManager.keapALiveFlag = flag;
}
///
///\83L\81[\83v\83A\83\89\83C\83u\83t\83\89\83O\8eæ\93¾
///
-BOOL GetKeapALiveFlag(){
+BOOL GetKeapALiveFlag(NicoLiveStream_P self){
- return keapALiveFlag;
+ return self->chatManager.keapALiveFlag;
}
{
HINTERNET hWatchLiveNicoSession = NULL;
HINTERNET hGetPlayerStatusRequest = NULL;
- ChunkMemory_P chunk = allocChunkGlobal();
+ const UINT_PTR buflen = LENGTH_65536;
+ LPVOID buffer = malloc(buflen);
- LPWSTR objectName = (LPWSTR)chunk->buffer;
+ LPWSTR objectName = (LPWSTR)buffer;
LPWSTR indexPtr;
LPWSTR sendBuffer = (LPWSTR)&objectName[LENGTH_4096];
LPSTR recvBuffer;
recvBuffer = (LPSTR)sendBuffer;
- if(ReadHttpBody(hGetPlayerStatusRequest,(LPBYTE)recvBuffer,CHUNKMEMORY_MAXSIZE,&readSize) == FALSE){
+ if(ReadHttpBody(hGetPlayerStatusRequest,(LPBYTE)recvBuffer,buflen,&readSize) == FALSE){
rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
goto connectend;
}
connectend:
- freeChunkGlobal(chunk);
+ free(buffer);
WinHttpCloseHandle(hWatchLiveNicoSession);
WinHttpCloseHandle(hGetPlayerStatusRequest);
WSAWaitForMultipleEvents(sizeof(self->chatManager.resetEvents) / sizeof(self->chatManager.resetEvents[0]),self->chatManager.resetEvents,TRUE,WSA_INFINITE,FALSE);
- {
- WSAEVENT eventObject = self->chatManager.endEvent;
- WSAEVENT startObject = self->chatManager.startEvent;
- WSAEVENT deleteObject = self->chatManager.deleteEvent;
- HANDLE recvThread = self->chatManager.hRecvChatHandle;
- DWORD recvThreadID = self->chatManager.recvChatThreadID;
-
- //nicoLiveStream_Initialize(*self);
- ZeroMemory(self,sizeof(*self));
- WSAResetEvent(eventObject);
- self->chatManager.hRecvChatHandle = recvThread;
- self->chatManager.recvChatThreadID = recvThreadID;
- self->chatManager.endEvent = eventObject;
- self->chatManager.startEvent = startObject;
- self->chatManager.deleteEvent = deleteObject;
- }
+ //nicoLiveStream_Initialize(*self);
+ ZeroMemory(&self->playerStatus,sizeof(self->playerStatus));
+ WSAResetEvent(self->chatManager.endEvent);
+
NLIB_RESULT NicoLiveStream_sendChat(NicoLiveStream_P self,LPCWSTR chatbuf,LPCWSTR *mail,LPCWSTR *extends){
-
- ChunkMemory_P chunkMemory = allocChunkGlobal();
+ const UINT_PTR buflen = LENGTH_65536 * 4;
+ LPVOID chunk = malloc(buflen);
LPSTR postKey;
- LPSTR postKeyBuf = (LPSTR)chunkMemory->buffer;
+ LPSTR postKeyBuf = (LPSTR)chunk;
LPWSTR postKeyReqBuf = (LPWSTR)&postKeyBuf[NICOLIVE_SENDCHATBUFLEN];
LPWSTR cookieBuf = &postKeyReqBuf[NICOLIVE_SENDCHATBUFLEN];
DWORD statusCode;
- if(ReadHttpBody(hGetPostKeySession,(LPBYTE)postKeyBuf,CHUNKMEMORY_MAXSIZE,&readSize) == FALSE){
+ if(ReadHttpBody(hGetPostKeySession,(LPBYTE)postKeyBuf,buflen,&readSize) == FALSE){
rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
goto end;
{
- LPSTR buffer = (LPSTR)&cookieBuf[NICOLIVE_SENDCHATBUFLEN * 4];
+ LPSTR buffer = (LPSTR)&cookieBuf[NICOLIVE_SENDCHATBUFLEN];
LPSTR indexPtr;
LPSTR mailBuf;
LPSTR extendBuf;
strcpy(indexPtr,">");
indexPtr += strlen(indexPtr);
{
+ LPWSTR sendBuf = (LPWSTR)&buffer[NICOLIVE_SENDCHATBUFLEN * 4];
+ LPWSTR sendPtr = sendBuf;
LPCWSTR endPtr= chatbuf + wcslen(chatbuf);
- convertTEXT(indexPtr,chatbuf,indexPtr,endPtr);
- //WideToMB(CP_UTF8,chatbuf,indexPtr,NICOLIVE_SENDCHATBUFLEN - (indexPtr - buffer) - 1);
- //indexPtr += strlen(indexPtr);
+
+
+ //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';
end:
-
+ free(chunk);
WinHttpCloseHandle(hGetPostKeySession);
WinHttpCloseHandle(hWatchLiveNicoVideo);
HINTERNET hWatchLiveNicoSession = NULL;
HINTERNET hGetPlayerStatusRequest = NULL;
- ChunkMemory_P chunkMemory = (ChunkMemory_P)NULL;
- LPVOID buffer;
+ const UINT_PTR buflen = LENGTH_65536;
+ LPVOID buffer = NULL;
LPWSTR sendBuffer;
LPSTR recvBuffer;
DWORD readSize;
}
- chunkMemory = allocChunkGlobal();
- buffer = getBufChunk(chunkMemory);
+
+ buffer = malloc(buflen);
sendBuffer = (LPWSTR)buffer;
wcscpy(sendBuffer,L"Cookie: ");
wcscat(sendBuffer,userSession);
recvBuffer = (LPSTR)sendBuffer;
- if(ReadHttpBody(hGetPlayerStatusRequest,(LPBYTE)recvBuffer,CHUNKMEMORY_MAXSIZE,&readSize) == FALSE){
+ if(ReadHttpBody(hGetPlayerStatusRequest,(LPBYTE)recvBuffer,buflen,&readSize) == FALSE){
rslt = NLIB_GETPLAYERSTATUS_FAILED_CONNECT;
goto end;
end:
- freeChunkGlobal(chunkMemory);
+ free(buffer);
WinHttpCloseHandle(hGetPlayerStatusRequest);
//hConnect\82ªNULL\8ew\92è\82Å\93n\82³\82ê\82½\8fê\8d\87\81A\82±\82Ì\8aÖ\90\94\82Å\83n\83\93\83h\83\8b\82ð\90¶\90¬\82µ\82½\82Ì\82Å\95Â\82¶\82é
WCHAR cookie[GETNICOLIVEHIS_COOKIELENGTH] = {L"Cookie: "};
DWORD statusCode;
DWORD statusCodeSize = sizeof(statusCode);
- ChunkMemory_P chunkMemory = allocChunkGlobal();
- DWORD chunkSize = CHUNKMEMORY_MAXSIZE;
+ DWORD chunkSize = LENGTH_65536;
+ LPVOID chunkMemory = malloc(chunkSize);
+
- LPWSTR buffer = (LPWSTR)chunkMemory->buffer;
+ LPWSTR buffer = (LPWSTR)chunkSize;
}
end:
- freeChunkGlobal(chunkMemory);
+ free(chunkMemory);
WinHttpCloseHandle(hStreamBrowse);
if(hConnect == NULL){
NicoLiveStream_P self = (NicoLiveStream_P)lpBuffer;
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,self->chatManager.setKeepAliveTimeEvent};
DWORD dwResult; //\83C\83x\83\93\83g\8eó\90M\8c\8b\89Ê
DWORD endResult;
case 2:
continue;
+
default:
goto err;
}
while(TRUE){
- endResult = WSAWaitForMultipleEvents(1,&self->chatManager.endEvent,FALSE,keapALiveTime,FALSE);
+ WSAResetEvent(self->chatManager.setKeepAliveTimeEvent);
+ endResult = WSAWaitForMultipleEvents(sizeof(streamEvent) / sizeof(streamEvent[0]),streamEvent,FALSE,self->chatManager.keepAliveTime,FALSE);
if(endResult == WSA_WAIT_TIMEOUT){
- if(keapALiveFlag){
+ if(self->chatManager.keapALiveFlag){
LPCWSTR mail[2] = {L"184",NULL};
NicoLiveStream_sendChat(self,L"/keapalive",mail,NULL);
}
- } else if(endResult - WSA_WAIT_EVENT_0 == 0){
+ } else{
+ switch(endResult - WSA_WAIT_EVENT_0){
+
+ case 0:
+ goto loopend;
- break;;
+ case 1:
+ break;
- } else {
+ default:
+ goto err;
- goto err;
+ }
}
}
+loopend:;
}
NicoLiveStream_P self = (NicoLiveStream_P)lpBuffer;
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,self->chatManager.setHeartBeatTimeEvent};
DWORD dwResult; //\83C\83x\83\93\83g\8eó\90M\8c\8b\89Ê
DWORD endResult;
while(TRUE){
WSASetEvent(self->chatManager.resetEvents[1]);
-
+
dwResult = WSAWaitForMultipleEvents(sizeof(events) / sizeof(events[0]),events,FALSE,WSA_INFINITE,FALSE);
case 2:
continue;
+
default:
goto err;
}
while(TRUE){
- endResult = WSAWaitForMultipleEvents(1,&self->chatManager.endEvent,FALSE,heartBeatTime,FALSE);
+ WSAResetEvent(self->chatManager.setHeartBeatTimeEvent);
+ endResult = WSAWaitForMultipleEvents(sizeof(streamEvent) / sizeof(streamEvent[0]),streamEvent,FALSE,self->chatManager.heartBeatTime,FALSE);
if(endResult == WSA_WAIT_TIMEOUT){
- if(heartBeatFlag){
+ if(self->chatManager.heartBeatFlag){
NicoLiveStream_sendHeartBeat(self);
}
- } else if(endResult - WSA_WAIT_EVENT_0 == 0){
+ } else{
+ switch(endResult - WSA_WAIT_EVENT_0){
- break;;
+ case 0:
+ goto loopend;
- } else {
+ case 1:
+ break;
- goto err;
- }
+ default:
+ goto err;
+ }
+ }
}
+loopend:;
+
}
if(NicoLiveRecvChatLoop(self) == FALSE){
goto err;
}
+
+
}
self->chatManager.commentCount = wcstoul(nicoLiveChat.no,NULL,0);
+
+
(*commentCountSum)++;
isReceveChat = TRUE;
self->callBack(NICOLIVE_EVENT_RECEVE_CHAT,self,self->option,(NICOLIVE_PARAM)&nicoLiveChat,self->chatManager.commentCount);
+ if(wcscmp(nicoLiveChat.chatBuf,L"/disconnect") == 0 && wcscmp(nicoLiveChat.premium,L"2") == 0){
+ _beginthread(NicoLiveSelfDisconnect,0,self);
+ }
//chat_result\83m\81[\83h\82Ì\8fê\8d\87
} else if((indexPtr = wcsstr(commentBuf,L"<chat_result ")) != NULL){
}
+static void NicoLiveSelfDisconnect(void *buf){
+
+ NicoLiveStream_P nl = (NicoLiveStream_P)buf;
+
+
+
+ NicoLiveStream_disConnect(nl);
+
+ _heapmin();
+
+
+ _endthread();
+ return;
+
+}
+
static INLINE SOCKET GetConectedSocket(LPCWSTR nordName,LPCWSTR port,int socktype,int addr_famiry,int protocol){