📄 crenderer.cc.svn-base
字号:
/* * 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 + -