/* -*- Mode: C; tab-width: 4 -*-
*
* Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ControlPanel.h"
#include "ConfigDialog.h"
#include "ConfigPropertySheet.h"
#include "resource.h"
#include <DebugServices.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static CCPApp theApp;
//---------------------------------------------------------------------------------------------------------------------------
// GetControlPanelApp
//---------------------------------------------------------------------------------------------------------------------------
CCPApp*
GetControlPanelApp()
{
CCPApp * pApp = (CCPApp*) AfxGetApp();
check( pApp );
check( pApp->IsKindOf( RUNTIME_CLASS( CCPApp ) ) );
return pApp;
}
//---------------------------------------------------------------------------------------------------------------------------
// CPlApplet
//---------------------------------------------------------------------------------------------------------------------------
LONG APIENTRY
CPlApplet(HWND hWndCPl, UINT uMsg, LONG lParam1, LONG lParam2)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CCPApp * pApp = GetControlPanelApp();
return ( LONG ) pApp->OnCplMsg(hWndCPl, uMsg, lParam1, lParam2);
}
IMPLEMENT_DYNAMIC(CCPApplet, CCmdTarget);
//---------------------------------------------------------------------------------------------------------------------------
// CCPApplet::CCPApplet
//---------------------------------------------------------------------------------------------------------------------------
CCPApplet::CCPApplet(UINT resourceId, UINT descId, CRuntimeClass * uiClass)
:
m_resourceId(resourceId),
m_descId(descId),
m_uiClass(uiClass),
m_pageNumber(0)
{
check( uiClass );
check( uiClass->IsDerivedFrom( RUNTIME_CLASS( CDialog ) ) ||
uiClass->IsDerivedFrom( RUNTIME_CLASS( CPropertySheet ) ) );
m_name.LoadString(resourceId);
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApplet::~CCPApplet
//---------------------------------------------------------------------------------------------------------------------------
CCPApplet::~CCPApplet()
{
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApplet::OnStartParms
//---------------------------------------------------------------------------------------------------------------------------
LRESULT
CCPApplet::OnStartParms(CWnd * pParentWnd, LPCTSTR extra)
{
DEBUG_UNUSED( pParentWnd );
if ( extra )
{
m_pageNumber = ::_ttoi( extra ) - 1;
}
return 0;
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApplet::OnRun
//---------------------------------------------------------------------------------------------------------------------------
LRESULT
CCPApplet::OnRun(CWnd* pParentWnd)
{
LRESULT lResult = 1;
CWnd * pWnd;
InitCommonControls();
pWnd = (CWnd*) m_uiClass->CreateObject();
if ( pWnd )
{
lResult = ERROR_SUCCESS;
if ( pWnd->IsKindOf( RUNTIME_CLASS( CPropertySheet ) ) )
{
CPropertySheet * pSheet = (CPropertySheet*) pWnd;
pSheet->Construct(m_name, pParentWnd, m_pageNumber);
pSheet->DoModal();
}
else
{
check( pWnd->IsKindOf( RUNTIME_CLASS( CDialog ) ) );
CDialog * pDialog = (CDialog*) pWnd;
pDialog->DoModal();
}
delete pWnd;
}
return lResult;
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApplet::OnInquire
//---------------------------------------------------------------------------------------------------------------------------
LRESULT
CCPApplet::OnInquire(CPLINFO* pInfo)
{
pInfo->idIcon = m_resourceId;
pInfo->idName = m_resourceId;
pInfo->idInfo = m_descId;
pInfo->lData = reinterpret_cast<LONG>(this);
return 0;
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApplet::OnNewInquire
//---------------------------------------------------------------------------------------------------------------------------
LRESULT
CCPApplet::OnNewInquire(NEWCPLINFO* pInfo)
{
DEBUG_UNUSED( pInfo );
return 1;
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApplet::OnSelect
//---------------------------------------------------------------------------------------------------------------------------
LRESULT
CCPApplet::OnSelect()
{
return 0;
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApplet::OnStop
//---------------------------------------------------------------------------------------------------------------------------
LRESULT
CCPApplet::OnStop()
{
return 0;
}
IMPLEMENT_DYNAMIC(CCPApp, CWinApp);
//---------------------------------------------------------------------------------------------------------------------------
// CCPApp::CCPApp
//---------------------------------------------------------------------------------------------------------------------------
CCPApp::CCPApp()
{
debug_initialize( kDebugOutputTypeWindowsEventLog, "DNS-SD Control Panel", GetModuleHandle( NULL ) );
debug_set_property( kDebugPropertyTagPrintLevel, kDebugLevelInfo );
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApp::~CCPApp
//---------------------------------------------------------------------------------------------------------------------------
CCPApp::~CCPApp()
{
while ( !m_applets.IsEmpty() )
{
delete m_applets.RemoveHead();
}
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApp::AddApplet
//---------------------------------------------------------------------------------------------------------------------------
void
CCPApp::AddApplet( CCPApplet * applet )
{
check( applet );
m_applets.AddTail( applet );
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApp::OnInit
//---------------------------------------------------------------------------------------------------------------------------
LRESULT
CCPApp::OnInit()
{
CCPApplet * applet;
try
{
applet = new CCPApplet( IDR_APPLET, IDS_APPLET_DESCRIPTION, RUNTIME_CLASS( CConfigPropertySheet ) );
}
catch (...)
{
applet = NULL;
}
require_action( applet, exit, kNoMemoryErr );
AddApplet( applet );
exit:
return m_applets.GetCount();
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApp::OnExit
//---------------------------------------------------------------------------------------------------------------------------
LRESULT
CCPApp::OnExit()
{
return 1;
}
//---------------------------------------------------------------------------------------------------------------------------
// CCPApp::OnCplMsg
//---------------------------------------------------------------------------------------------------------------------------
LRESULT
CCPApp::OnCplMsg(HWND hWndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
{
LRESULT lResult = 1;
switch ( uMsg )
{
case CPL_INIT:
{
lResult = OnInit();
}
break;
case CPL_EXIT:
{
lResult = OnExit();
}
break;
case CPL_GETCOUNT:
{
lResult = m_applets.GetCount();
}
break;
default:
{
POSITION pos = m_applets.FindIndex( lParam1 );
check( pos );
CCPApplet * applet = m_applets.GetAt( pos );
check( applet );
switch (uMsg)
{
case CPL_INQUIRE:
{
LPCPLINFO pInfo = reinterpret_cast<LPCPLINFO>(lParam2);
lResult = applet->OnInquire(pInfo);
}
break;
case CPL_NEWINQUIRE:
{
LPNEWCPLINFO pInfo = reinterpret_cast<LPNEWCPLINFO>(lParam2);
lResult = applet->OnNewInquire(pInfo);
}
break;
case CPL_STARTWPARMS:
{
CWnd * pParentWnd = CWnd::FromHandle(hWndCPl);
LPCTSTR lpszExtra = reinterpret_cast<LPCTSTR>(lParam2);
lResult = applet->OnStartParms(pParentWnd, lpszExtra);
}
break;
case CPL_DBLCLK:
{
CWnd* pParentWnd = CWnd::FromHandle(hWndCPl);
lResult = applet->OnRun(pParentWnd);
}
break;
case CPL_SELECT:
{
lResult = applet->OnSelect();
}
break;
case CPL_STOP:
{
lResult = applet->OnStop();
}
break;
default:
{
// TRACE(_T("Warning, Received an unknown control panel message:%d\n"), uMsg);
lResult = 1;
}
break;
}
}
break;
}
return lResult;
}