Mercurial > pt1.oyama
comparison src/http.c @ 146:066f33b2213a
EXPERIMENTAL: Select a particular program from multi-channel.
| author | Naoya OYAMA <naoya.oyama@gmail.com> |
|---|---|
| date | Tue, 21 Aug 2012 04:21:11 +0900 |
| parents | 2a9ac5ce2c7e |
| children | a9f60d56d673 |
comparison
equal
deleted
inserted
replaced
| 145:4e39ce051c57 | 146:066f33b2213a |
|---|---|
| 95 static int | 95 static int |
| 96 http_get_info (const char *filename, struct File_Info *info) | 96 http_get_info (const char *filename, struct File_Info *info) |
| 97 { | 97 { |
| 98 extern struct ushare_t *ut; | 98 extern struct ushare_t *ut; |
| 99 struct upnp_entry_t *entry = NULL; | 99 struct upnp_entry_t *entry = NULL; |
| 100 int upnp_id = 0; | 100 int i, upnp_id = 0; |
| 101 char *content_type = NULL; | 101 char *content_type = NULL; |
| 102 char *protocol = NULL; | 102 char *protocol = NULL; |
| 103 | 103 |
| 104 if (!filename || !info) | 104 if (!filename || !info) |
| 105 return -1; | 105 return -1; |
| 107 log_verbose ("http_get_info, filename : %s\n", filename); | 107 log_verbose ("http_get_info, filename : %s\n", filename); |
| 108 | 108 |
| 109 upnp_id = atoi (strrchr (filename, '/') + 1); | 109 upnp_id = atoi (strrchr (filename, '/') + 1); |
| 110 entry = upnp_get_entry (ut, upnp_id); | 110 entry = upnp_get_entry (ut, upnp_id); |
| 111 | 111 |
| 112 #if 0 | 112 if (ut->nr_channel == 0) { |
| 113 if ( (!strcmp (filename, STREAM_LOCATION)) || | 113 if (!strcmp (filename, STREAM_LOCATION)) { |
| 114 ( (entry->fullpath != NULL) && | 114 log_verbose ("http_get_info, stream location found.\n"); |
| 115 ( !strcmp(entry->fullpath, STREAM_LOCATION))) ) { | 115 info->is_readable = 1; |
| 116 #endif | 116 info->file_length = get_streaming_length(); |
| 117 if (!strcmp (filename, STREAM_LOCATION)) { | 117 info->last_modified = time(NULL); |
| 118 log_verbose ("http_get_info, stream location found.\n"); | 118 info->is_directory = 0; |
| 119 info->is_readable = 1; | 119 info->content_type = ixmlCloneDOMString ("video/mpeg"); |
| 120 info->file_length = get_streaming_length(); | 120 return 0; |
| 121 info->last_modified = time(NULL); | 121 } |
| 122 info->is_directory = 0; | 122 } else { |
| 123 info->content_type = ixmlCloneDOMString ("video/mpeg"); | 123 for (i=0; i < ut->nr_channel; i++) { |
| 124 return 0; | 124 if (!strcmp(filename, ut->location_name[i])) { |
| 125 log_verbose ("http_get_info, stream location found [%s].\n", filename); | |
| 126 info->is_readable = 1; | |
| 127 info->file_length = get_streaming_length(); | |
| 128 info->last_modified = time(NULL); | |
| 129 info->is_directory = 0; | |
| 130 info->content_type = ixmlCloneDOMString ("video/mpeg"); | |
| 131 return 0; | |
| 132 } | |
| 133 } | |
| 125 } | 134 } |
| 126 if (!strcmp (filename, CDS_LOCATION)) | 135 if (!strcmp (filename, CDS_LOCATION)) |
| 127 { | 136 { |
| 128 set_info_file (info, CDS_DESCRIPTION_LEN, SERVICE_CONTENT_TYPE); | 137 set_info_file (info, CDS_DESCRIPTION_LEN, SERVICE_CONTENT_TYPE); |
| 129 return 0; | 138 return 0; |
| 328 http_open (const char *filename, enum UpnpOpenFileMode mode) | 337 http_open (const char *filename, enum UpnpOpenFileMode mode) |
| 329 { | 338 { |
| 330 extern struct ushare_t *ut; | 339 extern struct ushare_t *ut; |
| 331 struct upnp_entry_t *entry = NULL; | 340 struct upnp_entry_t *entry = NULL; |
| 332 struct web_file_t *file; | 341 struct web_file_t *file; |
| 333 int fd, upnp_id = 0; | 342 int i, fd, upnp_id = 0; |
| 334 extern thread_data *gp_tdata; | 343 extern thread_data *gp_tdata; |
| 335 thread_data *tdata = gp_tdata; | 344 thread_data *tdata = gp_tdata; |
| 345 int channel_length = 0; | |
| 336 | 346 |
| 337 if (!filename) | 347 if (!filename) |
| 338 return NULL; | 348 return NULL; |
| 339 | 349 |
| 340 if (mode != UPNP_READ) | 350 if (mode != UPNP_READ) |
| 365 /* | 375 /* |
| 366 * 1. http_open() $B$G$O(B entry $B$,%9%H%j!<%`:F@8MQ$N$b$N$G$"$k>l9g$K!"(B | 376 * 1. http_open() $B$G$O(B entry $B$,%9%H%j!<%`:F@8MQ$N$b$N$G$"$k>l9g$K!"(B |
| 367 * get_file_stream()$B$r8F$S=P$7%O%s%I%i$rJV5Q$9$k(B | 377 * get_file_stream()$B$r8F$S=P$7%O%s%I%i$rJV5Q$9$k(B |
| 368 */ | 378 */ |
| 369 log_verbose ("Fullpath : %s\n", entry->fullpath); | 379 log_verbose ("Fullpath : %s\n", entry->fullpath); |
| 370 if (!strcmp (entry->fullpath, STREAM_LOCATION)) | 380 if (ut->nr_channel == 0) { |
| 371 return get_file_stream (STREAM_LOCATION, tdata); | 381 if (!strcmp (entry->fullpath, STREAM_LOCATION)) |
| 382 return get_file_stream (STREAM_LOCATION, tdata); | |
| 383 } else { | |
| 384 for (i=0; i < ut->nr_channel; i++) | |
| 385 if (!strcmp(entry->fullpath, ut->location_name[i])) { | |
| 386 channel_length = strspn(ut->channel_name[i], "0123456789"); | |
| 387 strncpy(ut->request_channel, ut->channel_name[i], channel_length); | |
| 388 log_verbose ("http_open: request_channel[%s].\n", ut->request_channel); | |
| 389 return get_file_stream (ut->location_name[i], tdata); | |
| 390 } | |
| 391 } | |
| 372 | 392 |
| 373 fd = open (entry->fullpath, O_RDONLY | O_NONBLOCK | O_SYNC | O_NDELAY); | 393 fd = open (entry->fullpath, O_RDONLY | O_NONBLOCK | O_SYNC | O_NDELAY); |
| 374 if (fd < 0) | 394 if (fd < 0) |
| 375 return NULL; | 395 return NULL; |
| 376 | 396 |
| 526 } | 546 } |
| 527 | 547 |
| 528 static int | 548 static int |
| 529 http_close (UpnpWebFileHandle fh) | 549 http_close (UpnpWebFileHandle fh) |
| 530 { | 550 { |
| 551 extern struct ushare_t *ut; | |
| 531 struct web_file_t *file = (struct web_file_t *) fh; | 552 struct web_file_t *file = (struct web_file_t *) fh; |
| 532 extern thread_data *gp_tdata; | 553 extern thread_data *gp_tdata; |
| 533 thread_data *tdata = gp_tdata; | 554 thread_data *tdata = gp_tdata; |
| 534 STREAM_QUEUE_T *p_queue; | 555 STREAM_QUEUE_T *p_queue; |
| 535 int id = 0; | 556 int id = 0; |
| 567 p_queue->num_used--; | 588 p_queue->num_used--; |
| 568 } | 589 } |
| 569 pthread_mutex_unlock(&p_queue->mutex); | 590 pthread_mutex_unlock(&p_queue->mutex); |
| 570 destroy_stream_queue(p_queue); | 591 destroy_stream_queue(p_queue); |
| 571 tdata->streamer->stream_session[id]->p_queue = NULL; | 592 tdata->streamer->stream_session[id]->p_queue = NULL; |
| 593 strcpy(ut->request_channel, "all"); | |
| 594 ut->nr_channel = 0; | |
| 572 } | 595 } |
| 573 break; | 596 break; |
| 574 default: | 597 default: |
| 575 log_verbose ("Unknown file type.\n"); | 598 log_verbose ("Unknown file type.\n"); |
| 576 break; | 599 break; |
