static void ThrowError(JNIEnv *jenv, const char *msg) { const char *error = brlapi_strerror(&brlapi_error); int lenmsg = strlen(msg); int lenerr = strlen(error); jclass jcexcep; jmethodID jinit; jthrowable jexcep; jstring errfun = NULL; { char message[lenmsg + 2 + lenerr + 1]; snprintf(message, sizeof(message), "%s: %s", msg, error); if (!(jcexcep = (*jenv)->FindClass(jenv, "org/a11y/BrlAPI/Error"))) { ThrowException(jenv, ERR_NULLPTR, "ThrowBrlapiErrorFindClass"); return; } if (!(jinit = (*jenv)->GetMethodID(jenv, jcexcep, "<init>", "(IIILjava/lang/String;)V"))) { ThrowException(jenv, ERR_NULLPTR, "ThrowBrlapiErrorGetMethodID"); return; } if (brlapi_errfun) errfun = (*jenv)->NewStringUTF(jenv, brlapi_errfun); if (!(jexcep = (*jenv)->NewObject(jenv, jcexcep, jinit, brlapi_errno, brlapi_libcerrno, brlapi_gaierrno, errfun))) { ThrowException(jenv, ERR_NULLPTR, "ThrowBrlapiErrorNewObject"); return; } (*jenv)->ExceptionClear(jenv); (*jenv)->Throw(jenv, jexcep); } }
CAMLprim value brlapiml_strerror(value camlError) { CAMLparam1(camlError); brlapi_error_t error; error.brlerrno = Int_val(Field(camlError,0)); error.libcerrno = Int_val(Field(camlError,1)); error.gaierrno = Int_val(Field(camlError,2)); error.errfun = String_val(Field(camlError,3)); CAMLreturn(caml_copy_string(brlapi_strerror(&error))); }
/* the one already displayed */ static int brl_writeWindow(BrailleDisplay *brl, const wchar_t *text) { brlapi_writeArguments_t arguments = BRLAPI_WRITEARGUMENTS_INITIALIZER; int vt = currentVirtualTerminal(); if (vt == SCR_NO_VT) { /* should leave display */ if (prevShown) { brlapi_write(&arguments); prevShown = 0; } } else { if (prevShown && (memcmp(prevData,brl->buffer,displaySize) == 0) && (!text || (wmemcmp(prevText,text,displaySize) == 0)) && (brl->cursor == prevCursor)) { return 1; } unsigned char and[displaySize]; memset(and, 0, sizeof(and)); arguments.andMask = and; arguments.orMask = brl->buffer; if (text) { arguments.text = (char*) text; arguments.textSize = displaySize * sizeof(wchar_t); arguments.charset = (char*) getWcharCharset(); } arguments.regionBegin = 1; arguments.regionSize = displaySize; arguments.cursor = (brl->cursor != BRL_NO_CURSOR)? (brl->cursor + 1): BRLAPI_CURSOR_OFF; if (brlapi_write(&arguments)==0) { memcpy(prevData,brl->buffer,displaySize); wmemcpy(prevText,text,displaySize); prevCursor = brl->cursor; prevShown = 1; } else { logMessage(LOG_ERR, "write: %s", brlapi_strerror(&brlapi_error)); restart = 1; } } return 1; }
static void setBrlapiError (Tcl_Interp *interp) { const char *text = brlapi_strerror(&brlapi_error); const char *name; int number; switch (brlapi_error.brlerrno) { case BRLAPI_ERROR_LIBCERR: name = "LIBC"; number = brlapi_error.libcerrno; break; case BRLAPI_ERROR_GAIERR: name = "GAI"; number = brlapi_error.gaierrno; break; default: name = "BRL"; number = brlapi_error.brlerrno; break; } { Tcl_Obj *const elements[] = { Tcl_NewStringObj("BrlAPI", -1), Tcl_NewStringObj(name, -1), Tcl_NewIntObj(number), Tcl_NewStringObj(text, -1) }; Tcl_SetObjErrorCode(interp, Tcl_NewListObj(4, elements)); } Tcl_Obj *result = Tcl_GetObjResult(interp); Tcl_SetStringObj(result, "BrlAPI error: ", -1); size_t length = strlen(text); while (length > 0) { size_t end = length - 1; if (text[end] != '\n') break; length = end; } Tcl_AppendToObj(result, text, length); }
static CharDriverState *chr_baum_init(const char *id, ChardevBackend *backend, ChardevReturn *ret, bool *be_opened, Error **errp) { ChardevCommon *common = backend->u.braille.data; BaumDriverState *baum; CharDriverState *chr; brlapi_handle_t *handle; chr = qemu_chr_alloc(common, errp); if (!chr) { return NULL; } baum = g_malloc0(sizeof(BaumDriverState)); baum->chr = chr; chr->opaque = baum; chr->chr_write = baum_write; chr->chr_accept_input = baum_accept_input; chr->chr_free = baum_free; handle = g_malloc0(brlapi_getHandleSize()); baum->brlapi = handle; baum->brlapi_fd = brlapi__openConnection(handle, NULL, NULL); if (baum->brlapi_fd == -1) { error_setg(errp, "brlapi__openConnection: %s", brlapi_strerror(brlapi_error_location())); goto fail_handle; } baum->deferred_init = 0; baum->cellCount_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, baum_cellCount_timer_cb, baum); qemu_set_fd_handler(baum->brlapi_fd, baum_chr_read, NULL, baum); return chr; fail_handle: g_free(handle); g_free(chr); g_free(baum); return NULL; }
static CharDriverState *chr_baum_init(const char *id, ChardevBackend *backend, ChardevReturn *ret, Error **errp) { ChardevCommon *common = backend->u.braille; BaumDriverState *baum; CharDriverState *chr; brlapi_handle_t *handle; #if defined(CONFIG_SDL) #if SDL_COMPILEDVERSION < SDL_VERSIONNUM(2, 0, 0) SDL_SysWMinfo info; #endif #endif int tty; chr = qemu_chr_alloc(common, errp); if (!chr) { return NULL; } baum = g_malloc0(sizeof(BaumDriverState)); baum->chr = chr; chr->opaque = baum; chr->chr_write = baum_write; chr->chr_accept_input = baum_accept_input; chr->chr_close = baum_close; handle = g_malloc0(brlapi_getHandleSize()); baum->brlapi = handle; baum->brlapi_fd = brlapi__openConnection(handle, NULL, NULL); if (baum->brlapi_fd == -1) { error_setg(errp, "brlapi__openConnection: %s", brlapi_strerror(brlapi_error_location())); goto fail_handle; } baum->cellCount_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, baum_cellCount_timer_cb, baum); if (brlapi__getDisplaySize(handle, &baum->x, &baum->y) == -1) { error_setg(errp, "brlapi__getDisplaySize: %s", brlapi_strerror(brlapi_error_location())); goto fail; } #if defined(CONFIG_SDL) #if SDL_COMPILEDVERSION < SDL_VERSIONNUM(2, 0, 0) memset(&info, 0, sizeof(info)); SDL_VERSION(&info.version); if (SDL_GetWMInfo(&info)) tty = info.info.x11.wmwindow; else #endif #endif tty = BRLAPI_TTY_DEFAULT; if (brlapi__enterTtyMode(handle, tty, NULL) == -1) { error_setg(errp, "brlapi__enterTtyMode: %s", brlapi_strerror(brlapi_error_location())); goto fail; } qemu_set_fd_handler(baum->brlapi_fd, baum_chr_read, NULL, baum); return chr; fail: timer_free(baum->cellCount_timer); brlapi__closeConnection(handle); fail_handle: g_free(handle); g_free(chr); g_free(baum); return NULL; }