BOOL SessionLayout::_DisplayMsgToIE(IN MessageEntity msg) { CString jsInterface = _T("sendMessage"); module::UserInfoEntity userInfo; if (!module::getUserListModule()->getUserInfoBySId(msg.talkerSid, userInfo)) { return FALSE; } Json::Value root; root["name"] = util::cStringToString(userInfo.getRealName()); root["avatar"] = userInfo.getAvatarPathWithoutOnlineState(); root["msgtype"] = msg.msgRenderType; root["uuid"] = msg.talkerSid; root["mtype"] = msg.isMySendMsg() ? "me" : "other"; CTime timeData(msg.msgTime); root["time"] = util::cStringToString(timeData.Format(_T("%Y-%m-%d %H:%M:%S"))); //语音内容特殊处理 if (MESSAGE_RENDERTYPE_AUDIO == msg.msgRenderType) { root["voiceid"] = msg.content; CString sVoicetime; sVoicetime.Format(_T("%d秒"), msg.msgAudioTime); root["voicetime"] = util::cStringToString(sVoicetime); root["voiceisread"] = msg.msgAudioReaded ? std::string("true") : string("false"); } else { CString csContent = util::stringToCString(msg.content); ReceiveMsgManage::getInstance()->parseContent(csContent, FALSE, GetWidth()); std::string content = util::cStringToString(csContent); root["content"] = content; } Json::StyledWriter styleWrite; std::string record = styleWrite.write(root); Json::Reader jsonRead; Json::Value rootRead; CString jsData = _T("[]"); if (!jsonRead.parse(record, rootRead) || rootRead.isNull()) { CString csError = util::stringToCString(record, CP_UTF8); LOG__(APP, _T("json parse error:%s"), csError); jsData = _T("[]"); return FALSE; } else jsData = util::stringToCString(record, CP_UTF8); //调用页面的JS代码 if (m_pWebBrowser) { VARIANT VarResult; if (!m_pWebBrowser->CallJScript(jsInterface.GetBuffer(), jsData.GetBuffer(), &VarResult)) { LOG__(ERR, _T("CallJScript failed:%s"),jsData); } jsData.ReleaseBuffer(); } return TRUE; }
void FileTransferSocket::_fileLoginResponse(IN std::string& body) { IM::File::IMFileLoginRsp imFileLoginRsp; if (!imFileLoginRsp.ParseFromString(body)) { LOG__(ERR, _T("parse failed,body:%s"), util::stringToCString(body)); return; } if (imFileLoginRsp.result_code() != 0) { LOG__(ERR, _T("file server login failed! ")); return; } //打开文件 std::string taskId = imFileLoginRsp.task_id(); TransferFileEntity fileEntity; if (!TransferFileEntityManager::getInstance()->getFileInfoByTaskId(taskId, fileEntity)) { LOG__(ERR, _T("file server login:can't find the fileInfo ")); return; } LOG__(APP, _T("IMFileLoginRsp, file server login succeed")); //提示界面,界面上插入该项 if (IM::BaseDefine::ClientFileRole::CLIENT_REALTIME_SENDER == fileEntity.nClientMode || IM::BaseDefine::ClientFileRole::CLIENT_OFFLINE_UPLOAD == fileEntity.nClientMode) { module::getFileTransferModule()->asynNotifyObserver(module::KEY_FILETRANSFER_SENDFILE, fileEntity.sTaskID); } else if (IM::BaseDefine::ClientFileRole::CLIENT_REALTIME_RECVER == fileEntity.nClientMode || IM::BaseDefine::ClientFileRole::CLIENT_OFFLINE_DOWNLOAD == fileEntity.nClientMode) { module::getFileTransferModule()->asynNotifyObserver(module::KEY_FILETRANSFER_REQUEST, fileEntity.sTaskID); } }
BOOL DatabaseModule_Impl::_execImMessageCreateTableDML() { try { m_pSqliteDB->execDML(createImMessageSql.c_str()); m_pSqliteDB->execDML(createImMessageIndex.c_str()); } catch (CppSQLite3Exception& sqliteException) { CString csErrMsg = util::stringToCString(sqliteException.errorMessage(), CP_UTF8); LOG__(ERR, _T("create table failed,error msg:%s") , csErrMsg); #ifdef _DEBUG MessageBoxA(0, sqliteException.errorMessage(), "BD ERROR", MB_OK | MB_ICONHAND); #endif return FALSE; } catch (...) { LOG__(ERR, _T("create table unknown exception")); return FALSE; } return TRUE; }
void FileTransferModule_Impl::_hasOfflineRes(IN std::string& body) { IM::File::IMFileHasOfflineRsp imFileHasOfflineRsp; if (!imFileHasOfflineRsp.ParseFromString(body)) { LOG__(ERR, _T("parse failed,body:%s"), util::stringToCString(body)); return; } UINT32 nFileNum = imFileHasOfflineRsp.offline_file_list_size(); for (UINT32 i = nFileNum; i > 0; --i) { const IM::BaseDefine::OfflineFileInfo& offLineInfo = imFileHasOfflineRsp.offline_file_list(i - 1); TransferFileEntity fileInfo; fileInfo.sFromID = util::uint32ToString(offLineInfo.from_user_id()); fileInfo.sToID = module::getSysConfigModule()->userID(); fileInfo.nFileSize = offLineInfo.file_size(); fileInfo.sTaskID = offLineInfo.task_id(); fileInfo.sFileName = offLineInfo.file_name(); fileInfo.nClientMode = IM::BaseDefine::ClientFileRole::CLIENT_OFFLINE_DOWNLOAD; const IM::BaseDefine::IpAddr& ipAdd = offLineInfo.ip_addr_list(0); fileInfo.sIP = ipAdd.ip(); fileInfo.nPort = ipAdd.port(); fileInfo.time = static_cast<UInt32>(time(0)); if (TransferFileEntityManager::getInstance()->pushTransferFileEntity(fileInfo)) { LOG__(APP, _T("离线文件 sFileID = %s"), util::stringToCString(fileInfo.sTaskID)); TransferFileEntityManager::getInstance()->openFileSocketByTaskId(fileInfo.sTaskID); } } }
void SessionLayout::_AsynSendReadAck(IN MessageEntity& msg) { if (MESSAGE_RENDERTYPE_SYSTEMTIPS == msg.msgRenderType || MESSAGE_RENDERTYPE_FILETRANSFER == msg.msgRenderType) { LOG__(APP, _T("not send read ack msgRenderType:%d"),msg.msgRenderType); return; } if (MESSAGE_TYPE_HISTORY == msg.msgStatusType || MESSAGE_TYPE_NONE == msg.msgStatusType) { LOG__(APP, _T("Not runtime or offline msgStatusType:%d,msgId:%d"), msg.msgStatusType,msg.msgId); return; } imcore::IMLibCoreStartOperationWithLambda( [=]()mutable { std::string OriginSessionId = msg.getOriginSessionId(); IM::Message::IMMsgDataReadAck imMsgDataReadAck; imMsgDataReadAck.set_user_id(module::getSysConfigModule()->userId()); imMsgDataReadAck.set_session_id(util::stringToInt32(OriginSessionId)); imMsgDataReadAck.set_msg_id(msg.msgId); imMsgDataReadAck.set_session_type(static_cast<IM::BaseDefine::SessionType>(msg.msgSessionType)); module::getTcpClientModule()->sendPacket(IM::BaseDefine::SID_MSG, IM::BaseDefine::CID_MSG_READ_ACK, &imMsgDataReadAck); },0, imcore::OPERATION_NAME_MSG_READ_ACK ); }
void ReceiveMsgManage::removeAllMessage() { CAutoLock lock(&m_lock); //记录下程序退出时所有的消息列表,并且记录下来,这个会成为离线消息 SessionMessageMap::iterator iterMap = m_mapSessionMsg.begin(); LOG__(ERR, _T("MessageMananger unread message trace begin:")); for (; iterMap != m_mapSessionMsg.end(); ++iterMap) { SessionMessage_List msgList; if (popMessagesBySId(iterMap->first, msgList)) { SessionMessage_List::iterator iter = msgList.begin(); for (; iter != msgList.end(); ++iter) { MessageEntity& msg = *iter; CString csUId = util::stringToCString(msg.talkerSid); CString csCnt = util::stringToCString(msg.content, CP_UTF8); CTime time(msg.msgTime); CString csTime = time.Format(_T("%Y-%m-%d %H:%M:%S")); LOG__(DEBG, _T("time:%s id:%s,content:%s"), csTime, csUId, csCnt); } } } LOG__(DEBG, _T("MessageMananger unread message trace end")); m_mapSessionMsg.clear(); }
void MainListLayout::_UpdateRecentSessionItem(IN const std::string& sessionId, IN const UInt32 sessionType) { SessionListItemInfo item; item.folder = false; item.empty = false; if (IM::BaseDefine::SessionType::SESSION_TYPE_GROUP == static_cast<IM::BaseDefine::SessionType>(sessionType)) { module::GroupInfoEntity groupInfo; if (!module::getGroupListModule()->getGroupInfoBySId(sessionId, groupInfo)) { LOG__(ERR, _T("Can't get the groupInfo, groupId = %s"), util::stringToCString(sessionId)); return; } item.id = util::stringToCString(groupInfo.gId); item.avatarPath = util::stringToCString(groupInfo.getAvatarPath()); item.nickName = groupInfo.csName; m_UIRecentConnectedList->UpdateItemInfo(item); } else if (IM::BaseDefine::SessionType::SESSION_TYPE_SINGLE == static_cast<IM::BaseDefine::SessionType>(sessionType)) { module::UserInfoEntity userInfo; if (!module::getUserListModule()->getUserInfoBySId(sessionId, userInfo)) { LOG__(ERR, _T("Can't get the userInfo, userId = %s"), util::stringToCString(sessionId)); return; } item.id = util::stringToCString(userInfo.sId); item.avatarPath = util::stringToCString(userInfo.getAvatarPath()); item.nickName = userInfo.getRealName(); m_UIRecentConnectedList->UpdateItemInfo(item); } }
BOOL DatabaseModule_Impl::sqlDeleteGroupInfoEntity(IN const std::string& groupId) { try { CppSQLite3Statement stmt = m_pSqliteDB->compileStatement(deleteGroupInfoSql.c_str()); stmt.bind(1, groupId.c_str()); stmt.execDML(); } catch (CppSQLite3Exception& sqliteException) { #ifdef _DEBUG MessageBoxA(0, sqliteException.errorMessage(), "BD ERROR", MB_OK | MB_ICONHAND); #endif CString csErrMsg = util::stringToCString(sqliteException.errorMessage(), CP_UTF8); LOG__(ERR, _T("delete failed,error msg:%s"), csErrMsg); return FALSE; } catch (...) { LOG__(ERR, _T("db unknown exception")); return FALSE; } return TRUE; }
void FileTransferSocket::onConnectDone() { LOG__(APP, _T("FileTransferSocket::onConnected()")); startHeartbeat(); TransferFileEntity info; if (!TransferFileEntityManager::getInstance()->getFileInfoByTaskId(m_sTaskId, info)) { LOG__(APP, _T("Can't get the file info,task id:%s"),util::stringToCString(m_sTaskId)); return; } //拉模式文件传输,传输taskid、token、client_mode IM::File::IMFileLoginReq imFileLoginReq; imFileLoginReq.set_user_id(module::getSysConfigModule()->userId()); imFileLoginReq.set_task_id(info.sTaskID); imFileLoginReq.set_file_role(static_cast<IM::BaseDefine::ClientFileRole>(info.nClientMode)); LOG__(APP, _T("IMFileLoginReq,sTaskID:%s,nClientMode:%d"), util::stringToCString(info.sTaskID), info.nClientMode); //send packet LOG__(APP, _T("IMFileLoginReq,taskId:%s"), util::stringToCString(info.sTaskID)); sendPacket(IM::BaseDefine::ServiceID::SID_FILE, IM::BaseDefine::FileCmdID::CID_FILE_LOGIN_REQ, &imFileLoginReq); //CImPduClientFileLoginReq pduFileLoginReq(module::getSysConfigModule()->userID().c_str() // , "", info.sTaskID.c_str(), ); //sendPacket(&pduFileLoginReq); }
BOOL DatabaseModule_Impl::sqlInsertOrReplaceGroupInfoEntity(IN const module::GroupInfoEntity& groupInfo) { try { CppSQLite3Statement stmt = m_pSqliteDB->compileStatement(insertGroupInfoSql.c_str()); stmt.bind(1, groupInfo.gId.c_str()); stmt.bind(2, util::cStringToString(groupInfo.csName).c_str()); stmt.bind(3, util::cStringToString(groupInfo.desc).c_str()); stmt.bind(4, groupInfo.avatarUrl.c_str()); stmt.bind(5, groupInfo.creatorId.c_str()); stmt.bind(6, int(groupInfo.type)); stmt.bind(7, int(groupInfo.version)); stmt.bind(8, int(groupInfo.groupUpdated)); stmt.bind(9, int(groupInfo.shieldStatus)); std::string& strJson = _makeJsonForGroupMembers(groupInfo.groupMemeberList); stmt.bind(10, strJson.c_str()); stmt.execDML(); } catch (CppSQLite3Exception& sqliteException) { #ifdef _DEBUG MessageBoxA(0, sqliteException.errorMessage(), "BD ERROR", MB_OK | MB_ICONHAND); #endif CString csErrMsg = util::stringToCString(sqliteException.errorMessage(), CP_UTF8); LOG__(ERR, _T("insert failed,error msg:%s"), csErrMsg); return FALSE; } catch (...) { LOG__(ERR, _T("db unknown exception")); return FALSE; } return TRUE; }
void DatabaseModule_Impl::_parseJsonForGroupMembers(IN std::string strJson, OUT std::list<std::string>& groupMemeberList) { Json::Reader reader; Json::Value root; try { if (reader.parse(strJson, root) || root.isNull()) { const Json::Value arrayObj = root["UserIds"]; for (int i = 0; i < static_cast<int>(arrayObj.size()); ++i) { groupMemeberList.push_back(arrayObj[i].asString()); } } else { LOG__(ERR, _T("json parse falied! json data:%s"),util::stringToCString(strJson)); } } catch (...) { LOG__(ERR, _T("json parse falied! json data:%s"), util::stringToCString(strJson)); } }
// ----------------------------------------------------------------------------- // private void ReloginManager::doRelogin() { try { if(m_bDoReloginNow) { LOG__(APP,_T("is doing Relogin now...")); return; } //清理掉队列里面 未发送的 消息已读确认 Operation《不处理可能会引发丢消息》 imcore::IMLibCoreClearOperationByName(imcore::OPERATION_NAME_MSG_READ_ACK); LoginParam param; module::TTConfig* pCfg = module::getSysConfigModule()->getSystemConfig(); param.mySelectedStatus = pCfg->myselectStatus; param.csUserName = pCfg->userName; param.password = pCfg->password; param.csUserName.Trim(); LoginOperation* pOperation = new LoginOperation(BIND_CALLBACK_1(ReloginManager::OnOperationCallback), param); imcore::IMLibCoreStartOperation(pOperation); m_bDoReloginNow = TRUE; } catch (...) { module::getTcpClientModule()->shutdown(); startReloginTimer(++m_secondCount); LOG__(ERR, _T("relogin unknown exception")); m_bDoReloginNow = FALSE; } }
BOOL ReceiveMsgManage::pushMessageBySId(const std::string& sId, MessageEntity& msg) { if (sId.empty()) { LOG__(ERR, _T("sId is empty!")); return FALSE; } CAutoLock lock(&m_lock); try { SessionMessage_List* listChatMsg = _getChatMsgListBySID(sId); if (listChatMsg) { listChatMsg->push_back(msg); } else { SessionMessage_List listChatMsg2; listChatMsg2.push_back(msg); m_mapSessionMsg[sId] = listChatMsg2; } } catch (...) { CString csSid = util::stringToCString(sId); CString csMsgCnt = util::stringToCString(msg.content, CP_UTF8); LOG__(ERR, _T("pushMessageBySId failed,SId:%s,msg conteng:%s"), csSid, csMsgCnt); return FALSE; } return TRUE; }
void LoginModule_Impl::notifyLoginDone() { imcore::IMLibCoreStartOperationWithLambda( [] { //鑾峰彇閮ㄩ棬淇℃伅 UInt32 lastTime = module::getSysConfigModule()->getDepartmentInfoLatestUpdateTime(); IM::Buddy::IMDepartmentReq imDepartmentReq; imDepartmentReq.set_user_id(module::getSysConfigModule()->userId()); imDepartmentReq.set_latest_update_time(lastTime); module::getTcpClientModule()->sendPacket(IM::BaseDefine::ServiceID::SID_BUDDY_LIST , IM::BaseDefine::BuddyListCmdID::CID_BUDDY_LIST_DEPARTMENT_REQUEST , &imDepartmentReq); LOG__(APP, _T("IMDepartmentReq,latest update time :%d"), lastTime); //澧為噺鑾峰彇鎵�鏈変汉淇℃伅 lastTime = module::getSysConfigModule()->getUserInfoLatestUpdateTime();//鑾峰彇鏈�鍚庝竴娆℃洿鏂颁汉鍛樹俊鎭殑鏃堕棿 IM::Buddy::IMAllUserReq imAllUserReq; imAllUserReq.set_user_id(module::getSysConfigModule()->userId()); imAllUserReq.set_latest_update_time(lastTime); module::getTcpClientModule()->sendPacket(IM::BaseDefine::ServiceID::SID_BUDDY_LIST , IM::BaseDefine::BuddyListCmdID::CID_BUDDY_LIST_ALL_USER_REQUEST ,&imAllUserReq); LOG__(APP, _T("IMAllUserReq,latest update time :%d"), lastTime); //澧為噺鑾峰彇缇ゅ垪琛� IM::Group::IMNormalGroupListReq imNormalGroupListReq; imNormalGroupListReq.set_user_id(module::getSysConfigModule()->userId()); module::getTcpClientModule()->sendPacket(IM::BaseDefine::ServiceID::SID_GROUP , IM::BaseDefine::GroupCmdID::CID_GROUP_NORMAL_LIST_REQUEST , &imNormalGroupListReq); LOG__(APP, _T("IMNormalGroupListReq")); }); }
BOOL DatabaseModule_Impl::sqlUpdateRecentSessionInfoEntity(IN const module::SessionEntity& sessionInfo) { try { CppSQLite3Statement stmt = m_pSqliteDB->compileStatement(updateRecentSessionByIdSql.c_str()); stmt.bind(1, sessionInfo.sessionID.c_str()); stmt.bind(2, int(sessionInfo.sessionType)); stmt.bind(3, int(sessionInfo.updatedTime)); stmt.bind(4, int(sessionInfo.latestmsgId)); stmt.bind(5, sessionInfo.latestMsgContent.c_str()); stmt.bind(6, sessionInfo.latestMsgFromId.c_str()); stmt.bind(7, sessionInfo.sessionID.c_str()); int countUpdate = stmt.execDML(); if (0 == countUpdate) { return FALSE; } } catch (CppSQLite3Exception& sqliteException) { #ifdef _DEBUG MessageBoxA(0, sqliteException.errorMessage(), "BD ERROR", MB_OK | MB_ICONHAND); #endif CString csErrMsg = util::stringToCString(sqliteException.errorMessage(), CP_UTF8); LOG__(ERR, _T("db failed,error msg:%s"), csErrMsg); return FALSE; } catch (...) { LOG__(ERR, _T("db unknown exception")); return FALSE; } return TRUE; }
void SessionLayout::_AddGroupMemberToList(IN const std::string& sID, IN const BOOL bCreator) { module::UserInfoEntity userInfo; if (!module::getUserListModule()->getUserInfoBySId(sID, userInfo)) { LOG__(ERR, _T("can't find the userInfo:%s,GroupId:%s"),util::stringToCString(sID),util::stringToCString(m_sId)); return; } CDialogBuilder dlgBuilder; CListContainerElementUI* pListElement = (CListContainerElementUI*)dlgBuilder.Create(_T("SessionDialog\\groupMembersListItem.xml"), (UINT)0, NULL, &m_paint_manager); if (!pListElement) { LOG__(ERR, _T("群item创建失败")); return; } CButtonUI* pLogo = static_cast<CButtonUI*>(pListElement->FindSubControl(_T("AvatarInfo"))); PTR_VOID(pLogo); pLogo->SetBkImage(util::stringToCString(userInfo.getAvatarPath())); if (bCreator) { CButtonUI* pCreator = static_cast<CButtonUI*>(pListElement->FindSubControl(_T("Creator"))); PTR_VOID(pCreator); pCreator->SetVisible(true); pCreator->SetUserData(_T("Creator")); } CLabelUI* pNameLable = static_cast<CLabelUI*>(pListElement->FindSubControl(_T("nickname"))); PTR_VOID(pNameLable); pNameLable->SetText(userInfo.getRealName()); pListElement->SetUserData(util::stringToCString(userInfo.sId)); m_pGroupMemberList->Add(pListElement); }
BOOL DatabaseModule_Impl::_startup() { try { CString dbPathTemp = module::getMiscModule()->getTTCommonAppdataUserDir(); util::createAllDirectories(dbPathTemp); module::TTConfig* pCfg = module::getSysConfigModule()->getSystemConfig(); if (pCfg->csUserId.IsEmpty()) return FALSE; CString dbPath = dbPathTemp + _T("\\") + pCfg->csUserId + _T(".db"); dbPathTemp = module::getMiscModule()->getTTCommonAppdata(); CString globalDBPath = dbPathTemp + _T("\\global.db"); m_sDBPath = util::cStringToString(dbPath); m_sGlobalDBPath = util::cStringToString(globalDBPath); if (!_openDB()) { LOG__(ERR, _T("open db failed")); return FALSE; } } catch (...) { LOG__(ERR, _T("unknown exception")); return FALSE; } return TRUE; }
void LoginDialog::_DoLogin() { LOG__(APP,_T("User Clicked LoginBtn")); m_ptxtTip->SetText(_T("")); CDuiString userName = m_pedtUserName->GetText(); CDuiString password = m_pedtPassword->GetText(); if (userName.IsEmpty()) { CString csTip = util::getMultilingual()->getStringById(_T("STRID_LOGINDIALOG_USERNAME_EMPTY")); m_ptxtTip->SetText(csTip); return; } if (password.IsEmpty()) { CString csTip = util::getMultilingual()->getStringById(_T("STRID_LOGINDIALOG_PASSWORD_EMPTY")); m_ptxtTip->SetText(csTip); return; } module::TTConfig* pCfg = module::getSysConfigModule()->getSystemConfig(); pCfg->userName = userName; if (m_bPassChanged) { std::string sPass = util::cStringToString(CString(password)); char* pOutData = 0; uint32_t nOutLen = 0; int retCode = EncryptPass(sPass.c_str(), sPass.length(), &pOutData, nOutLen); if (retCode == 0 && nOutLen > 0 && pOutData != 0) { pCfg->password = std::string(pOutData, nOutLen); Free(pOutData); } else { LOG__(ERR, _T("EncryptPass Failed!")); CString csTip = util::getMultilingual()->getStringById(_T("STRID_LOGINDIALOG_LOGIN_ENCRYPT_PASE_FAIL")); m_ptxtTip->SetText(csTip); return; } } pCfg->isRememberPWD = m_pChkRememberPWD->GetCheck(); module::getSysConfigModule()->saveData(); CString csTxt = util::getMultilingual()->getStringById(_T("STRID_LOGINDIALOG_BTN_DOLOGIN")); m_pBtnLogin->SetText(csTxt); m_pBtnLogin->SetEnabled(false); //连接登陆服务器 DoLoginServerParam param; DoLoginServerHttpOperation* pOper = new DoLoginServerHttpOperation( BIND_CALLBACK_1(LoginDialog::OnHttpCallbackOperation), param); module::getHttpPoolModule()->pushHttpOperation(pOper); }
void FileTransferModule_Impl::_sendfileResponse(IN std::string& body) { IM::File::IMFileRsp imFileRsp; if (!imFileRsp.ParseFromString(body)) { LOG__(ERR, _T("parse failed,body:%s"), util::stringToCString(body)); return; } UInt32 nResult = imFileRsp.result_code(); if (nResult != 0) { LOG__(ERR, _T("_sendfileResponse result != 0")); module::getFileTransferModule()->asynNotifyObserver(module::KEY_FILESEVER_UPLOAD_FAILED); } TransferFileEntity fileEntity; fileEntity.sTaskID = imFileRsp.task_id(); assert(!fileEntity.sTaskID.empty()); fileEntity.sFromID = util::uint32ToString(imFileRsp.from_user_id()); fileEntity.sToID = util::uint32ToString(imFileRsp.to_user_id()); fileEntity.sFileName = imFileRsp.file_name(); fileEntity.setSaveFilePath(util::stringToCString(fileEntity.sFileName));//发送方文件地址,就是保存地址 fileEntity.time = static_cast<UInt32>(time(0)); uint32_t transMode = imFileRsp.trans_mode(); if (IM::BaseDefine::FileType::FILE_TYPE_ONLINE == transMode) { fileEntity.nClientMode = IM::BaseDefine::ClientFileRole::CLIENT_REALTIME_SENDER; } else if (IM::BaseDefine::FileType::FILE_TYPE_OFFLINE == transMode) { fileEntity.nClientMode = IM::BaseDefine::ClientFileRole::CLIENT_OFFLINE_UPLOAD; } fileEntity.pFileObject = new TransferFile(util::stringToCString(fileEntity.sFileName),FALSE); if (fileEntity.pFileObject) { fileEntity.nFileSize = fileEntity.pFileObject->length(); } UINT32 nIPCount = imFileRsp.ip_addr_list_size(); if (nIPCount <= 0) { return; } const IM::BaseDefine::IpAddr& ipAdd = imFileRsp.ip_addr_list(0); fileEntity.sIP = ipAdd.ip(); fileEntity.nPort = ipAdd.port(); if (!TransferFileEntityManager::getInstance()->pushTransferFileEntity(fileEntity)) TransferFileEntityManager::getInstance()->updateFileInfoBysTaskID(fileEntity); LOG__(DEBG, _T("FileTransferSevice_Impl::准备连接文件服务器 sTaskId = %s"), util::stringToCString(fileEntity.sTaskID)); TransferFileEntityManager::getInstance()->openFileSocketByTaskId(fileEntity.sTaskID); }
BOOL AudioMessageMananger::saveAudioDataToFile(IN UCHAR* data, IN UINT32 lenth, IN std::string sFileName) { if (lenth <= 4) { LOG__(ERR, _T("lenth<=4")); return FALSE; } CString sFilePath = module::getMiscModule()->GetAudioFileSavedPath(); if (!::PathIsDirectory(sFilePath)) { util::createAllDirectories(sFilePath); sFilePath += _T("\\"); } sFilePath += util::stringToCString(sFileName, CP_UTF8); if (util::isFileExist(sFilePath)) { return TRUE; } HANDLE hFile = CreateFile(sFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { DWORD res = GetLastError(); LOG__(ERR, _T("CreateFile error:GetLastError = %d"), res); return FALSE; } ::SetFilePointer(hFile, 0, 0, FILE_END); DWORD lret = 0; BOOL bRes = WriteFile(hFile, (LPCVOID)data, lenth, &lret, NULL); if (!bRes) { DWORD res = GetLastError(); LOG__(ERR, _T("WriteFile error:GetLastError = %d"), res); return FALSE; } if (NULL != hFile) { CloseHandle(hFile); hFile = NULL; } return TRUE; }
BOOL AudioMessageMananger::playAudioMsgByAudioSid(IN const std::string& sSessionID, IN const std::string& sAID) { if (sAID.empty() || sSessionID.empty()) { LOG__(ERR, _T("date error,sSessionID:%s ,sAID:%s"), util::stringToCString(sSessionID), util::stringToCString(sAID)); return FALSE; } //若是未读语音消息,则置成已读 SessionMessageMap::iterator itAudio = m_mapUnReadAudioMsg.find(sSessionID); if (itAudio != m_mapUnReadAudioMsg.end()) { SessionMessage_List& listChatMsg = itAudio->second; for (SessionMessage_List::iterator it = listChatMsg.begin(); it != listChatMsg.end(); ++it) { if (it->content == sAID) { it->msgAudioReaded = 1; } } } //播放声音 CString csFilePath = module::getMiscModule()->GetAudioFileSavedPath(); csFilePath += util::stringToCString(sAID, CP_UTF8); if (!PathFileExists(csFilePath)) { LOG__(ERR, _T("File not exist:%s "), csFilePath); return FALSE; } csFilePath = _T("\"") + csFilePath + _T("\""); //先关闭原来的播放窗口 HWND hTTWnd = FindWindow(NULL, _T("teamtalkaudio-speexdecWindow")); if (hTTWnd) { COPYDATASTRUCT cpyData = { 0 }; //cpyData.lpData = (PVOID)m_sPlayingAID.c_str(); //cpyData.cbData = m_sPlayingAID.length(); cpyData.dwData = 1; // 1 表示退出语音播放进程 ::SendMessage(hTTWnd, WM_COPYDATA, 0, (LPARAM)&cpyData); LOG__(DEBG, _T("breakPlayingAnimate")); } //解析播放语音文件 CString csPath = util::getAppPath() + _T("speexdec.exe"); LOG__(DEBG, _T("playAudioMsgByAudioSid FilePath:%s"), csFilePath); ::ShellExecute(NULL, _T("open"), csPath, csFilePath, _T(""), SW_HIDE); m_sPlayingSessionID = sSessionID; m_sPlayingAID = sAID; return TRUE; }
void P2PCmdModule_Impl::_p2pCmdNotifyResponse(std::string& pbBody) { IM::SwitchService::IMP2PCmdMsg imP2PCmdMsg; if (!imP2PCmdMsg.ParseFromString(pbBody)) { LOG__(ERR, _T("ParseFromString failed:%s"), util::stringToCString(pbBody)); return; } std::string jsonMsgData = imP2PCmdMsg.cmd_msg_data(); std::string sFromId = util::uint32ToString(imP2PCmdMsg.from_user_id()); LOG__(APP, _T("IMP2PCmdMsg cmd_msg_data = %s,sFromId = %s"), util::stringToCString(jsonMsgData), util::stringToCString(sFromId)); UINT32 nServiceID = 0; UINT32 nCmdID = 0; _parseMsgJsonData(jsonMsgData, nServiceID, nCmdID); if (module::KEY_P2PCMD_SHAKEWINDOW == nServiceID && module::KEY_P2PCMD_SHAKEWINDOW_NOTIFY == nCmdID) { //窗口抖动生成一条系统消息,提示用户 module::UserInfoEntity userInfo; if (module::getUserListModule()->getUserInfoBySId(sFromId, userInfo)) { CString csTipFormat = util::getMultilingual()->getStringById(_T("STRID_SESSIONMODULE_SHAKEWINDOW_TIP")); CString csTip; MessageEntity msg; csTip.Format(csTipFormat, userInfo.getRealName()); msg.content = util::cStringToString(csTip); msg.sessionId = sFromId; msg.talkerSid = module::getSysConfigModule()->userID(); msg.msgRenderType = MESSAGE_RENDERTYPE_SYSTEMTIPS; msg.msgSessionType = MESSAGETYPE_FROM_FRIEND; msg.msgTime = (UInt32)time(0); ReceiveMsgManage::getInstance()->pushMessageBySId(msg.sessionId, msg); module::getSessionModule()->asynNotifyObserver(module::KEY_SESSION_NEWMESSAGE, sFromId);//收到屏幕抖动消息提示 } module::getSessionModule()->asynNotifyObserver(module::KEY_SESSION_SHAKEWINDOW_MSG, sFromId);//抖动窗口 } else if (module::KEY_P2PCMD_WRITING == nServiceID) { if (module::KEY_P2PCMD_WRITING_NOTIFY == nCmdID) { module::getSessionModule()->asynNotifyObserver(module::KEY_SESSION_WRITING_MSG, sFromId); } else if (module::KEY_P2PCMD_STOP_WRITING_NOTIFY == nCmdID) { module::getSessionModule()->asynNotifyObserver(module::KEY_SESSION_STOPWRITING_MSG, sFromId); } } else { LOG__(APP, _T("Unkown p2p message,nServiceID:%d,nCmdID:%d"), nServiceID, nCmdID); } }
BOOL CUIRecentSessionList::AddNode(const std::string& sId) { if (UIIMList::IsExistSId(sId)) { LOG__(DEBG, _T("already exist!")); return FALSE; } SessionListItemInfo item; module::SessionEntity* pSessionInfo = SessionEntityManager::getInstance()->getSessionEntityBySId(sId); if (!pSessionInfo) { LOG__(DEBG, _T("Can't get the SessionEntity")); return FALSE; } item.folder = false; item.empty = false; item.description = util::stringToCString(pSessionInfo->latestMsgContent); item.Time = pSessionInfo->updatedTime; item.id = util::stringToCString(sId); if (pSessionInfo->sessionType == module::SESSION_USERTYPE) { module::UserInfoEntity userInfo; if (module::getUserListModule()->getUserInfoBySId(sId, userInfo)) { item.avatarPath = util::stringToCString(userInfo.getAvatarPath()); item.nickName = userInfo.getRealName(); } else { item.nickName = util::stringToCString(sId); item.avatarPath = module::getUserListModule()->getDefaultAvatartPath(); } } else if (module::SESSION_GROUPTYPE == pSessionInfo->sessionType) { module::GroupInfoEntity groupInfo; if (module::getGroupListModule()->getGroupInfoBySId(sId, groupInfo)) { item.avatarPath = util::stringToCString(groupInfo.getAvatarPath()); item.nickName = groupInfo.csName; } else { item.nickName = util::stringToCString(sId); item.avatarPath = module::getGroupListModule()->getDefaultAvatartPath(); } } AddNode(item, NULL); return TRUE; }
void ReloginManager::OnOperationCallback(std::shared_ptr<void> param) { m_bDoReloginNow = FALSE; LoginParam* pLoginParam = (LoginParam*)param.get(); if (LOGIN_OK == pLoginParam->result) { LOG__(ERR, _T("ReloginManager regloin success!!!")); module::getSessionModule()->setTime(pLoginParam->serverTime); //通知服务器客户端初始化完毕,获取组织架构信息和群列表 module::getLoginModule()->notifyLoginDone(); //清空存在客户端的未读消息,因为服务端又会将这个消息送过来,避免重复 module::getMessageModule()->removeAllMessage(); //获取最近联系会话 UInt32 updateTime = module::getSessionModule()->getGlobalUpdateTime(); LOG__(APP, _T("IMRecentContactSessionReq after relogin done, local update time = %d"), updateTime); IM::Buddy::IMRecentContactSessionReq imRecentContactSessionReq; imRecentContactSessionReq.set_user_id(module::getSysConfigModule()->userId()); imRecentContactSessionReq.set_latest_update_time(updateTime); module::getTcpClientModule()->sendPacket(IM::BaseDefine::ServiceID::SID_BUDDY_LIST , IM::BaseDefine::BuddyListCmdID::CID_BUDDY_LIST_RECENT_CONTACT_SESSION_REQUEST , &imRecentContactSessionReq); //通知网络已经恢复正常,可以进行各种操作了 module::getLoginModule()->asynNotifyObserver(module::KEY_LOGIN_RELOGINOK, pLoginParam->mySelectedStatus); } else { LOG__(ERR, _T("ReloginManager regloin failed!!!")); module::getTcpClientModule()->shutdown(); //TCP\IP验证token失效,开启重新获取token的task //if (LOGIN_TOKEN_FAILED == pLoginParam->result) { //开启定时获取token的定时器 } if (IM::BaseDefine::REFUSE_REASON_VERSION_TOO_OLD == pLoginParam->result) { CString csTip = util::getMultilingual()->getStringById(_T("STRID_WEBLOGINFORM_TIP_VERSION_TOOOLD")); CString csTitle = module::getMiscModule()->getAppTitle(); ::MessageBox(0, csTip, csTitle, MB_OK | MB_ICONINFORMATION); module::getMiscModule()->quitTheApplication(); } else { startReloginTimer(++m_secondCount); } } }
BOOL FileTransferSocket::startFileTransLink() { TransferFileEntity FileInfo; if (TransferFileEntityManager::getInstance()->getFileInfoByTaskId(m_sTaskId, FileInfo)) { //大佛:使用msg server 传过来的IP和端口 LOG__(APP, _T("connect IP=%s,Port=%d"), util::stringToCString(FileInfo.sIP), FileInfo.nPort); connect(util::stringToCString(FileInfo.sIP), FileInfo.nPort); //connect(util::stringToCString(module::FILETRANSFER_IP), module::FILETRANSFER_PORT); return TRUE; } LOG__(ERR, _T("can't find the TaskId")); return FALSE; }
void LoginModule_Impl::_kickUserResponse(IN std::string& pbBody) { IM::Login::IMKickUser imKickUser; if (!imKickUser.ParseFromString(pbBody)) { LOG__(ERR, _T("ParseFromString failed,body:%s"), util::stringToCString(pbBody)); return; } LOG__(APP, _T("IMKickUser kick_reason = %d"),imKickUser.kick_reason()); if (IM::BaseDefine::KickReasonType::KICK_REASON_DUPLICATE_USER == imKickUser.kick_reason() || IM::BaseDefine::KickReasonType::KICK_REASON_MOBILE_KICK == imKickUser.kick_reason()) { module::getLoginModule()->asynNotifyObserver(module::KEY_LOGIN_KICKOUT, Int32(imKickUser.kick_reason())); } }
void TcpClientModule_Impl::onReceiveData(const char* data, int32_t size) { if (m_pServerPingTimer) m_pServerPingTimer->m_bHasReceivedPing = TRUE; imcore::TTPBHeader header; header.unSerialize((byte*)data, imcore::HEADER_LENGTH); if (IM::BaseDefine::CID_OTHER_HEARTBEAT == header.getCommandId() && IM::BaseDefine::SID_OTHER == header.getModuleId()) { //模块器端过来的心跳包,不跳到业务层派发 return; } LOG__(NET, _T("receiveData message moduleId:0x%x,commandId:0x%x") , header.getModuleId(), header.getCommandId()); if (g_seqNum == header.getSeqNumber()) { m_pImLoginResp->ParseFromArray(data + imcore::HEADER_LENGTH, size - imcore::HEADER_LENGTH); ::SetEvent(m_eventReceived); return; } //将网络包包装成任务放到逻辑任务队列里面去 _handlePacketOperation(data, size); }
void CEventDispatch::RemoveEvent(SOCKET fd, uint8_t socket_event) { if (epoll_ctl(m_epfd, EPOLL_CTL_DEL, fd, NULL) != 0) { LOG__(NET, "epoll_ctl failed, errno=%d\n", errno); } }
BOOL AudioMessageMananger::popPlayingAudioMsg() { stopPlayingAnimate(); SessionMessageMap::iterator itAudio = m_mapUnReadAudioMsg.find(m_sPlayingSessionID); if (itAudio == m_mapUnReadAudioMsg.end()) { LOG__(DEBG, _T("Not exist in the list!")); return FALSE; } SessionMessage_List& listChatMsg = itAudio->second; SessionMessage_List::iterator it = listChatMsg.begin(); for (; it != listChatMsg.end();) { if (it->isReaded() && it->content == m_sPlayingAID) { listChatMsg.erase(it);//删除已经播放过的 m_sPlayingSessionID.clear(); m_sPlayingAID.clear(); return TRUE; } else ++it; } return FALSE; }
void SessionLayout::FreshAllGroupMemberAvatar() { if (!m_pGroupMemberList) { return; } for (int n = 0; n < m_pGroupMemberList->GetCount(); n++) { CListContainerElementUI* pItem = (CListContainerElementUI*)m_pGroupMemberList->GetItemAt(n); if (pItem) { CDuiString userData = pItem->GetUserData(); if (!userData.IsEmpty()) { std::string sid = util::cStringToString(CString(userData)); module::UserInfoEntity userInfo; if (!module::getUserListModule()->getUserInfoBySId(sid, userInfo)) { LOG__(ERR, _T("can't find the userInfo:%s,GroupId:%s"),util::stringToCString(sid),util::stringToCString(m_sId)); continue;; } CButtonUI* btnAvatarInfo = (CButtonUI*)pItem->FindSubControl(_T("AvatarInfo")); if (btnAvatarInfo) { btnAvatarInfo->SetBkImage(util::stringToCString(userInfo.getAvatarPath())); } } } } m_pGroupMemberList->SortItems(GroupMemberListItemCompareFunc, 0); }