//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1994. // // File: ulsmeet.cpp // // Contents: MeetingPlace Object implementation // // Classes: CIlsMeetingPlace, CEnumMeetingPlace, CIlsAttendee, CEnumAttendee // // Functions: // // History: 11/25/96 Shishir Pardikar [shishirp] Created // // Notes: // //---------------------------------------------------------------------------- #include "ulsp.h" #ifdef ENABLE_MEETING_PLACE #include "ulsmeet.h" #include "callback.h" #include "filter.h" /*************************************************************************** Notification functions. These functions are called by the general purpose connectionpoint object. These are called for each Sink object attached to the connection point using "Advise" member function of the IConnectionPoint interface ****************************************************************************/ //**************************************************************************** // // HRESULT OnNotifyRegisterMeetingPlaceResult(IUnknown *pUnk, void *pv) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** HRESULT OnNotifyRegisterMeetingPlaceResult(IUnknown *pUnk, void *pv) { POBJRINFO pobjri = (POBJRINFO)pv; ((IIlsMeetingPlaceNotify *)pUnk)->RegisterResult(pobjri->uReqID, pobjri->hResult); return S_OK; } //**************************************************************************** // // HRESULT OnNotifyUnregisterMeetingPlaceResult(IUnknown *pUnk, void *pv) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** HRESULT OnNotifyUnregisterMeetingPlaceResult(IUnknown *pUnk, void *pv) { POBJRINFO pobjri = (POBJRINFO)pv; ((IIlsMeetingPlaceNotify *)pUnk)->RegisterResult(pobjri->uReqID, pobjri->hResult); return S_OK; } //**************************************************************************** // // HRESULT OnNotifyUpdateMeetingPlaceResult(IUnknown *pUnk, void *pv) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** HRESULT OnNotifyUpdateMeetingPlaceResult(IUnknown *pUnk, void *pv) { POBJRINFO pobjri = (POBJRINFO)pv; ((IIlsMeetingPlaceNotify *)pUnk)->UpdateResult(pobjri->uReqID, pobjri->hResult); return S_OK; } //**************************************************************************** // // HRESULT OnNotifyAddAttendeeResult(IUnknown *pUnk, void *pv) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** HRESULT OnNotifyAddAttendeeResult(IUnknown *pUnk, void *pv) { POBJRINFO pobjri = (POBJRINFO)pv; ((IIlsMeetingPlaceNotify *)pUnk)->AttendeeChangeResult(pobjri->uReqID, pobjri->hResult); return S_OK; } //**************************************************************************** // // HRESULT OnNotifyRemoveAttendeeResult(IUnknown *pUnk, void *pv) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** HRESULT OnNotifyRemoveAttendeeResult(IUnknown *pUnk, void *pv) { POBJRINFO pobjri = (POBJRINFO)pv; ((IIlsMeetingPlaceNotify *)pUnk)->AttendeeChangeResult(pobjri->uReqID, pobjri->hResult); return S_OK; } //**************************************************************************** // // HRESULT OnNotifyEnumAttendeeNamesResult(IUnknown *pUnk, void *pv) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** HRESULT OnNotifyEnumAttendeeNamesResult(IUnknown *pUnk, void *pv) { CEnumNames *penum = NULL; PENUMRINFO peri = (PENUMRINFO)pv; HRESULT hr = peri->hResult; // Create the enumerator only when there is anything to be enumerated // if (hr == NOERROR) { ASSERT (peri->pv != NULL); // Create an AttendeeName enumerator // penum = new CEnumNames; if (penum != NULL) { hr = penum->Init((LPTSTR)peri->pv, peri->cItems); if (SUCCEEDED(hr)) { penum->AddRef(); } else { delete penum; penum = NULL; }; } else { hr = ILS_E_MEMORY; }; }; // Notify the sink object // ((IIlsMeetingPlaceNotify*)pUnk)->EnumAttendeeNamesResult(peri->uReqID, penum != NULL ? (IEnumIlsNames *)penum : NULL, hr); if (penum != NULL) { penum->Release(); }; return hr; } //**************************************************************************** // //CIlsMeetingPlace class implementation // //**************************************************************************** //**************************************************************************** // Method: CIlsMeetingPlace::CIlsMeetingPlace (void) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** CIlsMeetingPlace:: CIlsMeetingPlace ( VOID ) :m_cRef (0), m_ulState (NULL), m_pszMeetingPlaceID (NULL), m_lMeetingPlaceType (UNDEFINED_TYPE), m_lAttendeeType (UNDEFINED_TYPE), m_pszHostName (NULL), m_pszHostIPAddress (NULL), m_pszDescription (NULL), m_hMeetingPlace (NULL), m_dwFlags (0), m_pIlsServer (NULL), m_pConnectionPoint (NULL) { m_ExtendedAttrs.SetAccessType (ILS_ATTRTYPE_NAME_VALUE); } //**************************************************************************** // CIlsMeetingPlace::~CIlsMeetingPlace (void) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** CIlsMeetingPlace:: ~CIlsMeetingPlace ( VOID ) { ::MemFree (m_pszMeetingPlaceID); ::MemFree (m_pszHostName); ::MemFree (m_pszHostIPAddress); ::MemFree (m_pszDescription); // Release the connection point // if (m_pConnectionPoint != NULL) { m_pConnectionPoint->ContainerReleased(); ((IConnectionPoint*)m_pConnectionPoint)->Release(); } // Free up the server object // if (m_pIlsServer != NULL) m_pIlsServer->Release (); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::AllocMeetInfo(PLDAP_MEETINFO *ppMeetInfo, ULONG ulMask) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::AllocMeetInfo(PLDAP_MEETINFO *ppMeetInfo, ULONG ulMask) { HRESULT hr = NOERROR; PLDAP_MEETINFO pMeetInfo = NULL; LPBYTE pBuffRunning; DWORD cbT, cbAttribSize, cntAttrs; DWORD cbTotalSize = sizeof(LDAP_MEETINFO); TCHAR *pszPairs = NULL; ASSERT(m_pIlsServer != NULL); ASSERT(m_pszMeetingPlaceID != NULL); cbTotalSize += lstrlen(m_pszMeetingPlaceID)+1; cbTotalSize += ( (((ulMask & ILS_MEET_FLAG_DESCRIPTION_MODIFIED) && m_pszDescription)?(lstrlen(m_pszDescription)+1):0) +(((ulMask & ILS_MEET_FLAG_HOST_NAME_MODIFIED) && m_pszHostName)?(lstrlen(m_pszHostName)+1):0) +(((ulMask & ILS_MEET_FLAG_HOST_ADDRESS_MODIFIED) && m_pszHostIPAddress)?(lstrlen(m_pszHostIPAddress)+1):0) ); cbTotalSize *= sizeof(TCHAR); // if we need to send in the extended attributes, do that cbAttribSize = 0; if ((ulMask & ILS_MEET_FLAG_EXTENDED_ATTRIBUTES_MODIFIED)) { hr = m_ExtendedAttrs.GetAttributePairs(&pszPairs, &cntAttrs, &cbAttribSize); if (!SUCCEEDED(hr)) { goto bailout; } } cbTotalSize += cbAttribSize; // zeroized buffer pMeetInfo = (PLDAP_MEETINFO) ::MemAlloc (cbTotalSize); if (pMeetInfo == NULL) { hr = ILS_E_MEMORY; goto bailout; } pMeetInfo->uSize = cbTotalSize; pMeetInfo->lMeetingPlaceType = m_lMeetingPlaceType; pMeetInfo->lAttendeeType = m_lAttendeeType; pBuffRunning = (LPBYTE)(pMeetInfo+1); memcpy(pBuffRunning, m_pszMeetingPlaceID, cbT = (lstrlen(m_pszMeetingPlaceID)+1)*sizeof(TCHAR)); pMeetInfo->uOffsetMeetingPlaceID = (ULONG)((LPBYTE)pBuffRunning - (LPBYTE)pMeetInfo); pBuffRunning += cbT; if ((ulMask & ILS_MEET_FLAG_DESCRIPTION_MODIFIED) && m_pszDescription) { memcpy(pBuffRunning, m_pszDescription, cbT = (lstrlen(m_pszDescription)+1)*sizeof(TCHAR)); pMeetInfo->uOffsetDescription = (ULONG)((LPBYTE)pBuffRunning - (LPBYTE)pMeetInfo); pBuffRunning += cbT; } if ((ulMask & ILS_MEET_FLAG_HOST_NAME_MODIFIED) && m_pszHostName) { memcpy(pBuffRunning, m_pszHostName, cbT = (lstrlen(m_pszHostName)+1)*sizeof(TCHAR)); pMeetInfo->uOffsetHostName = (ULONG)((LPBYTE)pBuffRunning - (LPBYTE)pMeetInfo); pBuffRunning += cbT; } if ((ulMask & ILS_MEET_FLAG_HOST_ADDRESS_MODIFIED) && m_pszHostIPAddress) { memcpy(pBuffRunning, m_pszHostIPAddress, cbT = lstrlen(m_pszHostIPAddress)+1); pMeetInfo->uOffsetHostIPAddress = (ULONG)((LPBYTE)pBuffRunning - (LPBYTE)pMeetInfo); pBuffRunning += cbT; } if((ulMask & ILS_MEET_FLAG_EXTENDED_ATTRIBUTES_MODIFIED)) { if (pszPairs) { memcpy(pBuffRunning, pszPairs, cbAttribSize); pMeetInfo->uOffsetAttrsToAdd = (ULONG)((LPBYTE)pBuffRunning - (LPBYTE)pMeetInfo); pMeetInfo->cAttrsToAdd = cntAttrs; pBuffRunning += cbAttribSize; } } *ppMeetInfo = pMeetInfo; bailout: if (!SUCCEEDED(hr)) { if (pMeetInfo) { ::MemFree (pMeetInfo); } } // the attribute pairs list needs to be freed // whether we succeeded or not if (pszPairs) { ::MemFree (pszPairs); } return hr; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::Init(BSTR bstrMeetingPlaceID, LONG lMeetingPlaceType // , LONG lAttendeeType) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::Init( BSTR bstrMeetingPlaceID, LONG lMeetingPlaceType, LONG lAttendeeType) { HRESULT hr; if (bstrMeetingPlaceID==NULL){ return (ILS_E_PARAMETER); } ASSERT(m_ulState == ILS_UNREGISTERED); ASSERT(m_pIlsServer == NULL); ASSERT(m_pszMeetingPlaceID == NULL); hr = BSTR_to_LPTSTR(&m_pszMeetingPlaceID, bstrMeetingPlaceID); if (!SUCCEEDED(hr)) { goto bailout; } // Make the single connection point // When enumerating the ConnectionPointContainer // he is the single guy we will give out if (SUCCEEDED(hr)) { m_pConnectionPoint = new CConnectionPoint (&IID_IIlsMeetingPlaceNotify, (IConnectionPointContainer *)this); if (m_pConnectionPoint != NULL) { ((IConnectionPoint*)m_pConnectionPoint)->AddRef(); hr = S_OK; } else { hr = ILS_E_MEMORY; } } if (SUCCEEDED(hr)) { m_lMeetingPlaceType = lMeetingPlaceType; m_lAttendeeType = lAttendeeType; } bailout: if (!SUCCEEDED(hr)) { // do cleanup if (m_pszMeetingPlaceID) { ::MemFree (m_pszMeetingPlaceID); m_pszMeetingPlaceID = NULL; // general paranoia } if (m_pConnectionPoint) { delete m_pConnectionPoint; m_pConnectionPoint = NULL; } } return hr; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::Init(LPTSTR lpszServer, PLDAP_MEETINFO pmi); // // Synopsis: This initializes the MeetingPlace object based on the MEETINFO structure // This is used to stuff data into the meeting object from // the response obtained from the server to the query _MEETINFO // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::Init( CIlsServer *pIlsServer, PLDAP_MEETINFO pmi ) { HRESULT hr; ASSERT(NULL==m_pszMeetingPlaceID); ASSERT(NULL==m_pIlsServer); //validate bstrMeetingPlaceID hr = SafeSetLPTSTR(&m_pszMeetingPlaceID, (LPCTSTR)(((PBYTE)pmi)+pmi->uOffsetMeetingPlaceID)); if (!SUCCEEDED(hr)){ goto bailout; } // set the state to registered m_ulState = ILS_REGISTERED; // set the server field m_pIlsServer = pIlsServer; pIlsServer->AddRef (); hr = SafeSetLPTSTR(&m_pszDescription, (LPCTSTR)(((PBYTE)pmi)+pmi->uOffsetDescription)); if (!SUCCEEDED(hr)) { goto bailout; } hr = SafeSetLPTSTR(&m_pszHostName, (LPCTSTR)(((PBYTE)pmi)+pmi->uOffsetHostName)); if (!SUCCEEDED(hr)) { goto bailout; } hr = SafeSetLPTSTR(&m_pszHostIPAddress, (LPCTSTR)(((PBYTE)pmi)+pmi->uOffsetHostIPAddress)); if (!SUCCEEDED(hr)) { goto bailout; } // Make the single connection point // When enumerating the ConnectionPointContainer // he is the single guy we will give out m_pConnectionPoint = new CConnectionPoint (&IID_IIlsMeetingPlaceNotify, (IConnectionPointContainer *)this); if (m_pConnectionPoint != NULL) { ((IConnectionPoint*)m_pConnectionPoint)->AddRef(); hr = S_OK; } else { hr = ILS_E_MEMORY; } if (SUCCEEDED(hr)) { m_lMeetingPlaceType = pmi->lMeetingPlaceType; m_lAttendeeType = pmi->lAttendeeType; } bailout: if (!SUCCEEDED(hr)) { // do cleanup if (m_pIlsServer != NULL) { m_pIlsServer->Release (); m_pIlsServer = NULL; } if (m_pszMeetingPlaceID) { ::MemFree (m_pszMeetingPlaceID); m_pszMeetingPlaceID = NULL; // general paranoia } if (m_pszDescription) { ::MemFree (m_pszDescription); m_pszDescription = NULL; // general paranoia } if (m_pszHostName) { ::MemFree (m_pszHostName); m_pszHostName = NULL; } if (m_pszHostIPAddress) { ::MemFree (m_pszHostIPAddress); m_pszHostIPAddress = NULL; } if (m_pConnectionPoint) { delete m_pConnectionPoint; m_pConnectionPoint = NULL; } m_ulState = ILS_UNREGISTERED; } else { m_ulState = ILS_IN_SYNC; } return (hr); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::QueryInterface (REFIID riid, void **ppv) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::QueryInterface (REFIID riid, void **ppv) { *ppv = NULL; if (riid == IID_IIlsMeetingPlace || riid == IID_IUnknown) { *ppv = (IIlsUser *) this; } else { if (riid == IID_IConnectionPointContainer) { *ppv = (IConnectionPointContainer *) this; }; }; if (*ppv != NULL) { ((LPUNKNOWN)*ppv)->AddRef(); return S_OK; } else { return ILS_E_NO_INTERFACE; }; } //**************************************************************************** // STDMETHODIMP_(ULONG) // CIlsMeetingPlace::AddRef (void) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP_(ULONG) CIlsMeetingPlace::AddRef (void) { DllLock(); MyDebugMsg ((DM_REFCOUNT, "CIlsMeetingPlace::AddRef: ref=%ld\r\n", m_cRef)); ::InterlockedIncrement (&m_cRef); return (ULONG) m_cRef; } //**************************************************************************** // STDMETHODIMP_(ULONG) // CIlsMeetingPlace::Release (void) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP_(ULONG) CIlsMeetingPlace::Release (void) { DllRelease(); ASSERT (m_cRef > 0); MyDebugMsg ((DM_REFCOUNT, "CIlsMeetingPlace::Release: ref=%ld\r\n", m_cRef)); if(::InterlockedDecrement (&m_cRef) == 0) { delete this; return 0; } return (ULONG) m_cRef; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::NotifySink (void *pv, CONN_NOTIFYPROC pfn) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::NotifySink (void *pv, CONN_NOTIFYPROC pfn) { HRESULT hr = S_OK; if (m_pConnectionPoint != NULL) { hr = m_pConnectionPoint->Notify(pv, pfn); }; return hr; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::GetState (ULONG *pulState) // // Synopsis: // // Arguments: // // Returns: // // History: 12/10/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::GetState (ULONG *pulState) { // Validate parameter // *pulState = m_ulState; return NOERROR; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::GetMeetingPlaceType (LONG *plMeetingPlaceType) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::GetMeetingPlaceType (LONG *plMeetingPlaceType) { // Validate parameter // *plMeetingPlaceType = m_lMeetingPlaceType; return NOERROR; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::GetAttendeeType (LONG *plAttendeeType) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::GetAttendeeType (LONG *plAttendeeType) { // Validate parameter // *plAttendeeType = m_lAttendeeType; return NOERROR; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::GetStandardAttribute (ILS_STD_ATTR_NAME stdAttr, BSTR *pbstrStdAttr) // // History: // 1-16-97 Shishir Pardikar // Created. //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::GetStandardAttribute( ILS_STD_ATTR_NAME stdAttr, BSTR *pbstrStdAttr ) { LPTSTR lpszAttr = NULL; BOOL fValid = TRUE; HRESULT hr; if (pbstrStdAttr == NULL) { return ILS_E_POINTER; } switch(stdAttr) { case ILS_STDATTR_MEETING_ID: lpszAttr = m_pszMeetingPlaceID; break; case ILS_STDATTR_MEETING_HOST_NAME: lpszAttr = m_pszHostName; break; case ILS_STDATTR_MEETING_HOST_IP_ADDRESS: lpszAttr = m_pszHostIPAddress; break; case ILS_STDATTR_MEETING_DESCRIPTION: lpszAttr = m_pszDescription; break; default: fValid = FALSE; break; } if (fValid) { if (lpszAttr){ hr = LPTSTR_to_BSTR(pbstrStdAttr, lpszAttr); } else { *pbstrStdAttr = NULL; hr = NOERROR; } } else { hr = ILS_E_PARAMETER; } return (hr); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::SetStandardAttribute (ILS_STD_ATTR_NAME stdAttr, BSTR bstrStdAttr) // // History: // 1-16-97 Shishir Pardikar // Created. //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::SetStandardAttribute( ILS_STD_ATTR_NAME stdAttr, BSTR bstrStdAttr ) { LPTSTR *ppszAttr = NULL, pszNewAttr; BOOL fValid = TRUE; ULONG ulModBit = 0; HRESULT hr; if (bstrStdAttr == NULL) { return ILS_E_POINTER; } switch(stdAttr) { case ILS_STDATTR_MEETING_HOST_NAME: ppszAttr = &m_pszHostName; ulModBit = ILS_MEET_FLAG_HOST_NAME_MODIFIED; break; case ILS_STDATTR_MEETING_HOST_IP_ADDRESS: ppszAttr = &m_pszHostIPAddress; ulModBit = ILS_MEET_FLAG_HOST_ADDRESS_MODIFIED; break; case ILS_STDATTR_MEETING_DESCRIPTION: ppszAttr = &m_pszDescription; ulModBit = ILS_MEET_FLAG_DESCRIPTION_MODIFIED; break; default: fValid = FALSE; break; } if (fValid) { // Duplicate the string // hr = BSTR_to_LPTSTR (&pszNewAttr, bstrStdAttr); if (SUCCEEDED(hr)) { ::MemFree (*ppszAttr); *ppszAttr = pszNewAttr; m_dwFlags |= ulModBit; }; } else { hr = ILS_E_PARAMETER; } return (hr); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::SetExtendedAttributes (IIlsAttributes *pAttributes, ULONG *puReqID) // // History: //**************************************************************************** STDMETHODIMP CIlsMeetingPlace:: SetExtendedAttribute ( BSTR bstrName, BSTR bstrValue ) { m_dwFlags |= ILS_MEET_FLAG_EXTENDED_ATTRIBUTES_MODIFIED; return m_ExtendedAttrs.SetAttribute (bstrName, bstrValue); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::RemoveExtendedAttributes (IIlsAttributes *pAttributes, ULONG *puReqID) // // History: //**************************************************************************** STDMETHODIMP CIlsMeetingPlace:: RemoveExtendedAttribute ( BSTR bstrName ) { m_dwFlags |= ILS_MEET_FLAG_EXTENDED_ATTRIBUTES_MODIFIED; return m_ExtendedAttrs.SetAttribute (bstrName, NULL); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::GetExtendedAttributes (IIlsAttributes **pAttributes) // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace:: GetExtendedAttribute ( BSTR bstrName, BSTR *pbstrValue ) { return m_ExtendedAttrs.GetAttribute (bstrName, pbstrValue); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::GetAllExtendedAttributes (IIlsAttributes **pAttributes) // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace:: GetAllExtendedAttributes ( IIlsAttributes **ppAttributes ) { if (ppAttributes == NULL) return ILS_E_PARAMETER; return m_ExtendedAttrs.CloneNameValueAttrib((CAttributes **) ppAttributes); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::Register ( // BSTR bstrServerName, // BSTR bstrAuthInfo, // ILS_ENUM_AUTH_TYPE ulsAuthInfo, // ULONG *pulID) // // Synopsis: // // Arguments: // pulID - ID to identify the asynchronous transaction // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace:: Register ( IIlsServer *pServer, ULONG *pulID ) { HRESULT hr; LDAP_ASYNCINFO ldai; ASSERT(m_pszMeetingPlaceID != NULL); // Validate parameters // if (::MyIsBadServer (pServer) || pulID == NULL) return ILS_E_POINTER; // Make sure we have not done registration before // if (m_pIlsServer != NULL) return ILS_E_FAIL; // Clone ther server object // CIlsServer *pis = ((CIlsServer *) pServer)->Clone (); if (pis == NULL) return ILS_E_MEMORY; // Free the old server object if any // ::MemFree (m_pIlsServer); // Keep the new server object // m_pIlsServer = pis; // Allocate memory for LDAP_MEETINFO structure // PLDAP_MEETINFO pMeetInfo = NULL; hr = AllocMeetInfo(&pMeetInfo, ILS_MEET_ALL_MODIFIED); if (SUCCEEDED(hr)) { ASSERT(m_hMeetingPlace == NULL); hr = ::UlsLdap_RegisterMeeting ((DWORD) this, m_pIlsServer->GetServerInfo (), pMeetInfo, &m_hMeetingPlace, &ldai); if (SUCCEEDED(hr)) { COM_REQ_INFO ri; ReqInfo_Init (&ri); // If updating server was successfully requested, wait for the response // ri.uReqType = WM_ILS_REGISTER_MEETING; ri.uMsgID = ldai.uMsgID; ReqInfo_SetMeeting (&ri, this); hr = g_pReqMgr->NewRequest(&ri); if (SUCCEEDED(hr)) { // Make sure the objects do not disappear before we get the response // this->AddRef(); // Return the request ID // *pulID = ri.uReqID; }; }; } ::MemFree (pMeetInfo); if (FAILED (hr)) { m_pIlsServer->Release (); m_pIlsServer = NULL; } else { m_ulState = ILS_REGISTERING; } return hr; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::Unregister (ULONG *pulID) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::Unregister (ULONG *pulID) { LDAP_ASYNCINFO ldai; HRESULT hr = ILS_E_NOT_REGISTERED; ASSERT(m_pszMeetingPlaceID != NULL); // BUGBUG how about ILS_MEETING_PLACE_IN_SYNC if (m_ulState == ILS_REGISTERED) { ASSERT(m_pIlsServer != NULL); ASSERT(m_hMeetingPlace != NULL); hr = ::UlsLdap_UnRegisterMeeting(m_hMeetingPlace, &ldai); if (SUCCEEDED(hr)) { COM_REQ_INFO ri; ReqInfo_Init (&ri); // If updating server was successfully requested, wait for the response // ri.uReqType = WM_ILS_UNREGISTER_MEETING; ri.uMsgID = ldai.uMsgID; ReqInfo_SetMeeting (&ri, this); hr = g_pReqMgr->NewRequest(&ri); if (SUCCEEDED(hr)) { // Make sure the objects do not disappear before we get the response // this->AddRef(); // Return the request ID // *pulID = ri.uReqID; }; m_ulState = ILS_UNREGISTERING; } } else { hr = ILS_E_NOT_REGISTERED; } return (hr); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::Update (ULONG *pulID) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace:: Update ( ULONG *pulID ) { HRESULT hr; LDAP_ASYNCINFO ldai; PLDAP_MEETINFO pMeetInfo = NULL; if ((m_ulState!=ILS_REGISTERED) &&(m_ulState!=ILS_IN_SYNC)) { return (ILS_E_NOT_REGISTERED); } ASSERT(m_pIlsServer != NULL); if (!(m_dwFlags & ILS_MEET_MODIFIED_MASK)) { return NOERROR; } // allocate memory for LDAP_MEETINFO structure pMeetInfo = NULL; hr = AllocMeetInfo(&pMeetInfo, m_dwFlags & ILS_MEET_MODIFIED_MASK); if (SUCCEEDED(hr)) { ASSERT(m_hMeetingPlace != NULL); pMeetInfo->uOffsetMeetingPlaceID = pMeetInfo->uOffsetDescription = INVALID_OFFSET; pMeetInfo->lMeetingPlaceType = INVALID_MEETING_TYPE; pMeetInfo->lAttendeeType = INVALID_ATTENDEE_TYPE; hr = ::UlsLdap_SetMeetingInfo ( m_pIlsServer->GetServerInfo (), m_pszMeetingPlaceID, pMeetInfo, &ldai); if (SUCCEEDED(hr)) { COM_REQ_INFO ri; ReqInfo_Init (&ri); // If updating server was successfully requested, wait for the response // ri.uReqType = WM_ILS_SET_MEETING_INFO; ri.uMsgID = ldai.uMsgID; ReqInfo_SetMeeting (&ri, this); hr = g_pReqMgr->NewRequest(&ri); if (SUCCEEDED(hr)) { // Make sure the objects do not disappear before we get the response // this->AddRef(); // Return the request ID // *pulID = ri.uReqID; }; }; } ::MemFree (pMeetInfo); return hr; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::AddAttendee (BSTR bstrAttendeeID, ULONG *pulID) // // Synopsis: // // Arguments: // pbstrAttendeeID - ID of the Attendee to be added, should conform to Attendeetype // pulID - ID to identify the asynchronous transaction // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace:: AddAttendee ( BSTR bstrAttendeeID, ULONG *pulID ) { LDAP_ASYNCINFO ldai; HRESULT hr; LPTSTR pszAttendeeID = NULL; if ((m_ulState != ILS_REGISTERED)&& (m_ulState != ILS_IN_SYNC)) { return(ILS_E_FAIL); // BUGBUG refine the error } ASSERT(NULL != m_pIlsServer); ASSERT(NULL != m_pszMeetingPlaceID); hr = BSTR_to_LPTSTR(&pszAttendeeID, bstrAttendeeID); if (SUCCEEDED(hr)) { hr = ::UlsLdap_AddAttendee (m_pIlsServer->GetServerInfo (), m_pszMeetingPlaceID, 1, pszAttendeeID, &ldai); if (SUCCEEDED(hr)) { COM_REQ_INFO ri; ReqInfo_Init (&ri); // If the request was successfully sent to the server // wait for the response ri.uReqType = WM_ILS_ADD_ATTENDEE; ri.uMsgID = ldai.uMsgID; ReqInfo_SetMeeting (&ri, this); hr = g_pReqMgr->NewRequest(&ri); if (SUCCEEDED(hr)) { // Make sure the objects do not disappear before we get the response // this->AddRef(); // Return the request ID // *pulID = ri.uReqID; }; } ::MemFree (pszAttendeeID); } return (hr); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::RemoveAttendee (BSTR bstrAttendeeID, ULONG *pulID) // // Synopsis: // // Arguments: // pbstrAttendeeID - ID of the Attendee to be removed, should conform to Attendeetype // pulID - ID to identify the asynchronous transaction // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace:: RemoveAttendee ( BSTR bstrAttendeeID, ULONG *pulID ) { LDAP_ASYNCINFO ldai; HRESULT hr; LPTSTR pszAttendeeID = NULL; if ((m_ulState != ILS_REGISTERED)&& (m_ulState != ILS_IN_SYNC)) { return(ILS_E_FAIL); // BUBGUG refine } ASSERT(NULL != m_pIlsServer); ASSERT(NULL != m_pszMeetingPlaceID); hr = BSTR_to_LPTSTR (&pszAttendeeID, bstrAttendeeID); if (SUCCEEDED(hr)) { hr = ::UlsLdap_RemoveAttendee ( m_pIlsServer->GetServerInfo (), m_pszMeetingPlaceID, 1, pszAttendeeID, &ldai); if (SUCCEEDED(hr)) { COM_REQ_INFO ri; ReqInfo_Init (&ri); // If the request was successfully sent to the server // wait for the response ri.uReqType = WM_ILS_REMOVE_ATTENDEE; ri.uMsgID = ldai.uMsgID; ReqInfo_SetMeeting (&ri, this); hr = g_pReqMgr->NewRequest(&ri); if (SUCCEEDED(hr)) { // Make sure the objects do not disappear before we get the response // this->AddRef(); // Return the request ID // *pulID = ri.uReqID; }; } ::MemFree (pszAttendeeID); } return (hr); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::EnumAttendeeNames(IIlsFilter *pFilter, ULONG *pulID) // // Synopsis: enumerate attendees in a meeting based on a filter // // Arguments: // [pFilter] specifies the filter to be used by the server // NULL => no filter // [pulID] request ID returned for keeping track of the // asynchronous operation // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace:: EnumAttendeeNames ( IIlsFilter *pFilter, ULONG *pulID ) { LDAP_ASYNCINFO ldai; HRESULT hr; if ((m_ulState != ILS_REGISTERED)&& (m_ulState != ILS_IN_SYNC)) { return(ILS_E_FAIL); } // Create a ldap-like filter // TCHAR *pszFilter = NULL; hr = ::FilterToLdapString ((CFilter *) pFilter, &pszFilter); if (hr != S_OK) return hr; // Send the request over the wire // hr = ::UlsLdap_EnumAttendees ( m_pIlsServer->GetServerInfo (), m_pszMeetingPlaceID, pszFilter, &ldai); ::MemFree (pszFilter); if (SUCCEEDED(hr)) { // If the request was successfully sent to the server // wait for the response // COM_REQ_INFO ri; ReqInfo_Init (&ri); ri.uReqType = WM_ILS_ENUM_ATTENDEES; ri.uMsgID = ldai.uMsgID; ReqInfo_SetMeeting (&ri, this); // Enter the request // hr = g_pReqMgr->NewRequest(&ri); if (SUCCEEDED(hr)) { // Make sure the objects do not disappear before we get the response // this->AddRef(); // Return the request ID // *pulID = ri.uReqID; }; } return (hr); } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::RegisterResult(ULONG ulID, HRESULT hr) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::RegisterResult(ULONG uReqID, HRESULT hr) { OBJRINFO objri; if (SUCCEEDED(hr)) { m_dwFlags |= ILS_MEET_FLAG_REGISTERED; m_ulState = ILS_REGISTERED; } else { ASSERT(!(m_dwFlags & ILS_MEET_FLAG_REGISTERED)); m_hMeetingPlace = NULL; // null out the service provider's handle m_ulState = ILS_UNREGISTERED; } objri.uReqID = uReqID; objri.hResult = hr; objri.pv = NULL; NotifySink((VOID *)&objri, OnNotifyRegisterMeetingPlaceResult); return NOERROR; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::UnregisterResult(ULONG ulID, HRESULT hr) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::UnregisterResult(ULONG uReqID, HRESULT hr) { OBJRINFO objri; if (SUCCEEDED(hr)) { m_dwFlags &= ~ILS_MEET_FLAG_REGISTERED; m_ulState = ILS_UNREGISTERED; } else { // BUGBUG, we need an m_oldState variable m_ulState = ILS_REGISTERED; } objri.uReqID = uReqID; objri.hResult = hr; objri.pv = NULL; NotifySink((VOID *)&objri, OnNotifyUnregisterMeetingPlaceResult); return NOERROR; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::UpdateResult(ULONG ulID, HRESULT hr) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::UpdateResult(ULONG ulID, HRESULT hr) { OBJRINFO objri; objri.uReqID = ulID; objri.hResult = hr; objri.pv = NULL; if (SUCCEEDED(hr)) { m_dwFlags &= ~ILS_MEET_MODIFIED_MASK; } NotifySink((VOID *)&objri, OnNotifyUpdateMeetingPlaceResult); return NOERROR; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::AttendeeChangeResult(ULONG ulID, HRESULT hr) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::AddAttendeeResult(ULONG uReqID, HRESULT hr) { OBJRINFO objri; objri.uReqID = uReqID; objri.hResult = hr; objri.pv = NULL; NotifySink((VOID *)&objri, OnNotifyAddAttendeeResult); return NOERROR; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::RemoveAttendeeResult(ULONG ulID, HRESULT hr) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::RemoveAttendeeResult(ULONG uReqID, HRESULT hr) { OBJRINFO objri; objri.uReqID = uReqID; objri.hResult = hr; objri.pv = NULL; NotifySink((VOID *)&objri, OnNotifyRemoveAttendeeResult); return NOERROR; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::EnumAttendeeNamesResult(ULONG ulID, PLDAP_ENUM ple) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::EnumAttendeeNamesResult(ULONG uReqID, PLDAP_ENUM ple) { ENUMRINFO eri; // Package the notification info // eri.uReqID = uReqID; // PLDAP_ENUM is NULL when the enumeration is terminated successfully // if (ple != NULL) { eri.hResult = ple->hResult; eri.cItems = ple->cItems; eri.pv = (void *)(((PBYTE)ple)+ple->uOffsetItems); } else { eri.hResult = S_FALSE; eri.cItems = 0; eri.pv = NULL; }; NotifySink((void *)&eri, OnNotifyEnumAttendeeNamesResult); return NOERROR; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::EnumConnectionPoints(IEnumConnectionPoints **ppEnum) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::EnumConnectionPoints(IEnumConnectionPoints **ppEnum) { CEnumConnectionPoints *pecp; HRESULT hr; // Validate parameters // if (ppEnum == NULL) { return E_POINTER; }; // Assume failure // *ppEnum = NULL; // Create an enumerator // pecp = new CEnumConnectionPoints; if (pecp == NULL) return ILS_E_MEMORY; // Initialize the enumerator // hr = pecp->Init((IConnectionPoint *)m_pConnectionPoint); if (FAILED(hr)) { delete pecp; return hr; }; // Give it back to the caller // pecp->AddRef(); *ppEnum = pecp; return S_OK; } //**************************************************************************** // STDMETHODIMP // CIlsMeetingPlace::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CIlsMeetingPlace::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp) { IID siid; HRESULT hr; // Validate parameters // if (ppcp == NULL) { return E_POINTER; }; // Assume failure // *ppcp = NULL; if (m_pConnectionPoint != NULL) { hr = m_pConnectionPoint->GetConnectionInterface(&siid); if (SUCCEEDED(hr)) { if (riid == siid) { *ppcp = (IConnectionPoint *)m_pConnectionPoint; (*ppcp)->AddRef(); hr = S_OK; } else { hr = ILS_E_NO_INTERFACE; }; }; } else { hr = ILS_E_NO_INTERFACE; }; return hr; } //**************************************************************************** // //CEnumMeetingPlaces class implementation // //**************************************************************************** //**************************************************************************** // CEnumMeetingPlaces::CEnumMeetingPlaces (void) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** CEnumMeetingPlaces::CEnumMeetingPlaces (void) { m_cRef = 0; m_ppMeetingPlaces = NULL; m_cMeetingPlaces = 0; m_iNext = 0; return; } //**************************************************************************** // CEnumMeetingPlaces::~CEnumMeetingPlaces (void) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** CEnumMeetingPlaces::~CEnumMeetingPlaces (void) { ULONG i; if (m_ppMeetingPlaces != NULL) { for (i = 0; i < m_cMeetingPlaces; i++) { m_ppMeetingPlaces[i]->Release(); }; ::MemFree (m_ppMeetingPlaces); }; return; } //**************************************************************************** // STDMETHODIMP // CEnumMeetingPlaces::Init (CIlsMeetingPlace **ppMeetingPlacesList, ULONG cMeetingPlaces) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CEnumMeetingPlaces::Init (CIlsMeetingPlace **ppMeetingPlacesList, ULONG cMeetingPlaces) { HRESULT hr = NOERROR; // If no list, do nothing // if (cMeetingPlaces != 0) { ASSERT(ppMeetingPlacesList != NULL); // Allocate the snapshot buffer // m_ppMeetingPlaces = (CIlsMeetingPlace **) ::MemAlloc (cMeetingPlaces*sizeof(CIlsMeetingPlace *)); if (m_ppMeetingPlaces != NULL) { ULONG i; // Snapshot the object list // for (i =0; i < cMeetingPlaces; i++) { m_ppMeetingPlaces[i] = ppMeetingPlacesList[i]; m_ppMeetingPlaces[i]->AddRef(); }; m_cMeetingPlaces = cMeetingPlaces; } else { hr = ILS_E_MEMORY; }; }; return hr; } //**************************************************************************** // STDMETHODIMP // CEnumMeetingPlaces::QueryInterface (REFIID riid, void **ppv) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CEnumMeetingPlaces::QueryInterface (REFIID riid, void **ppv) { if (riid == IID_IEnumIlsMeetingPlaces || riid == IID_IUnknown) { *ppv = (IEnumIlsMeetingPlaces *) this; AddRef(); return S_OK; } else { *ppv = NULL; return ILS_E_NO_INTERFACE; }; } //**************************************************************************** // STDMETHODIMP_(ULONG) // CEnumMeetingPlaces::AddRef (void) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP_(ULONG) CEnumMeetingPlaces::AddRef (void) { DllLock(); MyDebugMsg ((DM_REFCOUNT, "CEnumMeetingPlaces::AddRef: ref=%ld\r\n", m_cRef)); ::InterlockedIncrement ((LONG *) &m_cRef); return m_cRef; } //**************************************************************************** // STDMETHODIMP_(ULONG) // CEnumMeetingPlaces::Release (void) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP_(ULONG) CEnumMeetingPlaces::Release (void) { DllRelease(); ASSERT (m_cRef > 0); MyDebugMsg ((DM_REFCOUNT, "CEnumMeetingPlaces::Release: ref=%ld\r\n", m_cRef)); if (::InterlockedDecrement ((LONG *) &m_cRef) == 0) { delete this; return 0; } return m_cRef; } //**************************************************************************** // STDMETHODIMP // CEnumMeetingPlaces::Next (ULONG cMeetingPlaces, IIlsMeetingPlace **rgpm, ULONG *pcFetched) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CEnumMeetingPlaces::Next (ULONG cMeetingPlaces, IIlsMeetingPlace **rgpm, ULONG *pcFetched) { ULONG cCopied; HRESULT hr; // Validate the pointer // if (rgpm == NULL) { return E_POINTER; } // Validate the parameters // if ((cMeetingPlaces == 0) || ((cMeetingPlaces > 1) && (pcFetched == NULL))) { return ILS_E_PARAMETER; } // Check the enumeration index // cCopied = 0; // Can copy if we still have more attribute names // while ((cCopied < cMeetingPlaces) && (m_iNext < this->m_cMeetingPlaces)) { m_ppMeetingPlaces[m_iNext]->AddRef(); rgpm[cCopied++] = m_ppMeetingPlaces[m_iNext++]; }; // Determine the returned information based on other parameters // if (pcFetched != NULL) { *pcFetched = cCopied; }; return (cMeetingPlaces == cCopied ? S_OK : S_FALSE); } //**************************************************************************** // STDMETHODIMP // CEnumMeetingPlaces::Skip (ULONG cMeetingPlaces) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CEnumMeetingPlaces::Skip (ULONG cMeetingPlaces) { ULONG iNewIndex; // Validate the parameters // if (cMeetingPlaces == 0){ return ILS_E_PARAMETER; } // Check the enumeration index limit // iNewIndex = m_iNext+cMeetingPlaces; if (iNewIndex <= m_cMeetingPlaces) { m_iNext = iNewIndex; return S_OK; } else { m_iNext = m_cMeetingPlaces; return S_FALSE; }; } //**************************************************************************** // STDMETHODIMP // CEnumMeetingPlaces::Reset (void) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CEnumMeetingPlaces::Reset (void) { m_iNext = 0; return S_OK; } //**************************************************************************** // STDMETHODIMP // CEnumMeetingPlaces::Clone(IEnumIlsMeetingPlaces **ppEnum) // // Synopsis: // // Arguments: // // Returns: // // History: 11/25/1996 Shishir Pardikar [shishirp] Created. // // Notes: // //**************************************************************************** STDMETHODIMP CEnumMeetingPlaces::Clone(IEnumIlsMeetingPlaces **ppEnum) { CEnumMeetingPlaces *pEnumMeetingPlaces; HRESULT hr; // Validate parameters // if (ppEnum == NULL) { return E_POINTER; }; *ppEnum = NULL; // Create an enumerator // pEnumMeetingPlaces = new CEnumMeetingPlaces; if (pEnumMeetingPlaces == NULL) { return ILS_E_MEMORY; } // Clone the information // hr = pEnumMeetingPlaces->Init(m_ppMeetingPlaces, m_cMeetingPlaces); if (SUCCEEDED(hr)) { pEnumMeetingPlaces->m_iNext = m_iNext; // Return the cloned enumerator // pEnumMeetingPlaces->AddRef(); *ppEnum = pEnumMeetingPlaces; } else { delete pEnumMeetingPlaces; }; return hr; } #endif // ENABLE_MEETING_PLACE