4 #include <libxml/xmlreader.h>
6 #include "playerstatus.h"
9 static int readfile(char *contents)
12 char *fname = "/Users/yoshi/Downloads/getplayerstatus.xml";
15 fp = fopen( fname, "r" );
17 printf( "%sファイルが開けません\n", fname );
21 printf( "\n-- fgets() --\n" );
22 while( fgets( s, 100, fp ) != NULL ){
25 printf( "\n-- fgets() done --\n" );
37 STATE_GETPLAYERSTATUS,//getplayerstatus
40 STATE_DESCRIPTION,//description
41 STATE_PROVIDER_TYPE,//provider_type
42 STATE_COMMUNITY,//default_community
43 STATE_IS_OWNER,//is_owner
44 STATE_OWNER,//owner_id
45 STATE_OWNER_NAME,//owner_name
46 STATE_IS_RESERVED,//is_reserved 予約枠
47 STATE_START_TIME,//start_time
48 STATE_END_TIME,//end_time
49 STATE_CONTENTS,//contents
63 void processNode(xmlTextReaderPtr reader, NICO_LIVE* session)
65 static parsingStatus state = STATE_NONE;
66 xmlElementType nodeType;
67 xmlChar *name, *value;
70 nodeType = xmlTextReaderNodeType(reader); // ノードタイプ
71 name = xmlTextReaderName(reader); // ノード名
73 name = xmlStrdup(BAD_CAST "---");
74 //printf("Node name:%s\n", name);
75 if (nodeType == XML_READER_TYPE_ELEMENT) { // 開始
76 if ( xmlStrcmp(name, BAD_CAST "getplayerstatus") == 0 ) {
77 state = STATE_GETPLAYERSTATUS;
78 } else if ( xmlStrcmp(name, BAD_CAST "title") == 0 ) {
80 } else if ( xmlStrcmp(name, BAD_CAST "description") == 0 ) {
81 state = STATE_DESCRIPTION;
82 } else if ( xmlStrcmp(name, BAD_CAST "provider_type") == 0 ) {
83 state = STATE_PROVIDER_TYPE;
84 } else if ( xmlStrcmp(name, BAD_CAST "default_community") == 0 ) {
85 state = STATE_COMMUNITY;
86 } else if ( xmlStrcmp(name, BAD_CAST "is_owner") == 0 ) {
87 state = STATE_IS_OWNER;
88 } else if ( xmlStrcmp(name, BAD_CAST "owner_id") == 0 ) {
90 } else if ( xmlStrcmp(name, BAD_CAST "owner_name") == 0 ) {
91 state = STATE_OWNER_NAME;
92 } else if ( xmlStrcmp(name, BAD_CAST "is_reserved") == 0 ) {
93 state = STATE_IS_RESERVED;
94 } else if ( xmlStrcmp(name, BAD_CAST "start_time") == 0 ) {
95 state = STATE_START_TIME;
96 } else if ( xmlStrcmp(name, BAD_CAST "end_time") == 0 ) {
97 state = STATE_END_TIME;
98 } else if ( xmlStrcmp(name, BAD_CAST "contents") == 0 ) {
99 state = STATE_CONTENTS;
100 } else if ( xmlStrcmp(name, BAD_CAST "rtmp") == 0 ) {
102 } else if ( xmlStrcmp(name, BAD_CAST "url") == 0 ) {
104 } else if ( xmlStrcmp(name, BAD_CAST "ticket") == 0 ) {
105 state = STATE_TICKET;
106 } else if ( xmlStrcmp(name, BAD_CAST "ms") == 0 ) {
108 } else if ( xmlStrcmp(name, BAD_CAST "addr") == 0 ) {
110 } else if ( xmlStrcmp(name, BAD_CAST "port") == 0 ) {
112 } else if ( xmlStrcmp(name, BAD_CAST "thread") == 0 ) {
113 state = STATE_THREAD;
114 } else if ( xmlStrcmp(name, BAD_CAST "user_id") == 0 ) {
115 state = STATE_USER_ID;
116 } else if ( xmlStrcmp(name, BAD_CAST "is_premium") == 0 ) {
117 state = STATE_IS_PREMIUM;
120 } else if (nodeType == XML_READER_TYPE_END_ELEMENT) { // 終了
121 if ( xmlStrcmp(name, BAD_CAST "getplayerstatus") == 0 ) {
122 printf("-----------------------\n");
127 } else if (nodeType == XML_READER_TYPE_TEXT) { // テキスト
129 value = xmlTextReaderValue(reader);
132 value = xmlStrdup(BAD_CAST "---");
134 if ( state == STATE_ERROR ) {/////////// ToDo: switch-caseに書き換え
135 printf("[ERROR] Reason: %s\n", value);
137 } else if ( state == STATE_TITLE ) {
138 //printf("STATE_TITLE: %s\n", value);
139 (*session).title = (char*)malloc( strlen(value) + 1 );
140 strcpy((*session).title, (const char *)value);
141 } else if ( state == STATE_DESCRIPTION ) {
142 //printf("STATE_DESCRIPTION: %s\n", value);
143 (*session).description = (char*)malloc( strlen(value) + 1 );
144 strcpy((*session).description, (const char *)value);
145 } else if ( state == STATE_PROVIDER_TYPE ) {
146 // "official" "community"
147 //printf("STATE_PROVIDER_TYPE: %s\n", value);
148 (*session).provider_type = (char*)malloc( strlen(value) + 1 );
149 strcpy((*session).provider_type, (const char *)value);
150 } else if ( state == STATE_COMMUNITY ) {
152 //(*session).owner_id = (char*)malloc( strlen(value) + 1 );
153 //strcpy((*session).owner_id, (const char *)value);
154 } else if ( state == STATE_IS_OWNER ) {
155 //printf("STATE_IS_OWNER: %s\n", value);
156 (*session).is_owner = value[0] - '0';
157 } else if ( state == STATE_OWNER ) {
159 } else if ( state == STATE_OWNER_NAME ) {
160 //printf("STATE_OWNER_NAME: %s\n", value);
161 (*session).owner_name = (char*)malloc( strlen(value) + 1 );
162 strcpy((*session).owner_name, (const char *)value);
163 } else if ( state == STATE_IS_RESERVED ) {
165 } else if ( state == STATE_START_TIME ) {
167 } else if ( state == STATE_END_TIME ) {
169 } else if ( state == STATE_CONTENTS ) {
170 //printf("N: %s\n", value);
171 (*session).contents = (char*)malloc( strlen(value) + 1 - 5);
172 strcpy((*session).contents, (const char *)value + 5);
173 } else if ( state == STATE_RTMP ) {
175 } else if ( state == STATE_URL ) {
176 //printf("STATE_URL: %s\n", value);
177 (*session).url = (char*)malloc( strlen(value) + 1 );
178 strcpy((*session).url, (const char *)value);
179 } else if ( state == STATE_TICKET ) {
180 //printf("STATE_TICKET: %s\n", value);
181 (*session).ticket = (char*)malloc( strlen(value) + 1 );
182 strcpy((*session).ticket, (const char *)value);
183 } else if ( state == STATE_MS ) {
185 } else if ( state == STATE_ADDR ) {
186 //printf("STATE_ADDR: %s\n", value);
187 (*session).msg_addr = (char*)malloc( strlen(value) + 1 );
188 strcpy((*session).msg_addr, (const char *)value);
189 } else if ( state == STATE_PORT ) {
190 //printf("STATE_PORT: %s\n", value);
191 sscanf((const char *)value,"%d",&((*session).msg_port));
192 } else if ( state == STATE_THREAD ) {
193 //printf("STATE_THREAD: %s\n", value);
194 //(*session).thread = (char*)malloc( strlen(value) + 1 );
195 sscanf((const char *)value,"%d",&((*session).thread));
196 } else if ( state == STATE_USER_ID ) {
197 printf("USER ID = %s\n",value);
198 (*session).user_id = (char*)malloc( strlen(value) + 1 );
199 strcpy((*session).user_id, (const char *)value);
200 } else if ( state == STATE_IS_PREMIUM ) {
201 //printf("Premium = %s\n",(value[0]=='1')?"yes":"no");
202 (*session).is_premium = (value[0]=='1');
211 NICO_LIVE *new_nico_live(char* playerstatus)
214 xmlTextReaderPtr reader;
216 NICO_LIVE *session = (NICO_LIVE*)malloc( sizeof(NICO_LIVE) );
219 reader = xmlReaderForDoc((xmlChar*)playerstatus, NULL, NULL, 1);
221 printf("Failed to open XML\n");
222 return (NICO_LIVE*)-1;
227 ret = xmlTextReaderRead(reader);
230 processNode(reader, session);
233 ret = xmlTextReaderRead(reader);
236 // Reader のすべてのリソースを開放
237 xmlFreeTextReader(reader);
239 // xmlTextReaderRead の戻り値が -1 だった場合はパースエラー
241 printf("Parse error.\n");
242 return (NICO_LIVE*)-1;
249 int nico_live_close(NICO_LIVE* broadcast)
256 int main (int argc, char *argv[])
258 char* contents = (char *)malloc(sizeof(char) * 8192);
264 NICO_LIVE *broadcast = new_nico_live(contents);
267 printf("放送タイトル:%s\n説明:%s\n放送主:%s\n",(*broadcast).title,(*broadcast).description,(*broadcast).owner_name);
268 printf("コメ鯖:%s\nポート:%d\nスレッド:%d\n",(*broadcast).msg_addr,(*broadcast).msg_port,(*broadcast).thread);
270 nico_live_close(broadcast);