Пример #1
0
CString
CDataNode::GetAttributeValueOrChildValueByName( const CString& name ) const
{
    CString value = GetAttributeValue( name );
    if ( 0 == value.Length() )
    {
        value = GetChildValueByName( name );
    }
    return value;
}
Пример #2
0
static void *tcp_thread(void *data)
{
	int sockfd, fromSock, n;
	socklen_t addrLen;
	char bufArray[BUF_16K];
	struct sockaddr_in addr;
	IXML_Document *dom = NULL;
	IXML_Node *node = NULL;
	char *op = NULL;
	char *value = NULL;
	gint speed;
	gulong nsecs, systemnsecs;
	SYNC_STATE syncState = SYNC_STATE_STOPPED;
	gboolean isVisible;
	ZKPlayerView *view = ZKPLAYER_VIEW(data);
	
	sockfd = SocketCreate(ZKPLAYER_IP, ZKPLAYER_PORT, SOCKET_TCP, SOCKET_LISTENER);
	if(sockfd < 0)
		goto funcOut;
	
	addrLen = sizeof(addr);
	while(1) {
		ZInfo1(DBG_INIT, "Listening for new event...");
		memset(bufArray, 0, BUF_16K);
		fromSock = accept(sockfd, (struct sockaddr *)&addr, &addrLen);
		n = read(fromSock, bufArray, BUF_16K);
		ZInfo1(DBG_INIT, "Receive TCP XML -> %s\n", bufArray);
		if(n <= 0)
			goto funcNextCmd;
		
		dom = ixmlParseBuffer(bufArray);
		if(dom ==NULL) {
			ZError(DBG_INIT, "Invalid xml string.");
			goto funcNextCmd;
		}
		
		node = ixmlGetFirstNodeByTagName(dom, "cmd");
		if(node == NULL) {
			ZError(DBG_INIT, "Cannot find cmd tag.");
			ResponseCMD(fromSock, "Unknown", 2);
			goto funcContinue;
		}
		
		op = GetNodeAttributeByName(node, "op");
		if(op == NULL) {
			ZError(DBG_INIT, "Cannot find op attribute.");
			ResponseCMD(fromSock, "Unknown", 2);
			goto funcContinue;
		}
		
		/* Handle op */
		if(!strcasecmp(op, "playuri")) {
			value = GetChildValueByName(node, "lrcuri");
			if(value == NULL) {
				ResponseCMD(fromSock, op, 3);
				goto funcContinue;
			}
			 zkplayer_view_play_uri(view, value);
		}
		else if(!strcasecmp(op, "setnexturi")) {
			value = GetChildValueByName(node, "lrcuri");
			if(value == NULL) {
				ResponseCMD(fromSock, op, 3);
				goto funcContinue;
			}
			zkplayer_view_set_next_uri(view, value);
		}
		else if(!strcasecmp(op, "play")) {
			value = GetChildValueByName(node, "speed");
			if(value == NULL) {
				ResponseCMD(fromSock, op, 4);
				goto funcContinue;
			}
			speed = atoi(value);
			/** NOTE: Remember to remove when bug done 090208 **/
			//zkplayer_view_play(view, speed);
		}
		else if(!strcasecmp(op, "pause")) {
			zkplayer_view_pause(view);
		}
		else if(!strcasecmp(op, "stop")) {
			zkplayer_view_stop(view);
		}
		else if(!strcasecmp(op, "sync")) {
			//get syncState
			value = GetChildValueByName(node, "status");
			if(value == NULL) {
				ResponseCMD(fromSock, op, 9);
				goto funcContinue;
			}
			if(!strcasecmp(value, "STARTING"))
				syncState = SYNC_STATE_START;
			else if(!strcasecmp(value, "PLAYING"))
				syncState = SYNC_STATE_PLAYING;
			else if(!strcasecmp(value, "STOPPED"))
				syncState = SYNC_STATE_STOPPED;
			//get nsecs
			value = GetChildValueByName(node, "nsecs");
			if(value == NULL) {
				ResponseCMD(fromSock, op, 5);
				goto funcContinue;
			}
			nsecs = (gulong)strtoul(value, NULL, 10);
			//get systemnsecs
			value = GetChildValueByName(node, "systemnsecs");
			if(value == NULL) {
				ResponseCMD(fromSock, op, 6);
				goto funcContinue;
			}
			 systemnsecs = (gulong)strtoul(value, NULL, 10);
			zkplayer_view_sync(view, syncState, nsecs, systemnsecs);
			/* NOTE: We don't give response to zplayer */
			goto funcContinue;
		}
		else if(!strcasecmp(op, "seek")) {
			//get secs
			value = GetChildValueByName(node, "secs");
			if(value == NULL) {
				ResponseCMD(fromSock, op, 7);
				goto funcContinue;
			}
			nsecs = (gulong)strtoul(value, NULL, 10);
			zkplayer_view_seek(view, nsecs);
		}
		else if(!strcasecmp(op, "visible")) {
			value = GetChildValueByName(node, "flag");
			if(value == NULL) {
				ResponseCMD(fromSock, op, 8);
				goto funcContinue;
			}
			isVisible = !strcasecmp(value, "FALSE") ? FALSE : TRUE;
			zkplayer_view_visible(view, isVisible);
		}
		else {
			ZInfo1(DBG_INIT, "Unknown op -> %s", op);
			ResponseCMD(fromSock, op, 1);
			goto funcContinue;
		}
		/* Ok, it's right */
		ResponseCMD(fromSock, op, 0);
		
funcContinue:
		ixmlDocument_free(dom);
funcNextCmd:
		close(fromSock);
	}
	close(sockfd);
funcOut:
	ZInfo4(DBG_INIT, "The thead exit.");
	pthread_exit((void *)0);
}