-
Notifications
You must be signed in to change notification settings - Fork 130
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
#610 cant send image in group chat #637
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,19 @@ | ||
#include "config.h" | ||
#include "iptux-core/CoreThread.h" | ||
|
||
#include <deque> | ||
#include <fstream> | ||
#include <functional> | ||
#include <future> | ||
#include <memory> | ||
#include <mutex> | ||
#include <thread> | ||
|
||
#include <glib/gi18n.h> | ||
#include <glib/gstdio.h> | ||
#include <glog/logging.h> | ||
#include <poll.h> | ||
#include <sys/stat.h> | ||
|
||
#include "iptux-core/Exception.h" | ||
#include "iptux-core/Models.h" | ||
#include "iptux-core/internal/Command.h" | ||
#include "iptux-core/internal/RecvFileData.h" | ||
#include "iptux-core/internal/SendFile.h" | ||
|
@@ -477,12 +475,13 @@ bool CoreThread::SendMessage(CPPalInfo palInfo, const string& message) { | |
return true; | ||
} | ||
|
||
bool CoreThread::SendMessage(CPPalInfo pal, const ChipData& chipData) { | ||
auto ptr = chipData.data.c_str(); | ||
switch (chipData.type) { | ||
bool CoreThread::SendMessage(CPPalInfo pal, | ||
enum GroupMsgOption option, | ||
shared_ptr<ChipData> chipData) { | ||
switch (chipData->type) { | ||
case MessageContentType::STRING: | ||
/* 文本类型 */ | ||
return SendMessage(pal, chipData.data); | ||
return SendMessage(pal, chipData->data); | ||
case MESSAGE_CONTENT_TYPE_PICTURE: | ||
/* 图片类型 */ | ||
int sock; | ||
|
@@ -491,22 +490,25 @@ bool CoreThread::SendMessage(CPPalInfo pal, const ChipData& chipData) { | |
strerror(errno)); | ||
return false; | ||
} | ||
Command(*this).SendSublayer(sock, pal, IPTUX_MSGPICOPT, ptr); | ||
Command(*this).SendSublayer(sock, pal, IPTUX_MSGPICOPT, | ||
chipData->data.c_str()); | ||
Comment on lines
+493
to
+494
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. issue (bug_risk): Potential resource leak Ensure that the socket is closed in case of an exception to avoid potential resource leaks. |
||
close(sock); // 关闭网络套接口 | ||
/*/* 删除此图片 */ | ||
if (chipData.GetDeleteFileAfterSent()) { | ||
unlink(ptr); // 此文件已无用处 | ||
} | ||
return true; | ||
default: | ||
g_assert_not_reached(); | ||
} | ||
} | ||
|
||
bool CoreThread::SendMsgPara(shared_ptr<MsgPara> para) { | ||
return SendMsgPara(para->getPal(), IPTUX_REGULAROPT, para); | ||
} | ||
|
||
bool CoreThread::SendMsgPara(CPPalInfo pal, | ||
enum GroupMsgOption option, | ||
shared_ptr<MsgPara> para) { | ||
for (int i = 0; i < int(para->dtlist.size()); ++i) { | ||
if (!SendMessage(para->getPal(), para->dtlist[i])) { | ||
LOG_ERROR("send message failed: %s", para->dtlist[i].ToString().c_str()); | ||
if (!SendMessage(pal, para->dtlist[i])) { | ||
LOG_ERROR("send message failed: %s", para->dtlist[i]->ToString().c_str()); | ||
return false; | ||
} | ||
} | ||
|
@@ -709,6 +711,13 @@ void CoreThread::SendUnitMessage(const PalKey& palKey, | |
Command(*this).SendUnitMsg(udpSock, GetPal(palKey), opttype, message.c_str()); | ||
} | ||
|
||
void CoreThread::SendUnitMessage(const PalKey& palKey, | ||
enum GroupMsgOption opttype, | ||
std::shared_ptr<MsgPara> msgPara) { | ||
auto pal = ((const CoreThread*)this)->GetPal(palKey); | ||
SendMsgPara(pal, msgPara); | ||
} | ||
|
||
void CoreThread::SendGroupMessage(const PalKey& palKey, | ||
const std::string& message) { | ||
Command(*this).SendGroupMsg(udpSock, GetPal(palKey), message.c_str()); | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -26,6 +26,8 @@ using namespace std; | |||||||||||
|
||||||||||||
namespace iptux { | ||||||||||||
|
||||||||||||
// MARK: PalInfo | ||||||||||||
|
||||||||||||
PalInfo::PalInfo(in_addr ipv4, uint16_t port) | ||||||||||||
: segdes(NULL), photo(NULL), sign(NULL), packetn(0), rpacketn(0) { | ||||||||||||
this->ipv4_ = ipv4; | ||||||||||||
|
@@ -120,6 +122,8 @@ string PalInfo::toString() const { | |||||||||||
int(rpacketn), compatible, online, changed, in_blacklist); | ||||||||||||
} | ||||||||||||
|
||||||||||||
// MARK: FileInfo | ||||||||||||
|
||||||||||||
FileInfo::FileInfo() | ||||||||||||
: fileid(0), | ||||||||||||
packetn(0), | ||||||||||||
|
@@ -160,6 +164,17 @@ void FileInfo::ensureFilesizeFilled() { | |||||||||||
filesize = afs.ftwsize(filepath); | ||||||||||||
} | ||||||||||||
|
||||||||||||
bool FileInfo::operator==(const FileInfo& rhs) const { | ||||||||||||
const FileInfo& lhs = *this; | ||||||||||||
return lhs.fileid == rhs.fileid && lhs.packetn == rhs.packetn && | ||||||||||||
lhs.fileattr == rhs.fileattr && lhs.filesize == rhs.filesize && | ||||||||||||
lhs.finishedsize == rhs.finishedsize && | ||||||||||||
lhs.filectime == rhs.filectime && lhs.filemtime == rhs.filemtime && | ||||||||||||
lhs.filenum == rhs.filenum; | ||||||||||||
} | ||||||||||||
|
||||||||||||
// MARK: MsgPara | ||||||||||||
|
||||||||||||
MsgPara::MsgPara(CPPalInfo pal) | ||||||||||||
: stype(MessageSourceType::PAL), | ||||||||||||
btype(GROUP_BELONG_TYPE_REGULAR), | ||||||||||||
|
@@ -171,14 +186,65 @@ string MsgPara::getSummary() const { | |||||||||||
if (this->dtlist.empty()) { | ||||||||||||
return _("Empty Message"); | ||||||||||||
} | ||||||||||||
return this->dtlist[0].getSummary(); | ||||||||||||
return this->dtlist[0]->getSummary(); | ||||||||||||
} | ||||||||||||
|
||||||||||||
// MARK: ChipData | ||||||||||||
|
||||||||||||
shared_ptr<ChipData> ChipData::newTxtMsg(const std::string& text) { | ||||||||||||
return shared_ptr<ChipData>(new ChipData(text)); | ||||||||||||
} | ||||||||||||
|
||||||||||||
shared_ptr<ChipData> ChipData::newImgMsg(const std::string& text, | ||||||||||||
bool deleteFileAfterSent) { | ||||||||||||
auto res = | ||||||||||||
shared_ptr<ChipData>(new ChipData(MessageContentType::PICTURE, text)); | ||||||||||||
res->deleteFileAfterSent = deleteFileAfterSent; | ||||||||||||
Comment on lines
+200
to
+202
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. suggestion: Consider using make_shared for shared_ptr creation Using make_shared is generally more efficient and safer than using new with shared_ptr. It performs a single memory allocation for both the control block and the object.
Suggested change
|
||||||||||||
return res; | ||||||||||||
} | ||||||||||||
|
||||||||||||
ChipData::ChipData(const string& data) | ||||||||||||
: type(MessageContentType::STRING), data(data) {} | ||||||||||||
ChipData::ChipData(MessageContentType type, const string& data) | ||||||||||||
: type(type), data(data) {} | ||||||||||||
ChipData::~ChipData() {} | ||||||||||||
ChipData::~ChipData() { | ||||||||||||
if (type == MessageContentType::PICTURE && deleteFileAfterSent) { | ||||||||||||
g_unlink(data.c_str()); | ||||||||||||
} | ||||||||||||
} | ||||||||||||
|
||||||||||||
string ChipData::ToString() const { | ||||||||||||
ostringstream oss; | ||||||||||||
oss << "ChipData("; | ||||||||||||
switch (type) { | ||||||||||||
case MessageContentType::STRING: | ||||||||||||
oss << "MessageContentType::STRING"; | ||||||||||||
break; | ||||||||||||
case MessageContentType::PICTURE: | ||||||||||||
oss << "MessageContentType::PICTURE"; | ||||||||||||
break; | ||||||||||||
default: | ||||||||||||
g_assert_not_reached(); | ||||||||||||
} | ||||||||||||
oss << ", "; | ||||||||||||
oss << data; | ||||||||||||
oss << ")"; | ||||||||||||
return oss.str(); | ||||||||||||
} | ||||||||||||
|
||||||||||||
string ChipData::getSummary() const { | ||||||||||||
switch (type) { | ||||||||||||
case MessageContentType::STRING: | ||||||||||||
return data; | ||||||||||||
case MessageContentType::PICTURE: | ||||||||||||
return _("Received an image"); | ||||||||||||
default: | ||||||||||||
g_assert_not_reached(); | ||||||||||||
} | ||||||||||||
return ""; | ||||||||||||
} | ||||||||||||
|
||||||||||||
// MARK: NetSegment | ||||||||||||
|
||||||||||||
NetSegment::NetSegment() {} | ||||||||||||
|
||||||||||||
|
@@ -223,36 +289,7 @@ NetSegment NetSegment::fromJsonValue(Json::Value& value) { | |||||||||||
return res; | ||||||||||||
} | ||||||||||||
|
||||||||||||
string ChipData::ToString() const { | ||||||||||||
ostringstream oss; | ||||||||||||
oss << "ChipData("; | ||||||||||||
switch (type) { | ||||||||||||
case MessageContentType::STRING: | ||||||||||||
oss << "MessageContentType::STRING"; | ||||||||||||
break; | ||||||||||||
case MessageContentType::PICTURE: | ||||||||||||
oss << "MessageContentType::PICTURE"; | ||||||||||||
break; | ||||||||||||
default: | ||||||||||||
g_assert_not_reached(); | ||||||||||||
} | ||||||||||||
oss << ", "; | ||||||||||||
oss << data; | ||||||||||||
oss << ")"; | ||||||||||||
return oss.str(); | ||||||||||||
} | ||||||||||||
|
||||||||||||
string ChipData::getSummary() const { | ||||||||||||
switch (type) { | ||||||||||||
case MessageContentType::STRING: | ||||||||||||
return data; | ||||||||||||
case MessageContentType::PICTURE: | ||||||||||||
return _("Received an image"); | ||||||||||||
default: | ||||||||||||
g_assert_not_reached(); | ||||||||||||
} | ||||||||||||
return ""; | ||||||||||||
} | ||||||||||||
// MARK: PalKey | ||||||||||||
|
||||||||||||
PalKey::PalKey(in_addr ipv4, int port) : ipv4(ipv4), port(port) {} | ||||||||||||
|
||||||||||||
|
@@ -268,13 +305,4 @@ string PalKey::ToString() const { | |||||||||||
return stringFormat("%s:%d", inAddrToString(ipv4).c_str(), port); | ||||||||||||
} | ||||||||||||
|
||||||||||||
bool FileInfo::operator==(const FileInfo& rhs) const { | ||||||||||||
const FileInfo& lhs = *this; | ||||||||||||
return lhs.fileid == rhs.fileid && lhs.packetn == rhs.packetn && | ||||||||||||
lhs.fileattr == rhs.fileattr && lhs.filesize == rhs.filesize && | ||||||||||||
lhs.finishedsize == rhs.finishedsize && | ||||||||||||
lhs.filectime == rhs.filectime && lhs.filemtime == rhs.filemtime && | ||||||||||||
lhs.filenum == rhs.filenum; | ||||||||||||
} | ||||||||||||
|
||||||||||||
} // namespace iptux |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
issue (bug_risk): Null pointer check for chipData
Ensure that
chipData
is not null before dereferencing it to avoid potential null pointer dereference.