root/applications/osmo4_w32/Options.cpp

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. DoDataExchange
  2. BEGIN_MESSAGE_MAP
  3. HideAll
  4. OnSelchangeSelect
  5. OnSaveopt
  6. OnClose
  7. OnDestroy
  8. DoDataExchange
  9. BEGIN_MESSAGE_MAP
  10. SaveOptions
  11. DoDataExchange
  12. BEGIN_MESSAGE_MAP
  13. SaveOptions
  14. DoDataExchange
  15. BEGIN_MESSAGE_MAP
  16. SaveOptions
  17. DoDataExchange
  18. OnInitDialog
  19. SaveOptions
  20. DoDataExchange
  21. BEGIN_MESSAGE_MAP
  22. SetYUV
  23. SaveOptions
  24. DoDataExchange
  25. BEGIN_MESSAGE_MAP
  26. SaveOptions
  27. DoDataExchange
  28. BEGIN_MESSAGE_MAP
  29. SaveOptions
  30. DoDataExchange
  31. BEGIN_MESSAGE_MAP
  32. SaveOptions
  33. OnForceAudio
  34. OnSelchangeDriverList
  35. DoDataExchange
  36. BEGIN_MESSAGE_MAP
  37. LocCbck
  38. OnBrowseFont
  39. SaveOptions
  40. DoDataExchange
  41. BEGIN_MESSAGE_MAP
  42. OnInitDialog
  43. OnSaxProgressive
  44. OnUseProxy
  45. SaveOptions
  46. DoDataExchange
  47. BEGIN_MESSAGE_MAP
  48. OnSelchangePort
  49. OnRtsp
  50. CheckRebuffer
  51. OnRebuffer
  52. OnUpdateRebufferLen
  53. OnUpdateBuffer
  54. SaveOptions
  55. DoDataExchange
  56. BEGIN_MESSAGE_MAP
  57. OnInitDialog
  58. OnMcacheUsename
  59. SaveOptions
  60. DoDataExchange
  61. BEGIN_MESSAGE_MAP
  62. OnSelchangeFilelist
  63. SetSelection
  64. OnAssociate
  65. DoDataExchange
  66. BEGIN_MESSAGE_MAP
  67. SaveOptions
  68. OnBnClickedRestartCache

// Options.cpp : implementation file
//

#include "stdafx.h"
#include "Osmo4.h"
#include "MainFrm.h"

#include <gpac/modules/codec.h>
#include <gpac/modules/raster2d.h>
#include <gpac/modules/font.h>
#include <gpac/modules/audio_out.h>
#include <gpac/modules/video_out.h>

#include <gpac/iso639.h>
#include "Options.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// COptions dialog


COptions::COptions(CWnd* pParent /*=NULL*/)
        : CDialog(COptions::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptions)
        //}}AFX_DATA_INIT
}


void COptions::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptions)
        DDX_Control(pDX, IDC_SELECT, m_Selector);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptions, CDialog)
        //{{AFX_MSG_MAP(COptions)
        ON_BN_CLICKED(IDC_SAVEOPT, OnSaveopt)
        ON_WM_CLOSE()
        ON_WM_DESTROY()
        ON_CBN_SELCHANGE(IDC_SELECT, OnSelchangeSelect)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL COptions::OnInitDialog()
{
        CDialog::OnInitDialog();

        m_general.Create(IDD_OPT_GEN, this);
        m_systems.Create(IDD_OPT_SYSTEMS, this);
        m_render.Create(IDD_OPT_RENDER, this);
        m_render2d.Create(IDD_OPT_RENDER2D, this);
        m_render3d.Create(IDD_OPT_RENDER3D, this);
        m_decoder.Create(IDD_OPT_DECODER, this);
        m_audio.Create(IDD_OPT_AUDIO, this);
        m_video.Create(IDD_OPT_VIDEO, this);
        m_http.Create(IDD_OPT_HTTP, this);
        m_font.Create(IDD_OPT_FONT, this);
        m_stream.Create(IDD_OPT_STREAM, this);
        m_cache.Create(IDD_OPT_MCACHE, this);
        m_files.Create(IDD_OPT_FILETYPES, this);
        m_logs.Create(IDD_OPT_LOGS, this);

        m_Selector.AddString("General");
        m_Selector.AddString("MPEG-4 Systems");
        m_Selector.AddString("Media Decoders");
        m_Selector.AddString("Compositor");
        m_Selector.AddString("2D Drawing");
        m_Selector.AddString("3D Drawing");
        m_Selector.AddString("Video Output");
        m_Selector.AddString("Audio Output");
        m_Selector.AddString("Text Engine");
        m_Selector.AddString("File Download");
        m_Selector.AddString("Real-Time Streaming");
        m_Selector.AddString("Streaming Cache");
        m_Selector.AddString("File Types");
        m_Selector.AddString("Log System");

        HideAll();

        const char *sOpt = gf_cfg_get_key(GetApp()->m_user.config, "General", "ConfigPanel");
        u32 sel = sOpt ? atoi(sOpt) : 0;
        if (sel>13) sel=13;
        m_Selector.SetCurSel(sel);
        m_general.ShowWindow(SW_SHOW);

        OnSelchangeSelect();

        return TRUE;
}


/////////////////////////////////////////////////////////////////////////////
// COptions message handlers

void COptions::HideAll()
{
        m_general.ShowWindow(SW_HIDE);
        m_systems.ShowWindow(SW_HIDE);
        m_render.ShowWindow(SW_HIDE);
        m_render2d.ShowWindow(SW_HIDE);
        m_render3d.ShowWindow(SW_HIDE);
        m_audio.ShowWindow(SW_HIDE);
        m_video.ShowWindow(SW_HIDE);
        m_http.ShowWindow(SW_HIDE);
        m_font.ShowWindow(SW_HIDE);
        m_stream.ShowWindow(SW_HIDE);
        m_decoder.ShowWindow(SW_HIDE);
        m_cache.ShowWindow(SW_HIDE);
        m_files.ShowWindow(SW_HIDE);
        m_files.ShowWindow(SW_HIDE);
        m_logs.ShowWindow(SW_HIDE);
}

void COptions::OnSelchangeSelect()
{
        HideAll();
        switch (m_Selector.GetCurSel()) {
        case 0:
                m_general.ShowWindow(SW_SHOW);
                break;
        case 1:
                m_systems.ShowWindow(SW_SHOW);
                break;
        case 2:
                m_decoder.ShowWindow(SW_SHOW);
                break;
        case 3:
                m_render.ShowWindow(SW_SHOW);
                break;
        case 4:
                m_render2d.ShowWindow(SW_SHOW);
                break;
        case 5:
                m_render3d.ShowWindow(SW_SHOW);
                break;
        case 6:
                m_video.ShowWindow(SW_SHOW);
                break;
        case 7:
                m_audio.ShowWindow(SW_SHOW);
                break;
        case 8:
                m_font.ShowWindow(SW_SHOW);
                break;
        case 9:
                m_http.ShowWindow(SW_SHOW);
                break;
        case 10:
                m_stream.ShowWindow(SW_SHOW);
                break;
        case 11:
                m_cache.ShowWindow(SW_SHOW);
                break;
        case 12:
                m_files.ShowWindow(SW_SHOW);
                break;
        case 13:
                m_logs.ShowWindow(SW_SHOW);
                break;
        }
}

void COptions::OnSaveopt()
{
        m_general.SaveOptions();
        m_systems.SaveOptions();
        m_decoder.SaveOptions();
        m_render.SaveOptions();
        m_render2d.SaveOptions();
        m_render3d.SaveOptions();
        m_audio.SaveOptions();
        m_video.SaveOptions();
        m_http.SaveOptions();
        m_font.SaveOptions();
        m_stream.SaveOptions();
        m_cache.SaveOptions();
        m_logs.SaveOptions();

        Osmo4 *gpac = GetApp();
        gf_term_set_option(gpac->m_term, GF_OPT_RELOAD_CONFIG, 1);
        m_render2d.SetYUV();
}

void COptions::OnClose()
{
        char str[20];
        sprintf(str, "%d", m_Selector.GetCurSel());
        gf_cfg_set_key(GetApp()->m_user.config, "General", "ConfigPanel", str);

        DestroyWindow();
}

void COptions::OnDestroy()
{
        CDialog::OnDestroy();
        delete this;
        ((CMainFrame *)GetApp()->m_pMainWnd)->m_pOpt = NULL;
}


COptGen::COptGen(CWnd* pParent /*=NULL*/)
        : CDialog(COptGen::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptGen)
        //}}AFX_DATA_INIT
}


void COptGen::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptGen)
        DDX_Control(pDX, IDC_LOOKFORSUB, m_LookForSubs);
        DDX_Control(pDX, IDC_DUMP_XMT, m_ViewXMT);
        DDX_Control(pDX, IDC_NO_CONSOLE, m_NoConsole);
        DDX_Control(pDX, IDC_LOOP, m_Loop);
        DDX_Control(pDX, IDC_SINGLE_INSTANCE, m_SingleInstance);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptGen, CDialog)
        //{{AFX_MSG_MAP(COptGen)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptGen message handlers



