/*! Gets the environment by evaluating the source files, and move that environment to the static environment. When this method returns, the source files list will be empty. */ void BaseJob::ResolveSourceFiles() { if (fSourceFiles.IsEmpty()) return; GetSourceFilesEnvironment(fEnvironment); fSourceFiles.MakeEmpty(); }
status_t Job::Launch() { // Build environment std::vector<const char*> environment; for (const char** variable = (const char**)environ; variable[0] != NULL; variable++) { environment.push_back(variable[0]); } if (Target() != NULL) _AddStringList(environment, Target()->Environment()); _AddStringList(environment, Environment()); // Resolve source files BStringList sourceFilesEnvironment; GetSourceFilesEnvironment(sourceFilesEnvironment); _AddStringList(environment, sourceFilesEnvironment); environment.push_back(NULL); if (fArguments.IsEmpty()) { // Launch by signature BString signature("application/"); signature << Name(); return _Launch(signature.String(), NULL, 0, NULL, &environment[0]); } // Build argument vector entry_ref ref; status_t status = get_ref_for_path( Utility::TranslatePath(fArguments.StringAt(0).String()), &ref); if (status != B_OK) { _SetLaunchStatus(status); return status; } std::vector<BString> strings; std::vector<const char*> args; size_t count = fArguments.CountStrings() - 1; if (count > 0) { for (int32 i = 1; i < fArguments.CountStrings(); i++) { strings.push_back(Utility::TranslatePath(fArguments.StringAt(i))); args.push_back(strings.back()); } args.push_back(NULL); } // Launch via entry_ref return _Launch(NULL, &ref, count, &args[0], &environment[0]); }