Committer:
FrankWeissenborn
Date:
Mon Jan 24 13:32:52 2011 +0000
Revision:
0:d9d38ebc0f69
Child:
1:1b5ed0fa82f0

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
FrankWeissenborn 0:d9d38ebc0f69 1 #include "Shoutcast.h"
FrankWeissenborn 0:d9d38ebc0f69 2 #include "mbed.h"
FrankWeissenborn 0:d9d38ebc0f69 3 #include "HTTPClient.h"
FrankWeissenborn 0:d9d38ebc0f69 4
FrankWeissenborn 0:d9d38ebc0f69 5 #include "FileDownloader.h"
FrankWeissenborn 0:d9d38ebc0f69 6
FrankWeissenborn 0:d9d38ebc0f69 7
FrankWeissenborn 0:d9d38ebc0f69 8 const char* FOLDER = "/sd/mydir/";
FrankWeissenborn 0:d9d38ebc0f69 9 const char* FILECHANNEL = "/sd/mydir/channel.xml";
FrankWeissenborn 0:d9d38ebc0f69 10 const char* FILECHANNELMOD = "/sd/mydir/cm.xml";
FrankWeissenborn 0:d9d38ebc0f69 11 const char* FILETOP500 = "/sd/mydir/top500.xml";
FrankWeissenborn 0:d9d38ebc0f69 12 const char* FILEPLS = "/sd/mydir/currChan.pls";
FrankWeissenborn 0:d9d38ebc0f69 13 const char* FILEPLSMOD = "/sd/mydir/ChanM";
FrankWeissenborn 0:d9d38ebc0f69 14
FrankWeissenborn 0:d9d38ebc0f69 15 const char* GENRE[25] = {"Alternative","Blues","Classical","Country","Decades","Easy Listening","Electronic","Folk","Inspirational","International","Jazz","Latin","Metal","Misc","New Age","Pop","Public Radio","R&B/Urban","Rap","Reggae","Rock","Seasonal/Holiday","Soundtracks","Talk","Themes"};
FrankWeissenborn 0:d9d38ebc0f69 16
FrankWeissenborn 0:d9d38ebc0f69 17 unsigned int genreCounter = 0;
FrankWeissenborn 0:d9d38ebc0f69 18 unsigned int maxChannel = 0;
FrankWeissenborn 0:d9d38ebc0f69 19 unsigned int currentChannel = 0;
FrankWeissenborn 0:d9d38ebc0f69 20 unsigned int maxAddress = 0;
FrankWeissenborn 0:d9d38ebc0f69 21 unsigned int currentAddress = 0;
FrankWeissenborn 0:d9d38ebc0f69 22 FILE *fpin;
FrankWeissenborn 0:d9d38ebc0f69 23 FILE *fpout;
FrankWeissenborn 0:d9d38ebc0f69 24
FrankWeissenborn 0:d9d38ebc0f69 25 int completed_dns;
FrankWeissenborn 0:d9d38ebc0f69 26
FrankWeissenborn 0:d9d38ebc0f69 27
FrankWeissenborn 0:d9d38ebc0f69 28 Shoutcast::Shoutcast(const char* devId, char * buffer, int buffer_size) {
FrankWeissenborn 0:d9d38ebc0f69 29 _devId = devId;
FrankWeissenborn 0:d9d38ebc0f69 30 _buffer = buffer;
FrankWeissenborn 0:d9d38ebc0f69 31 _buffer_size = buffer_size;
FrankWeissenborn 0:d9d38ebc0f69 32 mkdir(FOLDER, 0777);
FrankWeissenborn 0:d9d38ebc0f69 33
FrankWeissenborn 0:d9d38ebc0f69 34 }
FrankWeissenborn 0:d9d38ebc0f69 35
FrankWeissenborn 0:d9d38ebc0f69 36 const char* Shoutcast::GetNextGenre() {
FrankWeissenborn 0:d9d38ebc0f69 37 if (genreCounter < 24) {
FrankWeissenborn 0:d9d38ebc0f69 38 genreCounter++;
FrankWeissenborn 0:d9d38ebc0f69 39 } else {
FrankWeissenborn 0:d9d38ebc0f69 40 genreCounter = 0;
FrankWeissenborn 0:d9d38ebc0f69 41 }
FrankWeissenborn 0:d9d38ebc0f69 42
FrankWeissenborn 0:d9d38ebc0f69 43 return GENRE[genreCounter];
FrankWeissenborn 0:d9d38ebc0f69 44
FrankWeissenborn 0:d9d38ebc0f69 45 }
FrankWeissenborn 0:d9d38ebc0f69 46
FrankWeissenborn 0:d9d38ebc0f69 47 const char* Shoutcast::GetPrevGenre() {
FrankWeissenborn 0:d9d38ebc0f69 48 if (genreCounter > 0) {
FrankWeissenborn 0:d9d38ebc0f69 49 genreCounter--;
FrankWeissenborn 0:d9d38ebc0f69 50 } else {
FrankWeissenborn 0:d9d38ebc0f69 51 genreCounter = 24;
FrankWeissenborn 0:d9d38ebc0f69 52 }
FrankWeissenborn 0:d9d38ebc0f69 53 return GENRE[genreCounter];
FrankWeissenborn 0:d9d38ebc0f69 54 }
FrankWeissenborn 0:d9d38ebc0f69 55 const char* Shoutcast::GetCurrGenre() {
FrankWeissenborn 0:d9d38ebc0f69 56 return GENRE[genreCounter];
FrankWeissenborn 0:d9d38ebc0f69 57 }
FrankWeissenborn 0:d9d38ebc0f69 58
FrankWeissenborn 0:d9d38ebc0f69 59 int Shoutcast::GetChannel(char* name, int length) {
FrankWeissenborn 0:d9d38ebc0f69 60 DEBUGOUT("Shoutcast:GetChannel started\r\n");
FrankWeissenborn 0:d9d38ebc0f69 61 DEBUGOUT("Shoutcast: Download channellist:%s started\r\n",GENRE[genreCounter]);
FrankWeissenborn 0:d9d38ebc0f69 62 strcpy (_buffer,"http://api.shoutcast.com/legacy/genresearch?k=");
FrankWeissenborn 0:d9d38ebc0f69 63
FrankWeissenborn 0:d9d38ebc0f69 64 DEBUGOUT("strcpy ok\r\n");
FrankWeissenborn 0:d9d38ebc0f69 65 strcat (_buffer,_devId);
FrankWeissenborn 0:d9d38ebc0f69 66 DEBUGOUT("strcat1 ok\r\n");
FrankWeissenborn 0:d9d38ebc0f69 67 strcat (_buffer,"&genre=");
FrankWeissenborn 0:d9d38ebc0f69 68 DEBUGOUT("strcat1 ok\r\n");
FrankWeissenborn 0:d9d38ebc0f69 69 strcat (_buffer,GENRE[genreCounter]);
FrankWeissenborn 0:d9d38ebc0f69 70 DEBUGOUT("strcat1 ok\r\n");
FrankWeissenborn 0:d9d38ebc0f69 71 strcat (_buffer,"&f=xml");
FrankWeissenborn 0:d9d38ebc0f69 72 DEBUGOUT("strcat1 ok\r\n");
FrankWeissenborn 0:d9d38ebc0f69 73 DEBUGOUT("%s\r\n",_buffer);
FrankWeissenborn 0:d9d38ebc0f69 74
FrankWeissenborn 0:d9d38ebc0f69 75 HTTPResult result = GetFile(_buffer,FILECHANNEL);
FrankWeissenborn 0:d9d38ebc0f69 76 if(result != HTTP_OK)
FrankWeissenborn 0:d9d38ebc0f69 77 {
FrankWeissenborn 0:d9d38ebc0f69 78 DEBUGOUT("Shoutcast: Download channellist:%s ended with error %i.\r\n",GENRE[genreCounter],result);
FrankWeissenborn 0:d9d38ebc0f69 79 return 1;
FrankWeissenborn 0:d9d38ebc0f69 80 }
FrankWeissenborn 0:d9d38ebc0f69 81 DEBUGOUT("Shoutcast: Download channellist:%s successfully completed.\r\n",GENRE[genreCounter]);
FrankWeissenborn 0:d9d38ebc0f69 82 ParseChannelList(FILECHANNEL);
FrankWeissenborn 0:d9d38ebc0f69 83
FrankWeissenborn 0:d9d38ebc0f69 84 currentChannel = 0;
FrankWeissenborn 0:d9d38ebc0f69 85 return GetChannel(name, length, 0);
FrankWeissenborn 0:d9d38ebc0f69 86 }
FrankWeissenborn 0:d9d38ebc0f69 87
FrankWeissenborn 0:d9d38ebc0f69 88 int Shoutcast::GetTop500(char* name, int length) {
FrankWeissenborn 0:d9d38ebc0f69 89
FrankWeissenborn 0:d9d38ebc0f69 90 DEBUGOUT("Shoutcast: Download Top500 started\r\n");
FrankWeissenborn 0:d9d38ebc0f69 91 strcpy (_buffer,"http://api.shoutcast.com/legacy/Top500?k=");
FrankWeissenborn 0:d9d38ebc0f69 92 strcat (_buffer,_devId);
FrankWeissenborn 0:d9d38ebc0f69 93 DEBUGOUT("%s\n",_buffer);
FrankWeissenborn 0:d9d38ebc0f69 94 HTTPResult result = GetFile(_buffer,FILETOP500);
FrankWeissenborn 0:d9d38ebc0f69 95 if(result != HTTP_OK)
FrankWeissenborn 0:d9d38ebc0f69 96 {
FrankWeissenborn 0:d9d38ebc0f69 97 DEBUGOUT("Shoutcast: Download Top500 ended with error %i.\r\n",result);
FrankWeissenborn 0:d9d38ebc0f69 98 return 1;
FrankWeissenborn 0:d9d38ebc0f69 99 }
FrankWeissenborn 0:d9d38ebc0f69 100 DEBUGOUT("Shoutcast: Download Top500 successfully completed.\r\n");
FrankWeissenborn 0:d9d38ebc0f69 101 ParseChannelList(FILETOP500);
FrankWeissenborn 0:d9d38ebc0f69 102 currentChannel = 0;
FrankWeissenborn 0:d9d38ebc0f69 103 return GetChannel(name, length, 0);
FrankWeissenborn 0:d9d38ebc0f69 104 }
FrankWeissenborn 0:d9d38ebc0f69 105 int Shoutcast::GetPrevChannel(char*name, int length) {
FrankWeissenborn 0:d9d38ebc0f69 106 if(currentChannel > 0){
FrankWeissenborn 0:d9d38ebc0f69 107 currentChannel--;
FrankWeissenborn 0:d9d38ebc0f69 108 }
FrankWeissenborn 0:d9d38ebc0f69 109 else {
FrankWeissenborn 0:d9d38ebc0f69 110 currentChannel = maxChannel - 1;
FrankWeissenborn 0:d9d38ebc0f69 111 }
FrankWeissenborn 0:d9d38ebc0f69 112 return GetChannel(name, length, currentChannel);
FrankWeissenborn 0:d9d38ebc0f69 113 }
FrankWeissenborn 0:d9d38ebc0f69 114 int Shoutcast::GetNextChannel(char* name, int length) {
FrankWeissenborn 0:d9d38ebc0f69 115 if(currentChannel < maxChannel - 1) {
FrankWeissenborn 0:d9d38ebc0f69 116 currentChannel++;
FrankWeissenborn 0:d9d38ebc0f69 117 }
FrankWeissenborn 0:d9d38ebc0f69 118 else {
FrankWeissenborn 0:d9d38ebc0f69 119 currentChannel++;
FrankWeissenborn 0:d9d38ebc0f69 120 }
FrankWeissenborn 0:d9d38ebc0f69 121 return GetChannel(name, length, currentChannel);
FrankWeissenborn 0:d9d38ebc0f69 122 }
FrankWeissenborn 0:d9d38ebc0f69 123
FrankWeissenborn 0:d9d38ebc0f69 124 int Shoutcast::GetCurrChannel(char* name, int length) {
FrankWeissenborn 0:d9d38ebc0f69 125 return GetChannel(name, length, currentChannel);
FrankWeissenborn 0:d9d38ebc0f69 126 }
FrankWeissenborn 0:d9d38ebc0f69 127
FrankWeissenborn 0:d9d38ebc0f69 128 int Shoutcast::TuneIn(IpAddr* address, int* port) {
FrankWeissenborn 0:d9d38ebc0f69 129 char buf[10];
FrankWeissenborn 0:d9d38ebc0f69 130 sprintf(buf,"%d",GetChannelId(currentChannel));
FrankWeissenborn 0:d9d38ebc0f69 131
FrankWeissenborn 0:d9d38ebc0f69 132 strcpy (_buffer,"http://yp.shoutcast.com/sbin/tunein-station.pls?&k=");
FrankWeissenborn 0:d9d38ebc0f69 133 strcat (_buffer,_devId);
FrankWeissenborn 0:d9d38ebc0f69 134 strcat (_buffer,"&id=");
FrankWeissenborn 0:d9d38ebc0f69 135 strcat (_buffer,buf); //todo: int to string
FrankWeissenborn 0:d9d38ebc0f69 136 strcat (_buffer,"&f=xml");
FrankWeissenborn 0:d9d38ebc0f69 137 DEBUGOUT("%s\r\n",_buffer);
FrankWeissenborn 0:d9d38ebc0f69 138 HTTPResult result = GetFile(_buffer,FILEPLS);
FrankWeissenborn 0:d9d38ebc0f69 139 DEBUGOUT("result PLS: %d\n", result);
FrankWeissenborn 0:d9d38ebc0f69 140 //TODO: PLS Parsen, IP und Port zur&#65533;ckgeben
FrankWeissenborn 0:d9d38ebc0f69 141 if(ParsePls() != 0x00)
FrankWeissenborn 0:d9d38ebc0f69 142 {
FrankWeissenborn 0:d9d38ebc0f69 143 return 1;
FrankWeissenborn 0:d9d38ebc0f69 144 }
FrankWeissenborn 0:d9d38ebc0f69 145 currentAddress = 0;
FrankWeissenborn 0:d9d38ebc0f69 146 GetAddressData(address,port,0);
FrankWeissenborn 0:d9d38ebc0f69 147 return 0;
FrankWeissenborn 0:d9d38ebc0f69 148 }
FrankWeissenborn 0:d9d38ebc0f69 149
FrankWeissenborn 0:d9d38ebc0f69 150
FrankWeissenborn 0:d9d38ebc0f69 151
FrankWeissenborn 0:d9d38ebc0f69 152 int Shoutcast::ParseChannelList(const char* channelList) {
FrankWeissenborn 0:d9d38ebc0f69 153
FrankWeissenborn 0:d9d38ebc0f69 154 DEBUGOUT("Shoutcast: Parsing started\r\n");
FrankWeissenborn 0:d9d38ebc0f69 155 maxChannel = 0;
FrankWeissenborn 0:d9d38ebc0f69 156
FrankWeissenborn 0:d9d38ebc0f69 157 fpin = fopen(channelList, "r");
FrankWeissenborn 0:d9d38ebc0f69 158 if (fpin == NULL) {
FrankWeissenborn 0:d9d38ebc0f69 159 error("Could not open file for write\n");
FrankWeissenborn 0:d9d38ebc0f69 160 }
FrankWeissenborn 0:d9d38ebc0f69 161
FrankWeissenborn 0:d9d38ebc0f69 162 fpout = fopen(FILECHANNELMOD, "w");
FrankWeissenborn 0:d9d38ebc0f69 163 if (fpout == NULL) {
FrankWeissenborn 0:d9d38ebc0f69 164 error("Could not open file for write\n");
FrankWeissenborn 0:d9d38ebc0f69 165 }
FrankWeissenborn 0:d9d38ebc0f69 166
FrankWeissenborn 0:d9d38ebc0f69 167 char * cp;
FrankWeissenborn 0:d9d38ebc0f69 168 char * cp2 = NULL;
FrankWeissenborn 0:d9d38ebc0f69 169 char * station1; char * station2 = NULL;
FrankWeissenborn 0:d9d38ebc0f69 170
FrankWeissenborn 0:d9d38ebc0f69 171 int i=0;
FrankWeissenborn 0:d9d38ebc0f69 172 bool finished = (fgets(_buffer, _buffer_size-1, fpin) == NULL);
FrankWeissenborn 0:d9d38ebc0f69 173 _buffer[_buffer_size-1] = 0x00;
FrankWeissenborn 0:d9d38ebc0f69 174 cp = _buffer;
FrankWeissenborn 0:d9d38ebc0f69 175
FrankWeissenborn 0:d9d38ebc0f69 176 while (!finished) {
FrankWeissenborn 0:d9d38ebc0f69 177 if (cp==NULL) {
FrankWeissenborn 0:d9d38ebc0f69 178 if (cp2 != NULL) {
FrankWeissenborn 0:d9d38ebc0f69 179 int x = (_buffer + _buffer_size) - cp2 - 1;
FrankWeissenborn 0:d9d38ebc0f69 180 int read_size = _buffer_size-(x-1);
FrankWeissenborn 0:d9d38ebc0f69 181
FrankWeissenborn 0:d9d38ebc0f69 182 finished = (fgets(_buffer+x-1, read_size,fpin) == NULL);
FrankWeissenborn 0:d9d38ebc0f69 183 _buffer[_buffer_size-1] = 0x00;
FrankWeissenborn 0:d9d38ebc0f69 184 cp=_buffer;
FrankWeissenborn 0:d9d38ebc0f69 185
FrankWeissenborn 0:d9d38ebc0f69 186 } else {
FrankWeissenborn 0:d9d38ebc0f69 187 finished = (fgets(_buffer, _buffer_size-1, fpin) == NULL);
FrankWeissenborn 0:d9d38ebc0f69 188 _buffer[_buffer_size-1] = 0x00;
FrankWeissenborn 0:d9d38ebc0f69 189 cp = _buffer;
FrankWeissenborn 0:d9d38ebc0f69 190 }
FrankWeissenborn 0:d9d38ebc0f69 191 }
FrankWeissenborn 0:d9d38ebc0f69 192
FrankWeissenborn 0:d9d38ebc0f69 193 cp=strstr(cp,"<station ");
FrankWeissenborn 0:d9d38ebc0f69 194
FrankWeissenborn 0:d9d38ebc0f69 195 if (cp!=NULL) {
FrankWeissenborn 0:d9d38ebc0f69 196 cp2=strstr(cp,"/>");
FrankWeissenborn 0:d9d38ebc0f69 197 if (cp2 != NULL) {
FrankWeissenborn 0:d9d38ebc0f69 198 i++;
FrankWeissenborn 0:d9d38ebc0f69 199
FrankWeissenborn 0:d9d38ebc0f69 200 cp2[0] = 0x00;
FrankWeissenborn 0:d9d38ebc0f69 201
FrankWeissenborn 0:d9d38ebc0f69 202 //name suchen
FrankWeissenborn 0:d9d38ebc0f69 203 station1=strstr(cp,"name=\"");
FrankWeissenborn 0:d9d38ebc0f69 204 if(station1 != NULL)
FrankWeissenborn 0:d9d38ebc0f69 205 {
FrankWeissenborn 0:d9d38ebc0f69 206 station1 = station1 + strlen("name=\"");
FrankWeissenborn 0:d9d38ebc0f69 207 station2 = NULL;
FrankWeissenborn 0:d9d38ebc0f69 208 station2 = strstr(station1,"\"");
FrankWeissenborn 0:d9d38ebc0f69 209 if(station2 != NULL)
FrankWeissenborn 0:d9d38ebc0f69 210 {
FrankWeissenborn 0:d9d38ebc0f69 211 station2[0]=0x00;
FrankWeissenborn 0:d9d38ebc0f69 212 fprintf(fpout,"%s<>",station1);
FrankWeissenborn 0:d9d38ebc0f69 213 maxChannel++;
FrankWeissenborn 0:d9d38ebc0f69 214 }
FrankWeissenborn 0:d9d38ebc0f69 215 }
FrankWeissenborn 0:d9d38ebc0f69 216 //id suchen
FrankWeissenborn 0:d9d38ebc0f69 217 station1=strstr(station2+1,"id=\"");
FrankWeissenborn 0:d9d38ebc0f69 218 if(station1 != NULL)
FrankWeissenborn 0:d9d38ebc0f69 219 {
FrankWeissenborn 0:d9d38ebc0f69 220 station1 = station1 + strlen("id=\"");
FrankWeissenborn 0:d9d38ebc0f69 221 station2 = NULL;
FrankWeissenborn 0:d9d38ebc0f69 222 station2 = strstr(station1,"\"");
FrankWeissenborn 0:d9d38ebc0f69 223 if(station2 != NULL)
FrankWeissenborn 0:d9d38ebc0f69 224 {
FrankWeissenborn 0:d9d38ebc0f69 225 station2[0]=0x00;
FrankWeissenborn 0:d9d38ebc0f69 226 fprintf(fpout,"%s\r\n",station1);
FrankWeissenborn 0:d9d38ebc0f69 227 }
FrankWeissenborn 0:d9d38ebc0f69 228 }
FrankWeissenborn 0:d9d38ebc0f69 229
FrankWeissenborn 0:d9d38ebc0f69 230 cp=cp2+1;
FrankWeissenborn 0:d9d38ebc0f69 231 } else {
FrankWeissenborn 0:d9d38ebc0f69 232 //Kopieren
FrankWeissenborn 0:d9d38ebc0f69 233 strcpy(_buffer,cp);
FrankWeissenborn 0:d9d38ebc0f69 234 int x = (_buffer + _buffer_size) - cp - 1;
FrankWeissenborn 0:d9d38ebc0f69 235 int read_size = _buffer_size-(x-1);
FrankWeissenborn 0:d9d38ebc0f69 236 finished = (fgets(_buffer+x-1, read_size,fpin) == NULL);
FrankWeissenborn 0:d9d38ebc0f69 237 _buffer[_buffer_size-1] = 0x00;
FrankWeissenborn 0:d9d38ebc0f69 238 cp = _buffer;
FrankWeissenborn 0:d9d38ebc0f69 239 }
FrankWeissenborn 0:d9d38ebc0f69 240 }
FrankWeissenborn 0:d9d38ebc0f69 241
FrankWeissenborn 0:d9d38ebc0f69 242 }
FrankWeissenborn 0:d9d38ebc0f69 243 fclose(fpin);
FrankWeissenborn 0:d9d38ebc0f69 244 fclose(fpout);
FrankWeissenborn 0:d9d38ebc0f69 245 DEBUGOUT("Shoutcast: Parsing completed\r\n");
FrankWeissenborn 0:d9d38ebc0f69 246 return true;
FrankWeissenborn 0:d9d38ebc0f69 247 }
FrankWeissenborn 0:d9d38ebc0f69 248
FrankWeissenborn 0:d9d38ebc0f69 249 int Shoutcast::GetChannel(char* name, int length, int channelNumber)
FrankWeissenborn 0:d9d38ebc0f69 250 {
FrankWeissenborn 0:d9d38ebc0f69 251 DEBUGOUT("Shoutcast: GetChannel started\r\n");
FrankWeissenborn 0:d9d38ebc0f69 252 fpin = fopen(FILECHANNELMOD, "r");
FrankWeissenborn 0:d9d38ebc0f69 253 if (fpin == NULL) {
FrankWeissenborn 0:d9d38ebc0f69 254 error("Could not open file for write\n");
FrankWeissenborn 0:d9d38ebc0f69 255 }
FrankWeissenborn 0:d9d38ebc0f69 256 bool finished = false;
FrankWeissenborn 0:d9d38ebc0f69 257 int line = 0;
FrankWeissenborn 0:d9d38ebc0f69 258 char * delimiter;
FrankWeissenborn 0:d9d38ebc0f69 259
FrankWeissenborn 0:d9d38ebc0f69 260 while(!finished) {
FrankWeissenborn 0:d9d38ebc0f69 261 finished = (fgets(_buffer, _buffer_size-1, fpin) == NULL);
FrankWeissenborn 0:d9d38ebc0f69 262 DEBUGOUT("Shoutcast: GetChannel ReadLine %i\r\n",line);
FrankWeissenborn 0:d9d38ebc0f69 263 if(channelNumber == line)
FrankWeissenborn 0:d9d38ebc0f69 264 {
FrankWeissenborn 0:d9d38ebc0f69 265 DEBUGOUT("Shoutcast: GetChannel Line found\r\n");
FrankWeissenborn 0:d9d38ebc0f69 266 delimiter=strstr(_buffer,"<>");
FrankWeissenborn 0:d9d38ebc0f69 267 if(delimiter != NULL)
FrankWeissenborn 0:d9d38ebc0f69 268 {
FrankWeissenborn 0:d9d38ebc0f69 269 int i = 0;
FrankWeissenborn 0:d9d38ebc0f69 270 DEBUGOUT("Shoutcast: length %i\r\n",delimiter-_buffer);
FrankWeissenborn 0:d9d38ebc0f69 271 for(i = 0; (i<delimiter-_buffer) && (i<length-1); i++)
FrankWeissenborn 0:d9d38ebc0f69 272 {
FrankWeissenborn 0:d9d38ebc0f69 273 name[i] = _buffer[i];
FrankWeissenborn 0:d9d38ebc0f69 274 }
FrankWeissenborn 0:d9d38ebc0f69 275 DEBUGOUT("\r\n");
FrankWeissenborn 0:d9d38ebc0f69 276 name[i]=0x00;
FrankWeissenborn 0:d9d38ebc0f69 277 finished = true;
FrankWeissenborn 0:d9d38ebc0f69 278 }
FrankWeissenborn 0:d9d38ebc0f69 279 else
FrankWeissenborn 0:d9d38ebc0f69 280 {
FrankWeissenborn 0:d9d38ebc0f69 281 fclose(fpin);
FrankWeissenborn 0:d9d38ebc0f69 282 return 1;
FrankWeissenborn 0:d9d38ebc0f69 283 }
FrankWeissenborn 0:d9d38ebc0f69 284 }
FrankWeissenborn 0:d9d38ebc0f69 285 DEBUGOUT("Shoutcast: StringCopy ready\r\n");
FrankWeissenborn 0:d9d38ebc0f69 286 line++;
FrankWeissenborn 0:d9d38ebc0f69 287 }
FrankWeissenborn 0:d9d38ebc0f69 288 DEBUGOUT("Shoutcast: GetChannel completed\r\n");
FrankWeissenborn 0:d9d38ebc0f69 289
FrankWeissenborn 0:d9d38ebc0f69 290 fclose(fpin);
FrankWeissenborn 0:d9d38ebc0f69 291 return 0;
FrankWeissenborn 0:d9d38ebc0f69 292 }
FrankWeissenborn 0:d9d38ebc0f69 293
FrankWeissenborn 0:d9d38ebc0f69 294
FrankWeissenborn 0:d9d38ebc0f69 295 int Shoutcast::GetChannelId(int channelNumber)
FrankWeissenborn 0:d9d38ebc0f69 296 {
FrankWeissenborn 0:d9d38ebc0f69 297 DEBUGOUT("Shoutcast: GetChannelId started\r\n");
FrankWeissenborn 0:d9d38ebc0f69 298 fpin = fopen(FILECHANNELMOD, "r");
FrankWeissenborn 0:d9d38ebc0f69 299 if (fpin == NULL) {
FrankWeissenborn 0:d9d38ebc0f69 300 error("Could not open file for write\n");
FrankWeissenborn 0:d9d38ebc0f69 301 }
FrankWeissenborn 0:d9d38ebc0f69 302 bool finished = false;
FrankWeissenborn 0:d9d38ebc0f69 303 int line = 0;
FrankWeissenborn 0:d9d38ebc0f69 304 char * delimiter;
FrankWeissenborn 0:d9d38ebc0f69 305
FrankWeissenborn 0:d9d38ebc0f69 306 while(!finished) {
FrankWeissenborn 0:d9d38ebc0f69 307 finished = (fgets(_buffer, _buffer_size-1, fpin) == NULL);
FrankWeissenborn 0:d9d38ebc0f69 308 if(channelNumber == line)
FrankWeissenborn 0:d9d38ebc0f69 309 {
FrankWeissenborn 0:d9d38ebc0f69 310 DEBUGOUT("Shoutcast: GetChannelId Line found\r\n");
FrankWeissenborn 0:d9d38ebc0f69 311 delimiter=strstr(_buffer,"<>");
FrankWeissenborn 0:d9d38ebc0f69 312 int id = -1;
FrankWeissenborn 0:d9d38ebc0f69 313 if(delimiter != NULL)
FrankWeissenborn 0:d9d38ebc0f69 314 {
FrankWeissenborn 0:d9d38ebc0f69 315 id = atoi(delimiter+strlen("<>"));
FrankWeissenborn 0:d9d38ebc0f69 316 //id = 4;
FrankWeissenborn 0:d9d38ebc0f69 317 fclose(fpin);
FrankWeissenborn 0:d9d38ebc0f69 318 return id;
FrankWeissenborn 0:d9d38ebc0f69 319 }
FrankWeissenborn 0:d9d38ebc0f69 320 else
FrankWeissenborn 0:d9d38ebc0f69 321 {
FrankWeissenborn 0:d9d38ebc0f69 322 fclose(fpin);
FrankWeissenborn 0:d9d38ebc0f69 323 return -1;
FrankWeissenborn 0:d9d38ebc0f69 324 }
FrankWeissenborn 0:d9d38ebc0f69 325 }
FrankWeissenborn 0:d9d38ebc0f69 326 line++;
FrankWeissenborn 0:d9d38ebc0f69 327 }
FrankWeissenborn 0:d9d38ebc0f69 328 fclose(fpin);
FrankWeissenborn 0:d9d38ebc0f69 329 return -1;
FrankWeissenborn 0:d9d38ebc0f69 330 }
FrankWeissenborn 0:d9d38ebc0f69 331
FrankWeissenborn 0:d9d38ebc0f69 332 int Shoutcast::ParsePls() {
FrankWeissenborn 0:d9d38ebc0f69 333 DEBUGOUT("Shoutcast: start parsing pls\r\n");
FrankWeissenborn 0:d9d38ebc0f69 334
FrankWeissenborn 0:d9d38ebc0f69 335 fpin = fopen(FILEPLS, "r");
FrankWeissenborn 0:d9d38ebc0f69 336 if (fpin == NULL) {
FrankWeissenborn 0:d9d38ebc0f69 337 error("Could not open file for read\n");
FrankWeissenborn 0:d9d38ebc0f69 338 }
FrankWeissenborn 0:d9d38ebc0f69 339 fpout = fopen(FILEPLSMOD, "w");
FrankWeissenborn 0:d9d38ebc0f69 340 if (fpout == NULL) {
FrankWeissenborn 0:d9d38ebc0f69 341 error("Could not open file for write\n");
FrankWeissenborn 0:d9d38ebc0f69 342 }
FrankWeissenborn 0:d9d38ebc0f69 343 bool finished = false;
FrankWeissenborn 0:d9d38ebc0f69 344
FrankWeissenborn 0:d9d38ebc0f69 345 char * cp;
FrankWeissenborn 0:d9d38ebc0f69 346 char * cp2;
FrankWeissenborn 0:d9d38ebc0f69 347 IpAddr addr;
FrankWeissenborn 0:d9d38ebc0f69 348 while(!finished) {
FrankWeissenborn 0:d9d38ebc0f69 349 finished = (fgets(_buffer, _buffer_size-1, fpin) == NULL);
FrankWeissenborn 0:d9d38ebc0f69 350
FrankWeissenborn 0:d9d38ebc0f69 351 //suchen nach
FrankWeissenborn 0:d9d38ebc0f69 352 cp = strstr(_buffer,"=http://");
FrankWeissenborn 0:d9d38ebc0f69 353 if(cp!= NULL)
FrankWeissenborn 0:d9d38ebc0f69 354 {
FrankWeissenborn 0:d9d38ebc0f69 355 cp = cp +strlen("=http://");
FrankWeissenborn 0:d9d38ebc0f69 356 cp2=strstr(cp,":");
FrankWeissenborn 0:d9d38ebc0f69 357 if(cp2 != NULL)
FrankWeissenborn 0:d9d38ebc0f69 358 {
FrankWeissenborn 0:d9d38ebc0f69 359 cp2[0]=0x00;
FrankWeissenborn 0:d9d38ebc0f69 360 int dnserr = ResolveDNSRequest(&addr, cp);
FrankWeissenborn 0:d9d38ebc0f69 361
FrankWeissenborn 0:d9d38ebc0f69 362 if(dnserr != 0)
FrankWeissenborn 0:d9d38ebc0f69 363 {
FrankWeissenborn 0:d9d38ebc0f69 364 DEBUGOUT("Shoutcast: DNS Error - Parsing Pls\r\n");
FrankWeissenborn 0:d9d38ebc0f69 365 fclose(fpin);
FrankWeissenborn 0:d9d38ebc0f69 366 fclose(fpout);
FrankWeissenborn 0:d9d38ebc0f69 367
FrankWeissenborn 0:d9d38ebc0f69 368 DEBUGOUT("Shoutcast: end parsing pls-ERROR");
FrankWeissenborn 0:d9d38ebc0f69 369 return -1;
FrankWeissenborn 0:d9d38ebc0f69 370 }
FrankWeissenborn 0:d9d38ebc0f69 371 int port = atoi(cp2+1);
FrankWeissenborn 0:d9d38ebc0f69 372 fprintf(fpout, "%d %d %d %d %d\r\n",
FrankWeissenborn 0:d9d38ebc0f69 373 addr[0],addr[1],addr[2],addr[3],port);
FrankWeissenborn 0:d9d38ebc0f69 374 maxAddress++;
FrankWeissenborn 0:d9d38ebc0f69 375 }
FrankWeissenborn 0:d9d38ebc0f69 376 }
FrankWeissenborn 0:d9d38ebc0f69 377 _buffer[_buffer_size-1] = 0x00;
FrankWeissenborn 0:d9d38ebc0f69 378 }
FrankWeissenborn 0:d9d38ebc0f69 379 fclose(fpin);
FrankWeissenborn 0:d9d38ebc0f69 380 fclose(fpout);
FrankWeissenborn 0:d9d38ebc0f69 381
FrankWeissenborn 0:d9d38ebc0f69 382 DEBUGOUT("Shoutcast: end parsing pls\r\n");
FrankWeissenborn 0:d9d38ebc0f69 383 return 0;
FrankWeissenborn 0:d9d38ebc0f69 384 }
FrankWeissenborn 0:d9d38ebc0f69 385 int Shoutcast::ResolveDNSRequest(IpAddr* addr, char * url){
FrankWeissenborn 0:d9d38ebc0f69 386 DNSRequest * request = new DNSRequest();
FrankWeissenborn 0:d9d38ebc0f69 387 request->setOnReply(this, &Shoutcast::onReply);
FrankWeissenborn 0:d9d38ebc0f69 388
FrankWeissenborn 0:d9d38ebc0f69 389 completed_dns=0;
FrankWeissenborn 0:d9d38ebc0f69 390
FrankWeissenborn 0:d9d38ebc0f69 391
FrankWeissenborn 0:d9d38ebc0f69 392 DNSRequestErr r = request->resolve(url);
FrankWeissenborn 0:d9d38ebc0f69 393 if (0!=r) {
FrankWeissenborn 0:d9d38ebc0f69 394 request->close();
FrankWeissenborn 0:d9d38ebc0f69 395 return 1;
FrankWeissenborn 0:d9d38ebc0f69 396
FrankWeissenborn 0:d9d38ebc0f69 397 }
FrankWeissenborn 0:d9d38ebc0f69 398 while (0==completed_dns) {
FrankWeissenborn 0:d9d38ebc0f69 399 Net::poll();
FrankWeissenborn 0:d9d38ebc0f69 400 }
FrankWeissenborn 0:d9d38ebc0f69 401
FrankWeissenborn 0:d9d38ebc0f69 402 if(completed_dns == -1) {
FrankWeissenborn 0:d9d38ebc0f69 403 return 1;
FrankWeissenborn 0:d9d38ebc0f69 404 }
FrankWeissenborn 0:d9d38ebc0f69 405 request->getResult(addr);
FrankWeissenborn 0:d9d38ebc0f69 406 request->close();
FrankWeissenborn 0:d9d38ebc0f69 407 return 0;
FrankWeissenborn 0:d9d38ebc0f69 408 }
FrankWeissenborn 0:d9d38ebc0f69 409
FrankWeissenborn 0:d9d38ebc0f69 410 int Shoutcast::GetAddressData(IpAddr* address, int* port, int addressNumber) {
FrankWeissenborn 0:d9d38ebc0f69 411
FrankWeissenborn 0:d9d38ebc0f69 412 DEBUGOUT("Shoutcast: start get address data\r\n");
FrankWeissenborn 0:d9d38ebc0f69 413 fpin = fopen(FILEPLSMOD, "r");
FrankWeissenborn 0:d9d38ebc0f69 414 bool finished = false;
FrankWeissenborn 0:d9d38ebc0f69 415 int line = 0;
FrankWeissenborn 0:d9d38ebc0f69 416
FrankWeissenborn 0:d9d38ebc0f69 417 while(!finished) {
FrankWeissenborn 0:d9d38ebc0f69 418 finished = (fgets(_buffer, _buffer_size-1, fpin) == NULL);
FrankWeissenborn 0:d9d38ebc0f69 419 if(line == addressNumber){
FrankWeissenborn 0:d9d38ebc0f69 420 int ip1 = 0;int ip2 = 0;int ip3 = 0;int ip4 = 0;int p = 0;
FrankWeissenborn 0:d9d38ebc0f69 421 sscanf (_buffer,"%d %d %d %d %d",&ip1,&ip2,&ip3,&ip4,&p);
FrankWeissenborn 0:d9d38ebc0f69 422 DEBUGOUT("IpGet:%d %d %d %d:%d\r\n",ip1,ip2,ip3,ip4,p);
FrankWeissenborn 0:d9d38ebc0f69 423 IpAddr server = IpAddr(ip1,ip2,ip3,ip4);
FrankWeissenborn 0:d9d38ebc0f69 424 DEBUGOUT("IpGet:%d.%d.%d.%d:%d\r\n",server[0],server[1],server[2],server[3],p);
FrankWeissenborn 0:d9d38ebc0f69 425 *address = server;
FrankWeissenborn 0:d9d38ebc0f69 426 *port = p;
FrankWeissenborn 0:d9d38ebc0f69 427 finished = true;
FrankWeissenborn 0:d9d38ebc0f69 428 }
FrankWeissenborn 0:d9d38ebc0f69 429 line++;
FrankWeissenborn 0:d9d38ebc0f69 430 }
FrankWeissenborn 0:d9d38ebc0f69 431 DEBUGOUT("Shoutcast: end get address data\r\n");
FrankWeissenborn 0:d9d38ebc0f69 432 return 0;
FrankWeissenborn 0:d9d38ebc0f69 433 }
FrankWeissenborn 0:d9d38ebc0f69 434
FrankWeissenborn 0:d9d38ebc0f69 435 void Shoutcast::onReply(DNSReply reply) {
FrankWeissenborn 0:d9d38ebc0f69 436 if (reply==DNS_FOUND)
FrankWeissenborn 0:d9d38ebc0f69 437 completed_dns=1;
FrankWeissenborn 0:d9d38ebc0f69 438 else
FrankWeissenborn 0:d9d38ebc0f69 439 completed_dns=-1;
FrankWeissenborn 0:d9d38ebc0f69 440 };
FrankWeissenborn 0:d9d38ebc0f69 441
FrankWeissenborn 0:d9d38ebc0f69 442 int Shoutcast::GetNextAddress(IpAddr* address, int* port)
FrankWeissenborn 0:d9d38ebc0f69 443 {
FrankWeissenborn 0:d9d38ebc0f69 444 if(currentAddress < maxAddress - 1 )
FrankWeissenborn 0:d9d38ebc0f69 445 {
FrankWeissenborn 0:d9d38ebc0f69 446 currentAddress++;
FrankWeissenborn 0:d9d38ebc0f69 447 }
FrankWeissenborn 0:d9d38ebc0f69 448 else
FrankWeissenborn 0:d9d38ebc0f69 449 {
FrankWeissenborn 0:d9d38ebc0f69 450 currentAddress = 0;
FrankWeissenborn 0:d9d38ebc0f69 451 }
FrankWeissenborn 0:d9d38ebc0f69 452 GetAddressData(address,port,currentAddress);
FrankWeissenborn 0:d9d38ebc0f69 453 }
FrankWeissenborn 0:d9d38ebc0f69 454 int Shoutcast::GetCurrAddress(IpAddr* address, int* port)
FrankWeissenborn 0:d9d38ebc0f69 455 {
FrankWeissenborn 0:d9d38ebc0f69 456 GetAddressData(address,port,currentAddress);
FrankWeissenborn 0:d9d38ebc0f69 457 }
FrankWeissenborn 0:d9d38ebc0f69 458 int Shoutcast::GetPrevAddress(IpAddr* address, int* port)
FrankWeissenborn 0:d9d38ebc0f69 459 {
FrankWeissenborn 0:d9d38ebc0f69 460 if(currentAddress > 0 )
FrankWeissenborn 0:d9d38ebc0f69 461 {
FrankWeissenborn 0:d9d38ebc0f69 462 currentAddress--;
FrankWeissenborn 0:d9d38ebc0f69 463 }
FrankWeissenborn 0:d9d38ebc0f69 464 else
FrankWeissenborn 0:d9d38ebc0f69 465 {
FrankWeissenborn 0:d9d38ebc0f69 466 currentAddress = maxAddress - 1;
FrankWeissenborn 0:d9d38ebc0f69 467 }
FrankWeissenborn 0:d9d38ebc0f69 468 GetAddressData(address,port,currentAddress);
FrankWeissenborn 0:d9d38ebc0f69 469 }