diff --git a/AUTHORS b/AUTHORS index f7ecf3e2..4548a324 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1 +1,4 @@ Jack Moffitt +Michael Smith +oddsock + diff --git a/TODO b/TODO index cab86b66..3ba203b1 100644 --- a/TODO +++ b/TODO @@ -2,15 +2,9 @@ BUGS ---- - stats get off? this needs testing more testing. -- seem to be some segfaults in httpp still. in a few of the cores i've - been sent, the avl_tree is null when calling into the avl module. - -- ensure we don't connect a source if the fd would be more then FD_SETSIZE - (1024, on linux). Otherwise memory gets overrun, and crashes result. - Preferably allow using poll() instead of select() through a lightweight - abstraction. - +- autoconf doesn't set HAS_POLL +- automake isn't installing things (conf, web) correctly. FEATURES diff --git a/conf/Makefile.am b/conf/Makefile.am index 94be3068..d7681f73 100644 --- a/conf/Makefile.am +++ b/conf/Makefile.am @@ -5,8 +5,8 @@ AUTOMAKE_OPTIONS = foreign EXTRA_DIST = icecast.xml debug: - $(MAKE) all CFLAGS="@DEBUG@" + $(MAKE) all CFLAGS="@DEBUG@" profile: - $(MAKE) all CFLAGS="@PROFILE@" + $(MAKE) all CFLAGS="@PROFILE@" diff --git a/conf/icecast.xml b/conf/icecast.xml index b5d4b067..40c21ad0 100644 --- a/conf/icecast.xml +++ b/conf/icecast.xml @@ -32,7 +32,7 @@ /usr/local/icecast /tmp - /usr/local/icecast/webroot + /usr/local/icecast/web diff --git a/web/status.xsl b/web/status.xsl index 5154be38..5de2dad7 100755 --- a/web/status.xsl +++ b/web/status.xsl @@ -94,7 +94,7 @@ a:hover {color: black; font-family:Verdana} - + @@ -104,7 +104,17 @@ a:hover {color: black; font-family:Verdana} - + + + + + + +Stream Description: + + + + diff --git a/win32/ConfigTab.cpp b/win32/ConfigTab.cpp new file mode 100644 index 00000000..2ad7fe53 --- /dev/null +++ b/win32/ConfigTab.cpp @@ -0,0 +1,79 @@ +// ConfigTab.cpp : implementation file +// + +#include "stdafx.h" +#include "Icecast2win.h" +#include "ConfigTab.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CConfigTab dialog + + +CConfigTab::CConfigTab(CWnd* pParent /*=NULL*/) + : CTabPageSSL(CConfigTab::IDD, pParent) +{ + //{{AFX_DATA_INIT(CConfigTab) + m_Config = _T(""); + //}}AFX_DATA_INIT +} + + +void CConfigTab::DoDataExchange(CDataExchange* pDX) +{ + CTabPageSSL::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CConfigTab) + DDX_Control(pDX, IDC_CONFIG, m_ConfigCtrl); + DDX_Text(pDX, IDC_CONFIG, m_Config); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CConfigTab, CTabPageSSL) + //{{AFX_MSG_MAP(CConfigTab) + ON_EN_KILLFOCUS(IDC_CONFIG, OnKillfocusConfig) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CConfigTab message handlers + +void CConfigTab::SaveConfiguration() +{ + // TODO: Add your command handler code here + // TODO: Add your control notification handler code here + FILE *filep; + char buffer[2046] = ""; + CIcecast2winApp *myApp = (CIcecast2winApp *)AfxGetApp(); + + UpdateData(TRUE); + if (m_Config != "") { + filep = fopen(myApp->m_configFile, "w"); + if (filep) { + fputs(LPCSTR(m_Config), filep); + fclose(filep); + } + } +} + +BOOL CConfigTab::OnInitDialog() +{ + CTabPageSSL::OnInitDialog(); + + // TODO: Add extra initialization here + AddAnchor(IDC_CONFIG, TOP_LEFT, BOTTOM_RIGHT); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CConfigTab::OnKillfocusConfig() +{ + // TODO: Add your control notification handler code here + SaveConfiguration(); +} diff --git a/win32/ConfigTab.h b/win32/ConfigTab.h new file mode 100644 index 00000000..6dc5a2b5 --- /dev/null +++ b/win32/ConfigTab.h @@ -0,0 +1,50 @@ +#if !defined(AFX_CONFIGTAB_H__D8B0CC28_59FA_44E8_91A4_377C64F67DCF__INCLUDED_) +#define AFX_CONFIGTAB_H__D8B0CC28_59FA_44E8_91A4_377C64F67DCF__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// ConfigTab.h : header file +// +#include "TabPageSSL.h" + +///////////////////////////////////////////////////////////////////////////// +// CConfigTab dialog + +class CConfigTab : public CTabPageSSL +{ +// Construction +public: + void SaveConfiguration(); + CConfigTab(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CConfigTab) + enum { IDD = IDD_CONFIGDIALOG }; + CEdit m_ConfigCtrl; + CString m_Config; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CConfigTab) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(CConfigTab) + virtual BOOL OnInitDialog(); + afx_msg void OnKillfocusConfig(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_CONFIGTAB_H__D8B0CC28_59FA_44E8_91A4_377C64F67DCF__INCLUDED_) diff --git a/win32/Icecast2win.cpp b/win32/Icecast2win.cpp new file mode 100644 index 00000000..37b956d6 --- /dev/null +++ b/win32/Icecast2win.cpp @@ -0,0 +1,87 @@ +// Icecast2win.cpp : Defines the class behaviors for the application. +// + +#include "stdafx.h" +#include "Icecast2win.h" +#include "Icecast2winDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CIcecast2winApp + +BEGIN_MESSAGE_MAP(CIcecast2winApp, CWinApp) + //{{AFX_MSG_MAP(CIcecast2winApp) + // NOTE - the ClassWizard will add and remove mapping macros here. + // DO NOT EDIT what you see in these blocks of generated code! + //}}AFX_MSG + ON_COMMAND(ID_HELP, CWinApp::OnHelp) +END_MESSAGE_MAP() + +#include "colors.h" +///////////////////////////////////////////////////////////////////////////// +// CIcecast2winApp construction + +CIcecast2winApp::CIcecast2winApp() +{ + // TODO: add construction code here, + // Place all significant initialization in InitInstance +} + +///////////////////////////////////////////////////////////////////////////// +// The one and only CIcecast2winApp object + +CIcecast2winApp theApp; + +///////////////////////////////////////////////////////////////////////////// +// CIcecast2winApp initialization + +BOOL CIcecast2winApp::InitInstance() +{ + AfxEnableControlContainer(); + + // Standard initialization + // If you are not using these features and wish to reduce the size + // of your final executable, you should remove from the following + // the specific initialization routines you do not need. + + if (strlen(m_lpCmdLine) > 0) { + strcpy(m_configFile, m_lpCmdLine); + } + else { + strcpy(m_configFile, ".\\icecast.xml"); + } + + + +#ifdef _AFXDLL + Enable3dControls(); // Call this when using MFC in a shared DLL +#else + Enable3dControlsStatic(); // Call this when linking to MFC statically +#endif + + CIcecast2winDlg dlg; + m_pMainWnd = &dlg; + +// SetDialogBkColor(BGCOLOR,TEXTCOLOR); + + int nResponse = dlg.DoModal(); + if (nResponse == IDOK) + { + // TODO: Place code here to handle when the dialog is + // dismissed with OK + } + else if (nResponse == IDCANCEL) + { + // TODO: Place code here to handle when the dialog is + // dismissed with Cancel + } + + // Since the dialog has been closed, return FALSE so that we exit the + // application, rather than start the application's message pump. + return FALSE; +} diff --git a/win32/Icecast2win.dsp b/win32/Icecast2win.dsp new file mode 100644 index 00000000..f4e5b9f7 --- /dev/null +++ b/win32/Icecast2win.dsp @@ -0,0 +1,267 @@ +# Microsoft Developer Studio Project File - Name="Icecast2win" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=Icecast2win - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Icecast2win.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Icecast2win.mak" CFG="Icecast2win - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Icecast2win - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "Icecast2win - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Icecast2win - Win32 Release" + +# PROP BASE Use_MFC 5 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 5 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "../" /I "../../libxslt/include" /I "../../iconv/include" /I "../../libxml2/include" /I "../src" /I "../src/httpp" /I "../src/thread" /I "../src/log" /I "../src/avl" /I "../src/net" /I "src/timings" /I "../../pthreads" /I "../../ogg/include" /I "../../vorbis/include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 /nologo /subsystem:windows /machine:I386 +# ADD LINK32 Releaseicecast\icecast.lib ..\..\ogg\win32\Static_Release\ogg_static.lib ..\..\vorbis\win32\Vorbis_Static_Release\vorbis_static.lib ..\..\libxml2\lib\libxml2.lib ..\..\libxslt\lib\libxslt.lib ..\..\iconv\lib\iconv.lib ..\..\pthreads\pthreadVSE.lib ws2_32.lib winmm.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libc.lib" /out:"Release/Icecast2.exe" + +!ELSEIF "$(CFG)" == "Icecast2win - Win32 Debug" + +# PROP BASE Use_MFC 5 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 6 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../" /I "../../libxslt/include" /I "../../iconv/include" /I "../../libxml2/include" /I "../src" /I "../src/httpp" /I "../src/thread" /I "../src/log" /I "../src/avl" /I "../src/net" /I "src/timings" /I "../../pthreads" /I "../../ogg/include" /I "../../vorbis/include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_WIN32" /D "_AFXDLL" /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 Debugicecast\icecast.lib ..\..\..\ogg\win32\Static_Debug\ogg_static_d.lib ..\..\..\vorbis\win32\Vorbis_Static_Debug\vorbis_static_d.lib ..\..\libxml2\lib\libxml2.lib ..\..\libxslt\lib\libxslt.lib ..\..\iconv\lib\iconv.lib ..\..\pthreads\pthreadVSE.lib ws2_32.lib winmm.lib /nologo /subsystem:windows /incremental:no /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"LIBCMTD.lib" /pdbtype:sept +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "Icecast2win - Win32 Release" +# Name "Icecast2win - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\ConfigTab.cpp +# End Source File +# Begin Source File + +SOURCE=.\Icecast2win.cpp +# End Source File +# Begin Source File + +SOURCE=.\Icecast2win.rc +# End Source File +# Begin Source File + +SOURCE=.\Icecast2winDlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\ResizableDialog.cpp +# End Source File +# Begin Source File + +SOURCE=.\ResizableDialog.h +# End Source File +# Begin Source File + +SOURCE=.\StatsTab.cpp +# End Source File +# Begin Source File + +SOURCE=.\Status.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\TabCtrlSSL.cpp +# End Source File +# Begin Source File + +SOURCE=.\TabCtrlSSL.h +# End Source File +# Begin Source File + +SOURCE=.\TabPageSSL.cpp +# End Source File +# Begin Source File + +SOURCE=.\TabPageSSL.h +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\colors.h +# End Source File +# Begin Source File + +SOURCE=.\ConfigTab.h +# End Source File +# Begin Source File + +SOURCE=.\Icecast2win.h +# End Source File +# Begin Source File + +SOURCE=.\Icecast2winDlg.h +# End Source File +# Begin Source File + +SOURCE=.\Resource.h +# End Source File +# Begin Source File + +SOURCE=.\StatsTab.h +# End Source File +# Begin Source File + +SOURCE=.\Status.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\bitmap1.bmp +# End Source File +# Begin Source File + +SOURCE=.\bitmap2.bmp +# End Source File +# Begin Source File + +SOURCE=.\black.bmp +# End Source File +# Begin Source File + +SOURCE=.\cursor1.cur +# End Source File +# Begin Source File + +SOURCE=.\cursor2.cur +# End Source File +# Begin Source File + +SOURCE=.\green1.ico +# End Source File +# Begin Source File + +SOURCE=.\icecast.ico +# End Source File +# Begin Source File + +SOURCE=.\Icecast2.ico +# End Source File +# Begin Source File + +SOURCE=.\res\Icecast2.ico +# End Source File +# Begin Source File + +SOURCE=.\icecast2logo.bmp +# End Source File +# Begin Source File + +SOURCE=.\icecast2logo2.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\Icecast2win.ico +# End Source File +# Begin Source File + +SOURCE=.\res\Icecast2win.rc2 +# End Source File +# Begin Source File + +SOURCE=.\ico00001.ico +# End Source File +# Begin Source File + +SOURCE=.\icon1.ico +# End Source File +# Begin Source File + +SOURCE=.\icon2.ico +# End Source File +# Begin Source File + +SOURCE=.\running.bmp +# End Source File +# Begin Source File + +SOURCE=.\stopped.bmp +# End Source File +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/win32/Icecast2win.dsw b/win32/Icecast2win.dsw new file mode 100644 index 00000000..fc8526e1 --- /dev/null +++ b/win32/Icecast2win.dsw @@ -0,0 +1,77 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Icecast2win"=.\Icecast2win.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libxml + End Project Dependency + Begin Project Dependency + Project_Dep_Name icecast + End Project Dependency + Begin Project Dependency + Project_Dep_Name ogg_static + End Project Dependency + Begin Project Dependency + Project_Dep_Name vorbis_static + End Project Dependency +}}} + +############################################################################### + +Project: "icecast"=.\icecast.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "ogg_static"=..\..\ogg\win32\ogg_static.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "vorbis_static"=..\..\vorbis\win32\vorbis_static.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/win32/Icecast2win.h b/win32/Icecast2win.h new file mode 100644 index 00000000..af1ac2f8 --- /dev/null +++ b/win32/Icecast2win.h @@ -0,0 +1,50 @@ +// Icecast2win.h : main header file for the ICECAST2WIN application +// + +#if !defined(AFX_ICECAST2WIN_H__76A528C9_A424_4417_BFDF_0E556A9EE4F1__INCLUDED_) +#define AFX_ICECAST2WIN_H__76A528C9_A424_4417_BFDF_0E556A9EE4F1__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#ifndef __AFXWIN_H__ +#error include 'stdafx.h' before including this file for PCH +#endif + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// CIcecast2winApp: +// See Icecast2win.cpp for the implementation of this class +// + +class CIcecast2winApp : public CWinApp +{ +public: + char m_configFile[1024]; + CIcecast2winApp(); + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CIcecast2winApp) + public: + virtual BOOL InitInstance(); + //}}AFX_VIRTUAL + +// Implementation + + //{{AFX_MSG(CIcecast2winApp) + // NOTE - the ClassWizard will add and remove member functions here. + // DO NOT EDIT what you see in these blocks of generated code ! + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_ICECAST2WIN_H__76A528C9_A424_4417_BFDF_0E556A9EE4F1__INCLUDED_) diff --git a/win32/Icecast2win.rc b/win32/Icecast2win.rc new file mode 100644 index 00000000..3bd5243b --- /dev/null +++ b/win32/Icecast2win.rc @@ -0,0 +1,270 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "#define _AFX_NO_SPLITTER_RESOURCES\r\n" + "#define _AFX_NO_OLE_RESOURCES\r\n" + "#define _AFX_NO_TRACKER_RESOURCES\r\n" + "#define _AFX_NO_PROPERTY_RESOURCES\r\n" + "\r\n" + "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" + "#ifdef _WIN32\r\n" + "LANGUAGE 9, 1\r\n" + "#pragma code_page(1252)\r\n" + "#endif //_WIN32\r\n" + "#include ""res\\Icecast2win.rc2"" // non-Microsoft Visual C++ edited resources\r\n" + "#include ""afxres.rc"" // Standard components\r\n" + "#endif\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 235, 55 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About Icecast2win" +FONT 8, "MS Sans Serif" +BEGIN + ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 + LTEXT "Icecast 2 Win32",IDC_STATIC,40,10,119,8,SS_NOPREFIX + DEFPUSHBUTTON "OK",IDOK,178,7,50,14,WS_GROUP +END + +IDD_ICECAST2WIN_DIALOG DIALOGEX 0, 0, 318, 249 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "icecast2" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tab1",IDC_MAINTAB,"SysTabControl32",0x0,0,48,318,201 + PUSHBUTTON "Start Server",IDC_START,17,31,56,14 + CONTROL "Start Server on Application Startup",IDC_AUTOSTART, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,76, + 29,81,17 + CONTROL 159,IDC_STATIC,"Static",SS_BITMAP,0,0,117,20 + CONTROL 151,IDC_SERVERSTATUS,"Static",SS_BITMAP,253,28,65,18, + WS_EX_CLIENTEDGE + RTEXT "Server Status",IDC_STATIC_SS,163,28,86,14 + CONTROL 150,IDC_STATICBLACK,"Static",SS_BITMAP,116,0,200,20 +END + +IDD_SSTATUS DIALOG DISCARDABLE 0, 0, 320, 210 +STYLE WS_CHILD +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "",IDC_FILLER2,0,199,319,11 + CONTROL "List1",IDC_GLOBALSTAT_LIST,"SysListView32",LVS_REPORT | + WS_BORDER | WS_TABSTOP,9,34,300,147 + CTEXT "Global Statistics",IDC_STATIC_GS,9,9,300,21 + LTEXT "Server Has Been Running For ",IDC_STATIC_RUN,46,184,100, + 8 + LTEXT "",IDC_RUNNINGFOR,149,184,156,8 +END + +IDD_CONFIGDIALOG DIALOG DISCARDABLE 0, 0, 320, 210 +STYLE WS_CHILD +FONT 8, "MS Sans Serif" +BEGIN + EDITTEXT IDC_CONFIG,0,0,320,210,ES_MULTILINE | ES_AUTOVSCROLL | + ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL +END + +IDD_STATSDIALOG DIALOG DISCARDABLE 0, 0, 320, 210 +STYLE WS_CHILD +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "List1",IDC_STATSLIST,"SysListView32",LVS_REPORT | + WS_BORDER | WS_TABSTOP,142,34,149,160 + CONTROL "List2",IDC_SOURCELIST,"SysListView32",LVS_REPORT | + WS_BORDER | WS_TABSTOP,9,34,111,159 + LTEXT "",IDC_FILLER1,0,199,320,11 + CTEXT "Source Level Statistics",IDC_STATIC_SLS,9,7,300,15 + LTEXT "Click source to view statistics",IDC_STATIC,18,25,111,8 +END + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "\0" + VALUE "FileDescription", "Icecast2win MFC Application\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "Icecast2win\0" + VALUE "LegalCopyright", "Copyright (C) 2001\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "Icecast2win.EXE\0" + VALUE "ProductName", "Icecast2win Application\0" + VALUE "ProductVersion", "1, 0, 0, 1\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_ABOUTBOX, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 228 + TOPMARGIN, 7 + BOTTOMMARGIN, 48 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_BITMAP4 BITMAP DISCARDABLE "black.bmp" +IDB_BITMAP5 BITMAP DISCARDABLE "stopped.bmp" +IDB_BITMAP6 BITMAP DISCARDABLE "running.bmp" +IDB_BITMAP7 BITMAP DISCARDABLE "icecast2logo2.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDR_MAINFRAME ICON DISCARDABLE "icecast.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_MENU2 MENU DISCARDABLE +BEGIN + POPUP "Popup" + BEGIN + MENUITEM "Add To Global Stat List", ID_POPUP_ADDTOGLOBALSTATLIST + END +END + +IDR_MENU3 MENU DISCARDABLE +BEGIN + POPUP " " + BEGIN + MENUITEM "Delete From Global Stats", ID__DELETEFROMGLOBALSTATS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ABOUTBOX "&About Icecast2win..." +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#define _AFX_NO_SPLITTER_RESOURCES +#define _AFX_NO_OLE_RESOURCES +#define _AFX_NO_TRACKER_RESOURCES +#define _AFX_NO_PROPERTY_RESOURCES + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE 9, 1 +#pragma code_page(1252) +#endif //_WIN32 +#include "res\Icecast2win.rc2" // non-Microsoft Visual C++ edited resources +#include "afxres.rc" // Standard components +#endif + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/win32/Icecast2winDlg.cpp b/win32/Icecast2winDlg.cpp new file mode 100644 index 00000000..fb150e5e --- /dev/null +++ b/win32/Icecast2winDlg.cpp @@ -0,0 +1,1054 @@ +// Icecast2winDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "Icecast2win.h" +#include "Icecast2winDlg.h" +#include +#include "ResizableDialog.h" + +#include +#include +#include +#include + +extern "C" { +#include "thread.h" +#include "avl.h" +#include "log.h" +#include "global.h" +#include "httpp.h" +#include "sock.h" +#include "connection.h" +#include "refbuf.h" +#include "client.h" +#include "stats.h" +} + + +#include + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +CEdit *g_accessControl; +CEdit *g_errorControl; +CIcecast2winDlg *g_mainDialog; +bool g_tailAccess = false; +bool g_tailError = false; +void CollectStats(stats_event_t *event); +CString gConfigurationSave; + +#define MAXSTATSPERSOURCE 30 +#define MAXSOURCES 1024 + +typedef struct tagElement { + CString name; + CString value; +} Element; + +typedef struct tagElementAdditional { + CString source; + CString name; + CString value; +} ElementAdditional; + + +typedef struct tagMainElement { +// char source[1024]; + CString source; + long numStats; + Element stats[MAXSTATSPERSOURCE]; +} MainElement; + +typedef struct tagMainElementAdditional { + long numStats; + ElementAdditional stats[MAXSTATSPERSOURCE]; +} MainElementAdditional; + + +MainElement gStats[MAXSOURCES]; +MainElement gGlobalStats; +MainElementAdditional gAdditionalGlobalStats; + +long numMainStats; + +extern "C" { + int main(int argc, char **argv); +} + +void AddToAdditionalGlobalStats(CString source, CString name) { + int foundit = 0; + for (int i=0;iUpdateStatsLists(); +} +void RemoveFromAdditionalGlobalStats(CString source, CString name) { + int foundit = 0; + for (int i=0;iUpdateStatsLists(); +} +///////////////////////////////////////////////////////////////////////////// +// CAboutDlg dialog used for App About + +class CAboutDlg : public CResizableDialog +{ +public: + CAboutDlg(); + +// Dialog Data + //{{AFX_DATA(CAboutDlg) + enum { IDD = IDD_ABOUTBOX }; + //}}AFX_DATA + + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CAboutDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + //{{AFX_MSG(CAboutDlg) + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +CAboutDlg::CAboutDlg() : CResizableDialog(CAboutDlg::IDD) +{ + //{{AFX_DATA_INIT(CAboutDlg) + //}}AFX_DATA_INIT +} + +void CAboutDlg::DoDataExchange(CDataExchange* pDX) +{ + CResizableDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CAboutDlg) + //}}AFX_DATA_MAP +} + +BEGIN_MESSAGE_MAP(CAboutDlg, CResizableDialog) + //{{AFX_MSG_MAP(CAboutDlg) + // No message handlers + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CIcecast2winDlg dialog + +CIcecast2winDlg::CIcecast2winDlg(CWnd* pParent /*=NULL*/) + : CResizableDialog(CIcecast2winDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CIcecast2winDlg) + m_AccessEdit = _T(""); + m_ErrorEdit = _T(""); + m_ConfigEdit = _T(""); + m_ServerStatus = _T(""); + m_SourcesConnected = _T(""); + m_NumClients = _T(""); + m_StatsEdit = _T(""); + m_Autostart = FALSE; + //}}AFX_DATA_INIT + // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); +} + +void CIcecast2winDlg::DoDataExchange(CDataExchange* pDX) +{ + CResizableDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CIcecast2winDlg) + DDX_Control(pDX, IDC_STATIC_SS, m_SS); + DDX_Control(pDX, IDC_SERVERSTATUS, m_ServerStatusBitmap); + DDX_Control(pDX, IDC_START, m_StartButton); + DDX_Control(pDX, IDC_MAINTAB, m_MainTab); + DDX_Check(pDX, IDC_AUTOSTART, m_Autostart); + //}}AFX_DATA_MAP +} + +BEGIN_MESSAGE_MAP(CIcecast2winDlg, CResizableDialog) + //{{AFX_MSG_MAP(CIcecast2winDlg) + ON_WM_SYSCOMMAND() + ON_WM_PAINT() + ON_WM_QUERYDRAGICON() + ON_NOTIFY(TCN_SELCHANGE, IDC_MAINTAB, OnSelchangeMaintab) + ON_COMMAND(ID_FILE_EXIT, OnFileExit) + ON_WM_TIMER() + ON_COMMAND(ID_FILE_STARTSERVER, OnFileStartserver) + ON_COMMAND(ID_FILE_STOPSERVER, OnFileStopserver) + ON_BN_CLICKED(IDC_START, OnStart) + ON_WM_CLOSE() + ON_WM_SIZE() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CIcecast2winDlg message handlers + +#include "colors.h" + +BOOL CIcecast2winDlg::OnInitDialog() +{ + CResizableDialog::OnInitDialog(); + + // Add "About..." menu item to system menu. + + // IDM_ABOUTBOX must be in the system command range. + ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); + ASSERT(IDM_ABOUTBOX < 0xF000); + + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != NULL) + { + CString strAboutMenu; + strAboutMenu.LoadString(IDS_ABOUTBOX); + if (!strAboutMenu.IsEmpty()) + { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + } + } + + + g_mainDialog = this; +// statsTab.SetDialogBkColor(BGCOLOR,TEXTCOLOR); + + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + + // TODO: Add extra initialization here + + config_read(); + + statsTab.m_colSource0Width = m_colSource0Width; + statsTab.m_colStats0Width = m_colStats0Width; + statsTab.m_colStats1Width = m_colStats1Width; + statusTab.m_colStats0Width = m_colGStats0Width; + statusTab.m_colStats1Width = m_colGStats1Width; + statusTab.m_colStats2Width = m_colGStats2Width; + + + + configTab.Create(IDD_CONFIGDIALOG, this); + statsTab.Create(IDD_STATSDIALOG, this); + statusTab.Create(IDD_SSTATUS, this); + + int nPageID = 0; + m_MainTab.AddSSLPage (_T("Server Status"), nPageID, (CTabPageSSL *)&statusTab); + nPageID++; + m_MainTab.AddSSLPage (_T("Configuration"), nPageID, (CTabPageSSL *)&configTab); + nPageID++; + m_MainTab.AddSSLPage (_T("Stats"), nPageID, (CTabPageSSL *)&statsTab); + nPageID++; + + + labelFont.CreateFont(24,0, 0, 0, FW_BOLD, 0, 0, 0, 0, OUT_TT_PRECIS, 0, PROOF_QUALITY, 0, "Arial"); + + runningBitmap.LoadBitmap(IDB_BITMAP6); + stoppedBitmap.LoadBitmap(IDB_BITMAP5); + m_SS.SetFont(&labelFont, TRUE); + + UpdateData(FALSE); + + LoadConfig(); + + AddAnchor(IDC_MAINTAB, TOP_LEFT, BOTTOM_RIGHT); + AddAnchor(IDC_STATICBLACK, TOP_LEFT, TOP_RIGHT); + + EnableSaveRestore("icecast2win", "positions"); + + + + if (m_Autostart) { + OnStart(); + } + return TRUE; // return TRUE unless you set the focus to a control +} + +void CIcecast2winDlg::OnSysCommand(UINT nID, LPARAM lParam) +{ + if ((nID & 0xFFF0) == IDM_ABOUTBOX) + { + CAboutDlg dlgAbout; + dlgAbout.DoModal(); + } + else + { + CResizableDialog::OnSysCommand(nID, lParam); + } +} + +// If you add a minimize button to your dialog, you will need the code below +// to draw the icon. For MFC applications using the document/view model, +// this is automatically done for you by the framework. + +void CIcecast2winDlg::OnPaint() +{ + if (IsIconic()) + { + CPaintDC dc(this); // device context for painting + + SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); + + // Center icon in client rectangle + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // Draw the icon + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CResizableDialog::OnPaint(); + } +} + + +// The system calls this to obtain the cursor to display while the user drags +// the minimized window. +HCURSOR CIcecast2winDlg::OnQueryDragIcon() +{ + return (HCURSOR) m_hIcon; +} + +void CIcecast2winDlg::OnSelchangeMaintab(NMHDR* pNMHDR, LRESULT* pResult) +{ + // TODO: Add your control notification handler code here + + /* + if (m_MainTab.GetCurSel() == 0) { + EnableControl(IDC_NUMBER_CLIENTS); + EnableControl(IDC_SERVERSTATUS); + EnableControl(IDC_SOURCES_CONNECTED); + m_ConfigEditCtrl.ShowWindow(SW_HIDE); + m_StatsEditCtrl.ShowWindow(SW_HIDE); + } + if (m_MainTab.GetCurSel() == 99) { + DisableControl(IDC_NUMBER_CLIENTS); + DisableControl(IDC_SERVERSTATUS); + DisableControl(IDC_SOURCES_CONNECTED); + m_ConfigEditCtrl.ShowWindow(SW_HIDE); + m_StatsEditCtrl.ShowWindow(SW_HIDE); + } + if (m_MainTab.GetCurSel() == 99) { + DisableControl(IDC_NUMBER_CLIENTS); + DisableControl(IDC_SERVERSTATUS); + DisableControl(IDC_SOURCES_CONNECTED); + m_ConfigEditCtrl.ShowWindow(SW_HIDE); + m_StatsEditCtrl.ShowWindow(SW_HIDE); + } + if (m_MainTab.GetCurSel() == 1) { + DisableControl(IDC_NUMBER_CLIENTS); + DisableControl(IDC_SERVERSTATUS); + DisableControl(IDC_SOURCES_CONNECTED); + m_ConfigEditCtrl.ShowWindow(SW_SHOW); + m_StatsEditCtrl.ShowWindow(SW_HIDE); + LoadConfig(); + ParseConfig(); + } + if (m_MainTab.GetCurSel() == 2) { + DisableControl(IDC_NUMBER_CLIENTS); + DisableControl(IDC_SERVERSTATUS); + DisableControl(IDC_SOURCES_CONNECTED); + m_ConfigEditCtrl.ShowWindow(SW_HIDE); + m_StatsEditCtrl.ShowWindow(SW_SHOW); + if (global.running == ICE_RUNNING) { + CString statData; + for (int i=0;im_configFile, "r"); + if (filep) { + while (!feof(filep)) { + memset(buffer, '\000', sizeof(buffer)); + fgets(buffer, sizeof(buffer), filep); + if (strlen(buffer) > 0) { + char *p1 = strstr(buffer, "\r\n"); + if (p1) { + *p1 = '\000'; + } + else { + buffer[strlen(buffer)-1] = '\000'; + } + configTab.m_Config = configTab.m_Config + buffer; + configTab.m_Config += "\r\n"; + } + } + } + else { + configTab.m_Config = " \ +\r\n \ + Here and There\r\n\ + nobody@me.org\r\n\ + \r\n\ + 100\r\n\ + 2\r\n\ + 5\r\n\ + 30\r\n\ + 15\r\n\ + 10\r\n\ + \r\n\ + changeme\r\n\ + \r\n\ + 5\r\n\ + \r\n\ + yp.icecast.org\r\n\ + 15\r\n\ + \r\n\ + \r\n\ + 0.0.0.0\r\n\ + 8000\r\n\ + \r\n\ + ./\r\n\ + ./\r\n\ + ./webroot\r\n\ + \r\n\ + \r\n\ + access.log\r\n\ + error.log\r\n\ + \r\n\ +\r\n\ +"; + } + gConfigurationSave = configTab.m_Config; + configTab.UpdateData(FALSE); + +} + + +void CIcecast2winDlg::OnFileExit() +{ + // TODO: Add your command handler code here + + DestroyWindow(); +} + + +void CIcecast2winDlg::ParseConfig() +{ + char access[2046] = ""; + char error[2046] = ""; + char logdir[2046] = ""; + + memset(access, '\000', sizeof(access)); + memset(error, '\000', sizeof(error)); + memset(logdir, '\000', sizeof(logdir)); + + getTag(m_ConfigEdit.GetBuffer(0), "logdir", logdir); + getTag(m_ConfigEdit.GetBuffer(0), "accesslog", access); + getTag(m_ConfigEdit.GetBuffer(0), "errorlog", error); + + m_AccessLog = logdir; + m_AccessLog += access; + m_ErrorLog = logdir; + m_ErrorLog += error; + +} + +void CIcecast2winDlg::getTag(char *pbuf, char *ptag, char *dest) +{ + char openTag[256] = ""; + char closeTag[256] = ""; + + sprintf(openTag, "<%s>", ptag); + sprintf(closeTag, "", ptag); + + char *p1; + p1 = strstr(pbuf, openTag); + if (p1) { + p1 = p1 + strlen(openTag); + char *p2; + p2 = strstr(p1, closeTag); + if (p2) { + strncpy(dest, p1, p2-p1); + } + } +} + + +void CIcecast2winDlg::EnableControl(UINT control) +{ + CWnd *pWnd; + pWnd = GetDlgItem(control); + ::ShowWindow(pWnd->GetSafeHwnd(), SW_SHOW); +} + +void CIcecast2winDlg::DisableControl(UINT control) +{ + CWnd *pWnd; + pWnd = GetDlgItem(control); + ::ShowWindow(pWnd->GetSafeHwnd(), SW_HIDE); +} + + + +void CollectStats(stats_event_t *event) +{ + Element tempElement; + char tempSource[1024] = ""; + + tempElement.name = ""; + tempElement.value = ""; + +// memset(&tempElement, '\000', sizeof(tempElement)); + + if (event->name != NULL) { + //strcpy(tempElement.name, event->name); + tempElement.name = event->name; + } + if (event->value != NULL) { + //strcpy(tempElement.value, event->value); + tempElement.value = event->value; + } + if (event->source != NULL) { + strcpy(tempSource, event->source); + + } + + + int foundit = 0; + for (int i=0;iUpdateStatsLists(); + +} +bool g_collectingStats = false; + +void StartStats(void *dummy) +{ + while (global.running != ICE_RUNNING) { + Sleep(500); + } + while (global.running == ICE_RUNNING) { + if (global.running == ICE_RUNNING) { +// memset(&gStats, '\000', sizeof(gStats)); + for (int j=0;jserverStart)); + main(argc, (char **)argv); +// g_mainDialog->StopServer(); + global.running = ICE_HALTING; + _endthread(); + + +} +void CIcecast2winDlg::OnFileStartserver() +{ + // TODO: Add your command handler code here + CIcecast2winApp *myApp = (CIcecast2winApp *)AfxGetApp(); + + if (gConfigurationSave == "") { + gConfigurationSave = m_ConfigEdit; + } + + if (global.running == ICE_RUNNING) { + MessageBox("Server already running", "Error", MB_OK); + } + else { + m_ConfigEditCtrl.SetReadOnly(TRUE); + LoadConfig(); + ParseConfig(); + SetTimer(0, 500, NULL); + _beginthread(StartServer, 0, (void *)(LPCSTR)myApp->m_configFile); +// _beginthread(StartTailAccessLog, 0, (void *)0); +// _beginthread(StartTailErrorLog, 0, (void *)0); + // EDZ + _beginthread(StartStats, 0, (void *)CollectStats); + } +} + +void CIcecast2winDlg::OnFileStopserver() +{ + // TODO: Add your command handler code here + ; +} + +bool infocus = false; + +void CIcecast2winDlg::StopServer() +{ + KillTimer(0); + configTab.m_ConfigCtrl.SetReadOnly(FALSE); + global.running = ICE_HALTING; + m_StartButton.SetWindowText("Start Server"); + m_StartButton.SetState(0); + m_ServerStatusBitmap.SetBitmap(HBITMAP(stoppedBitmap)); + statusTab.m_RunningFor = "Not running"; + statusTab.UpdateData(FALSE); + + + +} + + +void CIcecast2winDlg::OnStart() +{ + CIcecast2winApp *myApp = (CIcecast2winApp *)AfxGetApp(); + + // TODO: Add your control notification handler code here + if (global.running == ICE_RUNNING) { + StopServer(); + } + else { + configTab.m_ConfigCtrl.SetReadOnly(TRUE); + ParseConfig(); + SetTimer(0, 500, NULL); + _beginthread(StartServer, 0, (void *)(LPCSTR)myApp->m_configFile); + // EDZ + _beginthread(StartStats, 0, (void *)CollectStats); + } + +} + +void CIcecast2winDlg::UpdateStatsLists() +{ + char item[1024] = ""; + int l = 0; + + for (int i=0;i 0) { + + for (k=0;k < statsTab.m_SourceListCtrl.GetItemCount();k++) { + + statsTab.m_SourceListCtrl.GetItemText(k, 0, item, sizeof(item)); + if (!strcmp(gStats[i].source, item)) { + inthere = 1; + break; + } + } + if (!inthere) { + if (gStats[i].source != "") { + LVITEM lvi; + + lvi.mask = LVIF_IMAGE | LVIF_TEXT; + lvi.iItem = statsTab.m_SourceListCtrl.GetItemCount(); + lvi.iSubItem = 0; + lvi.pszText = (LPTSTR)(LPCTSTR)gStats[i].source; + statsTab.m_SourceListCtrl.InsertItem(&lvi); + } + } + int nItemSelected = statsTab.m_SourceListCtrl.GetSelectionMark(); + if (nItemSelected != -1) { + memset(item, '\000', sizeof(item)); + statsTab.m_SourceListCtrl.GetItemText(nItemSelected, 0, item, sizeof(item)); + if (!strcmp(gStats[i].source, item)) { + for (int l=0;l 1000 +#pragma once +#endif // _MSC_VER > 1000 + +///////////////////////////////////////////////////////////////////////////// +// CIcecast2winDlg dialog + +class CIcecast2winDlg : public CResizableDialog +{ +// Construction +public: + time_t serverStart; + void config_read(); + void config_write(); + void UpdateStatsLists(); + CConfigTab configTab; + CStatsTab statsTab; + CStatus statusTab; + int m_colSource0Width; + int m_colStats0Width; + int m_colStats1Width; + int m_colGStats0Width; + int m_colGStats1Width; + int m_colGStats2Width; + CFont labelFont; + CBitmap runningBitmap; + CBitmap stoppedBitmap; + + + + void StopServer(); + bool m_isRunning; + void DisableControl(UINT control); + void EnableControl(UINT control); + void getTag(char *pbuf, char *ptag, char *dest); + CString m_ErrorLog; + CString m_AccessLog; + void ParseConfig(); + void LoadConfig(); + CIcecast2winDlg(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CIcecast2winDlg) + enum { IDD = IDD_ICECAST2WIN_DIALOG }; + CStatic m_SS; + CStatic m_ServerStatusBitmap; + CStatic m_iceLogo; + CButton m_StartButton; + CEdit m_StatsEditCtrl; + CEdit m_ConfigEditCtrl; + CEdit m_ErrorEditCtrl; + CEdit m_AccessEditCtrl; + CTabCtrlSSL m_MainTab; + CString m_AccessEdit; + CString m_ErrorEdit; + CString m_ConfigEdit; + CString m_ServerStatus; + CString m_SourcesConnected; + CString m_NumClients; + FILE *filep_accesslog; + FILE *filep_errorlog; + CString m_StatsEdit; + BOOL m_Autostart; + //}}AFX_DATA + + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CIcecast2winDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + HICON m_hIcon; + + // Generated message map functions + //{{AFX_MSG(CIcecast2winDlg) + virtual BOOL OnInitDialog(); + afx_msg void OnSysCommand(UINT nID, LPARAM lParam); + afx_msg void OnPaint(); + afx_msg HCURSOR OnQueryDragIcon(); + afx_msg void OnSelchangeMaintab(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnFileExit(); + afx_msg void OnTimer(UINT nIDEvent); + afx_msg void OnFileStartserver(); + afx_msg void OnFileStopserver(); + afx_msg void OnStart(); + afx_msg void OnClose(); + afx_msg void OnSize(UINT nType, int cx, int cy); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_ICECAST2WINDLG_H__23B4DA8B_C9BC_49C8_A62C_37FC6BC5E54A__INCLUDED_) diff --git a/win32/ResizableDialog.cpp b/win32/ResizableDialog.cpp new file mode 100644 index 00000000..f56972f4 --- /dev/null +++ b/win32/ResizableDialog.cpp @@ -0,0 +1,442 @@ +// ResizableDialog.cpp : implementation file +// +///////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2000 by Paolo Messina +// (ppescher@yahoo.com) +// +// Free for non-commercial use. +// You may change the code to your needs, +// provided that credits to the original +// author is given in the modified files. +// +///////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "ResizableDialog.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CResizableDialog + +inline void CResizableDialog::Construct() +{ + m_bInitDone = FALSE; + + m_bUseMinTrack = TRUE; + m_bUseMaxTrack = FALSE; + m_bUseMaxRect = FALSE; + + m_bShowGrip = TRUE; + + m_bEnableSaveRestore = FALSE; + + m_szGripSize.cx = GetSystemMetrics(SM_CXVSCROLL); + m_szGripSize.cy = GetSystemMetrics(SM_CYHSCROLL); +} + +CResizableDialog::CResizableDialog() +{ + Construct(); +} + +CResizableDialog::CResizableDialog(UINT nIDTemplate, CWnd* pParentWnd) + : CDialog(nIDTemplate, pParentWnd) +{ + Construct(); +} + +CResizableDialog::CResizableDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd) + : CDialog(lpszTemplateName, pParentWnd) +{ + Construct(); +} + +CResizableDialog::~CResizableDialog() +{ + // for safety + m_arrLayout.RemoveAll(); +} + + +BEGIN_MESSAGE_MAP(CResizableDialog, CDialog) + //{{AFX_MSG_MAP(CResizableDialog) + ON_WM_NCHITTEST() + ON_WM_GETMINMAXINFO() + ON_WM_SIZE() + ON_WM_DESTROY() + ON_WM_PAINT() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CResizableDialog message handlers + + +BOOL CResizableDialog::OnInitDialog() +{ + CDialog::OnInitDialog(); + + UpdateGripPos(); + + // gets the template size as the min track size + CRect rc; + GetWindowRect(&rc); + m_ptMinTrackSize.x = rc.Width(); + m_ptMinTrackSize.y = rc.Height(); + + m_bInitDone = TRUE; + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CResizableDialog::OnDestroy() +{ + CDialog::OnDestroy(); + + if (m_bEnableSaveRestore) + SaveWindowRect(); + + // remove old windows + m_arrLayout.RemoveAll(); +} + +void CResizableDialog::OnPaint() +{ + CPaintDC dc(this); // device context for painting + + if (m_bShowGrip && !IsZoomed()) + { + // draw size-grip + dc.DrawFrameControl(&m_rcGripRect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP); + } +} + +void CResizableDialog::OnSize(UINT nType, int cx, int cy) +{ + CWnd::OnSize(nType, cx, cy); + + if (nType == SIZE_MAXHIDE || nType == SIZE_MAXSHOW) + return; // arrangement not needed + + if (m_bInitDone) + { + ArrangeLayout(); + } +} + +UINT CResizableDialog::OnNcHitTest(CPoint point) +{ + CPoint pt = point; + ScreenToClient(&pt); + + // if in size grip and in client area + if (m_bShowGrip && m_rcGripRect.PtInRect(pt) && + pt.x >= 0 && pt.y >= 0) + return HTBOTTOMRIGHT; + + return CDialog::OnNcHitTest(point); +} + +void CResizableDialog::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) +{ + if (!m_bInitDone) + return; + + if (m_bUseMinTrack) + lpMMI->ptMinTrackSize = m_ptMinTrackSize; + + if (m_bUseMaxTrack) + lpMMI->ptMaxTrackSize = m_ptMaxTrackSize; + + if (m_bUseMaxRect) + { + lpMMI->ptMaxPosition = m_ptMaxPos; + lpMMI->ptMaxSize = m_ptMaxSize; + } +} + +// layout functions + +void CResizableDialog::AddAnchor(HWND wnd, CSize tl_type, CSize br_type) +{ + ASSERT(wnd != NULL && ::IsWindow(wnd)); + ASSERT(::IsChild(*this, wnd)); + ASSERT(tl_type != NOANCHOR); + + // get control's window class + + CString st; + GetClassName(wnd, st.GetBufferSetLength(MAX_PATH), MAX_PATH); + st.ReleaseBuffer(); + st.MakeUpper(); + + // add the style 'clipsiblings' to a GroupBox + // to avoid unnecessary repainting of controls inside + if (st == "BUTTON") + { + DWORD style = GetWindowLong(wnd, GWL_STYLE); + if (style & BS_GROUPBOX) + SetWindowLong(wnd, GWL_STYLE, style | WS_CLIPSIBLINGS); + } + + // wnd classes that don't redraw client area correctly + // when the hor scroll pos changes due to a resizing + BOOL hscroll = FALSE; + if (st == "LISTBOX") + hscroll = TRUE; + + // wnd classes that need refresh when resized + BOOL refresh = FALSE; + if (st == "STATIC") + { + DWORD style = GetWindowLong(wnd, GWL_STYLE); + + switch (style & SS_TYPEMASK) + { + case SS_LEFT: + case SS_CENTER: + case SS_RIGHT: + // word-wrapped text needs refresh + refresh = TRUE; + } + + // centered images or text need refresh + if (style & SS_CENTERIMAGE) + refresh = TRUE; + + // simple text never needs refresh + if (style & SS_TYPEMASK == SS_SIMPLE) + refresh = FALSE; + } + + // get dialog's and control's rect + CRect wndrc, objrc; + + GetClientRect(&wndrc); + ::GetWindowRect(wnd, &objrc); + ScreenToClient(&objrc); + + CSize tl_margin, br_margin; + + if (br_type == NOANCHOR) + br_type = tl_type; + + // calculate margin for the top-left corner + + tl_margin.cx = objrc.left - wndrc.Width() * tl_type.cx / 100; + tl_margin.cy = objrc.top - wndrc.Height() * tl_type.cy / 100; + + // calculate margin for the bottom-right corner + + br_margin.cx = objrc.right - wndrc.Width() * br_type.cx / 100; + br_margin.cy = objrc.bottom - wndrc.Height() * br_type.cy / 100; + + // add to the list + Layout obj(wnd, tl_type, tl_margin, br_type, br_margin, hscroll, refresh); + m_arrLayout.Add(obj); +} + +void CResizableDialog::ArrangeLayout() +{ + // update size-grip + InvalidateRect(&m_rcGripRect); + UpdateGripPos(); + InvalidateRect(&m_rcGripRect); + + // init some vars + CRect wndrc; + GetClientRect(&wndrc); + + int i, count = m_arrLayout.GetSize(); + HDWP hdwp = BeginDeferWindowPos(count); + + for (i=0; iGetWindowRect(&objrc); + ScreenToClient(&objrc); + + // calculate new top-left corner + + newrc.left = obj.tl_margin.cx + wndrc.Width() * obj.tl_type.cx / 100; + newrc.top = obj.tl_margin.cy + wndrc.Height() * obj.tl_type.cy / 100; + + // calculate new bottom-right corner + + newrc.right = obj.br_margin.cx + wndrc.Width() * obj.br_type.cx / 100; + newrc.bottom = obj.br_margin.cy + wndrc.Height() * obj.br_type.cy / 100; + + if (!newrc.EqualRect(&objrc)) + { + if (obj.adj_hscroll) + { + // needs repainting, due to horiz scrolling + int diff = newrc.Width() - objrc.Width(); + int max = wnd->GetScrollLimit(SB_HORZ); + + obj.need_refresh = FALSE; + if (max > 0 && wnd->GetScrollPos(SB_HORZ) > max - diff) + { + obj.need_refresh = TRUE; + } + } + + // set flags + DWORD flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREPOSITION; + if (newrc.TopLeft() == objrc.TopLeft()) + flags |= SWP_NOMOVE; + if (newrc.Size() == objrc.Size()) + flags |= SWP_NOSIZE; + + DeferWindowPos(hdwp, obj.hwnd, NULL, newrc.left, newrc.top, + newrc.Width(), newrc.Height(), flags); + } + } + // go re-arrange child windows + EndDeferWindowPos(hdwp); + + // refresh those that need + for (i=0; iInvalidate(); + wnd->UpdateWindow(); + } + } +} + +void CResizableDialog::UpdateGripPos() +{ + // size-grip goes bottom right in the client area + + GetClientRect(&m_rcGripRect); + + m_rcGripRect.left = m_rcGripRect.right - m_szGripSize.cx; + m_rcGripRect.top = m_rcGripRect.bottom - m_szGripSize.cy; +} + +// protected members + +void CResizableDialog::ShowSizeGrip(BOOL bShow) +{ + if (m_bShowGrip != bShow) + { + m_bShowGrip = bShow; + InvalidateRect(&m_rcGripRect); + } +} + +void CResizableDialog::SetMaximizedRect(const CRect& rc) +{ + m_bUseMaxRect = TRUE; + + m_ptMaxPos = rc.TopLeft(); + m_ptMaxSize.x = rc.Width(); + m_ptMaxSize.y = rc.Height(); +} + +void CResizableDialog::ResetMaximizedRect() +{ + m_bUseMaxRect = FALSE; +} + +void CResizableDialog::SetMinTrackSize(const CSize& size) +{ + m_bUseMinTrack = TRUE; + + m_ptMinTrackSize.x = size.cx; + m_ptMinTrackSize.y = size.cy; +} + +void CResizableDialog::ResetMinTrackSize() +{ + m_bUseMinTrack = FALSE; +} + +void CResizableDialog::SetMaxTrackSize(const CSize& size) +{ + m_bUseMaxTrack = TRUE; + + m_ptMaxTrackSize.x = size.cx; + m_ptMaxTrackSize.y = size.cy; +} + +void CResizableDialog::ResetMaxTrackSize() +{ + m_bUseMaxTrack = FALSE; +} + +// NOTE: this must be called after all the other settings +// to have the dialog and its controls displayed properly +void CResizableDialog::EnableSaveRestore(LPCTSTR pszSection, LPCTSTR pszEntry) +{ + m_sSection = pszSection; + m_sEntry = pszEntry; + + m_bEnableSaveRestore = TRUE; + + LoadWindowRect(); +} + + +// used to save/restore window's size and position +// either in the registry or a private .INI file +// depending on your application settings + +#define PROFILE_FMT _T("%d,%d,%d,%d,%d,%d") + +void CResizableDialog::SaveWindowRect() +{ + CString data; + WINDOWPLACEMENT wp; + + ZeroMemory(&wp, sizeof(WINDOWPLACEMENT)); + wp.length = sizeof(WINDOWPLACEMENT); + GetWindowPlacement(&wp); + + RECT& rc = wp.rcNormalPosition; // alias + + data.Format(PROFILE_FMT, rc.left, rc.top, + rc.right, rc.bottom, wp.showCmd, wp.flags); + + AfxGetApp()->WriteProfileString(m_sSection, m_sEntry, data); +} + +void CResizableDialog::LoadWindowRect() +{ + CString data; + WINDOWPLACEMENT wp; + + data = AfxGetApp()->GetProfileString(m_sSection, m_sEntry); + + if (data.IsEmpty()) // never saved before + return; + + ZeroMemory(&wp, sizeof(WINDOWPLACEMENT)); + wp.length = sizeof(WINDOWPLACEMENT); + GetWindowPlacement(&wp); + + RECT& rc = wp.rcNormalPosition; // alias + + if (_stscanf(data, PROFILE_FMT, &rc.left, &rc.top, + &rc.right, &rc.bottom, &wp.showCmd, &wp.flags) == 6) + { + SetWindowPlacement(&wp); + } +} diff --git a/win32/ResizableDialog.h b/win32/ResizableDialog.h new file mode 100644 index 00000000..89c5b29d --- /dev/null +++ b/win32/ResizableDialog.h @@ -0,0 +1,173 @@ +#if !defined(AFX_RESIZABLEDIALOG_H__INCLUDED_) +#define AFX_RESIZABLEDIALOG_H__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +// ResizableDialog.h : header file +// +///////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2000 by Paolo Messina +// (ppescher@yahoo.com) +// +// Free for non-commercial use. +// You may change the code to your needs, +// provided that credits to the original +// author is given in the modified files. +// +///////////////////////////////////////////////////////////////////////////// + +#include +#include + +// useful compatibility constants (the only one required is NOANCHOR) + +#if !defined(__SIZE_ANCHORS_) +#define __SIZE_ANCHORS_ + +const CSize + NOANCHOR(-1,-1), + TOP_LEFT(0,0), TOP_CENTER(50,0), TOP_RIGHT(100,0), + MIDDLE_LEFT(0,50), MIDDLE_CENTER(50,50), MIDDLE_RIGHT(100,50), + BOTTOM_LEFT(0,100), BOTTOM_CENTER(50,100), BOTTOM_RIGHT(100,100); + +#endif // !defined(__SIZE_ANCHORS_) + +///////////////////////////////////////////////////////////////////////////// +// CResizableDialog window + +class CResizableDialog : public CDialog +{ + +// Construction +public: + CResizableDialog(); + CResizableDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL); + CResizableDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL); + +// Attributes +private: + // flags + BOOL m_bShowGrip; + BOOL m_bUseMaxTrack; + BOOL m_bUseMinTrack; + BOOL m_bUseMaxRect; + BOOL m_bEnableSaveRestore; + + // internal status + CString m_sSection; // section name and + CString m_sEntry; // entry for save/restore + + BOOL m_bInitDone; // if all internal vars initialized + + SIZE m_szGripSize; // set at construction time + + CRect m_rcGripRect; // current pos of grip + + POINT m_ptMinTrackSize; // min tracking size + POINT m_ptMaxTrackSize; // max tracking size + POINT m_ptMaxPos; // maximized position + POINT m_ptMaxSize; // maximized size + + class Layout + { + public: + HWND hwnd; + + BOOL adj_hscroll; + BOOL need_refresh; + + // upper-left corner + CSize tl_type; + CSize tl_margin; + + // bottom-right corner + CSize br_type; + CSize br_margin; + + public: + Layout() + : hwnd(NULL), adj_hscroll(FALSE), need_refresh(FALSE), + tl_type(0,0), tl_margin(0,0), + br_type(0,0), br_margin(0,0) + { + }; + + Layout(HWND hw, SIZE tl_t, SIZE tl_m, + SIZE br_t, SIZE br_m, BOOL hscroll, BOOL refresh) + { + hwnd = hw; + + adj_hscroll = hscroll; + need_refresh = refresh; + + tl_type = tl_t; + tl_margin = tl_m; + + br_type = br_t; + br_margin = br_m; + }; + }; + + CArray m_arrLayout; // list of repositionable controls + +// Operations +public: + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CResizableDialog) + //}}AFX_VIRTUAL + +// Implementation +public: + virtual ~CResizableDialog(); + +// used internally +private: + void Construct(); + void LoadWindowRect(); + void SaveWindowRect(); + void ArrangeLayout(); + void UpdateGripPos(); + +// callable from derived classes +//protected: +public: + void AddAnchor(HWND wnd, CSize tl_type, + CSize br_type = NOANCHOR); // add anchors to a control + void AddAnchor(UINT ctrl_ID, CSize tl_type, + CSize br_type = NOANCHOR) // add anchors to a control + { + AddAnchor(::GetDlgItem(*this, ctrl_ID), tl_type, br_type); + }; + void ShowSizeGrip(BOOL bShow); // show or hide the size grip + void SetMaximizedRect(const CRect& rc); // set window rect when maximized + void ResetMaximizedRect(); // reset to default maximized rect + void SetMinTrackSize(const CSize& size); // set minimum tracking size + void ResetMinTrackSize(); // reset to default minimum tracking size + void SetMaxTrackSize(const CSize& size); // set maximum tracking size + void ResetMaxTrackSize(); // reset to default maximum tracking size + void EnableSaveRestore(LPCTSTR pszSection, LPCTSTR pszEntry); // section and entry in app's profile + +// Generated message map functions +protected: + //{{AFX_MSG(CResizableDialog) + virtual BOOL OnInitDialog(); + afx_msg UINT OnNcHitTest(CPoint point); + afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI); + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnDestroy(); + afx_msg void OnPaint(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_RESIZABLEDIALOG_H__INCLUDED_) \ No newline at end of file diff --git a/win32/StatsTab.cpp b/win32/StatsTab.cpp new file mode 100644 index 00000000..15a85c7b --- /dev/null +++ b/win32/StatsTab.cpp @@ -0,0 +1,148 @@ +// StatsTab.cpp : implementation file +// + +#include "stdafx.h" +#include "Icecast2win.h" +#include "StatsTab.h" + +#include "Icecast2winDlg.h" + +extern CIcecast2winDlg *g_mainDialog; + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +extern void AddToAdditionalGlobalStats(CString source, CString name); + +///////////////////////////////////////////////////////////////////////////// +// CStatsTab dialog + + +CStatsTab::CStatsTab(CWnd* pParent /*=NULL*/) + : CTabPageSSL(CStatsTab::IDD, pParent) +{ + //{{AFX_DATA_INIT(CStatsTab) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT +} + + +void CStatsTab::DoDataExchange(CDataExchange* pDX) +{ + CTabPageSSL::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CStatsTab) + DDX_Control(pDX, IDC_STATIC_SLS, m_SLS); + DDX_Control(pDX, IDC_STATSLIST, m_StatsListCtrl); + DDX_Control(pDX, IDC_SOURCELIST, m_SourceListCtrl); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CStatsTab, CTabPageSSL) + //{{AFX_MSG_MAP(CStatsTab) + ON_NOTIFY(NM_DBLCLK, IDC_SOURCELIST, OnDblclkSourcelist) + ON_NOTIFY(NM_RCLICK, IDC_STATSLIST, OnRclickStatslist) + ON_NOTIFY(NM_CLICK, IDC_SOURCELIST, OnClickSourcelist) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CStatsTab message handlers + +BOOL CStatsTab::OnInitDialog() +{ + CTabPageSSL::OnInitDialog(); + + // TODO: Add extra initialization here + m_SourceListCtrl.InsertColumn(0, _T("Source"), LVCFMT_LEFT, m_colSource0Width); + m_StatsListCtrl.InsertColumn(0, _T("Statistic"), LVCFMT_LEFT, m_colStats0Width); + m_StatsListCtrl.InsertColumn(1, _T("Value"), LVCFMT_LEFT, m_colStats1Width); + + AddAnchor(IDC_STATSLIST, TOP_LEFT, BOTTOM_RIGHT); + AddAnchor(IDC_SOURCELIST, TOP_LEFT, BOTTOM_LEFT); + AddAnchor(IDC_FILLER1, BOTTOM_LEFT, BOTTOM_RIGHT); + + m_SourceListCtrl.SetSelectionMark(0); + m_SLS.SetFont(&(g_mainDialog->labelFont), TRUE); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CStatsTab::OnDblclkSourcelist(NMHDR* pNMHDR, LRESULT* pResult) +{ + // TODO: Add your control notification handler code here + g_mainDialog->UpdateStatsLists(); + *pResult = 0; +} + +void CStatsTab::OnRclickStatslist(NMHDR* pNMHDR, LRESULT* pResult) +{ + // TODO: Add your control notification handler code here + CMenu menu; + + + CPoint point; + ::GetCursorPos(&point); //where is the mouse? + + DWORD dwSelectionMade; + menu.LoadMenu(IDR_MENU2); + CMenu *pmenuPopup = menu.GetSubMenu(0); + dwSelectionMade = pmenuPopup->TrackPopupMenu( (TPM_LEFTALIGN|TPM_LEFTBUTTON| + TPM_NONOTIFY|TPM_RETURNCMD), + point.x, point.y, this); + + pmenuPopup->DestroyMenu(); + char msg[255] =""; + char buffer[1024] = ""; + char buffer2[1024] = ""; + + CString name; + CString source; + POSITION pos; + switch (dwSelectionMade) { + case ID_POPUP_ADDTOGLOBALSTATLIST : + pos = m_StatsListCtrl.GetFirstSelectedItemPosition(); + if (pos != NULL) { + int nItem = m_StatsListCtrl.GetNextSelectedItem(pos); + LVITEM lvi; + + lvi.mask = LVIF_TEXT; + lvi.iItem = nItem; + lvi.iSubItem = 0; + lvi.pszText = buffer; + lvi.cchTextMax = sizeof(buffer); + m_StatsListCtrl.GetItem(&lvi); + name = buffer; + } + pos = m_SourceListCtrl.GetFirstSelectedItemPosition(); + if (pos != NULL) { + int nItem = m_SourceListCtrl.GetNextSelectedItem(pos); + LVITEM lvi; + + lvi.mask = LVIF_TEXT; + lvi.iItem = nItem; + lvi.iSubItem = 0; + lvi.pszText = buffer2; + lvi.cchTextMax = sizeof(buffer2); + m_SourceListCtrl.GetItem(&lvi); + source = buffer2; + } + AddToAdditionalGlobalStats(source, name); + break; + default : + break; + } + + *pResult = 0; +} + +void CStatsTab::OnClickSourcelist(NMHDR* pNMHDR, LRESULT* pResult) +{ + // TODO: Add your control notification handler code here + OnDblclkSourcelist(pNMHDR, pResult); + *pResult = 0; +} diff --git a/win32/StatsTab.h b/win32/StatsTab.h new file mode 100644 index 00000000..e5fac45d --- /dev/null +++ b/win32/StatsTab.h @@ -0,0 +1,55 @@ +#if !defined(AFX_STATSTAB_H__64B82CAB_8D6D_45A6_84FD_666F6317E5F2__INCLUDED_) +#define AFX_STATSTAB_H__64B82CAB_8D6D_45A6_84FD_666F6317E5F2__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// StatsTab.h : header file +// +#include "TabPageSSL.h" + +///////////////////////////////////////////////////////////////////////////// +// CStatsTab dialog + +class CStatsTab : public CTabPageSSL +{ +// Construction +public: + int m_colStats1Width; + int m_colStats0Width; + int m_colSource0Width; + CStatsTab(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CStatsTab) + enum { IDD = IDD_STATSDIALOG }; + CStatic m_SLS; + CListCtrl m_StatsListCtrl; + CListCtrl m_SourceListCtrl; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CStatsTab) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(CStatsTab) + virtual BOOL OnInitDialog(); + afx_msg void OnDblclkSourcelist(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnRclickStatslist(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnClickSourcelist(NMHDR* pNMHDR, LRESULT* pResult); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STATSTAB_H__64B82CAB_8D6D_45A6_84FD_666F6317E5F2__INCLUDED_) diff --git a/win32/Status.cpp b/win32/Status.cpp new file mode 100644 index 00000000..919edf8e --- /dev/null +++ b/win32/Status.cpp @@ -0,0 +1,136 @@ +// Status.cpp : implementation file +// + +#include "stdafx.h" +#include "Icecast2win.h" +#include "Status.h" + +#include "Icecast2winDlg.h" + +extern CIcecast2winDlg *g_mainDialog; + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +extern void RemoveFromAdditionalGlobalStats(CString source, CString name); + +///////////////////////////////////////////////////////////////////////////// +// CStatus dialog + + +CStatus::CStatus(CWnd* pParent /*=NULL*/) + : CTabPageSSL(CStatus::IDD, pParent) +{ + //{{AFX_DATA_INIT(CStatus) + m_Clients = _T(""); + m_Sources = _T(""); + m_RunningFor = _T(""); + //}}AFX_DATA_INIT +} + + +void CStatus::DoDataExchange(CDataExchange* pDX) +{ + CTabPageSSL::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CStatus) + DDX_Control(pDX, IDC_STATIC_GS, m_GS); + DDX_Control(pDX, IDC_GLOBALSTAT_LIST, m_GlobalStatList); + DDX_Text(pDX, IDC_RUNNINGFOR, m_RunningFor); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CStatus, CTabPageSSL) + //{{AFX_MSG_MAP(CStatus) + ON_NOTIFY(NM_RCLICK, IDC_GLOBALSTAT_LIST, OnRclickGlobalstatList) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CStatus message handlers + +BOOL CStatus::OnInitDialog() +{ + CTabPageSSL::OnInitDialog(); + + + m_GlobalStatList.InsertColumn(0, _T("Stat Type"), LVCFMT_LEFT, m_colStats0Width); + m_GlobalStatList.InsertColumn(1, _T("Name"), LVCFMT_LEFT, m_colStats1Width); + m_GlobalStatList.InsertColumn(2, _T("Value"), LVCFMT_LEFT, m_colStats2Width); + + m_GlobalStatList.SetExtendedStyle(LVS_EX_FULLROWSELECT); + // TODO: Add extra initialization here + AddAnchor(IDC_FILLER2, BOTTOM_LEFT, BOTTOM_RIGHT); + AddAnchor(IDC_GLOBALSTAT_LIST, TOP_LEFT, BOTTOM_RIGHT); + AddAnchor(IDC_STATIC_RUN, BOTTOM_LEFT, BOTTOM_RIGHT); + AddAnchor(IDC_RUNNINGFOR, BOTTOM_LEFT, BOTTOM_RIGHT); + + m_GS.SetFont(&(g_mainDialog->labelFont), TRUE); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CStatus::OnRclickGlobalstatList(NMHDR* pNMHDR, LRESULT* pResult) +{ + // TODO: Add your control notification handler code here + CMenu menu; + + + CPoint point; + ::GetCursorPos(&point); //where is the mouse? + + DWORD dwSelectionMade; + menu.LoadMenu(IDR_MENU3); + CMenu *pmenuPopup = menu.GetSubMenu(0); + dwSelectionMade = pmenuPopup->TrackPopupMenu( (TPM_LEFTALIGN|TPM_LEFTBUTTON| + TPM_NONOTIFY|TPM_RETURNCMD), + point.x, point.y, this); + + pmenuPopup->DestroyMenu(); + char msg[255] =""; + char buffer[1024] = ""; + char buffer2[1024] = ""; + + CString name; + CString source; + POSITION pos; + int nItem; + switch (dwSelectionMade) { + case ID__DELETEFROMGLOBALSTATS : + pos = m_GlobalStatList.GetFirstSelectedItemPosition(); + if (pos != NULL) { + nItem = m_GlobalStatList.GetNextSelectedItem(pos); + LVITEM lvi; + + lvi.mask = LVIF_TEXT; + lvi.iItem = nItem; + lvi.iSubItem = 0; + lvi.pszText = buffer; + lvi.cchTextMax = sizeof(buffer); + m_GlobalStatList.GetItem(&lvi); + source = buffer; + lvi.iSubItem = 1; + lvi.pszText = buffer2; + lvi.cchTextMax = sizeof(buffer2); + m_GlobalStatList.GetItem(&lvi); + name = buffer2; + + if (source == "Global Stat") { + MessageBox("Sorry, but you can't delete this type of stat", NULL, MB_OK); + } + else { + RemoveFromAdditionalGlobalStats(source, name); + m_GlobalStatList.DeleteItem(nItem); + } + } + break; + default : + break; + } + + *pResult = 0; +} diff --git a/win32/Status.h b/win32/Status.h new file mode 100644 index 00000000..83605728 --- /dev/null +++ b/win32/Status.h @@ -0,0 +1,59 @@ +#if !defined(AFX_STATUS_H__DE59E22B_FD4F_4131_B347_48BD9FAC9348__INCLUDED_) +#define AFX_STATUS_H__DE59E22B_FD4F_4131_B347_48BD9FAC9348__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// Status.h : header file +// +#include "TabPageSSL.h" + +///////////////////////////////////////////////////////////////////////////// +// CStatus dialog + +class CStatus : public CTabPageSSL +{ +// Construction +public: + int m_colStats2Width; + int m_colStats1Width; + int m_colStats0Width; + CFont labelFont; + CStatus(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + CBitmap runningBitmap; + CBitmap stoppedBitmap; + + //{{AFX_DATA(CStatus) + enum { IDD = IDD_SSTATUS }; + CStatic m_GS; + CListCtrl m_GlobalStatList; + CString m_Clients; + CString m_Sources; + CString m_RunningFor; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CStatus) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(CStatus) + virtual BOOL OnInitDialog(); + afx_msg void OnRclickGlobalstatList(NMHDR* pNMHDR, LRESULT* pResult); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STATUS_H__DE59E22B_FD4F_4131_B347_48BD9FAC9348__INCLUDED_) diff --git a/win32/StdAfx.cpp b/win32/StdAfx.cpp new file mode 100644 index 00000000..915c805f --- /dev/null +++ b/win32/StdAfx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// Icecast2win.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + + + diff --git a/win32/StdAfx.h b/win32/StdAfx.h new file mode 100644 index 00000000..06cf6ba6 --- /dev/null +++ b/win32/StdAfx.h @@ -0,0 +1,27 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__2C2EF8C3_43CD_47D2_A979_EC36873E602D__INCLUDED_) +#define AFX_STDAFX_H__2C2EF8C3_43CD_47D2_A979_EC36873E602D__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers + +#include // MFC core and standard components +#include // MFC extensions +#include // MFC Automation classes +#include // MFC support for Internet Explorer 4 Common Controls +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC support for Windows Common Controls +#endif // _AFX_NO_AFXCMN_SUPPORT + + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__2C2EF8C3_43CD_47D2_A979_EC36873E602D__INCLUDED_) diff --git a/win32/TabCtrlSSL.cpp b/win32/TabCtrlSSL.cpp new file mode 100644 index 00000000..1d1eae29 --- /dev/null +++ b/win32/TabCtrlSSL.cpp @@ -0,0 +1,499 @@ +// TabCtrlSSL.cpp : implementation file +// + +#include "stdafx.h" +#include "TabCtrlSSL.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// Construction + +CTabCtrlSSL::CTabCtrlSSL () { +#ifndef _AFX_NO_OCC_SUPPORT + AfxEnableControlContainer (); +#endif // !_AFX_NO_OCC_SUPPORT +} + +///////////////////////////////////////////////////////////////////////////// +// Destruction + +CTabCtrlSSL::~CTabCtrlSSL (void) { +} + +BEGIN_MESSAGE_MAP(CTabCtrlSSL, CTabCtrl) + //{{AFX_MSG_MAP(CTabCtrlSSL) + ON_WM_DESTROY () + ON_WM_SETFOCUS () + ON_WM_KILLFOCUS () + ON_NOTIFY_REFLECT (TCN_SELCHANGING, OnSelChanging) + ON_NOTIFY_REFLECT (TCN_SELCHANGE, OnSelChange) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// Page Functions + +int CTabCtrlSSL::AddSSLPage (LPCTSTR pszTitle, int nPageID, CTabPageSSL* pTabPage) { + // Add a page to the tab control. + TabDelete tabDelete; + tabDelete.pTabPage = pTabPage; + tabDelete.bDelete = FALSE; + + return AddPage (pszTitle, nPageID, tabDelete); +} + +int CTabCtrlSSL::AddSSLPage (LPCTSTR pszTitle, int nPageID, LPCTSTR pszTemplateName) { + // Verify that the dialog template is compatible with CTabCtrlSSL + // (debug builds only). If your app asserts here, make sure the dialog + // resource you're adding to the view is a borderless child window and + // is not marked visible. +#ifdef _DEBUG + if (pszTemplateName != NULL) { + BOOL bResult = CheckDialogTemplate (pszTemplateName); + ASSERT (bResult); + } +#endif // _DEBUG + + // Add a page to the tab control. + // Create a modeless dialog box. + CTabPageSSL* pDialog = new CTabPageSSL; + + if (pDialog == NULL) { + return -1; + } + + if (!pDialog->Create (pszTemplateName, this)) { + pDialog->DestroyWindow (); + delete pDialog; + return -1; + } + + TabDelete tabDelete; + tabDelete.pTabPage = pDialog; + tabDelete.bDelete = TRUE; + + return AddPage (pszTitle, nPageID, tabDelete); +} + +int CTabCtrlSSL::AddSSLPage (LPCTSTR pszTitle, int nPageID, int nTemplateID) { + return AddSSLPage (pszTitle, nPageID, MAKEINTRESOURCE (nTemplateID)); +} + +BOOL CTabCtrlSSL::RemoveSSLPage (int nIndex) { + if (nIndex >= GetItemCount ()) + return FALSE; + + // Notify derived classes that the page is being destroyed. + OnDestroyPage (nIndex, m_nPageIDs[nIndex]); + + // Switch pages if the page being deleted is the current page and it's + // not the only remaining page. + int nCount = GetItemCount (); + if (nCount > 1 && nIndex == GetCurSel ()) { + int nPage = nIndex + 1; + if (nPage >= nCount) + nPage = nCount - 2; + ActivateSSLPage (nPage); + } + + // Remove the page from the tab control. + DeleteItem (nIndex); + + // Destroy the dialog (if any) that represents the page. + TabDelete tabDelete = m_tabs[nIndex]; + CTabPageSSL* pDialog = tabDelete.pTabPage; + if (pDialog != NULL) { + pDialog->DestroyWindow (); + delete pDialog; + } + + // Clean up, repaint, and return. + m_tabs.RemoveAt (nIndex); + m_hFocusWnd.RemoveAt (nIndex); + m_nPageIDs.RemoveAt (nIndex); + Invalidate (); + return TRUE; +} + +int CTabCtrlSSL::GetSSLPageCount (void) { + return GetItemCount (); +} + +BOOL CTabCtrlSSL::GetSSLPageTitle (int nIndex, CString &strTitle) { + if (nIndex >= GetItemCount ()) + return FALSE; + + TCHAR szTitle[1024]; + + TC_ITEM item; + item.mask = TCIF_TEXT; + item.pszText = szTitle; + item.cchTextMax = sizeof szTitle / sizeof (TCHAR); + + if (!GetItem (nIndex, &item)) + return FALSE; + + strTitle = item.pszText; + return TRUE; +} + +BOOL CTabCtrlSSL::SetSSLPageTitle (int nIndex, LPCTSTR pszTitle) { + if (nIndex >= GetItemCount ()) + return FALSE; + + TC_ITEM item; + item.mask = TCIF_TEXT; + item.pszText = (LPTSTR) pszTitle; + + BOOL bResult = SetItem (nIndex, &item); + if (bResult) + Invalidate (); + return bResult; +} + +int CTabCtrlSSL::GetSSLPageID (int nIndex) { + if (nIndex >= GetItemCount ()) + return -1; + + return m_nPageIDs[nIndex]; +} + +int CTabCtrlSSL::SetSSLPageID (int nIndex, int nPageID) { + if (nIndex >= GetItemCount ()) + return -1; + + int nOldPageID = m_nPageIDs[nIndex]; + m_nPageIDs[nIndex] = nPageID; + return nOldPageID; +} + +BOOL CTabCtrlSSL::ActivateSSLPage (int nIndex) { + if (nIndex >= GetItemCount ()) + return FALSE; + + // Do nothing if the specified page is already active. + if (nIndex == GetCurSel ()) + return TRUE; + + // Deactivate the current page. + int nOldIndex = GetCurSel (); + + if (nIndex != -1) { + TabDelete tabDelete = m_tabs[nOldIndex]; + CTabPageSSL* pDialog = tabDelete.pTabPage; + if (pDialog != NULL) { + m_hFocusWnd[nOldIndex] = ::GetFocus (); + pDialog->ShowWindow (SW_HIDE); + } + } + + // Activate the new one. + SetCurSel (nIndex); + TabDelete tabDelete = m_tabs[nIndex]; + CTabPageSSL* pDialog = tabDelete.pTabPage; + + if (pDialog != NULL) { + ::SetFocus (m_hFocusWnd[nIndex]); + CRect rect; + GetClientRect (&rect); + ResizeDialog (nIndex, rect.Width (), rect.Height ()); + pDialog->ShowWindow (SW_SHOW); + } + return TRUE; +} + +int CTabCtrlSSL::GetSSLActivePage (void) { + return GetCurSel (); +} + +CWnd* CTabCtrlSSL::GetSSLPage (int nIndex) { + if (nIndex >= GetItemCount ()) + return NULL; + + TabDelete tabDelete = m_tabs[nIndex]; + return (CWnd*) tabDelete.pTabPage; +} + +int CTabCtrlSSL::GetSSLPageIndex (int nPageID) { + int nCount = GetItemCount (); + if (nCount == 0) + return -1; + + for (int i=0; isignature == 0xFFFF) + dwStyle = pTemplate->style; + else + dwStyle = ((DLGTEMPLATE*) pTemplate)->style; + + UnlockResource (hTemplate); + FreeResource (hTemplate); + + // Verify that the dialog is an invisible child window. + if (dwStyle & WS_VISIBLE) + return FALSE; // WS_VISIBLE flag is set + + if (!(dwStyle & WS_CHILD)) + return FALSE; // WS_CHILD flag isn't set + + // Verify that the dialog has no border and no title bar. + if (dwStyle & (WS_BORDER | WS_THICKFRAME | DS_MODALFRAME)) + return FALSE; // One or more border flags are set + + if (dwStyle & WS_CAPTION) + return FALSE; // WS_CAPTION flag is set + + return TRUE; +} +#endif // _DEBUG + +void CTabCtrlSSL::ResizeDialog (int nIndex, int cx, int cy) { + if (nIndex != -1) { + TabDelete tabDelete = m_tabs[nIndex]; + CTabPageSSL* pDialog = tabDelete.pTabPage; + + if (pDialog != NULL) { + CRect rect; + GetItemRect (nIndex, &rect); + + int x, y, nWidth, nHeight; + DWORD dwStyle = GetStyle (); + + if (dwStyle & TCS_VERTICAL) { // Vertical tabs + int nTabWidth = + rect.Width () * GetRowCount (); + x = (dwStyle & TCS_RIGHT) ? 4 : nTabWidth + 4; + y = 4; + nWidth = cx - nTabWidth - 8; + nHeight = cy - 8; + } + else { // Horizontal tabs + int nTabHeight = + rect.Height () * GetRowCount (); + x = 4; + y = (dwStyle & TCS_BOTTOM) ? 4 : nTabHeight + 4; + nWidth = cx - 8; + nHeight = cy - nTabHeight - 8; + + + + } + pDialog->SetWindowPos (NULL, x, y, nWidth, nHeight, SWP_NOZORDER); + } + } +} + +///////////////////////////////////////////////////////////////////////////// +// Overridables + +BOOL CTabCtrlSSL::OnInitPage (int nIndex, int nPageID) { + // TODO: Override in derived class to initialise pages. + return TRUE; +} + +void CTabCtrlSSL::OnActivatePage (int nIndex, int nPageID) { + // TODO: Override in derived class to respond to page activations. +} + +void CTabCtrlSSL::OnDeactivatePage (int nIndex, int nPageID) { + // TODO: Override in derived class to respond to page deactivations. +} + +void CTabCtrlSSL::OnDestroyPage (int nIndex, int nPageID) { + // TODO: Override in derived class to free resources. +} + +///////////////////////////////////////////////////////////////////////////// +// Message handlers + +void CTabCtrlSSL::OnSelChanging (NMHDR* pNMHDR, LRESULT* pResult) { + // Notify derived classes that the selection is changing. + int nIndex = GetCurSel (); + if (nIndex == -1) + return; + + OnDeactivatePage (nIndex, m_nPageIDs[nIndex]); + + // Save the input focus and hide the old page. + TabDelete tabDelete = m_tabs[nIndex]; + CTabPageSSL* pDialog = tabDelete.pTabPage; + + if (pDialog != NULL) { + m_hFocusWnd[nIndex] = ::GetFocus (); + pDialog->ShowWindow (SW_HIDE); + } + *pResult = 0; +} + +void CTabCtrlSSL::OnSelChange (NMHDR* pNMHDR, LRESULT* pResult) { + int nIndex = GetCurSel (); + if (nIndex == -1) + return; + + // Show the new page. + TabDelete tabDelete = m_tabs[nIndex]; + CTabPageSSL* pDialog = tabDelete.pTabPage; + + if (pDialog != NULL) { + ::SetFocus (m_hFocusWnd[nIndex]); + CRect rect; + GetClientRect (&rect); + ResizeDialog (nIndex, rect.Width (), rect.Height ()); + pDialog->ShowWindow (SW_SHOW); + } + + // Notify derived classes that the selection has changed. + OnActivatePage (nIndex, m_nPageIDs[nIndex]); + *pResult = 0; +} + +void CTabCtrlSSL::OnSetFocus (CWnd* pOldWnd) { + CTabCtrl::OnSetFocus (pOldWnd); + + // Set the focus to a control on the current page. + int nIndex = GetCurSel (); + if (nIndex != -1) + ::SetFocus (m_hFocusWnd[nIndex]); +} + +void CTabCtrlSSL::OnKillFocus (CWnd* pNewWnd) { + CTabCtrl::OnKillFocus (pNewWnd); + + // Save the HWND of the control that holds the input focus. + int nIndex = GetCurSel (); + if (nIndex != -1) + m_hFocusWnd[nIndex] = ::GetFocus (); +} + +// My thanks to Tomasz Sowinski for all his help coming up with a workable +// solution to the stack versus heap object destruction +void CTabCtrlSSL::OnDestroy (void) { + int nCount = m_tabs.GetSize (); + + // Destroy dialogs and delete CTabCtrlSSL objects. + if (nCount > 0) { + for (int i=nCount - 1; i>=0; i--) { + OnDestroyPage (i, m_nPageIDs[i]); + TabDelete tabDelete = m_tabs[i]; + CTabPageSSL* pDialog = tabDelete.pTabPage; + if (pDialog != NULL) { + pDialog->DestroyWindow (); + if (TRUE == tabDelete.bDelete) { + delete pDialog; + } + } + } + } + + // Clean up the internal arrays. + m_tabs.RemoveAll (); + m_hFocusWnd.RemoveAll (); + m_nPageIDs.RemoveAll (); + + CTabCtrl::OnDestroy (); +} + +BOOL CTabCtrlSSL::OnCommand (WPARAM wParam, LPARAM lParam) { + // Forward WM_COMMAND messages to the dialog's parent. + return GetParent ()->SendMessage (WM_COMMAND, wParam, lParam); +} + +BOOL CTabCtrlSSL::OnNotify (WPARAM wParam, LPARAM lParam, LRESULT* pResult) { + // Forward WM_NOTIFY messages to the dialog's parent. + return GetParent ()->SendMessage (WM_NOTIFY, wParam, lParam); +} + +BOOL CTabCtrlSSL::OnCmdMsg (UINT nID, int nCode, void* pExtra, + AFX_CMDHANDLERINFO* pHandlerInfo) { + // Forward ActiveX control events to the dialog's parent. +#ifndef _AFX_NO_OCC_SUPPORT + if (nCode == CN_EVENT) + return GetParent ()->OnCmdMsg (nID, nCode, pExtra, pHandlerInfo); +#endif // !_AFX_NO_OCC_SUPPORT + + return CTabCtrl::OnCmdMsg (nID, nCode, pExtra, pHandlerInfo); +} + +int CTabCtrlSSL::AddPage (LPCTSTR pszTitle, int nPageID, TabDelete tabDelete) { + // Add a page to the tab control. + TC_ITEM item; + item.mask = TCIF_TEXT; + item.pszText = (LPTSTR) pszTitle; + int nIndex = GetItemCount (); + + if (InsertItem (nIndex, &item) == -1) + return -1; + + if (NULL == tabDelete.pTabPage) { + // Fail - no point calling the function with a NULL pointer! + DeleteItem (nIndex); + return -1; + } + else { + // Record the address of the dialog object and the page ID. + int nArrayIndex = m_tabs.Add (tabDelete); + ASSERT (nIndex == nArrayIndex); + + nArrayIndex = m_nPageIDs.Add (nPageID); + ASSERT (nIndex == nArrayIndex); + + // Size and position the dialog box within the view. + tabDelete.pTabPage->SetParent (this); // Just to be sure + + CRect rect; + GetClientRect (&rect); + + if (rect.Width () > 0 && rect.Height () > 0) + ResizeDialog (nIndex, rect.Width (), rect.Height ()); + + // Initialize the page. + if (OnInitPage (nIndex, nPageID)) { + // Make sure the first control in the dialog is the one that + // receives the input focus when the page is displayed. + HWND hwndFocus = tabDelete.pTabPage->GetTopWindow ()->m_hWnd; + nArrayIndex = m_hFocusWnd.Add (hwndFocus); + ASSERT (nIndex == nArrayIndex); + } + else { + // Make the control that currently has the input focus is the one + // that receives the input focus when the page is displayed. + m_hFocusWnd.Add (::GetFocus ()); + } + + // If this is the first page added to the view, make it visible. + if (nIndex == 0) + tabDelete.pTabPage->ShowWindow (SW_SHOW); + } + return nIndex; +} diff --git a/win32/TabCtrlSSL.h b/win32/TabCtrlSSL.h new file mode 100644 index 00000000..0c6d4bf0 --- /dev/null +++ b/win32/TabCtrlSSL.h @@ -0,0 +1,98 @@ +#if !defined(AFX_TABCTRLSSL_H__75BE48A7_864C_11D5_9F04_000102FB9990__INCLUDED_) +#define AFX_TABCTRLSSL_H__75BE48A7_864C_11D5_9F04_000102FB9990__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// TabCtrlEx.h : header file +// + +#include +#include "TabPageSSL.h" + +#ifdef _DEBUG +#pragma pack (push, 1) + +typedef struct { + WORD dlgVer; + WORD signature; + DWORD helpID; + DWORD exStyle; + DWORD style; + WORD cDlgItems; + short x; + short y; + short cx; + short cy; +} DLGTEMPLATEEX; + +#pragma pack (pop) +#endif // _DEBUG + +///////////////////////////////////////////////////////////////////////////// +// CTabCtrlSSL window + +class CTabCtrlSSL : public CTabCtrl { +public: +// Construction + CTabCtrlSSL (); +// Destruction + virtual ~CTabCtrlSSL (void); +// Page Functions + int AddSSLPage (LPCTSTR pszTitle, int nPageID, CTabPageSSL* pTabPage); + int AddSSLPage (LPCTSTR pszTitle, int nPageID, LPCTSTR pszTemplateName); + int AddSSLPage (LPCTSTR pszTitle, int nPageID, int nTemplateID); + BOOL RemoveSSLPage (int nIndex); + int GetSSLPageCount (void); + BOOL GetSSLPageTitle (int nIndex, CString& strTitle); + BOOL SetSSLPageTitle (int nIndex, LPCTSTR pszTitle); + int GetSSLPageID (int nIndex); + int SetSSLPageID (int nIndex, int nPageID); + BOOL ActivateSSLPage (int nIndex); + int GetSSLActivePage (void); + CWnd* GetSSLPage (int nIndex); + int GetSSLPageIndex (int nPageID); + void ResizeDialog (int nIndex, int cx, int cy); + +protected: + struct TabDelete { + CTabPageSSL* pTabPage; + BOOL bDelete; + }; + CArray m_tabs; + CArray m_hFocusWnd; + CArray m_nPageIDs; + + int AddPage (LPCTSTR pszTitle, int nPageID, TabDelete tabDelete); + + virtual BOOL OnInitPage (int nIndex, int nPageID); + virtual void OnActivatePage (int nIndex, int nPageID); + virtual void OnDeactivatePage (int nIndex, int nPageID); + virtual void OnDestroyPage (int nIndex, int nPageID); + virtual BOOL OnCommand (WPARAM wParam, LPARAM lParam); + virtual BOOL OnNotify (WPARAM wParam, LPARAM lParam, LRESULT* pResult); + virtual BOOL OnCmdMsg (UINT nID, int nCode, void* pExtra, + AFX_CMDHANDLERINFO* pHandlerInfo); + +#ifdef _DEBUG + BOOL CheckDialogTemplate (LPCTSTR pszTemplateName); +#endif // _DEBUG + // Generated message map functions +protected: + //{{AFX_MSG(CTabCtrlSSL) + afx_msg void OnDestroy (void); + afx_msg void OnSetFocus (CWnd* pOldWnd); + afx_msg void OnKillFocus (CWnd* pNewWnd); + afx_msg void OnSelChanging (NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnSelChange (NMHDR* pNMHDR, LRESULT* pResult); + //}}AFX_MSG + + DECLARE_MESSAGE_MAP() +}; + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_TABCTRLSSL_H__75BE48A7_864C_11D5_9F04_000102FB9990__INCLUDED_) diff --git a/win32/TabPageSSL.cpp b/win32/TabPageSSL.cpp new file mode 100644 index 00000000..b70fbcb8 --- /dev/null +++ b/win32/TabPageSSL.cpp @@ -0,0 +1,76 @@ +#include "stdafx.h" +#include "TabPageSSL.h" +#include "ResizableDialog.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// Construction + +CTabPageSSL::CTabPageSSL () { +#ifndef _AFX_NO_OCC_SUPPORT + AfxEnableControlContainer (); +#endif // !_AFX_NO_OCC_SUPPORT +} + +CTabPageSSL::CTabPageSSL (UINT nIDTemplate, CWnd* pParent /*=NULL*/) + : CResizableDialog(nIDTemplate, pParent) { +#ifndef _AFX_NO_OCC_SUPPORT + AfxEnableControlContainer (); +#endif // !_AFX_NO_OCC_SUPPORT +} + +///////////////////////////////////////////////////////////////////////////// +// Destruction + +CTabPageSSL::~CTabPageSSL () { +} + +///////////////////////////////////////////////////////////////////////////// +// Message Handlers + +void CTabPageSSL::OnOK (void) { + // + // Prevent CDialog::OnOK from calling EndDialog. + // +} + +void CTabPageSSL::OnCancel (void) { + // + // Prevent CDialog::OnCancel from calling EndDialog. + // +} + +BOOL CTabPageSSL::OnCommand (WPARAM wParam, LPARAM lParam) { + // Call base class OnCommand to allow message map processing + CResizableDialog::OnCommand (wParam, lParam); + // + // Forward WM_COMMAND messages to the dialog's parent. + // + return GetParent ()->SendMessage (WM_COMMAND, wParam, lParam); +} + +BOOL CTabPageSSL::OnNotify (WPARAM wParam, LPARAM lParam, LRESULT* pResult) { + // + // Forward WM_NOTIFY messages to the dialog's parent. + // + CResizableDialog::OnNotify (wParam, lParam, pResult); + return GetParent ()->SendMessage (WM_NOTIFY, wParam, lParam); +} + +BOOL CTabPageSSL::OnCmdMsg (UINT nID, int nCode, void* pExtra, + AFX_CMDHANDLERINFO* pHandlerInfo) { + // + // Forward ActiveX control events to the dialog's parent. + // +#ifndef _AFX_NO_OCC_SUPPORT + if (nCode == CN_EVENT) + return GetParent ()->OnCmdMsg (nID, nCode, pExtra, pHandlerInfo); +#endif // !_AFX_NO_OCC_SUPPORT + + return CResizableDialog::OnCmdMsg (nID, nCode, pExtra, pHandlerInfo); +} diff --git a/win32/TabPageSSL.h b/win32/TabPageSSL.h new file mode 100644 index 00000000..99a55d7f --- /dev/null +++ b/win32/TabPageSSL.h @@ -0,0 +1,27 @@ +#if !defined(AFX_TABPAGESSL_H__619331B3_7DE7_4DB1_A039_2103E87E8E71__INCLUDED_) +#define AFX_TABPAGESSL_H__619331B3_7DE7_4DB1_A039_2103E87E8E71__INCLUDED_ + +///////////////////////////////////////////////////////////////////////////// +// CTabPageSSL declaration +#include "ResizableDialog.h" + +class CTabPageSSL : public CResizableDialog +{ +public: +// Construction + CTabPageSSL (); // Default Constructor + CTabPageSSL (UINT nIDTemplate, CWnd* pParent = NULL); // Standard Constructor +// Destruction + ~CTabPageSSL (); + +protected: +// Message Handlers + virtual BOOL OnCommand (WPARAM wParam, LPARAM lParam); + virtual BOOL OnNotify (WPARAM wParam, LPARAM lParam, LRESULT* pResult); + virtual void OnOK (void); + virtual void OnCancel (void); + virtual BOOL OnCmdMsg (UINT nID, int nCode, void* pExtra, + AFX_CMDHANDLERINFO* pHandlerInfo); +}; + +#endif // !defined(AFX_TABPAGE_H__619331B3_7DE7_4DB1_A039_2103E87E8E71__INCLUDED_) diff --git a/win32/black.bmp b/win32/black.bmp new file mode 100644 index 00000000..59ba6525 Binary files /dev/null and b/win32/black.bmp differ diff --git a/win32/colors.h b/win32/colors.h new file mode 100644 index 00000000..66053d0b --- /dev/null +++ b/win32/colors.h @@ -0,0 +1,5 @@ +#define BGCOLOR RGB(0,0,0) +#define TEXTCOLOR RGB(175,175,175) +#define TEXTBGCOLOR RGB(0,0,0) +#define LOGOCOLOR RGB(175,175,175) + diff --git a/win32/icecast.dsp b/win32/icecast.dsp new file mode 100644 index 00000000..9cbc0417 --- /dev/null +++ b/win32/icecast.dsp @@ -0,0 +1,277 @@ +# Microsoft Developer Studio Project File - Name="icecast" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=icecast - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "icecast.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "icecast.mak" CFG="icecast - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "icecast - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "icecast - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "icecast - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Releaseicecast" +# 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 /W3 /GX /O2 /I "../" /I "../../libxslt/include" /I "../../iconv/include" /I "../../libxml2/include" /I "..\src" /I "..\src/httpp" /I "..\src/thread" /I "..\src/log" /I "..\src/avl" /I "..\src/net" /I "..\src/timings" /I "../../pthreads" /I "../../ogg/include" /I "../../vorbis/include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "icecast - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debugicecast" +# 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 "../" /I "../../libxslt/include" /I "../../iconv/include" /I "../../libxml2/include" /I "..\src" /I "..\src/httpp" /I "..\src/thread" /I "..\src/log" /I "..\src/avl" /I "..\src/net" /I "..\src/timings" /I "../../pthreads" /I "../../ogg/include" /I "../../vorbis/include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "_WIN32" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "icecast - Win32 Release" +# Name "icecast - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\src\avl\avl.c +# End Source File +# Begin Source File + +SOURCE=..\src\avl\avl.h +# End Source File +# Begin Source File + +SOURCE=..\src\client.c +# End Source File +# Begin Source File + +SOURCE=..\src\client.h +# End Source File +# Begin Source File + +SOURCE=..\src\compat.h +# End Source File +# Begin Source File + +SOURCE=..\src\config.c +# End Source File +# Begin Source File + +SOURCE=..\src\config.h +# End Source File +# Begin Source File + +SOURCE=..\src\connection.c +# End Source File +# Begin Source File + +SOURCE=..\src\connection.h +# End Source File +# Begin Source File + +SOURCE=..\src\format.c +# End Source File +# Begin Source File + +SOURCE=..\src\format.h +# End Source File +# Begin Source File + +SOURCE=..\src\format_mp3.c +# End Source File +# Begin Source File + +SOURCE=..\src\format_mp3.h +# End Source File +# Begin Source File + +SOURCE=..\src\format_vorbis.c +# End Source File +# Begin Source File + +SOURCE=..\src\format_vorbis.h +# End Source File +# Begin Source File + +SOURCE=..\src\global.c +# End Source File +# Begin Source File + +SOURCE=..\src\global.h +# End Source File +# Begin Source File + +SOURCE=..\src\httpp\httpp.c +# End Source File +# Begin Source File + +SOURCE=..\src\httpp\httpp.h +# End Source File +# Begin Source File + +SOURCE=..\src\log\log.c +# End Source File +# Begin Source File + +SOURCE=..\src\log\log.h +# End Source File +# Begin Source File + +SOURCE=..\src\logging.c +# End Source File +# Begin Source File + +SOURCE=..\src\logging.h +# End Source File +# Begin Source File + +SOURCE=..\src\main.c +# End Source File +# Begin Source File + +SOURCE=..\src\os.h +# End Source File +# Begin Source File + +SOURCE=..\src\refbuf.c +# End Source File +# Begin Source File + +SOURCE=..\src\refbuf.h +# End Source File +# Begin Source File + +SOURCE=..\src\net\resolver.c +# End Source File +# Begin Source File + +SOURCE=..\src\net\resolver.h +# End Source File +# Begin Source File + +SOURCE=..\src\sighandler.c +# End Source File +# Begin Source File + +SOURCE=..\src\sighandler.h +# End Source File +# Begin Source File + +SOURCE=..\src\slave.c +# End Source File +# Begin Source File + +SOURCE=..\src\net\sock.c +# End Source File +# Begin Source File + +SOURCE=..\src\net\sock.h +# End Source File +# Begin Source File + +SOURCE=..\src\source.c +# End Source File +# Begin Source File + +SOURCE=..\src\source.h +# End Source File +# Begin Source File + +SOURCE=..\src\stats.c +# End Source File +# Begin Source File + +SOURCE=..\src\stats.h +# End Source File +# Begin Source File + +SOURCE=..\src\thread\thread.c +# End Source File +# Begin Source File + +SOURCE=..\src\thread\thread.h +# End Source File +# Begin Source File + +SOURCE=..\src\timing\timing.c +# End Source File +# Begin Source File + +SOURCE=..\src\util.c +# End Source File +# Begin Source File + +SOURCE=..\src\util.h +# End Source File +# Begin Source File + +SOURCE=..\src\xslt.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\src\timing\timing.h +# End Source File +# Begin Source File + +SOURCE=..\src\xslt.h +# End Source File +# End Group +# End Target +# End Project diff --git a/win32/icecast.ico b/win32/icecast.ico new file mode 100644 index 00000000..a40d61ae Binary files /dev/null and b/win32/icecast.ico differ diff --git a/win32/icecast.xml b/win32/icecast.xml new file mode 100644 index 00000000..2f8c7890 --- /dev/null +++ b/win32/icecast.xml @@ -0,0 +1,50 @@ + + Jack's House + jack@icecast.org + + + 100 + 2 + 5 + 30 + 15 + 10 + + + hackme + + + 5 + + yp.icecast.org + 15 + + + + localhost + 8100 + + + + + + + + .\webroot + . + . + + + + access.log + error.log + + + + 0 + + + diff --git a/win32/res/Icecast2win.rc2 b/win32/res/Icecast2win.rc2 new file mode 100644 index 00000000..c3231ad8 --- /dev/null +++ b/win32/res/Icecast2win.rc2 @@ -0,0 +1,13 @@ +// +// ICECAST2WIN.RC2 - resources Microsoft Visual C++ does not edit directly +// + +#ifdef APSTUDIO_INVOKED + #error this file is not editable by Microsoft Visual C++ +#endif //APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// Add manually edited resources here... + +///////////////////////////////////////////////////////////////////////////// diff --git a/win32/resource.h b/win32/resource.h new file mode 100644 index 00000000..dd726906 --- /dev/null +++ b/win32/resource.h @@ -0,0 +1,68 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by Icecast2win.rc +// +#define IDM_ABOUTBOX 0x0010 +#define IDD_ABOUTBOX 100 +#define IDS_ABOUTBOX 101 +#define IDD_ICECAST2WIN_DIALOG 102 +#define IDR_MAINFRAME 128 +#define IDR_MENU1 132 +#define IDB_BITMAP1 134 +#define IDB_BITMAP2 135 +#define IDI_R 141 +#define IDI_G 142 +#define IDI_ICON1 142 +#define IDD_SERVERSTATUS 144 +#define IDD_SSTATUS 145 +#define IDD_CONFIGDIALOG 146 +#define IDD_STATSDIALOG 147 +#define IDB_BITMAP3 149 +#define IDB_BITMAP4 150 +#define IDB_BITMAP5 151 +#define IDB_BITMAP6 152 +#define IDR_MENU2 153 +#define IDR_MENU3 154 +#define IDC_CURSOR1 155 +#define IDC_CURSOR2 156 +#define IDB_BITMAP7 159 +#define IDC_MAINTAB 1000 +#define IDC_ERROR_EDIT 1003 +#define IDC_ACCESS_EDIT 1004 +#define IDC_CONFIG_EDIT 1006 +#define IDC_SERVERSTATUS 1008 +#define IDC_SOURCES_CONNECTED 1009 +#define IDC_NUMBER_CLIENTS 1010 +#define IDC_GROUP1 1011 +#define IDC_STATS_EDIT 1012 +#define IDC_CONFIG 1020 +#define IDC_STATSLIST 1021 +#define IDC_SOURCELIST 1022 +#define IDC_START 1023 +#define IDC_AUTOSTART 1024 +#define IDC_FILLER1 1025 +#define IDC_FILLER2 1026 +#define IDC_STATIC_SS 1029 +#define IDC_GLOBALSTAT_LIST 1030 +#define IDC_STATIC_GS 1031 +#define IDC_STATIC_SLS 1032 +#define IDC_RUNNINGFOR 1033 +#define IDC_STATIC_RUN 1034 +#define IDC_STATICBLACK 1035 +#define ID_FILE_STARTSERVER 32771 +#define ID_FILE_EXIT 32772 +#define ID_FILE_STOPSERVER 32774 +#define ID_FILE 32775 +#define ID_POPUP_ADDTOGLOBALSTATLIST 32776 +#define ID__DELETEFROMGLOBALSTATS 32777 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 160 +#define _APS_NEXT_COMMAND_VALUE 32778 +#define _APS_NEXT_CONTROL_VALUE 1036 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/win32/running.bmp b/win32/running.bmp new file mode 100644 index 00000000..b5059fc6 Binary files /dev/null and b/win32/running.bmp differ diff --git a/win32/stopped.bmp b/win32/stopped.bmp new file mode 100644 index 00000000..db201ac4 Binary files /dev/null and b/win32/stopped.bmp differ