floperr_t floppy_format_track(floppy_image *floppy, int head, int track, option_resolution *parameters) { floperr_t err; struct FloppyCallbacks *format; option_resolution *alloc_resolution = NULL; optreserr_t oerr; /* supported? */ format = floppy_callbacks(floppy); if (!format->format_track) { err = FLOPPY_ERROR_UNSUPPORTED; goto done; } /* create a dummy resolution; if no parameters were specified */ if (!parameters) { alloc_resolution = option_resolution_create(floppy_option_guide, floppy->floppy_option->param_guidelines); if (!alloc_resolution) { err = FLOPPY_ERROR_OUTOFMEMORY; goto done; } parameters = alloc_resolution; } oerr = option_resolution_finish(parameters); if (oerr) { err = option_to_floppy_error(oerr); goto done; } err = format->format_track(floppy, head, track, parameters); if (err) goto done; done: if (alloc_resolution) option_resolution_close(alloc_resolution); return err; }
UINT_PTR CALLBACK win_new_dialog_hook(HWND dlgwnd, UINT message, WPARAM wparam, LPARAM lparam) { UINT_PTR rc = 0; const NMHDR *notify; const OFNOTIFY *ofn_notify; const NM_UPDOWN *ud_notify; struct new_dialog_info *info; const imgtool_module *module; HWND control; RECT r1, r2; LONG_PTR l; int id; option_resolution *resolution; HWND more_button; LRESULT lres; l = GetWindowLongPtr(dlgwnd, GWLP_USERDATA); info = (struct new_dialog_info *) l; more_button = GetDlgItem(dlgwnd, IDC_MORE); switch(message) { case WM_INITDIALOG: info = (struct new_dialog_info *) malloc(sizeof(*info)); if (!info) return -1; memset(info, 0, sizeof(*info)); SetWindowLongPtr(dlgwnd, GWLP_USERDATA, (LONG_PTR) info); info->parent = GetParent(dlgwnd); // compute lower margin GetWindowRect(more_button, &r1); GetWindowRect(dlgwnd, &r2); info->margin = r2.bottom - r1.bottom; // change dlgwnd height GetWindowRect(info->parent, &r1); SetWindowPos(dlgwnd, NULL, 0, 0, r1.right - r1.left, r2.bottom - r2.top, SWP_NOMOVE | SWP_NOZORDER); break; case WM_DESTROY: if (info) free(info); break; case WM_COMMAND: switch(HIWORD(wparam)) { case BN_CLICKED: if (LOWORD(wparam) == IDC_MORE) { info->expanded = !info->expanded; adjust_dialog_height(dlgwnd); } break; case EN_KILLFOCUS: control = (HWND) lparam; id = GetWindowLong(control, GWL_ID); if ((id >= CONTROL_START) && (id < CONTROL_START + info->control_count)) win_check_option_control(control); break; } break; case WM_NOTIFY: notify = (const NMHDR *) lparam; switch(notify->code) { case UDN_DELTAPOS: ud_notify = (const NM_UPDOWN *) notify; lres = SendMessage(notify->hwndFrom, UDM_GETBUDDY, 0, 0); control = (HWND) lres; win_adjust_option_control(control, ud_notify->iDelta); break; case CDN_INITDONE: ofn_notify = (const OFNOTIFY *) notify; rc = new_dialog_typechange(dlgwnd, ofn_notify->lpOFN->nFilterIndex); break; case CDN_FILEOK: ofn_notify = (const OFNOTIFY *) notify; module = info->module; resolution = NULL; if (module->createimage_optguide && module->createimage_optspec) { resolution = option_resolution_create(module->createimage_optguide, module->createimage_optspec); apply_option_controls(dlgwnd, NULL, resolution, info->control_count); option_resolution_finish(resolution); } *((option_resolution **) ofn_notify->lpOFN->lCustData) = resolution; break; case CDN_TYPECHANGE: ofn_notify = (const OFNOTIFY *) notify; rc = new_dialog_typechange(dlgwnd, ofn_notify->lpOFN->nFilterIndex); break; } break; } return rc; }
floperr_t floppy_create(void *fp, const struct io_procs *procs, const struct FloppyFormat *format, option_resolution *parameters, floppy_image **outfloppy) { floppy_image *floppy = NULL; optreserr_t oerr; floperr_t err; int heads, tracks, h, t; option_resolution *alloc_resolution = NULL; assert(format); /* create the new image */ floppy = floppy_init(fp, procs, 0); if (!floppy) { err = FLOPPY_ERROR_OUTOFMEMORY; goto done; } /* if this format expects creation parameters and none were specified, create some */ if (!parameters && floppy_option_guide && format->param_guidelines) { alloc_resolution = option_resolution_create(floppy_option_guide, format->param_guidelines); if (!alloc_resolution) { err = FLOPPY_ERROR_OUTOFMEMORY; goto done; } parameters = alloc_resolution; } /* finish the parameters, if specified */ if (parameters) { oerr = option_resolution_finish(parameters); if (oerr) { err = option_to_floppy_error(oerr); goto done; } } /* call the format constructor */ err = format->construct(floppy, format, parameters); if (err) goto done; /* format the disk, ignoring if formatting not implemented */ if (floppy->format.format_track) { heads = floppy_get_heads_per_disk(floppy); tracks = floppy_get_tracks_per_disk(floppy); for (h = 0; h < heads; h++) { for (t = 0; t < tracks; t++) { err = floppy->format.format_track(floppy, h, t, parameters); if (err) goto done; } } } /* call the post_format function, if present */ if (floppy->format.post_format) { err = floppy->format.post_format(floppy, parameters); if (err) goto done; } floppy->floppy_option = format; err = FLOPPY_ERROR_SUCCESS; done: if (err && floppy) { floppy_close_internal(floppy, FALSE); floppy = NULL; } if (outfloppy) *outfloppy = floppy; else if (floppy) floppy_close_internal(floppy, FALSE); if (alloc_resolution) option_resolution_close(alloc_resolution); return err; }