- args.w = w;
- args.swm_base_name = swm_base_name;
- args.swm_base_name_len = swm_base_name_len;
- args.swm_suffix = swm_suffix;
- INIT_LIST_HEAD(&args.lte_list);
- args.cur_part_number = 1;
- args.write_flags = write_flags;
- args.size_remaining = part_size;
- args.part_size = part_size;
- args.progress_func = progress_func;
- args.progress.split.total_bytes = lookup_table_total_stream_size(w->lookup_table);
- args.progress.split.cur_part_number = 1;
- args.progress.split.completed_bytes = 0;
- args.progress.split.part_name = swm_base_name;
-
- if (progress_func) {
- progress_func(WIMLIB_PROGRESS_MSG_SPLIT_BEGIN_PART,
- &args.progress);
- }
-
- for (int i = 0; i < w->hdr.image_count; i++) {
- struct wim_lookup_table_entry *metadata_lte;
- metadata_lte = w->image_metadata[i].metadata_lte;
- ret = copy_resource(metadata_lte, w);
- if (ret != 0)
- goto out;
- args.size_remaining -= metadata_lte->resource_entry.size;
- args.progress.split.completed_bytes += metadata_lte->resource_entry.size;
- /* Careful: The metadata lookup table entries must be added in
- * order of the images. */
- list_add_tail(&metadata_lte->staging_list, &args.lte_list);
- }
-
- ret = for_lookup_table_entry(w->lookup_table,
- copy_resource_to_swm, &args);
- if (ret != 0)
- goto out;
-
- ret = finish_swm(w, &args.lte_list, write_flags, progress_func);
- if (ret != 0)
- goto out;
-
- if (progress_func) {
- progress_func(WIMLIB_PROGRESS_MSG_SPLIT_END_PART,
- &args.progress);
- }
-
- /* The swms are all ready now, except the total_parts and part_number
- * fields in their headers are wrong (since we don't know the total
- * parts until they are all written). Fix them. */
- int total_parts = args.cur_part_number;
- for (int i = 1; i <= total_parts; i++) {
- const tchar *part_name;
- if (i == 1) {
- part_name = swm_name;
- } else {
- tsprintf(swm_base_name + swm_base_name_len, T("%d%"TS),
- i, swm_suffix);
- part_name = swm_base_name;
- }