示例#1
0
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]);
}
示例#2
0
文件: Job.cpp 项目: carriercomm/haiku
status_t
Job::_Launch(const char* signature, entry_ref* ref, int argCount,
	const char* const* args, const char** environment)
{
	thread_id mainThread = -1;
	status_t result = BRoster::Private().Launch(signature, ref, NULL, argCount,
		args, environment, &fTeam, &mainThread, true);

	if (result == B_OK) {
		result = _CreateAndTransferPorts();

		if (result == B_OK)
			resume_thread(mainThread);
		else
			kill_thread(mainThread);
	}

	_SetLaunchStatus(result);
	return result;
}