//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1997.
//
//  File:       cdlinfo.cxx
//
//  Contents:
//
//  Classes:
//
//  Functions:
//
//  History:    02-20-97   t-alans (Alan Shi)   Created
//
//----------------------------------------------------------------------------

#include <trans.h>
#include <objbase.h>
#include <wchar.h>

// AS: ICodeDownloadInfo added to urlmon.idl (local change)
//     modified urlint.h to add SZ_CODEDOWNLOADINFO

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::CCodeDownloadInfo
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

CCodeDownloadInfo::CCodeDownloadInfo()
: _szCodeBase( NULL )
, _ulMajorVersion( 0 )
, _ulMinorVersion( 0 )
, _cRefs( 1 )
{
    DEBUG_ENTER((DBG_TRANS,
                None,
                "CCodeDownloadInfo::CCodeDownloadInfo",
                "this=%#x",
                this
                ));

    DEBUG_LEAVE(0);
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::~CCodeDownloadInfo
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

CCodeDownloadInfo::~CCodeDownloadInfo()
{
    DEBUG_ENTER((DBG_TRANS,
                None,
                "CCodeDownloadInfo::~CCodeDownloadInfo",
                "this=%#x",
                this
                ));
                
    if (_szCodeBase != NULL)
    {
        CoTaskMemFree((void *)_szCodeBase);
        _szCodeBase = NULL;
    }

    DEBUG_LEAVE(0);
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::QueryInterface
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

STDMETHODIMP CCodeDownloadInfo::QueryInterface(REFIID riid, void **ppvObj)
{
    DEBUG_ENTER((DBG_TRANS,
                Hresult,
                "CCodeDownloadInfo::IUnknown::QueryInterface",
                "this=%#x, %#x, %#x",
                this, &riid, ppvObj
                ));
                
    HRESULT          hr = S_OK;

    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ICodeDownloadInfo))
    {
        *ppvObj = (void *)this;
        AddRef();
    }
    else
    {
        *ppvObj = NULL;
        hr = E_NOINTERFACE;
    }

    DEBUG_LEAVE(hr);
    return hr;
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::AddRef
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

STDMETHODIMP_(ULONG) CCodeDownloadInfo::AddRef(void)
{
    DEBUG_ENTER((DBG_TRANS,
                Dword,
                "CCodeDownloadInfo::IUnknown::AddRef",
                "this=%#x",
                this
                ));
                
    ULONG ulRet = ++_cRefs;

    DEBUG_LEAVE(hr);
    return ulRet;
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::Release
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

STDMETHODIMP_(ULONG) CCodeDownloadInfo::Release(void)
{
    DEBUG_ENTER((DBG_TRANS,
                Dword,
                "CCodeDownloadInfo::IUnknown::Release",
                "this=%#x",
                this
                ));
                
    if (!--_cRefs)
    {
        delete this;
    }

    DEBUG_LEAVE(_cRefs);
    return _cRefs;
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::GetCodeBase
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

STDMETHODIMP CCodeDownloadInfo::GetCodeBase(LPWSTR *szCodeBase)
{
    DEBUG_ENTER((DBG_TRANS,
                Hresult,
                "CCodeDownloadInfo::GetCodeBase",
                "this=%#x, %.80wq",
                this, szCodeBase
                ));
                
    wcscpy(*szCodeBase, _szCodeBase);

    DEBUG_LEAVE(S_OK);
    return S_OK;
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::SetCodeBase
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

STDMETHODIMP CCodeDownloadInfo::SetCodeBase(LPCWSTR szCodeBase)
{
    DEBUG_ENTER((DBG_TRANS,
                Hresult,
                "CCodeDownloadInfo::SetCodeBase",
                "this=%#x, %.80wq",
                this, szCodeBase
                ));
                
    HRESULT               hr = E_FAIL;
    long                  lStrlen = 0;
    
    if (_szCodeBase != NULL)
    {
        CoTaskMemFree((void *)_szCodeBase);
        _szCodeBase = NULL;
    }
#ifndef unix
    lStrlen = 2 * (wcslen(szCodeBase) + 1);
#else
    lStrlen =  sizeof(WCHAR) * (wcslen(szCodeBase) + 1);
#endif /* unix */
    _szCodeBase = (LPWSTR)CoTaskMemAlloc(lStrlen);
    hr = (_szCodeBase == NULL) ? (E_OUTOFMEMORY) : (S_OK);
    if (_szCodeBase != NULL)
    {
        wcscpy(_szCodeBase, szCodeBase);
    }

    DEBUG_LEAVE(hr);
    return hr;
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::SetMinorVersion
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

STDMETHODIMP CCodeDownloadInfo::SetMinorVersion(ULONG ulVersion)
{
    DEBUG_ENTER((DBG_TRANS,
                Hresult,
                "CCodeDownloadInfo::SetMinorVersion",
                "this=%#x, %x",
                this, ulVersion
                ));
                
    _ulMinorVersion = ulVersion;

    DEBUG_LEAVE(S_OK);
    return S_OK;
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::GetMinorVersion
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

STDMETHODIMP CCodeDownloadInfo::GetMinorVersion(ULONG *pulVersion)
{
    DEBUG_ENTER((DBG_TRANS,
                Hresult,
                "CCodeDownloadInfo::GetMinorVersion",
                "this=%#x, %#x",
                this, pulVersion
                ));
                
    *pulVersion = _ulMinorVersion;

    DEBUG_LEAVE(S_OK);
    return S_OK;
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::SetMajorVersion
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

STDMETHODIMP CCodeDownloadInfo::SetMajorVersion(ULONG ulVersion)
{
    DEBUG_ENTER((DBG_TRANS,
                Hresult,
                "CCodeDownloadInfo::SetMajorVersion",
                "this=%#x, %x",
                this, ulVersion
                ));
                
    _ulMajorVersion = ulVersion;

    DEBUG_LEAVE(S_OK);
    return S_OK;
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::GetMajorVersion
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

STDMETHODIMP CCodeDownloadInfo::GetMajorVersion(ULONG *pulVersion)
{
    DEBUG_ENTER((DBG_TRANS,
                Hresult,
                "CCodeDownloadInfo::GetMajorVersion",
                "this=%#x, %#x",
                this, pulVersion
                ));
                
    *pulVersion = _ulMajorVersion;

    DEBUG_LEAVE(S_OK);
    return S_OK;
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::GetClassID
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

STDMETHODIMP CCodeDownloadInfo::GetClassID(CLSID *clsid)
{
    DEBUG_ENTER((DBG_TRANS,
                Hresult,
                "CCodeDownloadInfo::GetClassID",
                "this=%#x, %#x",
                this, clsid
                ));
                
    *clsid = _clsid;

    DEBUG_LEAVE(S_OK);
    return S_OK;
}

//+---------------------------------------------------------------------------
//
//  Method:     CCodeDownloadInfo::SetClassID
//
//  Synopsis:
//
//  Arguments:  
//              
//              
//
//  Returns:
//
//  History:    01-27-1997   t-alans (Alan Shi)   Created
//
//  Notes:      
//
//----------------------------------------------------------------------------

STDMETHODIMP CCodeDownloadInfo::SetClassID(CLSID clsid)
{
    DEBUG_ENTER((DBG_TRANS,
                Hresult,
                "CCodeDownloadInfo::SetClassID",
                "this=%#x, %#x",
                this, &clsid
                ));
                
    _clsid = clsid;

    DEBUG_LEAVE(S_OK);
    return S_OK;
}