OSDN Git Service

2012/01/25 1:03:19
authorqwerty2501 <riot313@gmail.com>
Tue, 24 Jan 2012 16:03:20 +0000 (01:03 +0900)
committerqwerty2501 <riot313@gmail.com>
Tue, 24 Jan 2012 16:03:20 +0000 (01:03 +0900)
nlib/nlib.h
nlib/nlib.vcxproj
nlib/nlib.vcxproj.filters
nlib/nlib_common.cpp [new file with mode: 0644]
nlib/nlib_errorMessage.cpp [new file with mode: 0644]
nlib/nlib_myList.cpp [new file with mode: 0644]
nlib/nlib_nicoLive.cpp [new file with mode: 0644]
nlib/nlib_nicoVideoAuth.cpp [new file with mode: 0644]
nlib/nlib_xmlHandler.cpp [new file with mode: 0644]
nlib/stdAfx.cpp [new file with mode: 0644]
nlite.suo

index 7df9718..0ce7210 100644 (file)
@@ -138,7 +138,7 @@ typedef struct{
        LPCTSTR user_id;
        LPCTSTR name;
        LPCTSTR chatBuf;
-       LPCTSTR* mail;
+       LPTSTR* mail;
        UINT_PTR mailCount;
 }NicoLiveChat,*NicoLiveChat_P;
 
index 961f62b..51136ba 100644 (file)
     <None Include="ReadMe.txt" />
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="nlib_common.c" />
-    <ClCompile Include="nlib_errorMessage.c" />
-    <ClCompile Include="nlib_myList.c" />
-    <ClCompile Include="nlib_nicoLive.c" />
-    <ClCompile Include="nlib_nicoVideoAuth.c" />
-    <ClCompile Include="nlib_xmlHandler.c" />
-    <ClCompile Include="stdAfx.c">
+    <ClCompile Include="nlib_common.cpp" />
+    <ClCompile Include="nlib_errorMessage.cpp" />
+    <ClCompile Include="nlib_myList.cpp" />
+    <ClCompile Include="nlib_nicoLive.cpp" />
+    <ClCompile Include="nlib_nicoVideoAuth.cpp" />
+    <ClCompile Include="nlib_xmlHandler.cpp" />
+    <ClCompile Include="stdAfx.cpp">
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug-window|Win32'">Create</PrecompiledHeader>
     </ClCompile>
index 99aef3c..2e554fe 100644 (file)
     <None Include="ReadMe.txt" />
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="nlib_xmlHandler.c">
+    <ClCompile Include="nlib_nicoVideoAuth.cpp">
       <Filter>ソース ファイル</Filter>
     </ClCompile>
-    <ClCompile Include="nlib_nicoLive.c">
+    <ClCompile Include="nlib_xmlHandler.cpp">
       <Filter>ソース ファイル</Filter>
     </ClCompile>
-    <ClCompile Include="nlib_nicoVideoAuth.c">
+    <ClCompile Include="stdAfx.cpp">
       <Filter>ソース ファイル</Filter>
     </ClCompile>
-    <ClCompile Include="nlib_myList.c">
+    <ClCompile Include="nlib_nicoLive.cpp">
       <Filter>ソース ファイル</Filter>
     </ClCompile>
-    <ClCompile Include="nlib_common.c">
+    <ClCompile Include="nlib_myList.cpp">
       <Filter>ソース ファイル</Filter>
     </ClCompile>
-    <ClCompile Include="stdAfx.c">
+    <ClCompile Include="nlib_errorMessage.cpp">
       <Filter>ソース ファイル</Filter>
     </ClCompile>
-    <ClCompile Include="nlib_errorMessage.c">
+    <ClCompile Include="nlib_common.cpp">
       <Filter>ソース ファイル</Filter>
     </ClCompile>
   </ItemGroup>
