//------------------------------------------------------------------------------------- void Loginapp::onReqCreateAccountResult(Mercury::Channel* pChannel, MemoryStream& s) { SERVER_ERROR_CODE failedcode; std::string accountName; std::string password; std::string retdatas = ""; s >> failedcode >> accountName >> password; s.readBlob(retdatas); DEBUG_MSG(boost::format("Loginapp::onReqCreateAccountResult: accountName=%1%, failedcode=%2%.\n") % accountName.c_str() % failedcode); PendingLoginMgr::PLInfos* ptinfos = pendingCreateMgr_.remove(accountName); if(ptinfos == NULL) return; Mercury::Channel* pClientChannel = this->getNetworkInterface().findChannel(ptinfos->addr); if(pClientChannel == NULL) return; pClientChannel->extra(""); Mercury::Bundle bundle; bundle.newMessage(ClientInterface::onCreateAccountResult); bundle << failedcode; bundle.appendBlob(retdatas); bundle.send(this->getNetworkInterface(), pClientChannel); SAFE_RELEASE(ptinfos); }
//------------------------------------------------------------------------------------- void DebugHelper::onMessage(uint32 logType, const char * str, uint32 length) { if(g_componentType == MACHINE_TYPE || g_componentType == CONSOLE_TYPE || g_componentType == MESSAGELOG_TYPE) return; if(length <= 0) return; Mercury::Bundle* pBundle = Mercury::Bundle::ObjPool().createObject(); int8 v = Mercury::g_trace_packet; Mercury::g_trace_packet = 0; pBundle->newMessage(MessagelogInterface::writeLog); (*pBundle) << logType; (*pBundle) << g_componentType; (*pBundle) << g_componentID; (*pBundle) << g_componentOrder; int64 t = time(NULL); (*pBundle) << t; (*pBundle) << g_kbetime; (*pBundle) << str; bufferedLogPackets_.push_back(pBundle); Mercury::g_trace_packet = v; if(!syncStarting_) { if(pDispatcher_) pDispatcher_->addFrequentTask(this); syncStarting_ = true; } }
//------------------------------------------------------------------------------------- void ServerApp::queryWatcher(Mercury::Channel* pChannel, MemoryStream& s) { AUTO_SCOPED_PROFILE("watchers"); std::string path; s >> path; MemoryStream::SmartPoolObjectPtr readStreamPtr = MemoryStream::createSmartPoolObj(); WatcherPaths::root().readWatchers(path, readStreamPtr.get()->get()); MemoryStream::SmartPoolObjectPtr readStreamPtr1 = MemoryStream::createSmartPoolObj(); WatcherPaths::root().readChildPaths(path, path, readStreamPtr1.get()->get()); Mercury::Bundle bundle; ConsoleInterface::ConsoleWatcherCBMessageHandler msgHandler; bundle.newMessage(msgHandler); uint8 type = 0; bundle << type; bundle.append(readStreamPtr.get()->get()); bundle.send(getNetworkInterface(), pChannel); Mercury::Bundle bundle1; bundle1.newMessage(msgHandler); type = 1; bundle1 << type; bundle1.append(readStreamPtr1.get()->get()); bundle1.send(getNetworkInterface(), pChannel); }
//------------------------------------------------------------------------------------- void Base::reqTeleportOther(Mercury::Channel* pChannel, ENTITY_ID reqTeleportEntityID, COMPONENT_ID reqTeleportEntityCellAppID, COMPONENT_ID reqTeleportEntityBaseAppID) { DEBUG_MSG("Base::reqTeleportOther: reqTeleportEntityID=%d, reqTeleportEntityCellAppID=%"PRAppID".\n", reqTeleportEntityID, reqTeleportEntityCellAppID); if(this->getCellMailbox() == NULL || this->getCellMailbox()->getChannel() == NULL) { ERROR_MSG("%s::reqTeleportOther: %d, teleport is error, cellMailbox is NULL, reqTeleportEntityID, reqTeleportEntityCellAppID=%"PRAppID".\n", this->getScriptName(), this->getID(), reqTeleportEntityID, reqTeleportEntityCellAppID); return; } Components::ComponentInfos* cinfos = Components::getSingleton().findComponent(reqTeleportEntityCellAppID); if(cinfos == NULL || cinfos->pChannel == NULL) { ERROR_MSG("%s::reqTeleportOther: %d, teleport is error, not found cellapp, reqTeleportEntityID, reqTeleportEntityCellAppID=%"PRAppID".\n", this->getScriptName(), this->getID(), reqTeleportEntityID, reqTeleportEntityCellAppID); return; } Mercury::Bundle bundle; bundle.newMessage(CellappInterface::teleportFromBaseapp); bundle << reqTeleportEntityID; CellappInterface::teleportFromBaseappArgs3::staticAddToBundle(bundle, this->getCellMailbox()->getComponentID(), this->getID(), reqTeleportEntityBaseAppID); bundle.send(Baseapp::getSingleton().getNetworkInterface(), cinfos->pChannel); }
//------------------------------------------------------------------------------------- void EntityMailboxAbstract::newMail(Mercury::Bundle& bundle) { if(componentID_ == 0) // 客户端 { bundle.newMessage(ClientInterface::onRemoteMethodCall); } else // 服务器组件 { Components::ComponentInfos* cinfos = Components::getSingleton().findComponent(componentID_); if(cinfos != NULL) { // 找到对应的组件投递过去, 如果这个mailbox还需要中转比如 e.base.cell , 则由baseapp转往cellapp if(cinfos->componentType == BASEAPP_TYPE) { bundle.newMessage(BaseappInterface::onEntityMail); } else { bundle.newMessage(CellappInterface::onEntityMail); } } else { ERROR_MSG("EntityMailboxAbstract::newMail: not found component!\n"); } } bundle << id_; // 如果是发往客户端的包则无需附加这样一个类型 if(componentID_ > 0) bundle << type_; }
//------------------------------------------------------------------------------------- void Baseapp::createInNewSpace(Base* base, PyObject* cell) { ENTITY_ID id = base->getID(); std::string entityType = base->ob_type->tp_name; std::string strCellData = script::Pickler::pickle(base->getCellData()); uint32 cellDataLength = strCellData.length(); Mercury::Bundle bundle; bundle.newMessage(CellappmgrInterface::reqCreateInNewSpace); bundle << entityType; bundle << id; bundle << componentID_; bundle << cellDataLength; if(cellDataLength > 0) bundle.append(strCellData.data(), cellDataLength); Components::COMPONENTS& components = Components::getSingleton().getComponents(CELLAPPMGR_TYPE); Components::COMPONENTS::iterator iter = components.begin(); if(iter != components.end()) { bundle.send(this->getNetworkInterface(), (*iter).pChannel); return; } ERROR_MSG("Baseapp::createInNewSpace: not found cellappmgr.\n"); }
//------------------------------------------------------------------------------------- void Proxy::onDefDataChanged(const PropertyDescription* propertyDescription, PyObject* pyData) { uint32 flags = propertyDescription->getFlags(); if((flags & ED_FLAG_BASE_AND_CLIENT) <= 0 || clientMailbox_ == NULL) return; // 创建一个需要广播的模板流 MemoryStream* mstream = MemoryStream::ObjPool().createObject(); propertyDescription->getDataType()->addToStream(mstream, pyData); Mercury::Bundle* pBundle = Mercury::Bundle::ObjPool().createObject(); (*pBundle).newMessage(ClientInterface::onUpdatePropertys); (*pBundle) << id(); if(scriptModule_->usePropertyDescrAlias()) (*pBundle) << propertyDescription->aliasIDAsUint8(); else (*pBundle) << propertyDescription->getUType(); pBundle->append(*mstream); g_privateClientEventHistoryStats.trackEvent(scriptName(), propertyDescription->getName(), pBundle->currMsgLength()); sendToClient(ClientInterface::onUpdatePropertys, pBundle); MemoryStream::ObjPool().reclaimObject(mstream); }
void EntityApp<E>::onExecScriptCommand(Mercury::Channel* pChannel, KBEngine::MemoryStream& s) { std::string cmd; s.readBlob(cmd); PyObject* pycmd = PyUnicode_DecodeUTF8(cmd.data(), cmd.size(), NULL); if(pycmd == NULL) { SCRIPT_ERROR_CHECK(); return; } DEBUG_MSG(boost::format("EntityApp::onExecScriptCommand: size(%1%), command=%2%.\n") % cmd.size() % cmd); std::string retbuf = ""; PyObject* pycmd1 = PyUnicode_AsEncodedString(pycmd, "utf-8", NULL); if(script_.run_simpleString(PyBytes_AsString(pycmd1), &retbuf) == 0) { // 将结果返回给客户端 Mercury::Bundle bundle; ConsoleInterface::ConsoleExecCommandCBMessageHandler msgHandler; bundle.newMessage(msgHandler); ConsoleInterface::ConsoleExecCommandCBMessageHandlerArgs1::staticAddToBundle(bundle, retbuf); bundle.send(this->getNetworkInterface(), pChannel); } Py_DECREF(pycmd); Py_DECREF(pycmd1); }
//------------------------------------------------------------------------------------- void Loginapp::onChannelDeregister(Mercury::Channel * pChannel) { // 如果是外部通道则处理 if(!pChannel->isInternal()) { const std::string& extra = pChannel->extra(); // 通知billing从队列中清除他的请求, 避免拥塞 if(extra.size() > 0) { Components::COMPONENTS& cts = Components::getSingleton().getComponents(DBMGR_TYPE); Components::ComponentInfos* dbmgrinfos = NULL; if(cts.size() > 0) dbmgrinfos = &(*cts.begin()); if(dbmgrinfos == NULL || dbmgrinfos->pChannel == NULL || dbmgrinfos->cid == 0) { } else { Mercury::Bundle bundle; bundle.newMessage(DbmgrInterface::eraseClientReq); bundle << extra; bundle.send(this->getNetworkInterface(), dbmgrinfos->pChannel); } } } ServerApp::onChannelDeregister(pChannel); }
//------------------------------------------------------------------------------------- void TelnetHandler::processPythonCommand(std::string command) { if(pTelnetServer_->pScript() == NULL || command.size() == 0) return; command += "\n"; PyObject* pycmd = PyUnicode_DecodeUTF8(command.data(), command.size(), NULL); if(pycmd == NULL) { SCRIPT_ERROR_CHECK(); return; } DEBUG_MSG(boost::format("TelnetHandler::processPythonCommand: size(%1%), command=%2%.\n") % command.size() % command); std::string retbuf = ""; PyObject* pycmd1 = PyUnicode_AsEncodedString(pycmd, "utf-8", NULL); pTelnetServer_->pScript()->run_simpleString(PyBytes_AsString(pycmd1), &retbuf); if(retbuf.size() > 0) { // 将结果返回给客户端 Mercury::Bundle bundle; bundle << retbuf; bundle.send(*pEndPoint_); sendEnter(); } Py_DECREF(pycmd); Py_DECREF(pycmd1); }
//------------------------------------------------------------------------------------- void DebugHelper::sync() { lockthread(); if(hasBufferedLogPackets_ == 0) { unlockthread(); return; } if(Mercury::Address::NONE == messagelogAddr_) { if(hasBufferedLogPackets_ > g_kbeSrvConfig.tickMaxBufferedLogs()) { clearBufferedLog(); } canLogFile_ = true; unlockthread(); return; } Mercury::Channel* pMessagelogChannel = pNetworkInterface_->findChannel(messagelogAddr_); if(pMessagelogChannel == NULL) { if(hasBufferedLogPackets_ > g_kbeSrvConfig.tickMaxBufferedLogs()) { clearBufferedLog(); } canLogFile_ = true; unlockthread(); return; } int8 v = Mercury::g_trace_packet; Mercury::g_trace_packet = 0; uint32 i = 0; size_t totalLen = 0; while(!bufferedLogPackets_.empty()) { if(i++ >= g_kbeSrvConfig.tickMaxSyncLogs() || totalLen > (PACKET_MAX_SIZE_TCP * 10)) break; Mercury::Bundle* pBundle = bufferedLogPackets_.front(); bufferedLogPackets_.pop(); totalLen += pBundle->currMsgLength(); pMessagelogChannel->send(pBundle); --hasBufferedLogPackets_; } Mercury::g_trace_packet = v; canLogFile_ = false; unlockthread(); }
//------------------------------------------------------------------------------------- void EntityMailboxAbstract::newMail(Mercury::Bundle& bundle) { // 如果是server端的mailbox if(g_componentType != CLIENT_TYPE && g_componentType != BOTS_TYPE) { if(componentID_ == 0) // 客户端 { bundle.newMessage(ClientInterface::onRemoteMethodCall); } else // 服务器组件 { Components::ComponentInfos* cinfos = Components::getSingleton().findComponent(componentID_); if(cinfos != NULL) { // 找到对应的组件投递过去, 如果这个mailbox还需要中转比如 e.base.cell , 则由baseapp转往cellapp if(cinfos->componentType == BASEAPP_TYPE) { bundle.newMessage(BaseappInterface::onEntityMail); } else { bundle.newMessage(CellappInterface::onEntityMail); } } else { ERROR_MSG(fmt::format("EntityMailboxAbstract::newMail: not found component({})!\n", componentID_)); } } bundle << id_; // 如果是发往客户端的包则无需附加这样一个类型 if(componentID_ > 0) bundle << type_; } else { // 如果是客户端上的mailbox调用服务端方法只存在调用cell或者base switch(type_) { case MAILBOX_TYPE_BASE: bundle.newMessage(BaseappInterface::onRemoteMethodCall); break; case MAILBOX_TYPE_CELL: bundle.newMessage(BaseappInterface::onRemoteCallCellMethodFromClient); break; default: KBE_ASSERT(false && "no support!\n"); break; }; bundle << id_; } }
//------------------------------------------------------------------------------------- void Baseapp::onClientEntityEnterWorld(Proxy* base) { base->initClientCellPropertys(); Mercury::Bundle bundle; bundle.newMessage(ClientInterface::onEntityEnterWorld); bundle << base->getID(); bundle << base->getSpaceID(); base->getClientMailbox()->postMail(bundle); }
//------------------------------------------------------------------------------------- bool ClientObject::loginGateWay() { // 请求登录网关 Mercury::Bundle bundle; bundle.newMessage(BaseappInterface::loginGateway); bundle << name_; bundle << password_; bundle.send(*pChannel_->endpoint()); return true; }
//------------------------------------------------------------------------------------- bool ClientObject::createAccount() { // 创建账号 Mercury::Bundle bundle; bundle.newMessage(LoginappInterface::reqCreateAccount); bundle << name_; bundle << password_; bundle.send(*pChannel_->endpoint()); return true; }
//------------------------------------------------------------------------------------- void Cellappmgr::forwardMessage(Mercury::Channel* pChannel, MemoryStream& s) { COMPONENT_ID sender_componentID, forward_componentID; s >> sender_componentID >> forward_componentID; Components::ComponentInfos* cinfos = Components::getSingleton().findComponent(forward_componentID); KBE_ASSERT(cinfos != NULL && cinfos->pChannel != NULL); Mercury::Bundle bundle; bundle.append((char*)s.data() + s.rpos(), s.opsize()); bundle.send(this->getNetworkInterface(), cinfos->pChannel); s.opfini(); }
//------------------------------------------------------------------------------------- void Space::onSpaceDataChanged(const std::string& key, const std::string& value, bool isdel) { // 通知脚本 if(!isdel) { SCRIPT_OBJECT_CALL_ARGS3(Cellapp::getSingleton().getEntryScript().get(), const_cast<char*>("onSpaceData"), const_cast<char*>("Iss"), this->id(), key.c_str(), value.c_str()); } else { SCRIPT_OBJECT_CALL_ARGS3(Cellapp::getSingleton().getEntryScript().get(), const_cast<char*>("onSpaceData"), const_cast<char*>("IsO"), this->id(), key.c_str(), Py_None); } SPACE_ENTITIES::const_iterator iter = this->entities().begin(); for(; iter != this->entities().end(); iter++) { const Entity* pEntity = (*iter).get(); if(pEntity == NULL || pEntity->isDestroyed() || !pEntity->hasWitness()) continue; Mercury::Bundle* pForwardBundle = Mercury::Bundle::ObjPool().createObject(); if(!isdel) { pForwardBundle->newMessage(ClientInterface::setSpaceData); (*pForwardBundle) << this->id(); (*pForwardBundle) << key; (*pForwardBundle) << value; } else { pForwardBundle->newMessage(ClientInterface::delSpaceData); (*pForwardBundle) << this->id(); (*pForwardBundle) << key; } Mercury::Bundle* pSendBundle = Mercury::Bundle::ObjPool().createObject(); MERCURY_ENTITY_MESSAGE_FORWARD_CLIENT(pEntity->id(), (*pSendBundle), (*pForwardBundle)); if(!isdel) pEntity->pWitness()->sendToClient(ClientInterface::setSpaceData, pSendBundle); else pEntity->pWitness()->sendToClient(ClientInterface::delSpaceData, pSendBundle); Mercury::Bundle::ObjPool().reclaimObject(pForwardBundle); } }
void EntityApp<E>::onExecScriptCommand(Mercury::Channel* pChannel, std::string& strcommand) { DEBUG_MSG("EntityApp::onExecScriptCommand: command size(%d).\n", strcommand.size()); std::string retbuf = ""; if(script_.run_simpleString(strcommand, &retbuf) == 0) { // 将结果返回给客户端 Mercury::Bundle bundle; ConsoleInterface::ConsoleExecCommandCBMessageHandler msgHandler; bundle.newMessage(msgHandler); ConsoleInterface::ConsoleExecCommandCBMessageHandlerArgs1::staticAddToBundle(bundle, retbuf); bundle.send(this->getNetworkInterface(), pChannel); } }
void CLogWindow::OnBnClickedButton1() { // TODO: Add your control notification handler code here // 请求服务器拉取日志 CguiconsoleDlg* dlg = static_cast<CguiconsoleDlg*>(theApp.m_pMainWnd); HTREEITEM item = dlg->hasCheckApp(MESSAGELOG_TYPE); if(item == NULL) { ::AfxMessageBox(L"messagelog no select!"); return; } Mercury::Address addr = dlg->getTreeItemAddr(item); Mercury::Channel* pChannel = dlg->networkInterface().findChannel(addr); if(pChannel == NULL) { ::AfxMessageBox(L"messagelog is error!"); return; } Mercury::Bundle bundle; bundle.newMessage(MessagelogInterface::registerLogWatcher); bundle << getSelLogTypes(); CString apporder; m_appIDEdit.GetWindowTextW(apporder); char* cs = KBEngine::strutil::wchar2char(apporder.GetBuffer(0)); COMPONENT_ORDER order = atoi(cs); free(cs); bundle << order; int8 count = 0; std::vector<KBEngine::COMPONENT_TYPE> vec = getSelComponents(); count = vec.size(); bundle << count; std::vector<KBEngine::COMPONENT_TYPE>::iterator iter = vec.begin(); for(; iter != vec.end(); iter++) { bundle << (*iter); } bundle.send(dlg->networkInterface(), pChannel); }
//------------------------------------------------------------------------------------- bool Base::destroyCellEntity(void) { if(isDestroyed()) { return false; } if(cellMailbox_ == NULL || cellMailbox_->getChannel() == NULL) return false; Mercury::Bundle bundle; bundle.newMessage(CellappInterface::onDestroyCellEntityFromBaseapp); bundle << id_; bundle.send(Baseapp::getSingleton().getNetworkInterface(), cellMailbox_->getChannel()); return true; }
//------------------------------------------------------------------------------------- void Base::reqBackupCellData() { if(isGetingCellData_) return; EntityMailbox* mb = this->getCellMailbox(); if(mb == NULL) return; Mercury::Bundle bundle; bundle.newMessage(CellappInterface::reqBackupEntityCellData); bundle << this->getID(); mb->postMail(bundle); isGetingCellData_ = true; }
//------------------------------------------------------------------------------------- void ClientObject::sendTick() { // 向服务器发送tick uint64 check = uint64( Mercury::g_channelExternalTimeout * stampsPerSecond() ) / 2; if (timestamp() - lastSentActiveTickTime_ > check) { lastSentActiveTickTime_ = timestamp(); Mercury::Bundle bundle; if(connectedGateway_) bundle.newMessage(BaseappInterface::onClientActiveTick); else bundle.newMessage(LoginappInterface::onClientActiveTick); bundle.send(*pChannel_->endpoint()); } }
//------------------------------------------------------------------------------------- PyObject* BaseRemoteMethod::tp_call(PyObject* self, PyObject* args, PyObject* kwds) { BaseRemoteMethod* rmethod = static_cast<BaseRemoteMethod*>(self); MethodDescription* methodDescription = rmethod->getDescription(); EntityMailboxAbstract* mailbox = rmethod->getMailbox(); if(!mailbox->isClient()) { return RemoteEntityMethod::tp_call(self, args, kwds); } Base* pEntity = Baseapp::getSingleton().findEntity(mailbox->getID()); if(pEntity == NULL) { //WARNING_MSG(boost::format("BaseRemoteMethod::callClientMethod: not found entity(%1%).\n") % // mailbox->getID()); return RemoteEntityMethod::tp_call(self, args, kwds); } // 如果是调用客户端方法, 我们记录事件并且记录带宽 if(methodDescription->checkArgs(args)) { Mercury::Bundle* pBundle = Mercury::Bundle::ObjPool().createObject(); mailbox->newMail((*pBundle)); MemoryStream* mstream = MemoryStream::ObjPool().createObject(); methodDescription->addToStream(mstream, args); if(mstream->wpos() > 0) (*pBundle).append(mstream->data(), mstream->wpos()); // 记录这个事件产生的数据量大小 g_privateClientEventHistoryStats.trackEvent(pEntity->getScriptName(), methodDescription->getName(), pBundle->currMsgLength(), "::"); mailbox->postMail((*pBundle)); Mercury::Bundle::ObjPool().reclaimObject(pBundle); MemoryStream::ObjPool().reclaimObject(mstream); } S_Return; }
//------------------------------------------------------------------------------------- void EntityIDClient::onAlloc(void) { if(hasReqServerAlloc() || getSize() > ID_ENOUGH_LIMIT || idList_.size() > 0) return; Mercury::Bundle bundle; bundle.newMessage(DbmgrInterface::onReqAllocEntityID); DbmgrInterface::onReqAllocEntityIDArgs2::staticAddToBundle(bundle, pApp_->componentType(), pApp_->componentID()); Components::COMPONENTS cts = Components::getSingleton().getComponents(DBMGR_TYPE); KBE_ASSERT(cts.size() > 0); Components::ComponentInfos* cinfos = &(*cts.begin()); KBE_ASSERT(cinfos->pChannel != NULL); bundle.send(pApp_->getNetworkInterface(), cinfos->pChannel); ERROR_MSG("EntityIDClient::onAlloc: not enough(%d) entityIDs!\n", ID_ENOUGH_LIMIT); }
//------------------------------------------------------------------------------------- void Baseapp::onGetEntityAppFromDbmgr(Mercury::Channel* pChannel, int32 uid, std::string& username, int8 componentType, uint64 componentID, uint32 intaddr, uint16 intport, uint32 extaddr, uint16 extport) { if(pChannel->isExternal()) return; EntityApp<Base>::onRegisterNewApp(pChannel, uid, username, componentType, componentID, intaddr, intport, extaddr, extport); KBEngine::COMPONENT_TYPE tcomponentType = (KBEngine::COMPONENT_TYPE)componentType; Components::COMPONENTS cts = Componentbridge::getComponents().getComponents(DBMGR_TYPE); KBE_ASSERT(cts.size() >= 1); Components::ComponentInfos* cinfos = Componentbridge::getComponents().findComponent(tcomponentType, uid, componentID); cinfos->pChannel = NULL; int ret = Components::getSingleton().connectComponent(tcomponentType, uid, componentID); KBE_ASSERT(ret != -1); Mercury::Bundle bundle; switch(tcomponentType) { case BASEAPP_TYPE: bundle.newMessage(BaseappInterface::onRegisterNewApp); BaseappInterface::onRegisterNewAppArgs8::staticAddToBundle(bundle, getUserUID(), getUsername(), BASEAPP_TYPE, componentID_, this->getNetworkInterface().intaddr().ip, this->getNetworkInterface().intaddr().port, this->getNetworkInterface().extaddr().ip, this->getNetworkInterface().extaddr().port); break; case CELLAPP_TYPE: bundle.newMessage(CellappInterface::onRegisterNewApp); CellappInterface::onRegisterNewAppArgs8::staticAddToBundle(bundle, getUserUID(), getUsername(), BASEAPP_TYPE, componentID_, this->getNetworkInterface().intaddr().ip, this->getNetworkInterface().intaddr().port, this->getNetworkInterface().extaddr().ip, this->getNetworkInterface().extaddr().port); break; default: KBE_ASSERT(false && "no support!\n"); break; }; bundle.send(this->getNetworkInterface(), cinfos->pChannel); }
//------------------------------------------------------------------------------------- bool ClientObject::login() { if(error_ != C_ERROR_NONE) return false; Mercury::Bundle bundle; std::string bindatas = "bots client"; // 提交账号密码请求登录 bundle.newMessage(LoginappInterface::login); CLIENT_CTYPE tclient = CLIENT_TYPE_BOTS; bundle << tclient; bundle.appendBlob(bindatas); bundle << name_; bundle << password_; bundle.send(*pChannel_->endpoint()); return true; }
//------------------------------------------------------------------------------------- void Base::forwardEntityMessageToCellappFromClient(Mercury::Channel* pChannel, MemoryStream& s) { if(pChannel->proxyID() != this->getID()) { WARNING_MSG("Base::forwardEntityMessageToCellappFromClient: not srcEntity(%d/%d).\n", pChannel->proxyID(), this->getID()); return; } EntityMailbox* mb = this->getCellMailbox(); if(mb == NULL) return; // 将这个消息再打包转寄给cellapp, cellapp会对这个包中的每个消息进行判断 // 检查是否是entity消息, 否则不合法. Mercury::Bundle bundle; bundle.newMessage(CellappInterface::forwardEntityMessageToCellappFromClient); bundle << this->getID(); bundle.append(s); this->getCellMailbox()->postMail(bundle); }
//------------------------------------------------------------------------------------- void Machine::onFindInterfaceAddr(Mercury::Channel* pChannel, int32 uid, std::string& username, int8 componentType, int8 findComponentType, uint32 finderAddr, uint16 finderRecvPort) { INFO_MSG("Machine::onFindInterfaceAddr: uid:%d, username:%s, componentType:%s, " "find:%s, finderaddr:%s, finderRecvPort:%u.\n", uid, username.c_str(), COMPONENT_NAME_EX((COMPONENT_TYPE)componentType), COMPONENT_NAME_EX((COMPONENT_TYPE)findComponentType), inet_ntoa((struct in_addr&)finderAddr), ntohs(finderRecvPort)); Mercury::EndPoint ep; ep.socket(SOCK_DGRAM); if (!ep.good()) { ERROR_MSG("Machine::onFindInterfaceAddr: Failed to create socket.\n"); return; } const Components::ComponentInfos* pinfos = Componentbridge::getComponents().findComponent((KBEngine::COMPONENT_TYPE)findComponentType, uid, 0); Mercury::Bundle bundle; if(pinfos == NULL) { WARNING_MSG("Machine::onFindInterfaceAddr: %s not found %s.\n", COMPONENT_NAME_EX((COMPONENT_TYPE)componentType), COMPONENT_NAME_EX((COMPONENT_TYPE)findComponentType)); MachineInterface::onBroadcastInterfaceArgs8::staticAddToBundle(bundle, 0, "", UNKNOWN_COMPONENT_TYPE, 0, 0, 0, 0, 0); } else MachineInterface::onBroadcastInterfaceArgs8::staticAddToBundle(bundle, pinfos->uid, pinfos->username, findComponentType, pinfos->cid, pinfos->pIntAddr->ip, pinfos->pIntAddr->port, pinfos->pExtAddr->ip, pinfos->pExtAddr->port); if(finderAddr != 0 && finderRecvPort != 0) bundle.sendto(ep, finderRecvPort, finderAddr); else bundle.send(this->getNetworkInterface(), pChannel); }
//------------------------------------------------------------------------------------- void Loginapp::onReqCreateMailAccountResult(Mercury::Channel* pChannel, MemoryStream& s) { SERVER_ERROR_CODE failedcode; std::string accountName; std::string password; std::string retdatas = ""; s >> failedcode >> accountName >> password; s.readBlob(retdatas); DEBUG_MSG(boost::format("Loginapp::onReqCreateMailAccountResult: accountName=%1%, failedcode=%2%.\n") % accountName.c_str() % failedcode); if(failedcode == SERVER_SUCCESS) { threadPool_.addTask(new SendActivateEMailTask(accountName, retdatas, g_kbeSrvConfig.getLoginApp().http_cbhost, g_kbeSrvConfig.getLoginApp().http_cbport)); } PendingLoginMgr::PLInfos* ptinfos = pendingCreateMgr_.remove(accountName); if(ptinfos == NULL) return; Mercury::Channel* pClientChannel = this->getNetworkInterface().findChannel(ptinfos->addr); if(pClientChannel == NULL) return; pClientChannel->extra(""); retdatas = ""; Mercury::Bundle bundle; bundle.newMessage(ClientInterface::onCreateAccountResult); bundle << failedcode; bundle.appendBlob(retdatas); bundle.send(this->getNetworkInterface(), pClientChannel); SAFE_RELEASE(ptinfos); }
//------------------------------------------------------------------------------------- void Base::onCellWriteToDBCompleted() { PyObject* pyResult = PyObject_CallMethod(this, const_cast<char*>("onPreArchive"), const_cast<char*>("")); if(pyResult != NULL) Py_DECREF(pyResult); else PyErr_PrintEx(0); hasDB(true); onWriteToDB(); isArchiveing_ = false; MemoryStream* s = MemoryStream::ObjPool().createObject(); addPersistentsDataToStream(ED_FLAG_ALL, s); Components::COMPONENTS cts = Components::getSingleton().getComponents(DBMGR_TYPE); Components::ComponentInfos* dbmgrinfos = NULL; if(cts.size() > 0) dbmgrinfos = &(*cts.begin()); if(dbmgrinfos == NULL || dbmgrinfos->pChannel == NULL || dbmgrinfos->cid == 0) { ERROR_MSG("Base::onCellWriteToDBCompleted: not found dbmgr!\n"); return; } Mercury::Bundle bundle; bundle.newMessage(DbmgrInterface::writeEntity); bundle << this->getID(); bundle << this->getScriptModule()->getUType(); bundle.append(*s); bundle.send(Baseapp::getSingleton().getNetworkInterface(), dbmgrinfos->pChannel); MemoryStream::ObjPool().reclaimObject(s); }