DXBC_Reflect::DXBC_Reflect(const void *new_data, int new_size) { DXBC_Reader base_reader((const unsigned char *) new_data, new_size); DXBC_Reader dxbc_reader(base_reader); if (dxbc_reader.get_int32() != TAG_DXBC) throw Exception("Not DXBC format"); dxbc_reader.skip_bytes(4*4); // GUID int file_format_version = dxbc_reader.get_int32(); // Version int internal_total_size = dxbc_reader.get_int32(); if (internal_total_size != new_size) throw Exception("Invalid DXBC size"); int chunk_count = dxbc_reader.get_int32(); for (int cnt=0; cnt < chunk_count; cnt++) { int chunk_offset = dxbc_reader.get_int32(); DXBC_Reader chunk_reader(base_reader); chunk_reader.skip_bytes(chunk_offset); int chunk_tag = chunk_reader.get_int32(); int chunk_size = chunk_reader.get_int32(); // We ignore this if (chunk_tag == TAG_RDEF) { DXBC_Reader header_reader(chunk_reader); int constant_buffer_count = header_reader.get_int32(); int constant_buffer_offset = header_reader.get_int32(); int bound_resource_count = header_reader.get_int32(); int bound_resource_offset = header_reader.get_int32(); int target_shader_model = header_reader.get_int32(); // Shader model in low word int flags = header_reader.get_int32(); if (bound_resource_count) { DXBC_Reader bind_reader(chunk_reader); bind_reader.skip_bytes(bound_resource_offset); binding.reserve(bound_resource_count); for (int i=0; i < bound_resource_count; i++) { D3D11_SHADER_INPUT_BIND_DESC desc = {0}; desc.Name = chunk_reader.get_string(bind_reader.get_int32()); desc.Type = (D3D_SHADER_INPUT_TYPE) bind_reader.get_int32(); desc.ReturnType = (D3D_RESOURCE_RETURN_TYPE) bind_reader.get_int32(); desc.Dimension = (D3D_SRV_DIMENSION) bind_reader.get_int32(); desc.NumSamples = bind_reader.get_int32(); desc.BindPoint = bind_reader.get_int32(); desc.BindCount = bind_reader.get_int32(); desc.uFlags = bind_reader.get_int32(); binding.push_back(desc); } } } } }
HttpResponse::HttpResponse(const char* data) { const char *header_break = strstr(data, "\r\n\r\n"); int head_size = header_break - data, content_length = -1, line_number = 0; std::stringstream header_reader(std::string(data, head_size)); std::string line; while(std::getline(header_reader, line) && line != "\r") { if(line_number++ == 0) { const char *code_break = strchr(line.c_str(), ' '); char *end; std::string code = line.substr(code_break - line.c_str() + 1, 3); m_status = std::strtol(code.c_str(), &end, 10); continue; } int split = line.find(':', 0); if(split > line.size() - 2 || split == 0) continue; std::string key = line.substr(0, split), val = line.substr(split + 2); std::transform(key.begin(), key.end(), key.begin(), ::toupper); if(key == "CONTENT-LENGTH") content_length = std::stoi(val); m_headers.push_back(std::make_pair(key, val)); } for(int i = 0; i < content_length; i++) m_body.push_back(data[head_size + 4 + i]); m_body.push_back('\0'); }