diff --git a/nlib/nlib_common.cpp b/nlib/nlib_common.cpp
new file mode 100644 (file)
index 0000000..385bff6
--- /dev/null
@@ -0,0 +1,171 @@
+#include "StdAfx.h"
+#include "nlib_include.h"
+
+
+
+HINTERNET hHttpSession;                        //HINTERNET
+HINTERNET hWatchLiveNicoConnect;
+HINTERNET hNicoVideoConnect;
+
+TCHAR appDataPath[_MAX_PATH];
+TCHAR localAppDataPath[_MAX_PATH];
+XML_Parser xmlParser;
+static CRITICAL_SECTION playerStatusParserCs;
+
+
+///
+///\83v\83\8c\83C\83\84\81[\83X\83e\81[\83^\83X\83p\81[\83T\8f\89\8aú\89»
+///
+static INLINE VOID Parser_Initialize();
+
+
+///
+///\83v\83\8c\83C\83\84\81[\83X\83e\81[\83^\83X\83p\81[\83T\8cã\8f\88\97\9d
+///
+static INLINE VOID Parser_Finalize();
+
+NLIB_RESULT InitializeNLIB(HINTERNET hInternet){
+
+       NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
+       hHttpSession = hInternet;
+       if(hHttpSession == NULL){
+
+               rslt = NLIB_INITALIZE_FAILED_NETWORK;
+               goto end;
+
+       }
+
+       hWatchLiveNicoConnect = WinHttpConnect(hHttpSession,WTEXT(WATCH_LIVE_NICO_VIDEO_DOMEINNAME),INTERNET_DEFAULT_HTTP_PORT,0);
+
+       if(hHttpSession == NULL){
+               rslt = NLIB_INITALIZE_FAILED_NETWORK;
+               goto end;
+       }
+
+       hNicoVideoConnect = WinHttpConnect(hHttpSession,WWW_NICO_VIDEO_DOMEINNAME,INTERNET_DEFAULT_HTTP_PORT,0);
+
+       //appData\82Ì\83p\83X\82ð\83Z\83b\83g
+       SHGetFolderPathW(0,CSIDL_APPDATA,0,SHGFP_TYPE_CURRENT,appDataPath);
+       wcscat(appDataPath,L"\\");
+
+       //localAppData\82Ì\83p\83X\82ð\83Z\83b\83g
+       SHGetFolderPathW(0,CSIDL_LOCAL_APPDATA,0,SHGFP_TYPE_CURRENT,localAppDataPath);
+       wcscat(localAppDataPath,L"\\");
+
+
+
+
+       //\83N\83b\83L\81[\83\89\83C\83u\83\89\83\8a\82ð\8f\89\8aú\89»
+       InitializeShareCookie(appDataPath,localAppDataPath);
+
+       Initialize_NicoLive();
+
+       //\83p\81[\83T\82ð\8f\89\8aú\89»
+       Parser_Initialize();
+
+       rslt = NLIB_ERR_OK;
+
+end:
+
+
+       return rslt;
+}
+
+VOID FinalizeNLIB(){
+       //\83v\83\8c\83C\83\84\81[\83X\83e\81[\83^\83X\83p\81[\83T\8cã\8f\88\97\9d
+       Parser_Finalize();
+
+       Finalize_NicoLive();
+
+
+       //\83N\83b\83L\81[\8b¤\97L\83\89\83C\83u\83\89\83\8a\82Ì\8cã\8f\88\97\9d
+       FinalizeShareCookie();
+
+
+
+       //winHttp\82Ì\8cã\8f\88\97\9d
+       //WinHttpCloseHandle(hHttpSession);
+
+       //winsock\82Ì\8cã\8f\88\97\9d
+       //WSACleanup();
+
+       return;
+}
+
+
+INLINE BOOL ReadHttpBody(HINTERNET hRequest,LPBYTE lpBuffer,DWORD dwBufSize,LPDWORD lpDwSize){
+
+
+       DWORD  dwSize;
+       DWORD  dwTotalSize = 0;
+       DWORD  dwTotalSizePrev = 0;
+
+       for (;;) {
+               WinHttpQueryDataAvailable(hRequest, &dwSize);
+               if (dwSize > 0) {
+                       dwTotalSizePrev = dwTotalSize;
+                       dwTotalSize += dwSize;
+
+                       if(dwTotalSize >= dwBufSize){
+                               return FALSE;
+                       }
+
+                       WinHttpReadData(hRequest, lpBuffer + dwTotalSizePrev, dwSize, (LPDWORD)NULL);
+
+               }
+               else
+                       break;
+       }
+
+       *lpDwSize= dwTotalSize;
+
+       return TRUE;
+
+}
+static INLINE VOID Parser_Initialize(){
+
+
+       xmlParser = XML_ParserCreate((const XML_Char*)NULL);
+
+       check(xmlParser,TEXT("\83p\81[\83T\8f\89\8aú\89»\82É\8e¸\94s\82µ\82Ü\82µ\82½"));
+
+
+
+       InitializeCriticalSection(&playerStatusParserCs);
+
+}
+
+static INLINE VOID Parser_Finalize(){
+
+
+       XML_ParserFree(xmlParser);
+
+       DeleteCriticalSection(&playerStatusParserCs);
+
+
+}
+
+ VOID XMLParse(LPVOID option,LPCSTR body,XML_StartElementHandler startElementEvent,XML_EndElementHandler endElementEvent,XML_CharacterDataHandler characterDataEvent){
+
+       UserDataContainer userDataContainer;
+       userDataContainer.nord = 0;
+       userDataContainer.userData = option;
+
+
+       EnterCriticalSection(&playerStatusParserCs);
+
+       //\91®\90«\90Ý\92è
+       XML_SetElementHandler(xmlParser,startElementEvent,endElementEvent);
+       XML_SetCharacterDataHandler(xmlParser,characterDataEvent);
+       XML_SetUserData(xmlParser,&userDataContainer);
+
+       //\89ð\90Í
+       XML_Parse(xmlParser,body,strlen(body),TRUE);
+
+       //\83\8a\83Z\83b\83g
+       XML_ParserReset(xmlParser,(const XML_Char*)NULL);
+
+       LeaveCriticalSection(&playerStatusParserCs);
+
+
+}
\ No newline at end of file
diff --git a/nlib/nlib_errorMessage.cpp b/nlib/nlib_errorMessage.cpp
new file mode 100644 (file)
index 0000000..f930602
--- /dev/null
@@ -0,0 +1,187 @@
+#include "StdAfx.h"
+#include "nlib_include.h"
+
+
+
+
+#define DECLARE_NLIB_ERROR_MESSAGE(c,m)\
+       static const LPCTSTR ERROR_##c##MESSAGE = m
+
+
+//NLIB_ERR_OK
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_OK,TEXT("\83G\83\89\81[\82Í\94­\90\82µ\82Ä\82¢\82Ü\82¹\82ñ"));
+
+//NLIB_ERR_COOKIE_FAILED
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_COOKIE_FAILED,TEXT("\83N\83b\83L\81[\8eæ\93¾\82É\8e¸\94s\82µ\82Ü\82µ\82½"));
+
+//NLIB_INITALIZE_FAILED_NETWORK
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_INITALIZE_FAILED_NETWORK,TEXT("\83l\83b\83g\83\8f\81[\83N\82Ì\8f\89\8aú\89»\82É\8e¸\94s\82µ\82Ü\82µ\82½"));          
+
+//NLIB_LIVENO_IS_NULL
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_LIVENO_IS_NULL,TEXT("\93ü\97Í\82³\82ê\82½\95ú\91\97\94Ô\8d\86\82ªNULL\92l\82Å\82·"));
+
+//NLIB_LIVENO_FAILED_TOOBIG
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_LIVENO_FAILED_TOOBIG,TEXT("\93ü\97Í\82³\82ê\82½\95ú\91\97\94Ô\8d\86\82ª\92·\82·\82¬\82Ü\82·"));
+
+//NLIB_LIVENO_FAILED_UNDEFEINE
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_LIVENO_FAILED_UNDEFEINE,TEXT("\93ü\97Í\82³\82ê\82½\95ú\91\97\94Ô\8d\86\82ª\90³\82µ\82­\82 \82è\82Ü\82¹\82ñ")); 
+
+//NLIB_USERSESSION_FAILED_TOOBIG
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_USERSESSION_FAILED_TOOBIG,TEXT("\83\86\81[\83U\81[\83Z\83b\83V\83\87\83\93\82Ì\95\8e\9a\97ñ\82ª\92·\82·\82¬\82Ü\82·"));
+
+//NLIB_GETPLAYERSTATUS_FAILED_CONNECT
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_GETPLAYERSTATUS_FAILED_CONNECT,TEXT("\83v\83\8c\83C\83\84\81[\83X\83e\81[\83^\83X\82Ì\90Ú\91±\82É\8e¸\94s\82µ\82Ü\82µ\82½"));
+
+//NLIB_ERR_GETPLAYERSTATUS_INVALID_LV
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_INVALID_LV,TEXT("\96³\8cø\82È\95ú\91\97\94Ô\8d\86\82Å\82·"));
+
+//NLIB_ERR_GETPLAYERSTATUS_INVALID_THREAD
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_INVALID_THREAD,TEXT("\95ú\91\97\83X\83\8c\83b\83h\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\82Å\82µ\82½"));
+
+//NLIB_ERR_GETPLAYERSTATUS_CLOSED
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_CLOSED,TEXT("\95ú\91\97\82ª\8fI\97¹\82µ\82Ä\82¢\82Ü\82·"));
+
+//NLIB_ERR_GETPLAYERSTATUS_UNKNOWN_ERROR
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_UNKNOWN_ERROR,TEXT("\95ú\91\97\90Ú\91±\92\86\82É\95s\96¾\82È\83G\83\89\81[\82ª\94­\90\82µ\82Ü\82µ\82½:unknown_error"));
+
+//NLIB_ERR_GETPLAYERSTATUS_SERVER_ERROR
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_SERVER_ERROR,TEXT("\95ú\91\97\83T\81[\83o\81[\90Ú\91±\82É\8e¸\94s\82µ\82Ü\82µ\82½"));
+
+//NLIB_ERR_GETPLAYERSTATUS_DELETED
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_DELETED,TEXT("\95ú\91\97\82ª\8dí\8f\9c\82³\82ê\82Ä\82¢\82Ü\82·"));
+
+//NLIB_ERR_GETPLAYERSTATUS_FULL
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_FULL,TEXT("\96\9e\88õ\82Ì\82½\82ß\90Ú\91±\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½"));
+
+//NLIB_ERR_GETPLAYERSTATUS_PERMISSION_DENIED
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_PERMISSION_DENIED,TEXT("\95ú\91\97\82É\90Ú\91±\82·\82é\8c \8cÀ\82ª\82 \82è\82Ü\82¹\82ñ"));
+
+//NLIB_ERR_GETPLAYERSTATUS_ACCESS_LOCKED
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_ACCESS_LOCKED,TEXT("\95ú\91\97\82ª\83\8d\83b\83N\82³\82ê\82Ä\82¢\82Ä\90Ú\91±\82Å\82«\82Ü\82¹\82ñ"));
+
+//NLIB_ERR_GETPLAYERSTATUS_REQUIRE_COMMUNITY_MEMBER
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_REQUIRE_COMMUNITY_MEMBER,TEXT("\83R\83~\83\85\83j\83e\83B\8cÀ\92è\95ú\91\97\82Ì\82½\82ß\90Ú\91±\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½"));
+
+//NLIB_ERR_GETPLAYERSTATUS_COMINGSOON
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_COMINGSOON,TEXT("\95ú\91\97\82ª\8aJ\8fê\82³\82ê\82Ä\82¢\82È\82¢\82½\82ß\90Ú\91±\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½"));
+
+//NLIB_ERR_GETPLAYERSTATUS_NOTFOUND
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_NOTFOUND,TEXT("\95ú\91\97\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\82Å\82µ\82½"));
+
+//NLIB_ERR_GETPLAYERSTATUS_NOTLOGIN
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_NOTLOGIN,TEXT("\83\8d\83O\83C\83\93\82µ\82Ä\82¢\82È\82¢\82½\82ß\95ú\91\97\82É\90Ú\91±\82Å\82«\82Ü\82¹\82ñ"));
+
+//NLIB_ERR_GETPLAYERSTATUS_UNKNOWN
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_UNKNOWN,TEXT("\95ú\91\97\90Ú\91±\92\86\82É\95s\96¾\82È\83G\83\89\81[\82ª\94­\90\82µ\82Ü\82µ\82½:unknown"));
+
+//NLIB_ERR_GETPLAYERSTATUS_MAINTENANCE
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_MAINTENANCE,TEXT("\83\81\83\93\83e\83i\83\93\83X\92\86\82Å\82·"));
+
+//NLIB_ERR_GETPLAYERSTATUS_NOT_PERMITTED
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_NOT_PERMITTED,TEXT("\8fI\97¹\82µ\82½\95ú\91\97\82©\81A\8cÃ\82¢\95ú\91\97\81A\82 \82é\82¢\82ÍBAN\82³\82ê\82Ä\82¢\82Ü\82·"));
+
+//NLIB_ERR_GETPLAYERSTATUS_REQUIRE_ACCEPT_PRINT_TIMESHIFT_TICKET
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_REQUIRE_ACCEPT_PRINT_TIMESHIFT_TICKET,TEXT("\83^\83C\83\80\83V\83t\83g\82Ì\8e\8b\92®\8c \97\98\82ª\82 \82è\82Ü\82¹\82ñ"));
+
+//NLIB_ERR_GETPLAYERSTATUS_TSARCHIVE
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_TSARCHIVE,TEXT("\97L\97¿\95ú\91\97\82Ì\83A\81[\83J\83C\83u\8e\8b\92®\8c \97\98\82ª\82È\82¢\82½\82ß\90Ú\91±\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½"));
+
+//NLIB_ERR_GETPLAYERSTATUS_USERTIMESHIFT
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_USERTIMESHIFT,TEXT("\83R\83~\83\85\83j\83e\83B\82É\8eQ\89Á\82µ\82Ä\82¢\82È\82¢\82½\82ß\83^\83C\83\80\83V\83t\83g\82ð\8e\8b\92®\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82¹\82ñ"));
+
+//NLIB_ERR_GETPLAYERSTATUS_UNDEFINED
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_GETPLAYERSTATUS_UNDEFINED,TEXT("\83A\83v\83\8a\83P\81[\83V\83\87\83\93\93à\82Å\92è\8b`\82³\82ê\82Ä\82È\82¢\83G\83\89\81[\82ª\94­\90\82µ\82Ü\82µ\82½"));
+
+//NLIB_ERR_WATCHLIVENICOVIDEO_FAILED_CONNECT
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_WATCHLIVENICOVIDEO_FAILED_CONNECT,TEXT("\83j\83R\90\82Ì\83T\81[\83o\81[\90Ú\91±\82É\8e¸\94s\82µ\82Ü\82µ\82½"));
+
+//NLIB_ERR_BUFFER_TOOLITTLE
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_BUFFER_TOOLITTLE,TEXT("\93à\95\94\82Å\8am\95Û\82³\82ê\82½\83o\83b\83t\83@\82ª\91«\82è\82Ü\82¹\82ñ"));
+
+//NLIB_ERR_FAILED_NETWORK
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_FAILED_NETWORK,TEXT("\83l\83b\83g\83\8f\81[\83N\82É\89½\82ç\82©\82Ì\88Ù\8fí\82ª\94­\90\82µ\82Ü\82µ\82½"));
+
+//NLIB_ERR_PLAYERSTATUS_ERROR
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_PLAYERSTATUS_ERROR,TEXT("\8eæ\93¾\82µ\82½\83v\83\8c\83C\83\84\81[\83X\83e\81[\83^\83X\82ª\83G\83\89\81[\82Å\82·"));
+
+//NLIB_ERR_HEARTBEAT_ERROR
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_HEARTBEAT_ERROR,TEXT("\8eæ\93¾\82µ\82½\83n\81[\83g\83r\81[\83g\82ª\83G\83\89\81[\82Å\82·"));
+
+//NLIB_ERR_JSON_PARSE
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_JSON_PARSE,TEXT("json\89ð\90Í\92\86\82É\83G\83\89\81[\82ª\94­\90\82µ\82Ü\82µ\82½"));
+
+//NLIB_ERR_SHELL_FAILED
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_SHELL_FAILED,TEXT("shell\83R\83}\83\93\83h\8eÀ\8ds\82É\8e¸\94s\82µ\82Ü\82µ\82½"));
+
+//NLIB_ERR_NOT_LIVECONNECT
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_NOT_LIVECONNECT,TEXT("\90\95ú\91\97\82É\90Ú\91±\82µ\82Ä\82¢\82Ü\82¹\82ñ"));
+
+//NLIB_ERR_LIVE_GETPOSTKEY_FAILED
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_LIVE_GETPOSTKEY_FAILED,TEXT("\83R\83\81\83\93\83g\91\97\90M\97p\82Ì\83|\83X\83g\83L\81[\8eæ\93¾\82É\8e¸\94s\82µ\82Ü\82µ\82½"));
+
+
+//NLIB_ERR_CODE_NOTSET
+DECLARE_NLIB_ERROR_MESSAGE(NLIB_ERR_CODE_NOTSET,TEXT("\83G\83\89\81[\83R\81[\83h\82ª\90Ý\92è\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B\83\89\83C\83u\83\89\83\8a\82Ì\8eÀ\91\95\82É\89½\82ç\82©\82Ì\96â\91è\82ª\82 \82é\82Ì\82Å\8aJ\94­\8eÒ\82É\95ñ\8d\90\82µ\82Ä\82­\82¾\82³\82¢"));
+
+#define NLIB_ERRMESSAGE_TABLE_START(c) switch(c){
+
+
+#define NLIB_ERRMESSAGE_CASE(m,c)\
+case c:{\
+       m = ERROR_##c##MESSAGE;\
+       break;\
+}
+
+#define NLIB_ERRMESSAGE_TABLE_END()            }
+
+LPCTSTR NLIB_GetErrorMessage(NLIB_RESULT rsltCode){
+
+       static LPCTSTR INI_ERRMES = TEXT("");
+       LPCTSTR errmes = INI_ERRMES;
+
+       //\83\81\83b\83Z\81[\83W\83e\81[\83u\83\8b
+       NLIB_ERRMESSAGE_TABLE_START(rsltCode)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_OK)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_COOKIE_FAILED)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_INITALIZE_FAILED_NETWORK)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_LIVENO_IS_NULL)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_LIVENO_FAILED_TOOBIG)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_LIVENO_FAILED_UNDEFEINE)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_USERSESSION_FAILED_TOOBIG)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_GETPLAYERSTATUS_FAILED_CONNECT)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_INVALID_LV)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_INVALID_THREAD)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_CLOSED)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_UNKNOWN_ERROR)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_SERVER_ERROR)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_DELETED)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_FULL)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_PERMISSION_DENIED)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_ACCESS_LOCKED)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_REQUIRE_COMMUNITY_MEMBER)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_COMINGSOON)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_NOTFOUND)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_NOTLOGIN)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_UNKNOWN)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_MAINTENANCE)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_NOT_PERMITTED)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_REQUIRE_ACCEPT_PRINT_TIMESHIFT_TICKET)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_TSARCHIVE)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_USERTIMESHIFT)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_GETPLAYERSTATUS_UNDEFINED)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_WATCHLIVENICOVIDEO_FAILED_CONNECT)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_BUFFER_TOOLITTLE)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_FAILED_NETWORK)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_PLAYERSTATUS_ERROR)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_HEARTBEAT_ERROR)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_JSON_PARSE)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_SHELL_FAILED)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_NOT_LIVECONNECT)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_LIVE_GETPOSTKEY_FAILED)
+               NLIB_ERRMESSAGE_CASE(errmes,NLIB_ERR_CODE_NOTSET)
+       NLIB_ERRMESSAGE_TABLE_END()
+       
+
+
+       return errmes;
+}
\ No newline at end of file
diff --git a/nlib/nlib_myList.cpp b/nlib/nlib_myList.cpp
new file mode 100644 (file)
index 0000000..7e4ebea
--- /dev/null
@@ -0,0 +1,596 @@
+#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;
+}
+
+
+
+
+
diff --git a/nlib/nlib_nicoLive.cpp b/nlib/nlib_nicoLive.cpp
new file mode 100644 (file)
index 0000000..1ab7fd0
--- /dev/null
@@ -0,0 +1,2110 @@
+#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"&amp;",wcslen(L"&amp;")) == 0){\
+                       (convPtr)[0] = L'&';\
+                       (basePtr) += wcslen(L"&amp;") - 1;\
+               } else if(wcsncmp((basePtr),L"&lt;",wcslen(L"&lt;")) == 0){\
+                       (convPtr)[0] = L'<';\
+                       (basePtr) += wcslen(L"&lt;") - 1;\
+               } else if(wcsncmp((basePtr),L"&gt;",wcslen(L"&gt;")) == 0){\
+                       (convPtr)[0] = L'>';\
+                       (basePtr) += wcslen(L"&gt;") - 1;\
+               } else if(wcsncmp((basePtr),L"&quot;",wcslen(L"&quot;")) == 0){\
+                       (convPtr)[0] = L'\"';\
+                       (basePtr) += wcslen(L"&quot;") - 1;\
+               } else if(wcsncmp((basePtr),L"&apos;",wcslen(L"&apos;")) == 0){\
+                       (convPtr)[0] = L'\'';\
+                       (basePtr) += wcslen(L"&apos;") - 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"&amp;");
+                                                       (sendBuf) += wcslen(sendBuf);
+                                                       break;
+                                               case L'<':
+                                                       wcscpy((sendBuf),L"&lt;");
+                                                       (sendBuf) += wcslen(sendBuf);
+                                                       break;
+                                               case L'>':
+                                                       wcscpy((sendBuf),L"&gt;");
+                                                       (sendBuf) += wcslen(sendBuf);
+                                                       break;
+                                               case L'\"':
+                                                       wcscpy((sendBuf),L"&quot;");
+                                                       (sendBuf) += wcslen(sendBuf);
+                                                       break;
+                                               case L'\'':
+                                                       wcscpy((sendBuf),L"&apos;");
+                                                       (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;
+}
+
+
diff --git a/nlib/nlib_nicoVideoAuth.cpp b/nlib/nlib_nicoVideoAuth.cpp
new file mode 100644 (file)
index 0000000..8dd4ba2
--- /dev/null
@@ -0,0 +1,36 @@
+#include "StdAfx.h"
+#include "nlib_include.h"
+
+
+
+
+
+NicoVideoAuth_P NicoVideoAuth_new(){
+
+
+       return (NicoVideoAuth_P)calloc(1,sizeof(NicoVideoAuth));
+
+}
+
+VOID NicoVideoAuth_delete(NicoVideoAuth_P* self){
+
+
+       free(*self);
+       *self = NULL;
+
+}
+
+NLIB_RESULT NicoVideoAuth_getNicoVideoAuth(NicoVideoAuth_P self,BROWSERTYPE browserType){
+
+       NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
+       //\83N\83b\83L\81[\82Ì\8eæ\93¾
+       if( GetCookie(browserType,self->userSession,sizeof(self->userSession),L"user_session",WTEXT(NICO_VIDEO_DOMEINNAME)) != COOKIE_ERR_OK){
+               rslt = NLIB_ERR_COOKIE_FAILED;
+               goto end;
+       }
+
+       rslt = NLIB_ERR_OK;
+end:
+
+       return rslt;
+}
\ No newline at end of file
diff --git a/nlib/nlib_xmlHandler.cpp b/nlib/nlib_xmlHandler.cpp
new file mode 100644 (file)
index 0000000..940686a
--- /dev/null
@@ -0,0 +1,696 @@
+#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;
+
+
+       
+       
+
+
+}
+
diff --git a/nlib/stdAfx.cpp b/nlib/stdAfx.cpp
new file mode 100644 (file)
index 0000000..09f15b6
--- /dev/null
@@ -0,0 +1 @@
+#include "StdAfx.h"
\ No newline at end of file
index 399a051..d4f8af5 100644 (file)
Binary files a/nlite.suo and b/nlite.suo differ