bool GwfTranslator::getScAddr(const String &idtf, sc_addr &addr) { tStringAddrMap::iterator it = mLocalIdtfAddrs.find(idtf); if (it != mLocalIdtfAddrs.end()) { addr = it->second; return true; } it = mSysIdtfAddrs.find(idtf); if (it != mSysIdtfAddrs.end()) { addr = it->second; return true; } it = msGlobalIdtfAddrs.find(idtf); if (it != msGlobalIdtfAddrs.end()) { addr = it->second; return true; } if (sc_helper_find_element_by_system_identifier(idtf.c_str(), idtf.size(), &addr) == SC_RESULT_OK) return true; return false; }
sctpErrorCode sctpCommand::processFindElementBySysIdtf(quint32 cmdFlags, quint32 cmdId, QDataStream *params, QIODevice *outDevice) { sc_addr addr; sc_uint32 data_len = 0; sc_char *data = 0; Q_UNUSED(cmdFlags); Q_ASSERT(params != 0); // read length of content data READ_PARAM(data_len); Q_ASSERT(data_len > 0); data = new sc_char[data_len]; if (params->readRawData(data, data_len) != data_len) return SCTP_ERROR_CMD_READ_PARAMS; sc_addr result; if (sc_helper_find_element_by_system_identifier(data, data_len, &result) != SC_RESULT_OK) writeResultHeader(SCTP_CMD_FIND_ELEMENT_BY_SYSITDF, cmdId, SCTP_RESULT_FAIL, 0, outDevice); else { writeResultHeader(SCTP_CMD_FIND_ELEMENT_BY_SYSITDF, cmdId, SCTP_RESULT_OK, sizeof(sc_addr), outDevice); outDevice->write((const char*)&result, sizeof(sc_addr)); } return SCTP_ERROR_NO; }
void iTranslator::generateFormatInfo(sc_addr addr, const String &ext) { String fmtStr = "format_" + ext; tStringAddrMap::iterator it = mSysIdtfAddrs.find(fmtStr); sc_addr fmt_addr; if (it != mSysIdtfAddrs.end()) { fmt_addr = it->second; } else { // try to find by system identifier if (sc_helper_find_element_by_system_identifier(mContext, fmtStr.c_str(), (sc_uint32)fmtStr.size(), &fmt_addr) != SC_RESULT_OK) { fmt_addr = sc_memory_node_new(mContext, sc_type_node_class | sc_type_const); sc_helper_set_system_identifier(mContext, fmt_addr, fmtStr.c_str(), (sc_uint32)fmtStr.size()); mSysIdtfAddrs[fmtStr] = fmt_addr; } } // try to find format relation sc_addr nrel_format_addr; String nrel_format_str = NREL_FORMAT_STR; it = mSysIdtfAddrs.find(nrel_format_str); if (it != mSysIdtfAddrs.end()) { nrel_format_addr = it->second; } else { // try to find by system identifier if (sc_helper_find_element_by_system_identifier(mContext, nrel_format_str.c_str(), (sc_uint32)nrel_format_str.size(), &nrel_format_addr) != SC_RESULT_OK) { nrel_format_addr = sc_memory_node_new(mContext, sc_type_node_norole | sc_type_const); sc_helper_set_system_identifier(mContext, nrel_format_addr, nrel_format_str.c_str(), (sc_uint32)nrel_format_str.size()); mSysIdtfAddrs[nrel_format_str] = nrel_format_addr; } } // connect sc-link with format sc_addr arc_addr = sc_memory_arc_new(mContext, sc_type_arc_common | sc_type_const, addr, fmt_addr); sc_memory_arc_new(mContext, sc_type_arc_pos_const_perm, nrel_format_addr, arc_addr); }
sc_bool sc_helper_resolve_system_identifier(sc_memory_context const * ctx, const char *system_idtf, sc_addr *result) { gchar *keynode_idtf = 0; gsize bytes_written = 0; keynode_idtf = g_locale_to_utf8(system_idtf, -1, 0, &bytes_written, 0); if (keynode_idtf == null_ptr) { g_warning("Error while trying to convert %s to utf-8", system_idtf); return SC_FALSE; } if (sc_helper_find_element_by_system_identifier(ctx, keynode_idtf, (sc_uint32)bytes_written, result) != SC_RESULT_OK) return SC_FALSE; g_free(keynode_idtf); return SC_TRUE; }
sc_addr SCsTranslator::resolveScAddr(sElement *el) { assert(SC_ADDR_IS_EMPTY(el->addr)); sc_addr addr; SC_ADDR_MAKE_EMPTY(addr); if (!el->idtf.empty()) { // try to find in system identifiers tStringAddrMap::iterator it = mSysIdtfAddrs.find(el->idtf); if (it != mSysIdtfAddrs.end()) { addr = it->second; } else { // try to find in global identifiers it = msGlobalIdtfAddrs.find(el->idtf); if (it != msGlobalIdtfAddrs.end()) addr = it->second; else { // try to find in local identifiers it = mLocalIdtfAddrs.find(el->idtf); if (it != mLocalIdtfAddrs.end()) addr = it->second; else { // resolve system identifier sc_result res = sc_helper_find_element_by_system_identifier(mContext, el->idtf.c_str(), (sc_uint32)el->idtf.size(), &addr); if (res == SC_RESULT_OK) mSysIdtfAddrs[el->idtf] = addr; } } } } if (SC_ADDR_IS_NOT_EMPTY(addr)) { sc_type t = 0; if (sc_memory_get_element_type(mContext, addr, &t) == SC_RESULT_OK) sc_memory_change_element_subtype(mContext, addr, ~sc_type_element_mask & (el->type | t)); el->addr = addr; return addr; } // generate addr addr = createScAddr(el); // store in addrs map if (!el->idtf.empty()) { switch (_getIdentifierVisibility(el->idtf)) { case IdtfSystem: sc_helper_set_system_identifier(mContext, addr, el->idtf.c_str(), (sc_uint32)el->idtf.size()); mSysIdtfAddrs[el->idtf] = addr; break; case IdtfLocal: mLocalIdtfAddrs[el->idtf] = addr; break; case IdtfGlobal: msGlobalIdtfAddrs[el->idtf] = addr; break; } } return addr; }
bool ScMemoryContext::helperFindBySystemIdtf(std::string const & sysIdtf, ScAddr & outAddr) { check_expr(isValid()); return (sc_helper_find_element_by_system_identifier(mContext, sysIdtf.c_str(), (sc_uint32)sysIdtf.size(), &outAddr.mRealAddr) == SC_RESULT_OK); }