//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 2000.
//
//  File:       C D Y N A M I C C O N T E N T S O U R C E . C P P 
//
//  Contents:   
//
//  Notes:      
//
//  Author:     mbend   17 Aug 2000
//
//----------------------------------------------------------------------------

#include "pch.h"
#pragma hdrstop

#include "uhbase.h"
#include "hostp.h"
#include "DynamicContentSource.h"
#include "uhsync.h"
#include "uhcommon.h"

CDynamicContentSource::CDynamicContentSource()
{
}

STDMETHODIMP CDynamicContentSource::GetContent(
    /*[in]*/ REFGUID guidContent,
    /*[out]*/ long * pnHeaderCount,
    /*[out, string, size_is(,*pnHeaderCount,)]*/ wchar_t *** parszHeaders,
    /*[out]*/ long * pnBytes,
    /*[out, size_is(,*pnBytes)]*/ byte ** parBytes)
{
    CHECK_POINTER(pnHeaderCount);
    CHECK_POINTER(parszHeaders);
    CHECK_POINTER(pnBytes);
    CHECK_POINTER(parBytes);
    
    CALock lock(*this);
    HRESULT hr = E_INVALIDARG;

    hr = HrIsAllowedCOMCallLocality((CALL_LOCALITY) CALL_LOCALITY_INPROC);
    
    if (SUCCEEDED(hr))
    {
        long nCount = m_providerArray.GetCount();
        for(long n = 0; n < nCount; ++n)
        {
            hr = m_providerArray[n]->GetContent(
                guidContent, 
                pnHeaderCount, 
                parszHeaders, 
                pnBytes, 
                parBytes);
            if(FAILED(hr) || S_OK == hr)
            {
                break;
            }
        }
        if(S_FALSE == hr)
        {
            TraceTag(ttidError, "CDynamicContentSource::GetContent - cannot find content");
            // We didn't find anything so convert to an error
            hr = E_INVALIDARG;
        }
    }

    TraceHr(ttidError, FAL, hr, FALSE, "CDynamicContentSource::GetContent");
    return hr;
}

STDMETHODIMP CDynamicContentSource::RegisterProvider(
    /*[in]*/ IUPnPDynamicContentProvider * pProvider)
{
    CHECK_POINTER(pProvider);
    CALock lock(*this);

    HRESULT hr = S_OK;
    IUPnPDynamicContentProviderPtr p;
    p = pProvider;

    hr = HrIsAllowedCOMCallLocality((CALL_LOCALITY) CALL_LOCALITY_INPROC);
    
    if (SUCCEEDED(hr))
    {
        hr = m_providerArray.HrPushBack(p);
    }

    TraceHr(ttidError, FAL, hr, FALSE, "CDynamicContentSource::RegisterProvider");
    return hr;
}

STDMETHODIMP CDynamicContentSource::UnregisterProvider(
    /*[in]*/ IUPnPDynamicContentProvider * pProvider)
{
    CHECK_POINTER(pProvider);
    CALock lock(*this);

    HRESULT hr = S_OK;
    IUPnPDynamicContentProviderPtr p;
    p = pProvider;
    long nIndex = 0;

    hr = HrIsAllowedCOMCallLocality((CALL_LOCALITY) CALL_LOCALITY_INPROC);
    
    if (SUCCEEDED(hr))
    {
        hr = m_providerArray.HrFind(p, nIndex);
    }

    if(SUCCEEDED(hr))
    {
        hr = m_providerArray.HrErase(nIndex);
    }

    TraceHr(ttidError, FAL, hr, FALSE, "CDynamicContentSource::UnregisterProvider");
    return hr;
}