Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

207 lines
4.6 KiB

#include "inspch.h"
#include "inseng.h"
#include "download.h"
#include "site.h"
#include "util2.h"
CDownloadSite::CDownloadSite(DOWNLOADSITE *p)
{
m_cRef = 0;
m_pdls = p;
DllAddRef();
}
CDownloadSite::~CDownloadSite()
{
if(m_pdls)
FreeDownloadSite(m_pdls);
DllRelease();
}
//************ IUnknown implementation ***************
//=--------------------------------------------------------------------------=
// Function name here
//=--------------------------------------------------------------------------=
// Function description
//
// Parameters:
//
// Returns:
//
// Notes:
//
STDMETHODIMP_(ULONG) CDownloadSite::AddRef()
{
return(m_cRef++);
}
//=--------------------------------------------------------------------------=
// Function name here
//=--------------------------------------------------------------------------=
// Function description
//
// Parameters:
//
// Returns:
//
// Notes:
//
STDMETHODIMP_(ULONG) CDownloadSite::Release()
{
ULONG temp = --m_cRef;
if(temp == 0)
delete this;
return temp;
}
//=--------------------------------------------------------------------------=
// Function name here
//=--------------------------------------------------------------------------=
// Function description
//
// Parameters:
//
// Returns:
//
// Notes:
//
STDMETHODIMP CDownloadSite::QueryInterface(REFIID riid, void **ppv)
{
*ppv = NULL;
if((riid == IID_IUnknown) || (riid == IID_IDownloadSite))
*ppv = (IDownloadSite *)this;
if(*ppv == NULL)
return E_NOINTERFACE;
AddRef();
return NOERROR;
}
//=--------------------------------------------------------------------------=
// Function name here
//=--------------------------------------------------------------------------=
// Function description
//
// Parameters:
//
// Returns:
//
// Notes:
//
STDMETHODIMP CDownloadSite::GetData(DOWNLOADSITE **ppdls)
{
if(ppdls)
*ppdls = m_pdls;
else
return E_POINTER;
return NOERROR;
}
// BUGBUG: I have two versions - one allocating using new (HeapAlloc)
// for internal use, one using CoTaskMem... that I give away.
// I am using new internally because I suspect it may be faster/less
// expensive. but this makes code more complex. Good choice?
// BUGBUG: Allow null url or friendly name?
IDownloadSite *CopyDownloadSite(DOWNLOADSITE *pdls)
{
DOWNLOADSITE *p;
IDownloadSite *psite = NULL;
p = (DOWNLOADSITE *) CoTaskMemAlloc(sizeof(DOWNLOADSITE));
if(p)
{
p->cbSize = sizeof(DOWNLOADSITE);
p->pszUrl = COPYANSISTR(pdls->pszUrl);
p->pszFriendlyName = COPYANSISTR(pdls->pszFriendlyName);
p->pszLang = COPYANSISTR(pdls->pszLang);
p->pszRegion = COPYANSISTR(pdls->pszRegion);
if(!p->pszUrl || !p->pszFriendlyName || !p->pszLang || !p->pszRegion)
{
FreeDownloadSite(p);
p = NULL;
}
}
if(p)
{
//allocate the interface wrapper
CDownloadSite *site = new CDownloadSite(p);
if(site)
{
psite = (IDownloadSite *)site;
psite->AddRef();
}
}
return psite;
}
DOWNLOADSITE *AllocateDownloadSite(LPCSTR pszUrl, LPCSTR pszName, LPCSTR pszLang, LPCSTR pszRegion)
{
DOWNLOADSITE *p = new DOWNLOADSITE;
if(p)
{
p->cbSize = sizeof(DOWNLOADSITE);
p->pszUrl = CopyAnsiStr(pszUrl);
p->pszFriendlyName = CopyAnsiStr(pszName);
p->pszLang = CopyAnsiStr(pszLang);
p->pszRegion = CopyAnsiStr(pszRegion);
if(!p->pszUrl || !p->pszFriendlyName || !p->pszLang || !p->pszRegion)
{
DeleteDownloadSite(p);
p = NULL;
}
}
return p;
}
// this version deletes a DOWNLOADSITE allocated from the heap
void DeleteDownloadSite(DOWNLOADSITE *pdls)
{
if(pdls)
{
if(pdls->pszUrl)
delete pdls->pszUrl;
if(pdls->pszFriendlyName)
delete pdls->pszFriendlyName;
if(pdls->pszLang)
delete pdls->pszLang;
if(pdls->pszRegion)
delete pdls->pszRegion;
delete pdls;
}
}
// this version deletes a DOWNLOADSITE allocated thru CoTaskMemAlloc
void FreeDownloadSite(DOWNLOADSITE *pdls)
{
if(pdls)
{
if(pdls->pszUrl)
CoTaskMemFree(pdls->pszUrl);
if(pdls->pszFriendlyName)
CoTaskMemFree(pdls->pszFriendlyName);
if(pdls->pszLang)
CoTaskMemFree(pdls->pszLang);
if(pdls->pszRegion)
CoTaskMemFree(pdls->pszRegion);
CoTaskMemFree(pdls);
}
}