OSDN Git Service

生主トークン取得処理実装
[nlite/nlite.git] / nlib / nlib_xmlHandler.cpp
1 #include "StdAfx.h"
2 #include "nlib_include.h"
3
4
5
6 enum NPlayerStatus_NORD{
7         NPlayerStatus_ROOT,
8         NPlayerStatus_GETPLAYERSTATUS,
9         NPlayerStatus_MS,
10         NPlayerStatus_STREAM,
11         NPlayerStatus_ERROR,
12         NPlayerStatus_ADDR,
13         NPlayerStatus_THREAD,
14         NPlayerStatus_OPEN_TIME,
15         NPlayerStatus_START_TIME,
16         NPlayerStatus_ID,
17         NPlayerStatus_CODE,
18         NPlayerStatus_TITLE,
19         NPlayerStatus_PORT,
20         NPlayerStatus_PROVIDER,
21         NPlayerStatus_DEFAULT_COMMUNITY,
22         NPlayerStatus_IS_OWNER,
23         NPlayerStatus_END_TIME,
24         NPlayerStatus_NICOLIVE_API,
25         NPlayerStatus_USER,
26         NPlayerStatus_IS_PREMIUM,
27         NPlayerStatus_USER_ID,
28         NPlayerStatus_USER_DOMEIN,
29         NPlayerStatus_BASE_TIME
30 };
31
32 enum NicoLiveHeartBeat_NORD{
33         NicoLiveHeartBeat_ROOT,
34         NicoLiveHeartBeat_HEARTBEAT,
35         NicoLiveHeartBeat_WATCHCOUNT,
36         NicoLiveHeartBeat_COMMENTCOUNT,
37         NicoLiveHeartBeat_IS_RESTRICT,
38         NicoLiveHeartBeat_TICKET
39 };
40
41 enum StreamInfo_NORD{
42         StreamInfo_ROOT,
43         StreamInfo_GETPLAYERSTATUS,
44         StreamInfo_REQUEST_ID,
45         StreamInfo_STREAMINFO,
46         StreamInfo_TITLE,
47         StreamInfo_DESCRIPTION,
48         StreamInfo_PROVIDER_TYPE,
49         StreamInfo_DEFAULT_COMMUNITY,
50         StreamInfo_COMMUNITYINFO,
51         StreamInfo_NAME,
52         StreamInfo_THUMBNAIL,
53 };
54
55
56 enum NicoLivePublishStatus_NORD{
57         NicoLivePublish_ROOT,
58         NicoLivePublish_PUBLISHSTATUS,
59         NicoLivePublish_NICOLIVE_API,
60         NicoLivePublish_STREAM,
61         NicoLivePublish_ERROR,
62         NicoLivePublish_TOKEN,
63         NicoLivePublish_CODE
64
65 };
66
67
68
69 #define StrCpyArray(buf,pszData,nLength) StrCpy(buf,sizeof(buf) / sizeof(buf[0]),pszData,nLength)
70
71 static INLINE NLIB_RESULT StrCpy(LPTSTR buf,UINT_PTR buflen,LPCTSTR pszData,UINT_PTR nLength);
72
73 ///
74 ///UTF8\95Ï\8a·\93à\95\94\8aÖ\90\94
75 ///
76 static INLINE VOID ToUTF8(LPSTR buf,LPCTSTR input,INT_PTR nLength,INT_PTR maxLength);
77
78
79 static INLINE NLIB_RESULT convToResultCode(LPCTSTR pszData,UINT nLength){
80
81         NLIB_RESULT rslt = NLIB_ERR_CODE_NOTSET;
82
83         if(_tcsncmp(pszData,TEXT("invalid_lv"),nLength) == 0){
84
85                 rslt = NLIB_ERR_GETPLAYERSTATUS_INVALID_LV;
86                         
87         }else if(_tcsncmp(pszData,TEXT("invalid_thread"),nLength) == 0){
88
89                 rslt = NLIB_ERR_GETPLAYERSTATUS_INVALID_THREAD;
90
91         }else if( _tcsncmp(pszData,TEXT("notfound"),nLength) == 0){
92
93                 rslt = NLIB_ERR_GETPLAYERSTATUS_NOTFOUND;
94
95         }else if(_tcsncmp(pszData,TEXT("notlogin"),nLength) == 0){
96
97                 rslt = NLIB_ERR_GETPLAYERSTATUS_NOTLOGIN;
98
99         }else if(_tcsncmp(pszData,TEXT("not_permitted"),nLength) == 0){
100
101                 rslt = NLIB_ERR_GETPLAYERSTATUS_NOT_PERMITTED;
102
103         }else if(_tcsncmp(pszData,TEXT("maintenance"),nLength) == 0){
104
105                 rslt = NLIB_ERR_GETPLAYERSTATUS_MAINTENANCE;
106
107         }else if(_tcsncmp(pszData,TEXT("closed"),nLength) == 0){
108
109                 rslt = NLIB_ERR_GETPLAYERSTATUS_CLOSED;
110
111         } else if(_tcsncmp(pszData,TEXT("unknown"),nLength) == 0){
112
113                 rslt = NLIB_ERR_GETPLAYERSTATUS_UNKNOWN;
114
115         }else if(_tcsncmp(pszData,TEXT("unknown_error"),nLength) == 0){
116
117                 rslt = NLIB_ERR_GETPLAYERSTATUS_UNKNOWN_ERROR;
118
119         } else if(_tcsncmp(pszData,TEXT("server_error"),nLength) == 0){
120
121                 rslt = NLIB_ERR_GETPLAYERSTATUS_SERVER_ERROR;
122                         
123
124         } else if(_tcsncmp(pszData,TEXT("DELETED"),nLength) == 0){
125
126                 rslt = NLIB_ERR_GETPLAYERSTATUS_DELETED;
127
128         } else if(_tcsncmp(pszData,TEXT("full"),nLength) == 0){
129
130                 rslt = NLIB_ERR_GETPLAYERSTATUS_FULL;
131
132         } else if(_tcsncmp(pszData,TEXT("permission_denied"),nLength) == 0){
133                         
134                 rslt = NLIB_ERR_GETPLAYERSTATUS_PERMISSION_DENIED;
135                         
136         }else if(_tcsncmp(pszData,TEXT("require_accept_print_timeshift_ticket"),nLength) == 0) {
137
138                 rslt = NLIB_ERR_GETPLAYERSTATUS_REQUIRE_ACCEPT_PRINT_TIMESHIFT_TICKET;
139
140
141         }else if(_tcsncmp(pszData,TEXT("access_locked"),nLength) == 0) {
142
143                 rslt = NLIB_ERR_GETPLAYERSTATUS_ACCESS_LOCKED;
144
145
146         }else if(_tcsncmp(pszData,TEXT("tsarchive"),nLength) == 0){
147
148                 rslt = NLIB_ERR_GETPLAYERSTATUS_TSARCHIVE;
149
150         } else if(_tcsncmp(pszData,TEXT("usertimeshift"),nLength) == 0){
151
152                 rslt = NLIB_ERR_GETPLAYERSTATUS_USERTIMESHIFT;
153
154         } else if(_tcsncmp(pszData,TEXT("require_community_member"),nLength) == 0){
155
156                 rslt = NLIB_ERR_GETPLAYERSTATUS_REQUIRE_COMMUNITY_MEMBER;
157
158         } else if(_tcsncmp(pszData,TEXT("comingsoon"),nLength) == 0){
159
160                 rslt = NLIB_ERR_GETPLAYERSTATUS_COMINGSOON;
161
162         }else if(_tcsncmp(pszData,TEXT("noauth"),nLength) == 0){
163
164                 rslt = NLIB_ERR_GETPLAYERSTATUS_NOAUTH;
165
166         } else if(_tcsncmp(pszData,TEXT("block_now_count_overflow"),nLength) == 0){
167
168                 rslt = NLIB_ERR_GETPLAYERSTATUS_BLOCK_NOW_COUNT_OVERFLOW;
169
170         }else {
171                 std::wstring errmessage(TEXT("\8c©\8am\94F\82Ì\83v\83\8c\83C\83\84\81[\83X\83e\81[\83^\83X\83G\83\89\81[:"));
172                 errmessage.append(pszData,nLength);
173                 rslt = NLIB_ERR_GETPLAYERSTATUS_UNDEFINED;
174                 throw nlib::Exception(errmessage.c_str(),__LINE__,TEXT(__FILE__),TEXT(__FILE__));
175                         
176
177                         
178                         
179         }
180         return rslt;
181
182 }
183
184
185
186 extern void NPlayerStatus_ElementStartHandler(void *userData,const XML_Char *pszName,const XML_Char *atts[]){
187
188         UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
189         NicoLivePlayerStatus_P ps = (NicoLivePlayerStatus_P)userDataContainer->userData;
190
191         
192         
193         enum NPlayerStatus_NORD element  = NPlayerStatus_ROOT;
194
195         switch (userDataContainer->nord){
196
197                 //\90e\83m\81[\83h
198         case (MAKENORD(NPlayerStatus_ROOT)):
199         
200                 
201                 if(_tcscmp(pszName,TEXT("getplayerstatus")) == 0){
202
203                         
204
205                         UINT_PTR index;
206
207                         for(index = 0;atts[index] != NULL;index += 2){
208
209                                 if(_tcscmp(atts[index],TEXT("status")) == 0 && _tcscmp(atts[index + 1],TEXT("ok")) == 0){
210
211                                         
212                                                 userDataContainer->errcode = NLIB_ERR_OK;
213
214
215                                 }else if(_tcscmp(atts[index],TEXT("status")) == 0 && _tcscmp(atts[index + 1],TEXT("ok")) != 0){
216
217                                         userDataContainer->errcode = NLIB_ERR_PLAYERSTATUS_ERROR;
218                                 }
219
220
221                         }
222
223                         element = NPlayerStatus_GETPLAYERSTATUS;
224
225
226
227                         
228
229
230                 } else if(_tcscmp(pszName,TEXT("nicolive_api")) == 0){
231
232                         element = NPlayerStatus_NICOLIVE_API;
233
234                 }
235                 break;
236
237                 //getplayerstatus or // NPlayerStatus_NICOLIVE_API
238         case (MAKENORD(NPlayerStatus_GETPLAYERSTATUS)):
239         case (MAKENORD(NPlayerStatus_NICOLIVE_API)):
240
241                 
242                         
243
244         
245                 if(_tcscmp(pszName,TEXT("ms"))== 0){
246
247                         element = NPlayerStatus_MS;
248                         
249
250
251                 } else if(_tcscmp(pszName,TEXT("stream"))== 0){
252
253                         element = NPlayerStatus_STREAM;
254                         
255
256
257                 }else if(_tcscmp(pszName,TEXT("user"))== 0){
258
259                         element = NPlayerStatus_USER;
260
261                 } else if(_tcscmp(pszName,TEXT("error"))== 0){
262
263                         element = NPlayerStatus_ERROR;
264
265                 }
266                 
267                 break;
268                 //getplayerstatus/ms
269         case (MAKENORD1(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_MS)):
270
271         
272
273                 if(_tcscmp(pszName,TEXT("addr")) == 0){
274
275                         element = NPlayerStatus_ADDR;
276                         
277
278                 } else if(_tcscmp(pszName,TEXT("port")) == 0){
279
280                         element = NPlayerStatus_PORT;
281
282
283                 } else if(_tcscmp(pszName,TEXT("thread")) == 0){
284
285                         
286                         element = NPlayerStatus_THREAD;
287
288
289                 }
290                 break;
291
292                 //getplayerstatus/stream
293         case (MAKENORD1(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM)):
294                 if(_tcscmp(pszName,TEXT("open_time")) == 0){
295
296                         element = NPlayerStatus_OPEN_TIME;
297                         
298
299                 } else if(_tcscmp(pszName,TEXT("start_time")) == 0){
300
301                         element = NPlayerStatus_START_TIME;
302                         
303                 } else if(_tcscmp(pszName,TEXT("base_time")) == 0){
304                 
305                         element = NPlayerStatus_BASE_TIME;
306                 
307                 } else if(_tcscmp(pszName,TEXT("id")) == 0){
308
309                         element = NPlayerStatus_ID;
310
311                 } else if(_tcscmp(pszName,TEXT("title")) == 0){
312                 
313                         element = NPlayerStatus_TITLE;
314                 }else if(_tcscmp(pszName,TEXT("provider_type")) == 0){
315
316                         element = NPlayerStatus_PROVIDER;
317
318                 } else if(_tcscmp(pszName,TEXT("default_community")) == 0){
319
320                         element = NPlayerStatus_DEFAULT_COMMUNITY;
321
322                 } else if(_tcscmp(pszName,TEXT("is_owner")) == 0){
323
324                         element = NPlayerStatus_IS_OWNER;
325
326                 } else if(_tcscmp(pszName,TEXT("end_time")) == 0){
327
328                         element = NPlayerStatus_END_TIME;
329
330                 }
331
332
333                 break;
334
335         case (MAKENORD1(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_USER)):
336
337
338                 if(_tcscmp(pszName,TEXT("is_premium")) == 0){
339
340                         element = NPlayerStatus_IS_PREMIUM;
341                         
342                 }  else if(_tcscmp(pszName,TEXT("user_id")) == 0){
343
344                         element = NPlayerStatus_USER_ID;
345
346                 }  else if(_tcscmp(pszName,TEXT("userDomain")) == 0){
347
348                         element = NPlayerStatus_USER_DOMEIN;
349                 }
350
351                 break;
352
353         case (MAKENORD1(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_ERROR)):
354         case MAKENORD1(NPlayerStatus_NICOLIVE_API,NPlayerStatus_ERROR):
355
356                 if(_tcscmp(pszName,TEXT("code")) == 0){
357
358                         element = NPlayerStatus_CODE;
359
360                 }
361
362                 break;
363
364
365
366
367
368
369         }
370
371         userDataContainer->nord = MAKENORD1(userDataContainer->nord,element);
372
373         return;
374
375 }
376
377
378 void NPlayerStatus_CharacterDataHandler(void *userData,const XML_Char *pszData,int nLength){
379
380         UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
381         NicoLivePlayerStatus_P ps = (NicoLivePlayerStatus_P)userDataContainer->userData;
382         
383         
384         switch(userDataContainer->nord){
385
386         //getplayerstatus/ms/addr
387         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_MS,NPlayerStatus_ADDR):
388
389                 
390
391                 
392                 userDataContainer->errcode =  StrCpyArray(ps->ms.addr,pszData,nLength);
393
394
395                 break;
396
397                 //getplayerstatus/ms/port
398         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_MS,NPlayerStatus_PORT):
399
400                 
401                 
402
403                 userDataContainer->errcode =  StrCpyArray(ps->ms.port,pszData,nLength);
404                 
405                 
406
407
408                 break;
409
410                 //getplayerstatus/ms/thread
411         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_MS,NPlayerStatus_THREAD):
412
413                 //ps->ms.thread = wtoin(pszData,nLength);
414                 strToIntN(ps->ms.thread,pszData,nLength);
415
416
417                 break;
418
419                 //getplayerstatus/stream/open_time
420         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_OPEN_TIME):
421
422                 //ps->stream.open_time = wtoin(pszData,nLength);
423                 strToIntN(ps->stream.open_time,pszData,nLength);
424
425
426                 break;
427
428                 //getplayerstatus/stream/start_time
429         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_START_TIME):
430
431                 //ps->stream.start_time = wtoin(pszData,nLength);
432                 strToIntN(ps->stream.start_time,pszData,nLength);
433                 //_tcscpy(start_time,elementValue);
434
435                 break;
436
437                 //getplayerstatus/stream/base_time
438         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_BASE_TIME):
439
440                 strToIntN(ps->stream.base_time,pszData,nLength);
441
442                 break;
443 #ifdef PLAYERSTATUS_GET_TITLE
444                 //getplayerstatus/stream/title
445         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_TITLE):
446
447                 StrCpy(ps->stream.title,ARRAY_LENGTH(ps->stream.title),pszData,nLength);
448
449                 break;
450 #endif
451                         
452
453                 //getplayerstatus/stream/id
454         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_ID):
455
456                 
457                 userDataContainer->errcode =  StrCpyArray(ps->stream.id,pszData,nLength);
458
459                 break;
460                 
461
462
463                 //getplayerstatus/user/is_premium
464         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_USER,NPlayerStatus_IS_PREMIUM):
465
466                 
467                 strToIntN(ps->user.is_premium,pszData,nLength);
468
469                 break;
470
471                 //getplayerstatus/user/is_premium
472         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_USER,NPlayerStatus_USER_ID):
473
474                 
475                 userDataContainer->errcode = StrCpyArray(ps->user.user_id,pszData,nLength);
476
477                 break;
478                 
479                 //getplayerstatus/user/userDomein
480         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_USER,NPlayerStatus_USER_DOMEIN):
481
482                 userDataContainer->errcode = StrCpyArray(ps->user.userDomain,pszData,nLength);
483
484                 break;
485
486                 //getplayerstatus/stream/provider
487         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_PROVIDER):
488
489                 if(_tcsncmp(pszData,TEXT("community"),nLength) == 0){
490
491                         ps->stream.provider_type = COMMUNITY_PROVIDER_TYPE;
492
493                 } else if(_tcsncmp(pszData,TEXT("channel"),nLength) == 0){
494
495                         ps->stream.provider_type = CHANNEL_PROVIDER_TYPE;
496                 
497                 }else if(_tcsncmp(pszData,TEXT("official"),nLength) == 0){
498
499                         ps->stream.provider_type = OFFICIAL_PROVIDER_TYPE;
500
501                 }
502
503                 break;
504
505                 //getplayerstatus/stream/default_community
506         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_DEFAULT_COMMUNITY):
507
508                 
509                 userDataContainer->errcode =  StrCpyArray(ps->stream.default_community,pszData,nLength);
510
511                 break;
512
513                 //getplayerstatus/stream/is_owner
514         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_IS_OWNER):
515
516                 //ps->stream.is_owner = wtoin(pszData,nLength);
517                 strToIntN(ps->stream.is_owner,pszData,nLength);
518                 break;
519
520
521                 //getplayerstatus/stream/end_time
522         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_STREAM,NPlayerStatus_END_TIME):
523
524                 //ps->stream.end_time = wtoin(pszData,nLength);
525                 strToIntN(ps->stream.end_time,pszData,nLength);
526
527                 break;
528
529                 //getplayerstatus/error/code
530         case MAKENORD2(NPlayerStatus_GETPLAYERSTATUS,NPlayerStatus_ERROR,NPlayerStatus_CODE):
531         case MAKENORD2(NPlayerStatus_NICOLIVE_API,NPlayerStatus_ERROR,NPlayerStatus_CODE):
532
533                 
534                 
535                 userDataContainer->errcode = convToResultCode(pszData,nLength);
536
537                 
538
539
540                 break;
541
542         }
543
544
545 }
546
547
548
549 extern void NPlayerStatus_ElementEndHandler(void *userData,const XML_Char *pszName){
550
551
552         UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
553         userDataContainer->nord = UPNORD(userDataContainer->nord);
554
555
556 }
557
558
559
560
561 void NicoLiveHeartBeat_ElementStartHandler(void *userData,const XML_Char *pszName,const XML_Char *atts[]){
562
563         UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
564         NicoLiveHeartBeatContainer_P hbc = (NicoLiveHeartBeatContainer_P)userDataContainer->userData;
565
566
567         enum NicoLiveHeartBeat_NORD element  = NicoLiveHeartBeat_ROOT;
568
569         switch (userDataContainer->nord){
570
571                 //\90e\83m\81[\83h
572         case (MAKENORD(NicoLiveHeartBeat_ROOT)):
573         
574                 
575                 if(_tcscmp(pszName,TEXT("heartbeat")) == 0){
576
577
578                         UINT_PTR index;
579
580                         for(index = 0;atts[index] != NULL;index += 2){
581
582                                 if(_tcscmp(atts[index],TEXT("status")) == 0 && _tcscmp(atts[index + 1],TEXT("ok")) == 0){
583
584                                         
585                                                 userDataContainer->errcode = NLIB_ERR_OK;
586
587
588                                 }else if(_tcscmp(atts[index],TEXT("status")) == 0 && _tcscmp(atts[index + 1],TEXT("ok")) != 0){
589
590                                         userDataContainer->errcode = NLIB_ERR_HEARTBEAT_ERROR;
591                                 }else if(_tcscmp(atts[index],TEXT("time")) == 0){
592
593                                         hbc->heartBeat.time = wcstoul(atts[index + 1],NULL,0);
594
595                                 }
596
597
598                         }
599
600                         element = NicoLiveHeartBeat_HEARTBEAT;
601                 }
602                 
603
604
605                 break;
606                         
607
608         case MAKENORD(NicoLiveHeartBeat_HEARTBEAT):
609
610                 if(_tcscmp(pszName,TEXT("watchCount")) == 0){
611
612                         element = NicoLiveHeartBeat_WATCHCOUNT;
613
614                 } else if(_tcscmp(pszName,TEXT("commentCount")) == 0){
615
616                         element = NicoLiveHeartBeat_COMMENTCOUNT;
617
618                 } else if(_tcscmp(pszName,TEXT("is_restrict")) == 0){
619
620                         element = NicoLiveHeartBeat_IS_RESTRICT;
621
622                 } else if(_tcscmp(pszName,TEXT("ticket")) == 0){
623
624                         element = NicoLiveHeartBeat_TICKET;
625
626                 }
627
628
629                 break;
630         }
631
632                 
633
634                 
635
636         userDataContainer->nord = MAKENORD1(userDataContainer->nord,element);
637
638
639
640 }
641
642
643 void NicoLiveHeartBeat_CharacterDataHandler(void *userData,const XML_Char *pszData,int nLength){
644
645
646         UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
647         NicoLiveHeartBeatContainer_P hbc = (NicoLiveHeartBeatContainer_P)userDataContainer->userData;
648
649
650         switch(userDataContainer->nord){
651
652                 //heartbeat/watchCount
653         case MAKENORD1(NicoLiveHeartBeat_HEARTBEAT,NicoLiveHeartBeat_WATCHCOUNT):
654
655                  strToIntN(hbc->heartBeat.watchCount,pszData,nLength);
656
657                 break;
658
659                 //heartbeat/commentCount
660         case MAKENORD1(NicoLiveHeartBeat_HEARTBEAT,NicoLiveHeartBeat_COMMENTCOUNT):
661
662                 strToIntN(hbc->heartBeat.commentCount,pszData,nLength);
663
664                 break;
665
666                 //heartbeat/is_restrict
667         case MAKENORD1(NicoLiveHeartBeat_HEARTBEAT,NicoLiveHeartBeat_IS_RESTRICT):
668
669                 extendMalloc(hbc->is_restrictBuff,LPTSTR,hbc->is_restrictSize,(INT_PTR)sizeof(TCHAR) * nLength);
670
671                 wcsncpy(hbc->is_restrictBuff,pszData,nLength);
672
673                 hbc->is_restrictBuff[nLength] = L'\0';
674
675                 break;
676
677                 //heartbeat/ticket
678         case MAKENORD1(NicoLiveHeartBeat_HEARTBEAT,NicoLiveHeartBeat_TICKET):
679
680                 extendMalloc(hbc->ticketBuff,LPTSTR,hbc->ticketSize,(INT_PTR)sizeof(TCHAR) * nLength);
681
682                 wcsncpy(hbc->ticketBuff,pszData,nLength);
683
684                 hbc->ticketBuff[nLength] = L'\0';
685
686                 break;
687
688
689         }
690
691 }
692
693
694 void NicoLiveHeartBeat_ElementEndHandler(void *userData,const XML_Char *pszName){
695
696         UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
697         userDataContainer->nord = UPNORD(userDataContainer->nord);
698
699
700 }
701
702
703
704
705 static INLINE VOID ToUTF8(LPSTR buf,LPCTSTR input,INT_PTR nLength,INT_PTR maxLength){
706
707
708         if(WideCharToMultiByte(CP_UTF8,0,input,nLength,(LPSTR)NULL,0,(LPCSTR)NULL,(LPBOOL)NULL) > maxLength){
709
710                         return;
711
712         }
713
714         buf[WideCharToMultiByte(CP_UTF8,0,input,nLength,buf,maxLength,(LPCSTR)NULL,(LPBOOL)NULL)] = '\0';
715
716
717
718 }
719
720
721 static INLINE NLIB_RESULT StrCpy(LPTSTR buf,UINT_PTR buflen,LPCTSTR pszData,UINT_PTR nLength){
722
723         if(nLength >= buflen){
724                 return NLIB_ERR_BUFFER_TOOLITTLE;
725         }
726
727         wcsncpy(buf,pszData,nLength);
728         buf[nLength] = L'\0';
729
730
731         return NLIB_ERR_OK;
732
733
734         
735         
736
737
738 }
739
740
741 void NPublishStatus_ElementStartHandler(void *userData,const XML_Char *pszName,const XML_Char *atts[]){
742         UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
743         NicoLivePublishStatus_P ps = (NicoLivePublishStatus_P)userDataContainer->userData;
744
745         enum NicoLivePublishStatus_NORD element  = NicoLivePublish_ROOT;
746
747         switch (userDataContainer->nord){
748
749                 //\90e\83m\81[\83h
750         case (MAKENORD(NicoLivePublish_ROOT)):
751         
752                 
753                 if(_tcscmp(pszName,TEXT("getpublishstatus")) == 0){
754
755                         
756
757                         UINT_PTR index;
758
759                         for(index = 0;atts[index] != NULL;index += 2){
760
761                                 if(_tcscmp(atts[index],TEXT("status")) == 0 && _tcscmp(atts[index + 1],TEXT("ok")) == 0){
762
763                                         
764                                                 userDataContainer->errcode = NLIB_ERR_OK;
765
766
767                                 }else if(_tcscmp(atts[index],TEXT("status")) == 0 && _tcscmp(atts[index + 1],TEXT("ok")) != 0){
768
769                                         userDataContainer->errcode = NLIB_ERR_PUBLISHSTATUS_ERROR;
770                                 }
771
772
773                         }
774
775                         element = NicoLivePublish_PUBLISHSTATUS;
776
777
778
779                         
780
781
782                 } else if(_tcscmp(pszName,TEXT("nicolive_api")) == 0){
783
784                         element = NicoLivePublish_NICOLIVE_API;
785
786                 }
787                 break;
788
789
790         case (MAKENORD(NicoLivePublish_PUBLISHSTATUS)):
791         case (MAKENORD(NicoLivePublish_NICOLIVE_API)):
792
793                 if(_tcscmp(pszName,TEXT("stream"))== 0){
794
795                         element = NicoLivePublish_STREAM;
796                         
797
798
799                 }else if(_tcscmp(pszName,TEXT("error"))== 0){
800
801                         element = NicoLivePublish_ERROR;
802
803                 }
804                 break;
805         case (MAKENORD1(NicoLivePublish_PUBLISHSTATUS,NicoLivePublish_STREAM)):
806
807                 if(_tcscmp(pszName,TEXT("token")) == 0){
808
809                         element = NicoLivePublish_TOKEN;
810
811                 }
812
813                 break;
814
815         case (MAKENORD1(NicoLivePublish_PUBLISHSTATUS,NicoLivePublish_ERROR)):
816         case (MAKENORD1(NicoLivePublish_NICOLIVE_API,NicoLivePublish_ERROR)):
817
818                 if(_tcscmp(pszName,TEXT("code"))==0){
819
820                         element = NicoLivePublish_CODE;
821
822                 }
823
824                 break;
825
826
827         default:
828
829
830                 break;
831
832         }
833
834         userDataContainer->nord = MAKENORD1(userDataContainer->nord,element);
835
836         return;
837 }
838
839 void NPublishStatus_CharacterDataHandler(void *userData,const XML_Char *pszData,int nLength){
840         UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
841         NicoLivePublishStatus_P ps = (NicoLivePublishStatus_P)userDataContainer->userData;
842
843
844         switch(userDataContainer->nord){
845
846         case (MAKENORD2(NicoLivePublish_PUBLISHSTATUS,NicoLivePublish_STREAM,NicoLivePublish_TOKEN)):
847
848                 if(nLength < ARRAY_LENGTH(ps->token)){
849                         _tcsncpy(ps->token,pszData,nLength);
850                 } else {
851
852                         userDataContainer->errcode = NLIB_ERR_BUFFER_TOOLITTLE;
853
854                 }
855
856                 break;
857
858         case MAKENORD2(NicoLivePublish_PUBLISHSTATUS,NicoLivePublish_ERROR,NicoLivePublish_CODE):
859         case MAKENORD2(NicoLivePublish_NICOLIVE_API,NicoLivePublish_ERROR,NicoLivePublish_CODE):
860
861                 userDataContainer->errcode = convToResultCode(pszData,nLength);
862
863                 break;
864
865         default:
866
867                 break;
868         }
869
870         return;
871 }
872
873 void NPublishStatus_ElementEndHandler(void *userData,const XML_Char *pszName){
874         UserDataContainer_P userDataContainer = (UserDataContainer_P)userData;
875         NicoLivePublishStatus_P ps = (NicoLivePublishStatus_P)userDataContainer->userData;
876
877
878         userDataContainer->nord = UPNORD(userDataContainer->nord);
879
880         return;
881
882 }