Committer:
FrankWeissenborn
Date:
Fri Jan 28 11:48:49 2011 +0000
Revision:
5:d5d16fd31139
Parent:
4:520664d73063
Child:
6:be954c212733
debug: abort after parsing one ip-address

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