int build_msg_FloorRequest(mbuf_t *buf, uint8_t version, const bfcp_entity &entity, const FloorRequestParam &floorRequest) { assert(buf); size_t start = buf->pos; int err = 0; do { err = bfcp_msg_encode( buf, version, false, BFCP_FLOOR_REQUEST, entity.conferenceID, entity.transactionID, entity.userID, 0); if (err) break; for (auto floorID : floorRequest.floorIDs) { err = build_attr_FLOOR_ID(buf, floorID); if (err) break; } if (floorRequest.hasBeneficiaryID) { err = build_attr_BENEFICIARY_ID(buf, floorRequest.beneficiaryID); if (err) break; } if (!floorRequest.pInfo.empty()) { err = build_attr_PARTICIPANT_PROVIDED_INFO(buf, floorRequest.pInfo.c_str()); if (err) break; } // NOTE: priority is optional err = build_attr_PRIORITY(buf, floorRequest.priority); if (err) break; err = bfcp_msg_update_len(buf, start); if (err) break; } while (false); return err; }
int build_msg_HelloAck(mbuf_t *buf, uint8_t version, const bfcp_entity &entity, const HelloAckParam &helloAck) { assert(buf); bfcp_supprim_t primitives; primitives.primc = helloAck.primitives.size(); primitives.primv = helloAck.primitives.empty() ? nullptr : const_cast<bfcp_prim*>(&helloAck.primitives[0]); bfcp_supattr_t attributes; attributes.attrc = helloAck.attributes.size(); attributes.attrv = helloAck.attributes.empty() ? nullptr : const_cast<bfcp_attrib*>(&helloAck.attributes[0]); return bfcp_msg_encode( buf, version, true, BFCP_HELLO_ACK, entity.conferenceID, entity.transactionID, entity.userID, 2, BFCP_SUPPORTED_PRIMS | BFCP_MANDATORY, 0, &primitives, BFCP_SUPPORTED_ATTRS | BFCP_MANDATORY, 0, &attributes); }
int build_msg_Error(mbuf_t *buf, uint8_t version, const bfcp_entity &entity, const ErrorParam &error) { assert(buf); bfcp_errcode errcode; auto &errorCode = error.errorCode; errcode.code = errorCode.code; errcode.len = errorCode.details.size(); errcode.details = errorCode.details.empty() ? nullptr : const_cast<uint8_t*>(&errorCode.details[0]); const char *eInfo = error.errorInfo.empty() ? nullptr : error.errorInfo.c_str(); return bfcp_msg_encode( buf, version, true, BFCP_ERROR, entity.conferenceID, entity.transactionID, entity.userID, 2, BFCP_ERROR_CODE | BFCP_MANDATORY, 0, &errcode, BFCP_ERROR_INFO, 0, eInfo); }
int test_bfcp(void) { const size_t sz = sizeof(bfcp_msg) - 1; struct mbuf *mb; struct bfcp_reqstatus oreqstatus, reqstatus1, reqstatus2; uint16_t floorid = 1, bfid = 2, frid = 3, freqid; uint16_t ofreqid, floorid1, floorid2, rbid; enum bfcp_priority prio = BFCP_PRIO_NORMAL; int n, err = 0; mb = mbuf_alloc(512); if (!mb) return ENOMEM; err = bfcp_msg_encode(mb, 1, false, BFCP_FLOOR_REQUEST, 0x01020304, 0xfedc, 0xba98, 4, BFCP_FLOOR_ID, 0, &floorid, BFCP_BENEFICIARY_ID, 0, &bfid, BFCP_PART_PROV_INFO, 0, "X", BFCP_PRIORITY, 0, &prio); if (err) goto out; err = bfcp_msg_encode(mb, 1, false, BFCP_FLOOR_RELEASE, 0x01020304, 0xfedc, 0xba98, 1, BFCP_FLOOR_REQUEST_ID, 0, &frid); if (err) goto out; freqid = 0x8899; ofreqid = 0x74ad; oreqstatus.status = BFCP_DENIED; oreqstatus.qpos = 2; floorid1 = 2; reqstatus1.status = BFCP_ACCEPTED; reqstatus1.qpos = 2; floorid2 = 4; reqstatus2.status = BFCP_REVOKED; reqstatus2.qpos = 3; bfid = 1; rbid = 2; prio = BFCP_PRIO_NORMAL; err = bfcp_msg_encode(mb, 1, false, BFCP_USER_STATUS, 0x01020304, 0xfedc, 0xba98, 1, BFCP_FLOOR_REQ_INFO, 7, &freqid, BFCP_OVERALL_REQ_STATUS, 2, &ofreqid, BFCP_REQUEST_STATUS, 0, &oreqstatus, BFCP_STATUS_INFO, 0, "OK", BFCP_FLOOR_REQ_STATUS, 2, &floorid1, BFCP_REQUEST_STATUS, 0, &reqstatus1, BFCP_STATUS_INFO, 0, "ok", BFCP_FLOOR_REQ_STATUS, 2, &floorid2, BFCP_REQUEST_STATUS, 0, &reqstatus2, BFCP_STATUS_INFO, 0, "ja", BFCP_BENEFICIARY_INFO, 2, &bfid, BFCP_USER_DISP_NAME, 0, "a", BFCP_USER_URI, 0, "b", BFCP_REQUESTED_BY_INFO, 2, &rbid, BFCP_USER_DISP_NAME, 0, "c", BFCP_USER_URI, 0, "d", BFCP_PRIORITY, 0, &prio, BFCP_PART_PROV_INFO, 0, "x"); if (err) goto out; err = bfcp_msg_encode(mb, 1, false, BFCP_HELLO, 0x01020304, 0xfedc, 0xba98, 0); if (err) goto out; if (mb->end != sz) { DEBUG_WARNING("expected %u bytes, got %u bytes\n", sz, mb->end); (void)re_printf("\nEncoded message:\n"); hexdump(stderr, mb->buf, mb->end); err = EPROTO; goto out; } if (!err) { n = memcmp(mb->buf, bfcp_msg, mb->end); if (0 != n) { err = EBADMSG; DEBUG_WARNING("error offset: %d\n", n); } } if (err) { DEBUG_WARNING("BFCP encode error: %m\n", err); (void)re_printf("\nReference message:\n"); hexdump(stderr, bfcp_msg, sz); (void)re_printf("\nEncoded message:\n"); hexdump(stderr, mb->buf, mb->end); goto out; } out: mem_deref(mb); return err; }