hackedteam/core-winmobile

View on GitHub
SmsFilter/Factory.cpp

Summary

Maintainability
Test Coverage
#include "Factory.h"
#include "MapiRule.h"

extern int g_cServerLocks;

/**
 *    .ctor
 *    Initialize count ref.
 **/
CFactory::CFactory()
    :    m_cRef(1)
{
}

/**
 *    .dtor
 *    Default denstructor
 **/
CFactory::~CFactory()
{
}

HRESULT CFactory::QueryInterface(REFIID rif, void** ppobj)
{
    if (!ppobj)
        return E_INVALIDARG;

    *ppobj = NULL;

    if ((rif == IID_IUnknown) || (rif == IID_IClassFactory)) {
        *ppobj = (LPVOID) this;
    }

    if (*ppobj)
        ((LPUNKNOWN)*ppobj)->AddRef();

    return (*ppobj) ? S_OK : E_NOINTERFACE;
}


/**
 *    AddRef
 *    COM reference counting
 *
 *    Implements IUnknown::AddRef by adding 1 to the object's reference count
 **/
ULONG CFactory::AddRef()
{
    return InterlockedIncrement(&m_cRef);
}

/**
 *    Release
 *    COM reference counting
 **/
ULONG CFactory::Release()
{
    InterlockedDecrement(&m_cRef);

    if (m_cRef == 0) {
        delete this;
        return 0;
    }

    return m_cRef;
}

STDMETHODIMP CFactory::CreateInstance(IUnknown *pUnknownOuter, REFIID iid, LPVOID *ppv)
{
    CMailRuleClient *pClient = NULL;

    if (pUnknownOuter)
        return CLASS_E_NOAGGREGATION;

    pClient = new CMailRuleClient();

    if (pClient == NULL)
        return E_OUTOFMEMORY;

    return pClient->QueryInterface(iid, ppv);
}

STDMETHODIMP CFactory::LockServer(BOOL bLock)
{
    if (bLock)
        g_cServerLocks++;
    else
        g_cServerLocks--;

    return S_OK;
}