Variant PackedDataContainer::_iter_get_ofs(const Variant &p_iter, uint32_t p_offset) { int size = _size(p_offset); int pos = p_iter; if (pos < 0 || pos >= size) return Variant(); PoolVector<uint8_t>::Read rd = data.read(); const uint8_t *r = &rd[p_offset]; uint32_t type = decode_uint32(r); bool err = false; if (type == TYPE_ARRAY) { uint32_t vpos = decode_uint32(rd.ptr() + p_offset + 8 + pos * 4); return _get_at_ofs(vpos, rd.ptr(), err); } else if (type == TYPE_DICT) { uint32_t vpos = decode_uint32(rd.ptr() + p_offset + 8 + pos * 12 + 4); return _get_at_ofs(vpos, rd.ptr(), err); } else { ERR_FAIL_V(Variant()); } }
void decode_recur(DBusMessageIter *iter, int *err, alarm_recur_t *rec) { decode_uint64 (iter, err, &rec->mask_min); decode_uint32 (iter, err, &rec->mask_hour); decode_uint32 (iter, err, &rec->mask_mday); decode_uint32 (iter, err, &rec->mask_wday); decode_uint32 (iter, err, &rec->mask_mon); decode_uint32 (iter, err, &rec->special); }
Variant PackedDataContainer::_get_at_ofs(uint32_t p_ofs, const uint8_t *p_buf, bool &err) const { uint32_t type = decode_uint32(p_buf + p_ofs); if (type == TYPE_ARRAY || type == TYPE_DICT) { Ref<PackedDataContainerRef> pdcr = memnew(PackedDataContainerRef); Ref<PackedDataContainer> pdc = Ref<PackedDataContainer>((PackedDataContainer *)this); pdcr->from = pdc; pdcr->offset = p_ofs; return pdcr; } else { Variant v; Error rerr = decode_variant(v, p_buf + p_ofs, datalen - p_ofs, NULL); if (rerr != OK) { err = true; ERR_FAIL_COND_V(err != OK, Variant()); } return v; } }
static Error _decode_string(const uint8_t *&buf, int &len, int *r_len, String &r_string) { ERR_FAIL_COND_V(len < 4, ERR_INVALID_DATA); uint32_t strlen = decode_uint32(buf); buf += 4; len -= 4; ERR_FAIL_COND_V((int)strlen > len, ERR_FILE_EOF); String str; str.parse_utf8((const char *)buf, strlen); r_string = str; //handle padding if (strlen % 4) { strlen += 4 - strlen % 4; } buf += strlen; len -= strlen; if (r_len) { (*r_len) += 4 + strlen; } return OK; }
void MultiplayerAPI::_process_simplify_path(int p_from, const uint8_t *p_packet, int p_packet_len) { ERR_EXPLAIN("Invalid packet received. Size too small."); ERR_FAIL_COND(p_packet_len < 5); int id = decode_uint32(&p_packet[1]); String paths; paths.parse_utf8((const char *)&p_packet[5], p_packet_len - 5); NodePath path = paths; if (!path_get_cache.has(p_from)) { path_get_cache[p_from] = PathGetCache(); } PathGetCache::NodeInfo ni; ni.path = path; ni.instance = 0; path_get_cache[p_from].nodes[id] = ni; // Encode path to send ack. CharString pname = String(path).utf8(); int len = encode_cstring(pname.get_data(), NULL); Vector<uint8_t> packet; packet.resize(1 + len); packet.write[0] = NETWORK_COMMAND_CONFIRM_PATH; encode_cstring(pname.get_data(), &packet.write[1]); network_peer->set_transfer_mode(NetworkedMultiplayerPeer::TRANSFER_MODE_RELIABLE); network_peer->set_target_peer(p_from); network_peer->put_packet(packet.ptr(), packet.size()); }
int PacketPeerStream::get_available_packet_count() const { _poll_buffer(); uint32_t remaining = ring_buffer.data_left(); int ofs=0; int count=0; while(remaining>=4) { uint8_t lbuf[4]; ring_buffer.copy(lbuf,ofs,4); uint32_t len = decode_uint32(lbuf); remaining-=4; ofs+=4; if (len>remaining) break; remaining-=len; ofs+=len; count++; } return count; }
void TileMap::_set_tile_data(const DVector<int>& p_data) { int c=p_data.size(); DVector<int>::Read r = p_data.read(); for(int i=0;i<c;i+=2) { const uint8_t *ptr=(const uint8_t*)&r[i]; uint8_t local[8]; for(int j=0;j<8;j++) local[j]=ptr[j]; #ifdef BIG_ENDIAN_ENABLED SWAP(local[0],local[3]); SWAP(local[1],local[2]); SWAP(local[4],local[7]); SWAP(local[5],local[6]); #endif int x = decode_uint16(&local[0]); int y = decode_uint16(&local[2]); uint32_t v = decode_uint32(&local[4]); bool flip_h = v&(1<<29); bool flip_v = v&(1<<30); v&=(1<<29)-1; // if (x<-20 || y <-20 || x>4000 || y>4000) // continue; set_cell(x,y,v,flip_h,flip_v); } }
int FileAccessNetworkClient::get_32() { uint8_t buf[4]; client->get_data(buf,4); return decode_uint32(buf); }
/** The twofish packet format consists of: * * - a 8-bit twofish encoding version in clear text * - a 32-bit SA number in clear text * - ciphertext encrypted from a 32-bit nonce followed by the payload. * * [V|SSSS|nnnnDDDDDDDDDDDDDDDDDDDDD] * |<------ encrypted ------>| */ static int transop_decode_twofish( ntvl_trans_op_t * arg, uint8_t * outbuf, size_t out_len, const uint8_t * inbuf, size_t in_len ) { int len=0; transop_tf_t * priv = (transop_tf_t *)arg->priv; uint8_t assembly[NTVL_PKT_BUF_SIZE]; if ( ( (in_len - (TRANSOP_TF_VER_SIZE + TRANSOP_TF_SA_SIZE)) <= NTVL_PKT_BUF_SIZE ) /* Cipher text fits in assembly */ && (in_len >= (TRANSOP_TF_VER_SIZE + TRANSOP_TF_SA_SIZE + TRANSOP_TF_NONCE_SIZE) ) ) { /* Has at least version, SA and nonce */ ntvl_sa_t sa_rx; ssize_t sa_idx=-1; size_t rem=in_len; size_t idx=0; uint8_t tf_enc_ver=0; /* Get the encoding version to make sure it is supported */ decode_uint8( &tf_enc_ver, inbuf, &rem, &idx ); if ( NTVL_TWOFISH_TRANSFORM_VERSION == tf_enc_ver ) { /* Get the SA number and make sure we are decrypting with the right one. */ decode_uint32( &sa_rx, inbuf, &rem, &idx ); sa_idx = twofish_find_sa(priv, sa_rx); if ( sa_idx >= 0 ) { sa_twofish_t * sa = &(priv->sa[sa_idx]); traceEvent( TRACE_DEBUG, "decode_twofish %lu with SA %lu.", in_len, sa_rx, sa->sa_id ); len = TwoFishDecryptRaw( (void *)(inbuf + TRANSOP_TF_VER_SIZE + TRANSOP_TF_SA_SIZE), assembly, /* destination */ (in_len - (TRANSOP_TF_VER_SIZE + TRANSOP_TF_SA_SIZE)), sa->dec_tf); if ( len > 0 ) { /* Step over 4-byte random nonce value */ len -= TRANSOP_TF_NONCE_SIZE; /* size of ethernet packet */ memcpy( outbuf, assembly + TRANSOP_TF_NONCE_SIZE, len ); } else traceEvent( TRACE_ERROR, "decode_twofish decryption failed." ); } else { /* Wrong security association; drop the packet as it is undecodable. */ traceEvent( TRACE_ERROR, "decode_twofish SA number %lu not found.", sa_rx ); /* REVISIT: should be able to load a new SA at this point to complete the decoding. */ } } else { /* Wrong security association; drop the packet as it is undecodable. */ traceEvent( TRACE_ERROR, "decode_twofish unsupported twofish version %u.", tf_enc_ver ); /* REVISIT: should be able to load a new SA at this point to complete the decoding. */ } } else traceEvent( TRACE_ERROR, "decode_twofish inbuf wrong size (%ul) to decrypt.", in_len ); return len; }
uint32_t PackedDataContainer::_type_at_ofs(uint32_t p_ofs) const { PoolVector<uint8_t>::Read rd = data.read(); const uint8_t *r = &rd[p_ofs]; uint32_t type = decode_uint32(r); return type; };
Variant PackedDataContainer::_key_at_ofs(uint32_t p_ofs,const Variant& p_key,bool &err) const { DVector<uint8_t>::Read rd=data.read(); const uint8_t *r=&rd[p_ofs]; uint32_t type = decode_uint32(r); if (type==TYPE_ARRAY) { if (p_key.is_num()) { int idx=p_key; uint32_t len = decode_uint32(r+4); if (idx<0 || idx>=len) { err=true; return Variant(); } uint32_t ofs = decode_uint32(r+8+4*idx); return _get_at_ofs(ofs,rd.ptr(),err); } else { err=true; return Variant(); } } else if (type==TYPE_DICT) { uint32_t hash=p_key.hash(); uint32_t len = decode_uint32(r+4); bool found=false; for(int i=0;i<len;i++) { uint32_t khash=decode_uint32(r+8+i*12+0); if (khash==hash) { Variant key = _get_at_ofs(decode_uint32(r+8+i*12+4),rd.ptr(),err); if (err) return Variant(); if (key==p_key) { //key matches, return value return _get_at_ofs(decode_uint32(r+8+i*12+8),rd.ptr(),err); } found=true; } else { if (found) break; } } err=true; return Variant(); } else { err=true; return Variant(); } }
int PackedDataContainer::_size(uint32_t p_ofs) const { PoolVector<uint8_t>::Read rd = data.read(); const uint8_t *r = &rd[p_ofs]; uint32_t type = decode_uint32(r); if (type == TYPE_ARRAY) { uint32_t len = decode_uint32(r + 4); return len; } else if (type == TYPE_DICT) { uint32_t len = decode_uint32(r + 4); return len; }; return -1; };
int32_t StreamPeer::get_32() { uint8_t buf[4]; get_data(buf, 4); uint32_t r = decode_uint32(buf); if (big_endian) { r = BSWAP32(r); } return r; }
int encode_int < uint32_t > ( uint32_t val, uint8_t * start, uint8_t * end ) { int ret = encode_uint32 ( val, start, end ); if ( ret > 0 ) { uint32_t val2; int ret2 = decode_uint32 ( start, start + ret, & val2 ); assert ( ret == ret2 && val == val2 ); } return ret; }
/* * Have an exchange with the server over TCP/IP and get the IPs of our local * and the remote host. */ static void client_get_hosts(char *lhost, char *rhost) { SS raddr; socklen_t rlen; char *service; uint32_t port; int fd = -1; recv_mesg(&port, sizeof(port), "TCP IPv4 server port"); port = decode_uint32(&port); service = qasprintf("%d", port); connect_tcp(ServerName, service, &raddr, &rlen, &fd); free(service); get_socket_ip((SA *)&raddr, rlen, rhost, NI_MAXHOST); send_mesg(rhost, NI_MAXHOST, "server IP"); recv_mesg(lhost, NI_MAXHOST, "client IP"); close(fd); }
static inline int decode_getacl3resok(struct xdr_stream *xdr, struct nfs3_getaclres *result) { struct posix_acl **acl; unsigned int *aclcnt; size_t hdrlen; int error; error = decode_post_op_attr(xdr, result->fattr); if (unlikely(error)) goto out; error = decode_uint32(xdr, &result->mask); if (unlikely(error)) goto out; error = -EINVAL; if (result->mask & ~(NFS_ACL|NFS_ACLCNT|NFS_DFACL|NFS_DFACLCNT)) goto out; hdrlen = (u8 *)xdr->p - (u8 *)xdr->iov->iov_base; acl = NULL; if (result->mask & NFS_ACL) acl = &result->acl_access; aclcnt = NULL; if (result->mask & NFS_ACLCNT) aclcnt = &result->acl_access_count; error = nfsacl_decode(xdr->buf, hdrlen, aclcnt, acl); if (unlikely(error <= 0)) goto out; acl = NULL; if (result->mask & NFS_DFACL) acl = &result->acl_default; aclcnt = NULL; if (result->mask & NFS_DFACLCNT) aclcnt = &result->acl_default_count; error = nfsacl_decode(xdr->buf, hdrlen + error, aclcnt, acl); if (unlikely(error <= 0)) return error; error = 0; out: return error; }
Node *MultiplayerAPI::_process_get_node(int p_from, const uint8_t *p_packet, int p_packet_len) { uint32_t target = decode_uint32(&p_packet[1]); Node *node = NULL; if (target & 0x80000000) { // Use full path (not cached yet). int ofs = target & 0x7FFFFFFF; ERR_EXPLAIN("Invalid packet received. Size smaller than declared."); ERR_FAIL_COND_V(ofs >= p_packet_len, NULL); String paths; paths.parse_utf8((const char *)&p_packet[ofs], p_packet_len - ofs); NodePath np = paths; node = root_node->get_node(np); if (!node) ERR_PRINTS("Failed to get path from RPC: " + String(np)); } else { // Use cached path. int id = target; Map<int, PathGetCache>::Element *E = path_get_cache.find(p_from); ERR_EXPLAIN("Invalid packet received. Requests invalid peer cache."); ERR_FAIL_COND_V(!E, NULL); Map<int, PathGetCache::NodeInfo>::Element *F = E->get().nodes.find(id); ERR_EXPLAIN("Invalid packet received. Unabled to find requested cached node."); ERR_FAIL_COND_V(!F, NULL); PathGetCache::NodeInfo *ni = &F->get(); // Do proper caching later. node = root_node->get_node(ni->path); if (!node) ERR_PRINTS("Failed to get cached path from RPC: " + String(ni->path)); } return node; }
Error PacketPeerStream::get_packet(const uint8_t **r_buffer, int &r_buffer_size) const { ERR_FAIL_COND_V(peer.is_null(), ERR_UNCONFIGURED); _poll_buffer(); int remaining = ring_buffer.data_left(); ERR_FAIL_COND_V(remaining < 4, ERR_UNAVAILABLE); uint8_t lbuf[4]; ring_buffer.copy(lbuf, 0, 4); remaining -= 4; uint32_t len = decode_uint32(lbuf); ERR_FAIL_COND_V(remaining < (int)len, ERR_UNAVAILABLE); ring_buffer.read(lbuf, 4); //get rid of first 4 bytes ring_buffer.read(&temp_buffer[0], len); // read packet *r_buffer = &temp_buffer[0]; r_buffer_size = len; return OK; }
static int nfs3_xdr_dec_access3res(struct rpc_rqst *req, struct xdr_stream *xdr, struct nfs3_accessres *result) { enum nfs_stat status; int error; error = decode_nfsstat3(xdr, &status); if (unlikely(error)) goto out; error = decode_post_op_attr(xdr, result->fattr); if (unlikely(error)) goto out; if (status != NFS3_OK) goto out_default; error = decode_uint32(xdr, &result->access); out: return error; out_default: return nfs_stat_to_errno(status); }
/* * Initialize and return open socket. */ static int init(void) { int sockfd; uint32_t lport; uint32_t rport; char lhost[NI_MAXHOST]; char rhost[NI_MAXHOST]; if (is_client()) client_get_hosts(lhost, rhost); else server_get_hosts(lhost, rhost); sockfd = rds_socket(lhost, Req.port); lport = get_socket_port(sockfd); encode_uint32(&lport, lport); send_mesg(&lport, sizeof(lport), "RDS port"); recv_mesg(&rport, sizeof(rport), "RDS port"); rport = decode_uint32(&rport); rds_makeaddr(&RAddr, &RLen, rhost, rport); return sockfd; }
std::shared_ptr<ErrorContext> PrintContentHandler::process_template_set( uint16_t set_id, uint16_t set_length, const uint8_t* buf, bool is_options_set) { const uint8_t* cur = buf; const uint8_t* set_end = buf + set_length; const uint16_t header_length = is_options_set ? kOptionsTemplateHeaderLen : kTemplateHeaderLen; while (CHECK_POINTER_WITHIN_I(cur + header_length, cur, set_end)) { /* Decode template record */ uint16_t set_id = decode_uint16(cur + 0); uint16_t field_count = decode_uint16(cur + 2); uint16_t scope_field_count = is_options_set ? decode_uint16(cur + 4) : 0; PH_RETURN_CALLBACK_ERROR(start_template_record(set_id, field_count)); cur += header_length; for (unsigned int field = 0; field < field_count; field++) { if (!CHECK_POINTER_WITHIN_I(cur + kFieldSpecifierLen, cur, set_end)) { libfc_RETURN_ERROR(recoverable, long_fieldspec, "Field specifier partly outside template record", 0, 0, 0, 0, cur - buf); } uint16_t ie_id = decode_uint16(cur + 0); uint16_t ie_length = decode_uint16(cur + 2); bool enterprise = ie_id & 0x8000; ie_id &= 0x7fff; uint32_t enterprise_number = 0; if (enterprise) { if (!CHECK_POINTER_WITHIN_I(cur + kFieldSpecifierLen + kEnterpriseLen, cur, set_end)) { libfc_RETURN_ERROR(recoverable, long_fieldspec, "Field specifier partly outside template " "record (enterprise)", 0, 0, 0, 0, cur - buf); } enterprise_number = decode_uint32(cur + 4); } std::cerr << " "; if (is_options_set && field < scope_field_count) std::cerr << "Scope field"; else if (is_options_set) std::cerr << "Options field"; else /* !is_options_set */ std::cerr << "Field specifier"; const InfoElement* ie = info_model.lookupIE(enterprise_number, ie_id, ie_length); if (ie != 0) std::cerr << ", name=" << ie->name(); else { std::cerr << ( enterprise ? ", enterprise" : "" ) << ", ie_id=" << ie_id << ", ie_length=" << ie_length; if (enterprise) std::cerr << ", enterprise_number=" << enterprise_number; } std::cerr << std::endl; cur += kFieldSpecifierLen + (enterprise ? kEnterpriseLen : 0); assert (cur <= set_end); } PH_RETURN_CALLBACK_ERROR(end_template_record()); } libfc_RETURN_OK(); }
Error GDTokenizerBuffer::set_code_buffer(const Vector<uint8_t> & p_buffer) { const uint8_t *buf=p_buffer.ptr(); int total_len=p_buffer.size(); ERR_FAIL_COND_V( p_buffer.size()<24 || p_buffer[0]!='G' || p_buffer[1]!='D' || p_buffer[2]!='S' || p_buffer[3]!='C',ERR_INVALID_DATA); int version = decode_uint32(&buf[4]); if (version>BYTECODE_VERSION) { ERR_EXPLAIN("Bytecode is too New! Please use a newer engine version."); ERR_FAIL_COND_V(version>BYTECODE_VERSION,ERR_INVALID_DATA); } int identifier_count = decode_uint32(&buf[8]); int constant_count = decode_uint32(&buf[12]); int line_count = decode_uint32(&buf[16]); int token_count = decode_uint32(&buf[20]); const uint8_t *b=buf; b=&buf[24]; total_len-=24; identifiers.resize(identifier_count); for(int i=0;i<identifier_count;i++) { int len = decode_uint32(b); ERR_FAIL_COND_V(len>total_len,ERR_INVALID_DATA); b+=4; Vector<uint8_t> cs; cs.resize(len); for(int j=0;j<len;j++) { cs[j]=b[j]^0xb6; } cs[cs.size()-1]=0; String s; s.parse_utf8((const char*)cs.ptr()); b+=len; total_len-=len+4; identifiers[i]=s; } constants.resize(constant_count); for(int i=0;i<constant_count;i++) { Variant v; int len; Error err = decode_variant(v,b,total_len,&len); if (err) return err; b+=len; total_len-=len; constants[i]=v; } ERR_FAIL_COND_V(line_count*8>total_len,ERR_INVALID_DATA); for(int i=0;i<line_count;i++) { uint32_t token=decode_uint32(b); b+=4; uint32_t linecol=decode_uint32(b); b+=4; lines.insert(token,linecol); total_len-=8; } tokens.resize(token_count); for(int i=0;i<token_count;i++) { ERR_FAIL_COND_V( total_len < 1, ERR_INVALID_DATA); if ((*b)&TOKEN_BYTE_MASK) { //little endian always ERR_FAIL_COND_V( total_len < 4, ERR_INVALID_DATA); tokens[i]=decode_uint32(b)&~TOKEN_BYTE_MASK; b+=4; } else { tokens[i]=*b; b+=1; total_len--; } } token=0; return OK; }
std::shared_ptr<ErrorContext> PlacementContentHandler::process_template_set( uint16_t set_id, uint16_t set_length, const uint8_t* buf, bool is_options_set) { const uint8_t* cur = buf; const uint8_t* set_end = buf + set_length; const uint16_t header_length = is_options_set ? kOptionsTemplateHeaderLen : kTemplateHeaderLen; while (CHECK_POINTER_WITHIN_I(cur + header_length, cur, set_end)) { /* Decode template record */ uint16_t set_id = decode_uint16(cur + 0); uint16_t field_count = decode_uint16(cur + 2); uint16_t scope_field_count = is_options_set ? decode_uint16(cur + 4) : 0; CH_REPORT_CALLBACK_ERROR(start_template_record(set_id, field_count)); cur += header_length; for (unsigned int field = 0; field < field_count; field++) { if (!CHECK_POINTER_WITHIN_I(cur + kFieldSpecifierLen, cur, set_end)) { libfc_RETURN_ERROR(recoverable, long_fieldspec, "Field specifier partly outside template record", 0, 0, 0, 0, cur - buf); } uint16_t ie_id = decode_uint16(cur + 0); uint16_t ie_length = decode_uint16(cur + 2); bool enterprise = ie_id & 0x8000; ie_id &= 0x7fff; uint32_t enterprise_number = 0; if (enterprise) { if (!CHECK_POINTER_WITHIN_I(cur + kFieldSpecifierLen + kEnterpriseLen, cur, set_end)) { libfc_RETURN_ERROR(recoverable, long_fieldspec, "Field specifier partly outside template " "record (enterprise)", 0, 0, 0, 0, cur - buf); } enterprise_number = decode_uint32(cur + 4); } if (is_options_set && field < scope_field_count) CH_REPORT_CALLBACK_ERROR(scope_field_specifier(enterprise, ie_id, ie_length, enterprise_number)); else if (is_options_set) CH_REPORT_CALLBACK_ERROR(options_field_specifier(enterprise, ie_id, ie_length, enterprise_number)); else /* !is_options_set */ CH_REPORT_CALLBACK_ERROR(field_specifier(enterprise, ie_id, ie_length, enterprise_number)); cur += kFieldSpecifierLen + (enterprise ? kEnterpriseLen : 0); assert (cur <= set_end); } CH_REPORT_CALLBACK_ERROR(end_template_record()); } libfc_RETURN_OK(); }
bool GridMap::_set(const StringName &p_name, const Variant &p_value) { String name = p_name; if (name == "theme") { set_theme(p_value); } else if (name == "cell_size") { set_cell_size(p_value); } else if (name == "cell_octant_size") { set_octant_size(p_value); } else if (name == "cell_center_x") { set_center_x(p_value); } else if (name == "cell_center_y") { set_center_y(p_value); } else if (name == "cell_center_z") { set_center_z(p_value); } else if (name == "cell_scale") { set_cell_scale(p_value); /* } else if (name=="cells") { PoolVector<int> cells = p_value; int amount=cells.size(); PoolVector<int>::Read r = cells.read(); ERR_FAIL_COND_V(amount&1,false); // not even cell_map.clear(); for(int i=0;i<amount/3;i++) { IndexKey ik; ik.key=decode_uint64(&r[i*3]); Cell cell; cell.cell=uint32_t(r[i*+1]); cell_map[ik]=cell; } _recreate_octant_data();*/ } else if (name == "data") { Dictionary d = p_value; if (d.has("cells")) { PoolVector<int> cells = d["cells"]; int amount = cells.size(); PoolVector<int>::Read r = cells.read(); ERR_FAIL_COND_V(amount % 3, false); // not even cell_map.clear(); for (int i = 0; i < amount / 3; i++) { IndexKey ik; ik.key = decode_uint64((const uint8_t *)&r[i * 3]); Cell cell; cell.cell = decode_uint32((const uint8_t *)&r[i * 3 + 2]); cell_map[ik] = cell; } } _recreate_octant_data(); } else if (name.begins_with("areas/")) { int which = name.get_slicec('/', 1).to_int(); String what = name.get_slicec('/', 2); if (what == "bounds") { ERR_FAIL_COND_V(area_map.has(which), false); create_area(which, p_value); return true; } ERR_FAIL_COND_V(!area_map.has(which), false); if (what == "name") area_set_name(which, p_value); else if (what == "disable_distance") area_set_portal_disable_distance(which, p_value); else if (what == "exterior_portal") area_set_portal_disable_color(which, p_value); else return false; } else return false; return true; }
void NetworkedMultiplayerENet::poll(){ ERR_FAIL_COND(!active); _pop_current_packet(); ENetEvent event; /* Wait up to 1000 milliseconds for an event. */ while (true) { if (!host || !active) //might have been disconnected while emitting a notification return; int ret = enet_host_service (host, & event, 1); if (ret<0) { //error, do something? break; } else if (ret==0) { break; } switch (event.type) { case ENET_EVENT_TYPE_CONNECT: { /* Store any relevant client information here. */ if (server && refuse_connections) { enet_peer_reset(event.peer); break; } IP_Address ip; ip.host=event.peer -> address.host; int *new_id = memnew( int ); *new_id = event.data; if (*new_id==0) { //data zero is sent by server (enet won't let you configure this). Server is always 1 *new_id=1; } event.peer->data=new_id; peer_map[*new_id]=event.peer; connection_status=CONNECTION_CONNECTED; //if connecting, this means it connected t something! emit_signal("peer_connected",*new_id); if (server) { //someone connected, let it know of all the peers available for (Map<int,ENetPeer*>::Element *E=peer_map.front();E;E=E->next()) { if (E->key()==*new_id) continue; //send existing peers to new peer ENetPacket * packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE); encode_uint32(SYSMSG_ADD_PEER,&packet->data[0]); encode_uint32(E->key(),&packet->data[4]); enet_peer_send(event.peer,1,packet); //send the new peer to existing peers packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE); encode_uint32(SYSMSG_ADD_PEER,&packet->data[0]); encode_uint32(*new_id,&packet->data[4]); enet_peer_send(E->get(),1,packet); } } else { emit_signal("connection_succeeded"); } } break; case ENET_EVENT_TYPE_DISCONNECT: { /* Reset the peer's client information. */ int *id = (int*)event.peer -> data; if (!id) { if (!server) { emit_signal("connection_failed"); } } else { if (server) { //someone disconnected, let it know to everyone else for (Map<int,ENetPeer*>::Element *E=peer_map.front();E;E=E->next()) { if (E->key()==*id) continue; //send the new peer to existing peers ENetPacket* packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE); encode_uint32(SYSMSG_REMOVE_PEER,&packet->data[0]); encode_uint32(*id,&packet->data[4]); enet_peer_send(E->get(),1,packet); } } else if (!server) { emit_signal("server_disconnected"); close_connection(); return; } emit_signal("peer_disconnected",*id); peer_map.erase(*id); memdelete( id ); } } break; case ENET_EVENT_TYPE_RECEIVE: { if (event.channelID==1) { //some config message ERR_CONTINUE( event.packet->dataLength < 8); int msg = decode_uint32(&event.packet->data[0]); int id = decode_uint32(&event.packet->data[4]); switch(msg) { case SYSMSG_ADD_PEER: { peer_map[id]=NULL; emit_signal("peer_connected",id); } break; case SYSMSG_REMOVE_PEER: { peer_map.erase(id); emit_signal("peer_disconnected",id); } break; } enet_packet_destroy(event.packet); } else if (event.channelID==0){ Packet packet; packet.packet = event.packet; int *id = (int*)event.peer -> data; ERR_CONTINUE(event.packet->dataLength<12) uint32_t source = decode_uint32(&event.packet->data[0]); int target = decode_uint32(&event.packet->data[4]); uint32_t flags = decode_uint32(&event.packet->data[8]); packet.from=source; if (server) { packet.from=*id; if (target==0) { //re-send the everyone but sender :| incoming_packets.push_back(packet); //and make copies for sending for (Map<int,ENetPeer*>::Element *E=peer_map.front();E;E=E->next()) { if (uint32_t(E->key())==source) //do not resend to self continue; ENetPacket* packet2 = enet_packet_create (packet.packet->data,packet.packet->dataLength,flags); enet_peer_send(E->get(),0,packet2); } } else if (target<0) { //to all but one //and make copies for sending for (Map<int,ENetPeer*>::Element *E=peer_map.front();E;E=E->next()) { if (uint32_t(E->key())==source || E->key()==-target) //do not resend to self, also do not send to excluded continue; ENetPacket* packet2 = enet_packet_create (packet.packet->data,packet.packet->dataLength,flags); enet_peer_send(E->get(),0,packet2); } if (-target != 1) { //server is not excluded incoming_packets.push_back(packet); } else { //server is excluded, erase packet enet_packet_destroy(packet.packet); } } else if (target==1) { //to myself and only myself incoming_packets.push_back(packet); } else { //to someone else, specifically ERR_CONTINUE(!peer_map.has(target)); enet_peer_send(peer_map[target],0,packet.packet); } } else { incoming_packets.push_back(packet); } //destroy packet later.. } else { ERR_CONTINUE(true); } }break; case ENET_EVENT_TYPE_NONE: { //do nothing } break; } } }
void EditorExportPlatformAndroid::_fix_resources(Vector<uint8_t>& p_manifest) { const int UTF8_FLAG = 0x00000100; print_line("*******************GORRRGLE***********************"); uint32_t header = decode_uint32(&p_manifest[0]); uint32_t filesize = decode_uint32(&p_manifest[4]); uint32_t string_block_len = decode_uint32(&p_manifest[16]); uint32_t string_count = decode_uint32(&p_manifest[20]); uint32_t string_flags = decode_uint32(&p_manifest[28]); const uint32_t string_table_begins = 40; Vector<String> string_table; printf("stirng block len: %i\n",string_block_len); printf("stirng count: %i\n",string_count); printf("flags: %x\n",string_flags); for(int i=0;i<string_count;i++) { uint32_t offset = decode_uint32(&p_manifest[string_table_begins+i*4]); offset+=string_table_begins+string_count*4; String str = _parse_string(&p_manifest[offset],string_flags&UTF8_FLAG); if (str.begins_with("godot-project-name")) { if (str=="godot-project-name") { //project name str = get_project_name(); } else { String lang = str.substr(str.find_last("-")+1,str.length()).replace("-","_"); String prop = "application/name_"+lang; if (Globals::get_singleton()->has(prop)) { str = Globals::get_singleton()->get(prop); } else { str = get_project_name(); } } } string_table.push_back(str); } //write a new string table, but use 16 bits Vector<uint8_t> ret; ret.resize(string_table_begins+string_table.size()*4); for(int i=0;i<string_table_begins;i++) { ret[i]=p_manifest[i]; } int ofs=0; for(int i=0;i<string_table.size();i++) { encode_uint32(ofs,&ret[string_table_begins+i*4]); ofs+=string_table[i].length()*2+2+2; } ret.resize(ret.size()+ofs); uint8_t *chars=&ret[ret.size()-ofs]; for(int i=0;i<string_table.size();i++) { String s = string_table[i]; encode_uint16(s.length(),chars); chars+=2; for(int j=0;j<s.length();j++) { encode_uint16(s[j],chars); chars+=2; } encode_uint16(0,chars); chars+=2; } //pad while(ret.size()%4) ret.push_back(0); //change flags to not use utf8 encode_uint32(string_flags&~0x100,&ret[28]); //change length encode_uint32(ret.size()-12,&ret[16]); //append the rest... int rest_from = 12+string_block_len; int rest_to = ret.size(); int rest_len = (p_manifest.size() - rest_from); ret.resize(ret.size() + (p_manifest.size() - rest_from) ); for(int i=0;i<rest_len;i++) { ret[rest_to+i]=p_manifest[rest_from+i]; } //finally update the size encode_uint32(ret.size(),&ret[4]); p_manifest=ret; printf("end\n"); }
void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t>& p_manifest) { const int CHUNK_AXML_FILE = 0x00080003; const int CHUNK_RESOURCEIDS = 0x00080180; const int CHUNK_STRINGS = 0x001C0001; const int CHUNK_XML_END_NAMESPACE = 0x00100101; const int CHUNK_XML_END_TAG = 0x00100103; const int CHUNK_XML_START_NAMESPACE = 0x00100100; const int CHUNK_XML_START_TAG = 0x00100102; const int CHUNK_XML_TEXT = 0x00100104; const int UTF8_FLAG = 0x00000100; Vector<String> string_table; uint32_t ofs=0; uint32_t header = decode_uint32(&p_manifest[ofs]); uint32_t filesize = decode_uint32(&p_manifest[ofs+4]); ofs+=8; // print_line("FILESIZE: "+itos(filesize)+" ACTUAL: "+itos(p_manifest.size())); uint32_t string_count; uint32_t styles_count; uint32_t string_flags; uint32_t string_data_offset; uint32_t styles_offset; uint32_t string_table_begins; uint32_t string_table_ends; Vector<uint8_t> stable_extra; while(ofs < p_manifest.size()) { uint32_t chunk = decode_uint32(&p_manifest[ofs]); uint32_t size = decode_uint32(&p_manifest[ofs+4]); switch(chunk) { case CHUNK_STRINGS: { int iofs=ofs+8; uint32_t string_count=decode_uint32(&p_manifest[iofs]); uint32_t styles_count=decode_uint32(&p_manifest[iofs+4]); uint32_t string_flags=decode_uint32(&p_manifest[iofs+8]); uint32_t string_data_offset=decode_uint32(&p_manifest[iofs+12]); uint32_t styles_offset=decode_uint32(&p_manifest[iofs+16]); /* printf("string count: %i\n",string_count); printf("flags: %i\n",string_flags); printf("sdata ofs: %i\n",string_data_offset); printf("styles ofs: %i\n",styles_offset); */ uint32_t st_offset=iofs+20; string_table.resize(string_count); uint32_t string_end=0; string_table_begins=st_offset; for(int i=0;i<string_count;i++) { uint32_t string_at = decode_uint32(&p_manifest[st_offset+i*4]); string_at+=st_offset+string_count*4; ERR_EXPLAIN("Unimplemented, can't read utf8 string table."); ERR_FAIL_COND(string_flags&UTF8_FLAG); if (string_flags&UTF8_FLAG) { } else { uint32_t len = decode_uint16(&p_manifest[string_at]); Vector<CharType> ucstring; ucstring.resize(len+1); for(int j=0;j<len;j++) { uint16_t c=decode_uint16(&p_manifest[string_at+2+2*j]); ucstring[j]=c; } string_end=MAX(string_at+2+2*len,string_end); ucstring[len]=0; string_table[i]=ucstring.ptr(); } // print_line("String "+itos(i)+": "+string_table[i]); } for(int i=string_end;i<(ofs+size);i++) { stable_extra.push_back(p_manifest[i]); } // printf("stable extra: %i\n",int(stable_extra.size())); string_table_ends=ofs+size; // print_line("STABLE SIZE: "+itos(size)+" ACTUAL: "+itos(string_table_ends)); } break; case CHUNK_XML_START_TAG: { int iofs=ofs+8; uint32_t line=decode_uint32(&p_manifest[iofs]); uint32_t nspace=decode_uint32(&p_manifest[iofs+8]); uint32_t name=decode_uint32(&p_manifest[iofs+12]); uint32_t check=decode_uint32(&p_manifest[iofs+16]); String tname=string_table[name]; // printf("NSPACE: %i\n",nspace); //printf("NAME: %i (%s)\n",name,tname.utf8().get_data()); //printf("CHECK: %x\n",check); uint32_t attrcount=decode_uint32(&p_manifest[iofs+20]); iofs+=28; //printf("ATTRCOUNT: %x\n",attrcount); for(int i=0;i<attrcount;i++) { uint32_t attr_nspace=decode_uint32(&p_manifest[iofs]); uint32_t attr_name=decode_uint32(&p_manifest[iofs+4]); uint32_t attr_value=decode_uint32(&p_manifest[iofs+8]); uint32_t attr_flags=decode_uint32(&p_manifest[iofs+12]); uint32_t attr_resid=decode_uint32(&p_manifest[iofs+16]); String value; if (attr_value!=0xFFFFFFFF) value=string_table[attr_value]; else value="Res #"+itos(attr_resid); String attrname = string_table[attr_name]; String nspace; if (attr_nspace!=0xFFFFFFFF) nspace=string_table[attr_nspace]; else nspace=""; printf("ATTR %i NSPACE: %i\n",i,attr_nspace); printf("ATTR %i NAME: %i (%s)\n",i,attr_name,attrname.utf8().get_data()); printf("ATTR %i VALUE: %i (%s)\n",i,attr_value,value.utf8().get_data()); printf("ATTR %i FLAGS: %x\n",i,attr_flags); printf("ATTR %i RESID: %x\n",i,attr_resid); //replace project information if (tname=="manifest" && attrname=="package") { print_line("FOUND PACKAGE"); string_table[attr_value]=package; } //print_line("tname: "+tname); //print_line("nspace: "+nspace); //print_line("attrname: "+attrname); if (tname=="manifest" && /*nspace=="android" &&*/ attrname=="versionCode") { print_line("FOUND versioncode"); encode_uint32(version_code,&p_manifest[iofs+16]); } if (tname=="manifest" && /*nspace=="android" &&*/ attrname=="versionName") { print_line("FOUND versionname"); if (attr_value==0xFFFFFFFF) { WARN_PRINT("Version name in a resource, should be plaintext") } else string_table[attr_value]=version_name; } if (tname=="activity" && /*nspace=="android" &&*/ attrname=="screenOrientation") { print_line("FOUND screen orientation"); if (attr_value==0xFFFFFFFF) { WARN_PRINT("Version name in a resource, should be plaintext") } else { string_table[attr_value]=(orientation==0?"landscape":"portrait"); } } if (tname=="application" && /*nspace=="android" &&*/ attrname=="label") { print_line("FOUND application"); if (attr_value==0xFFFFFFFF) { WARN_PRINT("Application name in a resource, should be plaintext.") } else { String aname = get_project_name(); string_table[attr_value]=aname; } } if (tname=="activity" && /*nspace=="android" &&*/ attrname=="label") { print_line("FOUND activity name"); if (attr_value==0xFFFFFFFF) { WARN_PRINT("Activity name in a resource, should be plaintext") } else { String aname; if (this->name!="") { aname=this->name; } else { aname = Globals::get_singleton()->get("application/name"); } if (aname=="") { aname=_MKSTR(VERSION_NAME); } print_line("APP NAME IS..."+aname); string_table[attr_value]=aname; } } iofs+=20; }
void EditorFileServer::_subthread_start(void *s) { ClientData *cd = (ClientData *)s; cd->connection->set_nodelay(true); uint8_t buf4[8]; Error err = cd->connection->get_data(buf4, 4); if (err != OK) { _close_client(cd); ERR_FAIL_COND(err != OK); } int passlen = decode_uint32(buf4); if (passlen > 512) { _close_client(cd); ERR_FAIL_COND(passlen > 512); } else if (passlen > 0) { Vector<char> passutf8; passutf8.resize(passlen + 1); err = cd->connection->get_data((uint8_t *)passutf8.ptr(), passlen); if (err != OK) { _close_client(cd); ERR_FAIL_COND(err != OK); } passutf8[passlen] = 0; String s; s.parse_utf8(passutf8.ptr()); if (s != cd->efs->password) { encode_uint32(ERR_INVALID_DATA, buf4); cd->connection->put_data(buf4, 4); OS::get_singleton()->delay_usec(1000000); _close_client(cd); ERR_PRINT("CLIENT PASSWORD MISMATCH"); ERR_FAIL(); } } else { if (cd->efs->password != "") { encode_uint32(ERR_INVALID_DATA, buf4); cd->connection->put_data(buf4, 4); OS::get_singleton()->delay_usec(1000000); _close_client(cd); ERR_PRINT("CLIENT PASSWORD MISMATCH (should be empty!)"); ERR_FAIL(); } } encode_uint32(OK, buf4); cd->connection->put_data(buf4, 4); while (!cd->quit) { //wait for ID err = cd->connection->get_data(buf4, 4); //#define DEBUG_PRINT(m_p) print_line(m_p) DEBUG_TIME("get_data") if (err != OK) { _close_client(cd); ERR_FAIL_COND(err != OK); } int id = decode_uint32(buf4); //wait for command err = cd->connection->get_data(buf4, 4); if (err != OK) { _close_client(cd); ERR_FAIL_COND(err != OK); } int cmd = decode_uint32(buf4); switch (cmd) { case FileAccessNetwork::COMMAND_FILE_EXISTS: case FileAccessNetwork::COMMAND_GET_MODTIME: case FileAccessNetwork::COMMAND_OPEN_FILE: { DEBUG_TIME("open_file") err = cd->connection->get_data(buf4, 4); if (err != OK) { _close_client(cd); ERR_FAIL_COND(err != OK); } int namelen = decode_uint32(buf4); Vector<char> fileutf8; fileutf8.resize(namelen + 1); err = cd->connection->get_data((uint8_t *)fileutf8.ptr(), namelen); if (err != OK) { _close_client(cd); ERR_FAIL_COND(err != OK); } fileutf8[namelen] = 0; String s; s.parse_utf8(fileutf8.ptr()); if (cmd == FileAccessNetwork::COMMAND_FILE_EXISTS) { print_line("FILE EXISTS: " + s); } if (cmd == FileAccessNetwork::COMMAND_GET_MODTIME) { print_line("MOD TIME: " + s); } if (cmd == FileAccessNetwork::COMMAND_OPEN_FILE) { print_line("OPEN: " + s); } if (!s.begins_with("res://")) { _close_client(cd); ERR_FAIL_COND(!s.begins_with("res://")); } ERR_CONTINUE(cd->files.has(id)); if (cmd == FileAccessNetwork::COMMAND_FILE_EXISTS) { encode_uint32(id, buf4); cd->connection->put_data(buf4, 4); encode_uint32(FileAccessNetwork::RESPONSE_FILE_EXISTS, buf4); cd->connection->put_data(buf4, 4); encode_uint32(FileAccess::exists(s), buf4); cd->connection->put_data(buf4, 4); DEBUG_TIME("open_file_end") break; } if (cmd == FileAccessNetwork::COMMAND_GET_MODTIME) { encode_uint32(id, buf4); cd->connection->put_data(buf4, 4); encode_uint32(FileAccessNetwork::RESPONSE_GET_MODTIME, buf4); cd->connection->put_data(buf4, 4); encode_uint64(FileAccess::get_modified_time(s), buf4); cd->connection->put_data(buf4, 8); DEBUG_TIME("open_file_end") break; } FileAccess *fa = FileAccess::open(s, FileAccess::READ); if (!fa) { //not found, continue encode_uint32(id, buf4); cd->connection->put_data(buf4, 4); encode_uint32(FileAccessNetwork::RESPONSE_OPEN, buf4); cd->connection->put_data(buf4, 4); encode_uint32(ERR_FILE_NOT_FOUND, buf4); cd->connection->put_data(buf4, 4); DEBUG_TIME("open_file_end") break; } encode_uint32(id, buf4); cd->connection->put_data(buf4, 4); encode_uint32(FileAccessNetwork::RESPONSE_OPEN, buf4); cd->connection->put_data(buf4, 4); encode_uint32(OK, buf4); cd->connection->put_data(buf4, 4); encode_uint64(fa->get_len(), buf4); cd->connection->put_data(buf4, 8); cd->files[id] = fa; DEBUG_TIME("open_file_end") } break;
void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t>& p_manifest,bool p_give_internet) { const int CHUNK_AXML_FILE = 0x00080003; const int CHUNK_RESOURCEIDS = 0x00080180; const int CHUNK_STRINGS = 0x001C0001; const int CHUNK_XML_END_NAMESPACE = 0x00100101; const int CHUNK_XML_END_TAG = 0x00100103; const int CHUNK_XML_START_NAMESPACE = 0x00100100; const int CHUNK_XML_START_TAG = 0x00100102; const int CHUNK_XML_TEXT = 0x00100104; const int UTF8_FLAG = 0x00000100; Vector<String> string_table; uint32_t ofs=0; uint32_t header = decode_uint32(&p_manifest[ofs]); uint32_t filesize = decode_uint32(&p_manifest[ofs+4]); ofs+=8; // print_line("FILESIZE: "+itos(filesize)+" ACTUAL: "+itos(p_manifest.size())); uint32_t string_count; uint32_t styles_count; uint32_t string_flags; uint32_t string_data_offset; uint32_t styles_offset; uint32_t string_table_begins; uint32_t string_table_ends; Vector<uint8_t> stable_extra; while(ofs < p_manifest.size()) { uint32_t chunk = decode_uint32(&p_manifest[ofs]); uint32_t size = decode_uint32(&p_manifest[ofs+4]); switch(chunk) { case CHUNK_STRINGS: { int iofs=ofs+8; string_count=decode_uint32(&p_manifest[iofs]); styles_count=decode_uint32(&p_manifest[iofs+4]); uint32_t string_flags=decode_uint32(&p_manifest[iofs+8]); string_data_offset=decode_uint32(&p_manifest[iofs+12]); styles_offset=decode_uint32(&p_manifest[iofs+16]); /* printf("string count: %i\n",string_count); printf("flags: %i\n",string_flags); printf("sdata ofs: %i\n",string_data_offset); printf("styles ofs: %i\n",styles_offset); */ uint32_t st_offset=iofs+20; string_table.resize(string_count); uint32_t string_end=0; string_table_begins=st_offset; for(int i=0;i<string_count;i++) { uint32_t string_at = decode_uint32(&p_manifest[st_offset+i*4]); string_at+=st_offset+string_count*4; ERR_EXPLAIN("Unimplemented, can't read utf8 string table."); ERR_FAIL_COND(string_flags&UTF8_FLAG); if (string_flags&UTF8_FLAG) { } else { uint32_t len = decode_uint16(&p_manifest[string_at]); Vector<CharType> ucstring; ucstring.resize(len+1); for(int j=0;j<len;j++) { uint16_t c=decode_uint16(&p_manifest[string_at+2+2*j]); ucstring[j]=c; } string_end=MAX(string_at+2+2*len,string_end); ucstring[len]=0; string_table[i]=ucstring.ptr(); } // print_line("String "+itos(i)+": "+string_table[i]); } for(int i=string_end;i<(ofs+size);i++) { stable_extra.push_back(p_manifest[i]); } // printf("stable extra: %i\n",int(stable_extra.size())); string_table_ends=ofs+size; // print_line("STABLE SIZE: "+itos(size)+" ACTUAL: "+itos(string_table_ends)); } break; case CHUNK_XML_START_TAG: { int iofs=ofs+8; uint32_t line=decode_uint32(&p_manifest[iofs]); uint32_t nspace=decode_uint32(&p_manifest[iofs+8]); uint32_t name=decode_uint32(&p_manifest[iofs+12]); uint32_t check=decode_uint32(&p_manifest[iofs+16]); String tname=string_table[name]; // printf("NSPACE: %i\n",nspace); //printf("NAME: %i (%s)\n",name,tname.utf8().get_data()); //printf("CHECK: %x\n",check); uint32_t attrcount=decode_uint32(&p_manifest[iofs+20]); iofs+=28; //printf("ATTRCOUNT: %x\n",attrcount); for(int i=0;i<attrcount;i++) { uint32_t attr_nspace=decode_uint32(&p_manifest[iofs]); uint32_t attr_name=decode_uint32(&p_manifest[iofs+4]); uint32_t attr_value=decode_uint32(&p_manifest[iofs+8]); uint32_t attr_flags=decode_uint32(&p_manifest[iofs+12]); uint32_t attr_resid=decode_uint32(&p_manifest[iofs+16]); String value; if (attr_value!=0xFFFFFFFF) value=string_table[attr_value]; else value="Res #"+itos(attr_resid); String attrname = string_table[attr_name]; String nspace; if (attr_nspace!=0xFFFFFFFF) nspace=string_table[attr_nspace]; else nspace=""; printf("ATTR %i NSPACE: %i\n",i,attr_nspace); printf("ATTR %i NAME: %i (%s)\n",i,attr_name,attrname.utf8().get_data()); printf("ATTR %i VALUE: %i (%s)\n",i,attr_value,value.utf8().get_data()); printf("ATTR %i FLAGS: %x\n",i,attr_flags); printf("ATTR %i RESID: %x\n",i,attr_resid); //replace project information if (tname=="manifest" && attrname=="package") { print_line("FOUND PACKAGE"); string_table[attr_value]=get_package_name(); } //print_line("tname: "+tname); //print_line("nspace: "+nspace); //print_line("attrname: "+attrname); if (tname=="manifest" && /*nspace=="android" &&*/ attrname=="versionCode") { print_line("FOUND versioncode"); encode_uint32(version_code,&p_manifest[iofs+16]); } if (tname=="manifest" && /*nspace=="android" &&*/ attrname=="versionName") { print_line("FOUND versionname"); if (attr_value==0xFFFFFFFF) { WARN_PRINT("Version name in a resource, should be plaintext") } else string_table[attr_value]=version_name; } if (tname=="activity" && /*nspace=="android" &&*/ attrname=="screenOrientation") { encode_uint32(orientation==0?0:1,&p_manifest[iofs+16]); /* print_line("FOUND screen orientation"); if (attr_value==0xFFFFFFFF) { WARN_PRINT("Version name in a resource, should be plaintext") } else { string_table[attr_value]=(orientation==0?"landscape":"portrait"); }*/ } if (tname=="uses-permission" && /*nspace=="android" &&*/ attrname=="name") { if (value.begins_with("godot.custom")) { int which = value.get_slice(".",2).to_int(); if (which>=0 && which<MAX_USER_PERMISSIONS && user_perms[which].strip_edges()!="") { string_table[attr_value]=user_perms[which].strip_edges(); } } else if (value.begins_with("godot.")) { String perm = value.get_slice(".",1); print_line("PERM: "+perm+" HAS: "+itos(perms.has(perm))); if (perms.has(perm) || (p_give_internet && perm=="INTERNET")) { string_table[attr_value]="android.permission."+perm; } } } if (tname=="supports-screens" ) { if (attrname=="smallScreens") { encode_uint32(screen_support[SCREEN_SMALL]?0xFFFFFFFF:0,&p_manifest[iofs+16]); } else if (attrname=="normalScreens") { encode_uint32(screen_support[SCREEN_NORMAL]?0xFFFFFFFF:0,&p_manifest[iofs+16]); } else if (attrname=="largeScreens") { encode_uint32(screen_support[SCREEN_LARGE]?0xFFFFFFFF:0,&p_manifest[iofs+16]); } else if (attrname=="xlargeScreens") { encode_uint32(screen_support[SCREEN_XLARGE]?0xFFFFFFFF:0,&p_manifest[iofs+16]); } } iofs+=20; } } break; } printf("chunk %x: size: %d\n",chunk,size); ofs+=size; }
bool GridMap::_set(const StringName &p_name, const Variant &p_value) { String name = p_name; if (name == "theme") { set_theme(p_value); } else if (name == "cell_size") { if (p_value.get_type() == Variant::INT || p_value.get_type() == Variant::REAL) { //compatibility float cs = p_value; set_cell_size(Vector3(cs, cs, cs)); } else { set_cell_size(p_value); } } else if (name == "cell_octant_size") { set_octant_size(p_value); } else if (name == "cell_center_x") { set_center_x(p_value); } else if (name == "cell_center_y") { set_center_y(p_value); } else if (name == "cell_center_z") { set_center_z(p_value); } else if (name == "cell_scale") { set_cell_scale(p_value); /* } else if (name=="cells") { PoolVector<int> cells = p_value; int amount=cells.size(); PoolVector<int>::Read r = cells.read(); ERR_FAIL_COND_V(amount&1,false); // not even cell_map.clear(); for(int i=0;i<amount/3;i++) { IndexKey ik; ik.key=decode_uint64(&r[i*3]); Cell cell; cell.cell=uint32_t(r[i*+1]); cell_map[ik]=cell; } _recreate_octant_data();*/ } else if (name == "data") { Dictionary d = p_value; if (d.has("cells")) { PoolVector<int> cells = d["cells"]; int amount = cells.size(); PoolVector<int>::Read r = cells.read(); ERR_FAIL_COND_V(amount % 3, false); // not even cell_map.clear(); for (int i = 0; i < amount / 3; i++) { IndexKey ik; ik.key = decode_uint64((const uint8_t *)&r[i * 3]); Cell cell; cell.cell = decode_uint32((const uint8_t *)&r[i * 3 + 2]); cell_map[ik] = cell; } } _recreate_octant_data(); } else return false; return true; }