void    CSHPeerDialog::UpdatePeerInfo(const list<NewSHPeerInfo>* peerList,int dispItemID)
{
	if(dispItemID != m_dispId)
		return;
	CString strText;
	int index = 0;
	list<NewSHPeerInfo>::const_iterator it;
	for (it = peerList->begin(); it != peerList->end(); it++,index++)
	{
		int subItem = 1;
		if(m_peerMager->GetItemCount() <= index)
		{
			strText.Format(_T("%d"),m_peerMager->GetItemCount()+1);
			m_peerMager->InsertItem(m_peerMager->GetItemCount(),strText);
		}
		//
		if(it->iscdn)
		{
			strText.Format(_T("%s"),_T("-:-:-"));
			//PeerID
			m_peerMager->SetItemText(index,subItem++,strText);
			//Key
			subItem++;
			//NAT类型
			m_peerMager->SetItemText(index,subItem++,strText);
		}
		else
		{
			//PeerID
			strText.Format(_T("%d"),it->peerId);
			m_peerMager->SetItemText(index,subItem++,strText);
			//Key
			strText.Format(_T("%d"),it->index_key);
			m_peerMager->SetItemText(index,subItem++,strText);
			//NAT类型
			strText.Format(_T("%s"),NatTypeDesc((SHNatType)it->nat).c_str());
			m_peerMager->SetItemText(index,subItem++,strText);
		}
		//可用IP
		m_peerMager->SetItemText(index,subItem++,GetIpStr(it->ip).c_str());
		//端口
		strText.Format(_T("%d"),ntohs(it->port));
		m_peerMager->SetItemText(index,subItem++,strText);

		//打洞耗时
		strText.Format(_T("%dms"),it->punch_time);
		m_peerMager->SetItemText(index,subItem++,strText);	
		
		CString strState;
		//状态
        if (it->status == SHPeerStatus_Fetching_Address)
        {
            strState = _T("取外网地址中");
        }
        else if (it->status == SHPeerStatus_Requsting)
        {
            strState = _T("正在请求文件");
        }
		else if(it->status == SHPeerStatus_Punching)
		{
			strState = _T("正在打洞");
		}
		else if(it->status == SHPeerStatus_PunchSucceed)
		{
			strState = _T("打洞成功");
		}
		else if(it->status == SHPeerStatus_PunchFailed)
		{
			strState = _T("打洞失败");
		}
		else if(it->status == SHPeerStatus_Connecting)
		{
			strState = _T("正在连接");
		}
		else if(it->status == SHPeerStatus_ConnectSucceed)
		{
			strState = _T("连接成功");
		}
		else if(it->status == SHPeerStatus_ConnectFailed)
		{
			strState = _T("连接失败");
		}
		else if(it->status == SHPeerStatus_Closed)
		{
			strState = _T("已关闭");
		}
		else if(it->status == SHPeerStatus_Pause)
		{
			strState = _T("暂停");
		}
		else if (it->status == SHPeerStatus_Unused)
		{
			strState = _T("未使用");
		}
		if(!m_isDownCompleted)
		{
			if(it->status == SHPeerStatus_ConnectSucceed)
			{
				//速度
				strText.Format(_T("%s/s"),GetSizeDesc(it->speed*1024).c_str());
				m_peerMager->SetItemText(index,subItem++,strText);
				//平均速度
				strText.Format(_T("%s/s"),GetSizeDesc(it->average_speed*1024).c_str());
				m_peerMager->SetItemText(index,subItem++,strText);
			}
			else
			{
				//速度
				strText.Format(_T("%s/s"),GetSizeDesc(0).c_str());
				m_peerMager->SetItemText(index,subItem++,strText);
				//平均速度
				strText.Format(_T("%s/s"),GetSizeDesc(0).c_str());
				m_peerMager->SetItemText(index,subItem++,strText);
			}
		}
		else
		{
			if(it->status == SHPeerStatus_ConnectSucceed)
			{
				strText.Format(_T("%s"),_T("-:-:-"));
				m_peerMager->SetItemText(index,subItem++,strText);
				//平均速度
				strText.Format(_T("%s/s"),GetSizeDesc(it->average_speed*1024).c_str());
				m_peerMager->SetItemText(index,subItem++,strText);
			}
			else
			{
				strText.Format(_T("%s"),_T("-:-:-"));
				m_peerMager->SetItemText(index,subItem++,strText);
				//平均速度
				strText.Format(_T("%s"),_T("-:-:-"));
				m_peerMager->SetItemText(index,subItem++,strText);
			}
		}
		
		//窗口大小
		strText.Format(_T("%d"),it->win_size);
		m_peerMager->SetItemText(index,subItem++,strText);	
		
		//平均RTTS
		strText.Format(_T("%d"),it->avg_rtt);
		m_peerMager->SetItemText(index,subItem++,strText);

		//lost率
		strText.Format(_T("%.2f%%"),it->lost_rate);
		m_peerMager->SetItemText(index,subItem++,strText);

		//平均send
		strText.Format(_T("%d"),it->avg_send_count);
		m_peerMager->SetItemText(index,subItem++,strText);

		//平均receive
		strText.Format(_T("%d"),it->avg_receive_count);
		m_peerMager->SetItemText(index,subItem++,strText);

		//平均timeout
		strText.Format(_T("%d"),it->avg_timeout_count);
		m_peerMager->SetItemText(index,subItem++,strText);

		//状态
		m_peerMager->SetItemText(index,subItem++,strState);	

	} 
}
void CSHDispDialog::DispInfo(const NewSHDispInfo& info)
{
	//计算可用Peer数量
	m_usablePeer = 0;
	m_allUsablePeer = 0;
	peer_list.clear();
	for(int i=0;i<info.peer_list_len;i++)
	{
		if(!info.peer_list[i].iscdn)
		{
			m_allUsablePeer++;
			if(info.peer_list[i].status == SHPeerStatus_ConnectSucceed)//连接成功
			{
				m_usablePeer++;
			}
		}
		peer_list.push_back(info.peer_list[i]);
	}

	CString strText;
	if(info.oper == 0)		//开始下载
	{
		int item = GetItemIndex(info.ID);
		if(item == -1)
		{
			DisStart(info);
		}
	}
	else if(info.oper == 1)	//更新显示速度
	{

		int item = GetItemIndex(info.ID);
		if(item == -1)
		{
			DisStart(info);
		}

		map<int, list<NewSHPeerInfo> >::iterator iter;
		m_peerInfoHandle[(int)info.ID] = peer_list;

		int subitem=5;
		
		strText.Format(_T("%d"),info.byterate);
		m_peerMager->SetItemText(item,subitem++,strText);

		switch(info.state_code)
		{
		case 1:
			m_peerMager->SetItemText(item,subitem++,_T("P2P"));
			break;
		case 2:
			m_peerMager->SetItemText(item,subitem++,_T("HTTP"));
			break;
		case 3:
			m_peerMager->SetItemText(item,subitem++,_T("HTTP|P2P"));
			break;
		case 4:
			m_peerMager->SetItemText(item,subitem++,_T("START"));
			break;
		case 5:
			m_peerMager->SetItemText(item,subitem++,_T("START|P2P"));
			break;
		case 6:
			m_peerMager->SetItemText(item,subitem++,_T("START|HTTP"));
			break;
		default:
			break;
		}

		strText.Format(_T("%s/s"),GetSizeDesc(info.speed*1024).c_str());
		m_peerMager->SetItemText(item,subitem++,strText);
		//
		strText.Format(_T("%s/s"),GetSizeDesc(info.average_speed*1024).c_str());
		m_peerMager->SetItemText(item,subitem++,strText);
		//
		strText.Format(_T("%.2f%%"),info.percent);
		m_peerMager->SetItemText(item,subitem++,strText);
		//
		strText.Format(_T("%d"),info.cdn_num);
		m_peerMager->SetItemText(item,subitem++,strText);

		strText.Format(_T("%d"),info.max_conn);
		m_peerMager->SetItemText(item,subitem++,strText);
		//
		strText.Format(_T("%d/%d"),m_usablePeer,m_allUsablePeer);
		m_peerMager->SetItemText(item,subitem++,strText);

		if(m_peerDlg != NULL && m_peerDlg->IsVisable())
		{
			m_peerDlg->SetDownState(false);
			m_peerDlg->UpdatePeerInfo(&peer_list,(int)info.ID);
		}
	}
	else					//下载完毕或出错
	{
		int item = GetItemIndex(info.ID);
		if(item == -1)
		{
			DisStart(info);
		}

		int subitem=7;

		//完成也要刷新下速度
		map<int, list<NewSHPeerInfo> >::iterator iter;
		m_peerInfoHandle[(int)info.ID] = peer_list;

		//ATLTRACE(_T("Stop item = %d,param = %d\r\n"),item,info.ID);
		m_peerMager->SetItemText(item,subitem++,_T("-:-:-"));
		//
		strText.Format(_T("%s/s"),GetSizeDesc(info.average_speed*1024).c_str());
		m_peerMager->SetItemText(item,subitem++,strText);

		if(info.state == 0)
		{
			m_peerMager->SetItemText(item,subitem++,_T("100%"));
		}
		else if(info.state == 1)
		{
			strText.Format(_T("%.2f%%"),info.percent);
			m_peerMager->SetItemText(item,subitem++,strText);	
		}
		else
		{
			strText.Format(_T("%.2f%%"),info.percent);
			m_peerMager->SetItemText(item,subitem++,strText);
		}

		strText.Format(_T("%d"),info.cdn_num);
		m_peerMager->SetItemText(item,subitem++,strText);
		
		subitem++;

		strText.Format(_T("%d/%d"),m_usablePeer,m_allUsablePeer);
		m_peerMager->SetItemText(item,subitem++,strText);

		subitem += 1;

		time_t ti(info.end_time);
		tm temptm = *localtime(&ti);
		SYSTEMTIME st = {1900 + temptm.tm_year, 
			1 + temptm.tm_mon, 
			temptm.tm_wday, 
			temptm.tm_mday, 
			temptm.tm_hour, 
			temptm.tm_min, 
			temptm.tm_sec, 
			0};
		strText.Format(_T("%02d-%02d %02d:%02d:%02d"),st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
		m_peerMager->SetItemText(item,subitem++,strText);

		if(info.state == 0)
		{
			m_peerMager->SetItemText(item,subitem++,_T("下载完成"));
		}
		else if(info.state == 1)
		{
			m_peerMager->SetItemText(item,subitem++,_T("结束会话"));
		}
		else
		{
			strText.Format(_T("下载出错 errorCode %d"),info.state);
			m_peerMager->SetItemText(item,subitem++,strText);
		}
		
		
		//耗时
		strText.Format(_T("%.2f"),(float)info.timespace/1000);
		m_peerMager->SetItemText(item,subitem++,strText);
		//上报数据

		strText.Format(_T("%d/%s"),info.report_len,GetSizeDesc(info.report_len).c_str());
		m_peerMager->SetItemText(item,subitem++,strText);
		//
		strText.Format(_T("%.2f%%"),info.p2p_percent);
		m_peerMager->SetItemText(item,subitem++,strText);
		//
		if(m_peerDlg != NULL && m_peerDlg->IsVisable() )
		{
			m_peerDlg->SetDownState(true);
			m_peerDlg->UpdatePeerInfo(&peer_list,(int)info.ID);
		}
	}
}
void CSHDispDialog::DisStart(const NewSHDispInfo& info)
{
	CString strText;
	if(m_peerMager->GetItemCount()>=100)
	{
		Clear();
	}
	strText.Format(_T("%d"),m_peerMager->GetItemCount()+1);
	int item	= m_peerMager->InsertItem(m_peerMager->GetItemCount(),strText);
	m_peerMager->SetSelectedItem(item);
	int subItem	= 1;
	CString filename(info.file_name);
	m_peerMager->SetItemText(item,subItem++,filename);
	//
	strText.Format(_T("%d"),info.num);
	m_peerMager->SetItemText(item,subItem++,strText);
	
	m_peerMager->SetItemText(item,subItem++,GetSizeDesc(info.size).c_str());
	
	strText.Format(_T("%ds"),info.duration);
	m_peerMager->SetItemText(item,subItem++,strText);

	subItem += 5;
	//
	strText.Format(_T("%d"),info.cdn_num);
	m_peerMager->SetItemText(item,subItem++,strText);
	
	subItem++;

	strText.Format(_T("%d/%d"),m_usablePeer,m_allUsablePeer);
	m_peerMager->SetItemText(item,subItem++,strText);

	time_t ti(info.start_time);
	tm temptm = *localtime(&ti);
	SYSTEMTIME st = {1900 + temptm.tm_year, 
		1 + temptm.tm_mon, 
		temptm.tm_wday, 
		temptm.tm_mday, 
		temptm.tm_hour, 
		temptm.tm_min, 
		temptm.tm_sec, 
		0};
	strText.Format(_T("%02d-%02d %02d:%02d:%02d"),st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
	m_peerMager->SetItemText(item,subItem++,strText);
	
	strText.Format(_T("-:-:-"));
	m_peerMager->SetItemText(item,subItem++,strText);
	
	m_peerMager->SetItemText(item,subItem++,_T("正在下载"));
	m_peerMager->SetItemData(item,info.ID);
	
	subItem += 3;

	if(info.type == 0)
	{
		m_peerMager->SetItemText(item,subItem++,_T("完整"));
	}
	else if(info.type == 1)
	{
		m_peerMager->SetItemText(item,subItem++,_T("拖拽"));
	}
	
	strText.Format(_T("%d"),info.play_start);
	m_peerMager->SetItemText(item,subItem++,strText);
	
	m_peerInfoHandle.insert(std::make_pair(info.ID,peer_list));

	if(IsVisable())
	{
		m_peerMager->EnsureVisible(m_peerMager->GetItemCount()-1,FALSE);
	}
	if(m_peerDlg != NULL && m_peerDlg->IsVisable() )
	{
		CString peerDlgText = _T("");
		peerDlgText.Format(_T("文件:%s 段号:%d"),info.file_name,info.num);
		m_peerDlg->SetCaptionName(peerDlgText.GetBuffer());
		m_peerDlg->Clear();
		m_peerDlg->SetDownState(false);
		m_peerDlg->SetDispItemID((int)info.ID);
		m_peerDlg->UpdatePeerInfo(&peer_list,(int)info.ID);
	}
}
Beispiel #4
0
void PrintImageInfo(const char* file_name)
{
  printf("IM Info\n");
  printf("  File Name:\n    %s\n", file_name);

  int error;
  imFile* ifile = imFileOpen(file_name, &error);
  if (!ifile) 
  {
    PrintError(error);
    return;
  }

  double file_size = FileSize(file_name);
  printf("  File Size: %.2f %s\n", file_size, GetSizeDesc(&file_size));

  char format[10];
  char compression[20];
  int image_count;
  imFileGetInfo(ifile, format, compression, &image_count);

  char format_desc[50];
  imFormatInfo(format, format_desc, NULL, NULL);
  printf("  Format: %s - %s\n", format, format_desc);
  printf("  Compression: %s\n", compression);
  printf("  Image Count: %d\n", image_count);
  
  for (int i = 0; i < image_count; i++)
  {
    int width, height, color_mode, data_type;

    error = imFileReadImageInfo(ifile, i, &width, &height, &color_mode, &data_type);
    if (error != IM_ERR_NONE)
    {
      PrintError(error);
      imFileClose(ifile);  
      return;
    }

    printf("  Image #%d\n", i);
    printf("    Width: %d\n", width);
    printf("    Height: %d\n", height);
    printf("    Color Space: %s\n", imColorModeSpaceName(color_mode));
    printf("      Has Alpha: %s\n", imColorModeHasAlpha(color_mode)? "Yes": "No");
    printf("      Is Packed: %s\n", imColorModeIsPacked(color_mode)? "Yes": "No");
    printf("      Is Top Down: %s\n", imColorModeIsTopDown(color_mode)? "Yes": "No");
    printf("    Data Type: %s\n", imDataTypeName(data_type));

    double image_size = imImageDataSize(width, height, color_mode, data_type);
    printf("    Data Size: %.2f %s\n", image_size, GetSizeDesc(&image_size));

    char* attrib_list[50];  // should be dynamic allocated
    int attrib_list_count;
    imFileGetAttributeList(ifile, attrib_list, &attrib_list_count);

    for (int a = 0; a < attrib_list_count; a++)
    {
      if (a == 0)
        printf("    Attributes:\n");

      int attrib_data_type, attrib_count;
      const void* attrib_data = imFileGetAttribute(ifile, attrib_list[a], &attrib_data_type, &attrib_count);

      if (attrib_count == 1)
        printf("      %s: %s\n", attrib_list[a], AttribData2Str(attrib_data, attrib_data_type));
      else if (attrib_data_type == IM_BYTE && FindZero((imbyte*)attrib_data, attrib_count))
        printf("      %s: %s\n", attrib_list[a], attrib_data);
      else
        printf("      %s: %s %s ...\n", attrib_list[a], AttribData2Str(attrib_data, attrib_data_type), AttribData2Str((imbyte*)attrib_data + imDataTypeSize(attrib_data_type), attrib_data_type));
    }
  }
    
  imFileClose(ifile);  
}