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);
				}
			}
		}
	}
}
Пример #2
0
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');
}