====== 消息 ====== ---- ===== 发送消息 ===== 发送文本、语音、图片、位置等消息(单聊/群聊/聊天室通用,只是一个参数的差别)。 ====发送文本消息==== //创建消息体 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:windowssdk:sdkintegration|Windows SDK 集成说明]] 下一页:[[im:windowssdk:contact|好友管理]]