Mercurial > projects > hoofbaby
diff deps/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp @ 0:3425707ddbf6
Initial import (hopefully this mercurial stuff works...)
author | fraserofthenight |
---|---|
date | Mon, 06 Jul 2009 08:06:28 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp Mon Jul 06 08:06:28 2009 -0700 @@ -0,0 +1,417 @@ +/***************************************************************** +| +| Platinum - AV Media Server Device +| +| Copyright (c) 2004-2008, Plutinosoft, LLC. +| All rights reserved. +| http://www.plutinosoft.com +| +| 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. +| +| OEMs, ISVs, VARs and other distributors that combine and +| distribute commercially licensed software with Platinum software +| and do not wish to distribute the source code for the commercially +| licensed software under version 2, or (at your option) any later +| version, of the GNU General Public License (the "GPL") must enter +| into a commercial license agreement with Plutinosoft, LLC. +| +| 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; see the file LICENSE.txt. If not, write to +| the Free Software Foundation, Inc., +| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +| http://www.gnu.org/licenses/gpl-2.0.html +| +****************************************************************/ + +/*---------------------------------------------------------------------- +| includes ++---------------------------------------------------------------------*/ +#include "PltUPnP.h" +#include "PltMediaServer.h" +#include "PltMediaItem.h" +#include "PltService.h" +#include "PltTaskManager.h" +#include "PltHttpServer.h" +#include "PltDidl.h" +#include "PltMetadataHandler.h" + +NPT_SET_LOCAL_LOGGER("platinum.media.server") + +/*---------------------------------------------------------------------- +| forward references ++---------------------------------------------------------------------*/ +extern NPT_UInt8 MS_ConnectionManagerSCPD[]; +extern NPT_UInt8 MS_ContentDirectorySCPD[]; +extern NPT_UInt8 MS_ContentDirectorywSearchSCPD[]; + +const char* BrowseFlagsStr[] = { + "BrowseMetadata", + "BrowseDirectChildren" +}; + +/*---------------------------------------------------------------------- +| PLT_MediaServer::PLT_MediaServer ++---------------------------------------------------------------------*/ +PLT_MediaServer::PLT_MediaServer(const char* friendly_name, + bool show_ip /* = false */, + const char* uuid /* = NULL */, + NPT_UInt16 port /* = 0 */, + bool port_rebind /* = false */) : + PLT_DeviceHost("/DeviceDescription.xml", + uuid, + "urn:schemas-upnp-org:device:MediaServer:1", + friendly_name, + show_ip, + port, + port_rebind) +{ +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::~PLT_MediaServer ++---------------------------------------------------------------------*/ +PLT_MediaServer::~PLT_MediaServer() +{ +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::SetupServices ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::SetupServices(PLT_DeviceData& data) +{ + PLT_Service* service; + + { + service = new PLT_Service( + &data, + "urn:schemas-upnp-org:service:ContentDirectory:1", + "urn:upnp-org:serviceId:CDS_1-0"); + NPT_CHECK_FATAL(service->SetSCPDXML((const char*) MS_ContentDirectorywSearchSCPD)); + NPT_CHECK_FATAL(service->InitURLs("ContentDirectory", data.GetUUID())); + NPT_CHECK_FATAL(data.AddService(service)); + + service->SetStateVariable("ContainerUpdateIDs", "0"); + service->SetStateVariableRate("ContainerUpdateIDs", NPT_TimeInterval(2, 0)); + service->SetStateVariable("SystemUpdateID", "0"); + service->SetStateVariableRate("SystemUpdateID", NPT_TimeInterval(2, 0)); + service->SetStateVariable("SearchCapability", "upnp:class"); + service->SetStateVariable("SortCapability", ""); + } + + { + service = new PLT_Service( + &data, + "urn:schemas-upnp-org:service:ConnectionManager:1", + "urn:upnp-org:serviceId:CMGR_1-0"); + NPT_CHECK_FATAL(service->SetSCPDXML((const char*) MS_ConnectionManagerSCPD)); + NPT_CHECK_FATAL(service->InitURLs("ConnectionManager", data.GetUUID())); + NPT_CHECK_FATAL(data.AddService(service)); + + service->SetStateVariable("CurrentConnectionIDs", "0"); + service->SetStateVariable("SinkProtocolInfo", ""); + service->SetStateVariable("SourceProtocolInfo", "http-get:*:*:*"); + } + + return NPT_SUCCESS; +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnAction ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnAction(PLT_ActionReference& action, + const PLT_HttpRequestContext& context) +{ + /* parse the action name */ + NPT_String name = action->GetActionDesc()->GetName(); + + // ContentDirectory + if (name.Compare("Browse", true) == 0) { + return OnBrowse(action, context); + } + if (name.Compare("Search", true) == 0) { + return OnSearch(action, context); + } + if (name.Compare("GetSystemUpdateID", true) == 0) { + return OnGetSystemUpdateID(action, context); + } + if (name.Compare("GetSortCapabilities", true) == 0) { + return OnGetSortCapabilities(action, context); + } + if (name.Compare("GetSearchCapabilities", true) == 0) { + return OnGetSearchCapabilities(action, context); + } + + // ConnectionMananger + if (name.Compare("GetCurrentConnectionIDs", true) == 0) { + return OnGetCurrentConnectionIDs(action, context); + } + if (name.Compare("GetProtocolInfo", true) == 0) { + return OnGetProtocolInfo(action, context); + } + if (name.Compare("GetCurrentConnectionInfo", true) == 0) { + return OnGetCurrentConnectionInfo(action, context); + } + + action->SetError(401,"No Such Action."); + return NPT_SUCCESS; +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnGetCurrentConnectionIDs ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnGetCurrentConnectionIDs(PLT_ActionReference& action, + const PLT_HttpRequestContext& context) +{ + NPT_COMPILER_UNUSED(context); + + return action->SetArgumentsOutFromStateVariable(); +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnGetProtocolInfo ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnGetProtocolInfo(PLT_ActionReference& action, + const PLT_HttpRequestContext& context) +{ + NPT_COMPILER_UNUSED(context); + + return action->SetArgumentsOutFromStateVariable(); +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnGetCurrentConnectionInfo ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnGetCurrentConnectionInfo(PLT_ActionReference& action, + const PLT_HttpRequestContext& context) +{ + NPT_COMPILER_UNUSED(context); + + if (NPT_FAILED(action->VerifyArgumentValue("ConnectionID", "0"))) { + action->SetError(706,"No Such Connection."); + return NPT_FAILURE; + } + + if (NPT_FAILED(action->SetArgumentValue("RcsID", "-1"))){ + return NPT_FAILURE; + } + if (NPT_FAILED(action->SetArgumentValue("AVTransportID", "-1"))) { + return NPT_FAILURE; + } + if (NPT_FAILED(action->SetArgumentValue("ProtocolInfo", "http-get:*:*:*"))) { + return NPT_FAILURE; + } + if (NPT_FAILED(action->SetArgumentValue("PeerConnectionManager", "/"))) { + return NPT_FAILURE; + } + if (NPT_FAILED(action->SetArgumentValue("PeerConnectionID", "-1"))) { + return NPT_FAILURE; + } + if (NPT_FAILED(action->SetArgumentValue("Direction", "Output"))) { + return NPT_FAILURE; + } + if (NPT_FAILED(action->SetArgumentValue("Status", "Unknown"))) { + return NPT_FAILURE; + } + + return NPT_SUCCESS; +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnGetSortCapabilities ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnGetSortCapabilities(PLT_ActionReference& action, + const PLT_HttpRequestContext& context) +{ + NPT_COMPILER_UNUSED(context); + + return action->SetArgumentsOutFromStateVariable(); +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnGetSearchCapabilities ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnGetSearchCapabilities(PLT_ActionReference& action, + const PLT_HttpRequestContext& context) +{ + NPT_COMPILER_UNUSED(context); + + return action->SetArgumentsOutFromStateVariable(); +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnGetSystemUpdateID ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnGetSystemUpdateID(PLT_ActionReference& action, + const PLT_HttpRequestContext& context) +{ + NPT_COMPILER_UNUSED(context); + + return action->SetArgumentsOutFromStateVariable(); +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::GetBrowseFlag ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::GetBrowseFlag(const char* str, BrowseFlags& flag) +{ + if (NPT_String::Compare(str, BrowseFlagsStr[0], true) == 0) { + flag = BROWSEMETADATA; + return NPT_SUCCESS; + } + if (NPT_String::Compare(str, BrowseFlagsStr[1], true) == 0) { + flag = BROWSEDIRECTCHILDREN; + return NPT_SUCCESS; + } + return NPT_FAILURE; +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnBrowse ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnBrowse(PLT_ActionReference& action, + const PLT_HttpRequestContext& context) +{ + NPT_Result res; + NPT_String object_id; + NPT_String browse_flag_val; + + if (NPT_FAILED(action->GetArgumentValue("ObjectId", object_id)) || + NPT_FAILED(action->GetArgumentValue("BrowseFlag", browse_flag_val))) { + NPT_LOG_WARNING("PLT_FileMediaServer::OnBrowse - invalid arguments."); + return NPT_SUCCESS; + } + + /* we don't support sorting yet */ +// PLT_Argument* sortCritArg = action->GetArgument("SortCriteria"); +// if (sortCritArg != NULL) { +// NPT_String sortCrit = sortCritArg->GetValue(); +// if (sortCrit.GetLength() > 0) { +// /* error */ +// PLT_Log(PLT_LOG_LEVEL_1, "PLT_FileMediaServer::OnBrowse - SortCriteria not allowed."); +// action->SetError(709, "MediaServer does not support sorting."); +// return NPT_FAILURE; +// } +// } + + /* extract flag */ + BrowseFlags flag; + if (NPT_FAILED(GetBrowseFlag(browse_flag_val, flag))) { + /* error */ + NPT_LOG_WARNING("PLT_FileMediaServer::OnBrowse - BrowseFlag value not allowed."); + action->SetError(402,"Invalid BrowseFlag arg."); + return NPT_SUCCESS; + } + + NPT_LOG_FINE_2("PLT_FileMediaServer::On%s - id = %s", + (const char*)browse_flag_val, + (const char*)object_id); + + /* Invoke the browse function */ + if (flag == BROWSEMETADATA) { + res = OnBrowseMetadata(action, object_id, context); + } else { + res = OnBrowseDirectChildren(action, object_id, context); + } + + if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) { + action->SetError(800, "Internal error"); + } + + return res; +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnSearch ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnSearch(PLT_ActionReference& action, + const PLT_HttpRequestContext& context) +{ + NPT_COMPILER_UNUSED(context); + + NPT_Result res; + NPT_String container_id; + NPT_String search_criteria; + + NPT_CHECK_FATAL(action->GetArgumentValue("SearchCriteria", search_criteria)); + NPT_CHECK_FATAL(action->GetArgumentValue("ContainerId", container_id)); + + NPT_LOG_FINE_1("PLT_FileMediaServer::OnSearch - id = %s", (const char*)container_id); + + if(search_criteria.IsEmpty()) { + res = OnBrowseDirectChildren(action, container_id, context); + } else { + res = OnSearch(action, container_id, search_criteria, context); + } + + if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) { + action->SetError(800, "Internal error"); + } + + return res; +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnBrowseMetadata ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnBrowseMetadata(PLT_ActionReference& action, + const char* object_id, + const PLT_HttpRequestContext& context) +{ + NPT_COMPILER_UNUSED(action); + NPT_COMPILER_UNUSED(object_id); + NPT_COMPILER_UNUSED(context); + + return NPT_ERROR_NOT_IMPLEMENTED; +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnBrowseDirectChildren ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnBrowseDirectChildren(PLT_ActionReference& action, + const char* object_id, + const PLT_HttpRequestContext& context) +{ + NPT_COMPILER_UNUSED(action); + NPT_COMPILER_UNUSED(object_id); + NPT_COMPILER_UNUSED(context); + + return NPT_ERROR_NOT_IMPLEMENTED; +} + +/*---------------------------------------------------------------------- +| PLT_MediaServer::OnSearch ++---------------------------------------------------------------------*/ +NPT_Result +PLT_MediaServer::OnSearch(PLT_ActionReference& action, + const NPT_String& object_id, + const NPT_String& search_criteria, + const PLT_HttpRequestContext& context) +{ + NPT_COMPILER_UNUSED(action); + NPT_COMPILER_UNUSED(object_id); + NPT_COMPILER_UNUSED(search_criteria); + NPT_COMPILER_UNUSED(context); + + return NPT_ERROR_NOT_IMPLEMENTED; +}