NXTKWINDOW nxtk_openwindow(NXHANDLE handle, FAR const struct nx_callback_s *cb, FAR void *arg) { FAR struct nxtk_framedwindow_s *fwnd; int ret; #ifdef CONFIG_DEBUG if (!handle || !cb) { set_errno(EINVAL); return NULL; } #endif /* Pre-allocate the window structure */ fwnd = (FAR struct nxtk_framedwindow_s *) lib_uzalloc(sizeof(struct nxtk_framedwindow_s)); if (!fwnd) { set_errno(ENOMEM); return NULL; } /* Initialize the window structure */ fwnd->fwcb = cb; fwnd->fwarg = arg; /* Then let nx_constructwindow do the rest */ ret = nx_constructwindow(handle, (NXWINDOW)&fwnd->wnd, &g_nxtkcb, NULL); if (ret < 0) { /* An error occurred, the window has been freed */ return NULL; } /* Return the initialized window reference */ return (NXTKWINDOW)fwnd; }
NXHANDLE nx_connectinstance(FAR const char *svrmqname) { FAR struct nxfe_conn_s *conn; struct nxsvrmsg_s outmsg; char climqname[NX_CLIENT_MXNAMELEN]; struct mq_attr attr; int ret; /* Sanity checking */ #ifdef CONFIG_DEBUG_FEATURES if (!svrmqname) { set_errno(EINVAL); return NULL; } #endif /* Allocate the NX client structure */ conn = (FAR struct nxfe_conn_s *)lib_uzalloc(sizeof(struct nxfe_conn_s)); if (!conn) { set_errno(ENOMEM); goto errout; } /* Create the client MQ name */ nxmu_semtake(&g_nxlibsem); conn->cid = g_nxcid++; nxmu_semgive(&g_nxlibsem); sprintf(climqname, NX_CLIENT_MQNAMEFMT, conn->cid); /* Open the client MQ for reading */ attr.mq_maxmsg = CONFIG_NX_MXCLIENTMSGS; attr.mq_msgsize = NX_MXCLIMSGLEN; attr.mq_flags = 0; #ifdef CONFIG_NX_BLOCKING conn->crdmq = mq_open(climqname, O_RDONLY|O_CREAT, 0666, &attr); #else conn->crdmq = mq_open(climqname, O_RDONLY|O_CREAT|O_NONBLOCK, 0666, &attr); #endif if (conn->crdmq == (mqd_t)-1) { gerr("ERROR: mq_open(%s) failed: %d\n", climqname, errno); goto errout_with_conn; } /* Open the server MQ for writing */ attr.mq_maxmsg = CONFIG_NX_MXSERVERMSGS; attr.mq_msgsize = NX_MXSVRMSGLEN; attr.mq_flags = 0; conn->cwrmq = mq_open(svrmqname, O_WRONLY|O_CREAT, 0666, &attr); if (conn->cwrmq == (mqd_t)-1) { gerr("ERROR: mq_open(%s) failed: %d\n", svrmqname, errno); goto errout_with_rmq; } /* Inform the server that this client exists */ outmsg.msgid = NX_SVRMSG_CONNECT; outmsg.conn = conn; ret = nxmu_sendserver(conn, &outmsg, sizeof(struct nxsvrmsg_s)); if (ret < 0) { gerr("ERROR: nxmu_sendserver failed: %d\n", errno); goto errout_with_wmq; } #if 0 /* Now read until we get a response to this message. The server will * respond with either (1) NX_CLIMSG_CONNECTED, in which case the state * will change to NX_CLISTATE_CONNECTED, or (2) NX_CLIMSG_DISCONNECTED * in which case, nx_message will fail with errno = EHOSTDOWN. */ do { ret = nx_eventhandler((NXHANDLE)conn); if (ret < 0) { gerr("ERROR: nx_message failed: %d\n", errno); goto errout_with_wmq; } usleep(300000); } while (conn->state != NX_CLISTATE_CONNECTED); #endif return (NXHANDLE)conn; errout_with_wmq: mq_close(conn->cwrmq); errout_with_rmq: mq_close(conn->crdmq); errout_with_conn: lib_ufree(conn); errout: return NULL; }