plugin-list.cpp
上传用户:hongyu5696
上传日期:2018-01-22
资源大小:391k
文件大小:21k
源码类别:

PlugIns编程

开发平台:

Unix_Linux

  1. #include "plugin.h"
  2. #include <errno.h>
  3. #ifndef _GNU_SOURCE
  4. #define _GNU_SOURCE
  5. #endif
  6. #include <strings.h>
  7. void cancelBySpeed(nsPluginInstance * instance);
  8. extern int DEBUG;
  9. extern int errno;
  10. // Linked List methods
  11. // This is how the playlist is going to be managed
  12. void initialize(Node * l)
  13. {
  14.     l = NULL;
  15. }
  16. Node *newNode()
  17. {
  18.     Node *n = (Node *) NPN_MemAlloc(sizeof(Node));
  19.     n->url[0] = '';
  20.     n->fname[0] = '';
  21.     n->next = NULL;
  22.     n->bytes = 0;
  23.     n->play = 1;
  24.     n->playlist = 0;
  25.     n->speed = -1;
  26.     n->mmsstream = 0;
  27.     n->remove = 1;
  28.     n->status = STATE_NEWINSTANCE;
  29.     n->retrieved = 0;
  30.     n->cancelled = 0;
  31.     n->played = 0;
  32.     n->frombutton = 0;
  33.     n->bytes = 0;
  34.     n->totalbytes = 0;
  35.     n->cachebytes = 0;
  36.     n->actual_x = 0;
  37.     n->actual_y = 0;
  38.     n->play_x = 0;
  39.     n->play_y = 0;
  40.     n->copy = 0;
  41.     n->localcache = NULL;
  42.     n->area = NULL;
  43.     n->next = NULL;
  44.     return n;
  45. }
  46. void deleteNode(Node * n)
  47. {
  48.     char *tmp = NULL;
  49.     if (n != NULL) {
  50. if (n->copy == 0) {
  51.     if ((n->remove == 1) || (n->remove == 0 && n->play == 0)) {
  52. if (strlen(n->fname) != 0) {
  53.     if (strncasecmp(n->fname, "sdp://", 6) == 0) {
  54. tmp = strdup(n->fname);
  55. strcpy(n->fname, tmp + 6);
  56. free(tmp);
  57.     }
  58.     remove(n->fname);
  59.     if (DEBUG)
  60. printf("fname: %s deletedn", n->fname);
  61. }
  62.     }
  63. }
  64. n->url[0] = '';
  65. n->fname[0] = '';
  66. n->bytes = 0;
  67. n->play = 1;
  68. n->mmsstream = 0;
  69. n->remove = 1;
  70. n->status = STATE_NEWINSTANCE;
  71. n->retrieved = 0;
  72. NPN_MemFree(n);
  73. n = NULL;
  74.     }
  75. }
  76. void copyNode(Node * dest, Node * src)
  77. {
  78.     if (src != NULL && dest != NULL) {
  79. if (dest->url != NULL && src->url != NULL)
  80.     strlcpy(dest->url, src->url, 1024);
  81. if (dest->fname != NULL && src->fname != NULL)
  82.     strlcpy(dest->fname, src->fname, 1024);
  83. dest->bytes = src->bytes;
  84. dest->play = src->play;
  85. dest->mmsstream = src->mmsstream;
  86. dest->playlist = src->playlist;
  87. dest->speed = src->speed;
  88. dest->remove = src->remove;
  89. dest->cancelled = src->cancelled;
  90. dest->played = src->played;
  91. dest->retrieved = src->retrieved;
  92. dest->area = src->area;
  93. dest->copy = 1;
  94.     }
  95. }
  96. void insert_area(Node * parent, char *tagtarget, char *tagurl, int tagtime)
  97. {
  98.     area *runner;
  99.     area *n = (area *) NPN_MemAlloc(sizeof(area));
  100.     strcpy(n->url, tagurl);
  101.     strcpy(n->target, tagtarget);
  102.     n->begin = tagtime;
  103.     n->next = NULL;
  104.     while (parent->next != NULL)
  105. parent = parent->next;
  106.     if (parent->area == NULL) {
  107. parent->area = n;
  108. return;
  109.     }
  110.     runner = parent->area;
  111.     while (runner->next != NULL)
  112. runner = runner->next;
  113.     runner->next = n;
  114. }
  115. void find_area_tags(const char *smilbuffer, Node * parent)
  116. {
  117.     char *startarea;
  118.     char *endvideo;
  119.     char *start;
  120.     int tagtime = 0;
  121.     char tagtarget[128];
  122.     char tagurl[1024];
  123.     endvideo = strstr(smilbuffer, "</video");
  124.     startarea = strstr(smilbuffer, "<area");
  125.     while (startarea && startarea < endvideo) {
  126. start = strstr(startarea + 5, "begin=");
  127. if (start) {
  128.     start += 6;
  129.     if (*start == '"')
  130. ++start;
  131.     tagtime = atoi(start);
  132. }
  133. start = strstr(startarea + 5, "target=");
  134. if (start) {
  135.     start += 7;
  136.     if (*start == '"')
  137. ++start;
  138.     sscanf(start, "%127[^" t]", tagtarget);
  139. }
  140. start = strstr(startarea + 5, "href=");
  141. if (start) {
  142.     start += 5;
  143.     if (*start == '"')
  144. ++start;
  145.     sscanf(start, "%1023[^" t]", tagurl);
  146. }
  147. insert_area(parent, tagtarget, tagurl, tagtime);
  148. startarea = strstr(startarea + 5, "<area");
  149.     }
  150. }
  151. void deleteList(Node * l)
  152. {
  153.     Node *oldList;
  154.     if (DEBUG)
  155. printf("Entering deleteListn");
  156.     while (l != NULL) {
  157. oldList = l;
  158. if (DEBUG) {
  159.     printf("DELETE %sn", l->url);
  160.     if (l->remove)
  161. printf("File to delete %sn", l->fname);
  162.     printf("size: %lin", l->bytes);
  163.     printf("remove: %in", l->remove);
  164.     printf("play: %in", l->play);
  165.     printf("playlist: %in", l->playlist);
  166.     printf("speed: %in", l->speed);
  167.     printf("cancelled: %in", l->cancelled);
  168.     printf("retrieved: %in", l->retrieved);
  169.     printf("mms stream: %in", l->mmsstream);
  170.     printf("cache bytes: %lin", l->cachebytes);
  171.     printf("Actual Size: %ix%in", l->actual_x, l->actual_y);
  172.     printf("Play Size: %ix%in", l->play_x, l->play_y);
  173. }
  174. l = l->next;
  175. deleteNode(oldList);
  176.     }
  177. }
  178. /* Inserts node newnode after node item */
  179. void insertafter(Node * item, Node * newnode)
  180. {
  181.     if (item == NULL || newnode == NULL) {
  182. if (DEBUG)
  183.     printf("Cannot insertn");
  184.     } else {
  185. newnode->next = item->next;
  186. item->next = newnode;
  187.     }
  188. }
  189. void addToEnd(Node * l, Node * newnode)
  190. {
  191.     if (l == NULL) {
  192. l = newnode;
  193.     } else {
  194. while (l->next != NULL)
  195.     l = l->next;
  196. l->next = newnode;
  197.     }
  198. }
  199. void addToList(nsPluginInstance * instance, char *item, Node * parent,
  200.        int speed)
  201. {
  202.     Node *node = NULL;
  203.     Node *n;
  204.     char *filename;
  205.     char localitem[1024];
  206.     fullyQualifyURL(instance, item, localitem);
  207.     n = instance->td->list;
  208.     if (DEBUG)
  209. printf("BUILD - traversing playlistn");
  210.     while (n != NULL) {
  211. if (URLcmp(n->url, localitem) == 0) {
  212.     if (DEBUG)
  213. printf("found duplicate entryn%sn", n->url);
  214.     break;
  215. }
  216. n = n->next;
  217.     }
  218.     if (n == NULL) {
  219. // add it in
  220. if (DEBUG)
  221.     printf("adding url %sn", localitem);
  222. node = newNode();
  223. strlcpy(node->url, localitem, sizeof(node->url));
  224. if (speed == -1 && parent->speed > 0) {
  225.     node->speed = parent->speed;
  226. } else {
  227.     node->speed = speed;
  228. }
  229. addToEnd(parent, node);
  230. parent->play = 0;
  231. if (isMms(item, instance->nomediacache)
  232.     || strstr(node->url, parent->url) != NULL) {
  233.     node->mmsstream = 1;
  234. } else {
  235.     filename = getURLFilename(localitem);
  236. /*     if (instance->keep_download == 1 && filename != NULL) {
  237. snprintf(node->fname, sizeof(node->fname), "%s/%s",
  238.  instance->download_dir, filename);
  239. if (DEBUG)
  240.     printf("Assigned name: %sn", node->fname);
  241. node->remove = 0;
  242.     }
  243. */     if (filename != NULL)
  244. NPN_MemFree(filename);
  245.     NPN_GetURLNotify(instance->mInstance, node->url, NULL, NULL);
  246. }
  247.     } else {
  248. if (n->playlist == 1)
  249.     n->mmsstream = 1;
  250.     }
  251. }
  252. void buildPlaylist(nsPluginInstance * instance, char *file, Node * parent)
  253. {
  254.     FILE *fp;
  255.     char buffer[16 * 1024];
  256.     char buffer_lower[16 * 1024];
  257.     char url[1024];
  258.     unsigned long int size, found, i;
  259.     long int remainder;
  260.     char *p;
  261.     char *nextrmda = NULL;
  262.     char *rdrf;
  263.     char *rmdr;
  264.     char *sub, *refurl;
  265.     char *seqtag, *rate, *videotag, *videosrc;
  266.     unsigned int code;
  267.     int speed;
  268.     unsigned char *c1, *c2, *c3, *c4;
  269.     fp = fopen(file, "r");
  270.     found = 0;
  271.     if (fp != NULL) {
  272. while (!feof(fp)) {
  273.     memset(buffer, 0, sizeof(buffer));
  274.     memset(buffer_lower, 0, sizeof(buffer));
  275.     memset(url, 0, sizeof(url));
  276.     size = fread(buffer, 1, sizeof(buffer) - 1, fp);
  277.     buffer[size] = '';
  278.     if (DEBUG > 1)
  279. printf("READ: %lin%sn", size, buffer);
  280.     // quicktime files have blocks of 4 characters..
  281.     // rdrf,XXXX,url ,XXXX,url ending with 00
  282.     if (memmem(buffer, size, "rmda", 4)) {
  283. if (DEBUG)
  284.     printf("found QTn");
  285. p = buffer;
  286. // find the first data element
  287. p = (char *) memmem(p, size, "rmda", 4);
  288. if (size > 4) {
  289.     if (p != NULL)
  290. p = p + 4;
  291.     nextrmda = (char *) memmem(p, size - 4, "rmda", 4);
  292.     if (nextrmda == NULL)
  293. nextrmda = buffer + size;
  294. }
  295. refurl = NULL;
  296. speed = -1;
  297. code = 0;
  298. while ((p != NULL)
  299.        && ((long) p < ((long) buffer + (long) size))) {
  300.     rdrf =
  301. (char *) memmem(p,
  302. size - ((long) nextrmda -
  303. (long) p), "rdrf", 4);
  304.     rmdr =
  305. (char *) memmem(p,
  306. size - ((long) nextrmda -
  307. (long) p), "rmdr", 4);
  308.     if (rdrf != NULL) {
  309. code = (unsigned int) (rdrf[15]);
  310. rdrf = rdrf + 16;
  311. refurl = (char *) rdrf;
  312. if (DEBUG) {
  313.     printf("URL: %sn", (refurl));
  314.     printf("CODE: %dn", code);
  315. }
  316.     }
  317.     if (rmdr != NULL) {
  318. rmdr = rmdr + 8;
  319. c1 = (unsigned char *) rmdr;
  320. c2 = (unsigned char *) rmdr + 1;
  321. c3 = (unsigned char *) rmdr + 2;
  322. c4 = (unsigned char *) rmdr + 3;
  323. speed =
  324.     ((unsigned int) c1[0] << 24) +
  325.     ((unsigned int) c2[0] << 16) +
  326.     ((unsigned int) c3[0] << 8) +
  327.     (unsigned int) c4[0];
  328. if (parent->speed > speed)
  329.     speed = parent->speed;
  330.     }
  331.     if (refurl != NULL) {
  332. if (code == 163 || code == 165 || code == 167
  333.     || code == (unsigned int) -93
  334.     || code == (unsigned int) -91
  335.     || code == (unsigned int) -89) {
  336.     if (DEBUG)
  337. printf("Skipped URL: %sn", refurl);
  338. } else {
  339.     parent->playlist = 1;
  340.     addToList(instance, refurl, parent, speed);
  341.     printf("ADDED URL: %sn", (refurl));
  342.     printf("code: %in speed %in", code, speed);
  343.     found = 1;
  344.     refurl = NULL;
  345.     speed = -1;
  346.     code = 0;
  347. }
  348.     }
  349.     if ((nextrmda - size) == p)
  350. break;
  351.     p = nextrmda + 4;
  352.     nextrmda =
  353. (char *) memmem(p,
  354. size - ((long) p - (long) buffer),
  355. "rmda", 4);
  356.     if (nextrmda == NULL)
  357. nextrmda = buffer + size;
  358. }
  359. break; // End QT Reference file
  360.     }
  361.     // smil format detection
  362.     snprintf((char *) buffer_lower, sizeof(buffer_lower), "%s",
  363.      buffer);
  364.     lowercase((char *) buffer_lower);
  365.     p = buffer_lower;
  366.     if (memmem(p, size, "<smil", 5) && found == 0) {
  367. while (p != NULL) {
  368.     speed = -1;
  369.     remainder = size - ((long) p - (long) buffer_lower);
  370.     if (remainder < 1)
  371. break;
  372.     // seq tags are optional, but if we do have
  373.     // one see if it has a speed and if so, find it
  374.     seqtag = (char *) memmem(p, remainder, "<seq", 4);
  375.     if (seqtag != NULL) {
  376. if (DEBUG)
  377.     printf("[smil] found seq tagn");
  378. remainder =
  379.     size - ((long) seqtag - (long) buffer_lower);
  380. rate =
  381.     (char *) memmem(seqtag, remainder,
  382.     "system-bitrate", 14);
  383. if (rate != NULL) {
  384.     rate = strchr(rate, '"');
  385.     if (rate != NULL)
  386. rate++;
  387.     sscanf(rate, "%i", &speed);
  388.     if (DEBUG)
  389. printf("[smil] found bit rate %in",
  390.        speed);
  391. } else {
  392.     // if we don't find a speed, then set the speed to -1
  393.     speed = -1;
  394.     // and reset p so that we can find the video tag
  395.     seqtag = (char *) p;
  396. }
  397.     } else {
  398. // if we didn't find a seqtag, then set seqtag equal to p
  399. // so that the next block will work
  400. seqtag = (char *) p;
  401.     }
  402.     // we have a speed now, lets find all the src
  403.     // files in the seq block
  404.     videotag =
  405. (char *) memmem(seqtag, remainder, "<video", 6);
  406.     // if we don't find "video" see if we find audio
  407.     if (videotag == NULL)
  408. videotag =
  409.     (char *) memmem(seqtag, remainder, "<audio",
  410.     6);
  411.     if (videotag != NULL) {
  412. while (videotag != NULL) {
  413.     if (DEBUG)
  414. printf("[smil] found video tagn");
  415.     remainder =
  416. size - ((long) videotag -
  417. (long) buffer_lower);
  418.     videosrc =
  419. (char *) memmem(videotag, remainder, "src",
  420. 3);
  421.     if (videosrc != NULL) {
  422. if (strchr(videosrc, '"') == NULL)
  423.     videosrc = strchr(videosrc, ''');
  424. else
  425.     videosrc = strchr(videosrc, '"');
  426. if (videosrc == NULL) {
  427.     seqtag = (char *) NULL;
  428.     p = NULL;
  429.     videotag = NULL;
  430.     break;
  431. }
  432. i = (long) videosrc - (long) buffer_lower;
  433. sscanf(buffer + i, ""%1023[^"]"", url);
  434. if (url == NULL)
  435.     sscanf(buffer + i, "'%1023[^']'",
  436.    url);
  437. if (DEBUG)
  438.     printf("[smil] found url %sn", url);
  439. parent->playlist = 1;
  440. addToList(instance, url, parent, speed);
  441. found = 1;
  442.     } else {
  443. seqtag = (char *) NULL;
  444. p = NULL;
  445. videotag = NULL;
  446. break;
  447.     }
  448.     find_area_tags(videosrc, instance->td->list);
  449.     videotag =
  450. (char *) memmem(videosrc, remainder,
  451. "<video", 6);
  452.     // if we don't find "video" see if we find audio
  453.     if (videotag == NULL)
  454. videotag =
  455.     (char *) memmem(videosrc,
  456.     remainder,
  457.     "<audio", 6);
  458.     seqtag =
  459. (char *) memmem(videosrc, remainder,
  460. "<seq", 4);
  461.     if (videotag == NULL)
  462. break;
  463.     if (seqtag == NULL && videotag != NULL)
  464. continue;
  465.     if ((long) videotag > (long) seqtag)
  466. videotag = NULL;
  467. }
  468. p = (char *) seqtag;
  469.     } else {
  470. p = (char *) seqtag + 4; // for the seq block that contains no video or audio tags
  471.     }
  472. }
  473.     }
  474.     // quicktime media link files
  475.     snprintf((char *) buffer_lower, sizeof(buffer_lower), "%s",
  476.      buffer);
  477.     lowercase((char *) buffer_lower);
  478.     p = buffer_lower;
  479.     if (memmem
  480. (p, size, "quicktime-media-link",
  481.  strlen("quicktime-media-link")) && found == 0) {
  482. if (DEBUG)
  483.     printf("found QuickTime Media Link filen");
  484. while (p != NULL) {
  485.     i = size - ((long) p - (long) buffer_lower);
  486.     if (i < 1)
  487. break;
  488.     p = (char *) memmem(p, i, "src", 3);
  489.     if (p == NULL)
  490. break;
  491.     p = p + 3;
  492.     p = strchr(p, '"');
  493.     if (p != NULL) {
  494. p++;
  495. i = (long) p - (long) buffer_lower;
  496. snprintf(url, 1024, "%s", buffer + i);
  497. sub = strchr(url, '"');
  498. if (sub != NULL) {
  499.     *sub = '';
  500.     if (DEBUG)
  501. printf("URL: %sn", url);
  502.     parent->playlist = 1;
  503.     addToList(instance, url, parent, -1);
  504.     p = p + strlen(url) + 1;
  505.     found = 1;
  506. } else {
  507.     break;
  508. }
  509.     }
  510. }
  511. break;
  512.     }
  513.     // some mp3 files start with ID3, not a reference file
  514.     // not all MP3 files have the ID tag
  515.     if (strncasecmp(buffer, "ID3", 3) == 0 && found == 0) {
  516. if (DEBUG)
  517.     printf("found MP3n");
  518. break;
  519.     }
  520.     // asx files are XMLish
  521.     // <Ref href = "url" />
  522.     snprintf((char *) buffer_lower, sizeof(buffer_lower), "%s",
  523.      buffer);
  524.     lowercase((char *) buffer_lower);
  525.     p = buffer_lower;
  526.     if (memmem(p, size, "<asx", strlen("<asx")) && found == 0) {
  527. if (DEBUG)
  528.     printf("found ASX filen");
  529. while (p != NULL) {
  530.     i = size - ((long) p - (long) buffer_lower);
  531.     if (i < 1)
  532. break;
  533.     p = (char *) memmem(p, i, "href", 4);
  534.     if (p == NULL)
  535. break;
  536.     if ((p - 9) > buffer_lower) {
  537. // look backwards in the file and see if the href is preceeded by
  538. // a qualifier tag, but don't look too far forward otherwise we may
  539. // find another tag of this type
  540. if (memmem(p - 5, 5, "logo", 4) != NULL) {
  541.     if (DEBUG > 1)
  542. printf("found logo in ASXn");
  543.     p = p + 4;
  544.     continue;
  545. }
  546. if (memmem(p - 7, 7, "banner", 6) != NULL) {
  547.     if (DEBUG > 1)
  548. printf("found banner in ASXn");
  549.     p = p + 4;
  550.     continue;
  551. }
  552. if (memmem(p - 9, 9, "moreinfo", 8) != NULL) {
  553.     if (DEBUG > 1)
  554. printf("found moreinfo in ASXn");
  555.     p = p + 4;
  556.     continue;
  557. }
  558.     }
  559.     p = p + 4;
  560.     p = strchr(p, '"');
  561.     if (p != NULL) {
  562. p++;
  563. i = (long) p - (long) buffer_lower;
  564. if (i >= size)
  565.     break;
  566. snprintf(url, 1024, "%s", buffer + i);
  567. sub = strchr(url, '"');
  568. if (sub != NULL) {
  569.     *sub = '';
  570.     unEscapeXML(url);
  571.     if (DEBUG)
  572. printf("URL: %sn", url);
  573.     parent->playlist = 1;
  574.     addToList(instance, url, parent, -1);
  575.     parent->next->mmsstream = 1;
  576.     p = p + strlen(url) + 1;
  577.     found = 1;
  578. } else {
  579.     break;
  580. }
  581.     }
  582. }
  583. break;
  584.     }
  585.     // asf files
  586.     if (strncasecmp(buffer, "[reference]", 11) == 0 && found == 0) {
  587. if (DEBUG)
  588.     printf("found ASF filen");
  589. snprintf(buffer_lower, 4096, "%s", buffer);
  590. lowercase(buffer_lower);
  591. p = buffer_lower;
  592. while (p != NULL) {
  593.     i = size - ((long) p - (long) buffer_lower);
  594.     if (i < 1)
  595. break;
  596.     p = (char *) memmem(p, i, "ref", 3);
  597.     if (p == NULL)
  598. break;
  599.     p = p + 3;
  600.     p = strchr(p, '=');
  601.     if (p != NULL) {
  602. p++;
  603. i = (long) p - (long) buffer_lower;
  604. snprintf(url, 1024, "%s", buffer + i);
  605. sub = strchr(url, 'r');
  606. if (sub == NULL)
  607.     sub = strchr(url, 'n');
  608. if (sub == NULL)
  609.     sub = strchr(url, EOF);
  610. if (sub != NULL) {
  611.     *sub = '';
  612.     if (DEBUG)
  613. printf("URL: %sn", url);
  614.     addToList(instance, url, parent, -1);
  615.     parent->playlist = 1;
  616.     if (parent->mmsstream == 1
  617. && parent->next == NULL)
  618. parent->playlist = 0;
  619.     if ((long)
  620. ((long) p - (long) buffer_lower +
  621.  strlen(url) + 1) < (long) size)
  622. p = p + strlen(url) + 1;
  623.     else
  624. p = NULL;
  625.     found = 1;
  626. } else {
  627.     break;
  628. }
  629.     }
  630. }
  631. break;
  632.     }
  633.     // if we have an HTML file, ignore it and don't process it
  634.     if (memmem(buffer_lower, size, "<html", 5) != NULL) {
  635. found = 1;
  636.     }
  637.     // we have an NSV file
  638.     if (memmem(buffer_lower, size, "icy 200 ok", 10) != NULL) {
  639. parent->mmsstream = 1;
  640. parent->cancelled = 1;
  641. found = 1;
  642.     }
  643.     // simple playlist usually realmedia file
  644.     if (strncasecmp(buffer, "rtsp", 4) == 0 && found == 0) {
  645.         if (DEBUG) {
  646. printf("Search RTSP Filen");
  647. }
  648. p = buffer_lower;
  649. while (p != NULL) {
  650.     i = size - ((long) p - (long) buffer_lower);
  651.     p = (char *) memmem(p, i, "rtsp://", 7);
  652.     if (p == NULL) {
  653. break;
  654.     } else {
  655. i = (long) p - (long) buffer_lower;
  656. snprintf(url, 1024, "rtsp://%s", buffer + i + 7);
  657. sub = strchr(url, 0xd); // terminate on CR
  658. if (sub != NULL)
  659.     sub[0] = '';
  660. sub = strchr(url, 0xa); // terminate on line feed
  661. if (sub != NULL)
  662.     sub[0] = '';
  663. sub = strchr(url, 0x20); // terminate on space
  664. if (sub != NULL)
  665.     sub[0] = '';
  666. if (DEBUG)
  667.     printf("URL: %sn", url);
  668. parent->playlist = 1;
  669. addToList(instance, url, parent, -1);
  670. p = p + strlen(url) + 1;
  671. found = 1;
  672.     }
  673. }
  674.     }
  675.     // simple playlist, usually old windows media
  676.     if ((strncasecmp(buffer, "http://", 7) == 0
  677.  || memmem(buffer_lower, size, "http://", 7) != NULL)
  678. && found == 0
  679. && memmem(buffer_lower, size, "<a", 2) == NULL) {
  680. p = buffer;
  681. while (p != NULL) {
  682.     i = size - ((long) p - (long) buffer);
  683.     p = (char *) memmem(p, i, "http://", 7);
  684.     if (p == NULL) {
  685. break;
  686.     } else {
  687. snprintf(url, 1024, "%s", p);
  688. sub = strchr(url, 0xd);
  689. if (sub != NULL)
  690.     sub[0] = '';
  691. sub = strchr(url, 0xa);
  692. if (sub != NULL)
  693.     sub[0] = '';
  694. sub = strchr(url, 0x20); // terminate on space
  695. if (sub != NULL)
  696.     sub[0] = '';
  697. if (DEBUG)
  698.     printf("URL: %sn", url);
  699. parent->playlist = 1;
  700. addToList(instance, url, parent, -1);
  701. p = p + strlen(url) + 1;
  702. found = 1;
  703.     }
  704. }
  705.     }
  706.     // simple playlist, usually old windows media
  707.     if (strncasecmp(buffer, "mms://", 6) == 0 && found == 0) {
  708. p = buffer;
  709. while (p != NULL) {
  710.     i = size - ((long) p - (long) buffer);
  711.     p = (char *) memmem(p, i, "mms://", 6);
  712.     if (p == NULL) {
  713. break;
  714.     } else {
  715. snprintf(url, 1024, "%s", p);
  716. sub = strchr(url, 0xd);
  717. if (sub != NULL)
  718.     sub[0] = '';
  719. sub = strchr(url, 0xa);
  720. if (sub != NULL)
  721.     sub[0] = '';
  722. sub = strchr(url, 0x20); // terminate on space
  723. if (sub != NULL)
  724.     sub[0] = '';
  725. if (DEBUG)
  726.     printf("URL: %sn", url);
  727. parent->playlist = 1;
  728. addToList(instance, url, parent, -1);
  729. p = p + strlen(url) + 1;
  730. found = 1;
  731.     }
  732. }
  733.     }
  734.     if (!found)
  735. break;
  736. }
  737. fclose(fp);
  738. cancelBySpeed(instance);
  739.     } else {
  740. printf("Build Playlist error opening file %i : %sn", errno,
  741.        strerror(errno));
  742.     }
  743. }
  744. void cancelBySpeed(nsPluginInstance * instance)
  745. {
  746.     Node *n;
  747.     int speed_low, speed_med, speed_high;
  748.     // some QuickTime sites, out all the media in one reference file but speed is different
  749.     // we need to figure out which one to play.
  750.     speed_low = 0;
  751.     speed_med = 0;
  752.     speed_high = 0;
  753.     if (DEBUG)
  754. printf("Scanning for speedn");
  755.     n = instance->td->list;
  756.     while (n != NULL) {
  757. if ((n->speed > 0) && (n->play == 1)) {
  758.     if (speed_low == 0) {
  759. speed_low = n->speed;
  760. speed_med = n->speed;
  761. speed_high = n->speed;
  762.     }
  763.     if ((speed_low == speed_med) && (n->speed > speed_med))
  764. speed_med = n->speed;
  765.     if (n->speed < speed_low)
  766. speed_low = n->speed;
  767.     if (n->speed > speed_high)
  768. speed_high = n->speed;
  769.     if ((n->speed > speed_med) && (n->speed < speed_high))
  770. speed_med = n->speed;
  771.     if ((n->speed < speed_high) && (n->speed >= speed_low)
  772. && (speed_high == speed_med))
  773. speed_med = n->speed;
  774. }
  775. n = n->next;
  776.     }
  777.     if (DEBUG)
  778. printf("low = %i, med = %i, high = %in", speed_low, speed_med,
  779.        speed_high);
  780.     n = instance->td->list;
  781.     while (n != NULL) {
  782. if ((n->speed > 0) && (n->play == 1)) {
  783.     if (instance->qt_speed == SPEED_LOW) {
  784. if (n->speed != speed_low) {
  785.     n->play = 0;
  786.     n->cancelled = 1;
  787. }
  788.     }
  789.     if (instance->qt_speed == SPEED_MED) {
  790. if (n->speed != speed_med) {
  791.     n->play = 0;
  792.     n->cancelled = 1;
  793. }
  794.     }
  795.     if (instance->qt_speed == SPEED_HIGH) {
  796. if (n->speed != speed_high) {
  797.     n->play = 0;
  798.     n->cancelled = 1;
  799. }
  800.     }
  801. }
  802. n = n->next;
  803.     }
  804.     if (DEBUG)
  805. printf("playlist adjustment completen");
  806. }
  807. void printNode(Node * l)
  808. {
  809.     printf("url: %sn", l->url);
  810.     printf("fname %sn", l->fname);
  811.     printf("bytes: %lin", l->bytes);
  812.     printf("remove: %in", l->remove);
  813.     printf("play: %in", l->play);
  814.     printf("playlist: %in", l->playlist);
  815.     printf("speed: %in", l->speed);
  816.     printf("cancelled: %in", l->cancelled);
  817.     printf("retrieved: %in", l->retrieved);
  818.     printf("mmsstream: %in", l->mmsstream);
  819.     printf("cachebytes: %lin", l->cachebytes);
  820.     printf("Actual Size: %ix%in", l->actual_x, l->actual_y);
  821.     printf("Play Size: %ix%in", l->play_x, l->play_y);
  822. }
  823. void printList(Node * l)
  824. {
  825.     Node *current = l;
  826.     printf("Dumping Playlist:n");
  827.     while (current != NULL) {
  828. printNode(current);
  829. printf("^^^^^^^^^n");
  830. current = current->next;
  831.     }
  832. }