Esempio n. 1
0
void OIBReader::ReadStream(POLE::Storage &pStg, wstring &stream_name)
{
	POLE::Stream pStm(&pStg,ws2s(stream_name));
	unsigned char *pbyData = 0;

	//open
	if (!pStm.eof() && !pStm.fail())
	{
		//get stream size
		size_t sz = pStm.size();
		//allocate 
		pbyData = new unsigned char[sz];
		if (!pbyData) return;
		//read
		if (pStm.read(pbyData,sz)) {
			//read oib info
			if (stream_name == wstring(L"OibInfo.txt")) {
				ReadOibInfo(pbyData, sz);
			} else {
				if (m_type==0 || (m_type==1 && m_oib_t==0))
					ReadOif(pbyData, sz);
			}
		}
	}

	//release
	if (pbyData)
		delete[] pbyData;
}
void OIFReader::Preprocess()
{
   m_type = 0;
   m_oif_info.clear();

   //separate path and name
   int64_t pos = m_path_name.find_last_of(GETSLASH());
   if (pos == -1)
      return;
   wstring path = m_path_name.substr(0, pos+1);
   wstring name = m_path_name.substr(pos+1);
   //extract time sequence string
   int64_t begin = name.find(m_time_id);
   size_t end = -1;
   size_t id_len = m_time_id.size();
   if (begin != -1)
   {
      wstring t_num;
      size_t j;
      for (j=begin+id_len; j<name.size(); j++)
      {
         wchar_t c = name[j];
         if (iswdigit(c))
            t_num.push_back(c);
         else break;
      }
      if (t_num.size() > 0)
         end = j;
      else
         begin = -1;
   }

   if (begin == -1)
   {
      ReadSingleOif();
   }
   else
   {
      //search time sequence files
      std::vector<std::wstring> list;
      int tmp = 0;
      FIND_FILES(path,L".oif",list,tmp,name.substr(0,begin+id_len+1));
      for(size_t i = 0; i < list.size(); i++) {
         size_t start_idx = list.at(i).find(m_time_id) + id_len;
         size_t end_idx   = list.at(i).find(L".oif");
         size_t size = end_idx - start_idx;
         std::wstring fileno = list.at(i).substr(start_idx, size);
         TimeDataInfo info;
         info.filenumber = WSTOI(fileno);
         info.filename = list.at(i);
         m_oif_info.push_back(info);
      }

      if (m_oif_info.size() > 0)
      {
         m_type = 1;
         std::sort(m_oif_info.begin(), m_oif_info.end(), OIFReader::oif_sort);
         ReadSequenceOif();
      }
      else
      {
         m_oif_info.clear();
         ReadSingleOif();
      }
   }

   ReadOif();

   m_time_num = int(m_oif_info.size());
   if (m_type == 0)
      m_cur_time = 0;
   m_chan_num = m_time_num>0?int(m_oif_info[0].dataset.size()):0;
   m_slice_num = m_chan_num>0?int(m_oif_info[0].dataset[0].size()):0;
}