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.
 
 
 
 
 
 

266 lines
6.7 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
FaxJobsCollection.h
Abstract:
Implementation of Copy Policy Classes and Job Collection Class.
Author:
Iv Garber (IvG) May, 2000
Revision History:
--*/
#ifndef __FAXJOBSCOLLECTION_H_
#define __FAXJOBSCOLLECTION_H_
#include "VCUE_Copy.h"
//
//================= FAX JOB COLLECTION TEMPLATE ================================
//
template <class CollectionIfc, class ContainerType, class CollectionExposedType, class CollectionCopyType,
class EnumType, class JobClass, const IID* piid, const CLSID* pcid>
class JobCollection : public ICollectionOnSTLImpl<CollectionIfc, ContainerType, CollectionExposedType*,
CollectionCopyType, EnumType>
{
public :
JobCollection()
{
DBG_ENTER(_T("JOB COLLECTION :: CREATE"));
}
~JobCollection()
{
DBG_ENTER(_T("JOB COLLECTION :: DESTROY"));
CCollectionKiller<ContainerType> CKiller;
CKiller.EmptyObjectCollection(&m_coll);
}
// Interfaces
STDMETHOD(get_Item)(/*[in]*/ VARIANT vIndex, /*[out, retval]*/ CollectionExposedType **pFaxJob);
// Internal Use
HRESULT Init(FAX_JOB_ENTRY_EX* pJobs, DWORD dwJobCount, IFaxServerInner *pFaxServerInner);
};
//
//============================= GET ITEM =========================================
//
template <class CollectionIfc, class ContainerType, class CollectionExposedType,
class CollectionCopyType, class EnumType, class JobClass, const IID* piid,
const CLSID* pcid>
STDMETHODIMP
JobCollection<CollectionIfc, ContainerType, CollectionExposedType, CollectionCopyType, EnumType, JobClass,
piid, pcid>::get_Item(
/*[in]*/ VARIANT vIndex,
/*[out, retval]*/ CollectionExposedType **pFaxJob
)
/*++
Routine name : JobCollection::get_Item
Routine description:
Return Item Job from the Collection.
Author:
Iv Garber (IvG), May, 2000
Arguments:
vIndex [in] - Index of the Job to find
pFaxJob [out] - the resulting Job Object
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER(_T("JobCollection::get_Item"), hr);
if (::IsBadWritePtr(pFaxJob, sizeof(CollectionExposedType *)))
{
//
// Invalid Argument
//
hr = E_POINTER;
AtlReportError(*pcid, IDS_ERROR_INVALID_ARGUMENT, *piid, hr);
CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr(pFaxJob)"), hr);
return hr;
}
CComVariant var;
if (vIndex.vt != VT_BSTR)
{
//
// vIndex is not BSTR ==> convert to VT_I4
//
hr = var.ChangeType(VT_I4, &vIndex);
if (SUCCEEDED(hr))
{
VERBOSE(DBG_MSG, _T("Parameter is Number : %d"), var.lVal);
//
// call default ATL's implementation
//
hr = ICollectionOnSTLImpl<CollectionIfc, ContainerType, CollectionExposedType*,
CollectionCopyType, EnumType>::get_Item(var.lVal, pFaxJob);
return hr;
}
}
//
// convert to BSTR
//
hr = var.ChangeType(VT_BSTR, &vIndex);
if (FAILED(hr))
{
//
// Got wrong vIndex
//
hr = E_INVALIDARG;
AtlReportError(*pcid, IDS_ERROR_INVALIDINDEX, *piid, hr);
CALL_FAIL(GENERAL_ERR, _T("var.ChangeType(VT_BSTR, &vIndex)"), hr);
return hr;
}
VERBOSE(DBG_MSG, _T("Parameter is String : %s"), var.bstrVal);
ContainerType::iterator it = m_coll.begin();
while (it != m_coll.end())
{
CComBSTR bstrMsgId;
hr = (*it)->get_Id(&bstrMsgId);
if (FAILED(hr))
{
CALL_FAIL(GENERAL_ERR, _T("it->get_Id(&dwlMsgid)"), hr);
AtlReportError(*pcid, GetErrorMsgId(hr), *piid, hr);
return hr;
}
if (_tcsicmp(bstrMsgId, var.bstrVal) == 0)
{
//
// found the desired Job
//
(*it)->AddRef();
*pFaxJob = *it;
return hr;
}
it++;
}
//
// Job not found
//
hr = E_INVALIDARG;
CALL_FAIL(GENERAL_ERR, _T("Job Not Found"), hr);
AtlReportError(*pcid, IDS_ERROR_INVALIDMSGID, *piid, hr);
return hr;
}
//
//============================= INIT =========================================
//
template <class CollectionIfc, class ContainerType, class CollectionExposedType, class CollectionCopyType,
class EnumType, class JobType, const IID* piid, const CLSID* pcid>
HRESULT
JobCollection<CollectionIfc, ContainerType, CollectionExposedType, CollectionCopyType, EnumType,
JobType, piid, pcid>::Init(
/*[in]*/ FAX_JOB_ENTRY_EX *pJobs,
/*[in]*/ DWORD dwJobCount,
/*[in]*/ IFaxServerInner *pFaxServerInner
)
/*++
Routine name : JobCollection::Init
Routine description:
Fill the collection with pointers to structures
Author:
Iv Garber (IvG), May, 2000
Arguments:
pJobs [in] - ptr to array of structs
dwJobCount [in] - num of structs in the array
pFaxServerInner [in] - ptr to Fax Server object
Return Value:
Standard HRESULT code
--*/
{
HRESULT hr = S_OK;
DBG_ENTER(_T("JobCollection::Init"), hr);
//
// Fill collection with data :
// create object for each element in structure
//
for ( long i = 0 ; i < dwJobCount ; i++ )
{
//
// Create Job Object
//
CComPtr<CollectionExposedType> pNewJobObject;
hr = JobType::Create(&pNewJobObject);
if (FAILED(hr))
{
AtlReportError(*pcid, IDS_ERROR_OPERATION_FAILED, *piid, hr);
CALL_FAIL(GENERAL_ERR, _T("JobType::Create(&pNewJobObject)"), hr);
return hr;
}
//
// Initialize the Job Object
//
hr = ((JobType *)((CollectionExposedType *)pNewJobObject))->Init(&pJobs[i], pFaxServerInner);
if (FAILED(hr))
{
AtlReportError(*pcid, IDS_ERROR_OPERATION_FAILED, *piid, hr);
CALL_FAIL(GENERAL_ERR, _T("pNewJobObject->Init()"), hr);
return hr;
}
//
// Put the Object in the collection
//
try
{
m_coll.push_back(pNewJobObject);
}
catch (exception &)
{
//
// Failed to put ptr to the new Job Object in the vector
//
hr = E_OUTOFMEMORY;
AtlReportError(*pcid, IDS_ERROR_OUTOFMEMORY, *piid, hr);
CALL_FAIL(MEM_ERR, _T("m_coll.push_back(pNewJobObject.Detach())"), hr);
return hr;
}
pNewJobObject.Detach();
}
return hr;
}
#endif // __FAXJOBSCOLLECTION_H_