uint32 ObjectMgr::constructPlayer( GameClient* requester, uint64 charUID ) { if (requester == NULL) throw ClientNotAvailable(); PlayerObject *newPlayerObj = NULL; try { newPlayerObj = new PlayerObject(*requester,charUID); } catch (PlayerObject::CharacterNotFound) { throw ObjectNotAvailable(); } uint32 theNewObjectId = getNewObjectId(); newPlayerObj->initGoId(theNewObjectId); m_objects[theNewObjectId]=objectPtr(newPlayerObj); return theNewObjectId; }
bool RMemoryStorage::saveObject(QSharedPointer<RObject> object, bool checkBlockRecursion, bool keepHandles) { if (object.isNull()) { qWarning() << "RMemoryStorage::saveObject: object is NULL"; return false; } //qDebug() << "saveObject: " << *object; // never allow two layers with identical names, update layer instead: QSharedPointer<RLayer> layer = object.dynamicCast<RLayer>(); if (!layer.isNull()) { RLayer::Id id = getLayerId(layer->getName()); if (id != RLayer::INVALID_ID && id != layer->getId()) { setObjectId(*layer, id); // never unprotect an existing protected layer: QSharedPointer<RLayer> existingLayer = queryLayerDirect(id); if (!existingLayer.isNull()) { if (existingLayer->isProtected()) { layer->setProtected(true); } } } } // never allow two blocks with identical names, update block instead: QSharedPointer<RBlock> block = object.dynamicCast<RBlock> (); if (!block.isNull()) { RBlock::Id id = getBlockId(block->getName()); if (id != RBlock::INVALID_ID && id != block->getId()) { setObjectId(*block, id); } } // never allow two linetypes with identical names, update linetype instead: QSharedPointer<RLinetype> linetype = object.dynamicCast<RLinetype> (); if (!linetype.isNull()) { RLinetype::Id id = getLinetypeId(linetype->getName()); if (id != RLinetype::INVALID_ID && id != linetype->getId()) { setObjectId(*linetype, id); } } // avoid block recursions: if (checkBlockRecursion) { /* QSharedPointer<RBlockReferenceEntity> blockRef = object.dynamicCast<RBlockReferenceEntity> (); if (!blockRef.isNull()) { RBlock::Id id = blockRef->getBlockId(); RBlock::Id refId = blockRef->getReferencedBlockId(); // check if block with 'id' may contain a block reference which refers to // block with 'refid': // 201308: too slow for large, complex drawings: if (checkRecursion(id, refId)) { qCritical("RMemoryStorage::saveObject: recursion found"); return false; } } */ } QSharedPointer<REntity> entity = object.dynamicCast<REntity> (); if (!entity.isNull()) { Q_ASSERT_X(!queryLayerDirect(entity->getLayerId()).isNull(), "RMemoryStrorage::saveObject", "Layer of entity is NULL"); } // assign new object ID to new objects: if (object->getId() == RObject::INVALID_ID) { setObjectId(*object, getNewObjectId()); // only set new handle if handle is not set already: if (!keepHandles || object->getHandle()==RObject::INVALID_HANDLE) { setObjectHandle(*object, getNewObjectHandle()); } // assign draw order to new entities: if (!entity.isNull() && entity->getDrawOrder()==0) { entity->setDrawOrder(getMaxDrawOrder()); setMaxDrawOrder(getMaxDrawOrder()+1); } } // TODO: save original object for rollback: //if (inTransaction) { //transactionObjectMap[object->getId()] = object; //} objectMap[object->getId()] = object; objectHandleMap[object->getHandle()] = object; if (!entity.isNull()) { entityMap[entity->getId()] = entity; blockEntityMap.insert(entity->getBlockId(), entity); setMaxDrawOrder(qMax(entity->getDrawOrder()+1, getMaxDrawOrder())); } if (!layer.isNull()) { layerMap[object->getId()] = layer; } if (!block.isNull()) { blockMap[object->getId()] = block; } if (!linetype.isNull()) { linetypeMap[object->getId()] = linetype; } QSharedPointer<RDocumentVariables> docVars = object.dynamicCast<RDocumentVariables> (); if (!docVars.isNull()) { documentVariables = docVars; } return true; }
bool RMemoryStorage::saveObject(QSharedPointer<RObject> object, bool checkBlockRecursion, bool keepHandles) { if (object.isNull()) { return false; } // never allow two layers with identical names, update layer instead: QSharedPointer<RLayer> layer = object.dynamicCast<RLayer>(); if (!layer.isNull()) { RLayer::Id id = getLayerId(layer->getName()); if (id != RLayer::INVALID_ID) { setObjectId(*layer, id); } } // never allow two blocks with identical names, update block instead: QSharedPointer<RBlock> block = object.dynamicCast<RBlock> (); if (!block.isNull()) { RBlock::Id id = getBlockId(block->getName()); if (id != RBlock::INVALID_ID) { setObjectId(*block, id); } } // avoid block recursions: if (checkBlockRecursion) { /* QSharedPointer<RBlockReferenceEntity> blockRef = object.dynamicCast<RBlockReferenceEntity> (); if (!blockRef.isNull()) { RBlock::Id id = blockRef->getBlockId(); RBlock::Id refId = blockRef->getReferencedBlockId(); // check if block with 'id' may contain a block reference which refers to // block with 'refid': // 201308: too slow for large, complex drawings: if (checkRecursion(id, refId)) { qCritical("RMemoryStorage::saveObject: recursion found"); return false; } } */ } QSharedPointer<REntity> entity = object.dynamicCast<REntity> (); // assign new object ID to new objects: if (object->getId() == RObject::INVALID_ID) { setObjectId(*object, getNewObjectId()); // only set new handle if handle is not set already: if (!keepHandles || object->getHandle()==RObject::INVALID_HANDLE) { setObjectHandle(*object, getNewObjectHandle()); } // assign draw order to new entities: if (!entity.isNull()) { entity->setDrawOrder(getMaxDrawOrder()); setMaxDrawOrder(getMaxDrawOrder()+1); } } // TODO: save original object for rollback: //if (inTransaction) { //transactionObjectMap[object->getId()] = object; //} objectMap[object->getId()] = object; //QSharedPointer<REntity> entity = object.dynamicCast<REntity> (); if (!entity.isNull()) { entityMap[entity->getId()] = entity; blockEntityMap.insert(entity->getBlockId(), entity); //qDebug() << "added " << entity->getId() << " to block " << entity->getBlockId(); setMaxDrawOrder(qMax(entity->getDrawOrder()+1, getMaxDrawOrder())); } if (!layer.isNull()) { layerMap[object->getId()] = layer; } if (!block.isNull()) { blockMap[object->getId()] = block; } return true; }
/*********************************************************************** * Handler implementation **********************************************************************/ bool Pothos::RemoteHandler::runHandlerOnce(std::istream &is, std::ostream &os) { bool done = false; //deserialize the request const auto reqArgs = recvDatagram(is); //process the request and form the reply Pothos::ObjectKwargs replyArgs; replyArgs["tid"] = reqArgs.at("tid"); POTHOS_EXCEPTION_TRY { const auto &action = reqArgs.at("action").extract<std::string>(); if (action == "RemoteProxyEnvironment") { Pothos::ProxyEnvironmentArgs envArgs; for (const auto &entry : reqArgs) { if (entry.second.type() != typeid(std::string)) continue; envArgs[entry.first] = entry.second.extract<std::string>(); } const auto &name = reqArgs.at("name").extract<std::string>(); auto env = Pothos::ProxyEnvironment::make(name, envArgs); replyArgs["envID"] = getNewObjectId(Pothos::Object(env)); //a unique process ID for this server const auto info = Pothos::System::HostInfo::get(); replyArgs["upid"] = Pothos::Object(Pothos::ProxyEnvironment::getLocalUniquePid()); replyArgs["nodeId"] = Pothos::Object(info.nodeId); replyArgs["peerAddr"] = Pothos::Object(_peerAddr); } else if (action == "~RemoteProxyEnvironment") { removeObjectAtId(reqArgs.at("envID")); done = true; } else if (action == "findProxy") { auto env = getObjectAtId(reqArgs.at("envID")).extract<Pothos::ProxyEnvironment::Sptr>(); auto proxy = env->findProxy(reqArgs.at("name").extract<std::string>()); replyArgs["handleID"] = getNewObjectId(Pothos::Object(proxy)); } else if (action == "convertObjectToProxy") { auto env = getObjectAtId(reqArgs.at("envID")).extract<Pothos::ProxyEnvironment::Sptr>(); auto proxy = env->convertObjectToProxy(reqArgs.at("local")); replyArgs["handleID"] = getNewObjectId(Pothos::Object(proxy)); } else if (action == "convertProxyToObject") { auto env = getObjectAtId(reqArgs.at("envID")).extract<Pothos::ProxyEnvironment::Sptr>(); auto proxy = getObjectAtId(reqArgs.at("handleID")).extract<Pothos::Proxy>(); auto local = env->convertProxyToObject(proxy); replyArgs["local"] = local; } else if (action == "~RemoteProxyHandle") { removeObjectAtId(reqArgs.at("handleID")); } else if (action == "call") { auto proxy = getObjectAtId(reqArgs.at("handleID")).extract<Pothos::Proxy>(); //load the args std::vector<Pothos::Proxy> args; size_t argNo = 0; while (true) { auto it = reqArgs.find(std::to_string(argNo++)); if (it == reqArgs.end()) break; args.push_back(getObjectAtId(it->second).extract<Pothos::Proxy>()); } //make the call try { const auto &name = reqArgs.at("name").extract<std::string>(); auto result = proxy.getHandle()->call(name, args.data(), args.size()); replyArgs["handleID"] = getNewObjectId(Pothos::Object(result)); } catch (const Pothos::ProxyExceptionMessage &ex) { replyArgs["message"] = Pothos::Object(ex.message()); } } else if (action == "compareTo") { auto proxy = getObjectAtId(reqArgs.at("handleID")).extract<Pothos::Proxy>(); auto other = getObjectAtId(reqArgs.at("otherID")).extract<Pothos::Proxy>(); replyArgs["result"] = Pothos::Object(proxy.compareTo(other)); } else if (action == "hashCode") { auto proxy = getObjectAtId(reqArgs.at("handleID")).extract<Pothos::Proxy>(); replyArgs["result"] = Pothos::Object(proxy.hashCode()); } else if (action == "toString") { auto proxy = getObjectAtId(reqArgs.at("handleID")).extract<Pothos::Proxy>(); replyArgs["result"] = Pothos::Object(proxy.toString()); } else if (action == "getClassName") { auto proxy = getObjectAtId(reqArgs.at("handleID")).extract<Pothos::Proxy>(); replyArgs["result"] = Pothos::Object(proxy.getClassName()); } else { poco_bugcheck_msg(action.c_str()); } } POTHOS_EXCEPTION_CATCH(const Pothos::Exception &ex) { replyArgs["errorMsg"] = Pothos::Object(ex.displayText()); }