blob: e578e23935f5f3d941da87e8f3e141ab4313363f [file] [log] [blame]
/* -*- Mode: C; tab-width: 4 -*-
*
* Copyright (c) 2003-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 "StdAfx.h"
#include "DebugServices.h"
#include "ExplorerBar.h"
#include "ExplorerPlugin.h"
#include "ClassFactory.h"
// MFC Debugging
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//===========================================================================================================================
// ClassFactory
//===========================================================================================================================
ClassFactory::ClassFactory( CLSID inCLSID )
{
mCLSIDObject = inCLSID;
mRefCount = 1;
++gDLLRefCount;
}
//===========================================================================================================================
// ~ClassFactory
//===========================================================================================================================
ClassFactory::~ClassFactory( void )
{
check( gDLLRefCount > 0 );
--gDLLRefCount;
}
#if 0
#pragma mark -
#pragma mark == IUnknown methods ==
#endif
//===========================================================================================================================
// QueryInterface
//===========================================================================================================================
STDMETHODIMP ClassFactory::QueryInterface( REFIID inID, LPVOID *outResult )
{
HRESULT err;
check( outResult );
if( IsEqualIID( inID, IID_IUnknown ) )
{
*outResult = this;
}
else if( IsEqualIID( inID, IID_IClassFactory ) )
{
*outResult = (IClassFactory *) this;
}
else
{
*outResult = NULL;
err = E_NOINTERFACE;
goto exit;
}
( *( (LPUNKNOWN *) outResult ) )->AddRef();
err = S_OK;
exit:
return( err );
}
//===========================================================================================================================
// AddRef
//===========================================================================================================================
STDMETHODIMP_( DWORD ) ClassFactory::AddRef( void )
{
return( ++mRefCount );
}
//===========================================================================================================================
// Release
//===========================================================================================================================
STDMETHODIMP_( DWORD ) ClassFactory::Release( void )
{
DWORD count;
count = --mRefCount;
if( count == 0 )
{
delete this;
}
return( count );
}
#if 0
#pragma mark -
#pragma mark == IClassFactory methods ==
#endif
//===========================================================================================================================
// CreateInstance
//===========================================================================================================================
STDMETHODIMP ClassFactory::CreateInstance( LPUNKNOWN inUnknown, REFIID inID, LPVOID *outObject )
{
HRESULT err;
LPVOID obj;
check( outObject );
obj = NULL;
*outObject = NULL;
require_action( !inUnknown, exit, err = CLASS_E_NOAGGREGATION );
// Create the object based on the CLSID.
if( IsEqualCLSID( mCLSIDObject, CLSID_ExplorerBar ) )
{
try
{
obj = new ExplorerBar();
}
catch( ... )
{
// Don't let exception escape.
}
require_action( obj, exit, err = E_OUTOFMEMORY );
}
else
{
err = E_FAIL;
goto exit;
}
// Query for the specified interface. Release the factory since QueryInterface retains it.
err = ( (LPUNKNOWN ) obj )->QueryInterface( inID, outObject );
( (LPUNKNOWN ) obj )->Release();
exit:
return( err );
}
//===========================================================================================================================
// LockServer
//===========================================================================================================================
STDMETHODIMP ClassFactory::LockServer( BOOL inLock )
{
DEBUG_UNUSED( inLock );
return( E_NOTIMPL );
}