消息


发送消息

发送文本、语音、图片、位置等消息(单聊/群聊/聊天室通用,只是一个参数的差别)。

发送文本消息

	//创建消息体
	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<EMMessageBodyPtr> &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<EMTextMessageBody, EMMessageBody>(_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<EMFileMessageBody, EMMessageBody>(_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);


下一页:好友管理