Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}