feat: media_async + media_index modules, media_files table, tests
- media_async: thread-per-task async engine with primitives (sha256, sign, copy, uuid, file_size) - media_index: media_files DB table with register_async for indexing chunks - chat_msg: async media submission via register_async, simplified chat_msg_submit fields - voice_recorder/attachment_sender: write single file (no chunk splitting on caller side) - inputbar/messagelist: updated to new simplified submit interface - test_media_async: 4-thread stress test (200K ops / 2 sec, 0 errors) - test_media_index: 9 cases covering commit edge cases + async flow - build: Makefile.am, CMakeLists.txt, utun_sources.cmake updated
This commit is contained in:
1 parent
ce5a84da24
commit
65dbfa6813
43 files changed
+1983
-391
No files matched your search
@@ -153,8 +153,17 @@ static void setVoiceMessageRoles(QStandardItem* item, const QByteArray& data,
|
||||
}
|
||||
}
|
||||
if (ct == "application/octet-stream") {
|
||||
QString fname = QString::fromUtf8(data);
|
||||
QString raw = QString::fromUtf8(data);
|
||||
int pipePos = raw.indexOf('|');
|
||||
QString fname = (pipePos > 0) ? raw.left(pipePos) : raw;
|
||||
item->setData(fname, MsgFileDisplayNameRole);
|
||||
|
||||
if (pipePos > 0) {
|
||||
QString meta = raw.mid(pipePos + 1);
|
||||
QStringList parts = meta.split('|');
|
||||
if (parts.size() >= 1)
|
||||
item->setData(parts[0].toULongLong(), MsgFileSizeRole);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -246,10 +255,8 @@ MessageList::MessageList(DbManager* db, AudioRecorder* recorder, QWidget *parent
|
||||
gui_bridge_post_uasync_fn(chat_core_submit_trampoline, req);
|
||||
});
|
||||
|
||||
connect(m_inputBar, &InputBar::sendVoiceMessage, this, [this](const QString& dt, const QString& basename,
|
||||
const QString& suffix, const QString& ext,
|
||||
int numBlocks, qint64 blockSize,
|
||||
int durationMs, const QString& wfStr) {
|
||||
connect(m_inputBar, &InputBar::sendVoiceMessage, this, [this](const QString& mediaSrc, const QString& mediaDest,
|
||||
int durationMs, const QString& wfStr) {
|
||||
if (m_currentChannelId.isEmpty()) return;
|
||||
|
||||
QByteArray textData = wfStr.toUtf8();
|
||||
@@ -261,11 +268,9 @@ MessageList::MessageList(DbManager* db, AudioRecorder* recorder, QWidget *parent
|
||||
snprintf(req->channel_id, sizeof(req->channel_id), "%s",
|
||||
m_currentChannelId.toUtf8().constData());
|
||||
snprintf(req->content_type, sizeof(req->content_type), "audio/opus");
|
||||
snprintf(req->media_dt, sizeof(req->media_dt), "%s", dt.toUtf8().constData());
|
||||
snprintf(req->media_basename, sizeof(req->media_basename), "%s", basename.toUtf8().constData());
|
||||
snprintf(req->media_suffix, sizeof(req->media_suffix), "%s", suffix.toUtf8().constData());
|
||||
snprintf(req->media_ext, sizeof(req->media_ext), "%s", ext.toUtf8().constData());
|
||||
req->media_num_blocks = (uint32_t)numBlocks;
|
||||
snprintf(req->media_src, sizeof(req->media_src), "%s", mediaSrc.toUtf8().constData());
|
||||
snprintf(req->media_dest, sizeof(req->media_dest), "%s", mediaDest.toUtf8().constData());
|
||||
req->media_copy = 0;
|
||||
req->data = (uint8_t*)(req + 1);
|
||||
req->data_len = (uint32_t)textData.size();
|
||||
memcpy(req->data, textData.constData(), textData.size());
|
||||
@@ -273,10 +278,8 @@ MessageList::MessageList(DbManager* db, AudioRecorder* recorder, QWidget *parent
|
||||
gui_bridge_post_uasync_fn(chat_core_submit_trampoline, req);
|
||||
});
|
||||
|
||||
connect(m_inputBar, &InputBar::sendFileAttachment, this, [this](const QString& dt, const QString& basename,
|
||||
const QString& suffix, const QString& ext,
|
||||
int numBlocks, qint64 blockSize,
|
||||
const QString& displayName) {
|
||||
connect(m_inputBar, &InputBar::sendFileAttachment, this, [this](const QString& mediaSrc, const QString& mediaDest,
|
||||
const QString& displayName) {
|
||||
if (m_currentChannelId.isEmpty()) return;
|
||||
|
||||
QByteArray textData = displayName.toUtf8();
|
||||
@@ -288,11 +291,9 @@ MessageList::MessageList(DbManager* db, AudioRecorder* recorder, QWidget *parent
|
||||
snprintf(req->channel_id, sizeof(req->channel_id), "%s",
|
||||
m_currentChannelId.toUtf8().constData());
|
||||
snprintf(req->content_type, sizeof(req->content_type), "application/octet-stream");
|
||||
snprintf(req->media_dt, sizeof(req->media_dt), "%s", dt.toUtf8().constData());
|
||||
snprintf(req->media_basename, sizeof(req->media_basename), "%s", basename.toUtf8().constData());
|
||||
snprintf(req->media_suffix, sizeof(req->media_suffix), "%s", suffix.toUtf8().constData());
|
||||
snprintf(req->media_ext, sizeof(req->media_ext), "%s", ext.toUtf8().constData());
|
||||
req->media_num_blocks = (uint32_t)numBlocks;
|
||||
snprintf(req->media_src, sizeof(req->media_src), "%s", mediaSrc.toUtf8().constData());
|
||||
snprintf(req->media_dest, sizeof(req->media_dest), "%s", mediaDest.toUtf8().constData());
|
||||
req->media_copy = (mediaSrc != mediaDest) ? 1 : 0;
|
||||
req->data = (uint8_t*)(req + 1);
|
||||
req->data_len = (uint32_t)textData.size();
|
||||
memcpy(req->data, textData.constData(), textData.size());
|
||||
|
||||
Reference in new issue
Block a user