コード例 #1
0
ファイル: file_extract.c プロジェクト: hbfelizzola/RetroArch
bool zlib_perform_mode(const char *path, const char *valid_exts,
      const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size,
      uint32_t crc32, void *userdata)
{
   switch (cmode)
   {
      case 0: /* Uncompressed */
         if (!zlib_write_file(path, cdata, size))
            return false;
         break;

      case 8: /* Deflate */
         {
            int ret = 0;
            zlib_file_handle_t handle = {0};
            if (!zlib_inflate_data_to_file_init(&handle, cdata, csize, size))
               return false;

            do{
               ret = zlib_inflate_data_to_file_iterate(handle.stream);
            }while(ret == 0);

            if (!zlib_inflate_data_to_file(&handle, ret, path, valid_exts,
                     cdata, csize, size, crc32))
               return false;
         }
         break;
      default:
         return false;
   }

   return true;
}
コード例 #2
0
ファイル: file_extract.c プロジェクト: hbfelizzola/RetroArch
static int zip_extract_cb(const char *name, const char *valid_exts,
      const uint8_t *cdata,
      unsigned cmode, uint32_t csize, uint32_t size,
      uint32_t checksum, void *userdata)
{
   struct zip_extract_userdata *data = (struct zip_extract_userdata*)userdata;

   /* Extract first content that matches our list. */
   const char *ext = path_get_extension(name);

   if (ext && string_list_find_elem(data->ext, ext))
   {
      char new_path[PATH_MAX_LENGTH] = {0};

      if (data->extraction_directory)
         fill_pathname_join(new_path, data->extraction_directory,
               path_basename(name), sizeof(new_path));
      else
         fill_pathname_resolve_relative(new_path, data->zip_path,
               path_basename(name), sizeof(new_path));

      switch (cmode)
      {
         case ZLIB_MODE_UNCOMPRESSED:
            data->found_content = zlib_write_file(new_path, cdata, size);
            return false;
         case ZLIB_MODE_DEFLATE:
            {
               int ret = 0;
               zlib_file_handle_t handle = {0};
               if (!zlib_inflate_data_to_file_init(&handle, cdata, csize, size))
                  return 0;

               do{
                  ret = zlib_inflate_data_to_file_iterate(handle.stream);
               }while(ret == 0);

               if (zlib_inflate_data_to_file(&handle, ret, new_path, valid_exts,
                        cdata, csize, size, checksum))
               {
                  strlcpy(data->zip_path, new_path, data->zip_path_size);
                  data->found_content = true;
                  return 0;
               }
               return 0;
            }

         default:
            return 0;
      }
   }

   return 1;
}
コード例 #3
0
ファイル: apk-extract.c プロジェクト: MP2E/RetroArch
static bool zlib_cb(const char *name, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size,
      uint32_t crc32, void *userdata)
{
   struct userdata *user = userdata;
   const char *subdir = user->subdir;
   const char *dest   = user->dest;

   if (strstr(name, subdir) != name)
      return true;

   name += strlen(subdir) + 1;

   char path[PATH_MAX];
   char path_dir[PATH_MAX];
   fill_pathname_join(path, dest, name, sizeof(path));
   fill_pathname_basedir(path_dir, path, sizeof(path_dir));

   if (!path_mkdir(path_dir))
   {
      RARCH_ERR("Failed to create dir: %s.\n", path_dir);
      return false;
   }

   RARCH_LOG("Extracting %s -> %s ...\n", name, path);

   switch (cmode)
   {
      case 0: // Uncompressed
         if (!write_file(path, cdata, size))
         {
            RARCH_ERR("Failed to write file: %s.\n", path);
            return false;
         }
         break;

      case 8: // Deflate
         if (!zlib_inflate_data_to_file(path, cdata, csize, size, crc32))
         {
            RARCH_ERR("Failed to deflate to: %s.\n", path);
            return false;
         }
         break;

      default:
         return false;
   }

   return true;
}
コード例 #4
0
ファイル: file_extract.c プロジェクト: CyberShadow/RetroArch
static bool zip_extract_cb(const char *name, const uint8_t *cdata,
      unsigned cmode, uint32_t csize, uint32_t size,
      uint32_t crc32, void *userdata)
{
   struct zip_extract_userdata *data = (struct zip_extract_userdata*)userdata;

   /* Extract first content that matches our list. */
   const char *ext = path_get_extension(name);
   if (ext && string_list_find_elem(data->ext, ext))
   {
      char new_path[PATH_MAX];

      if (data->extraction_directory)
         fill_pathname_join(new_path, data->extraction_directory,
               path_basename(name), sizeof(new_path));
      else
         fill_pathname_resolve_relative(new_path, data->zip_path,
               path_basename(name), sizeof(new_path));

      switch (cmode)
      {
         /* Uncompressed. */
         case 0:
            data->found_content = write_file(new_path, cdata, size);
            return false;
         /* Deflate. */
         case 8:
            if (zlib_inflate_data_to_file(new_path, cdata, csize, size, crc32))
            {
               strlcpy(data->zip_path, new_path, data->zip_path_size);
               data->found_content = true;
               return false;
            }
            return false;

         default:
            return false;
      }
   }

   return true;
}
コード例 #5
0
static int zlib_extract_core_callback(const char *name, const char *valid_exts,
      const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size,
      uint32_t crc32, void *userdata)
{
   char path[PATH_MAX_LENGTH];

   /* Make directory */
   fill_pathname_join(path, (const char*)userdata, name, sizeof(path));
   path_basedir(path);

   if (!path_mkdir(path))
   {
      RARCH_ERR("Failed to create directory: %s.\n", path);
      return 0;
   }

   /* Ignore directories. */
   if (name[strlen(name) - 1] == '/' || name[strlen(name) - 1] == '\\')
      return 1;

   fill_pathname_join(path, (const char*)userdata, name, sizeof(path));

   RARCH_LOG("path is: %s, CRC32: 0x%x\n", path, crc32);

   switch (cmode)
   {
      case 0: /* Uncompressed */
         write_file(path, cdata, size);
         break;
      case 8: /* Deflate */
         zlib_inflate_data_to_file(path, valid_exts, cdata, csize, size, crc32);
         break;
   }

   return 1;
}
コード例 #6
0
ファイル: file_extract.c プロジェクト: AbelFlos/RetroArch
static bool zip_extract_cb(const char *name, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size,
      uint32_t crc32, void *userdata)
{
   struct zip_extract_userdata *data = (struct zip_extract_userdata*)userdata;

   // Extract first ROM that matches our list.
   const char *ext = path_get_extension(name);
   if (ext && string_list_find_elem(data->ext, ext))
   {
      char new_path[PATH_MAX];
      fill_pathname_resolve_relative(new_path, data->zip_path,
            path_basename(name), sizeof(new_path));

      switch (cmode)
      {
         case 0: // Uncompressed
            data->found_rom = write_file(new_path, cdata, size);
            return false;

         case 8: // Deflate
            if (zlib_inflate_data_to_file(new_path, cdata, csize, size, crc32))
            {
               strlcpy(data->zip_path, new_path, data->zip_path_size);
               data->found_rom = true;
               return false;
            }
            else
               return false;

         default:
            return false;
      }
   }

   return true;
}