====== 消息 ======
----
===== 发送消息 =====
发送文本、语音、图片、位置等消息(单聊/群聊/聊天室通用,只是一个参数的差别)。
====发送文本消息====
//创建消息体
EMMessageBodyPtr body = EMTextMessageBodyPtr(new EMTextMessageBody(content.c_str()));
CefStringUTF8 utf8(content);
//聊天类型:单聊
EMMessage::EMChatType type = EMMessage::SINGLE;
if (isGoupChat.compare("groupchat") == 0)
{
if (roomType.compare("true") == 0)
{
type = EMMessage::CHATROOM;//聊天室
}
else
{
type = EMMessage::GROUP;//群聊
}
}
//创建待发消息
EMMessagePtr msg = EMMessage::createSendMessage(g_client->getLoginInfo().loginUser(), to,
body, type);
EMCallbackPtr msgCallback(new EMCallback(m_coh,
[=](void)->bool
{
string enc = URLEncode(utf8);
callback->Success(enc.c_str());
return true;
},
[=](const easemob::EMErrorPtr)->bool
{
return false;
},
[](int){}));
//设置消息回调
msg->setCallback(msgCallback);
//发送消息
g_client->getChatManager().sendMessage(msg);
====发送文件类消息====
OPENFILENAME ofn; // common dialog box structure
TCHAR szFile[260]; // buffer for file name
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = ::GetDesktopWindow();
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = L"所有文件(*.*)\0*.*\0\0";
if (type.compare("img") == 0)
{
ofn.lpstrFilter = L"图像文件(*.bmp;*.jpg;*.png;*.gif)\0*.bmp;*.jpg;*.png;*.gif\0\0";
}
else if (type.compare("aud") == 0)
{
ofn.lpstrFilter = L"音频文件(*.mp3;*.amr;*.wmv)\0*.mp3;*.amr;*.wmv\0\0";
}
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
//打开系统文件对话框
if (GetOpenFileName(&ofn) == TRUE)
{
//获取文件路径
std::wstring sAttach = ofn.lpstrFile;
CefStringUTF8 utf8(sAttach);
//根据消息类型创建不同类型的消息体
EMMessageBodyPtr body;
if (type.compare("aud") == 0)
{
body = EMFileMessageBodyPtr(new EMFileMessageBody(utf8.ToString().c_str()));
}
else if (type.compare("img") == 0)
{
body = EMImageMessageBodyPtr(new EMImageMessageBody(utf8.ToString().c_str(), ""));
}
else if (type.compare("file") == 0)
{
body = EMFileMessageBodyPtr(new EMFileMessageBody(utf8.ToString().c_str()));
}
//聊天类型
EMMessage::EMChatType chatType = EMMessage::SINGLE;
if (isGoupChat.compare("groupchat") == 0)
{
if (roomType.compare("true") == 0)
{
chatType = EMMessage::CHATROOM;
}
else
{
chatType = EMMessage::GROUP;
}
}
//创建消息
EMMessagePtr msg = EMMessage::createSendMessage(g_client->getLoginInfo().loginUser(), to,
body, chatType);
EMCallbackPtr msgCallback(new EMCallback(m_coh,
[=](void)->bool
{
string enc = URLEncode(utf8);
callback->Success(enc.c_str());
return true;
},
[=](const easemob::EMErrorPtr)->bool
{
return false;
},
[](int){}));
//设置消息回调
msg->setCallback(msgCallback);
//发送消息
g_client->getChatManager().sendMessage(msg);
}
=====接收消息=====
//消息监听类头文件
class ChatListener : public EMChatManagerListener {
public:
ChatListener()
{
}
virtual void onReceiveMessages(const EMMessageList &messages);
private:
EMCallbackObserverHandle m_coh;
void onTextMessage(const EMMessagePtr msg, const EMMessageBodyPtr _body, string sChatType);
void onFileMessage(const EMMessagePtr msg, const EMMessageBodyPtr _body, string sChatType);
void onImageMessage(const EMMessagePtr msg, const EMMessageBodyPtr _body, string sChatType);
void onVoiceMessage(const EMMessagePtr msg, const EMMessageBodyPtr _body, string sChatType);
void onVideoMessage(const EMMessagePtr msg, const EMMessageBodyPtr _body, string sChatType);
void onLocationMessage(const EMMessagePtr msg, const EMMessageBodyPtr _body, string sChatType);
string getJSHead(const EMMessagePtr msg, string sChatType, string JSFuncName);
string getJSTail(const EMMessageBodyPtr _body, string type);
void CallJSWithoutFilePath(string strJSHead, string strJSTail);
void CallJSWithFilePath(string strJSHead, string strJSTail, string strPath);
};
...
...
//消息监听类实现文件
void ChatListener::onReceiveMessages(const EMMessageList &messages)
{
HANDLE hObject[2];
hObject[0] = Utils::g_RosterDownloaded;
hObject[1] = Utils::g_GroupListDownloaded;
WaitForMultipleObjects(2, hObject, TRUE, INFINITE);
for (EMMessagePtr msg : messages)
{
EMMessage::EMChatType type = msg->chatType();
string sChatType = "chat";
if (type == EMMessage::GROUP)
{
sChatType = "groupchat";
}
else if (type == EMMessage::CHATROOM)
{
sChatType = "chatroom";
}
const vector &bodies = msg->bodies();
const EMMessageBodyPtr _body = bodies[0];
switch (_body->type())
{
case EMMessageBody::TEXT:
{
onTextMessage(msg, _body, sChatType);
break;
}
case EMMessageBody::FILE:
{
onFileMessage(msg, _body, sChatType);
break;
}
case EMMessageBody::IMAGE:
{
onImageMessage(msg, _body, sChatType);
break;
}
case EMMessageBody::VOICE:
{
onVoiceMessage(msg, _body, sChatType);
break;
}
case EMMessageBody::COMMAND:
break;
case EMMessageBody::VIDEO:
{
onVideoMessage(msg, _body, sChatType);
break;
}
case EMMessageBody::LOCATION:
{
onLocationMessage(msg, _body, sChatType);
break;
}
}
}
}
void ChatListener::onTextMessage(const EMMessagePtr msg, const EMMessageBodyPtr _body, string sChatType)
{
EMTextMessageBodyPtr body = std::dynamic_pointer_cast(_body);
std::stringstream stream;
stream << "Demo.conn.onTextMessage('{id: \"";
stream << msg->msgId();
stream << "\",type : \"";
stream << sChatType;
stream << "\", from : \"";
stream << msg->from();
stream << "\",to : \"";
stream << msg->to();
stream << "\",data : \"";
stream << Utils::URLEncode(body->text());
stream << "\",ext : \"\"}');";
Utils::CallJS(stream);
}
void ChatListener::onFileMessage(const EMMessagePtr msg, const EMMessageBodyPtr _body, string sChatType)
{
EMFileMessageBodyPtr body = std::dynamic_pointer_cast(_body);
string strJSHead = getJSHead(msg, sChatType,"onFileMessage");
string strJSTail = getJSTail(_body, "file");
CallJSWithoutFilePath(strJSHead, strJSTail);
EMCallbackPtr msgCallback(new EMCallback(m_coh,
[=](void)->bool
{
if (EMFileMessageBody::SUCCESSED == body->downloadStatus())
{
CallJSWithFilePath(strJSHead, strJSTail, GetPathForWebPage(body->localPath()));
}
return true;
},
[=](const easemob::EMErrorPtr)->bool
{
return false;
},
[](int){}));
msg->setCallback(msgCallback);
g_client->getChatManager().downloadMessageAttachments(msg);
}
...
...
//注册消息监听类
ChatListener *mChatListener;
mChatListener = new ChatListener();
g_client->getChatManager().addListener(mChatListener);
----
上一页:[[im:windows:intro:integration|Windows SDK 集成说明]]
下一页:[[im:windows:basics:buddy|好友管理]]