Committer:
FrankWeissenborn
Date:
Sun Jan 30 21:33:12 2011 +0000
Revision:
7:f652d1e054e9
Parent:
6:be954c212733
Added: GetPath Problem: Memory leak (after 5-6 tune in)

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