BOOL COptGen::OnInitDialog()
{
        CDialog::OnInitDialog();

        Osmo4 *gpac = GetApp();
        const char *sOpt;

        sOpt = gf_cfg_get_key(gpac->m_user.config, "General", "Loop");
        m_Loop.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "General", "LookForSubtitles");
        m_LookForSubs.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "General", "ConsoleOff");
        m_NoConsole.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "General", "ViewXMT");
        m_ViewXMT.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "General", "SingleInstance");
        m_SingleInstance.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
        return TRUE;
}

void COptGen::SaveOptions()
{
        Osmo4 *gpac = GetApp();

        gpac->m_Loop = (Bool) m_Loop.GetCheck();
        gf_cfg_set_key(gpac->m_user.config, "General", "Loop", gpac->m_Loop ? "yes" : "no");
        gpac->m_LookForSubtitles = (Bool) m_LookForSubs.GetCheck();
        gf_cfg_set_key(gpac->m_user.config, "General", "LookForSubtitles",  gpac->m_LookForSubtitles ? "yes" : "no");
        gpac->m_NoConsole = (Bool) m_NoConsole.GetCheck();
        gf_cfg_set_key(gpac->m_user.config, "General", "ConsoleOff", gpac->m_NoConsole ? "yes" : "no");
        gpac->m_ViewXMTA = (Bool) m_ViewXMT.GetCheck();
        gf_cfg_set_key(gpac->m_user.config, "General", "ViewXMT", gpac->m_ViewXMTA ? "yes" : "no");
        gpac->m_SingleInstance = (Bool) m_SingleInstance.GetCheck();
        gf_cfg_set_key(gpac->m_user.config, "General", "SingleInstance", gpac->m_SingleInstance ? "yes" : "no");
}

COptSystems::COptSystems(CWnd* pParent /*=NULL*/)
        : CDialog(COptSystems::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptSystems)
        // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
}


void COptSystems::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptSystems)
        DDX_Control(pDX, IDC_FORCE_DURATION, m_ForceDuration);
        DDX_Control(pDX, IDC_DEC_THREAD, m_Threading);
        DDX_Control(pDX, IDC_BIFSDROP, m_LateFramesAlwaysDrawn);
        DDX_Control(pDX, IDC_LANG, m_Lang);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptSystems, CDialog)
        //{{AFX_MSG_MAP(COptSystems)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptSystems message handlers





BOOL COptSystems::OnInitDialog()
{
        CDialog::OnInitDialog();

        Osmo4 *gpac = GetApp();
        const char *sOpt;

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Systems", "Language3CC");
        if (!sOpt) sOpt = "eng";
        s32 select = 0;
        while (m_Lang.GetCount()) m_Lang.DeleteString(0);
        u32 i, count = gf_lang_get_count();
        for (i=0; i<count; i++) {
                const char *n2c = gf_lang_get_2cc(i);
                const char *n3c = gf_lang_get_3cc(i);

                m_Lang.AddString(gf_lang_get_name(i) );
                if (sOpt && n3c && !stricmp(sOpt, n3c))
                        select = m_Lang.GetCount() - 1;
        }
        m_Lang.SetCurSel(select);


        /*system config*/
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Systems", "ThreadingPolicy");
        select = 0;
        while (m_Threading.GetCount()) m_Threading.DeleteString(0);
        m_Threading.AddString("Single Thread");
        m_Threading.AddString("Mutli Thread");
        if (sOpt && !stricmp(sOpt, "Multi")) select = 1;
        m_Threading.AddString("Free");
        if (sOpt && !stricmp(sOpt, "Free")) select = 2;
        m_Threading.SetCurSel(select);


        sOpt = gf_cfg_get_key(gpac->m_user.config, "Systems", "ForceSingleClock");
        if (sOpt && !stricmp(sOpt, "yes")) {
                m_ForceDuration.SetCheck(1);
        } else {
                m_ForceDuration.SetCheck(0);
        }
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Systems", "DrawLateFrames");
        if (sOpt && !stricmp(sOpt, "yes")) {
                m_LateFramesAlwaysDrawn.SetCheck(1);
        } else {
                m_LateFramesAlwaysDrawn.SetCheck(0);
        }


        return TRUE;
}


void COptSystems::SaveOptions()
{
        Osmo4 *gpac = GetApp();

        s32 sel = m_Lang.GetCurSel();
        u32 i=0;

        gf_cfg_set_key(gpac->m_user.config, "Systems", "LanguageName", gf_lang_get_name(i) );
        gf_cfg_set_key(gpac->m_user.config, "Systems", "Language3CC", gf_lang_get_3cc(i) );
        gf_cfg_set_key(gpac->m_user.config, "Systems", "Language2CC", gf_lang_get_2cc(i) );

        sel = m_Threading.GetCurSel();
        gf_cfg_set_key(gpac->m_user.config, "Systems", "ThreadingPolicy", (sel==0) ? "Single" : ( (sel==1) ? "Multi" : "Free"));
        gf_cfg_set_key(gpac->m_user.config, "Systems", "ForceSingleClock", m_ForceDuration.GetCheck() ? "yes" : "no");
        gf_cfg_set_key(gpac->m_user.config, "Systems", "DrawLateFrames", m_LateFramesAlwaysDrawn.GetCheck() ? "yes" : "no");
}


OptDecoder::OptDecoder(CWnd* pParent /*=NULL*/)
        : CDialog(OptDecoder::IDD, pParent)
{
        //{{AFX_DATA_INIT(OptDecoder)
        // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
}


void OptDecoder::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(OptDecoder)
        DDX_Control(pDX, IDC_VIDEC_LIST, m_Video);
        DDX_Control(pDX, IDC_AUDEC_LIST, m_Audio);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(OptDecoder, CDialog)
        //{{AFX_MSG_MAP(OptDecoder)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// OptDecoder message handlers



BOOL OptDecoder::OnInitDialog()
{
        u32 i;
        const char *sOpt;
        CDialog::OnInitDialog();

        Osmo4 *gpac = GetApp();

        /*audio dec enum*/
        while (m_Audio.GetCount()) m_Audio.DeleteString(0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Systems", "DefAudioDec");
        u32 count = gf_modules_get_count(gpac->m_user.modules);
        GF_BaseDecoder *ifce;
        s32 select = 0;
        s32 to_sel = 0;
        for (i=0; i<count; i++) {
                ifce = (GF_BaseDecoder *) gf_modules_load_interface(gpac->m_user.modules, i, GF_MEDIA_DECODER_INTERFACE);
                if (!ifce) continue;

                if (ifce->CanHandleStream(ifce, GF_STREAM_AUDIO, NULL, 0)) {
                        if (sOpt && !stricmp(ifce->module_name, sOpt)) select = to_sel;
                        m_Audio.AddString(ifce->module_name);
                        to_sel++;
                }
                gf_modules_close_interface((GF_BaseInterface *)ifce);
        }
        m_Audio.SetCurSel(select);

        /*video dec enum*/
        while (m_Video.GetCount()) m_Video.DeleteString(0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Systems", "DefVideoDec");
        count = gf_modules_get_count(gpac->m_user.modules);
        select = 0;
        to_sel = 0;
        for (i=0; i<count; i++) {
                ifce = (GF_BaseDecoder *) gf_modules_load_interface(gpac->m_user.modules, i, GF_MEDIA_DECODER_INTERFACE);
                if (!ifce) continue;

                if (ifce->CanHandleStream(ifce, GF_STREAM_VISUAL, NULL, 0)) {
                        if (sOpt && !stricmp(ifce->module_name, sOpt)) select = to_sel;
                        m_Video.AddString(ifce->module_name);
                        to_sel++;
                }
                gf_modules_close_interface((GF_BaseInterface *)ifce);
        }
        m_Video.SetCurSel(select);
        return TRUE;
}

void OptDecoder::SaveOptions()
{
        Osmo4 *gpac = GetApp();
        char str[100];
        m_Audio.GetWindowText(str, 100);
        gf_cfg_set_key(gpac->m_user.config, "Systems", "DefAudioDec", str);
        m_Video.GetWindowText(str, 100);
        gf_cfg_set_key(gpac->m_user.config, "Systems", "DefVideoDec", str);

}

COptRender::COptRender(CWnd* pParent /*=NULL*/)
        : CDialog(COptRender::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptRender)
        //}}AFX_DATA_INIT
}


void COptRender::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptRender)
        DDX_Control(pDX, IDC_DRAW_BOUNDS, m_DrawBounds);
        DDX_Control(pDX, IDC_GD_LIST, m_Graphics);
        DDX_Control(pDX, IDC_USE_RENDER3D, m_Use3DRender);
        DDX_Control(pDX, IDC_AA_LIST, m_AntiAlias);
        DDX_Control(pDX, IDC_FORCE_SIZE, m_ForceSize);
        DDX_Control(pDX, IDC_FAST_RENDER, m_HighSpeed);
        DDX_Control(pDX, IDC_BIFS_RATE, m_BIFSRate);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptRender, CDialog)
        //{{AFX_MSG_MAP(COptRender)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptRender message handlers



#define NUM_RATES 11
static char *BIFSRates[11] =
{
        "5.0",
        "7.5",
        "10.0",
        "12.5",
        "15.0",
        "24.0",
        "25.0",
        "30.0",
        "50.0",
        "60.0",
        "100.0",
};



BOOL COptRender::OnInitDialog()
{
        s32 i;
        CDialog::OnInitDialog();

        Osmo4 *gpac = GetApp();
        const char *sOpt;

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "OpenGLMode");
        m_Use3DRender.SetCheck( (sOpt && !strcmp(sOpt, "always")) ? 1 : 0);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "ForceSceneSize");
        m_ForceSize.SetCheck( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "FrameRate");
        if (!sOpt) sOpt = "30.0";
        s32 select = 0;
        while (m_BIFSRate.GetCount()) m_BIFSRate.DeleteString(0);
        for (i = 0; i<NUM_RATES; i++) {
                m_BIFSRate.AddString(BIFSRates[i]);
                if (sOpt && !stricmp(sOpt, BIFSRates[i]) ) select = i;
        }
        m_BIFSRate.SetCurSel(select);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "HighSpeed");
        m_HighSpeed.SetCheck( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "AntiAlias");
        while (m_AntiAlias.GetCount()) m_AntiAlias.DeleteString(0);

        m_AntiAlias.AddString("None");
        m_AntiAlias.AddString("Text only");
        m_AntiAlias.AddString("Complete");
        select = 2;
        if (sOpt && !stricmp(sOpt, "Text")) select = 1;
        else if (sOpt && !stricmp(sOpt, "None")) select = 0;
        m_AntiAlias.SetCurSel(select);

        /*graphics driver enum*/
        while (m_Graphics.GetCount()) m_Graphics.DeleteString(0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "Raster2D");
        s32 count = gf_modules_get_count(gpac->m_user.modules);
        GF_BaseInterface *ifce;
        select = 0;
        u32 to_sel = 0;
        for (i=0; i<count; i++) {
                ifce = gf_modules_load_interface(gpac->m_user.modules, i, GF_RASTER_2D_INTERFACE);
                if (!ifce) continue;
                if (sOpt && !stricmp(ifce->module_name, sOpt)) select = to_sel;
                m_Graphics.AddString(ifce->module_name);
                gf_modules_close_interface(ifce);
                to_sel++;
        }
        m_Graphics.SetCurSel(select);


        m_DrawBounds.AddString("None");
        m_DrawBounds.AddString("Box/Rect");
        m_DrawBounds.AddString("AABB Tree");
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "BoundingVolume");
        if (sOpt && !stricmp(sOpt, "Box")) m_DrawBounds.SetCurSel(1);
        else if (sOpt && !stricmp(sOpt, "AABB")) m_DrawBounds.SetCurSel(2);
        else m_DrawBounds.SetCurSel(0);

        return TRUE;
}


Bool COptRender::SaveOptions()
{
        char str[50];
        Osmo4 *gpac = GetApp();

        gf_cfg_set_key(gpac->m_user.config, "Compositor", "HighSpeed", m_HighSpeed.GetCheck() ? "yes" : "no");
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "ForceSceneSize", m_ForceSize.GetCheck() ? "yes" : "no");

        s32 sel = m_BIFSRate.GetCurSel();
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "FrameRate", BIFSRates[sel]);

        sel = m_AntiAlias.GetCurSel();
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "AntiAlias", (sel==0) ? "None" : ( (sel==1) ? "Text" : "All"));

        sel = m_DrawBounds.GetCurSel();
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "BoundingVolume", (sel==2) ? "AABB" : (sel==1) ? "Box" : "None");

        m_Graphics.GetWindowText(str, 50);
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "Raster2D", str);

        gf_cfg_set_key(gpac->m_user.config, "Compositor", "OpenGLMode", m_Use3DRender.GetCheck() ? "always" : "disable");
        return GF_FALSE;
}


COptRender2D::COptRender2D(CWnd* pParent /*=NULL*/)
        : CDialog(COptRender2D::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptRender2D)
        // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
}


void COptRender2D::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptRender2D)
        DDX_Control(pDX, IDC_FORMAT_YUV, m_YUVFormat);
        DDX_Control(pDX, IDC_YUV, m_NoYUV);
        DDX_Control(pDX, IDC_ZOOM_SCALABLE, m_Scalable);
        DDX_Control(pDX, IDC_DIRECTRENDER, m_DirectRender);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptRender2D, CDialog)
        //{{AFX_MSG_MAP(COptRender2D)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptRender2D message handlers

BOOL COptRender2D::OnInitDialog()
{
        CDialog::OnInitDialog();

        Osmo4 *gpac = GetApp();
        const char *sOpt;

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "DrawMode");
        if (sOpt && !stricmp(sOpt, "immediate")) {
                m_DirectRender.SetCheck(1);
        } else {
                m_DirectRender.SetCheck(0);
        }
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "ScalableZoom");
        if (sOpt && !stricmp(sOpt, "no")) {
                m_Scalable.SetCheck(0);
        } else {
                m_Scalable.SetCheck(1);
        }

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "DisableYUV");
        if (sOpt && !stricmp(sOpt, "yes")) {
                m_NoYUV.SetCheck(1);
        } else {
                m_NoYUV.SetCheck(0);
        }

        SetYUV();

        return TRUE;  // return TRUE unless you set the focus to a control
        // EXCEPTION: OCX Property Pages should return FALSE
}

void COptRender2D::SetYUV()
{
        Osmo4 *gpac = GetApp();
        u32 yuv_format = gf_term_get_option(gpac->m_term, GF_OPT_YUV_FORMAT);
        if (!yuv_format) {
                m_YUVFormat.SetWindowText("(No YUV used)");
        } else {
                char str[100];
                sprintf(str, "(%s used)", gf_4cc_to_str(yuv_format));
                m_YUVFormat.SetWindowText(str);
        }
}

void COptRender2D::SaveOptions()
{
        Osmo4 *gpac = GetApp();
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "DrawMode", m_DirectRender.GetCheck() ? "immediate" : "defer");
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "ScalableZoom", m_Scalable.GetCheck() ? "yes" : "no");

        gf_cfg_set_key(gpac->m_user.config, "Compositor", "DisableYUV", m_NoYUV.GetCheck() ? "yes" : "no");
}


COptRender3D::COptRender3D(CWnd* pParent /*=NULL*/)
        : CDialog(COptRender3D::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptRender3D)
        //}}AFX_DATA_INIT
}


void COptRender3D::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptRender3D)
        DDX_Control(pDX, IDC_BITMAP_USE_PIXEL, m_BitmapPixels);
        DDX_Control(pDX, IDC_DISABLE_TX_RECT, m_DisableTXRect);
        DDX_Control(pDX, IDC_RASTER_OUTLINE, m_RasterOutlines);
        DDX_Control(pDX, IDC_EMUL_POW2, m_EmulPow2);
        DDX_Control(pDX, IDC_DISABLE_POLY_AA, m_PolyAA);
        DDX_Control(pDX, IDC_DRAW_NORMALS, m_DrawNormals);
        DDX_Control(pDX, IDC_BACK_CULL, m_BackCull);
        DDX_Control(pDX, IDC_DRAW_MODE, m_Wireframe);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptRender3D, CDialog)
        //{{AFX_MSG_MAP(COptRender3D)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptRender3D message handlers


BOOL COptRender3D::OnInitDialog()
{
        CDialog::OnInitDialog();


        Osmo4 *gpac = GetApp();
        const char *sOpt;

        m_DrawNormals.AddString("Never");
        m_DrawNormals.AddString("Per Face");
        m_DrawNormals.AddString("Per Vertex");
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "DrawNormals");
        if (sOpt && !stricmp(sOpt, "PerFace")) m_DrawNormals.SetCurSel(1);
        else if (sOpt && !stricmp(sOpt, "PerVertex")) m_DrawNormals.SetCurSel(2);
        else m_DrawNormals.SetCurSel(0);

        m_BackCull.AddString("Off");
        m_BackCull.AddString("On");
        m_BackCull.AddString("Alpha");
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "BackFaceCulling");
        if (sOpt && !stricmp(sOpt, "Off")) m_BackCull.SetCurSel(0);
        else if (sOpt && !stricmp(sOpt, "Alpha")) m_BackCull.SetCurSel(2);
        else m_BackCull.SetCurSel(1);

        m_Wireframe.AddString("Solid");
        m_Wireframe.AddString("Wireframe");
        m_Wireframe.AddString("Both");
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "Wireframe");
        if (sOpt && !stricmp(sOpt, "WireOnly")) m_Wireframe.SetCurSel(1);
        else if (sOpt && !stricmp(sOpt, "WireOnSolid")) m_Wireframe.SetCurSel(2);
        else m_Wireframe.SetCurSel(0);


        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "RasterOutlines");
        m_RasterOutlines.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "EmulatePOW2");
        m_EmulPow2.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "PolygonAA");
        m_PolyAA.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "BitmapCopyPixels");
        m_BitmapPixels.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "DisableRectExt");
        m_DisableTXRect.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
        return TRUE;  // return TRUE unless you set the focus to a control
        // EXCEPTION: OCX Property Pages should return FALSE
}

