Beispiel #1
0
void ui_menu_file_selector::populate()
{
    zippath_directory *directory = NULL;
    file_error err = FILERR_NONE;
    const osd_directory_entry *dirent;
    const file_selector_entry *entry;
    const file_selector_entry *selected_entry = NULL;
    int i;
    const char *volume_name;
    const char *path = current_directory;

    /* open the directory */
    err = zippath_opendir(path, &directory);
    if (err != FILERR_NONE)
        goto done;

    /* clear out the menu entries */
    entrylist = NULL;

    if (has_empty)
    {
        /* add the "[empty slot]" entry */
        append_entry(SELECTOR_ENTRY_TYPE_EMPTY, NULL, NULL);
    }

    if (has_create)
    {
        /* add the "[create]" entry */
        append_entry(SELECTOR_ENTRY_TYPE_CREATE, NULL, NULL);
    }

    if (has_softlist)
        /* add the "[software list]" entry */
        append_entry(SELECTOR_ENTRY_TYPE_SOFTWARE_LIST, NULL, NULL);

    /* add the drives */
    i = 0;
    while((volume_name = osd_get_volume_name(i))!=NULL)
    {
        append_entry(SELECTOR_ENTRY_TYPE_DRIVE,
                     volume_name, volume_name);
        i++;
    }

    /* build the menu for each item */
    while((dirent = zippath_readdir(directory)) != NULL)
    {
        /* append a dirent entry */
        entry = append_dirent_entry(dirent);

        if (entry != NULL)
        {
            /* set the selected item to be the first non-parent directory or file */
            if ((selected_entry == NULL) && strcmp(dirent->name, ".."))
                selected_entry = entry;

            /* do we have to select this file? */
            if (!mame_stricmp(current_file, dirent->name))
                selected_entry = entry;
        }
    }

    /* append all of the menu entries */
    for (entry = entrylist; entry != NULL; entry = entry->next)
        append_entry_menu_item(entry);

    /* set the selection (if we have one) */
    if (selected_entry != NULL)
        set_selection((void *) selected_entry);

    /* set up custom render proc */
    customtop = ui_get_line_height(machine()) + 3.0f * UI_BOX_TB_BORDER;

done:
    if (directory != NULL)
        zippath_closedir(directory);
}
Beispiel #2
0
void ui_menu_file_selector::populate()
{
	zippath_directory *directory = NULL;
	file_error err;
	const osd_directory_entry *dirent;
	const file_selector_entry *entry;
	const file_selector_entry *selected_entry = NULL;
	int i;
	const char *volume_name;
	const char *path = m_current_directory.c_str();

	// open the directory
	err = zippath_opendir(path, &directory);

	// clear out the menu entries
	m_entrylist = NULL;

	if (m_has_empty)
	{
		// add the "[empty slot]" entry
		append_entry(SELECTOR_ENTRY_TYPE_EMPTY, NULL, NULL);
	}

	if (m_has_create)
	{
		// add the "[create]" entry
		append_entry(SELECTOR_ENTRY_TYPE_CREATE, NULL, NULL);
	}

	if (m_has_softlist)
	{
		// add the "[software list]" entry
		entry = append_entry(SELECTOR_ENTRY_TYPE_SOFTWARE_LIST, NULL, NULL);
		selected_entry = entry;
	}

	// add the drives
	i = 0;
	while((volume_name = osd_get_volume_name(i))!=NULL)
	{
		append_entry(SELECTOR_ENTRY_TYPE_DRIVE,
			volume_name, volume_name);
		i++;
	}

	// build the menu for each item
	if (err == FILERR_NONE)
	{
		while((dirent = zippath_readdir(directory)) != NULL)
		{
			// append a dirent entry
			entry = append_dirent_entry(dirent);

			if (entry != NULL)
			{
				// set the selected item to be the first non-parent directory or file
				if ((selected_entry == NULL) && strcmp(dirent->name, ".."))
					selected_entry = entry;

				// do we have to select this file?
				if (!core_stricmp(m_current_file.c_str(), dirent->name))
					selected_entry = entry;
			}
		}
	}

	// append all of the menu entries
	for (entry = m_entrylist; entry != NULL; entry = entry->next)
		append_entry_menu_item(entry);

	// set the selection (if we have one)
	if (selected_entry != NULL)
		set_selection((void *) selected_entry);

	// set up custom render proc
	customtop = machine().ui().get_line_height() + 3.0f * UI_BOX_TB_BORDER;

	if (directory != NULL)
		zippath_closedir(directory);
}
Beispiel #3
0
void node_testzippath(xml_data_node *node)
{
	xml_attribute_node *attr_node;
	xml_data_node *first_child_node;
	xml_data_node *child_node;
	const char *path;
	const char *plus;
	astring *apath = NULL;
	zippath_directory *directory = NULL;
	const osd_directory_entry *dirent;
	const char *type_string;
	file_error err;
	UINT64 size;
	mess_pile pile;
	core_file *file = NULL;

	pile_init(&pile);

	/* name the test case */
	report_testcase_begin("zippath");

	/* retrieve path */
	attr_node = xml_get_attribute(node, "path");
	path = (attr_node != NULL) ? attr_node->value : "";

	/* retrieve 'plus' - for testing zippath_combine */
	attr_node = xml_get_attribute(node, "plus");
	if (attr_node != NULL)
	{
		plus = attr_node->value;
		apath = zippath_combine(astring_alloc(), path, plus);
		report_message(MSG_INFO, "Testing ZIP Path '%s' + '%s' ==> '%s'", path, plus, astring_c(apath));
	}
	else
	{
		apath = astring_cpyc(astring_alloc(), path);
		report_message(MSG_INFO, "Testing ZIP Path '%s'", astring_c(apath));
	}

	/* try doing a file compare */
	messtest_get_data(node, &pile);
	if (pile_size(&pile) > 0)
	{
		err = zippath_fopen(astring_c(apath), OPEN_FLAG_READ, &file, NULL);
		if (err != FILERR_NONE)
		{
			report_message(MSG_FAILURE, "Error %d opening file", (int) err);
			goto done;
		}

		if (pile_size(&pile) != core_fsize(file))
		{
			report_message(MSG_FAILURE, "Expected file to be of length %d, instead got %d", (int) pile_size(&pile), (int) core_fsize(file));
			goto done;
		}

		if (memcmp(pile_getptr(&pile), core_fbuffer(file), pile_size(&pile)))
		{
			report_message(MSG_FAILURE, "File sizes match, but contents do not");
			goto done;
		}
	}

	/* try doing a directory listing */
	first_child_node = xml_get_sibling(node->child, "entry");
	if (first_child_node != NULL)
	{
		err = zippath_opendir(astring_c(apath), &directory);
		if (err != FILERR_NONE)
		{
			report_message(MSG_FAILURE, "Error %d opening directory", (int) err);
			goto done;
		}

		/* read each directory entry */
		while((dirent = zippath_readdir(directory)) != NULL)
		{
			/* find it in the list */
			for (child_node = first_child_node; child_node != NULL; child_node = xml_get_sibling(child_node->next, "entry"))
			{
				attr_node = xml_get_attribute(child_node, "name");
				if ((attr_node != NULL) && !strcmp(attr_node->value, dirent->name))
					break;
			}

			/* did we find the node? */
			if (child_node != NULL)
			{
				/* check dirent type */
				attr_node = xml_get_attribute(child_node, "type");
				if (attr_node != NULL)
				{
					type_string = dir_entry_type_string(dirent->type);
					if (mame_stricmp(attr_node->value, type_string))
						report_message(MSG_FAILURE, "Expected '%s' to be '%s', but instead got '%s'", dirent->name, attr_node->value, type_string);
				}

				/* check size */
				attr_node = xml_get_attribute(child_node, "size");
				if (attr_node != NULL)
				{
					size = atoi(attr_node->value);
					if (size != dirent->size)
						report_message(MSG_FAILURE, "Expected '%s' to be of size '%ld', but instead got '%ld'", dirent->name, (long) size, (long) dirent->size);
				}
			}
			else
			{
				report_message(MSG_FAILURE, "Unexpected directory entry '%s'", dirent->name);
			}
		}
	}

done:
	pile_delete(&pile);
	if (apath != NULL)
		astring_free(apath);
	if (file != NULL)
		core_fclose(file);
	if (directory != NULL)
		zippath_closedir(directory);
}