Commit 8e365872 authored by Ed "oddsock" Zaleski's avatar Ed "oddsock" Zaleski

Rewrite of the method of gathering stats from the icecast core engine. The...

Rewrite of the method of gathering stats from the icecast core engine.  The old way was causing a bunch of instability issues...they have now been fixed :). Also regenerated the icecast2 docs

svn path=/trunk/icecast/; revision=5684
parent 5e075b92
No preview for this file type
......@@ -40,7 +40,6 @@ CEdit *g_errorControl;
CIcecast2winDlg *g_mainDialog;
bool g_tailAccess = false;
bool g_tailError = false;
void CollectStats(stats_event_t *event);
CString gConfigurationSave;
char gTitleSource[1024] = "";
......@@ -465,88 +464,64 @@ void CIcecast2winDlg::DisableControl(UINT control)
}
void CollectStats(stats_event_t *event)
void AddUpdateStatistic(int sourceIndex, char *name, char *value)
{
Element tempElement;
char tempSource[1024] = "";
tempElement.name = "";
tempElement.value = "";
if (event->name != NULL) {
tempElement.name = event->name;
}
if (event->value != NULL) {
tempElement.value = event->value;
}
if (event->source != NULL) {
strcpy(tempSource, event->source);
}
if (strlen(tempSource) == 0) {
strcpy(tempSource, "Global Stat");
for (int j=0;j<gStats[sourceIndex].numStats;j++) {
if (gStats[sourceIndex].stats[j].name == name) {
gStats[sourceIndex].stats[j].value = value;
return;
}
}
int numStats = gStats[sourceIndex].numStats;
/* If we get here, we haven't found the stat, so add it */
gStats[sourceIndex].stats[numStats].name = name;
gStats[sourceIndex].stats[numStats].value = value;
gStats[sourceIndex].numStats++;
int foundit = 0;
for (int i=0;i<numMainStats;i++) {
if (!strcmp(tempSource, "Global Stat")) {
if (gStats[i].stats[0].name == tempElement.name) {
gStats[i].stats[0].value = tempElement.value;
}
}
else {
if (!strcmp(gStats[i].source, tempSource)) {
int foundit2 = 0;
gStats[i].populated = 1;
for (int j=0;j<gStats[i].numStats;j++) {
if (gStats[i].stats[j].name == tempElement.name) {
gStats[i].stats[j].value = tempElement.value;
foundit2 = 1;
}
}
if (!foundit2) {
gStats[i].stats[j].name = tempElement.name;
gStats[i].stats[j].value = tempElement.value;
gStats[i].numStats++;
}
foundit = 1;
}
}
int GetSourceIndex(char *sourceName)
{
if (sourceName == NULL) {
return 0;
}
for (int i=1;i<numMainStats+1;i++) {
if (!strcmp(gStats[i].source, sourceName)) {
return i;
}
}
if (!foundit) {
/* This means we haven't seen the source, so lets add it */
numMainStats++;
gStats[numMainStats].source = sourceName;
gStats[numMainStats].populated = 1;
gStats[numMainStats].numStats = 0;
return numMainStats;
if (strlen(tempSource) == 0) {
strcpy(tempSource, "Global Stat");
}
void UpdateSourceData(xmlDocPtr doc, xmlNodePtr cur, char *sourceName) {
xmlNodePtr children;
char *ls_xmlContentPtr = NULL;
int sourceIndex = GetSourceIndex(sourceName);
int listenerInd = 0;
children = cur->xmlChildrenNode;
while (children != NULL) {
if (!strcmp((char *)children->name, "listeners")) {
listenerInd = 1;
}
gStats[numMainStats].source = tempSource;
gStats[numMainStats].stats[0].name = tempElement.name;
gStats[numMainStats].stats[0].value = tempElement.value;
gStats[numMainStats].populated = 1;
gStats[numMainStats].numStats++;
numMainStats++;
ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, children->xmlChildrenNode, 1);
AddUpdateStatistic(sourceIndex, (char *)children->name, ls_xmlContentPtr);
xmlFree(ls_xmlContentPtr);
children = children->next;
}
// Process source disconnects
if (event->name != NULL) {
if (!strcmp(event->name, "listeners")) {
if (event->value == NULL) {
// source has disconnected...
for (int i=0;i<numMainStats;i++) {
if (!strcmp(gStats[i].source, tempSource)) {
gStats[i].populated = 0;
g_mainDialog->statsTab.m_SourceListCtrl.DeleteAllItems();
g_mainDialog->statsTab.m_StatsListCtrl.DeleteAllItems();
break;
}
}
}
}
if (!listenerInd) {
/* If no listeners, then the source has been disconnected */
gStats[sourceIndex].populated = 0;
gStats[sourceIndex].numStats = 0;
g_mainDialog->statsTab.m_SourceListCtrl.DeleteAllItems();
g_mainDialog->statsTab.m_StatsListCtrl.DeleteAllItems();
}
g_mainDialog->UpdateStatsLists();
}
bool g_collectingStats = false;
void StartStats(void *dummy)
......@@ -560,7 +535,43 @@ void StartStats(void *dummy)
gStats[j].numStats = 0;
}
numMainStats = 0;
stats_callback(CollectStats);
xmlDocPtr doc;
stats_get_xml(&doc);
xmlNodePtr cur;
cur = xmlDocGetRootElement(doc);
if (cur == NULL) {
MessageBox(NULL, "empty XML document", "Error", MB_OK);
xmlFreeDoc(doc);
return;
}
cur = cur->xmlChildrenNode;
char* ls_xmlContentPtr2 = NULL;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"source"))) {
ls_xmlContentPtr2 = (char *)xmlGetProp(cur, (unsigned char *)"mount");
UpdateSourceData(doc, cur, ls_xmlContentPtr2);
}
else {
/* A Global stat */
ls_xmlContentPtr2 = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
AddUpdateStatistic(0, (char *)cur->name, ls_xmlContentPtr2);
}
if (ls_xmlContentPtr2) {
xmlFree(ls_xmlContentPtr2);
}
cur = cur->next;
}
xmlFreeDoc(doc);
xmlCleanupParser();
g_mainDialog->UpdateStatsLists();
Sleep(5000);
}
if (global.running != ICE_RUNNING) {
_endthread();
......@@ -665,7 +676,7 @@ void CIcecast2winDlg::OnFileStartserver()
LoadConfig();
SetTimer(0, 500, NULL);
_beginthread(StartServer, 0, (void *)(LPCSTR)myApp->m_configFile);
_beginthread(StartStats, 0, (void *)CollectStats);
_beginthread(StartStats, 0, (void *)NULL);
}
}
......@@ -704,7 +715,7 @@ void CIcecast2winDlg::OnStart()
else {
SetTimer(0, 500, NULL);
_beginthread(StartServer, 0, (void *)(LPCSTR)myApp->m_configFile);
_beginthread(StartStats, 0, (void *)CollectStats);
_beginthread(StartStats, 0, (void *)NULL);
}
}
......@@ -714,7 +725,57 @@ void CIcecast2winDlg::UpdateStatsLists()
char item[1024] = "";
int l = 0;
for (int i=0;i<numMainStats;i++) {
// Global Stats are index of 0
for (int k=0;k < gStats[0].numStats;k++) {
int inthere = 0;
for (l=0;l < statusTab.m_GlobalStatList.GetItemCount();l++) {
statusTab.m_GlobalStatList.GetItemText(l, 1, item, sizeof(item));
if (!strcmp(gStats[0].stats[k].name, item)) {
inthere = 1;
break;
}
}
if (!inthere) {
LVITEM lvi;
lvi.mask = LVIF_IMAGE | LVIF_TEXT;
lvi.iItem = statsTab.m_SourceListCtrl.GetItemCount();
lvi.iSubItem = 0;
//lvi.pszText = (LPTSTR)(LPCTSTR)gStats[0].source;
lvi.pszText = "Global Stat";
statusTab.m_GlobalStatList.InsertItem(&lvi);
lvi.iSubItem = 1;
lvi.pszText = (LPTSTR)(LPCTSTR)gStats[0].stats[k].name;
statusTab.m_GlobalStatList.SetItem(&lvi);
lvi.iSubItem = 2;
lvi.pszText = (LPTSTR)(LPCTSTR)gStats[0].stats[k].value;
statusTab.m_GlobalStatList.SetItem(&lvi);
if ((!strcmp(gTitleSource, gStats[0].source)) &&
(!strcmp(gTitleName, gStats[0].stats[k].name))) {
gStats[0].stats[k].titleFlag = 1;
}
}
else {
LVITEM lvi;
lvi.mask = LVIF_IMAGE | LVIF_TEXT;
lvi.iItem = l;
lvi.iSubItem = 2;
lvi.pszText = (LPTSTR)(LPCTSTR)gStats[0].stats[k].value;
statusTab.m_GlobalStatList.SetItem(&lvi);
}
if (gStats[0].stats[k].titleFlag) {
CString windowTitle = CString("Global Stat") + " - " + gStats[0].stats[k].name + " - " + gStats[0].stats[k].value;
SetWindowText(windowTitle);
if (m_pTray) {
m_pTray->SetTIP((LPSTR)(LPCSTR)windowTitle);
}
}
}
for (int i=1;i<numMainStats+1;i++) {
int inthere = 0;
int k = 0;
if (gStats[i].populated) {
......@@ -842,56 +903,6 @@ void CIcecast2winDlg::UpdateStatsLists()
}
}
else {
// If Global Stat
for (k=0;k < gStats[i].numStats;k++) {
inthere = 0;
for (l=0;l < statusTab.m_GlobalStatList.GetItemCount();l++) {
statusTab.m_GlobalStatList.GetItemText(l, 1, item, sizeof(item));
if (!strcmp(gStats[i].stats[k].name, item)) {
inthere = 1;
break;
}
}
if (!inthere) {
LVITEM lvi;
lvi.mask = LVIF_IMAGE | LVIF_TEXT;
lvi.iItem = statsTab.m_SourceListCtrl.GetItemCount();
lvi.iSubItem = 0;
lvi.pszText = (LPTSTR)(LPCTSTR)gStats[i].source;
statusTab.m_GlobalStatList.InsertItem(&lvi);
lvi.iSubItem = 1;
lvi.pszText = (LPTSTR)(LPCTSTR)gStats[i].stats[k].name;
statusTab.m_GlobalStatList.SetItem(&lvi);
lvi.iSubItem = 2;
lvi.pszText = (LPTSTR)(LPCTSTR)gStats[i].stats[k].value;
statusTab.m_GlobalStatList.SetItem(&lvi);
if ((!strcmp(gTitleSource, gStats[i].source)) &&
(!strcmp(gTitleName, gStats[i].stats[k].name))) {
gStats[i].stats[k].titleFlag = 1;
}
}
else {
LVITEM lvi;
lvi.mask = LVIF_IMAGE | LVIF_TEXT;
lvi.iItem = l;
lvi.iSubItem = 2;
lvi.pszText = (LPTSTR)(LPCTSTR)gStats[i].stats[k].value;
statusTab.m_GlobalStatList.SetItem(&lvi);
break;
}
if (gStats[i].stats[k].titleFlag) {
CString windowTitle = gStats[i].source + " - " + gStats[i].stats[k].name + " - " + gStats[i].stats[k].value;
SetWindowText(windowTitle);
if (m_pTray) {
m_pTray->SetTIP((LPSTR)(LPCSTR)windowTitle);
}
}
}
}
}
}
......
......@@ -41,7 +41,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Releaseicecast"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../curl/include" /I "..\src" /I "..\src/httpp" /I "..\src/thread" /I "..\src/log" /I "..\src/avl" /I "..\src/net" /I "..\src/timings" /I "../" /I "../../libxslt/include" /I "../../iconv/include" /I "../../libxml2/include" /I "../../pthreads" /I "../../oggvorbis-win32sdk-1.0.1/include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "HAVE_CURL" /D "USE_YP" /D "HAVE_SYS_STAT_H" /D PACKAGE_VERSION=\"2.0-beta-1\" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../curl/include" /I "..\src" /I "..\src/httpp" /I "..\src/thread" /I "..\src/log" /I "..\src/avl" /I "..\src/net" /I "..\src/timings" /I "../" /I "../../libxslt/include" /I "../../iconv/include" /I "../../libxml2/include" /I "../../pthreads" /I "../../oggvorbis-win32sdk-1.0.1/include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "HAVE_CURL" /D "USE_YP" /D "HAVE_SYS_STAT_H" /YX /FD /D PACKAGE_VERSION=\"2.0-beta-2\" /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
......@@ -64,7 +64,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debugicecast"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../curl/include" /I "..\src" /I "..\src/httpp" /I "..\src/thread" /I "..\src/log" /I "..\src/avl" /I "..\src/net" /I "..\src/timings" /I "../" /I "../../libxslt/include" /I "../../iconv/include" /I "../../libxml2/include" /I "../../pthreads" /I "../../oggvorbis-win32sdk-1.0.1/include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "_WIN32" /D "HAVE_CURL" /D "USE_YP" /D "HAVE_SYS_STAT_H" /D PACKAGE_VERSION=\"2.0-beta-1\" /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../curl/include" /I "..\src" /I "..\src/httpp" /I "..\src/thread" /I "..\src/log" /I "..\src/avl" /I "..\src/net" /I "..\src/timings" /I "../" /I "../../libxslt/include" /I "../../iconv/include" /I "../../libxml2/include" /I "../../pthreads" /I "../../oggvorbis-win32sdk-1.0.1/include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "_WIN32" /D "HAVE_CURL" /D "USE_YP" /D "HAVE_SYS_STAT_H" /FD /D /GZ PACKAGE_VERSION=\"2.0-beta-2\" /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
......
......@@ -3,7 +3,7 @@
[Setup]
AppName=Icecast2 Win32
AppVerName=Icecast v2.0 beta 1
AppVerName=Icecast v2.0 beta 2
AppPublisherURL=http://www.icecast.org
AppSupportURL=http://www.icecast.org
AppUpdatesURL=http://www.icecast.org
......@@ -13,7 +13,7 @@ AllowNoIcons=yes
LicenseFile=..\COPYING
InfoAfterFile=..\README
OutputDir=.
OutputBaseFilename=icecast2_win32_2.0_beta1_setup
OutputBaseFilename=icecast2_win32_2.0_beta2_setup
WizardImageFile=icecast2logo2.bmp
; uncomment the following line if you want your installation to run on NT 3.51 too.
; MinVersion=4,3.51
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment