Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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;
}