void COptRender3D::SaveOptions()
{
        Osmo4 *gpac = GetApp();

        u32 sel = m_DrawNormals.GetCurSel();
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "DrawNormals", (sel==2) ? "PerVertex" : (sel==1) ? "PerFace" : "Never");
        sel = m_BackCull.GetCurSel();
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "BackFaceCulling", (sel==2) ? "Alpha" : (sel==1) ? "On" : "Off");
        sel = m_Wireframe.GetCurSel();
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "Wireframe", (sel==2) ? "WireOnSolid" : (sel==1) ? "WireOnly" : "WireNone");

        gf_cfg_set_key(gpac->m_user.config, "Compositor", "RasterOutlines", m_RasterOutlines.GetCheck() ? "yes" : "no");
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "EmulatePOW2", m_EmulPow2.GetCheck() ? "yes" : "no");
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "PolygonAA", m_PolyAA.GetCheck() ? "yes" : "no");

        gf_cfg_set_key(gpac->m_user.config, "Compositor", "DisableRectExt", m_DisableTXRect.GetCheck() ? "yes" : "no");
        gf_cfg_set_key(gpac->m_user.config, "Compositor", "BitmapCopyPixels", m_BitmapPixels.GetCheck() ? "yes" : "no");
}

COptVideo::COptVideo(CWnd* pParent /*=NULL*/)
        : CDialog(COptVideo::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptVideo)
        //}}AFX_DATA_INIT
}


void COptVideo::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptVideo)
        DDX_Control(pDX, IDC_SWITCH_RES, m_SwitchRes);
        DDX_Control(pDX, IDC_VIDEO_LIST, m_Videos);
        DDX_Control(pDX, IDC_HWMEMORY, m_UseHWMemory);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptVideo, CDialog)
        //{{AFX_MSG_MAP(COptVideo)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptVideo message handlers

BOOL COptVideo::OnInitDialog()
{
        CDialog::OnInitDialog();

        Osmo4 *gpac = GetApp();
        const char *sOpt;

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Video", "SwitchResolution");
        m_SwitchRes.SetCheck(sOpt && !stricmp(sOpt, "yes") ? 1 : 0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Video", "HardwareMemory");
        m_UseHWMemory.SetCheck(sOpt && !stricmp(sOpt, "Always") ? 1 : 0);


        u32 count = gf_modules_get_count(gpac->m_user.modules);
        GF_BaseInterface *ifce;
        s32 to_sel = 0;
        s32 select = 0;
        /*video drivers enum*/
        while (m_Videos.GetCount()) m_Videos.DeleteString(0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Video", "DriverName");

        for (u32 i=0; i<count; i++) {
                ifce = gf_modules_load_interface(gpac->m_user.modules, i, GF_VIDEO_OUTPUT_INTERFACE);
                if (!ifce) continue;
                if (sOpt && !stricmp(ifce->module_name, sOpt)) select = to_sel;
                m_Videos.AddString(ifce->module_name);
                gf_modules_close_interface(ifce);
                to_sel++;
        }
        m_Videos.SetCurSel(select);

        return TRUE;

}

void COptVideo::SaveOptions()
{
        Osmo4 *gpac = GetApp();
        char str[50];

        gf_cfg_set_key(gpac->m_user.config, "Video", "SwitchResolution", m_SwitchRes.GetCheck() ? "yes" : "no");
        gf_cfg_set_key(gpac->m_user.config, "Video", "HardwareMemory", m_UseHWMemory.GetCheck() ? "Always" : "Auto");
        m_Videos.GetWindowText(str, 50);
        gf_cfg_set_key(gpac->m_user.config, "Video", "DriverName", str);
}


COptAudio::COptAudio(CWnd* pParent /*=NULL*/)
        : CDialog(COptAudio::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptAudio)
        //}}AFX_DATA_INIT
}


void COptAudio::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptAudio)
        DDX_Control(pDX, IDC_AUDIO_NOTIFS, m_Notifs);
        DDX_Control(pDX, IDC_DRIVER_LIST, m_DriverList);
        DDX_Control(pDX, IDC_AUDIO_RESYNC, m_AudioResync);
        DDX_Control(pDX, IDC_AUDIO_MULTICH, m_AudioMultiCH);
        DDX_Control(pDX, IDC_AUDIO_FPS, m_AudioDur);
        DDX_Control(pDX, IDC_SPIN_FPS, m_SpinFPS);
        DDX_Control(pDX, IDC_FORCE_AUDIO, m_ForceConfig);
        DDX_Control(pDX, IDC_SPIN_AUDIO, m_AudioSpin);
        DDX_Control(pDX, IDC_EDIT_AUDIO, m_AudioEdit);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptAudio, CDialog)
        //{{AFX_MSG_MAP(COptAudio)
        ON_BN_CLICKED(IDC_FORCE_AUDIO, OnForceAudio)
        ON_CBN_SELCHANGE(IDC_DRIVER_LIST, OnSelchangeDriverList)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptAudio message handlers

BOOL COptAudio::OnInitDialog()
{
        CDialog::OnInitDialog();

        m_AudioSpin.SetBuddy(& m_AudioEdit);
        m_SpinFPS.SetBuddy(& m_AudioDur);
        m_SpinFPS.SetRange(0, 2000);

        Osmo4 *gpac = GetApp();
        const char *sOpt;

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Audio", "ForceConfig");
        if (sOpt && !stricmp(sOpt, "yes")) {
                m_ForceConfig.SetCheck(1);
        } else {
                m_ForceConfig.SetCheck(0);
        }
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Audio", "NumBuffers");
        if (sOpt) {
                m_AudioEdit.SetWindowText(sOpt);
        } else {
                m_AudioEdit.SetWindowText("2");
        }
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Audio", "TotalDuration");
        if (sOpt) {
                m_AudioDur.SetWindowText(sOpt);
        } else {
                m_AudioDur.SetWindowText("120");
        }

        OnForceAudio();

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Audio", "NoResync");
        m_AudioResync.SetCheck( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Audio", "DisableMultiChannel");
        m_AudioMultiCH.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);

        /*driver enum*/
        while (m_DriverList.GetCount()) m_DriverList.DeleteString(0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Audio", "DriverName");
        u32 count = gf_modules_get_count(gpac->m_user.modules);
        GF_BaseInterface *ifce;
        s32 select = 0;
        s32 to_sel = 0;
        for (u32 i=0; i<count; i++) {
                ifce = gf_modules_load_interface(gpac->m_user.modules, i, GF_AUDIO_OUTPUT_INTERFACE);
                if (!ifce) continue;
                if (sOpt && !stricmp(ifce->module_name, sOpt)) select = to_sel;
                m_DriverList.AddString(ifce->module_name);
                gf_modules_close_interface(ifce);
                to_sel++;
        }
        m_DriverList.SetCurSel(select);

        m_Notifs.ShowWindow(SW_HIDE);
        if (sOpt && strstr(sOpt, "DirectSound")) m_Notifs.ShowWindow(SW_SHOW);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Audio", "DisableNotification");
        if (sOpt && !stricmp(sOpt, "yes"))
                m_Notifs.SetCheck(1);
        else
                m_Notifs.SetCheck(0);

        return TRUE;
}


void COptAudio::SaveOptions()
{
        Osmo4 *gpac = GetApp();
        char str[50];

        gf_cfg_set_key(gpac->m_user.config, "Audio", "ForceConfig", m_ForceConfig.GetCheck() ? "yes" : "no");
        gf_cfg_set_key(gpac->m_user.config, "Audio", "NoResync", m_AudioResync.GetCheck() ? "yes" : "no");
        gf_cfg_set_key(gpac->m_user.config, "Audio", "DisableMultiChannel", m_AudioMultiCH.GetCheck() ? "yes" : "no");

        m_AudioEdit.GetWindowText(str, 20);
        gf_cfg_set_key(gpac->m_user.config, "Audio", "NumBuffers", str);
        m_AudioDur.GetWindowText(str, 20);
        gf_cfg_set_key(gpac->m_user.config, "Audio", "TotalDuration", str);

        m_DriverList.GetWindowText(str, 50);
        gf_cfg_set_key(gpac->m_user.config, "Audio", "DriverName", str);

        if (strstr(str, "DirectSound")) {
                gf_cfg_set_key(gpac->m_user.config, "Audio", "DisableNotification", m_Notifs.GetCheck() ? "yes" : "no");
        }

}

void COptAudio::OnForceAudio()
{
        BOOL en = m_ForceConfig.GetCheck();

        m_AudioSpin.EnableWindow(en);
        m_AudioEdit.EnableWindow(en);
        m_SpinFPS.EnableWindow(en);
        m_AudioDur.EnableWindow(en);
}

void COptAudio::OnSelchangeDriverList()
{
        char str[50];
        m_DriverList.GetWindowText(str, 50);
        if (strstr(str, "DirectSound")) {
                m_Notifs.ShowWindow(SW_SHOW);
        } else {
                m_Notifs.ShowWindow(SW_HIDE);
        }
}




COptFont::COptFont(CWnd* pParent /*=NULL*/)
        : CDialog(COptFont::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptFont)
        //}}AFX_DATA_INIT
}


void COptFont::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptFont)
        DDX_Control(pDX, IDC_TEXTURE_MODE, m_TextureModes);
        DDX_Control(pDX, IDC_FONT_LIST, m_Fonts);
        DDX_Control(pDX, IDC_BROWSE_FONT, m_BrowseFont);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptFont, CDialog)
        //{{AFX_MSG_MAP(COptFont)
        ON_BN_CLICKED(IDC_BROWSE_FONT, OnBrowseFont)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptFont message handlers

