int M3UStreamDownload(STREAM *ManifestCon, const char *URL, const char *Title) { STREAM *Con=NULL; char *Tempstr=NULL, *BasePath=NULL, *Line=NULL; const char *ptr; ListNode *Segments, *Curr; int result; double BytesRead=0; Segments=ListCreate(); ptr=strrchr(URL, '/'); if (ptr) { BasePath=CopyStrLen(BasePath, URL, ptr - URL); Line=STREAMReadLine(Line,ManifestCon); while (Line) { StripLeadingWhitespace(Line); StripTrailingWhitespace(Line); if (*Line != '#') { Tempstr=MCopyStr(Tempstr, BasePath, "/", Line, NULL); ListAddItem(Segments, CopyStr(NULL, Tempstr)); } Line=STREAMReadLine(Line,ManifestCon); } OpenOutputFiles(Title, URL, &BytesRead); Tempstr=SetStrLen(Tempstr,BUFSIZ); Curr=ListGetNext(Segments); while (Curr) { Con=ConnectAndRetryUntilDownload(Curr->Item, 0, 0); if (Con) { TransferItem(Con, Title, URL, "m3u8-stream", 0, 0, &BytesRead, FALSE); STREAMClose(Con); } Curr=ListGetNext(Curr); } CloseOutputFiles(); } ListDestroy(Segments, DestroyString); DestroyString(Tempstr); DestroyString(BasePath); DestroyString(Line); }
int DownloadStream(char *URL, char *Title, ListNode *Items, int Flags) { STREAM *Con=NULL, *S=NULL; ListNode *Curr; char *Tempstr=NULL, *ptr; char *Token=NULL; int Port; double len=0, ApproxDocSize=0, BytesRead=0; Curr=ListGetNext(Items); if (Flags & (FLAG_TEST | FLAG_TEST_SITES) ) { if (Flags & FLAG_TEST) fprintf(stderr,"TEST MODE: would have downloaded '%s' url=%s\n",Title,Curr->Item); if (Curr) return(TRUE); return(FALSE); } OpenOutputFiles(Title,URL,&BytesRead); while (Curr) { if (strncmp((char *) Curr->Item,"http:",5)==0) Tempstr=CopyStr(Tempstr,(char *) Curr->Item); else { Tempstr=CopyStr(Tempstr,URL); ptr=strrchr(Tempstr,'/'); if (ptr) *ptr='\0'; Tempstr=MCatStr(Tempstr,"/",(char *) Curr->Item,NULL); } Con=ConnectAndRetryUntilDownload(Tempstr, 0, 0); if (Con) { ptr=STREAMGetValue(Con,"HTTP:content-length"); if (ptr) len=atof(ptr); if (ApproxDocSize==0) ApproxDocSize=ListSize(Items) * len; TransferItem(Con, Title, Curr->Item, "", len, ApproxDocSize, &BytesRead, BytesRead==0); STREAMClose(Con); } Curr=ListGetNext(Curr); } CloseOutputFiles(); DestroyString(Tempstr); DestroyString(Token); return(TRUE); }
int main(int argc, char *argv[]) { Entity et; int error, startupflags, i; char *restartname, name[128]; #ifdef PARALLEL const ParCommand end = EXIT; #endif InitVarTable(); #ifdef PARALLEL IsMaster(); if (master) { printf("MetPhoMod Rel. 2.2\n" SYSTEM " parallel Version - " DATE "\n\n"); #else printf("MetPhoMod Rel. 2.2\n" SYSTEM " sequential Version - " DATE "\n\n"); #endif if (argc > 1 && (!strcmp(argv[1], "-help") || !strcmp(argv[1], "-h"))) { McInterface::modmanager.Init1(); PrintHelp(argc - 2, argv + 2); exit (0); } if (argc > 1 && !strcmp(argv[1], "-genchem")) { if (argc != 3) goto instant_help; GenerateSpecialChem(argv[2]); exit (0); } startupflags = AnalizeOptions(&argc, argv, &restartname); if (argc != 2) { instant_help : printf("Usage : meteochem [-RESTART restart-file [-REOPEN]] [-noexcpt] [-syntax] \\\n" " [-nooutput] [-debug] [-sequential] inpfile\n" "or : meteochem (-h | -help) [keyword]\n" "or : meteochem -genchem chemfile\n"); return (1); } McInterface::modmanager.Init1(); if (startupflags & SYNTAX_ONLY) { if (ParseInput(argv[1])) { printf("Errors in Input-File\n"); return (1); } else { printf("the input-file seems to be OK!\n"); return (0); } } #ifdef PARALLEL if (startupflags & SEQUENTIAL) { parallel = FALSE; master = TRUE; leftest = rightest = TRUE; } } if (master) { #endif if (ParseInput(argv[1])) { fprintf(stderr, "Errors parsing Input-File. I don't start the calculation.\n"); return (1); } plausible = TRUE; if (!(startupflags & NOEXCPT)) InstallFpeHandler(); tinc = chemtinc = tincmax; actime = chemtime = tstart; #ifdef PARALLEL if (!parallel) printf("\n\n!!! Using sequential mode !!!\n\n"); else McInterface::modmanager.CheckIfReadyForParallel(); } InitializeWorkers(argv[0], startupflags & DEBUG_WORKERS); if (parallel && !master) { if (!(startupflags & NOEXCPT)) InstallFpeHandler(); McInterface::modmanager.Init1(); ReadDataFromMaster(); InitializeData(); plausible = TRUE; tinc = chemtinc = tincmax; actime = chemtime = tstart; } if (parallel && master) { printf("Sending Data to workers...\n"); SendDataToWorkers(); InitializeData(); } if (!parallel) #endif InitializeData(); for (et = maxentity; et--; ) if (g[et]) CalculateLayerAverage(g[et], pstat, avg+et*nz); else memset(avg+et*nz, 0, nz*sizeof(double)); CalcMeanHydrostaticPressure(); #ifdef PARALLEL if (!parallel || !master) { #endif SetAvgMountains(); SetBoundary(maxentity); /* CalcAllKm(); */ #ifdef PARALLEL } if (parallel && !master) { if (GetRestartName(name)) { if (!(ReadFullDump(name, (startupflags & REOPEN)) && actime <= tend)) { printf("Error : Restart-file not found\n"); plausible = FALSE; } } } else { if (parallel) SendRestartName((startupflags & RESTART) ? restartname : NULL); #endif if (startupflags & RESTART) { if (!ReadFullDump(restartname, (startupflags & REOPEN))) { printf("Error : Restart-file not found\n"); return (1); } } else if (startupflags & REOPEN) { printf("Error: -REOPEN can only be used together with -RESTART\n"); return (1); } #ifdef PARALLEL } if (master) { #endif if (!(startupflags & NO_OUTPUT)) { printf("Opening output-Files..."); if (OpenOutputFiles(argv[1], (startupflags & RESTART) && (startupflags & REOPEN))) { printf("\nExecution abortet\n"); exit (1); } CreateDomainFiles((startupflags & RESTART) && (startupflags & REOPEN)); } InstallSignalHandler(); printf("\n"); #ifdef PARALLEL if (parallel) printf("Starting calculation...\n"); } #else printf("Starting calculation...\n"); #endif #if PARALLEL if (!parallel || master) #endif if (!(startupflags & NO_OUTPUT)) { WriteOutData(tstart, FALSE); WriteToDomainFiles(tstart); } /* TestChemicals("Start"); */ #if PARALLEL if (parallel) if (master) MastersLoop(startupflags); else WorkersLoop(startupflags); else #endif SequentialLoop(startupflags); printf("Closing output-Files...\n"); if (plausible) printf("Calculation terminated successfully\n\n"); else { if (!(startupflags & NO_OUTPUT)) WriteOutData(actime, TRUE); printf("Calculation stopped because of inplausibilities!\n\n"); } if (!(startupflags & NO_OUTPUT)) { CloseOutputFiles(); CloseDomainFiles(); } #ifdef PARALLEL if (parallel) { pvm_initsend(PvmDataRaw); pvm_pkint((int *)&end, 1, 1); SendCommand(); pvm_exit(); } #endif return (0); }