static int load_or_open_zip_iterate(unsigned action)
{
   char msg[PATH_MAX_LENGTH];
   menu_handle_t *menu = menu_driver_get_ptr();

   if (!menu)
      return -1;

   snprintf(msg, sizeof(msg), "Opening compressed file\n"
         " \n"

         " - OK to open as Folder\n"
         " - Cancel/Back to Load \n");

   menu_driver_render_messagebox(msg);

   switch (action)
   {
      case MENU_ACTION_OK:
         archive_open();
         break;
      case MENU_ACTION_CANCEL:
         archive_load();
         break;
   }

   return 0;
}
예제 #2
0
static VALUE rb_libarchive_writer_s_open0(int (*archive_open)(struct rb_libarchive_archive_container *, void *), void *arg, int compression, int format, const char *cmd) {
  VALUE writer;
  struct rb_libarchive_archive_container *p;
  int r;
  writer = rb_funcall(rb_cArchiveWriter, rb_intern("new"), 0);
  Data_Get_Struct(writer, struct rb_libarchive_archive_container, p);

  if ((p->ar = archive_write_new()) == NULL) {
    rb_raise(rb_eArchiveError, "Open writer failed: %s", strerror(errno));
  }

  if (cmd != NULL) {
    r = archive_write_set_compression_program(p->ar,  cmd);
  } else {
    r = archive_write_set_compression(p->ar, compression);
  }

  if (r != ARCHIVE_OK) {
    char error_string[BUFSIZ];
    archive_copy_error_string(p->ar, error_string, BUFSIZ);
    rb_libarchive_writer_close0(p);
    rb_raise(rb_eArchiveError, "Set compression failed: %s", error_string);
  }

  if (archive_write_set_format(p->ar, format) != ARCHIVE_OK) {
    char error_string[BUFSIZ];
    archive_copy_error_string(p->ar, error_string, BUFSIZ);
    rb_libarchive_writer_close0(p);
    rb_raise(rb_eArchiveError, "Set format failed: %s", error_string);
  }

  if (archive_open(p, arg) != ARCHIVE_OK) {
    char error_string[BUFSIZ];
    archive_copy_error_string(p->ar, error_string, BUFSIZ);
    rb_libarchive_writer_close0(p);
    rb_raise(rb_eArchiveError, "Open writer failed: %s", error_string);
  }

  if (rb_block_given_p()) {
    VALUE retval;
    int status;
    retval = rb_protect(rb_yield, writer, &status);
    rb_libarchive_writer_close0(p);

    if (status != 0) {
      rb_jump_tag(status);
    }

    return retval;
  } else {
    return writer;
  }
}
static int action_iterate_load_open_zip(const char *label, unsigned action)
{
   settings_t *settings   = config_get_ptr();

   switch (settings->archive.mode)
   {
      case 0:
         return load_or_open_zip_iterate(action);
      case 1:
         return archive_load();
      case 2:
         return archive_open();
      default:
         break;
   }

   return 0;
}
예제 #4
0
static int load_or_open_zip_iterate(char *s, size_t len, unsigned action)
{
   snprintf(s, len, "Opening compressed file\n"
         " \n"

         " - OK to open as Folder\n"
         " - Cancel/Back to Load \n");

   menu_driver_render_messagebox(s);

   switch (action)
   {
      case MENU_ACTION_OK:
         archive_open();
         break;
      case MENU_ACTION_CANCEL:
         archive_load();
         break;
   }

   return 0;
}
예제 #5
0
bool CFileListView::OpenArchive( const char* pFileName )
{
	CloseArchive();

	m_pArchive = archive_open(pFileName,0);
	if(m_pArchive == NULL)
	{
		ErrotTip();
		return false;
	}

	if(m_pParent != NULL)
	{
		char szTitle[MAX_PATH];
		sprintf_s(szTitle, MAX_PATH, "JArchiveEditor - %s",pFileName);
		m_pParent->SetWindowText(szTitle);
		strcpy_s(m_szArchiveName, MAX_PATH, pFileName);
	}

	RefreshFileList();
	ShowFileList(NULL);
	return true;
}
예제 #6
0
int split_rom_load(struct emu *emu, const char *filename, struct rom **romptr)
{
	struct archive *archive;
	uint8_t *buffer;
	size_t size;
	struct rom_info *rom_info;
	struct rom *rom;
	int *chip_list;
	int i;

	if (!romptr)
		return -1;

	chip_list = NULL;

	*romptr = NULL;

	if (archive_open(&archive, filename))
		return -1;

	chip_list = malloc(archive->file_list->count * sizeof(*chip_list));
	if (!chip_list)
		return -1;

	rom_info = NULL;
	rom = NULL;
	buffer = NULL;
	do {
		rom_info = db_lookup_split_rom(archive, chip_list, rom_info);
		if (!rom_info)
			break;

		if (load_split_rom_parts(archive, chip_list, rom_info, &buffer,
		                         &size)) {
			break;
		}

		if (!buffer)
			continue;

		rom = rom_alloc(filename, buffer, size);
		if (!rom)
			break;

		/* Store the filename of the first PRG chip as the empty string;
		   this allows patches to be included with split roms as well,
		   but they need to be located in the top-level directory of the
		   archive.
		*/
		rom->compressed_filename = strdup("");

		buffer = NULL;
		memcpy(&rom->info, rom_info, sizeof(*rom_info));
		if (rom_info->name)
			rom->info.name = strdup(rom_info->name);
		else
			rom->info.name = NULL;

		rom->offset = INES_HEADER_SIZE;
		rom_calculate_checksum(rom);

		for (i = 0; i < archive->file_list->count; i++) {
			char *basename;

			if (!archive->file_list->entries[i].name)
				continue;

			basename = strrchr(archive->file_list->entries[i].name, '/');
			if (!basename)
				basename = archive->file_list->entries[i].name;

			/* Hack for PlayChoice ROMs; most of these are the same as NES
			   carts, so check for a file called 'security.prm' to distinguish
			   them.
			*/
			if (!strcasecmp(basename, "security.prm")) {
				if (rom->info.flags & ROM_FLAG_PLAYCHOICE)
					rom->info.system_type = EMU_SYSTEM_TYPE_PLAYCHOICE;
			}
		}

		/* Validate individual chip CRCs or SHA1s if present, then
		   the combined CRC and/or SHA1, if present.
		*/
		if (!validate_checksums(rom, rom_info))
			goto invalid;

		if ((rom->info.flags & ROM_FLAG_HAS_CRC) &&
		    (rom->info.combined_crc != rom_info->combined_crc)) {
			goto invalid;
		}

		if ((rom->info.flags & ROM_FLAG_HAS_SHA1) &&
		    memcmp(rom->info.combined_sha1, rom_info->combined_sha1, 20)) {
			goto invalid;
		}
		
		break;

	invalid:
		rom_free(rom);
		rom = NULL;
	} while (rom_info);

	archive_close(&archive);

	if (chip_list)
		free(chip_list);

	if (buffer)
		free(buffer);

	if (!rom)
		return -1;

	*romptr = rom;

	return 0;

}