BOOL COptFont::OnInitDialog()
{
        u32 i;
        GF_BaseInterface *ifce;

        CDialog::OnInitDialog();

        Osmo4 *gpac = GetApp();
        const char *sOpt;

        /*video drivers enum*/
        while (m_Fonts.GetCount()) m_Fonts.DeleteString(0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "FontEngine", "FontReader");
        s32 to_sel = 0;
        s32 select = 0;
        u32 count = gf_modules_get_count(gpac->m_user.modules);
        for (i=0; i<count; i++) {
                ifce = gf_modules_load_interface(gpac->m_user.modules, i, GF_FONT_READER_INTERFACE);
                if (!ifce) continue;
                if (sOpt && !stricmp(ifce->module_name, sOpt)) select = to_sel;
                m_Fonts.AddString(ifce->module_name);
                gf_modules_close_interface(ifce);
                to_sel++;
        }
        m_Fonts.SetCurSel(select);


        sOpt = gf_cfg_get_key(gpac->m_user.config, "FontEngine", "FontDirectory");
        if (sOpt) m_BrowseFont.SetWindowText(sOpt);

        /*text texturing modes*/
        while (m_TextureModes.GetCount()) m_TextureModes.DeleteString(0);
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Compositor", "TextureTextMode");
        m_TextureModes.AddString("Default");
        m_TextureModes.AddString("Never");
        m_TextureModes.AddString("Always");
        if (sOpt && !stricmp(sOpt, "3D")) m_TextureModes.SetCurSel(1);
        else if (sOpt && !stricmp(sOpt, "Always")) m_TextureModes.SetCurSel(2);
        else m_TextureModes.SetCurSel(0);

        return TRUE;
}



static char szCacheDir[MAX_PATH];

static int CALLBACK LocCbck(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData)
{
        char dir[MAX_PATH];
        if (uMsg == BFFM_INITIALIZED) {
                strcpy(dir, szCacheDir);
                SendMessage(hwnd, BFFM_SETSELECTION, TRUE,(LPARAM) dir);
        }
        return 0;
}

void COptFont::OnBrowseFont()
{
        BROWSEINFO brw;
        LPMALLOC pMalloc;
        LPITEMIDLIST ret;
        char dir[MAX_PATH];

        if (NOERROR == ::SHGetMalloc(&pMalloc) ) {

                m_BrowseFont.GetWindowText(szCacheDir, MAX_PATH);

                memset(&brw, 0, sizeof(BROWSEINFO));
                brw.hwndOwner = this->GetSafeHwnd();
                brw.pszDisplayName = dir;
                brw.lpszTitle = "Select Font Directory...";
                brw.ulFlags = 0L;
                brw.lpfn = LocCbck;

                ret = SHBrowseForFolder(&brw);
                if (ret != NULL) {
                        if (::SHGetPathFromIDList(ret, dir)) {
                                m_BrowseFont.SetWindowText(dir);
                        }
                        pMalloc->Free(ret);
                }
                pMalloc->Release();
        }
}


void COptFont::SaveOptions()
{
        Osmo4 *gpac = GetApp();
        char str[MAX_PATH];

        m_Fonts.GetWindowText(str, 50);
        gf_cfg_set_key(gpac->m_user.config, "FontEngine", "FontReader", str);
        m_BrowseFont.GetWindowText(str, 50);
        gf_cfg_set_key(gpac->m_user.config, "FontEngine", "FontDirectory", str);
        switch (m_TextureModes.GetCurSel()) {
        case 2:
                gf_cfg_set_key(gpac->m_user.config, "Compositor", "TextureTextMode", "Always");
                break;
        case 1:
                gf_cfg_set_key(gpac->m_user.config, "Compositor", "TextureTextMode", "Never");
                break;
        default:
                gf_cfg_set_key(gpac->m_user.config, "Compositor", "TextureTextMode", "Default");
                break;
        }
}


COptHTTP::COptHTTP(CWnd* pParent /*=NULL*/)
        : CDialog(COptHTTP::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptHTTP)
        //}}AFX_DATA_INIT
}


void COptHTTP::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptHTTP)
        DDX_Control(pDX, IDC_HTTP_PROXY, m_ProxyName);
        DDX_Control(pDX, IDC_HTTP_USE_PROXY, m_useProxy);
        DDX_Control(pDX, IDC_SAX_DELAY, m_SAXDuration);
        DDX_Control(pDX, IDC_SAX_PROGRESSIVE, m_Progressive);
        DDX_Control(pDX, IDC_RESTART_CACHE, m_DisableCache);
        DDX_Control(pDX, IDC_CLEAN_CACHE, m_CleanCache);
        DDX_Control(pDX, IDC_BROWSE_CACHE, m_CacheDir);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptHTTP, CDialog)
        //{{AFX_MSG_MAP(COptHTTP)
        ON_BN_CLICKED(IDC_BROWSE_CACHE, OnBrowseCache)
        ON_BN_CLICKED(IDC_SAX_PROGRESSIVE, OnSaxProgressive)
        ON_BN_CLICKED(IDC_HTTP_USE_PROXY, OnUseProxy)
        //}}AFX_MSG_MAP
        ON_BN_CLICKED(IDC_RESTART_CACHE, &COptHTTP::OnBnClickedRestartCache)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptHTTP message handlers


void COptHTTP::OnBrowseCache()
{
        BROWSEINFO brw;
        LPMALLOC pMalloc;
        LPITEMIDLIST ret;
        char dir[MAX_PATH];

        if (NOERROR == ::SHGetMalloc(&pMalloc) ) {

                m_CacheDir.GetWindowText(szCacheDir, MAX_PATH);

                memset(&brw, 0, sizeof(BROWSEINFO));
                brw.hwndOwner = this->GetSafeHwnd();
                brw.pszDisplayName = dir;
                brw.lpszTitle = "Select HTTP Cache Directory...";
                brw.ulFlags = 0L;
                brw.lpfn = LocCbck;

                ret = SHBrowseForFolder(&brw);
                if (ret != NULL) {
                        if (::SHGetPathFromIDList(ret, dir)) {
                                m_CacheDir.SetWindowText(dir);
                        }
                        pMalloc->Free(ret);
                }
                pMalloc->Release();
        }
}

BOOL COptHTTP::OnInitDialog()
{
        char proxy[GF_MAX_PATH];
        CDialog::OnInitDialog();

        Osmo4 *gpac = GetApp();
        const char *sOpt;

        sOpt = gf_cfg_get_key(gpac->m_user.config, "General", "CacheDirectory");
        if (sOpt) m_CacheDir.SetWindowText(sOpt);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Downloader", "CleanCache");
        m_CleanCache.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Downloader", "DisableCache");
        m_DisableCache.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "SAXLoader", "Progressive");
        m_Progressive.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
        OnSaxProgressive();

        sOpt = gf_cfg_get_key(gpac->m_user.config, "SAXLoader", "MaxDuration");
        if (sOpt) {
                m_SAXDuration.SetWindowText(sOpt);
        } else {
                m_SAXDuration.SetWindowText("0");
        }
        //if (m_Progressive.GetCheck()) m_SAXDuration.EnableWindow(1);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "HTTPProxy", "Enabled");
        m_useProxy.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
        OnUseProxy();
        strcpy(proxy, "");
        sOpt = gf_cfg_get_key(gpac->m_user.config, "HTTPProxy", "Name");
        if (sOpt) {
                strcpy(proxy, sOpt);
                sOpt = gf_cfg_get_key(gpac->m_user.config, "HTTPProxy", "Port");
                if (sOpt) {
                        strcat(proxy, ":");
                        strcat(proxy, sOpt);
                }
        }
        m_ProxyName.SetWindowText(proxy);
        return TRUE;
}

void COptHTTP::OnSaxProgressive()
{
        if (m_Progressive.GetCheck()) {
                m_SAXDuration.EnableWindow(1);
        } else {
                m_SAXDuration.EnableWindow(0);
        }
}


void COptHTTP::OnUseProxy()
{
        if (m_useProxy.GetCheck()) {
                m_ProxyName.EnableWindow(1);
        } else {
                m_ProxyName.EnableWindow(0);
        }
}

