int cw_out_generic(struct conn *conn, struct cw_action_out *a, uint8_t * dst) // ,struct mbag_item * item) { /* Get the item to put */ struct mbag_item *item = NULL; if (a->get) { item = a->get(conn, a); } /* Size for msg elem header depends on vendor specific payload */ int start = a->vendor_id ? 10 : 4; int len; if (!item) { const char *vendor=""; if ( a->vendor_id ) { vendor=cw_strvendor(a->vendor_id); } if (a->mand) { cw_log(LOG_ERR, "Can't put mandatory element %s%d - (%s) into %s. No value found.", vendor, a->elem_id, cw_strelemp(conn->actions, a->elem_id) , cw_strmsg(a->msg_id) ); } else{ cw_dbg(DBG_WARN,"No output for element %s%d -(%s) in %s. Item %s not found.", vendor, a->elem_id, cw_strelemp(conn->actions, a->elem_id) , cw_strmsg(a->msg_id),a->item_id); } return 0; } else { len = cw_put_item(dst + start, item); } if (a->vendor_id) return len + cw_put_elem_vendor_hdr(dst, a->vendor_id, a->elem_id, len); return len + cw_put_elem_hdr(dst, a->elem_id, len); }
static int cw_format_version(char *s, bstrv_t ver, char * def) { if (!ver) return sprintf(s,"%s",def); uint8_t * version = bstrv_data(ver); int len = bstrv_len(ver); int rs=0; int i; if ( format_is_utf8(version,len) ){ if (len != 0 ) rs+=sprintf(s+rs,"%.*s",len,version); else rs+=sprintf(s+rs,"''"); } else{ for (i=0; i<len && i<20; i++){ rs+=sprintf(s+rs,"%02X",version[i]); } int dot=0; rs+=sprintf(s+rs," ("); for (i=0; i<len && i<20; i++){ if (dot) rs+=sprintf(s+rs,"."); dot=1; rs+=sprintf(s+rs,"%d",version[i]); } rs+=sprintf(s+rs,")"); } uint32_t vendor = bstrv_get_vendor_id(ver); rs+=sprintf(s+rs,", Vendor Id: %d, %s",vendor, cw_strvendor(vendor)); return rs; }
void cw_dbg_elem_colored(int level, struct conn *conn, int msg, int msgelem, const uint8_t * msgbuf, int len) { if (!cw_dbg_is_level(level)) return; const char *elemname; char vendorname[256]; char vendor_details[265]; *vendor_details = 0; if (msgelem == CW_ELEM_VENDOR_SPECIFIC_PAYLOAD) { uint32_t vendor_id = ntohl(*((uint32_t *) msgbuf)); int type = ntohs(*((uint16_t *) (msgbuf + 4))); cw_format_vendor(vendor_details, vendor_id, type, msgbuf); sprintf(vendorname, "%s/%s/%s", cw_strelemp(conn->actions, msgelem), (char *) cw_strvendor(vendor_id), vendor_details); elemname = vendorname; } else { elemname = cw_strelemp(conn->actions, msgelem); } if (!cw_dbg_is_level(DBG_ELEM_DMP)){ cw_dbg(DBG_ELEM, "%d (%s), len=%d", msgelem, elemname, len); } else{ char *dmp = cw_dbg_mkdmp(msgbuf,len); cw_dbg(DBG_ELEM, "%d (%s), len=%d%s%s", msgelem, elemname, len, get_dbg_color_ontext(DBG_ELEM_DMP), dmp); free(dmp); } }