/******************************************************************************* * Copyright (c) 2013 Ziver * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ******************************************************************************/ package zutil.net.upnp.services; import java.io.File; import java.io.IOException; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.dom4j.DocumentException; import zutil.io.file.FileUtil; import zutil.net.http.HttpHeaderParser; import zutil.net.http.HttpPage; import zutil.net.http.HttpPrintStream; import zutil.net.upnp.UPnPService; import zutil.net.ws.WSInterface; import zutil.net.ws.WSReturnObject; /** * Information about a UPNP Service * * @author Ziver */ public class UPnPContentDirectory implements UPnPService, HttpPage, WSInterface { public static final int VERSION = 1; private static List file_list; public UPnPContentDirectory(){} public UPnPContentDirectory(File dir){ file_list = FileUtil.search(dir, new LinkedList(), true, Integer.MAX_VALUE); } /** * This action returns the searching capabilities * that are supported by the device. * */ @WSReturnName("SortCaps") public String GetSearchCapabilities(){ // "dc:title,res@size" return ""; } /** * Returns the CSV list of meta-data tags that can * be used in sortCriteria * */ @WSReturnName("SortCaps") public String GetSortCapabilities(){ return "dc:title"; } /** * This action returns the current value of state variable * SystemUpdateID. It can be used by clients that want to * 'poll' for any changes in the Content Directory * (as opposed to subscribing to events). * */ @WSReturnName("Id") public int GetSystemUpdateID(){ return 0; } /** * This action allows the caller to incrementally browse * the native hierarchy of the Content Directory objects * exposed by the Content Directory Service, including * information listing the classes of objects available * in any particular object container. * @throws DocumentException * */ //@WSNameSpace("urn:schemas-upnp-org:service:ContentDirectory:1") public BrowseRetObj Browse( @WSParamName("ObjectID") String ObjectID, @WSParamName("BrowseFlag") String BrowseFlag, @WSParamName("Filter") String Filter, @WSParamName("StartingIndex") int StartingIndex, @WSParamName("RequestedCount") int RequestedCount, @WSParamName("SortCriteria") String SortCriteria) throws DocumentException{ BrowseRetObj ret = new BrowseRetObj(); if( BrowseFlag.equals("BrowseMetadata") ){ } else if( BrowseFlag.equals("BrowseDirectChildren") ){ StringBuffer xml = new StringBuffer(); xml.append( "" ); List tmp = FileUtil.search( file_list.get(Integer.parseInt(ObjectID)), new LinkedList(), false ); for(File file : tmp){ xml.append(" "); xml.append(" "+file.getName()+" "); if( file.isDirectory() ) xml.append(" object.container.storageFolder "); else xml.append(" object.container "); xml.append(" "+(int)(file.length()/1000)+" "); xml.append(" "); ret.NumberReturned++; ret.TotalMatches++; } xml.append( "" ); ret.Result = xml.toString(); //Document document = DocumentHelper.parseText( xml.toString() ); //ret.Result = document.getRootElement(); } return ret; } public class BrowseRetObj extends WSReturnObject{ @WSValueName("Result") public String Result; @WSValueName("NumberReturned") public int NumberReturned; @WSValueName("TotalMatches") public int TotalMatches; @WSValueName("UpdateID") public int UpdateID; } @WSDisabled public void respond(HttpPrintStream out, HttpHeaderParser clientInfo, Map session, Map cookie, Map request) throws IOException { out.enableBuffering(true); out.setHeader("Content-Type", "text/xml"); out.println(""); out.println(""); out.println(" "); out.println(" "); out.println(" "); out.println(" TransferIDs"); out.println(" yes"); out.println(" string"); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_ObjectID"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_Result"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_SearchCriteria"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_BrowseFlag"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" BrowseMetadata"); out.println(" BrowseDirectChildren"); out.println(" "); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_Filter"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_SortCriteria"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_Index"); out.println(" no"); out.println(" ui4"); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_Count"); out.println(" no"); out.println(" ui4"); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_UpdateID"); out.println(" no"); out.println(" ui4"); out.println(" "); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_TransferID"); out.println(" no"); out.println(" ui4"); out.println(" "); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_TransferStatus"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" COMPLETED"); out.println(" ERROR"); out.println(" IN_PROGRESS"); out.println(" STOPPED"); out.println(" "); out.println(" "); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_TransferLength"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_TransferTotal"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_TagValueList"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" "); out.println(" "); out.println(" A_ARG_TYPE_URI"); out.println(" no"); out.println(" uri"); out.println(" "); out.println(" "); out.println(" SearchCapabilities"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" "); out.println(" SortCapabilities"); out.println(" no"); out.println(" string"); out.println(" "); out.println(" "); out.println(" SystemUpdateID"); out.println(" yes"); out.println(" ui4"); out.println(" "); out.println(" "); out.println(" "); out.println(" ContainerUpdateIDs"); out.println(" yes"); out.println(" string"); out.println(" "); out.println(" "); out.println(" "); out.println(" "); out.println(" GetSearchCapabilities"); out.println(" "); out.println(" "); out.println(" SearchCaps"); out.println(" out"); out.println(" SearchCapabilities"); out.println(" "); out.println(" "); out.println(" "); out.println(" "); out.println(" GetSortCapabilities"); out.println(" "); out.println(" "); out.println(" SortCaps"); out.println(" out"); out.println(" SortCapabilities"); out.println(" "); out.println(" "); out.println(" "); out.println(" "); out.println(" GetSystemUpdateID"); out.println(" "); out.println(" "); out.println(" Id"); out.println(" out"); out.println(" SystemUpdateID"); out.println(" "); out.println(" "); out.println(" "); out.println(" "); out.println(" Browse"); out.println(" "); out.println(" "); out.println(" ObjectID"); out.println(" in"); out.println(" A_ARG_TYPE_ObjectID"); out.println(" "); out.println(" "); out.println(" BrowseFlag"); out.println(" in"); out.println(" A_ARG_TYPE_BrowseFlag"); out.println(" "); out.println(" "); out.println(" Filter"); out.println(" in"); out.println(" A_ARG_TYPE_Filter"); out.println(" "); out.println(" "); out.println(" StartingIndex"); out.println(" in"); out.println(" A_ARG_TYPE_Index"); out.println(" "); out.println(" "); out.println(" RequestedCount"); out.println(" in"); out.println(" A_ARG_TYPE_Count"); out.println(" "); out.println(" "); out.println(" SortCriteria"); out.println(" in"); out.println(" A_ARG_TYPE_SortCriteria"); out.println(" "); out.println(" "); out.println(" Result"); out.println(" out"); out.println(" A_ARG_TYPE_Result"); out.println(" "); out.println(" "); out.println(" NumberReturned"); out.println(" out"); out.println(" A_ARG_TYPE_Count"); out.println(" "); out.println(" "); out.println(" TotalMatches"); out.println(" out"); out.println(" A_ARG_TYPE_Count"); out.println(" "); out.println(" "); out.println(" UpdateID"); out.println(" out"); out.println(" A_ARG_TYPE_UpdateID"); out.println(" "); out.println(" "); out.println(" "); /*out.println(" "); out.println(" "); out.println(" Search"); out.println(" "); out.println(" "); out.println(" ContainerID"); out.println(" in"); out.println(" A_ARG_TYPE_ObjectID"); out.println(" "); out.println(" "); out.println(" SearchCriteria"); out.println(" in"); out.println(" A_ARG_TYPE_SearchCriteria "); out.println(" "); out.println(" "); out.println(" Filter"); out.println(" in"); out.println(" A_ARG_TYPE_Filter"); out.println(" "); out.println(" "); out.println(" StartingIndex"); out.println(" in"); out.println(" A_ARG_TYPE_Index"); out.println(" "); out.println(" "); out.println(" RequestedCount"); out.println(" in"); out.println(" A_ARG_TYPE_Count"); out.println(" "); out.println(" "); out.println(" SortCriteria"); out.println(" in"); out.println(" A_ARG_TYPE_SortCriteria"); out.println(" "); out.println(" "); out.println(" Result"); out.println(" out"); out.println(" A_ARG_TYPE_Result"); out.println(" "); out.println(" "); out.println(" NumberReturned"); out.println(" out"); out.println(" A_ARG_TYPE_Count"); out.println(" "); out.println(" "); out.println(" TotalMatches"); out.println(" out"); out.println(" A_ARG_TYPE_Count"); out.println(" "); out.println(" "); out.println(" UpdateID"); out.println(" out"); out.println(" A_ARG_TYPE_UpdateID"); out.println(" "); out.println(" "); out.println(" ");*/ /*out.println(" "); out.println(" "); out.println(" CreateObject"); out.println(" "); out.println(" "); out.println(" ContainerID"); out.println(" in"); out.println(" A_ARG_TYPE_ObjectID"); out.println(" "); out.println(" "); out.println(" Elements"); out.println(" in"); out.println(" A_ARG_TYPE_Result"); out.println(" "); out.println(" "); out.println(" ObjectID"); out.println(" out"); out.println(" A_ARG_TYPE_ObjectID"); out.println(" "); out.println(" "); out.println(" Result"); out.println(" out"); out.println(" A_ARG_TYPE_Result"); out.println(" "); out.println(" "); out.println(" ");*/ /*out.println(" "); out.println(" "); out.println(" DestroyObject"); out.println(" "); out.println(" "); out.println(" ObjectID"); out.println(" in"); out.println(" A_ARG_TYPE_ObjectID"); out.println(" "); out.println(" "); out.println(" ");*/ /*out.println(" "); out.println(" "); out.println(" UpdateObject"); out.println(" "); out.println(" "); out.println(" ObjectID"); out.println(" in"); out.println(" A_ARG_TYPE_ObjectID"); out.println(" "); out.println(" "); out.println(" CurrentTagValue"); out.println(" in"); out.println(" A_ARG_TYPE_TagValueList "); out.println(" "); out.println(" "); out.println(" NewTagValue"); out.println(" in"); out.println(" A_ARG_TYPE_TagValueList "); out.println(" "); out.println(" "); out.println(" ");*/ /*out.println(" "); out.println(" "); out.println(" ImportResource"); out.println(" "); out.println(" "); out.println(" SourceURI"); out.println(" in"); out.println(" A_ARG_TYPE_URI"); out.println(" "); out.println(" "); out.println(" DestinationURI"); out.println(" in"); out.println(" A_ARG_TYPE_URI"); out.println(" "); out.println(" "); out.println(" TransferID"); out.println(" out"); out.println(" A_ARG_TYPE_TransferID "); out.println(" "); out.println(" "); out.println(" ");*/ /*out.println(" "); out.println(" "); out.println(" ExportResource"); out.println(" "); out.println(" "); out.println(" SourceURI"); out.println(" in"); out.println(" A_ARG_TYPE_URI"); out.println(" "); out.println(" "); out.println(" DestinationURI"); out.println(" in"); out.println(" A_ARG_TYPE_URI"); out.println(" "); out.println(" "); out.println(" TransferID"); out.println(" out"); out.println(" A_ARG_TYPE_TransferID "); out.println(" "); out.println(" "); out.println(" ");*/ /*out.println(" "); out.println(" "); out.println(" StopTransferResource"); out.println(" "); out.println(" "); out.println(" TransferID"); out.println(" in"); out.println(" A_ARG_TYPE_TransferID "); out.println(" "); out.println(" "); out.println(" ");*/ /*out.println(" "); out.println(" "); out.println(" GetTransferProgress"); out.println(" "); out.println(" "); out.println(" TransferID"); out.println(" in"); out.println(" A_ARG_TYPE_TransferID "); out.println(" "); out.println(" "); out.println(" TransferStatus"); out.println(" out"); out.println(" A_ARG_TYPE_TransferStatus "); out.println(" "); out.println(" "); out.println(" TransferLength"); out.println(" out"); out.println(" A_ARG_TYPE_TransferLength "); out.println(" "); out.println(" "); out.println(" TransferTotal"); out.println(" out"); out.println(" A_ARG_TYPE_TransferTotal"); out.println(" "); out.println(" "); out.println(" ");*/ /*out.println(" "); out.println(" "); out.println(" DeleteResource"); out.println(" "); out.println(" "); out.println(" ResourceURI"); out.println(" in"); out.println(" A_ARG_TYPE_URI"); out.println(" "); out.println(" "); out.println(" ");*/ /*out.println(" "); out.println(" "); out.println(" CreateReference"); out.println(" "); out.println(" "); out.println(" ContainerID"); out.println(" in"); out.println(" A_ARG_TYPE_ObjectID"); out.println(" "); out.println(" "); out.println(" ObjectID"); out.println(" in"); out.println(" A_ARG_TYPE_ObjectID"); out.println(" "); out.println(" "); out.println(" NewID"); out.println(" out"); out.println(" A_ARG_TYPE_ObjectID"); out.println(" "); out.println(" "); out.println(" ");*/ out.println(" "); out.println(""); } }