コード例 #1
0
ファイル: O2Boards.cpp プロジェクト: Hiroyuki-Nagata/o2on
// ---------------------------------------------------------------------------
//	SaveEx()
//	独自の情報を別ファイルに保存
// ---------------------------------------------------------------------------
bool
O2Boards::
SaveEx(void)
{
	wstring xml;
	xml += L"<?xml version=\"1.0\" encoding=\"";
	xml += _T(DEFAULT_XML_CHARSET);
	xml += L"\"?>" EOL;
	xml += L"<boards>" EOL;

	ExLock.Lock();
	{
		for (O2BoardExMapIt it = exmap.begin(); it != exmap.end(); it++) {
			xml += L"<board>" EOL;
			xml_AddElement(xml, L"name",	NULL, it->first.c_str());
			xml_AddElement(xml, L"enable",	NULL, it->second->enable ? L"1" : L"0");
			xml += L"</board>" EOL;
		}
	}
	ExLock.Unlock();
	xml += L"</boards>" EOL;

	string out;
	FromUnicode(_T(DEFAULT_XML_CHARSET), xml, out);
/*
	FILE *fp;
	if (_wfopen_s(&fp, exfilepath.c_str(), L"wb") != 0)
		return false;
	fwrite(&out[0], 1, out.size(), fp);
	fclose(fp);
*/
	File f;
	if (!f.open(exfilepath.c_str(), MODE_W))
		return false;
	f.write((void*)&out[0], out.size());
	f.close();

	return true;
}
コード例 #2
0
ファイル: xmle.c プロジェクト: ctyinsz/Application_Server
/******************************************************************************
功能:倒入子xml树内容数据到指定节点,如果该节点不存在则增加
参数:  HXMLTREE hXML   XML句柄
      const char *szImportXML,
      const char *szImportName,
      int bReplace 返回值:>=0  取到值,并放入缓冲的长度
功能:
        成功    返回SUCC
        失败    返回FAIL
*******************************************************************************/
int xml_ImportXMLStringE( HXMLTREE hXML,
      const char *szImportXML,
      const char *szImportName)
{
char sPath[MAX_NAMEPATH];
int icount;
    if((icount=xml_ElementCount(hXML,szImportName)) == FAIL)
      return FAIL;
    sprintf(sPath,"%s|%d",szImportName,icount+1);
    /*  不存在目的节点  */
    if(xml_AddElement(hXML,sPath,"") == FAIL)
      return FAIL;
    if(xml_ImportXMLString(hXML,szImportXML,sPath,0) == FAIL)
      return FAIL;
    return SUCC;
}
コード例 #3
0
ファイル: O2Boards.cpp プロジェクト: Hiroyuki-Nagata/o2on
// ---------------------------------------------------------------------------
//	ExportToXML()
//	
// ---------------------------------------------------------------------------
void
O2Boards::
ExportToXML(string &out)
{
	wstring xml;
	xml += L"<?xml version=\"1.0\" encoding=\"";
	xml += _T(DEFAULT_XML_CHARSET);
	xml += L"\"?>" EOL;
	xml += L"<boards>" EOL;
	ExLock.Lock();
	{
		for (O2BoardExMapIt it = exmap.begin(); it != exmap.end(); it++) {
			xml_AddElement(xml, L"board", NULL, it->first.c_str());
		}
	}
	ExLock.Unlock();
	xml += L"</boards>" EOL;
	unicode2ascii(xml, out);
}
コード例 #4
0
ファイル: xmle.c プロジェクト: ctyinsz/Application_Server
/******************************************************************************
函数:xml_SetElemntE
功能:对XML数据访问封装,根据路径设置节点或属性值
参数:
*      功能:    在XML树中设置一个叶子节点或某一节点上的属性
                叶子节点(数据节点)可以重复存在
                如果该节点不存在, 添加该节点;
                        如果路径节点不存在, 则连同这些节点一起添加
                如果该节点已存在, 修改该节点数据;
 *      参数:
        hXML
                指定XML设备句柄
        szElementName
              节点路径表示:

                指定在XML结构要获取的元素的名称,形如"/PRIVATE|2/电费单价|0"
                "/NAME1|IDX1/NAME2|IDX2/.../NAMEn|IDXn"
                NMAE    指定每一层元素名,
                IDX             指定每一层元素在同名兄弟元素中的排序位置。
                        如果iIndex为0,表示取最后一个元素,
                        如果为1,2,3……,表示取相应编号的元素。
                        缺省为1
              属性路径表示:
                先由节点指定规则指定在XML结构中的节点。
                在通过@符号指定节点的属性。
                形如"/PRIVATE|2/电费单价@单位
                "/PRIVATE|2/电费单价"指定节点路径,"@单位"指定节点属性。
        szElementValue
                待设置的元素值指针
                节点分为数据节点和属性节点

返回值:
        成功    返回SUCC
        失败    返回FAIL
*****************************************************************************/
int xml_SetElementE( HXMLTREE hXML,
                   const char *szElementName,
                   const char *szElementValue )
{
char *ptmp;
char stmp[MAX_NAMEPATH];
    memset(stmp,0,sizeof(stmp));
    if((ptmp=strchr(szElementName,'@'))!=NULL)
    {
        memcpy(stmp,szElementName,ptmp-szElementName);
        /*  目的节点不存在 */
        if(xml_ElementExist(hXML,stmp )==0)
        {
            if(xml_AddElement(hXML,stmp,"") == FAIL)
              return FAIL;
        }
        return xml_SetElementAttr( hXML,stmp,ptmp+1, \
                          szElementValue);
    }
    else return xml_SetElement(hXML,szElementName,szElementValue);
}
コード例 #5
0
ファイル: O2ReportMaker.cpp プロジェクト: a-fujisaki/o2on
void
O2ReportMaker::
GetReport(string &out, bool pub)
{
	double ptime;
	double ptimeavg;
	int handle_c;
	int thread_c;
	PerformanceCounter->GetValue(ptime, ptimeavg, handle_c, thread_c);

	long tzoffset;
	_get_timezone(&tzoffset);

	// start time
	time_t starttime = PerformanceCounter->GetStartTime();
	wchar_t starttime_str[32];
	if (starttime != 0) {
		time_t t = starttime - tzoffset;
		struct tm tm;
		gmtime_s(&tm, &t);
		wcsftime(starttime_str, 32, L"%Y/%m/%d %H:%M:%S", &tm);
	}
	else
		wcscpy_s(starttime_str, 32, L"-");

	// uptime
	uint64 uptime = PerformanceCounter->GetUptime();
	wchar_t uptime_str[32];
	if (uptime != 0) {
		swprintf_s(uptime_str, 32, L"%I64dd %02I64d:%02I64d:%02I64d",
			uptime/86400, (uptime%86400)/3600, (uptime%3600)/60, uptime%60);
	}
	else
		wcscpy_s(uptime_str, 32, L"-");

	// uptime (累計)
	uint64 total_uptime = PerformanceCounter->GetTotalUptime() + uptime;
	wchar_t total_uptime_str[32];
	swprintf_s(total_uptime_str, 32, L"%I64dd %02I64d:%02I64d:%02I64d",
		total_uptime/86400, (total_uptime%86400)/3600, (total_uptime%3600)/60, total_uptime%60);

	wchar_t ptime_str[32];
	swprintf_s(ptime_str, 32, L"%.1f%% (%.1f%%)", ptime, ptimeavg);

	// 送受信バイト数 (現在のセッション)
	uint64 total_u = Server_P2P->GetSendByte()
		+ Client->GetSendByte();
	uint64 total_d = Server_P2P->GetRecvByte()
		+ Client->GetRecvByte();
	wchar_t traffic_u[32];
	swprintf_s(traffic_u, 32, L"%.1f(%.1f)",
		(uptime == 0 ? 0 : (double)total_u/1024/uptime),
		(uptime == 0 ? 0 : (double)total_u/uptime*8));
	wchar_t traffic_d[32];
	swprintf_s(traffic_d, 32, L"%.1f(%.1f)",
		(uptime == 0 ? 0 : (double)total_d/1024/uptime),
		(uptime == 0 ? 0 : (double)total_d/uptime*8));
	wchar_t traffic_ud[32];
	swprintf_s(traffic_ud, 32, L"%.1f(%.1f)",
		(uptime == 0 ? 0 : (double)(total_u+total_d)/1024/uptime),
		(uptime == 0 ? 0 : (double)(total_u+total_d)/uptime*8));

	// 送受信バイト数 (累計)
	uint64 accum_total_u =
		PerformanceCounter->GetTotalSend() + total_u;
	uint64 accum_total_d =
		PerformanceCounter->GetTotalRecv() + total_d;
	wchar_t a_traffic_u[32];
	swprintf_s(a_traffic_u, 32, L"%.1f(%.1f)",
		(total_uptime == 0 ? 0 : (double)accum_total_u/1024/total_uptime),
		(total_uptime == 0 ? 0 : (double)accum_total_u/total_uptime*8));
	wchar_t a_traffic_d[32];
	swprintf_s(a_traffic_d, 32, L"%.1f(%.1f)",
		(total_uptime == 0 ? 0 : (double)accum_total_d/1024/total_uptime),
		(total_uptime == 0 ? 0 : (double)accum_total_d/total_uptime*8));
	wchar_t a_traffic_ud[32];
	swprintf_s(a_traffic_ud, 32, L"%.1f(%.1f)",
		(total_uptime == 0 ? 0 : (double)(accum_total_u+accum_total_d)/1024/total_uptime),
		(total_uptime == 0 ? 0 : (double)(accum_total_u+accum_total_d)/total_uptime*8));

	//dat数、サイズ
	uint64 datnum = 0;
	uint64 datsize = 0;
	uint64 pubnum = 0;
	DatDB->select_report(PUBLISH_ORIGINAL_TT, datnum, datsize, pubnum);
	
	//publish率
	wchar_t publishper[32];
	if (datnum == 0)
		wcscpy_s(publishper, 32, L"0.0%");
	else {
		swprintf(publishper, 32, L"%.1f%% (%I64u)", (double)pubnum/datnum*100.0, pubnum);
	}

	wstring tmpstr;
	wstring xml;
	xml += L"<?xml version=\"1.0\" encoding=\"";
	xml += _T(DEFAULT_XML_CHARSET);
	xml += L"\"?>"EOL;
	if (pub) xml += L"<?xml-stylesheet type=\"text/xsl\" href=\"/profile.xsl\"?>";
	xml += L"<report>"EOL;

	//
	//	名前、コメント、閲覧履歴
	//
	if (pub)
	{
		makeCDATA(Profile->GetNodeNameW(), tmpstr);
		xml += L"<name>";
		xml += tmpstr;
		xml += L"</name>"EOL;
		xml += L"<category>"EOL;
		xml += L"<table>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"ID");
		hashT hash;
		Profile->GetID(hash);
		wstring hashstr;
		hash.to_string(hashstr);
		xml_AddElement(xml, L"td", L"class=\"L\"", hashstr.c_str());
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"コメント");
		makeCDATA(Profile->GetComment(), tmpstr);
		xml += L" <pre>";
		xml += tmpstr;
		xml += L"</pre>"EOL;
		xml += L"</tr>"EOL;
		//
		if (Profile->IsPublicRecentDat()) {
			xml += L"<tr>"EOL;
			xml_AddElement(xml, L"td", L"type=\"h\"", L"閲覧履歴");
			xml += L"<pre>";
			O2KeyList recent;
			Server_Proxy->GetRecentDatList(recent);
			tmpstr.erase();
			for (O2KeyListIt it = recent.begin(); it != recent.end(); it++) {
				wchar_t timestr[TIMESTR_BUFF_SIZE];
				struct tm tm;
				localtime_s(&tm, &it->date);
				wcsftime(timestr, TIMESTR_BUFF_SIZE, L"%Y/%m/%d %H:%M:%S", &tm);
				tmpstr += timestr;
				tmpstr += L" [ ";
				tmpstr += it->url;
				tmpstr += L" ] ";
				tmpstr += it->title;
				tmpstr += L"\r\n";
			}
			makeCDATA(tmpstr, tmpstr);
			xml += tmpstr;
			xml += L"</pre>"EOL;
			xml += L"</tr>"EOL;
		}
		xml += L"</table>"EOL;
		xml += L"</category>"EOL;
	}

	//
	//	概要
	//
	if (!pub || Profile->IsPublicReport())
	{
		xml += L"<category>"EOL;
		xml_AddElement(xml, L"caption", NULL, L"概要");
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"状態");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"CPU(平均)");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"ハンドル");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"スレッド");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"総dat数");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"総datサイズ");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"publish率");
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		if (PerformanceCounter->IsActive())
			xml_AddElement(xml, L"td", L"class=\"active\"", L"稼動中");
		else
			xml_AddElement(xml, L"td", L"class=\"deactive\"", L"停止中");
		xml_AddElement(xml, L"td", L"class=\"C\"", ptime_str);
		xml_AddElement(xml, L"td", L"class=\"N\"", handle_c);
		xml_AddElement(xml, L"td", L"class=\"N\"", thread_c);
		xml_AddElement(xml, L"td", L"class=\"N\"", datnum);
		xml_AddElement(xml, L"td", L"class=\"N\"", datsize);
		xml_AddElement(xml, L"td", L"class=\"R\"", publishper);
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		//
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"起動日時");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"グローバルIP");
		xml_AddElement(xml, L"td", (Server_P2P->IsActive()   ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"P2P");
		xml_AddElement(xml, L"td", (Server_Proxy->IsActive() ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"Proxy");
		xml_AddElement(xml, L"td", (Server_Admin->IsActive() ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"Admin");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Ver");
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		wstring ipstr;
		ulong2ipstr(Profile->GetIP(), ipstr);
		xml_AddElement(xml, L"td", L"class=\"C\"", starttime_str);
		xml_AddElement(xml, L"td", L"class=\"C\"", ipstr.c_str());
		xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetP2PPort());
		xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetProxyPort());
		xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetAdminPort());
		xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetUserAgentW());
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		//
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"稼働時間");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"上り");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"下り");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"合計");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"上りKB/s(bps)");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"下りKB/s(bps)");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"合計KB/s(bps)");
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"今回");
		xml_AddElement(xml, L"td", L"class=\"C\"", uptime_str);
		xml_AddElement(xml, L"td", L"class=\"N\"", total_u);
		xml_AddElement(xml, L"td", L"class=\"N\"", total_d);
		xml_AddElement(xml, L"td", L"class=\"N\"", total_u+total_d);
		xml_AddElement(xml, L"td", L"", L"");
		xml_AddElement(xml, L"td", L"class=\"R\"", traffic_u);
		xml_AddElement(xml, L"td", L"class=\"R\"", traffic_d);
		xml_AddElement(xml, L"td", L"class=\"R\"", traffic_ud);
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"累計");
		xml_AddElement(xml, L"td", L"class=\"C\"", total_uptime_str);
		xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_u);
		xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_d);
		xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_u+accum_total_d);
		xml_AddElement(xml, L"td", L"", L"");
		xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_u);
		xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_d);
		xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_ud);
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"</category>"EOL;
		//
		//	DB
		//
		xml += L"<category>"EOL;
		xml_AddElement(xml, L"caption", NULL, L"DB");
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Node");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Friend");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Key");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"SakuKey");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Query");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Saku");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"IM");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Broadcast");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"BCQueue");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Logger");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"IPFilter");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"DatRequest");
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"保持数");
		xml_AddElement(xml, L"td", L"class=\"N\"", NodeDB->count());
		xml_AddElement(xml, L"td", L"class=\"N\"", FriendDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", KeyDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", SakuKeyDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", QueryDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", SakuDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", IMDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", BroadcastDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", Job_Broadcast->GetQueueCount());
		xml_AddElement(xml, L"td", L"class=\"N\"", Logger->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", IPFilter_P2P->Count()+IPFilter_Proxy->Count()+IPFilter_Admin->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", Job_QueryDat->GetRequestQueueCount());
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"</category>"EOL;
		//
		//	Server
		//
		xml += L"<category>"EOL;
		xml_AddElement(xml, L"caption", NULL, L"Server");
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"dat");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"collection");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"im");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"broadcast");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"profile");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"ping");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"store");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"findnode");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"findvalue");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"ERROR");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"?");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"計");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Proxy");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Admin");
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"接続回数");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("dat"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("collection"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("im"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("broadcast"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("profile"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("ping"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("store"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("findnode"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("findvalue"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("ERROR"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("?"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath(NULL));
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetTotalSessionCount());
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetTotalSessionCount());
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"up");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("dat"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("collection"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("im"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("broadcast"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("profile"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ping"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("store"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findnode"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findvalue"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ERROR"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("?"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath(NULL));
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetSendByte());
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetSendByte());
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"down");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("dat"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("collection"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("im"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("broadcast"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("profile"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("ping"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("store"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("findnode"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("findvalue"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("ERROR"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("?"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath(NULL));
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetRecvByte());
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetRecvByte());
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"up + down");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("dat")			+ Server_P2P->GetRecvByteByPath("dat"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("collection")	+ Server_P2P->GetRecvByteByPath("collection"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("im")			+ Server_P2P->GetRecvByteByPath("im"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("broadcast")	+ Server_P2P->GetRecvByteByPath("broadcast"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("profile")		+ Server_P2P->GetRecvByteByPath("profile"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ping")		+ Server_P2P->GetRecvByteByPath("ping"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("store")		+ Server_P2P->GetRecvByteByPath("store"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findnode")	+ Server_P2P->GetRecvByteByPath("findnode"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findvalue")	+ Server_P2P->GetRecvByteByPath("findvalue"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ERROR")		+ Server_P2P->GetRecvByteByPath("ERROR"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("UNKNOWN")		+ Server_P2P->GetRecvByteByPath("UNKNOWN"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath(NULL)			+ Server_P2P->GetRecvByteByPath(NULL));
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetSendByte() + Server_Proxy->GetRecvByte());
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetRecvByte() + Server_Admin->GetRecvByte());
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"同時接続数ピーク");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionPeak());
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"</category>"EOL;
		//
		//	Agent
		//
		xml += L"<category>"EOL;
		xml_AddElement(xml, L"caption", NULL, L"Agent");
		xml += L"<table>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		size_t i;
		for (i = 0; i < Jobs.size(); i++) {
			if (Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"type=\"h\" class=\"active\"", Jobs[i]->GetName());
			else
				xml_AddElement(xml, L"td", L"type=\"h\" class=\"deactive\"", Jobs[i]->GetName());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"実行");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"C\"", L"-");
			else if (Jobs[i]->IsWorking())
				xml_AddElement(xml, L"td", L"class=\"active\"", L"実行中");
			else
				xml_AddElement(xml, L"td", L"class=\"wait\"", L"待機");
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"間隔(s)");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"C\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"C\"", Jobs[i]->GetInterval());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"起動まで");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive() || Jobs[i]->IsWorking())
				xml_AddElement(xml, L"td", L"class=\"C\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"C\"", Jobs[i]->GetRemain());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"接続回数");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"R\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetTotalSessionCount());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"up");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"R\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetSendByte());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"down");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"R\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetRecvByte());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"up+down");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"R\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetSendByte()+Jobs[i]->GetRecvByte());
		}
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"同時接続数ピーク");
		xml_AddElement(xml, L"td", L"class=\"N\"", Client->GetSessionPeak());
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"</category>"EOL;

		if (O2DEBUG && TRACE_CONNECTIONS && !pub) {
			//
			//	Connections
			//
			xml += L"<category>"EOL;
			xml_AddElement(xml, L"caption", NULL, L"Connections");
			xml += L"<table>"EOL;
			xml += L"<tr>"EOL;
			xml_AddElement(xml, L"td", L"type=\"h\"", L"");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"IP");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"Port");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"接続時間(s)");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"recv");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"send");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"rbuff");
			xml += L"</tr>"EOL;
			O2SocketSessionPList lst;
			time_t now = time(NULL);
			Server_P2P->GetSessionList(lst);
			for (O2SocketSessionPListIt it = lst.begin(); it != lst.end(); it++) {
				O2SocketSession *ss = *it;
				wstring e_ip;
				ip2e(ss->ip, e_ip);
				xml += L"<tr>"EOL;
				xml_AddElement(xml, L"td", L"class=\"C\"", L"Server");
				xml_AddElement(xml, L"td", L"class=\"C\"", e_ip.c_str());
				xml_AddElement(xml, L"td", L"class=\"C\"", ss->port);
				xml_AddElement(xml, L"td", L"class=\"R\"", now - ss->connect_t);
				xml_AddElement(xml, L"td", L"class=\"N\"", ss->rbuffoffset);
				xml_AddElement(xml, L"td", L"class=\"N\"", ss->sbuffoffset);
				wstring rbuff;
				ascii2unicode(ss->rbuff, rbuff);
				xml_AddElement(xml, L"td", L"class=\"L\"", rbuff.c_str(), true);
				xml += L"</tr>"EOL;
				delete *it;
			}
			lst.clear();
			Client->GetSessionList(lst);
			for (O2SocketSessionPListIt it = lst.begin(); it != lst.end(); it++) {
				O2SocketSession *ss = *it;
				wstring e_ip;
				ip2e(ss->ip, e_ip);
				xml += L"<tr>"EOL;
				xml_AddElement(xml, L"td", L"class=\"C\"", L"Agent");
				xml_AddElement(xml, L"td", L"class=\"C\"", e_ip.c_str());
				xml_AddElement(xml, L"td", L"class=\"C\"", ss->port);
				xml_AddElement(xml, L"td", L"class=\"R\"", now - ss->connect_t);
				xml_AddElement(xml, L"td", L"class=\"N\"", ss->rbuffoffset);
				xml_AddElement(xml, L"td", L"class=\"N\"", ss->sbuffoffset);
				wstring rbuff;
				ascii2unicode(ss->rbuff, rbuff);
				xml_AddElement(xml, L"td", L"class=\"L\"", rbuff.c_str(), true);
				xml += L"</tr>"EOL;
				delete *it;
			}
			xml += L"</table>"EOL;
			xml += L"</category>"EOL;
		}
	}
	xml += L"</report>"EOL;

	FromUnicode(_T(DEFAULT_XML_CHARSET), xml, out);
}
コード例 #6
0
ファイル: O2Boards.cpp プロジェクト: Hiroyuki-Nagata/o2on
// ---------------------------------------------------------------------------
//	MakeBBSMenuXML()
//	
// ---------------------------------------------------------------------------
bool
O2Boards::
MakeBBSMenuXML(string &out, O2DatDB *db)
{
	wstring xml;
	wstring category;
	wstring domain_bbsname;
	wstrarray token;
	wstrnummap::iterator nmit;
	O2BoardExMapIt exit;
	uint64 total;
	uint64 num;

	if (boards.empty())
		return false;

	wstrnummap nummap;
	if (db) total = db->select_datcount(nummap);

	ExLock.Lock();
	for (exit = exmap.begin(); exit != exmap.end(); exit++) {
		nummap.insert(wstrnummap::value_type(exit->first, 0));
	}
	ExLock.Unlock();

	for (size_t i = 0; i < boards.size(); i++) {
		if (category != boards[i].category) {
			category = boards[i].category;
			if (i != 0)
				xml += L"</category>" EOL;
			xml += L"<category>" EOL;
			xml_AddElement(xml, L"categoryname", NULL, category.c_str());
		}
		xml += L"<board>" EOL;

		xml_AddElement(xml, L"bbsname",	NULL, boards[i].bbsname.c_str());
		xml_AddElement(xml, L"title",	NULL, boards[i].title.c_str(), true);
		xml_AddElement(xml, L"host",	NULL, boards[i].host.c_str());
		xml_AddElement(xml, L"domain",	NULL, boards[i].domain.c_str());

		domain_bbsname = boards[i].domain + L":" + boards[i].bbsname;
		nmit = nummap.find(domain_bbsname);
		num = nmit == nummap.end() ? 0 : nmit->second;
		xml_AddElement(xml, L"datnum",	NULL, num);
		//xml_AddElement(xml, L"ratio",	NULL, total == 0 ? 0 : (uint)((double)num/total*100.0));
		xml_AddElement(xml, L"ratio",	NULL, num > 1000 ? 100 : (uint)((double)num/1000*100.0));
		if (nmit != nummap.end())
			nummap.erase(nmit);

		ExLock.Lock();
		exit = exmap.find(domain_bbsname);
		xml_AddElement(xml, L"enable",	NULL, exit != exmap.end() && exit->second->enable ? L"1" : L"0");
		ExLock.Unlock();

		xml += L"</board>" EOL;
	}
	xml += L"</category>" EOL;

	//
	xml += L"<category>" EOL;
	xml_AddElement(xml, L"categoryname", NULL, L"不明");
	for (nmit = nummap.begin(); nmit != nummap.end(); nmit++) {
		wsplit(nmit->first.c_str(), L":", token);
		xml += L"<board>" EOL;
		xml_AddElement(xml, L"bbsname",	NULL, token[1].c_str());
		xml_AddElement(xml, L"title",	NULL, token[1].c_str(), true);
		xml_AddElement(xml, L"host",	NULL, L"");
		xml_AddElement(xml, L"domain",	NULL, token[0].c_str());
		xml_AddElement(xml, L"datnum",	NULL, nmit->second);
		xml_AddElement(xml, L"ratio",	NULL, total == 0 ? 0 : (uint)((double)nmit->second/total*100.0));
		ExLock.Lock();
		exit = exmap.find(nmit->first);
		xml_AddElement(xml, L"enable",	NULL, exit != exmap.end() ? L"1" : L"0");
		ExLock.Unlock();
		xml += L"</board>" EOL;
	}
	xml += L"</category>" EOL;

	FromUnicode(_T(DEFAULT_XML_CHARSET), xml, out);
	return true;
}
コード例 #7
0
ファイル: xmle.c プロジェクト: ctyinsz/Application_Server
/*
     递归调用,树的遍历
     复制方式:  1-覆盖方式, 0-不覆盖方式(跳过), 2-添加
     增加属性的支持  Tianhc 2005-06-02 14:28
     Tianhc 2005-11-20 22:16
     对于儿子有重名的BUG处理
     处理大的XML时(>2M),效率较低,用底层的函数能加快速度?---定位更快,且内容长度>5000时不会出错
*/
int xml_XCopy(HXMLTREE lXmlhandle , char *source, char *dest, int mode)
{
  int num,i,num1,num2,ret=0,j,k;
  char sname[255],sname1[255],sname2[255];
  char sname_add[255],sname_broth[255];
  int ibroth;
  int iret=0;

  num=xml_ChildElementCount( lXmlhandle, source);
  if (num<0) return -1;

  /*判断是否为叶子节点*/
  if (num == 0)
  {
     /*目标节点不存在或者目标节点存在且为添加方式*/
     if (xml_GetNode( lXmlhandle, dest) == NULL || mode == 2)
     {
        /*增加空节点*/
        if (xml_AddElement(lXmlhandle, dest, "") < 0)
            return -7;
        /*属性+值一起复制*/
        snprintf(sname_add, sizeof(sname_add), "%s|0", dest);
        if (xml_node_copy(lXmlhandle,source,sname_add) < 0)
            return -8;
     }
     else if (mode == 1) /*目标存在且为覆盖方式*/
     {
         if (xml_node_copy(lXmlhandle, source, dest) < 0)
             return -11;
     }
     return 1;
  }

  for (i=1;i<=num;i++)
  {
    if ( xml_GetChildElementName( lXmlhandle, source , i, sname, sizeof(sname) )==-1 )
      return -2;
    /*儿子有可能重名!Tianhc 2005-11-20 22:17*/
    ibroth=1;
    for (k=1;k<i;k++)
    {
         if (xml_GetChildElementName( lXmlhandle, source , k, sname_broth, sizeof(sname) )==-1)
              return -3;
         if (strcmp(sname,sname_broth)==0)
              ibroth++;
    }
    if (ibroth > 1)
    {
      snprintf(sname1,sizeof(sname1),"%s/%s|%d",source,sname,ibroth);
      if (strcmp(dest,"/")==0) /*tianhc 2006-6-1 20:48*/
         snprintf(sname2,sizeof(sname2),"/%s|%d",sname,ibroth);
      else
         snprintf(sname2,sizeof(sname2),"%s/%s|%d",dest,sname,ibroth);
    }
    else
    {
      snprintf(sname1,sizeof(sname1),"%s/%s",source,sname);
      if (strcmp(dest,"/")==0)  /*tianhc 2006-6-1 20:48*/
          snprintf(sname2,sizeof(sname2),"/%s",sname);
        else
          snprintf(sname2,sizeof(sname2),"%s/%s",dest,sname);
    }
    /*判断是否为叶子节点*/
    if (xml_IsLeafNode(lXmlhandle,sname1)==1)
    {
         iret++;
         /*节点是否存在*/
         if (xml_GetNode( lXmlhandle, sname2)!=NULL)  /*目标已存在*/
         {
            if (mode==0) /*目标存在,但不覆盖*/
               continue;
            if (mode==2) /*目标存在,添加方式*/
            {
               /*增加节点,不赋值*/
               snprintf(sname_add,sizeof(sname_add),"%s/%s", dest,sname);
               if (xml_AddElement( lXmlhandle, sname_add, "") == -1 )
                 return -7;
               /*属性+值一起复制-->针对叶子节点 Tianhc 2005-06-02 14:38*/
               snprintf(sname_add,sizeof(sname_add),"%s/%s|0", dest,sname);
               ret = xml_node_copy(lXmlhandle,sname1,sname_add);
               if ( ret < 0 )
                  return -8;
            } else
            {
                  /*覆盖*/
               ret = xml_node_copy(lXmlhandle,sname1,sname2);
               if ( ret < 0 )
                  return ret;
            }
         } else
         {
                  /*目标不存在*/
               ret = xml_node_copy(lXmlhandle,sname1,sname2);
               if ( ret < 0 )
                  return ret;
         }
    } else
    {
         ret=xml_XCopy( lXmlhandle, sname1, sname2, mode);
         if (ret<0)
            return ret;
         iret+=ret;
    }
  }
  return iret;
}