1 /* 2 * Copyright (C) 2013 4th Line GmbH, Switzerland 3 * 4 * The contents of this file are subject to the terms of either the GNU 5 * Lesser General Public License Version 2 or later ("LGPL") or the 6 * Common Development and Distribution License Version 1 or later 7 * ("CDDL") (collectively, the "License"). You may not use this file 8 * except in compliance with the License. See LICENSE.txt for more 9 * information. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 */ 15 package example.localservice; 16 17 import org.fourthline.cling.binding.annotations.*; 18 19 /** 20 * Explicitly naming related state variables 21 * <p> 22 * If your mapped action method does not match the name of a mapped state variable, 23 * you have to provide the name of (any) argument's related state variable: 24 * </p> 25 * <a class="citation" href="javacode://this" style="include:INC1"/> 26 * <p> 27 * Here the method has the name <code>retrieveStatus</code>, which 28 * you also have to override if you want it be known as a the 29 * <code>GetStatus</code> UPnP action. Because it is no longer a JavaBean 30 * accessor for <code>status</code>, it explicitly has to be linked with 31 * the related state variable <code>Status</code>. You always have to 32 * provide the related state variable name if your action has more than one 33 * output argument. 34 * </p> 35 * <p> 36 * The "related statevariable" detection algorithm in Cling has one more trick 37 * up its sleeve however. The UPnP specification says that a state variable which 38 * is only ever used to describe the type of an input or output argument should 39 * be named with the prefix <code>A_ARG_TYPE_</code>. So if you do not name the 40 * related state variable of your action argument, Cling will also 41 * look for a state variable with the name 42 * <code>A_ARG_TYPE_[Name Of Your Argument]</code>. In the example above, Cling 43 * is therefore also searching (unsuccessfully) for a state variable named 44 * <code>A_ARG_TYPE_ResultStatus</code>. (Given that direct querying 45 * of state variables is already deprecated in UDA 1.0, there are <em>NO</em> 46 * state variables which are anything but type declarations for action input/output 47 * arguments. This is a good example why UPnP is such a horrid specification.) 48 * </p> 49 */ 50 @UpnpService( 51 serviceId = @UpnpServiceId("SwitchPower"), 52 serviceType = @UpnpServiceType(value = "SwitchPower", version = 1) 53 ) 54 public class SwitchPowerNamedStateVariable { 55 56 @UpnpStateVariable(defaultValue = "0", sendEvents = false) 57 private boolean target = false; 58 59 @UpnpStateVariable(defaultValue = "0") 60 private boolean status = false; 61 62 @UpnpAction 63 public void setTarget(@UpnpInputArgument(name = "NewTargetValue") 64 boolean newTargetValue) { 65 target = newTargetValue; 66 status = newTargetValue; 67 System.out.println("Switch is: " + status); 68 } 69 70 @UpnpAction(out = @UpnpOutputArgument(name = "RetTargetValue")) 71 public boolean getTarget() { 72 return target; 73 } 74 75 @UpnpAction( // DOC:INC1 76 name = "GetStatus", 77 out = @UpnpOutputArgument( 78 name = "ResultStatus", 79 stateVariable = "Status" 80 ) 81 ) 82 public boolean retrieveStatus() { 83 return status; 84 } // DOC:INC1 85 86 }