Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

485 lines
7.6 KiB

// File: asui.cpp
#include "precomp.h"
#include "resource.h"
#include "popupmsg.h"
#include "cr.h"
#include "dshowdlg.h"
#include <help_ids.h>
#include "confroom.h"
#include "confman.h"
#include "particip.h"
#include "menuutil.h"
#include <nmremote.h>
#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;
}