void COptHTTP::SaveOptions()
{
        Osmo4 *gpac = GetApp();

        gf_cfg_set_key(gpac->m_user.config, "Downloader", "CleanCache", m_CleanCache.GetCheck() ? "yes" : "no");
        gf_cfg_set_key(gpac->m_user.config, "Downloader", "DisableCache", m_DisableCache.GetCheck() ? "yes" : "no");
        gf_cfg_set_key(gpac->m_user.config, "SAXLoader", "Progressive", m_Progressive.GetCheck() ? "yes" : "no");

        m_SAXDuration.GetWindowText(szCacheDir, MAX_PATH);
        gf_cfg_set_key(gpac->m_user.config, "SAXLoader", "MaxDuration", szCacheDir);

        gf_cfg_set_key(gpac->m_user.config, "HTTPProxy", "Enabled", m_useProxy.GetCheck() ? "yes" : "no");
        m_ProxyName.GetWindowText(szCacheDir, MAX_PATH);
        char *sep = strrchr(szCacheDir, ':');
        if (sep) {
                sep[0] = 0;
                gf_cfg_set_key(gpac->m_user.config, "HTTPProxy", "Name", szCacheDir);
                sep[0] = ':';
                gf_cfg_set_key(gpac->m_user.config, "HTTPProxy", "Port", sep+1);
        } else {
                gf_cfg_set_key(gpac->m_user.config, "HTTPProxy", "Name", szCacheDir);
                gf_cfg_set_key(gpac->m_user.config, "HTTPProxy", "Port", NULL);
        }
        m_CacheDir.GetWindowText(szCacheDir, MAX_PATH);
        gf_cfg_set_key(gpac->m_user.config, "General", "CacheDirectory", szCacheDir);
}


COptStream::COptStream(CWnd* pParent /*=NULL*/)
        : CDialog(COptStream::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptStream)
        //}}AFX_DATA_INIT
}


void COptStream::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptStream)
        DDX_Control(pDX, IDC_REBUFFER_LEN, m_RebufferLen);
        DDX_Control(pDX, IDC_REBUFFER, m_Rebuffer);
        DDX_Control(pDX, IDC_BUFFER, m_Buffer);
        DDX_Control(pDX, IDC_TIMEOUT, m_Timeout);
        DDX_Control(pDX, IDC_REORDER, m_Reorder);
        DDX_Control(pDX, IDC_RTSP, m_UseRTSP);
        DDX_Control(pDX, IDC_PORT, m_Port);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptStream, CDialog)
        //{{AFX_MSG_MAP(COptStream)
        ON_CBN_SELCHANGE(IDC_PORT, OnSelchangePort)
        ON_BN_CLICKED(IDC_RTSP, OnRtsp)
        ON_BN_CLICKED(IDC_REBUFFER, OnRebuffer)
        ON_EN_UPDATE(IDC_REBUFFER_LEN, OnUpdateRebufferLen)
        ON_EN_UPDATE(IDC_BUFFER, OnUpdateBuffer)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptStream message handlers

BOOL COptStream::OnInitDialog()
{
        CDialog::OnInitDialog();

        Osmo4 *gpac = GetApp();
        const char *sOpt;

        while (m_Port.GetCount()) m_Port.DeleteString(0);
        m_Port.AddString("554 (RTSP standard)");
        m_Port.AddString("7070 (RTSP ext)");
        m_Port.AddString("80 (RTSP / HTTP tunnel)");
        m_Port.AddString("8080 (RTSP / HTTP tunnel)");

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Streaming", "DefaultPort");
        u32 port = 554;
        Bool force_rtsp = GF_FALSE;
        if (sOpt) port = atoi(sOpt);
        switch (port) {
        case 8080:
                m_Port.SetCurSel(3);
                force_rtsp = GF_TRUE;
                break;
        case 80:
                m_Port.SetCurSel(2);
                force_rtsp = GF_TRUE;
                break;
        case 7070:
                m_Port.SetCurSel(1);
                break;
        default:
                m_Port.SetCurSel(0);
                break;
        }

        Bool use_rtsp = GF_FALSE;
        sOpt = gf_cfg_get_key(gpac->m_user.config, "Streaming", "RTPoverRTSP");
        if (sOpt && !stricmp(sOpt, "yes")) use_rtsp = GF_TRUE;

        if (force_rtsp) {
                m_UseRTSP.SetCheck(1);
                m_UseRTSP.EnableWindow(0);
                m_Reorder.SetCheck(0);
                m_Reorder.EnableWindow(0);
        } else {
                m_UseRTSP.SetCheck(use_rtsp);
                m_UseRTSP.EnableWindow(1);
                m_Reorder.EnableWindow(1);
                sOpt = gf_cfg_get_key(gpac->m_user.config, "Streaming", "ReorderSize");
                if (sOpt && !stricmp(sOpt, "0")) {
                        m_Reorder.SetCheck(0);
                } else {
                        m_Reorder.SetCheck(1);
                }
        }

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Streaming", "RTSPTimeout");
        if (sOpt) {
                m_Timeout.SetWindowText(sOpt);
        } else {
                m_Timeout.SetWindowText("30000");
        }

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Network", "BufferLength");
        if (sOpt) {
                m_Buffer.SetWindowText(sOpt);
        } else {
                m_Buffer.SetWindowText("3000");
        }

        sOpt = gf_cfg_get_key(gpac->m_user.config, "Network", "RebufferLength");
        u32 buf_len = 0;
        if (sOpt) buf_len = atoi(sOpt);
        if (buf_len) {
                m_RebufferLen.SetWindowText(sOpt);
                m_Rebuffer.SetCheck(1);
                m_RebufferLen.EnableWindow(1);
        } else {
                m_RebufferLen.SetWindowText("0");
                m_Rebuffer.SetCheck(0);
                m_RebufferLen.EnableWindow(0);
        }

        return TRUE;
}


void COptStream::OnSelchangePort()
{
        s32 sel = m_Port.GetCurSel();
        switch (sel) {
        case 3:
        case 2:
                m_UseRTSP.SetCheck(1);
                m_UseRTSP.EnableWindow(0);
                m_Reorder.SetCheck(0);
                m_Reorder.EnableWindow(0);
                break;
        case 1:
        default:
                m_UseRTSP.SetCheck(0);
                m_UseRTSP.EnableWindow(1);
                m_Reorder.SetCheck(1);
                m_Reorder.EnableWindow(1);
                break;
        }
}

void COptStream::OnRtsp()
{
        if (m_UseRTSP.GetCheck()) {
                m_Reorder.SetCheck(0);
                m_Reorder.EnableWindow(0);
        } else {
                m_Reorder.SetCheck(1);
                m_Reorder.EnableWindow(1);
        }

}

void COptStream::CheckRebuffer()
{
        char str[50];
        s32 buf, rebuf;
        m_Buffer.GetWindowText(str, 50);
        buf = atoi(str);
        m_RebufferLen.GetWindowText(str, 50);
        rebuf = atoi(str);
        if (rebuf*2 > buf) {
                rebuf = buf/2;
                sprintf(str, "%d", rebuf);
                m_RebufferLen.SetWindowText(str);
        }
}

void COptStream::OnRebuffer()
{
        if (!m_Rebuffer.GetCheck()) {
                m_RebufferLen.EnableWindow(0);
        } else {
                m_RebufferLen.EnableWindow(1);
                CheckRebuffer();
        }
}

void COptStream::OnUpdateRebufferLen()
{
        CheckRebuffer();
}

void COptStream::OnUpdateBuffer()
{
        CheckRebuffer();
}

void COptStream::SaveOptions()
{
        Osmo4 *gpac = GetApp();
        Bool force_rtsp = GF_FALSE;
        s32 sel = m_Port.GetCurSel();
        switch (sel) {
        case 3:
                gf_cfg_set_key(gpac->m_user.config, "Streaming", "DefaultPort", "8080");
                force_rtsp = GF_TRUE;
                break;
        case 2:
                gf_cfg_set_key(gpac->m_user.config, "Streaming", "DefaultPort", "80");
                force_rtsp = GF_TRUE;
                break;
        case 1:
                gf_cfg_set_key(gpac->m_user.config, "Streaming", "DefaultPort", "7070");
                break;
        default:
                gf_cfg_set_key(gpac->m_user.config, "Streaming", "DefaultPort", "554");
                break;
        }

        if (force_rtsp) {
                gf_cfg_set_key(gpac->m_user.config, "Streaming", "RTPoverRTSP", "yes");
        } else {
                gf_cfg_set_key(gpac->m_user.config, "Streaming", "RTPoverRTSP", m_UseRTSP.GetCheck() ? "yes" : "no");
                if (!m_UseRTSP.GetCheck()) gf_cfg_set_key(gpac->m_user.config, "Streaming", "ReorderSize", m_Reorder.GetCheck() ? "30" : "0");
        }

        char str[50];

        m_Timeout.GetWindowText(str, 50);
        gf_cfg_set_key(gpac->m_user.config, "Streaming", "RTSPTimeout", str);

        m_Buffer.GetWindowText(str, 50);
        gf_cfg_set_key(gpac->m_user.config, "Network", "BufferLength", str);
        if (m_Rebuffer.GetCheck()) {
                m_RebufferLen.GetWindowText(str, 50);
                gf_cfg_set_key(gpac->m_user.config, "Network", "RebufferLength", str);
        } else {
                gf_cfg_set_key(gpac->m_user.config, "Network", "RebufferLength", "0");
        }
}




COptMCache::COptMCache(CWnd* pParent /*=NULL*/)
        : CDialog(COptMCache::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptMCache)
        // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
}


void COptMCache::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptMCache)
        DDX_Control(pDX, IDC_BASEPRES, m_BaseName);
        DDX_Control(pDX, IDC_MCACHE_USENAME, m_UseBase);
        DDX_Control(pDX, IDC_MCACHE_OVERWRITE, m_Overwrite);
        DDX_Control(pDX, IDC_BROWSE_MCACHE, m_RecDir);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptMCache, CDialog)
        //{{AFX_MSG_MAP(COptMCache)
        ON_BN_CLICKED(IDC_BROWSE_MCACHE, OnBrowseMcache)
        ON_BN_CLICKED(IDC_MCACHE_USENAME, OnMcacheUsename)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptMCache message handlers

