⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crenderer.cc.svn-base

📁 基于LINUX/UNIX的UPN库,是智能家具的用的底层库.
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
/*  *  Copyright (C) 2006 by: *  Da He <da.he@uni-dortmund.de> *  Julian Flake <julian.flake@uni-dortmund.de> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include <fstream>#include "cRenderer.h"bool file_exists(char* filename){	ifstream file;	file.open(filename,ifstream::in);	bool return_value=file.is_open();	if(return_value)	{		file.close();	}	return return_value;}void* pt2obj; /* * Constructor */cRenderer::cRenderer(int argc,char* argv[]) {	// FunctionPointer Tutorial	// http://www.newty.de/fpt/callback.html	pt2obj = (int*) this;		// global variable init	initVar();	parseConfigFile();		handleOptions(argc,argv);	positionToSeek = 0;		services[ConnectionManager] = new cConnectionManager(this);	services[AVTransport] = new cAVTransport(this);	services[RenderingControl] = new cRenderingControl(this);	//mutex init	ithread_mutex_init(&rendererMutex,NULL);	ithread_mutex_init(&outputMutex,NULL);		//find the path to web-dir	if(file_exists("/usr/local/share/renderer/AVTransport.xml")&&	   file_exists("/usr/local/share/renderer/ConnectionManager.xml")&&	   file_exists("/usr/local/share/renderer/RendererControl.xml"))	{		web_root="/usr/local/share/renderer";	}else if(file_exists("/usr/share/renderer/AVTransport.xml")&&	   		 file_exists("/usr/share/renderer/ConnectionManager.xml")&&	   		 file_exists("/usr/share/renderer/RendererControl.xml"))	{		web_root="/usr/share/renderer";	}else	{		cout << "couldn't find description file." << endl;		cout << "make sure you have run make install." << endl;		exit(1);	}		//SDK-Initialisierung	if(ip_addr==NULL)	{		cout << "random ip" << endl;	}else	{		cout << ip_addr << endl;	}	int err;	err = UpnpInit( ip_addr , 0 );	if ( err != UPNP_E_SUCCESS ) {		cout << "couldn't init SDK: " << UpnpGetErrorMessage(err) << endl;		UpnpFinish();		exit(1);	}	if (UpnpSetWebServerRootDir(web_root) != UPNP_E_SUCCESS) {		cout << "couldn't set web server's root dir." << endl;		UpnpFinish();		exit(1);	}/*		char tmp[256];	sprintf(tmp, "http://%s:%i/AVRendererDesc.xml", UpnpGetServerIpAddress(), UpnpGetServerPort());	err = UpnpRegisterRootDevice(tmp, callbackEventHandler, NULL, &renderer_hdl);	if ( err != UPNP_E_SUCCESS) {		cout << "couldn't register root device: " << err << endl;		UpnpFinish();		exit(1);	}			cout << "SDK intitalized and device registered: (" << tmp << ")." << endl;*/		IXML_Document* desc = getDescriptionDoc();	string str = ixmlPrintDocument(desc);	int lng = str.length();//	cout << ixmlPrintDocument(desc) << endl;	err = UpnpRegisterRootDevice2(	UPNPREG_BUF_DESC,									str.c_str(),									lng,									1,									callbackEventHandler, 									NULL, 									&renderer_hdl								 );	if ( err != UPNP_E_SUCCESS) {		cout << "couldn't register root device: " << UpnpGetErrorMessage(err) << endl;		UpnpFinish();		exit(1);	}			cout << "SDK intitalized and device registered." << endl;	// Advertisement	if (UpnpSendAdvertisement(renderer_hdl, 1000) != UPNP_E_SUCCESS) {		cout << "couldn't advertise device" << endl;		UpnpFinish();		exit(1);	}			cout << "device advertised." << endl;}/* * Destructor */cRenderer::~cRenderer() {	ithread_mutex_destroy(&rendererMutex);	ithread_mutex_destroy(&outputMutex);	if (strcmp("STOPPED",services[AVTransport]->value[cAVTransport::AV_TransportState]))	{		cout << "mplayer is quitting" << endl;		char* test="quit\n";		write(PARENT_WRITE,test,strlen(test));	} else {		cout << "mplayer is already exited" << endl;	}	int err;	err=UpnpUnRegisterRootDevice(renderer_hdl);	if (err != UPNP_E_SUCCESS) {		cout << "couldn't unregister root device:" << err << endl;		UpnpFinish();		exit(1);	}			if (UpnpFinish() != UPNP_E_SUCCESS) {		cout << "couldn't finish" << endl;		exit(1);	}}/* * Handles Action Requests */void cRenderer::handleActionRequest(Upnp_Action_Request *Event){	ithread_mutex_lock(&rendererMutex);	cout << ixmlPrintDocument(Event->ActionRequest) << endl;		if( (strcmp(Event->ServiceID,services[RenderingControl]->service_id)==0)&&		(strcmp(Event->DevUDN,udn)==0)){		for(int i=0;i<services[RenderingControl]->action_count;i++){			if(!strcmp(Event->ActionName,					   services[RenderingControl]->action_name[i])){				((cRenderingControl*)services[RenderingControl])->callAction(i,Event->ActionRequest,&Event->ActionResult,Event);				break;			}						   		}	}else if( (strcmp(Event->DevUDN,udn)==0)&&				(strcmp(Event->ServiceID,services[ConnectionManager]->service_id)==0)){		for(int i=0;i<services[ConnectionManager]->action_count;i++){			if(!strcmp(Event->ActionName,					   services[ConnectionManager]->action_name[i])){				((cConnectionManager*)services[ConnectionManager])->callAction(i,Event->ActionRequest,&Event->ActionResult,Event);				break;			}						   		}	}else if( (strcmp(Event->DevUDN,udn)==0)&&				(strcmp(Event->ServiceID,services[AVTransport]->service_id)==0)){		for(int i=0;i<services[AVTransport]->action_count;i++){			if(!strcmp(Event->ActionName,					   services[AVTransport]->action_name[i])){				((cAVTransport*)services[AVTransport])->callAction(i,Event->ActionRequest,						   							&Event->ActionResult,Event);				break;			}						   		}	}else{		cout << "service false" << endl;		return;	}		ithread_mutex_unlock(&rendererMutex);}/* * Handles Subscription Requests */void cRenderer::handleSubscriptionRequest(Upnp_Subscription_Request* Event){	ithread_mutex_lock(&rendererMutex);	int err = 254;	if (!strcmp("urn:upnp-org:serviceId:RenderingControl1",Event->ServiceId)) {		cout << "subscription of service RenderingControl1 requested" << endl;		char* evRC_name[1];		char* evRC_value[1];		evRC_name[0]=services[RenderingControl]->name[cRenderingControl::RC_LastChange] ;		evRC_value[0]=services[RenderingControl]->value[cRenderingControl::RC_LastChange] ;				cout << evRC_name[0] << endl;		err = UpnpAcceptSubscription(renderer_hdl,								Event->UDN,								Event->ServiceId,								(const char **) evRC_name,								(const char **) evRC_value,								1,								Event->Sid);		cout << "nach accept" << endl;		(services[RenderingControl])->setVar(RenderingControl,1,cRenderingControl::RC_Volume,services[RenderingControl]->value[cRenderingControl::RC_Volume]);	} else if (!strcmp("urn:upnp-org:serviceId:ConnectionManager1",Event->ServiceId)) {		cout << "subscription of service ConnectionManager1 requested" << endl;		char* evCM_name[3];		char* evCM_value[3];				evCM_name[0]=services[ConnectionManager]->name[cConnectionManager::CM_SourceProtocolInfo];		evCM_name[1]=services[ConnectionManager]->name[cConnectionManager::CM_SinkProtocolInfo];		evCM_name[2]=services[ConnectionManager]->name[cConnectionManager::CM_CurrentConnectionIDs];				evCM_value[0]=services[ConnectionManager]->value[cConnectionManager::CM_SourceProtocolInfo];		evCM_value[1]=services[ConnectionManager]->value[cConnectionManager::CM_SinkProtocolInfo];		evCM_value[2]=services[ConnectionManager]->value[cConnectionManager::CM_CurrentConnectionIDs];				err = UpnpAcceptSubscription(renderer_hdl,								Event->UDN,								Event->ServiceId,								(const char **) evCM_name,								(const char **) evCM_value,								3, // muss noch korrigiert werden								Event->Sid);	} else if (!strcmp("urn:upnp-org:serviceId:AVTransport1",Event->ServiceId)) {		cout << "subscription of service AVTransport1 requested" << endl;		char* evAV_name[1];		char* evAV_value[1];		evAV_name[0]=services[AVTransport]->name[cAVTransport::AV_LastChange];		evAV_value[0]=services[AVTransport]->value[cAVTransport::AV_LastChange];		err = UpnpAcceptSubscription(renderer_hdl,								Event->UDN,								Event->ServiceId,								(const char **) evAV_name,								(const char **) evAV_value,								1,								Event->Sid);	} else {				cout << "subscription of uncatched service " <<				Event->ServiceId <<				" requested" <<		endl;	}	cout << "accepted? " << Event->ServiceId << " " ;		cout << " - err: " << err << endl;		ithread_mutex_unlock(&rendererMutex);}/* * Handles Get Var Requests */void cRenderer::handleGetVarRequest(Upnp_State_Var_Request* Event){	ithread_mutex_lock(&rendererMutex);		cout << "get var requested:" << 			Event->DevUDN <<			Event->ServiceID <<			Event->StateVarName <<//			Event->CtrlPtIPAddr <<			Event->CurrentVal <<	endl;		ithread_mutex_unlock(&rendererMutex);}/* * Handles sdk's callbacks */int cRenderer::callbackEventHandler(Upnp_EventType EventType, void *Event, void *Cookie){	cRenderer *cp = (cRenderer*) pt2obj;	cout << "cp->UDN " << cp->udn << endl;	switch (EventType) {		case UPNP_CONTROL_ACTION_REQUEST: { /* Received by a device when a control point issues a control request. */			cp->handleActionRequest((struct Upnp_Action_Request *) Event);			break; 		}		case UPNP_CONTROL_GET_VAR_REQUEST: { /* Received by a device when a query for a single service variable arrives. */			// deprecated			cp->handleGetVarRequest((struct Upnp_State_Var_Request *) Event);			break; 		}		case UPNP_EVENT_SUBSCRIPTION_REQUEST: { /* Received by a device when a query for a single service variable arrives. */			cp->handleSubscriptionRequest((struct Upnp_Subscription_Request *) Event);			break; 		}		default: {			cout << "uncatched Event: " << EventType << endl;			break;		}	}	return UPNP_E_SUCCESS;}/* * Sends a command to mplayer, if mplayer is running */char* cRenderer::mplayer_cmd(char command[],bool output){	//ithread_mutex_lock(&outputMutex);	cout << services[AVTransport]->value[cAVTransport::AV_TransportState] << endl;	if (strcmp(services[AVTransport]->value[cAVTransport::AV_TransportState],"STOPPED")!=0) {		char cmd[100];		sprintf(cmd,"%s\n",command);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -