//------------------------------------------------------------------------------------- void Baseapp::_onCreateBaseAnywhereCallback(Mercury::Channel* pChannel, CALLBACK_ID callbackID, std::string& entityType, ENTITY_ID eid, COMPONENT_ID componentID) { if(callbackID == 0) return; PyObjectPtr pyCallback = callbackMgr().take(callbackID); PyObject* pyargs = PyTuple_New(1); if(pChannel != NULL) { ScriptDefModule* sm = EntityDef::findScriptModule(entityType.c_str()); if(sm == NULL) { ERROR_MSG("Baseapp::onCreateBaseAnywhereCallback: can't found entityType:%s.\n", entityType.c_str()); Py_DECREF(pyargs); return; } // 如果entity属于另一个baseapp创建则设置它的mailbox Mercury::Channel* pOtherBaseappChannel = Components::getSingleton().findComponent(componentID)->pChannel; KBE_ASSERT(pOtherBaseappChannel != NULL); PyObject* mb = static_cast<EntityMailbox*>(new EntityMailbox(sm, NULL, componentID, eid, MAILBOX_TYPE_BASE)); PyTuple_SET_ITEM(pyargs, 0, mb); PyObject_CallObject(pyCallback.get(), pyargs); //Py_DECREF(mb); int i=0; i++; } else { Base* base = pEntities_->find(eid); if(base == NULL) { ERROR_MSG("Baseapp::onCreateBaseAnywhereCallback: can't found entity:%ld.\n", eid); Py_DECREF(pyargs); return; } Py_INCREF(base); PyTuple_SET_ITEM(pyargs, 0, base); PyObject_CallObject(pyCallback.get(), pyargs); } SCRIPT_ERROR_CHECK(); Py_DECREF(pyargs); }
//------------------------------------------------------------------------------------- void Cellapp::executeRawDatabaseCommand(const char* datas, uint32 size, PyObject* pycallback, ENTITY_ID eid) { if(datas == NULL) { ERROR_MSG("KBEngine::executeRawDatabaseCommand: execute is error!\n"); return; } 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("KBEngine::executeRawDatabaseCommand: not found dbmgr!\n"); return; } INFO_MSG(boost::format("KBEngine::executeRawDatabaseCommand%1%:%2%.\n") % (eid > 0 ? (boost::format("(entityID=%1%)") % eid).str() : "") % datas); Mercury::Bundle* pBundle = Mercury::Bundle::ObjPool().createObject(); (*pBundle).newMessage(DbmgrInterface::executeRawDatabaseCommand); (*pBundle) << eid; (*pBundle) << componentID_ << componentType_; CALLBACK_ID callbackID = 0; if(pycallback && PyCallable_Check(pycallback)) callbackID = callbackMgr().save(pycallback); (*pBundle) << callbackID; (*pBundle) << size; (*pBundle).append(datas, size); (*pBundle).send(this->getNetworkInterface(), dbmgrinfos->pChannel); Mercury::Bundle::ObjPool().reclaimObject(pBundle); }
//------------------------------------------------------------------------------------- void Baseapp::createBaseAnywhere(const char* entityType, PyObject* params, PyObject* pyCallback) { std::string strInitData = ""; uint32 initDataLength = 0; if(params != NULL && PyDict_Check(params)) { strInitData = script::Pickler::pickle(params); initDataLength = strInitData.length(); } Mercury::Bundle bundle; bundle.newMessage(BaseappmgrInterface::reqCreateBaseAnywhere); bundle << entityType; bundle << initDataLength; if(initDataLength > 0) bundle.append(strInitData.data(), initDataLength); bundle << componentID_; CALLBACK_ID callbackID = 0; if(pyCallback != NULL) { callbackID = callbackMgr().save(pyCallback); } bundle << callbackID; Components::COMPONENTS& components = Components::getSingleton().getComponents(BASEAPPMGR_TYPE); Components::COMPONENTS::iterator iter = components.begin(); if(iter != components.end()) { bundle.send(this->getNetworkInterface(), (*iter).pChannel); return; } ERROR_MSG("Baseapp::createBaseAnywhere: not found baseappmgr.\n"); }
//------------------------------------------------------------------------------------- void Baseapp::executeRawDatabaseCommand(const char* datas, uint32 size, PyObject* pycallback) { if(datas == NULL) { ERROR_MSG("Baseapp::executeRawDatabaseCommand: execute is error!\n"); return; } 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("Baseapp::executeRawDatabaseCommand: not found dbmgr!\n"); return; } DEBUG_MSG("KBEngine::executeRawDatabaseCommand:%s.\n", datas); Mercury::Bundle bundle; bundle.newMessage(DbmgrInterface::executeRawDatabaseCommand); bundle << componentID_ << componentType_; CALLBACK_ID callbackID = 0; if(pycallback && PyCallable_Check(pycallback)) callbackID = callbackMgr().save(pycallback); bundle << callbackID; bundle << size; bundle.append(datas, size); bundle.send(this->getNetworkInterface(), dbmgrinfos->pChannel); }