void COptMCache::OnBrowseMcache()
{
        BROWSEINFO brw;
        LPMALLOC pMalloc;
        LPITEMIDLIST ret;
        char dir[MAX_PATH];

        if (NOERROR == ::SHGetMalloc(&pMalloc) ) {

                m_RecDir.GetWindowText(szCacheDir, MAX_PATH);

                memset(&brw, 0, sizeof(BROWSEINFO));
                brw.hwndOwner = this->GetSafeHwnd();
                brw.pszDisplayName = dir;
                brw.lpszTitle = "Select HTTP Cache Directory...";
                brw.ulFlags = 0L;
                brw.lpfn = LocCbck;

                ret = SHBrowseForFolder(&brw);
                if (ret != NULL) {
                        if (::SHGetPathFromIDList(ret, dir)) {
                                m_RecDir.SetWindowText(dir);
                        }
                        pMalloc->Free(ret);
                }
                pMalloc->Release();
        }
}

BOOL COptMCache::OnInitDialog()
{
        CDialog::OnInitDialog();

        Osmo4 *gpac = GetApp();
        const char *sOpt;

        sOpt = gf_cfg_get_key(gpac->m_user.config, "StreamingCache", "RecordDirectory");
        if (!sOpt) sOpt = gf_cfg_get_key(gpac->m_user.config, "General", "CacheDirectory");
        if (sOpt) m_RecDir.SetWindowText(sOpt);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "StreamingCache", "KeepExistingFiles");
        m_Overwrite.SetCheck((sOpt && !stricmp(sOpt, "yes")) ? 0 : 1);

        sOpt = gf_cfg_get_key(gpac->m_user.config, "StreamingCache", "BaseFileName");
        if (sOpt) {
                m_UseBase.SetCheck(1);
                m_BaseName.EnableWindow(TRUE);
                m_BaseName.SetWindowText(sOpt);
        } else {
                m_UseBase.SetCheck(0);
                m_BaseName.EnableWindow(FALSE);
                m_BaseName.SetWindowText("uses service URL");
        }
        return TRUE;
}

void COptMCache::OnMcacheUsename()
{
        if (m_UseBase.GetCheck()) {
                m_BaseName.EnableWindow(TRUE);
                m_BaseName.SetWindowText("record");
        } else {
                m_BaseName.EnableWindow(FALSE);
                m_BaseName.SetWindowText("uses service URL");
        }
}

void COptMCache::SaveOptions()
{
        Osmo4 *gpac = GetApp();

        gf_cfg_set_key(gpac->m_user.config, "StreamingCache", "KeepExistingFiles", m_Overwrite.GetCheck() ? "no" : "yes");
        if (m_UseBase.GetCheck()) {
                m_BaseName.GetWindowText(szCacheDir, MAX_PATH);
                gf_cfg_set_key(gpac->m_user.config, "StreamingCache", "BaseFileName", szCacheDir);
        } else {
                gf_cfg_set_key(gpac->m_user.config, "StreamingCache", "BaseFileName", NULL);
        }
        m_RecDir.GetWindowText(szCacheDir, MAX_PATH);
        gf_cfg_set_key(gpac->m_user.config, "StreamingCache", "RecordDirectory", szCacheDir);
}


OptFiles::OptFiles(CWnd* pParent /*=NULL*/)
        : CDialog(OptFiles::IDD, pParent)
{
        //{{AFX_DATA_INIT(OptFiles)
        // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
}


void OptFiles::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(OptFiles)
        DDX_Control(pDX, IDC_ASSOCIATE, m_DoAssociate);
        DDX_Control(pDX, IDC_FILES_PLUG, m_PlugName);
        DDX_Control(pDX, IDC_FILES_MIMES, m_mimes);
        DDX_Control(pDX, IDC_FILES_EXT, m_extensions);
        DDX_Control(pDX, IDC_FILELIST, m_FileDescs);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(OptFiles, CDialog)
        //{{AFX_MSG_MAP(OptFiles)
        ON_CBN_SELCHANGE(IDC_FILELIST, OnSelchangeFilelist)
        ON_BN_CLICKED(IDC_ASSOCIATE, OnAssociate)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// OptFiles message handlers

BOOL OptFiles::OnInitDialog()
{
        CDialog::OnInitDialog();

        Osmo4 *gpac = GetApp();
        u32 count, i;

        while (m_FileDescs.GetCount()) m_FileDescs.DeleteString(0);
        count = gf_cfg_get_key_count(gpac->m_user.config, "MimeTypes");
        for (i=0; i<count; i++) {
                char *sMime, *sKey, sDesc[200];
                const char *sOpt;
                sMime = (char *) gf_cfg_get_key_name(gpac->m_user.config, "MimeTypes", i);
                if (!sMime) continue;
                sOpt = gf_cfg_get_key(gpac->m_user.config, "MimeTypes", sMime);
                if (!sOpt) continue;
                sKey = (char *) strstr(sOpt, "\" \"");
                if (!sKey) continue;
                strcpy(sDesc, sKey+3);
                sKey = strchr(sDesc, '\"');
                if (!sKey) continue;
                sKey[0] = 0;
                m_FileDescs.AddString(sDesc);
        }
        m_FileDescs.SetCurSel(0);
        SetSelection(0);
        return TRUE;
}

void OptFiles::OnSelchangeFilelist()
{
        SetSelection(m_FileDescs.GetCurSel());
}

void OptFiles::SetSelection(u32 sel)
{
        Osmo4 *gpac = GetApp();
        char *sMime, *sKey, sDesc[200], sText[200];
        sMime = (char *) gf_cfg_get_key_name(gpac->m_user.config, "MimeTypes", sel);
        sprintf(sText, "Mime Type: %s", sMime);
        m_mimes.SetWindowText(sText);
        strcpy(cur_mime, sMime);
        sMime = (char *) gf_cfg_get_key(gpac->m_user.config, "MimeTypes", sMime);
        strcpy(sDesc, sMime+1);
        sKey = strchr(sDesc, '\"');
        sKey[0] = 0;
        sprintf(sText, "Extensions: %s", sDesc);
        strcpy(cur_ext, sDesc);
        m_extensions.SetWindowText(sText);
        sKey = strrchr(sMime, '\"');
        sprintf(sText, "Module: %s", sKey+2);
        m_PlugName.SetWindowText(sText);

        Bool has_asso, need_asso, go = GF_TRUE;
        sKey = cur_ext;
        need_asso = has_asso = GF_FALSE;

        HKEY hKey;
        DWORD dwSize;
        while (go) {
                Bool ok;
                char szExt[50], szReg[60], c;
                char *tmp = strchr(sKey, ' ');
                if (!tmp) {
                        go = GF_FALSE;
                }
                else {
                        c = tmp[0];
                        tmp[0] = 0;
                }
                sprintf(szExt, ".%s", sKey);
                sprintf(szReg, "GPAC\\%s", sKey);
                if (tmp) {
                        tmp[0] = c;
                        tmp += 1;
                }

                if (RegOpenKeyEx(HKEY_CLASSES_ROOT, szExt, 0, KEY_READ, &hKey ) == ERROR_SUCCESS) {
                        dwSize = 200;
                        ok = GF_TRUE;
                        if (RegQueryValueEx(hKey, "", NULL, NULL,(unsigned char*) sDesc, &dwSize) != ERROR_SUCCESS) ok = GF_FALSE;
                        RegCloseKey(hKey);
                        if (ok && !stricmp((char *)sDesc, szReg)) has_asso = GF_TRUE;
                        else need_asso = GF_TRUE;
                } else need_asso = GF_TRUE;
                sKey = tmp;

        }
        m_DoAssociate.SetCheck(has_asso);
        if (need_asso && has_asso)
                OnAssociate();
}


