// File: asui.cpp #include "precomp.h" #include "resource.h" #include "popupmsg.h" #include "cr.h" #include "dshowdlg.h" #include #include "confroom.h" #include "confman.h" #include "particip.h" #include "menuutil.h" #include #include "NmManager.h" // // AppSharing part of confroom // // // IAppSharingNotify METHODS // STDMETHODIMP CConfRoom::OnReadyToShare(BOOL fReady) { ASSERT(m_pAS); // // 2.x SDK: CHANGE AS CHANNEL STATE // CNmManagerObj::AppSharingChannelActiveStateChanged(fReady != FALSE); return S_OK; } STDMETHODIMP CConfRoom::OnShareStarted(void) { ASSERT(m_pAS); return S_OK; } STDMETHODIMP CConfRoom::OnSharingStarted(void) { ASSERT(m_pAS); CNmManagerObj::AppSharingChannelChanged(); return S_OK; } STDMETHODIMP CConfRoom::OnShareEnded(void) { ASSERT(m_pAS); CNmManagerObj::AppSharingChannelChanged(); return S_OK; } STDMETHODIMP CConfRoom::OnPersonJoined(IAS_GCC_ID gccMemberID) { ASSERT(m_pAS); // // 2.x SDK -- ADD PERSON TO AS CHANNEL MEMBER LIST // CNmManagerObj::ASMemberChanged(gccMemberID); return S_OK; } STDMETHODIMP CConfRoom::OnPersonLeft(IAS_GCC_ID gccMemberID) { ASSERT(m_pAS); // // 2.x SDK -- REMOVE PERSON FROM AS CHANNEL MEMBER LIST // CNmManagerObj::ASMemberChanged(gccMemberID); return S_OK; } STDMETHODIMP CConfRoom::OnStartInControl(IAS_GCC_ID gccMemberID) { ASSERT(m_pAS); // // 2.x SDK -- CHANGE MEMBER STATES // * Change remote (gccMemberID) to VIEWING // * Change local to IN CONTROL // CNmManagerObj::ASLocalMemberChanged(); CNmManagerObj::ASMemberChanged(gccMemberID); CNmManagerObj::AppSharingChannelChanged(); return S_OK; } STDMETHODIMP CConfRoom::OnStopInControl(IAS_GCC_ID gccMemberID) { ASSERT(m_pAS); // // 2.x SDK -- CHANGE MEMBER STATES // * Change remote (gccMemberID) to DETACHED // * Change local to DETACHED // CNmManagerObj::ASLocalMemberChanged(); CNmManagerObj::ASMemberChanged(gccMemberID); CNmManagerObj::AppSharingChannelChanged(); return S_OK; } STDMETHODIMP CConfRoom::OnPausedInControl(IAS_GCC_ID gccMemberID) { // // New for 3.0 // 3.0 SDK -- Change member state? // return S_OK; } STDMETHODIMP CConfRoom::OnUnpausedInControl(IAS_GCC_ID gccMemberID) { // // New for 3.0 // 3.0 SDK -- Change member state? // return(S_OK); } STDMETHODIMP CConfRoom::OnControllable(BOOL fControllable) { ASSERT(m_pAS); // // 2.x SDK -- CHANGE LOCAL STATE? // CNmManagerObj::ASLocalMemberChanged(); CNmManagerObj::AppSharingChannelChanged(); return S_OK; } STDMETHODIMP CConfRoom::OnStartControlled(IAS_GCC_ID gccMemberID) { ASSERT(m_pAS); // // 2.x SDK -- CHANGE MEMBER STATES // * Change local to VIEWING // * Change remote (gccMemberID) to IN CONTROL // CNmManagerObj::ASLocalMemberChanged(); CNmManagerObj::ASMemberChanged(gccMemberID); CNmManagerObj::AppSharingChannelChanged(); return S_OK; } STDMETHODIMP CConfRoom::OnStopControlled(IAS_GCC_ID gccMemberID) { ASSERT(m_pAS); // // 2.x SDK -- CHANGE MEMBER STATES // * Change local to DETACHED // * Change remote to DETACHED // CNmManagerObj::ASLocalMemberChanged(); CNmManagerObj::ASMemberChanged(gccMemberID); CNmManagerObj::AppSharingChannelChanged(); return S_OK; } STDMETHODIMP CConfRoom::OnPausedControlled(IAS_GCC_ID gccMemberID) { ASSERT(m_pAS); return(S_OK); } STDMETHODIMP CConfRoom::OnUnpausedControlled(IAS_GCC_ID gccMemberID) { ASSERT(m_pAS); return(S_OK); } // // RevokeControl() // HRESULT CConfRoom::RevokeControl(UINT gccID) { if (!m_pAS) return E_FAIL; return m_pAS->RevokeControl(gccID); } // // AllowControl() // HRESULT CConfRoom::AllowControl(BOOL fAllow) { if (!m_pAS) return(E_FAIL); return(m_pAS->AllowControl(fAllow)); } // // GiveControl() // HRESULT CConfRoom::GiveControl(UINT gccID) { if (!m_pAS) return(E_FAIL); return(m_pAS->GiveControl(gccID)); } // // CancelGiveControl() // HRESULT CConfRoom::CancelGiveControl(UINT gccID) { if (!m_pAS) return(E_FAIL); return(m_pAS->CancelGiveControl(gccID)); } BOOL CConfRoom::FIsSharingAvailable(void) { if (!m_pAS) return FALSE; return(m_pAS->IsSharingAvailable()); } /* F C A N S H A R E */ /*------------------------------------------------------------------------- %%Function: FCanShare -------------------------------------------------------------------------*/ BOOL CConfRoom::FCanShare(void) { if (!m_pAS) return FALSE; return (m_pAS->CanShareNow()); } // // FInShare() // BOOL CConfRoom::FInShare(void) { if (!m_pAS) return FALSE; return (m_pAS->IsInShare()); } BOOL CConfRoom::FIsSharing(void) { if (!m_pAS) return FALSE; return (m_pAS->IsSharing()); } // // FIsControllable() // BOOL CConfRoom::FIsControllable(void) { if (!m_pAS) return FALSE; return (m_pAS->IsControllable()); } // // GetPersonShareStatus() // HRESULT CConfRoom::GetPersonShareStatus(UINT gccID, IAS_PERSON_STATUS * pStatus) { if (!m_pAS) return E_FAIL; ZeroMemory(pStatus, sizeof(*pStatus)); pStatus->cbSize = sizeof(*pStatus); return(m_pAS->GetPersonStatus(gccID, pStatus)); } HRESULT CConfRoom::CmdShare(HWND hwnd) { HRESULT hr = E_FAIL; DebugEntry(CConfRoom::CmdShare); if (m_pAS) { hr = m_pAS->Share(hwnd, IAS_SHARE_DEFAULT); if (SUCCEEDED(hr)) { CNmManagerObj::SharableAppStateChanged(hwnd, NM_SHAPP_SHARED); } } DebugExitHRESULT(CConfRoom::CmdShare, hr); return hr; } HRESULT CConfRoom::CmdUnshare(HWND hwnd) { HRESULT hr = E_FAIL; DebugEntry(CConfRoom::CmdUnshare); if (m_pAS) { hr = m_pAS->Unshare(hwnd); if (SUCCEEDED(hr)) { CNmManagerObj::SharableAppStateChanged(hwnd, NM_SHAPP_NOT_SHARED); } } DebugExitHRESULT(CConfRoom::CmdUnshare, hr); return hr; } BOOL CConfRoom::FIsWindowShareable(HWND hwnd) { if (!m_pAS) return(FALSE); return(m_pAS->IsWindowShareable(hwnd)); } BOOL CConfRoom::FIsWindowShared(HWND hwnd) { if (!m_pAS) return(FALSE); return(m_pAS->IsWindowShared(hwnd)); } HRESULT CConfRoom::GetShareableApps(IAS_HWND_ARRAY ** pList) { if (!m_pAS) return E_FAIL; return m_pAS->GetShareableApps(pList); } HRESULT CConfRoom::FreeShareableApps(IAS_HWND_ARRAY * pList) { if (!m_pAS) return E_FAIL; return m_pAS->FreeShareableApps(pList); } void CConfRoom::LaunchHostUI(void) { if (m_pAS) { m_pAS->LaunchHostUI(); } } HRESULT GetShareState(ULONG ulGCCId, NM_SHARE_STATE *puState) { HRESULT hr = E_UNEXPECTED; ASSERT(puState); *puState = NM_SHARE_UNKNOWN; CConfRoom *p = ::GetConfRoom(); if(p) { IAS_PERSON_STATUS s; hr = p->GetPersonShareStatus(ulGCCId, &s); if(SUCCEEDED(hr)) { // // There's no share at all as far as we know, or this person isn't participating // if (!s.InShare) { *puState = NM_SHARE_UNKNOWN; return hr; } // // This person is in control of another // if ((s.InControlOf) || (s.Controllable && !s.ControlledBy)) { *puState = NM_SHARE_IN_CONTROL; return hr; } // // This person can be (and maybe is) controlled by another // if (s.Controllable) { *puState = NM_SHARE_COLLABORATING; return hr; } *puState = NM_SHARE_WORKING_ALONE; } } return hr; }