int isValidRemoteUtf8Url(char * utf8url) { int ret = 0; char * temp; switch(isRemoteUrl(utf8url)) { case 1: ret = 1; temp = utf8url; while(*temp) { if((*temp >= 'a' && *temp <= 'z') || (*temp >= 'A' && *temp <= 'Z') || (*temp >= '0' && *temp <= '9') || *temp == '$' || *temp == '-' || *temp == '.' || *temp == '+' || *temp == '!' || *temp == '*' || *temp == '\'' || *temp == '(' || *temp == ')' || *temp == ',' || *temp == '%' || *temp == '/' || *temp == ':' || *temp == '?' || *temp == ';' || *temp == '&' || *temp == '=') { } else { ret = 1; break; } temp++; } break; } return ret; }
void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) { int ret; InputStream inStream; InputPlugin * plugin = NULL; char * path; if(isRemoteUrl(pc->utf8url)) { path = utf8StrToLatin1Dup(pc->utf8url); } else path = strdup(rmp2amp(utf8ToFsCharset(pc->utf8url))); if(!path) { dc->error = DECODE_ERROR_FILE; dc->state = DECODE_STATE_STOP; dc->start = 0; return; } copyMpdTagToOutputBuffer(cb, NULL); strncpy(dc->utf8url, pc->utf8url, MAXPATHLEN); dc->utf8url[MAXPATHLEN] = '\0'; if(openInputStream(&inStream, path) < 0) { dc->error = DECODE_ERROR_FILE; dc->state = DECODE_STATE_STOP; dc->start = 0; free(path); return; } dc->seekable = inStream.seekable; dc->state = DECODE_STATE_START; dc->start = 0; while(!inputStreamAtEOF(&inStream) && bufferInputStream(&inStream) < 0 && !dc->stop) { /* sleep so we don't consume 100% of the cpu */ // fprintf(stderr,"In decode.c decodeParent decode start func\r\n"); // my_usleep(1000); } if(dc->stop) { dc->state = DECODE_STATE_STOP; dc->stop = 0; free(path); return; } /*if(inStream.metaName) { MpdTag * tag = newMpdTag(); tag->name = strdup(inStream.metaName); copyMpdTagToOutputBuffer(cb, tag); freeMpdTag(tag); }*/ /* reset Metadata in OutputBuffer */ ret = DECODE_ERROR_UNKTYPE; if(isRemoteUrl(dc->utf8url)) { cb->acceptMetadata = 1; plugin = getInputPluginFromMimeType(inStream.mime); if(plugin == NULL) { plugin = getInputPluginFromSuffix( getSuffix(dc->utf8url)); } /* this is needed for bastard streams that don't have a suffix or set the mimeType */ if(plugin == NULL) { plugin = getInputPluginFromName("mp3"); } if(plugin && (plugin->streamTypes & INPUT_PLUGIN_STREAM_URL) && plugin->streamDecodeFunc) { ret = plugin->streamDecodeFunc(cb, dc, &inStream); } } else { cb->acceptMetadata = 0; plugin = getInputPluginFromSuffix(getSuffix(dc->utf8url)); if(plugin && (plugin->streamTypes && INPUT_PLUGIN_STREAM_FILE)) { if(plugin->streamDecodeFunc) { ret = plugin->streamDecodeFunc(cb, dc, &inStream); } else if(plugin->fileDecodeFunc) { closeInputStream(&inStream); ret = plugin->fileDecodeFunc(cb, dc, path); } } } if(ret<0 || ret == DECODE_ERROR_UNKTYPE) { strncpy(pc->erroredUrl, dc->utf8url, MAXPATHLEN); pc->erroredUrl[MAXPATHLEN] = '\0'; if(ret != DECODE_ERROR_UNKTYPE) dc->error = DECODE_ERROR_FILE; else { dc->error = DECODE_ERROR_UNKTYPE; closeInputStream(&inStream); } dc->stop = 0; dc->state = DECODE_STATE_STOP; } free(path); }
int loadPlaylist(FILE * fp, char * utf8file) { FILE * fileP; char s[MAXPATHLEN+1]; int slength = 0; char * temp = strdup(utf8ToFsCharset(utf8file)); char * rfile = malloc(strlen(temp)+strlen(".")+ strlen(PLAYLIST_FILE_SUFFIX)+1); char * actualFile; char * parent = parentPath(temp); int parentlen = strlen(parent); char * erroredFile = NULL; int tempInt; int commentCharFound = 0; strcpy(rfile,temp); strcat(rfile,"."); strcat(rfile,PLAYLIST_FILE_SUFFIX); free(temp); if((actualFile = rpp2app(rfile)) && isPlaylist(actualFile)) free(rfile); else { free(rfile); commandError(fp, ACK_ERROR_NO_EXIST, "playlist \"%s\" not found", utf8file); return -1; } while(!(fileP = fopen(actualFile,"r")) && errno==EINTR); if(fileP==NULL) { commandError(fp, ACK_ERROR_SYSTEM, "problems opening file \"%s\"", utf8file); return -1; } while((tempInt = fgetc(fileP))!=EOF) { s[slength] = tempInt; if(s[slength]=='\n' || s[slength]=='\0') { commentCharFound = 0; s[slength] = '\0'; if(s[0]==PLAYLIST_COMMENT) { commentCharFound = 1; } if(strncmp(s,musicDir,strlen(musicDir))==0) { strcpy(s,&(s[strlen(musicDir)])); } else if(parentlen) { temp = strdup(s); memset(s,0,MAXPATHLEN+1); strcpy(s,parent); strncat(s,"/",MAXPATHLEN-parentlen); strncat(s,temp,MAXPATHLEN-parentlen-1); if(strlen(s)>=MAXPATHLEN) { commandError(fp, ACK_ERROR_PLAYLIST_LOAD, "\"%s\" too long", temp); free(temp); while(fclose(fileP) && errno==EINTR); if(erroredFile) free(erroredFile); return -1; } free(temp); } slength = 0; temp = fsCharsetToUtf8(s); if(!temp) continue; temp = strdup(temp); if(commentCharFound && !getSongFromDB(temp) && !isRemoteUrl(temp)) { free(temp); continue; } if((addToPlaylist(stderr,temp))<0) { if(!erroredFile) erroredFile = strdup(temp); } free(temp); } else if(slength==MAXPATHLEN) { s[slength] = '\0'; commandError(fp, ACK_ERROR_PLAYLIST_LOAD, "line in \"%s\" is too long", utf8file); ERROR("line \"%s\" in playlist \"%s\" is too long\n", s, utf8file); while(fclose(fileP) && errno==EINTR); if(erroredFile) free(erroredFile); return -1; } else if(s[slength]!='\r') slength++; } while(fclose(fileP) && errno==EINTR); if(erroredFile) { commandError(fp, ACK_ERROR_PLAYLIST_LOAD, "can't add file \"%s\"", erroredFile); free(erroredFile); return -1; } return 0; }