void OptFiles::OnAssociate()
{
        char *sKey, sDesc[200];
        unsigned char szApp[MAX_PATH];
        unsigned char szIco[MAX_PATH];

        strcpy((char *) szApp, GetApp()->szApplicationPath);
        strcpy((char *) szIco, (const char *) szApp);
        strcat((char *) szIco, "Osmo4.ico");
        strcat((char *) szApp, "Osmo4.exe \"%L\"");

        if (m_DoAssociate.GetCheck()) {
                Bool go = GF_TRUE;
                sKey = cur_ext;

                HKEY hKey;
                DWORD dwSize;
                while (go) {
                        Bool ok;
                        char szExt[50], szReg[60], szOld[80], szPath[1024], c;
                        char *tmp = strchr(sKey, ' ');
                        if (!tmp) {
                                go = GF_FALSE;
                        }
                        else {
                                c = tmp[0];
                                tmp[0] = 0;
                        }
                        sprintf(szExt, ".%s", sKey);
                        sprintf(szReg, "GPAC\\%s", sKey);
                        if (tmp) {
                                tmp[0] = c;
                                tmp += 1;
                        }

                        RegOpenKeyEx(HKEY_CLASSES_ROOT, szExt, 0, 0, &hKey );
                        dwSize = 200;
                        ok = GF_TRUE;
                        if (RegQueryValueEx(hKey, "", NULL, NULL,(unsigned char*) sDesc, &dwSize) != ERROR_SUCCESS) ok = GF_FALSE;
                        RegCloseKey(hKey);
                        strcpy(szOld, "");
                        if (ok && stricmp((char *)sDesc, szReg)) strcpy(szOld, sDesc);

                        strcpy(szPath, szReg);
                        strcat(szPath, "\\DefaultIcon");
                        RegCreateKeyEx(HKEY_CLASSES_ROOT, szPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwSize);
                        RegSetValueEx(hKey, "", 0, REG_SZ, szIco, (DWORD) strlen((const char *) szIco)+1);
                        RegCloseKey(hKey);

                        strcpy(szPath, szReg);
                        strcat(szPath, "\\Shell\\open\\command");
                        RegCreateKeyEx(HKEY_CLASSES_ROOT, szPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwSize);
                        RegSetValueEx(hKey, "", 0, REG_SZ, szApp, (DWORD) strlen((const char *) szApp)+1);
                        RegCloseKey(hKey);

                        if (strlen(szOld)) {
                                strcpy(szPath, szReg);
                                strcat(szPath, "\\Backup");
                                RegCreateKeyEx(HKEY_CLASSES_ROOT, szPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwSize);
                                RegSetValueEx(hKey, "", 0, REG_SZ, (unsigned char *) szOld, (DWORD) strlen((const char *) szIco)+1);
                                RegCloseKey(hKey);
                        }

                        RegCreateKeyEx(HKEY_CLASSES_ROOT, szExt, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwSize);
                        RegSetValueEx(hKey, "", 0, REG_SZ, (const unsigned char *) szReg, (DWORD) strlen(szReg)+1);
                        RegCloseKey(hKey);

                        sKey = tmp;
                }
        } else {
                Bool go = GF_TRUE;
                sKey = cur_ext;

                HKEY hKey;
                DWORD dwSize;
                while (go) {
                        Bool ok;
                        char szExt[50], szReg[60], szPath[1024], c;
                        char *tmp = strchr(sKey, ' ');
                        if (!tmp) {
                                go = GF_FALSE;
                        }
                        else {
                                c = tmp[0];
                                tmp[0] = 0;
                        }
                        sprintf(szExt, ".%s", sKey);
                        sprintf(szReg, "GPAC\\%s", sKey);
                        if (tmp) {
                                tmp[0] = c;
                                tmp += 1;
                        }

                        strcpy(szPath, szReg);
                        strcat(szPath, "\\Backup");
                        RegOpenKeyEx(HKEY_CLASSES_ROOT, szPath, 0, 0, &hKey );
                        dwSize = 200;
                        ok = GF_TRUE;
                        if (RegQueryValueEx(hKey, "", NULL, NULL,(unsigned char*) sDesc, &dwSize) != ERROR_SUCCESS) ok = GF_FALSE;
                        RegCloseKey(hKey);
                        if (ok && strlen((char *)sDesc)) {
                                RegCreateKeyEx(HKEY_CLASSES_ROOT, szExt, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwSize);
                                RegSetValueEx(hKey, "", 0, REG_SZ, (unsigned char*) sDesc, (DWORD) strlen((const char *) sDesc)+1);
                                RegCloseKey(hKey);
                        }

                        RegOpenKeyEx(HKEY_CLASSES_ROOT, szReg, 0, 0, &hKey );
                        RegDeleteKey(hKey, "Backup");
                        RegDeleteKey(hKey, "DefaultIcon");
                        RegDeleteKey(hKey, "Shell\\open\\command");
                        RegDeleteKey(hKey, "Shell\\open");
                        RegDeleteKey(hKey, "Shell");
                        RegCloseKey(hKey);
                        RegDeleteKey(HKEY_CLASSES_ROOT, szReg);

                        sKey = tmp;
                }
        }
}

COptLogs::COptLogs(CWnd* pParent /*=NULL*/)
        : CDialog(COptLogs::IDD, pParent)
{
        //{{AFX_DATA_INIT(COptLogs)
        // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
}


void COptLogs::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(COptLogs)
        DDX_Control(pDX, IDC_TOOL_SYNC, m_sync);
        DDX_Control(pDX, IDC_TOOL_SCRIPT, m_script);
        DDX_Control(pDX, IDC_TOOL_SCENE, m_scene);
        DDX_Control(pDX, IDC_TOOL_RTP, m_rtp);
        DDX_Control(pDX, IDC_TOOL_RENDER, m_render);
        DDX_Control(pDX, IDC_TOOL_PARSER, m_parser);
        DDX_Control(pDX, IDC_TOOL_NET, m_net);
        DDX_Control(pDX, IDC_TOOL_MMIO, m_mmio);
        DDX_Control(pDX, IDC_TOOL_MEDIA, m_media);
        DDX_Control(pDX, IDC_TOOL_CORE, m_core);
        DDX_Control(pDX, IDC_TOOL_CONTAINER, m_container);
        DDX_Control(pDX, IDC_TOOL_COMPOSE, m_compose);
        DDX_Control(pDX, IDC_TOOL_CODING, m_coding);
        DDX_Control(pDX, IDC_TOOL_CODEC, m_codec);
        DDX_Control(pDX, IDC_TOOL_AUTHOR, m_author);
        DDX_Control(pDX, IDC_LOG_LEVEL, m_Level);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptLogs, CDialog)
        //{{AFX_MSG_MAP(COptLogs)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptLogs message handlers

BOOL COptLogs::OnInitDialog()
{
        CDialog::OnInitDialog();

#if 0
        Osmo4 *gpac = GetApp();
        switch (gpac->m_log_level) {
        case GF_LOG_ERROR:
                m_Level.SetCurSel(1);
                break;
        case GF_LOG_WARNING:
                m_Level.SetCurSel(2);
                break;
        case GF_LOG_INFO:
                m_Level.SetCurSel(3);
                break;
        case GF_LOG_DEBUG:
                m_Level.SetCurSel(4);
                break;
        default:
                m_Level.SetCurSel(0);
                break;
        }

        m_sync.SetCheck(gpac->m_log_tools & GF_LOG_SYNC);
        m_script.SetCheck(gpac->m_log_tools & GF_LOG_SCRIPT);
        m_scene.SetCheck(gpac->m_log_tools & GF_LOG_SCENE);
        m_rtp.SetCheck(gpac->m_log_tools & GF_LOG_RTP);
        m_render.SetCheck(gpac->m_log_tools & GF_LOG_COMPOSE);
        m_parser.SetCheck(gpac->m_log_tools & GF_LOG_PARSER);
        m_net.SetCheck(gpac->m_log_tools & GF_LOG_NETWORK);
        m_mmio.SetCheck(gpac->m_log_tools & GF_LOG_MMIO);
        m_media.SetCheck(gpac->m_log_tools & GF_LOG_MEDIA);
        m_core.SetCheck(gpac->m_log_tools & GF_LOG_CORE);
        m_container.SetCheck(gpac->m_log_tools & GF_LOG_CONTAINER);
        m_compose.SetCheck(gpac->m_log_tools & GF_LOG_INTERACT);
        m_coding.SetCheck(gpac->m_log_tools & GF_LOG_CODING);
        m_codec.SetCheck(gpac->m_log_tools & GF_LOG_CODEC);
        m_author.SetCheck(gpac->m_log_tools & GF_LOG_AUTHOR);
#endif

        return TRUE;
}

void COptLogs::SaveOptions()
{
        Osmo4 *gpac = GetApp();
        CString str = "";
        const char *level = "error";
        u32 flags = 0;

        switch (m_Level.GetCurSel()) {
        case 1:
                level = "error";
                break;
        case 2:
                level = "warning";
                break;
        case 3:
                level = "info";
                break;
        case 4:
                level = "debug";
                break;
        default:
                level = "none";
                break;
        }

        if (m_sync.GetCheck()) {
                str +="sync:";
        }
        if (m_script.GetCheck()) {
                str +="script:";
        }
        if (m_scene.GetCheck()) {
                str +="scene:";
        }
        if (m_rtp.GetCheck()) {
                str +="rtp:";
        }
        if (m_render.GetCheck()) {
                str +="compose:";
        }
        if (m_parser.GetCheck()) {
                str +="parser:";
        }
        if (m_net.GetCheck()) {
                str +="network:";
        }
        if (m_mmio.GetCheck()) {
                str +="mmio:";
        }
        if (m_media.GetCheck()) {
                str +="media:";
        }
        if (m_core.GetCheck()) {
                str +="core:";
        }
        if (m_container.GetCheck()) {
                str +="container:";
        }
        if (m_compose.GetCheck()) {
                str +="interact:";
        }
        if (m_coding.GetCheck()) {
                str +="coding:";
        }
        if (m_codec.GetCheck()) {
                str +="codec:";
        }
        if (m_author.GetCheck()) {
                str +="author:";
        }

        gf_cfg_set_key(gpac->m_user.config, "General", "Logs", str);
        str += "@";
        str += level;
        gf_log_set_tools_levels(str);
}

void COptHTTP::OnBnClickedRestartCache()
{
        // TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
}

/* [<][>][^][v][top][bottom][index][help] */