mirror of
https://github.com/liquidraver/ZephCore.git
synced 2026-09-02 02:39:30 +00:00
sync with arduino/dev
This commit is contained in:
@@ -388,12 +388,28 @@ int BaseChatMesh::searchChannelsByHash(const uint8_t *hash, mesh::GroupChannel d
|
||||
void BaseChatMesh::onGroupDataRecv(mesh::Packet *packet, uint8_t type, const mesh::GroupChannel &channel,
|
||||
uint8_t *data, size_t len)
|
||||
{
|
||||
uint8_t txt_type = data[4];
|
||||
if (type == PAYLOAD_TYPE_GRP_TXT && len > 5 && (txt_type >> 2) == 0) {
|
||||
uint32_t timestamp;
|
||||
memcpy(×tamp, data, 4);
|
||||
data[len] = 0;
|
||||
onChannelMessageRecv(channel, packet, timestamp, (const char *)&data[5]);
|
||||
if (type == PAYLOAD_TYPE_GRP_TXT) {
|
||||
uint8_t txt_type = data[4];
|
||||
if (len > 5 && (txt_type >> 2) == 0) {
|
||||
uint32_t timestamp;
|
||||
memcpy(×tamp, data, 4);
|
||||
data[len] = 0;
|
||||
onChannelMessageRecv(channel, packet, timestamp, (const char *)&data[5]);
|
||||
}
|
||||
} else if (type == PAYLOAD_TYPE_GRP_DATA) {
|
||||
if (len < 3) {
|
||||
LOG_DBG("onGroupDataRecv: dropping short group data payload len=%d", (int)len);
|
||||
return;
|
||||
}
|
||||
uint16_t data_type = ((uint16_t)data[0]) | (((uint16_t)data[1]) << 8);
|
||||
uint8_t data_len = data[2];
|
||||
size_t available_len = len - 3;
|
||||
if (data_len > available_len) {
|
||||
LOG_DBG("onGroupDataRecv: dropping malformed group data type=%d len=%d available=%d",
|
||||
(int)data_type, (int)data_len, (int)available_len);
|
||||
return;
|
||||
}
|
||||
onChannelDataRecv(channel, packet, data_type, &data[3], data_len);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -505,6 +521,38 @@ bool BaseChatMesh::sendGroupMessage(uint32_t timestamp, mesh::GroupChannel &chan
|
||||
return false;
|
||||
}
|
||||
|
||||
bool BaseChatMesh::sendGroupData(mesh::GroupChannel &channel, uint8_t *path, uint8_t path_len,
|
||||
uint16_t data_type, const uint8_t *data, int data_len)
|
||||
{
|
||||
if (data_len < 0) {
|
||||
LOG_DBG("sendGroupData: invalid negative data_len=%d", data_len);
|
||||
return false;
|
||||
}
|
||||
if (data_len > MAX_GROUP_DATA_LENGTH) {
|
||||
LOG_DBG("sendGroupData: data_len=%d exceeds max=%d", data_len, MAX_GROUP_DATA_LENGTH);
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t temp[3 + MAX_GROUP_DATA_LENGTH];
|
||||
temp[0] = (uint8_t)(data_type & 0xFF);
|
||||
temp[1] = (uint8_t)(data_type >> 8);
|
||||
temp[2] = (uint8_t)data_len;
|
||||
if (data_len > 0) memcpy(&temp[3], data, data_len);
|
||||
|
||||
mesh::Packet *pkt = createGroupDatagram(PAYLOAD_TYPE_GRP_DATA, channel, temp, 3 + data_len);
|
||||
if (pkt == nullptr) {
|
||||
LOG_DBG("sendGroupData: unable to create group datagram, data_len=%d", data_len);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (path_len == OUT_PATH_UNKNOWN) {
|
||||
sendFloodScoped(channel, pkt);
|
||||
} else {
|
||||
sendDirect(pkt, path, path_len);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool BaseChatMesh::shareContactZeroHop(const ContactInfo &contact)
|
||||
{
|
||||
int plen = getBlobByKey(contact.id.pub_key, PUB_KEY_SIZE, temp_buf);
|
||||
|
||||
Reference in New Issue
Block a user