String FileAccess::get_pascal_string() { uint32_t sl = get_32(); CharString cs; cs.resize(sl + 1); get_buffer((uint8_t *)cs.ptr(), sl); cs[sl] = 0; String ret; ret.parse_utf8(cs.ptr()); return ret; };
Error FileAccessNetwork::_open(const String& p_path, int p_mode_flags) { ERR_FAIL_COND_V(p_mode_flags!=READ,ERR_UNAVAILABLE); if (opened) close(); FileAccessNetworkClient *nc = FileAccessNetworkClient::singleton; DEBUG_PRINT("open: "+p_path); DEBUG_TIME("open_begin"); nc->lock_mutex(); nc->put_32(id); nc->accesses[id]=this; nc->put_32(COMMAND_OPEN_FILE); CharString cs =p_path.utf8(); nc->put_32(cs.length()); nc->client->put_data((const uint8_t*)cs.ptr(),cs.length()); pos=0; eof_flag=false; last_page=-1; last_page_buff=NULL; // buffers.clear(); nc->unlock_mutex(); DEBUG_PRINT("OPEN POST"); DEBUG_TIME("open_post"); nc->sem->post(); //awaiting answer DEBUG_PRINT("WAIT..."); sem->wait(); DEBUG_TIME("open_end"); DEBUG_PRINT("WAIT ENDED..."); return response; }
Error HTTPClient::request(Method p_method, const String &p_url, const Vector<String> &p_headers, const String &p_body) { ERR_FAIL_INDEX_V(p_method, METHOD_MAX, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(!p_url.begins_with("/"), ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(status != STATUS_CONNECTED, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(connection.is_null(), ERR_INVALID_DATA); String request = String(_methods[p_method]) + " " + p_url + " HTTP/1.1\r\n"; if ((ssl && conn_port == PORT_HTTPS) || (!ssl && conn_port == PORT_HTTP)) { // Don't append the standard ports request += "Host: " + conn_host + "\r\n"; } else { request += "Host: " + conn_host + ":" + itos(conn_port) + "\r\n"; } bool add_uagent = true; bool add_accept = true; bool add_clen = p_body.length() > 0; for (int i = 0; i < p_headers.size(); i++) { request += p_headers[i] + "\r\n"; if (add_clen && p_headers[i].findn("Content-Length:") == 0) { add_clen = false; } if (add_uagent && p_headers[i].findn("User-Agent:") == 0) { add_uagent = false; } if (add_accept && p_headers[i].findn("Accept:") == 0) { add_accept = false; } } if (add_clen) { request += "Content-Length: " + itos(p_body.utf8().length()) + "\r\n"; // Should it add utf8 encoding? } if (add_uagent) { request += "User-Agent: GodotEngine/" + String(VERSION_FULL_BUILD) + " (" + OS::get_singleton()->get_name() + ")\r\n"; } if (add_accept) { request += "Accept: */*\r\n"; } request += "\r\n"; request += p_body; CharString cs = request.utf8(); Error err = connection->put_data((const uint8_t *)cs.ptr(), cs.length()); if (err) { close(); status = STATUS_CONNECTION_ERROR; return err; } status = STATUS_REQUESTING; return OK; }
static void store_file_buffer(FileAccess*f,const String& p_path,const Vector<uint8_t>& p_data) { String pre = "Module['FS_createDataFile']('/', '"+p_path.replace("res://","")+"',["; CharString cs = pre.utf8(); f->store_buffer((const uint8_t*)cs.ptr(),cs.length()); for(int i=0; i<p_data.size(); i++) { uint8_t c=','; if (i>0) f->store_buffer(&c,1); uint8_t str[4]; uint8_t d = p_data[i]; if (d<10) { str[0]='0'+d; str[1]=0; f->store_buffer(str,1); } else if (d<100) { str[0]='0'+d/10; str[1]='0'+d%10; str[2]=0; f->store_buffer(str,2); } else { str[0]='0'+d/100; str[1]='0'+(d/10)%10; str[2]='0'+d%10; str[3]=0; f->store_buffer(str,3); } } String post = "],true,true);\n"; cs = post.utf8(); f->store_buffer((const uint8_t*)cs.ptr(),cs.length()); }
Error HTTPClient::request(Method p_method, const String &p_url, const Vector<String> &p_headers, const String &p_body) { ERR_FAIL_INDEX_V(p_method, METHOD_MAX, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(status != STATUS_CONNECTED, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(connection.is_null(), ERR_INVALID_DATA); static const char *_methods[METHOD_MAX] = { "GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS", "TRACE", "CONNECT" }; String request = String(_methods[p_method]) + " " + p_url + " HTTP/1.1\r\n"; if ((ssl && conn_port == 443) || (!ssl && conn_port == 80)) { // don't append the standard ports request += "Host: " + conn_host + "\r\n"; } else { request += "Host: " + conn_host + ":" + itos(conn_port) + "\r\n"; } bool add_clen = p_body.length() > 0; for (int i = 0; i < p_headers.size(); i++) { request += p_headers[i] + "\r\n"; if (add_clen && p_headers[i].find("Content-Length:") == 0) { add_clen = false; } } if (add_clen) { request += "Content-Length: " + itos(p_body.utf8().length()) + "\r\n"; //should it add utf8 encoding? not sure } request += "\r\n"; request += p_body; CharString cs = request.utf8(); Error err = connection->put_data((const uint8_t *)cs.ptr(), cs.length()); if (err) { close(); status = STATUS_CONNECTION_ERROR; return err; } status = STATUS_REQUESTING; return OK; }
uint64_t FileAccessNetwork::_get_modified_time(const String &p_file) { FileAccessNetworkClient *nc = FileAccessNetworkClient::singleton; nc->lock_mutex(); nc->put_32(id); nc->put_32(COMMAND_GET_MODTIME); CharString cs = p_file.utf8(); nc->put_32(cs.length()); nc->client->put_data((const uint8_t *)cs.ptr(), cs.length()); nc->unlock_mutex(); DEBUG_PRINT("MODTIME POST"); nc->sem->post(); sem->wait(); return exists_modtime; }
bool FileAccessNetwork::file_exists(const String &p_path) { FileAccessNetworkClient *nc = FileAccessNetworkClient::singleton; nc->lock_mutex(); nc->put_32(id); nc->put_32(COMMAND_FILE_EXISTS); CharString cs = p_path.utf8(); nc->put_32(cs.length()); nc->client->put_data((const uint8_t *)cs.ptr(), cs.length()); nc->unlock_mutex(); DEBUG_PRINT("FILE EXISTS POST"); nc->sem->post(); sem->wait(); return exists_modtime != 0; }
Error FileAccessNetworkClient::connect(const String& p_host,int p_port,const String& p_password) { IP_Address ip; if (p_host.is_valid_ip_address()) { ip=p_host; } else { ip=IP::get_singleton()->resolve_hostname(p_host); } DEBUG_PRINT("IP: "+String(ip)+" port "+itos(p_port)); Error err = client->connect(ip,p_port); ERR_FAIL_COND_V(err,err); while(client->get_status()==StreamPeerTCP::STATUS_CONNECTING) { //DEBUG_PRINT("trying to connect...."); OS::get_singleton()->delay_usec(1000); } if (client->get_status()!=StreamPeerTCP::STATUS_CONNECTED) { return ERR_CANT_CONNECT; } CharString cs = p_password.utf8(); put_32(cs.length()); client->put_data((const uint8_t*)cs.ptr(),cs.length()); int e = get_32(); if (e!=OK) { return ERR_INVALID_PARAMETER; } thread = Thread::create(_thread_func,this); return OK; }
StringName PHashTranslation::get_message(const StringName& p_src_text) const { int htsize = hash_table.size(); if (htsize==0) return StringName(); CharString str = p_src_text.operator String().utf8(); uint32_t h = hash(0,str.get_data()); DVector<int>::Read htr = hash_table.read(); const uint32_t *htptr = (const uint32_t*)&htr[0]; DVector<int>::Read btr = bucket_table.read(); const uint32_t *btptr = (const uint32_t*)&btr[0]; DVector<uint8_t>::Read sr = strings.read(); const char *sptr= (const char*)&sr[0]; uint32_t p = htptr[ h % htsize]; //print_line("String: "+p_src_text.operator String()); //print_line("Hash: "+itos(p)); if (p==0xFFFFFFFF) { // print_line("GETMSG: Nothing!"); return StringName(); //nothing } const Bucket &bucket = *(const Bucket*)&btptr[p]; h = hash(bucket.func,str.get_data()); int idx=-1; for(int i=0;i<bucket.size;i++) { if (bucket.elem[i].key==h) { idx=i; break; } } //print_line("bucket pos: "+itos(idx)); if (idx==-1) { // print_line("GETMSG: Not in Bucket!"); return StringName(); } if (bucket.elem[idx].comp_size == bucket.elem[idx].uncomp_size) { String rstr; rstr.parse_utf8(&sptr[ bucket.elem[idx].str_offset ], bucket.elem[idx].uncomp_size ); // print_line("Uncompressed, size: "+itos(bucket.elem[idx].comp_size)); // print_line("Return: "+rstr); return rstr; } else { CharString uncomp; uncomp.resize( bucket.elem[idx].uncomp_size+1 ); smaz_decompress(&sptr[ bucket.elem[idx].str_offset ], bucket.elem[idx].comp_size,uncomp.ptr(),bucket.elem[idx].uncomp_size ); String rstr; rstr.parse_utf8(uncomp.get_data()); // print_line("Compressed, size: "+itos(bucket.elem[idx].comp_size)); // print_line("Return: "+rstr); return rstr; } }
bool PackedSourcePCK::try_open_pack(const String& p_path) { FileAccess *f = FileAccess::open(p_path,FileAccess::READ); if (!f) return false; uint32_t magic= f->get_32(); if (magic != 0x4b435047) { //maybe at he end.... self contained exe f->seek_end(); f->seek( f->get_pos() -4 ); magic = f->get_32(); if (magic != 0x4b435047) { memdelete(f); return false; } f->seek( f->get_pos() -12 ); uint64_t ds = f->get_64(); f->seek( f->get_pos() -ds-8 ); magic = f->get_32(); if (magic != 0x4b435047) { memdelete(f); return false; } } uint32_t ver_major = f->get_32(); uint32_t ver_minor = f->get_32(); uint32_t ver_rev = f->get_32(); ERR_EXPLAIN("Pack created with a newer version of the engine: "+itos(ver_major)+"."+itos(ver_minor)+"."+itos(ver_rev)); ERR_FAIL_COND_V( ver_major > VERSION_MAJOR || (ver_major == VERSION_MAJOR && ver_minor > VERSION_MINOR), ERR_INVALID_DATA); for(int i=0;i<16;i++) { //reserved f->get_32(); } int file_count = f->get_32(); for(int i=0;i<file_count;i++) { uint32_t sl = f->get_32(); CharString cs; cs.resize(sl+1); f->get_buffer((uint8_t*)cs.ptr(),sl); cs[sl]=0; String path; path.parse_utf8(cs.ptr()); uint64_t ofs = f->get_64(); uint64_t size = f->get_64(); uint8_t md5[16]; f->get_buffer(md5,16); PackedData::get_singleton()->add_path(p_path, path, ofs, size, md5,this); }; return true; };