/*++ 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 JobCollection : public ICollectionOnSTLImpl { public : JobCollection() { DBG_ENTER(_T("JOB COLLECTION :: CREATE")); } ~JobCollection() { DBG_ENTER(_T("JOB COLLECTION :: DESTROY")); CCollectionKiller 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 STDMETHODIMP JobCollection::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::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 HRESULT JobCollection::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 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_