bool sendDiaMembers(cgcResponse::pointer response, CUserInfo::pointer fromUser, CDialogInfo::pointer dialogInfo) { BOOST_ASSERT (response.get() != 0); BOOST_ASSERT (fromUser.get() != 0); BOOST_ASSERT (dialogInfo.get() != 0); if (response->isInvalidate()) return false; response->lockResponse(); response->setParameter(cgcParameter::create(_T("DID"), dialogInfo->dialogId())); response->setParameter(cgcParameter::create(_T("FromAccount"), fromUser->getAccount())); int index = 0; CLockMap<std::string, CUserInfo::pointer>::const_iterator iterUserInfo; boost::mutex::scoped_lock lockUserInfo(const_cast<boost::mutex&>(dialogInfo->m_members.mutex())); for (iterUserInfo=dialogInfo->m_members.begin(); iterUserInfo!=dialogInfo->m_members.end(); iterUserInfo++) { CUserInfo::pointer memberUserInfo = iterUserInfo->second; char uaBuffer[12]; sprintf(uaBuffer, "UA%d", index++); response->setParameter(cgcParameter::create(uaBuffer, memberUserInfo->getAccount())); } response->sendResponse(0, 601); return true; }
bool sendMsgImage(cgcResponse::pointer response, CUserInfo::pointer fromUser, CFromInfo::pointer fromInfo, long mid, long width, long height, long type, cgcAttachment::pointer attachment, bool bNew, time_t offeventTime) { BOOST_ASSERT (response.get() != 0); BOOST_ASSERT (fromUser.get() != 0); BOOST_ASSERT (fromInfo.get() != 0); BOOST_ASSERT (attachment.get() != 0); if (response->isInvalidate()) return false; response->lockResponse(); if (fromInfo->fromType() == CFromInfo::FromDialogInfo) { response->setParameter(cgcParameter::create(_T("DID"), fromInfo->fromDialog()->dialogId())); } response->setParameter(cgcParameter::create(_T("FromAccount"), fromUser->getAccount())); response->setParameter(cgcParameter::create(_T("MID"), mid)); response->setParameter(cgcParameter::create(_T("Type"), type)); response->setParameter(cgcParameter::create(_T("Width"), width)); response->setParameter(cgcParameter::create(_T("Height"), height)); response->setParameter(cgcParameter::create2(_T("New"), bNew)); if (offeventTime > 0) { char buffer[20]; sprintf(buffer, "%ld", offeventTime); response->setParameter(cgcParameter::create(cgcParameter::PT_DATETIME, _T("Time"), buffer)); } response->setAttachInfo(attachment->getTotal(), attachment->getIndex()); response->setAttachData(attachment->getAttachData(), attachment->getAttachSize()); response->sendResponse(0, 501); return true; }
bool sendDiaInvite(cgcResponse::pointer response, CUserInfo::pointer fromUser, CDialogInfo::pointer dialogInfo, CUserInfo::pointer inviteUserInfo) { BOOST_ASSERT (response.get() != 0); BOOST_ASSERT (fromUser.get() != 0); BOOST_ASSERT (dialogInfo.get() != 0); BOOST_ASSERT (inviteUserInfo.get() != 0); if (response->isInvalidate()) return false; response->lockResponse(); response->setParameter(cgcParameter::create(_T("DID"), dialogInfo->dialogId())); response->setParameter(cgcParameter::create(_T("FromAccount"), fromUser->getAccount())); response->setParameter(cgcParameter::create(_T("UA0"), inviteUserInfo->getAccount())); response->sendResponse(0, 601); return true; }
bool sendMsgRequest(CAccountInfo::pointer toAccount, CUserInfo::pointer fromUser, long mid, long type) { BOOST_ASSERT (toAccount.get() != 0); BOOST_ASSERT (fromUser.get() != 0); cgcSession::pointer toUserCgcSession = gSystem->getcgcSession(toAccount->getSessionId()); if (toUserCgcSession.get() == NULL) return false; cgcResponse::pointer toUserCgcResponse = toUserCgcSession->getLastResponse(); if (toUserCgcResponse.get() == NULL || toUserCgcResponse->isInvalidate()) return false; toUserCgcResponse->lockResponse(); toUserCgcResponse->setParameter(cgcParameter::create(_T("FromAccount"), fromUser->getAccount())); toUserCgcResponse->setParameter(cgcParameter::create(_T("Type"), type)); toUserCgcResponse->setParameter(cgcParameter::create(_T("MID"), mid)); toUserCgcResponse->sendResponse(0, 511); return true; }
bool sendMsg(cgcResponse::pointer response, CUserInfo::pointer fromUser, CFromInfo::pointer fromInfo, long mid, cgcAttachment::pointer attachment) { BOOST_ASSERT (response.get() != 0); BOOST_ASSERT (fromUser.get() != 0); BOOST_ASSERT (fromInfo.get() != 0); BOOST_ASSERT (attachment.get() != 0); if (response->isInvalidate()) return false; response->lockResponse(); if (fromInfo->fromType() == CFromInfo::FromDialogInfo) { response->setParameter(cgcParameter::create(_T("DID"), fromInfo->fromDialog()->dialogId())); } response->setParameter(cgcParameter::create(_T("FromAccount"), fromUser->getAccount())); response->setParameter(cgcParameter::create(_T("MID"), mid)); response->setAttachInfo(attachment->getTotal(), attachment->getIndex()); response->setAttachData(attachment->getAttachData(), attachment->getAttachSize()); response->sendResponse(0, 501); return true; }
bool sendUserOnOfflineEvent(CAccountInfo::pointer toAccount, CUserInfo::pointer fromUser, bool online, bool quit) { BOOST_ASSERT (toAccount.get() != 0); BOOST_ASSERT (fromUser.get() != 0); cgcSession::pointer toUserCgcSession = gSystem->getcgcSession(toAccount->getSessionId()); if (toUserCgcSession.get() == NULL) return false; cgcResponse::pointer toUserCgcResponse = toUserCgcSession->getLastResponse(); if (toUserCgcResponse.get() == NULL || toUserCgcResponse->isInvalidate()) return false; toUserCgcResponse->lockResponse(); toUserCgcResponse->setParameter(cgcParameter::create(_T("FromAccount"), fromUser->getAccount())); if (quit) { toUserCgcResponse->setParameter(cgcParameter::create2(_T("Quit"), true)); } if (online) toUserCgcResponse->sendResponse(0, 201); else toUserCgcResponse->sendResponse(0, 202); return true; }
void CAVSProxy::addOffEvent(CUserInfo::pointer touserInfo, COfflineEvent::pointer offlineEvent) { BOOST_ASSERT (touserInfo.get() != 0); BOOST_ASSERT (offlineEvent.get() != 0); BOOST_ASSERT (offlineEvent->fromInfo().get() != 0); touserInfo->m_offevents.add(offlineEvent); CMessageInfo::pointer messageInfo = offlineEvent->getMessage(); if (messageInfo.get() == 0) { return; } struct timeb tbNow; ftime(&tbNow); tbNow.time -= (tbNow.timezone*60); offlineEvent->getMessage()->msgtime(tbNow.time); if (m_bodbHandler->isopen()) { long nFromId = 0; if (offlineEvent->fromInfo()->fromType() == CFromInfo::FromDialogInfo) { nFromId = offlineEvent->fromInfo()->fromDialog()->dialogId(); } char sql[10*1024]; memset(sql, 0, sizeof(sql)); switch (offlineEvent->getEvent()) { case 601: // diainvite case 602: // diaquit { sprintf(sql, "INSERT INTO offevents_t (event,fromtype,fromid,fromaccount,toaccount,message,msgtype) \ VALUES(%d,%d,%ld,'%s','%s','%s',%d)", offlineEvent->getEvent(), (int)offlineEvent->fromInfo()->fromType(), nFromId, offlineEvent->getFromAccount()->getAccount().c_str(), touserInfo->getAccount().c_str(), offlineEvent->toAccount()->getAccount().c_str(), messageInfo->type() ); }break; default: { switch (messageInfo->type()) { case 3: { // image sprintf(sql, "INSERT INTO offevents_t (event,fromtype,fromid,fromaccount,toaccount,msgtype,newflag,message,msgsize,width,height) \ VALUES(%d,%d,%ld,'%s','%s',%d, %s, '%s', %d, %d, %d)", offlineEvent->getEvent(), (int)offlineEvent->fromInfo()->fromType(), nFromId, offlineEvent->getFromAccount()->getAccount().c_str(), touserInfo->getAccount().c_str(), messageInfo->type(), messageInfo->newflag() ? "true" : "false", messageInfo->getdata(), messageInfo->filesize(), messageInfo->imageWidth(), messageInfo->imageHeight() ); }break; case 11: { // ?? // Do not support to save the file offevent. return; }break; default: { sprintf(sql, "INSERT INTO offevents_t (event,fromtype,fromid,fromaccount,toaccount,msgtype,newflag,message,msgsize)\ VALUES(%d,%d,%ld,'%s','%s',%d, %s, '%s', %ld)", offlineEvent->getEvent(), (int)offlineEvent->fromInfo()->fromType(), nFromId, offlineEvent->getFromAccount()->getAccount().c_str(), touserInfo->getAccount().c_str(), messageInfo->type(), messageInfo->newflag() ? "true" : "false", messageInfo->getdata(), messageInfo->total() ); }break; } }break; } m_bodbHandler->execsql(sql); }
extern "C" int CGC_API DiaInvite(const cgcRequest::pointer & request, cgcResponse::pointer response, cgcSession::pointer session) { ///////////////////////////////// // Request const tstring & sAccountId = request->getParameterValue(_T("AccountId"), _T("")); if (sAccountId.empty()) return -1; long dialogId = request->getParameterValue(_T("DID"), 0); ///////////////////////////////// // Process CAccountInfo::pointer accountInfo = CGC_POINTER_CAST<CAccountInfo>(gApplication->getAttribute(BMT_ACCOUNTIDS, sAccountId)); if (accountInfo.get() == NULL) //if (!gAVSProxy->m_accountids.find(sAccountId, accountInfo)) { // Un register. return 14; }else if (session->getId().compare(accountInfo->getSessionId()) != 0) { // SessionId Error return -3; } CDialogInfo::pointer dialogInfo; if (dialogId == 0) { // New Dialog dialogInfo = CDialogInfo::create(gAVSProxy->getNextDialogId(), accountInfo->getUserinfo()); dialogInfo->m_members.insert(accountInfo->getUserinfo()->getAccount(), accountInfo->getUserinfo()); gApplication->setAttribute(BMT_DIALOGS, dialogInfo->dialogId(), dialogInfo); //gAVSProxy->m_dialogs.insert(dialogInfo->dialogId(), dialogInfo); response->setParameter(cgcParameter::create(_T("DID"), dialogInfo->dialogId())); response->sendResponse(); }else { dialogInfo = CGC_POINTER_CAST<CDialogInfo>(gApplication->getAttribute(BMT_DIALOGS, dialogId)); if (dialogInfo.get() == NULL) //if (!gAVSProxy->m_dialogs.find(dialogId, dialogInfo)) { // Dialog id not exist. return 71; }/*else if (dialogInfo->manager().get() != accountInfo->getUserinfo().get()) { // ?? Not the manager error. return 72; }*/ } int index = 0; while (true) { char buffer[20]; sprintf(buffer, "UA%d", index++); const tstring & sInviteUserAccount = request->getParameterValue(buffer, _T("")); if (sInviteUserAccount.empty()) { break; } if (dialogInfo->m_members.exist(sInviteUserAccount)) { // already exist in the dialog. continue; } CUserInfo::pointer inviteUserInfo; if (!getUserInfo(accountInfo, sInviteUserAccount, inviteUserInfo)) { // ? continue; break; } // 1 Send the dialog members that invite account event. CLockMap<std::string, CUserInfo::pointer>::const_iterator iterUserInfo; boost::mutex::scoped_lock lockUserInfo(const_cast<boost::mutex&>(dialogInfo->m_members.mutex())); for (iterUserInfo=dialogInfo->m_members.begin(); iterUserInfo!=dialogInfo->m_members.end(); iterUserInfo++) { CUserInfo::pointer memberUserInfo = iterUserInfo->second; // Not register. CAccountInfo::pointer memberAccountInfo = CGC_POINTER_CAST<CAccountInfo>(gApplication->getAttribute(BMT_ACCOUNTS, memberUserInfo->getAccount())); if (memberAccountInfo.get() == NULL) //if (!gAVSProxy->m_accounts.find(memberUserInfo->getAccount(), memberAccountInfo)) { // offline event CMessageInfo::pointer messageInfo = CMessageInfo::create(0, 0, CConversationInfo::CT_INVITE, true); COfflineEvent::pointer offlineEvent = COfflineEvent::create(601, CFromInfo::create(dialogInfo), accountInfo->getUserinfo(), messageInfo); offlineEvent->toAccount(inviteUserInfo); gAVSProxy->addOffEvent(memberUserInfo, offlineEvent); continue; } sendDiaInvite(memberAccountInfo, accountInfo->getUserinfo(), dialogInfo, inviteUserInfo); } lockUserInfo.unlock(); // 2 Send invite useraccount the dialog members info. CAccountInfo::pointer inviteAccountInfo = CGC_POINTER_CAST<CAccountInfo>(gApplication->getAttribute(BMT_ACCOUNTS, sInviteUserAccount)); if (inviteAccountInfo.get() != NULL) { // sendDiaMembers(inviteAccountInfo, accountInfo->getUserinfo(), dialogInfo); }else { // Not register. // offline event CLockMap<std::string, CUserInfo::pointer>::const_iterator iterUserInfo; boost::mutex::scoped_lock lockUserInfo(const_cast<boost::mutex&>(dialogInfo->m_members.mutex())); for (iterUserInfo=dialogInfo->m_members.begin(); iterUserInfo!=dialogInfo->m_members.end(); iterUserInfo++) { CUserInfo::pointer memberUserInfo = iterUserInfo->second; CMessageInfo::pointer messageInfo = CMessageInfo::create(0, 0, CConversationInfo::CT_INVITE, true); COfflineEvent::pointer offlineEvent = COfflineEvent::create(601, CFromInfo::create(dialogInfo), accountInfo->getUserinfo(), messageInfo); offlineEvent->toAccount(memberUserInfo); gAVSProxy->addOffEvent(inviteUserInfo, offlineEvent); } } dialogInfo->m_members.insert(inviteUserInfo->getAccount(), inviteUserInfo); } // Response return 0; }
extern "C" int CGC_API DiaQuit(const cgcRequest::pointer & request, cgcResponse::pointer response, cgcSession::pointer session) { ///////////////////////////////// // Request const tstring & sAccountId = request->getParameterValue(_T("AccountId"), _T("")); if (sAccountId.empty()) return -1; long dialogId = request->getParameterValue(_T("DID"), 0); ///////////////////////////////// // Process CAccountInfo::pointer accountInfo = CGC_POINTER_CAST<CAccountInfo>(gApplication->getAttribute(BMT_ACCOUNTIDS, sAccountId)); if (accountInfo.get() == NULL) { // Un register. return 14; }else if (session->getId().compare(accountInfo->getSessionId()) != 0) { // SessionId Error return -3; } CDialogInfo::pointer dialogInfo = CGC_POINTER_CAST<CDialogInfo>(gApplication->getAttribute(BMT_DIALOGS, dialogId)); if (dialogInfo.get() == NULL) { // Dialog id not exist. return 71; } if (!dialogInfo->m_members.remove(accountInfo->getUserinfo()->getAccount())) { // Member not exist. return 73; } CLockMap<std::string, CUserInfo::pointer>::const_iterator iterUserInfo; boost::mutex::scoped_lock lockUserInfo(const_cast<boost::mutex&>(dialogInfo->m_members.mutex())); for (iterUserInfo=dialogInfo->m_members.begin(); iterUserInfo!=dialogInfo->m_members.end(); iterUserInfo++) { CUserInfo::pointer memberUserInfo = iterUserInfo->second; // Not register. CAccountInfo::pointer memberAccountInfo = CGC_POINTER_CAST<CAccountInfo>(gApplication->getAttribute(BMT_ACCOUNTS, memberUserInfo->getAccount())); if (memberAccountInfo.get() == NULL) { // offline event CMessageInfo::pointer messageInfo = CMessageInfo::create(0, 0, CConversationInfo::CT_QUIT, true); COfflineEvent::pointer offlineEvent = COfflineEvent::create(602, CFromInfo::create(dialogInfo), accountInfo->getUserinfo(), messageInfo); offlineEvent->toAccount(memberUserInfo); gAVSProxy->addOffEvent(memberUserInfo, offlineEvent); continue; } sendDiaQuit(memberAccountInfo, accountInfo->getUserinfo(), dialogInfo); } lockUserInfo.unlock(); // Response return 0; }
void GroupChatWindow::invitedUser(CUserInfo::pointer userInfo) { assert (userInfo.get() != NULL); long item = m_listCtrl->InsertItem(m_listCtrl->GetItemCount(), wxString::Format(_T("%s(%s)"), userInfo->getUserName().c_str(), userInfo->getAccount().c_str()), 0); //m_listCtrl->SetItemData(item, ); }
int sendtoMsg(const cgcRequest::pointer & request, cgcAttachment::pointer attach, CAccountInfo::pointer fromAccount, CFromInfo::pointer fromInfo, CUserInfo::pointer sendtoUserInfo, long mid) { BOOST_ASSERT (attach.get() != NULL); BOOST_ASSERT (fromAccount.get() != NULL); BOOST_ASSERT (fromInfo.get() != NULL); BOOST_ASSERT (sendtoUserInfo.get() != NULL); CMessageInfo::pointer offlineMessageInfo = CGC_POINTER_CAST<CMessageInfo>(gApplication->getAttribute(sendtoUserInfo->getAccount(), mid)); CAccountInfo::pointer friendAccountInfo = CGC_POINTER_CAST<CAccountInfo>(gApplication->getAttribute(BMT_ACCOUNTS, sendtoUserInfo->getAccount())); if (friendAccountInfo.get() == NULL || offlineMessageInfo.get() != NULL) { // Friend is offline state. if (offlineMessageInfo.get() != NULL && offlineMessageInfo->total() != attach->getTotal()) { gApplication->removeAttribute(sendtoUserInfo->getAccount(), mid); offlineMessageInfo.reset(); } if (offlineMessageInfo.get() == NULL) { if (attach->getIndex() == 0) { long type = request->getParameterValue(_T("Type"), 0); bool bNew = request->getParameterValue2(_T("New"), true); offlineMessageInfo = CMessageInfo::create(mid, attach->getTotal(), (short)type, bNew); if (type == 3) { long imageWidth = request->getParameterValue(_T("Width"), 0); long imageHeight = request->getParameterValue(_T("Height"), 0); offlineMessageInfo->imageWH(imageWidth, imageHeight); } }else { offlineMessageInfo = CMessageInfo::create(mid, attach->getTotal()); } if (attach->getIndex() + attach->getAttachSize() == attach->getTotal()) { if (attach->getIndex() > 0) offlineMessageInfo->m_indexs.insert(attach->getIndex(), true); offlineMessageInfo->m_indexs.insert(attach->getTotal(), true); }else { int indexCount = attach->getTotal() / attach->getAttachSize(); if (attach->getTotal() % attach->getAttachSize() > 0) indexCount += 1; for (int i=1; i<= indexCount; i++) { unsigned long index = (i==indexCount) ? attach->getTotal() : i*attach->getAttachSize(); offlineMessageInfo->m_indexs.insert(index, true); } } gApplication->setAttribute(sendtoUserInfo->getAccount(), mid, offlineMessageInfo); }else if (attach->getIndex() == 0) { long type = request->getParameterValue(_T("Type"), 0); bool bNew = request->getParameterValue2(_T("New"), true); offlineMessageInfo->type((short)type); offlineMessageInfo->newflag(bNew); if (type == 3) { long imageWidth = request->getParameterValue(_T("Width"), 0); long imageHeight = request->getParameterValue(_T("Height"), 0); offlineMessageInfo->imageWH(imageWidth, imageHeight); } } offlineMessageInfo->setdata((const char*)attach->getAttachData(), attach->getAttachSize(), attach->getIndex()); offlineMessageInfo->m_indexs.remove(attach->getIndex() + attach->getAttachSize()); if (!offlineMessageInfo->m_indexs.empty()) { // Already had data. return 1; } gApplication->removeAttribute(sendtoUserInfo->getAccount(), mid); switch (offlineMessageInfo->type()) { case 3: { // Save the image. char * filename = new char[50]; #ifdef WIN32 sprintf(filename, "%I64d%08ld%d", time(0), mid, ++gFileId); #else sprintf(filename, "%ld%08ld%d", time(0), mid, ++gFileId); #endif char filepath[256]; sprintf(filepath, "%s/File/%s", gApplication->getAppConfPath().c_str(), filename); FILE * hfile = fopen(filepath, "wb"); if (hfile == NULL) { // System error. delete[] filename; return -2; } fwrite(offlineMessageInfo->getdata(), 1, offlineMessageInfo->total(), hfile); fclose(hfile); offlineMessageInfo->filesize(offlineMessageInfo->total()); offlineMessageInfo->setdata(filename, strlen(filename)); }break; default: break; } COfflineEvent::pointer offlineEvent = COfflineEvent::create(501, fromInfo, fromAccount->getUserinfo(), offlineMessageInfo); gAVSProxy->addOffEvent(sendtoUserInfo, offlineEvent); return 2; } bool ret = false; if (attach->getIndex() == 0) { long nType = request->getParameterValue(_T("Type"), 0); bool bNew = request->getParameterValue2(_T("New"), true); if (nType == 3) { long nWidth = request->getParameterValue(_T("Width"), 0); long nHeight = request->getParameterValue(_T("Height"), 0); ret = sendMsgImage(friendAccountInfo, fromAccount->getUserinfo(), fromInfo, mid, nWidth, nHeight, nType, attach, bNew); }else { ret = sendMsg(friendAccountInfo, fromAccount->getUserinfo(), fromInfo, mid, nType, attach, bNew); } }else { ret = sendMsg(friendAccountInfo, fromAccount->getUserinfo(), fromInfo, mid, attach); } return 0; }