Esempio n. 1
0
void CConferenceInfo::enableVideoRecv(int fromMemberIndex, int toMemberIndex, bool enable)
{
	CConferenceMember::pointer fromMember;
	CConferenceMember::pointer toMember;

	CLockMap<void*, CConferenceMember::pointer>::iterator iterMember;
	boost::mutex::scoped_lock lockMember(m_members.mutex());
	for (iterMember=m_members.begin(); iterMember!=m_members.end(); iterMember++)
	{
		CConferenceMember::pointer member = iterMember->second;
		if (member->getIndex() == fromMemberIndex)
		{
			fromMember = member;
		}
		if (member->getIndex() == fromMemberIndex)
		{
			toMember = member;
		}
		if (fromMember.get() != 0 && toMember.get() != 0)
		{
			break;
		}
	}

	if (enable)
	{
		// 

	}else
	{

	}
}
Esempio n. 2
0
void CConferenceInfo::enableVideoRecv(bool enable)
{
	CLockMap<void*, CConferenceMember::pointer>::iterator iterMember;
	boost::mutex::scoped_lock lockMember(m_members.mutex());
	for (iterMember=m_members.begin(); iterMember!=m_members.end(); iterMember++)
	{
		iterMember->second->setVideoRecv(enable);
	}
}
Esempio n. 3
0
void CConferenceInfo::enableVideoRecvIndex(int memberIndex, int allowMemberIndex)
{
	CLockMap<void*, CConferenceMember::pointer>::iterator iterMember;
	boost::mutex::scoped_lock lockMember(m_members.mutex());
	for (iterMember=m_members.begin(); iterMember!=m_members.end(); iterMember++)
	{
		CConferenceMember::pointer member = iterMember->second;
		if (member->getIndex() == memberIndex)
		{
			member->setRecvIndex(allowMemberIndex);
			return;
		}
	}
}
Esempio n. 4
0
void CConferenceInfo::closeConference(void)
{
	m_currentIndex = 0;
	CLockMap<void*, CConferenceMember::pointer>::iterator iterMember;
	boost::mutex::scoped_lock lockMember(m_members.mutex());
	for (iterMember=m_members.begin(); iterMember!=m_members.end(); iterMember++)
	{
		CConferenceMember::pointer member = iterMember->second;
		member->setClosed(true);

		if (m_handler)
			m_handler->onMemberClosed(member, true);
	}
	m_members.clear(false);
}
Esempio n. 5
0
void CConferenceInfo::enableVideoSend(int memberIndex, bool enable)
{
	CLockMap<void*, CConferenceMember::pointer>::iterator iterMember;
	boost::mutex::scoped_lock lockMember(m_members.mutex());
	for (iterMember=m_members.begin(); iterMember!=m_members.end(); iterMember++)
	{
		CConferenceMember::pointer member = iterMember->second;
		if (member->getIndex() == memberIndex)
		{
			member->setVideoSend(enable);
		}else if (enable)
		{
			// 其他要设为 false
			member->setVideoSend(false);
		}
	}
}
Esempio n. 6
0
int
dc_close(int fd)
{
	int             res = 0;
	int             tmp;
	int32_t         size;
	int32_t         closemsg[6];
	int             msglen;
	struct vsp_node *node;


#ifdef DC_CALL_TRACE
	showTraceBack();
#endif


	/* nothing wrong ... yet */
	dc_errno = DEOK;

	node = delete_vsp_node(fd);
	if (node == NULL) {
		/* we have not such file descriptor, so lets give a try to system */
		dc_debug(DC_INFO, "Using system native close for [%d].", fd);
		return system_close(fd);
	}


	if ( node->lcb != NULL ) {
		dc_lcb_clean( node );
	}

	dc_real_fsync( node );

	if(node->unsafeWrite > 1) {

		size = htonl(-1); /* send end of data */
		writen(node->dataFd, (char *) &size, sizeof(size), NULL);
		/* FIXME: error detection missing */

		if (get_fin(node) < 0) {
			dc_debug(DC_ERROR, "dc_close: mover did not FIN the data blocks.");
			res = -1;
		}
	}

	if(node->reference == 0 ) {

		if( (node->sum != NULL) && ( node->sum->isOk == 1 ) ) {
			closemsg[0] = htonl(20);
			closemsg[2] = htonl(12);
			closemsg[3] = htonl(DCAP_DATA_SUM);
			closemsg[4] = htonl(node->sum->type);
			closemsg[5] = htonl(node->sum->sum);

			msglen = 6;
			dc_debug(DC_INFO, "File checksum is: %u", node->sum->sum);
		}else{
			closemsg[0] = htonl(4);
			msglen = 2;
		}

		closemsg[1] = htonl(IOCMD_CLOSE); /* actual command */

		dc_debug(DC_IO, "Sending CLOSE for fd:%d ID:%d.", node->dataFd, node->queueID);
		check_timeout_envar();
		dcap_set_alarm(closeTimeOut > 0 ? closeTimeOut : DCAP_IO_TIMEOUT/4);
		tmp = sendDataMessage(node, (char *) closemsg, msglen*sizeof(int32_t), ASCII_OK, NULL);
		/* FIXME: error detection missing */
		if( tmp < 0 ) {
			dc_debug(DC_ERROR, "sendDataMessage failed.");
			/* ignore close errors if file was open for read */
			if(node->flags & O_WRONLY) {
				res = -1;
			}

			if(isIOFailed) {
				isIOFailed = 0;
				/* command line dwon */
				if(!ping_pong(node)) {
					/* remove file descriptor from the list of control lines in use */
					lockMember();
					deleteMemberByValue(node->fd);
					unlockMember();
					pollDelete(node->fd);
					close_control_socket(node->fd, node->tunnel);
				}
			}
		}
		dcap_set_alarm(0);
		deleteQueue(node->queueID);

	}

	/*
	 * Even if there is still a reference to the dcap session,
	 * we have to close local socket descriptor.
	 */
	close_data_socket(node->dataFd);
	node_destroy(node);

	return res;
}