#include #include #include #include #include #include typedef struct getrectangles_priv GETRECTANGLES_PRIV; struct getrectangles_priv { LX_RECTORDER *orderp; int *nrp; LX_RECTANGLE **rvp; } ; static void done_shape_GetRectangles(LX_CONN *xc, const unsigned char *rep, void *pv) { GETRECTANGLES_PRIV *p; LX_RECTORDER o; unsigned int ui; int n; size_t sz; int i; LX_RECTANGLE *v; p = pv; do <"ret"> { // We have to be careful of overflow.... ui = lxxi_r_card32(rep+8); n = ui; if (n != ui) { lxxi_protoerr(xc,"SHAPE GetRectangles response length overflow (%u)",n); break <"ret">; } if (lxxi_r_card32(rep+4) != n*2ULL) { lxxi_protoerr(xc,"SHAPE GetRectangles response length wrong (%u, expecting %llu)",lxxi_r_card32(rep+4),n*2ULL); break <"ret">; } sz = n * (size_t)8; if (sz>>3 != n) { lxxi_protoerr(xc,"SHAPE GetRectangles response requires too much data (%llu, max size_t is %llu)", (unsigned long long int)(n*8ULL),(unsigned long long int)~(size_t)0); break <"ret">; } o = lxxi_proto_to_rectorder(rep[1]); if (o == LXXI_map_error) { lxxi_protoerr(xc,"SHAPE GetRectangles has invalid ordering (%d)",rep[1]); break <"ret">; } if (p->orderp) *p->orderp = o; if (p->rvp) { v = malloc(sz); if (! v) { lxxi_nomem_fail(xc); break <"ret">; } o = 32; for (i=0;irvp = v; } if (p->nrp) *p->nrp = n; } while (0); free(p); } LX_OP *lx_shape_GetRectangles(LX_CONN *xc, LX_XID win, LX_SHAPE_KIND kind, LX_RECTORDER *orderp, int *nrp, LX_RECTANGLE **rvp) { LX_SHAPE_PRIV *p; GETRECTANGLES_PRIV *rp; unsigned char req[12]; int proto_kind; if (lxxi_conn_failed(xc)) { lxxi_bad_call(xc,"lx_shape_GetRectangles"); return(0); } p = lx_get_private(xc,lx_shape__px); if (! p) { lxxi_bad_call(xc,"lx_shape_GetRectangles"); return(0); } proto_kind = lx_shape__kind_to_proto(kind); if (proto_kind < 0) { lxxi_bad_call(xc,"lx_shape_GetRectangles"); return(0); } p = malloc(sizeof(GETRECTANGLES_PRIV)); if (! p) { lxxi_nomem_fail(xc); return(0); } lxxi_nochain(xc); rp->orderp = orderp; rp->nrp = nrp; rp->rvp = rvp; req[0] = p->major; req[1] = SHAPE_GetRectangles; lxxi_w_card16(&req[2],3); lxxi_w_card32(&req[4],win); req[8] = proto_kind; req[9] = 0; req[10] = 0; req[11] = 0; return(lxxi_expect_reply(xc,&req[0],-1,&done_shape_GetRectangles,rp)); }