From bdc682aecc0d6982c79df0f6e19328a1c03062b1 Mon Sep 17 00:00:00 2001 From: Kai-Ming Guo Date: Tue, 28 Mar 2017 13:26:08 +0800 Subject: [PATCH 1/2] Update cling version change cling from 4thline repo, and update to 2.1.2-SNAPSHOT. --- app/build.gradle | 53 +- app/src/main/AndroidManifest.xml | 19 +- .../android/media/MediaMetadataRetriever.java | 289 ----- .../main/java/com/zxt/dlna/dmp/GPlayer.java | 8 +- .../java/com/zxt/dlna/dmp/ImageDisplay.java | 2 +- .../java/com/zxt/dlna/dmp/SuperImageView.java | 6 +- .../java/com/zxt/dlna/util/ImageUtil.java | 29 +- .../DefaultUpnpServiceConfiguration.java | 374 ------ .../main/java/org/fourthline/cling/Main.java | 106 -- .../fourthline/cling/ManagedUpnpService.java | 237 ---- .../ManagedUpnpServiceConfiguration.java | 260 ---- .../org/fourthline/cling/UpnpService.java | 65 - .../cling/UpnpServiceConfiguration.java | 256 ---- .../org/fourthline/cling/UpnpServiceImpl.java | 177 --- .../android/AndroidNetworkAddressFactory.java | 93 -- .../cling/android/AndroidRouter.java | 327 ----- .../cling/android/AndroidUpnpService.java | 94 -- .../AndroidUpnpServiceConfiguration.java | 143 --- .../cling/android/AndroidUpnpServiceImpl.java | 122 -- .../cling/android/NetworkUtils.java | 83 -- .../cling/binding/AllowedValueProvider.java | 25 - .../binding/AllowedValueRangeProvider.java | 27 - .../cling/binding/LocalServiceBinder.java | 50 - .../binding/LocalServiceBindingException.java | 32 - .../annotations/AnnotationActionBinder.java | 338 ------ .../AnnotationLocalServiceBinder.java | 293 ----- .../AnnotationStateVariableBinder.java | 316 ----- .../cling/binding/annotations/UpnpAction.java | 30 - .../annotations/UpnpInputArgument.java | 31 - .../annotations/UpnpOutputArgument.java | 32 - .../binding/annotations/UpnpService.java | 35 - .../binding/annotations/UpnpServiceId.java | 31 - .../binding/annotations/UpnpServiceType.java | 32 - .../annotations/UpnpStateVariable.java | 50 - .../annotations/UpnpStateVariables.java | 33 - .../cling/binding/staging/MutableAction.java | 45 - .../staging/MutableActionArgument.java | 34 - .../staging/MutableAllowedValueRange.java | 29 - .../cling/binding/staging/MutableDevice.java | 120 -- .../cling/binding/staging/MutableIcon.java | 36 - .../cling/binding/staging/MutableService.java | 71 -- .../binding/staging/MutableStateVariable.java | 58 - .../binding/staging/MutableUDAVersion.java | 24 - .../cling/binding/xml/Descriptor.java | 105 -- .../xml/DescriptorBindingException.java | 33 - .../binding/xml/DeviceDescriptorBinder.java | 41 - ...veringUDA10DeviceDescriptorBinderImpl.java | 214 ---- .../binding/xml/ServiceDescriptorBinder.java | 38 - .../xml/UDA10DeviceDescriptorBinderImpl.java | 613 ---------- .../UDA10DeviceDescriptorBinderSAXImpl.java | 447 ------- .../xml/UDA10ServiceDescriptorBinderImpl.java | 504 -------- .../UDA10ServiceDescriptorBinderSAXImpl.java | 448 ------- .../cling/controlpoint/ActionCallback.java | 196 --- .../cling/controlpoint/ControlPoint.java | 43 - .../cling/controlpoint/ControlPointImpl.java | 115 -- .../controlpoint/SubscriptionCallback.java | 374 ------ .../controlpoint/event/ExecuteAction.java | 34 - .../cling/controlpoint/event/Search.java | 53 - .../cling/mock/MockProtocolFactory.java | 101 -- .../org/fourthline/cling/mock/MockRouter.java | 173 --- .../cling/mock/MockUpnpService.java | 173 --- .../mock/MockUpnpServiceConfiguration.java | 135 --- .../org/fourthline/cling/model/Command.java | 26 - .../org/fourthline/cling/model/Constants.java | 67 - .../cling/model/DefaultServiceManager.java | 268 ---- .../cling/model/DiscoveryOptions.java | 70 -- .../cling/model/ExpirationDetails.java | 84 -- .../org/fourthline/cling/model/Location.java | 80 -- .../org/fourthline/cling/model/ModelUtil.java | 250 ---- .../org/fourthline/cling/model/Namespace.java | 204 ---- .../cling/model/NetworkAddress.java | 75 -- .../cling/model/ServerClientTokens.java | 158 --- .../cling/model/ServiceManager.java | 136 --- .../cling/model/ServiceReference.java | 92 -- .../cling/model/UnsupportedDataException.java | 51 - .../fourthline/cling/model/UserConstants.java | 31 - .../fourthline/cling/model/Validatable.java | 31 - .../cling/model/ValidationError.java | 58 - .../cling/model/ValidationException.java | 46 - .../fourthline/cling/model/VariableValue.java | 111 -- .../org/fourthline/cling/model/XMLUtil.java | 218 ---- .../model/action/AbstractActionExecutor.java | 178 --- .../model/action/ActionArgumentValue.java | 41 - .../action/ActionCancelledException.java | 27 - .../cling/model/action/ActionException.java | 58 - .../cling/model/action/ActionExecutor.java | 28 - .../cling/model/action/ActionInvocation.java | 194 --- .../model/action/MethodActionExecutor.java | 191 --- .../action/QueryStateVariableExecutor.java | 81 -- .../model/action/RemoteActionInvocation.java | 54 - .../cling/model/gena/CancelReason.java | 29 - .../cling/model/gena/GENASubscription.java | 96 -- .../model/gena/LocalGENASubscription.java | 251 ---- .../model/gena/RemoteGENASubscription.java | 129 -- .../cling/model/message/Connection.java | 33 - .../message/IncomingDatagramMessage.java | 69 -- .../message/OutgoingDatagramMessage.java | 49 - .../model/message/StreamRequestMessage.java | 88 -- .../model/message/StreamResponseMessage.java | 78 -- .../cling/model/message/UpnpHeaders.java | 193 --- .../cling/model/message/UpnpMessage.java | 206 ---- .../cling/model/message/UpnpOperation.java | 34 - .../cling/model/message/UpnpRequest.java | 108 -- .../cling/model/message/UpnpResponse.java | 100 -- .../model/message/control/ActionMessage.java | 31 - .../message/control/ActionRequestMessage.java | 23 - .../control/ActionResponseMessage.java | 22 - .../control/IncomingActionRequestMessage.java | 69 -- .../IncomingActionResponseMessage.java | 50 - .../control/OutgoingActionRequestMessage.java | 112 -- .../OutgoingActionResponseMessage.java | 77 -- .../IncomingNotificationRequest.java | 100 -- .../discovery/IncomingSearchRequest.java | 55 - .../discovery/IncomingSearchResponse.java | 92 -- .../OutgoingNotificationRequest.java | 60 - ...OutgoingNotificationRequestDeviceType.java | 37 - ...OutgoingNotificationRequestRootDevice.java | 45 - ...utgoingNotificationRequestServiceType.java | 42 - .../OutgoingNotificationRequestUDN.java | 36 - .../discovery/OutgoingSearchRequest.java | 53 - .../discovery/OutgoingSearchResponse.java | 54 - .../OutgoingSearchResponseDeviceType.java | 39 - .../OutgoingSearchResponseRootDevice.java | 38 - .../OutgoingSearchResponseServiceType.java | 41 - .../discovery/OutgoingSearchResponseUDN.java | 37 - .../gena/IncomingEventRequestMessage.java | 90 -- .../gena/IncomingSubscribeRequestMessage.java | 63 - .../IncomingSubscribeResponseMessage.java | 47 - .../IncomingUnsubscribeRequestMessage.java | 53 - .../gena/OutgoingEventRequestMessage.java | 66 - .../gena/OutgoingEventResponseMessage.java | 33 - .../gena/OutgoingRenewalRequestMessage.java | 50 - .../gena/OutgoingSubscribeRequestMessage.java | 66 - .../OutgoingSubscribeResponseMessage.java | 43 - .../OutgoingUnsubscribeRequestMessage.java | 44 - .../message/header/AVClientInfoHeader.java | 41 - .../model/message/header/CallbackHeader.java | 103 -- .../message/header/ContentRangeHeader.java | 52 - .../message/header/ContentTypeHeader.java | 56 - .../message/header/DeviceTypeHeader.java | 49 - .../model/message/header/DeviceUSNHeader.java | 50 - .../cling/model/message/header/EXTHeader.java | 39 - .../message/header/EventSequenceHeader.java | 52 - .../model/message/header/HostHeader.java | 61 - .../message/header/InterfaceMacHeader.java | 54 - .../header/InvalidHeaderException.java | 29 - .../model/message/header/LocationHeader.java | 53 - .../cling/model/message/header/MANHeader.java | 78 -- .../cling/model/message/header/MXHeader.java | 57 - .../model/message/header/MaxAgeHeader.java | 54 - .../model/message/header/NTEventHeader.java | 39 - .../cling/model/message/header/NTSHeader.java | 48 - .../model/message/header/PragmaHeader.java | 50 - .../model/message/header/RangeHeader.java | 50 - .../message/header/RootDeviceHeader.java | 39 - .../model/message/header/STAllHeader.java | 39 - .../model/message/header/ServerHeader.java | 125 -- .../message/header/ServiceTypeHeader.java | 49 - .../message/header/ServiceUSNHeader.java | 50 - .../message/header/SoapActionHeader.java | 58 - .../message/header/SubscriptionIdHeader.java | 42 - .../model/message/header/TimeoutHeader.java | 66 - .../message/header/UDADeviceTypeHeader.java | 48 - .../message/header/UDAServiceTypeHeader.java | 47 - .../cling/model/message/header/UDNHeader.java | 49 - .../message/header/USNRootDeviceHeader.java | 50 - .../model/message/header/UpnpHeader.java | 192 --- .../model/message/header/UserAgentHeader.java | 42 - .../fourthline/cling/model/meta/Action.java | 209 ---- .../cling/model/meta/ActionArgument.java | 164 --- .../fourthline/cling/model/meta/Device.java | 446 ------- .../cling/model/meta/DeviceDetails.java | 218 ---- .../cling/model/meta/DeviceIdentity.java | 75 -- .../org/fourthline/cling/model/meta/Icon.java | 221 ---- .../cling/model/meta/LocalDevice.java | 317 ----- .../cling/model/meta/LocalService.java | 133 -- .../cling/model/meta/ManufacturerDetails.java | 58 - .../cling/model/meta/ModelDetails.java | 79 -- .../model/meta/QueryStateVariableAction.java | 63 - .../cling/model/meta/RemoteDevice.java | 212 ---- .../model/meta/RemoteDeviceIdentity.java | 110 -- .../cling/model/meta/RemoteService.java | 114 -- .../fourthline/cling/model/meta/Service.java | 195 --- .../cling/model/meta/StateVariable.java | 129 -- .../meta/StateVariableAllowedValueRange.java | 81 -- .../model/meta/StateVariableEventDetails.java | 55 - .../model/meta/StateVariableTypeDetails.java | 136 --- .../cling/model/meta/UDAVersion.java | 73 -- .../cling/model/profile/ClientInfo.java | 55 - .../model/profile/DeviceDetailsProvider.java | 41 - .../profile/HeaderDeviceDetailsProvider.java | 101 -- .../cling/model/profile/RemoteClientInfo.java | 131 -- .../resource/DeviceDescriptorResource.java | 30 - .../cling/model/resource/IconResource.java | 30 - .../cling/model/resource/Resource.java | 115 -- .../resource/ServiceControlResource.java | 30 - .../resource/ServiceDescriptorResource.java | 30 - .../ServiceEventCallbackResource.java | 30 - .../ServiceEventSubscriptionResource.java | 30 - .../state/FieldStateVariableAccessor.java | 53 - .../state/GetterStateVariableAccessor.java | 54 - .../model/state/StateVariableAccessor.java | 59 - .../cling/model/state/StateVariableValue.java | 41 - .../cling/model/types/AbstractDatatype.java | 76 -- .../cling/model/types/Base64Datatype.java | 51 - .../cling/model/types/BinHexDatatype.java | 51 - .../cling/model/types/BooleanDatatype.java | 49 - .../cling/model/types/BytesRange.java | 127 -- .../cling/model/types/CharacterDatatype.java | 36 - .../cling/model/types/CustomDatatype.java | 42 - .../cling/model/types/DLNACaps.java | 70 -- .../fourthline/cling/model/types/DLNADoc.java | 105 -- .../cling/model/types/Datatype.java | 233 ---- .../cling/model/types/DateTimeDatatype.java | 99 -- .../cling/model/types/DeviceType.java | 164 --- .../cling/model/types/DoubleDatatype.java | 40 - .../cling/model/types/ErrorCode.java | 65 - .../cling/model/types/FloatDatatype.java | 40 - .../cling/model/types/HostPort.java | 76 -- .../cling/model/types/IntegerDatatype.java | 89 -- .../model/types/InvalidValueException.java | 32 - .../cling/model/types/NamedDeviceType.java | 83 -- .../cling/model/types/NamedServiceType.java | 83 -- .../model/types/NotificationSubtype.java | 41 - .../cling/model/types/PragmaType.java | 92 -- .../cling/model/types/ServiceId.java | 132 -- .../cling/model/types/ServiceType.java | 186 --- .../cling/model/types/ShortDatatype.java | 42 - .../cling/model/types/SoapActionType.java | 131 -- .../cling/model/types/StringDatatype.java | 31 - .../cling/model/types/UDADeviceType.java | 53 - .../cling/model/types/UDAServiceId.java | 80 -- .../cling/model/types/UDAServiceType.java | 53 - .../org/fourthline/cling/model/types/UDN.java | 159 --- .../cling/model/types/URIDatatype.java | 38 - .../model/types/UnsignedIntegerFourBytes.java | 35 - .../UnsignedIntegerFourBytesDatatype.java | 32 - .../model/types/UnsignedIntegerOneByte.java | 35 - .../types/UnsignedIntegerOneByteDatatype.java | 32 - .../model/types/UnsignedIntegerTwoBytes.java | 35 - .../UnsignedIntegerTwoBytesDatatype.java | 32 - .../model/types/UnsignedVariableInteger.java | 118 -- .../fourthline/cling/model/types/csv/CSV.java | 81 -- .../cling/model/types/csv/CSVBoolean.java | 31 - .../cling/model/types/csv/CSVBytes.java | 31 - .../cling/model/types/csv/CSVCharacter.java | 31 - .../cling/model/types/csv/CSVDate.java | 33 - .../cling/model/types/csv/CSVDouble.java | 31 - .../cling/model/types/csv/CSVFloat.java | 31 - .../cling/model/types/csv/CSVInteger.java | 31 - .../cling/model/types/csv/CSVShort.java | 31 - .../cling/model/types/csv/CSVString.java | 31 - .../cling/model/types/csv/CSVURI.java | 33 - .../csv/CSVUnsignedIntegerFourBytes.java | 32 - .../types/csv/CSVUnsignedIntegerOneByte.java | 32 - .../types/csv/CSVUnsignedIntegerTwoBytes.java | 32 - .../protocol/ProtocolCreationException.java | 32 - .../cling/protocol/ProtocolFactory.java | 119 -- .../cling/protocol/ProtocolFactoryImpl.java | 258 ---- .../cling/protocol/ReceivingAsync.java | 108 -- .../cling/protocol/ReceivingSync.java | 102 -- .../protocol/RetrieveRemoteDescriptors.java | 373 ------ .../cling/protocol/SendingAsync.java | 74 -- .../cling/protocol/SendingSync.java | 64 - .../protocol/async/ReceivingNotification.java | 142 --- .../cling/protocol/async/ReceivingSearch.java | 352 ------ .../async/ReceivingSearchResponse.java | 101 -- .../protocol/async/SendingNotification.java | 182 --- .../async/SendingNotificationAlive.java | 48 - .../async/SendingNotificationByebye.java | 57 - .../cling/protocol/async/SendingSearch.java | 118 -- .../cling/protocol/sync/ReceivingAction.java | 161 --- .../cling/protocol/sync/ReceivingEvent.java | 149 --- .../protocol/sync/ReceivingRetrieval.java | 154 --- .../protocol/sync/ReceivingSubscribe.java | 211 ---- .../protocol/sync/ReceivingUnsubscribe.java | 85 -- .../cling/protocol/sync/SendingAction.java | 189 --- .../cling/protocol/sync/SendingEvent.java | 97 -- .../cling/protocol/sync/SendingRenewal.java | 115 -- .../cling/protocol/sync/SendingSubscribe.java | 159 --- .../protocol/sync/SendingUnsubscribe.java | 90 -- .../registry/DefaultRegistryListener.java | 101 -- .../fourthline/cling/registry/LocalItems.java | 312 ----- .../cling/registry/RegistrationException.java | 47 - .../fourthline/cling/registry/Registry.java | 439 ------- .../cling/registry/RegistryImpl.java | 519 -------- .../cling/registry/RegistryItem.java | 70 -- .../cling/registry/RegistryItems.java | 178 --- .../cling/registry/RegistryListener.java | 143 --- .../cling/registry/RegistryMaintainer.java | 63 - .../cling/registry/RemoteItems.java | 320 ----- .../cling/registry/event/After.java | 33 - .../cling/registry/event/Before.java | 33 - .../cling/registry/event/DeviceDiscovery.java | 36 - .../event/FailedRemoteDeviceDiscovery.java | 35 - .../registry/event/LocalDeviceDiscovery.java | 28 - .../cling/registry/event/Phase.java | 74 -- .../registry/event/RegistryShutdown.java | 22 - .../registry/event/RemoteDeviceDiscovery.java | 28 - .../avtransport/AVTransportErrorCode.java | 65 - .../avtransport/AVTransportException.java | 49 - .../AbstractAVTransportService.java | 383 ------ .../callback/GetCurrentTransportActions.java | 49 - .../callback/GetDeviceCapabilities.java | 50 - .../avtransport/callback/GetMediaInfo.java | 50 - .../avtransport/callback/GetPositionInfo.java | 50 - .../callback/GetTransportInfo.java | 50 - .../support/avtransport/callback/Pause.java | 55 - .../support/avtransport/callback/Play.java | 55 - .../support/avtransport/callback/Seek.java | 57 - .../callback/SetAVTransportURI.java | 56 - .../support/avtransport/callback/Stop.java | 46 - .../avtransport/impl/AVTransportService.java | 318 ----- .../impl/AVTransportStateMachine.java | 36 - .../avtransport/impl/state/AbstractState.java | 38 - .../impl/state/NoMediaPresent.java | 61 - .../avtransport/impl/state/PausedPlay.java | 65 - .../avtransport/impl/state/Playing.java | 73 -- .../avtransport/impl/state/Stopped.java | 71 -- .../AVTransportLastChangeParser.java | 55 - .../lastchange/AVTransportVariable.java | 342 ------ ...stractPeeringConnectionManagerService.java | 246 ---- .../ConnectionManagerErrorCode.java | 55 - .../ConnectionManagerException.java | 50 - .../ConnectionManagerService.java | 162 --- .../callback/ConnectionComplete.java | 37 - .../callback/GetCurrentConnectionInfo.java | 70 -- .../callback/GetProtocolInfo.java | 64 - .../callback/PrepareForConnection.java | 61 - .../AbstractContentDirectoryService.java | 290 ----- .../ContentDirectoryErrorCode.java | 51 - .../ContentDirectoryException.java | 51 - .../support/contentdirectory/DIDLParser.java | 1074 ----------------- .../contentdirectory/callback/Browse.java | 149 --- .../contentdirectory/callback/Search.java | 137 --- .../support/igd/PortMappingListener.java | 194 --- .../support/igd/callback/GetExternalIP.java | 37 - .../support/igd/callback/GetStatusInfo.java | 60 - .../support/igd/callback/PortMappingAdd.java | 53 - .../igd/callback/PortMappingDelete.java | 47 - .../cling/support/lastchange/Event.java | 94 -- .../support/lastchange/EventedValue.java | 72 -- .../support/lastchange/EventedValueEnum.java | 52 - .../lastchange/EventedValueEnumArray.java | 53 - .../support/lastchange/EventedValueShort.java | 39 - .../lastchange/EventedValueString.java | 40 - .../support/lastchange/EventedValueURI.java | 57 - .../EventedValueUnsignedIntegerFourBytes.java | 40 - .../EventedValueUnsignedIntegerTwoBytes.java | 40 - .../cling/support/lastchange/InstanceID.java | 47 - .../cling/support/lastchange/LastChange.java | 127 -- .../LastChangeAwareServiceManager.java | 107 -- .../lastchange/LastChangeDelegator.java | 40 - .../support/lastchange/LastChangeParser.java | 231 ---- .../cling/support/messagebox/AddMessage.java | 39 - .../support/messagebox/RemoveMessage.java | 39 - .../support/messagebox/model/DateTime.java | 63 - .../messagebox/model/ElementAppender.java | 27 - .../support/messagebox/model/Message.java | 125 -- .../messagebox/model/MessageIncomingCall.java | 62 - .../support/messagebox/model/MessageSMS.java | 71 -- .../model/MessageScheduleReminder.java | 81 -- .../support/messagebox/model/NumberName.java | 45 - .../support/messagebox/parser/MessageDOM.java | 54 - .../messagebox/parser/MessageDOMParser.java | 51 - .../messagebox/parser/MessageElement.java | 64 - .../cling/support/model/AVTransport.java | 98 -- .../cling/support/model/BrowseFlag.java | 46 - .../cling/support/model/BrowseResult.java | 82 -- .../cling/support/model/Channel.java | 35 - .../cling/support/model/Connection.java | 152 --- .../cling/support/model/ConnectionInfo.java | 173 --- .../cling/support/model/DIDLAttribute.java | 55 - .../cling/support/model/DIDLContent.java | 221 ---- .../cling/support/model/DIDLObject.java | 890 -------------- .../cling/support/model/DescMeta.java | 106 -- .../support/model/DeviceCapabilities.java | 73 -- .../cling/support/model/MediaInfo.java | 150 --- .../cling/support/model/Person.java | 54 - .../cling/support/model/PersonWithRole.java | 46 - .../cling/support/model/PlayMode.java | 29 - .../cling/support/model/PortMapping.java | 188 --- .../cling/support/model/PositionInfo.java | 160 --- .../cling/support/model/PresetName.java | 23 - .../cling/support/model/Protocol.java | 49 - .../cling/support/model/ProtocolInfo.java | 125 -- .../cling/support/model/ProtocolInfos.java | 45 - .../model/RecordMediumWriteStatus.java | 36 - .../support/model/RecordQualityMode.java | 69 -- .../fourthline/cling/support/model/Res.java | 196 --- .../cling/support/model/SearchResult.java | 82 -- .../cling/support/model/SeekMode.java | 54 - .../cling/support/model/SortCriterion.java | 75 -- .../cling/support/model/StorageMedium.java | 104 -- .../cling/support/model/TransportAction.java | 50 - .../cling/support/model/TransportInfo.java | 73 -- .../support/model/TransportSettings.java | 45 - .../cling/support/model/TransportState.java | 54 - .../cling/support/model/TransportStatus.java | 49 - .../cling/support/model/VolumeDBRange.java | 38 - .../cling/support/model/WriteStatus.java | 27 - .../cling/support/model/container/Album.java | 154 --- .../support/model/container/Container.java | 162 --- .../model/container/GenreContainer.java | 41 - .../support/model/container/MovieGenre.java | 42 - .../support/model/container/MusicAlbum.java | 160 --- .../support/model/container/MusicArtist.java | 73 -- .../support/model/container/MusicGenre.java | 42 - .../model/container/PersonContainer.java | 52 - .../support/model/container/PhotoAlbum.java | 78 -- .../model/container/PlaylistContainer.java | 180 --- .../model/container/StorageFolder.java | 57 - .../model/container/StorageSystem.java | 102 -- .../model/container/StorageVolume.java | 91 -- .../support/model/dlna/DLNAAttribute.java | 147 --- .../model/dlna/DLNAConversionIndicator.java | 48 - .../DLNAConversionIndicatorAttribute.java | 45 - .../cling/support/model/dlna/DLNAFlags.java | 72 -- .../model/dlna/DLNAFlagsAttribute.java | 66 - .../support/model/dlna/DLNAOperations.java | 53 - .../model/dlna/DLNAOperationsAttribute.java | 66 - .../model/dlna/DLNAPlaySpeedAttribute.java | 74 -- .../model/dlna/DLNAProfileAttribute.java | 41 - .../support/model/dlna/DLNAProfiles.java | 417 ------- .../support/model/dlna/DLNAProtocolInfo.java | 117 -- ...InvalidDLNAProtocolAttributeException.java | 29 - .../model/dlna/message/DLNAHeaders.java | 179 --- .../message/header/AvailableRangeHeader.java | 43 - .../header/AvailableSeekRangeHeader.java | 97 -- .../message/header/BufferBytesHeader.java | 43 - .../dlna/message/header/BufferInfoHeader.java | 43 - .../message/header/ContentFeaturesHeader.java | 58 - .../model/dlna/message/header/DLNAHeader.java | 149 --- .../dlna/message/header/EventTypeHeader.java | 44 - .../message/header/FriendlyNameHeader.java | 45 - .../header/GetAvailableSeekRangeHeader.java | 44 - .../header/GetContentFeaturesHeader.java | 44 - .../dlna/message/header/MaxPrateHeader.java | 42 - .../message/header/PeerManagerHeader.java | 47 - .../dlna/message/header/PlaySpeedHeader.java | 49 - .../dlna/message/header/PragmaHeader.java | 60 - .../message/header/RealTimeInfoHeader.java | 49 - .../model/dlna/message/header/SCIDHeader.java | 41 - .../dlna/message/header/ScmsFlagHeader.java | 45 - .../dlna/message/header/SupportedHeader.java | 48 - .../message/header/TimeSeekRangeHeader.java | 62 - .../message/header/TransferModeHeader.java | 53 - .../model/dlna/message/header/WCTHeader.java | 44 - .../dlna/types/AvailableSeekRangeType.java | 73 -- .../model/dlna/types/BufferInfoType.java | 113 -- .../model/dlna/types/CodedDataBuffer.java | 50 - .../model/dlna/types/NormalPlayTime.java | 124 -- .../model/dlna/types/NormalPlayTimeRange.java | 122 -- .../model/dlna/types/ScmsFlagType.java | 49 - .../model/dlna/types/TimeSeekRangeType.java | 60 - .../cling/support/model/item/AudioBook.java | 114 -- .../support/model/item/AudioBroadcast.java | 86 -- .../cling/support/model/item/AudioItem.java | 150 --- .../cling/support/model/item/ImageItem.java | 133 -- .../cling/support/model/item/Item.java | 74 -- .../cling/support/model/item/Movie.java | 111 -- .../cling/support/model/item/MusicTrack.java | 152 --- .../support/model/item/MusicVideoClip.java | 149 --- .../cling/support/model/item/Photo.java | 59 - .../support/model/item/PlaylistItem.java | 134 -- .../cling/support/model/item/TextItem.java | 196 --- .../support/model/item/VideoBroadcast.java | 75 -- .../cling/support/model/item/VideoItem.java | 194 --- .../AbstractAudioRenderingControl.java | 226 ---- .../RenderingControlErrorCode.java | 50 - .../RenderingControlException.java | 49 - .../renderingcontrol/callback/GetMute.java | 49 - .../renderingcontrol/callback/GetVolume.java | 63 - .../renderingcontrol/callback/SetMute.java | 50 - .../renderingcontrol/callback/SetVolume.java | 51 - .../lastchange/ChannelLoudness.java | 45 - .../lastchange/ChannelMute.java | 45 - .../lastchange/ChannelVolume.java | 45 - .../lastchange/ChannelVolumeDB.java | 45 - .../EventedValueChannelLoudness.java | 76 -- .../lastchange/EventedValueChannelMute.java | 76 -- .../lastchange/EventedValueChannelVolume.java | 81 -- .../EventedValueChannelVolumeDB.java | 81 -- .../RenderingControlLastChangeParser.java | 55 - .../lastchange/RenderingControlVariable.java | 222 ---- .../cling/support/shared/AbstractMap.java | 506 -------- ...AbstractMediaReceiverRegistrarService.java | 140 --- .../cling/transport/DisableRouter.java | 22 - .../cling/transport/EnableRouter.java | 22 - .../fourthline/cling/transport/Router.java | 161 --- .../cling/transport/RouterException.java | 47 - .../cling/transport/RouterImpl.java | 525 -------- ...cServletStreamServerConfigurationImpl.java | 89 -- .../impl/AsyncServletStreamServerImpl.java | 159 --- .../impl/AsyncServletUpnpStream.java | 260 ---- .../impl/DatagramIOConfigurationImpl.java | 56 - .../cling/transport/impl/DatagramIOImpl.java | 160 --- .../transport/impl/DatagramProcessorImpl.java | 163 --- .../impl/GENAEventProcessorImpl.java | 220 ---- .../impl/HttpExchangeUpnpStream.java | 185 --- .../MulticastReceiverConfigurationImpl.java | 82 -- .../transport/impl/MulticastReceiverImpl.java | 153 --- .../impl/NetworkAddressFactoryImpl.java | 507 -------- .../impl/PullGENAEventProcessorImpl.java | 88 -- .../impl/PullSOAPActionProcessorImpl.java | 225 ---- .../RecoveringGENAEventProcessorImpl.java | 131 -- .../RecoveringSOAPActionProcessorImpl.java | 135 --- .../impl/SOAPActionProcessorImpl.java | 632 ---------- .../impl/StreamClientConfigurationImpl.java | 50 - .../transport/impl/StreamClientImpl.java | 300 ----- .../impl/StreamServerConfigurationImpl.java | 60 - .../transport/impl/StreamServerImpl.java | 154 --- .../transport/impl/apache/HeaderUtil.java | 48 - .../HttpServerConnectionUpnpStream.java | 268 ---- .../apache/StreamClientConfigurationImpl.java | 99 -- .../impl/apache/StreamClientImpl.java | 276 ----- .../apache/StreamServerConfigurationImpl.java | 117 -- .../impl/apache/StreamServerImpl.java | 226 ---- .../impl/apache/UpnpHttpRequestFactory.java | 76 -- .../impl/jetty/JettyServletContainer.java | 165 --- .../jetty/StreamClientConfigurationImpl.java | 44 - .../impl/jetty/StreamClientImpl.java | 333 ----- .../transport/spi/AbstractStreamClient.java | 131 -- .../AbstractStreamClientConfiguration.java | 81 -- .../cling/transport/spi/DatagramIO.java | 90 -- .../spi/DatagramIOConfiguration.java | 35 - .../transport/spi/DatagramProcessor.java | 65 - .../transport/spi/GENAEventProcessor.java | 45 - .../spi/InitializationException.java | 37 - .../transport/spi/MulticastReceiver.java | 70 -- .../spi/MulticastReceiverConfiguration.java | 42 - .../transport/spi/NetworkAddressFactory.java | 114 -- .../transport/spi/NoNetworkException.java | 29 - .../transport/spi/SOAPActionProcessor.java | 72 -- .../spi/ServletContainerAdapter.java | 81 -- .../cling/transport/spi/StreamClient.java | 82 -- .../spi/StreamClientConfiguration.java | 55 - .../cling/transport/spi/StreamServer.java | 102 -- .../spi/StreamServerConfiguration.java | 30 - .../cling/transport/spi/UpnpStream.java | 120 -- build.gradle | 3 +- gradlew | 10 +- 542 files changed, 46 insertions(+), 55574 deletions(-) delete mode 100644 app/src/main/java/android/media/MediaMetadataRetriever.java delete mode 100644 app/src/main/java/org/fourthline/cling/DefaultUpnpServiceConfiguration.java delete mode 100644 app/src/main/java/org/fourthline/cling/Main.java delete mode 100644 app/src/main/java/org/fourthline/cling/ManagedUpnpService.java delete mode 100644 app/src/main/java/org/fourthline/cling/ManagedUpnpServiceConfiguration.java delete mode 100644 app/src/main/java/org/fourthline/cling/UpnpService.java delete mode 100644 app/src/main/java/org/fourthline/cling/UpnpServiceConfiguration.java delete mode 100644 app/src/main/java/org/fourthline/cling/UpnpServiceImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/android/AndroidNetworkAddressFactory.java delete mode 100644 app/src/main/java/org/fourthline/cling/android/AndroidRouter.java delete mode 100644 app/src/main/java/org/fourthline/cling/android/AndroidUpnpService.java delete mode 100644 app/src/main/java/org/fourthline/cling/android/AndroidUpnpServiceConfiguration.java delete mode 100644 app/src/main/java/org/fourthline/cling/android/AndroidUpnpServiceImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/android/NetworkUtils.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/AllowedValueProvider.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/AllowedValueRangeProvider.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/LocalServiceBinder.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/LocalServiceBindingException.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationActionBinder.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationLocalServiceBinder.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationStateVariableBinder.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/annotations/UpnpAction.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/annotations/UpnpInputArgument.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/annotations/UpnpOutputArgument.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/annotations/UpnpService.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/annotations/UpnpServiceId.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/annotations/UpnpServiceType.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/annotations/UpnpStateVariable.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/annotations/UpnpStateVariables.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/staging/MutableAction.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/staging/MutableActionArgument.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/staging/MutableAllowedValueRange.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/staging/MutableDevice.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/staging/MutableIcon.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/staging/MutableService.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/staging/MutableStateVariable.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/staging/MutableUDAVersion.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/xml/Descriptor.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/xml/DescriptorBindingException.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/xml/DeviceDescriptorBinder.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/xml/RecoveringUDA10DeviceDescriptorBinderImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/xml/ServiceDescriptorBinder.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/xml/UDA10DeviceDescriptorBinderImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/xml/UDA10DeviceDescriptorBinderSAXImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/xml/UDA10ServiceDescriptorBinderImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/binding/xml/UDA10ServiceDescriptorBinderSAXImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/controlpoint/ActionCallback.java delete mode 100644 app/src/main/java/org/fourthline/cling/controlpoint/ControlPoint.java delete mode 100644 app/src/main/java/org/fourthline/cling/controlpoint/ControlPointImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/controlpoint/SubscriptionCallback.java delete mode 100644 app/src/main/java/org/fourthline/cling/controlpoint/event/ExecuteAction.java delete mode 100644 app/src/main/java/org/fourthline/cling/controlpoint/event/Search.java delete mode 100644 app/src/main/java/org/fourthline/cling/mock/MockProtocolFactory.java delete mode 100644 app/src/main/java/org/fourthline/cling/mock/MockRouter.java delete mode 100644 app/src/main/java/org/fourthline/cling/mock/MockUpnpService.java delete mode 100644 app/src/main/java/org/fourthline/cling/mock/MockUpnpServiceConfiguration.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/Command.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/Constants.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/DefaultServiceManager.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/DiscoveryOptions.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/ExpirationDetails.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/Location.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/ModelUtil.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/Namespace.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/NetworkAddress.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/ServerClientTokens.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/ServiceManager.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/ServiceReference.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/UnsupportedDataException.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/UserConstants.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/Validatable.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/ValidationError.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/ValidationException.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/VariableValue.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/XMLUtil.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/action/AbstractActionExecutor.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/action/ActionArgumentValue.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/action/ActionCancelledException.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/action/ActionException.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/action/ActionExecutor.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/action/ActionInvocation.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/action/MethodActionExecutor.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/action/QueryStateVariableExecutor.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/action/RemoteActionInvocation.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/gena/CancelReason.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/gena/GENASubscription.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/gena/LocalGENASubscription.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/gena/RemoteGENASubscription.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/Connection.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/IncomingDatagramMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/OutgoingDatagramMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/StreamRequestMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/StreamResponseMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/UpnpHeaders.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/UpnpMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/UpnpOperation.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/UpnpRequest.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/UpnpResponse.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/control/ActionMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/control/ActionRequestMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/control/ActionResponseMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/control/IncomingActionRequestMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/control/IncomingActionResponseMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/control/OutgoingActionRequestMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/control/OutgoingActionResponseMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingNotificationRequest.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingSearchRequest.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingSearchResponse.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequest.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestDeviceType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestRootDevice.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestServiceType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestUDN.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchRequest.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponse.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseDeviceType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseRootDevice.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseServiceType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseUDN.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/gena/IncomingEventRequestMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/gena/IncomingSubscribeRequestMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/gena/IncomingSubscribeResponseMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/gena/IncomingUnsubscribeRequestMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingEventRequestMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingEventResponseMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingRenewalRequestMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingSubscribeRequestMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingSubscribeResponseMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingUnsubscribeRequestMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/AVClientInfoHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/CallbackHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/ContentRangeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/ContentTypeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/DeviceTypeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/DeviceUSNHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/EXTHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/EventSequenceHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/HostHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/InterfaceMacHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/InvalidHeaderException.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/LocationHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/MANHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/MXHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/MaxAgeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/NTEventHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/NTSHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/PragmaHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/RangeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/RootDeviceHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/STAllHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/ServerHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/ServiceTypeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/ServiceUSNHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/SoapActionHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/SubscriptionIdHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/TimeoutHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/UDADeviceTypeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/UDAServiceTypeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/UDNHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/USNRootDeviceHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/UpnpHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/message/header/UserAgentHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/Action.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/ActionArgument.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/Device.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/DeviceDetails.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/DeviceIdentity.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/Icon.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/LocalDevice.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/LocalService.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/ManufacturerDetails.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/ModelDetails.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/QueryStateVariableAction.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/RemoteDevice.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/RemoteDeviceIdentity.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/RemoteService.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/Service.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/StateVariable.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/StateVariableAllowedValueRange.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/StateVariableEventDetails.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/StateVariableTypeDetails.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/meta/UDAVersion.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/profile/ClientInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/profile/DeviceDetailsProvider.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/profile/HeaderDeviceDetailsProvider.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/profile/RemoteClientInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/resource/DeviceDescriptorResource.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/resource/IconResource.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/resource/Resource.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/resource/ServiceControlResource.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/resource/ServiceDescriptorResource.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/resource/ServiceEventCallbackResource.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/resource/ServiceEventSubscriptionResource.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/state/FieldStateVariableAccessor.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/state/GetterStateVariableAccessor.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/state/StateVariableAccessor.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/state/StateVariableValue.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/AbstractDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/Base64Datatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/BinHexDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/BooleanDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/BytesRange.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/CharacterDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/CustomDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/DLNACaps.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/DLNADoc.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/Datatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/DateTimeDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/DeviceType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/DoubleDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/ErrorCode.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/FloatDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/HostPort.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/IntegerDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/InvalidValueException.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/NamedDeviceType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/NamedServiceType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/NotificationSubtype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/PragmaType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/ServiceId.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/ServiceType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/ShortDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/SoapActionType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/StringDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/UDADeviceType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/UDAServiceId.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/UDAServiceType.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/UDN.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/URIDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerFourBytes.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerFourBytesDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerOneByte.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerOneByteDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerTwoBytes.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerTwoBytesDatatype.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/UnsignedVariableInteger.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSV.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVBoolean.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVBytes.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVCharacter.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVDate.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVDouble.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVFloat.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVInteger.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVShort.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVString.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVURI.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerFourBytes.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerOneByte.java delete mode 100644 app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerTwoBytes.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/ProtocolCreationException.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/ProtocolFactory.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/ProtocolFactoryImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/ReceivingAsync.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/ReceivingSync.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/RetrieveRemoteDescriptors.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/SendingAsync.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/SendingSync.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/async/ReceivingNotification.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/async/ReceivingSearch.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/async/ReceivingSearchResponse.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/async/SendingNotification.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/async/SendingNotificationAlive.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/async/SendingNotificationByebye.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/async/SendingSearch.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingAction.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingEvent.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingRetrieval.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingSubscribe.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingUnsubscribe.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/sync/SendingAction.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/sync/SendingEvent.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/sync/SendingRenewal.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/sync/SendingSubscribe.java delete mode 100644 app/src/main/java/org/fourthline/cling/protocol/sync/SendingUnsubscribe.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/DefaultRegistryListener.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/LocalItems.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/RegistrationException.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/Registry.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/RegistryImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/RegistryItem.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/RegistryItems.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/RegistryListener.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/RegistryMaintainer.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/RemoteItems.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/event/After.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/event/Before.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/event/DeviceDiscovery.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/event/FailedRemoteDeviceDiscovery.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/event/LocalDeviceDiscovery.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/event/Phase.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/event/RegistryShutdown.java delete mode 100644 app/src/main/java/org/fourthline/cling/registry/event/RemoteDeviceDiscovery.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/AVTransportErrorCode.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/AVTransportException.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/AbstractAVTransportService.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetCurrentTransportActions.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetDeviceCapabilities.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetMediaInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetPositionInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetTransportInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/callback/Pause.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/callback/Play.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/callback/Seek.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/callback/SetAVTransportURI.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/callback/Stop.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/impl/AVTransportService.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/impl/AVTransportStateMachine.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/AbstractState.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/NoMediaPresent.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/PausedPlay.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/Playing.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/Stopped.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/lastchange/AVTransportLastChangeParser.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/avtransport/lastchange/AVTransportVariable.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/connectionmanager/AbstractPeeringConnectionManagerService.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerErrorCode.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerException.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerService.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/ConnectionComplete.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/GetCurrentConnectionInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/GetProtocolInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/PrepareForConnection.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/contentdirectory/AbstractContentDirectoryService.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/contentdirectory/ContentDirectoryErrorCode.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/contentdirectory/ContentDirectoryException.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/contentdirectory/DIDLParser.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/contentdirectory/callback/Browse.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/contentdirectory/callback/Search.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/igd/PortMappingListener.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/igd/callback/GetExternalIP.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/igd/callback/GetStatusInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/igd/callback/PortMappingAdd.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/igd/callback/PortMappingDelete.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/Event.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/EventedValue.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueEnum.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueEnumArray.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueShort.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueString.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueURI.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueUnsignedIntegerFourBytes.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueUnsignedIntegerTwoBytes.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/InstanceID.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/LastChange.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeAwareServiceManager.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeDelegator.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeParser.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/AddMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/RemoveMessage.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/model/DateTime.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/model/ElementAppender.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/model/Message.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageIncomingCall.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageSMS.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageScheduleReminder.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/model/NumberName.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageDOM.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageDOMParser.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageElement.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/AVTransport.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/BrowseFlag.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/BrowseResult.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/Channel.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/Connection.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/ConnectionInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/DIDLAttribute.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/DIDLContent.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/DIDLObject.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/DescMeta.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/DeviceCapabilities.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/MediaInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/Person.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/PersonWithRole.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/PlayMode.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/PortMapping.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/PositionInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/PresetName.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/Protocol.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/ProtocolInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/ProtocolInfos.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/RecordMediumWriteStatus.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/RecordQualityMode.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/Res.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/SearchResult.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/SeekMode.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/SortCriterion.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/StorageMedium.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/TransportAction.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/TransportInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/TransportSettings.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/TransportState.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/TransportStatus.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/VolumeDBRange.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/WriteStatus.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/Album.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/Container.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/GenreContainer.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/MovieGenre.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/MusicAlbum.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/MusicArtist.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/MusicGenre.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/PersonContainer.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/PhotoAlbum.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/PlaylistContainer.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/StorageFolder.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/StorageSystem.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/container/StorageVolume.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAAttribute.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAConversionIndicator.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAConversionIndicatorAttribute.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAFlags.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAFlagsAttribute.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAOperations.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAOperationsAttribute.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAPlaySpeedAttribute.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProfileAttribute.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProfiles.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProtocolInfo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/InvalidDLNAProtocolAttributeException.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/DLNAHeaders.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/AvailableRangeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/AvailableSeekRangeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/BufferBytesHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/BufferInfoHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/ContentFeaturesHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/DLNAHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/EventTypeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/FriendlyNameHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/GetAvailableSeekRangeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/GetContentFeaturesHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/MaxPrateHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PeerManagerHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PlaySpeedHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PragmaHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/RealTimeInfoHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/SCIDHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/ScmsFlagHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/SupportedHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/TimeSeekRangeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/TransferModeHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/WCTHeader.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/types/AvailableSeekRangeType.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/types/BufferInfoType.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/types/CodedDataBuffer.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/types/NormalPlayTime.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/types/NormalPlayTimeRange.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/types/ScmsFlagType.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/dlna/types/TimeSeekRangeType.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/AudioBook.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/AudioBroadcast.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/AudioItem.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/ImageItem.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/Item.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/Movie.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/MusicTrack.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/MusicVideoClip.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/Photo.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/PlaylistItem.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/TextItem.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/VideoBroadcast.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/model/item/VideoItem.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/AbstractAudioRenderingControl.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/RenderingControlErrorCode.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/RenderingControlException.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/GetMute.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/GetVolume.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/SetMute.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/SetVolume.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelLoudness.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelMute.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelVolume.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelVolumeDB.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelLoudness.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelMute.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelVolume.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelVolumeDB.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/RenderingControlLastChangeParser.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/RenderingControlVariable.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/shared/AbstractMap.java delete mode 100644 app/src/main/java/org/fourthline/cling/support/xmicrosoft/AbstractMediaReceiverRegistrarService.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/DisableRouter.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/EnableRouter.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/Router.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/RouterException.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/RouterImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletStreamServerConfigurationImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletStreamServerImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletUpnpStream.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/DatagramIOConfigurationImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/DatagramIOImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/DatagramProcessorImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/GENAEventProcessorImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/HttpExchangeUpnpStream.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/MulticastReceiverConfigurationImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/MulticastReceiverImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/NetworkAddressFactoryImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/PullGENAEventProcessorImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/PullSOAPActionProcessorImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/RecoveringGENAEventProcessorImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/RecoveringSOAPActionProcessorImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/SOAPActionProcessorImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/StreamClientConfigurationImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/StreamClientImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/StreamServerConfigurationImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/StreamServerImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/apache/HeaderUtil.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/apache/HttpServerConnectionUpnpStream.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamClientConfigurationImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamClientImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamServerConfigurationImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamServerImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/apache/UpnpHttpRequestFactory.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/jetty/JettyServletContainer.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/jetty/StreamClientConfigurationImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/impl/jetty/StreamClientImpl.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/AbstractStreamClient.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/AbstractStreamClientConfiguration.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/DatagramIO.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/DatagramIOConfiguration.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/DatagramProcessor.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/GENAEventProcessor.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/InitializationException.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/MulticastReceiver.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/MulticastReceiverConfiguration.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/NetworkAddressFactory.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/NoNetworkException.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/SOAPActionProcessor.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/ServletContainerAdapter.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/StreamClient.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/StreamClientConfiguration.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/StreamServer.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/StreamServerConfiguration.java delete mode 100644 app/src/main/java/org/fourthline/cling/transport/spi/UpnpStream.java diff --git a/app/build.gradle b/app/build.gradle index 4c130ee..34893f4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 22 - buildToolsVersion "22.0.1" + compileSdkVersion 25 + buildToolsVersion "25.0.2" defaultConfig { applicationId "com.zxt.dlna" minSdkVersion 15 - targetSdkVersion 21 + targetSdkVersion 25 } buildTypes { @@ -16,32 +16,29 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } + + packagingOptions { + exclude 'META-INF/beans.xml' + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } } dependencies { - compile 'com.android.support:appcompat-v7:22.2.0' - compile 'com.android.support:design:22.2.0' - compile 'com.android.support:cardview-v7:22.2.0' - compile 'com.android.support:recyclerview-v7:22.2.0' - compile files('libs/cdi-api.jar') - compile files('libs/http-2.2.1.jar') - compile files('libs/httpclient-4.2.2.jar') - compile files('libs/httpcore-4.2.3.jar') - compile files('libs/javax.annotation_1.0.jar') - compile files('libs/javax.inject.jar') - compile files('libs/javax.servlet-3.0.0.v201103241009.jar') - compile files('libs/jetty-client-8.1.9.v20130131.jar') - compile files('libs/jetty-continuation-8.1.9.v20130131.jar') - compile files('libs/jetty-http-8.1.9.v20130131.jar') - compile files('libs/jetty-io-8.1.9.v20130131.jar') - compile files('libs/jetty-security-8.1.9.v20130131.jar') - compile files('libs/jetty-server-8.1.9.v20130131.jar') - compile files('libs/jetty-servlet-8.1.9.v20130131.jar') - compile files('libs/jetty-util-8.1.9.v20130131.jar') - compile files('libs/seamless-http-1.0-alpha2.jar') - compile files('libs/seamless-util-1.0-alpha2.jar') - compile files('libs/seamless-xml-1.0-alpha2.jar') - compile files('libs/slf4j-api-1.6.1.jar') - compile files('libs/slf4j-jdk14-1.6.1.jar') - compile files('libs/universal-image-loader-1.8.4-with-sources.jar') + compile 'com.android.support:appcompat-v7:25.3.0' + compile 'com.android.support:design:25.3.0' + compile 'com.android.support:cardview-v7:25.3.0' + compile 'com.android.support:recyclerview-v7:25.3.0' + compile 'org.fourthline.cling:cling-core:2.1.2-SNAPSHOT' + compile 'org.fourthline.cling:cling-support:2.1.2-SNAPSHOT' + compile 'org.eclipse.jetty:jetty-server:8.1.18.v20150929' + compile 'org.eclipse.jetty:jetty-servlet:8.1.18.v20150929' + compile 'org.eclipse.jetty:jetty-client:8.1.18.v20150929' + compile 'org.eclipse.jetty:jetty-http:8.1.18.v20150929' + compile 'org.slf4j:slf4j-jdk14:1.7.25' + compile 'org.slf4j:slf4j-api:1.7.25' + compile 'com.nostra13.universalimageloader:universal-image-loader:1.8.4' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d364023..fe79198 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,21 +1,16 @@ + android:versionCode="3" + android:versionName="2.1" > - - - - + + - - @@ -121,11 +115,6 @@ android:configChanges="orientation|keyboardHidden" android:theme="@android:style/Theme.NoTitleBar" > - - diff --git a/app/src/main/java/android/media/MediaMetadataRetriever.java b/app/src/main/java/android/media/MediaMetadataRetriever.java deleted file mode 100644 index 223192d..0000000 --- a/app/src/main/java/android/media/MediaMetadataRetriever.java +++ /dev/null @@ -1,289 +0,0 @@ -package android.media; - -/** - * MediaMetadataRetriever, - * porting from Android SDK 2.2, to get thumbnail for video in SDK 2.1 and lower. - *

- */ -import java.io.FileDescriptor; -import java.io.FileNotFoundException; -import java.io.IOException; - -import android.content.ContentResolver; -import android.content.Context; -import android.content.res.AssetFileDescriptor; -import android.graphics.Bitmap; -import android.net.Uri; - - -public class MediaMetadataRetriever { - static { - if (Integer.valueOf(android.os.Build.VERSION.SDK) < 8) { - System.loadLibrary("media_jni"); - native_init(); - } - } - - // The field below is accessed by native methods - @SuppressWarnings("unused") - private int mNativeContext; - - public MediaMetadataRetriever() { - native_setup(); - } - - /** - * Call this method before setDataSource() so that the mode becomes - * effective for subsequent operations. This method can be called only once - * at the beginning if the intended mode of operation for a - * MediaMetadataRetriever object remains the same for its whole lifetime, - * and thus it is unnecessary to call this method each time setDataSource() - * is called. If this is not never called (which is allowed), by default the - * intended mode of operation is to both capture frame and retrieve meta - * data (i.e., MODE_GET_METADATA_ONLY | MODE_CAPTURE_FRAME_ONLY). Often, - * this may not be what one wants, since doing this has negative performance - * impact on execution time of a call to setDataSource(), since both types - * of operations may be time consuming. - * - * @param mode - * The intended mode of operation. Can be any combination of - * MODE_GET_METADATA_ONLY and MODE_CAPTURE_FRAME_ONLY: 1. - * MODE_GET_METADATA_ONLY & MODE_CAPTURE_FRAME_ONLY: For neither - * frame capture nor meta data retrieval 2. - * MODE_GET_METADATA_ONLY: For meta data retrieval only 3. - * MODE_CAPTURE_FRAME_ONLY: For frame capture only 4. - * MODE_GET_METADATA_ONLY | MODE_CAPTURE_FRAME_ONLY: For both - * frame capture and meta data retrieval - */ - public native void setMode(int mode); - - /** - * @return the current mode of operation. A negative return value indicates - * some runtime error has occurred. - */ - public native int getMode(); - - /** - * Sets the data source (file pathname) to use. Call this method before the - * rest of the methods in this class. This method may be time-consuming. - * - * @param path - * The path of the input media file. - * @throws IllegalArgumentException - * If the path is invalid. - */ - public native void setDataSource(String path) - throws IllegalArgumentException; - - /** - * Sets the data source (FileDescriptor) to use. It is the caller's - * responsibility to close the file descriptor. It is safe to do so as soon - * as this call returns. Call this method before the rest of the methods in - * this class. This method may be time-consuming. - * - * @param fd - * the FileDescriptor for the file you want to play - * @param offset - * the offset into the file where the data to be played starts, - * in bytes. It must be non-negative - * @param length - * the length in bytes of the data to be played. It must be - * non-negative. - * @throws IllegalArgumentException - * if the arguments are invalid - */ - public native void setDataSource(FileDescriptor fd, long offset, long length) - throws IllegalArgumentException; - - /** - * Sets the data source (FileDescriptor) to use. It is the caller's - * responsibility to close the file descriptor. It is safe to do so as soon - * as this call returns. Call this method before the rest of the methods in - * this class. This method may be time-consuming. - * - * @param fd - * the FileDescriptor for the file you want to play - * @throws IllegalArgumentException - * if the FileDescriptor is invalid - */ - public void setDataSource(FileDescriptor fd) - throws IllegalArgumentException { - // intentionally less than LONG_MAX - setDataSource(fd, 0, 0x7ffffffffffffffL); - } - - /** - * Sets the data source as a content Uri. Call this method before the rest - * of the methods in this class. This method may be time-consuming. - * - * @param context - * the Context to use when resolving the Uri - * @param uri - * the Content URI of the data you want to play - * @throws IllegalArgumentException - * if the Uri is invalid - * @throws SecurityException - * if the Uri cannot be used due to lack of permission. - */ - public void setDataSource(Context context, Uri uri) - throws IllegalArgumentException, SecurityException { - if (uri == null) { - throw new IllegalArgumentException(); - } - - String scheme = uri.getScheme(); - if (scheme == null || scheme.equals("file")) { // 匹配文件 - setDataSource(uri.getPath()); - return; - } - - AssetFileDescriptor fd = null; - try { - ContentResolver resolver = context.getContentResolver(); - try { - fd = resolver.openAssetFileDescriptor(uri, "r");// 读取文件 - } catch (FileNotFoundException e) { - throw new IllegalArgumentException(); - } - if (fd == null) { - throw new IllegalArgumentException(); - } - FileDescriptor descriptor = fd.getFileDescriptor(); - if (!descriptor.valid()) { - throw new IllegalArgumentException(); - } - // Note: using getDeclaredLength so that our behavior is the same - // as previous versions when the content provider is returning - // a full file. - if (fd.getDeclaredLength() < 0) { - setDataSource(descriptor); - } else { - setDataSource(descriptor, fd.getStartOffset(), - fd.getDeclaredLength()); - } - return; - } catch (SecurityException ex) { - } finally { - try { - if (fd != null) { - fd.close(); - } - } catch (IOException ioEx) { - } - } - setDataSource(uri.toString()); - } - - /** - * Call this method after setDataSource(). This method retrieves the meta - * data value associated with the keyCode. - * - * The keyCode currently supported is listed below as METADATA_XXX - * constants. With any other value, it returns a null pointer. - * - * @param keyCode - * One of the constants listed below at the end of the class. - * @return The meta data value associate with the given keyCode on success; - * null on failure. - */ - public native String extractMetadata(int keyCode); - - /** - * Call this method after setDataSource(). This method finds a - * representative frame if successful and returns it as a bitmap. This is - * useful for generating a thumbnail for an input media source. - * - * @return A Bitmap containing a representative video frame, which can be - * null, if such a frame cannot be retrieved. - */ - public native Bitmap captureFrame(); - - /** - * Call this method after setDataSource(). This method finds the optional - * graphic or album art associated (embedded or external url linked) the - * related data source. - * - * @return null if no such graphic is found. - */ - public native byte[] extractAlbumArt(); - - /** - * Call it when one is done with the object. This method releases the memory - * allocated internally. - */ - public native void release(); - - private native void native_setup(); - - private static native void native_init(); - - private native final void native_finalize(); - - @Override - protected void finalize() throws Throwable { - try { - native_finalize(); - } finally { - super.finalize(); - } - } - - public static final int MODE_GET_METADATA_ONLY = 0x01; - - public static final int MODE_CAPTURE_FRAME_ONLY = 0x02; - - /* - * Do not change these values without updating their counterparts in - * include/media/mediametadataretriever.h! - */ - public static final int METADATA_KEY_CD_TRACK_NUMBER = 0; - - public static final int METADATA_KEY_ALBUM = 1; - - public static final int METADATA_KEY_ARTIST = 2; - - public static final int METADATA_KEY_AUTHOR = 3; - - public static final int METADATA_KEY_COMPOSER = 4; - - public static final int METADATA_KEY_DATE = 5; - - public static final int METADATA_KEY_GENRE = 6; - - public static final int METADATA_KEY_TITLE = 7; - - public static final int METADATA_KEY_YEAR = 8; - - public static final int METADATA_KEY_DURATION = 9; - - public static final int METADATA_KEY_NUM_TRACKS = 10; - - public static final int METADATA_KEY_IS_DRM_CRIPPLED = 11; - - public static final int METADATA_KEY_CODEC = 12; - - public static final int METADATA_KEY_RATING = 13; - - public static final int METADATA_KEY_COMMENT = 14; - - public static final int METADATA_KEY_COPYRIGHT = 15; - - public static final int METADATA_KEY_BIT_RATE = 16; - - public static final int METADATA_KEY_FRAME_RATE = 17; - - public static final int METADATA_KEY_VIDEO_FORMAT = 18; - - public static final int METADATA_KEY_VIDEO_HEIGHT = 19; - - public static final int METADATA_KEY_VIDEO_WIDTH = 20; - - public static final int METADATA_KEY_WRITER = 21; - - public static final int METADATA_KEY_MIMETYPE = 22; - - public static final int METADATA_KEY_DISCNUMBER = 23; - - public static final int METADATA_KEY_ALBUMARTIST = 24; - // Add more here... -} \ No newline at end of file diff --git a/app/src/main/java/com/zxt/dlna/dmp/GPlayer.java b/app/src/main/java/com/zxt/dlna/dmp/GPlayer.java index 4106957..dae3285 100644 --- a/app/src/main/java/com/zxt/dlna/dmp/GPlayer.java +++ b/app/src/main/java/com/zxt/dlna/dmp/GPlayer.java @@ -440,11 +440,11 @@ public void onPrepared(MediaPlayer mp) { float widthRatio = (float) videoWidth / (float) currentDisplay.getWidth(); if (heightRatio > 1 || widthRatio > 1) { if (heightRatio > widthRatio) { - videoHeight = (int) FloatMath.ceil((float) videoHeight / (float) heightRatio); - videoWidth = (int) FloatMath.ceil((float) videoWidth / (float) heightRatio); + videoHeight = (int) Math.ceil((float) videoHeight / (float) heightRatio); + videoWidth = (int) Math.ceil((float) videoWidth / (float) heightRatio); } else { - videoHeight = (int) FloatMath.ceil((float) videoHeight / (float) widthRatio); - videoWidth = (int) FloatMath.ceil((float) videoWidth / (float) widthRatio); + videoHeight = (int) Math.ceil((float) videoHeight / (float) widthRatio); + videoWidth = (int) Math.ceil((float) videoWidth / (float) widthRatio); } } } diff --git a/app/src/main/java/com/zxt/dlna/dmp/ImageDisplay.java b/app/src/main/java/com/zxt/dlna/dmp/ImageDisplay.java index 1a095a7..7649c6a 100644 --- a/app/src/main/java/com/zxt/dlna/dmp/ImageDisplay.java +++ b/app/src/main/java/com/zxt/dlna/dmp/ImageDisplay.java @@ -389,7 +389,7 @@ public boolean onTouch(View v, MotionEvent event) { private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); - return FloatMath.sqrt(x * x + y * y); + return (float) Math.sqrt(x * x + y * y); } private void midPoint(PointF point, MotionEvent event) { diff --git a/app/src/main/java/com/zxt/dlna/dmp/SuperImageView.java b/app/src/main/java/com/zxt/dlna/dmp/SuperImageView.java index ce94b83..d5d39f7 100644 --- a/app/src/main/java/com/zxt/dlna/dmp/SuperImageView.java +++ b/app/src/main/java/com/zxt/dlna/dmp/SuperImageView.java @@ -13,11 +13,11 @@ import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.util.AttributeSet; -import android.util.FloatMath; import android.view.MotionEvent; import android.widget.ImageView; +import android.support.v7.widget.AppCompatImageView; -public class SuperImageView extends ImageView { +public class SuperImageView extends AppCompatImageView { static final float MAX_SCALE = 2.0f; float imageW; @@ -301,7 +301,7 @@ && spacing(pA.x, pA.y, lastClickPos.x, private float spacing(float x1, float y1, float x2, float y2) { float x = x1 - x2; float y = y1 - y2; - return FloatMath.sqrt(x * x + y * y); + return (float) Math.sqrt(x * x + y * y); } private void doubleClick(float x, float y) { diff --git a/app/src/main/java/com/zxt/dlna/util/ImageUtil.java b/app/src/main/java/com/zxt/dlna/util/ImageUtil.java index 16d655f..5f38535 100644 --- a/app/src/main/java/com/zxt/dlna/util/ImageUtil.java +++ b/app/src/main/java/com/zxt/dlna/util/ImageUtil.java @@ -111,31 +111,10 @@ public static void deleteOldVideoThumbnail(String filePath) { @SuppressLint("NewApi") public static Bitmap getThumbnailForVideo(String videoAbsPath) { Bitmap bitmap = null; - if (Integer.valueOf(android.os.Build.VERSION.SDK) < 8) { - android.media.MediaMetadataRetriever retriever = new android.media.MediaMetadataRetriever(); - try { - retriever - .setMode(android.media.MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); - retriever.setDataSource(videoAbsPath); - bitmap = retriever.captureFrame(); - } catch (IllegalArgumentException ex) { - // Assume this is a corrupt video file - } catch (RuntimeException ex) { - // Assume this is a corrupt video file. - } finally { - try { - retriever.release(); - } catch (RuntimeException ex) { - // Ignore failures while cleaning up. - } - } - } else { - try { - bitmap = ThumbnailUtils.createVideoThumbnail(videoAbsPath, - Thumbnails.MINI_KIND); - } catch (Exception e) { - // It will not get here. - } + try { + bitmap = ThumbnailUtils.createVideoThumbnail(videoAbsPath, Thumbnails.MINI_KIND); + } catch (Exception e) { + // It will not get here. } return bitmap; } diff --git a/app/src/main/java/org/fourthline/cling/DefaultUpnpServiceConfiguration.java b/app/src/main/java/org/fourthline/cling/DefaultUpnpServiceConfiguration.java deleted file mode 100644 index 59cd334..0000000 --- a/app/src/main/java/org/fourthline/cling/DefaultUpnpServiceConfiguration.java +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling; - -import org.fourthline.cling.binding.xml.DeviceDescriptorBinder; -import org.fourthline.cling.binding.xml.ServiceDescriptorBinder; -import org.fourthline.cling.binding.xml.UDA10DeviceDescriptorBinderImpl; -import org.fourthline.cling.binding.xml.UDA10ServiceDescriptorBinderImpl; -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.Namespace; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.meta.RemoteDeviceIdentity; -import org.fourthline.cling.model.meta.RemoteService; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.transport.impl.DatagramIOConfigurationImpl; -import org.fourthline.cling.transport.impl.DatagramIOImpl; -import org.fourthline.cling.transport.impl.DatagramProcessorImpl; -import org.fourthline.cling.transport.impl.GENAEventProcessorImpl; -import org.fourthline.cling.transport.impl.MulticastReceiverConfigurationImpl; -import org.fourthline.cling.transport.impl.MulticastReceiverImpl; -import org.fourthline.cling.transport.impl.NetworkAddressFactoryImpl; -import org.fourthline.cling.transport.impl.SOAPActionProcessorImpl; -import org.fourthline.cling.transport.impl.StreamClientConfigurationImpl; -import org.fourthline.cling.transport.impl.StreamClientImpl; -import org.fourthline.cling.transport.impl.StreamServerConfigurationImpl; -import org.fourthline.cling.transport.impl.StreamServerImpl; -import org.fourthline.cling.transport.spi.DatagramIO; -import org.fourthline.cling.transport.spi.DatagramProcessor; -import org.fourthline.cling.transport.spi.GENAEventProcessor; -import org.fourthline.cling.transport.spi.MulticastReceiver; -import org.fourthline.cling.transport.spi.NetworkAddressFactory; -import org.fourthline.cling.transport.spi.SOAPActionProcessor; -import org.fourthline.cling.transport.spi.StreamClient; -import org.fourthline.cling.transport.spi.StreamServer; -import org.seamless.util.Exceptions; - -import javax.enterprise.inject.Alternative; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Logger; - -/** - * Default configuration data of a typical UPnP stack. - *

- * This configuration utilizes the default network transport implementation found in - * {@link org.fourthline.cling.transport.impl}. - *

- *

- * This configuration utilizes the DOM default descriptor binders found in - * {@link org.fourthline.cling.binding.xml}. - *

- *

- * The thread Executor is an Executors.newCachedThreadPool() with - * a custom {@link ClingThreadFactory} (it only sets a thread name). - *

- *

- * Note that this pool is effectively unlimited, so the number of threads will - * grow (and shrink) as needed - or restricted by your JVM. - *

- *

- * The default {@link org.fourthline.cling.model.Namespace} is configured without any - * base path or prefix. - *

- * - * @author Christian Bauer - */ -@Alternative -public class DefaultUpnpServiceConfiguration implements UpnpServiceConfiguration { - - private static Logger log = Logger.getLogger(DefaultUpnpServiceConfiguration.class.getName()); - - final private int streamListenPort; - - final private ExecutorService defaultExecutorService; - - final private DatagramProcessor datagramProcessor; - final private SOAPActionProcessor soapActionProcessor; - final private GENAEventProcessor genaEventProcessor; - - final private DeviceDescriptorBinder deviceDescriptorBinderUDA10; - final private ServiceDescriptorBinder serviceDescriptorBinderUDA10; - - final private Namespace namespace; - - /** - * Defaults to port '0', ephemeral. - */ - public DefaultUpnpServiceConfiguration() { - this(NetworkAddressFactoryImpl.DEFAULT_TCP_HTTP_LISTEN_PORT); - } - - public DefaultUpnpServiceConfiguration(int streamListenPort) { - this(streamListenPort, true); - } - - protected DefaultUpnpServiceConfiguration(boolean checkRuntime) { - this(NetworkAddressFactoryImpl.DEFAULT_TCP_HTTP_LISTEN_PORT, checkRuntime); - } - - protected DefaultUpnpServiceConfiguration(int streamListenPort, boolean checkRuntime) { - if (checkRuntime && ModelUtil.ANDROID_RUNTIME) { - throw new Error("Unsupported runtime environment, use org.fourthline.cling.android.AndroidUpnpServiceConfiguration"); - } - - this.streamListenPort = streamListenPort; - - defaultExecutorService = createDefaultExecutorService(); - - datagramProcessor = createDatagramProcessor(); - soapActionProcessor = createSOAPActionProcessor(); - genaEventProcessor = createGENAEventProcessor(); - - deviceDescriptorBinderUDA10 = createDeviceDescriptorBinderUDA10(); - serviceDescriptorBinderUDA10 = createServiceDescriptorBinderUDA10(); - - namespace = createNamespace(); - } - - public DatagramProcessor getDatagramProcessor() { - return datagramProcessor; - } - - public SOAPActionProcessor getSoapActionProcessor() { - return soapActionProcessor; - } - - public GENAEventProcessor getGenaEventProcessor() { - return genaEventProcessor; - } - - public StreamClient createStreamClient() { - return new StreamClientImpl( - new StreamClientConfigurationImpl( - getSyncProtocolExecutorService() - ) - ); - } - - public MulticastReceiver createMulticastReceiver(NetworkAddressFactory networkAddressFactory) { - return new MulticastReceiverImpl( - new MulticastReceiverConfigurationImpl( - networkAddressFactory.getMulticastGroup(), - networkAddressFactory.getMulticastPort() - ) - ); - } - - public DatagramIO createDatagramIO(NetworkAddressFactory networkAddressFactory) { - return new DatagramIOImpl(new DatagramIOConfigurationImpl()); - } - - public StreamServer createStreamServer(NetworkAddressFactory networkAddressFactory) { - return new StreamServerImpl( - new StreamServerConfigurationImpl( - networkAddressFactory.getStreamListenPort() - ) - ); - } - - public Executor getMulticastReceiverExecutor() { - return getDefaultExecutorService(); - } - - public Executor getDatagramIOExecutor() { - return getDefaultExecutorService(); - } - - public ExecutorService getStreamServerExecutorService() { - return getDefaultExecutorService(); - } - - public DeviceDescriptorBinder getDeviceDescriptorBinderUDA10() { - return deviceDescriptorBinderUDA10; - } - - public ServiceDescriptorBinder getServiceDescriptorBinderUDA10() { - return serviceDescriptorBinderUDA10; - } - - public ServiceType[] getExclusiveServiceTypes() { - return new ServiceType[0]; - } - - /** - * @return Defaults to false. - */ - public boolean isReceivedSubscriptionTimeoutIgnored() { - return false; - } - - public UpnpHeaders getDescriptorRetrievalHeaders(RemoteDeviceIdentity identity) { - return null; - } - - public UpnpHeaders getEventSubscriptionHeaders(RemoteService service) { - return null; - } - - /** - * @return Defaults to 1000 milliseconds. - */ - public int getRegistryMaintenanceIntervalMillis() { - return 1000; - } - - /** - * @return Defaults to zero, disabling ALIVE flooding. - */ - public int getAliveIntervalMillis() { - return 0; - } - - public Integer getRemoteDeviceMaxAgeSeconds() { - return null; - } - - public Executor getAsyncProtocolExecutor() { - return getDefaultExecutorService(); - } - - public ExecutorService getSyncProtocolExecutorService() { - return getDefaultExecutorService(); - } - - public Namespace getNamespace() { - return namespace; - } - - public Executor getRegistryMaintainerExecutor() { - return getDefaultExecutorService(); - } - - public Executor getRegistryListenerExecutor() { - return getDefaultExecutorService(); - } - - public NetworkAddressFactory createNetworkAddressFactory() { - return createNetworkAddressFactory(streamListenPort); - } - - public void shutdown() { - log.fine("Shutting down default executor service"); - getDefaultExecutorService().shutdownNow(); - } - - protected NetworkAddressFactory createNetworkAddressFactory(int streamListenPort) { - return new NetworkAddressFactoryImpl(streamListenPort); - } - - protected DatagramProcessor createDatagramProcessor() { - return new DatagramProcessorImpl(); - } - - protected SOAPActionProcessor createSOAPActionProcessor() { - return new SOAPActionProcessorImpl(); - } - - protected GENAEventProcessor createGENAEventProcessor() { - return new GENAEventProcessorImpl(); - } - - protected DeviceDescriptorBinder createDeviceDescriptorBinderUDA10() { - return new UDA10DeviceDescriptorBinderImpl(); - } - - protected ServiceDescriptorBinder createServiceDescriptorBinderUDA10() { - return new UDA10ServiceDescriptorBinderImpl(); - } - - protected Namespace createNamespace() { - return new Namespace(); - } - - protected ExecutorService getDefaultExecutorService() { - return defaultExecutorService; - } - - protected ExecutorService createDefaultExecutorService() { - return new ClingExecutor(); - } - - public static class ClingExecutor extends ThreadPoolExecutor { - - public ClingExecutor() { - this(new ClingThreadFactory(), - new ThreadPoolExecutor.DiscardPolicy() { - // The pool is unbounded but rejections will happen during shutdown - @Override - public void rejectedExecution(Runnable runnable, ThreadPoolExecutor threadPoolExecutor) { - // Log and discard - log.info("Thread pool rejected execution of " + runnable.getClass()); - super.rejectedExecution(runnable, threadPoolExecutor); - } - } - ); - } - - public ClingExecutor(ThreadFactory threadFactory, RejectedExecutionHandler rejectedHandler) { - // This is the same as Executors.newCachedThreadPool - super(0, - Integer.MAX_VALUE, - 60L, - TimeUnit.SECONDS, - new SynchronousQueue(), - threadFactory, - rejectedHandler - ); - } - - @Override - protected void afterExecute(Runnable runnable, Throwable throwable) { - super.afterExecute(runnable, throwable); - if (throwable != null) { - Throwable cause = Exceptions.unwrap(throwable); - if (cause instanceof InterruptedException) { - // Ignore this, might happen when we shutdownNow() the executor. We can't - // log at this point as the logging system might be stopped already (e.g. - // if it's a CDI component). - return; - } - // Log only - log.warning("Thread terminated " + runnable + " abruptly with exception: " + throwable); - log.warning("Root cause: " + cause); - } - } - } - - // Executors.DefaultThreadFactory is package visibility (...no touching, you unworthy JDK user!) - public static class ClingThreadFactory implements ThreadFactory { - - protected final ThreadGroup group; - protected final AtomicInteger threadNumber = new AtomicInteger(1); - protected final String namePrefix = "cling-"; - - public ClingThreadFactory() { - SecurityManager s = System.getSecurityManager(); - group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); - } - - public Thread newThread(Runnable r) { - Thread t = new Thread( - group, r, - namePrefix + threadNumber.getAndIncrement(), - 0 - ); - if (t.isDaemon()) - t.setDaemon(false); - if (t.getPriority() != Thread.NORM_PRIORITY) - t.setPriority(Thread.NORM_PRIORITY); - - return t; - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/Main.java b/app/src/main/java/org/fourthline/cling/Main.java deleted file mode 100644 index 2fb9f8d..0000000 --- a/app/src/main/java/org/fourthline/cling/Main.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling; - -import org.fourthline.cling.model.message.header.STAllHeader; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.meta.RemoteDevice; -import org.fourthline.cling.registry.Registry; -import org.fourthline.cling.registry.RegistryListener; - -/** - * Runs a simple UPnP discovery procedure. - */ -public class Main { - - public static void main(String[] args) throws Exception { - - // UPnP discovery is asynchronous, we need a callback - RegistryListener listener = new RegistryListener() { - - public void remoteDeviceDiscoveryStarted(Registry registry, - RemoteDevice device) { - System.out.println( - "Discovery started: " + device.getDisplayString() - ); - } - - public void remoteDeviceDiscoveryFailed(Registry registry, RemoteDevice device, Exception ex) { - System.out.println( - "Discovery failed: " + device.getDisplayString() + " => " + ex - ); - } - - public void remoteDeviceAdded(Registry registry, RemoteDevice device) { - System.out.println( - "Remote device available: " + device.getDisplayString() - ); - } - - public void remoteDeviceUpdated(Registry registry, RemoteDevice device) { - System.out.println( - "Remote device updated: " + device.getDisplayString() - ); - } - - public void remoteDeviceRemoved(Registry registry, RemoteDevice device) { - System.out.println( - "Remote device removed: " + device.getDisplayString() - ); - } - - public void localDeviceAdded(Registry registry, LocalDevice device) { - System.out.println( - "Local device added: " + device.getDisplayString() - ); - } - - public void localDeviceRemoved(Registry registry, LocalDevice device) { - System.out.println( - "Local device removed: " + device.getDisplayString() - ); - } - - public void beforeShutdown(Registry registry) { - System.out.println( - "Before shutdown, the registry has devices: " + registry.getDevices().size() - ); - } - - public void afterShutdown() { - System.out.println("Shutdown of registry complete!"); - - } - }; - - // This will create necessary network resources for UPnP right away - System.out.println("Starting Cling..."); - UpnpService upnpService = new UpnpServiceImpl(listener); - - // Send a search message to all devices and services, they should respond soon - System.out.println("Sending SEARCH message to all devices..."); - upnpService.getControlPoint().search(new STAllHeader()); - - // Let's wait 10 seconds for them to respond - System.out.println("Waiting 10 seconds before shutting down..."); - Thread.sleep(10000); - - // Release all resources and advertise BYEBYE to other UPnP devices - System.out.println("Stopping Cling..."); - upnpService.shutdown(); - } -} - diff --git a/app/src/main/java/org/fourthline/cling/ManagedUpnpService.java b/app/src/main/java/org/fourthline/cling/ManagedUpnpService.java deleted file mode 100644 index f0bd277..0000000 --- a/app/src/main/java/org/fourthline/cling/ManagedUpnpService.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling; - -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.meta.RemoteDevice; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.registry.Registry; -import org.fourthline.cling.registry.RegistryListener; -import org.fourthline.cling.registry.event.After; -import org.fourthline.cling.registry.event.Before; -import org.fourthline.cling.registry.event.FailedRemoteDeviceDiscovery; -import org.fourthline.cling.registry.event.LocalDeviceDiscovery; -import org.fourthline.cling.registry.event.Phase; -import org.fourthline.cling.registry.event.RegistryShutdown; -import org.fourthline.cling.registry.event.RemoteDeviceDiscovery; -import org.fourthline.cling.transport.DisableRouter; -import org.fourthline.cling.transport.EnableRouter; -import org.fourthline.cling.transport.Router; - -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.Observes; -import javax.enterprise.inject.Any; -import javax.enterprise.inject.Instance; -import javax.enterprise.util.AnnotationLiteral; -import javax.inject.Inject; -import java.util.logging.Logger; - -/** - * Adapter for CDI environments. - *

- * The CDI container provides injectable instances of Cling UPnP interfaces, e.g. - * you can @Inject Registry or @Inject ControlPoint. - *

- *

- * Furthermore, this adapter also binds Cling into the CDI eventing system. You - * can @Observe RemoteDeviceDiscoveryStart etc. events of the - * registry. - *

- *

- * Even better, you can listen to GENA UPnP events with the same API - although - * this will require some magic for subscription... - *

- *

- * TODO: This is a work in progress. - *

- * - * @author Christian Bauer - */ -@ApplicationScoped -public class ManagedUpnpService implements UpnpService { - - final private static Logger log = Logger.getLogger(ManagedUpnpService.class.getName()); - - @Inject - RegistryListenerAdapter registryListenerAdapter; - - @Inject - Instance configuration; - - @Inject - Instance registryInstance; - - @Inject - Instance routerInstance; - - @Inject - Instance protocolFactoryInstance; - - @Inject - Instance controlPointInstance; - - @Inject - Event enableRouterEvent; - - @Inject - Event disableRouterEvent; - - @Override - public UpnpServiceConfiguration getConfiguration() { - return configuration.get(); - } - - @Override - public ControlPoint getControlPoint() { - return controlPointInstance.get(); - } - - @Override - public ProtocolFactory getProtocolFactory() { - return protocolFactoryInstance.get(); - } - - @Override - public Registry getRegistry() { - return registryInstance.get(); - } - - @Override - public Router getRouter() { - return routerInstance.get(); - } - - public void start(@Observes Start start) { - log.info(">>> Starting managed UPnP service..."); - - // First start the registry before we can receive messages through the transport - - getRegistry().addListener(registryListenerAdapter); - - enableRouterEvent.fire(new EnableRouter()); - - log.info("<<< Managed UPnP service started successfully"); - } - - @Override - public void shutdown() { - shutdown(null); - } - - public void shutdown(@Observes Shutdown shutdown) { - - // Well, since java.util.logging has its own shutdown hook, this - // might actually make it into the log or not... - log.info(">>> Shutting down managed UPnP service..."); - - // First stop the registry and announce BYEBYE on the transport - getRegistry().shutdown(); - - disableRouterEvent.fire(new DisableRouter()); - - getConfiguration().shutdown(); - - log.info("<<< Managed UPnP service shutdown completed"); - } - - @ApplicationScoped - static class RegistryListenerAdapter implements RegistryListener { - - @Inject - @Any - Event remoteDeviceDiscoveryEvent; - - @Inject - @Any - Event failedRemoteDeviceDiscoveryEvent; - - @Inject - @Any - Event localDeviceDiscoveryEvent; - - @Inject - @Any - Event registryShutdownEvent; - - @Override - public void remoteDeviceDiscoveryStarted(Registry registry, RemoteDevice device) { - remoteDeviceDiscoveryEvent.select(Phase.ALIVE).fire( - new RemoteDeviceDiscovery(device) - ); - } - - @Override - public void remoteDeviceDiscoveryFailed(Registry registry, RemoteDevice device, Exception ex) { - failedRemoteDeviceDiscoveryEvent.fire( - new FailedRemoteDeviceDiscovery(device, ex) - ); - } - - @Override - public void remoteDeviceAdded(Registry registry, RemoteDevice device) { - remoteDeviceDiscoveryEvent.select(Phase.COMPLETE).fire( - new RemoteDeviceDiscovery(device) - ); - } - - @Override - public void remoteDeviceUpdated(Registry registry, RemoteDevice device) { - remoteDeviceDiscoveryEvent.select(Phase.UPDATED).fire( - new RemoteDeviceDiscovery(device) - ); - } - - @Override - public void remoteDeviceRemoved(Registry registry, RemoteDevice device) { - remoteDeviceDiscoveryEvent.select(Phase.BYEBYE).fire( - new RemoteDeviceDiscovery(device) - ); - } - - @Override - public void localDeviceAdded(Registry registry, LocalDevice device) { - localDeviceDiscoveryEvent.select(Phase.COMPLETE).fire( - new LocalDeviceDiscovery(device) - ); - } - - @Override - public void localDeviceRemoved(Registry registry, LocalDevice device) { - localDeviceDiscoveryEvent.select(Phase.BYEBYE).fire( - new LocalDeviceDiscovery(device) - ); - } - - @Override - public void beforeShutdown(Registry registry) { - registryShutdownEvent.select(new AnnotationLiteral() { - }).fire( - new RegistryShutdown() - ); - } - - @Override - public void afterShutdown() { - registryShutdownEvent.select(new AnnotationLiteral() { - }).fire( - new RegistryShutdown() - ); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/ManagedUpnpServiceConfiguration.java b/app/src/main/java/org/fourthline/cling/ManagedUpnpServiceConfiguration.java deleted file mode 100644 index a4bd1df..0000000 --- a/app/src/main/java/org/fourthline/cling/ManagedUpnpServiceConfiguration.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling; - -import org.fourthline.cling.binding.xml.DeviceDescriptorBinder; -import org.fourthline.cling.binding.xml.ServiceDescriptorBinder; -import org.fourthline.cling.binding.xml.UDA10DeviceDescriptorBinderImpl; -import org.fourthline.cling.binding.xml.UDA10ServiceDescriptorBinderImpl; -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.Namespace; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.meta.RemoteDeviceIdentity; -import org.fourthline.cling.model.meta.RemoteService; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.transport.impl.DatagramIOConfigurationImpl; -import org.fourthline.cling.transport.impl.DatagramIOImpl; -import org.fourthline.cling.transport.impl.GENAEventProcessorImpl; -import org.fourthline.cling.transport.impl.MulticastReceiverConfigurationImpl; -import org.fourthline.cling.transport.impl.MulticastReceiverImpl; -import org.fourthline.cling.transport.impl.NetworkAddressFactoryImpl; -import org.fourthline.cling.transport.impl.SOAPActionProcessorImpl; -import org.fourthline.cling.transport.impl.StreamClientConfigurationImpl; -import org.fourthline.cling.transport.impl.StreamClientImpl; -import org.fourthline.cling.transport.impl.StreamServerConfigurationImpl; -import org.fourthline.cling.transport.impl.StreamServerImpl; -import org.fourthline.cling.transport.spi.DatagramIO; -import org.fourthline.cling.transport.spi.DatagramProcessor; -import org.fourthline.cling.transport.spi.GENAEventProcessor; -import org.fourthline.cling.transport.spi.MulticastReceiver; -import org.fourthline.cling.transport.spi.NetworkAddressFactory; -import org.fourthline.cling.transport.spi.SOAPActionProcessor; -import org.fourthline.cling.transport.spi.StreamClient; -import org.fourthline.cling.transport.spi.StreamServer; - -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.logging.Logger; - -/** - * Adapter for CDI environments. - * - * @author Christian Bauer - */ -@ApplicationScoped -public class ManagedUpnpServiceConfiguration implements UpnpServiceConfiguration { - - private static Logger log = Logger.getLogger(DefaultUpnpServiceConfiguration.class.getName()); - - // TODO: All of these fields should be injected so users can provide values through CDI - - private int streamListenPort; - - private ExecutorService defaultExecutorService; - - @Inject - protected DatagramProcessor datagramProcessor; - - private SOAPActionProcessor soapActionProcessor; - private GENAEventProcessor genaEventProcessor; - - private DeviceDescriptorBinder deviceDescriptorBinderUDA10; - private ServiceDescriptorBinder serviceDescriptorBinderUDA10; - - private Namespace namespace; - - @PostConstruct - public void init() { - - if (ModelUtil.ANDROID_RUNTIME) { - throw new Error("Unsupported runtime environment, use org.fourthline.cling.android.AndroidUpnpServiceConfiguration"); - } - - this.streamListenPort = NetworkAddressFactoryImpl.DEFAULT_TCP_HTTP_LISTEN_PORT; - - defaultExecutorService = createDefaultExecutorService(); - - soapActionProcessor = createSOAPActionProcessor(); - genaEventProcessor = createGENAEventProcessor(); - - deviceDescriptorBinderUDA10 = createDeviceDescriptorBinderUDA10(); - serviceDescriptorBinderUDA10 = createServiceDescriptorBinderUDA10(); - - namespace = createNamespace(); - } - - public DatagramProcessor getDatagramProcessor() { - return datagramProcessor; - } - - public SOAPActionProcessor getSoapActionProcessor() { - return soapActionProcessor; - } - - public GENAEventProcessor getGenaEventProcessor() { - return genaEventProcessor; - } - - public StreamClient createStreamClient() { - return new StreamClientImpl( - new StreamClientConfigurationImpl( - getSyncProtocolExecutorService() - ) - ); - } - - public MulticastReceiver createMulticastReceiver(NetworkAddressFactory networkAddressFactory) { - return new MulticastReceiverImpl( - new MulticastReceiverConfigurationImpl( - networkAddressFactory.getMulticastGroup(), - networkAddressFactory.getMulticastPort() - ) - ); - } - - public DatagramIO createDatagramIO(NetworkAddressFactory networkAddressFactory) { - return new DatagramIOImpl(new DatagramIOConfigurationImpl()); - } - - public StreamServer createStreamServer(NetworkAddressFactory networkAddressFactory) { - return new StreamServerImpl( - new StreamServerConfigurationImpl( - networkAddressFactory.getStreamListenPort() - ) - ); - } - - public Executor getMulticastReceiverExecutor() { - return getDefaultExecutorService(); - } - - public Executor getDatagramIOExecutor() { - return getDefaultExecutorService(); - } - - public ExecutorService getStreamServerExecutorService() { - return getDefaultExecutorService(); - } - - public DeviceDescriptorBinder getDeviceDescriptorBinderUDA10() { - return deviceDescriptorBinderUDA10; - } - - public ServiceDescriptorBinder getServiceDescriptorBinderUDA10() { - return serviceDescriptorBinderUDA10; - } - - public ServiceType[] getExclusiveServiceTypes() { - return new ServiceType[0]; - } - - /** - * @return Defaults to false. - */ - public boolean isReceivedSubscriptionTimeoutIgnored() { - return false; - } - - public UpnpHeaders getDescriptorRetrievalHeaders(RemoteDeviceIdentity identity) { - return null; - } - - public UpnpHeaders getEventSubscriptionHeaders(RemoteService service) { - return null; - } - - /** - * @return Defaults to 1000 milliseconds. - */ - public int getRegistryMaintenanceIntervalMillis() { - return 1000; - } - - /** - * @return Defaults to zero, disabling ALIVE flooding. - */ - public int getAliveIntervalMillis() { - return 0; - } - - public Integer getRemoteDeviceMaxAgeSeconds() { - return null; - } - - public Executor getAsyncProtocolExecutor() { - return getDefaultExecutorService(); - } - - public ExecutorService getSyncProtocolExecutorService() { - return getDefaultExecutorService(); - } - - public Namespace getNamespace() { - return namespace; - } - - public Executor getRegistryMaintainerExecutor() { - return getDefaultExecutorService(); - } - - public Executor getRegistryListenerExecutor() { - return getDefaultExecutorService(); - } - - public NetworkAddressFactory createNetworkAddressFactory() { - return createNetworkAddressFactory(streamListenPort); - } - - public void shutdown() { - log.fine("Shutting down default executor service"); - getDefaultExecutorService().shutdownNow(); - } - - protected NetworkAddressFactory createNetworkAddressFactory(int streamListenPort) { - return new NetworkAddressFactoryImpl(streamListenPort); - } - - protected SOAPActionProcessor createSOAPActionProcessor() { - return new SOAPActionProcessorImpl(); - } - - protected GENAEventProcessor createGENAEventProcessor() { - return new GENAEventProcessorImpl(); - } - - protected DeviceDescriptorBinder createDeviceDescriptorBinderUDA10() { - return new UDA10DeviceDescriptorBinderImpl(); - } - - protected ServiceDescriptorBinder createServiceDescriptorBinderUDA10() { - return new UDA10ServiceDescriptorBinderImpl(); - } - - protected Namespace createNamespace() { - return new Namespace(); - } - - protected ExecutorService getDefaultExecutorService() { - return defaultExecutorService; - } - - protected ExecutorService createDefaultExecutorService() { - return new DefaultUpnpServiceConfiguration.ClingExecutor(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/UpnpService.java b/app/src/main/java/org/fourthline/cling/UpnpService.java deleted file mode 100644 index e0ec609..0000000 --- a/app/src/main/java/org/fourthline/cling/UpnpService.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling; - -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.registry.Registry; -import org.fourthline.cling.transport.Router; - -/** - * Primary interface of the Cling Core UPnP stack. - *

- * An implementation can either start immediately when constructed or offer an additional - * method that starts the UPnP stack on-demand. Implementations are not required to be - * restartable after shutdown. - *

- *

- * Implementations are always thread-safe and can be shared and called concurrently. - *

- * - * @author Christian Bauer - */ -public interface UpnpService { - - public UpnpServiceConfiguration getConfiguration(); - - public ControlPoint getControlPoint(); - - public ProtocolFactory getProtocolFactory(); - - public Registry getRegistry(); - - public Router getRouter(); - - /** - * Stopping the UPnP stack. - *

- * Clients are required to stop the UPnP stack properly. Notifications for - * disappearing devices will be multicast'ed, existing event subscriptions cancelled. - *

- */ - public void shutdown(); - - static public class Start { - - } - - static public class Shutdown { - - } - -} diff --git a/app/src/main/java/org/fourthline/cling/UpnpServiceConfiguration.java b/app/src/main/java/org/fourthline/cling/UpnpServiceConfiguration.java deleted file mode 100644 index 6f888fb..0000000 --- a/app/src/main/java/org/fourthline/cling/UpnpServiceConfiguration.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling; - -import org.fourthline.cling.binding.xml.DeviceDescriptorBinder; -import org.fourthline.cling.binding.xml.ServiceDescriptorBinder; -import org.fourthline.cling.model.Namespace; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.meta.RemoteDeviceIdentity; -import org.fourthline.cling.model.meta.RemoteService; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.transport.spi.DatagramIO; -import org.fourthline.cling.transport.spi.DatagramProcessor; -import org.fourthline.cling.transport.spi.GENAEventProcessor; -import org.fourthline.cling.transport.spi.MulticastReceiver; -import org.fourthline.cling.transport.spi.NetworkAddressFactory; -import org.fourthline.cling.transport.spi.SOAPActionProcessor; -import org.fourthline.cling.transport.spi.StreamClient; -import org.fourthline.cling.transport.spi.StreamServer; - -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; - -/** - * Shared configuration data of the UPnP stack.. - *

- * This interface offers methods for retrieval of configuration data by the - * {@link org.fourthline.cling.transport.Router} and the {@link org.fourthline.cling.registry.Registry}, - * as well as other parts of the UPnP stack. - *

- *

- * You can re-use this interface if you implement a subclass of {@link UpnpServiceImpl} or - * if you create a new implementation of {@link UpnpService}. - *

- * - * @author Christian Bauer - */ -public interface UpnpServiceConfiguration { - - /** - * @return A new instance of the {@link org.fourthline.cling.transport.spi.NetworkAddressFactory} interface. - */ - public NetworkAddressFactory createNetworkAddressFactory(); - - /** - * @return The shared implementation of {@link org.fourthline.cling.transport.spi.DatagramProcessor}. - */ - public DatagramProcessor getDatagramProcessor(); - - /** - * @return The shared implementation of {@link org.fourthline.cling.transport.spi.SOAPActionProcessor}. - */ - public SOAPActionProcessor getSoapActionProcessor(); - - /** - * @return The shared implementation of {@link org.fourthline.cling.transport.spi.GENAEventProcessor}. - */ - public GENAEventProcessor getGenaEventProcessor(); - - /** - * @return A new instance of the {@link org.fourthline.cling.transport.spi.StreamClient} interface. - */ - public StreamClient createStreamClient(); - - /** - * @param networkAddressFactory The configured {@link org.fourthline.cling.transport.spi.NetworkAddressFactory}. - * @return A new instance of the {@link org.fourthline.cling.transport.spi.MulticastReceiver} interface. - */ - public MulticastReceiver createMulticastReceiver(NetworkAddressFactory networkAddressFactory); - - /** - * @param networkAddressFactory The configured {@link org.fourthline.cling.transport.spi.NetworkAddressFactory}. - * @return A new instance of the {@link org.fourthline.cling.transport.spi.DatagramIO} interface. - */ - public DatagramIO createDatagramIO(NetworkAddressFactory networkAddressFactory); - - /** - * @param networkAddressFactory The configured {@link org.fourthline.cling.transport.spi.NetworkAddressFactory}. - * @return A new instance of the {@link org.fourthline.cling.transport.spi.StreamServer} interface. - */ - public StreamServer createStreamServer(NetworkAddressFactory networkAddressFactory); - - /** - * @return The executor which runs the listening background threads for multicast datagrams. - */ - public Executor getMulticastReceiverExecutor(); - - /** - * @return The executor which runs the listening background threads for unicast datagrams. - */ - public Executor getDatagramIOExecutor(); - - /** - * @return The executor which runs the listening background threads for HTTP requests. - */ - public ExecutorService getStreamServerExecutorService(); - - /** - * @return The shared implementation of {@link org.fourthline.cling.binding.xml.DeviceDescriptorBinder} for the UPnP 1.0 Device Architecture.. - */ - public DeviceDescriptorBinder getDeviceDescriptorBinderUDA10(); - - /** - * @return The shared implementation of {@link org.fourthline.cling.binding.xml.ServiceDescriptorBinder} for the UPnP 1.0 Device Architecture.. - */ - public ServiceDescriptorBinder getServiceDescriptorBinderUDA10(); - - /** - * Returns service types that can be handled by this UPnP stack, all others will be ignored. - *

- * Return null to completely disable remote device and service discovery. - * All incoming notifications and search responses will then be dropped immediately. - * This is mostly useful in applications that only provide services with no (remote) - * control point functionality. - *

- *

- * Note that a discovered service type with version 2 or 3 will match an exclusive - * service type with version 1. UPnP services are required to be backwards - * compatible, version 2 is a superset of version 1, and version 3 is a superset - * of version 2, etc. - *

- * - * @return An array of service types that are exclusively discovered, no other service will - * be discovered. A null return value will disable discovery! - * An empty array means all services will be discovered. - */ - public ServiceType[] getExclusiveServiceTypes(); - - /** - * @return The time in milliseconds to wait between each registry maintenance operation. - */ - public int getRegistryMaintenanceIntervalMillis(); - - /** - * Optional setting for flooding alive NOTIFY messages for local devices. - *

- * Use this to advertise local devices at the specified interval, independent of its - * {@link org.fourthline.cling.model.meta.DeviceIdentity#maxAgeSeconds} value. Note - * that this will increase network traffic. - *

- *

- * Some control points (XBMC and other Platinum UPnP SDK based devices, OPPO-93) seem - * to not properly receive SSDP M-SEARCH replies sent by Cling, but will handle NOTIFY - * alive messages just fine. - *

- * - * @return The time in milliseconds for ALIVE message intervals, set to 0 to disable - */ - public int getAliveIntervalMillis(); - - /** - * Ignore the received event subscription timeout from remote control points. - *

- * Some control points have trouble renewing subscriptions properly; enabling this option - * in conjunction with a high value for - * {@link org.fourthline.cling.model.UserConstants#DEFAULT_SUBSCRIPTION_DURATION_SECONDS} - * ensures that your devices will not disappear on such control points. - *

- * - * @return true if the timeout in incoming event subscriptions should be ignored - * and the default value ({@link org.fourthline.cling.model.UserConstants#DEFAULT_SUBSCRIPTION_DURATION_SECONDS}) - * should be used instead. - * - */ - public boolean isReceivedSubscriptionTimeoutIgnored(); - - /** - * Returns the time in seconds a remote device will be registered until it is expired. - *

- * This setting is useful on systems which do not support multicast networking - * (Android on HTC phones, for example). On such a system you will not receive messages when a - * remote device disappears from the network and you will not receive its periodic heartbeat - * alive messages. Only an initial search response (UDP unicast) has been received from the - * remote device, with its proposed maximum age. To avoid (early) expiration of the remote - * device, you can override its maxium age with this configuration setting, ignoring the - * initial maximum age sent by the device. You most likely want to return - * 0 in this case, so that the remote device is never expired unless you - * manually remove it from the {@link org.fourthline.cling.registry.Registry}. You typically remove - * the device when an action or GENA subscription request to the remote device failed. - *

- * - * @return null (the default) to accept the remote device's proposed maximum age, or - * 0 for unlimited age, or a value in seconds. - */ - public Integer getRemoteDeviceMaxAgeSeconds(); - - /** - * Optional extra headers for device descriptor retrieval HTTP requests. - *

- * Some devices might require extra headers to recognize your control point, use this - * method to set these headers. They will be used for every descriptor (XML) retrieval - * HTTP request by Cling. See {@link org.fourthline.cling.model.profile.ClientInfo} for - * action request messages. - *

- * - * @param identity The (so far) discovered identity of the remote device. - * @return null or extra HTTP headers. - */ - public UpnpHeaders getDescriptorRetrievalHeaders(RemoteDeviceIdentity identity); - - /** - * Optional extra headers for event subscription (almost HTTP) messages. - *

- * Some devices might require extra headers to recognize your control point, use this - * method to set these headers for GENA subscriptions. Note that the headers will - * not be applied to actual event messages, only subscribe, unsubscribe, and renewal. - *

- * - * @return null or extra HTTP headers. - */ - public UpnpHeaders getEventSubscriptionHeaders(RemoteService service); - - /** - * @return The executor which runs the processing of asynchronous aspects of the UPnP stack (discovery). - */ - public Executor getAsyncProtocolExecutor(); - - /** - * @return The executor service which runs the processing of synchronous aspects of the UPnP stack (description, control, GENA). - */ - public ExecutorService getSyncProtocolExecutorService(); - - /** - * @return An instance of {@link org.fourthline.cling.model.Namespace} for this UPnP stack. - */ - public Namespace getNamespace(); - - /** - * @return The executor which runs the background thread for maintaining the registry. - */ - public Executor getRegistryMaintainerExecutor(); - - /** - * @return The executor which runs the notification threads of registry listeners. - */ - public Executor getRegistryListenerExecutor(); - - /** - * Called by the {@link org.fourthline.cling.UpnpService} on shutdown, useful to e.g. shutdown thread pools. - */ - public void shutdown(); - -} diff --git a/app/src/main/java/org/fourthline/cling/UpnpServiceImpl.java b/app/src/main/java/org/fourthline/cling/UpnpServiceImpl.java deleted file mode 100644 index 1b9dc79..0000000 --- a/app/src/main/java/org/fourthline/cling/UpnpServiceImpl.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling; - -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.controlpoint.ControlPointImpl; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.protocol.ProtocolFactoryImpl; -import org.fourthline.cling.registry.Registry; -import org.fourthline.cling.registry.RegistryImpl; -import org.fourthline.cling.registry.RegistryListener; -import org.fourthline.cling.transport.Router; -import org.fourthline.cling.transport.RouterException; -import org.fourthline.cling.transport.RouterImpl; -import org.seamless.util.Exceptions; - -import javax.enterprise.inject.Alternative; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Default implementation of {@link UpnpService}, starts immediately on construction. - *

- * If no {@link UpnpServiceConfiguration} is provided it will automatically - * instantiate {@link DefaultUpnpServiceConfiguration}. This configuration does not - * work on Android! Use the {@link org.fourthline.cling.android.AndroidUpnpService} - * application component instead - *

- *

- * Override the various create...() methods to customize instantiation of protocol factory, - * router, etc. - *

- * - * @author Christian Bauer - */ -@Alternative -public class UpnpServiceImpl implements UpnpService { - - private static Logger log = Logger.getLogger(UpnpServiceImpl.class.getName()); - - protected final UpnpServiceConfiguration configuration; - protected final ControlPoint controlPoint; - protected final ProtocolFactory protocolFactory; - protected final Registry registry; - protected final Router router; - - public UpnpServiceImpl() { - this(new DefaultUpnpServiceConfiguration()); - } - - public UpnpServiceImpl(RegistryListener... registryListeners) { - this(new DefaultUpnpServiceConfiguration(), registryListeners); - } - - public UpnpServiceImpl(UpnpServiceConfiguration configuration, RegistryListener... registryListeners) { - this.configuration = configuration; - - log.info(">>> Starting UPnP service..."); - - log.info("Using configuration: " + getConfiguration().getClass().getName()); - - // Instantiation order is important: Router needs to start its network services after registry is ready - - this.protocolFactory = createProtocolFactory(); - - this.registry = createRegistry(protocolFactory); - for (RegistryListener registryListener : registryListeners) { - this.registry.addListener(registryListener); - } - - this.router = createRouter(protocolFactory, registry); - - try { - this.router.enable(); - } catch (RouterException ex) { - throw new RuntimeException("Enabling network router failed: " + ex, ex); - } - - this.controlPoint = createControlPoint(protocolFactory, registry); - - log.info("<<< UPnP service started successfully"); - } - - protected ProtocolFactory createProtocolFactory() { - return new ProtocolFactoryImpl(this); - } - - protected Registry createRegistry(ProtocolFactory protocolFactory) { - return new RegistryImpl(this); - } - - protected Router createRouter(ProtocolFactory protocolFactory, Registry registry) { - return new RouterImpl(getConfiguration(), protocolFactory); - } - - protected ControlPoint createControlPoint(ProtocolFactory protocolFactory, Registry registry) { - return new ControlPointImpl(getConfiguration(), protocolFactory, registry); - } - - public UpnpServiceConfiguration getConfiguration() { - return configuration; - } - - public ControlPoint getControlPoint() { - return controlPoint; - } - - public ProtocolFactory getProtocolFactory() { - return protocolFactory; - } - - public Registry getRegistry() { - return registry; - } - - public Router getRouter() { - return router; - } - - synchronized public void shutdown() { - shutdown(false); - } - - protected void shutdown(boolean separateThread) { - Runnable shutdown = new Runnable() { - @Override - public void run() { - log.info(">>> Shutting down UPnP service..."); - shutdownRegistry(); - shutdownRouter(); - shutdownConfiguration(); - log.info("<<< UPnP service shutdown completed"); - } - }; - if (separateThread) { - // This is not a daemon thread, it has to complete! - new Thread(shutdown).start(); - } else { - shutdown.run(); - } - } - - protected void shutdownRegistry() { - getRegistry().shutdown(); - } - - protected void shutdownRouter() { - try { - getRouter().shutdown(); - } catch (RouterException ex) { - Throwable cause = Exceptions.unwrap(ex); - if (cause instanceof InterruptedException) { - log.log(Level.INFO, "Router shutdown was interrupted: " + ex, cause); - } else { - throw new RuntimeException("Router error on shutdown: " + ex, ex); - } - } - } - - protected void shutdownConfiguration() { - getConfiguration().shutdown(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/android/AndroidNetworkAddressFactory.java b/app/src/main/java/org/fourthline/cling/android/AndroidNetworkAddressFactory.java deleted file mode 100644 index 79e7c05..0000000 --- a/app/src/main/java/org/fourthline/cling/android/AndroidNetworkAddressFactory.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.android; - -import org.fourthline.cling.transport.impl.NetworkAddressFactoryImpl; -import org.fourthline.cling.transport.spi.InitializationException; - -import java.lang.reflect.Field; -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * This factory tries to work around and patch some Android bugs. - * - * @author Michael Pujos - * @author Christian Bauer - */ -public class AndroidNetworkAddressFactory extends NetworkAddressFactoryImpl { - - final private static Logger log = Logger.getLogger(AndroidUpnpServiceConfiguration.class.getName()); - - public AndroidNetworkAddressFactory(int streamListenPort) { - super(streamListenPort); - } - - @Override - protected boolean requiresNetworkInterface() { - return false; - } - - @Override - protected boolean isUsableAddress(NetworkInterface networkInterface, InetAddress address) { - boolean result = super.isUsableAddress(networkInterface, address); - if (result) { - // TODO: Workaround Android DNS reverse lookup issue, still a problem on ICS+? - // http://4thline.org/projects/mailinglists.html#nabble-td3011461 - String hostName = address.getHostAddress(); - try { - Field field = InetAddress.class.getDeclaredField("hostName"); - field.setAccessible(true); - field.set(address, hostName); - } catch (Exception ex) { - log.log(Level.SEVERE, - "Failed injecting hostName to work around Android InetAddress DNS bug: " + address, - ex - ); - return false; - } - } - return result; - } - - @Override - public InetAddress getLocalAddress(NetworkInterface networkInterface, boolean isIPv6, InetAddress remoteAddress) { - // TODO: This is totally random because we can't access low level InterfaceAddress on Android! - for (InetAddress localAddress : getInetAddresses(networkInterface)) { - if (isIPv6 && localAddress instanceof Inet6Address) - return localAddress; - if (!isIPv6 && localAddress instanceof Inet4Address) - return localAddress; - } - throw new IllegalStateException("Can't find any IPv4 or IPv6 address on interface: " + networkInterface.getDisplayName()); - } - - @Override - protected void discoverNetworkInterfaces() throws InitializationException { - try { - super.discoverNetworkInterfaces(); - } catch (Exception ex) { - // TODO: ICS bug on some models with network interface disappearing while enumerated - // http://code.google.com/p/android/issues/detail?id=33661 - log.warning("Exception while enumerating network interfaces, trying once more: " + ex); - super.discoverNetworkInterfaces(); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/android/AndroidRouter.java b/app/src/main/java/org/fourthline/cling/android/AndroidRouter.java deleted file mode 100644 index 26e46f0..0000000 --- a/app/src/main/java/org/fourthline/cling/android/AndroidRouter.java +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.android; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.net.wifi.WifiManager; -import org.fourthline.cling.UpnpServiceConfiguration; -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.transport.Router; -import org.fourthline.cling.transport.RouterException; -import org.fourthline.cling.transport.RouterImpl; -import org.fourthline.cling.transport.spi.InitializationException; -import org.seamless.util.Exceptions; - -import java.lang.reflect.Field; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Monitors all network connectivity changes, switching the router accordingly. - * - * @author Michael Pujos - * @author Christian Bauer - */ -public class AndroidRouter extends RouterImpl { - - final private static Logger log = Logger.getLogger(Router.class.getName()); - - final private Context context; - - final private WifiManager wifiManager; - protected WifiManager.MulticastLock multicastLock; - protected WifiManager.WifiLock wifiLock; - protected NetworkInfo networkInfo; - protected BroadcastReceiver broadcastReceiver; - - public AndroidRouter(UpnpServiceConfiguration configuration, - ProtocolFactory protocolFactory, - Context context) throws InitializationException { - super(configuration, protocolFactory); - - this.context = context; - this.wifiManager = ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)); - this.networkInfo = NetworkUtils.getConnectedNetworkInfo(context); - - // Only register for network connectivity changes if we are not running on emulator - if (!ModelUtil.ANDROID_EMULATOR) { - this.broadcastReceiver = new ConnectivityBroadcastReceiver(); - context.registerReceiver(broadcastReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); - } - } - - @Override - protected int getLockTimeoutMillis() { - return 15000; - } - - @Override - public void shutdown() throws RouterException { - super.shutdown(); - unregisterBroadcastReceiver(); - } - - @Override - public boolean enable() throws RouterException { - lock(writeLock); - try { - boolean enabled; - if ((enabled = super.enable())) { - // Enable multicast on the WiFi network interface, - // requires android.permission.CHANGE_WIFI_MULTICAST_STATE - if (isWifi()) { - setWiFiMulticastLock(true); - setWifiLock(true); - } - } - return enabled; - } finally { - unlock(writeLock); - } - } - - @Override - public boolean disable() throws RouterException { - lock(writeLock); - try { - // Disable multicast on WiFi network interface, - // requires android.permission.CHANGE_WIFI_MULTICAST_STATE - if (isWifi()) { - setWiFiMulticastLock(false); - setWifiLock(false); - } - return super.disable(); - } finally { - unlock(writeLock); - } - } - - public NetworkInfo getNetworkInfo() { - return networkInfo; - } - - public boolean isMobile() { - return NetworkUtils.isMobile(networkInfo); - } - - public boolean isWifi() { - return NetworkUtils.isWifi(networkInfo); - } - - public boolean isEthernet() { - return NetworkUtils.isEthernet(networkInfo); - } - - public boolean enableWiFi() { - log.info("Enabling WiFi..."); - try { - return wifiManager.setWifiEnabled(true); - } catch (Throwable t) { - // workaround (HTC One X, 4.0.3) - //java.lang.SecurityException: Permission Denial: writing com.android.providers.settings.SettingsProvider - // uri content://settings/system from pid=4691, uid=10226 requires android.permission.WRITE_SETTINGS - // at android.os.Parcel.readException(Parcel.java:1332) - // at android.os.Parcel.readException(Parcel.java:1286) - // at android.net.wifi.IWifiManager$Stub$Proxy.setWifiEnabled(IWifiManager.java:1115) - // at android.net.wifi.WifiManager.setWifiEnabled(WifiManager.java:946) - log.log(Level.WARNING, "SetWifiEnabled failed", t); - return false; - } - } - - public void unregisterBroadcastReceiver() { - if (broadcastReceiver != null) { - context.unregisterReceiver(broadcastReceiver); - broadcastReceiver = null; - } - } - - protected void setWiFiMulticastLock(boolean enable) { - if (multicastLock == null) { - multicastLock = wifiManager.createMulticastLock(getClass().getSimpleName()); - } - - if (enable) { - if (multicastLock.isHeld()) { - log.warning("WiFi multicast lock already acquired"); - } else { - log.info("WiFi multicast lock acquired"); - multicastLock.acquire(); - } - } else { - if (multicastLock.isHeld()) { - log.info("WiFi multicast lock released"); - multicastLock.release(); - } else { - log.warning("WiFi multicast lock already released"); - } - } - } - - protected void setWifiLock(boolean enable) { - if (wifiLock == null) { - wifiLock = createWiFiLock(); - } - - if (enable) { - if (wifiLock.isHeld()) { - log.warning("WiFi lock already acquired"); - } else { - log.info("WiFi lock acquired"); - wifiLock.acquire(); - } - } else { - if (wifiLock.isHeld()) { - log.info("WiFi lock released"); - wifiLock.release(); - } else { - log.warning("WiFi lock already released"); - } - } - } - - protected WifiManager.WifiLock createWiFiLock() { - int wifiMode = WifiManager.WIFI_MODE_FULL; - try { - // TODO: What's this? - Field f = WifiManager.class.getField("WIFI_MODE_FULL_HIGH_PERF"); - wifiMode = f.getInt(null); - } catch (Exception e) { - // Ignore - } - WifiManager.WifiLock wifiLock = - wifiManager.createWifiLock(wifiMode, getClass().getSimpleName()); - log.info("Created WiFi lock, mode: " + wifiMode); - return wifiLock; - } - - /** - * Can be overriden by subclasses to do additional work. - * - * @param oldNetwork null when first called by constructor. - */ - protected void onNetworkTypeChange(NetworkInfo oldNetwork, NetworkInfo newNetwork) throws RouterException { - log.info(String.format("Network type changed %s => %s", - oldNetwork == null ? "" : oldNetwork.getTypeName(), - newNetwork == null ? "NONE" : newNetwork.getTypeName())); - - if (disable()) { - log.info(String.format( - "Disabled router on network type change (old network: %s)", - oldNetwork == null ? "NONE" : oldNetwork.getTypeName() - )); - } - - networkInfo = newNetwork; - if (enable()) { - // Can return false (via earlier InitializationException thrown by NetworkAddressFactory) if - // no bindable network address found! - log.info(String.format( - "Enabled router on network type change (new network: %s)", - newNetwork == null ? "NONE" : newNetwork.getTypeName() - )); - } - } - - protected void handleRouterExceptionOnNetworkTypeChange(RouterException ex) { - Throwable cause = Exceptions.unwrap(ex); - if (cause instanceof InterruptedException) { - log.log(Level.INFO, "Router was interrupted: " + ex, cause); - } else { - throw new RuntimeException("Router error on network change: " + ex, ex); - } - } - - class ConnectivityBroadcastReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - - if (!intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) - return; - - displayIntentInfo(intent); - - NetworkInfo newNetworkInfo = NetworkUtils.getConnectedNetworkInfo(context); - - // When Android switches WiFI => MOBILE, sometimes we may have a short transition - // with no network: WIFI => NONE, NONE => MOBILE - // The code below attempts to make it look like a single WIFI => MOBILE - // transition, retrying up to 3 times getting the current network. - // - // Note: this can block the UI thread for up to 3s - if (networkInfo != null && newNetworkInfo == null) { - for (int i = 1; i <= 3; i++) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - return; - } - log.warning(String.format( - "%s => NONE network transition, waiting for new network... retry #%d", - networkInfo.getTypeName(), i - )); - newNetworkInfo = NetworkUtils.getConnectedNetworkInfo(context); - if (newNetworkInfo != null) - break; - } - } - - if (isSameNetworkType(networkInfo, newNetworkInfo)) { - log.info("No actual network change... ignoring event!"); - } else { - try { - onNetworkTypeChange(networkInfo, newNetworkInfo); - } catch (RouterException ex) { - handleRouterExceptionOnNetworkTypeChange(ex); - } - } - } - - protected boolean isSameNetworkType(NetworkInfo network1, NetworkInfo network2) { - if (network1 == null && network2 == null) - return true; - if (network1 == null || network2 == null) - return false; - return network1.getType() == network2.getType(); - } - - protected void displayIntentInfo(Intent intent) { - boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); - String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON); - boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); - - NetworkInfo currentNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); - NetworkInfo otherNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO); - - log.info("Connectivity change detected..."); - log.info("EXTRA_NO_CONNECTIVITY: " + noConnectivity); - log.info("EXTRA_REASON: " + reason); - log.info("EXTRA_IS_FAILOVER: " + isFailover); - log.info("EXTRA_NETWORK_INFO: " + (currentNetworkInfo == null ? "none" : currentNetworkInfo)); - log.info("EXTRA_OTHER_NETWORK_INFO: " + (otherNetworkInfo == null ? "none" : otherNetworkInfo)); - log.info("EXTRA_EXTRA_INFO: " + intent.getStringExtra(ConnectivityManager.EXTRA_EXTRA_INFO)); - } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/android/AndroidUpnpService.java b/app/src/main/java/org/fourthline/cling/android/AndroidUpnpService.java deleted file mode 100644 index 480fa62..0000000 --- a/app/src/main/java/org/fourthline/cling/android/AndroidUpnpService.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.android; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.UpnpServiceConfiguration; -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.registry.Registry; - -/** - * Interface of the Android UPnP application service component. - *

- * Usage example in an Android activity: - *

- *
{@code
- *AndroidUpnpService upnpService;
- *
- *ServiceConnection serviceConnection = new ServiceConnection() {
- *     public void onServiceConnected(ComponentName className, IBinder service) {
- *         upnpService = (AndroidUpnpService) service;
- *     }
- *     public void onServiceDisconnected(ComponentName className) {
- *         upnpService = null;
- *     }
- *};
- *
- *public void onCreate(...) {
- * ...
- *     getApplicationContext().bindService(
- *         new Intent(this, AndroidUpnpServiceImpl.class),
- *         serviceConnection,
- *         Context.BIND_AUTO_CREATE
- *     );
- *}}
- *

- * The default implementation requires permissions in AndroidManifest.xml: - *

- *
{@code
- *
- *
- *
- *
- *
- *}
- *

- * You also have to add the application service component: - *

- *
{@code
- *
- *  ...
- *  
- *
- * }
- * - * @author Christian Bauer - */ -// DOC:CLASS -public interface AndroidUpnpService { - - /** - * @return The actual main instance and interface of the UPnP service. - */ - public UpnpService get(); - - /** - * @return The configuration of the UPnP service. - */ - public UpnpServiceConfiguration getConfiguration(); - - /** - * @return The registry of the UPnP service. - */ - public Registry getRegistry(); - - /** - * @return The client API of the UPnP service. - */ - public ControlPoint getControlPoint(); - -} -// DOC:CLASS diff --git a/app/src/main/java/org/fourthline/cling/android/AndroidUpnpServiceConfiguration.java b/app/src/main/java/org/fourthline/cling/android/AndroidUpnpServiceConfiguration.java deleted file mode 100644 index 00c4c60..0000000 --- a/app/src/main/java/org/fourthline/cling/android/AndroidUpnpServiceConfiguration.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.android; - -import android.os.Build; -import org.fourthline.cling.DefaultUpnpServiceConfiguration; -import org.fourthline.cling.binding.xml.DeviceDescriptorBinder; -import org.fourthline.cling.binding.xml.RecoveringUDA10DeviceDescriptorBinderImpl; -import org.fourthline.cling.binding.xml.ServiceDescriptorBinder; -import org.fourthline.cling.binding.xml.UDA10ServiceDescriptorBinderSAXImpl; -import org.fourthline.cling.model.Namespace; -import org.fourthline.cling.model.ServerClientTokens; -import org.fourthline.cling.transport.impl.AsyncServletStreamServerConfigurationImpl; -import org.fourthline.cling.transport.impl.AsyncServletStreamServerImpl; -import org.fourthline.cling.transport.impl.RecoveringGENAEventProcessorImpl; -import org.fourthline.cling.transport.impl.RecoveringSOAPActionProcessorImpl; -import org.fourthline.cling.transport.impl.jetty.JettyServletContainer; -import org.fourthline.cling.transport.impl.jetty.StreamClientConfigurationImpl; -import org.fourthline.cling.transport.impl.jetty.StreamClientImpl; -import org.fourthline.cling.transport.spi.GENAEventProcessor; -import org.fourthline.cling.transport.spi.NetworkAddressFactory; -import org.fourthline.cling.transport.spi.SOAPActionProcessor; -import org.fourthline.cling.transport.spi.StreamClient; -import org.fourthline.cling.transport.spi.StreamServer; - -/** - * Configuration settings for deployment on Android. - *

- * This configuration utilizes the Jetty transport implementation - * found in {@link org.fourthline.cling.transport.impl.jetty} for TCP/HTTP networking, as - * client and server. The servlet context path for UPnP is set to /upnp. - *

- *

- * The kxml2 implementation of org.xmlpull is available Android, therefore - * this configuration uses {@link RecoveringUDA10DeviceDescriptorBinderImpl}, - * {@link RecoveringSOAPActionProcessorImpl}, and {@link RecoveringGENAEventProcessorImpl}. - *

- *

- * This configuration utilizes {@link UDA10ServiceDescriptorBinderSAXImpl}, the system property - * org.xml.sax.driver is set to org.xmlpull.v1.sax2.Driver. - *

- *

- * To preserve battery, the {@link org.fourthline.cling.registry.Registry} will only - * be maintained every 3 seconds. - *

- * - * @author Christian Bauer - */ -public class AndroidUpnpServiceConfiguration extends DefaultUpnpServiceConfiguration { - - public AndroidUpnpServiceConfiguration() { - this(0); // Ephemeral port - } - - public AndroidUpnpServiceConfiguration(int streamListenPort) { - super(streamListenPort, false); - - // This should be the default on Android 2.1 but it's not set by default - System.setProperty("org.xml.sax.driver", "org.xmlpull.v1.sax2.Driver"); - } - - @Override - protected NetworkAddressFactory createNetworkAddressFactory(int streamListenPort) { - return new AndroidNetworkAddressFactory(streamListenPort); - } - - @Override - protected Namespace createNamespace() { - // For the Jetty server, this is the servlet context path - return new Namespace("/upnp"); - } - - @Override - public StreamClient createStreamClient() { - // Use Jetty - return new StreamClientImpl( - new StreamClientConfigurationImpl( - getSyncProtocolExecutorService() - ) { - @Override - public String getUserAgentValue(int majorVersion, int minorVersion) { - // TODO: UPNP VIOLATION: Synology NAS requires User-Agent to contain - // "Android" to return DLNA protocolInfo required to stream to Samsung TV - // see: http://two-play.com/forums/viewtopic.php?f=6&t=81 - ServerClientTokens tokens = new ServerClientTokens(majorVersion, minorVersion); - tokens.setOsName("Android"); - tokens.setOsVersion(Build.VERSION.RELEASE); - return tokens.toString(); - } - } - ); - } - - @Override - public StreamServer createStreamServer(NetworkAddressFactory networkAddressFactory) { - // Use Jetty, start/stop a new shared instance of JettyServletContainer - return new AsyncServletStreamServerImpl( - new AsyncServletStreamServerConfigurationImpl( - JettyServletContainer.INSTANCE, - networkAddressFactory.getStreamListenPort() - ) - ); - } - - @Override - protected DeviceDescriptorBinder createDeviceDescriptorBinderUDA10() { - return new RecoveringUDA10DeviceDescriptorBinderImpl(); - } - - @Override - protected ServiceDescriptorBinder createServiceDescriptorBinderUDA10() { - return new UDA10ServiceDescriptorBinderSAXImpl(); - } - - @Override - protected SOAPActionProcessor createSOAPActionProcessor() { - return new RecoveringSOAPActionProcessorImpl(); - } - - @Override - protected GENAEventProcessor createGENAEventProcessor() { - return new RecoveringGENAEventProcessorImpl(); - } - - @Override - public int getRegistryMaintenanceIntervalMillis() { - return 3000; // Preserve battery on Android, only run every 3 seconds - } - -} diff --git a/app/src/main/java/org/fourthline/cling/android/AndroidUpnpServiceImpl.java b/app/src/main/java/org/fourthline/cling/android/AndroidUpnpServiceImpl.java deleted file mode 100644 index c49d62c..0000000 --- a/app/src/main/java/org/fourthline/cling/android/AndroidUpnpServiceImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.android; - -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.os.IBinder; -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.UpnpServiceConfiguration; -import org.fourthline.cling.UpnpServiceImpl; -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.registry.Registry; -import org.fourthline.cling.transport.Router; - -/** - * Provides a UPnP stack with Android configuration as an application service component. - *

- * Sends a search for all UPnP devices on instantiation. See the - * {@link org.fourthline.cling.android.AndroidUpnpService} interface for a usage example. - *

- *

- * Override the {@link #createRouter(org.fourthline.cling.UpnpServiceConfiguration, org.fourthline.cling.protocol.ProtocolFactory, android.content.Context)} - * and {@link #createConfiguration()} methods to customize the service. - * - * @author Christian Bauer - */ -public class AndroidUpnpServiceImpl extends Service { - - protected UpnpService upnpService; - protected Binder binder = new Binder(); - - /** - * Starts the UPnP service. - */ - @Override - public void onCreate() { - super.onCreate(); - - upnpService = new UpnpServiceImpl(createConfiguration()) { - - @Override - protected Router createRouter(ProtocolFactory protocolFactory, Registry registry) { - return AndroidUpnpServiceImpl.this.createRouter( - getConfiguration(), - protocolFactory, - AndroidUpnpServiceImpl.this - ); - } - - @Override - public synchronized void shutdown() { - // First have to remove the receiver, so Android won't complain about it leaking - // when the main UI thread exits. - ((AndroidRouter)getRouter()).unregisterBroadcastReceiver(); - - // Now we can concurrently run the Cling shutdown code, without occupying the - // Android main UI thread. This will complete probably after the main UI thread - // is done. - super.shutdown(true); - } - }; - } - - protected UpnpServiceConfiguration createConfiguration() { - return new AndroidUpnpServiceConfiguration(); - } - - protected AndroidRouter createRouter(UpnpServiceConfiguration configuration, - ProtocolFactory protocolFactory, - Context context) { - return new AndroidRouter(configuration, protocolFactory, context); - } - - @Override - public IBinder onBind(Intent intent) { - return binder; - } - - /** - * Stops the UPnP service, when the last Activity unbinds from this Service. - */ - @Override - public void onDestroy() { - upnpService.shutdown(); - super.onDestroy(); - } - - protected class Binder extends android.os.Binder implements AndroidUpnpService { - - public UpnpService get() { - return upnpService; - } - - public UpnpServiceConfiguration getConfiguration() { - return upnpService.getConfiguration(); - } - - public Registry getRegistry() { - return upnpService.getRegistry(); - } - - public ControlPoint getControlPoint() { - return upnpService.getControlPoint(); - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/android/NetworkUtils.java b/app/src/main/java/org/fourthline/cling/android/NetworkUtils.java deleted file mode 100644 index fff8159..0000000 --- a/app/src/main/java/org/fourthline/cling/android/NetworkUtils.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.android; - -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import org.fourthline.cling.model.ModelUtil; - -import java.util.logging.Logger; - -/** - * Android network helpers. - * - * @author Michael Pujos - */ -public class NetworkUtils { - - final private static Logger log = Logger.getLogger(NetworkUtils.class.getName()); - - private final static int CONNECTIVITY_TYPE_WIMAX = 6; // Since API 8 - private final static int CONNECTIVITY_TYPE_ETHERNET = 9; // Since API 13 - - static public NetworkInfo getConnectedNetworkInfo(Context context) { - - ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - - NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); - if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) { - return networkInfo; - } - - networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); - if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) return networkInfo; - - networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); - if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) return networkInfo; - - networkInfo = connectivityManager.getNetworkInfo(CONNECTIVITY_TYPE_WIMAX); - if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) return networkInfo; - - networkInfo = connectivityManager.getNetworkInfo(CONNECTIVITY_TYPE_ETHERNET); - if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) return networkInfo; - - log.info("Could not find any connected network..."); - - return null; - } - - static public boolean isEthernet(NetworkInfo networkInfo) { - return isNetworkType(networkInfo, CONNECTIVITY_TYPE_ETHERNET); - } - - static public boolean isWifi(NetworkInfo networkInfo) { - return isNetworkType(networkInfo, ConnectivityManager.TYPE_WIFI) || ModelUtil.ANDROID_EMULATOR; - } - - static public boolean isMobile(NetworkInfo networkInfo) { - return isNetworkType(networkInfo, ConnectivityManager.TYPE_MOBILE) || isNetworkType(networkInfo, CONNECTIVITY_TYPE_WIMAX); - } - - static public boolean isNetworkType(NetworkInfo networkInfo, int type) { - return networkInfo != null && networkInfo.getType() == type; - } - - static public boolean isSSDPAwareNetwork(NetworkInfo networkInfo) { - return isWifi(networkInfo) || isEthernet(networkInfo); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/binding/AllowedValueProvider.java b/app/src/main/java/org/fourthline/cling/binding/AllowedValueProvider.java deleted file mode 100644 index e1d42ca..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/AllowedValueProvider.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding; - -/** - * @author Christian Bauer - */ -public interface AllowedValueProvider { - - public String[] getValues(); - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/AllowedValueRangeProvider.java b/app/src/main/java/org/fourthline/cling/binding/AllowedValueRangeProvider.java deleted file mode 100644 index c8ebe66..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/AllowedValueRangeProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding; - -/** - * @author Christian Bauer - */ -public interface AllowedValueRangeProvider { - - public long getMinimum(); - public long getMaximum(); - public long getStep(); - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/LocalServiceBinder.java b/app/src/main/java/org/fourthline/cling/binding/LocalServiceBinder.java deleted file mode 100644 index 226cf14..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/LocalServiceBinder.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding; - -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.ServiceType; - -/** - * Reads {@link org.fourthline.cling.model.meta.LocalService} metadata given a Java class. - * - * @author Christian Bauer - */ -public interface LocalServiceBinder { - - /** - * @param clazz The Java class that is the source of the service metadata. - * @return The produced metadata. - * @throws LocalServiceBindingException If binding failed. - */ - public LocalService read(Class clazz) throws LocalServiceBindingException; - - /** - * - * @param clazz The Java class that is the source of the service metadata. - * @param id The pre-defined identifier of the service. - * @param type The pre-defined type of the service. - * @param supportsQueryStateVariables true if the service should support the - * deprecated "query any state variable value" action. - * @param stringConvertibleTypes A list of Java classes which map directly to string-typed - * UPnP state variables. - * @return The produced metadata. - * @throws LocalServiceBindingException If binding failed. - */ - public LocalService read(Class clazz, ServiceId id, ServiceType type, - boolean supportsQueryStateVariables, Class[] stringConvertibleTypes) throws LocalServiceBindingException; -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/binding/LocalServiceBindingException.java b/app/src/main/java/org/fourthline/cling/binding/LocalServiceBindingException.java deleted file mode 100644 index 6cf2dc1..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/LocalServiceBindingException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding; - -/** - * Thrown when reading/writing {@link org.fourthline.cling.model.meta.LocalService} metadata failed. - * - * @author Christian Bauer - */ -public class LocalServiceBindingException extends RuntimeException { - - public LocalServiceBindingException(String s) { - super(s); - } - - public LocalServiceBindingException(String s, Throwable throwable) { - super(s, throwable); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationActionBinder.java b/app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationActionBinder.java deleted file mode 100644 index 84a361a..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationActionBinder.java +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.annotations; - -import org.fourthline.cling.binding.LocalServiceBindingException; -import org.fourthline.cling.model.Constants; -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.action.ActionExecutor; -import org.fourthline.cling.model.action.MethodActionExecutor; -import org.fourthline.cling.model.meta.Action; -import org.fourthline.cling.model.meta.ActionArgument; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.profile.RemoteClientInfo; -import org.fourthline.cling.model.state.GetterStateVariableAccessor; -import org.fourthline.cling.model.state.StateVariableAccessor; -import org.fourthline.cling.model.types.Datatype; -import org.seamless.util.Reflections; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.logging.Logger; - -/** - * @author Christian Bauer - */ -public class AnnotationActionBinder { - - private static Logger log = Logger.getLogger(AnnotationLocalServiceBinder.class.getName()); - - protected UpnpAction annotation; - protected Method method; - protected Map stateVariables; - protected Set stringConvertibleTypes; - - public AnnotationActionBinder(Method method, Map stateVariables, Set stringConvertibleTypes) { - this.annotation = method.getAnnotation(UpnpAction.class); - this.stateVariables = stateVariables; - this.method = method; - this.stringConvertibleTypes = stringConvertibleTypes; - } - - public UpnpAction getAnnotation() { - return annotation; - } - - public Map getStateVariables() { - return stateVariables; - } - - public Method getMethod() { - return method; - } - - public Set getStringConvertibleTypes() { - return stringConvertibleTypes; - } - - public Action appendAction(Map actions) throws LocalServiceBindingException { - - String name; - if (getAnnotation().name().length() != 0) { - name = getAnnotation().name(); - } else { - name = AnnotationLocalServiceBinder.toUpnpActionName(getMethod().getName()); - } - - log.fine("Creating action and executor: " + name); - - List inputArguments = createInputArguments(); - Map, StateVariableAccessor> outputArguments = createOutputArguments(); - - inputArguments.addAll(outputArguments.keySet()); - ActionArgument[] actionArguments = - inputArguments.toArray(new ActionArgument[inputArguments.size()]); - - Action action = new Action(name, actionArguments); - ActionExecutor executor = createExecutor(outputArguments); - - actions.put(action, executor); - return action; - } - - protected ActionExecutor createExecutor(Map, StateVariableAccessor> outputArguments) { - // TODO: Invent an annotation for this configuration - return new MethodActionExecutor(outputArguments, getMethod()); - } - - protected List createInputArguments() throws LocalServiceBindingException { - - List list = new ArrayList(); - - // Input arguments are always method parameters - int annotatedParams = 0; - Annotation[][] params = getMethod().getParameterAnnotations(); - for (int i = 0; i < params.length; i++) { - Annotation[] param = params[i]; - for (Annotation paramAnnotation : param) { - if (paramAnnotation instanceof UpnpInputArgument) { - UpnpInputArgument inputArgumentAnnotation = (UpnpInputArgument) paramAnnotation; - annotatedParams++; - - String argumentName = - inputArgumentAnnotation.name(); - - StateVariable stateVariable = - findRelatedStateVariable( - inputArgumentAnnotation.stateVariable(), - argumentName, - getMethod().getName() - ); - - if (stateVariable == null) { - throw new LocalServiceBindingException( - "Could not detected related state variable of argument: " + argumentName - ); - } - - validateType(stateVariable, getMethod().getParameterTypes()[i]); - - ActionArgument inputArgument = new ActionArgument( - argumentName, - inputArgumentAnnotation.aliases(), - stateVariable.getName(), - ActionArgument.Direction.IN - ); - - list.add(inputArgument); - } - } - } - // A method can't have any parameters that are not annotated with @UpnpInputArgument - we wouldn't know what - // value to pass when we invoke it later on... unless the last parameter is of type RemoteClientInfo - if (annotatedParams < getMethod().getParameterTypes().length - && !RemoteClientInfo.class.isAssignableFrom(method.getParameterTypes()[method.getParameterTypes().length-1])) { - throw new LocalServiceBindingException("Method has parameters that are not input arguments: " + getMethod().getName()); - } - - return list; - } - - protected Map, StateVariableAccessor> createOutputArguments() throws LocalServiceBindingException { - - Map, StateVariableAccessor> map = new LinkedHashMap(); // !!! Insertion order! - - UpnpAction actionAnnotation = getMethod().getAnnotation(UpnpAction.class); - if (actionAnnotation.out().length == 0) return map; - - boolean hasMultipleOutputArguments = actionAnnotation.out().length > 1; - - for (UpnpOutputArgument outputArgumentAnnotation : actionAnnotation.out()) { - - String argumentName = outputArgumentAnnotation.name(); - - StateVariable stateVariable = findRelatedStateVariable( - outputArgumentAnnotation.stateVariable(), - argumentName, - getMethod().getName() - ); - - // Might-just-work attempt, try the name of the getter - if (stateVariable == null && outputArgumentAnnotation.getterName().length() > 0) { - stateVariable = findRelatedStateVariable(null, null, outputArgumentAnnotation.getterName()); - } - - if (stateVariable == null) { - throw new LocalServiceBindingException( - "Related state variable not found for output argument: " + argumentName - ); - } - - StateVariableAccessor accessor = findOutputArgumentAccessor( - stateVariable, - outputArgumentAnnotation.getterName(), - hasMultipleOutputArguments - ); - - log.finer("Found related state variable for output argument '" + argumentName + "': " + stateVariable); - - ActionArgument outputArgument = new ActionArgument( - argumentName, - stateVariable.getName(), - ActionArgument.Direction.OUT, - !hasMultipleOutputArguments - ); - - map.put(outputArgument, accessor); - } - - return map; - } - - protected StateVariableAccessor findOutputArgumentAccessor(StateVariable stateVariable, String getterName, boolean multipleArguments) - throws LocalServiceBindingException { - - boolean isVoid = getMethod().getReturnType().equals(Void.TYPE); - - if (isVoid) { - - if (getterName != null && getterName.length() > 0) { - log.finer("Action method is void, will use getter method named: " + getterName); - - // Use the same class as the action method - Method getter = Reflections.getMethod(getMethod().getDeclaringClass(), getterName); - if (getter == null) - throw new LocalServiceBindingException( - "Declared getter method '" + getterName + "' not found on: " + getMethod().getDeclaringClass() - ); - - validateType(stateVariable, getter.getReturnType()); - - return new GetterStateVariableAccessor(getter); - - } else { - log.finer("Action method is void, trying to find existing accessor of related: " + stateVariable); - return getStateVariables().get(stateVariable); - } - - - } else if (getterName != null && getterName.length() > 0) { - log.finer("Action method is not void, will use getter method on returned instance: " + getterName); - - // Use the returned class - Method getter = Reflections.getMethod(getMethod().getReturnType(), getterName); - if (getter == null) - throw new LocalServiceBindingException( - "Declared getter method '" + getterName + "' not found on return type: " + getMethod().getReturnType() - ); - - validateType(stateVariable, getter.getReturnType()); - - return new GetterStateVariableAccessor(getter); - - } else if (!multipleArguments) { - log.finer("Action method is not void, will use the returned instance: " + getMethod().getReturnType()); - validateType(stateVariable, getMethod().getReturnType()); - } - - return null; - } - - protected StateVariable findRelatedStateVariable(String declaredName, String argumentName, String methodName) - throws LocalServiceBindingException { - - StateVariable relatedStateVariable = null; - - if (declaredName != null && declaredName.length() > 0) { - String actualName = AnnotationLocalServiceBinder.toUpnpStateVariableName(declaredName); - log.finer("Finding related state variable with declared name: " + actualName); - relatedStateVariable = getStateVariable(actualName); - } - - if (relatedStateVariable == null && argumentName != null && argumentName.length() > 0) { - log.finer("Finding related state variable with argument name: " + argumentName); - relatedStateVariable = getStateVariable(argumentName); - } - - if (relatedStateVariable == null && argumentName != null && argumentName.length() > 0) { - // Try with A_ARG_TYPE prefix - String actualName = Constants.ARG_TYPE_PREFIX + argumentName; - log.finer("Finding related state variable with prefixed argument name: " + actualName); - relatedStateVariable = getStateVariable(actualName); - } - - if (relatedStateVariable == null && methodName != null && methodName.length() > 0) { - // TODO: Well, this is often a nice shortcut but sometimes might have false positives - String methodPropertyName = Reflections.getMethodPropertyName(methodName); - if (methodPropertyName != null) { - log.finer("Finding related state varible with method property name: " + methodPropertyName); - relatedStateVariable = - getStateVariable( - AnnotationLocalServiceBinder.toUpnpStateVariableName(methodPropertyName) - ); - } - } - - return relatedStateVariable; - } - - protected void validateType(StateVariable stateVariable, Class type) throws LocalServiceBindingException { - - // Validate datatype as good as we can - // (for enums and other convertible types, the state variable type should be STRING) - - Datatype.Default expectedDefaultMapping = - ModelUtil.isStringConvertibleType(getStringConvertibleTypes(), type) - ? Datatype.Default.STRING - : Datatype.Default.getByJavaType(type); - - log.finer("Expecting '" + stateVariable + "' to match default mapping: " + expectedDefaultMapping); - - if (expectedDefaultMapping != null && - !stateVariable.getTypeDetails().getDatatype().isHandlingJavaType(expectedDefaultMapping.getJavaType())) { - - // TODO: Consider custom types?! - throw new LocalServiceBindingException( - "State variable '" + stateVariable + "' datatype can't handle action " + - "argument's Java type (change one): " + expectedDefaultMapping.getJavaType() - ); - - } else if (expectedDefaultMapping == null && stateVariable.getTypeDetails().getDatatype().getBuiltin() != null) { - throw new LocalServiceBindingException( - "State variable '" + stateVariable + "' should be custom datatype " + - "(action argument type is unknown Java type): " + type.getSimpleName() - ); - } - - log.finer("State variable matches required argument datatype (or can't be validated because it is custom)"); - } - - protected StateVariable getStateVariable(String name) { - for (StateVariable stateVariable : getStateVariables().keySet()) { - if (stateVariable.getName().equals(name)) { - return stateVariable; - } - } - return null; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationLocalServiceBinder.java b/app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationLocalServiceBinder.java deleted file mode 100644 index ccd29c2..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationLocalServiceBinder.java +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.annotations; - -import org.fourthline.cling.binding.LocalServiceBinder; -import org.fourthline.cling.binding.LocalServiceBindingException; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.action.ActionExecutor; -import org.fourthline.cling.model.action.QueryStateVariableExecutor; -import org.fourthline.cling.model.meta.Action; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.meta.QueryStateVariableAction; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.state.FieldStateVariableAccessor; -import org.fourthline.cling.model.state.GetterStateVariableAccessor; -import org.fourthline.cling.model.state.StateVariableAccessor; -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDAServiceId; -import org.fourthline.cling.model.types.UDAServiceType; -import org.fourthline.cling.model.types.csv.CSV; -import org.seamless.util.Reflections; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.net.URI; -import java.net.URL; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.Locale; -import java.util.logging.Logger; - -/** - * Reads {@link org.fourthline.cling.model.meta.LocalService} metadata from annotations. - * - * @author Christian Bauer - */ -public class AnnotationLocalServiceBinder implements LocalServiceBinder { - - private static Logger log = Logger.getLogger(AnnotationLocalServiceBinder.class.getName()); - - public LocalService read(Class clazz) throws LocalServiceBindingException { - log.fine("Reading and binding annotations of service implementation class: " + clazz); - - // Read the service ID and service type from the annotation - if (clazz.isAnnotationPresent(UpnpService.class)) { - - UpnpService annotation = clazz.getAnnotation(UpnpService.class); - UpnpServiceId idAnnotation = annotation.serviceId(); - UpnpServiceType typeAnnotation = annotation.serviceType(); - - ServiceId serviceId = idAnnotation.namespace().equals(UDAServiceId.DEFAULT_NAMESPACE) - ? new UDAServiceId(idAnnotation.value()) - : new ServiceId(idAnnotation.namespace(), idAnnotation.value()); - - ServiceType serviceType = typeAnnotation.namespace().equals(UDAServiceType.DEFAULT_NAMESPACE) - ? new UDAServiceType(typeAnnotation.value(), typeAnnotation.version()) - : new ServiceType(typeAnnotation.namespace(), typeAnnotation.value(), typeAnnotation.version()); - - boolean supportsQueryStateVariables = annotation.supportsQueryStateVariables(); - - Set stringConvertibleTypes = readStringConvertibleTypes(annotation.stringConvertibleTypes()); - - return read(clazz, serviceId, serviceType, supportsQueryStateVariables, stringConvertibleTypes); - } else { - throw new LocalServiceBindingException("Given class is not an @UpnpService"); - } - } - - public LocalService read(Class clazz, ServiceId id, ServiceType type, - boolean supportsQueryStateVariables, Class[] stringConvertibleTypes) throws LocalServiceBindingException { - return read(clazz, id, type, supportsQueryStateVariables, new HashSet(Arrays.asList(stringConvertibleTypes))); - } - - public LocalService read(Class clazz, ServiceId id, ServiceType type, - boolean supportsQueryStateVariables, Set stringConvertibleTypes) - throws LocalServiceBindingException { - - Map stateVariables = readStateVariables(clazz, stringConvertibleTypes); - Map actions = readActions(clazz, stateVariables, stringConvertibleTypes); - - // Special treatment of the state variable querying action - if (supportsQueryStateVariables) { - actions.put(new QueryStateVariableAction(), new QueryStateVariableExecutor()); - } - - try { - return new LocalService(type, id, actions, stateVariables, stringConvertibleTypes, supportsQueryStateVariables); - - } catch (ValidationException ex) { - log.severe("Could not validate device model: " + ex.toString()); - for (ValidationError validationError : ex.getErrors()) { - log.severe(validationError.toString()); - } - throw new LocalServiceBindingException("Validation of model failed, check the log"); - } - } - - protected Set readStringConvertibleTypes(Class[] declaredTypes) throws LocalServiceBindingException { - - for (Class stringConvertibleType : declaredTypes) { - if (!Modifier.isPublic(stringConvertibleType.getModifiers())) { - throw new LocalServiceBindingException( - "Declared string-convertible type must be public: " + stringConvertibleType - ); - } - try { - stringConvertibleType.getConstructor(String.class); - } catch (NoSuchMethodException ex) { - throw new LocalServiceBindingException( - "Declared string-convertible type needs a public single-argument String constructor: " + stringConvertibleType - ); - } - } - Set stringConvertibleTypes = new HashSet(Arrays.asList(declaredTypes)); - - // Some defaults - stringConvertibleTypes.add(URI.class); - stringConvertibleTypes.add(URL.class); - stringConvertibleTypes.add(CSV.class); - - return stringConvertibleTypes; - } - - protected Map readStateVariables(Class clazz, Set stringConvertibleTypes) - throws LocalServiceBindingException { - - Map map = new HashMap(); - - // State variables declared on the class - if (clazz.isAnnotationPresent(UpnpStateVariables.class)) { - UpnpStateVariables variables = clazz.getAnnotation(UpnpStateVariables.class); - for (UpnpStateVariable v : variables.value()) { - - if (v.name().length() == 0) - throw new LocalServiceBindingException("Class-level @UpnpStateVariable name attribute value required"); - - String javaPropertyName = toJavaStateVariableName(v.name()); - - Method getter = Reflections.getGetterMethod(clazz, javaPropertyName); - Field field = Reflections.getField(clazz, javaPropertyName); - - StateVariableAccessor accessor = null; - if (getter != null && field != null) { - accessor = variables.preferFields() ? - new FieldStateVariableAccessor(field) - : new GetterStateVariableAccessor(getter); - } else if (field != null) { - accessor = new FieldStateVariableAccessor(field); - } else if (getter != null) { - accessor = new GetterStateVariableAccessor(getter); - } else { - log.finer("No field or getter found for state variable, skipping accessor: " + v.name()); - } - - StateVariable stateVar = - new AnnotationStateVariableBinder(v, v.name(), accessor, stringConvertibleTypes) - .createStateVariable(); - - map.put(stateVar, accessor); - } - } - - // State variables declared on fields - for (Field field : Reflections.getFields(clazz, UpnpStateVariable.class)) { - - UpnpStateVariable svAnnotation = field.getAnnotation(UpnpStateVariable.class); - - StateVariableAccessor accessor = new FieldStateVariableAccessor(field); - - StateVariable stateVar = new AnnotationStateVariableBinder( - svAnnotation, - svAnnotation.name().length() == 0 - ? toUpnpStateVariableName(field.getName()) - : svAnnotation.name(), - accessor, - stringConvertibleTypes - ).createStateVariable(); - - map.put(stateVar, accessor); - } - - // State variables declared on getters - for (Method getter : Reflections.getMethods(clazz, UpnpStateVariable.class)) { - - String propertyName = Reflections.getMethodPropertyName(getter.getName()); - if (propertyName == null) { - throw new LocalServiceBindingException( - "Annotated method is not a getter method (: " + getter - ); - } - - if (getter.getParameterTypes().length > 0) - throw new LocalServiceBindingException( - "Getter method defined as @UpnpStateVariable can not have parameters: " + getter - ); - - UpnpStateVariable svAnnotation = getter.getAnnotation(UpnpStateVariable.class); - - StateVariableAccessor accessor = new GetterStateVariableAccessor(getter); - - StateVariable stateVar = new AnnotationStateVariableBinder( - svAnnotation, - svAnnotation.name().length() == 0 - ? - toUpnpStateVariableName(propertyName) - : svAnnotation.name(), - accessor, - stringConvertibleTypes - ).createStateVariable(); - - map.put(stateVar, accessor); - } - - return map; - } - - protected Map readActions(Class clazz, - Map stateVariables, - Set stringConvertibleTypes) - throws LocalServiceBindingException { - - Map map = new HashMap(); - - for (Method method : Reflections.getMethods(clazz, UpnpAction.class)) { - AnnotationActionBinder actionBinder = - new AnnotationActionBinder(method, stateVariables, stringConvertibleTypes); - Action action = actionBinder.appendAction(map); - if(isActionExcluded(action)) { - map.remove(action); - } - } - - return map; - } - - /** - * Override this method to exclude action/methods after they have been discovered. - */ - protected boolean isActionExcluded(Action action) { - return false; - } - - // TODO: I don't like the exceptions much, user has no idea what to do - - static String toUpnpStateVariableName(String javaName) { - if (javaName.length() < 1) { - throw new IllegalArgumentException("Variable name must be at least 1 character long"); - } - return javaName.substring(0, 1).toUpperCase(Locale.ENGLISH) + javaName.substring(1); - } - - static String toJavaStateVariableName(String upnpName) { - if (upnpName.length() < 1) { - throw new IllegalArgumentException("Variable name must be at least 1 character long"); - } - return upnpName.substring(0, 1).toLowerCase(Locale.ENGLISH) + upnpName.substring(1); - } - - - static String toUpnpActionName(String javaName) { - if (javaName.length() < 1) { - throw new IllegalArgumentException("Action name must be at least 1 character long"); - } - return javaName.substring(0, 1).toUpperCase(Locale.ENGLISH) + javaName.substring(1); - } - - static String toJavaActionName(String upnpName) { - if (upnpName.length() < 1) { - throw new IllegalArgumentException("Variable name must be at least 1 character long"); - } - return upnpName.substring(0, 1).toLowerCase(Locale.ENGLISH) + upnpName.substring(1); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationStateVariableBinder.java b/app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationStateVariableBinder.java deleted file mode 100644 index 5b57a5b..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/annotations/AnnotationStateVariableBinder.java +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.annotations; - -import org.fourthline.cling.binding.AllowedValueProvider; -import org.fourthline.cling.binding.AllowedValueRangeProvider; -import org.fourthline.cling.binding.LocalServiceBindingException; -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.meta.StateVariableAllowedValueRange; -import org.fourthline.cling.model.meta.StateVariableEventDetails; -import org.fourthline.cling.model.meta.StateVariableTypeDetails; -import org.fourthline.cling.model.state.StateVariableAccessor; -import org.fourthline.cling.model.types.Datatype; - -import java.util.Set; -import java.util.logging.Logger; - -/** - * @author Christian Bauer - */ -public class AnnotationStateVariableBinder { - - private static Logger log = Logger.getLogger(AnnotationLocalServiceBinder.class.getName()); - - protected UpnpStateVariable annotation; - protected String name; - protected StateVariableAccessor accessor; - protected Set stringConvertibleTypes; - - public AnnotationStateVariableBinder(UpnpStateVariable annotation, String name, - StateVariableAccessor accessor, Set stringConvertibleTypes) { - this.annotation = annotation; - this.name = name; - this.accessor = accessor; - this.stringConvertibleTypes = stringConvertibleTypes; - } - - public UpnpStateVariable getAnnotation() { - return annotation; - } - - public String getName() { - return name; - } - - public StateVariableAccessor getAccessor() { - return accessor; - } - - public Set getStringConvertibleTypes() { - return stringConvertibleTypes; - } - - protected StateVariable createStateVariable() throws LocalServiceBindingException { - - log.fine("Creating state variable '" + getName() + "' with accessor: " + getAccessor()); - - // Datatype - Datatype datatype = createDatatype(); - - // Default value - String defaultValue = createDefaultValue(datatype); - - // Allowed values - String[] allowedValues = null; - if (Datatype.Builtin.STRING.equals(datatype.getBuiltin())) { - - if (getAnnotation().allowedValueProvider() != void.class) { - allowedValues = getAllowedValuesFromProvider(); - } else if (getAnnotation().allowedValues().length > 0) { - allowedValues = getAnnotation().allowedValues(); - } else if (getAnnotation().allowedValuesEnum() != void.class) { - allowedValues = getAllowedValues(getAnnotation().allowedValuesEnum()); - } else if (getAccessor() != null && getAccessor().getReturnType().isEnum()) { - allowedValues = getAllowedValues(getAccessor().getReturnType()); - } else { - log.finer("Not restricting allowed values (of string typed state var): " + getName()); - } - - if (allowedValues != null && defaultValue != null) { - - // Check if the default value is an allowed value - boolean foundValue = false; - for (String s : allowedValues) { - if (s.equals(defaultValue)) { - foundValue = true; - break; - } - } - if (!foundValue) { - throw new LocalServiceBindingException( - "Default value '" + defaultValue + "' is not in allowed values of: " + getName() - ); - } - } - } - - // Allowed value range - StateVariableAllowedValueRange allowedValueRange = null; - if (Datatype.Builtin.isNumeric(datatype.getBuiltin())) { - - if (getAnnotation().allowedValueRangeProvider() != void.class) { - allowedValueRange = getAllowedRangeFromProvider(); - } else if (getAnnotation().allowedValueMinimum() > 0 || getAnnotation().allowedValueMaximum() > 0) { - allowedValueRange = getAllowedValueRange( - getAnnotation().allowedValueMinimum(), - getAnnotation().allowedValueMaximum(), - getAnnotation().allowedValueStep() - ); - } else { - log.finer("Not restricting allowed value range (of numeric typed state var): " + getName()); - } - - // Check if the default value is an allowed value - if (defaultValue != null && allowedValueRange != null) { - - long v; - try { - v = Long.valueOf(defaultValue); - } catch (Exception ex) { - throw new LocalServiceBindingException( - "Default value '" + defaultValue + "' is not numeric (for range checking) of: " + getName() - ); - } - - if (!allowedValueRange.isInRange(v)) { - throw new LocalServiceBindingException( - "Default value '" + defaultValue + "' is not in allowed range of: " + getName() - ); - } - } - } - - // Event details - boolean sendEvents = getAnnotation().sendEvents(); - if (sendEvents && getAccessor() == null) { - throw new LocalServiceBindingException( - "State variable sends events but has no accessor for field or getter: " + getName() - ); - } - - int eventMaximumRateMillis = 0; - int eventMinimumDelta = 0; - if (sendEvents) { - if (getAnnotation().eventMaximumRateMilliseconds() > 0) { - log.finer("Moderating state variable events using maximum rate (milliseconds): " + getAnnotation().eventMaximumRateMilliseconds()); - eventMaximumRateMillis = getAnnotation().eventMaximumRateMilliseconds(); - } - - if (getAnnotation().eventMinimumDelta() > 0 && Datatype.Builtin.isNumeric(datatype.getBuiltin())) { - // TODO: Doesn't consider floating point types! - log.finer("Moderating state variable events using minimum delta: " + getAnnotation().eventMinimumDelta()); - eventMinimumDelta = getAnnotation().eventMinimumDelta(); - } - } - - StateVariableTypeDetails typeDetails = - new StateVariableTypeDetails(datatype, defaultValue, allowedValues, allowedValueRange); - - StateVariableEventDetails eventDetails = - new StateVariableEventDetails(sendEvents, eventMaximumRateMillis, eventMinimumDelta); - - return new StateVariable(getName(), typeDetails, eventDetails); - } - - protected Datatype createDatatype() throws LocalServiceBindingException { - - String declaredDatatype = getAnnotation().datatype(); - - if (declaredDatatype.length() == 0 && getAccessor() != null) { - Class returnType = getAccessor().getReturnType(); - log.finer("Using accessor return type as state variable type: " + returnType); - - if (ModelUtil.isStringConvertibleType(getStringConvertibleTypes(), returnType)) { - // Enums and toString() convertible types are always state variables with type STRING - log.finer("Return type is string-convertible, using string datatype"); - return Datatype.Default.STRING.getBuiltinType().getDatatype(); - } else { - Datatype.Default defaultDatatype = Datatype.Default.getByJavaType(returnType); - if (defaultDatatype != null) { - log.finer("Return type has default UPnP datatype: " + defaultDatatype); - return defaultDatatype.getBuiltinType().getDatatype(); - } - } - } - - // We can also guess that if the allowed values are set then it's a string - if ((declaredDatatype == null || declaredDatatype.length() == 0) && - (getAnnotation().allowedValues().length > 0 || getAnnotation().allowedValuesEnum() != void.class)) { - log.finer("State variable has restricted allowed values, hence using 'string' datatype"); - declaredDatatype = "string"; - } - - // If we still don't have it, there is nothing more we can do - if (declaredDatatype == null || declaredDatatype.length() == 0) { - throw new LocalServiceBindingException("Could not detect datatype of state variable: " + getName()); - } - - log.finer("Trying to find built-in UPnP datatype for detected name: " + declaredDatatype); - - // Now try to find the actual UPnP datatype by mapping the Default to Builtin - Datatype.Builtin builtin = Datatype.Builtin.getByDescriptorName(declaredDatatype); - if (builtin != null) { - log.finer("Found built-in UPnP datatype: " + builtin); - return builtin.getDatatype(); - } else { - // TODO - throw new LocalServiceBindingException("No built-in UPnP datatype found, using CustomDataType (TODO: NOT IMPLEMENTED)"); - } - } - - protected String createDefaultValue(Datatype datatype) throws LocalServiceBindingException { - - // Next, the default value of the state variable, first the declared one - if (getAnnotation().defaultValue().length() != 0) { - // The declared default value needs to match the datatype - try { - datatype.valueOf(getAnnotation().defaultValue()); - log.finer("Found state variable default value: " + getAnnotation().defaultValue()); - return getAnnotation().defaultValue(); - } catch (Exception ex) { - throw new LocalServiceBindingException( - "Default value doesn't match datatype of state variable '" + getName() + "': " + ex.getMessage() - ); - } - } - - return null; - } - - protected String[] getAllowedValues(Class enumType) throws LocalServiceBindingException { - - if (!enumType.isEnum()) { - throw new LocalServiceBindingException("Allowed values type is not an Enum: " + enumType); - } - - log.finer("Restricting allowed values of state variable to Enum: " + getName()); - String[] allowedValueStrings = new String[enumType.getEnumConstants().length]; - for (int i = 0; i < enumType.getEnumConstants().length; i++) { - Object o = enumType.getEnumConstants()[i]; - if (o.toString().length() > 32) { - throw new LocalServiceBindingException( - "Allowed value string (that is, Enum constant name) is longer than 32 characters: " + o.toString() - ); - } - log.finer("Adding allowed value (converted to string): " + o.toString()); - allowedValueStrings[i] = o.toString(); - } - - return allowedValueStrings; - } - - protected StateVariableAllowedValueRange getAllowedValueRange(long min, - long max, - long step) throws LocalServiceBindingException { - if (max < min) { - throw new LocalServiceBindingException( - "Allowed value range maximum is smaller than minimum: " + getName() - ); - } - - return new StateVariableAllowedValueRange(min, max, step); - } - - protected String[] getAllowedValuesFromProvider() throws LocalServiceBindingException { - Class provider = getAnnotation().allowedValueProvider(); - if (!AllowedValueProvider.class.isAssignableFrom(provider)) - throw new LocalServiceBindingException( - "Allowed value provider is not of type " + AllowedValueProvider.class + ": " + getName() - ); - try { - return ((Class) provider).newInstance().getValues(); - } catch (Exception ex) { - throw new LocalServiceBindingException( - "Allowed value provider can't be instantiated: " + getName(), ex - ); - } - } - - protected StateVariableAllowedValueRange getAllowedRangeFromProvider() throws LocalServiceBindingException { - Class provider = getAnnotation().allowedValueRangeProvider(); - if (!AllowedValueRangeProvider.class.isAssignableFrom(provider)) - throw new LocalServiceBindingException( - "Allowed value range provider is not of type " + AllowedValueRangeProvider.class + ": " + getName() - ); - try { - AllowedValueRangeProvider providerInstance = - ((Class) provider).newInstance(); - return getAllowedValueRange( - providerInstance.getMinimum(), - providerInstance.getMaximum(), - providerInstance.getStep() - ); - } catch (Exception ex) { - throw new LocalServiceBindingException( - "Allowed value range provider can't be instantiated: " + getName(), ex - ); - } - } - - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpAction.java b/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpAction.java deleted file mode 100644 index c36b9a5..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpAction.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - - -@Target({ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface UpnpAction { - - String name() default ""; - UpnpOutputArgument[] out() default {}; -} diff --git a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpInputArgument.java b/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpInputArgument.java deleted file mode 100644 index b08fe13..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpInputArgument.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.annotations; - -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Retention; -import java.lang.annotation.ElementType; -import java.lang.annotation.Target; - - -@Target({ElementType.PARAMETER}) -@Retention(RetentionPolicy.RUNTIME) -public @interface UpnpInputArgument { - - String name(); - String[] aliases() default {}; - String stateVariable() default ""; -} diff --git a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpOutputArgument.java b/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpOutputArgument.java deleted file mode 100644 index 62653c4..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpOutputArgument.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.annotations; - -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Retention; -import java.lang.annotation.ElementType; -import java.lang.annotation.Target; - - -@Target({ElementType.PARAMETER}) -@Retention(RetentionPolicy.RUNTIME) -public @interface UpnpOutputArgument { - - String name(); - String stateVariable() default ""; - String getterName() default ""; - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpService.java b/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpService.java deleted file mode 100644 index e92047c..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpService.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - - -@Target({ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -@Inherited -public @interface UpnpService { - - UpnpServiceId serviceId(); - UpnpServiceType serviceType(); - - boolean supportsQueryStateVariables() default true; - Class[] stringConvertibleTypes() default {}; -} diff --git a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpServiceId.java b/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpServiceId.java deleted file mode 100644 index 46ffa6e..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpServiceId.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.annotations; - -import org.fourthline.cling.model.types.UDAServiceId; - -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - - -@Target({}) -@Retention(RetentionPolicy.RUNTIME) -public @interface UpnpServiceId { - - String namespace() default UDAServiceId.DEFAULT_NAMESPACE; - String value(); -} diff --git a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpServiceType.java b/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpServiceType.java deleted file mode 100644 index 0351f2b..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpServiceType.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.annotations; - -import org.fourthline.cling.model.types.UDAServiceType; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - - -@Target({}) -@Retention(RetentionPolicy.RUNTIME) -public @interface UpnpServiceType { - - String namespace() default UDAServiceType.DEFAULT_NAMESPACE; - String value(); - int version() default 1; -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpStateVariable.java b/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpStateVariable.java deleted file mode 100644 index 5891d52..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpStateVariable.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - - -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface UpnpStateVariable { - - String name() default ""; - String datatype() default ""; - - String defaultValue() default ""; - - // String types - String[] allowedValues() default {}; - Class allowedValuesEnum() default void.class; - - // Numeric types - long allowedValueMinimum() default 0; - long allowedValueMaximum() default 0; - long allowedValueStep() default 1; - - // Dynamic - Class allowedValueProvider() default void.class; - Class allowedValueRangeProvider() default void.class; - - boolean sendEvents() default true; - int eventMaximumRateMilliseconds() default 0; - int eventMinimumDelta() default 0; - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpStateVariables.java b/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpStateVariables.java deleted file mode 100644 index 0002509..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/annotations/UpnpStateVariables.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.annotations; - -import java.lang.annotation.Inherited; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Retention; -import java.lang.annotation.ElementType; -import java.lang.annotation.Target; - - -@Target({ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -@Inherited -public @interface UpnpStateVariables { - - UpnpStateVariable[] value() default {}; - boolean preferFields() default true; - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/staging/MutableAction.java b/app/src/main/java/org/fourthline/cling/binding/staging/MutableAction.java deleted file mode 100644 index 258d353..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/staging/MutableAction.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.staging; - -import org.fourthline.cling.model.meta.Action; -import org.fourthline.cling.model.meta.ActionArgument; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Christian Bauer - */ -public class MutableAction { - - public String name; - public List arguments = new ArrayList(); - - public Action build() { - return new Action(name, createActionArgumennts()); - } - - public ActionArgument[] createActionArgumennts() { - ActionArgument[] array = new ActionArgument[arguments.size()]; - int i = 0; - for (MutableActionArgument argument : arguments) { - array[i++] = argument.build(); - } - return array; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/staging/MutableActionArgument.java b/app/src/main/java/org/fourthline/cling/binding/staging/MutableActionArgument.java deleted file mode 100644 index 2e7ff9e..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/staging/MutableActionArgument.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.staging; - -import org.fourthline.cling.model.meta.ActionArgument; - -/** - * @author Christian Bauer - */ -public class MutableActionArgument { - - public String name; - public String relatedStateVariable; - public ActionArgument.Direction direction; - public boolean retval; - - public ActionArgument build() { - return new ActionArgument(name, relatedStateVariable, direction, retval); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/staging/MutableAllowedValueRange.java b/app/src/main/java/org/fourthline/cling/binding/staging/MutableAllowedValueRange.java deleted file mode 100644 index ceed38a..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/staging/MutableAllowedValueRange.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.staging; - -/** - * @author Christian Bauer - */ -public class MutableAllowedValueRange { - - // TODO: UPNP VIOLATION: Some devices (Netgear Router again...) send empty elements, so use some sane defaults - // TODO: UPNP VIOLATION: The WANCommonInterfaceConfig example XML is even wrong, it does not include a element! - public Long minimum = 0l; - public Long maximum = Long.MAX_VALUE; - public Long step = 1l; - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/staging/MutableDevice.java b/app/src/main/java/org/fourthline/cling/binding/staging/MutableDevice.java deleted file mode 100644 index 2b2898d..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/staging/MutableDevice.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.staging; - -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.meta.DeviceDetails; -import org.fourthline.cling.model.meta.Icon; -import org.fourthline.cling.model.meta.ManufacturerDetails; -import org.fourthline.cling.model.meta.ModelDetails; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.meta.UDAVersion; -import org.fourthline.cling.model.types.DLNACaps; -import org.fourthline.cling.model.types.DLNADoc; -import org.fourthline.cling.model.types.DeviceType; -import org.fourthline.cling.model.types.UDN; - -import java.net.URI; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; - -/** - * @author Christian Bauer - */ -public class MutableDevice { - - public UDN udn; - public MutableUDAVersion udaVersion = new MutableUDAVersion(); - public URL baseURL; - public String deviceType; - public String friendlyName; - public String manufacturer; - public URI manufacturerURI; - public String modelName; - public String modelDescription; - public String modelNumber; - public URI modelURI; - public String serialNumber; - public String upc; - public URI presentationURI; - public List dlnaDocs = new ArrayList(); - public DLNACaps dlnaCaps; - public List icons = new ArrayList(); - public List services = new ArrayList(); - public List embeddedDevices = new ArrayList(); - public MutableDevice parentDevice; - - public Device build(Device prototype) throws ValidationException { - // Note how all embedded devices inherit the version and baseURL of the root! - return build(prototype, createDeviceVersion(), baseURL); - } - - public Device build(Device prototype, UDAVersion deviceVersion, URL baseURL) throws ValidationException { - - List embeddedDevicesList = new ArrayList(); - for (MutableDevice embeddedDevice : embeddedDevices) { - embeddedDevicesList.add(embeddedDevice.build(prototype, deviceVersion, baseURL)); - } - return prototype.newInstance( - udn, - deviceVersion, - createDeviceType(), - createDeviceDetails(baseURL), - createIcons(), - createServices(prototype), - embeddedDevicesList - ); - } - - public UDAVersion createDeviceVersion() { - return new UDAVersion(udaVersion.major, udaVersion.minor); - } - - public DeviceType createDeviceType() { - return DeviceType.valueOf(deviceType); - } - - public DeviceDetails createDeviceDetails(URL baseURL) { - return new DeviceDetails( - baseURL, - friendlyName, - new ManufacturerDetails(manufacturer, manufacturerURI), - new ModelDetails(modelName, modelDescription, modelNumber, modelURI), - serialNumber, upc, presentationURI, dlnaDocs.toArray(new DLNADoc[dlnaDocs.size()]), dlnaCaps - ); - } - - public Icon[] createIcons() { - Icon[] iconArray = new Icon[icons.size()]; - int i = 0; - for (MutableIcon icon : icons) { - iconArray[i++] = icon.build(); - } - return iconArray; - } - - public Service[] createServices(Device prototype) throws ValidationException { - Service[] services = prototype.newServiceArray(this.services.size()); - int i = 0; - for (MutableService service : this.services) { - services[i++] = service.build(prototype); - } - return services; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/staging/MutableIcon.java b/app/src/main/java/org/fourthline/cling/binding/staging/MutableIcon.java deleted file mode 100644 index 4e57e27..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/staging/MutableIcon.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.staging; - -import org.fourthline.cling.model.meta.Icon; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class MutableIcon { - - public String mimeType; - public int width; - public int height; - public int depth; - public URI uri; - - public Icon build() { - return new Icon(mimeType, width, height, depth, uri); - } -} diff --git a/app/src/main/java/org/fourthline/cling/binding/staging/MutableService.java b/app/src/main/java/org/fourthline/cling/binding/staging/MutableService.java deleted file mode 100644 index c5b7361..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/staging/MutableService.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.staging; - -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.meta.Action; -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.ServiceType; - -import java.net.URI; -import java.util.ArrayList; -import java.util.List; - -/** - * @author Christian Bauer - */ -public class MutableService { - - public ServiceType serviceType; - public ServiceId serviceId; - public URI descriptorURI; - public URI controlURI; - public URI eventSubscriptionURI; - - public List actions = new ArrayList(); - public List stateVariables = new ArrayList(); - - public Service build(Device prototype) throws ValidationException { - return prototype.newInstance( - serviceType, serviceId, - descriptorURI, controlURI, eventSubscriptionURI, - createActions(), - createStateVariables() - ); - } - - public Action[] createActions() { - Action[] array = new Action[actions.size()]; - int i = 0; - for (MutableAction action : actions) { - array[i++] = action.build(); - } - return array; - } - - public StateVariable[] createStateVariables() { - StateVariable[] array = new StateVariable[stateVariables.size()]; - int i = 0; - for (MutableStateVariable stateVariable : stateVariables) { - array[i++] = stateVariable.build(); - } - return array; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/staging/MutableStateVariable.java b/app/src/main/java/org/fourthline/cling/binding/staging/MutableStateVariable.java deleted file mode 100644 index 8a87fc6..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/staging/MutableStateVariable.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.staging; - -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.meta.StateVariableAllowedValueRange; -import org.fourthline.cling.model.meta.StateVariableEventDetails; -import org.fourthline.cling.model.meta.StateVariableTypeDetails; -import org.fourthline.cling.model.types.Datatype; - -import java.util.List; - -/** - * @author Christian Bauer - */ -public class MutableStateVariable { - - public String name; - public Datatype dataType; - public String defaultValue; - public List allowedValues; - public MutableAllowedValueRange allowedValueRange; - public StateVariableEventDetails eventDetails; - - public StateVariable build() { - return new StateVariable( - name, - new StateVariableTypeDetails( - dataType, - defaultValue, - allowedValues == null || allowedValues.size() == 0 - ? null - : allowedValues.toArray(new String[allowedValues.size()]), - allowedValueRange == null - ? null : - new StateVariableAllowedValueRange( - allowedValueRange.minimum, - allowedValueRange.maximum, - allowedValueRange.step - ) - ), - eventDetails - ); - } -} diff --git a/app/src/main/java/org/fourthline/cling/binding/staging/MutableUDAVersion.java b/app/src/main/java/org/fourthline/cling/binding/staging/MutableUDAVersion.java deleted file mode 100644 index 7605985..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/staging/MutableUDAVersion.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.staging; - -/** - * @author Christian Bauer - */ -public class MutableUDAVersion { - public int major = 1; - public int minor = 0; -} diff --git a/app/src/main/java/org/fourthline/cling/binding/xml/Descriptor.java b/app/src/main/java/org/fourthline/cling/binding/xml/Descriptor.java deleted file mode 100644 index c242aa7..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/xml/Descriptor.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.xml; - -import org.w3c.dom.Node; - -/** - * Utility interface with static declarations of all "strings". - * - * @author Christian Bauer - */ -public abstract class Descriptor { - - public interface Device { - - public static final String NAMESPACE_URI = "urn:schemas-upnp-org:device-1-0"; - public static final String DLNA_NAMESPACE_URI = "urn:schemas-dlna-org:device-1-0"; - public static final String DLNA_PREFIX = "dlna"; - public static final String SEC_NAMESPACE_URI = "http://www.sec.co.kr/dlna"; - public static final String SEC_PREFIX = "sec"; - - public enum ELEMENT { - root, - specVersion, major, minor, - URLBase, - device, - UDN, - X_DLNADOC, - X_DLNACAP, - ProductCap, - X_ProductCap, - deviceType, - friendlyName, - manufacturer, - manufacturerURL, - modelDescription, - modelName, - modelNumber, - modelURL, - presentationURL, - UPC, - serialNumber, - iconList, icon, width, height, depth, url, mimetype, - serviceList, service, serviceType, serviceId, SCPDURL, controlURL, eventSubURL, - deviceList; - - public static ELEMENT valueOrNullOf(String s) { - try { - return valueOf(s); - } catch (IllegalArgumentException ex) { - return null; - } - } - - public boolean equals(Node node) { - return toString().equals(node.getLocalName()); - } - } - } - - public interface Service { - - public static final String NAMESPACE_URI = "urn:schemas-upnp-org:service-1-0"; - - public enum ELEMENT { - scpd, - specVersion, major, minor, - actionList, action, name, - argumentList, argument, direction, relatedStateVariable, retval, - serviceStateTable, stateVariable, dataType, defaultValue, - allowedValueList, allowedValue, allowedValueRange, minimum, maximum, step; - - public static ELEMENT valueOrNullOf(String s) { - try { - return valueOf(s); - } catch (IllegalArgumentException ex) { - return null; - } - } - - public boolean equals(Node node) { - return toString().equals(node.getLocalName()); - } - - } - - public enum ATTRIBUTE { - sendEvents - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/xml/DescriptorBindingException.java b/app/src/main/java/org/fourthline/cling/binding/xml/DescriptorBindingException.java deleted file mode 100644 index df326b9..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/xml/DescriptorBindingException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.xml; - -/** - * Thrown if device or service descriptor metadata couldn't be read or written. - * - * @author Christian Bauer - */ -public class DescriptorBindingException extends Exception { - - public DescriptorBindingException(String s) { - super(s); - } - - public DescriptorBindingException(String s, Throwable throwable) { - super(s, throwable); - } -} - diff --git a/app/src/main/java/org/fourthline/cling/binding/xml/DeviceDescriptorBinder.java b/app/src/main/java/org/fourthline/cling/binding/xml/DeviceDescriptorBinder.java deleted file mode 100644 index 9127335..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/xml/DeviceDescriptorBinder.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.xml; - -import org.fourthline.cling.model.Namespace; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.profile.RemoteClientInfo; -import org.w3c.dom.Document; - -/** - * Reads and generates device descriptor XML metadata. - * - * @author Christian Bauer - */ -public interface DeviceDescriptorBinder { - - public T describe(T undescribedDevice, String descriptorXml) - throws DescriptorBindingException, ValidationException; - - public T describe(T undescribedDevice, Document dom) - throws DescriptorBindingException, ValidationException; - - public String generate(Device device, RemoteClientInfo info, Namespace namespace) throws DescriptorBindingException; - - public Document buildDOM(Device device, RemoteClientInfo info, Namespace namespace) throws DescriptorBindingException; - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/xml/RecoveringUDA10DeviceDescriptorBinderImpl.java b/app/src/main/java/org/fourthline/cling/binding/xml/RecoveringUDA10DeviceDescriptorBinderImpl.java deleted file mode 100644 index e5c51a2..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/xml/RecoveringUDA10DeviceDescriptorBinderImpl.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.xml; - -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.meta.Device; -import org.seamless.util.Exceptions; -import org.seamless.xml.ParserException; -import org.seamless.xml.XmlPullParserUtils; -import org.xml.sax.SAXParseException; - -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author Michael Pujos - */ -public class RecoveringUDA10DeviceDescriptorBinderImpl extends UDA10DeviceDescriptorBinderImpl { - - private static Logger log = Logger.getLogger(RecoveringUDA10DeviceDescriptorBinderImpl.class.getName()); - - @Override - public D describe(D undescribedDevice, String descriptorXml) throws DescriptorBindingException, ValidationException { - - D device = null; - DescriptorBindingException originalException; - try { - - try { - descriptorXml = descriptorXml.trim(); // Always trim whitespace - device = super.describe(undescribedDevice, descriptorXml); - return device; - } catch (DescriptorBindingException ex) { - log.warning("Regular parsing failed: " + Exceptions.unwrap(ex).getMessage()); - originalException = ex; - } - - String fixedXml; - // The following modifications are not cumulative! - - fixedXml = fixGarbageTrailingChars(descriptorXml, originalException); - if (fixedXml != null) { - try { - device = super.describe(undescribedDevice, fixedXml); - return device; - } catch (DescriptorBindingException ex) { - log.warning("Removing trailing garbage didn't work: " + Exceptions.unwrap(ex).getMessage()); - } - } - - // Try to fix "up to five" missing namespace declarations - DescriptorBindingException lastException = originalException; - fixedXml = descriptorXml; - for (int retryCount = 0; retryCount < 5; retryCount++) { - fixedXml = fixMissingNamespaces(fixedXml, lastException); - if (fixedXml != null) { - try { - device = super.describe(undescribedDevice, fixedXml); - return device; - } catch (DescriptorBindingException ex) { - log.warning("Fixing namespace prefix didn't work: " + Exceptions.unwrap(ex).getMessage()); - lastException = ex; - } - } else { - break; // We can stop, no more namespace fixing can be done - } - } - - fixedXml = XmlPullParserUtils.fixXMLEntities(descriptorXml); - if(!fixedXml.equals(descriptorXml)) { - try { - device = super.describe(undescribedDevice, fixedXml); - return device; - } catch (DescriptorBindingException ex) { - log.warning("Fixing XML entities didn't work: " + Exceptions.unwrap(ex).getMessage()); - } - } - - handleInvalidDescriptor(descriptorXml, originalException); - - } catch (ValidationException ex) { - device = handleInvalidDevice(descriptorXml, device, ex); - if (device != null) - return device; - } - throw new IllegalStateException("No device produced, did you swallow exceptions in your subclass?"); - } - - protected String fixGarbageTrailingChars(String descriptorXml, DescriptorBindingException ex) { - int index = descriptorXml.indexOf(""); - if (index == -1) { - log.warning("No closing element in descriptor"); - return null; - } - if (descriptorXml.length() != index + "".length()) { - log.warning("Detected garbage characters after node, removing"); - return descriptorXml.substring(0, index) + ""; - } - return null; - } - - protected String fixMissingNamespaces(String descriptorXml, DescriptorBindingException ex) { - // Windows: org.fourthline.cling.binding.xml.DescriptorBindingException: Could not parse device descriptor: org.seamless.xml.ParserException: org.xml.sax.SAXParseException: The prefix "dlna" for element "dlna:X_DLNADOC" is not bound. - // Android: org.xmlpull.v1.XmlPullParserException: undefined prefix: dlna (position:START_TAG <{null}dlna:X_DLNADOC>@19:17 in java.io.StringReader@406dff48) - - // We can only handle certain exceptions, depending on their type and message - Throwable cause = ex.getCause(); - if (!((cause instanceof SAXParseException) || (cause instanceof ParserException))) - return null; - String message = cause.getMessage(); - if (message == null) - return null; - - Pattern pattern = Pattern.compile("The prefix \"(.*)\" for element"); // Windows - Matcher matcher = pattern.matcher(message); - if (!matcher.find() || matcher.groupCount() != 1) { - pattern = Pattern.compile("undefined prefix: ([^ ]*)"); // Android - matcher = pattern.matcher(message); - if (!matcher.find() || matcher.groupCount() != 1) - return null; - } - - String missingNS = matcher.group(1); - log.warning("Fixing missing namespace declaration for: " + missingNS); - - // Extract attributes - pattern = Pattern.compile("]*)"); - matcher = pattern.matcher(descriptorXml); - if (!matcher.find() || matcher.groupCount() != 1) { - log.fine("Could not find element attributes"); - return null; - } - - String rootAttributes = matcher.group(1); - log.fine("Preserving existing element attributes/namespace declarations: " + matcher.group(0)); - - // Extract body - pattern = Pattern.compile("]*>(.*)", Pattern.DOTALL); - matcher = pattern.matcher(descriptorXml); - if (!matcher.find() || matcher.groupCount() != 1) { - log.fine("Could not extract body of element"); - return null; - } - - String rootBody = matcher.group(1); - - // Add missing namespace, it only matters that it is defined, not that it is correct - return "" - + "" - + rootBody - + ""; - - // TODO: Should we match different undeclared prefixes with their correct namespace? - // So if it's "dlna" we use "urn:schemas-dlna-org:device-1-0" etc. - } - - /** - * Handle processing errors while reading XML descriptors. - *

- *

- * Typically you want to log this problem or create an error report, and in any - * case, throw a {@link DescriptorBindingException} to notify the caller of the - * binder of this failure. The default implementation simply rethrows the - * given exception. - *

- * - * @param xml The original XML causing the parsing failure. - * @param exception The original exception while parsing the XML. - */ - protected void handleInvalidDescriptor(String xml, DescriptorBindingException exception) - throws DescriptorBindingException { - throw exception; - } - - /** - * Handle processing errors while binding XML descriptors. - *

- *

- * Typically you want to log this problem or create an error report. You - * should throw a {@link ValidationException} to notify the caller of the - * binder of failure. The default implementation simply rethrows the - * given exception. - *

- *

- * This method gives you a final chance to fix the problem, instead of - * throwing an exception, you could try to create valid {@link Device} - * model and return it. - *

- * - * @param xml The original XML causing the binding failure. - * @param device The unfinished {@link Device} that failed validation - * @param exception The errors found when validating the {@link Device} model. - * @return Device A "fixed" {@link Device} model, instead of throwing an exception. - */ - protected D handleInvalidDevice(String xml, D device, ValidationException exception) - throws ValidationException { - throw exception; - } -} diff --git a/app/src/main/java/org/fourthline/cling/binding/xml/ServiceDescriptorBinder.java b/app/src/main/java/org/fourthline/cling/binding/xml/ServiceDescriptorBinder.java deleted file mode 100644 index 3d9cf84..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/xml/ServiceDescriptorBinder.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.xml; - -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.meta.Service; -import org.w3c.dom.Document; - -/** - * Reads and generates service descriptor XML metadata. - * - * @author Christian Bauer - */ -public interface ServiceDescriptorBinder { - - public T describe(T undescribedService, String descriptorXml) - throws DescriptorBindingException, ValidationException; - - public T describe(T undescribedService, Document dom) - throws DescriptorBindingException, ValidationException; - - public String generate(Service service) throws DescriptorBindingException; - - public Document buildDOM(Service service) throws DescriptorBindingException; -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/binding/xml/UDA10DeviceDescriptorBinderImpl.java b/app/src/main/java/org/fourthline/cling/binding/xml/UDA10DeviceDescriptorBinderImpl.java deleted file mode 100644 index 444c479..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/xml/UDA10DeviceDescriptorBinderImpl.java +++ /dev/null @@ -1,613 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.xml; - -import static org.fourthline.cling.model.XMLUtil.appendNewElement; -import static org.fourthline.cling.model.XMLUtil.appendNewElementIfNotNull; - -import java.io.StringReader; -import java.net.URI; -import java.net.URL; -import java.util.logging.Logger; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.fourthline.cling.binding.staging.MutableDevice; -import org.fourthline.cling.binding.staging.MutableIcon; -import org.fourthline.cling.binding.staging.MutableService; -import org.fourthline.cling.binding.xml.Descriptor.Device.ELEMENT; -import org.fourthline.cling.model.Namespace; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.XMLUtil; -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.meta.DeviceDetails; -import org.fourthline.cling.model.meta.Icon; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.meta.RemoteDevice; -import org.fourthline.cling.model.meta.RemoteService; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.profile.RemoteClientInfo; -import org.fourthline.cling.model.types.DLNACaps; -import org.fourthline.cling.model.types.DLNADoc; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDN; -import org.seamless.util.Exceptions; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.ErrorHandler; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; - -/** - * Implementation based on JAXP DOM. - * - * @author Christian Bauer - */ -public class UDA10DeviceDescriptorBinderImpl implements DeviceDescriptorBinder, ErrorHandler { - - private static Logger log = Logger.getLogger(DeviceDescriptorBinder.class.getName()); - - public D describe(D undescribedDevice, String descriptorXml) throws DescriptorBindingException, ValidationException { - - if (descriptorXml == null || descriptorXml.length() == 0) { - throw new DescriptorBindingException("Null or empty descriptor"); - } - - try { - log.fine("Populating device from XML descriptor: " + undescribedDevice); - // We can not validate the XML document. There is no possible XML schema (maybe RELAX NG) that would properly - // constrain the UDA 1.0 device descriptor documents: Any unknown element or attribute must be ignored, order of elements - // is not guaranteed. Try to write a schema for that! No combination of and - // works with that... But hey, MSFT sure has great tech guys! So what we do here is just parsing out the known elements - // and ignoring the other shit. We'll also do some very very basic validation of required elements, but that's it. - - // And by the way... try this with JAXB instead of manual DOM processing! And you thought it couldn't get worse.... - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - DocumentBuilder documentBuilder = factory.newDocumentBuilder(); - documentBuilder.setErrorHandler(this); - - Document d = documentBuilder.parse( - new InputSource( - // TODO: UPNP VIOLATION: Virgin Media Superhub sends trailing spaces/newlines after last XML element, need to trim() - new StringReader(descriptorXml.trim()) - ) - ); - - return describe(undescribedDevice, d); - - } catch (ValidationException ex) { - throw ex; - } catch (Exception ex) { - throw new DescriptorBindingException("Could not parse device descriptor: " + ex.toString(), ex); - } - } - - public D describe(D undescribedDevice, Document dom) throws DescriptorBindingException, ValidationException { - try { - log.fine("Populating device from DOM: " + undescribedDevice); - - // Read the XML into a mutable descriptor graph - MutableDevice descriptor = new MutableDevice(); - Element rootElement = dom.getDocumentElement(); - hydrateRoot(descriptor, rootElement); - - // Build the immutable descriptor graph - return buildInstance(undescribedDevice, descriptor); - - } catch (ValidationException ex) { - throw ex; - } catch (Exception ex) { - throw new DescriptorBindingException("Could not parse device DOM: " + ex.toString(), ex); - } - } - - public D buildInstance(D undescribedDevice, MutableDevice descriptor) throws ValidationException { - return (D) descriptor.build(undescribedDevice); - } - - protected void hydrateRoot(MutableDevice descriptor, Element rootElement) throws DescriptorBindingException { - - if (rootElement.getNamespaceURI() == null || !rootElement.getNamespaceURI().equals(Descriptor.Device.NAMESPACE_URI)) { - log.warning("Wrong XML namespace declared on root element: " + rootElement.getNamespaceURI()); - } - - if (!rootElement.getNodeName().equals(ELEMENT.root.name())) { - throw new DescriptorBindingException("Root element name is not : " + rootElement.getNodeName()); - } - - NodeList rootChildren = rootElement.getChildNodes(); - - Node deviceNode = null; - - for (int i = 0; i < rootChildren.getLength(); i++) { - Node rootChild = rootChildren.item(i); - - if (rootChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.specVersion.equals(rootChild)) { - hydrateSpecVersion(descriptor, rootChild); - } else if (ELEMENT.URLBase.equals(rootChild)) { - try { - String urlString = XMLUtil.getTextContent(rootChild); - if (urlString != null && urlString.length() > 0) { - // We hope it's RFC 2396 and RFC 2732 compliant - descriptor.baseURL = new URL(urlString); - } - } catch (Exception ex) { - throw new DescriptorBindingException("Invalid URLBase: " + ex.getMessage()); - } - } else if (ELEMENT.device.equals(rootChild)) { - // Just sanity check here... - if (deviceNode != null) - throw new DescriptorBindingException("Found multiple elements in "); - deviceNode = rootChild; - } else { - log.finer("Ignoring unknown element: " + rootChild.getNodeName()); - } - } - - if (deviceNode == null) { - throw new DescriptorBindingException("No element in "); - } - hydrateDevice(descriptor, deviceNode); - } - - public void hydrateSpecVersion(MutableDevice descriptor, Node specVersionNode) throws DescriptorBindingException { - - NodeList specVersionChildren = specVersionNode.getChildNodes(); - for (int i = 0; i < specVersionChildren.getLength(); i++) { - Node specVersionChild = specVersionChildren.item(i); - - if (specVersionChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.major.equals(specVersionChild)) { - String version = XMLUtil.getTextContent(specVersionChild).trim(); - if (!version.equals("1")) { - log.warning("Unsupported UDA major version, ignoring: " + version); - version = "1"; - } - descriptor.udaVersion.major = Integer.valueOf(version); - } else if (ELEMENT.minor.equals(specVersionChild)) { - String version = XMLUtil.getTextContent(specVersionChild).trim(); - if (!version.equals("0")) { - log.warning("Unsupported UDA minor version, ignoring: " + version); - version = "0"; - } - descriptor.udaVersion.minor = Integer.valueOf(version); - } - - } - - } - - public void hydrateDevice(MutableDevice descriptor, Node deviceNode) throws DescriptorBindingException { - - NodeList deviceNodeChildren = deviceNode.getChildNodes(); - for (int i = 0; i < deviceNodeChildren.getLength(); i++) { - Node deviceNodeChild = deviceNodeChildren.item(i); - - if (deviceNodeChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.deviceType.equals(deviceNodeChild)) { - descriptor.deviceType = XMLUtil.getTextContent(deviceNodeChild); - } else if (ELEMENT.friendlyName.equals(deviceNodeChild)) { - descriptor.friendlyName = XMLUtil.getTextContent(deviceNodeChild); - } else if (ELEMENT.manufacturer.equals(deviceNodeChild)) { - descriptor.manufacturer = XMLUtil.getTextContent(deviceNodeChild); - } else if (ELEMENT.manufacturerURL.equals(deviceNodeChild)) { - descriptor.manufacturerURI = parseURI(XMLUtil.getTextContent(deviceNodeChild)); - } else if (ELEMENT.modelDescription.equals(deviceNodeChild)) { - descriptor.modelDescription = XMLUtil.getTextContent(deviceNodeChild); - } else if (ELEMENT.modelName.equals(deviceNodeChild)) { - descriptor.modelName = XMLUtil.getTextContent(deviceNodeChild); - } else if (ELEMENT.modelNumber.equals(deviceNodeChild)) { - descriptor.modelNumber = XMLUtil.getTextContent(deviceNodeChild); - } else if (ELEMENT.modelURL.equals(deviceNodeChild)) { - descriptor.modelURI = parseURI(XMLUtil.getTextContent(deviceNodeChild)); - } else if (ELEMENT.presentationURL.equals(deviceNodeChild)) { - descriptor.presentationURI = parseURI(XMLUtil.getTextContent(deviceNodeChild)); - } else if (ELEMENT.UPC.equals(deviceNodeChild)) { - descriptor.upc = XMLUtil.getTextContent(deviceNodeChild); - } else if (ELEMENT.serialNumber.equals(deviceNodeChild)) { - descriptor.serialNumber = XMLUtil.getTextContent(deviceNodeChild); - } else if (ELEMENT.UDN.equals(deviceNodeChild)) { - descriptor.udn = UDN.valueOf(XMLUtil.getTextContent(deviceNodeChild)); - } else if (ELEMENT.iconList.equals(deviceNodeChild)) { - hydrateIconList(descriptor, deviceNodeChild); - } else if (ELEMENT.serviceList.equals(deviceNodeChild)) { - hydrateServiceList(descriptor, deviceNodeChild); - } else if (ELEMENT.deviceList.equals(deviceNodeChild)) { - hydrateDeviceList(descriptor, deviceNodeChild); - } else if (ELEMENT.X_DLNADOC.equals(deviceNodeChild) && - Descriptor.Device.DLNA_PREFIX.equals(deviceNodeChild.getPrefix())) { - String txt = XMLUtil.getTextContent(deviceNodeChild); - try { - descriptor.dlnaDocs.add(DLNADoc.valueOf(txt)); - } catch (InvalidValueException ex) { - log.info("Invalid X_DLNADOC value, ignoring value: " + txt); - } - } else if (ELEMENT.X_DLNACAP.equals(deviceNodeChild) && - Descriptor.Device.DLNA_PREFIX.equals(deviceNodeChild.getPrefix())) { - descriptor.dlnaCaps = DLNACaps.valueOf(XMLUtil.getTextContent(deviceNodeChild)); - } - } - } - - public void hydrateIconList(MutableDevice descriptor, Node iconListNode) throws DescriptorBindingException { - - NodeList iconListNodeChildren = iconListNode.getChildNodes(); - for (int i = 0; i < iconListNodeChildren.getLength(); i++) { - Node iconListNodeChild = iconListNodeChildren.item(i); - - if (iconListNodeChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.icon.equals(iconListNodeChild)) { - - MutableIcon icon = new MutableIcon(); - - NodeList iconChildren = iconListNodeChild.getChildNodes(); - - for (int x = 0; x < iconChildren.getLength(); x++) { - Node iconChild = iconChildren.item(x); - - if (iconChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.width.equals(iconChild)) { - icon.width = (Integer.valueOf(XMLUtil.getTextContent(iconChild))); - } else if (ELEMENT.height.equals(iconChild)) { - icon.height = (Integer.valueOf(XMLUtil.getTextContent(iconChild))); - } else if (ELEMENT.depth.equals(iconChild)) { - String depth = XMLUtil.getTextContent(iconChild); - try { - icon.depth = (Integer.valueOf(depth)); - } catch(NumberFormatException ex) { - log.warning("Invalid icon depth '" + depth + "', using 16 as default: " + ex); - icon.depth = 16; - } - } else if (ELEMENT.url.equals(iconChild)) { - icon.uri = parseURI(XMLUtil.getTextContent(iconChild)); - } else if (ELEMENT.mimetype.equals(iconChild)) { - icon.mimeType = XMLUtil.getTextContent(iconChild); - } - - } - - descriptor.icons.add(icon); - } - } - } - - public void hydrateServiceList(MutableDevice descriptor, Node serviceListNode) throws DescriptorBindingException { - - NodeList serviceListNodeChildren = serviceListNode.getChildNodes(); - for (int i = 0; i < serviceListNodeChildren.getLength(); i++) { - Node serviceListNodeChild = serviceListNodeChildren.item(i); - - if (serviceListNodeChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.service.equals(serviceListNodeChild)) { - - MutableService service = new MutableService(); - - NodeList serviceChildren = serviceListNodeChild.getChildNodes(); - - for (int x = 0; x < serviceChildren.getLength(); x++) { - Node serviceChild = serviceChildren.item(x); - - if (serviceChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.serviceType.equals(serviceChild)) { - service.serviceType = (ServiceType.valueOf(XMLUtil.getTextContent(serviceChild))); - } else if (ELEMENT.serviceId.equals(serviceChild)) { - service.serviceId = (ServiceId.valueOf(XMLUtil.getTextContent(serviceChild))); - } else if (ELEMENT.SCPDURL.equals(serviceChild)) { - service.descriptorURI = parseURI(XMLUtil.getTextContent(serviceChild)); - } else if (ELEMENT.controlURL.equals(serviceChild)) { - service.controlURI = parseURI(XMLUtil.getTextContent(serviceChild)); - } else if (ELEMENT.eventSubURL.equals(serviceChild)) { - service.eventSubscriptionURI = parseURI(XMLUtil.getTextContent(serviceChild)); - } - - } - - descriptor.services.add(service); - } - } - } - - public void hydrateDeviceList(MutableDevice descriptor, Node deviceListNode) throws DescriptorBindingException { - - NodeList deviceListNodeChildren = deviceListNode.getChildNodes(); - for (int i = 0; i < deviceListNodeChildren.getLength(); i++) { - Node deviceListNodeChild = deviceListNodeChildren.item(i); - - if (deviceListNodeChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.device.equals(deviceListNodeChild)) { - MutableDevice embeddedDevice = new MutableDevice(); - embeddedDevice.parentDevice = descriptor; - descriptor.embeddedDevices.add(embeddedDevice); - hydrateDevice(embeddedDevice, deviceListNodeChild); - } - } - - } - - public String generate(Device deviceModel, RemoteClientInfo info, Namespace namespace) throws DescriptorBindingException { - try { - log.fine("Generating XML descriptor from device model: " + deviceModel); - - return XMLUtil.documentToString(buildDOM(deviceModel, info, namespace)); - - } catch (Exception ex) { - throw new DescriptorBindingException("Could not build DOM: " + ex.getMessage(), ex); - } - } - - public Document buildDOM(Device deviceModel, RemoteClientInfo info, Namespace namespace) throws DescriptorBindingException { - - try { - log.fine("Generating DOM from device model: " + deviceModel); - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - - Document d = factory.newDocumentBuilder().newDocument(); - generateRoot(namespace, deviceModel, d, info); - - return d; - - } catch (Exception ex) { - throw new DescriptorBindingException("Could not generate device descriptor: " + ex.getMessage(), ex); - } - } - - protected void generateRoot(Namespace namespace, Device deviceModel, Document descriptor, RemoteClientInfo info) { - - Element rootElement = descriptor.createElementNS(Descriptor.Device.NAMESPACE_URI, ELEMENT.root.toString()); - descriptor.appendChild(rootElement); - - generateSpecVersion(namespace, deviceModel, descriptor, rootElement); - - /* UDA 1.1 spec says: Don't use URLBase anymore - if (deviceModel.getBaseURL() != null) { - appendChildElementWithTextContent(descriptor, rootElement, "URLBase", deviceModel.getBaseURL()); - } - */ - - generateDevice(namespace, deviceModel, descriptor, rootElement, info); - } - - protected void generateSpecVersion(Namespace namespace, Device deviceModel, Document descriptor, Element rootElement) { - Element specVersionElement = appendNewElement(descriptor, rootElement, ELEMENT.specVersion); - appendNewElementIfNotNull(descriptor, specVersionElement, ELEMENT.major, deviceModel.getVersion().getMajor()); - appendNewElementIfNotNull(descriptor, specVersionElement, ELEMENT.minor, deviceModel.getVersion().getMinor()); - } - - protected void generateDevice(Namespace namespace, Device deviceModel, Document descriptor, Element rootElement, RemoteClientInfo info) { - - Element deviceElement = appendNewElement(descriptor, rootElement, ELEMENT.device); - - appendNewElementIfNotNull(descriptor, deviceElement, ELEMENT.deviceType, deviceModel.getType()); - - DeviceDetails deviceModelDetails = deviceModel.getDetails(info); - appendNewElementIfNotNull( - descriptor, deviceElement, ELEMENT.friendlyName, - deviceModelDetails.getFriendlyName() - ); - if (deviceModelDetails.getManufacturerDetails() != null) { - appendNewElementIfNotNull( - descriptor, deviceElement, ELEMENT.manufacturer, - deviceModelDetails.getManufacturerDetails().getManufacturer() - ); - appendNewElementIfNotNull( - descriptor, deviceElement, ELEMENT.manufacturerURL, - deviceModelDetails.getManufacturerDetails().getManufacturerURI() - ); - } - if (deviceModelDetails.getModelDetails() != null) { - appendNewElementIfNotNull( - descriptor, deviceElement, ELEMENT.modelDescription, - deviceModelDetails.getModelDetails().getModelDescription() - ); - appendNewElementIfNotNull( - descriptor, deviceElement, ELEMENT.modelName, - deviceModelDetails.getModelDetails().getModelName() - ); - appendNewElementIfNotNull( - descriptor, deviceElement, ELEMENT.modelNumber, - deviceModelDetails.getModelDetails().getModelNumber() - ); - appendNewElementIfNotNull( - descriptor, deviceElement, ELEMENT.modelURL, - deviceModelDetails.getModelDetails().getModelURI() - ); - } - appendNewElementIfNotNull( - descriptor, deviceElement, ELEMENT.serialNumber, - deviceModelDetails.getSerialNumber() - ); - appendNewElementIfNotNull(descriptor, deviceElement, ELEMENT.UDN, deviceModel.getIdentity().getUdn()); - appendNewElementIfNotNull( - descriptor, deviceElement, ELEMENT.presentationURL, - deviceModelDetails.getPresentationURI() - ); - appendNewElementIfNotNull( - descriptor, deviceElement, ELEMENT.UPC, - deviceModelDetails.getUpc() - ); - - if (deviceModelDetails.getDlnaDocs() != null) { - for (DLNADoc dlnaDoc : deviceModelDetails.getDlnaDocs()) { - appendNewElementIfNotNull( - descriptor, deviceElement, Descriptor.Device.DLNA_PREFIX + ":" + ELEMENT.X_DLNADOC, - dlnaDoc, Descriptor.Device.DLNA_NAMESPACE_URI - ); - } - } - appendNewElementIfNotNull( - descriptor, deviceElement, Descriptor.Device.DLNA_PREFIX + ":" + ELEMENT.X_DLNACAP, - deviceModelDetails.getDlnaCaps(), Descriptor.Device.DLNA_NAMESPACE_URI - ); - - appendNewElementIfNotNull( - descriptor, deviceElement, Descriptor.Device.SEC_PREFIX + ":" + ELEMENT.ProductCap, - deviceModelDetails.getSecProductCaps(), Descriptor.Device.SEC_NAMESPACE_URI - ); - - appendNewElementIfNotNull( - descriptor, deviceElement, Descriptor.Device.SEC_PREFIX + ":" + ELEMENT.X_ProductCap, - deviceModelDetails.getSecProductCaps(), Descriptor.Device.SEC_NAMESPACE_URI - ); - - generateIconList(namespace, deviceModel, descriptor, deviceElement); - generateServiceList(namespace, deviceModel, descriptor, deviceElement); - generateDeviceList(namespace, deviceModel, descriptor, deviceElement, info); - } - - protected void generateIconList(Namespace namespace, Device deviceModel, Document descriptor, Element deviceElement) { - if (!deviceModel.hasIcons()) return; - - Element iconListElement = appendNewElement(descriptor, deviceElement, ELEMENT.iconList); - - for (Icon icon : deviceModel.getIcons()) { - Element iconElement = appendNewElement(descriptor, iconListElement, ELEMENT.icon); - - appendNewElementIfNotNull(descriptor, iconElement, ELEMENT.mimetype, icon.getMimeType()); - appendNewElementIfNotNull(descriptor, iconElement, ELEMENT.width, icon.getWidth()); - appendNewElementIfNotNull(descriptor, iconElement, ELEMENT.height, icon.getHeight()); - appendNewElementIfNotNull(descriptor, iconElement, ELEMENT.depth, icon.getDepth()); - if (deviceModel instanceof RemoteDevice) { - appendNewElementIfNotNull(descriptor, iconElement, ELEMENT.url, icon.getUri()); - } else if (deviceModel instanceof LocalDevice) { - appendNewElementIfNotNull(descriptor, iconElement, ELEMENT.url, namespace.getIconPath(icon)); - } - } - } - - protected void generateServiceList(Namespace namespace, Device deviceModel, Document descriptor, Element deviceElement) { - if (!deviceModel.hasServices()) return; - - Element serviceListElement = appendNewElement(descriptor, deviceElement, ELEMENT.serviceList); - - for (Service service : deviceModel.getServices()) { - Element serviceElement = appendNewElement(descriptor, serviceListElement, ELEMENT.service); - - appendNewElementIfNotNull(descriptor, serviceElement, ELEMENT.serviceType, service.getServiceType()); - appendNewElementIfNotNull(descriptor, serviceElement, ELEMENT.serviceId, service.getServiceId()); - if (service instanceof RemoteService) { - RemoteService rs = (RemoteService) service; - appendNewElementIfNotNull(descriptor, serviceElement, ELEMENT.SCPDURL, rs.getDescriptorURI()); - appendNewElementIfNotNull(descriptor, serviceElement, ELEMENT.controlURL, rs.getControlURI()); - appendNewElementIfNotNull(descriptor, serviceElement, ELEMENT.eventSubURL, rs.getEventSubscriptionURI()); - } else if (service instanceof LocalService) { - LocalService ls = (LocalService) service; - appendNewElementIfNotNull(descriptor, serviceElement, ELEMENT.SCPDURL, namespace.getDescriptorPath(ls)); - appendNewElementIfNotNull(descriptor, serviceElement, ELEMENT.controlURL, namespace.getControlPath(ls)); - appendNewElementIfNotNull(descriptor, serviceElement, ELEMENT.eventSubURL, namespace.getEventSubscriptionPath(ls)); - } - } - } - - protected void generateDeviceList(Namespace namespace, Device deviceModel, Document descriptor, Element deviceElement, RemoteClientInfo info) { - if (!deviceModel.hasEmbeddedDevices()) return; - - Element deviceListElement = appendNewElement(descriptor, deviceElement, ELEMENT.deviceList); - - for (Device device : deviceModel.getEmbeddedDevices()) { - generateDevice(namespace, device, descriptor, deviceListElement, info); - } - } - - public void warning(SAXParseException e) throws SAXException { - log.warning(e.toString()); - } - - public void error(SAXParseException e) throws SAXException { - throw e; - } - - public void fatalError(SAXParseException e) throws SAXException { - throw e; - } - - static protected URI parseURI(String uri) { - - // TODO: UPNP VIOLATION: Netgear DG834 uses a non-URI: 'www.netgear.com' - if (uri.startsWith("www.")) { - uri = "http://" + uri; - } - - // TODO: UPNP VIOLATION: Plutinosoft uses unencoded relative URIs - // /var/mobile/Applications/71367E68-F30F-460B-A2D2-331509441D13/Windows Media Player Streamer.app/Icon-ps3.jpg - if (uri.contains(" ")) { - // We don't want to split/encode individual parts of the URI, too much work - // TODO: But we probably should do this? Because browsers do it, everyone - // seems to think that spaces in URLs are somehow OK... - uri = uri.replaceAll(" ", "%20"); - } - - try { - return URI.create(uri); - } catch (Throwable ex) { - /* - catch Throwable because on Android 2.2, parsing some invalid URI like "http://..." gives: - java.lang.NullPointerException - at java.net.URI$Helper.isValidDomainName(URI.java:631) - at java.net.URI$Helper.isValidHost(URI.java:595) - at java.net.URI$Helper.parseAuthority(URI.java:544) - at java.net.URI$Helper.parseURI(URI.java:404) - at java.net.URI$Helper.access$100(URI.java:302) - at java.net.URI.(URI.java:87) - at java.net.URI.create(URI.java:968) - */ - log.fine("Illegal URI, trying with ./ prefix: " + Exceptions.unwrap(ex)); - // Ignore - } - try { - // The java.net.URI class can't deal with "_urn:foobar" (yeah, great idea Intel UPnP tools guy), as - // explained in RFC 3986: - // - // A path segment that contains a colon character (e.g., "this:that") cannot be used as the first segment - // of a relative-path reference, as it would be mistaken for a scheme name. Such a segment must - // be preceded by a dot-segment (e.g., "./this:that") to make a relative-path reference. - // - return URI.create("./" + uri); - } catch (IllegalArgumentException ex) { - log.warning("Illegal URI '" + uri + "', ignoring value: " + Exceptions.unwrap(ex)); - // Ignore - } - return null; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/binding/xml/UDA10DeviceDescriptorBinderSAXImpl.java b/app/src/main/java/org/fourthline/cling/binding/xml/UDA10DeviceDescriptorBinderSAXImpl.java deleted file mode 100644 index f36f298..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/xml/UDA10DeviceDescriptorBinderSAXImpl.java +++ /dev/null @@ -1,447 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.xml; - -import org.fourthline.cling.binding.staging.MutableDevice; -import org.fourthline.cling.binding.staging.MutableIcon; -import org.fourthline.cling.binding.staging.MutableService; -import org.fourthline.cling.binding.staging.MutableUDAVersion; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.XMLUtil; -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.types.DLNACaps; -import org.fourthline.cling.model.types.DLNADoc; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDN; -import org.seamless.xml.SAXParser; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -import java.io.StringReader; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -import static org.fourthline.cling.binding.xml.Descriptor.Device.ELEMENT; - -/** - * A JAXP SAX parser implementation, which is actually slower than the DOM implementation (on desktop and on Android)! - * - * @author Christian Bauer - */ -public class UDA10DeviceDescriptorBinderSAXImpl extends UDA10DeviceDescriptorBinderImpl { - - private static Logger log = Logger.getLogger(DeviceDescriptorBinder.class.getName()); - - @Override - public D describe(D undescribedDevice, String descriptorXml) throws DescriptorBindingException, ValidationException { - - if (descriptorXml == null || descriptorXml.length() == 0) { - throw new DescriptorBindingException("Null or empty descriptor"); - } - - try { - log.fine("Populating device from XML descriptor: " + undescribedDevice); - - // Read the XML into a mutable descriptor graph - - SAXParser parser = new SAXParser(); - - MutableDevice descriptor = new MutableDevice(); - new RootHandler(descriptor, parser); - - parser.parse( - new InputSource( - // TODO: UPNP VIOLATION: Virgin Media Superhub sends trailing spaces/newlines after last XML element, need to trim() - new StringReader(descriptorXml.trim()) - ) - ); - - // Build the immutable descriptor graph - return (D) descriptor.build(undescribedDevice); - - } catch (ValidationException ex) { - throw ex; - } catch (Exception ex) { - throw new DescriptorBindingException("Could not parse device descriptor: " + ex.toString(), ex); - } - } - - protected static class RootHandler extends DeviceDescriptorHandler { - - public RootHandler(MutableDevice instance, SAXParser parser) { - super(instance, parser); - } - - @Override - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - - if (element.equals(SpecVersionHandler.EL)) { - MutableUDAVersion udaVersion = new MutableUDAVersion(); - getInstance().udaVersion = udaVersion; - new SpecVersionHandler(udaVersion, this); - } - - if (element.equals(DeviceHandler.EL)) { - new DeviceHandler(getInstance(), this); - } - - } - - @Override - public void endElement(ELEMENT element) throws SAXException { - switch (element) { - case URLBase: - try { - String urlString = getCharacters(); - if (urlString != null && urlString.length() > 0) { - // We hope it's RFC 2396 and RFC 2732 compliant - getInstance().baseURL = new URL(urlString); - } - } catch (Exception ex) { - throw new SAXException("Invalid URLBase: " + ex.toString()); - } - break; - } - } - } - - protected static class SpecVersionHandler extends DeviceDescriptorHandler { - - public static final ELEMENT EL = ELEMENT.specVersion; - - public SpecVersionHandler(MutableUDAVersion instance, DeviceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void endElement(ELEMENT element) throws SAXException { - switch (element) { - case major: - String majorVersion = getCharacters().trim(); - if (!majorVersion.equals("1")) { - log.warning("Unsupported UDA major version, ignoring: " + majorVersion); - majorVersion = "1"; - } - getInstance().major = Integer.valueOf(majorVersion); - break; - case minor: - String minorVersion = getCharacters().trim(); - if (!minorVersion.equals("0")) { - log.warning("Unsupported UDA minor version, ignoring: " + minorVersion); - minorVersion = "0"; - } - getInstance().minor = Integer.valueOf(minorVersion); - break; - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class DeviceHandler extends DeviceDescriptorHandler { - - public static final ELEMENT EL = ELEMENT.device; - - public DeviceHandler(MutableDevice instance, DeviceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - - if (element.equals(IconListHandler.EL)) { - List icons = new ArrayList(); - getInstance().icons = icons; - new IconListHandler(icons, this); - } - - if (element.equals(ServiceListHandler.EL)) { - List services = new ArrayList(); - getInstance().services = services; - new ServiceListHandler(services, this); - } - - if (element.equals(DeviceListHandler.EL)) { - List devices = new ArrayList(); - getInstance().embeddedDevices = devices; - new DeviceListHandler(devices, this); - } - } - - @Override - public void endElement(ELEMENT element) throws SAXException { - switch (element) { - case deviceType: - getInstance().deviceType = getCharacters(); - break; - case friendlyName: - getInstance().friendlyName = getCharacters(); - break; - case manufacturer: - getInstance().manufacturer = getCharacters(); - break; - case manufacturerURL: - getInstance().manufacturerURI = parseURI(getCharacters()); - break; - case modelDescription: - getInstance().modelDescription = getCharacters(); - break; - case modelName: - getInstance().modelName = getCharacters(); - break; - case modelNumber: - getInstance().modelNumber = getCharacters(); - break; - case modelURL: - getInstance().modelURI = parseURI(getCharacters()); - break; - case presentationURL: - getInstance().presentationURI = parseURI(getCharacters()); - break; - case UPC: - getInstance().upc = getCharacters(); - break; - case serialNumber: - getInstance().serialNumber = getCharacters(); - break; - case UDN: - getInstance().udn = UDN.valueOf(getCharacters()); - break; - case X_DLNADOC: - String txt = getCharacters(); - try { - getInstance().dlnaDocs.add(DLNADoc.valueOf(txt)); - } catch (InvalidValueException ex) { - log.info("Invalid X_DLNADOC value, ignoring value: " + txt); - } - break; - case X_DLNACAP: - getInstance().dlnaCaps = DLNACaps.valueOf(getCharacters()); - break; - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class IconListHandler extends DeviceDescriptorHandler> { - - public static final ELEMENT EL = ELEMENT.iconList; - - public IconListHandler(List instance, DeviceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - if (element.equals(IconHandler.EL)) { - MutableIcon icon = new MutableIcon(); - getInstance().add(icon); - new IconHandler(icon, this); - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class IconHandler extends DeviceDescriptorHandler { - - public static final ELEMENT EL = ELEMENT.icon; - - public IconHandler(MutableIcon instance, DeviceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void endElement(ELEMENT element) throws SAXException { - switch (element) { - case width: - getInstance().width = Integer.valueOf(getCharacters()); - break; - case height: - getInstance().height = Integer.valueOf(getCharacters()); - break; - case depth: - try { - getInstance().depth = Integer.valueOf(getCharacters()); - } catch(NumberFormatException ex) { - log.warning("Invalid icon depth '" + getCharacters() + "', using 16 as default: " + ex); - getInstance().depth = 16; - } - break; - case url: - getInstance().uri = parseURI(getCharacters()); - break; - case mimetype: - getInstance().mimeType = getCharacters(); - break; - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class ServiceListHandler extends DeviceDescriptorHandler> { - - public static final ELEMENT EL = ELEMENT.serviceList; - - public ServiceListHandler(List instance, DeviceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - if (element.equals(ServiceHandler.EL)) { - MutableService service = new MutableService(); - getInstance().add(service); - new ServiceHandler(service, this); - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class ServiceHandler extends DeviceDescriptorHandler { - - public static final ELEMENT EL = ELEMENT.service; - - public ServiceHandler(MutableService instance, DeviceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void endElement(ELEMENT element) throws SAXException { - switch (element) { - case serviceType: - getInstance().serviceType = ServiceType.valueOf(getCharacters()); - break; - case serviceId: - getInstance().serviceId = ServiceId.valueOf(getCharacters()); - break; - case SCPDURL: - getInstance().descriptorURI = parseURI(getCharacters()); - break; - case controlURL: - getInstance().controlURI = parseURI(getCharacters()); - break; - case eventSubURL: - getInstance().eventSubscriptionURI = parseURI(getCharacters()); - break; - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class DeviceListHandler extends DeviceDescriptorHandler> { - - public static final ELEMENT EL = ELEMENT.deviceList; - - public DeviceListHandler(List instance, DeviceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - if (element.equals(DeviceHandler.EL)) { - MutableDevice device = new MutableDevice(); - getInstance().add(device); - new DeviceHandler(device, this); - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class DeviceDescriptorHandler extends SAXParser.Handler { - - public DeviceDescriptorHandler(I instance) { - super(instance); - } - - public DeviceDescriptorHandler(I instance, SAXParser parser) { - super(instance, parser); - } - - public DeviceDescriptorHandler(I instance, DeviceDescriptorHandler parent) { - super(instance, parent); - } - - public DeviceDescriptorHandler(I instance, SAXParser parser, DeviceDescriptorHandler parent) { - super(instance, parser, parent); - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - super.startElement(uri, localName, qName, attributes); - ELEMENT el = ELEMENT.valueOrNullOf(localName); - if (el == null) return; - startElement(el, attributes); - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - super.endElement(uri, localName, qName); - ELEMENT el = ELEMENT.valueOrNullOf(localName); - if (el == null) return; - endElement(el); - } - - @Override - protected boolean isLastElement(String uri, String localName, String qName) { - ELEMENT el = ELEMENT.valueOrNullOf(localName); - return el != null && isLastElement(el); - } - - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - - } - - public void endElement(ELEMENT element) throws SAXException { - - } - - public boolean isLastElement(ELEMENT element) { - return false; - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/binding/xml/UDA10ServiceDescriptorBinderImpl.java b/app/src/main/java/org/fourthline/cling/binding/xml/UDA10ServiceDescriptorBinderImpl.java deleted file mode 100644 index 8193d30..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/xml/UDA10ServiceDescriptorBinderImpl.java +++ /dev/null @@ -1,504 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.xml; - -import org.fourthline.cling.binding.staging.MutableAction; -import org.fourthline.cling.binding.staging.MutableActionArgument; -import org.fourthline.cling.binding.staging.MutableAllowedValueRange; -import org.fourthline.cling.binding.staging.MutableService; -import org.fourthline.cling.binding.staging.MutableStateVariable; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.XMLUtil; -import org.fourthline.cling.model.meta.Action; -import org.fourthline.cling.model.meta.ActionArgument; -import org.fourthline.cling.model.meta.QueryStateVariableAction; -import org.fourthline.cling.model.meta.RemoteService; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.meta.StateVariableEventDetails; -import org.fourthline.cling.model.types.CustomDatatype; -import org.fourthline.cling.model.types.Datatype; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.ErrorHandler; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.logging.Logger; - -import static org.fourthline.cling.binding.xml.Descriptor.Service.ATTRIBUTE; -import static org.fourthline.cling.binding.xml.Descriptor.Service.ELEMENT; -import static org.fourthline.cling.model.XMLUtil.appendNewElement; -import static org.fourthline.cling.model.XMLUtil.appendNewElementIfNotNull; - -/** - * Implementation based on JAXP DOM. - * - * @author Christian Bauer - */ -public class UDA10ServiceDescriptorBinderImpl implements ServiceDescriptorBinder, ErrorHandler { - - private static Logger log = Logger.getLogger(ServiceDescriptorBinder.class.getName()); - - public S describe(S undescribedService, String descriptorXml) throws DescriptorBindingException, ValidationException { - if (descriptorXml == null || descriptorXml.length() == 0) { - throw new DescriptorBindingException("Null or empty descriptor"); - } - - try { - log.fine("Populating service from XML descriptor: " + undescribedService); - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - DocumentBuilder documentBuilder = factory.newDocumentBuilder(); - documentBuilder.setErrorHandler(this); - - Document d = documentBuilder.parse( - new InputSource( - // TODO: UPNP VIOLATION: Virgin Media Superhub sends trailing spaces/newlines after last XML element, need to trim() - new StringReader(descriptorXml.trim()) - ) - ); - - return describe(undescribedService, d); - - } catch (ValidationException ex) { - throw ex; - } catch (Exception ex) { - throw new DescriptorBindingException("Could not parse service descriptor: " + ex.toString(), ex); - } - } - - public S describe(S undescribedService, Document dom) throws DescriptorBindingException, ValidationException { - try { - log.fine("Populating service from DOM: " + undescribedService); - - // Read the XML into a mutable descriptor graph - MutableService descriptor = new MutableService(); - - hydrateBasic(descriptor, undescribedService); - - Element rootElement = dom.getDocumentElement(); - hydrateRoot(descriptor, rootElement); - - // Build the immutable descriptor graph - return buildInstance(undescribedService, descriptor); - - } catch (ValidationException ex) { - throw ex; - } catch (Exception ex) { - throw new DescriptorBindingException("Could not parse service DOM: " + ex.toString(), ex); - } - } - - protected S buildInstance(S undescribedService, MutableService descriptor) throws ValidationException { - return (S)descriptor.build(undescribedService.getDevice()); - } - - protected void hydrateBasic(MutableService descriptor, Service undescribedService) { - descriptor.serviceId = undescribedService.getServiceId(); - descriptor.serviceType = undescribedService.getServiceType(); - if (undescribedService instanceof RemoteService) { - RemoteService rs = (RemoteService) undescribedService; - descriptor.controlURI = rs.getControlURI(); - descriptor.eventSubscriptionURI = rs.getEventSubscriptionURI(); - descriptor.descriptorURI = rs.getDescriptorURI(); - } - } - - protected void hydrateRoot(MutableService descriptor, Element rootElement) - throws DescriptorBindingException { - - // We don't check the XMLNS, nobody bothers anyway... - - if (!ELEMENT.scpd.equals(rootElement)) { - throw new DescriptorBindingException("Root element name is not : " + rootElement.getNodeName()); - } - - NodeList rootChildren = rootElement.getChildNodes(); - - for (int i = 0; i < rootChildren.getLength(); i++) { - Node rootChild = rootChildren.item(i); - - if (rootChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.specVersion.equals(rootChild)) { - // We don't care about UDA major/minor specVersion anymore - whoever had the brilliant idea that - // the spec versions can be declared on devices _AND_ on their services should have their fingers - // broken so they never touch a keyboard again. - // hydrateSpecVersion(descriptor, rootChild); - } else if (ELEMENT.actionList.equals(rootChild)) { - hydrateActionList(descriptor, rootChild); - } else if (ELEMENT.serviceStateTable.equals(rootChild)) { - hydrateServiceStateTableList(descriptor, rootChild); - } else { - log.finer("Ignoring unknown element: " + rootChild.getNodeName()); - } - } - - } - - /* - public void hydrateSpecVersion(MutableService descriptor, Node specVersionNode) - throws DescriptorBindingException { - - NodeList specVersionChildren = specVersionNode.getChildNodes(); - for (int i = 0; i < specVersionChildren.getLength(); i++) { - Node specVersionChild = specVersionChildren.item(i); - - if (specVersionChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - MutableUDAVersion version = new MutableUDAVersion(); - if (ELEMENT.major.equals(specVersionChild)) { - version.major = Integer.valueOf(XMLUtil.getTextContent(specVersionChild)); - } else if (ELEMENT.minor.equals(specVersionChild)) { - version.minor = Integer.valueOf(XMLUtil.getTextContent(specVersionChild)); - } - } - } - */ - - public void hydrateActionList(MutableService descriptor, Node actionListNode) throws DescriptorBindingException { - - NodeList actionListChildren = actionListNode.getChildNodes(); - for (int i = 0; i < actionListChildren.getLength(); i++) { - Node actionListChild = actionListChildren.item(i); - - if (actionListChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.action.equals(actionListChild)) { - MutableAction action = new MutableAction(); - hydrateAction(action, actionListChild); - descriptor.actions.add(action); - } - } - } - - public void hydrateAction(MutableAction action, Node actionNode) { - - NodeList actionNodeChildren = actionNode.getChildNodes(); - for (int i = 0; i < actionNodeChildren.getLength(); i++) { - Node actionNodeChild = actionNodeChildren.item(i); - - if (actionNodeChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.name.equals(actionNodeChild)) { - action.name = XMLUtil.getTextContent(actionNodeChild); - } else if (ELEMENT.argumentList.equals(actionNodeChild)) { - - - NodeList argumentChildren = actionNodeChild.getChildNodes(); - for (int j = 0; j < argumentChildren.getLength(); j++) { - Node argumentChild = argumentChildren.item(j); - - if (argumentChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - MutableActionArgument actionArgument = new MutableActionArgument(); - hydrateActionArgument(actionArgument, argumentChild); - action.arguments.add(actionArgument); - } - } - } - - } - - public void hydrateActionArgument(MutableActionArgument actionArgument, Node actionArgumentNode) { - - NodeList argumentNodeChildren = actionArgumentNode.getChildNodes(); - for (int i = 0; i < argumentNodeChildren.getLength(); i++) { - Node argumentNodeChild = argumentNodeChildren.item(i); - - if (argumentNodeChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.name.equals(argumentNodeChild)) { - actionArgument.name = XMLUtil.getTextContent(argumentNodeChild); - } else if (ELEMENT.direction.equals(argumentNodeChild)) { - String directionString = XMLUtil.getTextContent(argumentNodeChild); - try { - actionArgument.direction = ActionArgument.Direction.valueOf(directionString.toUpperCase(Locale.ENGLISH)); - } catch (IllegalArgumentException ex) { - // TODO: UPNP VIOLATION: Pelco SpectraIV-IP uses illegal value INOUT - log.warning("UPnP specification violation: Invalid action argument direction, assuming 'IN': " + directionString); - actionArgument.direction = ActionArgument.Direction.IN; - } - } else if (ELEMENT.relatedStateVariable.equals(argumentNodeChild)) { - actionArgument.relatedStateVariable = XMLUtil.getTextContent(argumentNodeChild); - } else if (ELEMENT.retval.equals(argumentNodeChild)) { - actionArgument.retval = true; - } - } - } - - public void hydrateServiceStateTableList(MutableService descriptor, Node serviceStateTableNode) { - - NodeList serviceStateTableChildren = serviceStateTableNode.getChildNodes(); - for (int i = 0; i < serviceStateTableChildren.getLength(); i++) { - Node serviceStateTableChild = serviceStateTableChildren.item(i); - - if (serviceStateTableChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.stateVariable.equals(serviceStateTableChild)) { - MutableStateVariable stateVariable = new MutableStateVariable(); - hydrateStateVariable(stateVariable, (Element) serviceStateTableChild); - descriptor.stateVariables.add(stateVariable); - } - } - } - - public void hydrateStateVariable(MutableStateVariable stateVariable, Element stateVariableElement) { - - stateVariable.eventDetails = new StateVariableEventDetails( - stateVariableElement.getAttribute("sendEvents") != null && - stateVariableElement.getAttribute(ATTRIBUTE.sendEvents.toString()).toUpperCase(Locale.ENGLISH).equals("YES") - ); - - NodeList stateVariableChildren = stateVariableElement.getChildNodes(); - for (int i = 0; i < stateVariableChildren.getLength(); i++) { - Node stateVariableChild = stateVariableChildren.item(i); - - if (stateVariableChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.name.equals(stateVariableChild)) { - stateVariable.name = XMLUtil.getTextContent(stateVariableChild); - } else if (ELEMENT.dataType.equals(stateVariableChild)) { - String dtName = XMLUtil.getTextContent(stateVariableChild); - Datatype.Builtin builtin = Datatype.Builtin.getByDescriptorName(dtName); - stateVariable.dataType = builtin != null ? builtin.getDatatype() : new CustomDatatype(dtName); - } else if (ELEMENT.defaultValue.equals(stateVariableChild)) { - stateVariable.defaultValue = XMLUtil.getTextContent(stateVariableChild); - } else if (ELEMENT.allowedValueList.equals(stateVariableChild)) { - - List allowedValues = new ArrayList(); - - NodeList allowedValueListChildren = stateVariableChild.getChildNodes(); - for (int j = 0; j < allowedValueListChildren.getLength(); j++) { - Node allowedValueListChild = allowedValueListChildren.item(j); - - if (allowedValueListChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.allowedValue.equals(allowedValueListChild)) - allowedValues.add(XMLUtil.getTextContent(allowedValueListChild)); - } - - stateVariable.allowedValues = allowedValues; - - } else if (ELEMENT.allowedValueRange.equals(stateVariableChild)) { - - MutableAllowedValueRange range = new MutableAllowedValueRange(); - - NodeList allowedValueRangeChildren = stateVariableChild.getChildNodes(); - for (int j = 0; j < allowedValueRangeChildren.getLength(); j++) { - Node allowedValueRangeChild = allowedValueRangeChildren.item(j); - - if (allowedValueRangeChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (ELEMENT.minimum.equals(allowedValueRangeChild)) { - try { - range.minimum = Long.valueOf(XMLUtil.getTextContent(allowedValueRangeChild)); - } catch (Exception ex) { - } - } else if (ELEMENT.maximum.equals(allowedValueRangeChild)) { - try { - range.maximum = Long.valueOf(XMLUtil.getTextContent(allowedValueRangeChild)); - } catch (Exception ex) { - } - } else if (ELEMENT.step.equals(allowedValueRangeChild)) { - try { - range.step = Long.valueOf(XMLUtil.getTextContent(allowedValueRangeChild)); - } catch (Exception ex) { - } - } - } - - stateVariable.allowedValueRange = range; - } - } - } - - public String generate(Service service) throws DescriptorBindingException { - try { - log.fine("Generating XML descriptor from service model: " + service); - - return XMLUtil.documentToString(buildDOM(service)); - - } catch (Exception ex) { - throw new DescriptorBindingException("Could not build DOM: " + ex.getMessage(), ex); - } - } - - public Document buildDOM(Service service) throws DescriptorBindingException { - - try { - log.fine("Generting XML descriptor from service model: " + service); - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - - Document d = factory.newDocumentBuilder().newDocument(); - generateScpd(service, d); - - return d; - - } catch (Exception ex) { - throw new DescriptorBindingException("Could not generate service descriptor: " + ex.getMessage(), ex); - } - } - - private void generateScpd(Service serviceModel, Document descriptor) { - - Element scpdElement = descriptor.createElementNS(Descriptor.Service.NAMESPACE_URI, ELEMENT.scpd.toString()); - descriptor.appendChild(scpdElement); - - generateSpecVersion(serviceModel, descriptor, scpdElement); - if (serviceModel.hasActions()) { - generateActionList(serviceModel, descriptor, scpdElement); - } - generateServiceStateTable(serviceModel, descriptor, scpdElement); - } - - private void generateSpecVersion(Service serviceModel, Document descriptor, Element rootElement) { - Element specVersionElement = appendNewElement(descriptor, rootElement, ELEMENT.specVersion); - appendNewElementIfNotNull(descriptor, specVersionElement, ELEMENT.major, serviceModel.getDevice().getVersion().getMajor()); - appendNewElementIfNotNull(descriptor, specVersionElement, ELEMENT.minor, serviceModel.getDevice().getVersion().getMinor()); - } - - private void generateActionList(Service serviceModel, Document descriptor, Element scpdElement) { - - Element actionListElement = appendNewElement(descriptor, scpdElement, ELEMENT.actionList); - - for (Action action : serviceModel.getActions()) { - if (!action.getName().equals(QueryStateVariableAction.ACTION_NAME)) - generateAction(action, descriptor, actionListElement); - } - } - - private void generateAction(Action action, Document descriptor, Element actionListElement) { - - Element actionElement = appendNewElement(descriptor, actionListElement, ELEMENT.action); - - appendNewElementIfNotNull(descriptor, actionElement, ELEMENT.name, action.getName()); - - if (action.hasArguments()) { - Element argumentListElement = appendNewElement(descriptor, actionElement, ELEMENT.argumentList); - for (ActionArgument actionArgument : action.getArguments()) { - generateActionArgument(actionArgument, descriptor, argumentListElement); - } - } - } - - private void generateActionArgument(ActionArgument actionArgument, Document descriptor, Element actionElement) { - - Element actionArgumentElement = appendNewElement(descriptor, actionElement, ELEMENT.argument); - - appendNewElementIfNotNull(descriptor, actionArgumentElement, ELEMENT.name, actionArgument.getName()); - appendNewElementIfNotNull(descriptor, actionArgumentElement, ELEMENT.direction, actionArgument.getDirection().toString().toLowerCase(Locale.ENGLISH)); - if (actionArgument.isReturnValue()) { - // TODO: UPNP VIOLATION: WMP12 will discard RenderingControl service if it contains tags - log.warning("UPnP specification violation: Not producing element to be compatible with WMP12: " + actionArgument); - // appendNewElement(descriptor, actionArgumentElement, ELEMENT.retval); - } - appendNewElementIfNotNull(descriptor, actionArgumentElement, ELEMENT.relatedStateVariable, actionArgument.getRelatedStateVariableName()); - } - - private void generateServiceStateTable(Service serviceModel, Document descriptor, Element scpdElement) { - - Element serviceStateTableElement = appendNewElement(descriptor, scpdElement, ELEMENT.serviceStateTable); - - for (StateVariable stateVariable : serviceModel.getStateVariables()) { - generateStateVariable(stateVariable, descriptor, serviceStateTableElement); - } - } - - private void generateStateVariable(StateVariable stateVariable, Document descriptor, Element serviveStateTableElement) { - - Element stateVariableElement = appendNewElement(descriptor, serviveStateTableElement, ELEMENT.stateVariable); - - appendNewElementIfNotNull(descriptor, stateVariableElement, ELEMENT.name, stateVariable.getName()); - - if (stateVariable.getTypeDetails().getDatatype() instanceof CustomDatatype) { - appendNewElementIfNotNull(descriptor, stateVariableElement, ELEMENT.dataType, - ((CustomDatatype)stateVariable.getTypeDetails().getDatatype()).getName()); - } else { - appendNewElementIfNotNull(descriptor, stateVariableElement, ELEMENT.dataType, - stateVariable.getTypeDetails().getDatatype().getBuiltin().getDescriptorName()); - } - - appendNewElementIfNotNull(descriptor, stateVariableElement, ELEMENT.defaultValue, - stateVariable.getTypeDetails().getDefaultValue()); - - // The default is 'yes' but we generate it anyway just to be sure - if (stateVariable.getEventDetails().isSendEvents()) { - stateVariableElement.setAttribute(ATTRIBUTE.sendEvents.toString(), "yes"); - } else { - stateVariableElement.setAttribute(ATTRIBUTE.sendEvents.toString(), "no"); - } - - if (stateVariable.getTypeDetails().getAllowedValues() != null) { - Element allowedValueListElement = appendNewElement(descriptor, stateVariableElement, ELEMENT.allowedValueList); - for (String allowedValue : stateVariable.getTypeDetails().getAllowedValues()) { - appendNewElementIfNotNull(descriptor, allowedValueListElement, ELEMENT.allowedValue, allowedValue); - } - } - - if (stateVariable.getTypeDetails().getAllowedValueRange() != null) { - Element allowedValueRangeElement = appendNewElement(descriptor, stateVariableElement, ELEMENT.allowedValueRange); - appendNewElementIfNotNull( - descriptor, allowedValueRangeElement, ELEMENT.minimum, stateVariable.getTypeDetails().getAllowedValueRange().getMinimum() - ); - appendNewElementIfNotNull( - descriptor, allowedValueRangeElement, ELEMENT.maximum, stateVariable.getTypeDetails().getAllowedValueRange().getMaximum() - ); - if (stateVariable.getTypeDetails().getAllowedValueRange().getStep() >= 1l) { - appendNewElementIfNotNull( - descriptor, allowedValueRangeElement, ELEMENT.step, stateVariable.getTypeDetails().getAllowedValueRange().getStep() - ); - } - } - - } - - public void warning(SAXParseException e) throws SAXException { - log.warning(e.toString()); - } - - public void error(SAXParseException e) throws SAXException { - throw e; - } - - public void fatalError(SAXParseException e) throws SAXException { - throw e; - } -} - diff --git a/app/src/main/java/org/fourthline/cling/binding/xml/UDA10ServiceDescriptorBinderSAXImpl.java b/app/src/main/java/org/fourthline/cling/binding/xml/UDA10ServiceDescriptorBinderSAXImpl.java deleted file mode 100644 index 57355ba..0000000 --- a/app/src/main/java/org/fourthline/cling/binding/xml/UDA10ServiceDescriptorBinderSAXImpl.java +++ /dev/null @@ -1,448 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.binding.xml; - -import org.fourthline.cling.binding.staging.MutableAction; -import org.fourthline.cling.binding.staging.MutableActionArgument; -import org.fourthline.cling.binding.staging.MutableAllowedValueRange; -import org.fourthline.cling.binding.staging.MutableService; -import org.fourthline.cling.binding.staging.MutableStateVariable; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.meta.ActionArgument; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.meta.StateVariableEventDetails; -import org.fourthline.cling.model.types.CustomDatatype; -import org.fourthline.cling.model.types.Datatype; -import org.seamless.xml.SAXParser; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.logging.Logger; - -import static org.fourthline.cling.binding.xml.Descriptor.Service.ATTRIBUTE; -import static org.fourthline.cling.binding.xml.Descriptor.Service.ELEMENT; - -/** - * Implementation based on JAXP SAX. - * - * @author Christian Bauer - */ -public class UDA10ServiceDescriptorBinderSAXImpl extends UDA10ServiceDescriptorBinderImpl { - - private static Logger log = Logger.getLogger(ServiceDescriptorBinder.class.getName()); - - @Override - public S describe(S undescribedService, String descriptorXml) throws DescriptorBindingException, ValidationException { - - if (descriptorXml == null || descriptorXml.length() == 0) { - throw new DescriptorBindingException("Null or empty descriptor"); - } - - try { - log.fine("Reading service from XML descriptor"); - - SAXParser parser = new SAXParser(); - - MutableService descriptor = new MutableService(); - - hydrateBasic(descriptor, undescribedService); - - new RootHandler(descriptor, parser); - - parser.parse( - new InputSource( - // TODO: UPNP VIOLATION: Virgin Media Superhub sends trailing spaces/newlines after last XML element, need to trim() - new StringReader(descriptorXml.trim()) - ) - ); - - // Build the immutable descriptor graph - return (S)descriptor.build(undescribedService.getDevice()); - - } catch (ValidationException ex) { - throw ex; - } catch (Exception ex) { - throw new DescriptorBindingException("Could not parse service descriptor: " + ex.toString(), ex); - } - } - - protected static class RootHandler extends ServiceDescriptorHandler { - - public RootHandler(MutableService instance, SAXParser parser) { - super(instance, parser); - } - - @Override - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - - /* - if (element.equals(SpecVersionHandler.EL)) { - MutableUDAVersion udaVersion = new MutableUDAVersion(); - getInstance().udaVersion = udaVersion; - new SpecVersionHandler(udaVersion, this); - } - */ - - if (element.equals(ActionListHandler.EL)) { - List actions = new ArrayList(); - getInstance().actions = actions; - new ActionListHandler(actions, this); - } - - if (element.equals(StateVariableListHandler.EL)) { - List stateVariables = new ArrayList(); - getInstance().stateVariables = stateVariables; - new StateVariableListHandler(stateVariables, this); - } - - } - } - - /* - protected static class SpecVersionHandler extends ServiceDescriptorHandler { - - public static final ELEMENT EL = ELEMENT.specVersion; - - public SpecVersionHandler(MutableUDAVersion instance, ServiceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void endElement(ELEMENT element) throws SAXException { - switch (element) { - case major: - getInstance().major = Integer.valueOf(getCharacters()); - break; - case minor: - getInstance().minor = Integer.valueOf(getCharacters()); - break; - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - */ - - protected static class ActionListHandler extends ServiceDescriptorHandler> { - - public static final ELEMENT EL = ELEMENT.actionList; - - public ActionListHandler(List instance, ServiceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - if (element.equals(ActionHandler.EL)) { - MutableAction action = new MutableAction(); - getInstance().add(action); - new ActionHandler(action, this); - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class ActionHandler extends ServiceDescriptorHandler { - - public static final ELEMENT EL = ELEMENT.action; - - public ActionHandler(MutableAction instance, ServiceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - if (element.equals(ActionArgumentListHandler.EL)) { - List arguments = new ArrayList(); - getInstance().arguments = arguments; - new ActionArgumentListHandler(arguments, this); - } - } - - @Override - public void endElement(ELEMENT element) throws SAXException { - switch (element) { - case name: - getInstance().name = getCharacters(); - break; - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class ActionArgumentListHandler extends ServiceDescriptorHandler> { - - public static final ELEMENT EL = ELEMENT.argumentList; - - public ActionArgumentListHandler(List instance, ServiceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - if (element.equals(ActionArgumentHandler.EL)) { - MutableActionArgument argument = new MutableActionArgument(); - getInstance().add(argument); - new ActionArgumentHandler(argument, this); - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class ActionArgumentHandler extends ServiceDescriptorHandler { - - public static final ELEMENT EL = ELEMENT.argument; - - public ActionArgumentHandler(MutableActionArgument instance, ServiceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void endElement(ELEMENT element) throws SAXException { - switch (element) { - case name: - getInstance().name = getCharacters(); - break; - case direction: - String directionString = getCharacters(); - try { - getInstance().direction = ActionArgument.Direction.valueOf(directionString.toUpperCase(Locale.ENGLISH)); - } catch (IllegalArgumentException ex) { - // TODO: UPNP VIOLATION: Pelco SpectraIV-IP uses illegal value INOUT - log.warning("UPnP specification violation: Invalid action argument direction, assuming 'IN': " + directionString); - getInstance().direction = ActionArgument.Direction.IN; - } - break; - case relatedStateVariable: - getInstance().relatedStateVariable = getCharacters(); - break; - case retval: - getInstance().retval = true; - break; - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class StateVariableListHandler extends ServiceDescriptorHandler> { - - public static final ELEMENT EL = ELEMENT.serviceStateTable; - - public StateVariableListHandler(List instance, ServiceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - if (element.equals(StateVariableHandler.EL)) { - MutableStateVariable stateVariable = new MutableStateVariable(); - - String sendEventsAttributeValue = attributes.getValue(ATTRIBUTE.sendEvents.toString()); - stateVariable.eventDetails = new StateVariableEventDetails( - sendEventsAttributeValue != null && sendEventsAttributeValue.toUpperCase(Locale.ENGLISH).equals("YES") - ); - - getInstance().add(stateVariable); - new StateVariableHandler(stateVariable, this); - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class StateVariableHandler extends ServiceDescriptorHandler { - - public static final ELEMENT EL = ELEMENT.stateVariable; - - public StateVariableHandler(MutableStateVariable instance, ServiceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - if (element.equals(AllowedValueListHandler.EL)) { - List allowedValues = new ArrayList(); - getInstance().allowedValues = allowedValues; - new AllowedValueListHandler(allowedValues, this); - } - - if (element.equals(AllowedValueRangeHandler.EL)) { - MutableAllowedValueRange allowedValueRange = new MutableAllowedValueRange(); - getInstance().allowedValueRange = allowedValueRange; - new AllowedValueRangeHandler(allowedValueRange, this); - } - } - - @Override - public void endElement(ELEMENT element) throws SAXException { - switch (element) { - case name: - getInstance().name = getCharacters(); - break; - case dataType: - String dtName = getCharacters(); - Datatype.Builtin builtin = Datatype.Builtin.getByDescriptorName(dtName); - getInstance().dataType = builtin != null ? builtin.getDatatype() : new CustomDatatype(dtName); - break; - case defaultValue: - getInstance().defaultValue = getCharacters(); - break; - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class AllowedValueListHandler extends ServiceDescriptorHandler> { - - public static final ELEMENT EL = ELEMENT.allowedValueList; - - public AllowedValueListHandler(List instance, ServiceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void endElement(ELEMENT element) throws SAXException { - switch (element) { - case allowedValue: - getInstance().add(getCharacters()); - break; - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class AllowedValueRangeHandler extends ServiceDescriptorHandler { - - public static final ELEMENT EL = ELEMENT.allowedValueRange; - - public AllowedValueRangeHandler(MutableAllowedValueRange instance, ServiceDescriptorHandler parent) { - super(instance, parent); - } - - @Override - public void endElement(ELEMENT element) throws SAXException { - try { - switch (element) { - case minimum: - getInstance().minimum = Long.valueOf(getCharacters()); - break; - case maximum: - getInstance().maximum = Long.valueOf(getCharacters()); - break; - case step: - getInstance().step = Long.valueOf(getCharacters()); - break; - } - } catch (Exception ex) { - // Ignore - } - } - - @Override - public boolean isLastElement(ELEMENT element) { - return element.equals(EL); - } - } - - protected static class ServiceDescriptorHandler extends SAXParser.Handler { - - public ServiceDescriptorHandler(I instance) { - super(instance); - } - - public ServiceDescriptorHandler(I instance, SAXParser parser) { - super(instance, parser); - } - - public ServiceDescriptorHandler(I instance, ServiceDescriptorHandler parent) { - super(instance, parent); - } - - public ServiceDescriptorHandler(I instance, SAXParser parser, ServiceDescriptorHandler parent) { - super(instance, parser, parent); - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - super.startElement(uri, localName, qName, attributes); - ELEMENT el = ELEMENT.valueOrNullOf(localName); - if (el == null) return; - startElement(el, attributes); - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - super.endElement(uri, localName, qName); - ELEMENT el = ELEMENT.valueOrNullOf(localName); - if (el == null) return; - endElement(el); - } - - @Override - protected boolean isLastElement(String uri, String localName, String qName) { - ELEMENT el = ELEMENT.valueOrNullOf(localName); - return el != null && isLastElement(el); - } - - public void startElement(ELEMENT element, Attributes attributes) throws SAXException { - - } - - public void endElement(ELEMENT element) throws SAXException { - - } - - public boolean isLastElement(ELEMENT element) { - return false; - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/controlpoint/ActionCallback.java b/app/src/main/java/org/fourthline/cling/controlpoint/ActionCallback.java deleted file mode 100644 index 22fd764..0000000 --- a/app/src/main/java/org/fourthline/cling/controlpoint/ActionCallback.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.controlpoint; - -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.control.IncomingActionResponseMessage; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.meta.RemoteService; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.protocol.sync.SendingAction; - -import java.net.URL; - -/** - * Execute actions on any service. - *

- * Usage example for asynchronous execution in a background thread: - *

- *
- * Service service = device.findService(new UDAServiceId("SwitchPower"));
- * Action getStatusAction = service.getAction("GetStatus");
- * ActionInvocation getStatusInvocation = new ActionInvocation(getStatusAction);
- *
- * ActionCallback getStatusCallback = new ActionCallback(getStatusInvocation) {
- *
- *      public void success(ActionInvocation invocation) {
- *          ActionArgumentValue status  = invocation.getOutput("ResultStatus");
- *          assertEquals((Boolean) status.getValue(), Boolean.valueOf(false));
- *      }
- *
- *      public void failure(ActionInvocation invocation, UpnpResponse res) {
- *          System.err.println(
- *              createDefaultFailureMessage(invocation, res)
- *          );
- *      }
- * };
- *
- * upnpService.getControlPoint().execute(getStatusCallback)
- * 
- *

- * You can also execute the action synchronously in the same thread using the - * {@link org.fourthline.cling.controlpoint.ActionCallback.Default} implementation: - *

- *
- * myActionInvocation.setInput("foo", bar);
- * new ActionCallback.Default(myActionInvocation, upnpService.getControlPoint()).run();
- * myActionInvocation.getOutput("baz");
- * 
- * - * @author Christian Bauer - */ -public abstract class ActionCallback implements Runnable { - - /** - * Empty implementation of callback methods, simplifies synchronous - * execution of an {@link org.fourthline.cling.model.action.ActionInvocation}. - */ - public static final class Default extends ActionCallback { - - public Default(ActionInvocation actionInvocation, ControlPoint controlPoint) { - super(actionInvocation, controlPoint); - } - - @Override - public void success(ActionInvocation invocation) { - } - - @Override - public void failure(ActionInvocation invocation, UpnpResponse operation, String defaultMsg) { - - } - } - - protected final ActionInvocation actionInvocation; - - protected ControlPoint controlPoint; - - protected ActionCallback(ActionInvocation actionInvocation, ControlPoint controlPoint) { - this.actionInvocation = actionInvocation; - this.controlPoint = controlPoint; - } - - protected ActionCallback(ActionInvocation actionInvocation) { - this.actionInvocation = actionInvocation; - } - - public ActionInvocation getActionInvocation() { - return actionInvocation; - } - - synchronized public ControlPoint getControlPoint() { - return controlPoint; - } - - synchronized public ActionCallback setControlPoint(ControlPoint controlPoint) { - this.controlPoint = controlPoint; - return this; - } - - public void run() { - Service service = actionInvocation.getAction().getService(); - - // Local execution - if (service instanceof LocalService) { - LocalService localService = (LocalService)service; - - // Executor validates input inside the execute() call immediately - localService.getExecutor(actionInvocation.getAction()).execute(actionInvocation); - - if (actionInvocation.getFailure() != null) { - failure(actionInvocation, null); - } else { - success(actionInvocation); - } - - // Remote execution - } else if (service instanceof RemoteService){ - - if (getControlPoint() == null) { - throw new IllegalStateException("Callback must be executed through ControlPoint"); - } - - RemoteService remoteService = (RemoteService)service; - - // Figure out the remote URL where we'd like to send the action request to - URL controLURL = remoteService.getDevice().normalizeURI(remoteService.getControlURI()); - - // Do it - SendingAction prot = getControlPoint().getProtocolFactory().createSendingAction(actionInvocation, controLURL); - prot.run(); - - IncomingActionResponseMessage response = prot.getOutputMessage(); - - if (response == null) { - failure(actionInvocation, null); - } else if (response.getOperation().isFailed()) { - failure(actionInvocation, response.getOperation()); - } else { - success(actionInvocation); - } - } - } - - protected String createDefaultFailureMessage(ActionInvocation invocation, UpnpResponse operation) { - String message = "Error: "; - final ActionException exception = invocation.getFailure(); - if (exception != null) { - message = message + exception.getMessage(); - } - if (operation != null) { - message = message + " (HTTP response was: " + operation.getResponseDetails() + ")"; - } - return message; - } - - protected void failure(ActionInvocation invocation, UpnpResponse operation) { - failure(invocation, operation, createDefaultFailureMessage(invocation, operation)); - } - - /** - * Called when the action invocation succeeded. - * - * @param invocation The successful invocation, call its getOutput() method for results. - */ - public abstract void success(ActionInvocation invocation); - - /** - * Called when the action invocation failed. - * - * @param invocation The failed invocation, call its getFailure() method for more details. - * @param operation If the invocation was on a remote service, the response message, otherwise null. - * @param defaultMsg A user-friendly error message generated from the invocation exception and response. - * @see #createDefaultFailureMessage - */ - public abstract void failure(ActionInvocation invocation, UpnpResponse operation, String defaultMsg); - - @Override - public String toString() { - return "(ActionCallback) " + actionInvocation; - } -} diff --git a/app/src/main/java/org/fourthline/cling/controlpoint/ControlPoint.java b/app/src/main/java/org/fourthline/cling/controlpoint/ControlPoint.java deleted file mode 100644 index aba45f7..0000000 --- a/app/src/main/java/org/fourthline/cling/controlpoint/ControlPoint.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.controlpoint; - -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.UpnpServiceConfiguration; -import org.fourthline.cling.registry.Registry; - -import java.util.concurrent.Future; - -/** - * Unified API for the asynchronous execution of network searches, actions, event subscriptions. - * - * @author Christian Bauer - */ -public interface ControlPoint { - - public UpnpServiceConfiguration getConfiguration(); - public ProtocolFactory getProtocolFactory(); - public Registry getRegistry(); - - public void search(); - public void search(UpnpHeader searchType); - public void search(int mxSeconds); - public void search(UpnpHeader searchType, int mxSeconds); - public Future execute(ActionCallback callback); - public void execute(SubscriptionCallback callback); - -} diff --git a/app/src/main/java/org/fourthline/cling/controlpoint/ControlPointImpl.java b/app/src/main/java/org/fourthline/cling/controlpoint/ControlPointImpl.java deleted file mode 100644 index 2180eaa..0000000 --- a/app/src/main/java/org/fourthline/cling/controlpoint/ControlPointImpl.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.controlpoint; - -import org.fourthline.cling.UpnpServiceConfiguration; -import org.fourthline.cling.controlpoint.event.ExecuteAction; -import org.fourthline.cling.controlpoint.event.Search; -import org.fourthline.cling.model.message.header.MXHeader; -import org.fourthline.cling.model.message.header.STAllHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.registry.Registry; - -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Observes; -import javax.inject.Inject; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; -import java.util.logging.Logger; - -/** - * Default implementation. - *

- * This implementation uses the executor returned by - * {@link org.fourthline.cling.UpnpServiceConfiguration#getSyncProtocolExecutorService()}. - *

- * - * @author Christian Bauer - */ -@ApplicationScoped -public class ControlPointImpl implements ControlPoint { - - private static Logger log = Logger.getLogger(ControlPointImpl.class.getName()); - - protected UpnpServiceConfiguration configuration; - protected ProtocolFactory protocolFactory; - protected Registry registry; - - protected ControlPointImpl() { - } - - @Inject - public ControlPointImpl(UpnpServiceConfiguration configuration, ProtocolFactory protocolFactory, Registry registry) { - log.fine("Creating ControlPoint: " + getClass().getName()); - - this.configuration = configuration; - this.protocolFactory = protocolFactory; - this.registry = registry; - } - - public UpnpServiceConfiguration getConfiguration() { - return configuration; - } - - public ProtocolFactory getProtocolFactory() { - return protocolFactory; - } - - public Registry getRegistry() { - return registry; - } - - public void search(@Observes Search search) { - search(search.getSearchType(), search.getMxSeconds()); - } - - public void search() { - search(new STAllHeader(), MXHeader.DEFAULT_VALUE); - } - - public void search(UpnpHeader searchType) { - search(searchType, MXHeader.DEFAULT_VALUE); - } - - public void search(int mxSeconds) { - search(new STAllHeader(), mxSeconds); - } - - public void search(UpnpHeader searchType, int mxSeconds) { - log.fine("Sending asynchronous search for: " + searchType.getString()); - getConfiguration().getAsyncProtocolExecutor().execute( - getProtocolFactory().createSendingSearch(searchType, mxSeconds) - ); - } - - public void execute(ExecuteAction executeAction) { - execute(executeAction.getCallback()); - } - - public Future execute(ActionCallback callback) { - log.fine("Invoking action in background: " + callback); - callback.setControlPoint(this); - ExecutorService executor = getConfiguration().getSyncProtocolExecutorService(); - return executor.submit(callback); - } - - public void execute(SubscriptionCallback callback) { - log.fine("Invoking subscription in background: " + callback); - callback.setControlPoint(this); - getConfiguration().getSyncProtocolExecutorService().execute(callback); - } -} diff --git a/app/src/main/java/org/fourthline/cling/controlpoint/SubscriptionCallback.java b/app/src/main/java/org/fourthline/cling/controlpoint/SubscriptionCallback.java deleted file mode 100644 index 15f63ee..0000000 --- a/app/src/main/java/org/fourthline/cling/controlpoint/SubscriptionCallback.java +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.controlpoint; - -import org.fourthline.cling.model.UnsupportedDataException; -import org.fourthline.cling.model.UserConstants; -import org.fourthline.cling.model.gena.CancelReason; -import org.fourthline.cling.model.gena.GENASubscription; -import org.fourthline.cling.model.gena.LocalGENASubscription; -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.meta.RemoteService; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.protocol.ProtocolCreationException; -import org.fourthline.cling.protocol.sync.SendingSubscribe; -import org.seamless.util.Exceptions; - -import java.util.Collections; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Subscribe and receive events from a service through GENA. - *

- * Usage example, establishing a subscription with a {@link org.fourthline.cling.model.meta.Service}: - *

- *
- * SubscriptionCallback callback = new SubscriptionCallback(service, 600) { // Timeout in seconds
- *
- *      public void established(GENASubscription sub) {
- *          System.out.println("Established: " + sub.getSubscriptionId());
- *      }
- *
- *      public void failed(GENASubscription sub, UpnpResponse response, Exception ex) {
- *          System.err.println(
- *              createDefaultFailureMessage(response, ex)
- *          );
- *      }
- *
- *      public void ended(GENASubscription sub, CancelReason reason, UpnpResponse response) {
- *          // Reason should be null, or it didn't end regularly
- *      }
- *
- *      public void eventReceived(GENASubscription sub) {
- *          System.out.println("Event: " + sub.getCurrentSequence().getValue());
- *          Map<String, StateVariableValue> values = sub.getCurrentValues();
- *          StateVariableValue status = values.get("Status");
- *          System.out.println("Status is: " + status.toString());
- *      }
- *
- *      public void eventsMissed(GENASubscription sub, int numberOfMissedEvents) {
- *          System.out.println("Missed events: " + numberOfMissedEvents);
- *      }
- * };
- *
- * upnpService.getControlPoint().execute(callback);
- * 
- * - * @author Christian Bauer - */ -public abstract class SubscriptionCallback implements Runnable { - - protected static Logger log = Logger.getLogger(SubscriptionCallback.class.getName()); - - protected final Service service; - protected final Integer requestedDurationSeconds; - - private ControlPoint controlPoint; - private GENASubscription subscription; - - protected SubscriptionCallback(Service service) { - this.service = service; - this.requestedDurationSeconds = UserConstants.DEFAULT_SUBSCRIPTION_DURATION_SECONDS; - } - - protected SubscriptionCallback(Service service, int requestedDurationSeconds) { - this.service = service; - this.requestedDurationSeconds = requestedDurationSeconds; - } - - public Service getService() { - return service; - } - - synchronized public ControlPoint getControlPoint() { - return controlPoint; - } - - synchronized public void setControlPoint(ControlPoint controlPoint) { - this.controlPoint = controlPoint; - } - - synchronized public GENASubscription getSubscription() { - return subscription; - } - - synchronized public void setSubscription(GENASubscription subscription) { - this.subscription = subscription; - } - - synchronized public void run() { - if (getControlPoint() == null) { - throw new IllegalStateException("Callback must be executed through ControlPoint"); - } - - if (getService() instanceof LocalService) { - establishLocalSubscription((LocalService) service); - } else if (getService() instanceof RemoteService) { - establishRemoteSubscription((RemoteService) service); - } - } - - private void establishLocalSubscription(LocalService service) { - - if (getControlPoint().getRegistry().getLocalDevice(service.getDevice().getIdentity().getUdn(), false) == null) { - log.fine("Local device service is currently not registered, failing subscription immediately"); - failed(null, null, new IllegalStateException("Local device is not registered")); - return; - } - - // Local execution of subscription on local service re-uses the procedure and lifecycle that is - // used for inbound subscriptions from remote control points on local services! - // Except that it doesn't ever expire, we override the requested duration with Integer.MAX_VALUE! - - LocalGENASubscription localSubscription = null; - try { - localSubscription = - new LocalGENASubscription(service, Integer.MAX_VALUE, Collections.EMPTY_LIST) { - - public void failed(Exception ex) { - synchronized (SubscriptionCallback.this) { - SubscriptionCallback.this.setSubscription(null); - SubscriptionCallback.this.failed(null, null, ex); - } - } - - public void established() { - synchronized (SubscriptionCallback.this) { - SubscriptionCallback.this.setSubscription(this); - SubscriptionCallback.this.established(this); - } - } - - public void ended(CancelReason reason) { - synchronized (SubscriptionCallback.this) { - SubscriptionCallback.this.setSubscription(null); - SubscriptionCallback.this.ended(this, reason, null); - } - } - - public void eventReceived() { - synchronized (SubscriptionCallback.this) { - log.fine("Local service state updated, notifying callback, sequence is: " + getCurrentSequence()); - SubscriptionCallback.this.eventReceived(this); - incrementSequence(); - } - } - }; - - log.fine("Local device service is currently registered, also registering subscription"); - getControlPoint().getRegistry().addLocalSubscription(localSubscription); - - log.fine("Notifying subscription callback of local subscription availablity"); - localSubscription.establish(); - - log.fine("Simulating first initial event for local subscription callback, sequence: " + localSubscription.getCurrentSequence()); - eventReceived(localSubscription); - localSubscription.incrementSequence(); - - log.fine("Starting to monitor state changes of local service"); - localSubscription.registerOnService(); - - } catch (Exception ex) { - log.fine("Local callback creation failed: " + ex.toString()); - log.log(Level.FINE, "Exception root cause: ", Exceptions.unwrap(ex)); - if (localSubscription != null) - getControlPoint().getRegistry().removeLocalSubscription(localSubscription); - failed(localSubscription, null, ex); - } - } - - private void establishRemoteSubscription(RemoteService service) { - RemoteGENASubscription remoteSubscription = - new RemoteGENASubscription(service, requestedDurationSeconds) { - - public void failed(UpnpResponse responseStatus) { - synchronized (SubscriptionCallback.this) { - SubscriptionCallback.this.setSubscription(null); - SubscriptionCallback.this.failed(this, responseStatus, null); - } - } - - public void established() { - synchronized (SubscriptionCallback.this) { - SubscriptionCallback.this.setSubscription(this); - SubscriptionCallback.this.established(this); - } - } - - public void ended(CancelReason reason, UpnpResponse responseStatus) { - synchronized (SubscriptionCallback.this) { - SubscriptionCallback.this.setSubscription(null); - SubscriptionCallback.this.ended(this, reason, responseStatus); - } - } - - public void eventReceived() { - synchronized (SubscriptionCallback.this) { - SubscriptionCallback.this.eventReceived(this); - } - } - - public void eventsMissed(int numberOfMissedEvents) { - synchronized (SubscriptionCallback.this) { - SubscriptionCallback.this.eventsMissed(this, numberOfMissedEvents); - } - } - - public void invalidMessage(UnsupportedDataException ex) { - synchronized (SubscriptionCallback.this) { - SubscriptionCallback.this.invalidMessage(this, ex); - } - } - }; - - SendingSubscribe protocol; - try { - protocol = getControlPoint().getProtocolFactory().createSendingSubscribe(remoteSubscription); - } catch (ProtocolCreationException ex) { - failed(subscription, null, ex); - return; - } - protocol.run(); - } - - synchronized public void end() { - if (subscription == null) return; - if (subscription instanceof LocalGENASubscription) { - endLocalSubscription((LocalGENASubscription)subscription); - } else if (subscription instanceof RemoteGENASubscription) { - endRemoteSubscription((RemoteGENASubscription)subscription); - } - } - - private void endLocalSubscription(LocalGENASubscription subscription) { - log.fine("Removing local subscription and ending it in callback: " + subscription); - getControlPoint().getRegistry().removeLocalSubscription(subscription); - subscription.end(null); // No reason, on controlpoint request - } - - private void endRemoteSubscription(RemoteGENASubscription subscription) { - log.fine("Ending remote subscription: " + subscription); - getControlPoint().getConfiguration().getSyncProtocolExecutorService().execute( - getControlPoint().getProtocolFactory().createSendingUnsubscribe(subscription) - ); - } - - protected void failed(GENASubscription subscription, UpnpResponse responseStatus, Exception exception) { - failed(subscription, responseStatus, exception, createDefaultFailureMessage(responseStatus, exception)); - } - - /** - * Called when establishing a local or remote subscription failed. To get a nice error message that - * transparently detects local or remote errors use createDefaultFailureMessage(). - * - * @param subscription The failed subscription object, not very useful at this point. - * @param responseStatus For a remote subscription, if a response was received at all, this is it, otherwise null. - * @param exception For a local subscription and failed creation of a remote subscription protocol (before - * sending the subscribe request), any exception that caused the failure, otherwise null. - * @param defaultMsg A user-friendly error message. - * @see #createDefaultFailureMessage - */ - protected abstract void failed(GENASubscription subscription, UpnpResponse responseStatus, Exception exception, String defaultMsg); - - /** - * Called when a local or remote subscription was successfully established. - * - * @param subscription The successful subscription. - */ - protected abstract void established(GENASubscription subscription); - - /** - * Called when a local or remote subscription ended, either on user request or because of a failure. - * - * @param subscription The ended subscription instance. - * @param reason If the subscription ended regularly (through end()), this is null. - * @param responseStatus For a remote subscription, if the cause implies a remopte response and it was - * received, this is it (e.g. renewal failure response). - */ - protected abstract void ended(GENASubscription subscription, CancelReason reason, UpnpResponse responseStatus); - - /** - * Called when an event for an established subscription has been received. - *

- * Use the {@link org.fourthline.cling.model.gena.GENASubscription#getCurrentValues()} method to obtain - * the evented state variable values. - *

- * - * @param subscription The established subscription with fresh state variable values. - */ - protected abstract void eventReceived(GENASubscription subscription); - - /** - * Called when a received event was out of sequence, indicating that events have been missed. - *

- * It's up to you if you want to react to missed events or if you (can) silently ignore them. - *

- * @param subscription The established subscription. - * @param numberOfMissedEvents The number of missed events. - */ - protected abstract void eventsMissed(GENASubscription subscription, int numberOfMissedEvents); - - /** - * @param responseStatus The (HTTP) response or null if there was no response. - * @param exception The exception or null if there was no exception. - * @return A human-friendly error message. - */ - public static String createDefaultFailureMessage(UpnpResponse responseStatus, Exception exception) { - String message = "Subscription failed: "; - if (responseStatus != null) { - message = message + " HTTP response was: " + responseStatus.getResponseDetails(); - } else if (exception != null) { - message = message + " Exception occured: " + exception; - } else { - message = message + " No response received."; - } - return message; - } - - /** - * Called when a received event message could not be parsed successfully. - *

- * This typically indicates a broken device which is not UPnP compliant. You can - * react to this failure in any way you like, for example, you could terminate - * the subscription or simply create an error report/log. - *

- *

- * The default implementation will log the exception at INFO level, and - * the invalid XML at FINE level. - *

- * - * @param remoteGENASubscription The established subscription. - * @param ex Call {@link org.fourthline.cling.model.UnsupportedDataException#getData()} to access the invalid XML. - */ - protected void invalidMessage(RemoteGENASubscription remoteGENASubscription, - UnsupportedDataException ex) { - log.info("Invalid event message received, causing: " + ex); - if (log.isLoggable(Level.FINE)) { - log.fine("------------------------------------------------------------------------------"); - log.fine(ex.getData().toString()); - log.fine("------------------------------------------------------------------------------"); - } - } - - @Override - public String toString() { - return "(SubscriptionCallback) " + getService(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/controlpoint/event/ExecuteAction.java b/app/src/main/java/org/fourthline/cling/controlpoint/event/ExecuteAction.java deleted file mode 100644 index 6e4c5bf..0000000 --- a/app/src/main/java/org/fourthline/cling/controlpoint/event/ExecuteAction.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.controlpoint.event; - -import org.fourthline.cling.controlpoint.ActionCallback; - -/** - * @author Christian Bauer - */ -public class ExecuteAction { - - protected ActionCallback callback; - - public ExecuteAction(ActionCallback callback) { - this.callback = callback; - } - - public ActionCallback getCallback() { - return callback; - } -} diff --git a/app/src/main/java/org/fourthline/cling/controlpoint/event/Search.java b/app/src/main/java/org/fourthline/cling/controlpoint/event/Search.java deleted file mode 100644 index 7acb978..0000000 --- a/app/src/main/java/org/fourthline/cling/controlpoint/event/Search.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.controlpoint.event; - -import org.fourthline.cling.model.message.header.MXHeader; -import org.fourthline.cling.model.message.header.STAllHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; - -/** - * @author Christian Bauer - */ -public class Search { - - protected UpnpHeader searchType = new STAllHeader(); - protected int mxSeconds = MXHeader.DEFAULT_VALUE; - - public Search() { - } - - public Search(UpnpHeader searchType) { - this.searchType = searchType; - } - - public Search(UpnpHeader searchType, int mxSeconds) { - this.searchType = searchType; - this.mxSeconds = mxSeconds; - } - - public Search(int mxSeconds) { - this.mxSeconds = mxSeconds; - } - - public UpnpHeader getSearchType() { - return searchType; - } - - public int getMxSeconds() { - return mxSeconds; - } -} diff --git a/app/src/main/java/org/fourthline/cling/mock/MockProtocolFactory.java b/app/src/main/java/org/fourthline/cling/mock/MockProtocolFactory.java deleted file mode 100644 index 76e486e..0000000 --- a/app/src/main/java/org/fourthline/cling/mock/MockProtocolFactory.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.mock; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.gena.LocalGENASubscription; -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.protocol.ProtocolCreationException; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.protocol.ReceivingAsync; -import org.fourthline.cling.protocol.ReceivingSync; -import org.fourthline.cling.protocol.async.SendingNotificationAlive; -import org.fourthline.cling.protocol.async.SendingNotificationByebye; -import org.fourthline.cling.protocol.async.SendingSearch; -import org.fourthline.cling.protocol.sync.SendingAction; -import org.fourthline.cling.protocol.sync.SendingEvent; -import org.fourthline.cling.protocol.sync.SendingRenewal; -import org.fourthline.cling.protocol.sync.SendingSubscribe; -import org.fourthline.cling.protocol.sync.SendingUnsubscribe; - -import javax.enterprise.inject.Alternative; -import java.net.URL; - -/** - * @author Christian Bauer - */ -@Alternative -public class MockProtocolFactory implements ProtocolFactory { - - @Override - public UpnpService getUpnpService() { - return null; - } - - @Override - public ReceivingAsync createReceivingAsync(IncomingDatagramMessage message) throws ProtocolCreationException { - return null; - } - - @Override - public ReceivingSync createReceivingSync(StreamRequestMessage requestMessage) throws ProtocolCreationException { - return null; - } - - @Override - public SendingNotificationAlive createSendingNotificationAlive(LocalDevice localDevice) { - return null; - } - - @Override - public SendingNotificationByebye createSendingNotificationByebye(LocalDevice localDevice) { - return null; - } - - @Override - public SendingSearch createSendingSearch(UpnpHeader searchTarget, int mxSeconds) { - return null; - } - - @Override - public SendingAction createSendingAction(ActionInvocation actionInvocation, URL controlURL) { - return null; - } - - @Override - public SendingSubscribe createSendingSubscribe(RemoteGENASubscription subscription) { - return null; - } - - @Override - public SendingRenewal createSendingRenewal(RemoteGENASubscription subscription) { - return null; - } - - @Override - public SendingUnsubscribe createSendingUnsubscribe(RemoteGENASubscription subscription) { - return null; - } - - @Override - public SendingEvent createSendingEvent(LocalGENASubscription subscription) { - return null; - } -} diff --git a/app/src/main/java/org/fourthline/cling/mock/MockRouter.java b/app/src/main/java/org/fourthline/cling/mock/MockRouter.java deleted file mode 100644 index 8e386f4..0000000 --- a/app/src/main/java/org/fourthline/cling/mock/MockRouter.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.mock; - -import org.fourthline.cling.UpnpServiceConfiguration; -import org.fourthline.cling.model.NetworkAddress; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.OutgoingDatagramMessage; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.transport.Router; -import org.fourthline.cling.transport.RouterException; -import org.fourthline.cling.transport.impl.NetworkAddressFactoryImpl; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.transport.spi.NetworkAddressFactory; -import org.fourthline.cling.transport.spi.UpnpStream; - -import javax.enterprise.inject.Alternative; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - *

- * This is not a real network transport layer, it collects all messages instead and makes - * them available for testing with {@link #getOutgoingDatagramMessages()}, - * {@link #getSentStreamRequestMessages()}, etc. Mock responses for TCP (HTTP) stream requests - * can be returned by overriding {@link #getStreamResponseMessage(org.fourthline.cling.model.message.StreamRequestMessage)} - * or {@link #getStreamResponseMessages()} if you know the order of requests. - *

- * - * @author Christian Bauer - */ -@Alternative -public class MockRouter implements Router { - - public int counter = -1; - public List incomingDatagramMessages = new ArrayList(); - public List outgoingDatagramMessages = new ArrayList(); - public List receivedUpnpStreams = new ArrayList(); - public List sentStreamRequestMessages = new ArrayList(); - public List broadcastedBytes = new ArrayList(); - - protected UpnpServiceConfiguration configuration; - protected ProtocolFactory protocolFactory; - - public MockRouter(UpnpServiceConfiguration configuration, - ProtocolFactory protocolFactory) { - this.configuration = configuration; - this.protocolFactory = protocolFactory; - } - - @Override - public UpnpServiceConfiguration getConfiguration() { - return configuration; - } - - @Override - public ProtocolFactory getProtocolFactory() { - return protocolFactory; - } - - @Override - public boolean enable() throws RouterException { - return false; - } - - @Override - public boolean disable() throws RouterException { - return false; - } - - @Override - public void shutdown() throws RouterException { - } - - @Override - public boolean isEnabled() throws RouterException { - return false; - } - - @Override - public void handleStartFailure(InitializationException ex) throws InitializationException { - } - - @Override - public List getActiveStreamServers(InetAddress preferredAddress) throws RouterException { - // Simulate an active stream server, otherwise the notification/search response - // protocols won't even run - try { - return Arrays.asList( - new NetworkAddress( - InetAddress.getByName("127.0.0.1"), - NetworkAddressFactoryImpl.DEFAULT_TCP_HTTP_LISTEN_PORT - ) - ); - } catch (UnknownHostException ex) { - throw new RuntimeException(ex); - } - } - - public void received(IncomingDatagramMessage msg) { - incomingDatagramMessages.add(msg); - } - - public void received(UpnpStream stream) { - receivedUpnpStreams.add(stream); - } - - public void send(OutgoingDatagramMessage msg) throws RouterException { - outgoingDatagramMessages.add(msg); - } - - public StreamResponseMessage send(StreamRequestMessage msg) throws RouterException { - sentStreamRequestMessages.add(msg); - counter++; - return getStreamResponseMessages() != null - ? getStreamResponseMessages()[counter] - : getStreamResponseMessage(msg); - } - - public void broadcast(byte[] bytes) { - broadcastedBytes.add(bytes); - } - - public void resetStreamRequestMessageCounter() { - counter = -1; - } - - public List getIncomingDatagramMessages() { - return incomingDatagramMessages; - } - - public List getOutgoingDatagramMessages() { - return outgoingDatagramMessages; - } - - public List getReceivedUpnpStreams() { - return receivedUpnpStreams; - } - - public List getSentStreamRequestMessages() { - return sentStreamRequestMessages; - } - - public List getBroadcastedBytes() { - return broadcastedBytes; - } - - public StreamResponseMessage[] getStreamResponseMessages() { - return null; - } - - public StreamResponseMessage getStreamResponseMessage(StreamRequestMessage request) { - return null; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/mock/MockUpnpService.java b/app/src/main/java/org/fourthline/cling/mock/MockUpnpService.java deleted file mode 100644 index ffb49b3..0000000 --- a/app/src/main/java/org/fourthline/cling/mock/MockUpnpService.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.mock; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.UpnpServiceConfiguration; -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.controlpoint.ControlPointImpl; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.protocol.ProtocolFactoryImpl; -import org.fourthline.cling.protocol.async.SendingNotificationAlive; -import org.fourthline.cling.protocol.async.SendingSearch; -import org.fourthline.cling.registry.Registry; -import org.fourthline.cling.registry.RegistryImpl; -import org.fourthline.cling.registry.RegistryMaintainer; -import org.fourthline.cling.transport.RouterException; -import org.fourthline.cling.transport.spi.NetworkAddressFactory; - -import javax.enterprise.inject.Alternative; - -/** - * Simplifies testing of core and non-core modules. - *

- * It uses the {@link org.fourthline.cling.mock.MockUpnpService.MockProtocolFactory}. - *

- * - * @author Christian Bauer - */ -@Alternative -public class MockUpnpService implements UpnpService { - - protected final UpnpServiceConfiguration configuration; - protected final ControlPoint controlPoint; - protected final ProtocolFactory protocolFactory; - protected final Registry registry; - protected final MockRouter router; - - protected final NetworkAddressFactory networkAddressFactory; - - /** - * Single-thread of execution for the whole UPnP stack, no ALIVE messages or registry maintenance. - */ - public MockUpnpService() { - this(false, new MockUpnpServiceConfiguration(false, false)); - } - - /** - * No ALIVE messages. - */ - public MockUpnpService(MockUpnpServiceConfiguration configuration) { - this(false, configuration); - } - - /** - * Single-thread of execution for the whole UPnP stack, except one background registry maintenance thread. - */ - public MockUpnpService(final boolean sendsAlive, final boolean maintainsRegistry) { - this(sendsAlive, new MockUpnpServiceConfiguration(maintainsRegistry, false)); - } - - public MockUpnpService(final boolean sendsAlive, final boolean maintainsRegistry, final boolean multiThreaded) { - this(sendsAlive, new MockUpnpServiceConfiguration(maintainsRegistry, multiThreaded)); - } - - public MockUpnpService(final boolean sendsAlive, final MockUpnpServiceConfiguration configuration) { - - this.configuration = configuration; - - this.protocolFactory = createProtocolFactory(this, sendsAlive); - - this.registry = new RegistryImpl(this) { - @Override - protected RegistryMaintainer createRegistryMaintainer() { - return configuration.isMaintainsRegistry() ? super.createRegistryMaintainer() : null; - } - }; - - this.networkAddressFactory = this.configuration.createNetworkAddressFactory(); - - this.router = createRouter(); - - this.controlPoint = new ControlPointImpl(configuration, protocolFactory, registry); - } - - protected ProtocolFactory createProtocolFactory(UpnpService service, boolean sendsAlive) { - return new MockProtocolFactory(service, sendsAlive); - } - - protected MockRouter createRouter() { - return new MockRouter(getConfiguration(), getProtocolFactory()); - } - - /** - * This factory customizes several protocols. - *

- * The {@link org.fourthline.cling.protocol.async.SendingNotificationAlive} protocol - * only sends messages if this feature is enabled when instantiating the factory. - *

- *

- * The {@link org.fourthline.cling.protocol.async.SendingSearch} protocol doesn't wait between - * sending search message bulks, this speeds up testing. - *

- */ - public static class MockProtocolFactory extends ProtocolFactoryImpl { - - private boolean sendsAlive; - - public MockProtocolFactory(UpnpService upnpService, boolean sendsAlive) { - super(upnpService); - this.sendsAlive = sendsAlive; - } - - @Override - public SendingNotificationAlive createSendingNotificationAlive(LocalDevice localDevice) { - return new SendingNotificationAlive(getUpnpService(), localDevice) { - @Override - protected void execute() throws RouterException { - if (sendsAlive) super.execute(); - } - }; - } - - @Override - public SendingSearch createSendingSearch(UpnpHeader searchTarget, int mxSeconds) { - return new SendingSearch(getUpnpService(), searchTarget, mxSeconds) { - @Override - public int getBulkIntervalMilliseconds() { - return 0; // Don't wait - } - }; - } - } - - public UpnpServiceConfiguration getConfiguration() { - return configuration; - } - - public ControlPoint getControlPoint() { - return controlPoint; - } - - public ProtocolFactory getProtocolFactory() { - return protocolFactory; - } - - public Registry getRegistry() { - return registry; - } - - public MockRouter getRouter() { - return router; - } - - public void shutdown() { - getRegistry().shutdown(); - getConfiguration().shutdown(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/mock/MockUpnpServiceConfiguration.java b/app/src/main/java/org/fourthline/cling/mock/MockUpnpServiceConfiguration.java deleted file mode 100644 index e15f75b..0000000 --- a/app/src/main/java/org/fourthline/cling/mock/MockUpnpServiceConfiguration.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.mock; - -import org.fourthline.cling.DefaultUpnpServiceConfiguration; -import org.fourthline.cling.transport.impl.NetworkAddressFactoryImpl; -import org.fourthline.cling.transport.spi.NetworkAddressFactory; - -import javax.enterprise.inject.Alternative; -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.util.List; -import java.util.concurrent.AbstractExecutorService; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.TimeUnit; - -/** - * @author Christian Bauer - */ -@Alternative -public class MockUpnpServiceConfiguration extends DefaultUpnpServiceConfiguration { - - final protected boolean maintainsRegistry; - final protected boolean multiThreaded; - - /** - * Does not maintain registry, single threaded execution. - */ - public MockUpnpServiceConfiguration() { - this(false, false); - } - - /** - * Single threaded execution. - */ - public MockUpnpServiceConfiguration(boolean maintainsRegistry) { - this(maintainsRegistry, false); - } - - public MockUpnpServiceConfiguration(boolean maintainsRegistry, boolean multiThreaded) { - super(false); - this.maintainsRegistry = maintainsRegistry; - this.multiThreaded = multiThreaded; - } - - public boolean isMaintainsRegistry() { - return maintainsRegistry; - } - - public boolean isMultiThreaded() { - return multiThreaded; - } - - @Override - protected NetworkAddressFactory createNetworkAddressFactory(int streamListenPort) { - // We are only interested in 127.0.0.1 - return new NetworkAddressFactoryImpl(streamListenPort) { - @Override - protected boolean isUsableNetworkInterface(NetworkInterface iface) throws Exception { - return (iface.isLoopback()); - } - - @Override - protected boolean isUsableAddress(NetworkInterface networkInterface, InetAddress address) { - return (address.isLoopbackAddress() && address instanceof Inet4Address); - } - - }; - } - - @Override - public Executor getRegistryMaintainerExecutor() { - if (isMaintainsRegistry()) { - return new Executor() { - public void execute(Runnable runnable) { - new Thread(runnable).start(); - } - }; - } - return getDefaultExecutorService(); - } - - @Override - protected ExecutorService getDefaultExecutorService() { - if (isMultiThreaded()) { - return super.getDefaultExecutorService(); - } - return new AbstractExecutorService() { - - boolean terminated; - - public void shutdown() { - terminated = true; - } - - public List shutdownNow() { - shutdown(); - return null; - } - - public boolean isShutdown() { - return terminated; - } - - public boolean isTerminated() { - return terminated; - } - - public boolean awaitTermination(long l, TimeUnit timeUnit) throws InterruptedException { - shutdown(); - return terminated; - } - - public void execute(Runnable runnable) { - runnable.run(); - } - }; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/Command.java b/app/src/main/java/org/fourthline/cling/model/Command.java deleted file mode 100644 index b71f752..0000000 --- a/app/src/main/java/org/fourthline/cling/model/Command.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -/** - * Executable procedure, invoked and potentially decorated by the {@link org.fourthline.cling.model.ServiceManager}. - * - * @author Christian Bauer - */ -public interface Command { - - public void execute(ServiceManager manager) throws Exception; -} diff --git a/app/src/main/java/org/fourthline/cling/model/Constants.java b/app/src/main/java/org/fourthline/cling/model/Constants.java deleted file mode 100644 index 6998ad6..0000000 --- a/app/src/main/java/org/fourthline/cling/model/Constants.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -/** - * Shared and immutable settings. - * - * @author Christian Bauer - */ -public interface Constants { - - public static final int UPNP_MULTICAST_PORT = 1900; - - public static final String IPV4_UPNP_MULTICAST_GROUP = "239.255.255.250"; - - public static final String IPV6_UPNP_LINK_LOCAL_ADDRESS = "FF02::C"; - public static final String IPV6_UPNP_SUBNET_ADDRESS = "FF03::C"; - public static final String IPV6_UPNP_ADMINISTRATIVE_ADDRESS = "FF04::C"; - public static final String IPV6_UPNP_SITE_LOCAL_ADDRESS = "FF05::C"; - public static final String IPV6_UPNP_GLOBAL_ADDRESS = "FF0E::C"; - - public static final int MIN_ADVERTISEMENT_AGE_SECONDS = 1800; - - // Parsing rules for: deviceType, serviceType, serviceId (UDA 1.0, section 2.5) - - // TODO: UPNP VIOLATION: Microsoft Windows Media Player Sharing 4.0, X_MS_MediaReceiverRegistrar service has type with periods instead of hyphens in the namespace! - // UDA 1.0 spec: "Period characters in the vendor domain name MUST be replaced with hyphens in accordance with RFC 2141" - // TODO: UPNP VIOLATION: Azureus/Vuze 4.2.0.2 sends a URN as a service identifier, so we need to match colons! - // TODO: UPNP VIOLATION: Intel UPnP Tools send dots in the service identifier suffix, match that... - - public static final String REGEX_NAMESPACE = "[a-zA-Z0-9\\-\\.]+"; - public static final String REGEX_TYPE = "[a-zA-Z_0-9\\-]{1,64}"; - public static final String REGEX_ID = "[a-zA-Z_0-9\\-:\\.]{1,64}"; - - /* - Must not contain a hyphen character (-, 2D Hex in UTF- 8). First character must be a USASCII letter (A-Z, a-z), - USASCII digit (0-9), an underscore ("_"), or a non-experimental Unicode letter or digit greater than U+007F. - Succeeding characters must be a USASCII letter (A-Z, a-z), USASCII digit (0-9), an underscore ("_"), a - period ("."), a Unicode combiningchar, an extender, or a non-experimental Unicode letter or digit greater - than U+007F. The first three letters must not be "XML" in any combination of case. Case sensitive. - */ - // TODO: I have no idea how to match or what even is a "unicode extender character", neither does the Unicode book - public static final String REGEX_UDA_NAME = "[a-zA-Z0-9^-_\\p{L}\\p{N}]{1}[a-zA-Z0-9^-_\\.\\\\p{L}\\\\p{N}\\p{Mc}\\p{Sk}]*"; - - // Random patentable "inventions" by MSFT - public static final String SOAP_NS_ENVELOPE = "http://schemas.xmlsoap.org/soap/envelope/"; - public static final String SOAP_URI_ENCODING_STYLE = "http://schemas.xmlsoap.org/soap/encoding/"; - public static final String NS_UPNP_CONTROL_10 = "urn:schemas-upnp-org:control-1-0"; - public static final String NS_UPNP_EVENT_10 = "urn:schemas-upnp-org:event-1-0"; - - // State variable prefixes - public static final String ARG_TYPE_PREFIX = "A_ARG_TYPE_"; - -} diff --git a/app/src/main/java/org/fourthline/cling/model/DefaultServiceManager.java b/app/src/main/java/org/fourthline/cling/model/DefaultServiceManager.java deleted file mode 100644 index 0a5ec27..0000000 --- a/app/src/main/java/org/fourthline/cling/model/DefaultServiceManager.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.ReentrantLock; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.state.StateVariableAccessor; -import org.fourthline.cling.model.state.StateVariableValue; -import org.seamless.util.Exceptions; -import org.seamless.util.Reflections; - -/** - * Default implementation, creates and manages a single instance of a plain Java bean. - *

- * Creates instance of the defined service class when it is first needed (acts as a factory), - * manages the instance in a field (it's shared), and synchronizes (locks) all - * multi-threaded access. A locking attempt will timeout after 500 milliseconds with - * a runtime exception if another operation is already in progress. Override - * {@link #getLockTimeoutMillis()} to customize this behavior, e.g. if your service - * bean is slow and requires more time for typical action executions or state - * variable reading. - *

- * - * @author Christian Bauer - */ -public class DefaultServiceManager implements ServiceManager { - - private static Logger log = Logger.getLogger(DefaultServiceManager.class.getName()); - - final protected LocalService service; - final protected Class serviceClass; - final protected ReentrantLock lock = new ReentrantLock(true); - - // Locking! - protected T serviceImpl; - protected PropertyChangeSupport propertyChangeSupport; - - protected DefaultServiceManager(LocalService service) { - this(service, null); - } - - public DefaultServiceManager(LocalService service, Class serviceClass) { - this.service = service; - this.serviceClass = serviceClass; - } - - // The monitor entry and exit methods - - protected void lock() { - try { - if (lock.tryLock(getLockTimeoutMillis(), TimeUnit.MILLISECONDS)) { - if (log.isLoggable(Level.FINEST)) - log.finest("Acquired lock"); - } else { - throw new RuntimeException("Failed to acquire lock in milliseconds: " + getLockTimeoutMillis()); - } - } catch (InterruptedException e) { - throw new RuntimeException("Failed to acquire lock:" + e); - } - } - - protected void unlock() { - if (log.isLoggable(Level.FINEST)) - log.finest("Releasing lock"); - lock.unlock(); - } - - protected int getLockTimeoutMillis() { - return 500; - } - - public LocalService getService() { - return service; - } - - public T getImplementation() { - lock(); - try { - if (serviceImpl == null) { - init(); - } - return serviceImpl; - } finally { - unlock(); - } - } - - public PropertyChangeSupport getPropertyChangeSupport() { - lock(); - try { - if (propertyChangeSupport == null) { - init(); - } - return propertyChangeSupport; - } finally { - unlock(); - } - } - - public void execute(Command cmd) throws Exception { - lock(); - try { - cmd.execute(this); - } finally { - unlock(); - } - } - - @Override - public Collection getCurrentState() throws Exception { - lock(); - try { - Collection values = readInitialEventedStateVariableValues(); - if (values != null) { - log.fine("Obtained initial state variable values for event, skipping individual state variable accessors"); - return values; - } - values = new ArrayList(); - for (StateVariable stateVariable : getService().getStateVariables()) { - if (stateVariable.getEventDetails().isSendEvents()) { - StateVariableAccessor accessor = getService().getAccessor(stateVariable); - if (accessor == null) - throw new IllegalStateException("No accessor for evented state variable"); - values.add(accessor.read(stateVariable, getImplementation())); - } - } - return values; - } finally { - unlock(); - } - } - - protected Collection getCurrentState(String[] variableNames) throws Exception { - lock(); - try { - Collection values = new ArrayList(); - for (String variableName : variableNames) { - variableName = variableName.trim(); - - StateVariable stateVariable = getService().getStateVariable(variableName); - if (stateVariable == null || !stateVariable.getEventDetails().isSendEvents()) { - log.fine("Ignoring unknown or non-evented state variable: " + variableName); - continue; - } - - StateVariableAccessor accessor = getService().getAccessor(stateVariable); - if (accessor == null) { - log.warning("Ignoring evented state variable without accessor: " + variableName); - continue; - } - values.add(accessor.read(stateVariable, getImplementation())); - } - return values; - } finally { - unlock(); - } - } - - protected void init() { - log.fine("No service implementation instance available, initializing..."); - try { - // The actual instance we ware going to use and hold a reference to (1:1 instance for manager) - serviceImpl = createServiceInstance(); - - // How the implementation instance will tell us about property changes - propertyChangeSupport = createPropertyChangeSupport(serviceImpl); - propertyChangeSupport.addPropertyChangeListener(createPropertyChangeListener(serviceImpl)); - - } catch (Exception ex) { - throw new RuntimeException("Could not initialize implementation: " + ex, ex); - } - } - - protected T createServiceInstance() throws Exception { - if (serviceClass == null) { - throw new IllegalStateException("Subclass has to provide service class or override createServiceInstance()"); - } - try { - // Use this constructor if possible - return serviceClass.getConstructor(LocalService.class).newInstance(getService()); - } catch (NoSuchMethodException ex) { - log.fine("Creating new service implementation instance with no-arg constructor: " + serviceClass.getName()); - return serviceClass.newInstance(); - } - } - - protected PropertyChangeSupport createPropertyChangeSupport(T serviceImpl) throws Exception { - Method m; - if ((m = Reflections.getGetterMethod(serviceImpl.getClass(), "propertyChangeSupport")) != null && - PropertyChangeSupport.class.isAssignableFrom(m.getReturnType())) { - log.fine("Service implementation instance offers PropertyChangeSupport, using that: " + serviceImpl.getClass().getName()); - return (PropertyChangeSupport) m.invoke(serviceImpl); - } - log.fine("Creating new PropertyChangeSupport for service implementation: " + serviceImpl.getClass().getName()); - return new PropertyChangeSupport(serviceImpl); - } - - protected PropertyChangeListener createPropertyChangeListener(T serviceImpl) throws Exception { - return new DefaultPropertyChangeListener(); - } - - protected Collection readInitialEventedStateVariableValues() throws Exception { - return null; - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") Implementation: " + serviceImpl; - } - - protected class DefaultPropertyChangeListener implements PropertyChangeListener { - - public void propertyChange(PropertyChangeEvent e) { - log.finer("Property change event on local service: " + e.getPropertyName()); - - // Prevent recursion - if (e.getPropertyName().equals(EVENTED_STATE_VARIABLES)) return; - - String[] variableNames = ModelUtil.fromCommaSeparatedList(e.getPropertyName()); - log.fine("Changed variable names: " + Arrays.toString(variableNames)); - - try { - Collection currentValues = getCurrentState(variableNames); - - if (!currentValues.isEmpty()) { - getPropertyChangeSupport().firePropertyChange( - EVENTED_STATE_VARIABLES, - null, - currentValues - ); - } - - } catch (Exception ex) { - // TODO: Is it OK to only log this error? It means we keep running although we couldn't send events? - log.log( - Level.SEVERE, - "Error reading state of service after state variable update event: " + Exceptions.unwrap(ex), - ex - ); - } - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/DiscoveryOptions.java b/app/src/main/java/org/fourthline/cling/model/DiscoveryOptions.java deleted file mode 100644 index 22deb31..0000000 --- a/app/src/main/java/org/fourthline/cling/model/DiscoveryOptions.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -/** - * Options for discovery processing by the {@link org.fourthline.cling.registry.Registry}. - * - * @author Christian Bauer - */ -public class DiscoveryOptions { - - protected boolean advertised; - protected boolean byeByeBeforeFirstAlive; - - /** - * @param advertised If false, no alive notifications will be announced for - * this device and it will not appear in search responses. - */ - public DiscoveryOptions(boolean advertised) { - this.advertised = advertised; - } - - /** - * - * @param advertised If false, no alive notifications will be announced for - * this device and it will not appear in search responses. - * @param byeByeBeforeFirstAlive If true, a byebye NOTIFY message will be send before the - * first alive NOTIFY message. - */ - public DiscoveryOptions(boolean advertised, boolean byeByeBeforeFirstAlive) { - this.advertised = advertised; - this.byeByeBeforeFirstAlive = byeByeBeforeFirstAlive; - } - - /** - * @return true for regular advertisement with alive - * messages and in search responses. - */ - public boolean isAdvertised() { - return advertised; - } - - /** - * @return true if a byebye NOTIFY message will be send before the - * first alive NOTIFY message. - */ - public boolean isByeByeBeforeFirstAlive() { - return byeByeBeforeFirstAlive; - } - - // Performance optimization on Android - private static String simpleName = DiscoveryOptions.class.getSimpleName(); - @Override - public String toString() { - return "(" + simpleName + ")" + " advertised: " + isAdvertised() + " byebyeBeforeFirstAlive: " + isByeByeBeforeFirstAlive(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/ExpirationDetails.java b/app/src/main/java/org/fourthline/cling/model/ExpirationDetails.java deleted file mode 100644 index 7d36340..0000000 --- a/app/src/main/java/org/fourthline/cling/model/ExpirationDetails.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -import java.util.Date; - -/** - * @author Christian Bauer - */ -public class ExpirationDetails { - - public static final int UNLIMITED_AGE = 0; - - private int maxAgeSeconds = UNLIMITED_AGE; - private long lastRefreshTimestampSeconds = getCurrentTimestampSeconds(); - - public ExpirationDetails() { - } - - public ExpirationDetails(int maxAgeSeconds) { - this.maxAgeSeconds = maxAgeSeconds; - } - - public int getMaxAgeSeconds() { - return maxAgeSeconds; - } - - public long getLastRefreshTimestampSeconds() { - return lastRefreshTimestampSeconds; - } - - public void setLastRefreshTimestampSeconds(long lastRefreshTimestampSeconds) { - this.lastRefreshTimestampSeconds = lastRefreshTimestampSeconds; - } - - public void stampLastRefresh() { - setLastRefreshTimestampSeconds(getCurrentTimestampSeconds()); - } - - public boolean hasExpired() { - return hasExpired(false); - } - - /** - * @param halfTime If true then half maximum age is used to determine expiration. - * @return true if the maximum age has been reached. - */ - public boolean hasExpired(boolean halfTime) { - // Note: Uses direct field access for performance reasons on Android - return maxAgeSeconds != UNLIMITED_AGE && - (lastRefreshTimestampSeconds + (maxAgeSeconds/(halfTime ? 2 : 1))) < getCurrentTimestampSeconds(); - } - - public long getSecondsUntilExpiration() { - // Note: Uses direct field access for performance reasons on Android - return maxAgeSeconds == UNLIMITED_AGE - ? Integer.MAX_VALUE - : (lastRefreshTimestampSeconds + maxAgeSeconds) - getCurrentTimestampSeconds(); - } - - protected long getCurrentTimestampSeconds() { - return new Date().getTime()/1000; - } - - // Performance optimization on Android - private static String simpleName = ExpirationDetails.class.getSimpleName(); - @Override - public String toString() { - return "(" + simpleName + ")" + " MAX AGE: " + maxAgeSeconds; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/Location.java b/app/src/main/java/org/fourthline/cling/model/Location.java deleted file mode 100644 index ab011d7..0000000 --- a/app/src/main/java/org/fourthline/cling/model/Location.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -import org.seamless.util.URIUtil; - -import java.net.URI; -import java.net.URL; - -/** - * The IP address/port, MAC address, and URI path of a (network) location. - *

- * Used when sending messages about local devices and services to - * other UPnP participants on the network, such as where our device/service - * descriptors can be found or what callback address to use for event message - * delivery. We also let them know our MAC hardware address so they - * can wake us up from sleep with Wake-On-LAN if necessary. - *

- * - * @author Christian Bauer - */ -public class Location { - - protected NetworkAddress networkAddress; - protected URI path; - - public Location(NetworkAddress networkAddress, URI path) { - this.networkAddress = networkAddress; - this.path = path; - } - - public NetworkAddress getNetworkAddress() { - return networkAddress; - } - - public URI getPath() { - return path; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Location location = (Location) o; - - if (!networkAddress.equals(location.networkAddress)) return false; - if (!path.equals(location.path)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = networkAddress.hashCode(); - result = 31 * result + path.hashCode(); - return result; - } - - /** - * @return An HTTP URL with the address, port, and path of this location. - */ - public URL getURL() { - return URIUtil.createAbsoluteURL(networkAddress.getAddress(), networkAddress.getPort(), path); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/ModelUtil.java b/app/src/main/java/org/fourthline/cling/model/ModelUtil.java deleted file mode 100644 index 338e2fc..0000000 --- a/app/src/main/java/org/fourthline/cling/model/ModelUtil.java +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.util.Collections; -import java.util.Enumeration; -import java.util.Set; -import java.util.Locale; - -/** - * Shared trivial procedures. - * - * @author Christian Bauer - */ -public class ModelUtil { - - /** - * True if this class is executing on an Android runtime - */ - final public static boolean ANDROID_RUNTIME; - static { - boolean foundAndroid = false; - try { - Class androidBuild = Thread.currentThread().getContextClassLoader().loadClass("android.os.Build"); - foundAndroid = androidBuild.getField("ID").get(null) != null; - } catch (Exception ex) { - // Ignore - } - ANDROID_RUNTIME = foundAndroid; - } - - /** - * True if this class is executing on an Android emulator runtime. - */ - final public static boolean ANDROID_EMULATOR; - static { - boolean foundEmulator = false; - try { - Class androidBuild = Thread.currentThread().getContextClassLoader().loadClass("android.os.Build"); - String product = (String)androidBuild.getField("PRODUCT").get(null); - if ("google_sdk".equals(product) || ("sdk".equals(product))) - foundEmulator = true; - } catch (Exception ex) { - // Ignore - } - ANDROID_EMULATOR = foundEmulator; - } - - /** - * @param stringConvertibleTypes A collection of interfaces. - * @param clazz An interface to test. - * @return true if the given interface is an Enum, or if the collection contains a super-interface. - */ - public static boolean isStringConvertibleType(Set stringConvertibleTypes, Class clazz) { - if (clazz.isEnum()) return true; - for (Class toStringOutputType : stringConvertibleTypes) { - if (toStringOutputType.isAssignableFrom(clazz)) { - return true; - } - } - return false; - } - - /** - * @param name A UPnP device architecture "name" string. - * @return true if the name is not empty, doesn't start with "xml", and - * matches {@link org.fourthline.cling.model.Constants#REGEX_UDA_NAME}. - */ - public static boolean isValidUDAName(String name) { - if (ANDROID_RUNTIME) { - return name != null && name.length() != 0; - } - return name != null && name.length() != 0 && !name.toLowerCase(Locale.ENGLISH).startsWith("xml") && name.matches(Constants.REGEX_UDA_NAME); - } - - /** - * Wraps the checked exception in a runtime exception. - */ - public static InetAddress getInetAddressByName(String name) { - try { - return InetAddress.getByName(name); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - /** - * Converts the given instances into comma-separated elements of a string, - * escaping commas with backslashes. - */ - public static String toCommaSeparatedList(Object[] o) { - return toCommaSeparatedList(o, true, false); - } - - /** - * Converts the given instances into comma-separated elements of a string, - * optionally escapes commas and double quotes with backslahses. - */ - public static String toCommaSeparatedList(Object[] o, boolean escapeCommas, boolean escapeDoubleQuotes) { - if (o == null) { - return ""; - } - StringBuilder sb = new StringBuilder(); - for (Object obj : o) { - String objString = obj.toString(); - objString = objString.replaceAll("\\\\", "\\\\\\\\"); // Replace one backslash with two (nice, eh?) - if (escapeCommas) { - objString = objString.replaceAll(",", "\\\\,"); - } - if (escapeDoubleQuotes) { - objString = objString.replaceAll("\"", "\\\""); - } - sb.append(objString).append(","); - } - if (sb.length() > 1) { - sb.deleteCharAt(sb.length() - 1); - } - return sb.toString(); - - } - - /** - * Converts the comma-separated elements of a string into an array of strings, - * unescaping backslashed commas. - */ - public static String[] fromCommaSeparatedList(String s) { - return fromCommaSeparatedList(s, true); - } - - /** - * Converts the comma-separated elements of a string into an array of strings, - * optionally unescaping backslashed commas. - */ - public static String[] fromCommaSeparatedList(String s, boolean unescapeCommas) { - if (s == null || s.length() == 0) { - return null; - } - - final String QUOTED_COMMA_PLACEHOLDER = "XXX1122334455XXX"; - if (unescapeCommas) { - s = s.replaceAll("\\\\,", QUOTED_COMMA_PLACEHOLDER); - } - - String[] split = s.split(","); - for (int i = 0; i < split.length; i++) { - split[i] = split[i].replaceAll(QUOTED_COMMA_PLACEHOLDER, ","); - split[i] = split[i].replaceAll("\\\\\\\\", "\\\\"); - } - return split; - } - - /** - * @param seconds The number of seconds to convert. - * @return A string representing hours, minutes, seconds, e.g. 11:23:44 - */ - public static String toTimeString(long seconds) { - long hours = seconds / 3600, - remainder = seconds % 3600, - minutes = remainder / 60, - secs = remainder % 60; - - return ((hours < 10 ? "0" : "") + hours - + ":" + (minutes < 10 ? "0" : "") + minutes - + ":" + (secs < 10 ? "0" : "") + secs); - } - - /** - * @param s A string representing hours, minutes, seconds, e.g. 11:23:44 - * @return The converted number of seconds. - */ - public static long fromTimeString(String s) { - // Handle "00:00:00.000" pattern, drop the milliseconds - if (s.lastIndexOf(".") != -1) - s = s.substring(0, s.lastIndexOf(".")); - String[] split = s.split(":"); - if (split.length != 3) - throw new IllegalArgumentException("Can't parse time string: " + s); - return (Long.parseLong(split[0]) * 3600) + - (Long.parseLong(split[1]) * 60) + - (Long.parseLong(split[2])); - } - - /** - * @param s A string with commas. - * @return The same string, a newline appended after every comma. - */ - public static String commaToNewline(String s) { - StringBuilder sb = new StringBuilder(); - String[] split = s.split(","); - for (String splitString : split) { - sb.append(splitString).append(",").append("\n"); - } - if (sb.length() > 2) { - sb.deleteCharAt(sb.length() - 2); - } - return sb.toString(); - } - - /** - * DNS reverse name lookup. - * - * @param includeDomain true if the whole FQDN should be returned, instead of just the first (host) part. - * @return The resolved host (and domain-) name, or "UNKNOWN HOST" if resolution failed. - */ - public static String getLocalHostName(boolean includeDomain) { - try { - String hostname = InetAddress.getLocalHost().getHostName(); - return includeDomain - ? hostname - : hostname.indexOf(".") != -1 ? hostname.substring(0, hostname.indexOf(".")) : hostname; - - } catch (Exception ex) { - // Return a dummy String - return "UNKNOWN HOST"; - } - } - - /** - * @return The MAC hardware address of the first network interface of this host. - */ - public static byte[] getFirstNetworkInterfaceHardwareAddress() { - try { - Enumeration interfaceEnumeration = NetworkInterface.getNetworkInterfaces(); - for (NetworkInterface iface : Collections.list(interfaceEnumeration)) { - if (!iface.isLoopback() && iface.isUp() && iface.getHardwareAddress() != null) { - return iface.getHardwareAddress(); - } - } - } catch (Exception ex) { - throw new RuntimeException("Could not discover first network interface hardware address"); - } - throw new RuntimeException("Could not discover first network interface hardware address"); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/Namespace.java b/app/src/main/java/org/fourthline/cling/model/Namespace.java deleted file mode 100644 index 20fd6f7..0000000 --- a/app/src/main/java/org/fourthline/cling/model/Namespace.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -import java.net.URI; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.logging.Logger; - -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.meta.Icon; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.resource.Resource; -import org.seamless.util.URIUtil; - -/** - * Enforces path conventions for all locally offered resources (descriptors, icons, etc.) - *

- * Every descriptor, icon, event callback, or action message is send to a URL. This namespace - * defines how the path of this URL will look like and it will build the path for a given - * resource. - *

- *

- * By default, the namespace is organized as follows: - *

- *
{@code
- *http://host:port/dev//desc.xml
- *http://host:port/dev//svc///desc.xml
- *http://host:port/dev//svc///action
- *http://host:port/dev//svc///event
- *http://host:port/dev//svc///event/cb.xml
- *http://host:port/dev//svc///action
- *...
- * }
- *

- * The namespace is also used to discover and create all {@link org.fourthline.cling.model.resource.Resource}s - * given a {@link org.fourthline.cling.model.meta.Device}'s metadata. This procedure is typically - * invoked once, when the device is added to the {@link org.fourthline.cling.registry.Registry}. - *

- * - * @author Christian Bauer - */ -public class Namespace { - - final private static Logger log = Logger.getLogger(Namespace.class.getName()); - - public static final String DEVICE = "/dev"; - public static final String SERVICE = "/svc"; - public static final String CONTROL = "/action"; - public static final String EVENTS = "/event"; - public static final String DESCRIPTOR_FILE = "/desc"; - public static final String CALLBACK_FILE = "/cb"; - - final protected URI basePath; - - public Namespace() { - this.basePath = URI.create(""); - } - - public Namespace(String basePath) { - this(URI.create(basePath)); - } - - public Namespace(URI basePath) { - this.basePath = basePath; - } - - public URI getBasePath() { - return basePath; - } - - public URI getPath(Device device) { - if (device.getIdentity().getUdn() == null) { - throw new IllegalStateException("Can't generate local URI prefix without UDN"); - } - StringBuilder s = new StringBuilder(); - s.append(DEVICE).append("/"); - - s.append(URIUtil.encodePathSegment(device.getIdentity().getUdn().getIdentifierString())); - - /* - We no longer need the hierarchical URIs, in fact, they are impossible to parse - with typical URI template support in various REST engines. - if (device.isRoot()) { - s.append(device.getIdentity().getUdn().getIdentifierString()); - } else { - List devices = new ArrayList(); - Device temp = device; - while (temp != null) { - devices.add(temp); - temp = temp.getParentDevice(); - } - Collections.reverse(devices); - for (Device d : devices) { - if (d == device) continue; - s.append(d.getIdentity().getUdn().getIdentifierString()); - s.append(EMBEDDED); - s.append("/"); - } - s.append(device.getIdentity().getUdn().getIdentifierString()); - } - */ - return URI.create(getBasePath().toString() + s.toString()); - } - - public URI getPath(Service service) { - if (service.getServiceId() == null) { - throw new IllegalStateException("Can't generate local URI prefix without service ID"); - } - StringBuilder s = new StringBuilder(); - s.append(SERVICE); - s.append("/"); - s.append(service.getServiceId().getNamespace()); - s.append("/"); - s.append(service.getServiceId().getId()); - return URI.create(getPath(service.getDevice()).toString() + s.toString()); - } - - public URI getDescriptorPath(Device device) { - return URI.create(getPath(device.getRoot()).toString() + DESCRIPTOR_FILE); - } - - public URI getDescriptorPath(Service service) { - return URI.create(getPath(service).toString() + DESCRIPTOR_FILE); - } - - public URI getControlPath(Service service) { - return URI.create(getPath(service).toString() + CONTROL); - } - - public URI getIconPath(Icon icon) { - return URI.create(getPath(icon.getDevice()).toString() + "/" + icon.getUri().toString()); - } - - public URI getEventSubscriptionPath(Service service) { - return URI.create(getPath(service).toString() + EVENTS); - } - - public URI getEventCallbackPath(Service service) { - return URI.create(getEventSubscriptionPath(service).toString() + CALLBACK_FILE); - } - - public URI prefixIfRelative(Device device, URI uri) { - if (!uri.isAbsolute() && !uri.getPath().startsWith("/")) { - return URI.create(getPath(device).toString() + "/" + uri.toString()); - } - return uri; - } - - public boolean isControlPath(URI uri) { - return uri.toString().endsWith(Namespace.CONTROL); - } - - public boolean isEventSubscriptionPath(URI uri) { - return uri.toString().endsWith(Namespace.EVENTS); - } - - public boolean isEventCallbackPath(URI uri) { - return uri.toString().endsWith(Namespace.CALLBACK_FILE); - } - - public Resource[] getResources(Device device) throws ValidationException { - if (!device.isRoot()) return null; - - Set resources = new HashSet(); - List errors = new ArrayList(); - - log.fine("Discovering local resources of device graph"); - Resource[] discoveredResources = device.discoverResources(this); - for (Resource resource : discoveredResources) { - log.finer("Discovered: " + resource); - if (!resources.add(resource)) { - log.finer("Local resource already exists, queueing validation error"); - errors.add(new ValidationError( - getClass(), - "resources", - "Local URI namespace conflict between resources of device: " + resource - )); - } - } - if (errors.size() > 0) { - throw new ValidationException("Validation of device graph failed, call getErrors() on exception", errors); - } - return resources.toArray(new Resource[resources.size()]); - } - - - -} diff --git a/app/src/main/java/org/fourthline/cling/model/NetworkAddress.java b/app/src/main/java/org/fourthline/cling/model/NetworkAddress.java deleted file mode 100644 index 098fcf7..0000000 --- a/app/src/main/java/org/fourthline/cling/model/NetworkAddress.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -import java.net.InetAddress; -import java.util.Arrays; - -/** - * IP address, port, and optional interface hardware address (MAC) of a network service. - * - * @author Christian Bauer - */ -public class NetworkAddress { - - protected InetAddress address; - protected int port; - protected byte[] hardwareAddress; - - public NetworkAddress(InetAddress address, int port) { - this(address, port, null); - } - - public NetworkAddress(InetAddress address, int port, byte[] hardwareAddress) { - this.address = address; - this.port = port; - this.hardwareAddress = hardwareAddress; - } - - public InetAddress getAddress() { - return address; - } - - public int getPort() { - return port; - } - - public byte[] getHardwareAddress() { - return hardwareAddress; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - NetworkAddress that = (NetworkAddress) o; - - if (port != that.port) return false; - if (!address.equals(that.address)) return false; - if (!Arrays.equals(hardwareAddress, that.hardwareAddress)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = address.hashCode(); - result = 31 * result + port; - result = 31 * result + (hardwareAddress != null ? Arrays.hashCode(hardwareAddress) : 0); - return result; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/ServerClientTokens.java b/app/src/main/java/org/fourthline/cling/model/ServerClientTokens.java deleted file mode 100644 index 9f72c9c..0000000 --- a/app/src/main/java/org/fourthline/cling/model/ServerClientTokens.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -/** - * The agent string of the UPnP stack in network messages, either as a server or client. - *

- * Tries to detect the operating system name and version, defaults to {@link UserConstants} - * for product name and version. - *

- * - * @author Christian Bauer - */ -public class ServerClientTokens { - - public static final String UNKNOWN_PLACEHOLDER = "UNKNOWN"; - - // TODO: This means we default to UDA 1.0 - private int majorVersion = 1; - private int minorVersion = 0; - - private String osName = System.getProperty("os.name").replaceAll("[^a-zA-Z0-9\\.\\-_]", ""); - private String osVersion = System.getProperty("os.version").replaceAll("[^a-zA-Z0-9\\.\\-_]", ""); - private String productName = UserConstants.PRODUCT_TOKEN_NAME; - private String productVersion = UserConstants.PRODUCT_TOKEN_VERSION; - - public ServerClientTokens() { - } - - public ServerClientTokens(int majorVersion, int minorVersion) { - this.majorVersion = majorVersion; - this.minorVersion = minorVersion; - } - - public ServerClientTokens(String productName, String productVersion) { - this.productName = productName; - this.productVersion = productVersion; - } - - public ServerClientTokens(int majorVersion, int minorVersion, String osName, String osVersion, String productName, String productVersion) { - this.majorVersion = majorVersion; - this.minorVersion = minorVersion; - this.osName = osName; - this.osVersion = osVersion; - this.productName = productName; - this.productVersion = productVersion; - } - - public int getMajorVersion() { - return majorVersion; - } - - public void setMajorVersion(int majorVersion) { - this.majorVersion = majorVersion; - } - - public int getMinorVersion() { - return minorVersion; - } - - public void setMinorVersion(int minorVersion) { - this.minorVersion = minorVersion; - } - - public String getOsName() { - return osName; - } - - public void setOsName(String osName) { - this.osName = osName; - } - - public String getOsVersion() { - return osVersion; - } - - public void setOsVersion(String osVersion) { - this.osVersion = osVersion; - } - - public String getProductName() { - return productName; - } - - public void setProductName(String productName) { - this.productName = productName; - } - - public String getProductVersion() { - return productVersion; - } - - public void setProductVersion(String productVersion) { - this.productVersion = productVersion; - } - - @Override - public String toString() { - return getOsName()+"/"+getOsVersion() - + " UPnP/" + getMajorVersion() + "." + getMinorVersion() + " " - + getProductName() + "/" + getProductVersion(); - } - - public String getHttpToken() { - return getOsName().replaceAll(" ", "_")+"/"+getOsVersion().replaceAll(" ", "_") - + " UPnP/" + getMajorVersion() + "." + getMinorVersion() + " " - + getProductName().replaceAll(" ", "_") + "/" + getProductVersion().replaceAll(" ", "_"); - } - - public String getOsToken() { - return getOsName().replaceAll(" ", "_")+"/"+getOsVersion().replaceAll(" ", "_"); - } - - public String getProductToken() { - return getProductName().replaceAll(" ", "_") + "/" + getProductVersion().replaceAll(" ", "_"); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ServerClientTokens that = (ServerClientTokens) o; - - if (majorVersion != that.majorVersion) return false; - if (minorVersion != that.minorVersion) return false; - if (!osName.equals(that.osName)) return false; - if (!osVersion.equals(that.osVersion)) return false; - if (!productName.equals(that.productName)) return false; - if (!productVersion.equals(that.productVersion)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = majorVersion; - result = 31 * result + minorVersion; - result = 31 * result + osName.hashCode(); - result = 31 * result + osVersion.hashCode(); - result = 31 * result + productName.hashCode(); - result = 31 * result + productVersion.hashCode(); - return result; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/ServiceManager.java b/app/src/main/java/org/fourthline/cling/model/ServiceManager.java deleted file mode 100644 index f6d5a41..0000000 --- a/app/src/main/java/org/fourthline/cling/model/ServiceManager.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.state.StateVariableValue; - -import java.beans.PropertyChangeSupport; -import java.util.Collection; - -/** - * Binds the metadata of a service to a service implementation, unified interface for accessing local services. - *

- * The UPnP core will always access a local service implementation through - * this manager, available with {@link org.fourthline.cling.model.meta.LocalService#getManager()}: - *

- *
    - *
  • - * The {@link org.fourthline.cling.model.action.ActionExecutor}s use the manager to process - * UPnP control invocations. It's the service manager's job to translate - * such an action invocation into an actual method invocation, or any other procedure - * that satisfies the requirements. The {@link org.fourthline.cling.model.action.ActionExecutor} - * works in conjuction with the manager, for example, the - * {@link org.fourthline.cling.model.action.MethodActionExecutor} expects that an action - * method can be invoked through reflection on the instance returned by the manager's - * {@link #getImplementation()} method. This is possible with the - * the {@link org.fourthline.cling.model.DefaultServiceManager}. A different service manager - * might require a different set of action executors, and vice versa. - *
  • - *
  • - * The {@link org.fourthline.cling.model.state.StateVariableAccessor}s use the manager - * to process UPnP state variable queries and GENA eventing. It's the service manager's - * job to return an actual value when a state variable has to be read. The - * {@link org.fourthline.cling.model.state.StateVariableAccessor} works in conjunction with - * the service manager, for example, the {@link org.fourthline.cling.model.state.FieldStateVariableAccessor} - * expects that a state variable value can be read through reflection on a field, of - * the instance returned by {@link #getImplementation()}. This is possible with the - * {@link org.fourthline.cling.model.DefaultServiceManager}. A different service manager - * might require a different set of state variable accessors, and vice versa. - *
  • - *
  • - * A service manager has to notify the UPnP core, and especially the GENA eventing system, - * whenever the state of any evented UPnP state variable changes. For new subscriptions - * GENA also has to read the current state of the service manually, when the subscription - * has been established and an initial event message has to be send to the subscriber. - *
  • - *
- *

- * A service manager can implement these concerns in any way imaginable. It has to - * be thread-safe. - *

- * - * @param The interface expected by the - * bound {@link org.fourthline.cling.model.action.ActionExecutor}s - * and {@link org.fourthline.cling.model.state.StateVariableAccessor}s. - * - * @author Christian Bauer - */ -public interface ServiceManager { - - /** - * Use this property name when propagating change events that affect any evented UPnP - * state variable. This name is detected by the GENA subsystem. - */ - public static final String EVENTED_STATE_VARIABLES = "_EventedStateVariables"; - - /** - * @return The metadata of the service to which this manager is assigned. - */ - public LocalService getService(); - - /** - * @return An instance with the interface expected by the - * bound {@link org.fourthline.cling.model.action.ActionExecutor}s - * and {@link org.fourthline.cling.model.state.StateVariableAccessor}s. - */ - public T getImplementation(); - - /** - * Double-dispatch of arbitrary commands, used by action executors and state variable accessors. - *

- * The service manager will execute the given {@link org.fourthline.cling.model.Command} and it - * might decorate the execution, for example, by locking/unlocking access to a shared service - * implementation before and after the execution. - *

- * @param cmd The command to execute. - * @throws Exception Any exception, without wrapping, as thrown by {@link org.fourthline.cling.model.Command#execute(ServiceManager)} - */ - public void execute(Command cmd) throws Exception; - - /** - * Provides the capability to monitor the service for state changes. - *

- * The GENA subsystem expects that this adapter will notify its listeners whenever - * any evented UPnP state variable of the service has changed its state. The - * following change event is expected: - *

- *
    - *
  • The property name is the constant {@link #EVENTED_STATE_VARIABLES}.
  • - *
  • The "old value" can be null, only the current state has to be included.
  • - *
  • The "new value" is a Collection of {@link org.fourthline.cling.model.state.StateVariableValue}, - * representing the current state of the service after the change.
  • - *
- *

- * The collection has to include values for all state variables, no - * matter what state variable was updated. Any other event is ignored (e.g. individual property - * changes). - *

- * - * @return An adapter that will notify its listeners whenever any evented state variable changes. - */ - public PropertyChangeSupport getPropertyChangeSupport(); - - /** - * Reading the state of a service manually. - * - * @return A Collection of {@link org.fourthline.cling.model.state.StateVariableValue}, representing - * the current state of the service, that is, all evented state variable values. - * @throws Exception Any error that occurred when the service's state was accessed. - */ - public Collection getCurrentState() throws Exception; - -} diff --git a/app/src/main/java/org/fourthline/cling/model/ServiceReference.java b/app/src/main/java/org/fourthline/cling/model/ServiceReference.java deleted file mode 100644 index 0036d5c..0000000 --- a/app/src/main/java/org/fourthline/cling/model/ServiceReference.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.UDN; - -/** - * Combines a {@link org.fourthline.cling.model.types.UDN} and a {@link org.fourthline.cling.model.types.ServiceId}. - *

- * A service reference is useful to remember a service. For example, if a control point has accessed - * a service one, it can remember the service with {@link org.fourthline.cling.model.meta.Service#getReference()}. - * Before every action invocation, it can now resolve the reference to an actually registered service with - * {@link org.fourthline.cling.registry.Registry#getService(ServiceReference)}. If the registry doesn't return - * a service for the given reference, the service is currently not available. - *

- *

- * This simplifies implementing disconnect/reconnect behavior in a control point. - *

- * - * @author Christian Bauer - */ -public class ServiceReference { - - public static final String DELIMITER = "/"; - - final private UDN udn; - final private ServiceId serviceId; - - public ServiceReference(String s) { - String[] split = s.split("/"); - if (split.length == 2) { - this.udn = UDN.valueOf(split[0]); - this.serviceId = ServiceId.valueOf(split[1]); - } else { - this.udn = null; - this.serviceId = null; - } - } - - public ServiceReference(UDN udn, ServiceId serviceId) { - this.udn = udn; - this.serviceId = serviceId; - } - - public UDN getUdn() { - return udn; - } - - public ServiceId getServiceId() { - return serviceId; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ServiceReference that = (ServiceReference) o; - - if (!serviceId.equals(that.serviceId)) return false; - if (!udn.equals(that.udn)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = udn.hashCode(); - result = 31 * result + serviceId.hashCode(); - return result; - } - - @Override - public String toString() { - return udn == null || serviceId == null ? "" : udn.toString() + DELIMITER + serviceId.toString(); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/UnsupportedDataException.java b/app/src/main/java/org/fourthline/cling/model/UnsupportedDataException.java deleted file mode 100644 index a9982f7..0000000 --- a/app/src/main/java/org/fourthline/cling/model/UnsupportedDataException.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -/** - * Thrown by processors/converters when errors occurred. - *

- * This exception indicates that received data was in an invalid format and/or could - * not be parsed or converted. You typically can recover from this failure after - * catching (and logging?) the exception. - *

- * - * @author Christian Bauer - */ -public class UnsupportedDataException extends RuntimeException { - - private static final long serialVersionUID = 661795454401413339L; - - protected Object data; - - public UnsupportedDataException(String s) { - super(s); - } - - public UnsupportedDataException(String s, Throwable throwable) { - super(s, throwable); - } - - public UnsupportedDataException(String s, Throwable throwable, Object data) { - super(s, throwable); - this.data = data; - } - - public Object getData() { - return data; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/UserConstants.java b/app/src/main/java/org/fourthline/cling/model/UserConstants.java deleted file mode 100644 index 85c4cc2..0000000 --- a/app/src/main/java/org/fourthline/cling/model/UserConstants.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -/** - * Settings you can modify if you know what you are doing. - * - * @author Michael Pujos - */ -public class UserConstants { - - public static final String PRODUCT_TOKEN_NAME = "Cling"; - - public static final String PRODUCT_TOKEN_VERSION = "2.0"; - - public static final int DEFAULT_SUBSCRIPTION_DURATION_SECONDS = 1800; - -} diff --git a/app/src/main/java/org/fourthline/cling/model/Validatable.java b/app/src/main/java/org/fourthline/cling/model/Validatable.java deleted file mode 100644 index da13e4d..0000000 --- a/app/src/main/java/org/fourthline/cling/model/Validatable.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -import java.util.List; - -/** - * Marker for types with integrity rules that require validation. - * - * @author Christian Bauer - */ -public interface Validatable { - - /** - * @return An empty List if all rules validated properly, otherwise, the detected errors. - */ - public List validate(); -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/ValidationError.java b/app/src/main/java/org/fourthline/cling/model/ValidationError.java deleted file mode 100644 index ee9fdb0..0000000 --- a/app/src/main/java/org/fourthline/cling/model/ValidationError.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -/** - * Representing an integrity rule validation failure. - * - * @author Christian Bauer - */ -public class ValidationError { - private Class clazz; - private String propertyName; - private String message; - - public ValidationError(Class clazz, String message) { - this.clazz = clazz; - this.message = message; - } - - public ValidationError(Class clazz, String propertyName, String message) { - this.clazz = clazz; - this.propertyName = propertyName; - this.message = message; - } - - public Class getClazz() { - return clazz; - } - - public String getPropertyName() { - return propertyName; - } - - public String getMessage() { - return message; - } - - @Override - public String toString() { - return getClass().getSimpleName() - + " (Class: " + getClazz().getSimpleName() - + ", propertyName: " + getPropertyName() + "): " - + message; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/ValidationException.java b/app/src/main/java/org/fourthline/cling/model/ValidationException.java deleted file mode 100644 index 71c3e66..0000000 --- a/app/src/main/java/org/fourthline/cling/model/ValidationException.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - - -import java.util.List; - -/** - * Thrown if integrity rule violations are exceptional, encapsulating the errors. - * - * @author Christian Bauer - */ -public class ValidationException extends Exception { - - public List errors; - - public ValidationException(String s) { - super(s); - } - - public ValidationException(String s, Throwable throwable) { - super(s, throwable); - } - - public ValidationException(String s, List errors) { - super(s); - this.errors = errors; - } - - public List getErrors() { - return errors; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/VariableValue.java b/app/src/main/java/org/fourthline/cling/model/VariableValue.java deleted file mode 100644 index 65c104c..0000000 --- a/app/src/main/java/org/fourthline/cling/model/VariableValue.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -import java.util.logging.Logger; - -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * Encapsulates a variable or argument value, validates and transforms it from/to a string representaion. - * - * @author Christian Bauer - */ -public class VariableValue { - - final private static Logger log = Logger.getLogger(VariableValue.class.getName()); - - final private Datatype datatype; - final private Object value; - - /** - * Creates and validates a variable value. - *

- * If the given value is a String, it will be converted - * with {@link org.fourthline.cling.model.types.Datatype#valueOf(String)}. Any - * other value will be checked, whether it matches the datatype and if its - * string representation is valid in XML documents (unicode character test). - *

- *

- * Note that for performance reasons, validation of a non-string value - * argument is skipped if executed on an Android runtime! - *

- * - * @param datatype The type of the variable. - * @param value The value of the variable. - * @throws InvalidValueException If the value is invalid for the given datatype, or if - * its string representation is invalid in XML. - */ - public VariableValue(Datatype datatype, Object value) throws InvalidValueException { - this.datatype = datatype; - this.value = value instanceof String ? datatype.valueOf((String) value) : value; - - if (ModelUtil.ANDROID_RUNTIME) return; // Skipping validation on Android - - // We can skip this validation because we can catch invalid values - // of any remote service (action invocation, event value) before, they are - // strings. The datatype's valueOf() will take care of that. The validations - // are really only used when a developer prepares input arguments for an action - // invocation or when a local service returns a wrong value. - - // In the first case the developer will get an exception when executing the - // action, if his action input argument value was of the wrong type. Or, - // an XML processing error will occur as soon as the SOAP message is handled, - // if the value contained invalid characters. - - // The second case indicates a bug in the local service, either metadata (state - // variable type) or implementation (action method return value). This will - // most likely be caught by the metadata/annotation binder when the service is - // created. - - if (!getDatatype().isValid(getValue())) - throw new InvalidValueException("Invalid value for " + getDatatype() +": " + getValue()); - - logInvalidXML(toString()); - } - - public Datatype getDatatype() { - return datatype; - } - - public Object getValue() { - return value; - } - - protected void logInvalidXML(String s) { - // Just display warnings. PS3 Media server sends null char in DIDL-Lite - // http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char - int cp; - int i = 0; - while (i < s.length()) { - cp = s.codePointAt(i); - if (!(cp == 0x9 || cp == 0xA || cp == 0xD || - (cp >= 0x20 && cp <= 0xD7FF) || - (cp >= 0xE000 && cp <= 0xFFFD) || - (cp >= 0x10000 && cp <= 0x10FFFF))) { - log.warning("Found invalid XML char code: " + cp); - } - i += Character.charCount(cp); - } - } - - @Override - public String toString() { - return getDatatype().getString(getValue()); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/XMLUtil.java b/app/src/main/java/org/fourthline/cling/model/XMLUtil.java deleted file mode 100644 index 6b4bb7f..0000000 --- a/app/src/main/java/org/fourthline/cling/model/XMLUtil.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -/** - * XML handling and printing shortcuts. - *

- * This class exists because Android 2.1 does not offer any way to print an org.w3c.dom.Document, - * and it also doesn't implement the most trivial methods to build a DOM (although the API is provided, they - * fail at runtime). We might be able to remove this class once compatibility for Android 2.1 can be - * dropped. - *

- * - * @author Christian Bauer - */ -public class XMLUtil { - - /* TODO: How it should be done (nice API, eh?) - public static String documentToString(Document document) throws Exception { - TransformerFactory transFactory = TransformerFactory.newInstance(); - transFactory.setAttribute("indent-number", 4); - Transformer transformer = transFactory.newTransformer(); - transformer.setOutputProperty(OutputKeys.STANDALONE, "yes"); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); - StringWriter out = new StringWriter(); - transformer.transform(new DOMSource(d), new StreamResult(out)); - return out.toString(); - } - */ - - // TODO: Evil methods to print XML on Android 2.1 (there is no TransformerFactory) - - public static String documentToString(Document document) throws Exception { - return documentToString(document, true); - } - - public static String documentToString(Document document, boolean standalone) throws Exception { - String prol = ""; - return prol + nodeToString(document.getDocumentElement(), new HashSet(), document.getDocumentElement().getNamespaceURI()); - } - - public static String documentToFragmentString(Document document) throws Exception { - return nodeToString(document.getDocumentElement(), new HashSet(), document.getDocumentElement().getNamespaceURI()); - } - - protected static String nodeToString(Node node, Set parentPrefixes, String namespaceURI) throws Exception { - StringBuilder b = new StringBuilder(); - - if (node == null) { - return ""; - } - - if (node instanceof Element) { - Element element = (Element) node; - b.append("<"); - b.append(element.getNodeName()); - - Map thisLevelPrefixes = new HashMap(); - if (element.getPrefix() != null && !parentPrefixes.contains(element.getPrefix())) { - thisLevelPrefixes.put(element.getPrefix(), element.getNamespaceURI()); - } - - if (element.hasAttributes()) { - NamedNodeMap map = element.getAttributes(); - for (int i = 0; i < map.getLength(); i++) { - Node attr = map.item(i); - if (attr.getNodeName().startsWith("xmlns")) continue; - if (attr.getPrefix() != null && !parentPrefixes.contains(attr.getPrefix())) { - thisLevelPrefixes.put(attr.getPrefix(), element.getNamespaceURI()); - } - b.append(" "); - b.append(attr.getNodeName()); - b.append("=\""); - b.append(attr.getNodeValue()); - b.append("\""); - } - } - - if (namespaceURI != null && !thisLevelPrefixes.containsValue(namespaceURI) && - !namespaceURI.equals(element.getParentNode().getNamespaceURI())) { - b.append(" xmlns=\"").append(namespaceURI).append("\""); - } - - for (Map.Entry entry : thisLevelPrefixes.entrySet()) { - b.append(" xmlns:").append(entry.getKey()).append("=\"").append(entry.getValue()).append("\""); - parentPrefixes.add(entry.getKey()); - } - - NodeList children = element.getChildNodes(); - boolean hasOnlyAttributes = true; - for (int i = 0; i < children.getLength(); i++) { - Node child = children.item(i); - if (child.getNodeType() != Node.ATTRIBUTE_NODE) { - hasOnlyAttributes = false; - break; - } - } - if (!hasOnlyAttributes) { - b.append(">"); - for (int i = 0; i < children.getLength(); i++) { - b.append(nodeToString(children.item(i), parentPrefixes, children.item(i).getNamespaceURI())); - } - b.append(""); - } else { - b.append("/>"); - } - - for (String thisLevelPrefix : thisLevelPrefixes.keySet()) { - parentPrefixes.remove(thisLevelPrefix); - } - - } else if (node.getNodeValue() != null) { - b.append(encodeText(node.getNodeValue())); - } - - return b.toString(); - } - - public static String encodeText(String s) { - s = s.replaceAll("&", "&"); - s = s.replaceAll("<", "<"); - s = s.replaceAll(">", ">"); - s = s.replaceAll("'", "'"); - s = s.replaceAll("\"", """); - return s; - } - - public static Element appendNewElement(Document document, Element parent, Enum el) { - return appendNewElement(document, parent, el.toString()); - } - - public static Element appendNewElement(Document document, Element parent, String element) { - Element child = document.createElement(element); - parent.appendChild(child); - return child; - } - - public static Element appendNewElementIfNotNull(Document document, Element parent, Enum el, Object content) { - return appendNewElementIfNotNull(document, parent, el, content, null); - } - - public static Element appendNewElementIfNotNull(Document document, Element parent, Enum el, Object content, String namespace) { - return appendNewElementIfNotNull(document, parent, el.toString(), content, namespace); - } - - public static Element appendNewElementIfNotNull(Document document, Element parent, String element, Object content) { - return appendNewElementIfNotNull(document, parent, element, content, null); - } - - public static Element appendNewElementIfNotNull(Document document, Element parent, String element, Object content, String namespace) { - if (content == null) return parent; - return appendNewElement(document, parent, element, content, namespace); - } - - public static Element appendNewElement(Document document, Element parent, String element, Object content) { - return appendNewElement(document, parent, element, content, null); - } - - public static Element appendNewElement(Document document, Element parent, String element, Object content, String namespace) { - Element childElement; - if (namespace != null) { - childElement = document.createElementNS(namespace, element); - } else { - childElement = document.createElement(element); - } - - if (content != null) { - // TODO: We'll have that on Android 2.2: - // childElement.setTextContent(content.toString()); - // Meanwhile: - childElement.appendChild(document.createTextNode(content.toString())); - } - - parent.appendChild(childElement); - return childElement; - } - - // TODO: Of course, there is no Element.getTextContent() either... - public static String getTextContent(Node node) { - StringBuffer buffer = new StringBuffer(); - NodeList childList = node.getChildNodes(); - for (int i = 0; i < childList.getLength(); i++) { - Node child = childList.item(i); - if (child.getNodeType() != Node.TEXT_NODE) - continue; // skip non-text nodes - buffer.append(child.getNodeValue()); - } - return buffer.toString(); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/action/AbstractActionExecutor.java b/app/src/main/java/org/fourthline/cling/model/action/AbstractActionExecutor.java deleted file mode 100644 index 5cdfefb..0000000 --- a/app/src/main/java/org/fourthline/cling/model/action/AbstractActionExecutor.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.action; - -import org.fourthline.cling.model.Command; -import org.fourthline.cling.model.ServiceManager; -import org.fourthline.cling.model.meta.Action; -import org.fourthline.cling.model.meta.ActionArgument; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.state.StateVariableAccessor; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.model.types.InvalidValueException; -import org.seamless.util.Exceptions; - -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Shared procedures for action executors based on an actual service implementation instance. - * - * @author Christian Bauer - */ -public abstract class AbstractActionExecutor implements ActionExecutor { - - private static Logger log = Logger.getLogger(AbstractActionExecutor.class.getName()); - - protected Map, StateVariableAccessor> outputArgumentAccessors = - new HashMap, StateVariableAccessor>(); - - protected AbstractActionExecutor() { - } - - protected AbstractActionExecutor(Map, StateVariableAccessor> outputArgumentAccessors) { - this.outputArgumentAccessors = outputArgumentAccessors; - } - - public Map, StateVariableAccessor> getOutputArgumentAccessors() { - return outputArgumentAccessors; - } - - /** - * Obtains the service implementation instance from the {@link org.fourthline.cling.model.ServiceManager}, handles exceptions. - */ - public void execute(final ActionInvocation actionInvocation) { - - log.fine("Invoking on local service: " + actionInvocation); - - final LocalService service = actionInvocation.getAction().getService(); - - try { - - if (service.getManager() == null) { - throw new IllegalStateException("Service has no implementation factory, can't get service instance"); - } - - service.getManager().execute(new Command() { - public void execute(ServiceManager serviceManager) throws Exception { - AbstractActionExecutor.this.execute( - actionInvocation, - serviceManager.getImplementation() - ); - } - - @Override - public String toString() { - return "Action invocation: " + actionInvocation.getAction(); - } - }); - - } catch (ActionException ex) { - if (log.isLoggable(Level.FINE)) { - log.fine("ActionException thrown by service, wrapping in invocation and returning: " + ex); - log.log(Level.FINE, "Exception root cause: ", Exceptions.unwrap(ex)); - } - actionInvocation.setFailure(ex); - } catch (InterruptedException ex) { - if (log.isLoggable(Level.FINE)) { - log.fine("InterruptedException thrown by service, wrapping in invocation and returning: " + ex); - log.log(Level.FINE, "Exception root cause: ", Exceptions.unwrap(ex)); - } - actionInvocation.setFailure(new ActionCancelledException(ex)); - } catch (Throwable t) { - Throwable rootCause = Exceptions.unwrap(t); - if (log.isLoggable(Level.FINE)) { - log.fine("Execution has thrown, wrapping root cause in ActionException and returning: " + t); - log.log(Level.FINE, "Exception root cause: ", rootCause); - } - actionInvocation.setFailure( - new ActionException( - ErrorCode.ACTION_FAILED, - (rootCause.getMessage() != null ? rootCause.getMessage() : rootCause.toString()), - rootCause - ) - ); - } - } - - protected abstract void execute(ActionInvocation actionInvocation, Object serviceImpl) throws Exception; - - /** - * Reads the output arguments after an action execution using accessors. - * - * @param action The action of which the output arguments are read. - * @param instance The instance on which the accessors will be invoked. - * @return null if the action has no output arguments, a single instance if it has one, an - * Object[] otherwise. - * @throws Exception - */ - protected Object readOutputArgumentValues(Action action, Object instance) throws Exception { - Object[] results = new Object[action.getOutputArguments().length]; - log.fine("Attempting to retrieve output argument values using accessor: " + results.length); - - int i = 0; - for (ActionArgument outputArgument : action.getOutputArguments()) { - log.finer("Calling acccessor method for: " + outputArgument); - - StateVariableAccessor accessor = getOutputArgumentAccessors().get(outputArgument); - if (accessor != null) { - log.fine("Calling accessor to read output argument value: " + accessor); - results[i++] = accessor.read(instance); - } else { - throw new IllegalStateException("No accessor bound for: " + outputArgument); - } - } - - if (results.length == 1) { - return results[0]; - } - return results.length > 0 ? results : null; - } - - /** - * Sets the output argument value on the {@link org.fourthline.cling.model.action.ActionInvocation}, considers string conversion. - */ - protected void setOutputArgumentValue(ActionInvocation actionInvocation, ActionArgument argument, Object result) - throws ActionException { - - LocalService service = actionInvocation.getAction().getService(); - - if (result != null) { - try { - if (service.isStringConvertibleType(result)) { - log.fine("Result of invocation matches convertible type, setting toString() single output argument value"); - actionInvocation.setOutput(new ActionArgumentValue(argument, result.toString())); - } else { - log.fine("Result of invocation is Object, setting single output argument value"); - actionInvocation.setOutput(new ActionArgumentValue(argument, result)); - } - } catch (InvalidValueException ex) { - throw new ActionException( - ErrorCode.ARGUMENT_VALUE_INVALID, - "Wrong type or invalid value for '" + argument.getName() + "': " + ex.getMessage(), - ex - ); - } - } else { - - log.fine("Result of invocation is null, not setting any output argument value(s)"); - } - - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/action/ActionArgumentValue.java b/app/src/main/java/org/fourthline/cling/model/action/ActionArgumentValue.java deleted file mode 100644 index 3360a3d..0000000 --- a/app/src/main/java/org/fourthline/cling/model/action/ActionArgumentValue.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.action; - -import org.fourthline.cling.model.VariableValue; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.meta.ActionArgument; -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * Represents the value of an action input or output argument. - * - * @author Christian Bauer - */ -public class ActionArgumentValue extends VariableValue { - - final private ActionArgument argument; - - public ActionArgumentValue(ActionArgument argument, Object value) throws InvalidValueException { - super(argument.getDatatype(), value != null && value.getClass().isEnum() ? value.toString() : value); - this.argument = argument; - } - - public ActionArgument getArgument() { - return argument; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/action/ActionCancelledException.java b/app/src/main/java/org/fourthline/cling/model/action/ActionCancelledException.java deleted file mode 100644 index b0d7c57..0000000 --- a/app/src/main/java/org/fourthline/cling/model/action/ActionCancelledException.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.model.action; - -import org.fourthline.cling.model.types.ErrorCode; - -/** - * @author Christian Bauer - */ -public class ActionCancelledException extends ActionException { - - public ActionCancelledException(InterruptedException cause) { - super(ErrorCode.ACTION_FAILED, "Action execution interrupted", cause); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/action/ActionException.java b/app/src/main/java/org/fourthline/cling/model/action/ActionException.java deleted file mode 100644 index 5a7590d..0000000 --- a/app/src/main/java/org/fourthline/cling/model/action/ActionException.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.action; - -import org.fourthline.cling.model.types.ErrorCode; - -/** - * Thrown (or encapsulated in {@link org.fourthline.cling.model.action.ActionInvocation} when an action execution failed. - * - * @author Christian Bauer - */ -public class ActionException extends Exception { - - private int errorCode; - - public ActionException(int errorCode, String message) { - super(message); - this.errorCode = errorCode; - } - - public ActionException(int errorCode, String message, Throwable cause) { - super(message, cause); - this.errorCode = errorCode; - } - - public ActionException(ErrorCode errorCode) { - this(errorCode.getCode(), errorCode.getDescription()); - } - - public ActionException(ErrorCode errorCode, String message) { - this(errorCode, message, true); - } - - public ActionException(ErrorCode errorCode, String message, boolean concatMessages) { - this(errorCode.getCode(), concatMessages ? (errorCode.getDescription() + ". " + message + ".") : message); - } - - public ActionException(ErrorCode errorCode, String message, Throwable cause) { - this(errorCode.getCode(), errorCode.getDescription() + ". " + message + ".", cause); - } - - public int getErrorCode() { - return errorCode; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/action/ActionExecutor.java b/app/src/main/java/org/fourthline/cling/model/action/ActionExecutor.java deleted file mode 100644 index 1aaa347..0000000 --- a/app/src/main/java/org/fourthline/cling/model/action/ActionExecutor.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.action; - -import org.fourthline.cling.model.meta.LocalService; - -/** - * Executes an {@link org.fourthline.cling.model.action.ActionInvocation}. - * - * @author Christian Bauer - */ -public interface ActionExecutor { - - public void execute(final ActionInvocation actionInvocation); -} diff --git a/app/src/main/java/org/fourthline/cling/model/action/ActionInvocation.java b/app/src/main/java/org/fourthline/cling/model/action/ActionInvocation.java deleted file mode 100644 index 2c16d3f..0000000 --- a/app/src/main/java/org/fourthline/cling/model/action/ActionInvocation.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.action; - -import org.fourthline.cling.model.meta.Action; -import org.fourthline.cling.model.meta.ActionArgument; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.profile.ClientInfo; -import org.fourthline.cling.model.types.InvalidValueException; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * The input, output, and failure values of an action invocation. - * - * @author Christian Bauer - */ -public class ActionInvocation { - - final protected Action action; - final protected ClientInfo clientInfo; - - // We don't necessarily have to preserve insertion order but it's nicer if the arrays returned - // by the getters are reliable - protected Map> input = new LinkedHashMap(); - protected Map> output = new LinkedHashMap(); - - protected ActionException failure = null; - - public ActionInvocation(Action action) { - this(action, null, null, null); - } - - public ActionInvocation(Action action, - ClientInfo clientInfo) { - this(action, null, null, clientInfo); - } - - public ActionInvocation(Action action, - ActionArgumentValue[] input) { - this(action, input, null, null); - } - - public ActionInvocation(Action action, - ActionArgumentValue[] input, - ClientInfo clientInfo) { - this(action, input, null, clientInfo); - } - - public ActionInvocation(Action action, - ActionArgumentValue[] input, - ActionArgumentValue[] output) { - this(action, input, output, null); - } - - public ActionInvocation(Action action, - ActionArgumentValue[] input, - ActionArgumentValue[] output, - ClientInfo clientInfo) { - if (action == null) { - throw new IllegalArgumentException("Action can not be null"); - } - this.action = action; - - setInput(input); - setOutput(output); - - this.clientInfo = clientInfo; - } - - public ActionInvocation(ActionException failure) { - this.action = null; - this.input = null; - this.output = null; - this.failure = failure; - this.clientInfo = null; - } - - public Action getAction() { - return action; - } - - public ActionArgumentValue[] getInput() { - return input.values().toArray(new ActionArgumentValue[input.size()]); - } - - public ActionArgumentValue getInput(String argumentName) { - return getInput(getInputArgument(argumentName)); - } - - public ActionArgumentValue getInput(ActionArgument argument) { - return input.get(argument.getName()); - } - - public Map> getInputMap() { - return Collections.unmodifiableMap(input); - } - - public ActionArgumentValue[] getOutput() { - return output.values().toArray(new ActionArgumentValue[output.size()]); - } - - public ActionArgumentValue getOutput(String argumentName) { - return getOutput(getOutputArgument(argumentName)); - } - - public Map> getOutputMap() { - return Collections.unmodifiableMap(output); - } - - public ActionArgumentValue getOutput(ActionArgument argument) { - return output.get(argument.getName()); - } - - public void setInput(String argumentName, Object value) throws InvalidValueException { - setInput(new ActionArgumentValue(getInputArgument(argumentName), value)); - } - - public void setInput(ActionArgumentValue value) { - input.put(value.getArgument().getName(), value); - } - - public void setInput(ActionArgumentValue[] input) { - if (input == null) return; - for (ActionArgumentValue argumentValue : input) { - this.input.put(argumentValue.getArgument().getName(), argumentValue); - } - } - - public void setOutput(String argumentName, Object value) throws InvalidValueException { - setOutput(new ActionArgumentValue(getOutputArgument(argumentName), value)); - } - - public void setOutput(ActionArgumentValue value){ - output.put(value.getArgument().getName(), value); - } - - public void setOutput(ActionArgumentValue[] output) { - if (output == null) return; - for (ActionArgumentValue argumentValue : output) { - this.output.put(argumentValue.getArgument().getName(), argumentValue); - } - } - - protected ActionArgument getInputArgument(String name) { - ActionArgument argument = getAction().getInputArgument(name); - if (argument == null) throw new IllegalArgumentException("Argument not found: " + name); - return argument; - } - - protected ActionArgument getOutputArgument(String name) { - ActionArgument argument = getAction().getOutputArgument(name); - if (argument == null) throw new IllegalArgumentException("Argument not found: " + name); - return argument; - } - - /** - * @return null if execution was successful, failure details otherwise. - */ - public ActionException getFailure() { - return failure; - } - - public void setFailure(ActionException failure) { - this.failure = failure; - } - - /** - * @return null if no info was provided for a local invocation. - */ - public ClientInfo getClientInfo() { - return clientInfo; - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") " + getAction(); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/action/MethodActionExecutor.java b/app/src/main/java/org/fourthline/cling/model/action/MethodActionExecutor.java deleted file mode 100644 index eae8bd7..0000000 --- a/app/src/main/java/org/fourthline/cling/model/action/MethodActionExecutor.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.action; - -import org.fourthline.cling.model.meta.ActionArgument; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.profile.RemoteClientInfo; -import org.fourthline.cling.model.state.StateVariableAccessor; -import org.fourthline.cling.model.types.ErrorCode; -import org.seamless.util.Reflections; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; - -/** - * Invokes methods on a service implementation instance with reflection. - * - *

- * If the method has an additional last parameter of type - * {@link org.fourthline.cling.model.profile.RemoteClientInfo}, the details - * of the control point client will be provided to the action method. You can use this - * to get the client's address and request headers, and to provide extra response headers. - *

- * - * @author Christian Bauer - */ -public class MethodActionExecutor extends AbstractActionExecutor { - - private static Logger log = Logger.getLogger(MethodActionExecutor.class.getName()); - - protected Method method; - - public MethodActionExecutor(Method method) { - this.method = method; - } - - public MethodActionExecutor(Map, StateVariableAccessor> outputArgumentAccessors, Method method) { - super(outputArgumentAccessors); - this.method = method; - } - - public Method getMethod() { - return method; - } - - @Override - protected void execute(ActionInvocation actionInvocation, Object serviceImpl) throws Exception { - - // Find the "real" parameters of the method we want to call, and create arguments - Object[] inputArgumentValues = createInputArgumentValues(actionInvocation, method); - - // Simple case: no output arguments - if (!actionInvocation.getAction().hasOutputArguments()) { - log.fine("Calling local service method with no output arguments: " + method); - Reflections.invoke(method, serviceImpl, inputArgumentValues); - return; - } - - boolean isVoid = method.getReturnType().equals(Void.TYPE); - - log.fine("Calling local service method with output arguments: " + method); - Object result; - boolean isArrayResultProcessed = true; - if (isVoid) { - - log.fine("Action method is void, calling declared accessors(s) on service instance to retrieve ouput argument(s)"); - Reflections.invoke(method, serviceImpl, inputArgumentValues); - result = readOutputArgumentValues(actionInvocation.getAction(), serviceImpl); - - } else if (isUseOutputArgumentAccessors(actionInvocation)) { - - log.fine("Action method is not void, calling declared accessor(s) on returned instance to retrieve ouput argument(s)"); - Object returnedInstance = Reflections.invoke(method, serviceImpl, inputArgumentValues); - result = readOutputArgumentValues(actionInvocation.getAction(), returnedInstance); - - } else { - - log.fine("Action method is not void, using returned value as (single) output argument"); - result = Reflections.invoke(method, serviceImpl, inputArgumentValues); - isArrayResultProcessed = false; // We never want to process e.g. byte[] as individual variable values - } - - ActionArgument[] outputArgs = actionInvocation.getAction().getOutputArguments(); - - if (isArrayResultProcessed && result instanceof Object[]) { - Object[] results = (Object[]) result; - log.fine("Accessors returned Object[], setting output argument values: " + results.length); - for (int i = 0; i < outputArgs.length; i++) { - setOutputArgumentValue(actionInvocation, outputArgs[i], results[i]); - } - } else if (outputArgs.length == 1) { - setOutputArgumentValue(actionInvocation, outputArgs[0], result); - } else { - throw new ActionException( - ErrorCode.ACTION_FAILED, - "Method return does not match required number of output arguments: " + outputArgs.length - ); - } - - } - - protected boolean isUseOutputArgumentAccessors(ActionInvocation actionInvocation) { - for (ActionArgument argument : actionInvocation.getAction().getOutputArguments()) { - // If there is one output argument for which we have an accessor, all arguments need accessors - if (getOutputArgumentAccessors().get(argument) != null) { - return true; - } - } - return false; - } - - protected Object[] createInputArgumentValues(ActionInvocation actionInvocation, Method method) throws ActionException { - - LocalService service = actionInvocation.getAction().getService(); - - List values = new ArrayList(); - int i = 0; - for (ActionArgument argument : actionInvocation.getAction().getInputArguments()) { - - Class methodParameterType = method.getParameterTypes()[i]; - - ActionArgumentValue inputValue = actionInvocation.getInput(argument); - - // If it's a primitive argument, we need a value - if (methodParameterType.isPrimitive() && (inputValue == null || inputValue.toString().length() == 0)) - throw new ActionException( - ErrorCode.ARGUMENT_VALUE_INVALID, - "Primitive action method argument '" + argument.getName() + "' requires input value, can't be null or empty string" - ); - - // It's not primitive and we have no value, that's fine too - if (inputValue == null) { - values.add(i++, null); - continue; - } - - // If it's not null, maybe it was a string-convertible type, if so, try to instantiate it - String inputCallValueString = inputValue.toString(); - // Empty string means null and we can't instantiate Enums! - if (inputCallValueString.length() > 0 && service.isStringConvertibleType(methodParameterType) && !methodParameterType.isEnum()) { - try { - Constructor ctor = methodParameterType.getConstructor(String.class); - log.finer("Creating new input argument value instance with String.class constructor of type: " + methodParameterType); - Object o = ctor.newInstance(inputCallValueString); - values.add(i++, o); - } catch (Exception ex) { - log.warning("Error preparing action method call: " + method); - log.warning("Can't convert input argument string to desired type of '" + argument.getName() + "': " + ex); - throw new ActionException( - ErrorCode.ARGUMENT_VALUE_INVALID, "Can't convert input argument string to desired type of '" + argument.getName() + "': " + ex - ); - } - } else { - // Or if it wasn't, just use the value without any conversion - values.add(i++, inputValue.getValue()); - } - } - - if (method.getParameterTypes().length > 0 - && RemoteClientInfo.class.isAssignableFrom(method.getParameterTypes()[method.getParameterTypes().length-1])) { - if (actionInvocation instanceof RemoteActionInvocation && - ((RemoteActionInvocation)actionInvocation).getRemoteClientInfo() != null) { - log.finer("Providing remote client info as last action method input argument: " + method); - values.add(i, ((RemoteActionInvocation)actionInvocation).getRemoteClientInfo()); - } else { - // Local call, no client info available - values.add(i, null); - } - } - - return values.toArray(new Object[values.size()]); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/action/QueryStateVariableExecutor.java b/app/src/main/java/org/fourthline/cling/model/action/QueryStateVariableExecutor.java deleted file mode 100644 index f88bca0..0000000 --- a/app/src/main/java/org/fourthline/cling/model/action/QueryStateVariableExecutor.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.action; - -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.meta.QueryStateVariableAction; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.state.StateVariableAccessor; -import org.fourthline.cling.model.types.ErrorCode; - -/** - * Special executor for one action, the deprecated "query the value of the any state variable" action. - * - * @author Christian Bauer - */ -public class QueryStateVariableExecutor extends AbstractActionExecutor { - - @Override - protected void execute(ActionInvocation actionInvocation, Object serviceImpl) throws Exception { - - // Querying a state variable doesn't mean an actual "action" method on this instance gets invoked - if (actionInvocation.getAction() instanceof QueryStateVariableAction) { - if (!actionInvocation.getAction().getService().isSupportsQueryStateVariables()) { - actionInvocation.setFailure( - new ActionException(ErrorCode.INVALID_ACTION, "This service does not support querying state variables") - ); - } else { - executeQueryStateVariable(actionInvocation, serviceImpl); - } - } else { - throw new IllegalStateException( - "This class can only execute QueryStateVariableAction's, not: " + actionInvocation.getAction() - ); - } - } - - protected void executeQueryStateVariable(ActionInvocation actionInvocation, Object serviceImpl) throws Exception { - - LocalService service = actionInvocation.getAction().getService(); - - String stateVariableName = actionInvocation.getInput("varName").toString(); - StateVariable stateVariable = service.getStateVariable(stateVariableName); - - if (stateVariable == null) { - throw new ActionException( - ErrorCode.ARGUMENT_VALUE_INVALID, "No state variable found: " + stateVariableName - ); - } - - StateVariableAccessor accessor; - if ((accessor = service.getAccessor(stateVariable.getName())) == null) { - throw new ActionException( - ErrorCode.ARGUMENT_VALUE_INVALID, "No accessor for state variable, can't read state: " + stateVariableName - ); - } - - try { - setOutputArgumentValue( - actionInvocation, - actionInvocation.getAction().getOutputArgument("return"), - accessor.read(stateVariable, serviceImpl).toString() - ); - } catch (Exception ex) { - throw new ActionException(ErrorCode.ACTION_FAILED, ex.getMessage()); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/action/RemoteActionInvocation.java b/app/src/main/java/org/fourthline/cling/model/action/RemoteActionInvocation.java deleted file mode 100644 index a6f70be..0000000 --- a/app/src/main/java/org/fourthline/cling/model/action/RemoteActionInvocation.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.action; - -import org.fourthline.cling.model.meta.Action; -import org.fourthline.cling.model.profile.RemoteClientInfo; - -/** - * An action invocation by a remote control point. - * - * @author Christian Bauer - */ -public class RemoteActionInvocation extends ActionInvocation { - - final protected RemoteClientInfo remoteClientInfo; - - public RemoteActionInvocation(Action action, - ActionArgumentValue[] input, - ActionArgumentValue[] output, - RemoteClientInfo remoteClientInfo) { - super(action, input, output, null); - this.remoteClientInfo = remoteClientInfo; - } - - public RemoteActionInvocation(Action action, - RemoteClientInfo remoteClientInfo) { - super(action); - this.remoteClientInfo = remoteClientInfo; - } - - public RemoteActionInvocation(ActionException failure, - RemoteClientInfo remoteClientInfo) { - super(failure); - this.remoteClientInfo = remoteClientInfo; - } - - public RemoteClientInfo getRemoteClientInfo() { - return remoteClientInfo; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/gena/CancelReason.java b/app/src/main/java/org/fourthline/cling/model/gena/CancelReason.java deleted file mode 100644 index c04db92..0000000 --- a/app/src/main/java/org/fourthline/cling/model/gena/CancelReason.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.gena; - -/** - * The reason why a {@link org.fourthline.cling.model.gena.GENASubscription} has ended unexpectedly. - * - * @author Christian Bauer - */ -public enum CancelReason { - - RENEWAL_FAILED, - DEVICE_WAS_REMOVED, - UNSUBSCRIBE_FAILED, - EXPIRED -} diff --git a/app/src/main/java/org/fourthline/cling/model/gena/GENASubscription.java b/app/src/main/java/org/fourthline/cling/model/gena/GENASubscription.java deleted file mode 100644 index 497e9d0..0000000 --- a/app/src/main/java/org/fourthline/cling/model/gena/GENASubscription.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.gena; - -import java.util.LinkedHashMap; -import java.util.Map; - -import org.fourthline.cling.model.UserConstants; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.state.StateVariableValue; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -/** - * An established subscription, with identifer, expiration duration, sequence handling, and state variable values. - *

- * For every subscription, no matter if it's an incoming subscription to a local service, - * or a local control point subscribing to a remote servce, an instance is maintained by - * the {@link org.fourthline.cling.registry.Registry}. - *

- * - * @author Christian Bauer - */ -public abstract class GENASubscription { - - protected S service; - protected String subscriptionId; - protected int requestedDurationSeconds = UserConstants.DEFAULT_SUBSCRIPTION_DURATION_SECONDS; - protected int actualDurationSeconds; - protected UnsignedIntegerFourBytes currentSequence; - protected Map> currentValues = new LinkedHashMap(); - - /** - * Defaults to {@link org.fourthline.cling.model.UserConstants#DEFAULT_SUBSCRIPTION_DURATION_SECONDS}. - */ - protected GENASubscription(S service) { - this.service = service; - } - - public GENASubscription(S service, int requestedDurationSeconds) { - this(service); - this.requestedDurationSeconds = requestedDurationSeconds; - } - - synchronized public S getService() { - return service; - } - - synchronized public String getSubscriptionId() { - return subscriptionId; - } - - synchronized public void setSubscriptionId(String subscriptionId) { - this.subscriptionId = subscriptionId; - } - - synchronized public int getRequestedDurationSeconds() { - return requestedDurationSeconds; - } - - synchronized public int getActualDurationSeconds() { - return actualDurationSeconds; - } - - synchronized public void setActualSubscriptionDurationSeconds(int seconds) { - this.actualDurationSeconds = seconds; - } - - synchronized public UnsignedIntegerFourBytes getCurrentSequence() { - return currentSequence; - } - - synchronized public Map> getCurrentValues() { - return currentValues; - } - - public abstract void established(); - public abstract void eventReceived(); - - @Override - public String toString() { - return "(GENASubscription, SID: " + getSubscriptionId() + ", SEQUENCE: " + getCurrentSequence() + ")"; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/gena/LocalGENASubscription.java b/app/src/main/java/org/fourthline/cling/model/gena/LocalGENASubscription.java deleted file mode 100644 index ff90bba..0000000 --- a/app/src/main/java/org/fourthline/cling/model/gena/LocalGENASubscription.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.gena; - -import org.fourthline.cling.model.ServiceManager; -import org.fourthline.cling.model.UserConstants; -import org.fourthline.cling.model.message.header.SubscriptionIdHeader; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.state.StateVariableValue; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.seamless.util.Exceptions; - -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.net.URL; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * An incoming subscription to a local service. - *

- * Uses the {@link org.fourthline.cling.model.ServiceManager} to read the initial state of - * the {@link org.fourthline.cling.model.meta.LocalService} on instantation. Typically, the - * {@link #registerOnService()} method is called next, and from this point forward all - * {@link org.fourthline.cling.model.ServiceManager#EVENTED_STATE_VARIABLES} property change - * events are detected by this subscription. After moderation of state variable values - * (frequency and range of changes), the {@link #eventReceived()} method is called. - * Delivery of the event message to the subscriber is not part of this class, but the - * implementor of {@link #eventReceived()}. - *

- * - * @author Christian Bauer - */ -public abstract class LocalGENASubscription extends GENASubscription implements PropertyChangeListener { - - private static Logger log = Logger.getLogger(LocalGENASubscription.class.getName()); - - final List callbackURLs; - - // Moderation history - final Map lastSentTimestamp = new HashMap(); - final Map lastSentNumericValue = new HashMap(); - - protected LocalGENASubscription(LocalService service, List callbackURLs) throws Exception { - super(service); - this.callbackURLs = callbackURLs; - } - - public LocalGENASubscription(LocalService service, - Integer requestedDurationSeconds, List callbackURLs) throws Exception { - super(service); - - setSubscriptionDuration(requestedDurationSeconds); - - log.fine("Reading initial state of local service at subscription time"); - long currentTime = new Date().getTime(); - this.currentValues.clear(); - - Collection values = getService().getManager().getCurrentState(); - - log.finer("Got evented state variable values: " + values.size()); - - for (StateVariableValue value : values) { - this.currentValues.put(value.getStateVariable().getName(), value); - - if (log.isLoggable(Level.FINEST)) { - log.finer("Read state variable value '" + value.getStateVariable().getName() + "': " + value.toString()); - } - - // Preserve "last sent" state for future moderation - lastSentTimestamp.put(value.getStateVariable().getName(), currentTime); - if (value.getStateVariable().isModeratedNumericType()) { - lastSentNumericValue.put(value.getStateVariable().getName(), Long.valueOf(value.toString())); - } - } - - this.subscriptionId = SubscriptionIdHeader.PREFIX + UUID.randomUUID(); - this.currentSequence = new UnsignedIntegerFourBytes(0); - this.callbackURLs = callbackURLs; - } - - synchronized public List getCallbackURLs() { - return callbackURLs; - } - - /** - * Adds a property change listener on the {@link org.fourthline.cling.model.ServiceManager}. - */ - synchronized public void registerOnService() { - getService().getManager().getPropertyChangeSupport().addPropertyChangeListener(this); - } - - synchronized public void establish() { - established(); - } - - /** - * Removes a property change listener on the {@link org.fourthline.cling.model.ServiceManager}. - */ - synchronized public void end(CancelReason reason) { - try { - getService().getManager().getPropertyChangeSupport().removePropertyChangeListener(this); - } catch (Exception ex) { - log.warning("Removal of local service property change listener failed: " + Exceptions.unwrap(ex)); - } - ended(reason); - } - - /** - * Moderates {@link org.fourthline.cling.model.ServiceManager#EVENTED_STATE_VARIABLES} events and state variable - * values, calls {@link #eventReceived()}. - */ - synchronized public void propertyChange(PropertyChangeEvent e) { - if (!e.getPropertyName().equals(ServiceManager.EVENTED_STATE_VARIABLES)) return; - - log.fine("Eventing triggered, getting state for subscription: " + getSubscriptionId()); - - long currentTime = new Date().getTime(); - - Collection newValues = (Collection) e.getNewValue(); - Set excludedVariables = moderateStateVariables(currentTime, newValues); - - currentValues.clear(); - for (StateVariableValue newValue : newValues) { - String name = newValue.getStateVariable().getName(); - if (!excludedVariables.contains(name)) { - log.fine("Adding state variable value to current values of event: " + newValue.getStateVariable() + " = " + newValue); - currentValues.put(newValue.getStateVariable().getName(), newValue); - - // Preserve "last sent" state for future moderation - lastSentTimestamp.put(name, currentTime); - if (newValue.getStateVariable().isModeratedNumericType()) { - lastSentNumericValue.put(name, Long.valueOf(newValue.toString())); - } - } - } - - if (currentValues.size() > 0) { - log.fine("Propagating new state variable values to subscription: " + this); - // TODO: I'm not happy with this design, this dispatches to a separate thread which _then_ - // is supposed to lock and read the values off this instance. That obviously doesn't work - // so it's currently a hack in SendingEvent.java - eventReceived(); - } else { - log.fine("No state variable values for event (all moderated out?), not triggering event"); - } - } - - /** - * Checks whether a state variable is moderated, and if this change is within the maximum rate and range limits. - * - * @param currentTime The current unix time. - * @param values The state variable values to moderate. - * @return A collection of state variable values that although they might have changed, are excluded from the event. - */ - synchronized protected Set moderateStateVariables(long currentTime, Collection values) { - - Set excludedVariables = new HashSet(); - - // Moderate event variables that have a maximum rate or minimum delta - for (StateVariableValue stateVariableValue : values) { - - StateVariable stateVariable = stateVariableValue.getStateVariable(); - String stateVariableName = stateVariableValue.getStateVariable().getName(); - - if (stateVariable.getEventDetails().getEventMaximumRateMilliseconds() == 0 && - stateVariable.getEventDetails().getEventMinimumDelta() == 0) { - log.finer("Variable is not moderated: " + stateVariable); - continue; - } - - // That should actually never happen, because we always "send" it as the initial state/event - if (!lastSentTimestamp.containsKey(stateVariableName)) { - log.finer("Variable is moderated but was never sent before: " + stateVariable); - continue; - } - - if (stateVariable.getEventDetails().getEventMaximumRateMilliseconds() > 0) { - long timestampLastSent = lastSentTimestamp.get(stateVariableName); - long timestampNextSend = timestampLastSent + (stateVariable.getEventDetails().getEventMaximumRateMilliseconds()); - if (currentTime <= timestampNextSend) { - log.finer("Excluding state variable with maximum rate: " + stateVariable); - excludedVariables.add(stateVariableName); - continue; - } - } - - if (stateVariable.isModeratedNumericType() && lastSentNumericValue.get(stateVariableName) != null) { - - long oldValue = Long.valueOf(lastSentNumericValue.get(stateVariableName)); - long newValue = Long.valueOf(stateVariableValue.toString()); - long minDelta = stateVariable.getEventDetails().getEventMinimumDelta(); - - if (newValue > oldValue && newValue - oldValue < minDelta) { - log.finer("Excluding state variable with minimum delta: " + stateVariable); - excludedVariables.add(stateVariableName); - continue; - } - - if (newValue < oldValue && oldValue - newValue < minDelta) { - log.finer("Excluding state variable with minimum delta: " + stateVariable); - excludedVariables.add(stateVariableName); - } - } - - } - return excludedVariables; - } - - synchronized public void incrementSequence() { - this.currentSequence.increment(true); - } - - /** - * @param requestedDurationSeconds If null defaults to - * {@link org.fourthline.cling.model.UserConstants#DEFAULT_SUBSCRIPTION_DURATION_SECONDS} - */ - synchronized public void setSubscriptionDuration(Integer requestedDurationSeconds) { - this.requestedDurationSeconds = - requestedDurationSeconds == null - ? UserConstants.DEFAULT_SUBSCRIPTION_DURATION_SECONDS - : requestedDurationSeconds; - - setActualSubscriptionDurationSeconds(this.requestedDurationSeconds); - } - - public abstract void ended(CancelReason reason); - -} diff --git a/app/src/main/java/org/fourthline/cling/model/gena/RemoteGENASubscription.java b/app/src/main/java/org/fourthline/cling/model/gena/RemoteGENASubscription.java deleted file mode 100644 index 8d0ada5..0000000 --- a/app/src/main/java/org/fourthline/cling/model/gena/RemoteGENASubscription.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.gena; - -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.Namespace; -import org.fourthline.cling.model.NetworkAddress; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.meta.RemoteService; -import org.fourthline.cling.model.state.StateVariableValue; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.model.UnsupportedDataException; - -import java.beans.PropertyChangeSupport; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -/** - * An outgoing subscription to a remote service. - *

- * Once established, calls its {@link #eventReceived()} method whenever an event has - * been received from the remote service. - *

- * - * @author Christian Bauer - */ -public abstract class RemoteGENASubscription extends GENASubscription { - - protected PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); - - protected RemoteGENASubscription(RemoteService service, - int requestedDurationSeconds) { - super(service, requestedDurationSeconds); - } - - synchronized public URL getEventSubscriptionURL() { - return getService().getDevice().normalizeURI( - getService().getEventSubscriptionURI() - ); - } - - synchronized public List getEventCallbackURLs(List activeStreamServers, Namespace namespace) { - List callbackURLs = new ArrayList(); - for (NetworkAddress activeStreamServer : activeStreamServers) { - callbackURLs.add( - new Location( - activeStreamServer, - namespace.getEventCallbackPath(getService()) - ).getURL()); - } - return callbackURLs; - } - - /* The following four methods should always be called in an independent thread, not within the - message receiving thread. Otherwise the user who implements the abstract delegate methods can - block the network communication. - */ - - synchronized public void establish() { - established(); - } - - synchronized public void fail(UpnpResponse responseStatus) { - failed(responseStatus); - } - - synchronized public void end(CancelReason reason, UpnpResponse response) { - ended(reason, response); - } - - synchronized public void receive(UnsignedIntegerFourBytes sequence, Collection newValues) { - - if (this.currentSequence != null) { - - // TODO: Handle rollover to 1! - if (this.currentSequence.getValue().equals(this.currentSequence.getBits().getMaxValue()) && sequence.getValue() == 1) { - System.err.println("TODO: HANDLE ROLLOVER"); - return; - } - - if (this.currentSequence.getValue() >= sequence.getValue()) { - return; - } - - int difference; - long expectedValue = currentSequence.getValue() + 1; - if ((difference = (int) (sequence.getValue() - expectedValue)) != 0) { - eventsMissed(difference); - } - - } - - this.currentSequence = sequence; - - for (StateVariableValue newValue : newValues) { - currentValues.put(newValue.getStateVariable().getName(), newValue); - } - - eventReceived(); - } - - public abstract void invalidMessage(UnsupportedDataException ex); - - public abstract void failed(UpnpResponse responseStatus); - - public abstract void ended(CancelReason reason, UpnpResponse responseStatus); - - public abstract void eventsMissed(int numberOfMissedEvents); - - @Override - public String toString() { - return "(SID: " + getSubscriptionId() + ") " + getService(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/Connection.java b/app/src/main/java/org/fourthline/cling/model/message/Connection.java deleted file mode 100644 index 6b65582..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/Connection.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message; - -import java.net.InetAddress; - -/** - * An API for the Cling protocol layer to access some transport layer details. - * - * @author Christian Bauer - */ -public interface Connection { - - boolean isOpen(); - - InetAddress getRemoteAddress(); - - InetAddress getLocalAddress(); - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/IncomingDatagramMessage.java b/app/src/main/java/org/fourthline/cling/model/message/IncomingDatagramMessage.java deleted file mode 100644 index f8c8b7d..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/IncomingDatagramMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message; - -import java.net.InetAddress; - -/** - * A received UDP datagram request or response message, with source address and port. - *

- * Additionally, holds a local address that is reachable from the source - * address (in the same subnet): - *

- *
    - *
  • When an M-SEARCH is received, we send a LOCATION header back with a - * reachable (by the remote control point) local address.
  • - *
  • When a NOTIFY discovery message (can be a search response) is received we - need to memorize on which local address it was received, so that the we can - later give the remote device a reachable (from its point of view) local - GENA callback address.
  • - *
- * - * @author Christian Bauer - */ -public class IncomingDatagramMessage extends UpnpMessage { - - private InetAddress sourceAddress; - private int sourcePort; - private InetAddress localAddress; - - public IncomingDatagramMessage(O operation, InetAddress sourceAddress, int sourcePort, InetAddress localAddress) { - super(operation); - this.sourceAddress = sourceAddress; - this.sourcePort = sourcePort; - this.localAddress = localAddress; - } - - protected IncomingDatagramMessage(IncomingDatagramMessage source) { - super(source); - this.sourceAddress = source.getSourceAddress(); - this.sourcePort = source.getSourcePort(); - this.localAddress = source.getLocalAddress(); - } - - public InetAddress getSourceAddress() { - return sourceAddress; - } - - public int getSourcePort() { - return sourcePort; - } - - public InetAddress getLocalAddress() { - return localAddress; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/OutgoingDatagramMessage.java b/app/src/main/java/org/fourthline/cling/model/message/OutgoingDatagramMessage.java deleted file mode 100644 index 28fbf14..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/OutgoingDatagramMessage.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message; - -import java.net.InetAddress; - -/** - * A UDP datagram request or response message for sending, with destination address and port. - * - * @author Christian Bauer - */ -public abstract class OutgoingDatagramMessage extends UpnpMessage { - - private InetAddress destinationAddress; - private int destinationPort; - - protected OutgoingDatagramMessage(O operation, InetAddress destinationAddress, int destinationPort) { - super(operation); - this.destinationAddress = destinationAddress; - this.destinationPort = destinationPort; - } - - protected OutgoingDatagramMessage(O operation, BodyType bodyType, Object body, InetAddress destinationAddress, int destinationPort) { - super(operation, bodyType, body); - this.destinationAddress = destinationAddress; - this.destinationPort = destinationPort; - } - - public InetAddress getDestinationAddress() { - return destinationAddress; - } - - public int getDestinationPort() { - return destinationPort; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/StreamRequestMessage.java b/app/src/main/java/org/fourthline/cling/model/message/StreamRequestMessage.java deleted file mode 100644 index eb2ef5a..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/StreamRequestMessage.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message; - -import java.net.URI; -import java.net.URL; - -/** - * A TCP (HTTP) stream request message. - * - * @author Christian Bauer - */ -public class StreamRequestMessage extends UpnpMessage { - - protected Connection connection; - - public StreamRequestMessage(StreamRequestMessage source) { - super(source); - this.connection = source.getConnection(); - } - - public StreamRequestMessage(UpnpRequest operation) { - super(operation); - } - - public StreamRequestMessage(UpnpRequest.Method method, URI uri) { - super(new UpnpRequest(method, uri)); - } - - public StreamRequestMessage(UpnpRequest.Method method, URL url) { - super(new UpnpRequest(method, url)); - } - - public StreamRequestMessage(UpnpRequest operation, String body) { - super(operation, BodyType.STRING, body); - } - - public StreamRequestMessage(UpnpRequest.Method method, URI uri, String body) { - super(new UpnpRequest(method, uri), BodyType.STRING, body); - } - - public StreamRequestMessage(UpnpRequest.Method method, URL url, String body) { - super(new UpnpRequest(method, url), BodyType.STRING, body); - } - - - public StreamRequestMessage(UpnpRequest operation, byte[] body) { - super(operation, BodyType.BYTES, body); - } - - public StreamRequestMessage(UpnpRequest.Method method, URI uri, byte[] body) { - super(new UpnpRequest(method, uri), BodyType.BYTES, body); - } - - public StreamRequestMessage(UpnpRequest.Method method, URL url, byte[] body) { - super(new UpnpRequest(method, url), BodyType.BYTES, body); - } - - public URI getUri() { - return getOperation().getURI(); - } - - public void setUri(URI uri) { - getOperation().setUri(uri); - } - - public void setConnection(Connection connection) { - this.connection = connection; - } - - public Connection getConnection() { - return connection; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/StreamResponseMessage.java b/app/src/main/java/org/fourthline/cling/model/message/StreamResponseMessage.java deleted file mode 100644 index 2336b3d..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/StreamResponseMessage.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message; - -import org.fourthline.cling.model.message.header.ContentTypeHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.seamless.util.MimeType; - -/** - * A TCP (HTTP) stream response message. - * - * @author Christian Bauer - */ -public class StreamResponseMessage extends UpnpMessage { - - public StreamResponseMessage(StreamResponseMessage source) { - super(source); - } - - public StreamResponseMessage(UpnpResponse.Status status) { - super(new UpnpResponse(status)); - } - - public StreamResponseMessage(UpnpResponse operation) { - super(operation); - } - - - public StreamResponseMessage(UpnpResponse operation, String body) { - super(operation, BodyType.STRING, body); - } - - public StreamResponseMessage(String body) { - super(new UpnpResponse(UpnpResponse.Status.OK),BodyType.STRING, body); - } - - - public StreamResponseMessage(UpnpResponse operation, byte[] body) { - super(operation, BodyType.BYTES, body); - } - - public StreamResponseMessage(byte[] body) { - super(new UpnpResponse(UpnpResponse.Status.OK),BodyType.BYTES, body); - } - - - public StreamResponseMessage(String body, ContentTypeHeader contentType) { - this(body); - getHeaders().add(UpnpHeader.Type.CONTENT_TYPE, contentType); - } - - public StreamResponseMessage(String body, MimeType mimeType) { - this(body, new ContentTypeHeader(mimeType)); - } - - public StreamResponseMessage(byte[] body, ContentTypeHeader contentType) { - this(body); - getHeaders().add(UpnpHeader.Type.CONTENT_TYPE, contentType); - } - - public StreamResponseMessage(byte[] body, MimeType mimeType) { - this(body, new ContentTypeHeader(mimeType)); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/UpnpHeaders.java b/app/src/main/java/org/fourthline/cling/model/message/UpnpHeaders.java deleted file mode 100644 index 6764046..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/UpnpHeaders.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message; - -import org.seamless.http.Headers; -import org.fourthline.cling.model.message.header.UpnpHeader; - -import java.io.ByteArrayInputStream; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Provides UPnP header API in addition to plain multi-map HTTP header access. - * - * @author Christian Bauer - */ -public class UpnpHeaders extends Headers { - - private static final Logger log = Logger.getLogger(UpnpHeaders.class.getName()); - - protected Map> parsedHeaders; - - public UpnpHeaders() { - } - - public UpnpHeaders(Map> headers) { - super(headers); - } - - public UpnpHeaders(ByteArrayInputStream inputStream) { - super(inputStream); - } - - protected void parseHeaders() { - // This runs as late as possible and only when necessary (getter called and map is dirty) - parsedHeaders = new LinkedHashMap(); - if (log.isLoggable(Level.FINE)) - log.fine("Parsing all HTTP headers for known UPnP headers: " + size()); - for (Entry> entry : entrySet()) { - - if (entry.getKey() == null) continue; // Oh yes, the JDK has 'null' HTTP headers - - UpnpHeader.Type type = UpnpHeader.Type.getByHttpName(entry.getKey()); - if (type == null) { - if (log.isLoggable(Level.FINE)) - log.fine("Ignoring non-UPNP HTTP header: " + entry.getKey()); - continue; - } - - for (String value : entry.getValue()) { - UpnpHeader upnpHeader = UpnpHeader.newInstance(type, value); - if (upnpHeader == null || upnpHeader.getValue() == null) { - if (log.isLoggable(Level.FINE)) - log.fine( - "Ignoring known but irrelevant header (value violates the UDA specification?) '" - + type.getHttpName() - + "': " - + value - ); - } else { - addParsedValue(type, upnpHeader); - } - } - } - } - - protected void addParsedValue(UpnpHeader.Type type, UpnpHeader value) { - if (log.isLoggable(Level.FINE)) - log.fine("Adding parsed header: " + value); - List list = parsedHeaders.get(type); - if (list == null) { - list = new LinkedList(); - parsedHeaders.put(type, list); - } - list.add(value); - } - - @Override - public List put(String key, List values) { - parsedHeaders = null; - return super.put(key, values); - } - - @Override - public void add(String key, String value) { - parsedHeaders = null; - super.add(key, value); - } - - @Override - public List remove(Object key) { - parsedHeaders = null; - return super.remove(key); - } - - @Override - public void clear() { - parsedHeaders = null; - super.clear(); - } - - public boolean containsKey(UpnpHeader.Type type) { - if (parsedHeaders == null) parseHeaders(); - return parsedHeaders.containsKey(type); - } - - public List get(UpnpHeader.Type type) { - if (parsedHeaders == null) parseHeaders(); - return parsedHeaders.get(type); - } - - public void add(UpnpHeader.Type type, UpnpHeader value) { - super.add(type.getHttpName(), value.getString()); - if (parsedHeaders != null) - addParsedValue(type, value); - } - - public void remove(UpnpHeader.Type type) { - super.remove(type.getHttpName()); - if (parsedHeaders != null) - parsedHeaders.remove(type); - } - - public UpnpHeader[] getAsArray(UpnpHeader.Type type) { - if (parsedHeaders == null) parseHeaders(); - return parsedHeaders.get(type) != null - ? parsedHeaders.get(type).toArray(new UpnpHeader[parsedHeaders.get(type).size()]) - : new UpnpHeader[0]; - } - - public UpnpHeader getFirstHeader(UpnpHeader.Type type) { - return getAsArray(type).length > 0 - ? getAsArray(type)[0] - : null; - } - - public H getFirstHeader(UpnpHeader.Type type, Class subtype) { - UpnpHeader[] headers = getAsArray(type); - if (headers.length == 0) return null; - - for (UpnpHeader header : headers) { - if (subtype.isAssignableFrom(header.getClass())) { - return (H) header; - } - } - return null; - } - - public String getFirstHeaderString(UpnpHeader.Type type) { - UpnpHeader header = getFirstHeader(type); - return header != null ? header.getString() : null; - } - - public void log() { - if (log.isLoggable(Level.FINE)) { - log.fine("############################ RAW HEADERS ###########################"); - for (Entry> entry : entrySet()) { - log.fine("=== NAME : " + entry.getKey()); - for (String v : entry.getValue()) { - log.fine("VALUE: " + v); - } - } - if (parsedHeaders != null && parsedHeaders.size() > 0) { - log.fine("########################## PARSED HEADERS ##########################"); - for (Map.Entry> entry : parsedHeaders.entrySet()) { - log.fine("=== TYPE: " + entry.getKey()); - for (UpnpHeader upnpHeader : entry.getValue()) { - log.fine("HEADER: " + upnpHeader); - } - } - } - log.fine("####################################################################"); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/UpnpMessage.java b/app/src/main/java/org/fourthline/cling/model/message/UpnpMessage.java deleted file mode 100644 index b647e48..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/UpnpMessage.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message; - -import org.fourthline.cling.model.message.header.ContentTypeHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; - -import java.io.UnsupportedEncodingException; - -/** - * A non-streaming message, the interface between the transport layer and the protocols. - *

- * Defaults to UDA version 1.0 and a string body type. Message content is not streamed, - * it is always read into memory and transported as a string or bytes message body. - *

- *

- * Subtypes of this class typically implement the integrity rules for individual UPnP - * messages, for example, what headers a particular message requires. - *

- *

- * Messages are not thread-safe. - *

- * - * @author Christian Bauer - */ -public abstract class UpnpMessage { - - public static enum BodyType { - STRING, BYTES - } - - private int udaMajorVersion = 1; - private int udaMinorVersion = 0; - - private O operation; - private UpnpHeaders headers = new UpnpHeaders(); - private Object body; - private BodyType bodyType = BodyType.STRING; - - protected UpnpMessage(UpnpMessage source) { - this.operation = source.getOperation(); - this.headers = source.getHeaders(); - this.body = source.getBody(); - this.bodyType = source.getBodyType(); - this.udaMajorVersion = source.getUdaMajorVersion(); - this.udaMinorVersion = source.getUdaMinorVersion(); - } - - protected UpnpMessage(O operation) { - this.operation = operation; - } - - protected UpnpMessage(O operation, BodyType bodyType, Object body) { - this.operation = operation; - this.bodyType = bodyType; - this.body = body; - } - - public int getUdaMajorVersion() { - return udaMajorVersion; - } - - public void setUdaMajorVersion(int udaMajorVersion) { - this.udaMajorVersion = udaMajorVersion; - } - - public int getUdaMinorVersion() { - return udaMinorVersion; - } - - public void setUdaMinorVersion(int udaMinorVersion) { - this.udaMinorVersion = udaMinorVersion; - } - - public UpnpHeaders getHeaders() { - return headers; - } - - public void setHeaders(UpnpHeaders headers) { - this.headers = headers; - } - - public Object getBody() { - return body; - } - - public void setBody(String string) { - this.bodyType = BodyType.STRING; - this.body = string; - } - - public void setBody(BodyType bodyType, Object body) { - this.bodyType = bodyType; - this.body = body; - } - - public void setBodyCharacters(byte[] characterData) throws UnsupportedEncodingException { - setBody( - UpnpMessage.BodyType.STRING, - new String( - characterData, - getContentTypeCharset() != null - ? getContentTypeCharset() - : "UTF-8" - ) - ); - } - - public boolean hasBody() { - return getBody() != null; - } - - public BodyType getBodyType() { - return bodyType; - } - - public void setBodyType(BodyType bodyType) { - this.bodyType = bodyType; - } - - public String getBodyString() { - try { - return !hasBody() ? null : - getBodyType().equals(BodyType.STRING) - ? getBody().toString() - : new String((byte[]) getBody(), "UTF-8" - ); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - public byte[] getBodyBytes() { - try { - return !hasBody() ? null : - getBodyType().equals(BodyType.STRING) - ? ((String) getBody()).getBytes("UTF-8") - : (byte[]) getBody(); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - public O getOperation() { - return operation; - } - - public boolean isContentTypeMissingOrText() { - ContentTypeHeader contentTypeHeader = getContentTypeHeader(); - // This is against the HTTP specification: If there is no content type we MAY assume that - // the entity body is bytes. However, to support broken UPnP devices which also violate the - // UPnP spec and do not send any content type at all, we need to assume no content type - // means a textual entity body is available. - if (contentTypeHeader == null) return true; - if (contentTypeHeader.isText()) return true; - // Only if there was any content-type header and none was text - return false; - } - - public ContentTypeHeader getContentTypeHeader() { - return getHeaders().getFirstHeader(UpnpHeader.Type.CONTENT_TYPE, ContentTypeHeader.class); - } - - public boolean isContentTypeText() { - ContentTypeHeader ct = getContentTypeHeader(); - return ct != null && ct.isText(); - } - - public boolean isContentTypeTextUDA() { - ContentTypeHeader ct = getContentTypeHeader(); - return ct != null && ct.isUDACompliantXML(); - } - - public String getContentTypeCharset() { - ContentTypeHeader ct = getContentTypeHeader(); - return ct != null ? ct.getValue().getParameters().get("charset") : null; - } - - public boolean hasHostHeader() { - return getHeaders().getFirstHeader(UpnpHeader.Type.HOST) != null; - } - - public boolean isBodyNonEmptyString() { - return hasBody() - && getBodyType().equals(UpnpMessage.BodyType.STRING) - && getBodyString().length() > 0; - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") " + getOperation().toString(); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/UpnpOperation.java b/app/src/main/java/org/fourthline/cling/model/message/UpnpOperation.java deleted file mode 100644 index b70f26f..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/UpnpOperation.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message; - -/** - * The operation, or HTTP details, of a message. - * - * @author Christian Bauer - */ -public abstract class UpnpOperation { - - private int httpMinorVersion = 1; - - public int getHttpMinorVersion() { - return httpMinorVersion; - } - - public void setHttpMinorVersion(int httpMinorVersion) { - this.httpMinorVersion = httpMinorVersion; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/UpnpRequest.java b/app/src/main/java/org/fourthline/cling/model/message/UpnpRequest.java deleted file mode 100644 index cc7d78e..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/UpnpRequest.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message; - -import java.net.URI; -import java.net.URL; -import java.net.URISyntaxException; -import java.util.HashMap; -import java.util.Map; -import java.util.Locale; - -/** - * A request message, with a method (GET, POST, NOTIFY, etc). - * - * @author Christian Bauer - */ -public class UpnpRequest extends UpnpOperation { - - public static enum Method { - - GET("GET"), - POST("POST"), - NOTIFY("NOTIFY"), - MSEARCH("M-SEARCH"), - SUBSCRIBE("SUBSCRIBE"), - UNSUBSCRIBE("UNSUBSCRIBE"), - UNKNOWN("UNKNOWN"); - - private static Map byName = new HashMap() {{ - for (Method m : Method.values()) { - put(m.getHttpName(), m); - } - }}; - - private String httpName; - - Method(String httpName) { - this.httpName = httpName; - } - - public String getHttpName() { - return httpName; - } - - public static Method getByHttpName(String httpName) { - if (httpName == null) return UNKNOWN; - Method m = byName.get(httpName.toUpperCase(Locale.ENGLISH)); - return m != null ? m : UNKNOWN; - } - } - - private Method method; - private URI uri; - - public UpnpRequest(Method method) { - this.method = method; - } - - public UpnpRequest(Method method, URI uri) { - this.method = method; - this.uri = uri; - } - - public UpnpRequest(Method method, URL url) { - this.method = method; - try { - if (url != null) { - this.uri = url.toURI(); - } - } catch (URISyntaxException e) { - throw new IllegalArgumentException(e); - } - } - - public Method getMethod() { - return method; - } - - public String getHttpMethodName() { - return method.getHttpName(); - } - - public URI getURI() { - return uri; - } - - public void setUri(URI uri) { - this.uri = uri; - } - - @Override - public String toString() { - return getHttpMethodName() + (getURI() != null ? " " + getURI() : ""); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/UpnpResponse.java b/app/src/main/java/org/fourthline/cling/model/message/UpnpResponse.java deleted file mode 100644 index f5e0a7a..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/UpnpResponse.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message; - -/** - * A response message, with a status code and message (OK, NOT FOUND, etc). - * - * @author Christian Bauer - */ -public class UpnpResponse extends UpnpOperation { - - public static enum Status { - - OK(200, "OK"), - BAD_REQUEST(400, "Bad Request"), - NOT_FOUND(404, "Not Found"), - METHOD_NOT_SUPPORTED(405, "Method Not Supported"), - PRECONDITION_FAILED(412, "Precondition Failed"), - UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"), - INTERNAL_SERVER_ERROR(500, "Internal Server Error"), - NOT_IMPLEMENTED(501, "Not Implemented"); - - private int statusCode; - private String statusMsg; - - Status(int statusCode, String statusMsg) { - this.statusCode = statusCode; - this.statusMsg = statusMsg; - } - - public int getStatusCode() { - return statusCode; - } - - public String getStatusMsg() { - return statusMsg; - } - - static public Status getByStatusCode(int statusCode) { - for (Status status : values()) { - if (status.getStatusCode() == statusCode) - return status; - } - return null; - } - } - - private int statusCode; - private String statusMessage; - - public UpnpResponse(int statusCode, String statusMessage) { - this.statusCode = statusCode; - this.statusMessage = statusMessage; - } - - public UpnpResponse(Status status) { - this.statusCode = status.getStatusCode(); - this.statusMessage = status.getStatusMsg(); - } - - public int getStatusCode() { - return statusCode; - } - - public String getStatusMessage() { - return statusMessage; - } - - /** - * @return true if the status code was equal or creater 300. - */ - public boolean isFailed() { - return statusCode >= 300; - } - - /** - * @return The concatenated string of status code and status message (same as {@link #toString()}. - */ - public String getResponseDetails() { - return getStatusCode() + " " + getStatusMessage(); - } - - @Override - public String toString() { - return getResponseDetails(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/control/ActionMessage.java b/app/src/main/java/org/fourthline/cling/model/message/control/ActionMessage.java deleted file mode 100644 index 25d91c7..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/control/ActionMessage.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.control; - -/** - * A narrowing interface for action request/response messages. - * - * @author Christian Bauer - */ -public interface ActionMessage { - - public String getActionNamespace(); - - public boolean isBodyNonEmptyString(); - public String getBodyString(); - public void setBody(String string); - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/control/ActionRequestMessage.java b/app/src/main/java/org/fourthline/cling/model/message/control/ActionRequestMessage.java deleted file mode 100644 index 81269e0..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/control/ActionRequestMessage.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.control; - - -/** - * @author Christian Bauer - */ -public interface ActionRequestMessage extends ActionMessage { -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/control/ActionResponseMessage.java b/app/src/main/java/org/fourthline/cling/model/message/control/ActionResponseMessage.java deleted file mode 100644 index 96c71f8..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/control/ActionResponseMessage.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.control; - -/** - * @author Christian Bauer - */ -public interface ActionResponseMessage extends ActionMessage { -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/control/IncomingActionRequestMessage.java b/app/src/main/java/org/fourthline/cling/model/message/control/IncomingActionRequestMessage.java deleted file mode 100644 index ac1dcc5..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/control/IncomingActionRequestMessage.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.control; - -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.header.SoapActionHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.Action; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.meta.QueryStateVariableAction; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.model.types.SoapActionType; - -/** - * @author Christian Bauer - */ -public class IncomingActionRequestMessage extends StreamRequestMessage implements ActionRequestMessage { - - final private Action action; - final private String actionNamespace; - - public IncomingActionRequestMessage(StreamRequestMessage source, - LocalService service) throws ActionException { - super(source); - - SoapActionHeader soapActionHeader = getHeaders().getFirstHeader(UpnpHeader.Type.SOAPACTION, SoapActionHeader.class); - if (soapActionHeader == null) { - throw new ActionException(ErrorCode.INVALID_ACTION, "Missing SOAP action header"); - } - - SoapActionType actionType = soapActionHeader.getValue(); - - this.action = service.getAction(actionType.getActionName()); - if (this.action == null) { - throw new ActionException(ErrorCode.INVALID_ACTION, "Service doesn't implement action: " + actionType.getActionName()); - } - - if (!QueryStateVariableAction.ACTION_NAME.equals(actionType.getActionName())) { - if (!service.getServiceType().implementsVersion(actionType.getServiceType())) { - throw new ActionException(ErrorCode.INVALID_ACTION, "Service doesn't support the requested service version"); - } - } - - this.actionNamespace = actionType.getTypeString(); - } - - public Action getAction() { - return action; - } - - public String getActionNamespace() { - return actionNamespace; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/control/IncomingActionResponseMessage.java b/app/src/main/java/org/fourthline/cling/model/message/control/IncomingActionResponseMessage.java deleted file mode 100644 index 087efe0..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/control/IncomingActionResponseMessage.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.control; - -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpResponse; - -/** - * @author Christian Bauer - */ -public class IncomingActionResponseMessage extends StreamResponseMessage implements ActionResponseMessage { - - - public IncomingActionResponseMessage(StreamResponseMessage source) { - super(source); - } - - public IncomingActionResponseMessage(UpnpResponse operation) { - super(operation); - } - - public String getActionNamespace() { - return null; // TODO: We _could_ read this in SOAPActionProcessor and set it when we receive a response but why? - } - - public boolean isFailedNonRecoverable() { - int statusCode = getOperation().getStatusCode(); - return getOperation().isFailed() - && !(statusCode == UpnpResponse.Status.METHOD_NOT_SUPPORTED.getStatusCode() || - (statusCode == UpnpResponse.Status.INTERNAL_SERVER_ERROR.getStatusCode()) && hasBody()); - } - - public boolean isFailedRecoverable() { - return hasBody() && getOperation().getStatusCode() == UpnpResponse.Status.INTERNAL_SERVER_ERROR.getStatusCode(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/control/OutgoingActionRequestMessage.java b/app/src/main/java/org/fourthline/cling/model/message/control/OutgoingActionRequestMessage.java deleted file mode 100644 index 0f6730e..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/control/OutgoingActionRequestMessage.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.control; - -import java.util.logging.Logger; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.action.RemoteActionInvocation; -import org.fourthline.cling.model.meta.Action; -import org.fourthline.cling.model.meta.QueryStateVariableAction; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.header.ContentTypeHeader; -import org.fourthline.cling.model.message.header.SoapActionHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.message.header.UserAgentHeader; -import org.fourthline.cling.model.types.SoapActionType; - -import java.net.URL; - -/** - * @author Christian Bauer - */ -public class OutgoingActionRequestMessage extends StreamRequestMessage implements ActionRequestMessage { - - private static Logger log = Logger.getLogger(OutgoingActionRequestMessage.class.getName()); - - final private String actionNamespace; - - public OutgoingActionRequestMessage(ActionInvocation actionInvocation, URL controlURL) { - this(actionInvocation.getAction(), new UpnpRequest(UpnpRequest.Method.POST, controlURL)); - - // For proxy remote invocations, pass through the user agent header - if (actionInvocation instanceof RemoteActionInvocation) { - RemoteActionInvocation remoteActionInvocation = (RemoteActionInvocation) actionInvocation; - if (remoteActionInvocation.getRemoteClientInfo() != null - && remoteActionInvocation.getRemoteClientInfo().getRequestUserAgent() != null) { - getHeaders().add( - UpnpHeader.Type.USER_AGENT, - new UserAgentHeader(remoteActionInvocation.getRemoteClientInfo().getRequestUserAgent()) - ); - } - } else if (actionInvocation.getClientInfo() != null) { - getHeaders().putAll(actionInvocation.getClientInfo().getRequestHeaders()); - } - } - - public OutgoingActionRequestMessage(Action action, UpnpRequest operation) { - super(operation); - - getHeaders().add( - UpnpHeader.Type.CONTENT_TYPE, - new ContentTypeHeader(ContentTypeHeader.DEFAULT_CONTENT_TYPE_UTF8) - ); - - SoapActionHeader soapActionHeader; - if (action instanceof QueryStateVariableAction) { - log.fine("Adding magic control SOAP action header for state variable query action"); - soapActionHeader = new SoapActionHeader( - new SoapActionType( - SoapActionType.MAGIC_CONTROL_NS, SoapActionType.MAGIC_CONTROL_TYPE, null, action.getName() - ) - ); - } else { - soapActionHeader = new SoapActionHeader( - new SoapActionType( - action.getService().getServiceType(), - action.getName() - ) - ); - } - - // We need to keep it for later, convenience for writing the SOAP body XML - actionNamespace = soapActionHeader.getValue().getTypeString(); - - if (getOperation().getMethod().equals(UpnpRequest.Method.POST)) { - - getHeaders().add(UpnpHeader.Type.SOAPACTION, soapActionHeader); - log.fine("Added SOAP action header: " + soapActionHeader); - - /* TODO: Finish the M-POST crap (or not) - } else if (getOperation().getMethod().equals(UpnpRequest.Method.MPOST)) { - - getHeaders().add(UpnpHeader.Type.MAN, new MANHeader(Constants.SOAP_NS_ENVELOPE, "01")); - - getHeaders().add(UpnpHeader.Type.SOAPACTION, soapActionHeader); - getHeaders().setPrefix(UpnpHeader.Type.SOAPACTION, "01"); - log.fine("Added SOAP action header with prefix '01': " + getHeaders().getFirstHeader(UpnpHeader.Type.SOAPACTION).getString()); - */ - - } else { - throw new IllegalArgumentException("Can't send action with request method: " + getOperation().getMethod()); - } - } - - public String getActionNamespace() { - return actionNamespace; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/control/OutgoingActionResponseMessage.java b/app/src/main/java/org/fourthline/cling/model/message/control/OutgoingActionResponseMessage.java deleted file mode 100644 index dc6eca2..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/control/OutgoingActionResponseMessage.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.control; - -import org.fourthline.cling.model.Constants; -import org.fourthline.cling.model.meta.Action; -import org.fourthline.cling.model.meta.QueryStateVariableAction; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.header.ContentTypeHeader; -import org.fourthline.cling.model.message.header.EXTHeader; -import org.fourthline.cling.model.message.header.ServerHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; - -/** - * @author Christian Bauer - */ -public class OutgoingActionResponseMessage extends StreamResponseMessage implements ActionResponseMessage { - - private String actionNamespace; - - public OutgoingActionResponseMessage(Action action) { - this(UpnpResponse.Status.OK, action); - } - - public OutgoingActionResponseMessage(UpnpResponse.Status status) { - this(status, null); - } - - public OutgoingActionResponseMessage(UpnpResponse.Status status, Action action) { - super(new UpnpResponse(status)); - - if (action != null) { - if (action instanceof QueryStateVariableAction) { - this.actionNamespace = Constants.NS_UPNP_CONTROL_10; - } else { - this.actionNamespace = action.getService().getServiceType().toString(); - } - } - - addHeaders(); - } - - protected void addHeaders() { - getHeaders().add( - UpnpHeader.Type.CONTENT_TYPE, - new ContentTypeHeader(ContentTypeHeader.DEFAULT_CONTENT_TYPE_UTF8) - ); - getHeaders().add( - UpnpHeader.Type.SERVER, - new ServerHeader() - ); - getHeaders().add( - UpnpHeader.Type.EXT, - new EXTHeader() - ); - } - - public String getActionNamespace() { - return actionNamespace; - } - - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingNotificationRequest.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingNotificationRequest.java deleted file mode 100644 index 0ef77c6..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingNotificationRequest.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.header.DeviceUSNHeader; -import org.fourthline.cling.model.message.header.InterfaceMacHeader; -import org.fourthline.cling.model.message.header.LocationHeader; -import org.fourthline.cling.model.message.header.MaxAgeHeader; -import org.fourthline.cling.model.message.header.NTSHeader; -import org.fourthline.cling.model.message.header.ServiceUSNHeader; -import org.fourthline.cling.model.message.header.UDNHeader; -import org.fourthline.cling.model.message.header.USNRootDeviceHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.types.NamedDeviceType; -import org.fourthline.cling.model.types.NamedServiceType; -import org.fourthline.cling.model.types.NotificationSubtype; -import org.fourthline.cling.model.types.UDN; - -import java.net.URL; - -/** - * @author Christian Bauer - */ -public class IncomingNotificationRequest extends IncomingDatagramMessage { - - public IncomingNotificationRequest(IncomingDatagramMessage source) { - super(source); - } - - public boolean isAliveMessage() { - NTSHeader nts = getHeaders().getFirstHeader(UpnpHeader.Type.NTS, NTSHeader.class); - return nts != null && nts.getValue().equals(NotificationSubtype.ALIVE); - } - - public boolean isByeByeMessage() { - NTSHeader nts = getHeaders().getFirstHeader(UpnpHeader.Type.NTS, NTSHeader.class); - return nts != null && nts.getValue().equals(NotificationSubtype.BYEBYE); - } - - public URL getLocationURL() { - LocationHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.LOCATION, LocationHeader.class); - if (header != null) { - return header.getValue(); - } - return null; - } - - /** - * @return The UDN value after parsing various USN header values, or null. - */ - public UDN getUDN() { - // This processes the headers as specified in UDA 1.0, tables in section 1.1.12 - - UpnpHeader udnHeader = getHeaders().getFirstHeader(UpnpHeader.Type.USN, USNRootDeviceHeader.class); - if (udnHeader != null) return udnHeader.getValue(); - - udnHeader = getHeaders().getFirstHeader(UpnpHeader.Type.USN, UDNHeader.class); - if (udnHeader != null) return udnHeader.getValue(); - - UpnpHeader deviceTypeHeader = getHeaders().getFirstHeader(UpnpHeader.Type.USN, DeviceUSNHeader.class); - if (deviceTypeHeader != null) return deviceTypeHeader.getValue().getUdn(); - - UpnpHeader serviceTypeHeader = getHeaders().getFirstHeader(UpnpHeader.Type.USN, ServiceUSNHeader.class); - if (serviceTypeHeader != null) return serviceTypeHeader.getValue().getUdn(); - - return null; - } - - public Integer getMaxAge() { - MaxAgeHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.MAX_AGE, MaxAgeHeader.class); - if (header != null) { - return header.getValue(); - } - return null; - } - - public byte[] getInterfaceMacHeader() { - InterfaceMacHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.EXT_IFACE_MAC, InterfaceMacHeader.class); - if (header != null) { - return header.getValue(); - } - return null; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingSearchRequest.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingSearchRequest.java deleted file mode 100644 index 713d0c8..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingSearchRequest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.header.MANHeader; -import org.fourthline.cling.model.message.header.MXHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.types.NotificationSubtype; - -/** - * @author Christian Bauer - */ -public class IncomingSearchRequest extends IncomingDatagramMessage { - - public IncomingSearchRequest(IncomingDatagramMessage source) { - super(source); - } - - public UpnpHeader getSearchTarget() { - return getHeaders().getFirstHeader(UpnpHeader.Type.ST); - } - - public Integer getMX() { - MXHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.MX, MXHeader.class); - if (header != null) { - return header.getValue(); - } - return null; - } - - /** - * @return true if this message has a MAN with - * value {@link org.fourthline.cling.model.types.NotificationSubtype#DISCOVER}. - */ - public boolean isMANSSDPDiscover() { - MANHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.MAN, MANHeader.class); - return header != null && header.getValue().equals(NotificationSubtype.DISCOVER.getHeaderString()); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingSearchResponse.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingSearchResponse.java deleted file mode 100644 index 39adcae..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/IncomingSearchResponse.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.header.DeviceUSNHeader; -import org.fourthline.cling.model.message.header.InterfaceMacHeader; -import org.fourthline.cling.model.message.header.LocationHeader; -import org.fourthline.cling.model.message.header.MaxAgeHeader; -import org.fourthline.cling.model.message.header.ServiceUSNHeader; -import org.fourthline.cling.model.message.header.UDNHeader; -import org.fourthline.cling.model.message.header.USNRootDeviceHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.types.NamedDeviceType; -import org.fourthline.cling.model.types.NamedServiceType; -import org.fourthline.cling.model.types.UDN; - -import java.net.URL; - -/** - * @author Christian Bauer - */ -public class IncomingSearchResponse extends IncomingDatagramMessage { - - public IncomingSearchResponse(IncomingDatagramMessage source) { - super(source); - } - - public boolean isSearchResponseMessage() { - UpnpHeader st = getHeaders().getFirstHeader(UpnpHeader.Type.ST); - UpnpHeader usn = getHeaders().getFirstHeader(UpnpHeader.Type.USN); - UpnpHeader ext = getHeaders().getFirstHeader(UpnpHeader.Type.EXT); // Has no value! - return st != null && st.getValue() != null && usn != null && usn.getValue() != null && ext != null; - } - - public UDN getRootDeviceUDN() { - // This processes the headers as specified in UDA 1.0, tables in section 1.1.12 - - UpnpHeader udnHeader = getHeaders().getFirstHeader(UpnpHeader.Type.USN, USNRootDeviceHeader.class); - if (udnHeader != null) return udnHeader.getValue(); - - udnHeader = getHeaders().getFirstHeader(UpnpHeader.Type.USN, UDNHeader.class); - if (udnHeader != null) return udnHeader.getValue(); - - UpnpHeader deviceTypeHeader = getHeaders().getFirstHeader(UpnpHeader.Type.USN, DeviceUSNHeader.class); - if (deviceTypeHeader != null) return deviceTypeHeader.getValue().getUdn(); - - UpnpHeader serviceTypeHeader = getHeaders().getFirstHeader(UpnpHeader.Type.USN, ServiceUSNHeader.class); - if (serviceTypeHeader != null) return serviceTypeHeader.getValue().getUdn(); - - return null; - } - - public URL getLocationURL() { - LocationHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.LOCATION, LocationHeader.class); - if (header != null) { - return header.getValue(); - } - return null; - } - - public Integer getMaxAge() { - MaxAgeHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.MAX_AGE, MaxAgeHeader.class); - if (header != null) { - return header.getValue(); - } - return null; - } - - public byte[] getInterfaceMacHeader() { - InterfaceMacHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.EXT_IFACE_MAC, InterfaceMacHeader.class); - if (header != null) { - return header.getValue(); - } - return null; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequest.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequest.java deleted file mode 100644 index 85eb253..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequest.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.Constants; -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.message.header.LocationHeader; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.message.OutgoingDatagramMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.header.HostHeader; -import org.fourthline.cling.model.message.header.NTSHeader; -import org.fourthline.cling.model.message.header.ServerHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.message.header.MaxAgeHeader; -import org.fourthline.cling.model.types.NotificationSubtype; - -/** - * @author Christian Bauer - */ -public abstract class OutgoingNotificationRequest extends OutgoingDatagramMessage { - - private NotificationSubtype type; - - protected OutgoingNotificationRequest(Location location, LocalDevice device, NotificationSubtype type) { - super( - new UpnpRequest(UpnpRequest.Method.NOTIFY), - ModelUtil.getInetAddressByName(Constants.IPV4_UPNP_MULTICAST_GROUP), - Constants.UPNP_MULTICAST_PORT - ); - - this.type = type; - - getHeaders().add(UpnpHeader.Type.MAX_AGE, new MaxAgeHeader(device.getIdentity().getMaxAgeSeconds())); - getHeaders().add(UpnpHeader.Type.LOCATION, new LocationHeader(location.getURL())); - - getHeaders().add(UpnpHeader.Type.SERVER, new ServerHeader()); - getHeaders().add(UpnpHeader.Type.HOST, new HostHeader()); - getHeaders().add(UpnpHeader.Type.NTS, new NTSHeader(type)); - } - - public NotificationSubtype getType() { - return type; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestDeviceType.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestDeviceType.java deleted file mode 100644 index 94f16f6..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestDeviceType.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.types.NotificationSubtype; -import org.fourthline.cling.model.message.header.DeviceTypeHeader; -import org.fourthline.cling.model.message.header.DeviceUSNHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; - -/** - * @author Christian Bauer - */ -public class OutgoingNotificationRequestDeviceType extends OutgoingNotificationRequest { - - public OutgoingNotificationRequestDeviceType(Location location, LocalDevice device, NotificationSubtype type) { - super(location, device, type); - - getHeaders().add(UpnpHeader.Type.NT, new DeviceTypeHeader(device.getType())); - getHeaders().add(UpnpHeader.Type.USN, new DeviceUSNHeader(device.getIdentity().getUdn(), device.getType())); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestRootDevice.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestRootDevice.java deleted file mode 100644 index fbe614f..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestRootDevice.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.message.header.InterfaceMacHeader; -import org.fourthline.cling.model.message.header.RootDeviceHeader; -import org.fourthline.cling.model.message.header.USNRootDeviceHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.types.NotificationSubtype; - -/** - * @author Christian Bauer - */ -public class OutgoingNotificationRequestRootDevice extends OutgoingNotificationRequest { - - public OutgoingNotificationRequestRootDevice(Location location, LocalDevice device, NotificationSubtype type) { - super(location, device, type); - - getHeaders().add(UpnpHeader.Type.NT, new RootDeviceHeader()); - getHeaders().add(UpnpHeader.Type.USN, new USNRootDeviceHeader(device.getIdentity().getUdn())); - - if (location.getNetworkAddress().getHardwareAddress() != null) { - getHeaders().add( - UpnpHeader.Type.EXT_IFACE_MAC, - new InterfaceMacHeader(location.getNetworkAddress().getHardwareAddress()) - ); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestServiceType.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestServiceType.java deleted file mode 100644 index 985c5a4..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestServiceType.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.message.header.ServiceTypeHeader; -import org.fourthline.cling.model.message.header.ServiceUSNHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.types.NotificationSubtype; -import org.fourthline.cling.model.types.ServiceType; - -/** - * @author Christian Bauer - */ -public class OutgoingNotificationRequestServiceType extends OutgoingNotificationRequest { - - public OutgoingNotificationRequestServiceType(Location location, - LocalDevice device, NotificationSubtype type, - ServiceType serviceType) { - - super(location, device, type); - - getHeaders().add(UpnpHeader.Type.NT, new ServiceTypeHeader(serviceType)); - getHeaders().add(UpnpHeader.Type.USN, new ServiceUSNHeader(device.getIdentity().getUdn(), serviceType)); - } - - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestUDN.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestUDN.java deleted file mode 100644 index 2e56278..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingNotificationRequestUDN.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.message.header.UDNHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.types.NotificationSubtype; - -/** - * @author Christian Bauer - */ -public class OutgoingNotificationRequestUDN extends OutgoingNotificationRequest { - - public OutgoingNotificationRequestUDN(Location location, LocalDevice device, NotificationSubtype type) { - super(location, device, type); - - getHeaders().add(UpnpHeader.Type.NT, new UDNHeader(device.getIdentity().getUdn())); - getHeaders().add(UpnpHeader.Type.USN, new UDNHeader(device.getIdentity().getUdn())); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchRequest.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchRequest.java deleted file mode 100644 index 720e0c9..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchRequest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.Constants; -import org.fourthline.cling.model.message.OutgoingDatagramMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.header.HostHeader; -import org.fourthline.cling.model.message.header.MANHeader; -import org.fourthline.cling.model.message.header.MXHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.types.NotificationSubtype; -import org.fourthline.cling.model.ModelUtil; - -/** - * @author Christian Bauer - */ -public class OutgoingSearchRequest extends OutgoingDatagramMessage { - - private UpnpHeader searchTarget; - - public OutgoingSearchRequest(UpnpHeader searchTarget, int mxSeconds) { - super( - new UpnpRequest(UpnpRequest.Method.MSEARCH), - ModelUtil.getInetAddressByName(Constants.IPV4_UPNP_MULTICAST_GROUP), - Constants.UPNP_MULTICAST_PORT - ); - - this.searchTarget = searchTarget; - - getHeaders().add(UpnpHeader.Type.MAN, new MANHeader(NotificationSubtype.DISCOVER.getHeaderString())); - getHeaders().add(UpnpHeader.Type.MX, new MXHeader(mxSeconds)); - getHeaders().add(UpnpHeader.Type.ST, searchTarget); - getHeaders().add(UpnpHeader.Type.HOST, new HostHeader()); - } - - public UpnpHeader getSearchTarget() { - return searchTarget; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponse.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponse.java deleted file mode 100644 index 7b14740..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponse.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.OutgoingDatagramMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.header.EXTHeader; -import org.fourthline.cling.model.message.header.InterfaceMacHeader; -import org.fourthline.cling.model.message.header.LocationHeader; -import org.fourthline.cling.model.message.header.MaxAgeHeader; -import org.fourthline.cling.model.message.header.ServerHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.LocalDevice; - -/** - * @author Christian Bauer - */ -public class OutgoingSearchResponse extends OutgoingDatagramMessage { - - public OutgoingSearchResponse(IncomingDatagramMessage request, - Location location, - LocalDevice device) { - - super(new UpnpResponse(UpnpResponse.Status.OK), request.getSourceAddress(), request.getSourcePort()); - - getHeaders().add(UpnpHeader.Type.MAX_AGE, new MaxAgeHeader(device.getIdentity().getMaxAgeSeconds())); - getHeaders().add(UpnpHeader.Type.LOCATION, new LocationHeader(location.getURL())); - getHeaders().add(UpnpHeader.Type.SERVER, new ServerHeader()); - getHeaders().add(UpnpHeader.Type.EXT, new EXTHeader()); - - if (location.getNetworkAddress().getHardwareAddress() != null) { - getHeaders().add( - UpnpHeader.Type.EXT_IFACE_MAC, - new InterfaceMacHeader(location.getNetworkAddress().getHardwareAddress()) - ); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseDeviceType.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseDeviceType.java deleted file mode 100644 index 4df41be..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseDeviceType.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.header.DeviceTypeHeader; -import org.fourthline.cling.model.message.header.DeviceUSNHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; - -/** - * @author Christian Bauer - */ -public class OutgoingSearchResponseDeviceType extends OutgoingSearchResponse { - - public OutgoingSearchResponseDeviceType(IncomingDatagramMessage request, - Location location, - LocalDevice device) { - super(request, location, device); - - getHeaders().add(UpnpHeader.Type.ST, new DeviceTypeHeader(device.getType())); - getHeaders().add(UpnpHeader.Type.USN, new DeviceUSNHeader(device.getIdentity().getUdn(), device.getType())); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseRootDevice.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseRootDevice.java deleted file mode 100644 index e71fa80..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseRootDevice.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.header.RootDeviceHeader; -import org.fourthline.cling.model.message.header.USNRootDeviceHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.LocalDevice; - -/** - * @author Christian Bauer - */ -public class OutgoingSearchResponseRootDevice extends OutgoingSearchResponse { - - public OutgoingSearchResponseRootDevice(IncomingDatagramMessage request, - Location location, - LocalDevice device) { - super(request, location, device); - - getHeaders().add(UpnpHeader.Type.ST, new RootDeviceHeader()); - getHeaders().add(UpnpHeader.Type.USN, new USNRootDeviceHeader(device.getIdentity().getUdn())); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseServiceType.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseServiceType.java deleted file mode 100644 index 676b4e3..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseServiceType.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.header.ServiceTypeHeader; -import org.fourthline.cling.model.message.header.ServiceUSNHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.types.ServiceType; - -/** - * @author Christian Bauer - */ -public class OutgoingSearchResponseServiceType extends OutgoingSearchResponse { - - public OutgoingSearchResponseServiceType(IncomingDatagramMessage request, - Location location, - LocalDevice device, - ServiceType serviceType) { - super(request, location, device); - - getHeaders().add(UpnpHeader.Type.ST, new ServiceTypeHeader(serviceType)); - getHeaders().add(UpnpHeader.Type.USN, new ServiceUSNHeader(device.getIdentity().getUdn(), serviceType)); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseUDN.java b/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseUDN.java deleted file mode 100644 index 497133a..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/discovery/OutgoingSearchResponseUDN.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.discovery; - -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.header.UDNHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.LocalDevice; - -/** - * @author Christian Bauer - */ -public class OutgoingSearchResponseUDN extends OutgoingSearchResponse { - - public OutgoingSearchResponseUDN(IncomingDatagramMessage request, - Location location, - LocalDevice device) { - super(request, location, device); - - getHeaders().add(UpnpHeader.Type.ST, new UDNHeader(device.getIdentity().getUdn())); - getHeaders().add(UpnpHeader.Type.USN, new UDNHeader(device.getIdentity().getUdn())); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingEventRequestMessage.java b/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingEventRequestMessage.java deleted file mode 100644 index 7371e90..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingEventRequestMessage.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.gena; - -import org.fourthline.cling.model.meta.RemoteService; -import org.fourthline.cling.model.state.StateVariableValue; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.message.header.SubscriptionIdHeader; -import org.fourthline.cling.model.message.header.NTEventHeader; -import org.fourthline.cling.model.message.header.NTSHeader; -import org.fourthline.cling.model.message.header.EventSequenceHeader; -import org.fourthline.cling.model.types.NotificationSubtype; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.util.List; -import java.util.ArrayList; - -/** - * @author Christian Bauer - */ -public class IncomingEventRequestMessage extends StreamRequestMessage { - - final private List stateVariableValues = new ArrayList(); - final private RemoteService service; - - public IncomingEventRequestMessage(StreamRequestMessage source, RemoteService service) { - super(source); - this.service = service; - } - - public RemoteService getService() { - return service; - } - - public List getStateVariableValues() { - return stateVariableValues; - } - - public String getSubscrptionId() { - SubscriptionIdHeader header = - getHeaders().getFirstHeader(UpnpHeader.Type.SID,SubscriptionIdHeader.class); - return header != null ? header.getValue() : null; - } - - public UnsignedIntegerFourBytes getSequence() { - EventSequenceHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.SEQ, EventSequenceHeader.class); - return header != null ? header.getValue() : null; - } - - /** - * @return true if this message as an NT and NTS header. - */ - public boolean hasNotificationHeaders() { - UpnpHeader ntHeader = getHeaders().getFirstHeader(UpnpHeader.Type.NT); - UpnpHeader ntsHeader = getHeaders().getFirstHeader(UpnpHeader.Type.NTS); - return ntHeader != null && ntHeader.getValue() != null - && ntsHeader != null && ntsHeader.getValue() != null; - } - - /** - * @return true if this message has an NT header, and NTS header - * with value {@link org.fourthline.cling.model.types.NotificationSubtype#PROPCHANGE}. - */ - public boolean hasValidNotificationHeaders() { - NTEventHeader ntHeader = getHeaders().getFirstHeader(UpnpHeader.Type.NT, NTEventHeader.class); - NTSHeader ntsHeader = getHeaders().getFirstHeader(UpnpHeader.Type.NTS, NTSHeader.class); - return ntHeader != null && ntHeader.getValue() != null - && ntsHeader != null && ntsHeader.getValue().equals(NotificationSubtype.PROPCHANGE); - - } - - @Override - public String toString() { - return super.toString() + " SEQUENCE: " + getSequence().getValue(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingSubscribeRequestMessage.java b/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingSubscribeRequestMessage.java deleted file mode 100644 index bb2a9f5..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingSubscribeRequestMessage.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.gena; - -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.header.CallbackHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.message.header.NTEventHeader; -import org.fourthline.cling.model.message.header.TimeoutHeader; -import org.fourthline.cling.model.message.header.SubscriptionIdHeader; -import org.fourthline.cling.model.meta.LocalService; - -import java.net.URL; -import java.util.List; - -/** - * @author Christian Bauer - */ -public class IncomingSubscribeRequestMessage extends StreamRequestMessage { - - final private LocalService service; - - public IncomingSubscribeRequestMessage(StreamRequestMessage source, LocalService service) { - super(source); - this.service = service; - } - - public LocalService getService() { - return service; - } - - public List getCallbackURLs() { - CallbackHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.CALLBACK, CallbackHeader.class); - return header != null ? header.getValue() : null; - } - - public boolean hasNotificationHeader() { - return getHeaders().getFirstHeader(UpnpHeader.Type.NT, NTEventHeader.class) != null; - } - - public Integer getRequestedTimeoutSeconds() { - TimeoutHeader timeoutHeader = getHeaders().getFirstHeader(UpnpHeader.Type.TIMEOUT, TimeoutHeader.class); - return timeoutHeader != null ? timeoutHeader.getValue() : null; - } - - public String getSubscriptionId() { - SubscriptionIdHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.SID, SubscriptionIdHeader.class); - return header != null ? header.getValue() : null; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingSubscribeResponseMessage.java b/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingSubscribeResponseMessage.java deleted file mode 100644 index 42f8974..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingSubscribeResponseMessage.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.gena; - -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.header.SubscriptionIdHeader; -import org.fourthline.cling.model.message.header.TimeoutHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; - -/** - * @author Christian Bauer - */ -public class IncomingSubscribeResponseMessage extends StreamResponseMessage { - - public IncomingSubscribeResponseMessage(StreamResponseMessage source) { - super(source); - } - - /** - * @return true if this message has an SID and TIMEOUT header value. - */ - public boolean isValidHeaders() { - return getHeaders().getFirstHeader(UpnpHeader.Type.SID, SubscriptionIdHeader.class) != null && - getHeaders().getFirstHeader(UpnpHeader.Type.TIMEOUT, TimeoutHeader.class) != null; - } - - public String getSubscriptionId() { - return getHeaders().getFirstHeader(UpnpHeader.Type.SID, SubscriptionIdHeader.class).getValue(); - } - - public int getSubscriptionDurationSeconds() { - return getHeaders().getFirstHeader(UpnpHeader.Type.TIMEOUT, TimeoutHeader.class).getValue(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingUnsubscribeRequestMessage.java b/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingUnsubscribeRequestMessage.java deleted file mode 100644 index 7ec94ac..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/gena/IncomingUnsubscribeRequestMessage.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.gena; - -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.header.CallbackHeader; -import org.fourthline.cling.model.message.header.NTEventHeader; -import org.fourthline.cling.model.message.header.SubscriptionIdHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; - -/** - * @author Christian Bauer - */ -public class IncomingUnsubscribeRequestMessage extends StreamRequestMessage { - - final private LocalService service; - - public IncomingUnsubscribeRequestMessage(StreamRequestMessage source, LocalService service) { - super(source); - this.service = service; - } - - public LocalService getService() { - return service; - } - - public boolean hasCallbackHeader() { - return getHeaders().getFirstHeader(UpnpHeader.Type.CALLBACK, CallbackHeader.class) != null; - } - - public boolean hasNotificationHeader() { - return getHeaders().getFirstHeader(UpnpHeader.Type.NT, NTEventHeader.class) != null; - } - - public String getSubscriptionId() { - SubscriptionIdHeader header = getHeaders().getFirstHeader(UpnpHeader.Type.SID, SubscriptionIdHeader.class); - return header != null ? header.getValue() : null; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingEventRequestMessage.java b/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingEventRequestMessage.java deleted file mode 100644 index f4a41ca..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingEventRequestMessage.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.gena; - -import org.fourthline.cling.model.state.StateVariableValue; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.header.ContentTypeHeader; -import org.fourthline.cling.model.message.header.EventSequenceHeader; -import org.fourthline.cling.model.message.header.NTEventHeader; -import org.fourthline.cling.model.message.header.NTSHeader; -import org.fourthline.cling.model.message.header.SubscriptionIdHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.types.NotificationSubtype; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.model.gena.GENASubscription; - -import java.net.URL; -import java.util.Collection; - -/** - * @author Christian Bauer - */ -public class OutgoingEventRequestMessage extends StreamRequestMessage { - - final private Collection stateVariableValues; - - public OutgoingEventRequestMessage(GENASubscription subscription, - URL callbackURL, - UnsignedIntegerFourBytes sequence, - Collection values) { - - super(new UpnpRequest(UpnpRequest.Method.NOTIFY, callbackURL)); - - getHeaders().add(UpnpHeader.Type.CONTENT_TYPE, new ContentTypeHeader()); - getHeaders().add(UpnpHeader.Type.NT, new NTEventHeader()); - getHeaders().add(UpnpHeader.Type.NTS, new NTSHeader(NotificationSubtype.PROPCHANGE)); - getHeaders().add(UpnpHeader.Type.SID, new SubscriptionIdHeader(subscription.getSubscriptionId())); - - // Important! Pass by value so that we can safely increment it afterwards and before this is send! - getHeaders().add(UpnpHeader.Type.SEQ, new EventSequenceHeader(sequence.getValue())); - - this.stateVariableValues = values; - } - - public OutgoingEventRequestMessage(GENASubscription subscription, URL callbackURL) { - this(subscription, callbackURL, subscription.getCurrentSequence(), subscription.getCurrentValues().values()); - } - - public Collection getStateVariableValues() { - return stateVariableValues; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingEventResponseMessage.java b/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingEventResponseMessage.java deleted file mode 100644 index eaa7baf..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingEventResponseMessage.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.gena; - -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpResponse; - -/** - * @author Christian Bauer - */ -public class OutgoingEventResponseMessage extends StreamResponseMessage { - - public OutgoingEventResponseMessage() { - super(new UpnpResponse(UpnpResponse.Status.OK)); - } - - public OutgoingEventResponseMessage(UpnpResponse operation) { - super(operation); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingRenewalRequestMessage.java b/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingRenewalRequestMessage.java deleted file mode 100644 index d8ecf02..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingRenewalRequestMessage.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.gena; - -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.header.SubscriptionIdHeader; -import org.fourthline.cling.model.message.header.TimeoutHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; - -/** - * @author Christian Bauer - */ -public class OutgoingRenewalRequestMessage extends StreamRequestMessage { - - public OutgoingRenewalRequestMessage(RemoteGENASubscription subscription, - UpnpHeaders extraHeaders) { - - super(UpnpRequest.Method.SUBSCRIBE, subscription.getEventSubscriptionURL()); - - getHeaders().add( - UpnpHeader.Type.SID, - new SubscriptionIdHeader(subscription.getSubscriptionId()) - ); - - getHeaders().add( - UpnpHeader.Type.TIMEOUT, - new TimeoutHeader(subscription.getRequestedDurationSeconds()) - ); - - if (extraHeaders != null) - getHeaders().putAll(extraHeaders); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingSubscribeRequestMessage.java b/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingSubscribeRequestMessage.java deleted file mode 100644 index 1105e07..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingSubscribeRequestMessage.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.gena; - -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.header.CallbackHeader; -import org.fourthline.cling.model.message.header.NTEventHeader; -import org.fourthline.cling.model.message.header.TimeoutHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; - -import java.net.URL; -import java.util.List; - -/** - * @author Christian Bauer - */ -public class OutgoingSubscribeRequestMessage extends StreamRequestMessage { - - public OutgoingSubscribeRequestMessage(RemoteGENASubscription subscription, - List callbackURLs, - UpnpHeaders extraHeaders) { - - super(UpnpRequest.Method.SUBSCRIBE, subscription.getEventSubscriptionURL()); - - getHeaders().add( - UpnpHeader.Type.CALLBACK, - new CallbackHeader(callbackURLs) - ); - - getHeaders().add( - UpnpHeader.Type.NT, - new NTEventHeader() - ); - - getHeaders().add( - UpnpHeader.Type.TIMEOUT, - new TimeoutHeader(subscription.getRequestedDurationSeconds()) - ); - - if (extraHeaders != null) - getHeaders().putAll(extraHeaders); - } - - public boolean hasCallbackURLs() { - CallbackHeader callbackHeader = - getHeaders().getFirstHeader(UpnpHeader.Type.CALLBACK, CallbackHeader.class); - return callbackHeader.getValue().size() > 0; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingSubscribeResponseMessage.java b/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingSubscribeResponseMessage.java deleted file mode 100644 index 65291fc..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingSubscribeResponseMessage.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.gena; - -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.header.ServerHeader; -import org.fourthline.cling.model.message.header.SubscriptionIdHeader; -import org.fourthline.cling.model.message.header.TimeoutHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.gena.LocalGENASubscription; - -/** - * @author Christian Bauer - */ -public class OutgoingSubscribeResponseMessage extends StreamResponseMessage { - - - public OutgoingSubscribeResponseMessage(UpnpResponse.Status status) { - super(status); - } - - public OutgoingSubscribeResponseMessage(LocalGENASubscription subscription) { - super(new UpnpResponse(UpnpResponse.Status.OK)); - - getHeaders().add(UpnpHeader.Type.SERVER,new ServerHeader()); - getHeaders().add(UpnpHeader.Type.SID, new SubscriptionIdHeader(subscription.getSubscriptionId())); - getHeaders().add(UpnpHeader.Type.TIMEOUT, new TimeoutHeader(subscription.getActualDurationSeconds())); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingUnsubscribeRequestMessage.java b/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingUnsubscribeRequestMessage.java deleted file mode 100644 index 4c73e21..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/gena/OutgoingUnsubscribeRequestMessage.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.gena; - -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.header.SubscriptionIdHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; - -/** - * @author Christian Bauer - */ -public class OutgoingUnsubscribeRequestMessage extends StreamRequestMessage { - - public OutgoingUnsubscribeRequestMessage(RemoteGENASubscription subscription, - UpnpHeaders extraHeaders) { - - super(UpnpRequest.Method.UNSUBSCRIBE, subscription.getEventSubscriptionURL()); - - getHeaders().add( - UpnpHeader.Type.SID, - new SubscriptionIdHeader(subscription.getSubscriptionId()) - ); - - if (extraHeaders != null) - getHeaders().putAll(extraHeaders); - - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/AVClientInfoHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/AVClientInfoHeader.java deleted file mode 100644 index a1dc85b..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/AVClientInfoHeader.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -/** - * A simple string, not validated, used only by Sony Playstation3. - * - * @author Christian Bauer - */ -public class AVClientInfoHeader extends UpnpHeader { - - public AVClientInfoHeader() { - } - - public AVClientInfoHeader(String s) { - setValue(s); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - setValue(s); - } - - @Override - public String getString() { - return getValue(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/CallbackHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/CallbackHeader.java deleted file mode 100644 index 9083150..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/CallbackHeader.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author Christian Bauer - */ -public class CallbackHeader extends UpnpHeader> { - - final private static Logger log = Logger.getLogger(CallbackHeader.class.getName()); - - public CallbackHeader() { - setValue(new ArrayList()); - } - - public CallbackHeader(List urls) { - this(); - getValue().addAll(urls); - } - - public CallbackHeader(URL url) { - this(); - getValue().add(url); - } - - public void setString(String s) throws InvalidHeaderException { - - if (s.length() == 0) { - // Well, no callback URLs are not useful but we have to consider this state - return; - } - - if (!s.contains("<") || !s.contains(">")) { - throw new InvalidHeaderException("URLs not in brackets: " + s); - } - - s = s.replaceAll("<", ""); - String[] split = s.split(">"); - try { - List urls = new ArrayList(); - for (String sp : split) { - sp = sp.trim(); - - if (!sp.startsWith("http://")) { - log.warning("Discarding non-http callback URL: " + sp); - continue; - } - - URL url = new URL(sp); - try { - /* - On some platforms (Android...), a valid URL might not be a valid URI, so - we need to test for this and skip any invalid URI, e.g. - - Java.net.URISyntaxException: Invalid % sequence: %wl in authority at index 32: http://[fe80::208:caff:fec4:824e%wlan0]:8485/eventSub - at libcore.net.UriCodec.validate(UriCodec.java:58) - at java.net.URI.parseURI(URI.java:394) - at java.net.URI.(URI.java:204) - at java.net.URL.toURI(URL.java:497) - */ - url.toURI(); - } catch (URISyntaxException ex) { - log.log(Level.WARNING, "Discarding callback URL, not a valid URI on this platform: " + url, ex); - continue; - } - - urls.add(url); - } - setValue(urls); - } catch (MalformedURLException ex) { - throw new InvalidHeaderException("Can't parse callback URLs from '" + s + "': " + ex); - } - } - - public String getString() { - StringBuilder s = new StringBuilder(); - for (URL url : getValue()) { - s.append("<").append(url.toString()).append(">"); - } - return s.toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/ContentRangeHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/ContentRangeHeader.java deleted file mode 100644 index 2bd38d8..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/ContentRangeHeader.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.BytesRange; -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * - * @author Christian Bauer - * @author Mario Franco - */ -public class ContentRangeHeader extends UpnpHeader { - - public static final String PREFIX = "bytes "; - - public ContentRangeHeader() { - } - - public ContentRangeHeader(BytesRange value) { - setValue(value); - } - - public ContentRangeHeader(String s) { - setString(s); - } - - public void setString(String s) throws InvalidHeaderException { - try { - setValue(BytesRange.valueOf(s,PREFIX)); - } catch (InvalidValueException invalidValueException) { - throw new InvalidHeaderException("Invalid Range Header: " + invalidValueException.getMessage()); - } - } - - public String getString() { - return getValue().getString(true,PREFIX); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/ContentTypeHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/ContentTypeHeader.java deleted file mode 100644 index 132e977..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/ContentTypeHeader.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.seamless.util.MimeType; - -/** - * @author Christian Bauer - */ -public class ContentTypeHeader extends UpnpHeader { - - public static final MimeType DEFAULT_CONTENT_TYPE = MimeType.valueOf("text/xml"); - public static final MimeType DEFAULT_CONTENT_TYPE_UTF8 = MimeType.valueOf("text/xml;charset=\"utf-8\""); - - public ContentTypeHeader() { - setValue(DEFAULT_CONTENT_TYPE); - } - - public ContentTypeHeader(MimeType contentType) { - setValue(contentType); - } - - public ContentTypeHeader(String s) throws InvalidHeaderException{ - setString(s); - } - - public void setString(String s) throws InvalidHeaderException { - setValue(MimeType.valueOf(s)); - } - - public String getString() { - return getValue().toString(); - } - - public boolean isUDACompliantXML() { - // UDA spec says "must be text/xml", however, sometimes you get a charset token as well... - return isText() && getValue().getSubtype().equals(DEFAULT_CONTENT_TYPE.getSubtype()); - } - - public boolean isText() { - return getValue() != null && getValue().getType().equals(DEFAULT_CONTENT_TYPE.getType()); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/DeviceTypeHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/DeviceTypeHeader.java deleted file mode 100644 index 260dd29..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/DeviceTypeHeader.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.DeviceType; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class DeviceTypeHeader extends UpnpHeader { - - public DeviceTypeHeader() { - } - - public DeviceTypeHeader(URI uri) { - setString(uri.toString()); - } - - public DeviceTypeHeader(DeviceType value) { - setValue(value); - } - - public void setString(String s) throws InvalidHeaderException { - try { - setValue(DeviceType.valueOf(s)); - } catch (RuntimeException ex) { - throw new InvalidHeaderException("Invalid device type header value, " + ex.getMessage()); - } - } - - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/DeviceUSNHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/DeviceUSNHeader.java deleted file mode 100644 index fc61167..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/DeviceUSNHeader.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.DeviceType; -import org.fourthline.cling.model.types.NamedDeviceType; -import org.fourthline.cling.model.types.UDN; - -/** - * @author Christian Bauer - */ -public class DeviceUSNHeader extends UpnpHeader { - - public DeviceUSNHeader() { - } - - public DeviceUSNHeader(UDN udn, DeviceType deviceType) { - setValue(new NamedDeviceType(udn, deviceType)); - } - - public DeviceUSNHeader(NamedDeviceType value) { - setValue(value); - } - - public void setString(String s) throws InvalidHeaderException { - try { - setValue(NamedDeviceType.valueOf(s)); - } catch (Exception ex) { - throw new InvalidHeaderException("Invalid device USN header value, " + ex.getMessage()); - } - } - - public String getString() { - return getValue().toString(); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/EXTHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/EXTHeader.java deleted file mode 100644 index d7fda79..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/EXTHeader.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -/** - * @author Christian Bauer - */ -public class EXTHeader extends UpnpHeader { - - // That's just an empty header! Isn't that great... - public final static String DEFAULT_VALUE = ""; - - public EXTHeader() { - setValue(DEFAULT_VALUE); - } - - public void setString(String s) throws InvalidHeaderException { - if (s != null && s.length() > 0) { - throw new InvalidHeaderException("Invalid EXT header, it has no value: " + s); - } - } - - public String getString() { - return getValue(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/EventSequenceHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/EventSequenceHeader.java deleted file mode 100644 index 3a48e0f..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/EventSequenceHeader.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -/** - * @author Christian Bauer - */ -public class EventSequenceHeader extends UpnpHeader { - - public EventSequenceHeader() { - } - - public EventSequenceHeader(long value) { - setValue(new UnsignedIntegerFourBytes(value)); - } - - public void setString(String s) throws InvalidHeaderException { - - // Cut off leading zeros - if (!"0".equals(s)) { - while(s.startsWith("0")) { - s = s.substring(1); - } - } - - try { - setValue(new UnsignedIntegerFourBytes(s)); - } catch (NumberFormatException ex) { - throw new InvalidHeaderException("Invalid event sequence, " + ex.getMessage()); - } - - } - - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/HostHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/HostHeader.java deleted file mode 100644 index 1ca56f3..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/HostHeader.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.Constants; -import org.fourthline.cling.model.types.HostPort; - -/** - * @author Christian Bauer - */ -public class HostHeader extends UpnpHeader { - - int port = Constants.UPNP_MULTICAST_PORT; - String group = Constants.IPV4_UPNP_MULTICAST_GROUP; - - public HostHeader() { - setValue(new HostPort(group, port)); - } - - public HostHeader(int port) { - setValue(new HostPort(group, port)); - } - - public HostHeader(String host, int port) { - setValue(new HostPort(host, port)); - } - - public void setString(String s) throws InvalidHeaderException { - // UDA 1.1/1.0 section 1.2.2 - if (s.contains(":")) { - // We have a port in the header, so we have to use that instead of the UDA default - try { - this.port = Integer.valueOf(s.substring(s.indexOf(":")+1)); - this.group = s.substring(0, s.indexOf(":")); - setValue(new HostPort(group, port)); - } catch (NumberFormatException ex) { - throw new InvalidHeaderException("Invalid HOST header value, can't parse port: " + s + " - " + ex.getMessage()); - } - } else { - this.group = s; - setValue(new HostPort(group, port)); - } - } - - public String getString() { - return getValue().toString(); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/InterfaceMacHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/InterfaceMacHeader.java deleted file mode 100644 index 31db036..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/InterfaceMacHeader.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.seamless.util.io.HexBin; - -/** - * Custom header for Cling, used to transfer the MAC ethernet address for Wake-on-LAN. - * - * @author Christian Bauer - */ -public class InterfaceMacHeader extends UpnpHeader { - - public InterfaceMacHeader() { - } - - public InterfaceMacHeader(byte[] value) { - setValue(value); - } - - public InterfaceMacHeader(String s) { - setString(s); - } - - public void setString(String s) throws InvalidHeaderException { - byte[] bytes = HexBin.stringToBytes(s, ":"); - setValue(bytes); - if (bytes.length != 6) { - throw new InvalidHeaderException("Invalid MAC address: " + s); - } - } - - public String getString() { - return HexBin.bytesToString(getValue(), ":"); - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") '" + getString() + "'"; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/InvalidHeaderException.java b/app/src/main/java/org/fourthline/cling/model/message/header/InvalidHeaderException.java deleted file mode 100644 index 50a9258..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/InvalidHeaderException.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -/** - * Thrown if the value of a header was invalid for the given header. - * - * @author Christian Bauer - */ -public class InvalidHeaderException extends RuntimeException { - - public InvalidHeaderException(String s) { - super(s); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/LocationHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/LocationHeader.java deleted file mode 100644 index a85df18..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/LocationHeader.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import java.net.MalformedURLException; -import java.net.URL; - -/** - * TODO: UDA 1.1 says it should be RfC 3986 compatible. - * - *

See http://blog.jclark.com/2008/11/what-allowed-in-uri.html

- * - * @author Christian Bauer - */ -public class LocationHeader extends UpnpHeader { - - public LocationHeader() { - } - - public LocationHeader(URL value) { - setValue(value); - } - - public LocationHeader(String s) { - setString(s); - } - - public void setString(String s) throws InvalidHeaderException { - try { - URL url = new URL(s); - setValue(url); - } catch (MalformedURLException ex) { - throw new InvalidHeaderException("Invalid URI: " + ex.getMessage()); - } - } - - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/MANHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/MANHeader.java deleted file mode 100644 index e5f3634..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/MANHeader.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -/** - * @author Christian Bauer - */ -public class MANHeader extends UpnpHeader { - - public static final Pattern PATTERN = Pattern.compile("\"(.+?)\"(;.+?)??"); - public static final Pattern NAMESPACE_PATTERN = Pattern.compile(";\\s?ns\\s?=\\s?([0-9]{2})"); - - public String namespace; - - public MANHeader() { - } - - public MANHeader(String value) { - setValue(value); - } - - public MANHeader(String value, String namespace) { - this(value); - this.namespace = namespace; - } - - public void setString(String s) throws InvalidHeaderException { - - Matcher matcher = PATTERN.matcher(s); - if (matcher.matches()) { - setValue(matcher.group(1)); - - if (matcher.group(2) != null) { - Matcher nsMatcher = NAMESPACE_PATTERN.matcher(matcher.group(2)); - if (nsMatcher.matches()) { - setNamespace(nsMatcher.group(1)); - } else { - throw new InvalidHeaderException("Invalid namespace in MAN header value: " + s); - } - } - - } else { - throw new InvalidHeaderException("Invalid MAN header value: " + s); - } - } - - public String getString() { - if (getValue() == null) return null; - StringBuilder s = new StringBuilder(); - s.append("\"").append(getValue()).append("\""); - if (getNamespace() != null) s.append("; ns=").append(getNamespace()); - return s.toString(); - } - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/MXHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/MXHeader.java deleted file mode 100644 index c103b35..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/MXHeader.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -/** - * @author Christian Bauer - */ -public class MXHeader extends UpnpHeader { - - // 3 second seems like a good default to spread search responses (UDA says 120?!? wtf) - public static final Integer DEFAULT_VALUE = 3; - - /** - * Defaults to 3 seconds. - */ - public MXHeader() { - setValue(DEFAULT_VALUE); - } - - public MXHeader(Integer delayInSeconds) { - setValue(delayInSeconds); - } - - public void setString(String s) throws InvalidHeaderException { - Integer value; - try { - value = Integer.parseInt(s); - } catch (Exception ex) { - throw new InvalidHeaderException("Can't parse MX seconds integer from: " + s); - } - - // UDA 1.0, section 1.2.3: "If the MX header specifies a value greater than 120, the device - // should assume that it contained the value 120 or less." - if (value < 0 || value > 120) { - setValue(DEFAULT_VALUE); - } else { - setValue(value); - } - } - - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/MaxAgeHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/MaxAgeHeader.java deleted file mode 100644 index 441eb85..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/MaxAgeHeader.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.Constants; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.Locale; - -/** - * @author Christian Bauer - */ -public class MaxAgeHeader extends UpnpHeader { - - // UDA 1.1 expands on the rules in UDA 1.0 and clearly says that anything but max-age has to be ignored - public static final Pattern MAX_AGE_REGEX = Pattern.compile(".*max-age\\s*=\\s*([0-9]+).*"); - - public MaxAgeHeader(Integer maxAge) { - setValue(maxAge); - } - - public MaxAgeHeader() { - setValue(Constants.MIN_ADVERTISEMENT_AGE_SECONDS); - } - - public void setString(String s) throws InvalidHeaderException { - - Matcher matcher = MAX_AGE_REGEX.matcher(s.toLowerCase(Locale.ENGLISH)); - if (!matcher.matches()){ - throw new InvalidHeaderException("Invalid cache-control value, can't parse max-age seconds: " + s); - } - - Integer maxAge = Integer.parseInt(matcher.group(1)); - setValue(maxAge); - } - - public String getString() { - return "max-age="+getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/NTEventHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/NTEventHeader.java deleted file mode 100644 index 2edd80a..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/NTEventHeader.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import java.util.Locale; - -/** - * @author Christian Bauer - */ -public class NTEventHeader extends UpnpHeader { - - public NTEventHeader() { - setValue("upnp:event"); - } - - public void setString(String s) throws InvalidHeaderException { - if (!s.toLowerCase(Locale.ENGLISH).equals(getValue())) { - throw new InvalidHeaderException("Invalid event NT header value: " + s); - } - } - - public String getString() { - return getValue(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/NTSHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/NTSHeader.java deleted file mode 100644 index 4166fc3..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/NTSHeader.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.NotificationSubtype; - -/** - * @author Christian Bauer - */ -public class NTSHeader extends UpnpHeader { - - public NTSHeader() { - } - - public NTSHeader(NotificationSubtype type) { - setValue(type); - } - - public void setString(String s) throws InvalidHeaderException { - for (NotificationSubtype type : NotificationSubtype.values()) { - if (s.equals(type.getHeaderString())) { - setValue(type); - break; - } - } - if (getValue() == null) { - throw new InvalidHeaderException("Invalid NTS header value: " + s); - } - - } - - public String getString() { - return getValue().getHeaderString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/PragmaHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/PragmaHeader.java deleted file mode 100644 index 22afe5e..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/PragmaHeader.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.model.types.PragmaType; - -/** - * - * @author Christian Bauer - * @author Mario Franco - */ -public class PragmaHeader extends UpnpHeader { - - public PragmaHeader() { - } - - public PragmaHeader(PragmaType value) { - setValue(value); - } - - public PragmaHeader(String s) { - setString(s); - } - - public void setString(String s) throws InvalidHeaderException { - try { - setValue(PragmaType.valueOf(s)); - } catch (InvalidValueException invalidValueException) { - throw new InvalidHeaderException("Invalid Range Header: " + invalidValueException.getMessage()); - } - } - - public String getString() { - return getValue().getString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/RangeHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/RangeHeader.java deleted file mode 100644 index bcfac7b..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/RangeHeader.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.BytesRange; -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * - * @author Christian Bauer - * @author Mario Franco - */ -public class RangeHeader extends UpnpHeader { - - public RangeHeader() { - } - - public RangeHeader(BytesRange value) { - setValue(value); - } - - public RangeHeader(String s) { - setString(s); - } - - public void setString(String s) throws InvalidHeaderException { - try { - setValue(BytesRange.valueOf(s)); - } catch (InvalidValueException invalidValueException) { - throw new InvalidHeaderException("Invalid Range Header: " + invalidValueException.getMessage()); - } - } - - public String getString() { - return getValue().getString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/RootDeviceHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/RootDeviceHeader.java deleted file mode 100644 index 09f8bea..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/RootDeviceHeader.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import java.util.Locale; - -/** - * @author Christian Bauer - */ -public class RootDeviceHeader extends UpnpHeader { - - public RootDeviceHeader() { - setValue("upnp:rootdevice"); - } - - public void setString(String s) throws InvalidHeaderException { - if (!s.toLowerCase(Locale.ENGLISH).equals(getValue())) { - throw new InvalidHeaderException("Invalid root device NT header value: " + s); - } - } - - public String getString() { - return getValue(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/STAllHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/STAllHeader.java deleted file mode 100644 index 25037a7..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/STAllHeader.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.NotificationSubtype; - -/** - * @author Christian Bauer - */ -public class STAllHeader extends UpnpHeader { - - public STAllHeader() { - setValue(NotificationSubtype.ALL); - } - - public void setString(String s) throws InvalidHeaderException { - if (!s.equals(NotificationSubtype.ALL.getHeaderString())) { - throw new InvalidHeaderException("Invalid ST header value (not "+NotificationSubtype.ALL+"): " + s); - } - } - - public String getString() { - return getValue().getHeaderString(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/ServerHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/ServerHeader.java deleted file mode 100644 index 95455b0..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/ServerHeader.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.ServerClientTokens; - -/** - * @author Christian Bauer - */ -public class ServerHeader extends UpnpHeader { - - public ServerHeader() { - setValue(new ServerClientTokens()); - } - - public ServerHeader(ServerClientTokens tokens) { - setValue(tokens); - } - - public void setString(String s) throws InvalidHeaderException { - // TODO: This parsing is not as robust as I'd like, probably should use regexs instead - - // UDA 1.1/1.0 section 1.2.2 and RfC 2616, section 14.38 - // OSNAME/OSVERSION UPnP/1.x PRODUCTNAME/PRODUCTVERSION - ServerClientTokens serverClientTokens = new ServerClientTokens(); - - // They are all UNKNOWN at this point - serverClientTokens.setOsName(ServerClientTokens.UNKNOWN_PLACEHOLDER); - serverClientTokens.setOsVersion(ServerClientTokens.UNKNOWN_PLACEHOLDER); - serverClientTokens.setProductName(ServerClientTokens.UNKNOWN_PLACEHOLDER); - serverClientTokens.setProductVersion(ServerClientTokens.UNKNOWN_PLACEHOLDER); - - // We definitely need a UPnP product token - if (s.contains("UPnP/1.1")) { - serverClientTokens.setMinorVersion(1); - } else if (!s.contains("UPnP/1.")) { - throw new InvalidHeaderException("Missing 'UPnP/1.' in server information: " + s); - } - - // We might be lucky and the vendor has implemented other tokens correctly. so let's at least try - try { - - int numberOfSpaces = 0; - for( int i = 0; i < s.length(); i++ ) { - if( s.charAt(i) == ' ' ) numberOfSpaces++; - } - - String[] osNameVersion; - String[] productNameVersion; - - if (s.contains(",")) { - - // Some guys think that the tokens are separated with commas, not whitespace (read section 3.8 of the HTTP spec!) - String[] productTokens = s.split(","); - osNameVersion = productTokens[0].split("/"); - productNameVersion = productTokens[2].split("/"); - - } else if (numberOfSpaces > 2) { - - // Some guys think that whitespace in token names is OK... it's not ... but let's try... - String beforeUpnpToken = s.substring(0, s.indexOf("UPnP/1.")).trim(); - String afterUpnpToken = s.substring(s.indexOf("UPnP/1.")+8).trim(); // Assumes minor version is 0-9! - osNameVersion = beforeUpnpToken.split("/"); - productNameVersion = afterUpnpToken.split("/"); - - } else { - - // Finally, how it is supposed to be, according to UPnP UDA 1.1 (not 1.0 and not HTTP spec!) - String[] productTokens = s.split(" "); - osNameVersion = productTokens[0].split("/"); - productNameVersion = productTokens[2].split("/"); - } - - - serverClientTokens.setOsName(osNameVersion[0].trim()); - if (osNameVersion.length > 1) { - serverClientTokens.setOsVersion(osNameVersion[1].trim()); - } - serverClientTokens.setProductName(productNameVersion[0].trim()); - if (productNameVersion.length > 1) { - serverClientTokens.setProductVersion(productNameVersion[1].trim()); - } - - } catch (Exception ex) { - - // If something goes wrong, go back to defaults - serverClientTokens.setOsName(ServerClientTokens.UNKNOWN_PLACEHOLDER); - serverClientTokens.setOsVersion(ServerClientTokens.UNKNOWN_PLACEHOLDER); - serverClientTokens.setProductName(ServerClientTokens.UNKNOWN_PLACEHOLDER); - serverClientTokens.setProductVersion(ServerClientTokens.UNKNOWN_PLACEHOLDER); - - - /* These are the rules: - - Many HTTP/1.1 header field values consist of words separated by LWS or special characters. These special - characters MUST be in a quoted string to be used within a parameter value (as defined in section 3.6). - - token = 1* - separators = "(" | ")" | "<" | ">" | "@" - | "," | ";" | ":" | "\" | <"> - | "/" | "[" | "]" | "?" | "=" - | "{" | "}" | SP | HT - */ - } - - setValue(serverClientTokens); - } - - public String getString() { - return getValue().getHttpToken(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/ServiceTypeHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/ServiceTypeHeader.java deleted file mode 100644 index d3ef3de..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/ServiceTypeHeader.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.ServiceType; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class ServiceTypeHeader extends UpnpHeader { - - public ServiceTypeHeader() { - } - - public ServiceTypeHeader(URI uri) { - setString(uri.toString()); - } - - public ServiceTypeHeader(ServiceType value) { - setValue(value); - } - - public void setString(String s) throws InvalidHeaderException { - try { - setValue(ServiceType.valueOf(s)); - } catch (RuntimeException ex) { - throw new InvalidHeaderException("Invalid service type header value, " + ex.getMessage()); - } - } - - public String getString() { - return getValue().toString(); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/ServiceUSNHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/ServiceUSNHeader.java deleted file mode 100644 index aae21c3..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/ServiceUSNHeader.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.NamedServiceType; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDN; - -/** - * @author Christian Bauer - */ -public class ServiceUSNHeader extends UpnpHeader { - - public ServiceUSNHeader() { - } - - public ServiceUSNHeader(UDN udn, ServiceType serviceType) { - setValue(new NamedServiceType(udn, serviceType)); - } - - public ServiceUSNHeader(NamedServiceType value) { - setValue(value); - } - - public void setString(String s) throws InvalidHeaderException { - try { - setValue(NamedServiceType.valueOf(s)); - } catch (Exception ex) { - throw new InvalidHeaderException("Invalid service USN header value, " + ex.getMessage()); - } - } - - public String getString() { - return getValue().toString(); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/SoapActionHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/SoapActionHeader.java deleted file mode 100644 index edf6ccc..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/SoapActionHeader.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.SoapActionType; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class SoapActionHeader extends UpnpHeader { - - public SoapActionHeader() { - } - - public SoapActionHeader(URI uri) { - setValue(SoapActionType.valueOf(uri.toString())); - } - - public SoapActionHeader(SoapActionType value) { - setValue(value); - } - - public SoapActionHeader(String s) throws InvalidHeaderException { - setString(s); - } - - public void setString(String s) throws InvalidHeaderException { - try { - if (!s.startsWith("\"") && s.endsWith("\"")) { - throw new InvalidHeaderException("Invalid SOAP action header, must be enclosed in doublequotes:" + s); - } - - SoapActionType t = SoapActionType.valueOf(s.substring(1, s.length()-1)); - setValue(t); - } catch (RuntimeException ex) { - throw new InvalidHeaderException("Invalid SOAP action header value, " + ex.getMessage()); - } - } - - public String getString() { - return "\"" + getValue().toString() + "\""; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/SubscriptionIdHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/SubscriptionIdHeader.java deleted file mode 100644 index 0d3fae8..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/SubscriptionIdHeader.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -/** - * @author Christian Bauer - */ -public class SubscriptionIdHeader extends UpnpHeader { - - public static final String PREFIX = "uuid:"; - - public SubscriptionIdHeader() { - } - - public SubscriptionIdHeader(String value) { - setValue(value); - } - - public void setString(String s) throws InvalidHeaderException { - if (!s.startsWith(PREFIX)) { - throw new InvalidHeaderException("Invalid subscription ID header value, must start with '"+PREFIX+"': " + s); - } - setValue(s); - } - - public String getString() { - return getValue(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/TimeoutHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/TimeoutHeader.java deleted file mode 100644 index cd92c76..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/TimeoutHeader.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.UserConstants; - -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -/** - * @author Christian Bauer - */ -public class TimeoutHeader extends UpnpHeader { - - // It's probably OK to assume that "infinite" means 4000 years? - public static final Integer INFINITE_VALUE = Integer.MAX_VALUE; - - public static final Pattern PATTERN = Pattern.compile("Second-(?:([0-9]+)|infinite)"); - - /** - * Defaults to {@link org.fourthline.cling.model.UserConstants#DEFAULT_SUBSCRIPTION_DURATION_SECONDS}. - */ - public TimeoutHeader() { - setValue(UserConstants.DEFAULT_SUBSCRIPTION_DURATION_SECONDS); - } - - public TimeoutHeader(int timeoutSeconds) { - setValue(timeoutSeconds); - } - - public TimeoutHeader(Integer timeoutSeconds) { - setValue(timeoutSeconds); - } - - public void setString(String s) throws InvalidHeaderException { - - Matcher matcher = PATTERN.matcher(s); - if (!matcher.matches()) { - throw new InvalidHeaderException("Can't parse timeout seconds integer from: " + s); - } - - if (matcher.group(1) != null) { - setValue(Integer.parseInt(matcher.group(1))); - } else { - setValue(INFINITE_VALUE); - } - - } - - public String getString() { - return "Second-" + (getValue().equals(INFINITE_VALUE) ? "infinite" : getValue()); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/UDADeviceTypeHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/UDADeviceTypeHeader.java deleted file mode 100644 index 8b5265e..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/UDADeviceTypeHeader.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.DeviceType; -import org.fourthline.cling.model.types.UDADeviceType; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class UDADeviceTypeHeader extends DeviceTypeHeader { - - public UDADeviceTypeHeader() { - } - - public UDADeviceTypeHeader(URI uri) { - super(uri); - } - - public UDADeviceTypeHeader(DeviceType value) { - super(value); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - try { - setValue(UDADeviceType.valueOf(s)); - } catch (Exception ex) { - throw new InvalidHeaderException("Invalid UDA device type header value, " + ex.getMessage()); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/UDAServiceTypeHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/UDAServiceTypeHeader.java deleted file mode 100644 index 6c1967a..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/UDAServiceTypeHeader.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.UDAServiceType; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class UDAServiceTypeHeader extends ServiceTypeHeader { - - public UDAServiceTypeHeader() { - } - - public UDAServiceTypeHeader(URI uri) { - super(uri); - } - - public UDAServiceTypeHeader(UDAServiceType value) { - super(value); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - try { - setValue(UDAServiceType.valueOf(s)); - } catch (Exception ex) { - throw new InvalidHeaderException("Invalid UDA service type header value, " + ex.getMessage()); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/UDNHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/UDNHeader.java deleted file mode 100644 index 42bced5..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/UDNHeader.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.UDN; - -/** - * @author Christian Bauer - */ -public class UDNHeader extends UpnpHeader { - - public UDNHeader() { - } - - public UDNHeader(UDN udn) { - setValue(udn); - } - - public void setString(String s) throws InvalidHeaderException { - if (!s.startsWith(UDN.PREFIX)) { - throw new InvalidHeaderException("Invalid UDA header value, must start with '"+UDN.PREFIX+"': " + s); - } - - if (s.contains("::urn")) { - throw new InvalidHeaderException("Invalid UDA header value, must not contain '::urn': " + s); - } - - UDN udn = new UDN( s.substring(UDN.PREFIX.length()) ); - setValue(udn); - } - - public String getString() { - return getValue().toString(); - } -} - diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/USNRootDeviceHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/USNRootDeviceHeader.java deleted file mode 100644 index 94abc95..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/USNRootDeviceHeader.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.fourthline.cling.model.types.UDN; - -/** - * @author Christian Bauer - */ -public class USNRootDeviceHeader extends UpnpHeader { - - public static final String ROOT_DEVICE_SUFFIX = "::upnp:rootdevice"; - - public USNRootDeviceHeader() { - } - - public USNRootDeviceHeader(UDN udn) { - setValue(udn); - } - - public void setString(String s) throws InvalidHeaderException { - if (!s.startsWith(UDN.PREFIX) || !s.endsWith(ROOT_DEVICE_SUFFIX)) { - throw new InvalidHeaderException( - "Invalid root device USN header value, must start with '" + - UDN.PREFIX + "' and end with '" + - ROOT_DEVICE_SUFFIX + "' but is '" + s + "'" - ); - } - UDN udn = new UDN(s.substring(UDN.PREFIX.length(), s.length() - ROOT_DEVICE_SUFFIX.length())); - setValue(udn); - } - - public String getString() { - return getValue().toString() + ROOT_DEVICE_SUFFIX; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/UpnpHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/UpnpHeader.java deleted file mode 100644 index fad492e..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/UpnpHeader.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -import org.seamless.util.Exceptions; - -import java.util.HashMap; -import java.util.Map; -import java.util.Locale; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Transforms known and standardized UPnP/HTTP headers from/to string representation. - *

- * The {@link #newInstance(org.fourthline.cling.model.message.header.UpnpHeader.Type, String)} method - * attempts to instantiate the best header subtype for a given header (name) and string value. - *

- * - * @author Christian Bauer - */ -public abstract class UpnpHeader { - - final private static Logger log = Logger.getLogger(UpnpHeader.class.getName()); - - /** - * Maps a standardized UPnP header to potential header subtypes. - */ - public static enum Type { - - USN("USN", - USNRootDeviceHeader.class, - DeviceUSNHeader.class, - ServiceUSNHeader.class, - UDNHeader.class - ), - NT("NT", - RootDeviceHeader.class, - UDADeviceTypeHeader.class, - UDAServiceTypeHeader.class, - DeviceTypeHeader.class, - ServiceTypeHeader.class, - UDNHeader.class, - NTEventHeader.class - ), - NTS("NTS", NTSHeader.class), - HOST("HOST", HostHeader.class), - SERVER("SERVER", ServerHeader.class), - LOCATION("LOCATION", LocationHeader.class), - MAX_AGE("CACHE-CONTROL", MaxAgeHeader.class), - USER_AGENT("USER-AGENT", UserAgentHeader.class), - CONTENT_TYPE("CONTENT-TYPE", ContentTypeHeader.class), - MAN("MAN", MANHeader.class), - MX("MX", MXHeader.class), - ST("ST", - STAllHeader.class, - RootDeviceHeader.class, - UDADeviceTypeHeader.class, - UDAServiceTypeHeader.class, - DeviceTypeHeader.class, - ServiceTypeHeader.class, - UDNHeader.class - ), - EXT("EXT", EXTHeader.class), - SOAPACTION("SOAPACTION", SoapActionHeader.class), - TIMEOUT("TIMEOUT", TimeoutHeader.class), - CALLBACK("CALLBACK", CallbackHeader.class), - SID("SID", SubscriptionIdHeader.class), - SEQ("SEQ", EventSequenceHeader.class), - RANGE("RANGE", RangeHeader.class), - CONTENT_RANGE("CONTENT-RANGE", ContentRangeHeader.class), - PRAGMA("PRAGMA", PragmaHeader.class), - - EXT_IFACE_MAC("X-CLING-IFACE-MAC", InterfaceMacHeader.class), - EXT_AV_CLIENT_INFO("X-AV-CLIENT-INFO", AVClientInfoHeader.class); - - private static Map byName = new HashMap() {{ - for (Type t : Type.values()) { - put(t.getHttpName(), t); - } - }}; - - private String httpName; - private Class[] headerTypes; - - private Type(String httpName, Class... headerClass) { - this.httpName = httpName; - this.headerTypes = headerClass; - } - - public String getHttpName() { - return httpName; - } - - public Class[] getHeaderTypes() { - return headerTypes; - } - - public boolean isValidHeaderType(Class clazz) { - for (Class permissibleType : getHeaderTypes()) { - if (permissibleType.isAssignableFrom(clazz)) { - return true; - } - } - return false; - } - - /** - * @param httpName A case-insensitive HTTP header name. - */ - public static Type getByHttpName(String httpName) { - if (httpName == null) return null; - return byName.get(httpName.toUpperCase(Locale.ENGLISH)); - } - } - - private T value; - - public void setValue(T value) { - this.value = value; - } - - public T getValue() { - return value; - } - - /** - * @param s This header's value as a string representation. - * @throws InvalidHeaderException If the value is invalid for this UPnP header. - */ - public abstract void setString(String s) throws InvalidHeaderException; - - /** - * @return A string representing this header's value. - */ - public abstract String getString(); - - /** - * Create a new instance of a {@link UpnpHeader} subtype that matches the given type and value. - *

- * This method iterates through all potential header subtype classes as declared in {@link Type}. - * It creates a new instance of the subtype class and calls its {@link #setString(String)} method. - * If no {@link org.fourthline.cling.model.message.header.InvalidHeaderException} is thrown, the subtype - * instance is returned. - *

- * - * @param type The type (or name) of the header. - * @param headerValue The value of the header. - * @return The best matching header subtype instance, or null if no subtype can be found. - */ - public static UpnpHeader newInstance(UpnpHeader.Type type, String headerValue) { - - // Try all the UPnP headers and see if one matches our value parsers - UpnpHeader upnpHeader = null; - for (int i = 0; i < type.getHeaderTypes().length && upnpHeader == null; i++) { - Class headerClass = type.getHeaderTypes()[i]; - try { - log.finest("Trying to parse '" + type + "' with class: " + headerClass.getSimpleName()); - upnpHeader = headerClass.newInstance(); - if (headerValue != null) { - upnpHeader.setString(headerValue); - } - } catch (InvalidHeaderException ex) { - log.finest("Invalid header value for tested type: " + headerClass.getSimpleName() + " - " + ex.getMessage()); - upnpHeader = null; - } catch (Exception ex) { - log.severe("Error instantiating header of type '" + type + "' with value: " + headerValue); - log.log(Level.SEVERE, "Exception root cause: ", Exceptions.unwrap(ex)); - } - - } - return upnpHeader; - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") '" + getValue() + "'"; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/message/header/UserAgentHeader.java b/app/src/main/java/org/fourthline/cling/model/message/header/UserAgentHeader.java deleted file mode 100644 index 4295797..0000000 --- a/app/src/main/java/org/fourthline/cling/model/message/header/UserAgentHeader.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.message.header; - -/** - * A simple string, not validated (everyone gets this wrong) - * - * @author Christian Bauer - * @author Michael Pujos - */ -public class UserAgentHeader extends UpnpHeader { - - public UserAgentHeader() { - } - - public UserAgentHeader(String s) { - setValue(s); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - setValue(s); - } - - @Override - public String getString() { - return getValue(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/Action.java b/app/src/main/java/org/fourthline/cling/model/meta/Action.java deleted file mode 100644 index ff23b6f..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/Action.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.Validatable; -import org.fourthline.cling.model.ValidationError; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -/** - * Describes an action and its input/output arguments. - * - * @author Christian Bauer - */ -public class Action implements Validatable { - - final private static Logger log = Logger.getLogger(Action.class.getName()); - - final private String name; - final private ActionArgument[] arguments; - final private ActionArgument[] inputArguments; - final private ActionArgument[] outputArguments; - - // Package mutable state - private S service; - - public Action(String name, ActionArgument[] arguments) { - this.name = name; - if (arguments != null) { - - List inputList= new ArrayList(); - List outputList = new ArrayList(); - - for (ActionArgument argument : arguments) { - argument.setAction(this); - if (argument.getDirection().equals(ActionArgument.Direction.IN)) - inputList.add(argument); - if (argument.getDirection().equals(ActionArgument.Direction.OUT)) - outputList.add(argument); - } - - this.arguments = arguments; - this.inputArguments = inputList.toArray(new ActionArgument[inputList.size()]); - this.outputArguments = outputList.toArray(new ActionArgument[outputList.size()]); - } else { - this.arguments = new ActionArgument[0]; - this.inputArguments = new ActionArgument[0]; - this.outputArguments = new ActionArgument[0]; - } - } - - public String getName() { - return name; - } - - public boolean hasArguments() { - return getArguments() != null && getArguments().length > 0; - } - - public ActionArgument[] getArguments() { - return arguments; - } - - public S getService() { - return service; - } - - void setService(S service) { - if (this.service != null) - throw new IllegalStateException("Final value has been set already, model is immutable"); - this.service = service; - } - - public ActionArgument getFirstInputArgument() { - if (!hasInputArguments()) throw new IllegalStateException("No input arguments: " + this); - return getInputArguments()[0]; - } - - public ActionArgument getFirstOutputArgument() { - if (!hasOutputArguments()) throw new IllegalStateException("No output arguments: " + this); - return getOutputArguments()[0]; - } - - public ActionArgument[] getInputArguments() { - return inputArguments; - } - - public ActionArgument getInputArgument(String name) { - for (ActionArgument arg : getInputArguments()) { - if (arg.isNameOrAlias(name)) return arg; - } - return null; - } - - public ActionArgument[] getOutputArguments() { - return outputArguments; - } - - public ActionArgument getOutputArgument(String name) { - for (ActionArgument arg : getOutputArguments()) { - if (arg.getName().equals(name)) return arg; - } - return null; - } - - public boolean hasInputArguments() { - return getInputArguments() != null && getInputArguments().length > 0; - } - - public boolean hasOutputArguments() { - return getOutputArguments() != null && getOutputArguments().length > 0; - } - - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + - ", Arguments: " + (getArguments() != null ? getArguments().length : "NO ARGS") + - ") " + getName(); - } - - public List validate() { - List errors = new ArrayList(); - - if (getName() == null || getName().length() == 0) { - errors.add(new ValidationError( - getClass(), - "name", - "Action without name of: " + getService() - )); - } else if (!ModelUtil.isValidUDAName(getName())) { - log.warning("UPnP specification violation of: " + getService().getDevice()); - log.warning("Invalid action name: " + this); - } - - for (ActionArgument actionArgument : getArguments()) { - // Check argument relatedStateVariable in service state table - - if (getService().getStateVariable(actionArgument.getRelatedStateVariableName()) == null) { - errors.add(new ValidationError( - getClass(), - "arguments", - "Action argument references an unknown state variable: " + actionArgument.getRelatedStateVariableName() - )); - } - } - - ActionArgument retValueArgument = null; - int retValueArgumentIndex = 0; - int i = 0; - for (ActionArgument actionArgument : getArguments()) { - // Check retval - if (actionArgument.isReturnValue()) { - if (retValueArgument != null) { - log.warning("UPnP specification violation of: " + getService().getDevice()); - log.warning("Only one argument of action '" + getName() + "' can be "); - } - retValueArgument = actionArgument; - retValueArgumentIndex = i; - } - i++; - } - if (retValueArgument != null) { - for (int j = 0; j < retValueArgumentIndex; j++) { - ActionArgument a = getArguments()[j]; - if (a.getDirection() == ActionArgument.Direction.OUT) { - log.warning("UPnP specification violation of: " + getService().getDevice()); - log.warning("Argument '" + retValueArgument.getName() + "' of action '" + getName() + "' is but not the first OUT argument"); - } - } - } - - for (ActionArgument argument : arguments) { - errors.addAll(argument.validate()); - } - - return errors; - } - - public Action deepCopy() { - ActionArgument[] actionArgumentsDupe = new ActionArgument[getArguments().length]; - for (int i = 0; i < getArguments().length; i++) { - ActionArgument arg = getArguments()[i]; - actionArgumentsDupe[i] = arg.deepCopy(); - } - - return new Action( - getName(), - actionArgumentsDupe - ); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/ActionArgument.java b/app/src/main/java/org/fourthline/cling/model/meta/ActionArgument.java deleted file mode 100644 index 9496613..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/ActionArgument.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.Validatable; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.ModelUtil; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -/** - * Describes a single action argument, either input or output. - *

- * No, I haven't figured out so far what the "return value" thingy is good for. - *

- * - * @author Christian Bauer - */ -public class ActionArgument implements Validatable { - - final private static Logger log = Logger.getLogger(ActionArgument.class.getName()); - - public enum Direction { - IN, OUT - } - - final private String name; - final private String[] aliases; - final private String relatedStateVariableName; - final private Direction direction; - final private boolean returnValue; // TODO: What is this stuff good for anyway? - - // Package mutable state - private Action action; - - public ActionArgument(String name, String relatedStateVariableName, Direction direction) { - this(name, new String[0], relatedStateVariableName, direction, false); - } - - public ActionArgument(String name, String[] aliases, String relatedStateVariableName, Direction direction) { - this(name, aliases, relatedStateVariableName, direction, false); - } - - public ActionArgument(String name, String relatedStateVariableName, Direction direction, boolean returnValue) { - this(name, new String[0], relatedStateVariableName, direction, returnValue); - } - - public ActionArgument(String name, String[] aliases, String relatedStateVariableName, Direction direction, boolean returnValue) { - this.name = name; - this.aliases = aliases; - this.relatedStateVariableName = relatedStateVariableName; - this.direction = direction; - this.returnValue = returnValue; - } - - public String getName() { - return name; - } - - public String[] getAliases() { - return aliases; - } - - public boolean isNameOrAlias(String name) { - if (getName().equalsIgnoreCase(name)) return true; - for (String alias : aliases) { - if (alias.equalsIgnoreCase(name)) return true; - } - return false; - } - - public String getRelatedStateVariableName() { - return relatedStateVariableName; - } - - public Direction getDirection() { - return direction; - } - - public boolean isReturnValue() { - return returnValue; - } - - public Action getAction() { - return action; - } - - void setAction(Action action) { - if (this.action != null) - throw new IllegalStateException("Final value has been set already, model is immutable"); - this.action = action; - } - - public Datatype getDatatype() { - return getAction().getService().getDatatype(this); - } - - public List validate() { - List errors = new ArrayList(); - - if (getName() == null || getName().length() == 0) { - errors.add(new ValidationError( - getClass(), - "name", - "Argument without name of: " + getAction() - )); - } else if (!ModelUtil.isValidUDAName(getName())) { - log.warning("UPnP specification violation of: " + getAction().getService().getDevice()); - log.warning("Invalid argument name: " + this); - } else if (getName().length() > 32) { - log.warning("UPnP specification violation of: " + getAction().getService().getDevice()); - log.warning("Argument name should be less than 32 characters: " + this); - } - - if (getDirection() == null) { - errors.add(new ValidationError( - getClass(), - "direction", - "Argument '"+getName()+"' requires a direction, either IN or OUT" - )); - } - - if (isReturnValue() && getDirection() != ActionArgument.Direction.OUT) { - errors.add(new ValidationError( - getClass(), - "direction", - "Return value argument '" + getName() + "' must be direction OUT" - )); - } - - return errors; - } - - public ActionArgument deepCopy() { - return new ActionArgument( - getName(), - getAliases(), - getRelatedStateVariableName(), - getDirection(), - isReturnValue() - ); - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ", " + getDirection() + ") " + getName(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/Device.java b/app/src/main/java/org/fourthline/cling/model/meta/Device.java deleted file mode 100644 index abd31f8..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/Device.java +++ /dev/null @@ -1,446 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.Namespace; -import org.fourthline.cling.model.profile.RemoteClientInfo; -import org.fourthline.cling.model.resource.Resource; -import org.fourthline.cling.model.Validatable; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.types.DeviceType; -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDN; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Describes either a root or embedded device. - * - * @author Christian Bauer - */ -public abstract class Device implements Validatable { - - final private static Logger log = Logger.getLogger(Device.class.getName()); - - final private DI identity; - - final private UDAVersion version; - final private DeviceType type; - final private DeviceDetails details; - final private Icon[] icons; - final protected S[] services; - final protected D[] embeddedDevices; - - // Package mutable state - private D parentDevice; - - public Device(DI identity) throws ValidationException { - this(identity, null, null, null, null, null); - } - - public Device(DI identity, DeviceType type, DeviceDetails details, - Icon[] icons, S[] services) throws ValidationException { - this(identity, null, type, details, icons, services, null); - } - - public Device(DI identity, DeviceType type, DeviceDetails details, - Icon[] icons, S[] services, D[] embeddedDevices) throws ValidationException { - this(identity, null, type, details, icons, services, embeddedDevices); - } - - public Device(DI identity, UDAVersion version, DeviceType type, DeviceDetails details, - Icon[] icons, S[] services, D[] embeddedDevices) throws ValidationException { - - this.identity = identity; - this.version = version == null ? new UDAVersion() : version; - this.type = type; - this.details = details; - - // We don't fail device validation if icons were invalid, only log a warning. To - // comply with mutability rules (can't set icons field in validate() method), we - // validate the icons here before we set the field value - List validIcons = new ArrayList(); - if (icons != null) { - for (Icon icon : icons) { - if (icon != null) { - icon.setDevice(this); // Set before validate()! - List iconErrors = icon.validate(); - if(iconErrors.isEmpty()) { - validIcons.add(icon); - } else { - log.warning("Discarding invalid '" + icon + "': " + iconErrors); - } - } - } - } - this.icons = validIcons.toArray(new Icon[validIcons.size()]); - - boolean allNullServices = true; - if (services != null) { - for (S service : services) { - if (service != null) { - allNullServices = false; - service.setDevice(this); - } - } - } - this.services = services == null || allNullServices ? null : services; - - boolean allNullEmbedded = true; - if (embeddedDevices != null) { - for (D embeddedDevice : embeddedDevices) { - if (embeddedDevice != null) { - allNullEmbedded = false; - embeddedDevice.setParentDevice(this); - } - } - } - this.embeddedDevices = embeddedDevices == null || allNullEmbedded ? null : embeddedDevices; - - List errors = validate(); - if (errors.size() > 0) { - if (log.isLoggable(Level.FINEST)) { - for (ValidationError error : errors) { - log.finest(error.toString()); - } - } - throw new ValidationException("Validation of device graph failed, call getErrors() on exception", errors); - } - } - - public DI getIdentity() { - return identity; - } - - public UDAVersion getVersion() { - return version; - } - - public DeviceType getType() { - return type; - } - - public DeviceDetails getDetails() { - return details; - } - - public DeviceDetails getDetails(RemoteClientInfo info) { - return this.getDetails(); - } - - public Icon[] getIcons() { - return icons; - } - - public boolean hasIcons() { - return getIcons() != null && getIcons().length > 0; - } - - public boolean hasServices() { - return getServices() != null && getServices().length > 0; - } - - - public boolean hasEmbeddedDevices() { - return getEmbeddedDevices() != null && getEmbeddedDevices().length > 0; - } - - public D getParentDevice() { - return parentDevice; - } - - void setParentDevice(D parentDevice) { - if (this.parentDevice != null) - throw new IllegalStateException("Final value has been set already, model is immutable"); - this.parentDevice = parentDevice; - } - - public boolean isRoot() { - return getParentDevice() == null; - } - - public abstract S[] getServices(); - - public abstract D[] getEmbeddedDevices(); - - public abstract D getRoot(); - - public abstract D findDevice(UDN udn); - - public D[] findEmbeddedDevices() { - return toDeviceArray(findEmbeddedDevices((D) this)); - } - - public D[] findDevices(DeviceType deviceType) { - return toDeviceArray(find(deviceType, (D) this)); - } - - public D[] findDevices(ServiceType serviceType) { - return toDeviceArray(find(serviceType, (D) this)); - } - - public Icon[] findIcons() { - List icons = new ArrayList(); - if (hasIcons()) { - icons.addAll(Arrays.asList(getIcons())); - } - D[] embeddedDevices = findEmbeddedDevices(); - for (D embeddedDevice : embeddedDevices) { - if (embeddedDevice.hasIcons()) { - icons.addAll(Arrays.asList(embeddedDevice.getIcons())); - } - } - return icons.toArray(new Icon[icons.size()]); - } - - public S[] findServices() { - return toServiceArray(findServices(null, null, (D) this)); - } - - public S[] findServices(ServiceType serviceType) { - return toServiceArray(findServices(serviceType, null, (D) this)); - } - - protected D find(UDN udn, D current) { - if (current.getIdentity().getUdn().equals(udn)) return current; - if (current.hasEmbeddedDevices()) { - for (D embeddedDevice : (D[]) current.getEmbeddedDevices()) { - D match; - if ((match = find(udn, embeddedDevice)) != null) return match; - } - } - return null; - } - - protected Collection findEmbeddedDevices(D current) { - Collection devices = new HashSet(); - if (!current.isRoot()) { - devices.add(current); - } - if (current.hasEmbeddedDevices()) { - for (D embeddedDevice : (D[]) current.getEmbeddedDevices()) { - devices.addAll(findEmbeddedDevices(embeddedDevice)); - } - } - return devices; - } - - protected Collection find(DeviceType deviceType, D current) { - Collection devices = new HashSet(); - // Type might be null if we just discovered the device and it hasn't yet been hydrated - if (current.getType() != null && current.getType().implementsVersion(deviceType)) { - devices.add(current); - } - if (current.hasEmbeddedDevices()) { - for (D embeddedDevice : (D[]) current.getEmbeddedDevices()) { - devices.addAll(find(deviceType, embeddedDevice)); - } - } - return devices; - } - - protected Collection find(ServiceType serviceType, D current) { - Collection services = findServices(serviceType, null, current); - Collection devices = new HashSet(); - for (Service service : services) { - devices.add((D) service.getDevice()); - } - return devices; - } - - protected Collection findServices(ServiceType serviceType, ServiceId serviceId, D current) { - Collection services = new HashSet(); - if (current.hasServices()) { - for (Service service : current.getServices()) { - if (isMatch(service, serviceType, serviceId)) - services.add(service); - } - } - Collection embeddedDevices = findEmbeddedDevices(current); - if (embeddedDevices != null) { - for (D embeddedDevice : embeddedDevices) { - if (embeddedDevice.hasServices()) { - for (Service service : embeddedDevice.getServices()) { - if (isMatch(service, serviceType, serviceId)) - services.add(service); - } - } - } - } - return services; - } - - public S findService(ServiceId serviceId) { - Collection services = findServices(null, serviceId, (D) this); - return services.size() == 1 ? services.iterator().next() : null; - } - - public S findService(ServiceType serviceType) { - Collection services = findServices(serviceType, null, (D) this); - return services.size() > 0 ? services.iterator().next() : null; - } - - public ServiceType[] findServiceTypes() { - Collection services = findServices(null, null, (D) this); - Collection col = new HashSet(); - for (S service : services) { - col.add(service.getServiceType()); - } - return col.toArray(new ServiceType[col.size()]); - } - - private boolean isMatch(Service s, ServiceType serviceType, ServiceId serviceId) { - boolean matchesType = serviceType == null || s.getServiceType().implementsVersion(serviceType); - boolean matchesId = serviceId == null || s.getServiceId().equals(serviceId); - return matchesType && matchesId; - } - - public boolean isFullyHydrated() { - S[] services = findServices(); - for (S service : services) { - if (service.hasStateVariables()) return true; - } - return false; - } - - public String getDisplayString() { - - // The goal is to have a clean string with " " - - String cleanModelName = null; - String cleanModelNumber = null; - - if (getDetails() != null && getDetails().getModelDetails() != null) { - - // Some vendors end the model name with the model number, let's remove that - ModelDetails modelDetails = getDetails().getModelDetails(); - if (modelDetails.getModelName() != null) { - cleanModelName = modelDetails.getModelNumber() != null && modelDetails.getModelName().endsWith(modelDetails.getModelNumber()) - ? modelDetails.getModelName().substring(0, modelDetails.getModelName().length() - modelDetails.getModelNumber().length()) - : modelDetails.getModelName(); - } - - // Some vendors repeat the model name as the model number, no good - if (cleanModelName != null) { - cleanModelNumber = modelDetails.getModelNumber() != null && !cleanModelName.startsWith(modelDetails.getModelNumber()) - ? modelDetails.getModelNumber() - : ""; - } else { - cleanModelNumber = modelDetails.getModelNumber(); - } - } - - StringBuilder sb = new StringBuilder(); - - if (getDetails() != null && getDetails().getManufacturerDetails() != null) { - - // Some vendors repeat the manufacturer in model name, let's remove that too - if (cleanModelName != null && getDetails().getManufacturerDetails().getManufacturer() != null) { - cleanModelName = cleanModelName.startsWith(getDetails().getManufacturerDetails().getManufacturer()) - ? cleanModelName.substring(getDetails().getManufacturerDetails().getManufacturer().length()).trim() - : cleanModelName.trim(); - } - - if (getDetails().getManufacturerDetails().getManufacturer() != null) { - sb.append(getDetails().getManufacturerDetails().getManufacturer()); - } - } - - sb.append((cleanModelName != null && cleanModelName.length() > 0 ? " " + cleanModelName : "")); - sb.append((cleanModelNumber != null && cleanModelNumber.length() > 0 ? " " + cleanModelNumber.trim() : "")); - return sb.toString(); - } - - public List validate() { - List errors = new ArrayList(); - - if (getType() != null) { - - // Only validate the graph if we have a device type - that means we validate only if there - // actually is a fully hydrated graph, not just a discovered device of which we haven't even - // retrieved the descriptor yet. This assumes that the descriptor will ALWAYS contain a device - // type. Now that is a risky assumption... - - errors.addAll(getVersion().validate()); - - if (getDetails() != null) { - errors.addAll(getDetails().validate()); - } - - if (hasServices()) { - for (Service service : getServices()) { - if (service != null) - errors.addAll(service.validate()); - } - } - - if (hasEmbeddedDevices()) { - for (Device embeddedDevice : getEmbeddedDevices()) { - if (embeddedDevice != null) - errors.addAll(embeddedDevice.validate()); - } - } - } - - return errors; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Device device = (Device) o; - - if (!identity.equals(device.identity)) return false; - - return true; - } - - @Override - public int hashCode() { - return identity.hashCode(); - } - - public abstract D newInstance(UDN udn, UDAVersion version, DeviceType type, DeviceDetails details, - Icon[] icons, S[] services, List embeddedDevices) throws ValidationException; - - public abstract S newInstance(ServiceType serviceType, ServiceId serviceId, - URI descriptorURI, URI controlURI, URI eventSubscriptionURI, - Action[] actions, StateVariable[] stateVariables) throws ValidationException; - - public abstract D[] toDeviceArray(Collection col); - - public abstract S[] newServiceArray(int size); - - public abstract S[] toServiceArray(Collection col); - - public abstract Resource[] discoverResources(Namespace namespace); - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") Identity: " + getIdentity().toString() + ", Root: " + isRoot(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/DeviceDetails.java b/app/src/main/java/org/fourthline/cling/model/meta/DeviceDetails.java deleted file mode 100644 index 6312345..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/DeviceDetails.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.Validatable; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.types.DLNACaps; -import org.fourthline.cling.model.types.DLNADoc; - -import java.net.URI; -import java.net.URL; -import java.util.List; -import java.util.ArrayList; -import java.util.logging.Logger; - -/** - * Encapsulates all optional metadata about a device. - * - * @author Christian Bauer - */ -public class DeviceDetails implements Validatable { - - final private static Logger log = Logger.getLogger(DeviceDetails.class.getName()); - - final private URL baseURL; - final private String friendlyName; - final private ManufacturerDetails manufacturerDetails; - final private ModelDetails modelDetails; - final private String serialNumber; - final private String upc; - final private URI presentationURI; - final private DLNADoc[] dlnaDocs; - final private DLNACaps dlnaCaps; - final private DLNACaps secProductCaps; - - public DeviceDetails(String friendlyName) { - this(null, friendlyName, null, null, null, null, null); - } - - public DeviceDetails(String friendlyName, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) { - this(null, friendlyName, null, null, null, null, null, dlnaDocs, dlnaCaps); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails) { - this(null, friendlyName, manufacturerDetails, null, null, null, null); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) { - this(null, friendlyName, manufacturerDetails, null, null, null, null, dlnaDocs, dlnaCaps); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, - ModelDetails modelDetails) { - this(null, friendlyName, manufacturerDetails, modelDetails, null, null, null); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, - ModelDetails modelDetails, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) { - this(null, friendlyName, manufacturerDetails, modelDetails, null, null, null, dlnaDocs, dlnaCaps); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, - ModelDetails modelDetails, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps, DLNACaps secProductCaps) { - this(null, friendlyName, manufacturerDetails, modelDetails, null, null, null, dlnaDocs, dlnaCaps, secProductCaps); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails, - String serialNumber, String upc) { - this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, null); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails, - String serialNumber, String upc, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) { - this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, null, dlnaDocs, dlnaCaps); - } - - public DeviceDetails(String friendlyName, URI presentationURI) { - this(null, friendlyName, null, null, null, null, presentationURI); - } - - public DeviceDetails(String friendlyName, URI presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) { - this(null, friendlyName, null, null, null, null, presentationURI, dlnaDocs, dlnaCaps); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, - ModelDetails modelDetails, URI presentationURI) { - this(null, friendlyName, manufacturerDetails, modelDetails, null, null, presentationURI); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, - ModelDetails modelDetails, URI presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) { - this(null, friendlyName, manufacturerDetails, modelDetails, null, null, presentationURI, dlnaDocs, dlnaCaps); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails, - String serialNumber, String upc, URI presentationURI) { - this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, presentationURI); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails, - String serialNumber, String upc, URI presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) { - this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, presentationURI, dlnaDocs, dlnaCaps); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails, - String serialNumber, String upc, String presentationURI) - throws IllegalArgumentException { - this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, URI.create(presentationURI)); - } - - public DeviceDetails(String friendlyName, ManufacturerDetails manufacturerDetails, ModelDetails modelDetails, - String serialNumber, String upc, String presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) - throws IllegalArgumentException { - this(null, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, URI.create(presentationURI), dlnaDocs, dlnaCaps); - } - - public DeviceDetails(URL baseURL, String friendlyName, - ManufacturerDetails manufacturerDetails, ModelDetails modelDetails, - String serialNumber, String upc, - URI presentationURI) { - this(baseURL, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, presentationURI, null, null); - } - - public DeviceDetails(URL baseURL, String friendlyName, - ManufacturerDetails manufacturerDetails, ModelDetails modelDetails, - String serialNumber, String upc, - URI presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps) { - this(baseURL, friendlyName, manufacturerDetails, modelDetails, serialNumber, upc, presentationURI, dlnaDocs, dlnaCaps, null); - } - - public DeviceDetails(URL baseURL, String friendlyName, - ManufacturerDetails manufacturerDetails, ModelDetails modelDetails, - String serialNumber, String upc, - URI presentationURI, DLNADoc[] dlnaDocs, DLNACaps dlnaCaps, DLNACaps secProductCaps) { - this.baseURL = baseURL; - this.friendlyName = friendlyName; - this.manufacturerDetails = manufacturerDetails == null ? new ManufacturerDetails() : manufacturerDetails; - this.modelDetails = modelDetails == null ? new ModelDetails() : modelDetails; - this.serialNumber = serialNumber; - this.upc = upc; - this.presentationURI = presentationURI; - this.dlnaDocs = dlnaDocs != null ? dlnaDocs : new DLNADoc[0]; - this.dlnaCaps = dlnaCaps; - this.secProductCaps = secProductCaps; - } - - public URL getBaseURL() { - return baseURL; - } - - public String getFriendlyName() { - return friendlyName; - } - - public ManufacturerDetails getManufacturerDetails() { - return manufacturerDetails; - } - - public ModelDetails getModelDetails() { - return modelDetails; - } - - public String getSerialNumber() { - return serialNumber; - } - - public String getUpc() { - return upc; - } - - public URI getPresentationURI() { - return presentationURI; - } - - public DLNADoc[] getDlnaDocs() { - return dlnaDocs; - } - - public DLNACaps getDlnaCaps() { - return dlnaCaps; - } - - public DLNACaps getSecProductCaps() { - return secProductCaps; - } - - public List validate() { - List errors = new ArrayList(); - - if (getUpc() != null) { - // This is broken in more than half of the devices I've tested, so let's not even bother with a warning - if (getUpc().length() != 12) { - log.fine("UPnP specification violation, UPC must be 12 digits: " + getUpc()); - } else { - try { - Long.parseLong(getUpc()); - } catch (NumberFormatException ex) { - log.fine("UPnP specification violation, UPC must be 12 digits all-numeric: " + getUpc()); - } - } - } - - return errors; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/DeviceIdentity.java b/app/src/main/java/org/fourthline/cling/model/meta/DeviceIdentity.java deleted file mode 100644 index 21d1a76..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/DeviceIdentity.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.Constants; -import org.fourthline.cling.model.types.UDN; - -/** - * Unique device name, received and offered during discovery with SSDP. - * - * @author Christian Bauer - */ -public class DeviceIdentity { - - final private UDN udn; - final private Integer maxAgeSeconds; - - public DeviceIdentity(UDN udn, DeviceIdentity template) { - this.udn = udn; - this.maxAgeSeconds = template.getMaxAgeSeconds(); - } - - public DeviceIdentity(UDN udn) { - this.udn = udn; - this.maxAgeSeconds = Constants.MIN_ADVERTISEMENT_AGE_SECONDS; - } - - public DeviceIdentity(UDN udn, Integer maxAgeSeconds) { - this.udn = udn; - this.maxAgeSeconds = maxAgeSeconds; - } - - public UDN getUdn() { - return udn; - } - - public Integer getMaxAgeSeconds() { - return maxAgeSeconds; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - DeviceIdentity that = (DeviceIdentity) o; - - if (!udn.equals(that.udn)) return false; - - return true; - } - - @Override - public int hashCode() { - return udn.hashCode(); - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") UDN: " + getUdn(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/Icon.java b/app/src/main/java/org/fourthline/cling/model/meta/Icon.java deleted file mode 100644 index e827bd0..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/Icon.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - - -import org.fourthline.cling.model.Validatable; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.types.BinHexDatatype; -import org.seamless.util.io.IO; -import org.seamless.util.MimeType; -import org.seamless.util.URIUtil; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -/** - * The metadata of a device icon, might include the actual image data of a local icon. - * - *

- * Note that validation of icons is lax on purpose, a valid Icon might still - * return null from {@link #getMimeType()}, {@link #getWidth()}, - * {@link #getHeight()}, and {@link #getDepth()}. However, {@link #getUri()} will return - * a valid URI for a valid Icon. - *

- * - * @author Christian Bauer - */ -public class Icon implements Validatable { - - final private static Logger log = Logger.getLogger(StateVariable.class.getName()); - - final private MimeType mimeType; - final private int width; - final private int height; - final private int depth; - final private URI uri; - final private byte[] data; - - // Package mutable state - private Device device; - - /** - * Used internally by Cling when {@link RemoteDevice} is discovered, you shouldn't have to call this. - */ - public Icon(String mimeType, int width, int height, int depth, URI uri) { - this(mimeType != null && mimeType.length() > 0 ? MimeType.valueOf(mimeType) : null, width, height, depth, uri, null); - } - - /** - * Use this constructor if your local icon data can be resolved on the classpath, for - * example: MyClass.class.getResource("/my/icon.png) - * - * @param url A URL of the icon data that can be read with new File(url.toURI()). - */ - public Icon(String mimeType, int width, int height, int depth, URL url) throws IOException{ - this(mimeType, width, height, depth, new File(URIUtil.toURI(url))); - } - - /** - * Use this constructor if your local icon data can be resolved with a File, the file's - * name must be unique within the scope of a device. - */ - public Icon(String mimeType, int width, int height, int depth, File file) throws IOException { - this(mimeType, width, height, depth, file.getName(), IO.readBytes(file)); - } - - /** - * Use this constructor if your local icon data is an InputStream. - * - * @param uniqueName Must be a valid URI path segment and unique within the scope of a device. - */ - public Icon(String mimeType, int width, int height, int depth, String uniqueName, InputStream is) throws IOException { - this(mimeType, width, height, depth, uniqueName, IO.readBytes(is)); - } - - /** - * Use this constructor if your local icon data is in a byte[]. - * - * @param uniqueName Must be a valid URI path segment and unique within the scope of a device. - */ - public Icon(String mimeType, int width, int height, int depth, String uniqueName, byte[] data) { - this(mimeType != null && mimeType.length() > 0 ? MimeType.valueOf(mimeType) : null, width, height, depth, URI.create(uniqueName), data); - } - - /** - * Use this constructor if your local icon is binary data encoded with BinHex. - - * @param uniqueName Must be a valid URI path segment and unique within the scope of a device. - * @param binHexEncoded The icon bytes encoded as BinHex. - */ - public Icon(String mimeType, int width, int height, int depth, String uniqueName, String binHexEncoded) { - this( - mimeType, width, height, depth, uniqueName, - binHexEncoded != null && !binHexEncoded.equals("") ? new BinHexDatatype().valueOf(binHexEncoded) : null - ); - } - - protected Icon(MimeType mimeType, int width, int height, int depth, URI uri, byte[] data) { - this.mimeType = mimeType; - this.width = width; - this.height = height; - this.depth = depth; - this.uri = uri; - this.data = data; - } - - public MimeType getMimeType() { - return mimeType; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - public int getDepth() { - return depth; - } - - public URI getUri() { - return uri; - } - - public byte[] getData() { - return data; - } - - public Device getDevice() { - return device; - } - - void setDevice(Device device) { - if (this.device != null) - throw new IllegalStateException("Final value has been set already, model is immutable"); - this.device = device; - } - - public List validate() { - List errors = new ArrayList(); - - if (getMimeType() == null) { - log.warning("UPnP specification violation of: " + getDevice()); - log.warning("Invalid icon, missing mime type: " + this); - } - if (getWidth() == 0) { - log.warning("UPnP specification violation of: " + getDevice()); - log.warning("Invalid icon, missing width: " + this); - } - if (getHeight() == 0) { - log.warning("UPnP specification violation of: " + getDevice()); - log.warning("Invalid icon, missing height: " + this); - } - if (getDepth() == 0) { - log.warning("UPnP specification violation of: " + getDevice()); - log.warning("Invalid icon, missing bitmap depth: " + this); - } - - if (getUri() == null) { - errors.add(new ValidationError( - getClass(), - "uri", - "URL is required" - )); - } else { - try { - URL testURI = getUri().toURL(); - if (testURI == null) - throw new MalformedURLException(); - } catch (MalformedURLException ex) { - errors.add(new ValidationError( - getClass(), - "uri", - "URL must be valid: " + ex.getMessage()) - ); - } catch (IllegalArgumentException ex) { - // Relative URI is fine here! - } - } - - return errors; - } - - public Icon deepCopy() { - return new Icon( - getMimeType(), - getWidth(), - getHeight(), - getDepth(), - getUri(), - getData() - ); - } - - @Override - public String toString() { - return "Icon(" + getWidth() + "x" + getHeight() + ", MIME: " + getMimeType() + ") " + getUri(); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/meta/LocalDevice.java b/app/src/main/java/org/fourthline/cling/model/meta/LocalDevice.java deleted file mode 100644 index f6d2199..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/LocalDevice.java +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.Namespace; -import org.fourthline.cling.model.profile.RemoteClientInfo; -import org.fourthline.cling.model.profile.DeviceDetailsProvider; -import org.fourthline.cling.model.resource.DeviceDescriptorResource; -import org.fourthline.cling.model.resource.IconResource; -import org.fourthline.cling.model.resource.ServiceControlResource; -import org.fourthline.cling.model.resource.ServiceDescriptorResource; -import org.fourthline.cling.model.resource.ServiceEventSubscriptionResource; -import org.fourthline.cling.model.resource.Resource; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.types.DeviceType; -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDN; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -/** - * The metadata of a device created on this host, by application code. - * - * @author Christian Bauer - */ -public class LocalDevice extends Device { - - final private DeviceDetailsProvider deviceDetailsProvider; - - public LocalDevice(DeviceIdentity identity) throws ValidationException { - super(identity); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - LocalService service) throws ValidationException { - super(identity, type, details, null, new LocalService[]{service}); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetailsProvider deviceDetailsProvider, - LocalService service) throws ValidationException { - super(identity, type, null, null, new LocalService[]{service}); - this.deviceDetailsProvider = deviceDetailsProvider; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetailsProvider deviceDetailsProvider, - LocalService service, LocalDevice embeddedDevice) throws ValidationException { - super(identity, type, null, null, new LocalService[]{service}, new LocalDevice[]{embeddedDevice}); - this.deviceDetailsProvider = deviceDetailsProvider; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - LocalService service, LocalDevice embeddedDevice) throws ValidationException { - super(identity, type, details, null, new LocalService[]{service}, new LocalDevice[]{embeddedDevice}); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - LocalService[] services) throws ValidationException { - super(identity, type, details, null, services); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - LocalService[] services, LocalDevice[] embeddedDevices) throws ValidationException { - super(identity, type, details, null, services, embeddedDevices); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon icon, LocalService service) throws ValidationException { - super(identity, type, details, new Icon[]{icon}, new LocalService[]{service}); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon icon, LocalService service, LocalDevice embeddedDevice) throws ValidationException { - super(identity, type, details, new Icon[]{icon}, new LocalService[]{service}, new LocalDevice[]{embeddedDevice}); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon icon, LocalService[] services) throws ValidationException { - super(identity, type, details, new Icon[]{icon}, services); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetailsProvider deviceDetailsProvider, - Icon icon, LocalService[] services) throws ValidationException { - super(identity, type, null, new Icon[]{icon}, services); - this.deviceDetailsProvider = deviceDetailsProvider; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon icon, LocalService[] services, LocalDevice[] embeddedDevices) throws ValidationException { - super(identity, type, details, new Icon[]{icon}, services, embeddedDevices); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon[] icons, LocalService service) throws ValidationException { - super(identity, type, details, icons, new LocalService[]{service}); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon[] icons, LocalService service, LocalDevice embeddedDevice) throws ValidationException { - super(identity, type, details, icons, new LocalService[]{service}, new LocalDevice[]{embeddedDevice}); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetailsProvider deviceDetailsProvider, - Icon[] icons, LocalService service, LocalDevice embeddedDevice) throws ValidationException { - super(identity, type, null, icons, new LocalService[]{service}, new LocalDevice[]{embeddedDevice}); - this.deviceDetailsProvider = deviceDetailsProvider; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon[] icons, LocalService[] services) throws ValidationException { - super(identity, type, details, icons, services); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon[] icons, LocalService[] services, LocalDevice[] embeddedDevices) throws ValidationException { - super(identity, type, details, icons, services, embeddedDevices); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, UDAVersion version, DeviceType type, DeviceDetails details, - Icon[] icons, LocalService[] services, LocalDevice[] embeddedDevices) throws ValidationException { - super(identity, version, type, details, icons, services, embeddedDevices); - this.deviceDetailsProvider = null; - } - - public LocalDevice(DeviceIdentity identity, UDAVersion version, DeviceType type, DeviceDetailsProvider deviceDetailsProvider, - Icon[] icons, LocalService[] services, LocalDevice[] embeddedDevices) throws ValidationException { - super(identity, version, type, null, icons, services, embeddedDevices); - this.deviceDetailsProvider = deviceDetailsProvider; - } - - public DeviceDetailsProvider getDeviceDetailsProvider() { - return deviceDetailsProvider; - } - - @Override - public DeviceDetails getDetails(RemoteClientInfo info) { - if (getDeviceDetailsProvider() != null) { - return getDeviceDetailsProvider().provide(info); - } - return this.getDetails(); - } - - @Override - public LocalService[] getServices() { - return this.services != null ? this.services : new LocalService[0]; - } - - @Override - public LocalDevice[] getEmbeddedDevices() { - return this.embeddedDevices != null ? this.embeddedDevices : new LocalDevice[0]; - } - - @Override - public LocalDevice newInstance(UDN udn, UDAVersion version, DeviceType type, DeviceDetails details, - Icon[] icons, LocalService[] services, List embeddedDevices) - throws ValidationException { - return new LocalDevice( - new DeviceIdentity(udn, getIdentity().getMaxAgeSeconds()), - version, type, details, icons, - services, - embeddedDevices.size() > 0 ? embeddedDevices.toArray(new LocalDevice[embeddedDevices.size()]) : null - ); - } - - @Override - public LocalService newInstance(ServiceType serviceType, ServiceId serviceId, - URI descriptorURI, URI controlURI, URI eventSubscriptionURI, - Action[] actions, StateVariable[] stateVariables) throws ValidationException { - return new LocalService( - serviceType, serviceId, - actions, stateVariables - ); - } - - @Override - public LocalDevice[] toDeviceArray(Collection col) { - return col.toArray(new LocalDevice[col.size()]); - } - - @Override - public LocalService[] newServiceArray(int size) { - return new LocalService[size]; - } - - @Override - public LocalService[] toServiceArray(Collection col) { - return col.toArray(new LocalService[col.size()]); - } - - @Override - public List validate() { - List errors = new ArrayList(); - errors.addAll(super.validate()); - - // We have special rules for local icons, the URI must always be a relative path which will - // be added to the device base URI! - if (hasIcons()) { - for (Icon icon : getIcons()) { - if (icon.getUri().isAbsolute()) { - errors.add(new ValidationError( - getClass(), - "icons", - "Local icon URI can not be absolute: " + icon.getUri() - )); - } - if (icon.getUri().toString().contains("../")) { - errors.add(new ValidationError( - getClass(), - "icons", - "Local icon URI must not contain '../': " + icon.getUri() - )); - } - if (icon.getUri().toString().startsWith("/")) { - errors.add(new ValidationError( - getClass(), - "icons", - "Local icon URI must not start with '/': " + icon.getUri() - )); - } - } - } - - return errors; - } - - @Override - public Resource[] discoverResources(Namespace namespace) { - List discovered = new ArrayList(); - - // Device - if (isRoot()) { - // This should guarantee that each logical local device tree (with all its embedded devices) has only - // one device descriptor resource - because only one device in the tree isRoot(). - discovered.add(new DeviceDescriptorResource(namespace.getDescriptorPath(this), this)); - } - - // Services - for (LocalService service : getServices()) { - - discovered.add( - new ServiceDescriptorResource(namespace.getDescriptorPath(service), service) - ); - - // Control - discovered.add( - new ServiceControlResource(namespace.getControlPath(service), service) - ); - - // Event subscription - discovered.add( - new ServiceEventSubscriptionResource(namespace.getEventSubscriptionPath(service), service) - ); - - } - - // Icons - for (Icon icon : getIcons()) { - discovered.add(new IconResource(namespace.prefixIfRelative(this, icon.getUri()), icon)); - } - - // Embedded devices - if (hasEmbeddedDevices()) { - for (Device embeddedDevice : getEmbeddedDevices()) { - discovered.addAll(Arrays.asList(embeddedDevice.discoverResources(namespace))); - } - } - - return discovered.toArray(new Resource[discovered.size()]); - } - - @Override - public LocalDevice getRoot() { - if (isRoot()) return this; - LocalDevice current = this; - while (current.getParentDevice() != null) { - current = current.getParentDevice(); - } - return current; - } - - @Override - public LocalDevice findDevice(UDN udn) { - return find(udn, this); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/LocalService.java b/app/src/main/java/org/fourthline/cling/model/meta/LocalService.java deleted file mode 100644 index bc6cff3..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/LocalService.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.ServiceManager; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.action.ActionExecutor; -import org.fourthline.cling.model.state.StateVariableAccessor; -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.ServiceType; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -/** - * The metadata of a service created on this host, by application code. - *

- * After instantiation {@link #setManager(org.fourthline.cling.model.ServiceManager)} must - * be called to bind the service metadata to the service implementation. - *

- * - * @author Christian Bauer - */ -public class LocalService extends Service { - - final protected Map actionExecutors; - final protected Map stateVariableAccessors; - final protected Set stringConvertibleTypes; - final protected boolean supportsQueryStateVariables; - - protected ServiceManager manager; - - public LocalService(ServiceType serviceType, ServiceId serviceId, - Action[] actions, StateVariable[] stateVariables) throws ValidationException { - super(serviceType, serviceId, actions, stateVariables); - this.manager = null; - this.actionExecutors = new HashMap(); - this.stateVariableAccessors = new HashMap(); - this.stringConvertibleTypes = new HashSet(); - this.supportsQueryStateVariables = true; - } - - public LocalService(ServiceType serviceType, ServiceId serviceId, - Map actionExecutors, - Map stateVariableAccessors, - Set stringConvertibleTypes, - boolean supportsQueryStateVariables) throws ValidationException { - - super(serviceType, serviceId, - actionExecutors.keySet().toArray(new Action[actionExecutors.size()]), - stateVariableAccessors.keySet().toArray(new StateVariable[stateVariableAccessors.size()]) - ); - - this.supportsQueryStateVariables = supportsQueryStateVariables; - this.stringConvertibleTypes = stringConvertibleTypes; - this.stateVariableAccessors = stateVariableAccessors; - this.actionExecutors = actionExecutors; - } - - synchronized public void setManager(ServiceManager manager) { - if (this.manager != null) { - throw new IllegalStateException("Manager is final"); - } - this.manager = manager; - } - - synchronized public ServiceManager getManager() { - if (manager == null) { - throw new IllegalStateException("Unmanaged service, no implementation instance available"); - } - return manager; - } - - public boolean isSupportsQueryStateVariables() { - return supportsQueryStateVariables; - } - - public Set getStringConvertibleTypes() { - return stringConvertibleTypes; - } - - public boolean isStringConvertibleType(Object o) { - return o != null && isStringConvertibleType(o.getClass()); - } - - public boolean isStringConvertibleType(Class clazz) { - return ModelUtil.isStringConvertibleType(getStringConvertibleTypes(), clazz); - } - - public StateVariableAccessor getAccessor(String stateVariableName) { - StateVariable sv; - return (sv = getStateVariable(stateVariableName)) != null ? getAccessor(sv) : null; - } - - public StateVariableAccessor getAccessor(StateVariable stateVariable) { - return stateVariableAccessors.get(stateVariable); - } - - public ActionExecutor getExecutor(String actionName) { - Action action; - return (action = getAction(actionName)) != null ? getExecutor(action) : null; - } - - public ActionExecutor getExecutor(Action action) { - return actionExecutors.get(action); - } - - @Override - public Action getQueryStateVariableAction() { - return getAction(QueryStateVariableAction.ACTION_NAME); - } - - @Override - public String toString() { - return super.toString() + ", Manager: " + manager; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/meta/ManufacturerDetails.java b/app/src/main/java/org/fourthline/cling/model/meta/ManufacturerDetails.java deleted file mode 100644 index 6cf7aa6..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/ManufacturerDetails.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import java.net.URI; - -/** - * Encpasulates optional metadata about a device's manufacturer. - * - * @author Christian Bauer - */ -public class ManufacturerDetails { - - private String manufacturer; - private URI manufacturerURI; - - ManufacturerDetails() { - } - - public ManufacturerDetails(String manufacturer) { - this.manufacturer = manufacturer; - } - - public ManufacturerDetails(URI manufacturerURI) { - this.manufacturerURI = manufacturerURI; - } - - public ManufacturerDetails(String manufacturer, URI manufacturerURI) { - this.manufacturer = manufacturer; - this.manufacturerURI = manufacturerURI; - } - - public ManufacturerDetails(String manufacturer, String manufacturerURI) throws IllegalArgumentException { - this.manufacturer = manufacturer; - this.manufacturerURI = URI.create(manufacturerURI); - } - - public String getManufacturer() { - return manufacturer; - } - - public URI getManufacturerURI() { - return manufacturerURI; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/ModelDetails.java b/app/src/main/java/org/fourthline/cling/model/meta/ModelDetails.java deleted file mode 100644 index 97c089b..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/ModelDetails.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import java.net.URI; - -/** - * Encpasulates optional metadata about the model of a device. - * - * @author Christian Bauer - */ -public class ModelDetails { - - private String modelName; - private String modelDescription; - private String modelNumber; - private URI modelURI; - - ModelDetails() { - } - - public ModelDetails(String modelName) { - this.modelName = modelName; - } - - public ModelDetails(String modelName, String modelDescription) { - this.modelName = modelName; - this.modelDescription = modelDescription; - } - - public ModelDetails(String modelName, String modelDescription, String modelNumber) { - this.modelName = modelName; - this.modelDescription = modelDescription; - this.modelNumber = modelNumber; - } - - public ModelDetails(String modelName, String modelDescription, String modelNumber, URI modelURI) { - this.modelName = modelName; - this.modelDescription = modelDescription; - this.modelNumber = modelNumber; - this.modelURI = modelURI; - } - - public ModelDetails(String modelName, String modelDescription, String modelNumber, String modelURI) throws IllegalArgumentException { - this.modelName = modelName; - this.modelDescription = modelDescription; - this.modelNumber = modelNumber; - this.modelURI = URI.create(modelURI); - } - - public String getModelName() { - return modelName; - } - - public String getModelDescription() { - return modelDescription; - } - - public String getModelNumber() { - return modelNumber; - } - - public URI getModelURI() { - return modelURI; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/QueryStateVariableAction.java b/app/src/main/java/org/fourthline/cling/model/meta/QueryStateVariableAction.java deleted file mode 100644 index db9731a..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/QueryStateVariableAction.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.ValidationError; - -import java.util.List; -import java.util.Collections; - - -/** - * Describes a single action, the deprecated "query any state variable" action. - * - * Note: This is already deprecated in UDA 1.0! - * - * @author Christian Bauer - */ -public class QueryStateVariableAction extends Action { - - public static final String INPUT_ARG_VAR_NAME = "varName"; - public static final String OUTPUT_ARG_RETURN = "return"; - - public static final String ACTION_NAME = "QueryStateVariable"; - public static final String VIRTUAL_STATEVARIABLE_INPUT = "VirtualQueryActionInput"; - public static final String VIRTUAL_STATEVARIABLE_OUTPUT = "VirtualQueryActionOutput"; - - public QueryStateVariableAction() { - this(null); - } - - public QueryStateVariableAction(S service) { - super(ACTION_NAME, - new ActionArgument[]{ - new ActionArgument(INPUT_ARG_VAR_NAME, VIRTUAL_STATEVARIABLE_INPUT, ActionArgument.Direction.IN), - new ActionArgument(OUTPUT_ARG_RETURN, VIRTUAL_STATEVARIABLE_OUTPUT, ActionArgument.Direction.OUT), - } - ); - setService(service); - } - - @Override - public String getName() { - return ACTION_NAME; - } - - @Override - public List validate() { - return Collections.EMPTY_LIST; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/meta/RemoteDevice.java b/app/src/main/java/org/fourthline/cling/model/meta/RemoteDevice.java deleted file mode 100644 index a0a553f..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/RemoteDevice.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - - -import org.fourthline.cling.model.Namespace; -import org.fourthline.cling.model.resource.ServiceEventCallbackResource; -import org.fourthline.cling.model.resource.Resource; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.types.DeviceType; -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDN; -import org.seamless.util.URIUtil; - -import java.net.URI; -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -/** - * The metadata of a device that was discovered on the network. - * - * @author Christian Bauer - */ -public class RemoteDevice extends Device { - - public RemoteDevice(RemoteDeviceIdentity identity) throws ValidationException { - super(identity); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - RemoteService service) throws ValidationException { - super(identity, type, details, null, new RemoteService[]{service}); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - RemoteService service, RemoteDevice embeddedDevice) throws ValidationException { - super(identity, type, details, null, new RemoteService[]{service}, new RemoteDevice[]{embeddedDevice}); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - RemoteService[] services) throws ValidationException { - super(identity, type, details, null, services); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - RemoteService[] services, RemoteDevice[] embeddedDevices) throws ValidationException { - super(identity, type, details, null, services, embeddedDevices); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon icon, RemoteService service) throws ValidationException { - super(identity, type, details, new Icon[]{icon}, new RemoteService[]{service}); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon icon, RemoteService service, RemoteDevice embeddedDevice) throws ValidationException { - super(identity, type, details, new Icon[]{icon}, new RemoteService[]{service}, new RemoteDevice[]{embeddedDevice}); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon icon, RemoteService[] services) throws ValidationException { - super(identity, type, details, new Icon[]{icon}, services); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon icon, RemoteService[] services, RemoteDevice[] embeddedDevices) throws ValidationException { - super(identity, type, details, new Icon[]{icon}, services, embeddedDevices); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon[] icons, RemoteService service) throws ValidationException { - super(identity, type, details, icons, new RemoteService[]{service}); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon[] icons, RemoteService service, RemoteDevice embeddedDevice) throws ValidationException { - super(identity, type, details, icons, new RemoteService[]{service}, new RemoteDevice[]{embeddedDevice}); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon[] icons, RemoteService[] services) throws ValidationException { - super(identity, type, details, icons, services); - } - - public RemoteDevice(RemoteDeviceIdentity identity, DeviceType type, DeviceDetails details, - Icon[] icons, RemoteService[] services, RemoteDevice[] embeddedDevices) throws ValidationException { - super(identity, type, details, icons, services, embeddedDevices); - } - - public RemoteDevice(RemoteDeviceIdentity identity, UDAVersion version, DeviceType type, DeviceDetails details, - Icon[] icons, RemoteService[] services, RemoteDevice[] embeddedDevices) throws ValidationException { - super(identity, version, type, details, icons, services, embeddedDevices); - } - - @Override - public RemoteService[] getServices() { - return this.services != null ? this.services : new RemoteService[0]; - } - - @Override - public RemoteDevice[] getEmbeddedDevices() { - return this.embeddedDevices != null ? this.embeddedDevices : new RemoteDevice[0]; - } - - public URL normalizeURI(URI relativeOrAbsoluteURI) { - - // TODO: I have one device (Netgear 834DG DSL Router) that sends a , and even that is wrong (port)! - // This can be fixed by "re-enabling" UPnP in the upnpService after a reboot, it will then use the right port... - // return URIUtil.createAbsoluteURL(getDescriptorURL(), relativeOrAbsoluteURI); - - if (getDetails() != null && getDetails().getBaseURL() != null) { - // If we have an , all URIs are relative to it - return URIUtil.createAbsoluteURL(getDetails().getBaseURL(), relativeOrAbsoluteURI); - } else { - // Otherwise, they are relative to the descriptor location - return URIUtil.createAbsoluteURL(getIdentity().getDescriptorURL(), relativeOrAbsoluteURI); - } - - } - - @Override - public RemoteDevice newInstance(UDN udn, UDAVersion version, DeviceType type, DeviceDetails details, - Icon[] icons, RemoteService[] services, - List embeddedDevices) throws ValidationException { - return new RemoteDevice( - new RemoteDeviceIdentity(udn, getIdentity()), - version, type, details, icons, - services, - embeddedDevices.size() > 0 ? embeddedDevices.toArray(new RemoteDevice[embeddedDevices.size()]) : null - ); - } - - @Override - public RemoteService newInstance(ServiceType serviceType, ServiceId serviceId, - URI descriptorURI, URI controlURI, URI eventSubscriptionURI, - Action[] actions, StateVariable[] stateVariables) throws ValidationException { - return new RemoteService( - serviceType, serviceId, - descriptorURI, controlURI, eventSubscriptionURI, - actions, stateVariables - ); - } - - @Override - public RemoteDevice[] toDeviceArray(Collection col) { - return col.toArray(new RemoteDevice[col.size()]); - } - - @Override - public RemoteService[] newServiceArray(int size) { - return new RemoteService[size]; - } - - @Override - public RemoteService[] toServiceArray(Collection col) { - return col.toArray(new RemoteService[col.size()]); - } - - @Override - public Resource[] discoverResources(Namespace namespace) { - List discovered = new ArrayList(); - - // Services - for (RemoteService service : getServices()) { - if(service == null) continue; - discovered.add(new ServiceEventCallbackResource(namespace.getEventCallbackPath(service), service)); - } - - // Embedded devices - if (hasEmbeddedDevices()) { - for (Device embeddedDevice : getEmbeddedDevices()) { - if(embeddedDevice == null) continue; - discovered.addAll(Arrays.asList(embeddedDevice.discoverResources(namespace))); - } - } - - return discovered.toArray(new Resource[discovered.size()]); - } - - @Override - public RemoteDevice getRoot() { - if (isRoot()) return this; - RemoteDevice current = this; - while (current.getParentDevice() != null) { - current = current.getParentDevice(); - } - return current; - } - - @Override - public RemoteDevice findDevice(UDN udn) { - return find(udn, this); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/meta/RemoteDeviceIdentity.java b/app/src/main/java/org/fourthline/cling/model/meta/RemoteDeviceIdentity.java deleted file mode 100644 index a1cc06e..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/RemoteDeviceIdentity.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.message.discovery.IncomingNotificationRequest; -import org.fourthline.cling.model.message.discovery.IncomingSearchResponse; -import org.fourthline.cling.model.types.UDN; - -import java.net.InetAddress; -import java.net.URL; - -/** - * Additional identifying information only relevant for discovered remote devices. - *

- * This information always includes the URL of the device's descriptor, and the - * local network interface address we should use in the future, because it is - * guaranteed to be reachable by this remote device (e.g. when we build a local - * callback URL). - *

- *

- * Optional is the remote hosts interface MAC hardware address. If we have it, we - * can use it to send Wake-On-LAN broadcasts if we think the remote host is not - * reachable and might be sleeping. (Useful for "stateless" reconnecting control - * points.) - *

- * - * @author Christian Bauer - */ -public class RemoteDeviceIdentity extends DeviceIdentity { - - final private URL descriptorURL; - final private byte[] interfaceMacAddress; - final private InetAddress discoveredOnLocalAddress; - - public RemoteDeviceIdentity(UDN udn, RemoteDeviceIdentity template) { - this(udn, template.getMaxAgeSeconds(), template.getDescriptorURL(), template.getInterfaceMacAddress(), template.getDiscoveredOnLocalAddress()); - } - - public RemoteDeviceIdentity(UDN udn, Integer maxAgeSeconds, URL descriptorURL, byte[] interfaceMacAddress, InetAddress discoveredOnLocalAddress) { - super(udn, maxAgeSeconds); - this.descriptorURL = descriptorURL; - this.interfaceMacAddress = interfaceMacAddress; - this.discoveredOnLocalAddress = discoveredOnLocalAddress; - } - - public RemoteDeviceIdentity(IncomingNotificationRequest notificationRequest) { - this(notificationRequest.getUDN(), - notificationRequest.getMaxAge(), - notificationRequest.getLocationURL(), - notificationRequest.getInterfaceMacHeader(), - notificationRequest.getLocalAddress() - ); - } - - public RemoteDeviceIdentity(IncomingSearchResponse searchResponse) { - this(searchResponse.getRootDeviceUDN(), - searchResponse.getMaxAge(), - searchResponse.getLocationURL(), - searchResponse.getInterfaceMacHeader(), - searchResponse.getLocalAddress() - ); - } - - public URL getDescriptorURL() { - return descriptorURL; - } - - public byte[] getInterfaceMacAddress() { - return interfaceMacAddress; - } - - public InetAddress getDiscoveredOnLocalAddress() { - return discoveredOnLocalAddress; - } - - public byte[] getWakeOnLANBytes() { - if (getInterfaceMacAddress() == null) return null; - byte[] bytes = new byte[6 + 16 * getInterfaceMacAddress().length]; - for (int i = 0; i < 6; i++) { - bytes[i] = (byte) 0xff; - } - for (int i = 6; i < bytes.length; i += getInterfaceMacAddress().length) { - System.arraycopy(getInterfaceMacAddress(), 0, bytes, i, getInterfaceMacAddress().length); - } - return bytes; - } - - @Override - public String toString() { - // Performance optimization, so we don't have to wrap all log("foo " + device) calls with isLoggable - if(ModelUtil.ANDROID_RUNTIME) { - return "(RemoteDeviceIdentity) UDN: " + getUdn() + ", Descriptor: " + getDescriptorURL(); - } - return "(" + getClass().getSimpleName() + ") UDN: " + getUdn() + ", Descriptor: " + getDescriptorURL(); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/meta/RemoteService.java b/app/src/main/java/org/fourthline/cling/model/meta/RemoteService.java deleted file mode 100644 index eb0d47f..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/RemoteService.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.ServiceType; - -import java.net.URI; -import java.util.ArrayList; -import java.util.List; - -/** - * The metadata of a service discovered on a remote device. - *

- * Includes the URI's for getting the service's descriptor, calling its - * actions, and subscribing to events. - *

- * - * @author Christian Bauer - */ -public class RemoteService extends Service { - - final private URI descriptorURI; - final private URI controlURI; - final private URI eventSubscriptionURI; - - public RemoteService(ServiceType serviceType, ServiceId serviceId, - URI descriptorURI, URI controlURI, URI eventSubscriptionURI) throws ValidationException { - this(serviceType, serviceId, descriptorURI, controlURI, eventSubscriptionURI, null, null); - } - - public RemoteService(ServiceType serviceType, ServiceId serviceId, - URI descriptorURI, URI controlURI, URI eventSubscriptionURI, - Action[] actions, StateVariable[] stateVariables) throws ValidationException { - super(serviceType, serviceId, actions, stateVariables); - - this.descriptorURI = descriptorURI; - this.controlURI = controlURI; - this.eventSubscriptionURI = eventSubscriptionURI; - - List errors = validateThis(); - if (errors.size() > 0) { - throw new ValidationException("Validation of device graph failed, call getErrors() on exception", errors); - } - } - - @Override - public Action getQueryStateVariableAction() { - return new QueryStateVariableAction(this); - } - - public URI getDescriptorURI() { - return descriptorURI; - } - - public URI getControlURI() { - return controlURI; - } - - public URI getEventSubscriptionURI() { - return eventSubscriptionURI; - } - - public List validateThis() { - List errors = new ArrayList(); - - if (getDescriptorURI() == null) { - errors.add(new ValidationError( - getClass(), - "descriptorURI", - "Descriptor location (SCPDURL) is required" - )); - } - - if (getControlURI() == null) { - errors.add(new ValidationError( - getClass(), - "controlURI", - "Control URL is required" - )); - } - - if (getEventSubscriptionURI() == null) { - errors.add(new ValidationError( - getClass(), - "eventSubscriptionURI", - "Event subscription URL is required" - )); - } - - return errors; - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") Descriptor: " + getDescriptorURI(); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/meta/Service.java b/app/src/main/java/org/fourthline/cling/model/meta/Service.java deleted file mode 100644 index b1b1f46..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/Service.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.ServiceReference; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.ServiceId; -import org.fourthline.cling.model.types.ServiceType; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * The metadata of a service, with actions and state variables. - * - * @author Christian Bauer - */ -public abstract class Service { - - final private ServiceType serviceType; - final private ServiceId serviceId; - - - final private Map actions = new HashMap(); - final private Map stateVariables = new HashMap(); - - // Package mutable state - private D device; - - public Service(ServiceType serviceType, ServiceId serviceId) throws ValidationException { - this(serviceType, serviceId, null, null); - } - - public Service(ServiceType serviceType, ServiceId serviceId, - Action[] actions, StateVariable[] stateVariables) throws ValidationException { - - this.serviceType = serviceType; - this.serviceId = serviceId; - - if (actions != null) { - for (Action action : actions) { - this.actions.put(action.getName(), action); - action.setService(this); - } - } - - if (stateVariables != null) { - for (StateVariable stateVariable : stateVariables) { - this.stateVariables.put(stateVariable.getName(), stateVariable); - stateVariable.setService(this); - } - } - - } - - public ServiceType getServiceType() { - return serviceType; - } - - public ServiceId getServiceId() { - return serviceId; - } - - public boolean hasActions() { - return getActions() != null && getActions().length > 0; - } - - public Action[] getActions() { - return actions == null ? null : actions.values().toArray(new Action[actions.values().size()]); - } - - public boolean hasStateVariables() { - // TODO: Spec says always has to have at least one... - return getStateVariables() != null && getStateVariables().length > 0; - } - - public StateVariable[] getStateVariables() { - return stateVariables == null ? null : stateVariables.values().toArray(new StateVariable[stateVariables.values().size()]); - } - - public D getDevice() { - return device; - } - - void setDevice(D device) { - if (this.device != null) - throw new IllegalStateException("Final value has been set already, model is immutable"); - this.device = device; - } - - public Action getAction(String name) { - return actions == null ? null : actions.get(name); - } - - public StateVariable getStateVariable(String name) { - // Some magic necessary for the deprected 'query state variable' action stuff - if (QueryStateVariableAction.VIRTUAL_STATEVARIABLE_INPUT.equals(name)) { - return new StateVariable( - QueryStateVariableAction.VIRTUAL_STATEVARIABLE_INPUT, - new StateVariableTypeDetails(Datatype.Builtin.STRING.getDatatype()) - ); - } - if (QueryStateVariableAction.VIRTUAL_STATEVARIABLE_OUTPUT.equals(name)) { - return new StateVariable( - QueryStateVariableAction.VIRTUAL_STATEVARIABLE_OUTPUT, - new StateVariableTypeDetails(Datatype.Builtin.STRING.getDatatype()) - ); - } - return stateVariables == null ? null : stateVariables.get(name); - } - - public StateVariable getRelatedStateVariable(ActionArgument argument) { - return getStateVariable(argument.getRelatedStateVariableName()); - } - - public Datatype getDatatype(ActionArgument argument) { - return getRelatedStateVariable(argument).getTypeDetails().getDatatype(); - } - - public ServiceReference getReference() { - return new ServiceReference(getDevice().getIdentity().getUdn(), getServiceId()); - } - - public List validate() { - List errors = new ArrayList(); - - if (getServiceType() == null) { - errors.add(new ValidationError( - getClass(), - "serviceType", - "Service type/info is required" - )); - } - - if (getServiceId() == null) { - errors.add(new ValidationError( - getClass(), - "serviceId", - "Service ID is required" - )); - } - - // TODO: If the service has no evented variables, it should not have an event subscription URL, which means - // the url element in the device descriptor must be present, but empty!!!! - - /* TODO: This doesn't fit into our meta model, we don't know if a service has state variables until - we completely hydrate it from a service descriptor - if (getStateVariables().length == 0) { - errors.add(new ValidationError( - getClass(), - "stateVariables", - "Service must have at least one state variable" - )); - } - */ - - if (hasActions()) { - for (Action action : getActions()) { - errors.addAll(action.validate()); - } - } - - if (hasStateVariables()) { - for (StateVariable stateVariable : getStateVariables()) { - errors.addAll(stateVariable.validate()); - } - } - - return errors; - } - - public abstract Action getQueryStateVariableAction(); - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") ServiceId: " + getServiceId(); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/meta/StateVariable.java b/app/src/main/java/org/fourthline/cling/model/meta/StateVariable.java deleted file mode 100644 index 33656b9..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/StateVariable.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - - -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.Validatable; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.types.Datatype; - -import java.util.List; -import java.util.ArrayList; -import java.util.logging.Logger; - -/** - * The metadata of a named state variable. - * - * @author Christian Bauer - */ -public class StateVariable implements Validatable { - - final private static Logger log = Logger.getLogger(StateVariable.class.getName()); - - final private String name; - final private StateVariableTypeDetails type; - final private StateVariableEventDetails eventDetails; - - // Package mutable state - private S service; - - public StateVariable(String name, StateVariableTypeDetails type) { - this(name, type, new StateVariableEventDetails()); - } - - public StateVariable(String name, StateVariableTypeDetails type, StateVariableEventDetails eventDetails) { - this.name = name; - this.type = type; - this.eventDetails = eventDetails; - } - - public String getName() { - return name; - } - - public StateVariableTypeDetails getTypeDetails() { - return type; - } - - public StateVariableEventDetails getEventDetails() { - return eventDetails; - } - - public S getService() { - return service; - } - - void setService(S service) { - if (this.service != null) - throw new IllegalStateException("Final value has been set already, model is immutable"); - this.service = service; - } - - public List validate() { - List errors = new ArrayList(); - - if (getName() == null || getName().length() == 0) { - errors.add(new ValidationError( - getClass(), - "name", - "StateVariable without name of: " + getService() - )); - } else if (!ModelUtil.isValidUDAName(getName())) { - log.warning("UPnP specification violation of: " + getService().getDevice()); - log.warning("Invalid state variable name: " + this); - } - - errors.addAll(getTypeDetails().validate()); - - return errors; - } - - public boolean isModeratedNumericType() { - return Datatype.Builtin.isNumeric( - getTypeDetails().getDatatype().getBuiltin() - ) && getEventDetails().getEventMinimumDelta() > 0; - } - - public StateVariable deepCopy() { - return new StateVariable( - getName(), - getTypeDetails(), - getEventDetails() - ); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("(").append(getClass().getSimpleName()); - sb.append(", Name: ").append(getName()); - sb.append(", Type: ").append(getTypeDetails().getDatatype().getDisplayString()).append(")"); - if (!getEventDetails().isSendEvents()) { - sb.append(" (No Events)"); - } - if (getTypeDetails().getDefaultValue() != null) { - sb.append(" Default Value: ").append("'").append(getTypeDetails().getDefaultValue()).append("'"); - } - if (getTypeDetails().getAllowedValues() != null) { - sb.append(" Allowed Values: "); - for (String s : getTypeDetails().getAllowedValues()) { - sb.append(s).append("|"); - } - } - return sb.toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/StateVariableAllowedValueRange.java b/app/src/main/java/org/fourthline/cling/model/meta/StateVariableAllowedValueRange.java deleted file mode 100644 index ffa2a5e..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/StateVariableAllowedValueRange.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -import org.fourthline.cling.model.Validatable; -import org.fourthline.cling.model.ValidationError; - -import java.util.List; -import java.util.ArrayList; -import java.util.logging.Logger; - -/** - * Integrity rule for a state variable, restricting its values to a range with steps. - *

- * TODO: The question here is: Are they crazy enough to use this for !integer (e.g. floating point) numbers? - * - * @author Christian Bauer - */ -public class StateVariableAllowedValueRange implements Validatable { - - final private static Logger log = Logger.getLogger(StateVariableAllowedValueRange.class.getName()); - - final private long minimum; - final private long maximum; - final private long step; - - public StateVariableAllowedValueRange(long minimum, long maximum) { - this(minimum, maximum, 1); - } - - public StateVariableAllowedValueRange(long minimum, long maximum, long step) { - if (minimum > maximum) { - log.warning("UPnP specification violation, allowed value range minimum '" + minimum - + "' is greater than maximum '" + maximum + "', switching values."); - this.minimum = maximum; - this.maximum = minimum; - } else { - this.minimum = minimum; - this.maximum = maximum; - } - this.step = step; - } - - public long getMinimum() { - return minimum; - } - - public long getMaximum() { - return maximum; - } - - public long getStep() { - return step; - } - - public boolean isInRange(long value) { - return value >= getMinimum() && value <= getMaximum() && (value % step) == 0; - } - - public List validate() { - return new ArrayList(); - } - - @Override - public String toString() { - return "Range Min: " + getMinimum() + " Max: " + getMaximum() + " Step: " + getStep(); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/meta/StateVariableEventDetails.java b/app/src/main/java/org/fourthline/cling/model/meta/StateVariableEventDetails.java deleted file mode 100644 index 649192c..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/StateVariableEventDetails.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - -/** - * Eventing options of a state variable, including moderation settings. - * - * @author Christian Bauer - */ -public class StateVariableEventDetails { - - final private boolean sendEvents; - final private int eventMaximumRateMilliseconds; - final private int eventMinimumDelta; - - public StateVariableEventDetails() { - this(true, 0, 0); - } - - public StateVariableEventDetails(boolean sendEvents) { - this(sendEvents, 0, 0); - } - - public StateVariableEventDetails(boolean sendEvents, int eventMaximumRateMilliseconds, int eventMinimumDelta) { - this.sendEvents = sendEvents; - this.eventMaximumRateMilliseconds = eventMaximumRateMilliseconds; - this.eventMinimumDelta = eventMinimumDelta; - } - - public boolean isSendEvents() { - return sendEvents; - } - - public int getEventMaximumRateMilliseconds() { - return eventMaximumRateMilliseconds; - } - - public int getEventMinimumDelta() { - return eventMinimumDelta; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/StateVariableTypeDetails.java b/app/src/main/java/org/fourthline/cling/model/meta/StateVariableTypeDetails.java deleted file mode 100644 index ee0093f..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/StateVariableTypeDetails.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - - - -import org.fourthline.cling.model.Validatable; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.types.Datatype; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.logging.Logger; - -/** - * Type of a state variable, its default value, and integrity rules for allowed values and ranges. - * - * @author Christian Bauer - */ -public class StateVariableTypeDetails implements Validatable { - - final private static Logger log = Logger.getLogger(StateVariableTypeDetails.class.getName()); - - final private Datatype datatype; - final private String defaultValue; - final private String[] allowedValues; - final private StateVariableAllowedValueRange allowedValueRange; - - public StateVariableTypeDetails(Datatype datatype) { - this(datatype, null, null, null); - } - - public StateVariableTypeDetails(Datatype datatype, String defaultValue) { - this(datatype, defaultValue, null, null); - } - - public StateVariableTypeDetails(Datatype datatype, String defaultValue, String[] allowedValues, StateVariableAllowedValueRange allowedValueRange) { - this.datatype = datatype; - this.defaultValue = defaultValue; - this.allowedValues = allowedValues; - this.allowedValueRange = allowedValueRange; - } - - public Datatype getDatatype() { - return datatype; - } - - public String getDefaultValue() { - return defaultValue; - } - - public String[] getAllowedValues() { - // TODO: UPNP VIOLATION: DirecTV HR23/700 High Definition DVR Receiver has invalid default value - if (!foundDefaultInAllowedValues(defaultValue, allowedValues)) { - List list = new ArrayList(Arrays.asList(allowedValues)); - list.add(getDefaultValue()); - return list.toArray(new String[list.size()]); - } - return allowedValues; - } - - public StateVariableAllowedValueRange getAllowedValueRange() { - return allowedValueRange; - } - - protected boolean foundDefaultInAllowedValues(String defaultValue, String[] allowedValues) { - if (defaultValue == null || allowedValues == null) return true; - for (String s : allowedValues) { - if (s.equals(defaultValue)) return true; - } - return false; - } - - public List validate() { - List errors = new ArrayList(); - - if (getDatatype() == null) { - errors.add(new ValidationError( - getClass(), - "datatype", - "Service state variable has no datatype" - )); - } - - if (getAllowedValues() != null) { - - if (getAllowedValueRange() != null) { - errors.add(new ValidationError( - getClass(), - "allowedValues", - "Allowed value list of state variable can not also be restricted with allowed value range" - )); - } - - if (!Datatype.Builtin.STRING.equals(getDatatype().getBuiltin())) { - errors.add(new ValidationError( - getClass(), - "allowedValues", - "Allowed value list of state variable only available for string datatype, not: " + getDatatype() - )); - } - - for (String s : getAllowedValues()) { - if (s.length() > 31) { - log.warning("UPnP specification violation, allowed value string must be less than 32 chars: " + s); - } - } - - if(!foundDefaultInAllowedValues(defaultValue, allowedValues)) { - log.warning("UPnP specification violation, allowed string values " + - "don't contain default value: " + defaultValue - ); - } - } - - if (getAllowedValueRange() != null) { - errors.addAll(getAllowedValueRange().validate()); - } - - return errors; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/meta/UDAVersion.java b/app/src/main/java/org/fourthline/cling/model/meta/UDAVersion.java deleted file mode 100644 index a4d54c7..0000000 --- a/app/src/main/java/org/fourthline/cling/model/meta/UDAVersion.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.meta; - - - - -import org.fourthline.cling.model.Validatable; -import org.fourthline.cling.model.ValidationError; - -import java.util.List; -import java.util.ArrayList; - -/** - * Version of the UPnP Device Architecture (UDA), defaults to 1.0. - * - * @author Christian Bauer - */ -public class UDAVersion implements Validatable { - - private int major = 1; - private int minor = 0; - - public UDAVersion() { - } - - public UDAVersion(int major, int minor) { - this.major = major; - this.minor = minor; - } - - public int getMajor() { - return major; - } - - public int getMinor() { - return minor; - } - - public List validate() { - List errors = new ArrayList(); - - if (getMajor() != 1) { - errors.add(new ValidationError( - getClass(), - "major", - "UDA major spec version must be 1" - )); - } - if (getMajor() < 0) { - errors.add(new ValidationError( - getClass(), - "minor", - "UDA minor spec version must be equal or greater 0" - )); - } - - return errors; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/profile/ClientInfo.java b/app/src/main/java/org/fourthline/cling/model/profile/ClientInfo.java deleted file mode 100644 index 9a2ad28..0000000 --- a/app/src/main/java/org/fourthline/cling/model/profile/ClientInfo.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.profile; - -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.message.header.UserAgentHeader; - -/** - * Encapsulates information about a (local) client. - * - * @author Christian Bauer - */ -public class ClientInfo { - - final protected UpnpHeaders requestHeaders; - - public ClientInfo() { - this(new UpnpHeaders()); - } - - public ClientInfo(UpnpHeaders requestHeaders) { - this.requestHeaders = requestHeaders; - } - - public UpnpHeaders getRequestHeaders() { - return requestHeaders; - } - - public String getRequestUserAgent() { - return getRequestHeaders().getFirstHeaderString(UpnpHeader.Type.USER_AGENT); - } - - public void setRequestUserAgent(String userAgent) { - getRequestHeaders().add(UpnpHeader.Type.USER_AGENT, new UserAgentHeader(userAgent)); - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") User-Agent: " + getRequestUserAgent(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/profile/DeviceDetailsProvider.java b/app/src/main/java/org/fourthline/cling/model/profile/DeviceDetailsProvider.java deleted file mode 100644 index 9bb5748..0000000 --- a/app/src/main/java/org/fourthline/cling/model/profile/DeviceDetailsProvider.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.profile; - -import org.fourthline.cling.model.meta.DeviceDetails; - -/** - * Provides custom device details metadata based on control point profile. - *

- * Use this instead of {@link DeviceDetails} when you create a - * {@link org.fourthline.cling.model.meta.LocalDevice} if dynamic metadata is - * required - e.g. when your control points expect different DLNA capabilities - * or if they are otherwise incompatible with the standard metadata of the - * service you provide. You can then provide custom metadata for each - * control point based on the detected control point information. - *

- *

- * Don't forget to provide a default, that is, if none of your conditions match - * you still have to provide a minimal {@link DeviceDetails} instance for - * generic control points. - *

- * - * @author Mario Franco - * @author Christian Bauer - */ -public interface DeviceDetailsProvider { - DeviceDetails provide(RemoteClientInfo info); -} diff --git a/app/src/main/java/org/fourthline/cling/model/profile/HeaderDeviceDetailsProvider.java b/app/src/main/java/org/fourthline/cling/model/profile/HeaderDeviceDetailsProvider.java deleted file mode 100644 index f4e73be..0000000 --- a/app/src/main/java/org/fourthline/cling/model/profile/HeaderDeviceDetailsProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.profile; - -import org.fourthline.cling.model.meta.DeviceDetails; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -/** - * Selects device details based on a regex and the client's HTTP headers. - *

- * This provider will lookup and match a {@link DeviceDetails} entry in a - * given map that is keyed by HTTP header name and a regular expression pattern. - * If the control point sent an HTTP header that matches an entry's name, - * and the value of the control points header matches the pattern of the entry, - * the value of the entry is applied. This is a case-insensitive pattern match. - *

- * - * @author Mario Franco - * @author Christian Bauer - */ -public class HeaderDeviceDetailsProvider implements DeviceDetailsProvider { - - public static class Key { - - final String headerName; - final String valuePattern; - final Pattern pattern; - - public Key(String headerName, String valuePattern) { - this.headerName = headerName; - this.valuePattern = valuePattern; - this.pattern = Pattern.compile(valuePattern, Pattern.CASE_INSENSITIVE); - } - - public String getHeaderName() { - return headerName; - } - - public String getValuePattern() { - return valuePattern; - } - - public boolean isValuePatternMatch(String value) { - return pattern.matcher(value).matches(); - } - } - - - final private DeviceDetails defaultDeviceDetails; - final private Map headerDetails; - - public HeaderDeviceDetailsProvider(DeviceDetails defaultDeviceDetails) { - this(defaultDeviceDetails, null); - } - - public HeaderDeviceDetailsProvider(DeviceDetails defaultDeviceDetails, - Map headerDetails) { - this.defaultDeviceDetails = defaultDeviceDetails; - this.headerDetails = headerDetails != null ? headerDetails : new HashMap(); - } - - public DeviceDetails getDefaultDeviceDetails() { - return defaultDeviceDetails; - } - - public Map getHeaderDetails() { - return headerDetails; - } - - public DeviceDetails provide(RemoteClientInfo info) { - if (info == null || info.getRequestHeaders().isEmpty()) return getDefaultDeviceDetails(); - - for (Key key : getHeaderDetails().keySet()) { - List headerValues; - if ((headerValues = info.getRequestHeaders().get(key.getHeaderName())) == null) continue; - for (String headerValue : headerValues) { - if (key.isValuePatternMatch(headerValue)) - return getHeaderDetails().get(key); - } - } - return getDefaultDeviceDetails(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/profile/RemoteClientInfo.java b/app/src/main/java/org/fourthline/cling/model/profile/RemoteClientInfo.java deleted file mode 100644 index 2036e23..0000000 --- a/app/src/main/java/org/fourthline/cling/model/profile/RemoteClientInfo.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.profile; - -import org.fourthline.cling.model.message.Connection; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.message.header.UserAgentHeader; -import org.seamless.http.RequestInfo; - -import java.net.InetAddress; - -/** - * Encapsulates information about a remote control point, the client. - * - *

- * The {@link #getExtraResponseHeaders()} method offers modifiable HTTP headers which will - * be added to the responses and returned to the client. - *

- * - * @author Christian Bauer - */ -public class RemoteClientInfo extends ClientInfo { - - final protected Connection connection; - final protected UpnpHeaders extraResponseHeaders = new UpnpHeaders(); - - public RemoteClientInfo() { - this(null); - } - - public RemoteClientInfo(StreamRequestMessage requestMessage) { - this(requestMessage != null ? requestMessage.getConnection() : null, - requestMessage != null ? requestMessage.getHeaders() : new UpnpHeaders()); - } - - public RemoteClientInfo(Connection connection, UpnpHeaders requestHeaders) { - super(requestHeaders); - this.connection = connection; - } - - public Connection getConnection() { - return connection; - } - - /** - *

- * Check if the remote client's connection is still open. - *

- *

- * How connection checking is actually performed is transport-implementation dependent. Usually, - * the {@link org.fourthline.cling.transport.spi.StreamServer} will send meaningless heartbeat - * data to the client on its (open) socket. If that fails, the client's connection has been - * closed. Note that some HTTP clients can NOT handle such garbage data in HTTP - * responses, hence calling this method might cause compatibility issues. - *

- * @return true if the remote client's connection was closed. - */ - public boolean isRequestCancelled() { - return !getConnection().isOpen(); - } - - /** - * @throws InterruptedException if {@link #isRequestCancelled()} returns true. - */ - public void throwIfRequestCancelled() throws InterruptedException{ - if(isRequestCancelled()) - throw new InterruptedException("Client's request cancelled"); - } - - public InetAddress getRemoteAddress() { - return getConnection().getRemoteAddress(); - } - - public InetAddress getLocalAddress() { - return getConnection().getLocalAddress(); - } - - public UpnpHeaders getExtraResponseHeaders() { - return extraResponseHeaders; - } - - public void setResponseUserAgent(String userAgent) { - setResponseUserAgent(new UserAgentHeader(userAgent)); - } - - public void setResponseUserAgent(UserAgentHeader userAgentHeader) { - getExtraResponseHeaders().add( - UpnpHeader.Type.USER_AGENT, - userAgentHeader - ); - } - - // TODO: Remove this once we know how ClientProfile will look like - public boolean isWMPRequest() { - return RequestInfo.isWMPRequest(getRequestUserAgent()); - } - - public boolean isXbox360Request() { - return RequestInfo.isXbox360Request( - getRequestUserAgent(), - getRequestHeaders().getFirstHeaderString(UpnpHeader.Type.SERVER) - ); - } - - public boolean isPS3Request() { - return RequestInfo.isPS3Request( - getRequestUserAgent(), - getRequestHeaders().getFirstHeaderString(UpnpHeader.Type.EXT_AV_CLIENT_INFO) - ); - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") Remote Address: " + getRemoteAddress(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/resource/DeviceDescriptorResource.java b/app/src/main/java/org/fourthline/cling/model/resource/DeviceDescriptorResource.java deleted file mode 100644 index 0818541..0000000 --- a/app/src/main/java/org/fourthline/cling/model/resource/DeviceDescriptorResource.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.resource; - -import org.fourthline.cling.model.meta.LocalDevice; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class DeviceDescriptorResource extends Resource { - - public DeviceDescriptorResource(URI localURI, LocalDevice model) { - super(localURI, model); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/resource/IconResource.java b/app/src/main/java/org/fourthline/cling/model/resource/IconResource.java deleted file mode 100644 index 8190a61..0000000 --- a/app/src/main/java/org/fourthline/cling/model/resource/IconResource.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.resource; - -import org.fourthline.cling.model.meta.Icon; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class IconResource extends Resource { - - public IconResource(URI localURI, Icon model) { - super(localURI, model); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/resource/Resource.java b/app/src/main/java/org/fourthline/cling/model/resource/Resource.java deleted file mode 100644 index 1f4b128..0000000 --- a/app/src/main/java/org/fourthline/cling/model/resource/Resource.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.resource; - -import org.fourthline.cling.model.ExpirationDetails; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.List; - -/** - * An addressable object, stored, managed, and accessible through the {@link org.fourthline.cling.registry.Registry}. - * - * @param The type of the model object. - * - * @author Christian Bauer - */ -public class Resource { - - private URI pathQuery; - private M model; - - /** - * @param pathQuery The path and (optional) query URI parts of this resource. - * @param model The model object. - */ - public Resource(URI pathQuery, M model) { - try { - this.pathQuery = new URI(null, null, pathQuery.getPath(), pathQuery.getQuery(), null); - } catch (URISyntaxException ex) { - throw new RuntimeException(ex); - } - this.model = model; - if (model == null) { - throw new IllegalArgumentException("Model instance must not be null"); - } - } - - public URI getPathQuery() { - return pathQuery; - } - - public M getModel() { - return model; - } - - - /** - * @param pathQuery A relative URI. - * @return true if the given URI path and query matches the resource's path and query. - */ - public boolean matches(URI pathQuery) { - return pathQuery.equals(getPathQuery()); - } - - /** - * Called periodically by the registry to maintain the resource. - *

- * NOOP by default. - *

- * - * @param pendingExecutions Add Runnable's to this collection if maintenance code has to run in the background. - * @param expirationDetails The details of this resource's expiration, e.g. when it will expire. - */ - public void maintain(List pendingExecutions, - ExpirationDetails expirationDetails) { - // Do nothing - } - - /** - * Called by the registry when it stops, in the shutdown thread. - *

- * NOOP by default. - *

- */ - public void shutdown() { - // Do nothing - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Resource resource = (Resource) o; - - if (!getPathQuery().equals(resource.getPathQuery())) return false; - - return true; - } - - @Override - public int hashCode() { - return getPathQuery().hashCode(); - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") URI: " + getPathQuery(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/resource/ServiceControlResource.java b/app/src/main/java/org/fourthline/cling/model/resource/ServiceControlResource.java deleted file mode 100644 index ee8d7b4..0000000 --- a/app/src/main/java/org/fourthline/cling/model/resource/ServiceControlResource.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.resource; - -import org.fourthline.cling.model.meta.LocalService; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class ServiceControlResource extends Resource { - - public ServiceControlResource(URI localURI, LocalService model) { - super(localURI, model); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/resource/ServiceDescriptorResource.java b/app/src/main/java/org/fourthline/cling/model/resource/ServiceDescriptorResource.java deleted file mode 100644 index 071bb13..0000000 --- a/app/src/main/java/org/fourthline/cling/model/resource/ServiceDescriptorResource.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.resource; - -import org.fourthline.cling.model.meta.LocalService; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class ServiceDescriptorResource extends Resource { - - public ServiceDescriptorResource(URI localURI, LocalService model) { - super(localURI, model); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/resource/ServiceEventCallbackResource.java b/app/src/main/java/org/fourthline/cling/model/resource/ServiceEventCallbackResource.java deleted file mode 100644 index b782284..0000000 --- a/app/src/main/java/org/fourthline/cling/model/resource/ServiceEventCallbackResource.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.resource; - -import org.fourthline.cling.model.meta.RemoteService; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class ServiceEventCallbackResource extends Resource { - - public ServiceEventCallbackResource(URI localURI, RemoteService model) { - super(localURI, model); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/resource/ServiceEventSubscriptionResource.java b/app/src/main/java/org/fourthline/cling/model/resource/ServiceEventSubscriptionResource.java deleted file mode 100644 index 695f4b7..0000000 --- a/app/src/main/java/org/fourthline/cling/model/resource/ServiceEventSubscriptionResource.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.resource; - -import org.fourthline.cling.model.meta.LocalService; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class ServiceEventSubscriptionResource extends Resource { - - public ServiceEventSubscriptionResource(URI localURI, LocalService model) { - super(localURI, model); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/state/FieldStateVariableAccessor.java b/app/src/main/java/org/fourthline/cling/model/state/FieldStateVariableAccessor.java deleted file mode 100644 index fb8c0df..0000000 --- a/app/src/main/java/org/fourthline/cling/model/state/FieldStateVariableAccessor.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.state; - -import org.seamless.util.Reflections; - -import java.lang.reflect.Field; - -/** - * Reads the value of a state variable using reflection and a field. - * - * @author Christian Bauer - */ -public class FieldStateVariableAccessor extends StateVariableAccessor { - - protected Field field; - - public FieldStateVariableAccessor(Field field) { - this.field = field; - } - - public Field getField() { - return field; - } - - @Override - public Class getReturnType() { - return getField().getType(); - } - - @Override - public Object read(Object serviceImpl) throws Exception { - return Reflections.get(field, serviceImpl); - } - - @Override - public String toString() { - return super.toString() + " Field: " + getField(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/state/GetterStateVariableAccessor.java b/app/src/main/java/org/fourthline/cling/model/state/GetterStateVariableAccessor.java deleted file mode 100644 index 6eb0df1..0000000 --- a/app/src/main/java/org/fourthline/cling/model/state/GetterStateVariableAccessor.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.state; - -import org.seamless.util.Reflections; - -import java.lang.reflect.Method; - -/** - * Reads the value of a state variable using reflection and a getter method. - * - * @author Christian Bauer - */ -public class GetterStateVariableAccessor extends StateVariableAccessor { - - private Method getter; - - public GetterStateVariableAccessor(Method getter) { - this.getter = getter; - } - - public Method getGetter() { - return getter; - } - - @Override - public Class getReturnType() { - return getGetter().getReturnType(); - } - - @Override - public Object read(Object serviceImpl) throws Exception { - return Reflections.invoke(getGetter(), serviceImpl); - } - - @Override - public String toString() { - return super.toString() + " Method: " + getGetter(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/state/StateVariableAccessor.java b/app/src/main/java/org/fourthline/cling/model/state/StateVariableAccessor.java deleted file mode 100644 index 4e78b61..0000000 --- a/app/src/main/java/org/fourthline/cling/model/state/StateVariableAccessor.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.state; - -import org.fourthline.cling.model.Command; -import org.fourthline.cling.model.ServiceManager; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.meta.StateVariable; - - -/** - * Reads the value of a state variable, given an instance that implements the service. - * - * TODO: The design of this is not final, not happy with the relationship between ActionExecutor and this. - * - * @author Christian Bauer - */ -public abstract class StateVariableAccessor { - - public StateVariableValue read(final StateVariable stateVariable, final Object serviceImpl) throws Exception { - - class AccessCommand implements Command { - Object result; - public void execute(ServiceManager serviceManager) throws Exception { - result = read(serviceImpl); - if (stateVariable.getService().isStringConvertibleType(result)) { - result = result.toString(); - } - } - } - - AccessCommand cmd = new AccessCommand(); - stateVariable.getService().getManager().execute(cmd); - return new StateVariableValue(stateVariable, cmd.result); - } - - public abstract Class getReturnType(); - - // TODO: Especially this shouldn't be public - public abstract Object read(Object serviceImpl) throws Exception; - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ")"; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/state/StateVariableValue.java b/app/src/main/java/org/fourthline/cling/model/state/StateVariableValue.java deleted file mode 100644 index c034f5f..0000000 --- a/app/src/main/java/org/fourthline/cling/model/state/StateVariableValue.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.state; - -import org.fourthline.cling.model.VariableValue; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * Represents the value of a state variable. - * - * @author Christian Bauer - */ -public class StateVariableValue extends VariableValue { - - private StateVariable stateVariable; - - public StateVariableValue(StateVariable stateVariable, Object value) throws InvalidValueException { - super(stateVariable.getTypeDetails().getDatatype(), value); - this.stateVariable = stateVariable; - } - - public StateVariable getStateVariable() { - return stateVariable; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/AbstractDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/AbstractDatatype.java deleted file mode 100644 index d37e78b..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/AbstractDatatype.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import java.lang.reflect.ParameterizedType; - -/** - * @author Christian Bauer - */ -public abstract class AbstractDatatype implements Datatype { - - private Builtin builtin; - - protected Class getValueType() { - return (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; - } - - @Override - public boolean isHandlingJavaType(Class type) { - return getValueType().isAssignableFrom(type); - } - - @Override - public V valueOf(String s) throws InvalidValueException { - return null; - } - - public Builtin getBuiltin() { - return builtin; - } - - public void setBuiltin(Builtin builtin) { - this.builtin = builtin; - } - - public String getString(V value) throws InvalidValueException { - if (value == null) return ""; - if (!isValid(value)) { - throw new InvalidValueException("Value is not valid: " + value); - } - return value.toString(); - } - - public boolean isValid(V value) { - return value == null || getValueType().isAssignableFrom(value.getClass()); - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ")"; - } - - public String getDisplayString() { - if (this instanceof CustomDatatype) { - return ((CustomDatatype)this).getName(); - } else if (getBuiltin() != null) { - return getBuiltin().getDescriptorName(); - } else { - return getValueType().getSimpleName(); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/Base64Datatype.java b/app/src/main/java/org/fourthline/cling/model/types/Base64Datatype.java deleted file mode 100644 index 4340543..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/Base64Datatype.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import org.seamless.util.io.Base64Coder; - -/** - * @author Christian Bauer - */ -public class Base64Datatype extends AbstractDatatype { - - public Base64Datatype() { - } - - public Class getValueType() { - return byte[].class; - } - - public byte[] valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - try { - return Base64Coder.decode(s); - } catch (Exception ex) { - throw new InvalidValueException(ex.getMessage(), ex); - } - } - - @Override - public String getString(byte[] value) throws InvalidValueException { - if (value == null) return ""; - try { - return new String(Base64Coder.encode(value)); - } catch (Exception ex) { - throw new InvalidValueException(ex.getMessage(), ex); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/BinHexDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/BinHexDatatype.java deleted file mode 100644 index f21a8a8..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/BinHexDatatype.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import org.seamless.util.io.HexBin; - -/** - * @author Christian Bauer - */ -public class BinHexDatatype extends AbstractDatatype { - - public BinHexDatatype() { - } - - public Class getValueType() { - return byte[].class; - } - - public byte[] valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - try { - return HexBin.stringToBytes(s); - } catch (Exception ex) { - throw new InvalidValueException(ex.getMessage(), ex); - } - } - - @Override - public String getString(byte[] value) throws InvalidValueException { - if (value == null) return ""; - try { - return HexBin.bytesToString(value); - } catch (Exception ex) { - throw new InvalidValueException(ex.getMessage(), ex); - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/BooleanDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/BooleanDatatype.java deleted file mode 100644 index 88330ee..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/BooleanDatatype.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import java.util.Locale; - -/** - * @author Christian Bauer - */ -public class BooleanDatatype extends AbstractDatatype { - - public BooleanDatatype() { - } - - @Override - public boolean isHandlingJavaType(Class type) { - return type == Boolean.TYPE || Boolean.class.isAssignableFrom(type); - } - - public Boolean valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - if (s.equals("1") || s.toUpperCase(Locale.ENGLISH).equals("YES") || s.toUpperCase(Locale.ENGLISH).equals("TRUE")) { - return true; - } else if (s.equals("0") || s.toUpperCase(Locale.ENGLISH).equals("NO") || s.toUpperCase(Locale.ENGLISH).equals("FALSE")) { - return false; - } else { - throw new InvalidValueException("Invalid boolean value string: " + s); - } - } - - public String getString(Boolean value) throws InvalidValueException { - if (value == null) return ""; - return value ? "1" : "0"; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/BytesRange.java b/app/src/main/java/org/fourthline/cling/model/types/BytesRange.java deleted file mode 100644 index e826f30..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/BytesRange.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.model.types; - -/** - * - * @author Mario Franco - */ -public class BytesRange { - - public static final String PREFIX = "bytes="; - - private Long firstByte; - private Long lastByte; - private Long byteLength; - - public BytesRange(Long firstByte, Long lastByte) { - this.firstByte = firstByte; - this.lastByte = lastByte; - this.byteLength = null; - } - - public BytesRange(Long firstByte, Long lastByte, Long byteLength) { - this.firstByte = firstByte; - this.lastByte = lastByte; - this.byteLength = byteLength; - } - - /** - * @return the firstByte - */ - public Long getFirstByte() { - return firstByte; - } - - /** - * @return the lastByte - */ - public Long getLastByte() { - return lastByte; - } - - /** - * @return the byteLength - */ - public Long getByteLength() { - return byteLength; - } - - /** - * - * @return String format of Bytes Range for response message header - */ - public String getString() { - return getString(false,null); - } - - /** - * - * @return String format of Bytes Range for response message header - */ - public String getString(boolean includeDuration) { - return getString(includeDuration,null); - } - - /** - * - * @return String format of Bytes Range for response message header - */ - public String getString(boolean includeDuration, String rangePrefix) { - String s = (rangePrefix!=null)?rangePrefix:PREFIX; - - if (firstByte!=null) - s += firstByte.toString(); - s += "-"; - if (lastByte!=null) - s+= lastByte.toString(); - if (includeDuration) { - s += "/" + (byteLength != null ? byteLength.toString() : "*"); - } - - return s; - } - - public static BytesRange valueOf(String s) throws InvalidValueException { - return valueOf(s,null); - } - - public static BytesRange valueOf(String s, String rangePrefix) throws InvalidValueException { - if (s.startsWith((rangePrefix!=null)?rangePrefix:PREFIX)) { - Long firstByte=null, lastByte = null, byteLength = null; - String[] params = s.substring( ((rangePrefix!=null)?rangePrefix:PREFIX).length()).split("[-/]"); - switch (params.length) { - case 3: - if (params[2].length() != 0 && !params[2].equals("*")) { - byteLength = Long.parseLong(params[2]); - } - case 2: - if (params[1].length() != 0) { - lastByte = Long.parseLong(params[1]); - } - case 1: - if (params[0].length() != 0) { - firstByte = Long.parseLong(params[0]); - } - if (firstByte!=null || lastByte!= null) - return new BytesRange(firstByte, lastByte, byteLength); - default: - break; - } - } - - throw new InvalidValueException("Can't parse Bytes Range: " + s); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/CharacterDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/CharacterDatatype.java deleted file mode 100644 index 42453c9..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/CharacterDatatype.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * @author Christian Bauer - */ -public class CharacterDatatype extends AbstractDatatype { - - public CharacterDatatype() { - } - - @Override - public boolean isHandlingJavaType(Class type) { - return type == Character.TYPE || Character.class.isAssignableFrom(type); - } - - public Character valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - return s.charAt(0); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/CustomDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/CustomDatatype.java deleted file mode 100644 index 2478981..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/CustomDatatype.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * @author Christian Bauer - */ -public class CustomDatatype extends AbstractDatatype { - - private String name; - - public CustomDatatype(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public String valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - return s; - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") '" + getName() + "'"; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/DLNACaps.java b/app/src/main/java/org/fourthline/cling/model/types/DLNACaps.java deleted file mode 100644 index f51ff02..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/DLNACaps.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import org.fourthline.cling.model.ModelUtil; - -import java.util.Arrays; - -/** - * An arbitrary list of comma-separated elements, representing DLNA capabilities (whatever that is). - * - * @author Christian Bauer - */ -public class DLNACaps { - - final String[] caps; - - public DLNACaps(String[] caps) { - this.caps = caps; - } - - public String[] getCaps() { - return caps; - } - - static public DLNACaps valueOf(String s) throws InvalidValueException { - if (s == null || s.length() == 0) return new DLNACaps(new String[0]); - String[] caps = s.split(","); - String[] trimmed = new String[caps.length]; - for (int i = 0; i < caps.length; i++) { - trimmed[i] = caps[i].trim(); - } - return new DLNACaps(trimmed); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - DLNACaps dlnaCaps = (DLNACaps) o; - - if (!Arrays.equals(caps, dlnaCaps.caps)) return false; - - return true; - } - - @Override - public int hashCode() { - return Arrays.hashCode(caps); - } - - @Override - public String toString() { - return ModelUtil.toCommaSeparatedList(getCaps()); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/DLNADoc.java b/app/src/main/java/org/fourthline/cling/model/types/DLNADoc.java deleted file mode 100644 index 46384a0..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/DLNADoc.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Representing the DLNA document and its version. - *

- * Someone ignored the device and service type construct of UPnP - * and invented a new and of course much better device type/version * construct. - *

- * - * @author Christian Bauer - */ -public class DLNADoc { - - public static final Pattern PATTERN = Pattern.compile("(.+?)[ -]([0-9].[0-9]{2})"); - - public enum Version { - V1_0("1.00"), - V1_5("1.50"); - - String s; - - Version(String s) { - this.s = s; - } - - - @Override - public String toString() { - return s; - } - } - - final private String devClass; - final private String version; - - public DLNADoc(String devClass, String version) { - this.devClass = devClass; - this.version = version; - } - - public DLNADoc(String devClass, Version version) { - this.devClass = devClass; - this.version = version.s; - } - - public String getDevClass() { - return devClass; - } - - public String getVersion() { - return version; - } - - public static DLNADoc valueOf(String s) throws InvalidValueException { - Matcher matcher = PATTERN.matcher(s); - if (matcher.matches()) { - return new DLNADoc(matcher.group(1), matcher.group(2)); - } else { - throw new InvalidValueException("Can't parse DLNADoc: " + s); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - DLNADoc dlnaDoc = (DLNADoc) o; - - if (!devClass.equals(dlnaDoc.devClass)) return false; - if (!version.equals(dlnaDoc.version)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = devClass.hashCode(); - result = 31 * result + version.hashCode(); - return result; - } - - @Override - public String toString() { - return getDevClass() + "-" + getVersion(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/Datatype.java b/app/src/main/java/org/fourthline/cling/model/types/Datatype.java deleted file mode 100644 index 1787390..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/Datatype.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import java.util.Calendar; -import java.util.HashMap; -import java.util.Map; -import java.util.Locale; - -/** - * The type of a state variable value, able to convert to/from string representation. - * - * @param The Java type of the value handled by this datatype. - * @author Christian Bauer - */ -public interface Datatype { - - /** - * Mapping from Java type to UPnP built-in type. - *

- * This map is used for service binding, when we have to figure out - * the type of a UPnP state variable by reflecting on a method or field of - * a service class. From a known Java type we default to a UPnP built-in type. - * This is just a list of default mappings between Java and UPnP types. There - * might be more than this/more than one UPnP type that can handle a given - * Java type. - *

- */ - public static enum Default { - - BOOLEAN(Boolean.class, Builtin.BOOLEAN), - BOOLEAN_PRIMITIVE(Boolean.TYPE, Builtin.BOOLEAN), - SHORT(Short.class, Builtin.I2_SHORT), - SHORT_PRIMITIVE(Short.TYPE, Builtin.I2_SHORT), - INTEGER(Integer.class, Builtin.I4), - INTEGER_PRIMITIVE(Integer.TYPE, Builtin.I4), - UNSIGNED_INTEGER_ONE_BYTE(UnsignedIntegerOneByte.class, Builtin.UI1), - UNSIGNED_INTEGER_TWO_BYTES(UnsignedIntegerTwoBytes.class, Builtin.UI2), - UNSIGNED_INTEGER_FOUR_BYTES(UnsignedIntegerFourBytes.class, Builtin.UI4), - FLOAT(Float.class, Builtin.R4), - FLOAT_PRIMITIVE(Float.TYPE, Builtin.R4), - DOUBLE(Double.class, Builtin.FLOAT), - DOUBLE_PRIMTIIVE(Double.TYPE, Builtin.FLOAT), - CHAR(Character.class, Builtin.CHAR), - CHAR_PRIMITIVE(Character.TYPE, Builtin.CHAR), - STRING(String.class, Builtin.STRING), - CALENDAR(Calendar.class, Builtin.DATETIME), - BYTES(byte[].class, Builtin.BIN_BASE64), - URI(java.net.URI.class, Builtin.URI); - - private Class javaType; - private Builtin builtinType; - - Default(Class javaType, Builtin builtinType) { - this.javaType = javaType; - this.builtinType = builtinType; - } - - public Class getJavaType() { - return javaType; - } - - public Builtin getBuiltinType() { - return builtinType; - } - - public static Default getByJavaType(Class javaType) { - for (Default d : Default.values()) { - if (d.getJavaType().equals(javaType)) { - return d; - } - } - return null; - } - - @Override - public String toString() { - return getJavaType() + " => " + getBuiltinType(); - } - } - - /** - * Mapping from UPnP built-in standardized type to actual subtype of {@link Datatype}. - */ - public static enum Builtin { - - UI1("ui1", new UnsignedIntegerOneByteDatatype()), - UI2("ui2", new UnsignedIntegerTwoBytesDatatype()), - UI4("ui4", new UnsignedIntegerFourBytesDatatype()), - I1("i1", new IntegerDatatype(1)), - I2("i2", new IntegerDatatype(2)), - I2_SHORT("i2", new ShortDatatype()), - I4("i4", new IntegerDatatype(4)), - INT("int", new IntegerDatatype(4)), - R4("r4", new FloatDatatype()), - R8("r8", new DoubleDatatype()), - NUMBER("number", new DoubleDatatype()), - FIXED144("fixed.14.4", new DoubleDatatype()), - FLOAT("float", new DoubleDatatype()), // TODO: Is that Double or Float? - CHAR("char", new CharacterDatatype()), - STRING("string", new StringDatatype()), - DATE("date", new DateTimeDatatype( - new String[]{"yyyy-MM-dd"}, - "yyyy-MM-dd" - )), - DATETIME("dateTime", new DateTimeDatatype( - new String[]{"yyyy-MM-dd", "yyyy-MM-dd'T'HH:mm:ss"}, - "yyyy-MM-dd'T'HH:mm:ss" - )), - DATETIME_TZ("dateTime.tz", new DateTimeDatatype( - new String[]{"yyyy-MM-dd", "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd'T'HH:mm:ssZ"}, - "yyyy-MM-dd'T'HH:mm:ssZ" - )), - TIME("time", new DateTimeDatatype( - new String[]{"HH:mm:ss"}, - "HH:mm:ss" - )), - TIME_TZ("time.tz", new DateTimeDatatype( - new String[]{"HH:mm:ssZ", "HH:mm:ss"}, - "HH:mm:ssZ" - )), - BOOLEAN("boolean", new BooleanDatatype()), - BIN_BASE64("bin.base64", new Base64Datatype()), - BIN_HEX("bin.hex", new BinHexDatatype()), - URI("uri", new URIDatatype()), - UUID("uuid", new StringDatatype()); - - private static Map byName = new HashMap() {{ - for (Builtin b : Builtin.values()) { - // Lowercase descriptor name! - if (containsKey(b.getDescriptorName().toLowerCase(Locale.ENGLISH))) - continue; // Ignore double-declarations, take first one only - put(b.getDescriptorName().toLowerCase(Locale.ENGLISH), b); - } - }}; - - private String descriptorName; - private Datatype datatype; - - Builtin(String descriptorName, AbstractDatatype datatype) { - datatype.setBuiltin(this); // Protected, we actually want this to be immutable - this.descriptorName = descriptorName; - this.datatype = datatype; - } - - public String getDescriptorName() { - return descriptorName; - } - - public Datatype getDatatype() { - return datatype; - } - - public static Builtin getByDescriptorName(String descriptorName) { - // The UPnP spec clearly says "must be one of these values", so I'm assuming - // they are case sensitive. But we want to work with broken devices, which of - // course produce mixed upper/lowercase values. - if (descriptorName == null) return null; - return byName.get(descriptorName.toLowerCase(Locale.ENGLISH)); - } - - public static boolean isNumeric(Builtin builtin) { - return builtin != null && - (builtin.equals(UI1) || - builtin.equals(UI2) || - builtin.equals(UI4) || - builtin.equals(I1) || - builtin.equals(I2) || - builtin.equals(I4) || - builtin.equals(INT)); - } - } - - /** - * @return true if this datatype can handle values of the given Java type. - */ - public boolean isHandlingJavaType(Class type); - - /** - * @return The built-in UPnP standardized type this datatype is mapped to or - * null if this is a custom datatype. - */ - public Builtin getBuiltin(); - - /** - * @param value The value to validate or null. - * @return Returns true if the value was null, validation result otherwise. - */ - public boolean isValid(V value); - - /** - * Transforms a value supported by this datatype into a string representation. - *

- * This method calls {@link #isValid(Object)} before converting the value, it throws - * an exception if validation fails. - *

- * - * @param value The value to transform. - * @return The transformed value as a string, or an empty string when the value is null, never returns null. - * @throws InvalidValueException - */ - public String getString(V value) throws InvalidValueException; - - /** - * Transforms a string representation into a value of the supported type. - * - * @param s The string representation of a value. - * @return The converted value or null if the string was null or empty. - * @throws InvalidValueException If the string couldn't be parsed. - */ - public V valueOf(String s) throws InvalidValueException; - - /** - * @return Metadata about this datatype, a nice string for display that describes - * this datatype (e.g. concrete class name). - */ - public String getDisplayString(); - - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/DateTimeDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/DateTimeDatatype.java deleted file mode 100644 index 429c7e3..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/DateTimeDatatype.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.TimeZone; - -/** - * @author Christian Bauer - */ -public class DateTimeDatatype extends AbstractDatatype { - - protected String[] readFormats; - protected String writeFormat; - - public DateTimeDatatype(String[] readFormats, String writeFormat) { - this.readFormats = readFormats; - this.writeFormat = writeFormat; - } - - public Calendar valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - - Date d = getDateValue(s, readFormats); - if (d == null) { - throw new InvalidValueException("Can't parse date/time from: " + s); - } - - Calendar c = Calendar.getInstance(getTimeZone()); - c.setTime(d); - - /* - // TODO: I'm not sure this is necessary and I don't remember why I wrote it - if (readFormats[0].equals("HH:mm:ssZ") && (getTimeZone().inDaylightTime(d))) - c.add(Calendar.MILLISECOND, 3600000); - */ - - return c; - } - - @Override - public String getString(Calendar value) throws InvalidValueException { - if (value == null) return ""; - SimpleDateFormat sdt = new SimpleDateFormat(writeFormat); - sdt.setTimeZone(getTimeZone()); - return sdt.format(value.getTime()); - } - - protected String normalizeTimeZone(String value) { - if (value.endsWith("Z")) { - value = value.substring(0, value.length() - 1) + "+0000"; - } else if ((value.length() > 7) - && (value.charAt(value.length() - 3) == ':') - && ((value.charAt(value.length() - 6) == '-') || (value.charAt(value.length() - 6) == '+'))) { - - value = value.substring(0, value.length() - 3) + value.substring(value.length() - 2); - } - return value; - } - - protected Date getDateValue(String value, String[] formats) { - - value = normalizeTimeZone(value); - - Date d = null; - for (String format : formats) { - SimpleDateFormat sdt = new SimpleDateFormat(format); - sdt.setTimeZone(getTimeZone()); - try { - d = sdt.parse(value); - // Continue, last match is the one we need - } catch (ParseException ex) { - // Just continue - } - } - return d; - } - - protected TimeZone getTimeZone() { - return TimeZone.getDefault(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/DeviceType.java b/app/src/main/java/org/fourthline/cling/model/types/DeviceType.java deleted file mode 100644 index 67b8529..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/DeviceType.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import org.fourthline.cling.model.Constants; - -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Represents a device type, for example urn:my-domain-namespace:device:MyDevice:1. - *

- * Although decimal versions are accepted and parsed, the version used for - * comparison is only the integer without the fraction. - *

- * - * @author Christian Bauer - */ -public class DeviceType { - - final private static Logger log = Logger.getLogger(DeviceType.class.getName()); - - public static final String UNKNOWN = "UNKNOWN"; - - public static final Pattern PATTERN = - Pattern.compile("urn:(" + Constants.REGEX_NAMESPACE + "):device:(" + Constants.REGEX_TYPE + "):([0-9]+).*"); - - private String namespace; - private String type; - private int version = 1; - - public DeviceType(String namespace, String type) { - this(namespace, type, 1); - } - - public DeviceType(String namespace, String type, int version) { - if (namespace != null && !namespace.matches(Constants.REGEX_NAMESPACE)) { - throw new IllegalArgumentException("Device type namespace contains illegal characters"); - } - this.namespace = namespace; - - if (type != null && !type.matches(Constants.REGEX_TYPE)) { - throw new IllegalArgumentException("Device type suffix too long (64) or contains illegal characters"); - } - this.type = type; - - this.version = version; - } - - public String getNamespace() { - return namespace; - } - - public String getType() { - return type; - } - - public int getVersion() { - return version; - } - - /** - * @return Either a {@link UDADeviceType} or a more generic {@link DeviceType}. - */ - public static DeviceType valueOf(String s) throws InvalidValueException { - - DeviceType deviceType = null; - - // Sometimes crazy UPnP devices deliver spaces in a URN, don't ask... - s = s.replaceAll("\\s", ""); - - // First try UDADeviceType parse - try { - deviceType = UDADeviceType.valueOf(s); - } catch (Exception ex) { - // Ignore - } - - if (deviceType != null) - return deviceType; - - // Now try a generic DeviceType parse - Matcher matcher = PATTERN.matcher(s); - if (matcher.matches()) { - return new DeviceType(matcher.group(1), matcher.group(2), Integer.valueOf(matcher.group(3))); - } - - // TODO: UPNP VIOLATION: Escient doesn't provide any device type token - // urn:schemas-upnp-org:device::1 - matcher = Pattern.compile("urn:(" + Constants.REGEX_NAMESPACE + "):device::([0-9]+).*").matcher(s); - if (matcher.matches() && matcher.groupCount() >= 2) { - log.warning("UPnP specification violation, no device type token, defaulting to " + UNKNOWN + ": " + s); - return new DeviceType(matcher.group(1), UNKNOWN, Integer.valueOf(matcher.group(2))); - } - - // TODO: UPNP VIOLATION: EyeTV Netstream uses colons in device type token - // urn:schemas-microsoft-com:service:pbda:tuner:1 - matcher = Pattern.compile("urn:(" + Constants.REGEX_NAMESPACE + "):device:(.+?):([0-9]+).*").matcher(s); - if (matcher.matches() && matcher.groupCount() >= 3) { - String cleanToken = matcher.group(2).replaceAll("[^a-zA-Z_0-9\\-]", "-"); - log.warning( - "UPnP specification violation, replacing invalid device type token '" - + matcher.group(2) - + "' with: " - + cleanToken - ); - return new DeviceType(matcher.group(1), cleanToken, Integer.valueOf(matcher.group(3))); - } - - throw new InvalidValueException("Can't parse device type string (namespace/type/version): " + s); - } - - public boolean implementsVersion(DeviceType that) { - if (!namespace.equals(that.namespace)) return false; - if (!type.equals(that.type)) return false; - if (version < that.version) return false; - return true; - } - - public String getDisplayString() { - return getType(); - } - - @Override - public String toString() { - return "urn:" + getNamespace() + ":device:" + getType()+ ":" + getVersion(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || !(o instanceof DeviceType)) return false; - - DeviceType that = (DeviceType) o; - - if (version != that.version) return false; - if (!namespace.equals(that.namespace)) return false; - if (!type.equals(that.type)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = namespace.hashCode(); - result = 31 * result + type.hashCode(); - result = 31 * result + version; - return result; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/DoubleDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/DoubleDatatype.java deleted file mode 100644 index 7b4bec4..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/DoubleDatatype.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * @author Christian Bauer - */ -public class DoubleDatatype extends AbstractDatatype { - - public DoubleDatatype() { - } - - @Override - public boolean isHandlingJavaType(Class type) { - return type == Double.TYPE || Double.class.isAssignableFrom(type); - } - - public Double valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - try { - return Double.parseDouble(s); - } catch (NumberFormatException ex) { - throw new InvalidValueException("Can't convert string to number: " + s, ex); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/ErrorCode.java b/app/src/main/java/org/fourthline/cling/model/types/ErrorCode.java deleted file mode 100644 index 564f59e..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/ErrorCode.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * Basic UPnP control message error codes. - * - * @author Christian Bauer - */ -public enum ErrorCode { - - INVALID_ACTION(401, "No action by that name at this service"), - INVALID_ARGS(402, "Not enough IN args, too many IN args, no IN arg by that name, one or more IN args are of the wrong data type"), - ACTION_FAILED(501, "Current state of service prevents invoking that action"), - ARGUMENT_VALUE_INVALID(600, "The argument value is invalid"), - ARGUMENT_VALUE_OUT_OF_RANGE(601, "An argument value is less than the minimum or more than the maximum value of the allowedValueRange, or is not in the allowedValueList"), - OPTIONAL_ACTION(602, "The requested action is optional and is not implemented by the device"), - OUT_OF_MEMORY(603, "The device does not have sufficient memory available to complete the action"), - HUMAN_INTERVENTION_REQUIRED(604, "The device has encountered an error condition which it cannot resolve itself"), - ARGUMENT_TOO_LONG(605, "A string argument is too long for the device to handle properly"), - ACTION_NOT_AUTHORIZED(606, "The action requested requires authorization and the sender was not authorized"), - SIGNATURE_FAILURE(607, "The sender's signature failed to verify"), - SIGNATURE_MISSING(608, "The action requested requires a digital signature and there was none provided"), - NOT_ENCRYPTED(609, "This action requires confidentiality but the action was not delivered encrypted"), - INVALID_SEQUENCE(610, "The sequence provided was not valid"), - INVALID_CONTROL_URL(611, "The controlURL within the freshness element does not match the controlURL of the action actually invoked"), - NO_SUCH_SESSION(612, "The session key reference is to a non-existent session"); - - private int code; - private String description; - - ErrorCode(int code, String description) { - this.code = code; - this.description = description; - } - - public int getCode() { - return code; - } - - public String getDescription() { - return description; - } - - public static ErrorCode getByCode(int code) { - for (ErrorCode errorCode : values()) { - if (errorCode.getCode() == code) - return errorCode; - } - return null; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/FloatDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/FloatDatatype.java deleted file mode 100644 index 2c197c0..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/FloatDatatype.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * @author Christian Bauer - */ -public class FloatDatatype extends AbstractDatatype { - - public FloatDatatype() { - } - - @Override - public boolean isHandlingJavaType(Class type) { - return type == Float.TYPE || Float.class.isAssignableFrom(type); - } - - public Float valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - try { - return Float.parseFloat(s); - } catch (NumberFormatException ex) { - throw new InvalidValueException("Can't convert string to number: " + s, ex); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/HostPort.java b/app/src/main/java/org/fourthline/cling/model/types/HostPort.java deleted file mode 100644 index ee49ef7..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/HostPort.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * Encapsulates a host string and a port. - * - * @author Christian Bauer - */ -public class HostPort { - - private String host; - private int port; - - public HostPort() { - } - - public HostPort(String host, int port) { - this.host = host; - this.port = port; - } - - public String getHost() { - return host; - } - - public void setHost(String host) { - this.host = host; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - HostPort hostPort = (HostPort) o; - - if (port != hostPort.port) return false; - if (!host.equals(hostPort.host)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = host.hashCode(); - result = 31 * result + port; - return result; - } - - @Override - public String toString() { - return host + ":" + port; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/IntegerDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/IntegerDatatype.java deleted file mode 100644 index 2c47f26..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/IntegerDatatype.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * Although the UDA 1.0 spec doesn't say it, we assume that "int" is a 4 byte regular Java integer. - * - * @author Christian Bauer - */ -public class IntegerDatatype extends AbstractDatatype { - - private int byteSize; - - public IntegerDatatype(int byteSize) { - this.byteSize = byteSize; - } - - @Override - public boolean isHandlingJavaType(Class type) { - return type == Integer.TYPE || Integer.class.isAssignableFrom(type); - } - - public Integer valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - try { - Integer value = Integer.parseInt(s); - if (!isValid(value)) { - throw new InvalidValueException("Not a " + getByteSize() + " byte(s) integer: " + s) - ; - } - return value; - } catch (NumberFormatException ex) { - // TODO: UPNP VIOLATION: Some renderers (like PacketVideo TMM Player) send - // RelCount and AbsCount as "NOT_IMPLEMENTED" in GetPositionInfoResponse action. - // The spec says: If not implemented the value shall be Max Integer value. - if(s.equals("NOT_IMPLEMENTED")) { - return getMaxValue(); - } else { - throw new InvalidValueException("Can't convert string to number: " + s, ex); - } - } - } - - public boolean isValid(Integer value) { - return value == null || (value >= getMinValue() && value <= getMaxValue()); - } - - public int getMinValue() { - switch(getByteSize()) { - case 1: - return Byte.MIN_VALUE; - case 2: - return Short.MIN_VALUE; - case 4: - return Integer.MIN_VALUE; - } - throw new IllegalArgumentException("Invalid integer byte size: " + getByteSize()); - } - - public int getMaxValue() { - switch(getByteSize()) { - case 1: - return Byte.MAX_VALUE; - case 2: - return Short.MAX_VALUE; - case 4: - return Integer.MAX_VALUE; - } - throw new IllegalArgumentException("Invalid integer byte size: " + getByteSize()); - } - - public int getByteSize() { - return byteSize; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/InvalidValueException.java b/app/src/main/java/org/fourthline/cling/model/types/InvalidValueException.java deleted file mode 100644 index b11fce8..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/InvalidValueException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * Thrown by datatypes and variable value conversion procedures. - * - * @author Christian Bauer - */ -public class InvalidValueException extends RuntimeException { - - public InvalidValueException(String s) { - super(s); - } - - public InvalidValueException(String s, Throwable throwable) { - super(s, throwable); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/NamedDeviceType.java b/app/src/main/java/org/fourthline/cling/model/types/NamedDeviceType.java deleted file mode 100644 index a9c2946..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/NamedDeviceType.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * Combines a {@link UDN} with a {@link DeviceType}, string representation - * is separated by double-colon. - * - * @author Christian Bauer - */ -public class NamedDeviceType { - - private UDN udn; - private DeviceType deviceType; - - public NamedDeviceType(UDN udn, DeviceType deviceType) { - this.udn = udn; - this.deviceType = deviceType; - } - - public UDN getUdn() { - return udn; - } - - public DeviceType getDeviceType() { - return deviceType; - } - - public static NamedDeviceType valueOf(String s) throws InvalidValueException { - String[] strings = s.split("::"); - if (strings.length != 2) { - throw new InvalidValueException("Can't parse UDN::DeviceType from: " + s); - } - - UDN udn; - try { - udn = UDN.valueOf(strings[0]); - } catch (Exception ex) { - throw new InvalidValueException("Can't parse UDN: " + strings[0]); - } - - DeviceType deviceType = DeviceType.valueOf(strings[1]); - return new NamedDeviceType(udn, deviceType); - } - - @Override - public String toString() { - return getUdn().toString() + "::" + getDeviceType().toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || !(o instanceof NamedDeviceType)) return false; - - NamedDeviceType that = (NamedDeviceType) o; - - if (!deviceType.equals(that.deviceType)) return false; - if (!udn.equals(that.udn)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = udn.hashCode(); - result = 31 * result + deviceType.hashCode(); - return result; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/NamedServiceType.java b/app/src/main/java/org/fourthline/cling/model/types/NamedServiceType.java deleted file mode 100644 index 3da3f2e..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/NamedServiceType.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * Combines a {@link UDN} with a {@link ServiceType}, string representation - * is separated by double-colon. - * - * @author Christian Bauer - */ -public class NamedServiceType { - - private UDN udn; - private ServiceType serviceType; - - public NamedServiceType(UDN udn, ServiceType serviceType) { - this.udn = udn; - this.serviceType = serviceType; - } - - public UDN getUdn() { - return udn; - } - - public ServiceType getServiceType() { - return serviceType; - } - - public static NamedServiceType valueOf(String s) throws InvalidValueException { - String[] strings = s.split("::"); - if (strings.length != 2) { - throw new InvalidValueException("Can't parse UDN::ServiceType from: " + s); - } - - UDN udn; - try { - udn = UDN.valueOf(strings[0]); - } catch (Exception ex) { - throw new InvalidValueException("Can't parse UDN: " + strings[0]); - } - - ServiceType serviceType = ServiceType.valueOf(strings[1]); - return new NamedServiceType(udn, serviceType); - } - - @Override - public String toString() { - return getUdn().toString() + "::" + getServiceType().toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || !(o instanceof NamedServiceType)) return false; - - NamedServiceType that = (NamedServiceType) o; - - if (!serviceType.equals(that.serviceType)) return false; - if (!udn.equals(that.udn)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = udn.hashCode(); - result = 31 * result + serviceType.hashCode(); - return result; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/NotificationSubtype.java b/app/src/main/java/org/fourthline/cling/model/types/NotificationSubtype.java deleted file mode 100644 index bc92f10..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/NotificationSubtype.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * Notification message types for SSDP. - * - * @author Christian Bauer - */ -public enum NotificationSubtype { - - ALIVE("ssdp:alive"), - UPDATE("ssdp:update"), - BYEBYE("ssdp:byebye"), - ALL("ssdp:all"), - DISCOVER("ssdp:discover"), - PROPCHANGE("upnp:propchange"); - - private String headerString; - - NotificationSubtype(String headerString) { - this.headerString = headerString; - } - - public String getHeaderString() { - return headerString; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/PragmaType.java b/app/src/main/java/org/fourthline/cling/model/types/PragmaType.java deleted file mode 100644 index a768dd9..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/PragmaType.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.model.types; - -/** - * - * @author Mario Franco - */ -public class PragmaType { - - private String token; - private boolean quote; - private String value; - - public PragmaType(String token, String value, boolean quote) { - this.token = token; - this.value = value; - this.quote = quote; - } - - public PragmaType(String token, String value) { - this.token = token; - this.value = value; - } - - public PragmaType(String value) { - this.token = null; - this.value = value; - } - - - /** - * @return the token - */ - public String getToken() { - return token; - } - - /** - * @return the value - */ - public String getValue() { - return value; - } - - /** - * - * @return String format of Bytes Range for response message header - */ - public String getString() { - String s =""; - if (token!=null) - s += token + "="; - - s += quote? "\""+value+"\"" : value; - return s; - } - - public static PragmaType valueOf(String s) throws InvalidValueException { - if (s.length() != 0) { - String token=null, value = null; - boolean quote = false; - String[] params = s.split("="); - if (params.length > 1) { - token = params[0]; - value = params[1]; - if (value.startsWith("\"") && value.endsWith("\"")) { - quote = true; - value = value.substring(1, value.length()-1); - } - } - else { - value = s; - } - return new PragmaType(token, value, quote); - } - throw new InvalidValueException("Can't parse Bytes Range: " + s); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/ServiceId.java b/app/src/main/java/org/fourthline/cling/model/types/ServiceId.java deleted file mode 100644 index f522a94..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/ServiceId.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import org.fourthline.cling.model.Constants; - -import java.util.logging.Logger; -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -/** - * Represents a service identifier, for example urn:my-domain-namespace:serviceId:MyService123 - * - * @author Christian Bauer - */ -public class ServiceId { - - final private static Logger log = Logger.getLogger(ServiceId.class.getName()); - - public static final String UNKNOWN = "UNKNOWN"; - - public static final Pattern PATTERN = - Pattern.compile("urn:(" + Constants.REGEX_NAMESPACE + "):serviceId:(" + Constants.REGEX_ID + ")"); - - // Note: 'service' vs. 'serviceId' - public static final Pattern BROKEN_PATTERN = - Pattern.compile("urn:(" + Constants.REGEX_NAMESPACE + "):service:(" + Constants.REGEX_ID+ ")"); - - private String namespace; - private String id; - - public ServiceId(String namespace, String id) { - if (namespace != null && !namespace.matches(Constants.REGEX_NAMESPACE)) { - throw new IllegalArgumentException("Service ID namespace contains illegal characters"); - } - this.namespace = namespace; - - if (id != null && !id.matches(Constants.REGEX_ID)) { - throw new IllegalArgumentException("Service ID suffix too long (64) or contains illegal characters"); - } - this.id = id; - } - - public String getNamespace() { - return namespace; - } - - public String getId() { - return id; - } - - public static ServiceId valueOf(String s) throws InvalidValueException { - - ServiceId serviceId = null; - - // First try UDAServiceId parse - try { - serviceId = UDAServiceId.valueOf(s); - } catch (Exception ex) { - // Ignore - } - - if (serviceId != null) - return serviceId; - - // Now try a generic ServiceId parse - Matcher matcher = ServiceId.PATTERN.matcher(s); - if (matcher.matches() && matcher.groupCount() >= 2) { - return new ServiceId(matcher.group(1), matcher.group(2)); - } - - matcher = ServiceId.BROKEN_PATTERN.matcher(s); - if (matcher.matches() && matcher.groupCount() >= 2) { - return new ServiceId(matcher.group(1), matcher.group(2)); - } - - // TODO: UPNP VIOLATION: Kodak Media Server doesn't provide any service ID token - // urn:upnp-org:serviceId: - matcher = Pattern.compile("urn:(" + Constants.REGEX_NAMESPACE + "):serviceId:").matcher(s); - if (matcher.matches() && matcher.groupCount() >= 1) { - log.warning("UPnP specification violation, no service ID token, defaulting to " + UNKNOWN + ": " + s); - return new ServiceId(matcher.group(1), UNKNOWN); - } - - // TODO: UPNP VIOLATION: PS Audio Bridge has invalid service IDs - String tokens[] = s.split("[:]"); - if (tokens.length == 4) { - log.warning("UPnP specification violation, trying a simple colon-split of: " + s); - return new ServiceId(tokens[1], tokens[3]); - } - - throw new InvalidValueException("Can't parse service ID string (namespace/id): " + s); - } - - @Override - public String toString() { - return "urn:" + getNamespace() + ":serviceId:" + getId(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || !(o instanceof ServiceId)) return false; - - ServiceId serviceId = (ServiceId) o; - - if (!id.equals(serviceId.id)) return false; - if (!namespace.equals(serviceId.namespace)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = namespace.hashCode(); - result = 31 * result + id.hashCode(); - return result; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/ServiceType.java b/app/src/main/java/org/fourthline/cling/model/types/ServiceType.java deleted file mode 100644 index 7e4d52e..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/ServiceType.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import org.fourthline.cling.model.Constants; - -import java.util.logging.Logger; -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -/** - * Represents a service type, for example urn:my-domain-namespace:service:MyService:1. - *

- * Although decimal versions are accepted and parsed, the version used for - * comparison is only the integer withou the fraction. - *

- * - * @author Christian Bauer - */ -public class ServiceType { - - final private static Logger log = Logger.getLogger(ServiceType.class.getName()); - - public static final Pattern PATTERN = - Pattern.compile("urn:(" + Constants.REGEX_NAMESPACE + "):service:(" + Constants.REGEX_TYPE + "):([0-9]+).*"); - - // Note: 'serviceId' vs. 'service' - public static final Pattern BROKEN_PATTERN = - Pattern.compile("urn:(" + Constants.REGEX_NAMESPACE + "):serviceId:(" + Constants.REGEX_TYPE + "):([0-9]+).*"); - - private String namespace; - private String type; - private int version = 1; - - public ServiceType(String namespace, String type) { - this(namespace, type, 1); - } - - public ServiceType(String namespace, String type, int version) { - - if (namespace != null && !namespace.matches(Constants.REGEX_NAMESPACE)) { - throw new IllegalArgumentException("Service type namespace contains illegal characters"); - } - this.namespace = namespace; - - if (type != null && !type.matches(Constants.REGEX_TYPE)) { - throw new IllegalArgumentException("Service type suffix too long (64) or contains illegal characters"); - } - this.type = type; - - this.version = version; - } - - public String getNamespace() { - return namespace; - } - - public String getType() { - return type; - } - - public int getVersion() { - return version; - } - - /** - * @return Either a {@link UDAServiceType} or a more generic {@link ServiceType}. - */ - public static ServiceType valueOf(String s) throws InvalidValueException { - - if (s == null) - throw new InvalidValueException("Can't parse null string"); - - ServiceType serviceType = null; - - // Sometimes crazy UPnP devices deliver spaces in a URN, don't ask... - s = s.replaceAll("\\s", ""); - - // First try UDAServiceType parse - try { - serviceType = UDAServiceType.valueOf(s); - } catch (Exception ex) { - // Ignore - } - - if (serviceType != null) - return serviceType; - - // Now try a generic ServiceType parse - Matcher matcher = ServiceType.PATTERN.matcher(s); - if (matcher.matches() && matcher.groupCount() >= 3) { - return new ServiceType(matcher.group(1), matcher.group(2), Integer.valueOf(matcher.group(3))); - } - - matcher = ServiceType.BROKEN_PATTERN.matcher(s); - if (matcher.matches() && matcher.groupCount() >= 3) { - return new ServiceType(matcher.group(1), matcher.group(2), Integer.valueOf(matcher.group(3))); - } - - // TODO: UPNP VIOLATION: EyeTV Netstream uses colons in service type token - // urn:schemas-microsoft-com:service:pbda:tuner:1 - matcher = Pattern.compile("urn:(" + Constants.REGEX_NAMESPACE + "):service:(.+?):([0-9]+).*").matcher(s); - if (matcher.matches() && matcher.groupCount() >= 3) { - String cleanToken = matcher.group(2).replaceAll("[^a-zA-Z_0-9\\-]", "-"); - log.warning( - "UPnP specification violation, replacing invalid service type token '" - + matcher.group(2) - + "' with: " - + cleanToken - ); - return new ServiceType(matcher.group(1), cleanToken, Integer.valueOf(matcher.group(3))); - } - - // TODO: UPNP VIOLATION: Ceyton InfiniTV uses colons in service type token and 'serviceId' instead of 'service' - // urn:schemas-opencable-com:serviceId:dri2:debug:1 - matcher = Pattern.compile("urn:(" + Constants.REGEX_NAMESPACE + "):serviceId:(.+?):([0-9]+).*").matcher(s); - if (matcher.matches() && matcher.groupCount() >= 3) { - String cleanToken = matcher.group(2).replaceAll("[^a-zA-Z_0-9\\-]", "-"); - log.warning( - "UPnP specification violation, replacing invalid service type token '" - + matcher.group(2) - + "' with: " - + cleanToken - ); - return new ServiceType(matcher.group(1), cleanToken, Integer.valueOf(matcher.group(3))); - } - - throw new InvalidValueException("Can't parse service type string (namespace/type/version): " + s); - } - - /** - * @return true if this type's namespace/name matches the other type's namespace/name and - * this type's version is equal or higher than the given types version. - */ - public boolean implementsVersion(ServiceType that) { - if (that == null) return false; - if (!namespace.equals(that.namespace)) return false; - if (!type.equals(that.type)) return false; - if (version < that.version) return false; - return true; - } - - public String toFriendlyString() { - return getNamespace() + ":" + getType() + ":" + getVersion(); - } - - @Override - public String toString() { - return "urn:" + getNamespace() + ":service:" + getType() + ":" + getVersion(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || !(o instanceof ServiceType)) return false; - - ServiceType that = (ServiceType) o; - - if (version != that.version) return false; - if (!namespace.equals(that.namespace)) return false; - if (!type.equals(that.type)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = namespace.hashCode(); - result = 31 * result + type.hashCode(); - result = 31 * result + version; - return result; - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/ShortDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/ShortDatatype.java deleted file mode 100644 index 20c9328..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/ShortDatatype.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * - * @author Christian Bauer - */ -public class ShortDatatype extends AbstractDatatype { - - @Override - public boolean isHandlingJavaType(Class type) { - return type == Short.TYPE || Short.class.isAssignableFrom(type); - } - - public Short valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - try { - Short value = Short.parseShort(s); - if (!isValid(value)) { - throw new InvalidValueException("Not a valid short: " + s); - } - return value; - } catch (NumberFormatException ex) { - throw new InvalidValueException("Can't convert string to number: " + s, ex); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/SoapActionType.java b/app/src/main/java/org/fourthline/cling/model/types/SoapActionType.java deleted file mode 100644 index b04eca8..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/SoapActionType.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import org.fourthline.cling.model.Constants; -import org.fourthline.cling.model.ModelUtil; - -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -/** - * Header in SOAP action messages, naturally declaring the same thing as the body of the SOAP message. - * - * @author Christian Bauer - */ -public class SoapActionType { - - public static final String MAGIC_CONTROL_NS = "schemas-upnp-org"; - public static final String MAGIC_CONTROL_TYPE = "control-1-0"; - - public static final Pattern PATTERN_MAGIC_CONTROL = - Pattern.compile(Constants.NS_UPNP_CONTROL_10 +"#("+Constants.REGEX_UDA_NAME+")"); - - public static final Pattern PATTERN = - Pattern.compile("urn:(" + Constants.REGEX_NAMESPACE + "):service:(" + Constants.REGEX_TYPE + "):([0-9]+)#("+Constants.REGEX_UDA_NAME+")"); - - private String namespace; - private String type; - private String actionName; - private Integer version; - - public SoapActionType(ServiceType serviceType, String actionName) { - this(serviceType.getNamespace(), serviceType.getType(), serviceType.getVersion(), actionName); - } - - public SoapActionType(String namespace, String type, Integer version, String actionName) { - this.namespace = namespace; - this.type = type; - this.version = version; - this.actionName = actionName; - - if (actionName != null && !ModelUtil.isValidUDAName(actionName)) { - throw new IllegalArgumentException("Action name contains illegal characters: " + actionName); - } - } - - public String getActionName() { - return actionName; - } - - public String getNamespace() { - return namespace; - } - - public String getType() { - return type; - } - - public Integer getVersion() { - return version; - } - - public static SoapActionType valueOf(String s) throws InvalidValueException { - Matcher magicControlMatcher = SoapActionType.PATTERN_MAGIC_CONTROL.matcher(s); - if (magicControlMatcher.matches()) { - return new SoapActionType(MAGIC_CONTROL_NS, MAGIC_CONTROL_TYPE, null, magicControlMatcher.group(1)); - } - Matcher matcher = SoapActionType.PATTERN.matcher(s); - if (matcher.matches()) { - return new SoapActionType(matcher.group(1), matcher.group(2), Integer.valueOf(matcher.group(3)), matcher.group(4)); - } else { - throw new InvalidValueException("Can't parse action type string (namespace/type/version#actionName): " + s); - } - } - - public ServiceType getServiceType() { - if (version == null) return null; - return new ServiceType(namespace, type, version); - } - - @Override - public String toString() { - return getTypeString() + "#" + getActionName(); - } - - public String getTypeString() { - if (version == null) { - return "urn:" + getNamespace() + ":" + getType(); - } else { - return "urn:" + getNamespace() + ":service:" + getType() + ":" + getVersion(); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || !(o instanceof SoapActionType)) return false; - - SoapActionType that = (SoapActionType) o; - - if (!actionName.equals(that.actionName)) return false; - if (!namespace.equals(that.namespace)) return false; - if (!type.equals(that.type)) return false; - if (version != null ? !version.equals(that.version) : that.version != null) return false; - - return true; - } - - @Override - public int hashCode() { - int result = namespace.hashCode(); - result = 31 * result + type.hashCode(); - result = 31 * result + actionName.hashCode(); - result = 31 * result + (version != null ? version.hashCode() : 0); - return result; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/StringDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/StringDatatype.java deleted file mode 100644 index 1196afc..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/StringDatatype.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * @author Christian Bauer - */ -public class StringDatatype extends AbstractDatatype { - - public StringDatatype() { - } - - public String valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - return s; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/UDADeviceType.java b/app/src/main/java/org/fourthline/cling/model/types/UDADeviceType.java deleted file mode 100644 index a41b598..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/UDADeviceType.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import org.fourthline.cling.model.Constants; - -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -/** - * Device type with a fixed schemas-upnp-org namespace. - * - * @author Christian Bauer - */ -public class UDADeviceType extends DeviceType { - - public static final String DEFAULT_NAMESPACE = "schemas-upnp-org"; - - // This pattern also accepts decimal versions, not only integers (as would be required by UDA), but cuts off fractions - public static final Pattern PATTERN = - Pattern.compile("urn:" + DEFAULT_NAMESPACE + ":device:(" + Constants.REGEX_TYPE + "):([0-9]+).*"); - - public UDADeviceType(String type) { - super(DEFAULT_NAMESPACE, type, 1); - } - - public UDADeviceType(String type, int version) { - super(DEFAULT_NAMESPACE, type, version); - } - - public static UDADeviceType valueOf(String s) throws InvalidValueException { - Matcher matcher = PATTERN.matcher(s); - if (matcher.matches()) { - return new UDADeviceType(matcher.group(1), Integer.valueOf(matcher.group(2))); - } else { - throw new InvalidValueException("Can't parse UDA device type string (namespace/type/version): " + s); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/UDAServiceId.java b/app/src/main/java/org/fourthline/cling/model/types/UDAServiceId.java deleted file mode 100644 index cd58fd9..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/UDAServiceId.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import org.fourthline.cling.model.Constants; - -import java.util.logging.Logger; -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -/** - * Service identifier with a fixed upnp-org namespace. - *

- * Also accepts the namespace sometimes used by broken devices, schemas-upnp-org. - *

- * - * @author Christian Bauer - */ -public class UDAServiceId extends ServiceId { - - private static Logger log = Logger.getLogger(UDAServiceId.class.getName()); - - public static final String DEFAULT_NAMESPACE = "upnp-org"; - public static final String BROKEN_DEFAULT_NAMESPACE = "schemas-upnp-org"; // TODO: UPNP VIOLATION: Intel UPnP tools! - - public static final Pattern PATTERN = - Pattern.compile("urn:" + DEFAULT_NAMESPACE + ":serviceId:(" + Constants.REGEX_ID+ ")"); - - // Note: 'service' vs. 'serviceId' - public static final Pattern BROKEN_PATTERN = - Pattern.compile("urn:" + BROKEN_DEFAULT_NAMESPACE + ":service:(" + Constants.REGEX_ID+ ")"); - - public UDAServiceId(String id) { - super(DEFAULT_NAMESPACE, id); - } - - public static UDAServiceId valueOf(String s) throws InvalidValueException { - Matcher matcher = UDAServiceId.PATTERN.matcher(s); - if (matcher.matches() && matcher.groupCount() >= 1) { - return new UDAServiceId(matcher.group(1)); - } - - matcher = UDAServiceId.BROKEN_PATTERN.matcher(s); - if (matcher.matches() && matcher.groupCount() >= 1) { - return new UDAServiceId(matcher.group(1)); - } - - // TODO: UPNP VIOLATION: Handle garbage sent by Eyecon Android app - matcher = Pattern.compile("urn:upnp-orgerviceId:urnchemas-upnp-orgervice:(" + Constants.REGEX_ID + ")").matcher(s); - if (matcher.matches()) { - log.warning("UPnP specification violation, recovering from Eyecon garbage: " + s); - return new UDAServiceId(matcher.group(1)); - } - - // Some devices just set the last token of the Service ID, e.g. 'ContentDirectory' - if("ContentDirectory".equals(s) || - "ConnectionManager".equals(s) || - "RenderingControl".equals(s) || - "AVTransport".equals(s)) { - log.warning("UPnP specification violation, fixing broken Service ID: " + s); - return new UDAServiceId(s); - } - - throw new InvalidValueException("Can't parse UDA service ID string (upnp-org/id): " + s); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/UDAServiceType.java b/app/src/main/java/org/fourthline/cling/model/types/UDAServiceType.java deleted file mode 100644 index 596a817..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/UDAServiceType.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import org.fourthline.cling.model.Constants; - -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -/** - * Service type with a fixed schemas-upnp-org namespace. - * - * @author Christian Bauer - */ -public class UDAServiceType extends ServiceType { - - public static final String DEFAULT_NAMESPACE = "schemas-upnp-org"; - - // This pattern also accepts decimal versions, not only integers (as would be required by UDA), but cuts off fractions - public static final Pattern PATTERN = - Pattern.compile("urn:" + DEFAULT_NAMESPACE + ":service:(" + Constants.REGEX_TYPE + "):([0-9]+).*"); - - public UDAServiceType(String type) { - this(type, 1); - } - - public UDAServiceType(String type, int version) { - super(DEFAULT_NAMESPACE, type, version); - } - - public static UDAServiceType valueOf(String s) throws InvalidValueException { - Matcher matcher = UDAServiceType.PATTERN.matcher(s); - if (matcher.matches()) { - return new UDAServiceType(matcher.group(1), Integer.valueOf(matcher.group(2))); - } else { - throw new InvalidValueException("Can't parse UDA service type string (namespace/type/version): " + s); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/UDN.java b/app/src/main/java/org/fourthline/cling/model/types/UDN.java deleted file mode 100644 index 632f4ef..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/UDN.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import org.fourthline.cling.model.ModelUtil; - - -import java.util.UUID; -import java.security.MessageDigest; -import java.math.BigInteger; -import java.util.logging.Logger; - -/** - * A unique device name. - *

- * UDA 1.0 does not specify a UUID format, however, UDA 1.1 specifies a format that is compatible - * with java.util.UUID variant 4. You can use any identifier string you like. - *

- *

- * You'll most likely need the {@link #uniqueSystemIdentifier(String)} method sooner or later. - *

- * - * @author Christian Bauer - */ -public class UDN { - - final private static Logger log = Logger.getLogger(UDN.class.getName()); - - public static final String PREFIX = "uuid:"; - - private String identifierString; - - /** - * @param identifierString The identifier string without the "uuid:" prefix. - */ - public UDN(String identifierString) { - this.identifierString = identifierString; - } - - public UDN(UUID uuid) { - this.identifierString = uuid.toString(); - } - - public boolean isUDA11Compliant() { - try { - UUID.fromString(identifierString); - return true; - } catch (IllegalArgumentException ex) { - return false; - } - } - - public String getIdentifierString() { - return identifierString; - } - - public static UDN valueOf(String udnString) { - return new UDN(udnString.startsWith(PREFIX) ? udnString.substring(PREFIX.length()) : udnString); - } - - /** - * Generates a global unique identifier that is the same every time this method is invoked on the same machine. - *

- * This method discovers various pieces of information about the local system such - * as hostname, MAC address, OS name and version. It then combines this information with the - * given salt to generate a globally unique identifier. In other words, every time you - * call this method with the same salt on the same machine, you get the same identifier. - * If you use the same salt on a different machine, a different identifier will be generated. - *

- *

- * Note for Android users: This method does not generate unique identifiers on Android devices and will - * throw an exception. We can't get details such as the hostname or MAC address on Android. Instead, - * construct a UDN with new UDN(UUID). When your application is first started, generate all - * UUIDs needed for your UPnP devices and store them in your Android preferences. Then, use the stored - * UUID to create a UDN every time your application starts. - *

- *

- * Control points can remember your device's identifier, it will and should be the same every time - * your device is powered up. - *

- * - * @param salt An arbitrary string that uniquely identifies the devices on the current system, e.g. "MyMediaServer". - * @return A global unique identifier, stable for the current system and salt. - */ - public static UDN uniqueSystemIdentifier(String salt) { - StringBuilder systemSalt = new StringBuilder(); - - // Bug: I've seen InetAddress.getLocalHost() block *forever* on Android, until device is rebooted - // Bug: On Android, NetworkInterface.isLoopback() isn't implemented - if (!ModelUtil.ANDROID_RUNTIME) { - try { - java.net.InetAddress i = java.net.InetAddress.getLocalHost(); - systemSalt.append(i.getHostName()).append(i.getHostAddress()); - } catch (Exception ex) { - // Could not find local host name, try to get the MAC address of loopback interface - try { - systemSalt.append(new String(ModelUtil.getFirstNetworkInterfaceHardwareAddress())); - } catch (Throwable ex1) { - // Ignore, we did everything we can - log.severe( - "Couldn't get host/network interface information on this machine, " + - "generated UDN might not be unique!" - ); - } - } - } else { - throw new RuntimeException( - "This method does not create a unique identifier on Android, see the Javadoc and " + - "use new UDN(UUID) instead!" - ); - } - - systemSalt.append(System.getProperty("os.name")); - systemSalt.append(System.getProperty("os.version")); - try { - byte[] hash = MessageDigest.getInstance("MD5").digest(systemSalt.toString().getBytes()); - return new UDN( - new UUID( - new BigInteger(-1, hash).longValue(), - salt.hashCode() - ) - ); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - @Override - public String toString() { - return PREFIX + getIdentifierString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || !(o instanceof UDN)) return false; - UDN udn = (UDN) o; - return identifierString.equals(udn.identifierString); - } - - @Override - public int hashCode() { - return identifierString.hashCode(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/URIDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/URIDatatype.java deleted file mode 100644 index d012857..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/URIDatatype.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import java.net.URI; -import java.net.URISyntaxException; - -/** - * @author Christian Bauer - */ -public class URIDatatype extends AbstractDatatype { - - public URIDatatype() { - } - - public URI valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - try { - return new URI(s); - } catch (URISyntaxException ex) { - throw new InvalidValueException(ex.getMessage(), ex); - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerFourBytes.java b/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerFourBytes.java deleted file mode 100644 index be5a616..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerFourBytes.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * @author Christian Bauer - */ -final public class UnsignedIntegerFourBytes extends UnsignedVariableInteger { - - public UnsignedIntegerFourBytes(long value) throws NumberFormatException { - super(value); - } - - public UnsignedIntegerFourBytes(String s) throws NumberFormatException { - super(s); - } - - public Bits getBits() { - return Bits.THIRTYTWO; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerFourBytesDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerFourBytesDatatype.java deleted file mode 100644 index e2c90f1..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerFourBytesDatatype.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * @author Christian Bauer - */ -public class UnsignedIntegerFourBytesDatatype extends AbstractDatatype { - - public UnsignedIntegerFourBytes valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - try { - return new UnsignedIntegerFourBytes(s); - } catch (NumberFormatException ex) { - throw new InvalidValueException("Can't convert string to number or not in range: " + s, ex); - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerOneByte.java b/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerOneByte.java deleted file mode 100644 index 914e2e4..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerOneByte.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * @author Christian Bauer - */ -final public class UnsignedIntegerOneByte extends UnsignedVariableInteger { - - public UnsignedIntegerOneByte(long value) throws NumberFormatException { - super(value); - } - - public UnsignedIntegerOneByte(String s) throws NumberFormatException { - super(s); - } - - public Bits getBits() { - return Bits.EIGHT; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerOneByteDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerOneByteDatatype.java deleted file mode 100644 index 12b01f9..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerOneByteDatatype.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * @author Christian Bauer - */ -public class UnsignedIntegerOneByteDatatype extends AbstractDatatype { - - public UnsignedIntegerOneByte valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - try { - return new UnsignedIntegerOneByte(s); - } catch (NumberFormatException ex) { - throw new InvalidValueException("Can't convert string to number or not in range: " + s, ex); - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerTwoBytes.java b/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerTwoBytes.java deleted file mode 100644 index e15d6fd..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerTwoBytes.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * @author Christian Bauer - */ -final public class UnsignedIntegerTwoBytes extends UnsignedVariableInteger { - - public UnsignedIntegerTwoBytes(long value) throws NumberFormatException { - super(value); - } - - public UnsignedIntegerTwoBytes(String s) throws NumberFormatException { - super(s); - } - - public Bits getBits() { - return Bits.SIXTEEN; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerTwoBytesDatatype.java b/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerTwoBytesDatatype.java deleted file mode 100644 index 6443977..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/UnsignedIntegerTwoBytesDatatype.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -/** - * @author Christian Bauer - */ -public class UnsignedIntegerTwoBytesDatatype extends AbstractDatatype { - - public UnsignedIntegerTwoBytes valueOf(String s) throws InvalidValueException { - if (s.equals("")) return null; - try { - return new UnsignedIntegerTwoBytes(s); - } catch (NumberFormatException ex) { - throw new InvalidValueException("Can't convert string to number or not in range: " + s, ex); - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/UnsignedVariableInteger.java b/app/src/main/java/org/fourthline/cling/model/types/UnsignedVariableInteger.java deleted file mode 100644 index 0fd1878..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/UnsignedVariableInteger.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types; - -import java.util.logging.Logger; - -/** - * A crude solution for unsigned "non-negative" types in UPnP, not usable for any arithmetic. - * - * @author Christian Bauer - */ -public abstract class UnsignedVariableInteger { - - final private static Logger log = Logger.getLogger(UnsignedVariableInteger.class.getName()); - - public enum Bits { - EIGHT(0xffL), - SIXTEEN(0xffffL), - TWENTYFOUR(0xffffffL), - THIRTYTWO(0xffffffffL); - - private long maxValue; - - Bits(long maxValue) { - this.maxValue = maxValue; - } - - public long getMaxValue() { - return maxValue; - } - } - - protected long value; - - protected UnsignedVariableInteger() { - } - - public UnsignedVariableInteger(long value) throws NumberFormatException { - setValue(value); - } - - public UnsignedVariableInteger(String s) throws NumberFormatException { - if (s.startsWith("-")) { - // Don't throw exception, just cut it! - // TODO: UPNP VIOLATION: Twonky Player returns "-1" as the track number - log.warning("Invalid negative integer value '" + s + "', assuming value 0!"); - s = "0"; - } - setValue(Long.parseLong(s)); - } - - protected UnsignedVariableInteger setValue(long value) { - isInRange(value); - this.value = value; - return this; - } - - public Long getValue() { - return value; - } - - public void isInRange(long value) throws NumberFormatException { - if (value < getMinValue() || value > getBits().getMaxValue()) { - throw new NumberFormatException("Value must be between " + getMinValue() + " and " + getBits().getMaxValue() + ": " + value); - } - } - - public int getMinValue() { - return 0; - } - - public abstract Bits getBits(); - - public UnsignedVariableInteger increment(boolean rolloverToOne) { - if (value + 1 > getBits().getMaxValue()) { - value = rolloverToOne ? 1 : 0; - } else { - value++; - } - return this; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - UnsignedVariableInteger that = (UnsignedVariableInteger) o; - - if (value != that.value) return false; - - return true; - } - - @Override - public int hashCode() { - return (int) (value ^ (value >>> 32)); - } - - @Override - public String toString() { - return Long.toString(value); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSV.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSV.java deleted file mode 100644 index d28210e..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSV.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.model.ModelUtil; -import org.seamless.util.Reflections; - -import java.util.ArrayList; -import java.util.List; - -/** - * Transforms a state variable value from/to strings of comma-separated elements. - *

- * A concrete implementation of this interface knows how to transform values of the - * declared type into a string of comma-separated list of elements, and how to read - * such strings back into individual values. - *

- *

- * Your action method returns a CSV<...> instance as an output argument. It can - * also accept a concrecte subclass of this type as an input argument, e.g. CSVString. - * This type extends a regular List, so within your action method you can - * handle the elements as usual. - *

- * - * @author Christian Bauer - */ -public abstract class CSV extends ArrayList { - - protected final Datatype.Builtin datatype; - - public CSV() { - datatype = getBuiltinDatatype(); - } - - public CSV(String s) throws InvalidValueException { - datatype = getBuiltinDatatype(); - addAll(parseString(s)); - } - - protected List parseString(String s) throws InvalidValueException { - String[] strings = ModelUtil.fromCommaSeparatedList(s); - List values = new ArrayList(); - for (String string : strings) { - values.add(datatype.getDatatype().valueOf(string)); - } - return values; - } - - protected Datatype.Builtin getBuiltinDatatype() throws InvalidValueException { - Class csvType = Reflections.getTypeArguments(ArrayList.class, getClass()).get(0); - Datatype.Default defaultType = Datatype.Default.getByJavaType(csvType); - if (defaultType == null) { - throw new InvalidValueException("No built-in UPnP datatype for Java type of CSV: " + csvType); - } - return defaultType.getBuiltinType(); - } - - @Override - public String toString() { - List stringValues = new ArrayList(); - for (T t : this) { - stringValues.add(datatype.getDatatype().getString(t)); - } - return ModelUtil.toCommaSeparatedList(stringValues.toArray(new Object[stringValues.size()])); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVBoolean.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVBoolean.java deleted file mode 100644 index 6c4df9d..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVBoolean.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * @author Christian Bauer - */ -public class CSVBoolean extends CSV { - - public CSVBoolean() { - } - - public CSVBoolean(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVBytes.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVBytes.java deleted file mode 100644 index 0f21c78..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVBytes.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * @author Christian Bauer - */ -public class CSVBytes extends CSV { - - public CSVBytes() { - } - - public CSVBytes(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVCharacter.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVCharacter.java deleted file mode 100644 index d112765..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVCharacter.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * @author Christian Bauer - */ -public class CSVCharacter extends CSV { - - public CSVCharacter() { - } - - public CSVCharacter(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVDate.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVDate.java deleted file mode 100644 index 46fbd17..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVDate.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; - -import java.util.Date; - -/** - * @author Christian Bauer - */ -public class CSVDate extends CSV { - - public CSVDate() { - } - - public CSVDate(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVDouble.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVDouble.java deleted file mode 100644 index 9dbc779..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVDouble.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * @author Christian Bauer - */ -public class CSVDouble extends CSV { - - public CSVDouble() { - } - - public CSVDouble(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVFloat.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVFloat.java deleted file mode 100644 index 7a69ac3..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVFloat.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * @author Christian Bauer - */ -public class CSVFloat extends CSV { - - public CSVFloat() { - } - - public CSVFloat(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVInteger.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVInteger.java deleted file mode 100644 index e13fe91..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVInteger.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * @author Christian Bauer - */ -public class CSVInteger extends CSV { - - public CSVInteger() { - } - - public CSVInteger(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVShort.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVShort.java deleted file mode 100644 index eefadd3..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVShort.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * @author Christian Bauer - */ -public class CSVShort extends CSV { - - public CSVShort() { - } - - public CSVShort(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVString.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVString.java deleted file mode 100644 index 7cc59dc..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVString.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * @author Christian Bauer - */ -public class CSVString extends CSV { - - public CSVString() { - } - - public CSVString(String s) throws InvalidValueException { - super(s); - } -} diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVURI.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVURI.java deleted file mode 100644 index c6aeb09..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVURI.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class CSVURI extends CSV { - - public CSVURI() { - } - - public CSVURI(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerFourBytes.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerFourBytes.java deleted file mode 100644 index c2da9f1..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerFourBytes.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -/** - * @author Christian Bauer - */ -public class CSVUnsignedIntegerFourBytes extends CSV { - - public CSVUnsignedIntegerFourBytes() { - } - - public CSVUnsignedIntegerFourBytes(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerOneByte.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerOneByte.java deleted file mode 100644 index e325a5d..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerOneByte.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.model.types.UnsignedIntegerOneByte; - -/** - * @author Christian Bauer - */ -public class CSVUnsignedIntegerOneByte extends CSV { - - public CSVUnsignedIntegerOneByte() { - } - - public CSVUnsignedIntegerOneByte(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerTwoBytes.java b/app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerTwoBytes.java deleted file mode 100644 index 45fe4bd..0000000 --- a/app/src/main/java/org/fourthline/cling/model/types/csv/CSVUnsignedIntegerTwoBytes.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.model.types.csv; - -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.model.types.UnsignedIntegerTwoBytes; - -/** - * @author Christian Bauer - */ -public class CSVUnsignedIntegerTwoBytes extends CSV { - - public CSVUnsignedIntegerTwoBytes() { - } - - public CSVUnsignedIntegerTwoBytes(String s) throws InvalidValueException { - super(s); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/protocol/ProtocolCreationException.java b/app/src/main/java/org/fourthline/cling/protocol/ProtocolCreationException.java deleted file mode 100644 index 5b8aaaf..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/ProtocolCreationException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol; - -/** - * Recoverable error, thrown when no protocol is available to handle a UPnP message. - * - * @author Christian Bauer - */ -public class ProtocolCreationException extends Exception { - - public ProtocolCreationException(String s) { - super(s); - } - - public ProtocolCreationException(String s, Throwable throwable) { - super(s, throwable); - } -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/ProtocolFactory.java b/app/src/main/java/org/fourthline/cling/protocol/ProtocolFactory.java deleted file mode 100644 index a06a808..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/ProtocolFactory.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.gena.LocalGENASubscription; -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.protocol.async.SendingNotificationAlive; -import org.fourthline.cling.protocol.async.SendingNotificationByebye; -import org.fourthline.cling.protocol.async.SendingSearch; -import org.fourthline.cling.protocol.sync.SendingAction; -import org.fourthline.cling.protocol.sync.SendingEvent; -import org.fourthline.cling.protocol.sync.SendingRenewal; -import org.fourthline.cling.protocol.sync.SendingSubscribe; -import org.fourthline.cling.protocol.sync.SendingUnsubscribe; - -import java.net.URL; - -/** - * Factory for UPnP protocols, the core implementation of the UPnP specification. - *

- * This factory creates an executable protocol either based on the received UPnP messsage, or - * on local device/search/service metadata). A protocol is an aspect of the UPnP specification, - * you can override individual protocols to customize the behavior of the UPnP stack. - *

- *

- * An implementation has to be thread-safe. - *

- * - * @author Christian Bauer - */ -public interface ProtocolFactory { - - public UpnpService getUpnpService(); - - /** - * Creates a {@link org.fourthline.cling.protocol.async.ReceivingNotification}, - * {@link org.fourthline.cling.protocol.async.ReceivingSearch}, - * or {@link org.fourthline.cling.protocol.async.ReceivingSearchResponse} protocol. - * - * @param message The incoming message, either {@link org.fourthline.cling.model.message.UpnpRequest} or - * {@link org.fourthline.cling.model.message.UpnpResponse}. - * @return The appropriate protocol that handles the messages or null if the message should be dropped. - * @throws ProtocolCreationException If no protocol could be found for the message. - */ - public ReceivingAsync createReceivingAsync(IncomingDatagramMessage message) throws ProtocolCreationException; - - /** - * Creates a {@link org.fourthline.cling.protocol.sync.ReceivingRetrieval}, - * {@link org.fourthline.cling.protocol.sync.ReceivingAction}, - * {@link org.fourthline.cling.protocol.sync.ReceivingSubscribe}, - * {@link org.fourthline.cling.protocol.sync.ReceivingUnsubscribe}, or - * {@link org.fourthline.cling.protocol.sync.ReceivingEvent} protocol. - * - * @param requestMessage The incoming message, examime {@link org.fourthline.cling.model.message.UpnpRequest.Method} - * to determine the protocol. - * @return The appropriate protocol that handles the messages. - * @throws ProtocolCreationException If no protocol could be found for the message. - */ - public ReceivingSync createReceivingSync(StreamRequestMessage requestMessage) throws ProtocolCreationException; - - /** - * Called by the {@link org.fourthline.cling.registry.Registry}, creates a protocol for announcing local devices. - */ - public SendingNotificationAlive createSendingNotificationAlive(LocalDevice localDevice); - - /** - * Called by the {@link org.fourthline.cling.registry.Registry}, creates a protocol for announcing local devices. - */ - public SendingNotificationByebye createSendingNotificationByebye(LocalDevice localDevice); - - /** - * Called by the {@link org.fourthline.cling.controlpoint.ControlPoint}, creates a protocol for a multicast search. - */ - public SendingSearch createSendingSearch(UpnpHeader searchTarget, int mxSeconds); - - /** - * Called by the {@link org.fourthline.cling.controlpoint.ControlPoint}, creates a protocol for executing an action. - */ - public SendingAction createSendingAction(ActionInvocation actionInvocation, URL controlURL); - - /** - * Called by the {@link org.fourthline.cling.controlpoint.ControlPoint}, creates a protocol for GENA subscription. - */ - public SendingSubscribe createSendingSubscribe(RemoteGENASubscription subscription) throws ProtocolCreationException; - - /** - * Called by the {@link org.fourthline.cling.controlpoint.ControlPoint}, creates a protocol for GENA renewal. - */ - public SendingRenewal createSendingRenewal(RemoteGENASubscription subscription); - - /** - * Called by the {@link org.fourthline.cling.controlpoint.ControlPoint}, creates a protocol for GENA unsubscription. - */ - public SendingUnsubscribe createSendingUnsubscribe(RemoteGENASubscription subscription); - - /** - * Called by the {@link org.fourthline.cling.model.gena.GENASubscription}, creates a protocol for sending GENA events. - */ - public SendingEvent createSendingEvent(LocalGENASubscription subscription); -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/ProtocolFactoryImpl.java b/app/src/main/java/org/fourthline/cling/protocol/ProtocolFactoryImpl.java deleted file mode 100644 index ae07d21..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/ProtocolFactoryImpl.java +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.Namespace; -import org.fourthline.cling.model.NetworkAddress; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.gena.LocalGENASubscription; -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.model.types.NamedServiceType; -import org.fourthline.cling.model.types.NotificationSubtype; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.protocol.async.ReceivingNotification; -import org.fourthline.cling.protocol.async.ReceivingSearch; -import org.fourthline.cling.protocol.async.ReceivingSearchResponse; -import org.fourthline.cling.protocol.async.SendingNotificationAlive; -import org.fourthline.cling.protocol.async.SendingNotificationByebye; -import org.fourthline.cling.protocol.async.SendingSearch; -import org.fourthline.cling.protocol.sync.ReceivingAction; -import org.fourthline.cling.protocol.sync.ReceivingEvent; -import org.fourthline.cling.protocol.sync.ReceivingRetrieval; -import org.fourthline.cling.protocol.sync.ReceivingSubscribe; -import org.fourthline.cling.protocol.sync.ReceivingUnsubscribe; -import org.fourthline.cling.protocol.sync.SendingAction; -import org.fourthline.cling.protocol.sync.SendingEvent; -import org.fourthline.cling.protocol.sync.SendingRenewal; -import org.fourthline.cling.protocol.sync.SendingSubscribe; -import org.fourthline.cling.protocol.sync.SendingUnsubscribe; -import org.fourthline.cling.transport.RouterException; - -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import java.net.URI; -import java.net.URL; -import java.util.List; -import java.util.logging.Logger; - -/** - * Default implementation, directly instantiates the appropriate protocols. - * - * @author Christian Bauer - */ -@ApplicationScoped -public class ProtocolFactoryImpl implements ProtocolFactory { - - final private static Logger log = Logger.getLogger(ProtocolFactory.class.getName()); - - protected final UpnpService upnpService; - - protected ProtocolFactoryImpl() { - upnpService = null; - } - - @Inject - public ProtocolFactoryImpl(UpnpService upnpService) { - log.fine("Creating ProtocolFactory: " + getClass().getName()); - this.upnpService = upnpService; - } - - public UpnpService getUpnpService() { - return upnpService; - } - - public ReceivingAsync createReceivingAsync(IncomingDatagramMessage message) throws ProtocolCreationException { - log.fine("Creating protocol for incoming asynchronous: " + message); - - if (message.getOperation() instanceof UpnpRequest) { - IncomingDatagramMessage incomingRequest = message; - - switch (incomingRequest.getOperation().getMethod()) { - case NOTIFY: - return isByeBye(incomingRequest) || isSupportedServiceAdvertisement(incomingRequest) - ? createReceivingNotification(incomingRequest) : null; - case MSEARCH: - return createReceivingSearch(incomingRequest); - } - - } else if (message.getOperation() instanceof UpnpResponse) { - IncomingDatagramMessage incomingResponse = message; - - return isSupportedServiceAdvertisement(incomingResponse) - ? createReceivingSearchResponse(incomingResponse) : null; - } - - throw new ProtocolCreationException("Protocol for incoming datagram message not found: " + message); - } - - protected ReceivingAsync createReceivingNotification(IncomingDatagramMessage incomingRequest) { - return new ReceivingNotification(getUpnpService(), incomingRequest); - } - - protected ReceivingAsync createReceivingSearch(IncomingDatagramMessage incomingRequest) { - return new ReceivingSearch(getUpnpService(), incomingRequest); - } - - protected ReceivingAsync createReceivingSearchResponse(IncomingDatagramMessage incomingResponse) { - return new ReceivingSearchResponse(getUpnpService(), incomingResponse); - } - - // DO NOT USE THE PARSED/TYPED MSG HEADERS! THIS WOULD DEFEAT THE PURPOSE OF THIS OPTIMIZATION! - - protected boolean isByeBye(IncomingDatagramMessage message) { - String ntsHeader = message.getHeaders().getFirstHeader(UpnpHeader.Type.NTS.getHttpName()); - return ntsHeader != null && ntsHeader.equals(NotificationSubtype.BYEBYE.getHeaderString()); - } - - protected boolean isSupportedServiceAdvertisement(IncomingDatagramMessage message) { - ServiceType[] exclusiveServiceTypes = getUpnpService().getConfiguration().getExclusiveServiceTypes(); - if (exclusiveServiceTypes == null) return false; // Discovery is disabled - if (exclusiveServiceTypes.length == 0) return true; // Any advertisement is fine - - String usnHeader = message.getHeaders().getFirstHeader(UpnpHeader.Type.USN.getHttpName()); - if (usnHeader == null) return false; // Not a service advertisement, drop it - - try { - NamedServiceType nst = NamedServiceType.valueOf(usnHeader); - for (ServiceType exclusiveServiceType : exclusiveServiceTypes) { - if (nst.getServiceType().implementsVersion(exclusiveServiceType)) - return true; - } - } catch (InvalidValueException ex) { - log.finest("Not a named service type header value: " + usnHeader); - } - log.fine("Service advertisement not supported, dropping it: " + usnHeader); - return false; - } - - public ReceivingSync createReceivingSync(StreamRequestMessage message) throws ProtocolCreationException { - log.fine("Creating protocol for incoming synchronous: " + message); - - if (message.getOperation().getMethod().equals(UpnpRequest.Method.GET)) { - - return createReceivingRetrieval(message); - - } else if (getUpnpService().getConfiguration().getNamespace().isControlPath(message.getUri())) { - - if (message.getOperation().getMethod().equals(UpnpRequest.Method.POST)) - return createReceivingAction(message); - - } else if (getUpnpService().getConfiguration().getNamespace().isEventSubscriptionPath(message.getUri())) { - - if (message.getOperation().getMethod().equals(UpnpRequest.Method.SUBSCRIBE)) { - return createReceivingSubscribe(message); - } else if (message.getOperation().getMethod().equals(UpnpRequest.Method.UNSUBSCRIBE)) { - return createReceivingUnsubscribe(message); - } - - } else if (getUpnpService().getConfiguration().getNamespace().isEventCallbackPath(message.getUri())) { - - if (message.getOperation().getMethod().equals(UpnpRequest.Method.NOTIFY)) - return createReceivingEvent(message); - - } else { - - // TODO: UPNP VIOLATION: Onkyo devices send event messages with trailing garbage characters - // dev/1234/svc/upnp-org/MyService/event/callback192%2e168%2e10%2e38 - if (message.getUri().getPath().contains(Namespace.EVENTS + Namespace.CALLBACK_FILE)) { - log.warning("Fixing trailing garbage in event message path: " + message.getUri().getPath()); - String invalid = message.getUri().toString(); - message.setUri( - URI.create(invalid.substring( - 0, invalid.indexOf(Namespace.CALLBACK_FILE) + Namespace.CALLBACK_FILE.length() - )) - ); - if (getUpnpService().getConfiguration().getNamespace().isEventCallbackPath(message.getUri()) - && message.getOperation().getMethod().equals(UpnpRequest.Method.NOTIFY)) - return createReceivingEvent(message); - } - - } - - throw new ProtocolCreationException("Protocol for message type not found: " + message); - } - - public SendingNotificationAlive createSendingNotificationAlive(LocalDevice localDevice) { - return new SendingNotificationAlive(getUpnpService(), localDevice); - } - - public SendingNotificationByebye createSendingNotificationByebye(LocalDevice localDevice) { - return new SendingNotificationByebye(getUpnpService(), localDevice); - } - - public SendingSearch createSendingSearch(UpnpHeader searchTarget, int mxSeconds) { - return new SendingSearch(getUpnpService(), searchTarget, mxSeconds); - } - - public SendingAction createSendingAction(ActionInvocation actionInvocation, URL controlURL) { - return new SendingAction(getUpnpService(), actionInvocation, controlURL); - } - - public SendingSubscribe createSendingSubscribe(RemoteGENASubscription subscription) throws ProtocolCreationException { - try { - List activeStreamServers = - getUpnpService().getRouter().getActiveStreamServers( - subscription.getService().getDevice().getIdentity().getDiscoveredOnLocalAddress() - ); - return new SendingSubscribe(getUpnpService(), subscription, activeStreamServers); - } catch (RouterException ex) { - throw new ProtocolCreationException( - "Failed to obtain local stream servers (for event callback URL creation) from router", - ex - ); - } - } - - public SendingRenewal createSendingRenewal(RemoteGENASubscription subscription) { - return new SendingRenewal(getUpnpService(), subscription); - } - - public SendingUnsubscribe createSendingUnsubscribe(RemoteGENASubscription subscription) { - return new SendingUnsubscribe(getUpnpService(), subscription); - } - - public SendingEvent createSendingEvent(LocalGENASubscription subscription) { - return new SendingEvent(getUpnpService(), subscription); - } - - protected ReceivingRetrieval createReceivingRetrieval(StreamRequestMessage message) { - return new ReceivingRetrieval(getUpnpService(), message); - } - - protected ReceivingAction createReceivingAction(StreamRequestMessage message) { - return new ReceivingAction(getUpnpService(), message); - } - - protected ReceivingSubscribe createReceivingSubscribe(StreamRequestMessage message) { - return new ReceivingSubscribe(getUpnpService(), message); - } - - protected ReceivingUnsubscribe createReceivingUnsubscribe(StreamRequestMessage message) { - return new ReceivingUnsubscribe(getUpnpService(), message); - } - - protected ReceivingEvent createReceivingEvent(StreamRequestMessage message) { - return new ReceivingEvent(getUpnpService(), message); - } -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/ReceivingAsync.java b/app/src/main/java/org/fourthline/cling/protocol/ReceivingAsync.java deleted file mode 100644 index cbb337f..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/ReceivingAsync.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.message.UpnpMessage; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.transport.RouterException; -import org.seamless.util.Exceptions; - -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Supertype for all asynchronously executing protocols, handling reception of UPnP messages. - *

- * After instantiation by the {@link ProtocolFactory}, this protocol run()s and - * calls its own {@link #waitBeforeExecution()} method. By default, the protocol does not wait - * before then proceeding with {@link #execute()}. - *

- * - * @param The type of UPnP message handled by this protocol. - * - * @author Christian Bauer - */ -public abstract class ReceivingAsync implements Runnable { - - final private static Logger log = Logger.getLogger(UpnpService.class.getName()); - - private final UpnpService upnpService; - - private M inputMessage; - - protected ReceivingAsync(UpnpService upnpService, M inputMessage) { - this.upnpService = upnpService; - this.inputMessage = inputMessage; - } - - public UpnpService getUpnpService() { - return upnpService; - } - - public M getInputMessage() { - return inputMessage; - } - - public void run() { - boolean proceed; - try { - proceed = waitBeforeExecution(); - } catch (InterruptedException ex) { - log.info("Protocol wait before execution interrupted (on shutdown?): " + getClass().getSimpleName()); - proceed = false; - } - - if (proceed) { - try { - execute(); - } catch (Exception ex) { - Throwable cause = Exceptions.unwrap(ex); - if (cause instanceof InterruptedException) { - log.log(Level.INFO, "Interrupted protocol '" + getClass().getSimpleName() + "': " + ex, cause); - } else { - throw new RuntimeException( - "Fatal error while executing protocol '" + getClass().getSimpleName() + "': " + ex, ex - ); - } - } - } - } - - /** - * Provides an opportunity to pause before executing the protocol. - * - * @return true (default) if execution should continue after waiting. - * - * @throws InterruptedException If waiting has been interrupted, which also stops execution. - */ - protected boolean waitBeforeExecution() throws InterruptedException { - // Don't wait by default - return true; - } - - protected abstract void execute() throws RouterException; - - protected H getFirstHeader(UpnpHeader.Type headerType, Class subtype) { - return getInputMessage().getHeaders().getFirstHeader(headerType, subtype); - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ")"; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/ReceivingSync.java b/app/src/main/java/org/fourthline/cling/protocol/ReceivingSync.java deleted file mode 100644 index 5c94ee8..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/ReceivingSync.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.profile.RemoteClientInfo; -import org.fourthline.cling.transport.RouterException; - -import java.util.logging.Logger; - -/** - * Supertype for all synchronously executing protocols, handling reception of UPnP messages and return a response. - *

- * After instantiation by the {@link ProtocolFactory}, this protocol run()s and - * calls its own {@link #waitBeforeExecution()} method. By default, the protocol does not wait - * before then proceeding with {@link #executeSync()}. - *

- *

- * The returned response will be available to the client of this protocol. The - * client will then call either {@link #responseSent(org.fourthline.cling.model.message.StreamResponseMessage)} - * or {@link #responseException(Throwable)}, depending on whether the response was successfully - * delivered. The protocol can override these methods to decide if the whole procedure it is - * implementing was successful or not, including not only creation but also delivery of the response. - *

- * - * @param The type of incoming UPnP message handled by this protocol. - * @param The type of response UPnP message created by this protocol. - * - * @author Christian Bauer - */ -public abstract class ReceivingSync extends ReceivingAsync { - - final private static Logger log = Logger.getLogger(UpnpService.class.getName()); - - final protected RemoteClientInfo remoteClientInfo; - protected OUT outputMessage; - - protected ReceivingSync(UpnpService upnpService, IN inputMessage) { - super(upnpService, inputMessage); - this.remoteClientInfo = new RemoteClientInfo(inputMessage); - } - - public OUT getOutputMessage() { - return outputMessage; - } - - final protected void execute() throws RouterException { - outputMessage = executeSync(); - - if (outputMessage != null && getRemoteClientInfo().getExtraResponseHeaders().size() > 0) { - log.fine("Setting extra headers on response message: " + getRemoteClientInfo().getExtraResponseHeaders().size()); - outputMessage.getHeaders().putAll(getRemoteClientInfo().getExtraResponseHeaders()); - } - } - - protected abstract OUT executeSync() throws RouterException; - - /** - * Called by the client of this protocol after the returned response has been successfully delivered. - *

- * NOOP by default. - *

- */ - public void responseSent(StreamResponseMessage responseMessage) { - } - - /** - * Called by the client of this protocol if the returned response was not delivered. - *

- * NOOP by default. - *

- * - * @param t The reason why the response wasn't delivered. - */ - public void responseException(Throwable t) { - } - - public RemoteClientInfo getRemoteClientInfo() { - return remoteClientInfo; - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ")"; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/RetrieveRemoteDescriptors.java b/app/src/main/java/org/fourthline/cling/protocol/RetrieveRemoteDescriptors.java deleted file mode 100644 index 7fc604b..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/RetrieveRemoteDescriptors.java +++ /dev/null @@ -1,373 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol; - -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.binding.xml.DescriptorBindingException; -import org.fourthline.cling.binding.xml.DeviceDescriptorBinder; -import org.fourthline.cling.binding.xml.ServiceDescriptorBinder; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.meta.Icon; -import org.fourthline.cling.model.meta.RemoteDevice; -import org.fourthline.cling.model.meta.RemoteService; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDN; -import org.fourthline.cling.registry.RegistrationException; -import org.fourthline.cling.transport.RouterException; -import org.seamless.util.Exceptions; - -/** - * Retrieves all remote device XML descriptors, parses them, creates an immutable device and service metadata graph. - *

- * This implementation encapsulates all steps which are necessary to create a fully usable and populated - * device metadata graph of a particular UPnP device. It starts with an unhydrated and typically just - * discovered {@link org.fourthline.cling.model.meta.RemoteDevice}, the only property that has to be available is - * its {@link org.fourthline.cling.model.meta.RemoteDeviceIdentity}. - *

- *

- * This protocol implementation will then retrieve the device's XML descriptor, parse it, and retrieve and - * parse all service descriptors until all device and service metadata has been retrieved. The fully - * hydrated device is then added to the {@link org.fourthline.cling.registry.Registry}. - *

- *

- * Any descriptor retrieval, parsing, or validation error of the metadata will abort this protocol - * with a warning message in the log. - *

- * - * @author Christian Bauer - */ -public class RetrieveRemoteDescriptors implements Runnable { - - final private static Logger log = Logger.getLogger(RetrieveRemoteDescriptors.class.getName()); - - private final UpnpService upnpService; - private RemoteDevice rd; - - private static final Set activeRetrievals = new CopyOnWriteArraySet(); - protected List errorsAlreadyLogged = new ArrayList(); - - public RetrieveRemoteDescriptors(UpnpService upnpService, RemoteDevice rd) { - this.upnpService = upnpService; - this.rd = rd; - } - - public UpnpService getUpnpService() { - return upnpService; - } - - public void run() { - - URL deviceURL = rd.getIdentity().getDescriptorURL(); - - // Performance optimization, try to avoid concurrent GET requests for device descriptor, - // if we retrieve it once, we have the hydrated device. There is no different outcome - // processing this several times concurrently. - - if (activeRetrievals.contains(deviceURL)) { - log.finer("Exiting early, active retrieval for URL already in progress: " + deviceURL); - return; - } - - // Exit if it has been discovered already, could be we have been waiting in the executor queue too long - if (getUpnpService().getRegistry().getRemoteDevice(rd.getIdentity().getUdn(), true) != null) { - log.finer("Exiting early, already discovered: " + deviceURL); - return; - } - - try { - activeRetrievals.add(deviceURL); - describe(); - } catch (RouterException ex) { - log.log(Level.WARNING, - "Descriptor retrieval failed: " + deviceURL, - ex - ); - } finally { - activeRetrievals.remove(deviceURL); - } - } - - protected void describe() throws RouterException { - - // All of the following is a very expensive and time consuming procedure, thanks to the - // braindead design of UPnP. Several GET requests, several descriptors, several XML parsing - // steps - all of this could be done with one and it wouldn't make a difference. So every - // call of this method has to be really necessary and rare. - - if(getUpnpService().getRouter() == null) { - log.warning("Router not yet initialized"); - return ; - } - - StreamRequestMessage deviceDescRetrievalMsg; - StreamResponseMessage deviceDescMsg; - - try { - - deviceDescRetrievalMsg = - new StreamRequestMessage(UpnpRequest.Method.GET, rd.getIdentity().getDescriptorURL()); - - // Extra headers - UpnpHeaders headers = - getUpnpService().getConfiguration().getDescriptorRetrievalHeaders(rd.getIdentity()); - if (headers != null) - deviceDescRetrievalMsg.getHeaders().putAll(headers); - - log.fine("Sending device descriptor retrieval message: " + deviceDescRetrievalMsg); - deviceDescMsg = getUpnpService().getRouter().send(deviceDescRetrievalMsg); - - } catch(IllegalArgumentException ex) { - // UpnpRequest constructor can throw IllegalArgumentException on invalid URI - // IllegalArgumentException can also be thrown by Apache HttpClient on blank URI in send() - log.warning( - "Device descriptor retrieval failed: " - + rd.getIdentity().getDescriptorURL() - + ", possibly invalid URL: " + ex); - return ; - } - - if (deviceDescMsg == null) { - log.warning( - "Device descriptor retrieval failed, no response: " + rd.getIdentity().getDescriptorURL() - ); - return; - } - - if (deviceDescMsg.getOperation().isFailed()) { - log.warning( - "Device descriptor retrieval failed: " - + rd.getIdentity().getDescriptorURL() + - ", " - + deviceDescMsg.getOperation().getResponseDetails() - ); - return; - } - - if (!deviceDescMsg.isContentTypeTextUDA()) { - log.fine( - "Received device descriptor without or with invalid Content-Type: " - + rd.getIdentity().getDescriptorURL()); - // We continue despite the invalid UPnP message because we can still hope to convert the content - } - - String descriptorContent = deviceDescMsg.getBodyString(); - if (descriptorContent == null || descriptorContent.length() == 0) { - log.warning("Received empty device descriptor:" + rd.getIdentity().getDescriptorURL()); - return; - } - - log.fine("Received root device descriptor: " + deviceDescMsg); - describe(descriptorContent); - } - - protected void describe(String descriptorXML) throws RouterException { - - boolean notifiedStart = false; - RemoteDevice describedDevice = null; - try { - - DeviceDescriptorBinder deviceDescriptorBinder = - getUpnpService().getConfiguration().getDeviceDescriptorBinderUDA10(); - - describedDevice = deviceDescriptorBinder.describe( - rd, - descriptorXML - ); - - log.fine("Remote device described (without services) notifying listeners: " + describedDevice); - notifiedStart = getUpnpService().getRegistry().notifyDiscoveryStart(describedDevice); - - log.fine("Hydrating described device's services: " + describedDevice); - RemoteDevice hydratedDevice = describeServices(describedDevice); - if (hydratedDevice == null) { - if(!errorsAlreadyLogged.contains(rd.getIdentity().getUdn())) { - errorsAlreadyLogged.add(rd.getIdentity().getUdn()); - log.warning("Device service description failed: " + rd); - } - if (notifiedStart) - getUpnpService().getRegistry().notifyDiscoveryFailure( - describedDevice, - new DescriptorBindingException("Device service description failed: " + rd) - ); - return; - } - - log.fine("Adding fully hydrated remote device to registry: " + hydratedDevice); - // The registry will do the right thing: A new root device is going to be added, if it's - // already present or we just received the descriptor again (because we got an embedded - // devices' notification), it will simply update the expiration timestamp of the root - // device. - getUpnpService().getRegistry().addDevice(hydratedDevice); - - } catch (ValidationException ex) { - // Avoid error log spam each time device is discovered, errors are logged once per device. - if(!errorsAlreadyLogged.contains(rd.getIdentity().getUdn())) { - errorsAlreadyLogged.add(rd.getIdentity().getUdn()); - log.warning("Could not validate device model: " + rd); - for (ValidationError validationError : ex.getErrors()) { - log.warning(validationError.toString()); - } - if (describedDevice != null && notifiedStart) - getUpnpService().getRegistry().notifyDiscoveryFailure(describedDevice, ex); - } - - } catch (DescriptorBindingException ex) { - log.warning("Could not hydrate device or its services from descriptor: " + rd); - log.warning("Cause was: " + Exceptions.unwrap(ex)); - if (describedDevice != null && notifiedStart) - getUpnpService().getRegistry().notifyDiscoveryFailure(describedDevice, ex); - - } catch (RegistrationException ex) { - log.warning("Adding hydrated device to registry failed: " + rd); - log.warning("Cause was: " + ex.toString()); - if (describedDevice != null && notifiedStart) - getUpnpService().getRegistry().notifyDiscoveryFailure(describedDevice, ex); - } - } - - protected RemoteDevice describeServices(RemoteDevice currentDevice) - throws RouterException, DescriptorBindingException, ValidationException { - - List describedServices = new ArrayList(); - if (currentDevice.hasServices()) { - List filteredServices = filterExclusiveServices(currentDevice.getServices()); - for (RemoteService service : filteredServices) { - RemoteService svc = describeService(service); - if (svc == null) { // Something went wrong, bail out - return null; - } - describedServices.add(svc); - } - } - - List describedEmbeddedDevices = new ArrayList(); - if (currentDevice.hasEmbeddedDevices()) { - for (RemoteDevice embeddedDevice : currentDevice.getEmbeddedDevices()) { - if (embeddedDevice == null) continue; - RemoteDevice describedEmbeddedDevice = describeServices(embeddedDevice); - if (describedEmbeddedDevice == null) { // Something was wrong, recursively - return null; - } - describedEmbeddedDevices.add(describedEmbeddedDevice); - } - } - - Icon[] iconDupes = new Icon[currentDevice.getIcons().length]; - for (int i = 0; i < currentDevice.getIcons().length; i++) { - Icon icon = currentDevice.getIcons()[i]; - iconDupes[i] = icon.deepCopy(); - } - - // Yes, we create a completely new immutable graph here - return currentDevice.newInstance( - currentDevice.getIdentity().getUdn(), - currentDevice.getVersion(), - currentDevice.getType(), - currentDevice.getDetails(), - iconDupes, - currentDevice.toServiceArray(describedServices), - describedEmbeddedDevices - ); - } - - protected RemoteService describeService(RemoteService service) - throws RouterException, DescriptorBindingException, ValidationException { - - URL descriptorURL; - try { - descriptorURL = service.getDevice().normalizeURI(service.getDescriptorURI()); - } catch(IllegalArgumentException e) { - log.warning("Could not normalize service descriptor URL: " + service.getDescriptorURI()); - return null; - } - - StreamRequestMessage serviceDescRetrievalMsg = new StreamRequestMessage(UpnpRequest.Method.GET, descriptorURL); - - // Extra headers - UpnpHeaders headers = - getUpnpService().getConfiguration().getDescriptorRetrievalHeaders(service.getDevice().getIdentity()); - if (headers != null) - serviceDescRetrievalMsg.getHeaders().putAll(headers); - - log.fine("Sending service descriptor retrieval message: " + serviceDescRetrievalMsg); - StreamResponseMessage serviceDescMsg = getUpnpService().getRouter().send(serviceDescRetrievalMsg); - - if (serviceDescMsg == null) { - log.warning("Could not retrieve service descriptor, no response: " + service); - return null; - } - - if (serviceDescMsg.getOperation().isFailed()) { - log.warning("Service descriptor retrieval failed: " - + descriptorURL - + ", " - + serviceDescMsg.getOperation().getResponseDetails()); - return null; - } - - if (!serviceDescMsg.isContentTypeTextUDA()) { - log.fine("Received service descriptor without or with invalid Content-Type: " + descriptorURL); - // We continue despite the invalid UPnP message because we can still hope to convert the content - } - - String descriptorContent = serviceDescMsg.getBodyString(); - if (descriptorContent == null || descriptorContent.length() == 0) { - log.warning("Received empty service descriptor:" + descriptorURL); - return null; - } - - log.fine("Received service descriptor, hydrating service model: " + serviceDescMsg); - ServiceDescriptorBinder serviceDescriptorBinder = - getUpnpService().getConfiguration().getServiceDescriptorBinderUDA10(); - - return serviceDescriptorBinder.describe(service, descriptorContent); - } - - protected List filterExclusiveServices(RemoteService[] services) { - ServiceType[] exclusiveTypes = getUpnpService().getConfiguration().getExclusiveServiceTypes(); - - if (exclusiveTypes == null || exclusiveTypes.length == 0) - return Arrays.asList(services); - - List exclusiveServices = new ArrayList(); - for (RemoteService discoveredService : services) { - for (ServiceType exclusiveType : exclusiveTypes) { - if (discoveredService.getServiceType().implementsVersion(exclusiveType)) { - log.fine("Including exclusive service: " + discoveredService); - exclusiveServices.add(discoveredService); - } else { - log.fine("Excluding unwanted service: " + exclusiveType); - } - } - } - return exclusiveServices; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/SendingAsync.java b/app/src/main/java/org/fourthline/cling/protocol/SendingAsync.java deleted file mode 100644 index a245a55..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/SendingAsync.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.transport.RouterException; -import org.seamless.util.Exceptions; - -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Supertype for all synchronously executing protocols, sending UPnP messages. - *

- * After instantiation by the {@link ProtocolFactory}, this protocol run()s and - * calls its {@link #execute()} method. - *

- *

- * A {@link RouterException} during execution will be wrapped in a fatal RuntimeException, - * unless its cause is an InterruptedException, in which case an INFO message will be logged. - *

- * - * @author Christian Bauer - */ -public abstract class SendingAsync implements Runnable { - - final private static Logger log = Logger.getLogger(UpnpService.class.getName()); - - private final UpnpService upnpService; - - protected SendingAsync(UpnpService upnpService) { - this.upnpService = upnpService; - } - - public UpnpService getUpnpService() { - return upnpService; - } - - public void run() { - try { - execute(); - } catch (Exception ex) { - Throwable cause = Exceptions.unwrap(ex); - if (cause instanceof InterruptedException) { - log.log(Level.INFO, "Interrupted protocol '" + getClass().getSimpleName() + "': " + ex, cause); - } else { - throw new RuntimeException( - "Fatal error while executing protocol '" + getClass().getSimpleName() + "': " + ex, ex - ); - } - } - } - - protected abstract void execute() throws RouterException; - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ")"; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/protocol/SendingSync.java b/app/src/main/java/org/fourthline/cling/protocol/SendingSync.java deleted file mode 100644 index be44d0f..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/SendingSync.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol; - -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.transport.RouterException; - -/** - * Supertype for all synchronously executing protocols, sending UPnP messages. - *

- * After instantiation by the {@link ProtocolFactory}, this protocol run()s and - * calls its {@link #executeSync()} method. - *

- * - * @param The type of request UPnP message send by this protocol. - * @param The type of response UPnP message expected by this protocol. - * - * @author Christian Bauer - */ -public abstract class SendingSync extends SendingAsync { - - final private IN inputMessage; - protected OUT outputMessage; - - protected SendingSync(UpnpService upnpService, IN inputMessage) { - super(upnpService); - this.inputMessage = inputMessage; - } - - public IN getInputMessage() { - return inputMessage; - } - - public OUT getOutputMessage() { - return outputMessage; - } - - final protected void execute() throws RouterException { - outputMessage = executeSync(); - } - - protected abstract OUT executeSync() throws RouterException; - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ")"; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/protocol/async/ReceivingNotification.java b/app/src/main/java/org/fourthline/cling/protocol/async/ReceivingNotification.java deleted file mode 100644 index af0674c..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/async/ReceivingNotification.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.async; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.discovery.IncomingNotificationRequest; -import org.fourthline.cling.model.meta.RemoteDevice; -import org.fourthline.cling.model.meta.RemoteDeviceIdentity; -import org.fourthline.cling.model.types.UDN; -import org.fourthline.cling.protocol.ReceivingAsync; -import org.fourthline.cling.protocol.RetrieveRemoteDescriptors; -import org.fourthline.cling.transport.RouterException; - -import java.util.logging.Logger; - -/** - * Handles reception of notification messages. - *

- * First, the UDN is created from the received message. - *

- *

- * If an ALIVE message has been received, a new background process will be started - * running {@link org.fourthline.cling.protocol.RetrieveRemoteDescriptors}. - *

- *

- * If a BYEBYE message has been received, the device will be removed from the registry - * directly. - *

- *

- * The following was added to the UDA 1.1 spec (in 1.3), clarifying the handling of messages: - *

- *

- * "If a control point has received at least one 'byebye' message of a root device, embedded device, or - * service, then the control point can assume that all are no longer available." - *

- *

- * Of course, they contradict this a little later: - *

- *

- * "Only when all original advertisements of a root device, embedded device, and services have - * expired can a control point assume that they are no longer available." - *

- *

- * This could mean that even if we get 'byeby'e for the root device, we still have to assume that its services - * are available. That clearly makes no sense at all and I think it's just badly worded and relates to the - * previous sentence wich says "if you don't get byebye's, rely on the expiration timeout". It does not - * imply that a service or embedded device lives beyond its root device. It actually reinforces that we are - * free to ignore anything that happens as long as the root device is not gone with 'byebye' or has expired. - * In other words: There is no reason at all why SSDP sends dozens of messages for all embedded devices and - * services. The composite is the root device and the composite defines the lifecycle of all. - *

- * - * @author Christian Bauer - */ -public class ReceivingNotification extends ReceivingAsync { - - final private static Logger log = Logger.getLogger(ReceivingNotification.class.getName()); - - public ReceivingNotification(UpnpService upnpService, IncomingDatagramMessage inputMessage) { - super(upnpService, new IncomingNotificationRequest(inputMessage)); - } - - protected void execute() throws RouterException { - - UDN udn = getInputMessage().getUDN(); - if (udn == null) { - log.fine("Ignoring notification message without UDN: " + getInputMessage()); - return; - } - - RemoteDeviceIdentity rdIdentity = new RemoteDeviceIdentity(getInputMessage()); - log.fine("Received device notification: " + rdIdentity); - - RemoteDevice rd; - try { - rd = new RemoteDevice(rdIdentity); - } catch (ValidationException ex) { - log.warning("Validation errors of device during discovery: " + rdIdentity); - for (ValidationError validationError : ex.getErrors()) { - log.warning(validationError.toString()); - } - return; - } - - if (getInputMessage().isAliveMessage()) { - - log.fine("Received device ALIVE advertisement, descriptor location is: " + rdIdentity.getDescriptorURL()); - - if (rdIdentity.getDescriptorURL() == null) { - log.finer("Ignoring message without location URL header: " + getInputMessage()); - return; - } - - if (rdIdentity.getMaxAgeSeconds() == null) { - log.finer("Ignoring message without max-age header: " + getInputMessage()); - return; - } - - if (getUpnpService().getRegistry().update(rdIdentity)) { - log.finer("Remote device was already known: " + udn); - return; - } - - // Unfortunately, we always have to retrieve the descriptor because at this point we - // have no idea if it's a root or embedded device - getUpnpService().getConfiguration().getAsyncProtocolExecutor().execute( - new RetrieveRemoteDescriptors(getUpnpService(), rd) - ); - - } else if (getInputMessage().isByeByeMessage()) { - - log.fine("Received device BYEBYE advertisement"); - boolean removed = getUpnpService().getRegistry().removeDevice(rd); - if (removed) { - log.fine("Removed remote device from registry: " + rd); - } - - } else { - log.finer("Ignoring unknown notification message: " + getInputMessage()); - } - - } - - -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/async/ReceivingSearch.java b/app/src/main/java/org/fourthline/cling/protocol/async/ReceivingSearch.java deleted file mode 100644 index 3715d61..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/async/ReceivingSearch.java +++ /dev/null @@ -1,352 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.async; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Random; -import java.util.logging.Logger; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.DiscoveryOptions; -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.NetworkAddress; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.discovery.IncomingSearchRequest; -import org.fourthline.cling.model.message.discovery.OutgoingSearchResponse; -import org.fourthline.cling.model.message.discovery.OutgoingSearchResponseDeviceType; -import org.fourthline.cling.model.message.discovery.OutgoingSearchResponseRootDevice; -import org.fourthline.cling.model.message.discovery.OutgoingSearchResponseServiceType; -import org.fourthline.cling.model.message.discovery.OutgoingSearchResponseUDN; -import org.fourthline.cling.model.message.header.DeviceTypeHeader; -import org.fourthline.cling.model.message.header.MXHeader; -import org.fourthline.cling.model.message.header.RootDeviceHeader; -import org.fourthline.cling.model.message.header.STAllHeader; -import org.fourthline.cling.model.message.header.ServiceTypeHeader; -import org.fourthline.cling.model.message.header.UDNHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.types.DeviceType; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDN; -import org.fourthline.cling.protocol.ReceivingAsync; -import org.fourthline.cling.transport.RouterException; - -/** - * Handles reception of search requests, responds for local registered devices. - *

- * Waits a random time between 0 and the requested MX (maximum 120 seconds) - * before executing. Only waits if there are actually any registered local devices. - *

- *

- * Extracts the search target, builds and sends the dozens of messages - * required by the UPnP specification, depending on the search target and what - * local devices and services are found in the {@link org.fourthline.cling.registry.Registry}. - *

- * - * @author Christian Bauer - */ -public class ReceivingSearch extends ReceivingAsync { - - final private static Logger log = Logger.getLogger(ReceivingSearch.class.getName()); - - final protected Random randomGenerator = new Random(); - - public ReceivingSearch(UpnpService upnpService, IncomingDatagramMessage inputMessage) { - super(upnpService, new IncomingSearchRequest(inputMessage)); - } - - protected void execute() throws RouterException { - if (getUpnpService().getRouter() == null) { - // TODO: http://mailinglists.945824.n3.nabble.com/rare-NPE-on-start-tp3078213p3142767.html - log.fine("Router hasn't completed initialization, ignoring received search message"); - return; - } - - if (!getInputMessage().isMANSSDPDiscover()) { - log.fine("Invalid search request, no or invalid MAN ssdp:discover header: " + getInputMessage()); - return; - } - - UpnpHeader searchTarget = getInputMessage().getSearchTarget(); - - if (searchTarget == null) { - log.fine("Invalid search request, did not contain ST header: " + getInputMessage()); - return; - } - - List activeStreamServers = - getUpnpService().getRouter().getActiveStreamServers(getInputMessage().getLocalAddress()); - if (activeStreamServers.size() == 0) { - log.fine("Aborting search response, no active stream servers found (network disabled?)"); - return; - } - - for (NetworkAddress activeStreamServer : activeStreamServers) { - sendResponses(searchTarget, activeStreamServer); - } - } - - @Override - protected boolean waitBeforeExecution() throws InterruptedException { - - Integer mx = getInputMessage().getMX(); - - if (mx == null) { - log.fine("Invalid search request, did not contain MX header: " + getInputMessage()); - return false; - } - - // Spec says we should assume "less" if it's 120 or more - // From the spec, MX should be "greater than or equal to 1" - // Prevent negative MX to make nextInt() throw IllegalArgumentException below - if (mx > 120 || mx <= 0) mx = MXHeader.DEFAULT_VALUE; - - // Only wait if there is something to wait for - if (getUpnpService().getRegistry().getLocalDevices().size() > 0) { - int sleepTime = randomGenerator.nextInt(mx * 1000); - log.fine("Sleeping " + sleepTime + " milliseconds to avoid flooding with search responses"); - Thread.sleep(sleepTime); - } - - return true; - } - - protected void sendResponses(UpnpHeader searchTarget, NetworkAddress activeStreamServer) throws RouterException { - if (searchTarget instanceof STAllHeader) { - - sendSearchResponseAll(activeStreamServer); - - } else if (searchTarget instanceof RootDeviceHeader) { - - sendSearchResponseRootDevices(activeStreamServer); - - } else if (searchTarget instanceof UDNHeader) { - - sendSearchResponseUDN((UDN) searchTarget.getValue(), activeStreamServer); - - } else if (searchTarget instanceof DeviceTypeHeader) { - - sendSearchResponseDeviceType((DeviceType) searchTarget.getValue(), activeStreamServer); - - } else if (searchTarget instanceof ServiceTypeHeader) { - - sendSearchResponseServiceType((ServiceType) searchTarget.getValue(), activeStreamServer); - - } else { - log.warning("Non-implemented search request target: " + searchTarget.getClass()); - } - } - - protected void sendSearchResponseAll(NetworkAddress activeStreamServer) throws RouterException { - log.fine("Responding to 'all' search with advertisement messages for all local devices"); - for (LocalDevice localDevice : getUpnpService().getRegistry().getLocalDevices()) { - - if (isAdvertisementDisabled(localDevice)) - continue; - - // We are re-using the regular notification messages here but override the NT with the ST header - log.finer("Sending root device messages: " + localDevice); - List rootDeviceMsgs = - createDeviceMessages(localDevice, activeStreamServer); - for (OutgoingSearchResponse upnpMessage : rootDeviceMsgs) { - getUpnpService().getRouter().send(upnpMessage); - } - - if (localDevice.hasEmbeddedDevices()) { - for (LocalDevice embeddedDevice : localDevice.findEmbeddedDevices()) { - log.finer("Sending embedded device messages: " + embeddedDevice); - List embeddedDeviceMsgs = - createDeviceMessages(embeddedDevice, activeStreamServer); - for (OutgoingSearchResponse upnpMessage : embeddedDeviceMsgs) { - getUpnpService().getRouter().send(upnpMessage); - } - } - } - - List serviceTypeMsgs = - createServiceTypeMessages(localDevice, activeStreamServer); - if (serviceTypeMsgs.size() > 0) { - log.finer("Sending service type messages"); - for (OutgoingSearchResponse upnpMessage : serviceTypeMsgs) { - getUpnpService().getRouter().send(upnpMessage); - } - } - - } - } - - protected List createDeviceMessages(LocalDevice device, - NetworkAddress activeStreamServer) { - List msgs = new ArrayList(); - - // See the tables in UDA 1.0 section 1.1.2 - - if (device.isRoot()) { - msgs.add( - new OutgoingSearchResponseRootDevice( - getInputMessage(), - getDescriptorLocation(activeStreamServer, device), - device - ) - ); - } - - msgs.add( - new OutgoingSearchResponseUDN( - getInputMessage(), - getDescriptorLocation(activeStreamServer, device), - device - ) - ); - - msgs.add( - new OutgoingSearchResponseDeviceType( - getInputMessage(), - getDescriptorLocation(activeStreamServer, device), - device - ) - ); - - for (OutgoingSearchResponse msg : msgs) { - prepareOutgoingSearchResponse(msg); - } - - return msgs; - } - - protected List createServiceTypeMessages(LocalDevice device, - NetworkAddress activeStreamServer) { - List msgs = new ArrayList(); - for (ServiceType serviceType : device.findServiceTypes()) { - OutgoingSearchResponse message = - new OutgoingSearchResponseServiceType( - getInputMessage(), - getDescriptorLocation(activeStreamServer, device), - device, - serviceType - ); - prepareOutgoingSearchResponse(message); - msgs.add(message); - } - return msgs; - } - - protected void sendSearchResponseRootDevices(NetworkAddress activeStreamServer) throws RouterException { - log.fine("Responding to root device search with advertisement messages for all local root devices"); - for (LocalDevice device : getUpnpService().getRegistry().getLocalDevices()) { - - if (isAdvertisementDisabled(device)) - continue; - - OutgoingSearchResponse message = - new OutgoingSearchResponseRootDevice( - getInputMessage(), - getDescriptorLocation(activeStreamServer, device), - device - ); - prepareOutgoingSearchResponse(message); - getUpnpService().getRouter().send(message); - } - } - - protected void sendSearchResponseUDN(UDN udn, NetworkAddress activeStreamServer) throws RouterException { - Device device = getUpnpService().getRegistry().getDevice(udn, false); - if (device != null && device instanceof LocalDevice) { - - if (isAdvertisementDisabled((LocalDevice)device)) - return; - - log.fine("Responding to UDN device search: " + udn); - OutgoingSearchResponse message = - new OutgoingSearchResponseUDN( - getInputMessage(), - getDescriptorLocation(activeStreamServer, (LocalDevice) device), - (LocalDevice) device - ); - prepareOutgoingSearchResponse(message); - getUpnpService().getRouter().send(message); - } - } - - protected void sendSearchResponseDeviceType(DeviceType deviceType, NetworkAddress activeStreamServer) throws RouterException{ - log.fine("Responding to device type search: " + deviceType); - Collection devices = getUpnpService().getRegistry().getDevices(deviceType); - for (Device device : devices) { - if (device instanceof LocalDevice) { - - if (isAdvertisementDisabled((LocalDevice)device)) - continue; - - log.finer("Sending matching device type search result for: " + device); - OutgoingSearchResponse message = - new OutgoingSearchResponseDeviceType( - getInputMessage(), - getDescriptorLocation(activeStreamServer, (LocalDevice) device), - (LocalDevice) device - ); - prepareOutgoingSearchResponse(message); - getUpnpService().getRouter().send(message); - } - } - } - - protected void sendSearchResponseServiceType(ServiceType serviceType, NetworkAddress activeStreamServer) throws RouterException { - log.fine("Responding to service type search: " + serviceType); - Collection devices = getUpnpService().getRegistry().getDevices(serviceType); - for (Device device : devices) { - if (device instanceof LocalDevice) { - - if (isAdvertisementDisabled((LocalDevice)device)) - continue; - - log.finer("Sending matching service type search result: " + device); - OutgoingSearchResponse message = - new OutgoingSearchResponseServiceType( - getInputMessage(), - getDescriptorLocation(activeStreamServer, (LocalDevice) device), - (LocalDevice) device, - serviceType - ); - prepareOutgoingSearchResponse(message); - getUpnpService().getRouter().send(message); - } - } - } - - protected Location getDescriptorLocation(NetworkAddress activeStreamServer, LocalDevice device) { - return new Location( - activeStreamServer, - getUpnpService().getConfiguration().getNamespace().getDescriptorPath(device) - ); - } - - protected boolean isAdvertisementDisabled(LocalDevice device) { - DiscoveryOptions options = - getUpnpService().getRegistry().getDiscoveryOptions(device.getIdentity().getUdn()); - return options != null && !options.isAdvertised(); - } - - /** - * Override this to edit the outgoing message, e.g. by adding headers. - */ - protected void prepareOutgoingSearchResponse(OutgoingSearchResponse message) { - } - -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/async/ReceivingSearchResponse.java b/app/src/main/java/org/fourthline/cling/protocol/async/ReceivingSearchResponse.java deleted file mode 100644 index a8f0ab7..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/async/ReceivingSearchResponse.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.async; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.ValidationError; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.discovery.IncomingSearchResponse; -import org.fourthline.cling.model.meta.RemoteDevice; -import org.fourthline.cling.model.meta.RemoteDeviceIdentity; -import org.fourthline.cling.model.types.UDN; -import org.fourthline.cling.protocol.ReceivingAsync; -import org.fourthline.cling.protocol.RetrieveRemoteDescriptors; -import org.fourthline.cling.transport.RouterException; - -import java.util.logging.Logger; - -/** - * Handles reception of search response messages. - *

- * This protocol implementation is basically the same as - * the {@link org.fourthline.cling.protocol.async.ReceivingNotification} protocol for - * an ALIVE message. - *

- * - * @author Christian Bauer - */ -public class ReceivingSearchResponse extends ReceivingAsync { - - final private static Logger log = Logger.getLogger(ReceivingSearchResponse.class.getName()); - - public ReceivingSearchResponse(UpnpService upnpService, IncomingDatagramMessage inputMessage) { - super(upnpService, new IncomingSearchResponse(inputMessage)); - } - - protected void execute() throws RouterException { - - if (!getInputMessage().isSearchResponseMessage()) { - log.fine("Ignoring invalid search response message: " + getInputMessage()); - return; - } - - UDN udn = getInputMessage().getRootDeviceUDN(); - if (udn == null) { - log.fine("Ignoring search response message without UDN: " + getInputMessage()); - return; - } - - RemoteDeviceIdentity rdIdentity = new RemoteDeviceIdentity(getInputMessage()); - log.fine("Received device search response: " + rdIdentity); - - if (getUpnpService().getRegistry().update(rdIdentity)) { - log.fine("Remote device was already known: " + udn); - return; - } - - RemoteDevice rd; - try { - rd = new RemoteDevice(rdIdentity); - } catch (ValidationException ex) { - log.warning("Validation errors of device during discovery: " + rdIdentity); - for (ValidationError validationError : ex.getErrors()) { - log.warning(validationError.toString()); - } - return; - } - - if (rdIdentity.getDescriptorURL() == null) { - log.finer("Ignoring message without location URL header: " + getInputMessage()); - return; - } - - if (rdIdentity.getMaxAgeSeconds() == null) { - log.finer("Ignoring message without max-age header: " + getInputMessage()); - return; - } - - // Unfortunately, we always have to retrieve the descriptor because at this point we - // have no idea if it's a root or embedded device - getUpnpService().getConfiguration().getAsyncProtocolExecutor().execute( - new RetrieveRemoteDescriptors(getUpnpService(), rd) - ); - - } - -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/async/SendingNotification.java b/app/src/main/java/org/fourthline/cling/protocol/async/SendingNotification.java deleted file mode 100644 index 9486282..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/async/SendingNotification.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.async; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.Location; -import org.fourthline.cling.model.NetworkAddress; -import org.fourthline.cling.model.message.discovery.OutgoingNotificationRequest; -import org.fourthline.cling.model.message.discovery.OutgoingNotificationRequestDeviceType; -import org.fourthline.cling.model.message.discovery.OutgoingNotificationRequestRootDevice; -import org.fourthline.cling.model.message.discovery.OutgoingNotificationRequestServiceType; -import org.fourthline.cling.model.message.discovery.OutgoingNotificationRequestUDN; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.types.NotificationSubtype; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.protocol.SendingAsync; -import org.fourthline.cling.transport.RouterException; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -/** - * Sending notification messages for a registered local device. - *

- * Sends all required (dozens) of messages three times, waits between 0 and 150 - * milliseconds between each bulk sending procedure. - *

- * - * @author Christian Bauer - */ -public abstract class SendingNotification extends SendingAsync { - - final private static Logger log = Logger.getLogger(SendingNotification.class.getName()); - - private LocalDevice device; - - public SendingNotification(UpnpService upnpService, LocalDevice device) { - super(upnpService); - this.device = device; - } - - public LocalDevice getDevice() { - return device; - } - - protected void execute() throws RouterException { - - List activeStreamServers = - getUpnpService().getRouter().getActiveStreamServers(null); - if (activeStreamServers.size() == 0) { - log.fine("Aborting notifications, no active stream servers found (network disabled?)"); - return; - } - - // Prepare it once, it's the same for each repetition - List descriptorLocations = new ArrayList(); - for (NetworkAddress activeStreamServer : activeStreamServers) { - descriptorLocations.add( - new Location( - activeStreamServer, - getUpnpService().getConfiguration().getNamespace().getDescriptorPath(getDevice()) - ) - ); - } - - for (int i = 0; i < getBulkRepeat(); i++) { - try { - - for (Location descriptorLocation : descriptorLocations) { - sendMessages(descriptorLocation); - } - - // UDA 1.0 is silent about this but UDA 1.1 recomments "a few hundred milliseconds" - log.finer("Sleeping " + getBulkIntervalMilliseconds() + " milliseconds"); - Thread.sleep(getBulkIntervalMilliseconds()); - - } catch (InterruptedException ex) { - log.warning("Advertisement thread was interrupted: " + ex); - } - } - } - - protected int getBulkRepeat() { - return 3; // UDA 1.0 says maximum 3 times for alive messages, let's just do it for all - } - - protected int getBulkIntervalMilliseconds() { - return 150; - } - - public void sendMessages(Location descriptorLocation) throws RouterException { - log.finer("Sending root device messages: " + getDevice()); - List rootDeviceMsgs = - createDeviceMessages(getDevice(), descriptorLocation); - for (OutgoingNotificationRequest upnpMessage : rootDeviceMsgs) { - getUpnpService().getRouter().send(upnpMessage); - } - - if (getDevice().hasEmbeddedDevices()) { - for (LocalDevice embeddedDevice : getDevice().findEmbeddedDevices()) { - log.finer("Sending embedded device messages: " + embeddedDevice); - List embeddedDeviceMsgs = - createDeviceMessages(embeddedDevice, descriptorLocation); - for (OutgoingNotificationRequest upnpMessage : embeddedDeviceMsgs) { - getUpnpService().getRouter().send(upnpMessage); - } - } - } - - List serviceTypeMsgs = - createServiceTypeMessages(getDevice(), descriptorLocation); - if (serviceTypeMsgs.size() > 0) { - log.finer("Sending service type messages"); - for (OutgoingNotificationRequest upnpMessage : serviceTypeMsgs) { - getUpnpService().getRouter().send(upnpMessage); - } - } - } - - protected List createDeviceMessages(LocalDevice device, - Location descriptorLocation) { - List msgs = new ArrayList(); - - // See the tables in UDA 1.0 section 1.1.2 - - if (device.isRoot()) { - msgs.add( - new OutgoingNotificationRequestRootDevice( - descriptorLocation, - device, - getNotificationSubtype() - ) - ); - } - - msgs.add( - new OutgoingNotificationRequestUDN( - descriptorLocation, device, getNotificationSubtype() - ) - ); - msgs.add( - new OutgoingNotificationRequestDeviceType( - descriptorLocation, device, getNotificationSubtype() - ) - ); - - return msgs; - } - - protected List createServiceTypeMessages(LocalDevice device, - Location descriptorLocation) { - List msgs = new ArrayList(); - - for (ServiceType serviceType : device.findServiceTypes()) { - msgs.add( - new OutgoingNotificationRequestServiceType( - descriptorLocation, device, - getNotificationSubtype(), serviceType - ) - ); - } - - return msgs; - } - - protected abstract NotificationSubtype getNotificationSubtype(); - -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/async/SendingNotificationAlive.java b/app/src/main/java/org/fourthline/cling/protocol/async/SendingNotificationAlive.java deleted file mode 100644 index 6f714fc..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/async/SendingNotificationAlive.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.async; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.types.NotificationSubtype; -import org.fourthline.cling.transport.RouterException; - -import java.util.logging.Logger; - -/** - * Sending ALIVE notification messages for a registered local device. - * - * @author Christian Bauer - */ -public class SendingNotificationAlive extends SendingNotification { - - final private static Logger log = Logger.getLogger(SendingNotification.class.getName()); - - public SendingNotificationAlive(UpnpService upnpService, LocalDevice device) { - super(upnpService, device); - } - - @Override - protected void execute() throws RouterException { - log.fine("Sending alive messages ("+getBulkRepeat()+" times) for: " + getDevice()); - super.execute(); - } - - protected NotificationSubtype getNotificationSubtype() { - return NotificationSubtype.ALIVE; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/async/SendingNotificationByebye.java b/app/src/main/java/org/fourthline/cling/protocol/async/SendingNotificationByebye.java deleted file mode 100644 index 3536a7f..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/async/SendingNotificationByebye.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.async; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.types.NotificationSubtype; -import org.fourthline.cling.transport.RouterException; - -import java.util.logging.Logger; - -/** - * Sending BYEBYE notification messages for a registered local device. - * - * @author Christian Bauer - */ -public class SendingNotificationByebye extends SendingNotification { - - final private static Logger log = Logger.getLogger(SendingNotification.class.getName()); - - public SendingNotificationByebye(UpnpService upnpService, LocalDevice device) { - super(upnpService, device); - } - - // The UDA 1.0 spec says "a message corresponding to /each/ of the ssd:alive messages" but - // it's not clear if that means the "required" messages according to the tables only or if - // it includes the triple (or whatever) repeated messages that have been sent to protect - // against networking problems. It also says, a little later, that "each of the messages should - // be send more than once". So we are also sending them three times - hell, why not pollute the - // network with useless stuff, that is going to make this more reliable for sure... - - // In other words: The superclass method is fine even for byebye. - - @Override - protected void execute() throws RouterException { - log.fine("Sending byebye messages ("+getBulkRepeat()+" times) for: " + getDevice()); - super.execute(); - } - - protected NotificationSubtype getNotificationSubtype() { - return NotificationSubtype.BYEBYE; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/protocol/async/SendingSearch.java b/app/src/main/java/org/fourthline/cling/protocol/async/SendingSearch.java deleted file mode 100644 index bbdcf53..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/async/SendingSearch.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.async; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.message.discovery.OutgoingSearchRequest; -import org.fourthline.cling.model.message.header.MXHeader; -import org.fourthline.cling.model.message.header.STAllHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.protocol.SendingAsync; -import org.fourthline.cling.transport.RouterException; - -import java.util.logging.Logger; - -/** - * Sending search request messages using the supplied search type. - *

- * Sends all search messages 5 times, waits 0 to 500 - * milliseconds between each sending procedure. - *

- * - * @author Christian Bauer - */ -public class SendingSearch extends SendingAsync { - - final private static Logger log = Logger.getLogger(SendingSearch.class.getName()); - - private final UpnpHeader searchTarget; - private final int mxSeconds; - - /** - * Defaults to {@link org.fourthline.cling.model.message.header.STAllHeader} and an MX of 3 seconds. - */ - public SendingSearch(UpnpService upnpService) { - this(upnpService, new STAllHeader()); - } - - /** - * Defaults to an MX value of 3 seconds. - */ - public SendingSearch(UpnpService upnpService, UpnpHeader searchTarget) { - this(upnpService, searchTarget, MXHeader.DEFAULT_VALUE); - } - - /** - * @param mxSeconds The time in seconds a host should wait before responding. - */ - public SendingSearch(UpnpService upnpService, UpnpHeader searchTarget, int mxSeconds) { - super(upnpService); - - if (!UpnpHeader.Type.ST.isValidHeaderType(searchTarget.getClass())) { - throw new IllegalArgumentException( - "Given search target instance is not a valid header class for type ST: " + searchTarget.getClass() - ); - } - this.searchTarget = searchTarget; - this.mxSeconds = mxSeconds; - } - - public UpnpHeader getSearchTarget() { - return searchTarget; - } - - public int getMxSeconds() { - return mxSeconds; - } - - protected void execute() throws RouterException { - - log.fine("Executing search for target: " + searchTarget.getString() + " with MX seconds: " + getMxSeconds()); - - OutgoingSearchRequest msg = new OutgoingSearchRequest(searchTarget, getMxSeconds()); - prepareOutgoingSearchRequest(msg); - - for (int i = 0; i < getBulkRepeat(); i++) { - try { - - getUpnpService().getRouter().send(msg); - - // UDA 1.0 is silent about this but UDA 1.1 recommends "a few hundred milliseconds" - log.finer("Sleeping " + getBulkIntervalMilliseconds() + " milliseconds"); - Thread.sleep(getBulkIntervalMilliseconds()); - - } catch (InterruptedException ex) { - // Interruption means we stop sending search messages, e.g. on shutdown of thread pool - break; - } - } - } - - public int getBulkRepeat() { - return 5; // UDA 1.0 says "repeat more than once" - } - - public int getBulkIntervalMilliseconds() { - return 500; // That should be plenty on an ethernet LAN - } - - /** - * Override this to edit the outgoing message, e.g. by adding headers. - */ - protected void prepareOutgoingSearchRequest(OutgoingSearchRequest message) { - } - -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingAction.java b/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingAction.java deleted file mode 100644 index 94f59cb..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingAction.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.sync; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.action.ActionCancelledException; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.RemoteActionInvocation; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.control.IncomingActionRequestMessage; -import org.fourthline.cling.model.message.control.OutgoingActionResponseMessage; -import org.fourthline.cling.model.message.header.ContentTypeHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.resource.ServiceControlResource; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.protocol.ReceivingSync; -import org.fourthline.cling.model.UnsupportedDataException; -import org.fourthline.cling.transport.RouterException; -import org.seamless.util.Exceptions; - -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Handles reception of control messages, invoking actions on local services. - *

- * Actions are invoked through the {@link org.fourthline.cling.model.action.ActionExecutor} returned - * by the registered {@link org.fourthline.cling.model.meta.LocalService#getExecutor(org.fourthline.cling.model.meta.Action)} - * method. - *

- * - * @author Christian Bauer - */ -public class ReceivingAction extends ReceivingSync { - - final private static Logger log = Logger.getLogger(ReceivingAction.class.getName()); - - public ReceivingAction(UpnpService upnpService, StreamRequestMessage inputMessage) { - super(upnpService, inputMessage); - } - - protected StreamResponseMessage executeSync() throws RouterException{ - - ContentTypeHeader contentTypeHeader = - getInputMessage().getHeaders().getFirstHeader(UpnpHeader.Type.CONTENT_TYPE, ContentTypeHeader.class); - - // Special rules for action messages! UDA 1.0 says: - // 'If the CONTENT-TYPE header specifies an unsupported value (other then "text/xml") the - // device must return an HTTP status code "415 Unsupported Media Type".' - if (contentTypeHeader != null && !contentTypeHeader.isUDACompliantXML()) { - log.warning("Received invalid Content-Type '" + contentTypeHeader + "': " + getInputMessage()); - return new StreamResponseMessage(new UpnpResponse(UpnpResponse.Status.UNSUPPORTED_MEDIA_TYPE)); - } - - if (contentTypeHeader == null) { - log.warning("Received without Content-Type: " + getInputMessage()); - } - - ServiceControlResource resource = - getUpnpService().getRegistry().getResource( - ServiceControlResource.class, - getInputMessage().getUri() - ); - - if (resource == null) { - log.fine("No local resource found: " + getInputMessage()); - return null; - } - - log.fine("Found local action resource matching relative request URI: " + getInputMessage().getUri()); - - RemoteActionInvocation invocation; - OutgoingActionResponseMessage responseMessage = null; - - try { - - // Throws ActionException if the action can't be found - IncomingActionRequestMessage requestMessage = - new IncomingActionRequestMessage(getInputMessage(), resource.getModel()); - - log.finer("Created incoming action request message: " + requestMessage); - invocation = new RemoteActionInvocation(requestMessage.getAction(), getRemoteClientInfo()); - - // Throws UnsupportedDataException if the body can't be read - log.fine("Reading body of request message"); - getUpnpService().getConfiguration().getSoapActionProcessor().readBody(requestMessage, invocation); - - log.fine("Executing on local service: " + invocation); - resource.getModel().getExecutor(invocation.getAction()).execute(invocation); - - if (invocation.getFailure() == null) { - responseMessage = - new OutgoingActionResponseMessage(invocation.getAction()); - } else { - - if (invocation.getFailure() instanceof ActionCancelledException) { - log.fine("Action execution was cancelled, returning 404 to client"); - // A 404 status is appropriate for this situation: The resource is gone/not available and it's - // a temporary condition. Most likely the cancellation happened because the client connection - // has been dropped, so it doesn't really matter what we return here anyway. - return null; - } else { - responseMessage = - new OutgoingActionResponseMessage( - UpnpResponse.Status.INTERNAL_SERVER_ERROR, - invocation.getAction() - ); - } - } - - } catch (ActionException ex) { - log.finer("Error executing local action: " + ex); - - invocation = new RemoteActionInvocation(ex, getRemoteClientInfo()); - responseMessage = new OutgoingActionResponseMessage(UpnpResponse.Status.INTERNAL_SERVER_ERROR); - - } catch (UnsupportedDataException ex) { - log.log(Level.WARNING, "Error reading action request XML body: " + ex.toString(), Exceptions.unwrap(ex)); - - invocation = - new RemoteActionInvocation( - Exceptions.unwrap(ex) instanceof ActionException - ? (ActionException)Exceptions.unwrap(ex) - : new ActionException(ErrorCode.ACTION_FAILED, ex.getMessage()), - getRemoteClientInfo() - ); - responseMessage = new OutgoingActionResponseMessage(UpnpResponse.Status.INTERNAL_SERVER_ERROR); - - } - - try { - - log.fine("Writing body of response message"); - getUpnpService().getConfiguration().getSoapActionProcessor().writeBody(responseMessage, invocation); - - log.fine("Returning finished response message: " + responseMessage); - return responseMessage; - - } catch (UnsupportedDataException ex) { - log.warning("Failure writing body of response message, sending '500 Internal Server Error' without body"); - log.log(Level.WARNING, "Exception root cause: ", Exceptions.unwrap(ex)); - return new StreamResponseMessage(UpnpResponse.Status.INTERNAL_SERVER_ERROR); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingEvent.java b/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingEvent.java deleted file mode 100644 index b0e8073..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingEvent.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.sync; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.gena.IncomingEventRequestMessage; -import org.fourthline.cling.model.message.gena.OutgoingEventResponseMessage; -import org.fourthline.cling.model.resource.ServiceEventCallbackResource; -import org.fourthline.cling.protocol.ReceivingSync; -import org.fourthline.cling.model.UnsupportedDataException; -import org.fourthline.cling.transport.RouterException; - -import java.util.logging.Logger; - -/** - * Handles incoming GENA event messages. - *

- * Attempts to find an outgoing (remote) subscription matching the callback and subscription identifier. - * Once found, the GENA event message payload will be transformed and the - * {@link org.fourthline.cling.model.gena.RemoteGENASubscription#receive(org.fourthline.cling.model.types.UnsignedIntegerFourBytes, - * java.util.Collection)} method will be called asynchronously using the executor - * returned by {@link org.fourthline.cling.UpnpServiceConfiguration#getRegistryListenerExecutor()}. - *

- * - * @author Christian Bauer - */ -public class ReceivingEvent extends ReceivingSync { - - final private static Logger log = Logger.getLogger(ReceivingEvent.class.getName()); - - public ReceivingEvent(UpnpService upnpService, StreamRequestMessage inputMessage) { - super(upnpService, inputMessage); - } - - protected OutgoingEventResponseMessage executeSync() throws RouterException{ - - if (!getInputMessage().isContentTypeTextUDA()) { - log.warning("Received without or with invalid Content-Type: " + getInputMessage()); - // We continue despite the invalid UPnP message because we can still hope to convert the content - // return new StreamResponseMessage(new UpnpResponse(UpnpResponse.Status.UNSUPPORTED_MEDIA_TYPE)); - } - - ServiceEventCallbackResource resource = - getUpnpService().getRegistry().getResource( - ServiceEventCallbackResource.class, - getInputMessage().getUri() - ); - - if (resource == null) { - log.fine("No local resource found: " + getInputMessage()); - return new OutgoingEventResponseMessage(new UpnpResponse(UpnpResponse.Status.NOT_FOUND)); - } - - final IncomingEventRequestMessage requestMessage = - new IncomingEventRequestMessage(getInputMessage(), resource.getModel()); - - // Error conditions UDA 1.0 section 4.2.1 - if (requestMessage.getSubscrptionId() == null) { - log.fine("Subscription ID missing in event request: " + getInputMessage()); - return new OutgoingEventResponseMessage(new UpnpResponse(UpnpResponse.Status.PRECONDITION_FAILED)); - } - - if (!requestMessage.hasValidNotificationHeaders()) { - log.fine("Missing NT and/or NTS headers in event request: " + getInputMessage()); - return new OutgoingEventResponseMessage(new UpnpResponse(UpnpResponse.Status.BAD_REQUEST)); - } - - if (!requestMessage.hasValidNotificationHeaders()) { - log.fine("Invalid NT and/or NTS headers in event request: " + getInputMessage()); - return new OutgoingEventResponseMessage(new UpnpResponse(UpnpResponse.Status.PRECONDITION_FAILED)); - } - - if (requestMessage.getSequence() == null) { - log.fine("Sequence missing in event request: " + getInputMessage()); - return new OutgoingEventResponseMessage(new UpnpResponse(UpnpResponse.Status.PRECONDITION_FAILED)); - } - - try { - - getUpnpService().getConfiguration().getGenaEventProcessor().readBody(requestMessage); - - } catch (final UnsupportedDataException ex) { - log.fine("Can't read event message request body, " + ex); - - // Pass the parsing failure on to any listeners, so they can take action if necessary - final RemoteGENASubscription subscription = - getUpnpService().getRegistry().getRemoteSubscription(requestMessage.getSubscrptionId()); - if (subscription != null) { - getUpnpService().getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - subscription.invalidMessage(ex); - } - } - ); - } - - return new OutgoingEventResponseMessage(new UpnpResponse(UpnpResponse.Status.INTERNAL_SERVER_ERROR)); - } - - try { - // Prevent registration of outgoing subscriptions while this event is being processed, and - // block if there is an ongoing subscription procedure (most likely this is the initial - // event for this subscription) - getUpnpService().getRegistry().lockRemoteSubscriptions(); - - final RemoteGENASubscription subscription = - getUpnpService().getRegistry().getRemoteSubscription(requestMessage.getSubscrptionId()); - - if (subscription == null) { - log.severe("Invalid subscription ID, no active subscription: " + requestMessage); - return new OutgoingEventResponseMessage(new UpnpResponse(UpnpResponse.Status.PRECONDITION_FAILED)); - } - - getUpnpService().getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - log.fine("Calling active subscription with event state variable values"); - subscription.receive( - requestMessage.getSequence(), - requestMessage.getStateVariableValues() - ); - } - } - ); - } finally { - getUpnpService().getRegistry().unlockRemoteSubscriptions(); - } - - return new OutgoingEventResponseMessage(); - - } -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingRetrieval.java b/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingRetrieval.java deleted file mode 100644 index 2d097c6..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingRetrieval.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.sync; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.binding.xml.DescriptorBindingException; -import org.fourthline.cling.binding.xml.DeviceDescriptorBinder; -import org.fourthline.cling.binding.xml.ServiceDescriptorBinder; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.header.ContentTypeHeader; -import org.fourthline.cling.model.message.header.ServerHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.model.meta.Icon; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.resource.DeviceDescriptorResource; -import org.fourthline.cling.model.resource.IconResource; -import org.fourthline.cling.model.resource.Resource; -import org.fourthline.cling.model.resource.ServiceDescriptorResource; -import org.fourthline.cling.protocol.ReceivingSync; -import org.fourthline.cling.transport.RouterException; -import org.seamless.util.Exceptions; - -import java.net.URI; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Handles reception of device/service descriptor and icon retrieval messages. - * - *

- * Requested device and service XML descriptors are generated on-the-fly for every request. - *

- *

- * Descriptor XML is dynamically generated depending on the control point - some control - * points require different metadata than others for the same device and services. - *

- * - * @author Christian Bauer - */ -public class ReceivingRetrieval extends ReceivingSync { - - final private static Logger log = Logger.getLogger(ReceivingRetrieval.class.getName()); - - public ReceivingRetrieval(UpnpService upnpService, StreamRequestMessage inputMessage) { - super(upnpService, inputMessage); - } - - protected StreamResponseMessage executeSync() throws RouterException { - - if (!getInputMessage().hasHostHeader()) { - log.fine("Ignoring message, missing HOST header: " + getInputMessage()); - return new StreamResponseMessage(new UpnpResponse(UpnpResponse.Status.PRECONDITION_FAILED)); - } - - URI requestedURI = getInputMessage().getOperation().getURI(); - - Resource foundResource = getUpnpService().getRegistry().getResource(requestedURI); - - if (foundResource == null) { - foundResource = onResourceNotFound(requestedURI); - if (foundResource == null) { - log.fine("No local resource found: " + getInputMessage()); - return null; - } - } - - return createResponse(requestedURI, foundResource); - } - - protected StreamResponseMessage createResponse(URI requestedURI, Resource resource) { - - StreamResponseMessage response; - - try { - - if (DeviceDescriptorResource.class.isAssignableFrom(resource.getClass())) { - - log.fine("Found local device matching relative request URI: " + requestedURI); - LocalDevice device = (LocalDevice) resource.getModel(); - - DeviceDescriptorBinder deviceDescriptorBinder = - getUpnpService().getConfiguration().getDeviceDescriptorBinderUDA10(); - String deviceDescriptor = deviceDescriptorBinder.generate( - device, - getRemoteClientInfo(), - getUpnpService().getConfiguration().getNamespace() - ); - response = new StreamResponseMessage( - deviceDescriptor, - new ContentTypeHeader(ContentTypeHeader.DEFAULT_CONTENT_TYPE) - ); - } else if (ServiceDescriptorResource.class.isAssignableFrom(resource.getClass())) { - - - log.fine("Found local service matching relative request URI: " + requestedURI); - LocalService service = (LocalService) resource.getModel(); - - ServiceDescriptorBinder serviceDescriptorBinder = - getUpnpService().getConfiguration().getServiceDescriptorBinderUDA10(); - String serviceDescriptor = serviceDescriptorBinder.generate(service); - response = new StreamResponseMessage( - serviceDescriptor, - new ContentTypeHeader(ContentTypeHeader.DEFAULT_CONTENT_TYPE) - ); - - } else if (IconResource.class.isAssignableFrom(resource.getClass())) { - - log.fine("Found local icon matching relative request URI: " + requestedURI); - Icon icon = (Icon) resource.getModel(); - response = new StreamResponseMessage(icon.getData(), icon.getMimeType()); - - } else { - - log.fine("Ignoring GET for found local resource: " + resource); - return null; - } - - } catch (DescriptorBindingException ex) { - log.warning("Error generating requested device/service descriptor: " + ex.toString()); - log.log(Level.WARNING, "Exception root cause: ", Exceptions.unwrap(ex)); - response = new StreamResponseMessage(UpnpResponse.Status.INTERNAL_SERVER_ERROR); - } - - response.getHeaders().add(UpnpHeader.Type.SERVER, new ServerHeader()); - - return response; - } - - /** - * Called if the {@link org.fourthline.cling.registry.Registry} had no result. - * - * @param requestedURIPath The requested URI path - * @return null or your own {@link Resource} - */ - protected Resource onResourceNotFound(URI requestedURIPath) { - return null; - } -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingSubscribe.java b/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingSubscribe.java deleted file mode 100644 index a32ca22..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingSubscribe.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.sync; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.gena.CancelReason; -import org.fourthline.cling.model.gena.LocalGENASubscription; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.gena.IncomingSubscribeRequestMessage; -import org.fourthline.cling.model.message.gena.OutgoingSubscribeResponseMessage; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.resource.ServiceEventSubscriptionResource; -import org.fourthline.cling.protocol.ReceivingSync; -import org.fourthline.cling.transport.RouterException; -import org.seamless.util.Exceptions; - -import java.net.URL; -import java.util.List; -import java.util.logging.Logger; - -/** - * Handles reception of GENA event subscription (initial and renewal) messages. - *

- * This protocol tries to find a local event subscription URI matching the requested URI, - * then creates a new {@link org.fourthline.cling.model.gena.LocalGENASubscription} if no - * subscription identifer was supplied. - *

- *

- * The subscription is however only registered with the local service, and monitoring - * of state changes is established, if the response of this protocol was successfully - * delivered to the client which requested the subscription. - *

- *

- * Once registration and monitoring is active, an initial event with the current - * state of the service is send to the subscriber. This will only happen after the - * subscription response message was successfully delivered to the subscriber. - *

- * - * @author Christian Bauer - */ -public class ReceivingSubscribe extends ReceivingSync { - - final private static Logger log = Logger.getLogger(ReceivingSubscribe.class.getName()); - - protected LocalGENASubscription subscription; - - public ReceivingSubscribe(UpnpService upnpService, StreamRequestMessage inputMessage) { - super(upnpService, inputMessage); - } - - protected OutgoingSubscribeResponseMessage executeSync() throws RouterException { - - ServiceEventSubscriptionResource resource = - getUpnpService().getRegistry().getResource( - ServiceEventSubscriptionResource.class, - getInputMessage().getUri() - ); - - if (resource == null) { - log.fine("No local resource found: " + getInputMessage()); - return null; - } - - log.fine("Found local event subscription matching relative request URI: " + getInputMessage().getUri()); - - IncomingSubscribeRequestMessage requestMessage = - new IncomingSubscribeRequestMessage(getInputMessage(), resource.getModel()); - - // Error conditions UDA 1.0 section 4.1.1 and 4.1.2 - if (requestMessage.getSubscriptionId() != null && - (requestMessage.hasNotificationHeader() || requestMessage.getCallbackURLs() != null)) { - log.fine("Subscription ID and NT or Callback in subscribe request: " + getInputMessage()); - return new OutgoingSubscribeResponseMessage(UpnpResponse.Status.BAD_REQUEST); - } - - if (requestMessage.getSubscriptionId() != null) { - return processRenewal(resource.getModel(), requestMessage); - } else if (requestMessage.hasNotificationHeader() && requestMessage.getCallbackURLs() != null){ - return processNewSubscription(resource.getModel(), requestMessage); - } else { - log.fine("No subscription ID, no NT or Callback, neither subscription or renewal: " + getInputMessage()); - return new OutgoingSubscribeResponseMessage(UpnpResponse.Status.PRECONDITION_FAILED); - } - - } - - protected OutgoingSubscribeResponseMessage processRenewal(LocalService service, - IncomingSubscribeRequestMessage requestMessage) { - - subscription = getUpnpService().getRegistry().getLocalSubscription(requestMessage.getSubscriptionId()); - - // Error conditions UDA 1.0 section 4.1.1 and 4.1.2 - if (subscription == null) { - log.fine("Invalid subscription ID for renewal request: " + getInputMessage()); - return new OutgoingSubscribeResponseMessage(UpnpResponse.Status.PRECONDITION_FAILED); - } - - log.fine("Renewing subscription: " + subscription); - subscription.setSubscriptionDuration(requestMessage.getRequestedTimeoutSeconds()); - if (getUpnpService().getRegistry().updateLocalSubscription(subscription)) { - return new OutgoingSubscribeResponseMessage(subscription); - } else { - log.fine("Subscription went away before it could be renewed: " + getInputMessage()); - return new OutgoingSubscribeResponseMessage(UpnpResponse.Status.PRECONDITION_FAILED); - } - } - - protected OutgoingSubscribeResponseMessage processNewSubscription(LocalService service, - IncomingSubscribeRequestMessage requestMessage) { - List callbackURLs = requestMessage.getCallbackURLs(); - - // Error conditions UDA 1.0 section 4.1.1 and 4.1.2 - if (callbackURLs == null || callbackURLs.size() == 0) { - log.fine("Missing or invalid Callback URLs in subscribe request: " + getInputMessage()); - return new OutgoingSubscribeResponseMessage(UpnpResponse.Status.PRECONDITION_FAILED); - } - - if (!requestMessage.hasNotificationHeader()) { - log.fine("Missing or invalid NT header in subscribe request: " + getInputMessage()); - return new OutgoingSubscribeResponseMessage(UpnpResponse.Status.PRECONDITION_FAILED); - } - - Integer timeoutSeconds; - if(getUpnpService().getConfiguration().isReceivedSubscriptionTimeoutIgnored()) { - timeoutSeconds = null; // Use default value - } else { - timeoutSeconds = requestMessage.getRequestedTimeoutSeconds(); - } - - try { - subscription = new LocalGENASubscription(service, timeoutSeconds, callbackURLs) { - public void established() { - } - - public void ended(CancelReason reason) { - } - - public void eventReceived() { - // The only thing we are interested in, sending an event when the state changes - getUpnpService().getConfiguration().getSyncProtocolExecutorService().execute( - getUpnpService().getProtocolFactory().createSendingEvent(this) - ); - } - }; - } catch (Exception ex) { - log.warning("Couldn't create local subscription to service: " + Exceptions.unwrap(ex)); - return new OutgoingSubscribeResponseMessage(UpnpResponse.Status.INTERNAL_SERVER_ERROR); - } - - log.fine("Adding subscription to registry: " + subscription); - getUpnpService().getRegistry().addLocalSubscription(subscription); - - log.fine("Returning subscription response, waiting to send initial event"); - return new OutgoingSubscribeResponseMessage(subscription); - } - - @Override - public void responseSent(StreamResponseMessage responseMessage) { - if (subscription == null) return; // Preconditions failed very early on - if (responseMessage != null - && !responseMessage.getOperation().isFailed() - && subscription.getCurrentSequence().getValue() == 0) { // Note that renewals should not have 0 - - // This is a minor concurrency issue: If we now register on the service and henceforth send a new - // event message whenever the state of the service changes, there is still a chance that the initial - // event message arrives later than the first on-change event message. Shouldn't be a problem as the - // subscriber is supposed to figure out what to do with out-of-sequence messages. I would be - // surprised though if actual implementations won't crash! - log.fine("Establishing subscription"); - subscription.registerOnService(); - subscription.establish(); - - log.fine("Response to subscription sent successfully, now sending initial event asynchronously"); - getUpnpService().getConfiguration().getAsyncProtocolExecutor().execute( - getUpnpService().getProtocolFactory().createSendingEvent(subscription) - ); - - } else if (subscription.getCurrentSequence().getValue() == 0) { - log.fine("Subscription request's response aborted, not sending initial event"); - if (responseMessage == null) { - log.fine("Reason: No response at all from subscriber"); - } else { - log.fine("Reason: " + responseMessage.getOperation()); - } - log.fine("Removing subscription from registry: " + subscription); - getUpnpService().getRegistry().removeLocalSubscription(subscription); - } - } - - @Override - public void responseException(Throwable t) { - if (subscription == null) return; // Nothing to do, we didn't get that far - log.fine("Response could not be send to subscriber, removing local GENA subscription: " + subscription); - getUpnpService().getRegistry().removeLocalSubscription(subscription); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingUnsubscribe.java b/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingUnsubscribe.java deleted file mode 100644 index 7dc916b..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/sync/ReceivingUnsubscribe.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.sync; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.gena.LocalGENASubscription; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.gena.IncomingUnsubscribeRequestMessage; -import org.fourthline.cling.model.resource.ServiceEventSubscriptionResource; -import org.fourthline.cling.protocol.ReceivingSync; -import org.fourthline.cling.transport.RouterException; - -import java.util.logging.Logger; - -/** - * Handles reception of GENA event unsubscribe messages. - * - * @author Christian Bauer - */ -public class ReceivingUnsubscribe extends ReceivingSync { - - final private static Logger log = Logger.getLogger(ReceivingUnsubscribe.class.getName()); - - public ReceivingUnsubscribe(UpnpService upnpService, StreamRequestMessage inputMessage) { - super(upnpService, inputMessage); - } - - protected StreamResponseMessage executeSync() throws RouterException { - - ServiceEventSubscriptionResource resource = - getUpnpService().getRegistry().getResource( - ServiceEventSubscriptionResource.class, - getInputMessage().getUri() - ); - - if (resource == null) { - log.fine("No local resource found: " + getInputMessage()); - return null; - } - - log.fine("Found local event subscription matching relative request URI: " + getInputMessage().getUri()); - - IncomingUnsubscribeRequestMessage requestMessage = - new IncomingUnsubscribeRequestMessage(getInputMessage(), resource.getModel()); - - // Error conditions UDA 1.0 section 4.1.3 - if (requestMessage.getSubscriptionId() != null && - (requestMessage.hasNotificationHeader() || requestMessage.hasCallbackHeader())) { - log.fine("Subscription ID and NT or Callback in unsubcribe request: " + getInputMessage()); - return new StreamResponseMessage(UpnpResponse.Status.BAD_REQUEST); - } - - LocalGENASubscription subscription = - getUpnpService().getRegistry().getLocalSubscription(requestMessage.getSubscriptionId()); - - if (subscription == null) { - log.fine("Invalid subscription ID for unsubscribe request: " + getInputMessage()); - return new StreamResponseMessage(UpnpResponse.Status.PRECONDITION_FAILED); - } - - log.fine("Unregistering subscription: " + subscription); - if (getUpnpService().getRegistry().removeLocalSubscription(subscription)) { - subscription.end(null); // No reason, just an unsubscribe - } else { - log.fine("Subscription was already removed from registry"); - } - - return new StreamResponseMessage(UpnpResponse.Status.OK); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/protocol/sync/SendingAction.java b/app/src/main/java/org/fourthline/cling/protocol/sync/SendingAction.java deleted file mode 100644 index 60d0987..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/sync/SendingAction.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.sync; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.action.ActionCancelledException; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.control.IncomingActionResponseMessage; -import org.fourthline.cling.model.message.control.OutgoingActionRequestMessage; -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.protocol.SendingSync; -import org.fourthline.cling.model.UnsupportedDataException; -import org.fourthline.cling.transport.RouterException; -import org.seamless.util.Exceptions; - -import java.net.URL; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Sending control message, transforming a local {@link org.fourthline.cling.model.action.ActionInvocation}. - *

- * Writes the outgoing message's body with the {@link org.fourthline.cling.transport.spi.SOAPActionProcessor}. - * This protocol will return null if no response was received from the control target host. - * In all other cases, even if only the processing of message content failed, this protocol will - * return an {@link org.fourthline.cling.model.message.control.IncomingActionResponseMessage}. Any error - * details of a failed response ({@link org.fourthline.cling.model.message.UpnpResponse#isFailed()}) are - * available with - * {@link org.fourthline.cling.model.action.ActionInvocation#setFailure(org.fourthline.cling.model.action.ActionException)}. - *

- * - * @author Christian Bauer - */ -public class SendingAction extends SendingSync { - - final private static Logger log = Logger.getLogger(SendingAction.class.getName()); - - final protected ActionInvocation actionInvocation; - - public SendingAction(UpnpService upnpService, ActionInvocation actionInvocation, URL controlURL) { - super(upnpService, new OutgoingActionRequestMessage(actionInvocation, controlURL)); - this.actionInvocation = actionInvocation; - } - - protected IncomingActionResponseMessage executeSync() throws RouterException { - return invokeRemote(getInputMessage()); - } - - protected IncomingActionResponseMessage invokeRemote(OutgoingActionRequestMessage requestMessage) throws RouterException { - Device device = actionInvocation.getAction().getService().getDevice(); - - log.fine("Sending outgoing action call '" + actionInvocation.getAction().getName() + "' to remote service of: " + device); - IncomingActionResponseMessage responseMessage = null; - try { - - StreamResponseMessage streamResponse = sendRemoteRequest(requestMessage); - - if (streamResponse == null) { - log.fine("No connection or no no response received, returning null"); - actionInvocation.setFailure(new ActionException(ErrorCode.ACTION_FAILED, "Connection error or no response received")); - return null; - } - - responseMessage = new IncomingActionResponseMessage(streamResponse); - - if (responseMessage.isFailedNonRecoverable()) { - log.fine("Response was a non-recoverable failure: " + responseMessage); - throw new ActionException( - ErrorCode.ACTION_FAILED, "Non-recoverable remote execution failure: " + responseMessage.getOperation().getResponseDetails() - ); - } else if (responseMessage.isFailedRecoverable()) { - handleResponseFailure(responseMessage); - } else { - handleResponse(responseMessage); - } - - return responseMessage; - - - } catch (ActionException ex) { - log.fine("Remote action invocation failed, returning Internal Server Error message: " + ex.getMessage()); - actionInvocation.setFailure(ex); - if (responseMessage == null || !responseMessage.getOperation().isFailed()) { - return new IncomingActionResponseMessage(new UpnpResponse(UpnpResponse.Status.INTERNAL_SERVER_ERROR)); - } else { - return responseMessage; - } - } - } - - protected StreamResponseMessage sendRemoteRequest(OutgoingActionRequestMessage requestMessage) - throws ActionException, RouterException { - - try { - log.fine("Writing SOAP request body of: " + requestMessage); - getUpnpService().getConfiguration().getSoapActionProcessor().writeBody(requestMessage, actionInvocation); - - log.fine("Sending SOAP body of message as stream to remote device"); - return getUpnpService().getRouter().send(requestMessage); - } catch (RouterException ex) { - Throwable cause = Exceptions.unwrap(ex); - if (cause instanceof InterruptedException) { - if (log.isLoggable(Level.FINE)) { - log.fine("Sending action request message was interrupted: " + cause); - } - throw new ActionCancelledException((InterruptedException)cause); - } - throw ex; - } catch (UnsupportedDataException ex) { - if (log.isLoggable(Level.FINE)) { - log.fine("Error writing SOAP body: " + ex); - log.log(Level.FINE, "Exception root cause: ", Exceptions.unwrap(ex)); - } - throw new ActionException(ErrorCode.ACTION_FAILED, "Error writing request message. " + ex.getMessage()); - } - } - - protected void handleResponse(IncomingActionResponseMessage responseMsg) throws ActionException { - - try { - log.fine("Received response for outgoing call, reading SOAP response body: " + responseMsg); - getUpnpService().getConfiguration().getSoapActionProcessor().readBody(responseMsg, actionInvocation); - } catch (UnsupportedDataException ex) { - log.fine("Error reading SOAP body: " + ex); - log.log(Level.FINE, "Exception root cause: ", Exceptions.unwrap(ex)); - throw new ActionException( - ErrorCode.ACTION_FAILED, - "Error reading SOAP response message. " + ex.getMessage(), - false - ); - } - } - - protected void handleResponseFailure(IncomingActionResponseMessage responseMsg) throws ActionException { - - try { - log.fine("Received response with Internal Server Error, reading SOAP failure message"); - getUpnpService().getConfiguration().getSoapActionProcessor().readBody(responseMsg, actionInvocation); - } catch (UnsupportedDataException ex) { - log.fine("Error reading SOAP body: " + ex); - log.log(Level.FINE, "Exception root cause: ", Exceptions.unwrap(ex)); - throw new ActionException( - ErrorCode.ACTION_FAILED, - "Error reading SOAP response failure message. " + ex.getMessage(), - false - ); - } - } - -} - -/* - -- send request - - UnsupportedDataException: Can't write body - -- streamResponseMessage is null: No response received, return null to client - -- streamResponseMessage >= 300 && !(405 || 500): Response was HTTP failure, set on anemic response and return - -- streamResponseMessage >= 300 && 405: Try request again with different headers - - UnsupportedDataException: Can't write body - - (The whole streamResponse conditions apply again but this time, ignore 405) - -- streamResponseMessage >= 300 && 500 && lastExecutionFailure != null: Try to read SOAP failure body - - UnsupportedDataException: Can't read body - -- streamResponseMessage < 300: Response was OK, try to read response body - - UnsupportedDataException: Can't read body - - -*/ \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/protocol/sync/SendingEvent.java b/app/src/main/java/org/fourthline/cling/protocol/sync/SendingEvent.java deleted file mode 100644 index d0e9e6b..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/sync/SendingEvent.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.sync; - -import java.util.logging.Logger; -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.gena.LocalGENASubscription; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.gena.OutgoingEventRequestMessage; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.protocol.SendingSync; -import org.fourthline.cling.transport.RouterException; - -import java.net.URL; - -/** - * Sending GENA event messages to remote subscribers. - *

- * Any {@link org.fourthline.cling.model.gena.LocalGENASubscription} instantiates and executes this protocol - * when the state of a local service changes. However, a remote subscriber might require event - * notification messages on more than one callback URL, so this protocol potentially sends - * many messages. What is returned is always the last response, that is, the response for the - * message sent to the last callback URL in the list of the subscriber. - *

- * - * @author Christian Bauer - */ -public class SendingEvent extends SendingSync { - - final private static Logger log = Logger.getLogger(SendingEvent.class.getName()); - - final protected String subscriptionId; - final protected OutgoingEventRequestMessage[] requestMessages; - final protected UnsignedIntegerFourBytes currentSequence; - - public SendingEvent(UpnpService upnpService, LocalGENASubscription subscription) { - super(upnpService, null); // Special case, we actually need to send several messages to each callback URL - - // TODO: Ugly design! It is critical (concurrency) that we prepare the event messages here, in the constructor thread! - - subscriptionId = subscription.getSubscriptionId(); - - requestMessages = new OutgoingEventRequestMessage[subscription.getCallbackURLs().size()]; - int i = 0; - for (URL url : subscription.getCallbackURLs()) { - requestMessages[i] = new OutgoingEventRequestMessage(subscription, url); - getUpnpService().getConfiguration().getGenaEventProcessor().writeBody(requestMessages[i]); - i++; - } - - currentSequence = subscription.getCurrentSequence(); - - // Always increment sequence now, as (its value) has already been set on the headers and the - // next event will use the incremented value - subscription.incrementSequence(); - } - - protected StreamResponseMessage executeSync() throws RouterException { - - log.fine("Sending event for subscription: " + subscriptionId); - - StreamResponseMessage lastResponse = null; - - for (OutgoingEventRequestMessage requestMessage : requestMessages) { - - if (currentSequence.getValue() == 0) { - log.fine("Sending initial event message to callback URL: " + requestMessage.getUri()); - } else { - log.fine("Sending event message '"+currentSequence+"' to callback URL: " + requestMessage.getUri()); - } - - - // Send request - lastResponse = getUpnpService().getRouter().send(requestMessage); - log.fine("Received event callback response: " + lastResponse); - - } - - // It's not really used, so just return the last one - we have only one callback URL most of the - // time anyway - return lastResponse; - - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/protocol/sync/SendingRenewal.java b/app/src/main/java/org/fourthline/cling/protocol/sync/SendingRenewal.java deleted file mode 100644 index 9d37918..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/sync/SendingRenewal.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.sync; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.gena.CancelReason; -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.gena.IncomingSubscribeResponseMessage; -import org.fourthline.cling.model.message.gena.OutgoingRenewalRequestMessage; -import org.fourthline.cling.protocol.SendingSync; -import org.fourthline.cling.transport.RouterException; - -import java.util.logging.Logger; - -/** - * Renewing a GENA event subscription with a remote host. - *

- * This protocol is executed periodically by the local registry, for any established GENA - * subscription to a remote service. If renewal failed, the subscription will be removed - * from the registry and the - * {@link org.fourthline.cling.model.gena.RemoteGENASubscription#end(org.fourthline.cling.model.gena.CancelReason, org.fourthline.cling.model.message.UpnpResponse)} - * method will be called. The RENEWAL_FAILED reason will be used, however, - * the response might be null if no response was received from the remote host. - *

- * @author Christian Bauer - */ -public class SendingRenewal extends SendingSync { - - final private static Logger log = Logger.getLogger(SendingRenewal.class.getName()); - - final protected RemoteGENASubscription subscription; - - public SendingRenewal(UpnpService upnpService, RemoteGENASubscription subscription) { - super( - upnpService, - new OutgoingRenewalRequestMessage( - subscription, - upnpService.getConfiguration().getEventSubscriptionHeaders(subscription.getService()) - ) - ); - this.subscription = subscription; - } - - protected IncomingSubscribeResponseMessage executeSync() throws RouterException { - log.fine("Sending subscription renewal request: " + getInputMessage()); - - StreamResponseMessage response; - try { - response = getUpnpService().getRouter().send(getInputMessage()); - } catch (RouterException ex) { - onRenewalFailure(); - throw ex; - } - - if (response == null) { - onRenewalFailure(); - return null; - } - - final IncomingSubscribeResponseMessage responseMessage = new IncomingSubscribeResponseMessage(response); - - if (response.getOperation().isFailed()) { - log.fine("Subscription renewal failed, response was: " + response); - getUpnpService().getRegistry().removeRemoteSubscription(subscription); - getUpnpService().getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - subscription.end(CancelReason.RENEWAL_FAILED,responseMessage.getOperation()); - } - } - ); - } else if (!responseMessage.isValidHeaders()) { - log.severe("Subscription renewal failed, invalid or missing (SID, Timeout) response headers"); - getUpnpService().getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - subscription.end(CancelReason.RENEWAL_FAILED, responseMessage.getOperation()); - } - } - ); - } else { - log.fine("Subscription renewed, updating in registry, response was: " + response); - subscription.setActualSubscriptionDurationSeconds(responseMessage.getSubscriptionDurationSeconds()); - getUpnpService().getRegistry().updateRemoteSubscription(subscription); - } - - return responseMessage; - } - - protected void onRenewalFailure() { - log.fine("Subscription renewal failed, removing subscription from registry"); - getUpnpService().getRegistry().removeRemoteSubscription(subscription); - getUpnpService().getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - subscription.end(CancelReason.RENEWAL_FAILED, null); - } - } - ); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/protocol/sync/SendingSubscribe.java b/app/src/main/java/org/fourthline/cling/protocol/sync/SendingSubscribe.java deleted file mode 100644 index deef9c7..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/sync/SendingSubscribe.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.sync; - -import org.fourthline.cling.model.NetworkAddress; -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.gena.IncomingSubscribeResponseMessage; -import org.fourthline.cling.model.message.gena.OutgoingSubscribeRequestMessage; -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.protocol.SendingSync; -import org.fourthline.cling.transport.RouterException; - -import java.net.NetworkInterface; -import java.net.URL; -import java.util.List; -import java.util.logging.Logger; - -/** - * Establishing a GENA event subscription with a remote host. - *

- * Calls the {@link org.fourthline.cling.model.gena.RemoteGENASubscription#establish()} method - * if the subscription request was responded to correctly. - *

- *

- * The {@link org.fourthline.cling.model.gena.RemoteGENASubscription#fail(org.fourthline.cling.model.message.UpnpResponse)} - * method will be called if the request failed. No response from the remote host is indicated with - * a null argument value. Note that this is also the response if the subscription has - * to be aborted early, when no local stream server for callback URL creation is available. This is - * the case when the local network transport layer is switched off, subscriptions will fail - * immediately with no response. - *

- * - * @author Christian Bauer - */ -public class SendingSubscribe extends SendingSync { - - final private static Logger log = Logger.getLogger(SendingSubscribe.class.getName()); - - final protected RemoteGENASubscription subscription; - - public SendingSubscribe(UpnpService upnpService, - RemoteGENASubscription subscription, - List activeStreamServers) { - super( - upnpService, - new OutgoingSubscribeRequestMessage( - subscription, - subscription.getEventCallbackURLs( - activeStreamServers, - upnpService.getConfiguration().getNamespace() - ), - upnpService.getConfiguration().getEventSubscriptionHeaders(subscription.getService()) - ) - ); - - this.subscription = subscription; - } - - protected IncomingSubscribeResponseMessage executeSync() throws RouterException { - - if (!getInputMessage().hasCallbackURLs()) { - log.fine("Subscription failed, no active local callback URLs available (network disabled?)"); - getUpnpService().getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - subscription.fail(null); - } - } - ); - return null; - } - - log.fine("Sending subscription request: " + getInputMessage()); - - try { - // Block incoming (initial) event messages until the subscription is fully registered - getUpnpService().getRegistry().lockRemoteSubscriptions(); - - StreamResponseMessage response = null; - try { - response = getUpnpService().getRouter().send(getInputMessage()); - } catch (RouterException ex) { - onSubscriptionFailure(); - return null; - } - - if (response == null) { - onSubscriptionFailure(); - return null; - } - - final IncomingSubscribeResponseMessage responseMessage = new IncomingSubscribeResponseMessage(response); - - if (response.getOperation().isFailed()) { - log.fine("Subscription failed, response was: " + responseMessage); - getUpnpService().getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - subscription.fail(responseMessage.getOperation()); - } - } - ); - } else if (!responseMessage.isValidHeaders()) { - log.severe("Subscription failed, invalid or missing (SID, Timeout) response headers"); - getUpnpService().getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - subscription.fail(responseMessage.getOperation()); - } - } - ); - } else { - - log.fine("Subscription established, adding to registry, response was: " + response); - subscription.setSubscriptionId(responseMessage.getSubscriptionId()); - subscription.setActualSubscriptionDurationSeconds(responseMessage.getSubscriptionDurationSeconds()); - - getUpnpService().getRegistry().addRemoteSubscription(subscription); - - getUpnpService().getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - subscription.establish(); - } - } - ); - - } - return responseMessage; - } finally { - getUpnpService().getRegistry().unlockRemoteSubscriptions(); - } - } - - protected void onSubscriptionFailure() { - log.fine("Subscription failed"); - getUpnpService().getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - subscription.fail(null); - } - } - ); - } -} diff --git a/app/src/main/java/org/fourthline/cling/protocol/sync/SendingUnsubscribe.java b/app/src/main/java/org/fourthline/cling/protocol/sync/SendingUnsubscribe.java deleted file mode 100644 index 4453c33..0000000 --- a/app/src/main/java/org/fourthline/cling/protocol/sync/SendingUnsubscribe.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.protocol.sync; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.model.gena.CancelReason; -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.gena.OutgoingUnsubscribeRequestMessage; -import org.fourthline.cling.protocol.SendingSync; -import org.fourthline.cling.transport.RouterException; - -import java.util.logging.Logger; - -/** - * Disconnecting a GENA event subscription with a remote host. - *

- * Calls the {@link org.fourthline.cling.model.gena.RemoteGENASubscription#end(org.fourthline.cling.model.gena.CancelReason, org.fourthline.cling.model.message.UpnpResponse)} - * method if the subscription request was responded to correctly. No {@link org.fourthline.cling.model.gena.CancelReason} - * will be provided if the unsubscribe procedure completed as expected, otherwise UNSUBSCRIBE_FAILED - * is used. The response might be null if no response was received from the remote host. - *

- * - * @author Christian Bauer - */ -public class SendingUnsubscribe extends SendingSync { - - final private static Logger log = Logger.getLogger(SendingUnsubscribe.class.getName()); - - final protected RemoteGENASubscription subscription; - - public SendingUnsubscribe(UpnpService upnpService, RemoteGENASubscription subscription) { - super( - upnpService, - new OutgoingUnsubscribeRequestMessage( - subscription, - upnpService.getConfiguration().getEventSubscriptionHeaders(subscription.getService()) - ) - ); - this.subscription = subscription; - } - - protected StreamResponseMessage executeSync() throws RouterException { - - log.fine("Sending unsubscribe request: " + getInputMessage()); - - StreamResponseMessage response = null; - try { - response = getUpnpService().getRouter().send(getInputMessage()); - return response; - } finally { - onUnsubscribe(response); - } - } - - protected void onUnsubscribe(final StreamResponseMessage response) { - // Always remove from the registry and end the subscription properly - even if it's failed - getUpnpService().getRegistry().removeRemoteSubscription(subscription); - - getUpnpService().getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - if (response == null) { - log.fine("Unsubscribe failed, no response received"); - subscription.end(CancelReason.UNSUBSCRIBE_FAILED, null); - } else if (response.getOperation().isFailed()) { - log.fine("Unsubscribe failed, response was: " + response); - subscription.end(CancelReason.UNSUBSCRIBE_FAILED, response.getOperation()); - } else { - log.fine("Unsubscribe successful, response was: " + response); - subscription.end(null, response.getOperation()); - } - } - } - ); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/registry/DefaultRegistryListener.java b/app/src/main/java/org/fourthline/cling/registry/DefaultRegistryListener.java deleted file mode 100644 index 3491b0f..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/DefaultRegistryListener.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry; - -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.meta.RemoteDevice; - -/** - * Convenience class, provides empty implementations of all methods. - *

- * Also unifies local and remote device additions and removals with - * {@link #deviceAdded(Registry, org.fourthline.cling.model.meta.Device)} and - * {@link #deviceRemoved(Registry, org.fourthline.cling.model.meta.Device)} methods. - *

- * - * @author Christian Bauer - */ -public class DefaultRegistryListener implements RegistryListener { - - public void remoteDeviceDiscoveryStarted(Registry registry, RemoteDevice device) { - - } - - public void remoteDeviceDiscoveryFailed(Registry registry, RemoteDevice device, Exception ex) { - - } - - /** - * Calls the {@link #deviceAdded(Registry, org.fourthline.cling.model.meta.Device)} method. - * - * @param registry The Cling registry of all devices and services know to the local UPnP stack. - * @param device A validated and hydrated device metadata graph, with complete service metadata. - */ - public void remoteDeviceAdded(Registry registry, RemoteDevice device) { - deviceAdded(registry, device); - } - - public void remoteDeviceUpdated(Registry registry, RemoteDevice device) { - - } - - /** - * Calls the {@link #deviceRemoved(Registry, org.fourthline.cling.model.meta.Device)} method. - * - * @param registry The Cling registry of all devices and services know to the local UPnP stack. - * @param device A validated and hydrated device metadata graph, with complete service metadata. - */ - public void remoteDeviceRemoved(Registry registry, RemoteDevice device) { - deviceRemoved(registry, device); - } - - /** - * Calls the {@link #deviceAdded(Registry, org.fourthline.cling.model.meta.Device)} method. - * - * @param registry The Cling registry of all devices and services know to the local UPnP stack. - * @param device The local device added to the {@link org.fourthline.cling.registry.Registry}. - */ - public void localDeviceAdded(Registry registry, LocalDevice device) { - deviceAdded(registry, device); - } - - /** - * Calls the {@link #deviceRemoved(Registry, org.fourthline.cling.model.meta.Device)} method. - * - * @param registry The Cling registry of all devices and services know to the local UPnP stack. - * @param device The local device removed from the {@link org.fourthline.cling.registry.Registry}. - */ - public void localDeviceRemoved(Registry registry, LocalDevice device) { - deviceRemoved(registry, device); - } - - public void deviceAdded(Registry registry, Device device) { - - } - - public void deviceRemoved(Registry registry, Device device) { - - } - - public void beforeShutdown(Registry registry) { - - } - - public void afterShutdown() { - - } -} diff --git a/app/src/main/java/org/fourthline/cling/registry/LocalItems.java b/app/src/main/java/org/fourthline/cling/registry/LocalItems.java deleted file mode 100644 index 1d65666..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/LocalItems.java +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry; - -import org.fourthline.cling.model.DiscoveryOptions; -import org.fourthline.cling.model.resource.Resource; -import org.fourthline.cling.model.gena.CancelReason; -import org.fourthline.cling.model.gena.LocalGENASubscription; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.types.UDN; -import org.fourthline.cling.protocol.SendingAsync; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Random; -import java.util.Set; -import java.util.logging.Logger; - -/** - * Internal class, required by {@link RegistryImpl}. - * - * @author Christian Bauer - */ -class LocalItems extends RegistryItems { - - private static Logger log = Logger.getLogger(Registry.class.getName()); - - protected Map discoveryOptions = new HashMap(); - protected long lastAliveIntervalTimestamp = 0; - - LocalItems(RegistryImpl registry) { - super(registry); - } - - protected void setDiscoveryOptions(UDN udn, DiscoveryOptions options) { - if (options != null) - this.discoveryOptions.put(udn, options); - else - this.discoveryOptions.remove(udn); - } - - protected DiscoveryOptions getDiscoveryOptions(UDN udn) { - return this.discoveryOptions.get(udn); - } - - protected boolean isAdvertised(UDN udn) { - // Defaults to true - return getDiscoveryOptions(udn) == null || getDiscoveryOptions(udn).isAdvertised(); - } - - protected boolean isByeByeBeforeFirstAlive(UDN udn) { - // Defaults to false - return getDiscoveryOptions(udn) != null && getDiscoveryOptions(udn).isByeByeBeforeFirstAlive(); - } - - void add(LocalDevice localDevice) throws RegistrationException { - add(localDevice, null); - } - - void add(final LocalDevice localDevice, DiscoveryOptions options) throws RegistrationException { - - // Always set/override the options, even if we don't end up adding the device - setDiscoveryOptions(localDevice.getIdentity().getUdn(), options); - - if (registry.getDevice(localDevice.getIdentity().getUdn(), false) != null) { - log.fine("Ignoring addition, device already registered: " + localDevice); - return; - } - - log.fine("Adding local device to registry: " + localDevice); - - for (Resource deviceResource : getResources(localDevice)) { - - if (registry.getResource(deviceResource.getPathQuery()) != null) { - throw new RegistrationException("URI namespace conflict with already registered resource: " + deviceResource); - } - - registry.addResource(deviceResource); - log.fine("Registered resource: " + deviceResource); - - } - - log.fine("Adding item to registry with expiration in seconds: " + localDevice.getIdentity().getMaxAgeSeconds()); - - RegistryItem localItem = new RegistryItem( - localDevice.getIdentity().getUdn(), - localDevice, - localDevice.getIdentity().getMaxAgeSeconds() - ); - - getDeviceItems().add(localItem); - log.fine("Registered local device: " + localItem); - - if (isByeByeBeforeFirstAlive(localItem.getKey())) - advertiseByebye(localDevice, true); - - if (isAdvertised(localItem.getKey())) - advertiseAlive(localDevice); - - for (final RegistryListener listener : registry.getListeners()) { - registry.getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - listener.localDeviceAdded(registry, localDevice); - } - } - ); - } - - } - - Collection get() { - Set c = new HashSet(); - for (RegistryItem item : getDeviceItems()) { - c.add(item.getItem()); - } - return Collections.unmodifiableCollection(c); - } - - boolean remove(final LocalDevice localDevice) throws RegistrationException { - return remove(localDevice, false); - } - - boolean remove(final LocalDevice localDevice, boolean shuttingDown) throws RegistrationException { - - LocalDevice registeredDevice = get(localDevice.getIdentity().getUdn(), true); - if (registeredDevice != null) { - - log.fine("Removing local device from registry: " + localDevice); - - setDiscoveryOptions(localDevice.getIdentity().getUdn(), null); - getDeviceItems().remove(new RegistryItem(localDevice.getIdentity().getUdn())); - - for (Resource deviceResource : getResources(localDevice)) { - if (registry.removeResource(deviceResource)) { - log.fine("Unregistered resource: " + deviceResource); - } - } - - // Active subscriptions - Iterator> it = getSubscriptionItems().iterator(); - while (it.hasNext()) { - final RegistryItem incomingSubscription = it.next(); - - UDN subscriptionForUDN = - incomingSubscription.getItem().getService().getDevice().getIdentity().getUdn(); - - if (subscriptionForUDN.equals(registeredDevice.getIdentity().getUdn())) { - log.fine("Removing incoming subscription: " + incomingSubscription.getKey()); - it.remove(); - if (!shuttingDown) { - registry.getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - incomingSubscription.getItem().end(CancelReason.DEVICE_WAS_REMOVED); - } - } - ); - } - } - } - - if (isAdvertised(localDevice.getIdentity().getUdn())) - advertiseByebye(localDevice, !shuttingDown); - - if (!shuttingDown) { - for (final RegistryListener listener : registry.getListeners()) { - registry.getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - listener.localDeviceRemoved(registry, localDevice); - } - } - ); - } - } - - return true; - } - - return false; - } - - void removeAll() { - removeAll(false); - } - - void removeAll(boolean shuttingDown) { - LocalDevice[] allDevices = get().toArray(new LocalDevice[get().size()]); - for (LocalDevice device : allDevices) { - remove(device, shuttingDown); - } - } - - /* ############################################################################################################ */ - - public void advertiseLocalDevices() { - for (RegistryItem localItem : deviceItems) { - if (isAdvertised(localItem.getKey())) - advertiseAlive(localItem.getItem()); - } - } - - /* ############################################################################################################ */ - - void maintain() { - - if(getDeviceItems().isEmpty()) return ; - - Set> expiredLocalItems = new HashSet(); - - // "Flooding" is enabled, check if we need to send advertisements for all devices - int aliveIntervalMillis = registry.getConfiguration().getAliveIntervalMillis(); - if(aliveIntervalMillis > 0) { - long now = System.currentTimeMillis(); - if(now - lastAliveIntervalTimestamp > aliveIntervalMillis) { - lastAliveIntervalTimestamp = now; - for (RegistryItem localItem : getDeviceItems()) { - if (isAdvertised(localItem.getKey())) { - log.finer("Flooding advertisement of local item: " + localItem); - expiredLocalItems.add(localItem); - } - } - } - } else { - // Reset, the configuration might dynamically switch the alive interval - lastAliveIntervalTimestamp = 0; - - // Alive interval is not enabled, regular expiration check of all devices - for (RegistryItem localItem : getDeviceItems()) { - if (isAdvertised(localItem.getKey()) && localItem.getExpirationDetails().hasExpired(true)) { - log.finer("Local item has expired: " + localItem); - expiredLocalItems.add(localItem); - } - } - } - - // Now execute the advertisements - for (RegistryItem expiredLocalItem : expiredLocalItems) { - log.fine("Refreshing local device advertisement: " + expiredLocalItem.getItem()); - advertiseAlive(expiredLocalItem.getItem()); - expiredLocalItem.getExpirationDetails().stampLastRefresh(); - } - - // Expire incoming subscriptions - Set> expiredIncomingSubscriptions = new HashSet(); - for (RegistryItem item : getSubscriptionItems()) { - if (item.getExpirationDetails().hasExpired(false)) { - expiredIncomingSubscriptions.add(item); - } - } - for (RegistryItem subscription : expiredIncomingSubscriptions) { - log.fine("Removing expired: " + subscription); - removeSubscription(subscription.getItem()); - subscription.getItem().end(CancelReason.EXPIRED); - } - - } - - void shutdown() { - log.fine("Clearing all registered subscriptions to local devices during shutdown"); - getSubscriptionItems().clear(); - - log.fine("Removing all local devices from registry during shutdown"); - removeAll(true); - } - - /* ############################################################################################################ */ - - protected Random randomGenerator = new Random(); - - protected void advertiseAlive(final LocalDevice localDevice) { - registry.executeAsyncProtocol(new Runnable() { - public void run() { - try { - log.finer("Sleeping some milliseconds to avoid flooding the network with ALIVE msgs"); - Thread.sleep(randomGenerator.nextInt(100)); - } catch (InterruptedException ex) { - log.severe("Background execution interrupted: " + ex.getMessage()); - } - registry.getProtocolFactory().createSendingNotificationAlive(localDevice).run(); - } - }); - } - - protected void advertiseByebye(final LocalDevice localDevice, boolean asynchronous) { - final SendingAsync prot = registry.getProtocolFactory().createSendingNotificationByebye(localDevice); - if (asynchronous) { - registry.executeAsyncProtocol(prot); - } else { - prot.run(); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/registry/RegistrationException.java b/app/src/main/java/org/fourthline/cling/registry/RegistrationException.java deleted file mode 100644 index 755ca6f..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/RegistrationException.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry; - -import org.fourthline.cling.model.ValidationError; - -import java.util.List; - -/** - * A recoverable error, thrown if device metadata could not be registered. - * - * @author Christian Bauer - */ -public class RegistrationException extends RuntimeException { - - public List errors; - - public RegistrationException(String s) { - super(s); - } - - public RegistrationException(String s, Throwable throwable) { - super(s, throwable); - } - - public RegistrationException(String s, List errors) { - super(s); - this.errors = errors; - } - - public List getErrors() { - return errors; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/registry/Registry.java b/app/src/main/java/org/fourthline/cling/registry/Registry.java deleted file mode 100644 index 7a8d361..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/Registry.java +++ /dev/null @@ -1,439 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.UpnpServiceConfiguration; -import org.fourthline.cling.model.DiscoveryOptions; -import org.fourthline.cling.model.resource.Resource; -import org.fourthline.cling.model.ServiceReference; -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.meta.RemoteDevice; -import org.fourthline.cling.model.gena.LocalGENASubscription; -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.meta.RemoteDeviceIdentity; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.DeviceType; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDN; -import org.fourthline.cling.protocol.ProtocolFactory; - -import java.net.URI; -import java.util.Collection; - -/** - * The core of the UPnP stack, keeping track of known devices and resources. - *

- * A running UPnP stack has one Registry. Any discovered device is added - * to this registry, as well as any exposed local device. The registry then maintains - * these devices continuously (see {@link RegistryMaintainer}) and when needed refreshes - * their announcements on the network or removes them when they have expired. The registry - * also keeps track of GENA event subscriptions. - *

- *

- * UPnP client applications typically monitor activity of the registry - * via {@link RegistryListener}, they are inherently asynchronous. - *

- *

- * The registry has to be {@link #shutdown()} properly, so it can notify all participants - * on the network that local devices will no longer be available and cancel all - * GENA subscriptions. - *

- * An implementation has to be thread-safe. - *

- * - * @author Christian Bauer - */ -public interface Registry { - - public UpnpService getUpnpService(); - public UpnpServiceConfiguration getConfiguration(); - public ProtocolFactory getProtocolFactory(); - - // ################################################################################################# - - /** - * Typically called internally when the UPnP stack is stopping. - *

- * Unsubscribes all local devices and GENA subscriptions. - *

- */ - public void shutdown(); - - /** - * Stops background maintenance (thread) of registered items. - *

- * When paused, the registry will no longer remove expired remote devices if their - * discovery announcements stop for some reason (device was turned off). Your local - * control point will now see potentially unavailable remote devices. Outbound - * GENA subscriptions from your local control point to remote services will not - * be renewed automatically anymore, a remote service might drop your subscriptions - * if you don't resume maintenance within the subscription's expiration timeout. - *

- *

- * Local devices and services will not be announced periodically anymore to remote - * control points, only when they are manually added are removed from the registry. - * The registry will also no longer remove expired inbound GENA subscriptions to - * local service from remote control points, if that control point for some reason - * stops sending subscription renewal messages. - *

- */ - public void pause(); - - /** - * Resumes background maintenance (thread) of registered items. - *

- * A local control point has to handle the following situations when resuming - * registry maintenance: - *

- * A remote device registration might have expired. This is the case when the remote - * device stopped sending announcements while the registry was paused (maybe because - * the device was switched off) and the registry was paused longer than the device - * advertisement's maximum age. The registry will not know if the device is still - * available when it resumes maintenance. However, it will simply assume that the - * remote device is still available and restart its expiration check cycle. That means - * a device will finally be removed from the registry, if no further announcements - * from the device are received, when the maximum age of the device has elapsed - * after the registry resumed operation. - *

- *

- * Secondly, a remote device registration might not have expired but some of your - * outbound GENA subscriptions to its services have not been renewed within the expected renewal - * period. Therefore your outbound subscriptions might be invalid, because the remote - * service can drop subscriptions when you don't renew them. On resume, the registry - * will attempt to send renewals for all outbound GENA subscriptions that require - * renewal, on devices that still haven't expired. If renewal fails, your subscription will - * end with {@link org.fourthline.cling.model.gena.CancelReason#RENEWAL_FAILED}. Although - * you then might conclude that the remote device is no longer available, a GENA renewal - * can also fail for other reasons. The remote device will be kept and maintained in the - * registry until it announces itself or it expires, even after a failed GENA renewal. - *

- *

- * If you are providing local devices and services, resuming registry maintenance has - * the following effects: - *

- *

- * Local devices and their services are announced again immediately if the registry - * has been paused for longer than half of the device's maximum age. Remote control - * points will either see this as a new device advertisement (if they have dropped - * your device while you paused maintenance) or as a regular update if you didn't - * pause longer than the device's maximum age/expiration timeout. - *

- *

- * Inbound GENA subscriptions to your local services are active, even in - * paused state - remote control points should continue renewing the subscription. - * If a remote control point stopped renewing a subscription without unsubscribing - * (hard power off), an outdated inbound subscription will be detected when you - * resume maintenance. This subscription will be cleaned up immediately on resume. - *

- */ - public void resume(); - - /** - * @return true if the registry has currently no running background - * maintenance (thread). - */ - public boolean isPaused(); - - // ################################################################################################# - - public void addListener(RegistryListener listener); - - public void removeListener(RegistryListener listener); - - public Collection getListeners(); - - /** - * Called internally by the UPnP stack when the discovery protocol starts. - *

- * The registry will notify all registered listeners of this event, unless the - * given device was already been present in the registry. - *

- * - * @param device The half-hydrated (without services) metadata of the discovered device. - * @return false if the device was already registered. - */ - public boolean notifyDiscoveryStart(RemoteDevice device); - - /** - * Called internally by the UPnP stack when the discovery protocol stopped abnormaly. - *

- * The registry will notify all registered listeners of this event. - *

- * - * @param device The half-hydrated (without services) metadata of the discovered device. - * @param ex The cause for the interruption of the discovery protocol. - */ - public void notifyDiscoveryFailure(RemoteDevice device, Exception ex); - - // ################################################################################################# - - /** - * Call this method to add your local device metadata. - * - * @param localDevice The device to add and maintain. - * @throws RegistrationException If a conflict with an already registered device was detected. - */ - public void addDevice(LocalDevice localDevice) throws RegistrationException; - - /** - * Call this method to add your local device metadata. - * - * @param localDevice The device to add and maintain. - * @param options Immediately effective when this device is registered. - * @throws RegistrationException If a conflict with an already registered device was detected. - */ - public void addDevice(LocalDevice localDevice, DiscoveryOptions options) throws RegistrationException; - - /** - * Change the active {@link DiscoveryOptions} for the given (local device) UDN. - * - * @param options Set to null to disable any options. - */ - public void setDiscoveryOptions(UDN udn, DiscoveryOptions options); - - /** - * Get the currently active {@link DiscoveryOptions} for the given (local device) UDN. - * - * @return null if there are no active discovery options for the given UDN. - */ - public DiscoveryOptions getDiscoveryOptions(UDN udn); - - /** - * Called internally by the UPnP discovery protocol. - * - * @throws RegistrationException If a conflict with an already registered device was detected. - */ - public void addDevice(RemoteDevice remoteDevice) throws RegistrationException; - - /** - * Called internally by the UPnP discovery protocol. - */ - public boolean update(RemoteDeviceIdentity rdIdentity); - - /** - * Call this to remove your local device metadata. - * - * @return true if the device was registered and has been removed. - */ - public boolean removeDevice(LocalDevice localDevice); - - /** - * Called internally by the UPnP discovery protocol. - */ - public boolean removeDevice(RemoteDevice remoteDevice); - - /** - * Call this to remove any device metadata with the given UDN. - * - * @return true if the device was registered and has been removed. - */ - public boolean removeDevice(UDN udn); - - /** - * Clear the registry of all locally registered device metadata. - */ - public void removeAllLocalDevices(); - - /** - * Clear the registry of all discovered remote device metadata. - */ - public void removeAllRemoteDevices(); - - /** - * @param udn The device name to lookup. - * @param rootOnly If true, only matches of root devices are returned. - * @return The registered root or embedded device metadata, or null. - */ - public Device getDevice(UDN udn, boolean rootOnly); - - /** - * @param udn The device name to lookup. - * @param rootOnly If true, only matches of root devices are returned. - * @return The registered root or embedded device metadata, or null. - */ - public LocalDevice getLocalDevice(UDN udn, boolean rootOnly); - - /** - * @param udn The device name to lookup. - * @param rootOnly If true, only matches of root devices are returned. - * @return The registered root or embedded device metadata, or null. - */ - public RemoteDevice getRemoteDevice(UDN udn, boolean rootOnly); - - /** - * @return All locally registered device metadata, in no particular order, or an empty collection. - */ - public Collection getLocalDevices(); - - /** - * @return All discovered remote device metadata, in no particular order, or an empty collection. - */ - public Collection getRemoteDevices(); - - /** - * @return All device metadata, in no particular order, or an empty collection. - */ - public Collection getDevices(); - - /** - * @return All device metadata of devices which implement the given type, in no particular order, - * or an empty collection. - */ - public Collection getDevices(DeviceType deviceType); - - /** - * @return All device metadata of devices which have a service that implements the given type, - * in no particular order, or an empty collection. - */ - public Collection getDevices(ServiceType serviceType); - - /** - * @return Complete service metadata.for a service reference or null if no service - * for the given reference has been registered. - */ - public Service getService(ServiceReference serviceReference); - - // ################################################################################################# - - /** - * Stores an arbitrary resource in the registry. - * - * @param resource The resource to maintain indefinitely (until it is manually removed). - */ - public void addResource(Resource resource); - - /** - * Stores an arbitrary resource in the registry. - *

- * Call this method repeatedly to refresh and prevent expiration of the resource. - *

- * - * @param resource The resource to maintain. - * @param maxAgeSeconds The time after which the registry will automatically remove the resource. - */ - public void addResource(Resource resource, int maxAgeSeconds); - - /** - * Removes a resource from the registry. - * - * @param resource The resource to remove. - * @return true if the resource was registered and has been removed. - */ - public boolean removeResource(Resource resource); - - /** - * @param pathQuery The path and optional query string of the resource's - * registration URI (e.g. /dev/somefile.xml?param=value) - * @return Any registered resource that matches the given URI path. - * @throws IllegalArgumentException If the given URI was absolute, only path and query are allowed. - */ - public Resource getResource(URI pathQuery) throws IllegalArgumentException; - - /** - * @param The required subtype of the {@link org.fourthline.cling.model.resource.Resource}. - * @param pathQuery The path and optional query string of the resource's - * registration URI (e.g. /dev/somefile.xml?param=value) - * @param resourceType The required subtype of the {@link org.fourthline.cling.model.resource.Resource}. - * @return Any registered resource that matches the given URI path and subtype. - * @throws IllegalArgumentException If the given URI was absolute, only path and query are allowed. - */ - public T getResource(Class resourceType, URI pathQuery) throws IllegalArgumentException; - - /** - * @return All registered resources, in no particular order, or an empty collection. - */ - public Collection getResources(); - - /** - * @param The required subtype of the {@link org.fourthline.cling.model.resource.Resource}. - * @param resourceType The required subtype of the {@link org.fourthline.cling.model.resource.Resource}. - * @return Any registered resource that matches the given subtype. - */ - public Collection getResources(Class resourceType); - - // ################################################################################################# - - /** - * Called internally by the UPnP stack, during GENA protocol execution. - */ - public void addLocalSubscription(LocalGENASubscription subscription); - - /** - * Called internally by the UPnP stack, during GENA protocol execution. - */ - public LocalGENASubscription getLocalSubscription(String subscriptionId); - - /** - * Called internally by the UPnP stack, during GENA protocol execution. - */ - public boolean updateLocalSubscription(LocalGENASubscription subscription); - - /** - * Called internally by the UPnP stack, during GENA protocol execution. - */ - public boolean removeLocalSubscription(LocalGENASubscription subscription); - - /** - * Called internally by the UPnP stack, during GENA protocol execution. - */ - public void addRemoteSubscription(RemoteGENASubscription subscription); - - /** - * Called internally by the UPnP stack, during GENA protocol execution. - */ - public RemoteGENASubscription getRemoteSubscription(String subscriptionId); - - /** - * Called internally by the UPnP stack, during GENA protocol execution. - */ - public void updateRemoteSubscription(RemoteGENASubscription subscription); - - /** - * Called internally by the UPnP stack, during GENA protocol execution. - */ - public void removeRemoteSubscription(RemoteGENASubscription subscription); - - /** - * Called internally by the UPnP stack, during GENA protocol execution. - *

- * When subscribing with a remote host, the remote host might send the - * initial event message faster than the response for the subscription - * request. So we lock all subscriptions when the subscription procedure - * executes, which forces the incoming initial event message to wait until - * the subscription procedure is complete. - *

- */ - public void lockRemoteSubscriptions(); - - /** - * Called internally by the UPnP stack, during GENA protocol execution. - */ - public void unlockRemoteSubscriptions(); - - // ################################################################################################# - - /** - * Manually trigger advertisement messages for all local devices. - *

- * No messages will be send for devices with disabled advertisements, see - * {@link DiscoveryOptions}! - *

- */ - public void advertiseLocalDevices(); - -} diff --git a/app/src/main/java/org/fourthline/cling/registry/RegistryImpl.java b/app/src/main/java/org/fourthline/cling/registry/RegistryImpl.java deleted file mode 100644 index 3d0c747..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/RegistryImpl.java +++ /dev/null @@ -1,519 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry; - -import org.fourthline.cling.UpnpService; -import org.fourthline.cling.UpnpServiceConfiguration; -import org.fourthline.cling.model.DiscoveryOptions; -import org.fourthline.cling.model.ExpirationDetails; -import org.fourthline.cling.model.ServiceReference; -import org.fourthline.cling.model.gena.LocalGENASubscription; -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.meta.RemoteDevice; -import org.fourthline.cling.model.meta.RemoteDeviceIdentity; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.resource.Resource; -import org.fourthline.cling.model.types.DeviceType; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDN; -import org.fourthline.cling.protocol.ProtocolFactory; - -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import java.net.URI; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.concurrent.locks.ReentrantLock; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Default implementation of {@link Registry}. - * - * @author Christian Bauer - */ -@ApplicationScoped -public class RegistryImpl implements Registry { - - private static Logger log = Logger.getLogger(Registry.class.getName()); - - protected UpnpService upnpService; - protected RegistryMaintainer registryMaintainer; - protected ReentrantLock remoteSubscriptionsLock = new ReentrantLock(true); - - public RegistryImpl() { - } - - /** - * Starts background maintenance immediately. - */ - @Inject - public RegistryImpl(UpnpService upnpService) { - log.fine("Creating Registry: " + getClass().getName()); - - this.upnpService = upnpService; - - log.fine("Starting registry background maintenance..."); - registryMaintainer = createRegistryMaintainer(); - if (registryMaintainer != null) { - getConfiguration().getRegistryMaintainerExecutor().execute(registryMaintainer); - } - } - - public UpnpService getUpnpService() { - return upnpService; - } - - public UpnpServiceConfiguration getConfiguration() { - return getUpnpService().getConfiguration(); - } - - public ProtocolFactory getProtocolFactory() { - return getUpnpService().getProtocolFactory(); - } - - protected RegistryMaintainer createRegistryMaintainer() { - return new RegistryMaintainer( - this, - getConfiguration().getRegistryMaintenanceIntervalMillis() - ); - } - - // ################################################################################################# - - protected final Set registryListeners = new HashSet(); - protected final Set> resourceItems = new HashSet(); - protected final List pendingExecutions = new ArrayList(); - - protected final RemoteItems remoteItems = new RemoteItems(this); - protected final LocalItems localItems = new LocalItems(this); - - // ################################################################################################# - - synchronized public void addListener(RegistryListener listener) { - registryListeners.add(listener); - } - - synchronized public void removeListener(RegistryListener listener) { - registryListeners.remove(listener); - } - - synchronized public Collection getListeners() { - return Collections.unmodifiableCollection(registryListeners); - } - - synchronized public boolean notifyDiscoveryStart(final RemoteDevice device) { - // Exit if we have it already, this is atomic inside this method, finally - if (getUpnpService().getRegistry().getRemoteDevice(device.getIdentity().getUdn(), true) != null) { - log.finer("Not notifying listeners, already registered: " + device); - return false; - } - for (final RegistryListener listener : getListeners()) { - getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - listener.remoteDeviceDiscoveryStarted(RegistryImpl.this, device); - } - } - ); - } - return true; - } - - synchronized public void notifyDiscoveryFailure(final RemoteDevice device, final Exception ex) { - for (final RegistryListener listener : getListeners()) { - getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - listener.remoteDeviceDiscoveryFailed(RegistryImpl.this, device, ex); - } - } - ); - } - } - - // ################################################################################################# - - synchronized public void addDevice(LocalDevice localDevice) { - localItems.add(localDevice); - } - - synchronized public void addDevice(LocalDevice localDevice, DiscoveryOptions options) { - localItems.add(localDevice, options); - } - - synchronized public void setDiscoveryOptions(UDN udn, DiscoveryOptions options) { - localItems.setDiscoveryOptions(udn, options); - } - - synchronized public DiscoveryOptions getDiscoveryOptions(UDN udn) { - return localItems.getDiscoveryOptions(udn); - } - - synchronized public void addDevice(RemoteDevice remoteDevice) { - remoteItems.add(remoteDevice); - } - - synchronized public boolean update(RemoteDeviceIdentity rdIdentity) { - return remoteItems.update(rdIdentity); - } - - synchronized public boolean removeDevice(LocalDevice localDevice) { - return localItems.remove(localDevice); - } - - synchronized public boolean removeDevice(RemoteDevice remoteDevice) { - return remoteItems.remove(remoteDevice); - } - - synchronized public void removeAllLocalDevices() { - localItems.removeAll(); - } - - synchronized public void removeAllRemoteDevices() { - remoteItems.removeAll(); - } - - synchronized public boolean removeDevice(UDN udn) { - Device device = getDevice(udn, true); - if (device != null && device instanceof LocalDevice) - return removeDevice((LocalDevice) device); - if (device != null && device instanceof RemoteDevice) - return removeDevice((RemoteDevice) device); - return false; - } - - synchronized public Device getDevice(UDN udn, boolean rootOnly) { - Device device; - if ((device = localItems.get(udn, rootOnly)) != null) return device; - if ((device = remoteItems.get(udn, rootOnly)) != null) return device; - return null; - } - - synchronized public LocalDevice getLocalDevice(UDN udn, boolean rootOnly) { - return localItems.get(udn, rootOnly); - } - - synchronized public RemoteDevice getRemoteDevice(UDN udn, boolean rootOnly) { - return remoteItems.get(udn, rootOnly); - } - - synchronized public Collection getLocalDevices() { - return Collections.unmodifiableCollection(localItems.get()); - } - - synchronized public Collection getRemoteDevices() { - return Collections.unmodifiableCollection(remoteItems.get()); - } - - synchronized public Collection getDevices() { - Set all = new HashSet(); - all.addAll(localItems.get()); - all.addAll(remoteItems.get()); - return Collections.unmodifiableCollection(all); - } - - synchronized public Collection getDevices(DeviceType deviceType) { - Collection devices = new HashSet(); - - devices.addAll(localItems.get(deviceType)); - devices.addAll(remoteItems.get(deviceType)); - - return Collections.unmodifiableCollection(devices); - } - - synchronized public Collection getDevices(ServiceType serviceType) { - Collection devices = new HashSet(); - - devices.addAll(localItems.get(serviceType)); - devices.addAll(remoteItems.get(serviceType)); - - return Collections.unmodifiableCollection(devices); - } - - synchronized public Service getService(ServiceReference serviceReference) { - Device device; - if ((device = getDevice(serviceReference.getUdn(), false)) != null) { - return device.findService(serviceReference.getServiceId()); - } - return null; - } - - // ################################################################################################# - - synchronized public Resource getResource(URI pathQuery) throws IllegalArgumentException { - if (pathQuery.isAbsolute()) { - throw new IllegalArgumentException("Resource URI can not be absolute, only path and query:" + pathQuery); - } - - // Note: Uses field access on resourceItems for performance reasons - - for (RegistryItem resourceItem : resourceItems) { - Resource resource = resourceItem.getItem(); - if (resource.matches(pathQuery)) { - return resource; - } - } - - // TODO: UPNP VIOLATION: Fuppes on my ReadyNAS thinks it's a cool idea to add a slash at the end of the callback URI... - // It also cuts off any query parameters in the callback URL - nice! - if (pathQuery.getPath().endsWith("/")) { - URI pathQueryWithoutSlash = URI.create(pathQuery.toString().substring(0, pathQuery.toString().length() - 1)); - - for (RegistryItem resourceItem : resourceItems) { - Resource resource = resourceItem.getItem(); - if (resource.matches(pathQueryWithoutSlash)) { - return resource; - } - } - } - - return null; - } - - synchronized public T getResource(Class resourceType, URI pathQuery) throws IllegalArgumentException { - Resource resource = getResource(pathQuery); - if (resource != null && resourceType.isAssignableFrom(resource.getClass())) { - return (T) resource; - } - return null; - } - - synchronized public Collection getResources() { - Collection s = new HashSet(); - for (RegistryItem resourceItem : resourceItems) { - s.add(resourceItem.getItem()); - } - return s; - } - - synchronized public Collection getResources(Class resourceType) { - Collection s = new HashSet(); - for (RegistryItem resourceItem : resourceItems) { - if (resourceType.isAssignableFrom(resourceItem.getItem().getClass())) - s.add((T) resourceItem.getItem()); - } - return s; - } - - synchronized public void addResource(Resource resource) { - addResource(resource, ExpirationDetails.UNLIMITED_AGE); - } - - synchronized public void addResource(Resource resource, int maxAgeSeconds) { - RegistryItem resourceItem = new RegistryItem(resource.getPathQuery(), resource, maxAgeSeconds); - resourceItems.remove(resourceItem); - resourceItems.add(resourceItem); - } - - synchronized public boolean removeResource(Resource resource) { - return resourceItems.remove(new RegistryItem(resource.getPathQuery())); - } - - // ################################################################################################# - - synchronized public void addLocalSubscription(LocalGENASubscription subscription) { - localItems.addSubscription(subscription); - } - - synchronized public LocalGENASubscription getLocalSubscription(String subscriptionId) { - return localItems.getSubscription(subscriptionId); - } - - synchronized public boolean updateLocalSubscription(LocalGENASubscription subscription) { - return localItems.updateSubscription(subscription); - } - - synchronized public boolean removeLocalSubscription(LocalGENASubscription subscription) { - return localItems.removeSubscription(subscription); - } - - synchronized public void addRemoteSubscription(RemoteGENASubscription subscription) { - remoteItems.addSubscription(subscription); - } - - synchronized public RemoteGENASubscription getRemoteSubscription(String subscriptionId) { - return remoteItems.getSubscription(subscriptionId); - } - - synchronized public void updateRemoteSubscription(RemoteGENASubscription subscription) { - remoteItems.updateSubscription(subscription); - } - - synchronized public void removeRemoteSubscription(RemoteGENASubscription subscription) { - remoteItems.removeSubscription(subscription); - } - - /* ############################################################################################################ */ - - synchronized public void advertiseLocalDevices() { - localItems.advertiseLocalDevices(); - } - - /* ############################################################################################################ */ - - // When you call this, make sure you have the Router lock before this lock is obtained! - synchronized public void shutdown() { - log.fine("Shutting down registry..."); - - if (registryMaintainer != null) - registryMaintainer.stop(); - - // Final cleanup run to flush out pending executions which might - // not have been caught by the maintainer before it stopped - log.finest("Executing final pending operations on shutdown: " + pendingExecutions.size()); - runPendingExecutions(false); - - for (RegistryListener listener : registryListeners) { - listener.beforeShutdown(this); - } - - RegistryItem[] resources = resourceItems.toArray(new RegistryItem[resourceItems.size()]); - for (RegistryItem resourceItem : resources) { - resourceItem.getItem().shutdown(); - } - - remoteItems.shutdown(); - localItems.shutdown(); - - for (RegistryListener listener : registryListeners) { - listener.afterShutdown(); - } - } - - synchronized public void pause() { - if (registryMaintainer != null) { - log.fine("Pausing registry maintenance"); - runPendingExecutions(true); - registryMaintainer.stop(); - registryMaintainer = null; - } - } - - synchronized public void resume() { - if (registryMaintainer == null) { - log.fine("Resuming registry maintenance"); - remoteItems.resume(); - registryMaintainer = createRegistryMaintainer(); - if (registryMaintainer != null) { - getConfiguration().getRegistryMaintainerExecutor().execute(registryMaintainer); - } - } - } - - synchronized public boolean isPaused() { - return registryMaintainer == null; - } - - /* ############################################################################################################ */ - - synchronized void maintain() { - - if (log.isLoggable(Level.FINEST)) - log.finest("Maintaining registry..."); - - // Remove expired resources - Iterator> it = resourceItems.iterator(); - while (it.hasNext()) { - RegistryItem item = it.next(); - if (item.getExpirationDetails().hasExpired()) { - if (log.isLoggable(Level.FINER)) - log.finer("Removing expired resource: " + item); - it.remove(); - } - } - - // Let each resource do its own maintenance - for (RegistryItem resourceItem : resourceItems) { - resourceItem.getItem().maintain( - pendingExecutions, - resourceItem.getExpirationDetails() - ); - } - - // These add all their operations to the pendingExecutions queue - remoteItems.maintain(); - localItems.maintain(); - - // We now run the queue asynchronously so the maintenance thread can continue its loop undisturbed - runPendingExecutions(true); - } - - synchronized void executeAsyncProtocol(Runnable runnable) { - pendingExecutions.add(runnable); - } - - synchronized void runPendingExecutions(boolean async) { - if (log.isLoggable(Level.FINEST)) - log.finest("Executing pending operations: " + pendingExecutions.size()); - for (Runnable pendingExecution : pendingExecutions) { - if (async) - getConfiguration().getAsyncProtocolExecutor().execute(pendingExecution); - else - pendingExecution.run(); - } - if (pendingExecutions.size() > 0) { - pendingExecutions.clear(); - } - } - - /* ############################################################################################################ */ - - public void printDebugLog() { - if (log.isLoggable(Level.FINE)) { - log.fine("==================================== REMOTE ================================================"); - - for (RemoteDevice remoteDevice : remoteItems.get()) { - log.fine(remoteDevice.toString()); - } - - log.fine("==================================== LOCAL ================================================"); - - for (LocalDevice localDevice : localItems.get()) { - log.fine(localDevice.toString()); - } - - log.fine("==================================== RESOURCES ================================================"); - - for (RegistryItem resourceItem : resourceItems) { - log.fine(resourceItem.toString()); - } - - log.fine("================================================================================================="); - - } - - } - - @Override - public void lockRemoteSubscriptions() { - remoteSubscriptionsLock.lock(); - } - - @Override - public void unlockRemoteSubscriptions() { - remoteSubscriptionsLock.unlock(); - } - - -} diff --git a/app/src/main/java/org/fourthline/cling/registry/RegistryItem.java b/app/src/main/java/org/fourthline/cling/registry/RegistryItem.java deleted file mode 100644 index 7ac55f4..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/RegistryItem.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry; - -import org.fourthline.cling.model.ExpirationDetails; - -/** - * Internal class, required by {@link RegistryImpl}. - * - * @author Christian Bauer - */ -class RegistryItem { - - private K key; - private I item; - private ExpirationDetails expirationDetails = new ExpirationDetails(); - - RegistryItem(K key) { - this.key = key; - } - - RegistryItem(K key, I item, int maxAgeSeconds) { - this.key = key; - this.item = item; - this.expirationDetails = new ExpirationDetails(maxAgeSeconds); - } - - public K getKey() { - return key; - } - - public I getItem() { - return item; - } - - public ExpirationDetails getExpirationDetails() { - return expirationDetails; - } - - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - RegistryItem that = (RegistryItem) o; - - return key.equals(that.key); - } - - public int hashCode() { - return key.hashCode(); - } - - @Override - public String toString() { - return "("+getClass().getSimpleName()+") " + getExpirationDetails() + " KEY: " + getKey() + " ITEM: " + getItem(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/registry/RegistryItems.java b/app/src/main/java/org/fourthline/cling/registry/RegistryItems.java deleted file mode 100644 index 5f75cde..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/RegistryItems.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry; - -import org.fourthline.cling.model.resource.Resource; -import org.fourthline.cling.model.ValidationException; -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.gena.GENASubscription; -import org.fourthline.cling.model.types.DeviceType; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDN; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -/** - * Internal class, required by {@link RegistryImpl}. - * - * @author Christian Bauer - */ -abstract class RegistryItems { - - protected final RegistryImpl registry; - - protected final Set> deviceItems = new HashSet(); - protected final Set> subscriptionItems = new HashSet(); - - RegistryItems(RegistryImpl registry) { - this.registry = registry; - } - - Set> getDeviceItems() { - return deviceItems; - } - - Set> getSubscriptionItems() { - return subscriptionItems; - } - - abstract void add(D device); - abstract boolean remove(final D device); - abstract void removeAll(); - - abstract void maintain(); - abstract void shutdown(); - - /** - * Returns root and embedded devices registered under the given UDN. - * - * @param udn A unique device name. - * @param rootOnly Set to true if only root devices (no embedded) should be searched - * @return Any registered root or embedded device under the given UDN, null if - * no device with the given UDN has been registered. - */ - D get(UDN udn, boolean rootOnly) { - for (RegistryItem item : deviceItems) { - D device = item.getItem(); - if (device.getIdentity().getUdn().equals(udn)) { - return device; - } - if (!rootOnly) { - D foundDevice = (D)item.getItem().findDevice(udn); - if (foundDevice != null) return foundDevice; - } - } - return null; - } - - /** - * Returns all devices (root or embedded) with a compatible type. - *

- * This routine will check compatible versions, as described by the UDA. - *

- * - * @param deviceType The minimum device type required. - * @return Any registered root or embedded device with a compatible type. - */ - Collection get(DeviceType deviceType) { - Collection devices = new HashSet(); - for (RegistryItem item : deviceItems) { - D[] d = (D[])item.getItem().findDevices(deviceType); - if (d != null) { - devices.addAll(Arrays.asList(d)); - } - } - return devices; - } - - /** - * Returns all devices (root or embedded) which have at least one matching service. - * - * @param serviceType The type of service to search for. - * @return Any registered root or embedded device with at least one matching service. - */ - Collection get(ServiceType serviceType) { - Collection devices = new HashSet(); - for (RegistryItem item : deviceItems) { - - D[] d = (D[])item.getItem().findDevices(serviceType); - if (d != null) { - devices.addAll(Arrays.asList(d)); - } - } - return devices; - } - - Collection get() { - Collection devices = new HashSet(); - for (RegistryItem item : deviceItems) { - devices.add(item.getItem()); - } - return devices; - } - - boolean contains(D device) { - return contains(device.getIdentity().getUdn()); - } - - boolean contains(UDN udn) { - return deviceItems.contains(new RegistryItem(udn)); - } - - void addSubscription(S subscription) { - - RegistryItem subscriptionItem = - new RegistryItem( - subscription.getSubscriptionId(), - subscription, - subscription.getActualDurationSeconds() - ); - - subscriptionItems.add(subscriptionItem); - } - - boolean updateSubscription(S subscription) { - if (removeSubscription(subscription)) { - addSubscription(subscription); - return true; - } - return false; - } - - boolean removeSubscription(S subscription) { - return subscriptionItems.remove(new RegistryItem(subscription.getSubscriptionId())); - } - - S getSubscription(String subscriptionId) { - for (RegistryItem registryItem : subscriptionItems) { - if (registryItem.getKey().equals(subscriptionId)) { - return registryItem.getItem(); - } - } - return null; - } - - Resource[] getResources(Device device) throws RegistrationException { - try { - return registry.getConfiguration().getNamespace().getResources(device); - } catch (ValidationException ex) { - throw new RegistrationException("Resource discover error: " + ex.toString(), ex); - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/registry/RegistryListener.java b/app/src/main/java/org/fourthline/cling/registry/RegistryListener.java deleted file mode 100644 index 3244ece..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/RegistryListener.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry; - -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.meta.RemoteDevice; - -/** - * Notification of discovered device additions, removals, updates. - *

- * Add an instance of this interface to the registry to be notified when a device is - * discovered on your UPnP network, or when it is updated, or when it disappears. - *

- *

- * Implementations will be called concurrently by several threads, they should be thread-safe. - *

- *

- * Listener methods are called in a separate thread, so you can execute - * expensive procedures without spawning a new thread. The {@link #beforeShutdown(Registry)} - * and {@link #afterShutdown()} methods are however called in the thread that is stopping - * the registry and should not be blocking, unless you want to delay the shutdown procedure. - *

- * - * @author Christian Bauer - */ -public interface RegistryListener { - - /** - * Called as soon as possible after a device has been discovered. - *

- * This method will be called after SSDP notification datagrams of a new alive - * UPnP device have been received and processed. The announced device XML descriptor - * will be retrieved and parsed. The given {@link org.fourthline.cling.model.meta.RemoteDevice} metadata - * is validated and partial {@link org.fourthline.cling.model.meta.Service} metadata is available. The - * services are unhydrated, they have no actions or state variable metadata because the - * service descriptors of the device model have not been retrieved at this point. - *

- *

- * You typically do not use this method on a regular machine, this is an optimization - * for slower UPnP hosts (such as Android handsets). - *

- * - * @param registry The Cling registry of all devices and services know to the local UPnP stack. - * @param device A validated and hydrated device metadata graph, with anemic service metadata. - */ - public void remoteDeviceDiscoveryStarted(Registry registry, RemoteDevice device); - - /** - * Called when service metadata couldn't be initialized. - *

- * If you override the {@link #remoteDeviceDiscoveryStarted(Registry, org.fourthline.cling.model.meta.RemoteDevice)} - * method, you might want to override this method as well. - *

- * - * @param registry The Cling registry of all devices and services know to the local UPnP stack. - * @param device A validated and hydrated device metadata graph, with anemic service metadata. - * @param ex The reason why service metadata could not be initialized, or null if service - * descriptors couldn't be retrieved at all. - */ - public void remoteDeviceDiscoveryFailed(Registry registry, RemoteDevice device, Exception ex); - - /** - * Called when complete metadata of a newly discovered device is available. - * - * @param registry The Cling registry of all devices and services know to the local UPnP stack. - * @param device A validated and hydrated device metadata graph, with complete service metadata. - */ - public void remoteDeviceAdded(Registry registry, RemoteDevice device); - - /** - * Called when a discovered device's expiration timestamp is updated. - *

- * This is a signal that a device is still alive and you typically don't have to react to this - * event. You will be notified when a device disappears through timeout. - *

- * - * @param registry The Cling registry of all devices and services know to the local UPnP stack. - * @param device A validated and hydrated device metadata graph, with complete service metadata. - */ - public void remoteDeviceUpdated(Registry registry, RemoteDevice device); - - /** - * Called when a previously discovered device disappears. - *

- * This method will also be called when a discovered device did not update its expiration timeout - * and has been been removed automatically by the local registry. This method will not be called - * when the UPnP stack is shutting down. - *

- * - * @param registry The Cling registry of all devices and services know to the local UPnP stack. - * @param device A validated and hydrated device metadata graph, with complete service metadata. - */ - public void remoteDeviceRemoved(Registry registry, RemoteDevice device); - - /** - * Called after you add your own device to the {@link org.fourthline.cling.registry.Registry}. - * - * @param registry The Cling registry of all devices and services know to the local UPnP stack. - * @param device The local device added to the {@link org.fourthline.cling.registry.Registry}. - */ - public void localDeviceAdded(Registry registry, LocalDevice device); - - /** - * Called after you remove your own device from the {@link org.fourthline.cling.registry.Registry}. - *

- * This method will not be called when the UPnP stack is shutting down. - *

- * @param registry The Cling registry of all devices and services know to the local UPnP stack. - * @param device The local device removed from the {@link org.fourthline.cling.registry.Registry}. - */ - public void localDeviceRemoved(Registry registry, LocalDevice device); - - /** - * Called after registry maintenance stops but before the registry is cleared. - *

- * This method should typically not block, it executes in the thread that shuts down the UPnP stack. - *

- * @param registry The Cling registry of all devices and services know to the local UPnP stack. - */ - public void beforeShutdown(Registry registry); - - /** - * Called after the registry has been cleared on shutdown. - *

- * This method should typically not block, it executes in the thread that shuts down the UPnP stack. - *

- */ - public void afterShutdown(); - -} diff --git a/app/src/main/java/org/fourthline/cling/registry/RegistryMaintainer.java b/app/src/main/java/org/fourthline/cling/registry/RegistryMaintainer.java deleted file mode 100644 index cf6e0d3..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/RegistryMaintainer.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry; - -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Runs periodically and calls {@link org.fourthline.cling.registry.RegistryImpl#maintain()}. - * - * @author Christian Bauer - */ -public class RegistryMaintainer implements Runnable { - - private static Logger log = Logger.getLogger(RegistryMaintainer.class.getName()); - - final private RegistryImpl registry; - final private int sleepIntervalMillis; - - private volatile boolean stopped = false; - - public RegistryMaintainer(RegistryImpl registry, int sleepIntervalMillis) { - this.registry = registry; - this.sleepIntervalMillis = sleepIntervalMillis; - } - - public void stop() { - if (log.isLoggable(Level.FINE)) - log.fine("Setting stopped status on thread"); - stopped = true; - } - - public void run() { - stopped = false; - if (log.isLoggable(Level.FINE)) - log.fine("Running registry maintenance loop every milliseconds: " + sleepIntervalMillis); - while (!stopped) { - - try { - registry.maintain(); - Thread.sleep(sleepIntervalMillis); - } catch (InterruptedException ex) { - stopped = true; - } - - } - log.fine("Stopped status on thread received, ending maintenance loop"); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/registry/RemoteItems.java b/app/src/main/java/org/fourthline/cling/registry/RemoteItems.java deleted file mode 100644 index 6f06a1c..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/RemoteItems.java +++ /dev/null @@ -1,320 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry; - -import org.fourthline.cling.model.resource.Resource; -import org.fourthline.cling.model.gena.CancelReason; -import org.fourthline.cling.model.gena.RemoteGENASubscription; -import org.fourthline.cling.model.meta.LocalDevice; -import org.fourthline.cling.model.meta.RemoteDevice; -import org.fourthline.cling.model.meta.RemoteDeviceIdentity; -import org.fourthline.cling.model.types.UDN; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Internal class, required by {@link RegistryImpl}. - * - * @author Christian Bauer - */ -class RemoteItems extends RegistryItems { - - private static Logger log = Logger.getLogger(Registry.class.getName()); - - RemoteItems(RegistryImpl registry) { - super(registry); - } - - /** - * Adds the given remote device to the registry, or udpates its expiration timestamp. - *

- * This method first checks if there is a remote device with the same UDN already registered. If so, it - * updates the expiration timestamp of the remote device without notifying any registry listeners. If the - * device is truly new, all its resources are tested for conflicts with existing resources in the registry's - * namespace, then it is added to the registry and listeners are notified that a new fully described remote - * device is now available. - *

- * - * @param device The remote device to be added - */ - void add(final RemoteDevice device) { - - if (update(device.getIdentity())) { - log.fine("Ignoring addition, device already registered: " + device); - return; - } - - Resource[] resources = getResources(device); - - for (Resource deviceResource : resources) { - log.fine("Validating remote device resource; " + deviceResource); - if (registry.getResource(deviceResource.getPathQuery()) != null) { - throw new RegistrationException("URI namespace conflict with already registered resource: " + deviceResource); - } - } - - for (Resource validatedResource : resources) { - registry.addResource(validatedResource); - log.fine("Added remote device resource: " + validatedResource); - } - - // Override the device's maximum age if configured (systems without multicast support) - RegistryItem item = new RegistryItem( - device.getIdentity().getUdn(), - device, - registry.getConfiguration().getRemoteDeviceMaxAgeSeconds() != null - ? registry.getConfiguration().getRemoteDeviceMaxAgeSeconds() - : device.getIdentity().getMaxAgeSeconds() - ); - log.fine("Adding hydrated remote device to registry with " - + item.getExpirationDetails().getMaxAgeSeconds() + " seconds expiration: " + device); - getDeviceItems().add(item); - - if (log.isLoggable(Level.FINEST)) { - StringBuilder sb = new StringBuilder(); - sb.append("\n"); - sb.append("-------------------------- START Registry Namespace -----------------------------------\n"); - for (Resource resource : registry.getResources()) { - sb.append(resource).append("\n"); - } - sb.append("-------------------------- END Registry Namespace -----------------------------------"); - log.finest(sb.toString()); - } - - // Only notify the listeners when the device is fully usable - log.fine("Completely hydrated remote device graph available, calling listeners: " + device); - for (final RegistryListener listener : registry.getListeners()) { - registry.getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - listener.remoteDeviceAdded(registry, device); - } - } - ); - } - - } - - boolean update(RemoteDeviceIdentity rdIdentity) { - - for (LocalDevice localDevice : registry.getLocalDevices()) { - if (localDevice.findDevice(rdIdentity.getUdn()) != null) { - log.fine("Ignoring update, a local device graph contains UDN"); - return true; - } - } - - RemoteDevice registeredRemoteDevice = get(rdIdentity.getUdn(), false); - if (registeredRemoteDevice != null) { - - if (!registeredRemoteDevice.isRoot()) { - log.fine("Updating root device of embedded: " + registeredRemoteDevice); - registeredRemoteDevice = registeredRemoteDevice.getRoot(); - } - - // Override the device's maximum age if configured (systems without multicast support) - final RegistryItem item = new RegistryItem( - registeredRemoteDevice.getIdentity().getUdn(), - registeredRemoteDevice, - registry.getConfiguration().getRemoteDeviceMaxAgeSeconds() != null - ? registry.getConfiguration().getRemoteDeviceMaxAgeSeconds() - : rdIdentity.getMaxAgeSeconds() - ); - - log.fine("Updating expiration of: " + registeredRemoteDevice); - getDeviceItems().remove(item); - getDeviceItems().add(item); - - log.fine("Remote device updated, calling listeners: " + registeredRemoteDevice); - for (final RegistryListener listener : registry.getListeners()) { - registry.getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - listener.remoteDeviceUpdated(registry, item.getItem()); - } - } - ); - } - - return true; - - } - return false; - } - - /** - * Removes the given device from the registry and notifies registry listeners. - * - * @param remoteDevice The device to remove from the registry. - * @return true if the given device was found and removed from the registry, false if it wasn't registered. - */ - boolean remove(final RemoteDevice remoteDevice) { - return remove(remoteDevice, false); - } - - boolean remove(final RemoteDevice remoteDevice, boolean shuttingDown) throws RegistrationException { - final RemoteDevice registeredDevice = get(remoteDevice.getIdentity().getUdn(), true); - if (registeredDevice != null) { - - log.fine("Removing remote device from registry: " + remoteDevice); - - // Resources - for (Resource deviceResource : getResources(registeredDevice)) { - if (registry.removeResource(deviceResource)) { - log.fine("Unregistered resource: " + deviceResource); - } - } - - // Active subscriptions - Iterator> it = getSubscriptionItems().iterator(); - while (it.hasNext()) { - final RegistryItem outgoingSubscription = it.next(); - - UDN subscriptionForUDN = - outgoingSubscription.getItem().getService().getDevice().getIdentity().getUdn(); - - if (subscriptionForUDN.equals(registeredDevice.getIdentity().getUdn())) { - log.fine("Removing outgoing subscription: " + outgoingSubscription.getKey()); - it.remove(); - if (!shuttingDown) { - registry.getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - outgoingSubscription.getItem().end(CancelReason.DEVICE_WAS_REMOVED, null); - } - } - ); - } - } - } - - // Only notify listeners if we are NOT in the process of shutting down the registry - if (!shuttingDown) { - for (final RegistryListener listener : registry.getListeners()) { - registry.getConfiguration().getRegistryListenerExecutor().execute( - new Runnable() { - public void run() { - listener.remoteDeviceRemoved(registry, registeredDevice); - } - } - ); - } - } - - // Finally, remove the device from the registry - getDeviceItems().remove(new RegistryItem(registeredDevice.getIdentity().getUdn())); - - return true; - } - - return false; - } - - void removeAll() { - removeAll(false); - } - - void removeAll(boolean shuttingDown) { - RemoteDevice[] allDevices = get().toArray(new RemoteDevice[get().size()]); - for (RemoteDevice device : allDevices) { - remove(device, shuttingDown); - } - } - - /* ############################################################################################################ */ - - void start() { - // Noop - } - - void maintain() { - - if (getDeviceItems().isEmpty()) return; - - // Remove expired remote devices - Map expiredRemoteDevices = new HashMap(); - for (RegistryItem remoteItem : getDeviceItems()) { - if (log.isLoggable(Level.FINEST)) - log.finest("Device '" + remoteItem.getItem() + "' expires in seconds: " - + remoteItem.getExpirationDetails().getSecondsUntilExpiration()); - if (remoteItem.getExpirationDetails().hasExpired(false)) { - expiredRemoteDevices.put(remoteItem.getKey(), remoteItem.getItem()); - } - } - for (RemoteDevice remoteDevice : expiredRemoteDevices.values()) { - if (log.isLoggable(Level.FINE)) - log.fine("Removing expired: " + remoteDevice); - remove(remoteDevice); - } - - // Renew outgoing subscriptions - Set expiredOutgoingSubscriptions = new HashSet(); - for (RegistryItem item : getSubscriptionItems()) { - if (item.getExpirationDetails().hasExpired(true)) { - expiredOutgoingSubscriptions.add(item.getItem()); - } - } - for (RemoteGENASubscription subscription : expiredOutgoingSubscriptions) { - if (log.isLoggable(Level.FINEST)) - log.fine("Renewing outgoing subscription: " + subscription); - renewOutgoingSubscription(subscription); - } - } - - public void resume() { - log.fine("Updating remote device expiration timestamps on resume"); - List toUpdate = new ArrayList(); - for (RegistryItem remoteItem : getDeviceItems()) { - toUpdate.add(remoteItem.getItem().getIdentity()); - } - for (RemoteDeviceIdentity identity : toUpdate) { - update(identity); - } - } - - void shutdown() { - log.fine("Cancelling all outgoing subscriptions to remote devices during shutdown"); - List remoteSubscriptions = new ArrayList(); - for (RegistryItem item : getSubscriptionItems()) { - remoteSubscriptions.add(item.getItem()); - } - for (RemoteGENASubscription remoteSubscription : remoteSubscriptions) { - // This will remove the active subscription from the registry! - registry.getProtocolFactory() - .createSendingUnsubscribe(remoteSubscription) - .run(); - } - - log.fine("Removing all remote devices from registry during shutdown"); - removeAll(true); - } - - /* ############################################################################################################ */ - - protected void renewOutgoingSubscription(final RemoteGENASubscription subscription) { - registry.executeAsyncProtocol( - registry.getProtocolFactory().createSendingRenewal(subscription) - ); - } -} diff --git a/app/src/main/java/org/fourthline/cling/registry/event/After.java b/app/src/main/java/org/fourthline/cling/registry/event/After.java deleted file mode 100644 index 488469a..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/event/After.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry.event; - -import javax.inject.Qualifier; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -/** - * @author Christian Bauer - */ -@Qualifier -@Target({FIELD, PARAMETER}) -@Retention(RUNTIME) -public @interface After { -} diff --git a/app/src/main/java/org/fourthline/cling/registry/event/Before.java b/app/src/main/java/org/fourthline/cling/registry/event/Before.java deleted file mode 100644 index fe0a1a9..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/event/Before.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry.event; - -import javax.inject.Qualifier; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -/** - * @author Christian Bauer - */ -@Qualifier -@Target({FIELD, PARAMETER}) -@Retention(RUNTIME) -public @interface Before { -} diff --git a/app/src/main/java/org/fourthline/cling/registry/event/DeviceDiscovery.java b/app/src/main/java/org/fourthline/cling/registry/event/DeviceDiscovery.java deleted file mode 100644 index 13dc094..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/event/DeviceDiscovery.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry.event; - -import org.fourthline.cling.model.meta.Device; - -/** - * An observable event for CDI containers. - * - * @author Christian Bauer - */ -public class DeviceDiscovery { - - protected D device; - - public DeviceDiscovery(D device) { - this.device = device; - } - - public D getDevice() { - return device; - } -} diff --git a/app/src/main/java/org/fourthline/cling/registry/event/FailedRemoteDeviceDiscovery.java b/app/src/main/java/org/fourthline/cling/registry/event/FailedRemoteDeviceDiscovery.java deleted file mode 100644 index 26522f3..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/event/FailedRemoteDeviceDiscovery.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry.event; - -import org.fourthline.cling.model.meta.RemoteDevice; - -/** - * @author Christian Bauer - */ -public class FailedRemoteDeviceDiscovery extends DeviceDiscovery { - - protected Exception exception; - - public FailedRemoteDeviceDiscovery(RemoteDevice device, Exception ex) { - super(device); - this.exception = ex; - } - - public Exception getException() { - return exception; - } -} diff --git a/app/src/main/java/org/fourthline/cling/registry/event/LocalDeviceDiscovery.java b/app/src/main/java/org/fourthline/cling/registry/event/LocalDeviceDiscovery.java deleted file mode 100644 index 0c738ae..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/event/LocalDeviceDiscovery.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry.event; - -import org.fourthline.cling.model.meta.LocalDevice; - -/** - * @author Christian Bauer - */ -public class LocalDeviceDiscovery extends DeviceDiscovery { - - public LocalDeviceDiscovery(LocalDevice device) { - super(device); - } -} diff --git a/app/src/main/java/org/fourthline/cling/registry/event/Phase.java b/app/src/main/java/org/fourthline/cling/registry/event/Phase.java deleted file mode 100644 index 429e772..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/event/Phase.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry.event; - -import javax.enterprise.util.AnnotationLiteral; -import javax.inject.Qualifier; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -/** - * @author Christian Bauer - */ - -public interface Phase { - - public static AnnotationLiteral ALIVE = new AnnotationLiteral() { - }; - - public static AnnotationLiteral COMPLETE = new AnnotationLiteral() { - }; - - public static AnnotationLiteral BYEBYE = new AnnotationLiteral() { - }; - - public static AnnotationLiteral UPDATED = new AnnotationLiteral() { - }; - - - @Qualifier - @Target({FIELD, PARAMETER}) - @Retention(RUNTIME) - public @interface Alive { - - } - - @Qualifier - @Target({FIELD, PARAMETER}) - @Retention(RUNTIME) - public @interface Complete { - - } - - @Qualifier - @Target({FIELD, PARAMETER}) - @Retention(RUNTIME) - public @interface Byebye { - - } - - @Qualifier - @Target({FIELD, PARAMETER}) - @Retention(RUNTIME) - public @interface Updated { - - } - -} diff --git a/app/src/main/java/org/fourthline/cling/registry/event/RegistryShutdown.java b/app/src/main/java/org/fourthline/cling/registry/event/RegistryShutdown.java deleted file mode 100644 index b454cc1..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/event/RegistryShutdown.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry.event; - -/** - * @author Christian Bauer - */ -public class RegistryShutdown { -} diff --git a/app/src/main/java/org/fourthline/cling/registry/event/RemoteDeviceDiscovery.java b/app/src/main/java/org/fourthline/cling/registry/event/RemoteDeviceDiscovery.java deleted file mode 100644 index 3d61193..0000000 --- a/app/src/main/java/org/fourthline/cling/registry/event/RemoteDeviceDiscovery.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.registry.event; - -import org.fourthline.cling.model.meta.RemoteDevice; - -/** - * @author Christian Bauer - */ -public class RemoteDeviceDiscovery extends DeviceDiscovery { - - public RemoteDeviceDiscovery(RemoteDevice device) { - super(device); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/AVTransportErrorCode.java b/app/src/main/java/org/fourthline/cling/support/avtransport/AVTransportErrorCode.java deleted file mode 100644 index aa1c9c6..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/AVTransportErrorCode.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport; - -/** - * - */ -public enum AVTransportErrorCode { - - TRANSITION_NOT_AVAILABLE(701, "The immediate transition from current to desired state not supported"), - NO_CONTENTS(702, "The media does not contain any contents that can be played"), - READ_ERROR(703, "The media cannot be read"), - PLAYBACK_FORMAT_NOT_SUPPORTED(704, "The storage format of the currently loaded media is not supported for playback"), - TRANSPORT_LOCKED(705, "The transport is 'hold locked', e.g. with a keyboard lock"), - WRITE_ERROR(706, "The media cannot be written"), - MEDIA_PROTECTED(707, "The media is write-protected or is of a not writable type"), - RECORD_FORMAT_NOT_SUPPORTED(708, "The storage format of the currently loaded media is not supported for recording"), - MEDIA_FULL(709, "There is no free space left on the loaded media"), - SEEKMODE_NOT_SUPPORTED(710, "The specified seek mode is not supported by the device"), - ILLEGAL_SEEK_TARGET(711, "The specified seek target is not specified in terms of the seek mode, or is not present on the media"), - PLAYMODE_NOT_SUPPORTED(712, "The specified play mode is not supported by the device"), - RECORDQUALITYMODE_NOT_SUPPORTED(713, "The specified record quality mode is not supported by the device"), - ILLEGAL_MIME_TYPE(714, "The specified resource has a MIME-type which is not supported"), - CONTENT_BUSY(715, "The resource is already being played by other means"), - RESOURCE_NOT_FOUND(716, "The specified resource cannot be found in the network"), - INVALID_INSTANCE_ID(718, "The specified instanceID is invalid for this AVTransport"); - - private int code; - private String description; - - AVTransportErrorCode(int code, String description) { - this.code = code; - this.description = description; - } - - public int getCode() { - return code; - } - - public String getDescription() { - return description; - } - - public static AVTransportErrorCode getByCode(int code) { - for (AVTransportErrorCode errorCode : values()) { - if (errorCode.getCode() == code) - return errorCode; - } - return null; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/AVTransportException.java b/app/src/main/java/org/fourthline/cling/support/avtransport/AVTransportException.java deleted file mode 100644 index 3cf6e90..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/AVTransportException.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport; - -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.types.ErrorCode; - -/** - * - */ -public class AVTransportException extends ActionException { - - public AVTransportException(int errorCode, String message) { - super(errorCode, message); - } - - public AVTransportException(int errorCode, String message, Throwable cause) { - super(errorCode, message, cause); - } - - public AVTransportException(ErrorCode errorCode, String message) { - super(errorCode, message); - } - - public AVTransportException(ErrorCode errorCode) { - super(errorCode); - } - - public AVTransportException(AVTransportErrorCode errorCode, String message) { - super(errorCode.getCode(), errorCode.getDescription() + ". " + message + "."); - } - - public AVTransportException(AVTransportErrorCode errorCode) { - super(errorCode.getCode(), errorCode.getDescription()); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/AbstractAVTransportService.java b/app/src/main/java/org/fourthline/cling/support/avtransport/AbstractAVTransportService.java deleted file mode 100644 index 3ca0465..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/AbstractAVTransportService.java +++ /dev/null @@ -1,383 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport; - -import org.fourthline.cling.binding.annotations.UpnpAction; -import org.fourthline.cling.binding.annotations.UpnpInputArgument; -import org.fourthline.cling.binding.annotations.UpnpOutputArgument; -import org.fourthline.cling.binding.annotations.UpnpService; -import org.fourthline.cling.binding.annotations.UpnpServiceId; -import org.fourthline.cling.binding.annotations.UpnpServiceType; -import org.fourthline.cling.binding.annotations.UpnpStateVariable; -import org.fourthline.cling.binding.annotations.UpnpStateVariables; -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.avtransport.lastchange.AVTransportLastChangeParser; -import org.fourthline.cling.support.avtransport.lastchange.AVTransportVariable; -import org.fourthline.cling.support.lastchange.LastChange; -import org.fourthline.cling.support.lastchange.LastChangeDelegator; -import org.fourthline.cling.support.model.DeviceCapabilities; -import org.fourthline.cling.support.model.MediaInfo; -import org.fourthline.cling.support.model.PlayMode; -import org.fourthline.cling.support.model.PositionInfo; -import org.fourthline.cling.support.model.RecordMediumWriteStatus; -import org.fourthline.cling.support.model.RecordQualityMode; -import org.fourthline.cling.support.model.SeekMode; -import org.fourthline.cling.support.model.StorageMedium; -import org.fourthline.cling.support.model.TransportAction; -import org.fourthline.cling.support.model.TransportInfo; -import org.fourthline.cling.support.model.TransportSettings; -import org.fourthline.cling.support.model.TransportState; -import org.fourthline.cling.support.model.TransportStatus; - -import java.beans.PropertyChangeSupport; -import java.net.URI; - -/** - * Skeleton of service with "LastChange" eventing support. - * - * @author Christian Bauer - */ -@UpnpService( - serviceId = @UpnpServiceId("AVTransport"), - serviceType = @UpnpServiceType(value = "AVTransport", version = 1), - stringConvertibleTypes = LastChange.class -) -@UpnpStateVariables({ - @UpnpStateVariable( - name = "TransportState", - sendEvents = false, - allowedValuesEnum = TransportState.class), - @UpnpStateVariable( - name = "TransportStatus", - sendEvents = false, - allowedValuesEnum = TransportStatus.class), - @UpnpStateVariable( - name = "PlaybackStorageMedium", - sendEvents = false, - defaultValue = "NONE", - allowedValuesEnum = StorageMedium.class), - @UpnpStateVariable( - name = "RecordStorageMedium", - sendEvents = false, - defaultValue = "NOT_IMPLEMENTED", - allowedValuesEnum = StorageMedium.class), - @UpnpStateVariable( - name = "PossiblePlaybackStorageMedia", - sendEvents = false, - datatype = "string", - defaultValue = "NETWORK"), - @UpnpStateVariable( - name = "PossibleRecordStorageMedia", - sendEvents = false, - datatype = "string", - defaultValue = "NOT_IMPLEMENTED"), - @UpnpStateVariable( // TODO - name = "CurrentPlayMode", - sendEvents = false, - defaultValue = "NORMAL", - allowedValuesEnum = PlayMode.class), - @UpnpStateVariable( // TODO - name = "TransportPlaySpeed", - sendEvents = false, - datatype = "string", - defaultValue = "1"), // 1, 1/2, 2, -1, 1/10, etc. - @UpnpStateVariable( - name = "RecordMediumWriteStatus", - sendEvents = false, - defaultValue = "NOT_IMPLEMENTED", - allowedValuesEnum = RecordMediumWriteStatus.class), - @UpnpStateVariable( - name = "CurrentRecordQualityMode", - sendEvents = false, - defaultValue = "NOT_IMPLEMENTED", - allowedValuesEnum = RecordQualityMode.class), - @UpnpStateVariable( - name = "PossibleRecordQualityModes", - sendEvents = false, - datatype = "string", - defaultValue = "NOT_IMPLEMENTED"), - @UpnpStateVariable( - name = "NumberOfTracks", - sendEvents = false, - datatype = "ui4", - defaultValue = "0"), - @UpnpStateVariable( - name = "CurrentTrack", - sendEvents = false, - datatype = "ui4", - defaultValue = "0"), - @UpnpStateVariable( - name = "CurrentTrackDuration", - sendEvents = false, - datatype = "string"), // H+:MM:SS[.F+] or H+:MM:SS[.F0/F1] - @UpnpStateVariable( - name = "CurrentMediaDuration", - sendEvents = false, - datatype = "string", - defaultValue = "00:00:00"), - @UpnpStateVariable( - name = "CurrentTrackMetaData", - sendEvents = false, - datatype = "string", - defaultValue = "NOT_IMPLEMENTED"), - @UpnpStateVariable( - name = "CurrentTrackURI", - sendEvents = false, - datatype = "string"), - @UpnpStateVariable( - name = "AVTransportURI", - sendEvents = false, - datatype = "string"), - @UpnpStateVariable( - name = "AVTransportURIMetaData", - sendEvents = false, - datatype = "string", - defaultValue = "NOT_IMPLEMENTED"), - @UpnpStateVariable( - name = "NextAVTransportURI", - sendEvents = false, - datatype = "string", - defaultValue = "NOT_IMPLEMENTED"), - @UpnpStateVariable( - name = "NextAVTransportURIMetaData", - sendEvents = false, - datatype = "string", - defaultValue = "NOT_IMPLEMENTED"), - @UpnpStateVariable( - name = "RelativeTimePosition", - sendEvents = false, - datatype = "string"), // H+:MM:SS[.F+] or H+:MM:SS[.F0/F1] (in track) - @UpnpStateVariable( - name = "AbsoluteTimePosition", - sendEvents = false, - datatype = "string"), // H+:MM:SS[.F+] or H+:MM:SS[.F0/F1] (in media) - @UpnpStateVariable( - name = "RelativeCounterPosition", - sendEvents = false, - datatype = "i4", - defaultValue = "2147483647"), // Max value means not implemented - @UpnpStateVariable( - name = "AbsoluteCounterPosition", - sendEvents = false, - datatype = "i4", - defaultValue = "2147483647"), // Max value means not implemented - @UpnpStateVariable( - name = "CurrentTransportActions", - sendEvents = false, - datatype = "string"), // Play, Stop, Pause, Seek, Next, Previous and Record - @UpnpStateVariable( - name = "A_ARG_TYPE_SeekMode", - sendEvents = false, - allowedValuesEnum = SeekMode.class), // The 'type' of seek we can perform (or should perform) - @UpnpStateVariable( - name = "A_ARG_TYPE_SeekTarget", - sendEvents = false, - datatype = "string"), // The actual seek (offset or whatever) value - @UpnpStateVariable( - name = "A_ARG_TYPE_InstanceID", - sendEvents = false, - datatype = "ui4") -}) -public abstract class AbstractAVTransportService implements LastChangeDelegator { - - @UpnpStateVariable(eventMaximumRateMilliseconds = 200) - final private LastChange lastChange; - final protected PropertyChangeSupport propertyChangeSupport; - - protected AbstractAVTransportService() { - this.propertyChangeSupport = new PropertyChangeSupport(this); - this.lastChange = new LastChange(new AVTransportLastChangeParser()); - } - - protected AbstractAVTransportService(LastChange lastChange) { - this.propertyChangeSupport = new PropertyChangeSupport(this); - this.lastChange = lastChange; - } - - protected AbstractAVTransportService(PropertyChangeSupport propertyChangeSupport) { - this.propertyChangeSupport = propertyChangeSupport; - this.lastChange = new LastChange(new AVTransportLastChangeParser()); - } - - protected AbstractAVTransportService(PropertyChangeSupport propertyChangeSupport, LastChange lastChange) { - this.propertyChangeSupport = propertyChangeSupport; - this.lastChange = lastChange; - } - - @Override - public LastChange getLastChange() { - return lastChange; - } - - @Override - public void appendCurrentState(LastChange lc, UnsignedIntegerFourBytes instanceId) throws Exception { - - MediaInfo mediaInfo = getMediaInfo(instanceId); - TransportInfo transportInfo = getTransportInfo(instanceId); - TransportSettings transportSettings = getTransportSettings(instanceId); - PositionInfo positionInfo = getPositionInfo(instanceId); - DeviceCapabilities deviceCaps = getDeviceCapabilities(instanceId); - - lc.setEventedValue( - instanceId, - new AVTransportVariable.AVTransportURI(URI.create(mediaInfo.getCurrentURI())), - new AVTransportVariable.AVTransportURIMetaData(mediaInfo.getCurrentURIMetaData()), - new AVTransportVariable.CurrentMediaDuration(mediaInfo.getMediaDuration()), - new AVTransportVariable.CurrentPlayMode(transportSettings.getPlayMode()), - new AVTransportVariable.CurrentRecordQualityMode(transportSettings.getRecQualityMode()), - new AVTransportVariable.CurrentTrack(positionInfo.getTrack()), - new AVTransportVariable.CurrentTrackDuration(positionInfo.getTrackDuration()), - new AVTransportVariable.CurrentTrackMetaData(positionInfo.getTrackMetaData()), - new AVTransportVariable.CurrentTrackURI(URI.create(positionInfo.getTrackURI())), - new AVTransportVariable.CurrentTransportActions(getCurrentTransportActions(instanceId)), - new AVTransportVariable.NextAVTransportURI(URI.create(mediaInfo.getNextURI())), - new AVTransportVariable.NextAVTransportURIMetaData(mediaInfo.getNextURIMetaData()), - new AVTransportVariable.NumberOfTracks(mediaInfo.getNumberOfTracks()), - new AVTransportVariable.PossiblePlaybackStorageMedia(deviceCaps.getPlayMedia()), - new AVTransportVariable.PossibleRecordQualityModes(deviceCaps.getRecQualityModes()), - new AVTransportVariable.PossibleRecordStorageMedia(deviceCaps.getRecMedia()), - new AVTransportVariable.RecordMediumWriteStatus(mediaInfo.getWriteStatus()), - new AVTransportVariable.RecordStorageMedium(mediaInfo.getRecordMedium()), - new AVTransportVariable.TransportPlaySpeed(transportInfo.getCurrentSpeed()), - new AVTransportVariable.TransportState(transportInfo.getCurrentTransportState()), - new AVTransportVariable.TransportStatus(transportInfo.getCurrentTransportStatus()) - ); - } - - public PropertyChangeSupport getPropertyChangeSupport() { - return propertyChangeSupport; - } - - public static UnsignedIntegerFourBytes getDefaultInstanceID() { - return new UnsignedIntegerFourBytes(0); - } - - @UpnpAction - public abstract void setAVTransportURI(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "CurrentURI", stateVariable = "AVTransportURI") String currentURI, - @UpnpInputArgument(name = "CurrentURIMetaData", stateVariable = "AVTransportURIMetaData") String currentURIMetaData) - throws AVTransportException; - - @UpnpAction - public abstract void setNextAVTransportURI(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "NextURI", stateVariable = "AVTransportURI") String nextURI, - @UpnpInputArgument(name = "NextURIMetaData", stateVariable = "AVTransportURIMetaData") String nextURIMetaData) - throws AVTransportException; - - @UpnpAction(out = { - @UpnpOutputArgument(name = "NrTracks", stateVariable = "NumberOfTracks", getterName = "getNumberOfTracks"), - @UpnpOutputArgument(name = "MediaDuration", stateVariable = "CurrentMediaDuration", getterName = "getMediaDuration"), - @UpnpOutputArgument(name = "CurrentURI", stateVariable = "AVTransportURI", getterName = "getCurrentURI"), - @UpnpOutputArgument(name = "CurrentURIMetaData", stateVariable = "AVTransportURIMetaData", getterName = "getCurrentURIMetaData"), - @UpnpOutputArgument(name = "NextURI", stateVariable = "NextAVTransportURI", getterName = "getNextURI"), - @UpnpOutputArgument(name = "NextURIMetaData", stateVariable = "NextAVTransportURIMetaData", getterName = "getNextURIMetaData"), - @UpnpOutputArgument(name = "PlayMedium", stateVariable = "PlaybackStorageMedium", getterName = "getPlayMedium"), - @UpnpOutputArgument(name = "RecordMedium", stateVariable = "RecordStorageMedium", getterName = "getRecordMedium"), - @UpnpOutputArgument(name = "WriteStatus", stateVariable = "RecordMediumWriteStatus", getterName = "getWriteStatus") - }) - public abstract MediaInfo getMediaInfo(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) - throws AVTransportException; - - @UpnpAction(out = { - @UpnpOutputArgument(name = "CurrentTransportState", stateVariable = "TransportState", getterName = "getCurrentTransportState"), - @UpnpOutputArgument(name = "CurrentTransportStatus", stateVariable = "TransportStatus", getterName = "getCurrentTransportStatus"), - @UpnpOutputArgument(name = "CurrentSpeed", stateVariable = "TransportPlaySpeed", getterName = "getCurrentSpeed") - }) - public abstract TransportInfo getTransportInfo(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) - throws AVTransportException; - - @UpnpAction(out = { - @UpnpOutputArgument(name = "Track", stateVariable = "CurrentTrack", getterName = "getTrack"), - @UpnpOutputArgument(name = "TrackDuration", stateVariable = "CurrentTrackDuration", getterName = "getTrackDuration"), - @UpnpOutputArgument(name = "TrackMetaData", stateVariable = "CurrentTrackMetaData", getterName = "getTrackMetaData"), - @UpnpOutputArgument(name = "TrackURI", stateVariable = "CurrentTrackURI", getterName = "getTrackURI"), - @UpnpOutputArgument(name = "RelTime", stateVariable = "RelativeTimePosition", getterName = "getRelTime"), - @UpnpOutputArgument(name = "AbsTime", stateVariable = "AbsoluteTimePosition", getterName = "getAbsTime"), - @UpnpOutputArgument(name = "RelCount", stateVariable = "RelativeCounterPosition", getterName = "getRelCount"), - @UpnpOutputArgument(name = "AbsCount", stateVariable = "AbsoluteCounterPosition", getterName = "getAbsCount") - }) - public abstract PositionInfo getPositionInfo(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) - throws AVTransportException; - - @UpnpAction(out = { - @UpnpOutputArgument(name = "PlayMedia", stateVariable = "PossiblePlaybackStorageMedia", getterName = "getPlayMediaString"), - @UpnpOutputArgument(name = "RecMedia", stateVariable = "PossibleRecordStorageMedia", getterName = "getRecMediaString"), - @UpnpOutputArgument(name = "RecQualityModes", stateVariable = "PossibleRecordQualityModes", getterName = "getRecQualityModesString") - }) - public abstract DeviceCapabilities getDeviceCapabilities(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) - throws AVTransportException; - - @UpnpAction(out = { - @UpnpOutputArgument(name = "PlayMode", stateVariable = "CurrentPlayMode", getterName = "getPlayMode"), - @UpnpOutputArgument(name = "RecQualityMode", stateVariable = "CurrentRecordQualityMode", getterName = "getRecQualityMode") - }) - public abstract TransportSettings getTransportSettings(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) - throws AVTransportException; - - @UpnpAction - public abstract void stop(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) - throws AVTransportException; - - @UpnpAction - public abstract void play(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "Speed", stateVariable = "TransportPlaySpeed") String speed) - throws AVTransportException; - - @UpnpAction - public abstract void pause(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) - throws AVTransportException; - - @UpnpAction - public abstract void record(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) - throws AVTransportException; - - @UpnpAction - public abstract void seek(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "Unit", stateVariable = "A_ARG_TYPE_SeekMode") String unit, - @UpnpInputArgument(name = "Target", stateVariable = "A_ARG_TYPE_SeekTarget") String target) - throws AVTransportException; - - @UpnpAction - public abstract void next(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) - throws AVTransportException; - - @UpnpAction - public abstract void previous(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) - throws AVTransportException; - - @UpnpAction - public abstract void setPlayMode(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "NewPlayMode", stateVariable = "CurrentPlayMode") String newPlayMode) - throws AVTransportException; - - @UpnpAction - public abstract void setRecordQualityMode(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "NewRecordQualityMode", stateVariable = "CurrentRecordQualityMode") String newRecordQualityMode) - throws AVTransportException; - - @UpnpAction(name = "GetCurrentTransportActions", out = @UpnpOutputArgument(name = "Actions", stateVariable = "CurrentTransportActions")) - public String getCurrentTransportActionsString(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) - throws AVTransportException { - try { - return ModelUtil.toCommaSeparatedList(getCurrentTransportActions(instanceId)); - } catch (Exception ex) { - return ""; // TODO: Empty string is not defined in spec but seems reasonable for no available action? - } - } - - protected abstract TransportAction[] getCurrentTransportActions(UnsignedIntegerFourBytes instanceId) throws Exception; -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetCurrentTransportActions.java b/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetCurrentTransportActions.java deleted file mode 100644 index 32bfaf3..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetCurrentTransportActions.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.TransportAction; - -import java.util.logging.Logger; - -/** - * @author Christian Bauer - */ -public abstract class GetCurrentTransportActions extends ActionCallback { - - private static Logger log = Logger.getLogger(GetCurrentTransportActions.class.getName()); - - public GetCurrentTransportActions(Service service) { - this(new UnsignedIntegerFourBytes(0), service); - } - - public GetCurrentTransportActions(UnsignedIntegerFourBytes instanceId, Service service) { - super(new ActionInvocation(service.getAction("GetCurrentTransportActions"))); - getActionInvocation().setInput("InstanceID", instanceId); - } - - public void success(ActionInvocation invocation) { - String actionsString = (String)invocation.getOutput("Actions").getValue(); - received(invocation, TransportAction.valueOfCommaSeparatedList(actionsString)); - } - - public abstract void received(ActionInvocation actionInvocation, TransportAction[] actions); - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetDeviceCapabilities.java b/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetDeviceCapabilities.java deleted file mode 100644 index b01ae4e..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetDeviceCapabilities.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.DeviceCapabilities; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class GetDeviceCapabilities extends ActionCallback { - - private static Logger log = Logger.getLogger(GetDeviceCapabilities.class.getName()); - - public GetDeviceCapabilities(Service service) { - this(new UnsignedIntegerFourBytes(0), service); - } - - public GetDeviceCapabilities(UnsignedIntegerFourBytes instanceId, Service service) { - super(new ActionInvocation(service.getAction("GetDeviceCapabilities"))); - getActionInvocation().setInput("InstanceID", instanceId); - } - - public void success(ActionInvocation invocation) { - DeviceCapabilities caps = new DeviceCapabilities(invocation.getOutputMap()); - received(invocation, caps); - } - - public abstract void received(ActionInvocation actionInvocation, DeviceCapabilities caps); - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetMediaInfo.java b/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetMediaInfo.java deleted file mode 100644 index 69635ff..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetMediaInfo.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.MediaInfo; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class GetMediaInfo extends ActionCallback { - - private static Logger log = Logger.getLogger(GetMediaInfo.class.getName()); - - public GetMediaInfo(Service service) { - this(new UnsignedIntegerFourBytes(0), service); - } - - public GetMediaInfo(UnsignedIntegerFourBytes instanceId, Service service) { - super(new ActionInvocation(service.getAction("GetMediaInfo"))); - getActionInvocation().setInput("InstanceID", instanceId); - } - - public void success(ActionInvocation invocation) { - MediaInfo mediaInfo = new MediaInfo(invocation.getOutputMap()); - received(invocation, mediaInfo); - } - - public abstract void received(ActionInvocation invocation, MediaInfo mediaInfo); - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetPositionInfo.java b/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetPositionInfo.java deleted file mode 100644 index a25e784..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetPositionInfo.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.PositionInfo; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class GetPositionInfo extends ActionCallback { - - private static Logger log = Logger.getLogger(GetPositionInfo.class.getName()); - - public GetPositionInfo(Service service) { - this(new UnsignedIntegerFourBytes(0), service); - } - - public GetPositionInfo(UnsignedIntegerFourBytes instanceId, Service service) { - super(new ActionInvocation(service.getAction("GetPositionInfo"))); - getActionInvocation().setInput("InstanceID", instanceId); - } - - public void success(ActionInvocation invocation) { - PositionInfo positionInfo = new PositionInfo(invocation.getOutputMap()); - received(invocation, positionInfo); - } - - public abstract void received(ActionInvocation invocation, PositionInfo positionInfo); - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetTransportInfo.java b/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetTransportInfo.java deleted file mode 100644 index 1194580..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/GetTransportInfo.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.TransportInfo; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class GetTransportInfo extends ActionCallback { - - private static Logger log = Logger.getLogger(GetTransportInfo.class.getName()); - - public GetTransportInfo(Service service) { - this(new UnsignedIntegerFourBytes(0), service); - } - - public GetTransportInfo(UnsignedIntegerFourBytes instanceId, Service service) { - super(new ActionInvocation(service.getAction("GetTransportInfo"))); - getActionInvocation().setInput("InstanceID", instanceId); - } - - public void success(ActionInvocation invocation) { - TransportInfo transportInfo = new TransportInfo(invocation.getOutputMap()); - received(invocation, transportInfo); - } - - public abstract void received(ActionInvocation invocation, TransportInfo transportInfo); - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Pause.java b/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Pause.java deleted file mode 100644 index 96512ea..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Pause.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class Pause extends ActionCallback { - - private static Logger log = Logger.getLogger(Pause.class.getName()); - - protected Pause(ActionInvocation actionInvocation, ControlPoint controlPoint) { - super(actionInvocation, controlPoint); - } - - protected Pause(ActionInvocation actionInvocation) { - super(actionInvocation); - } - - public Pause(Service service) { - this(new UnsignedIntegerFourBytes(0), service); - } - - public Pause(UnsignedIntegerFourBytes instanceId, Service service) { - super(new ActionInvocation(service.getAction("Pause"))); - getActionInvocation().setInput("InstanceID", instanceId); - } - - @Override - public void success(ActionInvocation invocation) { - log.fine("Execution successful"); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Play.java b/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Play.java deleted file mode 100644 index 6179fe6..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Play.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class Play extends ActionCallback { - - private static Logger log = Logger.getLogger(Play.class.getName()); - - public Play(Service service) { - this(new UnsignedIntegerFourBytes(0), service, "1"); - } - - public Play(Service service, String speed) { - this(new UnsignedIntegerFourBytes(0), service, speed); - } - - public Play(UnsignedIntegerFourBytes instanceId, Service service) { - this(instanceId, service, "1"); - } - - public Play(UnsignedIntegerFourBytes instanceId, Service service, String speed) { - super(new ActionInvocation(service.getAction("Play"))); - getActionInvocation().setInput("InstanceID", instanceId); - getActionInvocation().setInput("Speed", speed); - } - - @Override - public void success(ActionInvocation invocation) { - log.fine("Execution successful"); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Seek.java b/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Seek.java deleted file mode 100644 index 1da559e..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Seek.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.SeekMode; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class Seek extends ActionCallback { - - private static Logger log = Logger.getLogger(Seek.class.getName()); - - public Seek(Service service, String relativeTimeTarget) { - this(new UnsignedIntegerFourBytes(0), service, SeekMode.REL_TIME, relativeTimeTarget); - } - - public Seek(UnsignedIntegerFourBytes instanceId, Service service, String relativeTimeTarget) { - this(instanceId, service, SeekMode.REL_TIME, relativeTimeTarget); - } - - public Seek(Service service, SeekMode mode, String target) { - this(new UnsignedIntegerFourBytes(0), service, mode, target); - } - - public Seek(UnsignedIntegerFourBytes instanceId, Service service, SeekMode mode, String target) { - super(new ActionInvocation(service.getAction("Seek"))); - getActionInvocation().setInput("InstanceID", instanceId); - getActionInvocation().setInput("Unit", mode.name()); - getActionInvocation().setInput("Target", target); - } - - @Override - public void success(ActionInvocation invocation) { - log.fine("Execution successful"); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/SetAVTransportURI.java b/app/src/main/java/org/fourthline/cling/support/avtransport/callback/SetAVTransportURI.java deleted file mode 100644 index 159e3b5..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/SetAVTransportURI.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.util.logging.Logger; - -/** - * @author Christian Bauer - */ -public abstract class SetAVTransportURI extends ActionCallback { - - private static Logger log = Logger.getLogger(SetAVTransportURI.class.getName()); - - public SetAVTransportURI(Service service, String uri) { - this(new UnsignedIntegerFourBytes(0), service, uri, null); - } - - public SetAVTransportURI(Service service, String uri, String metadata) { - this(new UnsignedIntegerFourBytes(0), service, uri, metadata); - } - - public SetAVTransportURI(UnsignedIntegerFourBytes instanceId, Service service, String uri) { - this(instanceId, service, uri, null); - } - - public SetAVTransportURI(UnsignedIntegerFourBytes instanceId, Service service, String uri, String metadata) { - super(new ActionInvocation(service.getAction("SetAVTransportURI"))); - log.fine("Creating SetAVTransportURI action for URI: " + uri); - getActionInvocation().setInput("InstanceID", instanceId); - getActionInvocation().setInput("CurrentURI", uri); - getActionInvocation().setInput("CurrentURIMetaData", metadata); - } - - @Override - public void success(ActionInvocation invocation) { - log.fine("Execution successful"); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Stop.java b/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Stop.java deleted file mode 100644 index 8a83a57..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/callback/Stop.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class Stop extends ActionCallback { - - private static Logger log = Logger.getLogger(Stop.class.getName()); - - public Stop(Service service) { - this(new UnsignedIntegerFourBytes(0), service); - } - - public Stop(UnsignedIntegerFourBytes instanceId, Service service) { - super(new ActionInvocation(service.getAction("Stop"))); - getActionInvocation().setInput("InstanceID", instanceId); - } - - @Override - public void success(ActionInvocation invocation) { - log.fine("Execution successful"); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/AVTransportService.java b/app/src/main/java/org/fourthline/cling/support/avtransport/impl/AVTransportService.java deleted file mode 100644 index d595432..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/AVTransportService.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.impl; - -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.avtransport.AVTransportErrorCode; -import org.fourthline.cling.support.avtransport.AVTransportException; -import org.fourthline.cling.support.avtransport.AbstractAVTransportService; -import org.fourthline.cling.support.avtransport.impl.state.AbstractState; -import org.fourthline.cling.support.lastchange.LastChange; -import org.fourthline.cling.support.model.AVTransport; -import org.fourthline.cling.support.model.DeviceCapabilities; -import org.fourthline.cling.support.model.MediaInfo; -import org.fourthline.cling.support.model.PlayMode; -import org.fourthline.cling.support.model.PositionInfo; -import org.fourthline.cling.support.model.RecordQualityMode; -import org.fourthline.cling.support.model.SeekMode; -import org.fourthline.cling.support.model.StorageMedium; -import org.fourthline.cling.support.model.TransportAction; -import org.fourthline.cling.support.model.TransportInfo; -import org.fourthline.cling.support.model.TransportSettings; -import org.seamless.statemachine.StateMachineBuilder; -import org.seamless.statemachine.TransitionException; - -import java.net.URI; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Logger; - -/** - * State-machine based implementation of AVTransport service. - *

- * One logical AVTransport is represented by: - *

- *
    - *
  • - * One {@link org.fourthline.cling.support.avtransport.impl.AVTransportStateMachine} - * instance that accepts the action method call as a proxy. - *
  • - *
  • - * Each state machine holds several instances of - * {@link org.fourthline.cling.support.avtransport.impl.state.AbstractState}, created on - * instantation of the state machine. The "current" state will be the target of - * the action call. It is the state implementation that decides how to handle the - * call and what the next state is after a possible transition. - *
  • - *
  • - * Each state has a reference to an implementation of - * {@link org.fourthline.cling.support.model.AVTransport}, where the state can hold - * information about well, the state. - *
  • - *
- *

- * Simplified, this means that each AVTransport instance ID is typically handled by - * one state machine, and the internal state of that machine is stored in an - * AVTransport. - *

- *

- * Override the {@link #createTransport(org.fourthline.cling.model.types.UnsignedIntegerFourBytes, org.fourthline.cling.support.lastchange.LastChange)} - * method to utilize a subclass of AVTransport as your internal state holder. - *

- * - * @author Christian Bauer - */ -public class AVTransportService extends AbstractAVTransportService { - - final private static Logger log = Logger.getLogger(AVTransportService.class.getName()); - - final private Map stateMachines = new ConcurrentHashMap(); - - final Class stateMachineDefinition; - final Class initialState; - final Class transportClass; - - public AVTransportService(Class stateMachineDefinition, - Class initialState) { - this(stateMachineDefinition, initialState, (Class)AVTransport.class); - } - - public AVTransportService(Class stateMachineDefinition, - Class initialState, - Class transportClass) { - this.stateMachineDefinition = stateMachineDefinition; - this.initialState = initialState; - this.transportClass = transportClass; - } - - public void setAVTransportURI(UnsignedIntegerFourBytes instanceId, - String currentURI, - String currentURIMetaData) throws AVTransportException { - - URI uri; - try { - uri = new URI(currentURI); - } catch (Exception ex) { - throw new AVTransportException( - ErrorCode.INVALID_ARGS, "CurrentURI can not be null or malformed" - ); - } - - try { - AVTransportStateMachine transportStateMachine = findStateMachine(instanceId, true); - transportStateMachine.setTransportURI(uri, currentURIMetaData); - } catch (TransitionException ex) { - throw new AVTransportException(AVTransportErrorCode.TRANSITION_NOT_AVAILABLE, ex.getMessage()); - } - } - - public void setNextAVTransportURI(UnsignedIntegerFourBytes instanceId, - String nextURI, - String nextURIMetaData) throws AVTransportException { - - URI uri; - try { - uri = new URI(nextURI); - } catch (Exception ex) { - throw new AVTransportException( - ErrorCode.INVALID_ARGS, "NextURI can not be null or malformed" - ); - } - - try { - AVTransportStateMachine transportStateMachine = findStateMachine(instanceId, true); - transportStateMachine.setNextTransportURI(uri, nextURIMetaData); - } catch (TransitionException ex) { - throw new AVTransportException(AVTransportErrorCode.TRANSITION_NOT_AVAILABLE, ex.getMessage()); - } - } - - public void setPlayMode(UnsignedIntegerFourBytes instanceId, String newPlayMode) throws AVTransportException { - AVTransport transport = findStateMachine(instanceId).getCurrentState().getTransport(); - try { - transport.setTransportSettings( - new TransportSettings( - PlayMode.valueOf(newPlayMode), - transport.getTransportSettings().getRecQualityMode() - ) - ); - } catch (IllegalArgumentException ex) { - throw new AVTransportException( - AVTransportErrorCode.PLAYMODE_NOT_SUPPORTED, "Unsupported play mode: " + newPlayMode - ); - } - } - - public void setRecordQualityMode(UnsignedIntegerFourBytes instanceId, String newRecordQualityMode) throws AVTransportException { - AVTransport transport = findStateMachine(instanceId).getCurrentState().getTransport(); - try { - transport.setTransportSettings( - new TransportSettings( - transport.getTransportSettings().getPlayMode(), - RecordQualityMode.valueOrExceptionOf(newRecordQualityMode) - ) - ); - } catch (IllegalArgumentException ex) { - throw new AVTransportException( - AVTransportErrorCode.RECORDQUALITYMODE_NOT_SUPPORTED, "Unsupported record quality mode: " + newRecordQualityMode - ); - } - } - - public MediaInfo getMediaInfo(UnsignedIntegerFourBytes instanceId) throws AVTransportException { - return findStateMachine(instanceId).getCurrentState().getTransport().getMediaInfo(); - } - - public TransportInfo getTransportInfo(UnsignedIntegerFourBytes instanceId) throws AVTransportException { - return findStateMachine(instanceId).getCurrentState().getTransport().getTransportInfo(); - } - - public PositionInfo getPositionInfo(UnsignedIntegerFourBytes instanceId) throws AVTransportException { - return findStateMachine(instanceId).getCurrentState().getTransport().getPositionInfo(); - } - - public DeviceCapabilities getDeviceCapabilities(UnsignedIntegerFourBytes instanceId) throws AVTransportException { - return findStateMachine(instanceId).getCurrentState().getTransport().getDeviceCapabilities(); - } - - public TransportSettings getTransportSettings(UnsignedIntegerFourBytes instanceId) throws AVTransportException { - return findStateMachine(instanceId).getCurrentState().getTransport().getTransportSettings(); - } - - public void stop(UnsignedIntegerFourBytes instanceId) throws AVTransportException { - try { - findStateMachine(instanceId).stop(); - } catch (TransitionException ex) { - throw new AVTransportException(AVTransportErrorCode.TRANSITION_NOT_AVAILABLE, ex.getMessage()); - } - } - - public void play(UnsignedIntegerFourBytes instanceId, String speed) throws AVTransportException { - try { - findStateMachine(instanceId).play(speed); - } catch (TransitionException ex) { - throw new AVTransportException(AVTransportErrorCode.TRANSITION_NOT_AVAILABLE, ex.getMessage()); - } - } - - public void pause(UnsignedIntegerFourBytes instanceId) throws AVTransportException { - try { - findStateMachine(instanceId).pause(); - } catch (TransitionException ex) { - throw new AVTransportException(AVTransportErrorCode.TRANSITION_NOT_AVAILABLE, ex.getMessage()); - } - } - - public void record(UnsignedIntegerFourBytes instanceId) throws AVTransportException { - try { - findStateMachine(instanceId).record(); - } catch (TransitionException ex) { - throw new AVTransportException(AVTransportErrorCode.TRANSITION_NOT_AVAILABLE, ex.getMessage()); - } - } - - public void seek(UnsignedIntegerFourBytes instanceId, String unit, String target) throws AVTransportException { - SeekMode seekMode; - try { - seekMode = SeekMode.valueOrExceptionOf(unit); - } catch (IllegalArgumentException ex) { - throw new AVTransportException( - AVTransportErrorCode.SEEKMODE_NOT_SUPPORTED, "Unsupported seek mode: " + unit - ); - } - - try { - findStateMachine(instanceId).seek(seekMode, target); - } catch (TransitionException ex) { - throw new AVTransportException(AVTransportErrorCode.TRANSITION_NOT_AVAILABLE, ex.getMessage()); - } - } - - public void next(UnsignedIntegerFourBytes instanceId) throws AVTransportException { - try { - findStateMachine(instanceId).next(); - } catch (TransitionException ex) { - throw new AVTransportException(AVTransportErrorCode.TRANSITION_NOT_AVAILABLE, ex.getMessage()); - } - } - - public void previous(UnsignedIntegerFourBytes instanceId) throws AVTransportException { - try { - findStateMachine(instanceId).previous(); - } catch (TransitionException ex) { - throw new AVTransportException(AVTransportErrorCode.TRANSITION_NOT_AVAILABLE, ex.getMessage()); - } - } - - @Override - protected TransportAction[] getCurrentTransportActions(UnsignedIntegerFourBytes instanceId) throws Exception { - AVTransportStateMachine stateMachine = findStateMachine(instanceId); - try { - return stateMachine.getCurrentState().getCurrentTransportActions(); - } catch (TransitionException ex) { - return new TransportAction[0]; - } - } - - @Override - public UnsignedIntegerFourBytes[] getCurrentInstanceIds() { - synchronized (stateMachines) { - UnsignedIntegerFourBytes[] ids = new UnsignedIntegerFourBytes[stateMachines.size()]; - int i = 0; - for (Long id : stateMachines.keySet()) { - ids[i] = new UnsignedIntegerFourBytes(id); - i++; - } - return ids; - } - } - - protected AVTransportStateMachine findStateMachine(UnsignedIntegerFourBytes instanceId) throws AVTransportException { - return findStateMachine(instanceId, true); - } - - protected AVTransportStateMachine findStateMachine(UnsignedIntegerFourBytes instanceId, boolean createDefaultTransport) throws AVTransportException { - synchronized (stateMachines) { - long id = instanceId.getValue(); - AVTransportStateMachine stateMachine = stateMachines.get(id); - if (stateMachine == null && id == 0 && createDefaultTransport) { - log.fine("Creating default transport instance with ID '0'"); - stateMachine = createStateMachine(instanceId); - stateMachines.put(id, stateMachine); - } else if (stateMachine == null) { - throw new AVTransportException(AVTransportErrorCode.INVALID_INSTANCE_ID); - } - log.fine("Found transport control with ID '" + id + "'"); - return stateMachine; - } - } - - protected AVTransportStateMachine createStateMachine(UnsignedIntegerFourBytes instanceId) { - // Create a proxy that delegates all calls to the right state implementation, working on the T state - return StateMachineBuilder.build( - stateMachineDefinition, - initialState, - new Class[]{transportClass}, - new Object[]{createTransport(instanceId, getLastChange())} - ); - } - - protected AVTransport createTransport(UnsignedIntegerFourBytes instanceId, LastChange lastChange) { - return new AVTransport(instanceId, lastChange, StorageMedium.NETWORK); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/AVTransportStateMachine.java b/app/src/main/java/org/fourthline/cling/support/avtransport/impl/AVTransportStateMachine.java deleted file mode 100644 index c7ea2ad..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/AVTransportStateMachine.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.impl; - -import org.fourthline.cling.support.avtransport.impl.state.AbstractState; -import org.fourthline.cling.support.model.SeekMode; -import org.seamless.statemachine.StateMachine; - -import java.net.URI; - -public interface AVTransportStateMachine extends StateMachine { - - public abstract void setTransportURI(URI uri, String uriMetaData); - public abstract void setNextTransportURI(URI uri, String uriMetaData); - public abstract void stop(); - public abstract void play(String speed); - public abstract void pause(); - public abstract void record(); - public abstract void seek(SeekMode unit, String target); - public abstract void next(); - public abstract void previous(); - -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/AbstractState.java b/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/AbstractState.java deleted file mode 100644 index 55129ed..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/AbstractState.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.impl.state; - -import org.fourthline.cling.support.model.AVTransport; -import org.fourthline.cling.support.model.TransportAction; - -/** - * - */ -public abstract class AbstractState { - - private T transport; - - public AbstractState(T transport) { - this.transport = transport; - } - - public T getTransport() { - return transport; - } - - public abstract TransportAction[] getCurrentTransportActions(); - -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/NoMediaPresent.java b/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/NoMediaPresent.java deleted file mode 100644 index fd7014c..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/NoMediaPresent.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.impl.state; - -import org.fourthline.cling.support.avtransport.lastchange.AVTransportVariable; -import org.fourthline.cling.support.model.AVTransport; -import org.fourthline.cling.support.model.TransportAction; -import org.fourthline.cling.support.model.TransportInfo; -import org.fourthline.cling.support.model.TransportState; - -import java.net.URI; -import java.util.logging.Logger; - -/** - * @author Christian Bauer - */ -public abstract class NoMediaPresent extends AbstractState { - - final private static Logger log = Logger.getLogger(Stopped.class.getName()); - - public NoMediaPresent(T transport) { - super(transport); - } - - public void onEntry() { - log.fine("Setting transport state to NO_MEDIA_PRESENT"); - getTransport().setTransportInfo( - new TransportInfo( - TransportState.NO_MEDIA_PRESENT, - getTransport().getTransportInfo().getCurrentTransportStatus(), - getTransport().getTransportInfo().getCurrentSpeed() - ) - ); - getTransport().getLastChange().setEventedValue( - getTransport().getInstanceId(), - new AVTransportVariable.TransportState(TransportState.NO_MEDIA_PRESENT), - new AVTransportVariable.CurrentTransportActions(getCurrentTransportActions()) - ); - } - - public abstract Class setTransportURI(URI uri, String metaData); - - public TransportAction[] getCurrentTransportActions() { - return new TransportAction[] { - TransportAction.Stop - }; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/PausedPlay.java b/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/PausedPlay.java deleted file mode 100644 index 8957b22..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/PausedPlay.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.impl.state; - -import org.fourthline.cling.support.avtransport.lastchange.AVTransportVariable; -import org.fourthline.cling.support.model.AVTransport; -import org.fourthline.cling.support.model.TransportAction; -import org.fourthline.cling.support.model.TransportInfo; -import org.fourthline.cling.support.model.TransportState; - -import java.net.URI; -import java.util.logging.Logger; - -/** - * @author Christian Bauer - */ -public abstract class PausedPlay extends AbstractState { - - final private static Logger log = Logger.getLogger(PausedPlay.class.getName()); - - public PausedPlay(T transport) { - super(transport); - } - - public void onEntry() { - log.fine("Setting transport state to PAUSED_PLAYBACK"); - getTransport().setTransportInfo( - new TransportInfo( - TransportState.PAUSED_PLAYBACK, - getTransport().getTransportInfo().getCurrentTransportStatus(), - getTransport().getTransportInfo().getCurrentSpeed() - ) - ); - getTransport().getLastChange().setEventedValue( - getTransport().getInstanceId(), - new AVTransportVariable.TransportState(TransportState.PAUSED_PLAYBACK), - new AVTransportVariable.CurrentTransportActions(getCurrentTransportActions()) - ); - } - - public abstract Class setTransportURI(URI uri, String metaData); - public abstract Class stop(); - public abstract Class play(String speed); - - public TransportAction[] getCurrentTransportActions() { - return new TransportAction[] { - TransportAction.Stop, - TransportAction.Play - }; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/Playing.java b/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/Playing.java deleted file mode 100644 index a620986..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/Playing.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.impl.state; - -import org.fourthline.cling.support.avtransport.lastchange.AVTransportVariable; -import org.fourthline.cling.support.model.AVTransport; -import org.fourthline.cling.support.model.SeekMode; -import org.fourthline.cling.support.model.TransportAction; -import org.fourthline.cling.support.model.TransportInfo; -import org.fourthline.cling.support.model.TransportState; - -import java.net.URI; -import java.util.logging.Logger; - -/** - * @author Christian Bauer - */ -public abstract class Playing extends AbstractState { - - final private static Logger log = Logger.getLogger(Playing.class.getName()); - - public Playing(T transport) { - super(transport); - } - - public void onEntry() { - log.fine("Setting transport state to PLAYING"); - getTransport().setTransportInfo( - new TransportInfo( - TransportState.PLAYING, - getTransport().getTransportInfo().getCurrentTransportStatus(), - getTransport().getTransportInfo().getCurrentSpeed() - ) - ); - getTransport().getLastChange().setEventedValue( - getTransport().getInstanceId(), - new AVTransportVariable.TransportState(TransportState.PLAYING), - new AVTransportVariable.CurrentTransportActions(getCurrentTransportActions()) - ); - } - - public abstract Class setTransportURI(URI uri, String metaData); - public abstract Class stop(); - public abstract Class play(String speed); - public abstract Class pause(); - public abstract Class next(); - public abstract Class previous(); - public abstract Class seek(SeekMode unit, String target); - - public TransportAction[] getCurrentTransportActions() { - return new TransportAction[] { - TransportAction.Stop, - TransportAction.Play, - TransportAction.Pause, - TransportAction.Next, - TransportAction.Previous, - TransportAction.Seek - }; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/Stopped.java b/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/Stopped.java deleted file mode 100644 index 2b9c31f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/impl/state/Stopped.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.impl.state; - -import org.fourthline.cling.support.avtransport.lastchange.AVTransportVariable; -import org.fourthline.cling.support.model.AVTransport; -import org.fourthline.cling.support.model.SeekMode; -import org.fourthline.cling.support.model.TransportAction; -import org.fourthline.cling.support.model.TransportInfo; -import org.fourthline.cling.support.model.TransportState; - -import java.net.URI; -import java.util.logging.Logger; - -/** - * @author Christian Bauer - */ -public abstract class Stopped extends AbstractState { - - final private static Logger log = Logger.getLogger(Stopped.class.getName()); - - public Stopped(T transport) { - super(transport); - } - - public void onEntry() { - log.fine("Setting transport state to STOPPED"); - getTransport().setTransportInfo( - new TransportInfo( - TransportState.STOPPED, - getTransport().getTransportInfo().getCurrentTransportStatus(), - getTransport().getTransportInfo().getCurrentSpeed() - ) - ); - getTransport().getLastChange().setEventedValue( - getTransport().getInstanceId(), - new AVTransportVariable.TransportState(TransportState.STOPPED), - new AVTransportVariable.CurrentTransportActions(getCurrentTransportActions()) - ); - } - - public abstract Class setTransportURI(URI uri, String metaData); - public abstract Class stop(); - public abstract Class play(String speed); - public abstract Class next(); - public abstract Class previous(); - public abstract Class seek(SeekMode unit, String target); - - public TransportAction[] getCurrentTransportActions() { - return new TransportAction[] { - TransportAction.Stop, - TransportAction.Play, - TransportAction.Next, - TransportAction.Previous, - TransportAction.Seek - }; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/lastchange/AVTransportLastChangeParser.java b/app/src/main/java/org/fourthline/cling/support/avtransport/lastchange/AVTransportLastChangeParser.java deleted file mode 100644 index 85f3484..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/lastchange/AVTransportLastChangeParser.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.lastchange; - -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.support.lastchange.EventedValue; -import org.fourthline.cling.support.lastchange.LastChangeParser; - -import javax.xml.transform.Source; -import javax.xml.transform.stream.StreamSource; -import java.util.Set; - -/** - * @author Christian Bauer - */ -public class AVTransportLastChangeParser extends LastChangeParser { - - public static final String NAMESPACE_URI = "urn:schemas-upnp-org:metadata-1-0/AVT/"; - public static final String SCHEMA_RESOURCE = "org/fourthline/cling/support/avtransport/metadata-1.0-avt.xsd"; - - @Override - protected String getNamespace() { - return NAMESPACE_URI; - } - - @Override - protected Source[] getSchemaSources() { - // TODO: Android 2.2 has a broken SchemaFactory, we can't validate - // http://code.google.com/p/android/issues/detail?id=9491&q=schemafactory&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars - if (!ModelUtil.ANDROID_RUNTIME) { - return new Source[]{new StreamSource( - Thread.currentThread().getContextClassLoader().getResourceAsStream(SCHEMA_RESOURCE) - )}; - } - return null; - } - - @Override - protected Set> getEventedVariables() { - return AVTransportVariable.ALL; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/avtransport/lastchange/AVTransportVariable.java b/app/src/main/java/org/fourthline/cling/support/avtransport/lastchange/AVTransportVariable.java deleted file mode 100644 index 2fc78ee..0000000 --- a/app/src/main/java/org/fourthline/cling/support/avtransport/lastchange/AVTransportVariable.java +++ /dev/null @@ -1,342 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.avtransport.lastchange; - -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.PlayMode; -import org.fourthline.cling.support.model.RecordQualityMode; -import org.fourthline.cling.support.model.TransportAction; -import org.fourthline.cling.support.model.StorageMedium; -import org.fourthline.cling.support.lastchange.EventedValue; -import org.fourthline.cling.support.lastchange.EventedValueEnum; -import org.fourthline.cling.support.lastchange.EventedValueEnumArray; -import org.fourthline.cling.support.lastchange.EventedValueString; -import org.fourthline.cling.support.lastchange.EventedValueURI; -import org.fourthline.cling.support.lastchange.EventedValueUnsignedIntegerFourBytes; - -import java.net.URI; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * @author Christian Bauer - */ -public class AVTransportVariable { - - public static Set> ALL = new HashSet>() {{ - add(TransportState.class); - add(TransportStatus.class); - add(RecordStorageMedium.class); - add(PossibleRecordStorageMedia.class); - add(PossiblePlaybackStorageMedia.class); - add(CurrentPlayMode.class); - add(TransportPlaySpeed.class); - add(RecordMediumWriteStatus.class); - add(CurrentRecordQualityMode.class); - add(PossibleRecordQualityModes.class); - add(NumberOfTracks.class); - add(CurrentTrack.class); - add(CurrentTrackDuration.class); - add(CurrentMediaDuration.class); - add(CurrentTrackMetaData.class); - add(CurrentTrackURI.class); - add(AVTransportURI.class); - add(NextAVTransportURI.class); - add(AVTransportURIMetaData.class); - add(NextAVTransportURIMetaData.class); - add(CurrentTransportActions.class); - }}; - - public static class TransportState extends EventedValueEnum { - public TransportState(org.fourthline.cling.support.model.TransportState avTransportState) { - super(avTransportState); - } - - public TransportState(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected org.fourthline.cling.support.model.TransportState enumValueOf(String s) { - return org.fourthline.cling.support.model.TransportState.valueOf(s); - } - } - - public static class TransportStatus extends EventedValueEnum { - public TransportStatus(org.fourthline.cling.support.model.TransportStatus transportStatus) { - super(transportStatus); - } - - public TransportStatus(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected org.fourthline.cling.support.model.TransportStatus enumValueOf(String s) { - return org.fourthline.cling.support.model.TransportStatus.valueOf(s); - } - } - - public static class RecordStorageMedium extends EventedValueEnum { - - public RecordStorageMedium(StorageMedium storageMedium) { - super(storageMedium); - } - - public RecordStorageMedium(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected StorageMedium enumValueOf(String s) { - return StorageMedium.valueOf(s); - } - } - - public static class PossibleRecordStorageMedia extends EventedValueEnumArray { - public PossibleRecordStorageMedia(StorageMedium[] e) { - super(e); - } - - public PossibleRecordStorageMedia(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected StorageMedium[] enumValueOf(String[] names) { - List list = new ArrayList(); - for (String s : names) { - list.add(StorageMedium.valueOf(s)); - } - return list.toArray(new StorageMedium[list.size()]); - } - } - - public static class PossiblePlaybackStorageMedia extends PossibleRecordStorageMedia { - public PossiblePlaybackStorageMedia(StorageMedium[] e) { - super(e); - } - - public PossiblePlaybackStorageMedia(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class CurrentPlayMode extends EventedValueEnum { - public CurrentPlayMode(PlayMode playMode) { - super(playMode); - } - - public CurrentPlayMode(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected PlayMode enumValueOf(String s) { - return PlayMode.valueOf(s); - } - } - - public static class TransportPlaySpeed extends EventedValueString { - final static Pattern pattern = Pattern.compile("^-?\\d+(/\\d+)?$", Pattern.CASE_INSENSITIVE); - - public TransportPlaySpeed(String value) { - super(value); - if (!pattern.matcher(value).matches()) { - throw new InvalidValueException("Can't parse TransportPlaySpeed speeds."); - } - } - - public TransportPlaySpeed(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class RecordMediumWriteStatus extends EventedValueEnum { - public RecordMediumWriteStatus(org.fourthline.cling.support.model.RecordMediumWriteStatus recordMediumWriteStatus) { - super(recordMediumWriteStatus); - } - - public RecordMediumWriteStatus(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected org.fourthline.cling.support.model.RecordMediumWriteStatus enumValueOf(String s) { - return org.fourthline.cling.support.model.RecordMediumWriteStatus.valueOf(s); - } - } - - public static class CurrentRecordQualityMode extends EventedValueEnum { - public CurrentRecordQualityMode(RecordQualityMode recordQualityMode) { - super(recordQualityMode); - } - - public CurrentRecordQualityMode(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected RecordQualityMode enumValueOf(String s) { - return RecordQualityMode.valueOf(s); - } - } - - public static class PossibleRecordQualityModes extends EventedValueEnumArray { - public PossibleRecordQualityModes(RecordQualityMode[] e) { - super(e); - } - - public PossibleRecordQualityModes(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected RecordQualityMode[] enumValueOf(String[] names) { - List list = new ArrayList(); - for (String s : names) { - list.add(RecordQualityMode.valueOf(s)); - } - return list.toArray(new RecordQualityMode[list.size()]); - } - } - - public static class NumberOfTracks extends EventedValueUnsignedIntegerFourBytes { - public NumberOfTracks(UnsignedIntegerFourBytes value) { - super(value); - } - - public NumberOfTracks(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class CurrentTrack extends EventedValueUnsignedIntegerFourBytes { - public CurrentTrack(UnsignedIntegerFourBytes value) { - super(value); - } - - public CurrentTrack(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class CurrentTrackDuration extends EventedValueString { - public CurrentTrackDuration(String value) { - super(value); - } - - public CurrentTrackDuration(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class CurrentMediaDuration extends EventedValueString { - public CurrentMediaDuration(String value) { - super(value); - } - - public CurrentMediaDuration(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class CurrentTrackMetaData extends EventedValueString { - public CurrentTrackMetaData(String value) { - super(value); - } - - public CurrentTrackMetaData(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class CurrentTrackURI extends EventedValueURI { - public CurrentTrackURI(URI value) { - super(value); - } - - public CurrentTrackURI(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class AVTransportURI extends EventedValueURI { - public AVTransportURI(URI value) { - super(value); - } - - public AVTransportURI(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class NextAVTransportURI extends EventedValueURI { - public NextAVTransportURI(URI value) { - super(value); - } - - public NextAVTransportURI(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class AVTransportURIMetaData extends EventedValueString { - public AVTransportURIMetaData(String value) { - super(value); - } - - public AVTransportURIMetaData(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class NextAVTransportURIMetaData extends EventedValueString { - public NextAVTransportURIMetaData(String value) { - super(value); - } - - public NextAVTransportURIMetaData(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class CurrentTransportActions extends EventedValueEnumArray{ - public CurrentTransportActions(TransportAction[] e) { - super(e); - } - - public CurrentTransportActions(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected TransportAction[] enumValueOf(String[] names) { - if (names == null) return new TransportAction[0]; - List list = new ArrayList(); - for (String s : names) { - list.add(TransportAction.valueOf(s)); - } - return list.toArray(new TransportAction[list.size()]); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/connectionmanager/AbstractPeeringConnectionManagerService.java b/app/src/main/java/org/fourthline/cling/support/connectionmanager/AbstractPeeringConnectionManagerService.java deleted file mode 100644 index 371a416..0000000 --- a/app/src/main/java/org/fourthline/cling/support/connectionmanager/AbstractPeeringConnectionManagerService.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.connectionmanager; - -import org.fourthline.cling.binding.annotations.UpnpAction; -import org.fourthline.cling.binding.annotations.UpnpInputArgument; -import org.fourthline.cling.binding.annotations.UpnpOutputArgument; -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.model.ServiceReference; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.model.types.csv.CSV; -import org.fourthline.cling.support.connectionmanager.callback.ConnectionComplete; -import org.fourthline.cling.support.connectionmanager.callback.PrepareForConnection; -import org.fourthline.cling.support.model.ConnectionInfo; -import org.fourthline.cling.support.model.ProtocolInfo; -import org.fourthline.cling.support.model.ProtocolInfos; - -import java.beans.PropertyChangeSupport; -import java.util.logging.Logger; - -/** - * Support for setup and teardown of an arbitrary number of connections with a manager peer. - * - * @author Christian Bauer - * @author Alessio Gaeta - */ -public abstract class AbstractPeeringConnectionManagerService extends ConnectionManagerService { - - final private static Logger log = Logger.getLogger(AbstractPeeringConnectionManagerService.class.getName()); - - protected AbstractPeeringConnectionManagerService(ConnectionInfo... activeConnections) { - super(activeConnections); - } - - protected AbstractPeeringConnectionManagerService(ProtocolInfos sourceProtocolInfo, ProtocolInfos sinkProtocolInfo, - ConnectionInfo... activeConnections) { - super(sourceProtocolInfo, sinkProtocolInfo, activeConnections); - } - - protected AbstractPeeringConnectionManagerService(PropertyChangeSupport propertyChangeSupport, - ProtocolInfos sourceProtocolInfo, ProtocolInfos sinkProtocolInfo, - ConnectionInfo... activeConnections) { - super(propertyChangeSupport, sourceProtocolInfo, sinkProtocolInfo, activeConnections); - } - - synchronized protected int getNewConnectionId() { - int currentHighestID = -1; - for (Integer key : activeConnections.keySet()) { - if (key > currentHighestID) currentHighestID = key; - } - return ++currentHighestID; - } - - synchronized protected void storeConnection(ConnectionInfo info) { - CSV oldConnectionIDs = getCurrentConnectionIDs(); - activeConnections.put(info.getConnectionID(), info); - log.fine("Connection stored, firing event: " + info.getConnectionID()); - CSV newConnectionIDs = getCurrentConnectionIDs(); - getPropertyChangeSupport().firePropertyChange("CurrentConnectionIDs", oldConnectionIDs, newConnectionIDs); - } - - synchronized protected void removeConnection(int connectionID) { - CSV oldConnectionIDs = getCurrentConnectionIDs(); - activeConnections.remove(connectionID); - log.fine("Connection removed, firing event: " + connectionID); - CSV newConnectionIDs = getCurrentConnectionIDs(); - getPropertyChangeSupport().firePropertyChange("CurrentConnectionIDs", oldConnectionIDs, newConnectionIDs); - } - - @UpnpAction(out = { - @UpnpOutputArgument(name = "ConnectionID", stateVariable = "A_ARG_TYPE_ConnectionID", getterName = "getConnectionID"), - @UpnpOutputArgument(name = "AVTransportID", stateVariable = "A_ARG_TYPE_AVTransportID", getterName = "getAvTransportID"), - @UpnpOutputArgument(name = "RcsID", stateVariable = "A_ARG_TYPE_RcsID", getterName = "getRcsID") - }) - synchronized public ConnectionInfo prepareForConnection( - @UpnpInputArgument(name = "RemoteProtocolInfo", stateVariable = "A_ARG_TYPE_ProtocolInfo") ProtocolInfo remoteProtocolInfo, - @UpnpInputArgument(name = "PeerConnectionManager", stateVariable = "A_ARG_TYPE_ConnectionManager") ServiceReference peerConnectionManager, - @UpnpInputArgument(name = "PeerConnectionID", stateVariable = "A_ARG_TYPE_ConnectionID") int peerConnectionId, - @UpnpInputArgument(name = "Direction", stateVariable = "A_ARG_TYPE_Direction") String direction) - throws ActionException { - - int connectionId = getNewConnectionId(); - - ConnectionInfo.Direction dir; - try { - dir = ConnectionInfo.Direction.valueOf(direction); - } catch (Exception ex) { - throw new ConnectionManagerException(ErrorCode.ARGUMENT_VALUE_INVALID, "Unsupported direction: " + direction); - } - - log.fine("Preparing for connection with local new ID " + connectionId + " and peer connection ID: " + peerConnectionId); - - ConnectionInfo newConnectionInfo = createConnection( - connectionId, - peerConnectionId, - peerConnectionManager, - dir, - remoteProtocolInfo - ); - - storeConnection(newConnectionInfo); - - return newConnectionInfo; - } - - @UpnpAction - synchronized public void connectionComplete(@UpnpInputArgument(name = "ConnectionID", stateVariable = "A_ARG_TYPE_ConnectionID") int connectionID) - throws ActionException { - ConnectionInfo info = getCurrentConnectionInfo(connectionID); - log.fine("Closing connection ID " + connectionID); - closeConnection(info); - removeConnection(connectionID); - } - - /** - * Generate a new local connection identifier, prepare the peer, store connection details. - * - * @return -1 if the {@link #peerFailure(org.fourthline.cling.model.action.ActionInvocation, org.fourthline.cling.model.message.UpnpResponse, String)} - * method had to be called, otherwise the local identifier of the established connection. - */ - synchronized public int createConnectionWithPeer(final ServiceReference localServiceReference, - final ControlPoint controlPoint, - final Service peerService, - final ProtocolInfo protInfo, - final ConnectionInfo.Direction direction) { - - // It is important that you synchronize the whole procedure, starting with getNewConnectionID(), - // then preparing the connection on the peer, then storeConnection() - - final int localConnectionID = getNewConnectionId(); - - log.fine("Creating new connection ID " + localConnectionID + " with peer: " + peerService); - final boolean[] failed = new boolean[1]; - new PrepareForConnection( - peerService, - controlPoint, - protInfo, - localServiceReference, - localConnectionID, - direction - ) { - @Override - public void received(ActionInvocation invocation, int peerConnectionID, int rcsID, int avTransportID) { - ConnectionInfo info = new ConnectionInfo( - localConnectionID, - rcsID, - avTransportID, - protInfo, - peerService.getReference(), - peerConnectionID, - direction.getOpposite(), // If I prepared you for output, then I do input - ConnectionInfo.Status.OK - ); - storeConnection(info); - } - - @Override - public void failure(ActionInvocation invocation, UpnpResponse operation, String defaultMsg) { - AbstractPeeringConnectionManagerService.this.peerFailure( - invocation, operation, defaultMsg - ); - failed[0] = true; - } - }.run(); // Synchronous execution! We "reserved" a new connection ID earlier! - - return failed[0] ? -1 : localConnectionID; - } - - /** - * Close the connection with the peer, remove the connection details. - */ - synchronized public void closeConnectionWithPeer(ControlPoint controlPoint, - Service peerService, - int connectionID) throws ActionException { - closeConnectionWithPeer(controlPoint, peerService, getCurrentConnectionInfo(connectionID)); - } - - /** - * Close the connection with the peer, remove the connection details. - */ - synchronized public void closeConnectionWithPeer(final ControlPoint controlPoint, - final Service peerService, - final ConnectionInfo connectionInfo) throws ActionException { - - // It is important that you synchronize the whole procedure - log.fine("Closing connection ID " + connectionInfo.getConnectionID() + " with peer: " + peerService); - new ConnectionComplete( - peerService, - controlPoint, - connectionInfo.getPeerConnectionID() - ) { - - @Override - public void success(ActionInvocation invocation) { - removeConnection(connectionInfo.getConnectionID()); - } - - @Override - public void failure(ActionInvocation invocation, UpnpResponse operation, String defaultMsg) { - AbstractPeeringConnectionManagerService.this.peerFailure( - invocation, operation, defaultMsg - ); - } - }.run(); // Synchronous execution! - } - - protected abstract ConnectionInfo createConnection(int connectionID, - int peerConnectionId, ServiceReference peerConnectionManager, - ConnectionInfo.Direction direction, ProtocolInfo protocolInfo) throws ActionException; - - protected abstract void closeConnection(ConnectionInfo connectionInfo); - - /** - * Called when connection creation or closing with a peer failed. - *

- * This is the failure result of an action invocation on the peer's connection - * management service. The execution of the {@link #createConnectionWithPeer(org.fourthline.cling.model.ServiceReference, org.fourthline.cling.controlpoint.ControlPoint, org.fourthline.cling.model.meta.Service, org.fourthline.cling.support.model.ProtocolInfo , org.fourthline.cling.support.model.ConnectionInfo.Direction)} - * and {@link #closeConnectionWithPeer(org.fourthline.cling.controlpoint.ControlPoint, org.fourthline.cling.model.meta.Service, org.fourthline.cling.support.model.ConnectionInfo)} - * methods will block until this method completes handling any failure. - *

- * - * @param invocation The underlying action invocation of the remote connection manager service. - * @param operation The network message response if there was a response, or null. - * @param defaultFailureMessage A user-friendly error message generated from the invocation exception and response. - */ - protected abstract void peerFailure(ActionInvocation invocation, UpnpResponse operation, String defaultFailureMessage); - -} diff --git a/app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerErrorCode.java b/app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerErrorCode.java deleted file mode 100644 index 199b89a..0000000 --- a/app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerErrorCode.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.connectionmanager; - -/** - * - */ -public enum ConnectionManagerErrorCode { - - INCOMPATIBLE_PROTOCOL_INFO(701, "The connection cannot be established because the protocol info parameter is incompatible"), - INCOMPATIBLE_DIRECTIONS(702, "The connection cannot be established because the directions of the involved ConnectionManagers (source/sink) are incompatible"), - INSUFFICIENT_NETWORK_RESOURCES(703, "The connection cannot be established because there are insufficient network resources"), - LOCAL_RESTRICTIONS(704, "The connection cannot be established because of local restrictions in the device"), - ACCESS_DENIED(705, "The connection cannot be established because the client is not permitted."), - INVALID_CONNECTION_REFERENCE(706, "Not a valid connection established by this service"), - NOT_IN_NETWORK(707, "The connection cannot be established because the ConnectionManagers are not part of the same physical network."); - - private int code; - private String description; - - ConnectionManagerErrorCode(int code, String description) { - this.code = code; - this.description = description; - } - - public int getCode() { - return code; - } - - public String getDescription() { - return description; - } - - public static ConnectionManagerErrorCode getByCode(int code) { - for (ConnectionManagerErrorCode errorCode : ConnectionManagerErrorCode.values()) { - if (errorCode.getCode() == code) - return errorCode; - } - return null; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerException.java b/app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerException.java deleted file mode 100644 index 0d9887f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerException.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.connectionmanager; - -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.types.ErrorCode; - -/** - * - */ -public class ConnectionManagerException extends ActionException { - - public ConnectionManagerException(int errorCode, String message) { - super(errorCode, message); - } - - public ConnectionManagerException(int errorCode, String message, Throwable cause) { - super(errorCode, message, cause); - } - - public ConnectionManagerException(ErrorCode errorCode, String message) { - super(errorCode, message); - } - - public ConnectionManagerException(ErrorCode errorCode) { - super(errorCode); - } - - public ConnectionManagerException(ConnectionManagerErrorCode errorCode, String message) { - super(errorCode.getCode(), errorCode.getDescription() + ". " + message + "."); - } - - public ConnectionManagerException(ConnectionManagerErrorCode errorCode) { - super(errorCode.getCode(), errorCode.getDescription()); - } -} - diff --git a/app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerService.java b/app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerService.java deleted file mode 100644 index a99d17a..0000000 --- a/app/src/main/java/org/fourthline/cling/support/connectionmanager/ConnectionManagerService.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.connectionmanager; - -import org.fourthline.cling.binding.annotations.UpnpAction; -import org.fourthline.cling.binding.annotations.UpnpInputArgument; -import org.fourthline.cling.binding.annotations.UpnpOutputArgument; -import org.fourthline.cling.binding.annotations.UpnpService; -import org.fourthline.cling.binding.annotations.UpnpServiceId; -import org.fourthline.cling.binding.annotations.UpnpServiceType; -import org.fourthline.cling.binding.annotations.UpnpStateVariable; -import org.fourthline.cling.binding.annotations.UpnpStateVariables; -import org.fourthline.cling.model.ServiceReference; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.model.types.csv.CSV; -import org.fourthline.cling.model.types.csv.CSVUnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.ConnectionInfo; -import org.fourthline.cling.support.model.ProtocolInfo; -import org.fourthline.cling.support.model.ProtocolInfos; - -import java.beans.PropertyChangeSupport; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Logger; - -/** - * Base for connection management, implements the connection ID "0" behavior. - * - * @author Christian Bauer - * @author Alessio Gaeta - */ -@UpnpService( - serviceId = @UpnpServiceId("ConnectionManager"), - serviceType = @UpnpServiceType(value = "ConnectionManager", version = 1), - stringConvertibleTypes = {ProtocolInfo.class, ProtocolInfos.class, ServiceReference.class} -) -@UpnpStateVariables({ - @UpnpStateVariable(name = "SourceProtocolInfo", datatype = "string"), - @UpnpStateVariable(name = "SinkProtocolInfo", datatype = "string"), - @UpnpStateVariable(name = "CurrentConnectionIDs", datatype = "string"), - @UpnpStateVariable(name = "A_ARG_TYPE_ConnectionStatus", allowedValuesEnum = ConnectionInfo.Status.class, sendEvents = false), - @UpnpStateVariable(name = "A_ARG_TYPE_ConnectionManager", datatype = "string", sendEvents = false), - @UpnpStateVariable(name = "A_ARG_TYPE_Direction", allowedValuesEnum = ConnectionInfo.Direction.class, sendEvents = false), - @UpnpStateVariable(name = "A_ARG_TYPE_ProtocolInfo", datatype = "string", sendEvents = false), - @UpnpStateVariable(name = "A_ARG_TYPE_ConnectionID", datatype = "i4", sendEvents = false), - @UpnpStateVariable(name = "A_ARG_TYPE_AVTransportID", datatype = "i4", sendEvents = false), - @UpnpStateVariable(name = "A_ARG_TYPE_RcsID", datatype = "i4", sendEvents = false) -}) -public class ConnectionManagerService { - - final private static Logger log = Logger.getLogger(ConnectionManagerService.class.getName()); - - final protected PropertyChangeSupport propertyChangeSupport; - final protected Map activeConnections = new ConcurrentHashMap(); - final protected ProtocolInfos sourceProtocolInfo; - final protected ProtocolInfos sinkProtocolInfo; - - /** - * Creates a default "active" connection with identifier "0". - */ - public ConnectionManagerService() { - this(new ConnectionInfo()); - } - - /** - * Creates a default "active" connection with identifier "0". - */ - public ConnectionManagerService(ProtocolInfos sourceProtocolInfo, ProtocolInfos sinkProtocolInfo) { - this(sourceProtocolInfo, sinkProtocolInfo, new ConnectionInfo()); - } - - public ConnectionManagerService(ConnectionInfo... activeConnections) { - this(null, new ProtocolInfos(), new ProtocolInfos(), activeConnections); - } - - public ConnectionManagerService(ProtocolInfos sourceProtocolInfo, ProtocolInfos sinkProtocolInfo, ConnectionInfo... activeConnections) { - this(null, sourceProtocolInfo, sinkProtocolInfo, activeConnections); - } - - public ConnectionManagerService(PropertyChangeSupport propertyChangeSupport, - ProtocolInfos sourceProtocolInfo, ProtocolInfos sinkProtocolInfo, - ConnectionInfo... activeConnections) { - this.propertyChangeSupport = - propertyChangeSupport == null - ? new PropertyChangeSupport(this) : propertyChangeSupport; - - this.sourceProtocolInfo = sourceProtocolInfo; - this.sinkProtocolInfo = sinkProtocolInfo; - - for (ConnectionInfo activeConnection : activeConnections) { - this.activeConnections.put(activeConnection.getConnectionID(), activeConnection); - } - } - - public PropertyChangeSupport getPropertyChangeSupport() { - return propertyChangeSupport; - } - - @UpnpAction(out = { - @UpnpOutputArgument(name = "RcsID", getterName = "getRcsID"), - @UpnpOutputArgument(name = "AVTransportID", getterName = "getAvTransportID"), - @UpnpOutputArgument(name = "ProtocolInfo", getterName = "getProtocolInfo"), - @UpnpOutputArgument(name = "PeerConnectionManager", stateVariable = "A_ARG_TYPE_ConnectionManager", getterName = "getPeerConnectionManager"), - @UpnpOutputArgument(name = "PeerConnectionID", stateVariable = "A_ARG_TYPE_ConnectionID", getterName = "getPeerConnectionID"), - @UpnpOutputArgument(name = "Direction", getterName = "getDirection"), - @UpnpOutputArgument(name = "Status", stateVariable = "A_ARG_TYPE_ConnectionStatus", getterName = "getConnectionStatus") - }) - synchronized public ConnectionInfo getCurrentConnectionInfo(@UpnpInputArgument(name = "ConnectionID") int connectionId) - throws ActionException { - log.fine("Getting connection information of connection ID: " + connectionId); - ConnectionInfo info; - if ((info = activeConnections.get(connectionId)) == null) { - throw new ConnectionManagerException( - ConnectionManagerErrorCode.INVALID_CONNECTION_REFERENCE, - "Non-active connection ID: " + connectionId - ); - } - return info; - } - - @UpnpAction(out = { - @UpnpOutputArgument(name = "ConnectionIDs") - }) - synchronized public CSV getCurrentConnectionIDs() { - CSV csv = new CSVUnsignedIntegerFourBytes(); - for (Integer connectionID : activeConnections.keySet()) { - csv.add(new UnsignedIntegerFourBytes(connectionID)); - } - log.fine("Returning current connection IDs: " + csv.size()); - return csv; - } - - @UpnpAction(out = { - @UpnpOutputArgument(name = "Source", stateVariable = "SourceProtocolInfo", getterName = "getSourceProtocolInfo"), - @UpnpOutputArgument(name = "Sink", stateVariable = "SinkProtocolInfo", getterName = "getSinkProtocolInfo") - }) - synchronized public void getProtocolInfo() throws ActionException { - // NOOP - } - - synchronized public ProtocolInfos getSourceProtocolInfo() { - return sourceProtocolInfo; - } - - synchronized public ProtocolInfos getSinkProtocolInfo() { - return sinkProtocolInfo; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/ConnectionComplete.java b/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/ConnectionComplete.java deleted file mode 100644 index d4f812a..0000000 --- a/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/ConnectionComplete.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.connectionmanager.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; - -/** - * @author Christian Bauer - */ -public abstract class ConnectionComplete extends ActionCallback { - - public ConnectionComplete(Service service, int connectionID) { - this(service, null, connectionID); - } - - protected ConnectionComplete(Service service, ControlPoint controlPoint, int connectionID) { - super(new ActionInvocation(service.getAction("ConnectionComplete")), controlPoint); - getActionInvocation().setInput("ConnectionID", connectionID); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/GetCurrentConnectionInfo.java b/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/GetCurrentConnectionInfo.java deleted file mode 100644 index 3624165..0000000 --- a/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/GetCurrentConnectionInfo.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.connectionmanager.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.model.ServiceReference; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.support.model.ConnectionInfo; -import org.fourthline.cling.support.model.ProtocolInfo; - -/** - * @author Alessio Gaeta - * @author Christian Bauer - */ -public abstract class GetCurrentConnectionInfo extends ActionCallback { - - public GetCurrentConnectionInfo(Service service, int connectionID) { - this(service, null, connectionID); - } - - protected GetCurrentConnectionInfo(Service service, ControlPoint controlPoint, int connectionID) { - super(new ActionInvocation(service.getAction("GetCurrentConnectionInfo")), controlPoint); - getActionInvocation().setInput("ConnectionID", connectionID); - } - - @Override - public void success(ActionInvocation invocation) { - - try { - ConnectionInfo info = new ConnectionInfo( - (Integer)invocation.getInput("ConnectionID").getValue(), - (Integer)invocation.getOutput("RcsID").getValue(), - (Integer)invocation.getOutput("AVTransportID").getValue(), - new ProtocolInfo(invocation.getOutput("ProtocolInfo").toString()), - new ServiceReference(invocation.getOutput("PeerConnectionManager").toString()), - (Integer)invocation.getOutput("PeerConnectionID").getValue(), - ConnectionInfo.Direction.valueOf(invocation.getOutput("Direction").toString()), - ConnectionInfo.Status.valueOf(invocation.getOutput("Status").toString()) - ); - - received(invocation, info); - - } catch (Exception ex) { - invocation.setFailure( - new ActionException(ErrorCode.ACTION_FAILED, "Can't parse ConnectionInfo response: " + ex, ex) - ); - failure(invocation, null); - } - } - - public abstract void received(ActionInvocation invocation, ConnectionInfo connectionInfo); - -} diff --git a/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/GetProtocolInfo.java b/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/GetProtocolInfo.java deleted file mode 100644 index 97e8b6c..0000000 --- a/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/GetProtocolInfo.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.connectionmanager.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.model.action.ActionArgumentValue; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.support.model.ProtocolInfos; - -import android.util.Log; - -/** - * @author Christian Bauer - */ -public abstract class GetProtocolInfo extends ActionCallback { - - public GetProtocolInfo(Service service) { - this(service, null); - } - - protected GetProtocolInfo(Service service, ControlPoint controlPoint) { - super(new ActionInvocation(service.getAction("GetProtocolInfo")), - controlPoint); - } - - @Override - public void success(ActionInvocation invocation) { - try { - ActionArgumentValue sink = invocation.getOutput("Sink"); - ActionArgumentValue source = invocation.getOutput("Source"); - - received(invocation, - sink != null ? new ProtocolInfos(sink.toString()) : null, - source != null ? new ProtocolInfos(source.toString()) - : null); - - } catch (Exception ex) { - invocation.setFailure(new ActionException(ErrorCode.ACTION_FAILED, - "Can't parse ProtocolInfo response: " + ex, ex)); - failure(invocation, null); - } - } - - public abstract void received(ActionInvocation actionInvocation, - ProtocolInfos sinkProtocolInfos, ProtocolInfos sourceProtocolInfos); - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/PrepareForConnection.java b/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/PrepareForConnection.java deleted file mode 100644 index f5ae7ac..0000000 --- a/app/src/main/java/org/fourthline/cling/support/connectionmanager/callback/PrepareForConnection.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.connectionmanager.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.model.ServiceReference; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.support.model.ConnectionInfo; -import org.fourthline.cling.support.model.ProtocolInfo; - -/** - * @author Alessio Gaeta - * @author Christian Bauer - */ -public abstract class PrepareForConnection extends ActionCallback { - - public PrepareForConnection(Service service, - ProtocolInfo remoteProtocolInfo, ServiceReference peerConnectionManager, - int peerConnectionID, ConnectionInfo.Direction direction) { - this(service, null, remoteProtocolInfo, peerConnectionManager, peerConnectionID, direction); - } - - public PrepareForConnection(Service service, ControlPoint controlPoint, - ProtocolInfo remoteProtocolInfo, ServiceReference peerConnectionManager, - int peerConnectionID, ConnectionInfo.Direction direction) { - super(new ActionInvocation(service.getAction("PrepareForConnection")), controlPoint); - - getActionInvocation().setInput("RemoteProtocolInfo", remoteProtocolInfo.toString()); - getActionInvocation().setInput("PeerConnectionManager", peerConnectionManager.toString()); - getActionInvocation().setInput("PeerConnectionID", peerConnectionID); - getActionInvocation().setInput("Direction", direction.toString()); - } - - @Override - public void success(ActionInvocation invocation) { - received( - invocation, - (Integer)invocation.getOutput("ConnectionID").getValue(), - (Integer)invocation.getOutput("RcsID").getValue(), - (Integer)invocation.getOutput("AVTransportID").getValue() - ); - } - - public abstract void received(ActionInvocation invocation, int connectionID, int rcsID, int avTransportID); - -} diff --git a/app/src/main/java/org/fourthline/cling/support/contentdirectory/AbstractContentDirectoryService.java b/app/src/main/java/org/fourthline/cling/support/contentdirectory/AbstractContentDirectoryService.java deleted file mode 100644 index fc92744..0000000 --- a/app/src/main/java/org/fourthline/cling/support/contentdirectory/AbstractContentDirectoryService.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.contentdirectory; - -import org.fourthline.cling.binding.annotations.UpnpAction; -import org.fourthline.cling.binding.annotations.UpnpInputArgument; -import org.fourthline.cling.binding.annotations.UpnpOutputArgument; -import org.fourthline.cling.binding.annotations.UpnpService; -import org.fourthline.cling.binding.annotations.UpnpServiceId; -import org.fourthline.cling.binding.annotations.UpnpServiceType; -import org.fourthline.cling.binding.annotations.UpnpStateVariable; -import org.fourthline.cling.binding.annotations.UpnpStateVariables; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.model.types.csv.CSV; -import org.fourthline.cling.model.types.csv.CSVString; -import org.fourthline.cling.support.model.BrowseFlag; -import org.fourthline.cling.support.model.BrowseResult; -import org.fourthline.cling.support.model.DIDLContent; -import org.fourthline.cling.support.model.SortCriterion; - -import java.beans.PropertyChangeSupport; -import java.util.ArrayList; -import java.util.List; - -/** - * Simple ContentDirectory service skeleton. - *

- * Only state variables and actions required by ContentDirectory:1 - * (not the optional ones) are implemented. - *

- * - * @author Alessio Gaeta - * @author Christian Bauer - */ - -@UpnpService( - serviceId = @UpnpServiceId("ContentDirectory"), - serviceType = @UpnpServiceType(value = "ContentDirectory", version = 1) -) - -@UpnpStateVariables({ - @UpnpStateVariable( - name = "A_ARG_TYPE_ObjectID", - sendEvents = false, - datatype = "string"), - @UpnpStateVariable( - name = "A_ARG_TYPE_Result", - sendEvents = false, - datatype = "string"), - @UpnpStateVariable( - name = "A_ARG_TYPE_BrowseFlag", - sendEvents = false, - datatype = "string", - allowedValuesEnum = BrowseFlag.class), - @UpnpStateVariable( - name = "A_ARG_TYPE_Filter", - sendEvents = false, - datatype = "string"), - @UpnpStateVariable( - name = "A_ARG_TYPE_SortCriteria", - sendEvents = false, - datatype = "string"), - @UpnpStateVariable( - name = "A_ARG_TYPE_Index", - sendEvents = false, - datatype = "ui4"), - @UpnpStateVariable( - name = "A_ARG_TYPE_Count", - sendEvents = false, - datatype = "ui4"), - @UpnpStateVariable( - name = "A_ARG_TYPE_UpdateID", - sendEvents = false, - datatype = "ui4"), - @UpnpStateVariable( - name = "A_ARG_TYPE_URI", - sendEvents = false, - datatype = "uri"), - @UpnpStateVariable( - name = "A_ARG_TYPE_SearchCriteria", - sendEvents = false, - datatype = "string") - }) -public abstract class AbstractContentDirectoryService { - - public static final String CAPS_WILDCARD = "*"; - - @UpnpStateVariable(sendEvents = false) - final private CSV searchCapabilities; - - @UpnpStateVariable(sendEvents = false) - final private CSV sortCapabilities; - - @UpnpStateVariable( - sendEvents = true, - defaultValue = "0", - eventMaximumRateMilliseconds = 200 - ) - private UnsignedIntegerFourBytes systemUpdateID = new UnsignedIntegerFourBytes(0); - - final protected PropertyChangeSupport propertyChangeSupport; - - protected AbstractContentDirectoryService() { - this(new ArrayList(), new ArrayList(), null); - } - - protected AbstractContentDirectoryService(List searchCapabilities, List sortCapabilities) { - this(searchCapabilities, sortCapabilities, null); - } - - protected AbstractContentDirectoryService(List searchCapabilities, List sortCapabilities, - PropertyChangeSupport propertyChangeSupport) { - this.propertyChangeSupport = propertyChangeSupport != null ? propertyChangeSupport : new PropertyChangeSupport(this); - this.searchCapabilities = new CSVString(); - this.searchCapabilities.addAll(searchCapabilities); - this.sortCapabilities = new CSVString(); - this.sortCapabilities.addAll(sortCapabilities); - } - - @UpnpAction(out = @UpnpOutputArgument(name = "SearchCaps")) - public CSV getSearchCapabilities() { - return searchCapabilities; - } - - @UpnpAction(out = @UpnpOutputArgument(name = "SortCaps")) - public CSV getSortCapabilities() { - return sortCapabilities; - } - - @UpnpAction(out = @UpnpOutputArgument(name = "Id")) - synchronized public UnsignedIntegerFourBytes getSystemUpdateID() { - return systemUpdateID; - } - - public PropertyChangeSupport getPropertyChangeSupport() { - return propertyChangeSupport; - } - - /** - * Call this method after making changes to your content directory. - *

- * This will notify clients that their view of the content directory is potentially - * outdated and has to be refreshed. - *

- */ - synchronized protected void changeSystemUpdateID() { - Long oldUpdateID = getSystemUpdateID().getValue(); - systemUpdateID.increment(true); - getPropertyChangeSupport().firePropertyChange( - "SystemUpdateID", - oldUpdateID, - getSystemUpdateID().getValue() - ); - } - - @UpnpAction(out = { - @UpnpOutputArgument(name = "Result", - stateVariable = "A_ARG_TYPE_Result", - getterName = "getResult"), - @UpnpOutputArgument(name = "NumberReturned", - stateVariable = "A_ARG_TYPE_Count", - getterName = "getCount"), - @UpnpOutputArgument(name = "TotalMatches", - stateVariable = "A_ARG_TYPE_Count", - getterName = "getTotalMatches"), - @UpnpOutputArgument(name = "UpdateID", - stateVariable = "A_ARG_TYPE_UpdateID", - getterName = "getContainerUpdateID") - }) - public BrowseResult browse( - @UpnpInputArgument(name = "ObjectID", aliases = "ContainerID") String objectId, - @UpnpInputArgument(name = "BrowseFlag") String browseFlag, - @UpnpInputArgument(name = "Filter") String filter, - @UpnpInputArgument(name = "StartingIndex", stateVariable = "A_ARG_TYPE_Index") UnsignedIntegerFourBytes firstResult, - @UpnpInputArgument(name = "RequestedCount", stateVariable = "A_ARG_TYPE_Count") UnsignedIntegerFourBytes maxResults, - @UpnpInputArgument(name = "SortCriteria") String orderBy) - throws ContentDirectoryException { - - SortCriterion[] orderByCriteria; - try { - orderByCriteria = SortCriterion.valueOf(orderBy); - } catch (Exception ex) { - throw new ContentDirectoryException(ContentDirectoryErrorCode.UNSUPPORTED_SORT_CRITERIA, ex.toString()); - } - - try { - return browse( - objectId, - BrowseFlag.valueOrNullOf(browseFlag), - filter, - firstResult.getValue(), maxResults.getValue(), - orderByCriteria - ); - } catch (ContentDirectoryException ex) { - throw ex; - } catch (Exception ex) { - throw new ContentDirectoryException(ErrorCode.ACTION_FAILED, ex.toString()); - } - } - - /** - * Implement this method to implement browsing of your content. - *

- * This is a required action defined by ContentDirectory:1. - *

- *

- * You should wrap any exception into a {@link ContentDirectoryException}, so a propery - * error message can be returned to control points. - *

- */ - public abstract BrowseResult browse(String objectID, BrowseFlag browseFlag, - String filter, - long firstResult, long maxResults, - SortCriterion[] orderby) throws ContentDirectoryException; - - - @UpnpAction(out = { - @UpnpOutputArgument(name = "Result", - stateVariable = "A_ARG_TYPE_Result", - getterName = "getResult"), - @UpnpOutputArgument(name = "NumberReturned", - stateVariable = "A_ARG_TYPE_Count", - getterName = "getCount"), - @UpnpOutputArgument(name = "TotalMatches", - stateVariable = "A_ARG_TYPE_Count", - getterName = "getTotalMatches"), - @UpnpOutputArgument(name = "UpdateID", - stateVariable = "A_ARG_TYPE_UpdateID", - getterName = "getContainerUpdateID") - }) - public BrowseResult search( - @UpnpInputArgument(name = "ContainerID", stateVariable = "A_ARG_TYPE_ObjectID") String containerId, - @UpnpInputArgument(name = "SearchCriteria") String searchCriteria, - @UpnpInputArgument(name = "Filter") String filter, - @UpnpInputArgument(name = "StartingIndex", stateVariable = "A_ARG_TYPE_Index") UnsignedIntegerFourBytes firstResult, - @UpnpInputArgument(name = "RequestedCount", stateVariable = "A_ARG_TYPE_Count") UnsignedIntegerFourBytes maxResults, - @UpnpInputArgument(name = "SortCriteria") String orderBy) - throws ContentDirectoryException { - - SortCriterion[] orderByCriteria; - try { - orderByCriteria = SortCriterion.valueOf(orderBy); - } catch (Exception ex) { - throw new ContentDirectoryException(ContentDirectoryErrorCode.UNSUPPORTED_SORT_CRITERIA, ex.toString()); - } - - try { - return search( - containerId, - searchCriteria, - filter, - firstResult.getValue(), maxResults.getValue(), - orderByCriteria - ); - } catch (ContentDirectoryException ex) { - throw ex; - } catch (Exception ex) { - throw new ContentDirectoryException(ErrorCode.ACTION_FAILED, ex.toString()); - } - } - - /** - * Override this method to implement searching of your content. - *

- * The default implementation returns an empty result. - *

- */ - public BrowseResult search(String containerId, String searchCriteria, String filter, - long firstResult, long maxResults, SortCriterion[] orderBy) throws ContentDirectoryException { - - try { - return new BrowseResult(new DIDLParser().generate(new DIDLContent()), 0, 0); - } catch (Exception ex) { - throw new ContentDirectoryException(ErrorCode.ACTION_FAILED, ex.toString()); - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/contentdirectory/ContentDirectoryErrorCode.java b/app/src/main/java/org/fourthline/cling/support/contentdirectory/ContentDirectoryErrorCode.java deleted file mode 100644 index f48e00b..0000000 --- a/app/src/main/java/org/fourthline/cling/support/contentdirectory/ContentDirectoryErrorCode.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.contentdirectory; - -/** - * @author Alessio Gaeta - */ -public enum ContentDirectoryErrorCode { - - NO_SUCH_OBJECT(701, "The specified ObjectID is invalid"), - UNSUPPORTED_SORT_CRITERIA(709, "Unsupported or invalid sort criteria"), - CANNOT_PROCESS(720, "Cannot process the request"); - - private int code; - private String description; - - ContentDirectoryErrorCode(int code, String description) { - this.code = code; - this.description = description; - } - - public int getCode() { - return code; - } - - public String getDescription() { - return description; - } - - public static ContentDirectoryErrorCode getByCode(int code) { - for (ContentDirectoryErrorCode errorCode : values()) { - if (errorCode.getCode() == code) - return errorCode; - } - return null; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/contentdirectory/ContentDirectoryException.java b/app/src/main/java/org/fourthline/cling/support/contentdirectory/ContentDirectoryException.java deleted file mode 100644 index 785fb20..0000000 --- a/app/src/main/java/org/fourthline/cling/support/contentdirectory/ContentDirectoryException.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.contentdirectory; - -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.types.ErrorCode; - -/** - * @author Alessio Gaeta - */ -public class ContentDirectoryException extends ActionException { - - public ContentDirectoryException(int errorCode, String message) { - super(errorCode, message); - } - - public ContentDirectoryException(int errorCode, String message, - Throwable cause) { - super(errorCode, message, cause); - } - - public ContentDirectoryException(ErrorCode errorCode, String message) { - super(errorCode, message); - } - - public ContentDirectoryException(ErrorCode errorCode) { - super(errorCode); - } - - public ContentDirectoryException(ContentDirectoryErrorCode errorCode, String message) { - super(errorCode.getCode(), errorCode.getDescription() + ". " + message + "."); - } - - public ContentDirectoryException(ContentDirectoryErrorCode errorCode) { - super(errorCode.getCode(), errorCode.getDescription()); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/contentdirectory/DIDLParser.java b/app/src/main/java/org/fourthline/cling/support/contentdirectory/DIDLParser.java deleted file mode 100644 index e7a4b88..0000000 --- a/app/src/main/java/org/fourthline/cling/support/contentdirectory/DIDLParser.java +++ /dev/null @@ -1,1074 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.contentdirectory; - -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.support.model.DIDLAttribute; -import org.fourthline.cling.support.model.DIDLContent; -import org.fourthline.cling.support.model.DIDLObject; -import org.fourthline.cling.support.model.DescMeta; -import org.fourthline.cling.support.model.Person; -import org.fourthline.cling.support.model.PersonWithRole; -import org.fourthline.cling.support.model.ProtocolInfo; -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.StorageMedium; -import org.fourthline.cling.support.model.WriteStatus; -import org.fourthline.cling.support.model.container.Container; -import org.fourthline.cling.support.model.item.Item; -import org.seamless.util.io.IO; -import org.seamless.util.Exceptions; -import org.seamless.xml.SAXParser; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.InputStream; -import java.io.StringReader; -import java.io.StringWriter; -import java.net.URI; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static org.fourthline.cling.model.XMLUtil.appendNewElement; -import static org.fourthline.cling.model.XMLUtil.appendNewElementIfNotNull; - -/** - * DIDL parser based on SAX for reading and DOM for writing. - *

- * This parser requires Android platform level 8 (2.2). - *

- *

- * Override the {@link #createDescMetaHandler(org.fourthline.cling.support.model.DescMeta, org.seamless.xml.SAXParser.Handler)} - * method to read vendor extension content of {@code } elements. You then should also override the - * {@link #populateDescMetadata(org.w3c.dom.Element, org.fourthline.cling.support.model.DescMeta)} method for writing. - *

- *

- * Override the {@link #createItemHandler(org.fourthline.cling.support.model.item.Item, org.seamless.xml.SAXParser.Handler)} - * etc. methods to register custom handlers for vendor-specific elements and attributes within items, containers, - * and so on. - *

- * - * @author Christian Bauer - * @author Mario Franco - */ -public class DIDLParser extends SAXParser { - - final private static Logger log = Logger.getLogger(DIDLParser.class.getName()); - - public static final String UNKNOWN_TITLE = "Unknown Title"; - - /** - * Uses the current thread's context classloader to read and unmarshall the given resource. - * - * @param resource The resource on the classpath. - * @return The unmarshalled DIDL content model. - * @throws Exception - */ - public DIDLContent parseResource(String resource) throws Exception { - InputStream is = null; - try { - is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource); - return parse(IO.readLines(is)); - } finally { - if (is != null) is.close(); - } - } - - /** - * Reads and unmarshalls an XML representation into a DIDL content model. - * - * @param xml The XML representation. - * @return A DIDL content model. - * @throws Exception - */ - public DIDLContent parse(String xml) throws Exception { - - if (xml == null || xml.length() == 0) { - throw new RuntimeException("Null or empty XML"); - } - - DIDLContent content = new DIDLContent(); - createRootHandler(content, this); - - log.fine("Parsing DIDL XML content"); - parse(new InputSource(new StringReader(xml))); - return content; - } - - protected RootHandler createRootHandler(DIDLContent instance, SAXParser parser) { - return new RootHandler(instance, parser); - } - - protected ContainerHandler createContainerHandler(Container instance, Handler parent) { - return new ContainerHandler(instance, parent); - } - - protected ItemHandler createItemHandler(Item instance, Handler parent) { - return new ItemHandler(instance, parent); - } - - protected ResHandler createResHandler(Res instance, Handler parent) { - return new ResHandler(instance, parent); - } - - protected DescMetaHandler createDescMetaHandler(DescMeta instance, Handler parent) { - return new DescMetaHandler(instance, parent); - } - - - protected Container createContainer(Attributes attributes) { - Container container = new Container(); - - container.setId(attributes.getValue("id")); - container.setParentID(attributes.getValue("parentID")); - - if ((attributes.getValue("childCount") != null)) - container.setChildCount(Integer.valueOf(attributes.getValue("childCount"))); - - try { - Boolean value = (Boolean)Datatype.Builtin.BOOLEAN.getDatatype().valueOf( - attributes.getValue("restricted") - ); - if (value != null) - container.setRestricted(value); - - value = (Boolean)Datatype.Builtin.BOOLEAN.getDatatype().valueOf( - attributes.getValue("searchable") - ); - if (value != null) - container.setSearchable(value); - } catch (Exception ex) { - // Ignore - } - - return container; - } - - protected Item createItem(Attributes attributes) { - Item item = new Item(); - - item.setId(attributes.getValue("id")); - item.setParentID(attributes.getValue("parentID")); - - try { - Boolean value = (Boolean)Datatype.Builtin.BOOLEAN.getDatatype().valueOf( - attributes.getValue("restricted") - ); - if (value != null) - item.setRestricted(value); - - } catch (Exception ex) { - // Ignore - } - - if ((attributes.getValue("refID") != null)) - item.setRefID(attributes.getValue("refID")); - - return item; - } - - protected Res createResource(Attributes attributes) { - Res res = new Res(); - - if (attributes.getValue("importUri") != null) - res.setImportUri(URI.create(attributes.getValue("importUri"))); - - try { - res.setProtocolInfo( - new ProtocolInfo(attributes.getValue("protocolInfo")) - ); - } catch (InvalidValueException ex) { - log.warning("In DIDL content, invalid resource protocol info: " + Exceptions.unwrap(ex)); - return null; - } - - if (attributes.getValue("size") != null) - res.setSize(Long.valueOf(attributes.getValue("size"))); - - if (attributes.getValue("duration") != null) - res.setDuration(attributes.getValue("duration")); - - if (attributes.getValue("bitrate") != null) - res.setBitrate(Long.valueOf(attributes.getValue("bitrate"))); - - if (attributes.getValue("sampleFrequency") != null) - res.setSampleFrequency(Long.valueOf(attributes.getValue("sampleFrequency"))); - - if (attributes.getValue("bitsPerSample") != null) - res.setBitsPerSample(Long.valueOf(attributes.getValue("bitsPerSample"))); - - if (attributes.getValue("nrAudioChannels") != null) - res.setNrAudioChannels(Long.valueOf(attributes.getValue("nrAudioChannels"))); - - if (attributes.getValue("colorDepth") != null) - res.setColorDepth(Long.valueOf(attributes.getValue("colorDepth"))); - - if (attributes.getValue("protection") != null) - res.setProtection(attributes.getValue("protection")); - - if (attributes.getValue("resolution") != null) - res.setResolution(attributes.getValue("resolution")); - - return res; - } - - protected DescMeta createDescMeta(Attributes attributes) { - DescMeta desc = new DescMeta(); - - desc.setId(attributes.getValue("id")); - - if ((attributes.getValue("type") != null)) - desc.setType(attributes.getValue("type")); - - if ((attributes.getValue("nameSpace") != null)) - desc.setNameSpace(URI.create(attributes.getValue("nameSpace"))); - - return desc; - } - - - /* ############################################################################################# */ - - - /** - * Generates a XML representation of the content model. - *

- * Items inside a container will not be represented in the XML, the containers - * will be rendered flat without children. - *

- * - * @param content The content model. - * @return An XML representation. - * @throws Exception - */ - public String generate(DIDLContent content) throws Exception { - return generate(content, false); - } - - /** - * Generates an XML representation of the content model. - *

- * Optionally, items inside a container will be represented in the XML, - * the container elements then have nested item elements. Although this - * parser can read such a structure, it is unclear whether other DIDL - * parsers should and actually do support this XML. - *

- * - * @param content The content model. - * @param nestedItems true if nested item elements should be rendered for containers. - * @return An XML representation. - * @throws Exception - */ - public String generate(DIDLContent content, boolean nestedItems) throws Exception { - return documentToString(buildDOM(content, nestedItems), true); - } - - // TODO: Yes, this only runs on Android 2.2 - - protected String documentToString(Document document, boolean omitProlog) throws Exception { - TransformerFactory transFactory = TransformerFactory.newInstance(); - - // Indentation not supported on Android 2.2 - //transFactory.setAttribute("indent-number", 4); - - Transformer transformer = transFactory.newTransformer(); - - if (omitProlog) { - // TODO: UPNP VIOLATION: Terratec Noxon Webradio fails when DIDL content has a prolog - // No XML prolog! This is allowed because it is UTF-8 encoded and required - // because broken devices will stumble on SOAP messages that contain (even - // encoded) XML prologs within a message body. - transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); - } - - // Again, Android 2.2 fails hard if you try this. - //transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - - StringWriter out = new StringWriter(); - transformer.transform(new DOMSource(document), new StreamResult(out)); - return out.toString(); - } - - protected Document buildDOM(DIDLContent content, boolean nestedItems) throws Exception { - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - - Document d = factory.newDocumentBuilder().newDocument(); - - generateRoot(content, d, nestedItems); - - return d; - } - - protected void generateRoot(DIDLContent content, Document descriptor, boolean nestedItems) { - Element rootElement = descriptor.createElementNS(DIDLContent.NAMESPACE_URI, "DIDL-Lite"); - descriptor.appendChild(rootElement); - - // rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:didl", DIDLContent.NAMESPACE_URI); - rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:upnp", DIDLObject.Property.UPNP.NAMESPACE.URI); - rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:dc", DIDLObject.Property.DC.NAMESPACE.URI); - rootElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:sec", DIDLObject.Property.SEC.NAMESPACE.URI); - - for (Container container : content.getContainers()) { - if (container == null) continue; - generateContainer(container, descriptor, rootElement, nestedItems); - } - - for (Item item : content.getItems()) { - if (item == null) continue; - generateItem(item, descriptor, rootElement); - } - - for (DescMeta descMeta : content.getDescMetadata()) { - if (descMeta == null) continue; - generateDescMetadata(descMeta, descriptor, rootElement); - } - } - - protected void generateContainer(Container container, Document descriptor, Element parent, boolean nestedItems) { - - if (container.getClazz() == null) { - throw new RuntimeException("Missing 'upnp:class' element for container: " + container.getId()); - } - - Element containerElement = appendNewElement(descriptor, parent, "container"); - - if (container.getId() == null) - throw new NullPointerException("Missing id on container: " + container); - containerElement.setAttribute("id", container.getId()); - - if (container.getParentID() == null) - throw new NullPointerException("Missing parent id on container: " + container); - containerElement.setAttribute("parentID", container.getParentID()); - - if (container.getChildCount() != null) { - containerElement.setAttribute("childCount", Integer.toString(container.getChildCount())); - } - - containerElement.setAttribute("restricted", booleanToInt(container.isRestricted())); - containerElement.setAttribute("searchable", booleanToInt(container.isSearchable())); - - String title = container.getTitle(); - if (title == null) { - log.warning("Missing 'dc:title' element for container: " + container.getId()); - title = UNKNOWN_TITLE; - } - - appendNewElementIfNotNull( - descriptor, - containerElement, - "dc:title", - title, - DIDLObject.Property.DC.NAMESPACE.URI - ); - - appendNewElementIfNotNull( - descriptor, - containerElement, - "dc:creator", - container.getCreator(), - DIDLObject.Property.DC.NAMESPACE.URI - ); - - appendNewElementIfNotNull( - descriptor, - containerElement, - "upnp:writeStatus", - container.getWriteStatus(), - DIDLObject.Property.UPNP.NAMESPACE.URI - ); - - appendClass(descriptor, containerElement, container.getClazz(), "upnp:class", false); - - for (DIDLObject.Class searchClass : container.getSearchClasses()) { - appendClass(descriptor, containerElement, searchClass, "upnp:searchClass", true); - } - - for (DIDLObject.Class createClass : container.getCreateClasses()) { - appendClass(descriptor, containerElement, createClass, "upnp:createClass", true); - } - - appendProperties(descriptor, containerElement, container, "upnp", DIDLObject.Property.UPNP.NAMESPACE.class, DIDLObject.Property.UPNP.NAMESPACE.URI); - appendProperties(descriptor, containerElement, container, "dc", DIDLObject.Property.DC.NAMESPACE.class, DIDLObject.Property.DC.NAMESPACE.URI); - - if (nestedItems) { - for (Item item : container.getItems()) { - if (item == null) continue; - generateItem(item, descriptor, containerElement); - } - } - - for (Res resource : container.getResources()) { - if (resource == null) continue; - generateResource(resource, descriptor, containerElement); - } - - for (DescMeta descMeta : container.getDescMetadata()) { - if (descMeta == null) continue; - generateDescMetadata(descMeta, descriptor, containerElement); - } - } - - protected void generateItem(Item item, Document descriptor, Element parent) { - - if (item.getClazz() == null) { - throw new RuntimeException("Missing 'upnp:class' element for item: " + item.getId()); - } - - Element itemElement = appendNewElement(descriptor, parent, "item"); - - if (item.getId() == null) - throw new NullPointerException("Missing id on item: " + item); - itemElement.setAttribute("id", item.getId()); - - if (item.getParentID() == null) - throw new NullPointerException("Missing parent id on item: " + item); - itemElement.setAttribute("parentID", item.getParentID()); - - if (item.getRefID() != null) - itemElement.setAttribute("refID", item.getRefID()); - itemElement.setAttribute("restricted", booleanToInt(item.isRestricted())); - - String title = item.getTitle(); - if (title == null) { - log.warning("Missing 'dc:title' element for item: " + item.getId()); - title = UNKNOWN_TITLE; - } - - appendNewElementIfNotNull( - descriptor, - itemElement, - "dc:title", - title, - DIDLObject.Property.DC.NAMESPACE.URI - ); - - appendNewElementIfNotNull( - descriptor, - itemElement, - "dc:creator", - item.getCreator(), - DIDLObject.Property.DC.NAMESPACE.URI - ); - - appendNewElementIfNotNull( - descriptor, - itemElement, - "upnp:writeStatus", - item.getWriteStatus(), - DIDLObject.Property.UPNP.NAMESPACE.URI - ); - - appendClass(descriptor, itemElement, item.getClazz(), "upnp:class", false); - - appendProperties(descriptor, itemElement, item, "upnp", DIDLObject.Property.UPNP.NAMESPACE.class, DIDLObject.Property.UPNP.NAMESPACE.URI); - appendProperties(descriptor, itemElement, item, "dc", DIDLObject.Property.DC.NAMESPACE.class, DIDLObject.Property.DC.NAMESPACE.URI); - appendProperties(descriptor, itemElement, item, "sec", DIDLObject.Property.SEC.NAMESPACE.class, DIDLObject.Property.SEC.NAMESPACE.URI); - - for (Res resource : item.getResources()) { - if (resource == null) continue; - generateResource(resource, descriptor, itemElement); - } - - for (DescMeta descMeta : item.getDescMetadata()) { - if (descMeta == null) continue; - generateDescMetadata(descMeta, descriptor, itemElement); - } - } - - protected void generateResource(Res resource, Document descriptor, Element parent) { - - if (resource.getValue() == null) { - throw new RuntimeException("Missing resource URI value" + resource); - } - if (resource.getProtocolInfo() == null) { - throw new RuntimeException("Missing resource protocol info: " + resource); - } - - Element resourceElement = appendNewElement(descriptor, parent, "res", resource.getValue()); - resourceElement.setAttribute("protocolInfo", resource.getProtocolInfo().toString()); - if (resource.getImportUri() != null) - resourceElement.setAttribute("importUri", resource.getImportUri().toString()); - if (resource.getSize() != null) - resourceElement.setAttribute("size", resource.getSize().toString()); - if (resource.getDuration() != null) - resourceElement.setAttribute("duration", resource.getDuration()); - if (resource.getBitrate() != null) - resourceElement.setAttribute("bitrate", resource.getBitrate().toString()); - if (resource.getSampleFrequency() != null) - resourceElement.setAttribute("sampleFrequency", resource.getSampleFrequency().toString()); - if (resource.getBitsPerSample() != null) - resourceElement.setAttribute("bitsPerSample", resource.getBitsPerSample().toString()); - if (resource.getNrAudioChannels() != null) - resourceElement.setAttribute("nrAudioChannels", resource.getNrAudioChannels().toString()); - if (resource.getColorDepth() != null) - resourceElement.setAttribute("colorDepth", resource.getColorDepth().toString()); - if (resource.getProtection() != null) - resourceElement.setAttribute("protection", resource.getProtection()); - if (resource.getResolution() != null) - resourceElement.setAttribute("resolution", resource.getResolution()); - } - - protected void generateDescMetadata(DescMeta descMeta, Document descriptor, Element parent) { - - if (descMeta.getId() == null) { - throw new RuntimeException("Missing id of description metadata: " + descMeta); - } - if (descMeta.getNameSpace() == null) { - throw new RuntimeException("Missing namespace of description metadata: " + descMeta); - } - - Element descElement = appendNewElement(descriptor, parent, "desc"); - descElement.setAttribute("id", descMeta.getId()); - descElement.setAttribute("nameSpace", descMeta.getNameSpace().toString()); - if (descMeta.getType() != null) - descElement.setAttribute("type", descMeta.getType()); - populateDescMetadata(descElement, descMeta); - } - - /** - * Expects an org.w3c.Document as metadata, copies nodes of the document into the DIDL content. - *

- * This method will ignore the content and log a warning if it's of the wrong type. If you override - * {@link #createDescMetaHandler(org.fourthline.cling.support.model.DescMeta, org.seamless.xml.SAXParser.Handler)}, - * you most likely also want to override this method. - *

- * - * @param descElement The DIDL content {@code } element wrapping the final metadata. - * @param descMeta The metadata with a org.w3c.Document payload. - */ - protected void populateDescMetadata(Element descElement, DescMeta descMeta) { - if (descMeta.getMetadata() instanceof Document) { - Document doc = (Document) descMeta.getMetadata(); - - NodeList nl = doc.getDocumentElement().getChildNodes(); - for (int i = 0; i < nl.getLength(); i++) { - Node n = nl.item(i); - if (n.getNodeType() != Node.ELEMENT_NODE) - continue; - - Node clone = descElement.getOwnerDocument().importNode(n, true); - descElement.appendChild(clone); - } - - } else { - log.warning("Unknown desc metadata content, please override populateDescMetadata(): " + descMeta.getMetadata()); - } - } - - protected void appendProperties(Document descriptor, Element parent, DIDLObject object, String prefix, - Class namespace, - String namespaceURI) { - for (DIDLObject.Property property : object.getPropertiesByNamespace(namespace)) { - Element el = descriptor.createElementNS(namespaceURI, prefix + ":" + property.getDescriptorName()); - parent.appendChild(el); - property.setOnElement(el); - } - } - - protected void appendClass(Document descriptor, Element parent, DIDLObject.Class clazz, String element, boolean appendDerivation) { - Element classElement = appendNewElementIfNotNull( - descriptor, - parent, - element, - clazz.getValue(), - DIDLObject.Property.UPNP.NAMESPACE.URI - ); - if (clazz.getFriendlyName() != null && clazz.getFriendlyName().length() > 0) - classElement.setAttribute("name", clazz.getFriendlyName()); - if (appendDerivation) - classElement.setAttribute("includeDerived", Boolean.toString(clazz.isIncludeDerived())); - } - - protected String booleanToInt(boolean b) { - return b ? "1": "0"; - } - - /** - * Sends the given string to the log with Level.FINE, if that log level is enabled. - * - * @param s The string to send to the log. - */ - public void debugXML(String s) { - if (log.isLoggable(Level.FINE)) { - log.fine("-------------------------------------------------------------------------------------"); - log.fine("\n" + s); - log.fine("-------------------------------------------------------------------------------------"); - } - } - - - /* ############################################################################################# */ - - - public abstract class DIDLObjectHandler extends Handler { - - protected DIDLObjectHandler(I instance, Handler parent) { - super(instance, parent); - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - super.endElement(uri, localName, qName); - - if (DIDLObject.Property.DC.NAMESPACE.URI.equals(uri)) { - - if ("title".equals(localName)) { - getInstance().setTitle(getCharacters()); - } else if ("creator".equals(localName)) { - getInstance().setCreator(getCharacters()); - } else if ("description".equals(localName)) { - getInstance().addProperty(new DIDLObject.Property.DC.DESCRIPTION(getCharacters())); - } else if ("publisher".equals(localName)) { - getInstance().addProperty(new DIDLObject.Property.DC.PUBLISHER(new Person(getCharacters()))); - } else if ("contributor".equals(localName)) { - getInstance().addProperty(new DIDLObject.Property.DC.CONTRIBUTOR(new Person(getCharacters()))); - } else if ("date".equals(localName)) { - getInstance().addProperty(new DIDLObject.Property.DC.DATE(getCharacters())); - } else if ("language".equals(localName)) { - getInstance().addProperty(new DIDLObject.Property.DC.LANGUAGE(getCharacters())); - } else if ("rights".equals(localName)) { - getInstance().addProperty(new DIDLObject.Property.DC.RIGHTS(getCharacters())); - } else if ("relation".equals(localName)) { - getInstance().addProperty(new DIDLObject.Property.DC.RELATION(URI.create(getCharacters()))); - } - - } else if (DIDLObject.Property.UPNP.NAMESPACE.URI.equals(uri)) { - - if ("writeStatus".equals(localName)) { - try { - getInstance().setWriteStatus( - WriteStatus.valueOf(getCharacters()) - ); - } catch (Exception ex) { - log.info("Ignoring invalid writeStatus value: " + getCharacters()); - } - } else if ("class".equals(localName)) { - getInstance().setClazz( - new DIDLObject.Class( - getCharacters(), - getAttributes().getValue("name") - ) - ); - } else if ("artist".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.ARTIST( - new PersonWithRole(getCharacters(), getAttributes().getValue("role")) - ) - ); - } else if ("actor".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.ACTOR( - new PersonWithRole(getCharacters(), getAttributes().getValue("role")) - ) - ); - } else if ("author".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.AUTHOR( - new PersonWithRole(getCharacters(), getAttributes().getValue("role")) - ) - ); - } else if ("producer".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.PRODUCER(new Person(getCharacters())) - ); - } else if ("director".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.DIRECTOR(new Person(getCharacters())) - ); - } else if ("longDescription".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.LONG_DESCRIPTION(getCharacters()) - ); - } else if ("storageUsed".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.STORAGE_USED(Long.valueOf(getCharacters())) - ); - } else if ("storageTotal".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.STORAGE_TOTAL(Long.valueOf(getCharacters())) - ); - } else if ("storageFree".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.STORAGE_FREE(Long.valueOf(getCharacters())) - ); - } else if ("storageMaxPartition".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.STORAGE_MAX_PARTITION(Long.valueOf(getCharacters())) - ); - } else if ("storageMedium".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.STORAGE_MEDIUM(StorageMedium.valueOrVendorSpecificOf(getCharacters())) - ); - } else if ("genre".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.GENRE(getCharacters()) - ); - } else if ("album".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.ALBUM(getCharacters()) - ); - } else if ("playlist".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.PLAYLIST(getCharacters()) - ); - } else if ("region".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.REGION(getCharacters()) - ); - } else if ("rating".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.RATING(getCharacters()) - ); - } else if ("toc".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.TOC(getCharacters()) - ); - } else if ("albumArtURI".equals(localName)) { - DIDLObject.Property albumArtURI = new DIDLObject.Property.UPNP.ALBUM_ART_URI(URI.create(getCharacters())); - - Attributes albumArtURIAttributes = getAttributes(); - for (int i = 0; i < albumArtURIAttributes.getLength(); i++) { - if ("profileID".equals(albumArtURIAttributes.getLocalName(i))) { - albumArtURI.addAttribute( - new DIDLObject.Property.DLNA.PROFILE_ID( - new DIDLAttribute( - DIDLObject.Property.DLNA.NAMESPACE.URI, - "dlna", - albumArtURIAttributes.getValue(i)) - )); - } - } - - getInstance().addProperty(albumArtURI); - } else if ("artistDiscographyURI".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.ARTIST_DISCO_URI(URI.create(getCharacters())) - ); - } else if ("lyricsURI".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.LYRICS_URI(URI.create(getCharacters())) - ); - } else if ("icon".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.ICON(URI.create(getCharacters())) - ); - } else if ("radioCallSign".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.RADIO_CALL_SIGN(getCharacters()) - ); - } else if ("radioStationID".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.RADIO_STATION_ID(getCharacters()) - ); - } else if ("radioBand".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.RADIO_BAND(getCharacters()) - ); - } else if ("channelNr".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.CHANNEL_NR(Integer.valueOf(getCharacters())) - ); - } else if ("channelName".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.CHANNEL_NAME(getCharacters()) - ); - } else if ("scheduledStartTime".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.SCHEDULED_START_TIME(getCharacters()) - ); - } else if ("scheduledEndTime".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.SCHEDULED_END_TIME(getCharacters()) - ); - } else if ("DVDRegionCode".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.DVD_REGION_CODE(Integer.valueOf(getCharacters())) - ); - } else if ("originalTrackNumber".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.ORIGINAL_TRACK_NUMBER(Integer.valueOf(getCharacters())) - ); - } else if ("userAnnotation".equals(localName)) { - getInstance().addProperty( - new DIDLObject.Property.UPNP.USER_ANNOTATION(getCharacters()) - ); - } - } - } - } - - public class RootHandler extends Handler { - - RootHandler(DIDLContent instance, SAXParser parser) { - super(instance, parser); - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - super.startElement(uri, localName, qName, attributes); - - if (!DIDLContent.NAMESPACE_URI.equals(uri)) return; - - if (localName.equals("container")) { - - Container container = createContainer(attributes); - getInstance().addContainer(container); - createContainerHandler(container, this); - - } else if (localName.equals("item")) { - - Item item = createItem(attributes); - getInstance().addItem(item); - createItemHandler(item, this); - - } else if (localName.equals("desc")) { - - DescMeta desc = createDescMeta(attributes); - getInstance().addDescMetadata(desc); - createDescMetaHandler(desc, this); - - } - } - - @Override - protected boolean isLastElement(String uri, String localName, String qName) { - if (DIDLContent.NAMESPACE_URI.equals(uri) && "DIDL-Lite".equals(localName)) { - - // Now transform all the generically typed Container and Item instances into - // more specific Album, MusicTrack, etc. instances - getInstance().replaceGenericContainerAndItems(); - - return true; - } - return false; - } - } - - public class ContainerHandler extends DIDLObjectHandler { - public ContainerHandler(Container instance, Handler parent) { - super(instance, parent); - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - super.startElement(uri, localName, qName, attributes); - - if (!DIDLContent.NAMESPACE_URI.equals(uri)) return; - - if (localName.equals("item")) { - - Item item = createItem(attributes); - getInstance().addItem(item); - createItemHandler(item, this); - - } else if (localName.equals("desc")) { - - DescMeta desc = createDescMeta(attributes); - getInstance().addDescMetadata(desc); - createDescMetaHandler(desc, this); - - } else if (localName.equals("res")) { - - Res res = createResource(attributes); - if (res != null) { - getInstance().addResource(res); - createResHandler(res, this); - } - - } - - // We do NOT support recursive container embedded in container! The schema allows it - // but the spec doesn't: - // - // Section 2.8.3: Incremental navigation i.e. the full hierarchy is never returned - // in one call since this is likely to flood the resources available to the control - // point (memory, network bandwidth, etc.). - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - super.endElement(uri, localName, qName); - - if (DIDLObject.Property.UPNP.NAMESPACE.URI.equals(uri)) { - - if ("searchClass".equals(localName)) { - getInstance().getSearchClasses().add( - new DIDLObject.Class( - getCharacters(), - getAttributes().getValue("name"), - "true".equals(getAttributes().getValue("includeDerived")) - ) - ); - } else if ("createClass".equals(localName)) { - getInstance().getCreateClasses().add( - new DIDLObject.Class( - getCharacters(), - getAttributes().getValue("name"), - "true".equals(getAttributes().getValue("includeDerived")) - ) - ); - } - } - } - - @Override - protected boolean isLastElement(String uri, String localName, String qName) { - if (DIDLContent.NAMESPACE_URI.equals(uri) && "container".equals(localName)) { - if (getInstance().getTitle() == null) { - log.warning("In DIDL content, missing 'dc:title' element for container: " + getInstance().getId()); - } - if (getInstance().getClazz() == null) { - log.warning("In DIDL content, missing 'upnp:class' element for container: " + getInstance().getId()); - } - return true; - } - return false; - } - } - - public class ItemHandler extends DIDLObjectHandler { - public ItemHandler(Item instance, Handler parent) { - super(instance, parent); - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - super.startElement(uri, localName, qName, attributes); - - if (!DIDLContent.NAMESPACE_URI.equals(uri)) return; - - if (localName.equals("res")) { - - Res res = createResource(attributes); - if (res != null) { - getInstance().addResource(res); - createResHandler(res, this); - } - - } else if (localName.equals("desc")) { - - DescMeta desc = createDescMeta(attributes); - getInstance().addDescMetadata(desc); - createDescMetaHandler(desc, this); - - } - } - - @Override - protected boolean isLastElement(String uri, String localName, String qName) { - if (DIDLContent.NAMESPACE_URI.equals(uri) && "item".equals(localName)) { - if (getInstance().getTitle() == null) { - log.warning("In DIDL content, missing 'dc:title' element for item: " + getInstance().getId()); - } - if (getInstance().getClazz() == null) { - log.warning("In DIDL content, missing 'upnp:class' element for item: " + getInstance().getId()); - } - return true; - } - return false; - } - } - - protected class ResHandler extends Handler { - public ResHandler(Res instance, Handler parent) { - super(instance, parent); - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - super.endElement(uri, localName, qName); - getInstance().setValue(getCharacters()); - } - - @Override - protected boolean isLastElement(String uri, String localName, String qName) { - return DIDLContent.NAMESPACE_URI.equals(uri) && "res".equals(localName); - } - } - - /** - * Extracts an org.w3c.Document from the nested elements in the {@code } element. - *

- * The root element of this document is a wrapper in the namespace - * {@link org.fourthline.cling.support.model.DIDLContent#DESC_WRAPPER_NAMESPACE_URI}. - *

- */ - public class DescMetaHandler extends Handler { - - protected Element current; - - public DescMetaHandler(DescMeta instance, Handler parent) { - super(instance, parent); - instance.setMetadata(instance.createMetadataDocument()); - current = getInstance().getMetadata().getDocumentElement(); - } - - @Override - public DescMeta getInstance() { - return super.getInstance(); - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - super.startElement(uri, localName, qName, attributes); - - Element newEl = getInstance().getMetadata().createElementNS(uri, qName); - for (int i = 0; i < attributes.getLength(); i++) { - newEl.setAttributeNS( - attributes.getURI(i), - attributes.getQName(i), - attributes.getValue(i) - ); - } - current.appendChild(newEl); - current = newEl; - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - super.endElement(uri, localName, qName); - if (isLastElement(uri, localName, qName)) return; - - // Ignore whitespace - if (getCharacters().length() > 0 && !getCharacters().matches("[\\t\\n\\x0B\\f\\r\\s]+")) - current.appendChild(getInstance().getMetadata().createTextNode(getCharacters())); - - current = (Element) current.getParentNode(); - - // Reset this so we can continue parsing child nodes with this handler - characters = new StringBuilder(); - attributes = null; - } - - @Override - protected boolean isLastElement(String uri, String localName, String qName) { - return DIDLContent.NAMESPACE_URI.equals(uri) && "desc".equals(localName); - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/contentdirectory/callback/Browse.java b/app/src/main/java/org/fourthline/cling/support/contentdirectory/callback/Browse.java deleted file mode 100644 index 60f1507..0000000 --- a/app/src/main/java/org/fourthline/cling/support/contentdirectory/callback/Browse.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.contentdirectory.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.contentdirectory.DIDLParser; -import org.fourthline.cling.support.model.BrowseFlag; -import org.fourthline.cling.support.model.BrowseResult; -import org.fourthline.cling.support.model.DIDLContent; -import org.fourthline.cling.support.model.SortCriterion; - -import java.util.logging.Logger; - -/** - * Invokes a "Browse" action, parses the result. - * - * @author Christian Bauer - */ -public abstract class Browse extends ActionCallback { - - public static final String CAPS_WILDCARD = "*"; - - public enum Status { - NO_CONTENT("No Content"), - LOADING("Loading..."), - OK("OK"); - - private String defaultMessage; - - Status(String defaultMessage) { - this.defaultMessage = defaultMessage; - } - - public String getDefaultMessage() { - return defaultMessage; - } - } - - private static Logger log = Logger.getLogger(Browse.class.getName()); - - /** - * Browse with first result 0 and {@link #getDefaultMaxResults()}, filters with {@link #CAPS_WILDCARD}. - */ - public Browse(Service service, String containerId, BrowseFlag flag) { - this(service, containerId, flag, CAPS_WILDCARD, 0, null); - } - - /** - * @param maxResults Can be null, then {@link #getDefaultMaxResults()} is used. - */ - public Browse(Service service, String objectID, BrowseFlag flag, - String filter, long firstResult, Long maxResults, SortCriterion... orderBy) { - - super(new ActionInvocation(service.getAction("Browse"))); - - log.fine("Creating browse action for object ID: " + objectID); - - getActionInvocation().setInput("ObjectID", objectID); - getActionInvocation().setInput("BrowseFlag", flag.toString()); - getActionInvocation().setInput("Filter", filter); - getActionInvocation().setInput("StartingIndex", new UnsignedIntegerFourBytes(firstResult)); - getActionInvocation().setInput("RequestedCount", - new UnsignedIntegerFourBytes(maxResults == null ? getDefaultMaxResults() : maxResults) - ); - getActionInvocation().setInput("SortCriteria", SortCriterion.toString(orderBy)); - } - - @Override - public void run() { - updateStatus(Status.LOADING); - super.run(); - } - - public void success(ActionInvocation invocation) { - log.fine("Successful browse action, reading output argument values"); - - BrowseResult result = new BrowseResult( - invocation.getOutput("Result").getValue().toString(), - (UnsignedIntegerFourBytes) invocation.getOutput("NumberReturned").getValue(), - (UnsignedIntegerFourBytes) invocation.getOutput("TotalMatches").getValue(), - (UnsignedIntegerFourBytes) invocation.getOutput("UpdateID").getValue() - ); - - boolean proceed = receivedRaw(invocation, result); - - if (proceed && result.getCountLong() > 0 && result.getResult().length() > 0) { - - try { - - DIDLParser didlParser = new DIDLParser(); - DIDLContent didl = didlParser.parse(result.getResult()); - received(invocation, didl); - updateStatus(Status.OK); - - } catch (Exception ex) { - invocation.setFailure( - new ActionException(ErrorCode.ACTION_FAILED, "Can't parse DIDL XML response: " + ex, ex) - ); - failure(invocation, null); - } - - } else { - received(invocation, new DIDLContent()); - updateStatus(Status.NO_CONTENT); - } - } - - /** - * Some media servers will crash if there is no limit on the maximum number of results. - * - * @return The default limit, 999. - */ - public long getDefaultMaxResults() { - return 999; - } - - public boolean receivedRaw(ActionInvocation actionInvocation, BrowseResult browseResult) { - /* - if (log.isLoggable(Level.FINER)) { - log.finer("-------------------------------------------------------------------------------------"); - log.finer("\n" + XML.pretty(browseResult.getDidl())); - log.finer("-------------------------------------------------------------------------------------"); - } - */ - return true; - } - - public abstract void received(ActionInvocation actionInvocation, DIDLContent didl); - public abstract void updateStatus(Status status); - -} diff --git a/app/src/main/java/org/fourthline/cling/support/contentdirectory/callback/Search.java b/app/src/main/java/org/fourthline/cling/support/contentdirectory/callback/Search.java deleted file mode 100644 index 819044f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/contentdirectory/callback/Search.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.contentdirectory.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.contentdirectory.DIDLParser; -import org.fourthline.cling.support.model.DIDLContent; -import org.fourthline.cling.support.model.SearchResult; -import org.fourthline.cling.support.model.SortCriterion; - -import java.util.logging.Logger; - -/** - * Invokes a "Search" action, parses the result. - * - * @author TK Kocheran <rfkrocktk@gmail.com> - */ -public abstract class Search extends ActionCallback { - - public static final String CAPS_WILDCARD = "*"; - - public enum Status { - NO_CONTENT("No Content"), - LOADING("Loading..."), - OK("OK"); - - private String defaultMessage; - - Status(String defaultMessage) { - this.defaultMessage = defaultMessage; - } - - public String getDefaultMessage() { - return this.defaultMessage; - } - } - - private static Logger log = Logger.getLogger(Search.class.getName()); - - /** - * Search with first result 0 and {@link #getDefaultMaxResults()}, filters with {@link #CAPS_WILDCARD}. - */ - public Search(Service service, String containerId, String searchCriteria) { - this(service, containerId, searchCriteria, CAPS_WILDCARD, 0, null); - } - - /** - * @param maxResults Can be null, then {@link #getDefaultMaxResults()} is used. - */ - public Search(Service service, String containerId, String searchCriteria, String filter, - long firstResult, Long maxResults, SortCriterion... orderBy) { - super(new ActionInvocation(service.getAction("Search"))); - - log.fine("Creating browse action for container ID: " + containerId); - - getActionInvocation().setInput("ContainerID", containerId); - getActionInvocation().setInput("SearchCriteria", searchCriteria); - getActionInvocation().setInput("Filter", filter); - getActionInvocation().setInput("StartingIndex", new UnsignedIntegerFourBytes(firstResult)); - getActionInvocation().setInput( - "RequestedCount", - new UnsignedIntegerFourBytes(maxResults == null ? getDefaultMaxResults() : maxResults) - ); - getActionInvocation().setInput("SortCriteria", SortCriterion.toString(orderBy)); - } - - @Override - public void run() { - updateStatus(Status.LOADING); - super.run(); - } - - @Override - public void success(ActionInvocation actionInvocation) { - log.fine("Successful search action, reading output argument values"); - - SearchResult result = new SearchResult( - actionInvocation.getOutput("Result").getValue().toString(), - (UnsignedIntegerFourBytes) actionInvocation.getOutput("NumberReturned").getValue(), - (UnsignedIntegerFourBytes) actionInvocation.getOutput("TotalMatches").getValue(), - (UnsignedIntegerFourBytes) actionInvocation.getOutput("UpdateID").getValue()); - - boolean proceed = receivedRaw(actionInvocation, result); - - if (proceed && result.getCountLong() > 0 && result.getResult().length() > 0) { - try { - DIDLParser didlParser = new DIDLParser(); - DIDLContent didl = didlParser.parse(result.getResult()); - received(actionInvocation, didl); - updateStatus(Status.OK); - } catch (Exception ex) { - actionInvocation.setFailure( - new ActionException(ErrorCode.ACTION_FAILED, "Can't parse DIDL XML response: " + ex, ex) - ); - failure(actionInvocation, null); - } - } else { - received(actionInvocation, new DIDLContent()); - updateStatus(Status.NO_CONTENT); - } - } - - /** - * Some media servers will crash if there is no limit on the maximum number of results. - * - * @return The default limit, 999. - */ - public Long getDefaultMaxResults() { - return 999L; - } - - public boolean receivedRaw(ActionInvocation actionInvocation, SearchResult searchResult) { - return true; - } - - public abstract void received(ActionInvocation actionInvocation, DIDLContent didl); - - public abstract void updateStatus(Status status); -} diff --git a/app/src/main/java/org/fourthline/cling/support/igd/PortMappingListener.java b/app/src/main/java/org/fourthline/cling/support/igd/PortMappingListener.java deleted file mode 100644 index c9e3c16..0000000 --- a/app/src/main/java/org/fourthline/cling/support/igd/PortMappingListener.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.igd; - -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.meta.Device; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.DeviceType; -import org.fourthline.cling.model.types.ServiceType; -import org.fourthline.cling.model.types.UDADeviceType; -import org.fourthline.cling.model.types.UDAServiceType; -import org.fourthline.cling.registry.DefaultRegistryListener; -import org.fourthline.cling.registry.Registry; -import org.fourthline.cling.support.igd.callback.PortMappingAdd; -import org.fourthline.cling.support.igd.callback.PortMappingDelete; -import org.fourthline.cling.support.model.PortMapping; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; - -/** - * Maintains UPnP port mappings on an InternetGatewayDevice automatically. - *

- * This listener will wait for discovered devices which support either - * {@code WANIPConnection} or the {@code WANPPPConnection} service. As soon as any such - * service is discovered, the desired port mapping will be created. When the UPnP service - * is shutting down, all previously established port mappings with all services will - * be deleted. - *

- *

- * The following listener maps external WAN TCP port 8123 to internal host 10.0.0.2: - *

- *
{@code
- * upnpService.getRegistry().addListener(
- *newPortMappingListener(newPortMapping(8123, "10.0.0.2",PortMapping.Protocol.TCP))
- * );}
- *

- * If all you need from the Cling UPnP stack is NAT port mapping, use the following idiom: - *

- *
{@code
- * UpnpService upnpService = new UpnpServiceImpl(
- *     new PortMappingListener(new PortMapping(8123, "10.0.0.2", PortMapping.Protocol.TCP))
- * );
- * 

- * upnpService.getControlPoint().search(new STAllHeader()); // Search for all devices - *

- * upnpService.shutdown(); // When you no longer need the port mapping - * }

- * - * @author Christian Bauer - */ -public class PortMappingListener extends DefaultRegistryListener { - - private static final Logger log = Logger.getLogger(PortMappingListener.class.getName()); - - public static final DeviceType IGD_DEVICE_TYPE = new UDADeviceType("InternetGatewayDevice", 1); - public static final DeviceType CONNECTION_DEVICE_TYPE = new UDADeviceType("WANConnectionDevice", 1); - - public static final ServiceType IP_SERVICE_TYPE = new UDAServiceType("WANIPConnection", 1); - public static final ServiceType PPP_SERVICE_TYPE = new UDAServiceType("WANPPPConnection", 1); - - protected PortMapping[] portMappings; - - // The key of the map is Service and equality is object identity, this is by-design - protected Map> activePortMappings = new HashMap(); - - public PortMappingListener(PortMapping portMapping) { - this(new PortMapping[]{portMapping}); - } - - public PortMappingListener(PortMapping[] portMappings) { - this.portMappings = portMappings; - } - - @Override - synchronized public void deviceAdded(Registry registry, Device device) { - - Service connectionService; - if ((connectionService = discoverConnectionService(device)) == null) return; - - log.fine("Activating port mappings on: " + connectionService); - - final List activeForService = new ArrayList(); - for (final PortMapping pm : portMappings) { - new PortMappingAdd(connectionService, registry.getUpnpService().getControlPoint(), pm) { - - @Override - public void success(ActionInvocation invocation) { - log.fine("Port mapping added: " + pm); - activeForService.add(pm); - } - - @Override - public void failure(ActionInvocation invocation, UpnpResponse operation, String defaultMsg) { - handleFailureMessage("Failed to add port mapping: " + pm); - handleFailureMessage("Reason: " + defaultMsg); - } - }.run(); // Synchronous! - } - - activePortMappings.put(connectionService, activeForService); - } - - @Override - synchronized public void deviceRemoved(Registry registry, Device device) { - for (Service service : device.findServices()) { - Iterator>> it = activePortMappings.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry> activeEntry = it.next(); - if (!activeEntry.getKey().equals(service)) continue; - - if (activeEntry.getValue().size() > 0) - handleFailureMessage("Device disappeared, couldn't delete port mappings: " + activeEntry.getValue().size()); - - it.remove(); - } - } - } - - @Override - synchronized public void beforeShutdown(Registry registry) { - for (Map.Entry> activeEntry : activePortMappings.entrySet()) { - - final Iterator it = activeEntry.getValue().iterator(); - while (it.hasNext()) { - final PortMapping pm = it.next(); - log.fine("Trying to delete port mapping on IGD: " + pm); - new PortMappingDelete(activeEntry.getKey(), registry.getUpnpService().getControlPoint(), pm) { - - @Override - public void success(ActionInvocation invocation) { - log.fine("Port mapping deleted: " + pm); - it.remove(); - } - - @Override - public void failure(ActionInvocation invocation, UpnpResponse operation, String defaultMsg) { - handleFailureMessage("Failed to delete port mapping: " + pm); - handleFailureMessage("Reason: " + defaultMsg); - } - - }.run(); // Synchronous! - } - } - } - - protected Service discoverConnectionService(Device device) { - if (!device.getType().equals(IGD_DEVICE_TYPE)) { - return null; - } - - Device[] connectionDevices = device.findDevices(CONNECTION_DEVICE_TYPE); - if (connectionDevices.length == 0) { - log.fine("IGD doesn't support '" + CONNECTION_DEVICE_TYPE + "': " + device); - return null; - } - - Device connectionDevice = connectionDevices[0]; - log.fine("Using first discovered WAN connection device: " + connectionDevice); - - Service ipConnectionService = connectionDevice.findService(IP_SERVICE_TYPE); - Service pppConnectionService = connectionDevice.findService(PPP_SERVICE_TYPE); - - if (ipConnectionService == null && pppConnectionService == null) { - log.fine("IGD doesn't support IP or PPP WAN connection service: " + device); - } - - return ipConnectionService != null ? ipConnectionService : pppConnectionService; - } - - protected void handleFailureMessage(String s) { - log.warning(s); - } - -} - diff --git a/app/src/main/java/org/fourthline/cling/support/igd/callback/GetExternalIP.java b/app/src/main/java/org/fourthline/cling/support/igd/callback/GetExternalIP.java deleted file mode 100644 index 08df5c5..0000000 --- a/app/src/main/java/org/fourthline/cling/support/igd/callback/GetExternalIP.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.igd.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; - -/** - * @author Christian Bauer - */ -public abstract class GetExternalIP extends ActionCallback { - - public GetExternalIP(Service service) { - super(new ActionInvocation(service.getAction("GetExternalIPAddress"))); - } - - @Override - public void success(ActionInvocation invocation) { - success((String)invocation.getOutput("NewExternalIPAddress").getValue()); - } - - protected abstract void success(String externalIPAddress); -} diff --git a/app/src/main/java/org/fourthline/cling/support/igd/callback/GetStatusInfo.java b/app/src/main/java/org/fourthline/cling/support/igd/callback/GetStatusInfo.java deleted file mode 100644 index 3a497a7..0000000 --- a/app/src/main/java/org/fourthline/cling/support/igd/callback/GetStatusInfo.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.igd.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.Connection; - -/** - * @author Christian Bauer - */ -public abstract class GetStatusInfo extends ActionCallback { - - public GetStatusInfo(Service service) { - super(new ActionInvocation(service.getAction("GetStatusInfo"))); - } - - @Override - public void success(ActionInvocation invocation) { - - try { - Connection.Status status = - Connection.Status.valueOf(invocation.getOutput("NewConnectionStatus").getValue().toString()); - - Connection.Error lastError = - Connection.Error.valueOf(invocation.getOutput("NewLastConnectionError").getValue().toString()); - - success(new Connection.StatusInfo(status, (UnsignedIntegerFourBytes) invocation.getOutput("NewUptime").getValue(), lastError)); - - } catch (Exception ex) { - invocation.setFailure( - new ActionException( - ErrorCode.ARGUMENT_VALUE_INVALID, - "Invalid status or last error string: " + ex, - ex - ) - ); - failure(invocation, null); - } - } - - protected abstract void success(Connection.StatusInfo statusInfo); -} diff --git a/app/src/main/java/org/fourthline/cling/support/igd/callback/PortMappingAdd.java b/app/src/main/java/org/fourthline/cling/support/igd/callback/PortMappingAdd.java deleted file mode 100644 index d61ccca..0000000 --- a/app/src/main/java/org/fourthline/cling/support/igd/callback/PortMappingAdd.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.igd.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.support.model.PortMapping; - -/** - * @author Christian Bauer - */ -public abstract class PortMappingAdd extends ActionCallback { - - final protected PortMapping portMapping; - - public PortMappingAdd(Service service, PortMapping portMapping) { - this(service, null, portMapping); - } - - protected PortMappingAdd(Service service, ControlPoint controlPoint, PortMapping portMapping) { - super(new ActionInvocation(service.getAction("AddPortMapping")), controlPoint); - - this.portMapping = portMapping; - - getActionInvocation().setInput("NewExternalPort", portMapping.getExternalPort()); - getActionInvocation().setInput("NewProtocol", portMapping.getProtocol()); - getActionInvocation().setInput("NewInternalClient", portMapping.getInternalClient()); - getActionInvocation().setInput("NewInternalPort", portMapping.getInternalPort()); - getActionInvocation().setInput("NewLeaseDuration", portMapping.getLeaseDurationSeconds()); - getActionInvocation().setInput("NewEnabled", portMapping.isEnabled()); - if (portMapping.hasRemoteHost()) - getActionInvocation().setInput("NewRemoteHost", portMapping.getRemoteHost()); - if (portMapping.hasDescription()) - getActionInvocation().setInput("NewPortMappingDescription", portMapping.getDescription()); - - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/igd/callback/PortMappingDelete.java b/app/src/main/java/org/fourthline/cling/support/igd/callback/PortMappingDelete.java deleted file mode 100644 index d6cc73c..0000000 --- a/app/src/main/java/org/fourthline/cling/support/igd/callback/PortMappingDelete.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.igd.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.controlpoint.ControlPoint; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.support.model.PortMapping; - -/** - * @author Christian Bauer - */ -public abstract class PortMappingDelete extends ActionCallback { - - final protected PortMapping portMapping; - - public PortMappingDelete(Service service, PortMapping portMapping) { - this(service, null, portMapping); - } - - protected PortMappingDelete(Service service, ControlPoint controlPoint, PortMapping portMapping) { - super(new ActionInvocation(service.getAction("DeletePortMapping")), controlPoint); - - this.portMapping = portMapping; - - getActionInvocation().setInput("NewExternalPort", portMapping.getExternalPort()); - getActionInvocation().setInput("NewProtocol", portMapping.getProtocol()); - if (portMapping.hasRemoteHost()) - getActionInvocation().setInput("NewRemoteHost", portMapping.getRemoteHost()); - - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/Event.java b/app/src/main/java/org/fourthline/cling/support/lastchange/Event.java deleted file mode 100644 index 431835f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/Event.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * @author Christian Bauer - */ -public class Event { - - protected List instanceIDs = new ArrayList(); - - public Event() { - } - - public Event(List instanceIDs) { - this.instanceIDs = instanceIDs; - } - - public List getInstanceIDs() { - return instanceIDs; - } - - public InstanceID getInstanceID(UnsignedIntegerFourBytes id) { - for (InstanceID instanceID : instanceIDs) { - if (instanceID.getId().equals(id)) return instanceID; - } - return null; - } - - public void clear() { - instanceIDs = new ArrayList(); - } - - public void setEventedValue(UnsignedIntegerFourBytes id, EventedValue ev) { - InstanceID instanceID = null; - for (InstanceID i : getInstanceIDs()) { - if (i.getId().equals(id)) { - instanceID = i; - } - } - if (instanceID == null) { - instanceID = new InstanceID(id); - getInstanceIDs().add(instanceID); - } - - Iterator it = instanceID.getValues().iterator(); - while (it.hasNext()) { - EventedValue existingEv = it.next(); - if (existingEv.getClass().equals(ev.getClass())) { - it.remove(); - } - } - instanceID.getValues().add(ev); - } - - public EV getEventedValue(UnsignedIntegerFourBytes id, Class type) { - for (InstanceID instanceID : getInstanceIDs()) { - if (instanceID.getId().equals(id)) { - for (EventedValue eventedValue : instanceID.getValues()) { - if (eventedValue.getClass().equals(type)) - return (EV) eventedValue; - } - } - } - return null; - } - - public boolean hasChanges() { - for (InstanceID instanceID : instanceIDs) { - if (instanceID.getValues().size() > 0) return true; - } - return false; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValue.java b/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValue.java deleted file mode 100644 index e189ffa..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValue.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.support.shared.AbstractMap; - -import java.util.Map; - -public abstract class EventedValue { - - final protected V value; - - public EventedValue(V value) { - this.value = value; - } - - public EventedValue(Map.Entry[] attributes) { - try { - this.value = valueOf(attributes); - } catch (InvalidValueException ex) { - throw new RuntimeException(ex); - } - } - - public String getName() { - return getClass().getSimpleName(); - } - - public V getValue() { - return value; - } - - public Map.Entry[] getAttributes() { - return new Map.Entry[] { - new AbstractMap.SimpleEntry("val", toString()) - }; - } - - protected V valueOf(Map.Entry[] attributes) throws InvalidValueException { - V v = null; - for (Map.Entry attribute : attributes) { - if (attribute.getKey().equals("val")) v = valueOf(attribute.getValue()); - } - return v; - } - - protected V valueOf(String s) throws InvalidValueException { - return (V)getDatatype().valueOf(s); - } - - @Override - public String toString() { - return getDatatype().getString(getValue()); - } - - abstract protected Datatype getDatatype(); -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueEnum.java b/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueEnum.java deleted file mode 100644 index 0fccb65..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueEnum.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.InvalidValueException; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public abstract class EventedValueEnum extends EventedValue { - - public EventedValueEnum(E e) { - super(e); - } - - public EventedValueEnum(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected E valueOf(String s) throws InvalidValueException { - return enumValueOf(s); - } - - protected abstract E enumValueOf(String s); - - @Override - public String toString() { - return getValue().name(); - } - - @Override - protected Datatype getDatatype() { - return null; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueEnumArray.java b/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueEnumArray.java deleted file mode 100644 index e9e16fe..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueEnumArray.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.InvalidValueException; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public abstract class EventedValueEnumArray extends EventedValue { - - public EventedValueEnumArray(E[] e) { - super(e); - } - - public EventedValueEnumArray(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected E[] valueOf(String s) throws InvalidValueException { - return enumValueOf(ModelUtil.fromCommaSeparatedList(s)); - } - - protected abstract E[] enumValueOf(String[] names); - - @Override - public String toString() { - return ModelUtil.toCommaSeparatedList(getValue()); - } - - @Override - protected Datatype getDatatype() { - return null; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueShort.java b/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueShort.java deleted file mode 100644 index 59347a8..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueShort.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.types.Datatype; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public class EventedValueShort extends EventedValue { - - public EventedValueShort(Short value) { - super(value); - } - - public EventedValueShort(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected Datatype getDatatype() { - return Datatype.Builtin.I2_SHORT.getDatatype(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueString.java b/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueString.java deleted file mode 100644 index 08b3bcf..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueString.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.types.Datatype; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public class EventedValueString extends EventedValue { - - public EventedValueString(String value) { - super(value); - } - - public EventedValueString(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected Datatype getDatatype() { - return Datatype.Builtin.STRING.getDatatype(); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueURI.java b/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueURI.java deleted file mode 100644 index 16b0b9f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueURI.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.InvalidValueException; -import org.seamless.util.Exceptions; - -import java.net.URI; -import java.util.Map; -import java.util.logging.Logger; - -/** - * @author Christian Bauer - */ -public class EventedValueURI extends EventedValue { - - final private static Logger log = Logger.getLogger(EventedValueURI.class.getName()); - - public EventedValueURI(URI value) { - super(value); - } - - public EventedValueURI(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected URI valueOf(String s) throws InvalidValueException { - try { - // These URIs are really defined as 'string' datatype in AVTransport1.0.pdf, but we can try - // to parse whatever devices give us, like the Roku which sends "unknown url". - return super.valueOf(s); - } catch (InvalidValueException ex) { - log.info("Ignoring invalid URI in evented value '" + s +"': " + Exceptions.unwrap(ex)); - return null; - } - } - - @Override - protected Datatype getDatatype() { - return Datatype.Builtin.URI.getDatatype(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueUnsignedIntegerFourBytes.java b/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueUnsignedIntegerFourBytes.java deleted file mode 100644 index c7d53a4..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueUnsignedIntegerFourBytes.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public class EventedValueUnsignedIntegerFourBytes extends EventedValue { - - public EventedValueUnsignedIntegerFourBytes(UnsignedIntegerFourBytes value) { - super(value); - } - - public EventedValueUnsignedIntegerFourBytes(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected Datatype getDatatype() { - return Datatype.Builtin.UI4.getDatatype(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueUnsignedIntegerTwoBytes.java b/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueUnsignedIntegerTwoBytes.java deleted file mode 100644 index faac490..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/EventedValueUnsignedIntegerTwoBytes.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.UnsignedIntegerTwoBytes; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public class EventedValueUnsignedIntegerTwoBytes extends EventedValue { - - public EventedValueUnsignedIntegerTwoBytes(UnsignedIntegerTwoBytes value) { - super(value); - } - - public EventedValueUnsignedIntegerTwoBytes(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected Datatype getDatatype() { - return Datatype.Builtin.UI2.getDatatype(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/InstanceID.java b/app/src/main/java/org/fourthline/cling/support/lastchange/InstanceID.java deleted file mode 100644 index d3bc795..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/InstanceID.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Christian Bauer - */ -public class InstanceID { - - protected UnsignedIntegerFourBytes id; - protected List values = new ArrayList(); - - public InstanceID(UnsignedIntegerFourBytes id) { - this(id, new ArrayList()); - } - - public InstanceID(UnsignedIntegerFourBytes id, List values) { - this.id = id; - this.values = values; - } - - public UnsignedIntegerFourBytes getId() { - return id; - } - - public List getValues() { - return values; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/LastChange.java b/app/src/main/java/org/fourthline/cling/support/lastchange/LastChange.java deleted file mode 100644 index 5a095d4..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/LastChange.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.beans.PropertyChangeSupport; -import java.util.ArrayList; -import java.util.List; - -/** - * Collects all state changes per logical instance. - *

- * This class is supposed to be used on a UPnP state variable field, - * on a RenderingControl or AVTransport service. The service then - * sets evented values whenever its state changes, and periodically - * (e.g. in a background loop) fires the "LastChange" XML content - * through its PropertyChangeSupport. (Where the ServiceManager picks - * it up and sends it to all subscribers.) - *

- *

- * The event subscriber can use this class to marshall the "LastChange" - * content, when the event XML is received. - *

- *

- * This class is thread-safe. - *

- * - * @author Christian Bauer - */ -public class LastChange { - - final private Event event; - final private LastChangeParser parser; - private String previousValue; - - public LastChange(String s) { - throw new UnsupportedOperationException("This constructor is only for service binding detection"); - } - - public LastChange(LastChangeParser parser, Event event) { - this.parser = parser; - this.event = event; - } - - public LastChange(LastChangeParser parser) { - this(parser, new Event()); - } - - public LastChange(LastChangeParser parser, String xml) throws Exception { - if (xml != null && xml.length() > 0) { - this.event = parser.parse(xml); - } else { - this.event = new Event(); - } - this.parser = parser; - } - - synchronized public void reset() { - previousValue = toString(); - event.clear(); - } - - synchronized public void setEventedValue(int instanceID, EventedValue... ev) { - setEventedValue(new UnsignedIntegerFourBytes(instanceID), ev); - } - - synchronized public void setEventedValue(UnsignedIntegerFourBytes instanceID, EventedValue... ev) { - for (EventedValue eventedValue : ev) { - if (eventedValue != null) - event.setEventedValue(instanceID, eventedValue); - - } - } - - synchronized public UnsignedIntegerFourBytes[] getInstanceIDs() { - List list = new ArrayList(); - for (InstanceID instanceID : event.getInstanceIDs()) { - list.add(instanceID.getId()); - } - return list.toArray(new UnsignedIntegerFourBytes[list.size()]); - } - - synchronized EventedValue[] getEventedValues(UnsignedIntegerFourBytes instanceID) { - InstanceID inst = event.getInstanceID(instanceID); - return inst != null ? inst.getValues().toArray(new EventedValue[inst.getValues().size()]) : null; - } - - synchronized public EV getEventedValue(int instanceID, Class type) { - return getEventedValue(new UnsignedIntegerFourBytes(instanceID), type); - } - - synchronized public EV getEventedValue(UnsignedIntegerFourBytes id, Class type) { - return event.getEventedValue(id, type); - } - - synchronized public void fire(PropertyChangeSupport propertyChangeSupport) { - String lastChanges = toString(); - if (lastChanges != null && lastChanges.length() > 0) { - propertyChangeSupport.firePropertyChange("LastChange", previousValue, lastChanges); - reset(); - } - } - - @Override - synchronized public String toString() { - if (!event.hasChanges()) return ""; - try { - return parser.generate(event); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeAwareServiceManager.java b/app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeAwareServiceManager.java deleted file mode 100644 index 33c5162..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeAwareServiceManager.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.DefaultServiceManager; -import org.fourthline.cling.model.meta.LocalService; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.state.StateVariableValue; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.util.ArrayList; -import java.util.Collection; - -/** - * Handles the "initial" event state for GENA subscriptions to services using LastChange. - *

- * When a GENA subscription is made on your AVTransport/RenderingControl service, you have to - * read the initial state of the service. Ususally Cling would do this for you and simply - * access all the state variables of your service behind the scenes. But the - * AVTransport/RenderingControl service doesn't use regular UPnP state variable eventing - * internally, they rely on the awful "LastChange" mechanism for their "logical" instances. - *

- *

- * Use this {@link org.fourthline.cling.model.ServiceManager} instead of the default one for - * these services. - *

- * - * @author Christian Bauer - */ -public class LastChangeAwareServiceManager extends DefaultServiceManager { - - final protected LastChangeParser lastChangeParser; - - public LastChangeAwareServiceManager(LocalService localService, - LastChangeParser lastChangeParser) { - this(localService, null, lastChangeParser); - } - - public LastChangeAwareServiceManager(LocalService localService, - Class serviceClass, - LastChangeParser lastChangeParser) { - super(localService, serviceClass); - this.lastChangeParser = lastChangeParser; - } - - protected LastChangeParser getLastChangeParser() { - return lastChangeParser; - } - - /** - * Call this method to propagate all accumulated "LastChange" values to GENA subscribers. - */ - public void fireLastChange() { - - // We need to obtain locks in the right order to avoid deadlocks: - // 1. The lock() of the DefaultServiceManager - // 2. The monitor/synchronized of the LastChange.fire() method - - lock(); - try { - getImplementation().getLastChange().fire(getPropertyChangeSupport()); - } finally { - unlock(); - } - } - - @Override - protected Collection readInitialEventedStateVariableValues() throws Exception { - - // We don't use the service's internal LastChange but a fresh new one just for - // this initial event. Modifying the internal one would trigger event notification's - // to other subscribers! - LastChange lc = new LastChange(getLastChangeParser()); - - // Get the current "logical" instances of the service - UnsignedIntegerFourBytes[] ids = getImplementation().getCurrentInstanceIds(); - if (ids.length > 0) { - for (UnsignedIntegerFourBytes instanceId : ids) { - // Iterate through all "logical" instances and ask them what their state is - getImplementation().appendCurrentState(lc, instanceId); - } - } else { - // Use the default "logical" instance with ID 0 - getImplementation().appendCurrentState(lc, new UnsignedIntegerFourBytes(0)); - } - - // Sum it all up and return it in the initial event to the GENA subscriber - StateVariable variable = getService().getStateVariable("LastChange"); - Collection values = new ArrayList(); - values.add(new StateVariableValue(variable, lc.toString())); - return values; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeDelegator.java b/app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeDelegator.java deleted file mode 100644 index 8503c34..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeDelegator.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -/** - * Any service implementation using the "LastChange" mechanism. - *

- * Required by the {@link LastChangeAwareServiceManager} to handle state readouts - * of "LastChange"-using services for initial events GENA subscriptions. If you - * want a specification compliant AVTransport or RenderingControl - * UPnP service, your service implementation should implement this interface as well. - *

- * - * @author Christian Bauer - */ -public interface LastChangeDelegator { - - public LastChange getLastChange(); - - public void appendCurrentState(LastChange lc, UnsignedIntegerFourBytes instanceId) throws Exception; - - public abstract UnsignedIntegerFourBytes[] getCurrentInstanceIds(); - - -} diff --git a/app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeParser.java b/app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeParser.java deleted file mode 100644 index f933f8b..0000000 --- a/app/src/main/java/org/fourthline/cling/support/lastchange/LastChangeParser.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.lastchange; - -import static org.fourthline.cling.model.XMLUtil.appendNewElement; - -import java.io.InputStream; -import java.io.StringReader; -import java.lang.reflect.Constructor; -import java.util.Collections; -import java.util.Map; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.xml.parsers.DocumentBuilderFactory; - -import org.fourthline.cling.model.XMLUtil; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.shared.AbstractMap; -import org.seamless.util.io.IO; -import org.seamless.util.Exceptions; -import org.seamless.xml.DOMParser; -import org.seamless.xml.SAXParser; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -/** - * Reads and writes the "LastChange" XML content. - *

- * Validates against a schema if the {@link #getSchemaSources()} method - * doesn't return null. - *

- * - * @author Christian Bauer - */ -public abstract class LastChangeParser extends SAXParser { - - final private static Logger log = Logger.getLogger(LastChangeParser.class.getName()); - - public enum CONSTANTS { - Event, - InstanceID, - val; - - public boolean equals(String s) { - return this.name().equals(s); - } - } - - abstract protected String getNamespace(); - - protected Set> getEventedVariables() { - return Collections.EMPTY_SET; - } - - protected EventedValue createValue(String name, Map.Entry[] attributes) throws Exception { - for (Class evType : getEventedVariables()) { - if (evType.getSimpleName().equals(name)) { - Constructor ctor = evType.getConstructor(Map.Entry[].class); - return ctor.newInstance(new Object[]{attributes}); - } - } - return null; - } - - /** - * Uses the current thread's context classloader to read and unmarshall the given resource. - * - * @param resource The resource on the classpath. - * @return The unmarshalled Event model. - * @throws Exception - */ - public Event parseResource(String resource) throws Exception { - InputStream is = null; - try { - is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource); - return parse(IO.readLines(is)); - } finally { - if (is != null) is.close(); - } - } - - public Event parse(String xml) throws Exception { - - if (xml == null || xml.length() == 0) { - throw new RuntimeException("Null or empty XML"); - } - - Event event = new Event(); - new RootHandler(event, this); - - if (log.isLoggable(Level.FINE)) { - log.fine("Parsing 'LastChange' event XML content"); - log.fine("===================================== 'LastChange' BEGIN ============================================"); - log.fine(xml); - log.fine("====================================== 'LastChange' END ============================================"); - } - parse(new InputSource(new StringReader(xml))); - - log.fine("Parsed event with instances IDs: " + event.getInstanceIDs().size()); - if (log.isLoggable(Level.FINEST)) { - for (InstanceID instanceID : event.getInstanceIDs()) { - log.finest("InstanceID '" + instanceID.getId() + "' has values: " + instanceID.getValues().size()); - for (EventedValue eventedValue : instanceID.getValues()) { - log.finest(eventedValue.getName() + " => " + eventedValue.getValue()); - } - } - } - - return event; - } - - class RootHandler extends SAXParser.Handler { - - RootHandler(Event instance, SAXParser parser) { - super(instance, parser); - } - - RootHandler(Event instance) { - super(instance); - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - super.startElement(uri, localName, qName, attributes); - if (CONSTANTS.InstanceID.equals(localName)) { - String valAttr = attributes.getValue(CONSTANTS.val.name()); - if (valAttr != null) { - InstanceID instanceID = new InstanceID(new UnsignedIntegerFourBytes(valAttr)); - getInstance().getInstanceIDs().add(instanceID); - new InstanceIDHandler(instanceID, this); - } - } - } - } - - class InstanceIDHandler extends SAXParser.Handler { - - InstanceIDHandler(InstanceID instance, SAXParser.Handler parent) { - super(instance, parent); - } - - @Override - public void startElement(String uri, String localName, String qName, final Attributes attributes) throws SAXException { - super.startElement(uri, localName, qName, attributes); - Map.Entry[] attributeMap = new Map.Entry[attributes.getLength()]; - for (int i = 0; i < attributeMap.length; i++) { - attributeMap[i] = - new AbstractMap.SimpleEntry( - attributes.getLocalName(i), - attributes.getValue(i) - ); - } - try { - EventedValue esv = createValue(localName, attributeMap); - if (esv != null) - getInstance().getValues().add(esv); - } catch (Exception ex) { - // Don't exit, just log a warning - log.warning("Error reading event XML, ignoring value: " + Exceptions.unwrap(ex)); - } - } - - @Override - protected boolean isLastElement(String uri, String localName, String qName) { - return CONSTANTS.InstanceID.equals(localName); - } - } - - public String generate(Event event) throws Exception { - return XMLUtil.documentToFragmentString(buildDOM(event)); - } - - protected Document buildDOM(Event event) throws Exception { - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - - Document d = factory.newDocumentBuilder().newDocument(); - generateRoot(event, d); - - return d; - } - - protected void generateRoot(Event event, Document descriptor) { - Element eventElement = descriptor.createElementNS(getNamespace(), CONSTANTS.Event.name()); - descriptor.appendChild(eventElement); - generateInstanceIDs(event, descriptor, eventElement); - } - - protected void generateInstanceIDs(Event event, Document descriptor, Element rootElement) { - for (InstanceID instanceID : event.getInstanceIDs()) { - if (instanceID.getId() == null) continue; - Element instanceIDElement = appendNewElement(descriptor, rootElement, CONSTANTS.InstanceID.name()); - instanceIDElement.setAttribute(CONSTANTS.val.name(), instanceID.getId().toString()); - - for (EventedValue eventedValue : instanceID.getValues()) { - generateEventedValue(eventedValue, descriptor, instanceIDElement); - } - } - } - - protected void generateEventedValue(EventedValue eventedValue, Document descriptor, Element parentElement) { - String name = eventedValue.getName(); - Map.Entry[] attributes = eventedValue.getAttributes(); - if (attributes != null && attributes.length > 0) { - Element evElement = appendNewElement(descriptor, parentElement, name); - for (Map.Entry attr : attributes) { - evElement.setAttribute(attr.getKey(), DOMParser.escape(attr.getValue())); - } - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/AddMessage.java b/app/src/main/java/org/fourthline/cling/support/messagebox/AddMessage.java deleted file mode 100644 index 4d5d45f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/AddMessage.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.support.messagebox.model.Message; -import org.seamless.util.MimeType; - -/** - * @author Christian Bauer - */ -public abstract class AddMessage extends ActionCallback { - - final protected MimeType mimeType = MimeType.valueOf("text/xml;charset=\"utf-8\""); - - public AddMessage(Service service, Message message) { - super(new ActionInvocation(service.getAction("AddMessage"))); - - getActionInvocation().setInput("MessageID", Integer.toString(message.getId())); - getActionInvocation().setInput("MessageType", mimeType.toString()); - getActionInvocation().setInput("Message", message.toString()); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/RemoveMessage.java b/app/src/main/java/org/fourthline/cling/support/messagebox/RemoveMessage.java deleted file mode 100644 index b94661a..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/RemoveMessage.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.support.messagebox.model.Message; - -/** - * ATTENTION: My Samsung TV does not implement this! - * - * @author Christian Bauer - */ -public abstract class RemoveMessage extends ActionCallback { - - public RemoveMessage(Service service, Message message) { - this(service, message.getId()); - } - - public RemoveMessage(Service service, int id) { - super(new ActionInvocation(service.getAction("RemoveMessage"))); - getActionInvocation().setInput("MessageID", id); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/model/DateTime.java b/app/src/main/java/org/fourthline/cling/support/messagebox/model/DateTime.java deleted file mode 100644 index 0780178..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/model/DateTime.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox.model; - -import org.fourthline.cling.support.messagebox.parser.MessageElement; - -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * @author Christian Bauer - */ -public class DateTime implements ElementAppender { - - final private String date; - final private String time; - - public DateTime() { - this(getCurrentDate(), getCurrentTime()); - } - - public DateTime(String date, String time) { - this.date = date; - this.time = time; - } - - public String getDate() { - return date; - } - - public String getTime() { - return time; - } - - public void appendMessageElements(MessageElement parent) { - parent.createChild("Date").setContent(getDate()); - parent.createChild("Time").setContent(getTime()); - } - - public static String getCurrentDate() { - SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); - return fmt.format(new Date()); - } - - public static String getCurrentTime() { - SimpleDateFormat fmt = new SimpleDateFormat("HH:mm:ss"); - return fmt.format(new Date()); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/model/ElementAppender.java b/app/src/main/java/org/fourthline/cling/support/messagebox/model/ElementAppender.java deleted file mode 100644 index 9f5d63b..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/model/ElementAppender.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox.model; - -import org.fourthline.cling.support.messagebox.parser.MessageElement; - -/** - * @author Christian Bauer - */ -public interface ElementAppender { - - public void appendMessageElements(MessageElement parent); - -} diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/model/Message.java b/app/src/main/java/org/fourthline/cling/support/messagebox/model/Message.java deleted file mode 100644 index 1bc6335..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/model/Message.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox.model; - -import org.fourthline.cling.support.messagebox.parser.MessageDOM; -import org.fourthline.cling.support.messagebox.parser.MessageDOMParser; -import org.fourthline.cling.support.messagebox.parser.MessageElement; -import org.seamless.xml.ParserException; - -import java.util.Random; - -/** - * https://sourceforge.net/apps/mediawiki/samygo/index.php?title=MessageBoxService_request_format - * - * @author Christian Bauer - */ -public abstract class Message implements ElementAppender { - - final protected Random randomGenerator = new Random(); - - public enum Category { - SMS("SMS"), - INCOMING_CALL("Incoming Call"), - SCHEDULE_REMINDER("Schedule Reminder"); - - public String text; - - Category(String text) { - this.text = text; - } - } - - public enum DisplayType { - - MINIMUM("Minimum"), - MAXIMUM("Maximum"); - - public String text; - - DisplayType(String text) { - this.text = text; - } - } - - private final int id; - private final Category category; - private DisplayType displayType; - - public Message(Category category, DisplayType displayType) { - this(0, category, displayType); - } - - public Message(int id, Category category, DisplayType displayType) { - if (id == 0) id = randomGenerator.nextInt(Integer.MAX_VALUE); - this.id = id; - this.category = category; - this.displayType = displayType; - } - - public int getId() { - return id; - } - - public Category getCategory() { - return category; - } - - public DisplayType getDisplayType() { - return displayType; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Message message = (Message) o; - - if (id != message.id) return false; - - return true; - } - - @Override - public int hashCode() { - return id; - } - - @Override - public String toString() { - try { - MessageDOMParser mp = new MessageDOMParser(); - MessageDOM dom = mp.createDocument(); - - MessageElement root = dom.createRoot(mp.createXPath(), "Message"); - root.createChild("Category").setContent(getCategory().text); - root.createChild("DisplayType").setContent(getDisplayType().text); - appendMessageElements(root); - - String s = mp.print(dom, 0, false); - - // Cut the root element, what we send to the TV is not really XML, just - // random element soup which I'm sure the Samsung guys think is XML... - return s.replaceAll("", "") - .replaceAll("", ""); - - - } catch (ParserException ex) { - throw new RuntimeException(ex); - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageIncomingCall.java b/app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageIncomingCall.java deleted file mode 100644 index 59e3b3d..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageIncomingCall.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox.model; - -import org.fourthline.cling.support.messagebox.parser.MessageElement; - -/** - * @author Christian Bauer - */ -public class MessageIncomingCall extends Message { - - final private DateTime callTime; - final private NumberName callee; - final private NumberName caller; - - public MessageIncomingCall(NumberName callee, NumberName caller) { - this(new DateTime(), callee, caller); - } - - public MessageIncomingCall(DateTime callTime, NumberName callee, NumberName caller) { - this(DisplayType.MAXIMUM, callTime, callee, caller); - } - - public MessageIncomingCall(DisplayType displayType, DateTime callTime, NumberName callee, NumberName caller) { - super(Category.INCOMING_CALL, displayType); - this.callTime = callTime; - this.callee = callee; - this.caller = caller; - } - - public DateTime getCallTime() { - return callTime; - } - - public NumberName getCallee() { - return callee; - } - - public NumberName getCaller() { - return caller; - } - - public void appendMessageElements(MessageElement parent) { - getCallTime().appendMessageElements(parent.createChild("CallTime")); - getCallee().appendMessageElements(parent.createChild("Callee")); - getCaller().appendMessageElements(parent.createChild("Caller")); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageSMS.java b/app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageSMS.java deleted file mode 100644 index 1a6cea0..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageSMS.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox.model; - -import org.fourthline.cling.support.messagebox.parser.MessageElement; - -/** - * Sender and body will only be displayed if display type is set to "Maximum". - * - * @author Christian Bauer - */ -public class MessageSMS extends Message { - - final private DateTime receiveTime; - final private NumberName receiver; - final private NumberName sender; - final private String body; - - public MessageSMS(NumberName receiver, NumberName sender, String body) { - this(new DateTime(), receiver, sender, body); - } - - public MessageSMS(DateTime receiveTime, NumberName receiver, NumberName sender, String body) { - this(Message.DisplayType.MAXIMUM, receiveTime, receiver, sender, body); - } - - public MessageSMS(DisplayType displayType, DateTime receiveTime, NumberName receiver, NumberName sender, String body) { - super(Message.Category.SMS, displayType); - this.receiveTime = receiveTime; - this.receiver = receiver; - this.sender = sender; - this.body = body; - } - - public DateTime getReceiveTime() { - return receiveTime; - } - - public NumberName getReceiver() { - return receiver; - } - - public NumberName getSender() { - return sender; - } - - public String getBody() { - return body; - } - - public void appendMessageElements(MessageElement parent) { - getReceiveTime().appendMessageElements(parent.createChild("ReceiveTime")); - getReceiver().appendMessageElements(parent.createChild("Receiver")); - getSender().appendMessageElements(parent.createChild("Sender")); - parent.createChild("Body").setContent(getBody()); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageScheduleReminder.java b/app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageScheduleReminder.java deleted file mode 100644 index 6af2c14..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/model/MessageScheduleReminder.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox.model; - -import org.fourthline.cling.support.messagebox.parser.MessageElement; - -/** - * @author Christian Bauer - */ -public class MessageScheduleReminder extends Message { - - final private DateTime startTime; - final private NumberName owner; - final private String subject; - final private DateTime endTime; - final private String location; - final private String body; - - public MessageScheduleReminder(DateTime startTime, NumberName owner, String subject, - DateTime endTime, String location, String body) { - this(DisplayType.MAXIMUM, startTime, owner, subject, endTime, location, body); - } - - public MessageScheduleReminder(DisplayType displayType, DateTime startTime, NumberName owner, String subject, - DateTime endTime, String location, String body) { - super(Category.SCHEDULE_REMINDER, displayType); - this.startTime = startTime; - this.owner = owner; - this.subject = subject; - this.endTime = endTime; - this.location = location; - this.body = body; - } - - public DateTime getStartTime() { - return startTime; - } - - public NumberName getOwner() { - return owner; - } - - public String getSubject() { - return subject; - } - - public DateTime getEndTime() { - return endTime; - } - - public String getLocation() { - return location; - } - - public String getBody() { - return body; - } - - public void appendMessageElements(MessageElement parent) { - getStartTime().appendMessageElements(parent.createChild("StartTime")); - getOwner().appendMessageElements(parent.createChild("Owner")); - parent.createChild("Subject").setContent(getSubject()); - getEndTime().appendMessageElements(parent.createChild("EndTime")); - parent.createChild("Location").setContent(getLocation()); - parent.createChild("Body").setContent(getBody()); - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/model/NumberName.java b/app/src/main/java/org/fourthline/cling/support/messagebox/model/NumberName.java deleted file mode 100644 index f7d6edb..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/model/NumberName.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox.model; - -import org.fourthline.cling.support.messagebox.parser.MessageElement; - -/** - * @author Christian Bauer - */ -public class NumberName implements ElementAppender { - - private String number; - private String name; - - public NumberName(String number, String name) { - this.number = number; - this.name = name; - } - - public String getNumber() { - return number; - } - - public String getName() { - return name; - } - - public void appendMessageElements(MessageElement parent) { - parent.createChild("Number").setContent(getNumber()); - parent.createChild("Name").setContent(getName()); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageDOM.java b/app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageDOM.java deleted file mode 100644 index d2319e2..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageDOM.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox.parser; - -import org.seamless.xml.DOM; -import org.w3c.dom.Document; - -import javax.xml.xpath.XPath; - -/** - * @author Christian Bauer - */ -public class MessageDOM extends DOM { - - public static final String NAMESPACE_URI = "urn:samsung-com:messagebox-1-0"; - - public MessageDOM(Document dom) { - super(dom); - } - - @Override - public String getRootElementNamespace() { - return NAMESPACE_URI; - } - - @Override - public MessageElement getRoot(XPath xPath) { - return new MessageElement(xPath, getW3CDocument().getDocumentElement()); - } - - @Override - public MessageDOM copy() { - return new MessageDOM((Document) getW3CDocument().cloneNode(true)); - } - - public MessageElement createRoot(XPath xpath, String element) { - super.createRoot(element); - return getRoot(xpath); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageDOMParser.java b/app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageDOMParser.java deleted file mode 100644 index 3a316f3..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageDOMParser.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox.parser; - -import org.seamless.xml.DOMParser; -import org.seamless.xml.NamespaceContextMap; -import org.w3c.dom.Document; - -import javax.xml.xpath.XPath; - -/** - * @author Christian Bauer - */ -public class MessageDOMParser extends DOMParser { - - @Override - protected MessageDOM createDOM(Document document) { - return new MessageDOM(document); - } - - public NamespaceContextMap createDefaultNamespaceContext(String... optionalPrefixes) { - NamespaceContextMap ctx = new NamespaceContextMap() { - @Override - protected String getDefaultNamespaceURI() { - return MessageDOM.NAMESPACE_URI; - } - }; - for (String optionalPrefix : optionalPrefixes) { - ctx.put(optionalPrefix, MessageDOM.NAMESPACE_URI); - } - return ctx; - } - - public XPath createXPath() { - return super.createXPath(createDefaultNamespaceContext(MessageElement.XPATH_PREFIX)); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageElement.java b/app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageElement.java deleted file mode 100644 index 95ef11a..0000000 --- a/app/src/main/java/org/fourthline/cling/support/messagebox/parser/MessageElement.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.messagebox.parser; - -import org.seamless.xml.DOMElement; -import org.w3c.dom.Element; - -import javax.xml.xpath.XPath; - -/** - * @author Christian Bauer - */ -public class MessageElement extends DOMElement { - - public static final String XPATH_PREFIX = "m"; - - public MessageElement(XPath xpath, Element element) { - super(xpath, element); - } - - @Override - protected String prefix(String localName) { - return XPATH_PREFIX + ":" + localName; - } - - @Override - protected Builder createParentBuilder(DOMElement el) { - return new Builder(el) { - @Override - public MessageElement build(Element element) { - return new MessageElement(getXpath(), element); - } - }; - } - - @Override - protected ArrayBuilder createChildBuilder(DOMElement el) { - return new ArrayBuilder(el) { - @Override - public MessageElement[] newChildrenArray(int length) { - return new MessageElement[length]; - } - - @Override - public MessageElement build(Element element) { - return new MessageElement(getXpath(), element); - } - }; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/AVTransport.java b/app/src/main/java/org/fourthline/cling/support/model/AVTransport.java deleted file mode 100644 index e3e953c..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/AVTransport.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.lastchange.LastChange; - -/** - * State of one logical instance of the AV Transport service. - * - * @author Christian Bauer - */ -public class AVTransport { - - final protected UnsignedIntegerFourBytes instanceID; - final protected LastChange lastChange; - protected MediaInfo mediaInfo; - protected TransportInfo transportInfo; - protected PositionInfo positionInfo; - protected DeviceCapabilities deviceCapabilities; - protected TransportSettings transportSettings; - - public AVTransport(UnsignedIntegerFourBytes instanceID, LastChange lastChange, StorageMedium possiblePlayMedium) { - this(instanceID, lastChange, new StorageMedium[]{possiblePlayMedium}); - } - - public AVTransport(UnsignedIntegerFourBytes instanceID, LastChange lastChange, StorageMedium[] possiblePlayMedia) { - this.instanceID = instanceID; - this.lastChange = lastChange; - setDeviceCapabilities(new DeviceCapabilities(possiblePlayMedia)); - setMediaInfo(new MediaInfo()); - setTransportInfo(new TransportInfo()); - setPositionInfo(new PositionInfo()); - setTransportSettings(new TransportSettings()); - } - - public UnsignedIntegerFourBytes getInstanceId() { - return instanceID; - } - - public LastChange getLastChange() { - return lastChange; - } - - public MediaInfo getMediaInfo() { - return mediaInfo; - } - - public void setMediaInfo(MediaInfo mediaInfo) { - this.mediaInfo = mediaInfo; - } - - public TransportInfo getTransportInfo() { - return transportInfo; - } - - public void setTransportInfo(TransportInfo transportInfo) { - this.transportInfo = transportInfo; - } - - public PositionInfo getPositionInfo() { - return positionInfo; - } - - public void setPositionInfo(PositionInfo positionInfo) { - this.positionInfo = positionInfo; - } - - public DeviceCapabilities getDeviceCapabilities() { - return deviceCapabilities; - } - - public void setDeviceCapabilities(DeviceCapabilities deviceCapabilities) { - this.deviceCapabilities = deviceCapabilities; - } - - public TransportSettings getTransportSettings() { - return transportSettings; - } - - public void setTransportSettings(TransportSettings transportSettings) { - this.transportSettings = transportSettings; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/BrowseFlag.java b/app/src/main/java/org/fourthline/cling/support/model/BrowseFlag.java deleted file mode 100644 index 631306f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/BrowseFlag.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * @author Alessio Gaeta - * @author Christian Bauer - */ -public enum BrowseFlag { - - METADATA("BrowseMetadata"), - DIRECT_CHILDREN("BrowseDirectChildren"); - - private String protocolString; - - BrowseFlag(String protocolString) { - this.protocolString = protocolString; - } - - @Override - public String toString() { - return protocolString; - } - - public static BrowseFlag valueOrNullOf(String s) { - for (BrowseFlag browseFlag : values()) { - if (browseFlag.toString().equals(s)) - return browseFlag; - } - return null; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/BrowseResult.java b/app/src/main/java/org/fourthline/cling/support/model/BrowseResult.java deleted file mode 100644 index 825fcce..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/BrowseResult.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -/** - * @author Alessio Gaeta - * @author Christian Bauer - */ -public class BrowseResult { - - protected String result; - protected UnsignedIntegerFourBytes count; - protected UnsignedIntegerFourBytes totalMatches; - protected UnsignedIntegerFourBytes containerUpdateID; - - public BrowseResult(String result, UnsignedIntegerFourBytes count, - UnsignedIntegerFourBytes totalMatches, - UnsignedIntegerFourBytes containerUpdateID) { - this.result = result; - this.count = count; - this.totalMatches = totalMatches; - this.containerUpdateID = containerUpdateID; - } - - public BrowseResult(String result, long count, long totalMatches) { - this(result, count, totalMatches, 0); - } - - public BrowseResult(String result, long count, long totalMatches, long updatedId) { - this( - result, - new UnsignedIntegerFourBytes(count), - new UnsignedIntegerFourBytes(totalMatches), - new UnsignedIntegerFourBytes(updatedId) - ); - } - - public String getResult() { - return result; - } - - public UnsignedIntegerFourBytes getCount() { - return count; - } - - public long getCountLong() { - return count.getValue(); - } - - public UnsignedIntegerFourBytes getTotalMatches() { - return totalMatches; - } - - public long getTotalMatchesLong() { - return totalMatches.getValue(); - } - - public UnsignedIntegerFourBytes getContainerUpdateID() { - return containerUpdateID; - } - - public long getContainerUpdateIDLong() { - return containerUpdateID.getValue(); - } - - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/Channel.java b/app/src/main/java/org/fourthline/cling/support/model/Channel.java deleted file mode 100644 index ec71615..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/Channel.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * - */ -public enum Channel { - Master, - LF, - RF, - CF, - LFE, - LS, - RS, - LFC, - RFC, - SD, - SL, - SR, - T -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/Connection.java b/app/src/main/java/org/fourthline/cling/support/model/Connection.java deleted file mode 100644 index 3f7cc7a..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/Connection.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -/** - * @author Christian Bauer - */ -public class Connection { - - static public class StatusInfo { - - private Status status; - private long uptimeSeconds; - private Error lastError; - - public StatusInfo(Status status, UnsignedIntegerFourBytes uptime, Error lastError) { - this(status, uptime.getValue(), lastError); - } - - public StatusInfo(Status status, long uptimeSeconds, Error lastError) { - this.status = status; - this.uptimeSeconds = uptimeSeconds; - this.lastError = lastError; - } - - public Status getStatus() { - return status; - } - - public long getUptimeSeconds() { - return uptimeSeconds; - } - - public UnsignedIntegerFourBytes getUptime() { - return new UnsignedIntegerFourBytes(getUptimeSeconds()); - } - - public Error getLastError() { - return lastError; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - StatusInfo that = (StatusInfo) o; - - if (uptimeSeconds != that.uptimeSeconds) return false; - if (lastError != that.lastError) return false; - if (status != that.status) return false; - - return true; - } - - @Override - public int hashCode() { - int result = status.hashCode(); - result = 31 * result + (int) (uptimeSeconds ^ (uptimeSeconds >>> 32)); - result = 31 * result + lastError.hashCode(); - return result; - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") " + getStatus(); - } - } - - public enum Type { - /** - * Valid connection types cannot be identified. - */ - Unconfigured, - - /** - * The Internet Gateway is an IP router between the LAN and the WAN connection. - */ - IP_Routed, - - /** - * The Internet Gateway is an Ethernet bridge between the LAN and the WAN connection. - */ - IP_Bridged - } - - public enum Status { - /** - * This value indicates that other variables in the service table are - * uninitialized or in an invalid state. - */ - Unconfigured, - - /** - * The WANConnectionDevice is in the process of initiating a connection - * for the first time after the connection became disconnected. - */ - Connecting, - - /** - * At least one client has successfully - * initiated an Internet connection using this instance. - */ - Connected, - - /** - * The connection is active (packets are allowed to flow - * through), but will transition to Disconnecting state after a certain period. - */ - PendingDisconnect, - - /** - * The WANConnectionDevice is in the process of terminating a connection. - * On successful termination, ConnectionStatus transitions to Disconnected. - */ - Disconnecting, - - /** - * No ISP connection is active (or being activated) from this connection - * instance. No packets are transiting the gateway. - */ - Disconnected - } - - public enum Error { - ERROR_NONE, - ERROR_COMMAND_ABORTED, - ERROR_NOT_ENABLED_FOR_INTERNET, - ERROR_USER_DISCONNECT, - ERROR_ISP_DISCONNECT, - ERROR_IDLE_DISCONNECT, - ERROR_FORCED_DISCONNECT, - ERROR_NO_CARRIER, - ERROR_IP_CONFIGURATION, - ERROR_UNKNOWN - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/ConnectionInfo.java b/app/src/main/java/org/fourthline/cling/support/model/ConnectionInfo.java deleted file mode 100644 index fd0b9fb..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/ConnectionInfo.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.ServiceReference; - -/** - * Immutable type encapsulating the state of a single connection. - * - * @author Alessio Gaeta - * @author Christian Bauer - */ -public class ConnectionInfo { - - public enum Status { - OK, - ContentFormatMismatch, - InsufficientBandwidth, - UnreliableChannel, - Unknown - } - - public enum Direction { - Output, - Input; - - public Direction getOpposite() { - return this.equals(Output) ? Input : Output; - } - - } - - final protected int connectionID; - - final protected int rcsID; - final protected int avTransportID; - - final protected ProtocolInfo protocolInfo; - - final protected ServiceReference peerConnectionManager; - final protected int peerConnectionID; - - final protected Direction direction; - protected Status connectionStatus = Status.Unknown; - - /** - * Creates a default instance with values expected for the default connection ID "0". - *

- * The ConnectionManager 1.0 specification says: - *

- *

- * If optional action PrepareForConnection is not implemented then (limited) connection - * information can be retrieved for ConnectionID 0. The device should return all known - * information: - *

- *
    - *
  • RcsID should be 0 or -1
  • - *
  • AVTransportID should be 0 or -1
  • - *
  • ProtocolInfo should contain accurate information if it is known, otherwhise - * it should be NULL (empty string)
  • - *
  • PeerConnectionManager should be NULL (empty string)
  • - *
  • PeerConnectionID should be -1
  • - *
  • Direction should be Input or Output
  • - *
  • Status should be OK or Unknown
  • - *
- */ - public ConnectionInfo() { - this(0, 0, 0, null, null, -1, Direction.Input, Status.Unknown); - } - - - public ConnectionInfo(int connectionID, - int rcsID, int avTransportID, - ProtocolInfo protocolInfo, - ServiceReference peerConnectionManager, int peerConnectionID, - Direction direction, Status connectionStatus) { - this.connectionID = connectionID; - this.rcsID = rcsID; - this.avTransportID = avTransportID; - this.protocolInfo = protocolInfo; - this.peerConnectionManager = peerConnectionManager; - this.peerConnectionID = peerConnectionID; - this.direction = direction; - this.connectionStatus = connectionStatus; - } - - public int getConnectionID() { - return connectionID; - } - - public int getRcsID() { - return rcsID; - } - - public int getAvTransportID() { - return avTransportID; - } - - public ProtocolInfo getProtocolInfo() { - return protocolInfo; - } - - public ServiceReference getPeerConnectionManager() { - return peerConnectionManager; - } - - public int getPeerConnectionID() { - return peerConnectionID; - } - - public Direction getDirection() { - return direction; - } - - synchronized public Status getConnectionStatus() { - return connectionStatus; - } - - synchronized public void setConnectionStatus(Status connectionStatus) { - this.connectionStatus = connectionStatus; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ConnectionInfo that = (ConnectionInfo) o; - - if (avTransportID != that.avTransportID) return false; - if (connectionID != that.connectionID) return false; - if (peerConnectionID != that.peerConnectionID) return false; - if (rcsID != that.rcsID) return false; - if (connectionStatus != that.connectionStatus) return false; - if (direction != that.direction) return false; - if (peerConnectionManager != null ? !peerConnectionManager.equals(that.peerConnectionManager) : that.peerConnectionManager != null) - return false; - if (protocolInfo != null ? !protocolInfo.equals(that.protocolInfo) : that.protocolInfo != null) return false; - - return true; - } - - @Override - public int hashCode() { - int result = connectionID; - result = 31 * result + rcsID; - result = 31 * result + avTransportID; - result = 31 * result + (protocolInfo != null ? protocolInfo.hashCode() : 0); - result = 31 * result + (peerConnectionManager != null ? peerConnectionManager.hashCode() : 0); - result = 31 * result + peerConnectionID; - result = 31 * result + direction.hashCode(); - result = 31 * result + connectionStatus.hashCode(); - return result; - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") ID: " + getConnectionID() + ", Status: " + getConnectionStatus(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/DIDLAttribute.java b/app/src/main/java/org/fourthline/cling/support/model/DIDLAttribute.java deleted file mode 100644 index 1116907..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/DIDLAttribute.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * - * @author Christian Bauer - * @author Mario Franco - */ -public class DIDLAttribute { - - private String namespaceURI; - private String prefix; - private String value; - - public DIDLAttribute(String namespaceURI, String prefix, String value) { - this.namespaceURI = namespaceURI; - this.prefix = prefix; - this.value = value; - } - /** - * @return the namespaceURI - */ - public String getNamespaceURI() { - return namespaceURI; - } - - /** - * @return the prefix - */ - public String getPrefix() { - return prefix; - } - - /** - * @return the value - */ - public String getValue() { - return value; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/DIDLContent.java b/app/src/main/java/org/fourthline/cling/support/model/DIDLContent.java deleted file mode 100644 index aa0510e..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/DIDLContent.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.support.model.container.Album; -import org.fourthline.cling.support.model.container.Container; -import org.fourthline.cling.support.model.container.GenreContainer; -import org.fourthline.cling.support.model.container.MovieGenre; -import org.fourthline.cling.support.model.container.MusicAlbum; -import org.fourthline.cling.support.model.container.MusicArtist; -import org.fourthline.cling.support.model.container.MusicGenre; -import org.fourthline.cling.support.model.container.PersonContainer; -import org.fourthline.cling.support.model.container.PhotoAlbum; -import org.fourthline.cling.support.model.container.PlaylistContainer; -import org.fourthline.cling.support.model.container.StorageFolder; -import org.fourthline.cling.support.model.container.StorageSystem; -import org.fourthline.cling.support.model.container.StorageVolume; -import org.fourthline.cling.support.model.item.AudioBook; -import org.fourthline.cling.support.model.item.AudioBroadcast; -import org.fourthline.cling.support.model.item.AudioItem; -import org.fourthline.cling.support.model.item.ImageItem; -import org.fourthline.cling.support.model.item.Item; -import org.fourthline.cling.support.model.item.Movie; -import org.fourthline.cling.support.model.item.MusicTrack; -import org.fourthline.cling.support.model.item.MusicVideoClip; -import org.fourthline.cling.support.model.item.Photo; -import org.fourthline.cling.support.model.item.PlaylistItem; -import org.fourthline.cling.support.model.item.TextItem; -import org.fourthline.cling.support.model.item.VideoBroadcast; -import org.fourthline.cling.support.model.item.VideoItem; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Christian Bauer - */ -public class DIDLContent { - - public static final String NAMESPACE_URI = "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"; - public static final String DESC_WRAPPER_NAMESPACE_URI = "urn:fourthline-org:cling:support:content-directory-desc-1-0"; - - protected List containers = new ArrayList(); - protected List items = new ArrayList(); - protected List descMetadata = new ArrayList(); - - public Container getFirstContainer() { - return getContainers().get(0); - } - - public DIDLContent addContainer(Container container) { - getContainers().add(container); - return this; - } - - public List getContainers() { - return containers; - } - - public void setContainers(List containers) { - this.containers = containers; - } - - /** - * Adds {@link Item} or {@link Container} typed instances, ignores everything else. - */ - public DIDLContent addObject(Object object) { - if(object instanceof Item) { - addItem((Item)object); - } else if(object instanceof Container) { - addContainer((Container)object); - } - return this; - } - - public DIDLContent addItem(Item item) { - getItems().add(item); - return this; - } - - public List getItems() { - return items; - } - - public void setItems(List items) { - this.items = items; - } - - public DIDLContent addDescMetadata(DescMeta descMetadata) { - getDescMetadata().add(descMetadata); - return this; - } - - public List getDescMetadata() { - return descMetadata; - } - - public void setDescMetadata(List descMetadata) { - this.descMetadata = descMetadata; - } - - public void replaceGenericContainerAndItems() { - setItems(replaceGenericItems(getItems())); - setContainers(replaceGenericContainers(getContainers())); - } - - protected List replaceGenericItems(List genericItems) { - List specificItems = new ArrayList(); - - for (Item genericItem : genericItems) { - String genericType = genericItem.getClazz().getValue(); - - if (AudioItem.CLASS.getValue().equals(genericType)) { - specificItems.add(new AudioItem(genericItem)); - } else if (MusicTrack.CLASS.getValue().equals(genericType)) { - specificItems.add(new MusicTrack(genericItem)); - } else if (AudioBook.CLASS.getValue().equals(genericType)) { - specificItems.add(new AudioBook(genericItem)); - } else if (AudioBroadcast.CLASS.getValue().equals(genericType)) { - specificItems.add(new AudioBroadcast(genericItem)); - - } else if (VideoItem.CLASS.getValue().equals(genericType)) { - specificItems.add(new VideoItem(genericItem)); - } else if (Movie.CLASS.getValue().equals(genericType)) { - specificItems.add(new Movie(genericItem)); - } else if (VideoBroadcast.CLASS.getValue().equals(genericType)) { - specificItems.add(new VideoBroadcast(genericItem)); - } else if (MusicVideoClip.CLASS.getValue().equals(genericType)) { - specificItems.add(new MusicVideoClip(genericItem)); - - } else if (ImageItem.CLASS.getValue().equals(genericType)) { - specificItems.add(new ImageItem(genericItem)); - } else if (Photo.CLASS.getValue().equals(genericType)) { - specificItems.add(new Photo(genericItem)); - - } else if (PlaylistItem.CLASS.getValue().equals(genericType)) { - specificItems.add(new PlaylistItem(genericItem)); - - } else if (TextItem.CLASS.getValue().equals(genericType)) { - specificItems.add(new TextItem(genericItem)); - - } else { - specificItems.add(genericItem); - } - } - - return specificItems; - } - - protected List replaceGenericContainers(List genericContainers) { - List specificContainers = new ArrayList(); - - for (Container genericContainer : genericContainers) { - String genericType = genericContainer.getClazz().getValue(); - - Container specific; - - if (Album.CLASS.getValue().equals(genericType)) { - specific = new Album(genericContainer); - - } else if (MusicAlbum.CLASS.getValue().equals(genericType)) { - specific = new MusicAlbum(genericContainer); - - } else if (PhotoAlbum.CLASS.getValue().equals(genericType)) { - specific = new PhotoAlbum(genericContainer); - - } else if (GenreContainer.CLASS.getValue().equals(genericType)) { - specific = new GenreContainer(genericContainer); - - } else if (MusicGenre.CLASS.getValue().equals(genericType)) { - specific = new MusicGenre(genericContainer); - - } else if (MovieGenre.CLASS.getValue().equals(genericType)) { - specific = new MovieGenre(genericContainer); - - } else if (PlaylistContainer.CLASS.getValue().equals(genericType)) { - specific = new PlaylistContainer(genericContainer); - - } else if (PersonContainer.CLASS.getValue().equals(genericType)) { - specific = new PersonContainer(genericContainer); - - } else if (MusicArtist.CLASS.getValue().equals(genericType)) { - specific = new MusicArtist(genericContainer); - - } else if (StorageSystem.CLASS.getValue().equals(genericType)) { - specific = new StorageSystem(genericContainer); - - } else if (StorageVolume.CLASS.getValue().equals(genericType)) { - specific = new StorageVolume(genericContainer); - - } else if (StorageFolder.CLASS.getValue().equals(genericType)) { - specific = new StorageFolder(genericContainer); - - } else { - specific = genericContainer; - } - - specific.setItems(replaceGenericItems(genericContainer.getItems())); - specificContainers.add(specific); - } - - return specificContainers; - } - - public long getCount() { - return items.size() + containers.size(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/DIDLObject.java b/app/src/main/java/org/fourthline/cling/support/model/DIDLObject.java deleted file mode 100644 index b149b29..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/DIDLObject.java +++ /dev/null @@ -1,890 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.w3c.dom.Element; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * @author Christian Bauer - * @author Mario Franco - */ -public abstract class DIDLObject { - - static public abstract class Property { - - public interface NAMESPACE { - } - - private V value; - final private String descriptorName; - final private List> attributes = new ArrayList>(); - - protected Property() { - this(null, null); - } - - protected Property(String descriptorName) { - this(null, descriptorName); - } - - protected Property(V value, String descriptorName) { - this.value = value; - this.descriptorName = descriptorName == null ? getClass().getSimpleName().toLowerCase() : descriptorName; - } - - protected Property(V value, String descriptorName, List> attributes) { - this.value = value; - this.descriptorName = descriptorName == null ? getClass().getSimpleName().toLowerCase() : descriptorName; - this.attributes.addAll(attributes); - } - - public V getValue() { - return value; - } - - public void setValue(V value) { - this.value = value; - } - - public String getDescriptorName() { - return descriptorName; - } - - public void setOnElement(Element element) { - element.setTextContent(toString()); - for (Property attr : attributes) { - element.setAttributeNS( - attr.getValue().getNamespaceURI(), - attr.getValue().getPrefix() + ':' + attr.getDescriptorName(), - attr.getValue().getValue()); - } - } - - public void addAttribute(Property attr) { - this.attributes.add(attr); - } - - public void removeAttribute(Property attr) { - this.attributes.remove(attr); - } - - public void removeAttribute(String descriptorName) { - for (Property attr : attributes) { - if (attr.getDescriptorName().equals(descriptorName)) { - this.removeAttribute(attr); - break; - } - } - } - - public Property getAttribute(String descriptorName) { - for (Property attr : attributes) { - if (attr.getDescriptorName().equals(descriptorName)) { - return attr; - } - } - return null; - } - - @Override - public String toString() { - return getValue() != null ? getValue().toString() : ""; - } - - static public class PropertyPersonWithRole extends Property { - - public PropertyPersonWithRole() { - } - - public PropertyPersonWithRole(String descriptorName) { - super(descriptorName); - } - - public PropertyPersonWithRole(PersonWithRole value, String descriptorName) { - super(value, descriptorName); - } - - @Override - public void setOnElement(Element element) { - if (getValue() != null) - getValue().setOnElement(element); - } - } - - static public class DC { - - public interface NAMESPACE extends Property.NAMESPACE { - public static final String URI = "http://purl.org/dc/elements/1.1/"; - } - - static public class DESCRIPTION extends Property implements NAMESPACE { - public DESCRIPTION() { - } - - public DESCRIPTION(String value) { - super(value, null); - } - } - - static public class PUBLISHER extends Property implements NAMESPACE { - public PUBLISHER() { - } - - public PUBLISHER(Person value) { - super(value, null); - } - } - - static public class CONTRIBUTOR extends Property implements NAMESPACE { - public CONTRIBUTOR() { - } - - public CONTRIBUTOR(Person value) { - super(value, null); - } - } - - static public class DATE extends Property implements NAMESPACE { - public DATE() { - } - - public DATE(String value) { - super(value, null); - } - } - - static public class LANGUAGE extends Property implements NAMESPACE { - public LANGUAGE() { - } - - public LANGUAGE(String value) { - super(value, null); - } - } - - static public class RELATION extends Property implements NAMESPACE { - public RELATION() { - } - - public RELATION(URI value) { - super(value, null); - } - } - - static public class RIGHTS extends Property implements NAMESPACE { - public RIGHTS() { - } - - public RIGHTS(String value) { - super(value, null); - } - } - } - - static public abstract class SEC { - - public interface NAMESPACE extends Property.NAMESPACE { - public static final String URI = "http://www.sec.co.kr/"; - } - - static public class CAPTIONINFOEX extends Property implements NAMESPACE { - public CAPTIONINFOEX() { - this(null); - } - - public CAPTIONINFOEX(URI value) { - super(value, "CaptionInfoEx"); - } - - public CAPTIONINFOEX(URI value, List> attributes) { - super(value, "CaptionInfoEx", attributes); - } - } - - static public class CAPTIONINFO extends Property implements NAMESPACE { - public CAPTIONINFO() { - this(null); - } - - public CAPTIONINFO(URI value) { - super(value, "CaptionInfo"); - } - - public CAPTIONINFO(URI value, List> attributes) { - super(value, "CaptionInfo", attributes); - } - } - - static public class TYPE extends Property implements NAMESPACE { - public TYPE() { - this(null); - } - - public TYPE(DIDLAttribute value) { - super(value, "type"); - } - } - - - } - - static public abstract class UPNP { - - public interface NAMESPACE extends Property.NAMESPACE { - public static final String URI = "urn:schemas-upnp-org:metadata-1-0/upnp/"; - } - - static public class ARTIST extends PropertyPersonWithRole implements NAMESPACE { - public ARTIST() { - } - - public ARTIST(PersonWithRole value) { - super(value, null); - } - } - - static public class ACTOR extends PropertyPersonWithRole implements NAMESPACE { - public ACTOR() { - } - - public ACTOR(PersonWithRole value) { - super(value, null); - } - } - - static public class AUTHOR extends PropertyPersonWithRole implements NAMESPACE { - public AUTHOR() { - } - - public AUTHOR(PersonWithRole value) { - super(value, null); - } - } - - static public class PRODUCER extends Property implements NAMESPACE { - public PRODUCER() { - } - - public PRODUCER(Person value) { - super(value, null); - } - } - - static public class DIRECTOR extends Property implements NAMESPACE { - public DIRECTOR() { - } - - public DIRECTOR(Person value) { - super(value, null); - } - } - - static public class GENRE extends Property implements NAMESPACE { - public GENRE() { - } - - public GENRE(String value) { - super(value, null); - } - } - - static public class ALBUM extends Property implements NAMESPACE { - public ALBUM() { - } - - public ALBUM(String value) { - super(value, null); - } - } - - static public class PLAYLIST extends Property implements NAMESPACE { - public PLAYLIST() { - } - - public PLAYLIST(String value) { - super(value, null); - } - } - - static public class REGION extends Property implements NAMESPACE { - public REGION() { - } - - public REGION(String value) { - super(value, null); - } - } - - static public class RATING extends Property implements NAMESPACE { - public RATING() { - } - - public RATING(String value) { - super(value, null); - } - } - - static public class TOC extends Property implements NAMESPACE { - public TOC() { - } - - public TOC(String value) { - super(value, null); - } - } - - static public class ALBUM_ART_URI extends Property implements NAMESPACE { - public ALBUM_ART_URI() { - this(null); - } - - public ALBUM_ART_URI(URI value) { - super(value, "albumArtURI"); - } - - public ALBUM_ART_URI(URI value, List> attributes) { - super(value, "albumArtURI", attributes); - } - } - - static public class ARTIST_DISCO_URI extends Property implements NAMESPACE { - public ARTIST_DISCO_URI() { - this(null); - } - - public ARTIST_DISCO_URI(URI value) { - super(value, "artistDiscographyURI"); - } - } - - static public class LYRICS_URI extends Property implements NAMESPACE { - public LYRICS_URI() { - this(null); - } - - public LYRICS_URI(URI value) { - super(value, "lyricsURI"); - } - } - - static public class STORAGE_TOTAL extends Property implements NAMESPACE { - public STORAGE_TOTAL() { - this(null); - } - - public STORAGE_TOTAL(Long value) { - super(value, "storageTotal"); - } - } - - static public class STORAGE_USED extends Property implements NAMESPACE { - public STORAGE_USED() { - this(null); - } - - public STORAGE_USED(Long value) { - super(value, "storageUsed"); - } - } - - static public class STORAGE_FREE extends Property implements NAMESPACE { - public STORAGE_FREE() { - this(null); - } - - public STORAGE_FREE(Long value) { - super(value, "storageFree"); - } - } - - static public class STORAGE_MAX_PARTITION extends Property implements NAMESPACE { - public STORAGE_MAX_PARTITION() { - this(null); - } - - public STORAGE_MAX_PARTITION(Long value) { - super(value, "storageMaxPartition"); - } - } - - static public class STORAGE_MEDIUM extends Property implements NAMESPACE { - public STORAGE_MEDIUM() { - this(null); - } - - public STORAGE_MEDIUM(StorageMedium value) { - super(value, "storageMedium"); - } - } - - static public class LONG_DESCRIPTION extends Property implements NAMESPACE { - public LONG_DESCRIPTION() { - this(null); - } - - public LONG_DESCRIPTION(String value) { - super(value, "longDescription"); - } - } - - static public class ICON extends Property implements NAMESPACE { - public ICON() { - } - - public ICON(URI value) { - super(value, null); - } - } - - static public class RADIO_CALL_SIGN extends Property implements NAMESPACE { - public RADIO_CALL_SIGN() { - this(null); - } - - public RADIO_CALL_SIGN(String value) { - super(value, "radioCallSign"); - } - } - - static public class RADIO_STATION_ID extends Property implements NAMESPACE { - public RADIO_STATION_ID() { - this(null); - } - - public RADIO_STATION_ID(String value) { - super(value, "radioStationID"); - } - } - - static public class RADIO_BAND extends Property implements NAMESPACE { - public RADIO_BAND() { - this(null); - } - - public RADIO_BAND(String value) { - super(value, "radioBand"); - } - } - - static public class CHANNEL_NR extends Property implements NAMESPACE { - public CHANNEL_NR() { - this(null); - } - - public CHANNEL_NR(Integer value) { - super(value, "channelNr"); - } - } - - static public class CHANNEL_NAME extends Property implements NAMESPACE { - public CHANNEL_NAME() { - this(null); - } - - public CHANNEL_NAME(String value) { - super(value, "channelName"); - } - } - - static public class SCHEDULED_START_TIME extends Property implements NAMESPACE { - public SCHEDULED_START_TIME() { - this(null); - } - - public SCHEDULED_START_TIME(String value) { - super(value, "scheduledStartTime"); - } - } - - static public class SCHEDULED_END_TIME extends Property implements NAMESPACE { - public SCHEDULED_END_TIME() { - this(null); - } - - public SCHEDULED_END_TIME(String value) { - super(value, "scheduledEndTime"); - } - } - - static public class DVD_REGION_CODE extends Property implements NAMESPACE { - public DVD_REGION_CODE() { - this(null); - } - - public DVD_REGION_CODE(Integer value) { - super(value, "DVDRegionCode"); - } - } - - static public class ORIGINAL_TRACK_NUMBER extends Property implements NAMESPACE { - public ORIGINAL_TRACK_NUMBER() { - this(null); - } - - public ORIGINAL_TRACK_NUMBER(Integer value) { - super(value, "originalTrackNumber"); - } - } - - - static public class USER_ANNOTATION extends Property implements NAMESPACE { - public USER_ANNOTATION() { - this(null); - } - - public USER_ANNOTATION(String value) { - super(value, "userAnnotation"); - } - } - } - - static public abstract class DLNA { - - public interface NAMESPACE extends Property.NAMESPACE { - public static final String URI = "urn:schemas-dlna-org:metadata-1-0/"; - } - - static public class PROFILE_ID extends Property implements NAMESPACE { - public PROFILE_ID() { - this(null); - } - - public PROFILE_ID(DIDLAttribute value) { - super(value, "profileID"); - } - } - } - } - - public static class Class { - - protected String value; - protected String friendlyName; - protected boolean includeDerived; - - public Class() { - } - - public Class(String value) { - this.value = value; - } - - public Class(String value, String friendlyName) { - this.value = value; - this.friendlyName = friendlyName; - } - - public Class(String value, String friendlyName, boolean includeDerived) { - this.value = value; - this.friendlyName = friendlyName; - this.includeDerived = includeDerived; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public String getFriendlyName() { - return friendlyName; - } - - public void setFriendlyName(String friendlyName) { - this.friendlyName = friendlyName; - } - - public boolean isIncludeDerived() { - return includeDerived; - } - - public void setIncludeDerived(boolean includeDerived) { - this.includeDerived = includeDerived; - } - - public boolean equals(DIDLObject instance) { - return getValue().equals(instance.getClazz().getValue()); - - } - } - - protected String id; - protected String parentID; - - protected String title; // DC - protected String creator; // DC - - protected boolean restricted = true; // Let's just assume read-only is default - protected WriteStatus writeStatus; // UPNP - protected Class clazz; // UPNP - - protected List resources = new ArrayList(); - protected List properties = new ArrayList(); - - protected List descMetadata = new ArrayList(); - - protected DIDLObject() { - } - - protected DIDLObject(DIDLObject other) { - this(other.getId(), - other.getParentID(), - other.getTitle(), - other.getCreator(), - other.isRestricted(), - other.getWriteStatus(), - other.getClazz(), - other.getResources(), - other.getProperties(), - other.getDescMetadata() - ); - } - - protected DIDLObject(String id, String parentID, String title, String creator, boolean restricted, WriteStatus writeStatus, Class clazz, List resources, List properties, List descMetadata) { - this.id = id; - this.parentID = parentID; - this.title = title; - this.creator = creator; - this.restricted = restricted; - this.writeStatus = writeStatus; - this.clazz = clazz; - this.resources = resources; - this.properties = properties; - this.descMetadata = descMetadata; - } - - public String getId() { - return id; - } - - public DIDLObject setId(String id) { - this.id = id; - return this; - } - - public String getParentID() { - return parentID; - } - - public DIDLObject setParentID(String parentID) { - this.parentID = parentID; - return this; - } - - public String getTitle() { - return title; - } - - public DIDLObject setTitle(String title) { - this.title = title; - return this; - } - - public String getCreator() { - return creator; - } - - public DIDLObject setCreator(String creator) { - this.creator = creator; - return this; - } - - public boolean isRestricted() { - return restricted; - } - - public DIDLObject setRestricted(boolean restricted) { - this.restricted = restricted; - return this; - } - - public WriteStatus getWriteStatus() { - return writeStatus; - } - - public DIDLObject setWriteStatus(WriteStatus writeStatus) { - this.writeStatus = writeStatus; - return this; - } - - public Res getFirstResource() { - return getResources().size() > 0 ? getResources().get(0) : null; - } - - public List getResources() { - return resources; - } - - public DIDLObject setResources(List resources) { - this.resources = resources; - return this; - } - - public DIDLObject addResource(Res resource) { - getResources().add(resource); - return this; - } - - public Class getClazz() { - return clazz; - } - - public DIDLObject setClazz(Class clazz) { - this.clazz = clazz; - return this; - } - - public List getProperties() { - return properties; - } - - public DIDLObject setProperties(List properties) { - this.properties = properties; - return this; - } - - public DIDLObject addProperty(Property property) { - if (property == null) return this; - getProperties().add(property); - return this; - } - - public DIDLObject replaceFirstProperty(Property property) { - if (property == null) return this; - Iterator it = getProperties().iterator(); - while (it.hasNext()) { - Property p = it.next(); - if (p.getClass().isAssignableFrom(property.getClass())) - it.remove(); - } - addProperty(property); - return this; - } - - public DIDLObject replaceProperties(java.lang.Class propertyClass, Property[] properties) { - if (properties.length == 0) return this; - removeProperties(propertyClass); - return addProperties(properties); - } - - public DIDLObject addProperties(Property[] properties) { - if (properties == null) return this; - for (Property property : properties) { - addProperty(property); - } - return this; - } - - public DIDLObject removeProperties(java.lang.Class propertyClass) { - Iterator it = getProperties().iterator(); - while (it.hasNext()) { - Property p = it.next(); - if (p.getClass().isAssignableFrom(propertyClass)) - it.remove(); - } - return this; - } - - public boolean hasProperty(java.lang.Class propertyClass) { - for (Property property : getProperties()) { - if (property.getClass().isAssignableFrom(propertyClass)) return true; - } - return false; - } - - public Property getFirstProperty(java.lang.Class> propertyClass) { - for (Property property : getProperties()) { - if (property.getClass().isAssignableFrom(propertyClass)) return property; - } - return null; - } - - public Property getLastProperty(java.lang.Class> propertyClass) { - Property found = null; - for (Property property : getProperties()) { - if (property.getClass().isAssignableFrom(propertyClass)) found = property; - } - return found; - } - - public Property[] getProperties(java.lang.Class> propertyClass) { - List> list = new ArrayList(); - for (Property property : getProperties()) { - if (property.getClass().isAssignableFrom(propertyClass)) - list.add(property); - } - return list.toArray(new Property[list.size()]); - } - - public Property[] getPropertiesByNamespace(java.lang.Class namespace) { - List> list = new ArrayList(); - for (Property property : getProperties()) { - if (namespace.isAssignableFrom(property.getClass())) - list.add(property); - } - return list.toArray(new Property[list.size()]); - } - - public V getFirstPropertyValue(java.lang.Class> propertyClass) { - Property prop = getFirstProperty(propertyClass); - return prop == null ? null : prop.getValue(); - } - - public List getPropertyValues(java.lang.Class> propertyClass) { - List list = new ArrayList(); - for (Property property : getProperties(propertyClass)) { - list.add((V) property.getValue()); - } - return list; - } - - public List getDescMetadata() { - return descMetadata; - } - - public void setDescMetadata(List descMetadata) { - this.descMetadata = descMetadata; - } - - public DIDLObject addDescMetadata(DescMeta descMetadata) { - getDescMetadata().add(descMetadata); - return this; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - DIDLObject that = (DIDLObject) o; - - if (!id.equals(that.id)) return false; - - return true; - } - - @Override - public int hashCode() { - return id.hashCode(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/DescMeta.java b/app/src/main/java/org/fourthline/cling/support/model/DescMeta.java deleted file mode 100644 index 3355c4d..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/DescMeta.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -import javax.xml.parsers.DocumentBuilderFactory; -import java.net.URI; - - -/** - * Descriptor metadata about an item/resource. - * - *
- * <complexType>
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <any namespace='##other'/>
- *       </sequence>
- *       <attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       <attribute name="nameSpace" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -public class DescMeta { - - protected String id; - protected String type; - protected URI nameSpace; - protected M metadata; - - public DescMeta() { - } - - public DescMeta(String id, String type, URI nameSpace, M metadata) { - this.id = id; - this.type = type; - this.nameSpace = nameSpace; - this.metadata = metadata; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public URI getNameSpace() { - return nameSpace; - } - - public void setNameSpace(URI nameSpace) { - this.nameSpace = nameSpace; - } - - public M getMetadata() { - return metadata; - } - - public void setMetadata(M metadata) { - this.metadata = metadata; - } - - public Document createMetadataDocument() { - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - Document d = factory.newDocumentBuilder().newDocument(); - Element rootElement = d.createElementNS(DIDLContent.DESC_WRAPPER_NAMESPACE_URI, "desc-wrapper"); - d.appendChild(rootElement); - return d; - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/DeviceCapabilities.java b/app/src/main/java/org/fourthline/cling/support/model/DeviceCapabilities.java deleted file mode 100644 index d0e88d0..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/DeviceCapabilities.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.action.ActionArgumentValue; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public class DeviceCapabilities { - - private StorageMedium[] playMedia; - private StorageMedium[] recMedia = new StorageMedium[] {StorageMedium.NOT_IMPLEMENTED}; - private RecordQualityMode[] recQualityModes = new RecordQualityMode[] {RecordQualityMode.NOT_IMPLEMENTED}; - - public DeviceCapabilities(Map args) { - this( - StorageMedium.valueOfCommaSeparatedList((String) args.get("PlayMedia").getValue()), - StorageMedium.valueOfCommaSeparatedList((String) args.get("RecMedia").getValue()), - RecordQualityMode.valueOfCommaSeparatedList((String) args.get("RecQualityModes").getValue()) - ); - } - - public DeviceCapabilities(StorageMedium[] playMedia) { - this.playMedia = playMedia; - } - - public DeviceCapabilities(StorageMedium[] playMedia, StorageMedium[] recMedia, RecordQualityMode[] recQualityModes) { - this.playMedia = playMedia; - this.recMedia = recMedia; - this.recQualityModes = recQualityModes; - } - - public StorageMedium[] getPlayMedia() { - return playMedia; - } - - public StorageMedium[] getRecMedia() { - return recMedia; - } - - public RecordQualityMode[] getRecQualityModes() { - return recQualityModes; - } - - public String getPlayMediaString() { - return ModelUtil.toCommaSeparatedList(playMedia); - } - - public String getRecMediaString() { - return ModelUtil.toCommaSeparatedList(recMedia); - } - - public String getRecQualityModesString() { - return ModelUtil.toCommaSeparatedList(recQualityModes); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/MediaInfo.java b/app/src/main/java/org/fourthline/cling/support/model/MediaInfo.java deleted file mode 100644 index 50a90e4..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/MediaInfo.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.model.action.ActionArgumentValue; - -import java.util.Map; - -/** - * - */ -public class MediaInfo { - - private String currentURI = ""; - private String currentURIMetaData = ""; - private String nextURI = "NOT_IMPLEMENTED"; - private String nextURIMetaData = "NOT_IMPLEMENTED"; - - private UnsignedIntegerFourBytes numberOfTracks = new UnsignedIntegerFourBytes(0); - private String mediaDuration = "00:00:00"; - private StorageMedium playMedium = StorageMedium.NONE; - private StorageMedium recordMedium = StorageMedium.NOT_IMPLEMENTED; - private RecordMediumWriteStatus writeStatus = RecordMediumWriteStatus.NOT_IMPLEMENTED; - - public MediaInfo() { - } - - public MediaInfo(Map args) { - this( - (String) args.get("CurrentURI").getValue(), - (String) args.get("CurrentURIMetaData").getValue(), - (String) args.get("NextURI").getValue(), - (String) args.get("NextURIMetaData").getValue(), - - (UnsignedIntegerFourBytes) args.get("NrTracks").getValue(), - (String) args.get("MediaDuration").getValue(), - StorageMedium.valueOrVendorSpecificOf((String) args.get("PlayMedium").getValue()), - StorageMedium.valueOrVendorSpecificOf((String) args.get("RecordMedium").getValue()), - RecordMediumWriteStatus.valueOrUnknownOf((String) args.get("WriteStatus").getValue()) - ); - } - - public MediaInfo(String currentURI, String currentURIMetaData) { - this.currentURI = currentURI; - this.currentURIMetaData = currentURIMetaData; - } - - public MediaInfo(String currentURI, String currentURIMetaData, - UnsignedIntegerFourBytes numberOfTracks, String mediaDuration, - StorageMedium playMedium) { - this.currentURI = currentURI; - this.currentURIMetaData = currentURIMetaData; - this.numberOfTracks = numberOfTracks; - this.mediaDuration = mediaDuration; - this.playMedium = playMedium; - } - - public MediaInfo(String currentURI, String currentURIMetaData, - UnsignedIntegerFourBytes numberOfTracks, String mediaDuration, - StorageMedium playMedium, - StorageMedium recordMedium, RecordMediumWriteStatus writeStatus) { - this.currentURI = currentURI; - this.currentURIMetaData = currentURIMetaData; - this.numberOfTracks = numberOfTracks; - this.mediaDuration = mediaDuration; - this.playMedium = playMedium; - this.recordMedium = recordMedium; - this.writeStatus = writeStatus; - } - - public MediaInfo(String currentURI, String currentURIMetaData, - String nextURI, String nextURIMetaData, - UnsignedIntegerFourBytes numberOfTracks, String mediaDuration, - StorageMedium playMedium) { - this.currentURI = currentURI; - this.currentURIMetaData = currentURIMetaData; - this.nextURI = nextURI; - this.nextURIMetaData = nextURIMetaData; - this.numberOfTracks = numberOfTracks; - this.mediaDuration = mediaDuration; - this.playMedium = playMedium; - } - - public MediaInfo(String currentURI, String currentURIMetaData, - String nextURI, String nextURIMetaData, - UnsignedIntegerFourBytes numberOfTracks, String mediaDuration, - StorageMedium playMedium, - StorageMedium recordMedium, RecordMediumWriteStatus writeStatus) { - this.currentURI = currentURI; - this.currentURIMetaData = currentURIMetaData; - this.nextURI = nextURI; - this.nextURIMetaData = nextURIMetaData; - this.numberOfTracks = numberOfTracks; - this.mediaDuration = mediaDuration; - this.playMedium = playMedium; - this.recordMedium = recordMedium; - this.writeStatus = writeStatus; - } - - public String getCurrentURI() { - return currentURI; - } - - public String getCurrentURIMetaData() { - return currentURIMetaData; - } - - public String getNextURI() { - return nextURI; - } - - public String getNextURIMetaData() { - return nextURIMetaData; - } - - public UnsignedIntegerFourBytes getNumberOfTracks() { - return numberOfTracks; - } - - public String getMediaDuration() { - return mediaDuration; - } - - public StorageMedium getPlayMedium() { - return playMedium; - } - - public StorageMedium getRecordMedium() { - return recordMedium; - } - - public RecordMediumWriteStatus getWriteStatus() { - return writeStatus; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/Person.java b/app/src/main/java/org/fourthline/cling/support/model/Person.java deleted file mode 100644 index 185166c..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/Person.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * @author Christian Bauer - */ -public class Person { - - private String name; - - public Person(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Person person = (Person) o; - - if (!name.equals(person.name)) return false; - - return true; - } - - @Override - public int hashCode() { - return name.hashCode(); - } - - @Override - public String toString() { - return getName(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/PersonWithRole.java b/app/src/main/java/org/fourthline/cling/support/model/PersonWithRole.java deleted file mode 100644 index 84957c9..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/PersonWithRole.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.w3c.dom.Element; - -/** - * @author Christian Bauer - */ -public class PersonWithRole extends Person { - - private String role; - - public PersonWithRole(String name) { - super(name); - } - - public PersonWithRole(String name, String role) { - super(name); - this.role = role; - } - - public String getRole() { - return role; - } - - public void setOnElement(Element element) { - element.setTextContent(toString()); - if(getRole() != null) { - element.setAttribute("role", getRole()); - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/PlayMode.java b/app/src/main/java/org/fourthline/cling/support/model/PlayMode.java deleted file mode 100644 index ddcb90f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/PlayMode.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * - */ -public enum PlayMode { - NORMAL, - SHUFFLE, - REPEAT_ONE, - REPEAT_ALL, - RANDOM, - DIRECT_1, - INTRO -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/PortMapping.java b/app/src/main/java/org/fourthline/cling/support/model/PortMapping.java deleted file mode 100644 index ac00fef..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/PortMapping.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.action.ActionArgumentValue; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.model.types.UnsignedIntegerTwoBytes; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public class PortMapping { - - public enum Protocol { - UDP, - TCP - } - - private boolean enabled; - private UnsignedIntegerFourBytes leaseDurationSeconds; - private String remoteHost; - private UnsignedIntegerTwoBytes externalPort; - private UnsignedIntegerTwoBytes internalPort; - private String internalClient; - private Protocol protocol; - private String description; - - public PortMapping() { - } - - - public PortMapping(Map> map) { - this( - (Boolean) map.get("NewEnabled").getValue(), - (UnsignedIntegerFourBytes) map.get("NewLeaseDuration").getValue(), - (String) map.get("NewRemoteHost").getValue(), - (UnsignedIntegerTwoBytes) map.get("NewExternalPort").getValue(), - (UnsignedIntegerTwoBytes) map.get("NewInternalPort").getValue(), - (String) map.get("NewInternalClient").getValue(), - Protocol.valueOf(map.get("NewProtocol").toString()), - (String) map.get("NewPortMappingDescription").getValue() - ); - } - - public PortMapping(int port, String internalClient, Protocol protocol) { - this( - true, - new UnsignedIntegerFourBytes(0), - null, - new UnsignedIntegerTwoBytes(port), - new UnsignedIntegerTwoBytes(port), - internalClient, - protocol, - null - ); - } - - public PortMapping(int port, String internalClient, Protocol protocol, String description) { - this( - true, - new UnsignedIntegerFourBytes(0), - null, - new UnsignedIntegerTwoBytes(port), - new UnsignedIntegerTwoBytes(port), - internalClient, - protocol, - description - ); - } - - public PortMapping(String remoteHost, UnsignedIntegerTwoBytes externalPort, Protocol protocol) { - this( - true, - new UnsignedIntegerFourBytes(0), - remoteHost, - externalPort, - null, - null, - protocol, - null - ); - } - - public PortMapping(boolean enabled, UnsignedIntegerFourBytes leaseDurationSeconds, String remoteHost, UnsignedIntegerTwoBytes externalPort, - UnsignedIntegerTwoBytes internalPort, String internalClient, Protocol protocol, String description) { - this.enabled = enabled; - this.leaseDurationSeconds = leaseDurationSeconds; - this.remoteHost = remoteHost; - this.externalPort = externalPort; - this.internalPort = internalPort; - this.internalClient = internalClient; - this.protocol = protocol; - this.description = description; - } - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public UnsignedIntegerFourBytes getLeaseDurationSeconds() { - return leaseDurationSeconds; - } - - public void setLeaseDurationSeconds(UnsignedIntegerFourBytes leaseDurationSeconds) { - this.leaseDurationSeconds = leaseDurationSeconds; - } - - public boolean hasRemoteHost() { - return remoteHost != null && remoteHost.length() > 0; - } - - public String getRemoteHost() { - return remoteHost == null ? "-" : remoteHost; - } - - public void setRemoteHost(String remoteHost) { - this.remoteHost = remoteHost == null || remoteHost.equals("-") || remoteHost.length() == 0 ? null : remoteHost; - } - - public UnsignedIntegerTwoBytes getExternalPort() { - return externalPort; - } - - public void setExternalPort(UnsignedIntegerTwoBytes externalPort) { - this.externalPort = externalPort; - } - - public UnsignedIntegerTwoBytes getInternalPort() { - return internalPort; - } - - public void setInternalPort(UnsignedIntegerTwoBytes internalPort) { - this.internalPort = internalPort; - } - - public String getInternalClient() { - return internalClient; - } - - public void setInternalClient(String internalClient) { - this.internalClient = internalClient; - } - - public Protocol getProtocol() { - return protocol; - } - - public void setProtocol(Protocol protocol) { - this.protocol = protocol; - } - - public boolean hasDescription() { - return description != null; - } - - public String getDescription() { - return description == null ? "-" : description; - } - - public void setDescription(String description) { - this.description = description == null || description.equals("-") || description.length() == 0 ? null : description; - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") Protocol: " + getProtocol() + ", " + getExternalPort() + " => " + getInternalClient(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/PositionInfo.java b/app/src/main/java/org/fourthline/cling/support/model/PositionInfo.java deleted file mode 100644 index 05e911a..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/PositionInfo.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.action.ActionArgumentValue; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public class PositionInfo { - - private UnsignedIntegerFourBytes track = new UnsignedIntegerFourBytes(0); - private String trackDuration = "00:00:00"; - private String trackMetaData = "NOT_IMPLEMENTED"; - private String trackURI = ""; - private String relTime = "00:00:00"; - private String absTime = "00:00:00"; // TODO: MORE VALUES IN DOMAIN! - private int relCount = Integer.MAX_VALUE; // Indicates that we don't support this - private int absCount = Integer.MAX_VALUE; - - public PositionInfo() { - } - - public PositionInfo(Map args) { - this( - ((UnsignedIntegerFourBytes) args.get("Track").getValue()).getValue(), - (String) args.get("TrackDuration").getValue(), - (String) args.get("TrackMetaData").getValue(), - (String) args.get("TrackURI").getValue(), - (String) args.get("RelTime").getValue(), - (String) args.get("AbsTime").getValue(), - (Integer) args.get("RelCount").getValue(), - (Integer) args.get("AbsCount").getValue() - ); - } - - public PositionInfo(PositionInfo copy, String relTime, String absTime) { - this.track = copy.track; - this.trackDuration = copy.trackDuration; - this.trackMetaData = copy.trackMetaData; - this.trackURI = copy.trackURI; - this.relTime = relTime; - this.absTime = absTime; - this.relCount = copy.relCount; - this.absCount = copy.absCount; - } - - public PositionInfo(PositionInfo copy, long relTimeSeconds, long absTimeSeconds) { - this.track = copy.track; - this.trackDuration = copy.trackDuration; - this.trackMetaData = copy.trackMetaData; - this.trackURI = copy.trackURI; - this.relTime = ModelUtil.toTimeString(relTimeSeconds); - this.absTime = ModelUtil.toTimeString(absTimeSeconds); - this.relCount = copy.relCount; - this.absCount = copy.absCount; - } - - public PositionInfo(long track, String trackDuration, String trackURI, - String relTime, String absTime) { - this.track = new UnsignedIntegerFourBytes(track); - this.trackDuration = trackDuration; - this.trackURI = trackURI; - this.relTime = relTime; - this.absTime = absTime; - } - - public PositionInfo(long track, String trackDuration, - String trackMetaData, String trackURI, - String relTime, String absTime, int relCount, int absCount) { - this.track = new UnsignedIntegerFourBytes(track); - this.trackDuration = trackDuration; - this.trackMetaData = trackMetaData; - this.trackURI = trackURI; - this.relTime = relTime; - this.absTime = absTime; - this.relCount = relCount; - this.absCount = absCount; - } - - public PositionInfo(long track, String trackMetaData, String trackURI) { - this.track = new UnsignedIntegerFourBytes(track); - this.trackMetaData = trackMetaData; - this.trackURI = trackURI; - } - - public UnsignedIntegerFourBytes getTrack() { - return track; - } - - public String getTrackDuration() { - return trackDuration; - } - - public String getTrackMetaData() { - return trackMetaData; - } - - public String getTrackURI() { - return trackURI; - } - - public String getRelTime() { - return relTime; - } - - public String getAbsTime() { - return absTime; - } - - public int getRelCount() { - return relCount; - } - - public int getAbsCount() { - return absCount; - } - - public long getTrackDurationSeconds() { - return getTrackDuration() == null ? 0 : ModelUtil.fromTimeString(getTrackDuration()); - } - - public long getTrackElapsedSeconds() { - return getRelTime() == null || getRelTime().equals("NOT_IMPLEMENTED") ? 0 : ModelUtil.fromTimeString(getRelTime()); - } - - public long getTrackRemainingSeconds() { - return getTrackDurationSeconds() - getTrackElapsedSeconds(); - } - - public int getElapsedPercent() { - long elapsed = getTrackElapsedSeconds(); - long total = getTrackDurationSeconds(); - if (elapsed == 0 || total == 0) return 0; - return new Double(elapsed/((double)total/100)).intValue(); - } - - - @Override - public String toString() { - return "(PositionInfo) Track: " + getTrack() + " RelTime: " + getRelTime() + " Duration: " + getTrackDuration() + " Percent: " + getElapsedPercent(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/PresetName.java b/app/src/main/java/org/fourthline/cling/support/model/PresetName.java deleted file mode 100644 index b5d00bc..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/PresetName.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * - */ -public enum PresetName { - FactoryDefaults -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/Protocol.java b/app/src/main/java/org/fourthline/cling/support/model/Protocol.java deleted file mode 100644 index 98483a2..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/Protocol.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * - */ -public enum Protocol { - - ALL(ProtocolInfo.WILDCARD), - HTTP_GET("http-get"), - RTSP_RTP_UDP("rtsp-rtp-udp"), - INTERNAL("internal"), - IEC61883("iec61883"); - - private String protocolString; - - Protocol(String protocolString) { - this.protocolString = protocolString; - } - - @Override - public String toString() { - return protocolString; - } - - public static Protocol valueOrNullOf(String s) { - for (Protocol protocol : values()) { - if (protocol.toString().equals(s)) { - return protocol; - } - } - return null; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/ProtocolInfo.java b/app/src/main/java/org/fourthline/cling/support/model/ProtocolInfo.java deleted file mode 100644 index 3050ba0..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/ProtocolInfo.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.types.InvalidValueException; -import org.seamless.util.MimeType; - -/** - * Encaspulates a MIME type (content format) and transport, protocol, additional - * information. - * - * @author Christian Bauer - */ -public class ProtocolInfo { - - public static final String WILDCARD = "*"; - - protected Protocol protocol = Protocol.ALL; - protected String network = WILDCARD; - protected String contentFormat = WILDCARD; - protected String additionalInfo = WILDCARD; - - public ProtocolInfo(String s) throws InvalidValueException { - if (s == null) - throw new NullPointerException(); - s = s.trim(); - String[] split = s.split(":"); - - //TODO - //XGF - // if (split.length != 4) { - // throw new InvalidValueException("Can't parse ProtocolInfo string: " + - // s); - // } - this.protocol = Protocol.valueOrNullOf(split[0]); - this.network = split[1]; - this.contentFormat = split[2]; - if (split.length == 4) { - this.additionalInfo = split[3]; - } - } - - public ProtocolInfo(MimeType contentFormatMimeType) { - this.protocol = Protocol.HTTP_GET; - this.contentFormat = contentFormatMimeType.toString(); - } - - public ProtocolInfo(Protocol protocol, String network, - String contentFormat, String additionalInfo) { - this.protocol = protocol; - this.network = network; - this.contentFormat = contentFormat; - this.additionalInfo = additionalInfo; - } - - public Protocol getProtocol() { - return protocol; - } - - public String getNetwork() { - return network; - } - - public String getContentFormat() { - return contentFormat; - } - - public MimeType getContentFormatMimeType() throws IllegalArgumentException { - return MimeType.valueOf(contentFormat); - } - - public String getAdditionalInfo() { - return additionalInfo; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - ProtocolInfo that = (ProtocolInfo) o; - - if (!additionalInfo.equals(that.additionalInfo)) - return false; - if (!contentFormat.equals(that.contentFormat)) - return false; - if (!network.equals(that.network)) - return false; - if (protocol != that.protocol) - return false; - - return true; - } - - @Override - public int hashCode() { - int result = protocol.hashCode(); - result = 31 * result + network.hashCode(); - result = 31 * result + contentFormat.hashCode(); - result = 31 * result + additionalInfo.hashCode(); - return result; - } - - @Override - public String toString() { - return protocol.toString() + ":" + network + ":" + contentFormat + ":" - + additionalInfo; - - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/ProtocolInfos.java b/app/src/main/java/org/fourthline/cling/support/model/ProtocolInfos.java deleted file mode 100644 index f500ba5..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/ProtocolInfos.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.types.InvalidValueException; - -import java.util.ArrayList; - -/** - * @author Christian Bauer - */ -public class ProtocolInfos extends ArrayList { - - public ProtocolInfos(ProtocolInfo... info) { - for (ProtocolInfo protocolInfo : info) { - add(protocolInfo); - } - } - - public ProtocolInfos(String s) throws InvalidValueException { - String[] infos = ModelUtil.fromCommaSeparatedList(s); - if (infos != null) - for (String info : infos) - add(new ProtocolInfo(info)); - } - - @Override - public String toString() { - return ModelUtil.toCommaSeparatedList(toArray(new ProtocolInfo[size()])); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/RecordMediumWriteStatus.java b/app/src/main/java/org/fourthline/cling/support/model/RecordMediumWriteStatus.java deleted file mode 100644 index cbd8ecd..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/RecordMediumWriteStatus.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * - */ -public enum RecordMediumWriteStatus { - - WRITABLE, - PROTECTED, - NOT_WRITABLE, - UNKNOWN, - NOT_IMPLEMENTED; - - static public RecordMediumWriteStatus valueOrUnknownOf(String s) { - try { - return valueOf(s); - } catch (IllegalArgumentException ex) { - return UNKNOWN; - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/RecordQualityMode.java b/app/src/main/java/org/fourthline/cling/support/model/RecordQualityMode.java deleted file mode 100644 index 722480c..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/RecordQualityMode.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.ModelUtil; - -import java.util.ArrayList; -import java.util.List; - -/** - * - */ -public enum RecordQualityMode { - - EP("0:EP"), - LP("1:LP"), - SP("2:SP"), - BASIC("0:BASIC"), - MEDIUM("1:MEDIUM"), - HIGH("2:HIGH"), - NOT_IMPLEMENTED("NOT_IMPLEMENTED"); - - private String protocolString; - - RecordQualityMode(String protocolString) { - this.protocolString = protocolString; - } - - @Override - public String toString() { - return protocolString; - } - - public static RecordQualityMode valueOrExceptionOf(String s) throws IllegalArgumentException { - for (RecordQualityMode recordQualityMode : values()) { - if (recordQualityMode.protocolString.equals(s)) { - return recordQualityMode; - } - } - throw new IllegalArgumentException("Invalid record quality mode string: " + s); - } - - public static RecordQualityMode[] valueOfCommaSeparatedList(String s) { - String[] strings = ModelUtil.fromCommaSeparatedList(s); - if (strings == null) return new RecordQualityMode[0]; - List result = new ArrayList(); - for (String rqm : strings) { - for (RecordQualityMode recordQualityMode : values()) { - if (recordQualityMode.protocolString.equals(rqm)) { - result.add(recordQualityMode); - } - } - } - return result.toArray(new RecordQualityMode[result.size()]); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/Res.java b/app/src/main/java/org/fourthline/cling/support/model/Res.java deleted file mode 100644 index a868433..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/Res.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.seamless.util.MimeType; - -import java.net.URI; - -/** - * @author Christian Bauer - */ -public class Res { - - protected URI importUri; - protected ProtocolInfo protocolInfo; - protected Long size; - protected String duration; - protected Long bitrate; - protected Long sampleFrequency; - protected Long bitsPerSample; - protected Long nrAudioChannels; - protected Long colorDepth; - protected String protection; - protected String resolution; - - protected String value; - - public Res() { - } - - public Res(String httpGetMimeType, Long size, String duration, Long bitrate, String value) { - this(new ProtocolInfo(Protocol.HTTP_GET, ProtocolInfo.WILDCARD, httpGetMimeType, ProtocolInfo.WILDCARD), size, duration, bitrate, value); - } - - public Res(MimeType httpGetMimeType, Long size, String duration, Long bitrate, String value) { - this(new ProtocolInfo(httpGetMimeType), size, duration, bitrate, value); - } - - public Res(MimeType httpGetMimeType, Long size, String value) { - this(new ProtocolInfo(httpGetMimeType), size, value); - } - - public Res(ProtocolInfo protocolInfo, Long size, String value) { - this.protocolInfo = protocolInfo; - this.size = size; - this.value = value; - } - - public Res(ProtocolInfo protocolInfo, Long size, String duration, Long bitrate, String value) { - this.protocolInfo = protocolInfo; - this.size = size; - this.duration = duration; - this.bitrate = bitrate; - this.value = value; - } - - public Res(URI importUri, ProtocolInfo protocolInfo, Long size, String duration, Long bitrate, Long sampleFrequency, Long bitsPerSample, Long nrAudioChannels, Long colorDepth, String protection, String resolution, String value) { - this.importUri = importUri; - this.protocolInfo = protocolInfo; - this.size = size; - this.duration = duration; - this.bitrate = bitrate; - this.sampleFrequency = sampleFrequency; - this.bitsPerSample = bitsPerSample; - this.nrAudioChannels = nrAudioChannels; - this.colorDepth = colorDepth; - this.protection = protection; - this.resolution = resolution; - this.value = value; - } - - public URI getImportUri() { - return importUri; - } - - public void setImportUri(URI importUri) { - this.importUri = importUri; - } - - public ProtocolInfo getProtocolInfo() { - return protocolInfo; - } - - public void setProtocolInfo(ProtocolInfo protocolInfo) { - this.protocolInfo = protocolInfo; - } - - public Long getSize() { - return size; - } - - public void setSize(Long size) { - this.size = size; - } - - public String getDuration() { - return duration; - } - - public void setDuration(String duration) { - this.duration = duration; - } - - public Long getBitrate() { - return bitrate; - } - - public void setBitrate(Long bitrate) { - this.bitrate = bitrate; - } - - public Long getSampleFrequency() { - return sampleFrequency; - } - - public void setSampleFrequency(Long sampleFrequency) { - this.sampleFrequency = sampleFrequency; - } - - public Long getBitsPerSample() { - return bitsPerSample; - } - - public void setBitsPerSample(Long bitsPerSample) { - this.bitsPerSample = bitsPerSample; - } - - public Long getNrAudioChannels() { - return nrAudioChannels; - } - - public void setNrAudioChannels(Long nrAudioChannels) { - this.nrAudioChannels = nrAudioChannels; - } - - public Long getColorDepth() { - return colorDepth; - } - - public void setColorDepth(Long colorDepth) { - this.colorDepth = colorDepth; - } - - public String getProtection() { - return protection; - } - - public void setProtection(String protection) { - this.protection = protection; - } - - public String getResolution() { - return resolution; - } - - public void setResolution(String resolution) { - this.resolution = resolution; - } - - public void setResolution(int x, int y) { - this.resolution = x + "x" + y; - } - - public int getResolutionX() { - return getResolution() != null && getResolution().split("x").length == 2 - ? Integer.valueOf(getResolution().split("x")[0]) - : 0; - } - - public int getResolutionY() { - return getResolution() != null && getResolution().split("x").length == 2 - ? Integer.valueOf(getResolution().split("x")[1]) - : 0; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/SearchResult.java b/app/src/main/java/org/fourthline/cling/support/model/SearchResult.java deleted file mode 100644 index f2ff19b..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/SearchResult.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -/** - * @author TK Kocheran <rfkrocktk@gmail.com> - */ -public class SearchResult { - - protected String result; - - protected UnsignedIntegerFourBytes count; - - protected UnsignedIntegerFourBytes totalMatches; - - protected UnsignedIntegerFourBytes containerUpdateID; - - public SearchResult(String result, UnsignedIntegerFourBytes count, - UnsignedIntegerFourBytes totalMatches, - UnsignedIntegerFourBytes containerUpdateID) { - this.result = result; - this.count = count; - this.totalMatches = totalMatches; - this.containerUpdateID = containerUpdateID; - } - - public SearchResult(String result, long count, long totalMatches) { - this(result, count, totalMatches, 0); - } - - public SearchResult(String result, long count, long totalMatches, long updateID) { - this( - result, - new UnsignedIntegerFourBytes(count), - new UnsignedIntegerFourBytes(totalMatches), - new UnsignedIntegerFourBytes(updateID) - ); - } - - public String getResult() { - return result; - } - - public UnsignedIntegerFourBytes getCount() { - return count; - } - - public long getCountLong() { - return count.getValue(); - } - - public UnsignedIntegerFourBytes getTotalMatches() { - return totalMatches; - } - - public long getTotalMatchesLong() { - return totalMatches.getValue(); - } - - public UnsignedIntegerFourBytes getContainerUpdateID() { - return containerUpdateID; - } - - public long getContainerUpdateIDLong() { - return containerUpdateID.getValue(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/SeekMode.java b/app/src/main/java/org/fourthline/cling/support/model/SeekMode.java deleted file mode 100644 index d37e9ec..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/SeekMode.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/* - ui4 (ABS_COUNT, REL_COUNT, TRACK_NR, TAPE-INDEX, FRAME) - time (ABS_TIME, REL_TIME) - float (CHANNEL_FREQ, in Hz) - */ -public enum SeekMode { - - TRACK_NR("TRACK_NR"), - ABS_TIME("ABS_TIME"), - REL_TIME("REL_TIME"), - ABS_COUNT("ABS_COUNT"), - REL_COUNT("REL_COUNT"), - CHANNEL_FREQ("CHANNEL_FREQ"), - TAPE_INDEX("TAPE-INDEX"), - FRAME("FRAME"); - - private String protocolString; - - SeekMode(String protocolString) { - this.protocolString = protocolString; - } - - @Override - public String toString() { - return protocolString; - } - - public static SeekMode valueOrExceptionOf(String s) throws IllegalArgumentException { - for (SeekMode seekMode : values()) { - if (seekMode.protocolString.equals(s)) { - return seekMode; - } - } - throw new IllegalArgumentException("Invalid seek mode string: " + s); - } -} - diff --git a/app/src/main/java/org/fourthline/cling/support/model/SortCriterion.java b/app/src/main/java/org/fourthline/cling/support/model/SortCriterion.java deleted file mode 100644 index 84a6b0e..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/SortCriterion.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Christian Bauer - */ -public class SortCriterion { - - final protected boolean ascending; - final protected String propertyName; - - public SortCriterion(boolean ascending, String propertyName) { - this.ascending = ascending; - this.propertyName = propertyName; - } - - public SortCriterion(String criterion) { - this(criterion.startsWith("+"), criterion.substring(1)); - if (!(criterion.startsWith("-") || criterion.startsWith("+"))) - throw new IllegalArgumentException("Missing sort prefix +/- on criterion: " + criterion); - } - - public boolean isAscending() { - return ascending; - } - - public String getPropertyName() { - return propertyName; - } - - public static SortCriterion[] valueOf(String s) { - if (s == null || s.length() == 0) return new SortCriterion[0]; - List list = new ArrayList(); - String[] criteria = s.split(","); - for (String criterion : criteria) { - list.add(new SortCriterion(criterion.trim())); - } - return list.toArray(new SortCriterion[list.size()]); - } - - public static String toString(SortCriterion[] criteria) { - if (criteria == null) return ""; - StringBuilder sb = new StringBuilder(); - for (SortCriterion sortCriterion : criteria) { - sb.append(sortCriterion.toString()).append(","); - } - if (sb.toString().endsWith(",")) sb.deleteCharAt(sb.length()-1); - return sb.toString(); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(ascending ? "+" : "-"); - sb.append(propertyName); - return sb.toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/StorageMedium.java b/app/src/main/java/org/fourthline/cling/support/model/StorageMedium.java deleted file mode 100644 index c083346..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/StorageMedium.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.ModelUtil; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author Christian Bauer - */ -public enum StorageMedium { - - UNKNOWN, - DV, - MINI_DV("MINI-DV"), - VHS, - W_VHS("W-VHS"), - S_VHS("S-VHS"), - D_VHS("D-VHS"), - VHSC, - VIDEO8, - HI8, - CD_ROM("CD-ROM"), - CD_DA("CD-DA"), - CD_R("CD-R"), - CD_RW("CD-RW"), - VIDEO_CD("VIDEO-CD"), - SACD, - MD_AUDIO("M-AUDIO"), - MD_PICTURE("MD-PICTURE"), - DVD_ROM("DVD-ROM"), - DVD_VIDEO("DVD-VIDEO"), - DVD_R("DVD-R"), - DVD_PLUS_RW("DVD+RW"), - DVD_MINUS_RW("DVD-RW"), - DVD_RAM("DVD-RAM"), - DVD_AUDIO("DVD-AUDIO"), - DAT, - LD, - HDD, - MICRO_MV("MICRO_MV"), - NETWORK, - NONE, - NOT_IMPLEMENTED, - VENDOR_SPECIFIC; - - private static Map byProtocolString = new HashMap() {{ - for (StorageMedium e : StorageMedium.values()) { - put(e.protocolString, e); - } - }}; - - private String protocolString; - - StorageMedium() { - this(null); - } - - StorageMedium(String protocolString) { - this.protocolString = protocolString == null ? this.name() : protocolString; - } - - @Override - public String toString() { - return protocolString; - } - - public static StorageMedium valueOrExceptionOf(String s) { - StorageMedium sm = byProtocolString.get(s); - if (sm != null) return sm; - throw new IllegalArgumentException("Invalid storage medium string: " + s); - } - - public static StorageMedium valueOrVendorSpecificOf(String s) { - StorageMedium sm = byProtocolString.get(s); - return sm != null ? sm : StorageMedium.VENDOR_SPECIFIC; - } - - public static StorageMedium[] valueOfCommaSeparatedList(String s) { - String[] strings = ModelUtil.fromCommaSeparatedList(s); - if (strings == null) return new StorageMedium[0]; - StorageMedium[] result = new StorageMedium[strings.length]; - for (int i = 0; i < strings.length; i++) { - result[i] = valueOrVendorSpecificOf(strings[i]); - } - return result; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/model/TransportAction.java b/app/src/main/java/org/fourthline/cling/support/model/TransportAction.java deleted file mode 100644 index 627ef78..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/TransportAction.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.ModelUtil; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Christian Bauer - */ -public enum TransportAction { - - Play, - Stop, - Pause, - Seek, - Next, - Previous, - Record; - - public static TransportAction[] valueOfCommaSeparatedList(String s) { - String[] strings = ModelUtil.fromCommaSeparatedList(s); - if (strings == null) return new TransportAction[0]; - List result = new ArrayList(); - for (String taString : strings) { - for (TransportAction ta : values()) { - if (ta.name().equals(taString)) { - result.add(ta); - } - } - - } - return result.toArray(new TransportAction[result.size()]); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/TransportInfo.java b/app/src/main/java/org/fourthline/cling/support/model/TransportInfo.java deleted file mode 100644 index 95be871..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/TransportInfo.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -import org.fourthline.cling.model.action.ActionArgumentValue; - -import java.util.Map; - -/** - * - */ -public class TransportInfo { - - private TransportState currentTransportState = TransportState.NO_MEDIA_PRESENT; - private TransportStatus currentTransportStatus = TransportStatus.OK; - private String currentSpeed = "1"; - - public TransportInfo() { - } - - public TransportInfo(Map args) { - this( - TransportState.valueOrCustomOf((String) args.get("CurrentTransportState").getValue()), - TransportStatus.valueOrCustomOf((String) args.get("CurrentTransportStatus").getValue()), - (String) args.get("CurrentSpeed").getValue() - ); - } - - public TransportInfo(TransportState currentTransportState) { - this.currentTransportState = currentTransportState; - } - - public TransportInfo(TransportState currentTransportState, String currentSpeed) { - this.currentTransportState = currentTransportState; - this.currentSpeed = currentSpeed; - } - - public TransportInfo(TransportState currentTransportState, TransportStatus currentTransportStatus) { - this.currentTransportState = currentTransportState; - this.currentTransportStatus = currentTransportStatus; - } - - public TransportInfo(TransportState currentTransportState, TransportStatus currentTransportStatus, String currentSpeed) { - this.currentTransportState = currentTransportState; - this.currentTransportStatus = currentTransportStatus; - this.currentSpeed = currentSpeed; - } - - public TransportState getCurrentTransportState() { - return currentTransportState; - } - - public TransportStatus getCurrentTransportStatus() { - return currentTransportStatus; - } - - public String getCurrentSpeed() { - return currentSpeed; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/TransportSettings.java b/app/src/main/java/org/fourthline/cling/support/model/TransportSettings.java deleted file mode 100644 index 351e635..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/TransportSettings.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * - */ -public class TransportSettings { - - private PlayMode playMode = PlayMode.NORMAL; - private RecordQualityMode recQualityMode = RecordQualityMode.NOT_IMPLEMENTED; - - public TransportSettings() { - } - - public TransportSettings(PlayMode playMode) { - this.playMode = playMode; - } - - public TransportSettings(PlayMode playMode, RecordQualityMode recQualityMode) { - this.playMode = playMode; - this.recQualityMode = recQualityMode; - } - - public PlayMode getPlayMode() { - return playMode; - } - - public RecordQualityMode getRecQualityMode() { - return recQualityMode; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/TransportState.java b/app/src/main/java/org/fourthline/cling/support/model/TransportState.java deleted file mode 100644 index 425f2cf..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/TransportState.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * @author Christian Bauer - */ -public enum TransportState { - - STOPPED, - PLAYING, - TRANSITIONING, - PAUSED_PLAYBACK, - PAUSED_RECORDING, - RECORDING, - NO_MEDIA_PRESENT, - CUSTOM; - - String value; - - TransportState() { - this.value = name(); - } - - public String getValue() { - return value; - } - - public TransportState setValue(String value) { - this.value = value; - return this; - } - - public static TransportState valueOrCustomOf(String s) { - try { - return TransportState.valueOf(s); - } catch (IllegalArgumentException ex) { - return TransportState.CUSTOM.setValue(s); - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/TransportStatus.java b/app/src/main/java/org/fourthline/cling/support/model/TransportStatus.java deleted file mode 100644 index 05f7c35..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/TransportStatus.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * - */ -public enum TransportStatus { - - OK, - ERROR_OCCURED, - CUSTOM; - - String value; - - TransportStatus() { - this.value = name(); - } - - public String getValue() { - return value; - } - - public TransportStatus setValue(String value) { - this.value = value; - return this; - } - - public static TransportStatus valueOrCustomOf(String s) { - try { - return TransportStatus.valueOf(s); - } catch (IllegalArgumentException ex) { - return TransportStatus.CUSTOM.setValue(s); - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/VolumeDBRange.java b/app/src/main/java/org/fourthline/cling/support/model/VolumeDBRange.java deleted file mode 100644 index 167f9e0..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/VolumeDBRange.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * - */ -public class VolumeDBRange { - - private Integer minValue; - private Integer maxValue; - - public VolumeDBRange(Integer minValue, Integer maxValue) { - this.minValue = minValue; - this.maxValue = maxValue; - } - - public Integer getMinValue() { - return minValue; - } - - public Integer getMaxValue() { - return maxValue; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/WriteStatus.java b/app/src/main/java/org/fourthline/cling/support/model/WriteStatus.java deleted file mode 100644 index 3475391..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/WriteStatus.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model; - -/** - * @author Christian Bauer - */ -public enum WriteStatus { - - WRITABLE, - NOT_WRITABLE, - UNKNOWN, - MIXED -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/Album.java b/app/src/main/java/org/fourthline/cling/support/model/container/Album.java deleted file mode 100644 index 5ec3888..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/Album.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -import org.fourthline.cling.support.model.Person; -import org.fourthline.cling.support.model.StorageMedium; - -import java.net.URI; -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.DC; -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class Album extends Container { - - public static final Class CLASS = new Class("object.container.album"); - - public Album() { - setClazz(CLASS); - } - - public Album(Container other) { - super(other); - } - - public Album(String id, Container parent, String title, String creator, Integer childCount) { - this(id, parent.getId(), title, creator, childCount); - } - - public Album(String id, String parentID, String title, String creator, Integer childCount) { - super(id, parentID, title, creator, CLASS, childCount); - } - - public String getDescription() { - return getFirstPropertyValue(DC.DESCRIPTION.class); - } - - public Album setDescription(String description) { - replaceFirstProperty(new DC.DESCRIPTION(description)); - return this; - } - - public String getLongDescription() { - return getFirstPropertyValue(UPNP.LONG_DESCRIPTION.class); - } - - public Album setLongDescription(String description) { - replaceFirstProperty(new UPNP.LONG_DESCRIPTION(description)); - return this; - } - - public StorageMedium getStorageMedium() { - return getFirstPropertyValue(UPNP.STORAGE_MEDIUM.class); - } - - public Album setStorageMedium(StorageMedium storageMedium) { - replaceFirstProperty(new UPNP.STORAGE_MEDIUM(storageMedium)); - return this; - } - - public String getDate() { - return getFirstPropertyValue(DC.DATE.class); - } - - public Album setDate(String date) { - replaceFirstProperty(new DC.DATE(date)); - return this; - } - - public URI getFirstRelation() { - return getFirstPropertyValue(DC.RELATION.class); - } - - public URI[] getRelations() { - List list = getPropertyValues(DC.RELATION.class); - return list.toArray(new URI[list.size()]); - } - - public Album setRelations(URI[] relations) { - removeProperties(DC.RELATION.class); - for (URI relation : relations) { - addProperty(new DC.RELATION(relation)); - } - return this; - } - - public String getFirstRights() { - return getFirstPropertyValue(DC.RIGHTS.class); - } - - public String[] getRights() { - List list = getPropertyValues(DC.RIGHTS.class); - return list.toArray(new String[list.size()]); - } - - public Album setRights(String[] rights) { - removeProperties(DC.RIGHTS.class); - for (String right : rights) { - addProperty(new DC.RIGHTS(right)); - } - return this; - } - - public Person getFirstContributor() { - return getFirstPropertyValue(DC.CONTRIBUTOR.class); - } - - public Person[] getContributors() { - List list = getPropertyValues(DC.CONTRIBUTOR.class); - return list.toArray(new Person[list.size()]); - } - - public Album setContributors(Person[] contributors) { - removeProperties(DC.CONTRIBUTOR.class); - for (Person p : contributors) { - addProperty(new DC.CONTRIBUTOR(p)); - } - return this; - } - - public Person getFirstPublisher() { - return getFirstPropertyValue(DC.PUBLISHER.class); - } - - public Person[] getPublishers() { - List list = getPropertyValues(DC.PUBLISHER.class); - return list.toArray(new Person[list.size()]); - } - - public Album setPublishers(Person[] publishers) { - removeProperties(DC.PUBLISHER.class); - for (Person publisher : publishers) { - addProperty(new DC.PUBLISHER(publisher)); - } - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/Container.java b/app/src/main/java/org/fourthline/cling/support/model/container/Container.java deleted file mode 100644 index 7647f31..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/Container.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -import org.fourthline.cling.support.model.DIDLObject; -import org.fourthline.cling.support.model.DescMeta; -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.WriteStatus; -import org.fourthline.cling.support.model.item.Item; - -import java.util.ArrayList; -import java.util.List; - -/** - * A container in DIDL content. - *

- * Note that although this container can have sub-containers, the - * {@link org.fourthline.cling.support.contentdirectory.DIDLParser} - * will never read nor write this collection to and from XML. - * Its only purpose is convenience when creating and manipulating a - * recursive structure, that is, modelling the content tree as you - * see fit. You can then pick a list of containers and/or a list of - * items and hand them to the DIDL parser, which will render them - * flat in XML. The only nested structure that can optionally be - * rendered into and read from XML are the items of containers, - * never their sub-containers. - *

- *

- * Also see ContentDirectory 1.0 specification, section 2.8.3: - * "Incremental navigation i.e. the full hierarchy is never returned - * in one call since this is likely to flood the resources available to - * the control point (memory, network bandwidth, etc.)." - *

- * - * @author Christian Bauer - */ -public class Container extends DIDLObject { - - protected Integer childCount = null; - protected boolean searchable; // Default or absent == false - protected List createClasses = new ArrayList(); - protected List searchClasses = new ArrayList(); - protected List containers = new ArrayList(); - protected List items = new ArrayList(); - - public Container() { - } - - public Container(Container other) { - super(other); - setChildCount(other.getChildCount()); - setSearchable(other.isSearchable()); - setCreateClasses(other.getCreateClasses()); - setSearchClasses(other.getSearchClasses()); - setItems(other.getItems()); - } - - public Container(String id, String parentID, String title, String creator, boolean restricted, WriteStatus writeStatus, Class clazz, List resources, List properties, List descMetadata) { - super(id, parentID, title, creator, restricted, writeStatus, clazz, resources, properties, descMetadata); - } - - public Container(String id, String parentID, String title, String creator, boolean restricted, WriteStatus writeStatus, Class clazz, List resources, List properties, List descMetadata, Integer childCount, boolean searchable, List createClasses, List searchClasses, List items) { - super(id, parentID, title, creator, restricted, writeStatus, clazz, resources, properties, descMetadata); - this.childCount = childCount; - this.searchable = searchable; - this.createClasses = createClasses; - this.searchClasses = searchClasses; - this.items = items; - } - - public Container(String id, Container parent, String title, String creator, DIDLObject.Class clazz, Integer childCount) { - this(id, parent.getId(), title, creator, true, null, clazz, new ArrayList(), new ArrayList(), new ArrayList(), childCount, false, new ArrayList(), new ArrayList(), new ArrayList()); - } - - public Container(String id, String parentID, String title, String creator, DIDLObject.Class clazz, Integer childCount) { - this(id, parentID, title, creator, true, null, clazz, new ArrayList(), new ArrayList(), new ArrayList(), childCount, false, new ArrayList(), new ArrayList(), new ArrayList()); - } - - public Container(String id, Container parent, String title, String creator, DIDLObject.Class clazz, Integer childCount, boolean searchable, List createClasses, List searchClasses, List items) { - this(id, parent.getId(), title, creator, true, null, clazz, new ArrayList(), new ArrayList(), new ArrayList(), childCount, searchable, createClasses, searchClasses, items); - } - - public Container(String id, String parentID, String title, String creator, DIDLObject.Class clazz, Integer childCount, boolean searchable, List createClasses, List searchClasses, List items) { - this(id, parentID, title, creator, true, null, clazz, new ArrayList(), new ArrayList(), new ArrayList(), childCount, searchable, createClasses, searchClasses, items); - } - - public Integer getChildCount() { - return childCount; - } - - public void setChildCount(Integer childCount) { - this.childCount = childCount; - } - - public boolean isSearchable() { - return searchable; - } - - public void setSearchable(boolean searchable) { - this.searchable = searchable; - } - - public List getCreateClasses() { - return createClasses; - } - - public void setCreateClasses(List createClasses) { - this.createClasses = createClasses; - } - - public List getSearchClasses() { - return searchClasses; - } - - public void setSearchClasses(List searchClasses) { - this.searchClasses = searchClasses; - } - - public Container getFirstContainer() { - return getContainers().get(0); - } - - public Container addContainer(Container container) { - getContainers().add(container); - return this; - } - - public List getContainers() { - return containers; - } - - public void setContainers(List containers) { - this.containers = containers; - } - - public List getItems() { - return items; - } - - public void setItems(List items) { - this.items = items; - } - - public Container addItem(Item item) { - getItems().add(item); - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/GenreContainer.java b/app/src/main/java/org/fourthline/cling/support/model/container/GenreContainer.java deleted file mode 100644 index bce1657..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/GenreContainer.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -/** - * @author Christian Bauer - */ -public class GenreContainer extends Container { - - public static final Class CLASS = new Class("object.container.genre"); - - public GenreContainer() { - setClazz(CLASS); - } - - public GenreContainer(Container other) { - super(other); - } - - public GenreContainer(String id, Container parent, String title, String creator, Integer childCount) { - this(id, parent.getId(), title, creator, childCount); - } - - public GenreContainer(String id, String parentID, String title, String creator, Integer childCount) { - super(id, parentID, title, creator, CLASS, childCount); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/MovieGenre.java b/app/src/main/java/org/fourthline/cling/support/model/container/MovieGenre.java deleted file mode 100644 index 47ca80f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/MovieGenre.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -/** - * @author Christian Bauer - */ -public class MovieGenre extends GenreContainer { - - public static final Class CLASS = new Class("object.container.genre.movieGenre"); - - public MovieGenre() { - setClazz(CLASS); - } - - public MovieGenre(Container other) { - super(other); - } - - public MovieGenre(String id, Container parent, String title, String creator, Integer childCount) { - this(id, parent.getId(), title, creator, childCount); - } - - public MovieGenre(String id, String parentID, String title, String creator, Integer childCount) { - super(id, parentID, title, creator, childCount); - setClazz(CLASS); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/MusicAlbum.java b/app/src/main/java/org/fourthline/cling/support/model/container/MusicAlbum.java deleted file mode 100644 index 987c050..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/MusicAlbum.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -import org.fourthline.cling.support.model.Person; -import org.fourthline.cling.support.model.PersonWithRole; -import org.fourthline.cling.support.model.item.Item; -import org.fourthline.cling.support.model.item.MusicTrack; - -import java.net.URI; -import java.util.ArrayList; -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class MusicAlbum extends Album { - - public static final Class CLASS = new Class("object.container.album.musicAlbum"); - - public MusicAlbum() { - setClazz(CLASS); - } - - public MusicAlbum(Container other) { - super(other); - } - - public MusicAlbum(String id, Container parent, String title, String creator, Integer childCount) { - this(id, parent.getId(), title, creator, childCount, new ArrayList()); - } - - public MusicAlbum(String id, Container parent, String title, String creator, Integer childCount, List musicTracks) { - this(id, parent.getId(), title, creator, childCount, musicTracks); - } - - public MusicAlbum(String id, String parentID, String title, String creator, Integer childCount) { - this(id, parentID, title, creator, childCount, new ArrayList()); - } - - public MusicAlbum(String id, String parentID, String title, String creator, Integer childCount, List musicTracks) { - super(id, parentID, title, creator, childCount); - setClazz(CLASS); - addMusicTracks(musicTracks); - } - - public PersonWithRole getFirstArtist() { - return getFirstPropertyValue(UPNP.ARTIST.class); - } - - public PersonWithRole[] getArtists() { - List list = getPropertyValues(UPNP.ARTIST.class); - return list.toArray(new PersonWithRole[list.size()]); - } - - public MusicAlbum setArtists(PersonWithRole[] artists) { - removeProperties(UPNP.ARTIST.class); - for (PersonWithRole artist : artists) { - addProperty(new UPNP.ARTIST(artist)); - } - return this; - } - - public String getFirstGenre() { - return getFirstPropertyValue(UPNP.GENRE.class); - } - - public String[] getGenres() { - List list = getPropertyValues(UPNP.GENRE.class); - return list.toArray(new String[list.size()]); - } - - public MusicAlbum setGenres(String[] genres) { - removeProperties(UPNP.GENRE.class); - for (String genre : genres) { - addProperty(new UPNP.GENRE(genre)); - } - return this; - } - - public Person getFirstProducer() { - return getFirstPropertyValue(UPNP.PRODUCER.class); - } - - public Person[] getProducers() { - List list = getPropertyValues(UPNP.PRODUCER.class); - return list.toArray(new Person[list.size()]); - } - - public MusicAlbum setProducers(Person[] persons) { - removeProperties(UPNP.PRODUCER.class); - for (Person p : persons) { - addProperty(new UPNP.PRODUCER(p)); - } - return this; - } - - public URI getFirstAlbumArtURI() { - return getFirstPropertyValue(UPNP.ALBUM_ART_URI.class); - } - - public URI[] getAlbumArtURIs() { - List list = getPropertyValues(UPNP.ALBUM_ART_URI.class); - return list.toArray(new URI[list.size()]); - } - - public MusicAlbum setAlbumArtURIs(URI[] uris) { - removeProperties(UPNP.ALBUM_ART_URI.class); - for (URI uri : uris) { - addProperty(new UPNP.ALBUM_ART_URI(uri)); - } - return this; - } - - public String getToc() { - return getFirstPropertyValue(UPNP.TOC.class); - } - - public MusicAlbum setToc(String toc) { - replaceFirstProperty(new UPNP.TOC(toc)); - return this; - } - - public MusicTrack[] getMusicTracks() { - List list = new ArrayList(); - for (Item item : getItems()) { - if (item instanceof MusicTrack) list.add((MusicTrack)item); - } - return list.toArray(new MusicTrack[list.size()]); - } - - public void addMusicTracks(List musicTracks) { - addMusicTracks(musicTracks.toArray(new MusicTrack[musicTracks.size()])); - } - - public void addMusicTracks(MusicTrack[] musicTracks) { - if (musicTracks != null) { - for (MusicTrack musicTrack : musicTracks) { - musicTrack.setAlbum(getTitle()); - addItem(musicTrack); - } - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/MusicArtist.java b/app/src/main/java/org/fourthline/cling/support/model/container/MusicArtist.java deleted file mode 100644 index ee7d8c8..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/MusicArtist.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -import java.net.URI; -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class MusicArtist extends PersonContainer { - - public static final Class CLASS = new Class("object.container.person.musicArtist"); - - public MusicArtist() { - setClazz(CLASS); - } - - public MusicArtist(Container other) { - super(other); - } - - public MusicArtist(String id, Container parent, String title, String creator, Integer childCount) { - this(id, parent.getId(), title, creator, childCount); - } - - public MusicArtist(String id, String parentID, String title, String creator, Integer childCount) { - super(id, parentID, title, creator, childCount); - setClazz(CLASS); - } - - public String getFirstGenre() { - return getFirstPropertyValue(UPNP.GENRE.class); - } - - public String[] getGenres() { - List list = getPropertyValues(UPNP.GENRE.class); - return list.toArray(new String[list.size()]); - } - - public MusicArtist setGenres(String[] genres) { - removeProperties(UPNP.GENRE.class); - for (String genre : genres) { - addProperty(new UPNP.GENRE(genre)); - } - return this; - } - - public URI getArtistDiscographyURI() { - return getFirstPropertyValue(UPNP.ARTIST_DISCO_URI.class); - } - - public MusicArtist setArtistDiscographyURI(URI uri) { - replaceFirstProperty(new UPNP.ARTIST_DISCO_URI(uri)); - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/MusicGenre.java b/app/src/main/java/org/fourthline/cling/support/model/container/MusicGenre.java deleted file mode 100644 index ca59619..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/MusicGenre.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -/** - * @author Christian Bauer - */ -public class MusicGenre extends GenreContainer { - - public static final Class CLASS = new Class("object.container.genre.musicGenre"); - - public MusicGenre() { - setClazz(CLASS); - } - - public MusicGenre(Container other) { - super(other); - } - - public MusicGenre(String id, Container parent, String title, String creator, Integer childCount) { - this(id, parent.getId(), title, creator, childCount); - } - - public MusicGenre(String id, String parentID, String title, String creator, Integer childCount) { - super(id, parentID, title, creator, childCount); - setClazz(CLASS); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/PersonContainer.java b/app/src/main/java/org/fourthline/cling/support/model/container/PersonContainer.java deleted file mode 100644 index 1007639..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/PersonContainer.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -import static org.fourthline.cling.support.model.DIDLObject.Property.DC; - -/** - * @author Christian Bauer - */ -public class PersonContainer extends Container { - - public static final Class CLASS = new Class("object.container.person"); - - public PersonContainer() { - setClazz(CLASS); - } - - public PersonContainer(Container other) { - super(other); - } - - public PersonContainer(String id, Container parent, String title, String creator, Integer childCount) { - this(id, parent.getId(), title, creator, childCount); - } - - public PersonContainer(String id, String parentID, String title, String creator, Integer childCount) { - super(id, parentID, title, creator, CLASS, childCount); - } - - public String getLanguage() { - return getFirstPropertyValue(DC.LANGUAGE.class); - } - - public PersonContainer setLanguage(String language) { - replaceFirstProperty(new DC.LANGUAGE(language)); - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/PhotoAlbum.java b/app/src/main/java/org/fourthline/cling/support/model/container/PhotoAlbum.java deleted file mode 100644 index 56ee76d..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/PhotoAlbum.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -import org.fourthline.cling.support.model.item.Item; -import org.fourthline.cling.support.model.item.Photo; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Christian Bauer - */ -public class PhotoAlbum extends Album { - - public static final Class CLASS = new Class("object.container.album.photoAlbum"); - - public PhotoAlbum() { - setClazz(CLASS); - } - - public PhotoAlbum(Container other) { - super(other); - } - - public PhotoAlbum(String id, Container parent, String title, String creator, Integer childCount) { - this(id, parent.getId(), title, creator, childCount, new ArrayList()); - } - - public PhotoAlbum(String id, Container parent, String title, String creator, Integer childCount, List photos) { - this(id, parent.getId(), title, creator, childCount, photos); - } - - public PhotoAlbum(String id, String parentID, String title, String creator, Integer childCount) { - this(id, parentID, title, creator, childCount, new ArrayList()); - } - - public PhotoAlbum(String id, String parentID, String title, String creator, Integer childCount, List photos) { - super(id, parentID, title, creator, childCount); - setClazz(CLASS); - addPhotos(photos); - } - - public Photo[] getPhotos() { - List list = new ArrayList(); - for (Item item : getItems()) { - if (item instanceof Photo) list.add((Photo)item); - } - return list.toArray(new Photo[list.size()]); - } - - public void addPhotos(List photos) { - addPhotos(photos.toArray(new Photo[photos.size()])); - } - - public void addPhotos(Photo[] photos) { - if (photos != null) { - for (Photo photo : photos) { - photo.setAlbum(getTitle()); - addItem(photo); - } - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/PlaylistContainer.java b/app/src/main/java/org/fourthline/cling/support/model/container/PlaylistContainer.java deleted file mode 100644 index 1d8b1a0..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/PlaylistContainer.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -import org.fourthline.cling.support.model.Person; -import org.fourthline.cling.support.model.PersonWithRole; -import org.fourthline.cling.support.model.StorageMedium; - -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.DC; -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class PlaylistContainer extends Container { - - public static final Class CLASS = new Class("object.container.playlist"); - - public PlaylistContainer() { - setClazz(CLASS); - } - - public PlaylistContainer(Container other) { - super(other); - } - - public PlaylistContainer(String id, Container parent, String title, String creator, Integer childCount) { - this(id, parent.getId(), title, creator, childCount); - } - - public PlaylistContainer(String id, String parentID, String title, String creator, Integer childCount) { - super(id, parentID, title, creator, CLASS, childCount); - } - - public PersonWithRole getFirstArtist() { - return getFirstPropertyValue(UPNP.ARTIST.class); - } - - public PersonWithRole[] getArtists() { - List list = getPropertyValues(UPNP.ARTIST.class); - return list.toArray(new PersonWithRole[list.size()]); - } - - public PlaylistContainer setArtists(PersonWithRole[] artists) { - removeProperties(UPNP.ARTIST.class); - for (PersonWithRole artist : artists) { - addProperty(new UPNP.ARTIST(artist)); - } - return this; - } - - public String getFirstGenre() { - return getFirstPropertyValue(UPNP.GENRE.class); - } - - public String[] getGenres() { - List list = getPropertyValues(UPNP.GENRE.class); - return list.toArray(new String[list.size()]); - } - - public PlaylistContainer setGenres(String[] genres) { - removeProperties(UPNP.GENRE.class); - for (String genre : genres) { - addProperty(new UPNP.GENRE(genre)); - } - return this; - } - - public String getDescription() { - return getFirstPropertyValue(DC.DESCRIPTION.class); - } - - public PlaylistContainer setDescription(String description) { - replaceFirstProperty(new DC.DESCRIPTION(description)); - return this; - } - - public String getLongDescription() { - return getFirstPropertyValue(UPNP.LONG_DESCRIPTION.class); - } - - public PlaylistContainer setLongDescription(String description) { - replaceFirstProperty(new UPNP.LONG_DESCRIPTION(description)); - return this; - } - - public Person getFirstProducer() { - return getFirstPropertyValue(UPNP.PRODUCER.class); - } - - public Person[] getProducers() { - List list = getPropertyValues(UPNP.PRODUCER.class); - return list.toArray(new Person[list.size()]); - } - - public PlaylistContainer setProducers(Person[] persons) { - removeProperties(UPNP.PRODUCER.class); - for (Person p : persons) { - addProperty(new UPNP.PRODUCER(p)); - } - return this; - } - - public StorageMedium getStorageMedium() { - return getFirstPropertyValue(UPNP.STORAGE_MEDIUM.class); - } - - public PlaylistContainer setStorageMedium(StorageMedium storageMedium) { - replaceFirstProperty(new UPNP.STORAGE_MEDIUM(storageMedium)); - return this; - } - - public String getDate() { - return getFirstPropertyValue(DC.DATE.class); - } - - public PlaylistContainer setDate(String date) { - replaceFirstProperty(new DC.DATE(date)); - return this; - } - - public String getFirstRights() { - return getFirstPropertyValue(DC.RIGHTS.class); - } - - public String[] getRights() { - List list = getPropertyValues(DC.RIGHTS.class); - return list.toArray(new String[list.size()]); - } - - public PlaylistContainer setRights(String[] rights) { - removeProperties(DC.RIGHTS.class); - for (String right : rights) { - addProperty(new DC.RIGHTS(right)); - } - return this; - } - - public Person getFirstContributor() { - return getFirstPropertyValue(DC.CONTRIBUTOR.class); - } - - public Person[] getContributors() { - List list = getPropertyValues(DC.CONTRIBUTOR.class); - return list.toArray(new Person[list.size()]); - } - - public PlaylistContainer setContributors(Person[] contributors) { - removeProperties(DC.CONTRIBUTOR.class); - for (Person p : contributors) { - addProperty(new DC.CONTRIBUTOR(p)); - } - return this; - } - - public String getLanguage() { - return getFirstPropertyValue(DC.LANGUAGE.class); - } - - public PlaylistContainer setLanguage(String language) { - replaceFirstProperty(new DC.LANGUAGE(language)); - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/StorageFolder.java b/app/src/main/java/org/fourthline/cling/support/model/container/StorageFolder.java deleted file mode 100644 index 2b191a9..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/StorageFolder.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class StorageFolder extends Container { - - public static final Class CLASS = new Class("object.container.storageFolder"); - - public StorageFolder() { - setClazz(CLASS); - } - - public StorageFolder(Container other) { - super(other); - } - - public StorageFolder(String id, Container parent, String title, String creator, Integer childCount, - Long storageUsed) { - this(id, parent.getId(), title, creator, childCount, storageUsed); - } - - public StorageFolder(String id, String parentID, String title, String creator, Integer childCount, - Long storageUsed) { - super(id, parentID, title, creator, CLASS, childCount); - if (storageUsed!= null) - setStorageUsed(storageUsed); - } - - public Long getStorageUsed() { - return getFirstPropertyValue(UPNP.STORAGE_USED.class); - } - - public StorageFolder setStorageUsed(Long l) { - replaceFirstProperty(new UPNP.STORAGE_USED(l)); - return this; - } - - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/StorageSystem.java b/app/src/main/java/org/fourthline/cling/support/model/container/StorageSystem.java deleted file mode 100644 index 49462ce..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/StorageSystem.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -import org.fourthline.cling.support.model.StorageMedium; - -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class StorageSystem extends Container { - - public static final Class CLASS = new Class("object.container.storageSystem"); - - public StorageSystem() { - setClazz(CLASS); - } - - public StorageSystem(Container other) { - super(other); - } - - public StorageSystem(String id, Container parent, String title, String creator, Integer childCount, - Long storageTotal, Long storageUsed, Long storageFree, Long storageMaxPartition, StorageMedium storageMedium) { - this(id, parent.getId(), title, creator, childCount, storageTotal, storageUsed, storageFree, storageMaxPartition, storageMedium); - } - - public StorageSystem(String id, String parentID, String title, String creator, Integer childCount, - Long storageTotal, Long storageUsed, Long storageFree, Long storageMaxPartition, StorageMedium storageMedium) { - super(id, parentID, title, creator, CLASS, childCount); - if (storageTotal != null) - setStorageTotal(storageTotal); - if (storageUsed!= null) - setStorageUsed(storageUsed); - if (storageFree != null) - setStorageFree(storageFree); - if (storageMaxPartition != null) - setStorageMaxPartition(storageMaxPartition); - if (storageMedium != null) - setStorageMedium(storageMedium); - } - - public Long getStorageTotal() { - return getFirstPropertyValue(UPNP.STORAGE_TOTAL.class); - } - - public StorageSystem setStorageTotal(Long l) { - replaceFirstProperty(new UPNP.STORAGE_TOTAL(l)); - return this; - } - - public Long getStorageUsed() { - return getFirstPropertyValue(UPNP.STORAGE_USED.class); - } - - public StorageSystem setStorageUsed(Long l) { - replaceFirstProperty(new UPNP.STORAGE_USED(l)); - return this; - } - - public Long getStorageFree() { - return getFirstPropertyValue(UPNP.STORAGE_FREE.class); - } - - public StorageSystem setStorageFree(Long l) { - replaceFirstProperty(new UPNP.STORAGE_FREE(l)); - return this; - } - - public Long getStorageMaxPartition() { - return getFirstPropertyValue(UPNP.STORAGE_MAX_PARTITION.class); - } - - public StorageSystem setStorageMaxPartition(Long l) { - replaceFirstProperty(new UPNP.STORAGE_MAX_PARTITION(l)); - return this; - } - - public StorageMedium getStorageMedium() { - return getFirstPropertyValue(UPNP.STORAGE_MEDIUM.class); - } - - public StorageSystem setStorageMedium(StorageMedium storageMedium) { - replaceFirstProperty(new UPNP.STORAGE_MEDIUM(storageMedium)); - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/container/StorageVolume.java b/app/src/main/java/org/fourthline/cling/support/model/container/StorageVolume.java deleted file mode 100644 index 3a83223..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/container/StorageVolume.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.container; - -import org.fourthline.cling.support.model.StorageMedium; - -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class StorageVolume extends Container { - - public static final Class CLASS = new Class("object.container.storageVolume"); - - public StorageVolume() { - setClazz(CLASS); - } - - public StorageVolume(Container other) { - super(other); - } - - public StorageVolume(String id, Container parent, String title, String creator, Integer childCount, - Long storageTotal, Long storageUsed, Long storageFree, StorageMedium storageMedium) { - this(id, parent.getId(), title, creator, childCount, storageTotal, storageUsed, storageFree, storageMedium); - } - - public StorageVolume(String id, String parentID, String title, String creator, Integer childCount, - Long storageTotal, Long storageUsed, Long storageFree, StorageMedium storageMedium) { - super(id, parentID, title, creator, CLASS, childCount); - if (storageTotal != null) - setStorageTotal(storageTotal); - if (storageUsed!= null) - setStorageUsed(storageUsed); - if (storageFree != null) - setStorageFree(storageFree); - if (storageMedium != null) - setStorageMedium(storageMedium); - } - - public Long getStorageTotal() { - return getFirstPropertyValue(UPNP.STORAGE_TOTAL.class); - } - - public StorageVolume setStorageTotal(Long l) { - replaceFirstProperty(new UPNP.STORAGE_TOTAL(l)); - return this; - } - - public Long getStorageUsed() { - return getFirstPropertyValue(UPNP.STORAGE_USED.class); - } - - public StorageVolume setStorageUsed(Long l) { - replaceFirstProperty(new UPNP.STORAGE_USED(l)); - return this; - } - - public Long getStorageFree() { - return getFirstPropertyValue(UPNP.STORAGE_FREE.class); - } - - public StorageVolume setStorageFree(Long l) { - replaceFirstProperty(new UPNP.STORAGE_FREE(l)); - return this; - } - - public StorageMedium getStorageMedium() { - return getFirstPropertyValue(UPNP.STORAGE_MEDIUM.class); - } - - public StorageVolume setStorageMedium(StorageMedium storageMedium) { - replaceFirstProperty(new UPNP.STORAGE_MEDIUM(storageMedium)); - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAAttribute.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAAttribute.java deleted file mode 100644 index cb43df3..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAAttribute.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna; - -import org.seamless.util.Exceptions; - -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Transforms known and standardized DLNA attributes from/to string representation. - *

- * The {@link #newInstance(org.fourthline.cling.support.model.dlna.DLNAAttribute.Type, String, String)} - * method attempts to instantiate the best header subtype for a given header (name) and string value. - *

- * - * @author Christian Bauer - * @author Mario Franco - */ -public abstract class DLNAAttribute { - - final private static Logger log = Logger.getLogger(DLNAAttribute.class.getName()); - - /** - * Maps a standardized DLNA attribute to potential attribute subtypes. - */ - public static enum Type { - - /** - * Order is important for DLNAProtocolInfo - */ - DLNA_ORG_PN("DLNA.ORG_PN", DLNAProfileAttribute.class), - DLNA_ORG_OP("DLNA.ORG_OP", DLNAOperationsAttribute.class), - DLNA_ORG_PS("DLNA.ORG_PS", DLNAPlaySpeedAttribute.class), - DLNA_ORG_CI("DLNA.ORG_CI", DLNAConversionIndicatorAttribute.class), - DLNA_ORG_FLAGS("DLNA.ORG_FLAGS", DLNAFlagsAttribute.class); - - private static Map byName = new HashMap() { - { - for (Type t : Type.values()) { - put(t.getAttributeName().toUpperCase(), t); - } - } - }; - - private String attributeName; - private Class[] attributeTypes; - - private Type(String attributeName, Class... attributeClass) { - this.attributeName = attributeName; - this.attributeTypes = attributeClass; - } - - public String getAttributeName() { - return attributeName; - } - - public Class[] getAttributeTypes() { - return attributeTypes; - } - - public static Type valueOfAttributeName(String attributeName) { - if (attributeName == null) { - return null; - } - return byName.get(attributeName.toUpperCase()); - } - } - - private T value; - - public void setValue(T value) { - this.value = value; - } - - public T getValue() { - return value; - } - - /** - * @param s This attribute's value as a string representation. - * @param cf This attribute's mime type as a string representation, optional. - * @throws InvalidDLNAProtocolAttributeException - * If the value is invalid for this DLNA attribute. - */ - public abstract void setString(String s, String cf) throws InvalidDLNAProtocolAttributeException; - - /** - * @return A string representing this attribute's value. - */ - public abstract String getString(); - - /** - * Create a new instance of a {@link DLNAAttribute} subtype that matches the given type and value. - *

- * This method iterates through all potential attribute subtype classes as declared in {@link Type}. - * It creates a new instance of the subtype class and calls its {@link #setString(String, String)} method. - * If no {@link org.fourthline.cling.support.model.dlna.InvalidDLNAProtocolAttributeException} is thrown, - * the subtype instance is returned. - *

- * - * @param type The type of the attribute. - * @param attributeValue The value of the attribute. - * @param contentFormat The DLNA mime type of the attribute, optional. - * @return The best matching attribute subtype instance, or null if no subtype can be found. - */ - public static DLNAAttribute newInstance(DLNAAttribute.Type type, String attributeValue, String contentFormat) { - - DLNAAttribute attr = null; - for (int i = 0; i < type.getAttributeTypes().length && attr == null; i++) { - Class attributeClass = type.getAttributeTypes()[i]; - try { - log.finest("Trying to parse DLNA '" + type + "' with class: " + attributeClass.getSimpleName()); - attr = attributeClass.newInstance(); - if (attributeValue != null) { - attr.setString(attributeValue, contentFormat); - } - } catch (InvalidDLNAProtocolAttributeException ex) { - log.finest("Invalid DLNA attribute value for tested type: " + attributeClass.getSimpleName() + " - " + ex.getMessage()); - attr = null; - } catch (Exception ex) { - log.severe("Error instantiating DLNA attribute of type '" + type + "' with value: " + attributeValue); - log.log(Level.SEVERE, "Exception root cause: ", Exceptions.unwrap(ex)); - } - } - return attr; - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ") '" + getValue() + "'"; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAConversionIndicator.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAConversionIndicator.java deleted file mode 100644 index c70c0f5..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAConversionIndicator.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna; - -/** DLNA.ORG_CI: conversion indicator parameter (integer) - *
- *     0 not transcoded
- *     1 transcoded
- * 
- * - * @author Mario Franco - */ -public enum DLNAConversionIndicator { - - NONE(0), - TRANSCODED(1); - - private int code; - - DLNAConversionIndicator(int code) { - this.code = code; - } - - public int getCode() { - return code; - } - - public static DLNAConversionIndicator valueOf(int code) { - for (DLNAConversionIndicator errorCode : values()) { - if (errorCode.getCode() == code) { - return errorCode; - } - } - return null; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAConversionIndicatorAttribute.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAConversionIndicatorAttribute.java deleted file mode 100644 index ce9c542..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAConversionIndicatorAttribute.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna; - -/** - * @author Mario Franco - */ -public class DLNAConversionIndicatorAttribute extends DLNAAttribute { - - public DLNAConversionIndicatorAttribute() { - setValue(DLNAConversionIndicator.NONE); - } - - public DLNAConversionIndicatorAttribute(DLNAConversionIndicator indicator) { - setValue(indicator); - } - - public void setString(String s, String cf) throws InvalidDLNAProtocolAttributeException { - DLNAConversionIndicator value = null; - try { - value = DLNAConversionIndicator.valueOf(Integer.parseInt(s)); - } catch (NumberFormatException numberFormatException) { - } - if (value == null) { - throw new InvalidDLNAProtocolAttributeException("Can't parse DLNA play speed integer from: " + s); - } - setValue(value); - } - - public String getString() { - return Integer.toString(getValue().getCode()); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAFlags.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAFlags.java deleted file mode 100644 index 98f1d5b..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAFlags.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna; - -/** DLNA.ORG_FLAGS, padded with 24 trailing 0s - * - *
- *     80000000  31  senderPaced
- *     40000000  30  lsopTimeBasedSeekSupported
- *     20000000  29  lsopByteBasedSeekSupported
- *     10000000  28  playcontainerSupported
- *      8000000  27  s0IncreasingSupported
- *      4000000  26  sNIncreasingSupported
- *      2000000  25  rtspPauseSupported
- *      1000000  24  streamingTransferModeSupported
- *       800000  23  interactiveTransferModeSupported
- *       400000  22  backgroundTransferModeSupported
- *       200000  21  connectionStallingSupported
- *       100000  20  dlnaVersion15Supported
- *
- *     Example: (1 << 24) | (1 << 22) | (1 << 21) | (1 << 20)
- *       DLNA.ORG_FLAGS=01700000[000000000000000000000000] // [] show padding
- * 
- * - * @author Mario Franco - */ -public enum DLNAFlags { - - SENDER_PACED(1 << 31), - TIME_BASED_SEEK(1 << 30), - BYTE_BASED_SEEK(1 << 29), - FLAG_PLAY_CONTAINER(1 << 28), - S0_INCREASE(1 << 27), - SN_INCREASE(1 << 26), - RTSP_PAUSE(1 << 25), - STREAMING_TRANSFER_MODE(1 << 24), - INTERACTIVE_TRANSFERT_MODE(1 << 23), - BACKGROUND_TRANSFERT_MODE(1 << 22), - CONNECTION_STALL(1 << 21), - DLNA_V15(1 << 20); - - private int code; - - DLNAFlags(int code) { - this.code = code; - } - - public int getCode() { - return code; - } - - public static DLNAFlags valueOf(int code) { - for (DLNAFlags errorCode : values()) { - if (errorCode.getCode() == code) { - return errorCode; - } - } - return null; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAFlagsAttribute.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAFlagsAttribute.java deleted file mode 100644 index 82812ba..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAFlagsAttribute.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna; - -import java.util.EnumSet; - -/** - * @author Mario Franco - */ -public class DLNAFlagsAttribute extends DLNAAttribute> { - - public DLNAFlagsAttribute() { - setValue(EnumSet.noneOf(DLNAFlags.class)); - } - - public DLNAFlagsAttribute(DLNAFlags... flags) { - if (flags != null && flags.length > 0) { - DLNAFlags first = flags[0]; - if (flags.length > 1) { - System.arraycopy(flags, 1, flags, 0, flags.length - 1); - setValue(EnumSet.of(first, flags)); - } else { - setValue(EnumSet.of(first)); - } - } - } - - public void setString(String s, String cf) throws InvalidDLNAProtocolAttributeException { - EnumSet value = EnumSet.noneOf(DLNAFlags.class); - try { - int parseInt = Integer.parseInt(s.substring(0, s.length() - 24), 16); - for (DLNAFlags op : DLNAFlags.values()) { - int code = op.getCode() & parseInt; - if (op.getCode() == code) { - value.add(op); - } - } - } catch (Exception e) { - } - - if (value.isEmpty()) - throw new InvalidDLNAProtocolAttributeException("Can't parse DLNA flags integer from: " + s); - - setValue(value); - } - - public String getString() { - int code = 0; - for (DLNAFlags op : getValue()) { - code |= op.getCode(); - } - return String.format("%08x%024x", code, 0); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAOperations.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAOperations.java deleted file mode 100644 index b6676e8..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAOperations.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna; - -/** - * DLNA.ORG_OP: operations parameter (string) - * - *
- *     "00" (or "0") neither time seek range nor range supported
- *     "01" range supported
- *     "10" time seek range supported
- *     "11" both time seek range and range supported
- * 
- * - * @author Mario Franco - */ -public enum DLNAOperations { - - NONE(0x00), - RANGE(0x01), - TIMESEEK(0x10); - - private int code; - - DLNAOperations(int code) { - this.code = code; - } - - public int getCode() { - return code; - } - - public static DLNAOperations valueOf(int code) { - for (DLNAOperations errorCode : values()) { - if (errorCode.getCode() == code) { - return errorCode; - } - } - return null; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAOperationsAttribute.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAOperationsAttribute.java deleted file mode 100644 index e0378ea..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAOperationsAttribute.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna; - -import java.util.EnumSet; - -/** - * @author Mario Franco - */ -public class DLNAOperationsAttribute extends DLNAAttribute> { - - public DLNAOperationsAttribute() { - setValue(EnumSet.of(DLNAOperations.NONE)); - } - - public DLNAOperationsAttribute(DLNAOperations... op) { - if (op != null && op.length > 0) { - DLNAOperations first = op[0]; - if (op.length > 1) { - System.arraycopy(op, 1, op, 0, op.length - 1); - setValue(EnumSet.of(first, op)); - } else { - setValue(EnumSet.of(first)); - } - } - } - - public void setString(String s, String cf) throws InvalidDLNAProtocolAttributeException { - EnumSet value = EnumSet.noneOf(DLNAOperations.class); - try { - int parseInt = Integer.parseInt(s, 16); - for (DLNAOperations op : DLNAOperations.values()) { - int code = op.getCode() & parseInt; - if (op != DLNAOperations.NONE && (op.getCode() == code)) { - value.add(op); - } - } - } catch (NumberFormatException numberFormatException) { - } - - if (value.isEmpty()) - throw new InvalidDLNAProtocolAttributeException("Can't parse DLNA operations integer from: " + s); - - setValue(value); - } - - public String getString() { - int code = DLNAOperations.NONE.getCode(); - for (DLNAOperations op : getValue()) { - code |= op.getCode(); - } - return String.format("%02x", code); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAPlaySpeedAttribute.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAPlaySpeedAttribute.java deleted file mode 100644 index 50c14a1..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAPlaySpeedAttribute.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna; - -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.support.avtransport.lastchange.AVTransportVariable.TransportPlaySpeed; - -/** - * @author Mario Franco - */ -public class DLNAPlaySpeedAttribute extends DLNAAttribute { - - public DLNAPlaySpeedAttribute() { - setValue(new TransportPlaySpeed[] {}); - } - - public DLNAPlaySpeedAttribute(TransportPlaySpeed[] speeds) { - setValue(speeds); - } - - public DLNAPlaySpeedAttribute(String[] speeds) { - TransportPlaySpeed[] sp = new TransportPlaySpeed[speeds.length]; - try { - for (int i = 0; i < speeds.length; i++) { - sp[i] = new TransportPlaySpeed(speeds[i]); - } - } catch (InvalidValueException invalidValueException) { - throw new InvalidDLNAProtocolAttributeException("Can't parse DLNA play speeds."); - } - setValue(sp); - } - - public void setString(String s, String cf) throws InvalidDLNAProtocolAttributeException { - TransportPlaySpeed[] value = null; - if (s != null && s.length() != 0) { - String[] speeds = s.split(","); - try { - value = new TransportPlaySpeed[speeds.length]; - for (int i = 0; i < speeds.length; i++) { - value[i] = new TransportPlaySpeed(speeds[i]); - } - } catch (InvalidValueException invalidValueException) { - value = null; - } - } - if (value == null) { - throw new InvalidDLNAProtocolAttributeException("Can't parse DLNA play speeds from: " + s); - } - setValue(value); - } - - public String getString() { - String s = ""; - for (TransportPlaySpeed speed : getValue()) { - if (speed.getValue().equals("1")) - continue; - s += (s.length() == 0 ? "" : ",") + speed; - } - return s; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProfileAttribute.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProfileAttribute.java deleted file mode 100644 index 4c83d2d..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProfileAttribute.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna; - -/** - * @author Mario Franco - */ -public class DLNAProfileAttribute extends DLNAAttribute { - - public DLNAProfileAttribute() { - setValue(DLNAProfiles.NONE); - } - - public DLNAProfileAttribute(DLNAProfiles profile) { - setValue(profile); - } - - public void setString(String s, String cf) throws InvalidDLNAProtocolAttributeException { - DLNAProfiles value = DLNAProfiles.valueOf(s, cf); - if (value == null) { - throw new InvalidDLNAProtocolAttributeException("Can't parse DLNA profile from: " + s); - } - setValue(value); - } - - public String getString() { - return getValue().getCode(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProfiles.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProfiles.java deleted file mode 100644 index 1c60db3..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProfiles.java +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna; - -/** - * DLNA.ORG_PN: DLNA Profiles - * - * @author Mario Franco - */ -public enum DLNAProfiles { - - NONE("",""), - - //Image - JPEG_SM("JPEG_SM", DLNAMimeTypes.MIME_IMAGE_JPEG), /* Profile for image media class content of small resolution */ - JPEG_MED("JPEG_MED", DLNAMimeTypes.MIME_IMAGE_JPEG), /* Profile for image media class content of medium resolution */ - JPEG_LRG("JPEG_LRG", DLNAMimeTypes.MIME_IMAGE_JPEG), /* Profile for image media class content of high resolution */ - JPEG_TN("JPEG_TN", DLNAMimeTypes.MIME_IMAGE_JPEG), /* Profile for image thumbnails */ - JPEG_SM_ICO("JPEG_SM_ICO", DLNAMimeTypes.MIME_IMAGE_JPEG), /* Profile for small icons */ - JPEG_LRG_ICO("JPEG_LRG_ICO", DLNAMimeTypes.MIME_IMAGE_JPEG), /* Profile for large icons */ - - PNG_TN("PNG_TN", DLNAMimeTypes.MIME_IMAGE_PNG), /* Profile for image thumbnails */ - PNG_SM_ICO("PNG_SM_ICO", DLNAMimeTypes.MIME_IMAGE_PNG), /* Profile for small icons */ - PNG_LRG_ICO("PNG_LRG_ICO", DLNAMimeTypes.MIME_IMAGE_PNG), /* Profile for image class content of high resolution */ - PNG_LRG("PNG_LRG", DLNAMimeTypes.MIME_IMAGE_PNG), - - //Audio - LPCM("LPCM",DLNAMimeTypes.MIME_AUDIO_LPCM), - LPCM_LOW("LPCM_low",DLNAMimeTypes.MIME_AUDIO_LPCM), - - MP3("MP3",DLNAMimeTypes.MIME_AUDIO_MPEG), - MP3X("MP3X",DLNAMimeTypes.MIME_AUDIO_MPEG), - - WMABASE("WMABASE",DLNAMimeTypes.MIME_AUDIO_WMA), - WMAFULL("WMAFULL",DLNAMimeTypes.MIME_AUDIO_WMA), - WMAPRO("WMAPRO",DLNAMimeTypes.MIME_AUDIO_WMA), - - AAC_ADTS("AAC_ADTS", DLNAMimeTypes.MIME_AUDIO_ADTS), - AAC_ADTS_320("AAC_ADTS_320", DLNAMimeTypes.MIME_AUDIO_ADTS), - AAC_ISO("AAC_ISO", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - AAC_ISO_320("AAC_ISO_320", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - AAC_LTP_ISO("AAC_LTP_ISO", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - AAC_LTP_MULT5_ISO("AAC_LTP_MULT5_ISO", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - AAC_LTP_MULT7_ISO("AAC_LTP_MULT7_ISO", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - AAC_MULT5_ADTS("AAC_MULT5_ADTS", DLNAMimeTypes.MIME_AUDIO_ADTS), - AAC_MULT5_ISO("AAC_MULT5_ISO", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - - HEAAC_L2_ADTS("HEAAC_L2_ADTS", DLNAMimeTypes.MIME_AUDIO_ADTS), - HEAAC_L2_ISO("HEAAC_L2_ISO", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - HEAAC_L3_ADTS("HEAAC_L3_ADTS", DLNAMimeTypes.MIME_AUDIO_ADTS), - HEAAC_L3_ISO("HEAAC_L3_ISO", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - HEAAC_MULT5_ADTS("HEAAC_MULT5_ADTS", DLNAMimeTypes.MIME_AUDIO_ADTS), - HEAAC_MULT5_ISO("HEAAC_MULT5_ISO", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - HEAAC_L2_ADTS_320("HEAAC_L2_ADTS_320", DLNAMimeTypes.MIME_AUDIO_ADTS), - HEAAC_L2_ISO_320("HEAAC_L2_ISO_320", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - - BSAC_ISO("BSAC_ISO", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - BSAC_MULT5_ISO("BSAC_MULT5_ISO", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - - HEAACv2_L2("HEAACv2_L2", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - HEAACv2_L2_ADTS("HEAACv2_L2", DLNAMimeTypes.MIME_AUDIO_ADTS), - HEAACv2_L2_320("HEAACv2_L2_320", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - HEAACv2_L2_320_ADTS("HEAACv2_L2_320", DLNAMimeTypes.MIME_AUDIO_ADTS), - HEAACv2_L3("HEAACv2_L3", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - HEAACv2_L3_ADTS("HEAACv2_L3", "vnd.dlna.adts"), - HEAACv2_MULT5("HEAACv2_MULT5", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - HEAACv2_MULT5_ADTS("HEAACv2_MULT5", "vnd.dlna.adts"), - - AC3("AC3", DLNAMimeTypes.MIME_AUDIO_DOLBY_DIGITAL), - - AMR("AMR_3GPP", DLNAMimeTypes.MIME_AUDIO_MPEG_4), - THREE_GPP("AMR_3GPP", DLNAMimeTypes.MIME_AUDIO_3GP), - - AMR_WBplus("AMR_WBplus", DLNAMimeTypes.MIME_AUDIO_3GP), - ATRAC3("ATRAC3plus", DLNAMimeTypes.MIME_AUDIO_ATRAC), - - //Video - WMVMED_BASE("WMVMED_BASE", DLNAMimeTypes.MIME_VIDEO_WMV), - WMVMED_FULL("WMVMED_FULL", DLNAMimeTypes.MIME_VIDEO_WMV), - WMVMED_PRO("WMVMED_PRO", DLNAMimeTypes.MIME_VIDEO_WMV), - WMVHIGH_FULL("WMVHIGH_FULL", DLNAMimeTypes.MIME_VIDEO_WMV), - WMVHIGH_PRO("WMVHIGH_PRO", DLNAMimeTypes.MIME_VIDEO_WMV), - WMVHM_BASE("WMVHM_BASE", DLNAMimeTypes.MIME_VIDEO_WMV), - WMVSPLL_BASE("WMVSPLL_BASE", DLNAMimeTypes.MIME_VIDEO_WMV), - WMVSPML_BASE("WMVSPML_BASE", DLNAMimeTypes.MIME_VIDEO_WMV), - WMVSPML_MP3("WMVSPML_MP3", DLNAMimeTypes.MIME_VIDEO_WMV), - - MPEG1("MPEG1", DLNAMimeTypes.MIME_VIDEO_MPEG), - - MPEG_PS_NTSC("MPEG_PS_NTSC", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG_PS_NTSC_XAC3("MPEG_PS_NTSC_XAC3", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG_PS_PAL("MPEG_PS_PAL", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG_PS_PAL_XAC3("MPEG_PS_PAL_XAC3", DLNAMimeTypes.MIME_VIDEO_MPEG), - - MPEG_TS_MP_LL_AAC("MPEG_TS_MP_LL_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_MP_LL_AAC_T("MPEG_TS_MP_LL_AAC_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_MP_LL_AAC_ISO("MPEG_TS_MP_LL_AAC_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - - MPEG_TS_SD_50_L2_T("MPEG_TS_SD_50_L2_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_SD_60_L2_T("MPEG_TS_SD_60_L2_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_SD_60_AC3_T("MPEG_TS_SD_60_AC3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - - MPEG_TS_SD_EU("MPEG_TS_SD_EU", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_SD_EU_T("MPEG_TS_SD_EU_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_SD_EU_ISO("MPEG_TS_SD_EU_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG_TS_SD_50_AC3_T("MPEG_TS_SD_50_AC3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - - MPEG_TS_SD_NA("MPEG_TS_SD_NA", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_SD_NA_T("MPEG_TS_SD_NA_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_SD_NA_ISO("MPEG_TS_SD_NA_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG_TS_SD_NA_XAC3("MPEG_TS_SD_NA_XAC3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_SD_NA_XAC3_T("MPEG_TS_SD_NA_XAC3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_SD_NA_XAC3_ISO("MPEG_TS_SD_NA_XAC3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - - MPEG_TS_HD_NA("MPEG_TS_HD_NA", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_HD_NA_T("MPEG_TS_HD_NA_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_HD_50_L2_T("MPEG_TS_HD_50_L2_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_HD_50_L2_ISO("MPEG_TS_HD_50_L2_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG_TS_HD_60_L2_T("MPEG_TS_HD_60_L2_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_HD_60_L2_ISO("MPEG_TS_HD_60_L2_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - - MPEG_TS_HD_NA_ISO("MPEG_TS_HD_NA_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG_TS_HD_NA_XAC3("MPEG_TS_HD_NA_XAC3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_HD_NA_XAC3_T("MPEG_TS_HD_NA_XAC3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG_TS_HD_NA_XAC3_ISO("MPEG_TS_HD_NA_XAC3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - - MPEG_ES_PAL("MPEG_ES_PAL", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG_ES_NTSC("MPEG_ES_NTSC", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG_ES_PAL_XAC3("MPEG_ES_PAL_XAC3", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG_ES_NTSC_XAC3("MPEG_ES_NTSC_XAC3", DLNAMimeTypes.MIME_VIDEO_MPEG), - - MPEG4_P2_MP4_SP_AAC("MPEG4_P2_MP4_SP_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_SP_HEAAC("MPEG4_P2_MP4_SP_HEAAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_SP_ATRAC3plus("MPEG4_P2_MP4_SP_ATRAC3plus", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_SP_AAC_LTP("MPEG4_P2_MP4_SP_AAC_LTP", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_SP_L2_AAC("MPEG4_P2_MP4_SP_L2_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_SP_L2_AMR("MPEG4_P2_MP4_SP_L2_AMR", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_SP_VGA_AAC("MPEG4_P2_MP4_SP_VGA_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_SP_VGA_HEAAC("MPEG4_P2_MP4_SP_VGA_HEAAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_ASP_AAC("MPEG4_P2_MP4_ASP_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_ASP_HEAAC("MPEG4_P2_MP4_ASP_HEAAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_ASP_HEAAC_MULT5("MPEG4_P2_MP4_ASP_HEAAC_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_ASP_ATRAC3plus("MPEG4_P2_MP4_ASP_ATRAC3plus", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_ASP_L5_SO_AAC("MPEG4_P2_MP4_ASP_L5_SO_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_ASP_L5_SO_HEAAC("MPEG4_P2_MP4_ASP_L5_SO_HEAAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_ASP_L5_SO_HEAAC_MULT5("MPEG4_P2_MP4_ASP_L5_SO_HEAAC_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_ASP_L4_SO_AAC("MPEG4_P2_MP4_ASP_L4_SO_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_ASP_L4_SO_HEAAC("MPEG4_P2_MP4_ASP_L4_SO_HEAAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - MPEG4_P2_MP4_ASP_L4_SO_HEAAC_MULT5("MPEG4_P2_MP4_ASP_L4_SO_HEAAC_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - - MPEG4_H263_MP4_P0_L10_AAC("MPEG4_H263_MP4_P0_L10_AAC", DLNAMimeTypes.MIME_VIDEO_3GP), - MPEG4_H263_MP4_P0_L10_AAC_LTP("MPEG4_H263_MP4_P0_L10_AAC_LTP", DLNAMimeTypes.MIME_VIDEO_3GP), - - MPEG4_P2_TS_SP_AAC("MPEG4_P2_TS_SP_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_SP_AAC_T("MPEG4_P2_TS_SP_AAC_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_SP_AAC_ISO("MPEG4_P2_TS_SP_AAC_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG4_P2_TS_SP_MPEG1_L3("MPEG4_P2_TS_SP_MPEG1_L3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_SP_MPEG1_L3_T("MPEG4_P2_TS_SP_MPEG1_L3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_SP_MPEG1_L3_ISO("MPEG4_P2_TS_SP_MPEG1_L3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG4_P2_TS_SP_AC3_L3("MPEG4_P2_TS_SP_AC3_L3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_SP_AC3_T("MPEG4_P2_TS_SP_AC3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_SP_AC3_ISO("MPEG4_P2_TS_SP_AC3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG4_P2_TS_SP_MPEG2_L2("MPEG4_P2_TS_SP_MPEG2_L2", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_SP_MPEG2_L2_T("MPEG4_P2_TS_SP_MPEG2_L2_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_SP_MPEG2_L2_ISO("MPEG4_P2_TS_SP_MPEG2_L2_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG4_P2_TS_ASP_AAC("MPEG4_P2_TS_ASP_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_ASP_AAC_T("MPEG4_P2_TS_ASP_AAC_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_ASP_AAC_ISO("MPEG4_P2_TS_ASP_AAC_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG4_P2_TS_ASP_MPEG1_L3("MPEG4_P2_TS_ASP_MPEG1_L3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_ASP_MPEG1_L3_T("MPEG4_P2_TS_ASP_MPEG1_L3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_ASP_MPEG1_L3_ISO("MPEG4_P2_TS_ASP_MPEG1_L3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG4_P2_TS_ASP_AC3_L3("MPEG4_P2_TS_ASP_AC3_L3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_ASP_AC3_T("MPEG4_P2_TS_ASP_AC3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_ASP_AC3_ISO("MPEG4_P2_TS_ASP_AC3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG4_P2_TS_CO_AC3("MPEG4_P2_TS_CO_AC3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_CO_AC3_T("MPEG4_P2_TS_CO_AC3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_CO_AC3_ISO("MPEG4_P2_TS_CO_AC3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - MPEG4_P2_TS_CO_MPEG2_L2("MPEG4_P2_TS_CO_MPEG2_L2", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_CO_MPEG2_L2_T("MPEG4_P2_TS_CO_MPEG2_L2_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - MPEG4_P2_TS_CO_MPEG2_L2_ISO("MPEG4_P2_TS_CO_MPEG2_L2_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - - MPEG4_P2_ASF_SP_G726("MPEG4_P2_ASF_SP_G726", DLNAMimeTypes.MIME_VIDEO_ASF), - MPEG4_P2_ASF_ASP_L5_SO_G726("MPEG4_P2_ASF_ASP_L5_SO_G726", DLNAMimeTypes.MIME_VIDEO_ASF), - MPEG4_P2_ASF_ASP_L4_SO_G726("MPEG4_P2_ASF_ASP_L4_SO_G726", DLNAMimeTypes.MIME_VIDEO_ASF), - - MPEG4_H263_3GPP_P0_L10_AMR_WBplus("MPEG4_H263_3GPP_P0_L10_AMR_WBplus", DLNAMimeTypes.MIME_VIDEO_3GP), - MPEG4_P2_3GPP_SP_L0B_AAC("MPEG4_P2_3GPP_SP_L0B_AAC", DLNAMimeTypes.MIME_VIDEO_3GP), - MPEG4_P2_3GPP_SP_L0B_AMR("MPEG4_P2_3GPP_SP_L0B_AMR", DLNAMimeTypes.MIME_VIDEO_3GP), - MPEG4_H263_3GPP_P3_L10_AMR("MPEG4_H263_3GPP_P3_L10_AMR", DLNAMimeTypes.MIME_VIDEO_3GP), - - AVC_MP4_MP_SD_AAC_MULT5("AVC_MP4_MP_SD_AAC_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_MP_SD_HEAAC_L2("AVC_MP4_MP_SD_HEAAC_L2", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_MP_SD_MPEG1_L3("AVC_MP4_MP_SD_MPEG1_L3", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_MP_SD_AC3("AVC_MP4_MP_SD_AC3", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_MP_SD_AAC_LTP("AVC_MP4_MP_SD_AAC_LTP", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_MP_SD_AAC_LTP_MULT5("AVC_MP4_MP_SD_AAC_LTP_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_MP_SD_AAC_LTP_MULT7("AVC_MP4_MP_SD_AAC_LTP_MULT7", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_MP_SD_ATRAC3plus("AVC_MP4_MP_SD_ATRAC3plus", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_MP_SD_BSAC("AVC_MP4_MP_SD_BSAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - - AVC_MP4_MP_HD_720p_AAC("AVC_MP4_MP_HD_720p_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_MP_HD_1080i_AAC("AVC_MP4_MP_HD_1080i_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - - AVC_MP4_HP_HD_AAC("AVC_MP4_HP_HD_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - - AVC_MP4_BL_L3L_SD_AAC("AVC_MP4_BL_L3L_SD_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_L3L_SD_HEAAC("AVC_MP4_BL_L3L_SD_HEAAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_L3_SD_AAC("AVC_MP4_BL_L3_SD_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF30_AAC_MULT5("AVC_MP4_BL_CIF30_AAC_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF30_HEAAC_L2("AVC_MP4_BL_CIF30_HEAAC_L2", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF30_MPEG1_L3("AVC_MP4_BL_CIF30_MPEG1_L3", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF30_AC3("AVC_MP4_BL_CIF30_AC3", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF30_AAC_LTP("AVC_MP4_BL_CIF30_AAC_LTP", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF30_AAC_LTP_MULT5("AVC_MP4_BL_CIF30_AAC_LTP_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_L2_CIF30_AAC("AVC_MP4_BL_L2_CIF30_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF30_BSAC("AVC_MP4_BL_CIF30_BSAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF30_BSAC_MULT5("AVC_MP4_BL_CIF30_BSAC_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF15_HEAAC("AVC_MP4_BL_CIF15_HEAAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF15_AMR("AVC_MP4_BL_CIF15_AMR", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF15_AAC("AVC_MP4_BL_CIF15_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF15_AAC_520("AVC_MP4_BL_CIF15_AAC_520", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF15_AAC_LTP("AVC_MP4_BL_CIF15_AAC_LTP", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF15_AAC_LTP_520("AVC_MP4_BL_CIF15_AAC_LTP_520", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_CIF15_BSAC("AVC_MP4_BL_CIF15_BSAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_L12_CIF15_HEAAC("AVC_MP4_BL_L12_CIF15_HEAAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - AVC_MP4_BL_L1B_QCIF15_HEAAC("AVC_MP4_BL_L1B_QCIF15_HEAAC", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - - AVC_TS_MP_SD_AAC_MULT5("AVC_TS_MP_SD_AAC_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_AAC_MULT5_T("AVC_TS_MP_SD_AAC_MULT5_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_AAC_MULT5_ISO("AVC_TS_MP_SD_AAC_MULT5_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_SD_HEAAC_L2("AVC_TS_MP_SD_HEAAC_L2", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_HEAAC_L2_T("AVC_TS_MP_SD_HEAAC_L2_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_HEAAC_L2_ISO("AVC_TS_MP_SD_HEAAC_L2_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_SD_MPEG1_L3("AVC_TS_MP_SD_MPEG1_L3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_MPEG1_L3_T("AVC_TS_MP_SD_MPEG1_L3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_MPEG1_L3_ISO("AVC_TS_MP_SD_MPEG1_L3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_SD_AC3("AVC_TS_MP_SD_AC3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_AC3_T("AVC_TS_MP_SD_AC3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_AC3_ISO("AVC_TS_MP_SD_AC3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_SD_AAC_LTP("AVC_TS_MP_SD_AAC_LTP", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_AAC_LTP_T("AVC_TS_MP_SD_AAC_LTP_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_AAC_LTP_ISO("AVC_TS_MP_SD_AAC_LTP_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_SD_AAC_LTP_MULT5("AVC_TS_MP_SD_AAC_LTP_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_AAC_LTP_MULT5_T("AVC_TS_MP_SD_AAC_LTP_MULT5_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_AAC_LTP_MULT5_ISO("AVC_TS_MP_SD_AAC_LTP_MULT5_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_SD_AAC_LTP_MULT7("AVC_TS_MP_SD_AAC_LTP_MULT7", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_AAC_LTP_MULT7_T("AVC_TS_MP_SD_AAC_LTP_MULT7_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_AAC_LTP_MULT7_ISO("AVC_TS_MP_SD_AAC_LTP_MULT7_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_SD_BSAC("AVC_TS_MP_SD_BSAC", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_BSAC_T("AVC_TS_MP_SD_BSAC_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_SD_BSAC_ISO("AVC_TS_MP_SD_BSAC_ISO",DLNAMimeTypes.MIME_VIDEO_MPEG), - - AVC_TS_HD_24_AC3("AVC_TS_HD_24_AC3",DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_HD_24_AC3_T("AVC_TS_HD_24_AC3_T",DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_HD_24_AC3_ISO("AVC_TS_HD_24_AC3_ISO",DLNAMimeTypes.MIME_VIDEO_MPEG), - - AVC_TS_HD_50_LPCM_T("AVC_TS_HD_50_LPCM_T",DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_HD_50_AC3("AVC_TS_HD_50_AC3",DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_HD_50_AC3_T("AVC_TS_HD_50_AC3_T",DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_HD_50_AC3_ISO("AVC_TS_HD_50_AC3_ISO",DLNAMimeTypes.MIME_VIDEO_MPEG), - - AVC_TS_HD_60_AC3("AVC_TS_HD_60_AC3",DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_HD_60_AC3_T("AVC_TS_HD_60_AC3_T",DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_HD_60_AC3_ISO("AVC_TS_HD_60_AC3_ISO",DLNAMimeTypes.MIME_VIDEO_MPEG), - - AVC_TS_BL_CIF30_AAC_MULT5("AVC_TS_BL_CIF30_AAC_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_AAC_MULT5_T("AVC_TS_BL_CIF30_AAC_MULT5_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_AAC_MULT5_ISO("AVC_TS_BL_CIF30_AAC_MULT5_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_BL_CIF30_HEAAC_L2("AVC_TS_BL_CIF30_HEAAC_L2", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_HEAAC_L2_T("AVC_TS_BL_CIF30_HEAAC_L2_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_HEAAC_L2_ISO("AVC_TS_BL_CIF30_HEAAC_L2_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_BL_CIF30_MPEG1_L3("AVC_TS_BL_CIF30_MPEG1_L3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_MPEG1_L3_T("AVC_TS_BL_CIF30_MPEG1_L3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_MPEG1_L3_ISO("AVC_TS_BL_CIF30_MPEG1_L3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_BL_CIF30_AC3("AVC_TS_BL_CIF30_AC3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_AC3_T("AVC_TS_BL_CIF30_AC3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_AC3_ISO("AVC_TS_BL_CIF30_AC3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_BL_CIF30_AAC_LTP("AVC_TS_BL_CIF30_AAC_LTP", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_AAC_LTP_T("AVC_TS_BL_CIF30_AAC_LTP_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_AAC_LTP_ISO("AVC_TS_BL_CIF30_AAC_LTP_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_BL_CIF30_AAC_LTP_MULT5("AVC_TS_BL_CIF30_AAC_LTP_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_AAC_LTP_MULT5_T("AVC_TS_BL_CIF30_AAC_LTP_MULT5_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_AAC_LTP_MULT5_ISO("AVC_TS_BL_CIF30_AAC_LTP_MULT5_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_BL_CIF30_AAC_940("AVC_TS_BL_CIF30_AAC_940", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_AAC_940_T("AVC_TS_BL_CIF30_AAC_940_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF30_AAC_940_ISO("AVC_TS_BL_CIF30_AAC_940_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - - AVC_TS_MP_HD_AAC_MULT5("AVC_TS_MP_HD_AAC_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AAC_MULT5_T("AVC_TS_MP_HD_AAC_MULT5_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AAC_MULT5_ISO("AVC_TS_MP_HD_AAC_MULT5_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_HD_HEAAC_L2("AVC_TS_MP_HD_HEAAC_L2", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_HEAAC_L2_T("AVC_TS_MP_HD_HEAAC_L2_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_HEAAC_L2_ISO("AVC_TS_MP_HD_HEAAC_L2_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_HD_MPEG1_L3("AVC_TS_MP_HD_MPEG1_L3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_MPEG1_L3_T("AVC_TS_MP_HD_MPEG1_L3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_MPEG1_L3_ISO("AVC_TS_MP_HD_MPEG1_L3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_HD_AC3("AVC_TS_MP_HD_AC3", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AC3_T("AVC_TS_MP_HD_AC3_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AC3_ISO("AVC_TS_MP_HD_AC3_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_HD_AAC("AVC_TS_MP_HD_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AAC_T("AVC_TS_MP_HD_AAC_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AAC_ISO("AVC_TS_MP_HD_AAC_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_HD_AAC_LTP("AVC_TS_MP_HD_AAC_LTP", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AAC_LTP_T("AVC_TS_MP_HD_AAC_LTP_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AAC_LTP_ISO("AVC_TS_MP_HD_AAC_LTP_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_HD_AAC_LTP_MULT5("AVC_TS_MP_HD_AAC_LTP_MULT5", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AAC_LTP_MULT5_T("AVC_TS_MP_HD_AAC_LTP_MULT5_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AAC_LTP_MULT5_ISO("AVC_TS_MP_HD_AAC_LTP_MULT5_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_MP_HD_AAC_LTP_MULT7("AVC_TS_MP_HD_AAC_LTP_MULT7", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AAC_LTP_MULT7_T("AVC_TS_MP_HD_AAC_LTP_MULT7_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_MP_HD_AAC_LTP_MULT7_ISO("AVC_TS_MP_HD_AAC_LTP_MULT7_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - - AVC_TS_BL_CIF15_AAC("AVC_TS_BL_CIF15_AAC", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF15_AAC_T("AVC_TS_BL_CIF15_AAC_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF15_AAC_ISO("AVC_TS_BL_CIF15_AAC_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_BL_CIF15_AAC_540("AVC_TS_BL_CIF15_AAC_540", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF15_AAC_540_T("AVC_TS_BL_CIF15_AAC_540_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF15_AAC_540_ISO("AVC_TS_BL_CIF15_AAC_540_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_BL_CIF15_AAC_LTP("AVC_TS_BL_CIF15_AAC_LTP", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF15_AAC_LTP_T("AVC_TS_BL_CIF15_AAC_LTP_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF15_AAC_LTP_ISO("AVC_TS_BL_CIF15_AAC_LTP_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - AVC_TS_BL_CIF15_BSAC("AVC_TS_BL_CIF15_BSAC", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF15_BSAC_T("AVC_TS_BL_CIF15_BSAC_T", DLNAMimeTypes.MIME_VIDEO_MPEG_TS), - AVC_TS_BL_CIF15_BSAC_ISO("AVC_TS_BL_CIF15_BSAC_ISO", DLNAMimeTypes.MIME_VIDEO_MPEG), - - - AVC_3GPP_BL_CIF30_AMR_WBplus("AVC_3GPP_BL_CIF30_AMR_WBplus", DLNAMimeTypes.MIME_VIDEO_3GP), - AVC_3GPP_BL_CIF15_AMR_WBplus("AVC_3GPP_BL_CIF15_AMR_WBplus", DLNAMimeTypes.MIME_VIDEO_3GP), - AVC_3GPP_BL_QCIF15_AAC("AVC_3GPP_BL_QCIF15_AAC", DLNAMimeTypes.MIME_VIDEO_3GP), - AVC_3GPP_BL_QCIF15_AAC_LTP("AVC_3GPP_BL_QCIF15_AAC_LTP", DLNAMimeTypes.MIME_VIDEO_3GP), - AVC_3GPP_BL_QCIF15_HEAAC("AVC_3GPP_BL_QCIF15_HEAAC", DLNAMimeTypes.MIME_VIDEO_3GP), - AVC_3GPP_BL_QCIF15_AMR_WBplus("AVC_3GPP_BL_QCIF15_AMR_WBplus", DLNAMimeTypes.MIME_VIDEO_3GP), - AVC_3GPP_BL_QCIF15_AMR("AVC_3GPP_BL_QCIF15_AMR", DLNAMimeTypes.MIME_VIDEO_3GP), - - AVC_MP4_LPCM("AVC_MP4_LPCM", DLNAMimeTypes.MIME_VIDEO_MPEG_4), - - AVI("AVI", DLNAMimeTypes.MIME_VIDEO_AVI), - AVI_XMS("AVI", DLNAMimeTypes.MIME_VIDEO_XMS_AVI), - DIVX("AVI", DLNAMimeTypes.MIME_VIDEO_DIVX), - - MATROSKA("MATROSKA", DLNAMimeTypes.MIME_VIDEO_MATROSKA), - MATROSKA_MKV("MATROSKA", DLNAMimeTypes.MIME_VIDEO_MKV), - - VC1_ASF_AP_L1_WMA("VC1_ASF_AP_L1_WMA", DLNAMimeTypes.MIME_VIDEO_ASF), - VC1_ASF_AP_L2_WMA("VC1_ASF_AP_L2_WMA", DLNAMimeTypes.MIME_VIDEO_ASF), - VC1_ASF_AP_L3_WMA("VC1_ASF_AP_L3_WMA", DLNAMimeTypes.MIME_VIDEO_ASF), - - VC1_ASF_AP_L1_WMA_WMV("VC1_ASF_AP_L1_WMA", DLNAMimeTypes.MIME_VIDEO_WMV), - VC1_ASF_AP_L2_WMA_WMV("VC1_ASF_AP_L2_WMA", DLNAMimeTypes.MIME_VIDEO_WMV), - VC1_ASF_AP_L3_WMA_WMV("VC1_ASF_AP_L3_WMA", DLNAMimeTypes.MIME_VIDEO_WMV); - - private String code; - private String contentFormat; - - DLNAProfiles(String code, String contentFormat) { - this.code = code; - this.contentFormat = contentFormat; - } - - public String getCode() { - return code; - } - - public String getContentFormat() { - return contentFormat; - } - - public static DLNAProfiles valueOf(String code, String contentFormat) { - for (DLNAProfiles errorCode : values()) { - if (errorCode.getCode().equals(code) && - (contentFormat.length() == 0 || errorCode.getContentFormat().equals(contentFormat))) { - return errorCode; - } - } - return null; - } - - class DLNAMimeTypes { - public static final String MIME_IMAGE_JPEG = "image/jpeg"; - public static final String MIME_IMAGE_PNG = "image/png"; - - public static final String MIME_AUDIO_3GP = "audio/3gpp"; - public static final String MIME_AUDIO_ADTS = "audio/vnd.dlna.adts"; - public static final String MIME_AUDIO_ATRAC = "audio/x-sony-oma"; - public static final String MIME_AUDIO_DOLBY_DIGITAL = "audio/vnd.dolby.dd-raw"; - public static final String MIME_AUDIO_LPCM = "audio/L16"; - public static final String MIME_AUDIO_MPEG = "audio/mpeg"; - public static final String MIME_AUDIO_MPEG_4 = "audio/mp4"; - public static final String MIME_AUDIO_WMA = "audio/x-ms-wma"; - - public static final String MIME_VIDEO_3GP = "video/3gpp"; - public static final String MIME_VIDEO_ASF = "video/x-ms-asf"; - public static final String MIME_VIDEO_MPEG = "video/mpeg"; - public static final String MIME_VIDEO_MPEG_4 = "video/mp4"; - public static final String MIME_VIDEO_MPEG_TS = "video/vnd.dlna.mpeg-tts"; - public static final String MIME_VIDEO_WMV = "video/x-ms-wmv"; - public static final String MIME_VIDEO_DIVX = "video/divx"; - public static final String MIME_VIDEO_AVI = "video/avi"; - public static final String MIME_VIDEO_XMS_AVI = "video/x-msvideo"; - public static final String MIME_VIDEO_MATROSKA = "video/x-matroska"; - public static final String MIME_VIDEO_MKV = "video/x-mkv"; - - } -} - diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProtocolInfo.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProtocolInfo.java deleted file mode 100644 index 7c4b0f1..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/DLNAProtocolInfo.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna; - -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.support.model.Protocol; -import org.fourthline.cling.support.model.ProtocolInfo; -import org.seamless.util.MimeType; - -import java.util.EnumMap; -import java.util.Map; - -/** - * Encaspulates a MIME type (content format) and transport, protocol, additional information. - *

- * Parses DLNA attributes in the additional information. - * - * @author Mario Franco - */ -public class DLNAProtocolInfo extends ProtocolInfo { - - protected final Map attributes = new EnumMap(DLNAAttribute.Type.class); - - public DLNAProtocolInfo(String s) throws InvalidValueException { - super(s); - parseAdditionalInfo(); - } - - public DLNAProtocolInfo(MimeType contentFormatMimeType) { - super(contentFormatMimeType); - } - - public DLNAProtocolInfo(DLNAProfiles profile) { - super(MimeType.valueOf(profile.getContentFormat())); - this.attributes.put(DLNAAttribute.Type.DLNA_ORG_PN, new DLNAProfileAttribute(profile)); - this.additionalInfo = this.getAttributesString(); - } - - public DLNAProtocolInfo(DLNAProfiles profile, EnumMap attributes) { - super(MimeType.valueOf(profile.getContentFormat())); - this.attributes.putAll(attributes); - this.attributes.put(DLNAAttribute.Type.DLNA_ORG_PN, new DLNAProfileAttribute(profile)); - this.additionalInfo = this.getAttributesString(); - } - - public DLNAProtocolInfo(Protocol protocol, String network, String contentFormat, String additionalInfo) { - super(protocol, network, contentFormat, additionalInfo); - parseAdditionalInfo(); - } - - public DLNAProtocolInfo(Protocol protocol, String network, String contentFormat, EnumMap attributes) { - super(protocol, network, contentFormat, ""); - this.attributes.putAll(attributes); - this.additionalInfo = this.getAttributesString(); - } - - public DLNAProtocolInfo(ProtocolInfo template) { - this(template.getProtocol(), - template.getNetwork(), - template.getContentFormat(), - template.getAdditionalInfo() - ); - } - - public boolean contains(DLNAAttribute.Type type) { - return attributes.containsKey(type); - } - - public DLNAAttribute getAttribute(DLNAAttribute.Type type) { - return attributes.get(type); - } - - public Map getAttributes() { - return attributes; - } - - protected String getAttributesString() { - String s = ""; - for (DLNAAttribute.Type type : DLNAAttribute.Type.values() ) { - String value = attributes.containsKey(type)?attributes.get(type).getString():null; - if (value!=null && value.length() != 0) - s += (s.length() == 0 ? "" : ";") + type.getAttributeName() + "=" + value; - } - return s; - } - - protected void parseAdditionalInfo() { - if (additionalInfo != null) { - String[] atts = additionalInfo.split(";"); - for (String att : atts) { - String[] attNameValue = att.split("="); - if (attNameValue.length == 2) { - DLNAAttribute.Type type = - DLNAAttribute.Type.valueOfAttributeName(attNameValue[0]); - if (type != null) { - DLNAAttribute dlnaAttrinute = - DLNAAttribute.newInstance(type, attNameValue[1], this.getContentFormat()); - attributes.put(type, dlnaAttrinute); - } - } - } - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/InvalidDLNAProtocolAttributeException.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/InvalidDLNAProtocolAttributeException.java deleted file mode 100644 index 4118c71..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/InvalidDLNAProtocolAttributeException.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.dlna; - -/** - * Thrown if the value of a header was invalid for the given header. - * - * @author Mario Franco - */ -public class InvalidDLNAProtocolAttributeException extends RuntimeException { - - public InvalidDLNAProtocolAttributeException(String s) { - super(s); - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/DLNAHeaders.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/DLNAHeaders.java deleted file mode 100644 index 9d1b018..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/DLNAHeaders.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.dlna.message; - -import org.fourthline.cling.model.message.header.UpnpHeader; - -import java.io.ByteArrayInputStream; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.support.model.dlna.message.header.DLNAHeader; - -/** - * Provides UPnP header API in addition to plain multi-map HTTP header access. - * - * @author Mario Franco - * @author Christian Bauer - */ -public class DLNAHeaders extends UpnpHeaders { - - private static final Logger log = Logger.getLogger(DLNAHeaders.class.getName()); - - protected Map> parsedDLNAHeaders; - - public DLNAHeaders() { - } - - public DLNAHeaders(Map> headers) { - super(headers); - } - - public DLNAHeaders(ByteArrayInputStream inputStream) { - super(inputStream); - } - - @Override - protected void parseHeaders() { - if (parsedHeaders == null) super.parseHeaders(); - - // This runs as late as possible and only when necessary (getter called and map is dirty) - parsedDLNAHeaders = new LinkedHashMap(); - log.log(Level.FINE, "Parsing all HTTP headers for known UPnP headers: {0}", size()); - for (Entry> entry : entrySet()) { - - if (entry.getKey() == null) continue; // Oh yes, the JDK has 'null' HTTP headers - - DLNAHeader.Type type = DLNAHeader.Type.getByHttpName(entry.getKey()); - if (type == null) { - log.log(Level.FINE, "Ignoring non-UPNP HTTP header: {0}", entry.getKey()); - continue; - } - - for (String value : entry.getValue()) { - UpnpHeader upnpHeader = DLNAHeader.newInstance(type, value); - if (upnpHeader == null || upnpHeader.getValue() == null) { - log.log(Level.FINE, "Ignoring known but non-parsable header (value violates the UDA specification?) '{0}': {1}", new Object[]{type.getHttpName(), value}); - } else { - addParsedValue(type, upnpHeader); - } - } - } - } - - protected void addParsedValue(DLNAHeader.Type type, UpnpHeader value) { - log.log(Level.FINE, "Adding parsed header: {0}", value); - List list = parsedDLNAHeaders.get(type); - if (list == null) { - list = new LinkedList(); - parsedDLNAHeaders.put(type, list); - } - list.add(value); - } - - @Override - public List put(String key, List values) { - parsedDLNAHeaders = null; - return super.put(key, values); - } - - @Override - public void add(String key, String value) { - parsedDLNAHeaders = null; - super.add(key, value); - } - - @Override - public List remove(Object key) { - parsedDLNAHeaders = null; - return super.remove(key); - } - - @Override - public void clear() { - parsedDLNAHeaders = null; - super.clear(); - } - - public boolean containsKey(DLNAHeader.Type type) { - if (parsedDLNAHeaders == null) parseHeaders(); - return parsedDLNAHeaders.containsKey(type); - } - - public List get(DLNAHeader.Type type) { - if (parsedDLNAHeaders == null) parseHeaders(); - return parsedDLNAHeaders.get(type); - } - - public void add(DLNAHeader.Type type, UpnpHeader value) { - super.add(type.getHttpName(), value.getString()); - if (parsedDLNAHeaders != null) - addParsedValue(type, value); - } - - public void remove(DLNAHeader.Type type) { - super.remove(type.getHttpName()); - if (parsedDLNAHeaders != null) - parsedDLNAHeaders.remove(type); - } - - public UpnpHeader[] getAsArray(DLNAHeader.Type type) { - if (parsedDLNAHeaders == null) parseHeaders(); - return parsedDLNAHeaders.get(type) != null - ? parsedDLNAHeaders.get(type).toArray(new UpnpHeader[parsedDLNAHeaders.get(type).size()]) - : new UpnpHeader[0]; - } - - public UpnpHeader getFirstHeader(DLNAHeader.Type type) { - return getAsArray(type).length > 0 - ? getAsArray(type)[0] - : null; - } - - public H getFirstHeader(DLNAHeader.Type type, Class subtype) { - UpnpHeader[] headers = getAsArray(type); - if (headers.length == 0) return null; - - for (UpnpHeader header : headers) { - if (subtype.isAssignableFrom(header.getClass())) { - return (H) header; - } - } - return null; - } - - @Override - public void log() { - if (log.isLoggable(Level.FINE)) { - super.log(); - if (parsedDLNAHeaders != null && parsedDLNAHeaders.size() > 0) { - log.fine("########################## PARSED DLNA HEADERS ##########################"); - for (Map.Entry> entry : parsedDLNAHeaders.entrySet()) { - log.log(Level.FINE, "=== TYPE: {0}", entry.getKey()); - for (UpnpHeader upnpHeader : entry.getValue()) { - log.log(Level.FINE, "HEADER: {0}", upnpHeader); - } - } - } - log.fine("####################################################################"); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/AvailableRangeHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/AvailableRangeHeader.java deleted file mode 100644 index 22a74fb..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/AvailableRangeHeader.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; -import org.fourthline.cling.support.model.dlna.types.NormalPlayTimeRange; - -/** - * @author Mario Franco - */ -public class AvailableRangeHeader extends DLNAHeader { - - public AvailableRangeHeader() { - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - try { - setValue(NormalPlayTimeRange.valueOf(s, true)); - return; - } catch (Exception ex) {} - } - throw new InvalidHeaderException("Invalid AvailableRange header value: " + s); - } - - @Override - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/AvailableSeekRangeHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/AvailableSeekRangeHeader.java deleted file mode 100644 index 7dcc29d..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/AvailableSeekRangeHeader.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; -import org.fourthline.cling.model.types.BytesRange; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.support.model.dlna.types.AvailableSeekRangeType; -import org.fourthline.cling.support.model.dlna.types.NormalPlayTimeRange; - -/** - * @author Mario Franco - */ -public class AvailableSeekRangeHeader extends DLNAHeader { - - public AvailableSeekRangeHeader() { - } - - public AvailableSeekRangeHeader(AvailableSeekRangeType timeSeekRange) { - setValue(timeSeekRange); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - String[] params = s.split(" "); - if (params.length > 1) { - try { - AvailableSeekRangeType.Mode mode = null; - NormalPlayTimeRange timeRange = null; - BytesRange byteRange = null; - - //Parse Mode - try { - mode = AvailableSeekRangeType.Mode.valueOf("MODE_" + params[0]); - } catch (IllegalArgumentException e) { - throw new InvalidValueException("Invalid AvailableSeekRange Mode"); - } - - boolean useTime = true; - //Parse Second Token - try { - timeRange = NormalPlayTimeRange.valueOf(params[1],true); - } catch (InvalidValueException timeInvalidValueException) { - try { - byteRange = BytesRange.valueOf(params[1]); - useTime = false; - } catch (InvalidValueException bytesInvalidValueException) { - throw new InvalidValueException("Invalid AvailableSeekRange Range"); - } - } - if (useTime) { - if (params.length > 2) { - //Parse Third Token - byteRange = BytesRange.valueOf(params[2]); - setValue(new AvailableSeekRangeType(mode, timeRange, byteRange)); - } - else { - setValue(new AvailableSeekRangeType(mode, timeRange)); - } - } else { - setValue(new AvailableSeekRangeType(mode, byteRange)); - } - return; - } catch (InvalidValueException invalidValueException) { - throw new InvalidHeaderException("Invalid AvailableSeekRange header value: " + s + "; " + invalidValueException.getMessage()); - } - } - } - throw new InvalidHeaderException("Invalid AvailableSeekRange header value: " + s); - } - - @Override - public String getString() { - AvailableSeekRangeType t = getValue(); - String s = Integer.toString(t.getModeFlag().ordinal()); - if (t.getNormalPlayTimeRange() != null) { - s += " " + t.getNormalPlayTimeRange().getString(false); - } - if (t.getBytesRange() != null) { - s += " " + t.getBytesRange().getString(false); - } - return s; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/BufferBytesHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/BufferBytesHeader.java deleted file mode 100644 index 284d1ab..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/BufferBytesHeader.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -/** - * @author Mario Franco - */ -public class BufferBytesHeader extends DLNAHeader { - - public BufferBytesHeader() { - setValue(new UnsignedIntegerFourBytes(0L)); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - try { - setValue(new UnsignedIntegerFourBytes(s)); - return; - } catch (NumberFormatException numberFormatException) { - } - throw new InvalidHeaderException("Invalid header value: " + s); - } - - @Override - public String getString() { - return getValue().getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/BufferInfoHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/BufferInfoHeader.java deleted file mode 100644 index c5774ce..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/BufferInfoHeader.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; -import org.fourthline.cling.support.model.dlna.types.BufferInfoType; - -/** - * @author Mario Franco - */ -public class BufferInfoHeader extends DLNAHeader { - - public BufferInfoHeader() { - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - try { - setValue(BufferInfoType.valueOf(s)); - return; - } catch (Exception ex) {} - } - throw new InvalidHeaderException("Invalid BufferInfo header value: " + s); - } - - @Override - public String getString() { - return getValue().getString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/ContentFeaturesHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/ContentFeaturesHeader.java deleted file mode 100644 index 2efab6b..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/ContentFeaturesHeader.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import java.util.EnumMap; -import org.fourthline.cling.model.message.header.InvalidHeaderException; -import org.fourthline.cling.support.model.dlna.DLNAAttribute; - -/** - * @author Mario Franco - */ -public class ContentFeaturesHeader extends DLNAHeader> { - - public ContentFeaturesHeader() { - setValue(new EnumMap(DLNAAttribute.Type.class)); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - String[] atts = s.split(";"); - for (String att : atts) { - String[] attNameValue = att.split("="); - if (attNameValue.length == 2) { - DLNAAttribute.Type type = DLNAAttribute.Type.valueOfAttributeName(attNameValue[0]); - if (type != null) { - DLNAAttribute dlnaAttrinute = DLNAAttribute.newInstance(type, attNameValue[1], ""); - getValue().put(type, dlnaAttrinute); - } - } - } - } - } - - @Override - public String getString() { - String s = ""; - for (DLNAAttribute.Type type : DLNAAttribute.Type.values()) { - String value = getValue().containsKey(type) ? getValue().get(type).getString() : null; - if (value != null && value.length() != 0) { - s += (s.length() == 0 ? "" : ";") + type.getAttributeName() + "=" + value; - } - } - return s; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/DLNAHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/DLNAHeader.java deleted file mode 100644 index 6dbecf4..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/DLNAHeader.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.dlna.message.header; - -import org.seamless.util.Exceptions; - -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.fourthline.cling.model.message.header.InvalidHeaderException; -import org.fourthline.cling.model.message.header.UpnpHeader; - -/** - * Transforms known and standardized DLNA/HTTP headers from/to string representation. - *

- * The {@link #newInstance(org.fourthline.cling.support.model.dlna.message.header.DLNAHeader.Type, String)} method - * attempts to instantiate the best header subtype for a given header (name) and string value. - *

- * - * @author Mario Franco - * @author Christian Bauer - */ -public abstract class DLNAHeader extends UpnpHeader { - - final private static Logger log = Logger.getLogger(DLNAHeader.class.getName()); - - /** - * Maps a standardized DLNA header to potential header subtypes. - */ - public static enum Type { - - TimeSeekRange("TimeSeekRange.dlna.org", TimeSeekRangeHeader.class), - XSeekRange("X-Seek-Range", TimeSeekRangeHeader.class), - PlaySpeed("PlaySpeed.dlna.org", PlaySpeedHeader.class), - AvailableSeekRange("availableSeekRange.dlna.org", AvailableSeekRangeHeader.class), - GetAvailableSeekRange("getAvailableSeekRange.dlna.org", GetAvailableSeekRangeHeader.class), - GetContentFeatures("getcontentFeatures.dlna.org", GetContentFeaturesHeader.class), - ContentFeatures("contentFeatures.dlna.org", ContentFeaturesHeader.class), - TransferMode("transferMode.dlna.org", TransferModeHeader.class), - FriendlyName("friendlyName.dlna.org", FriendlyNameHeader.class), - PeerManager("peerManager.dlna.org", PeerManagerHeader.class), - AvailableRange("Available-Range.dlna.org", AvailableRangeHeader.class), - SCID("scid.dlna.org", SCIDHeader.class), - RealTimeInfo("realTimeInfo.dlna.org", RealTimeInfoHeader.class), - ScmsFlag("scmsFlag.dlna.org", ScmsFlagHeader.class), - WCT("WCT.dlna.org", WCTHeader.class), - MaxPrate("Max-Prate.dlna.org", MaxPrateHeader.class), - EventType("Event-Type.dlna.org", EventTypeHeader.class), - Supported("Supported", SupportedHeader.class), - BufferInfo("Buffer-Info.dlna.org", BufferInfoHeader.class), - RTPH264DeInterleaving("rtp-h264-deint-buf-cap.dlna.org", BufferBytesHeader.class), - RTPAACDeInterleaving("rtp-aac-deint-buf-cap.dlna.org", BufferBytesHeader.class), - RTPAMRDeInterleaving("rtp-amr-deint-buf-cap.dlna.org", BufferBytesHeader.class), - RTPAMRWBPlusDeInterleaving("rtp-amrwbplus-deint-buf-cap.dlna.org", BufferBytesHeader.class), - PRAGMA("PRAGMA", PragmaHeader.class); - - private static Map byName = new HashMap() {{ - for (Type t : Type.values()) { - put(t.getHttpName(), t); - } - }}; - - private String httpName; - private Class[] headerTypes; - - private Type(String httpName, Class... headerClass) { - this.httpName = httpName; - this.headerTypes = headerClass; - } - - public String getHttpName() { - return httpName; - } - - public Class[] getHeaderTypes() { - return headerTypes; - } - - public boolean isValidHeaderType(Class clazz) { - for (Class permissibleType : getHeaderTypes()) { - if (permissibleType.isAssignableFrom(clazz)) { - return true; - } - } - return false; - } - - /** - * @param httpName A case-insensitive HTTP header name. - */ - public static Type getByHttpName(String httpName) { - if (httpName == null) return null; - return byName.get(httpName); - } - } - - - - /** - * Create a new instance of a {@link DLNAHeader} subtype that matches the given type and value. - *

- * This method iterates through all potential header subtype classes as declared in {@link Type}. - * It creates a new instance of the subtype class and calls its {@link #setString(String)} method. - * If no {@link org.fourthline.cling.model.message.header.InvalidHeaderException} is thrown, the subtype - * instance is returned. - *

- * - * @param type The type (or name) of the header. - * @param headerValue The value of the header. - * @return The best matching header subtype instance, or null if no subtype can be found. - */ - public static DLNAHeader newInstance(DLNAHeader.Type type, String headerValue) { - - // Try all the UPnP headers and see if one matches our value parsers - DLNAHeader upnpHeader = null; - for (int i = 0; i < type.getHeaderTypes().length && upnpHeader == null; i++) { - Class headerClass = type.getHeaderTypes()[i]; - try { - log.finest("Trying to parse '" + type + "' with class: " + headerClass.getSimpleName()); - upnpHeader = headerClass.newInstance(); - if (headerValue != null) { - upnpHeader.setString(headerValue); - } - } catch (InvalidHeaderException ex) { - log.finest("Invalid header value for tested type: " + headerClass.getSimpleName() + " - " + ex.getMessage()); - upnpHeader = null; - } catch (Exception ex) { - log.severe("Error instantiating header of type '" + type + "' with value: " + headerValue); - log.log(Level.SEVERE, "Exception root cause: ", Exceptions.unwrap(ex)); - } - - } - return upnpHeader; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/EventTypeHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/EventTypeHeader.java deleted file mode 100644 index 044b437..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/EventTypeHeader.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import java.util.regex.Pattern; -import org.fourthline.cling.model.message.header.InvalidHeaderException; - -/** - * @author Mario Franco - */ -public class EventTypeHeader extends DLNAHeader { - - final static Pattern pattern = Pattern.compile("^[0-9]{4}$", Pattern.CASE_INSENSITIVE); - - public EventTypeHeader() { - setValue("0000"); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (pattern.matcher(s).matches()) { - setValue(s); - return; - } - throw new InvalidHeaderException("Invalid EventType header value: " + s); - } - - @Override - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/FriendlyNameHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/FriendlyNameHeader.java deleted file mode 100644 index fd57c3d..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/FriendlyNameHeader.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; - -/** - * @author Mario Franco - */ -public class FriendlyNameHeader extends DLNAHeader { - - public FriendlyNameHeader() { - setValue(""); - } - - public FriendlyNameHeader(String name) { - setValue(name); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - setValue(s); - return; - } - throw new InvalidHeaderException("Invalid GetAvailableSeekRange header value: " + s); - } - - @Override - public String getString() { - return getValue(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/GetAvailableSeekRangeHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/GetAvailableSeekRangeHeader.java deleted file mode 100644 index 1468d1f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/GetAvailableSeekRangeHeader.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; - -/** - * @author Mario Franco - */ -public class GetAvailableSeekRangeHeader extends DLNAHeader { - - public GetAvailableSeekRangeHeader() { - setValue(1); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - try { - int t = Integer.parseInt(s); - if (t==1) - return; - } catch (Exception ex) {} - } - throw new InvalidHeaderException("Invalid GetAvailableSeekRange header value: " + s); - } - - @Override - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/GetContentFeaturesHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/GetContentFeaturesHeader.java deleted file mode 100644 index 6f90a0c..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/GetContentFeaturesHeader.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; - -/** - * @author Mario Franco - */ -public class GetContentFeaturesHeader extends DLNAHeader { - - public GetContentFeaturesHeader() { - setValue(1); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - try { - int t = Integer.parseInt(s); - if (t==1) - return; - } catch (Exception ex) {} - } - throw new InvalidHeaderException("Invalid GetContentFeatures header value: " + s); - } - - @Override - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/MaxPrateHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/MaxPrateHeader.java deleted file mode 100644 index db40c03..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/MaxPrateHeader.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; - -/** - * @author Mario Franco - */ -public class MaxPrateHeader extends DLNAHeader { - - public MaxPrateHeader() { - setValue(0L); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - try { - setValue(Long.parseLong(s)); - return; - } catch (NumberFormatException numberFormatException) { - } - throw new InvalidHeaderException("Invalid SCID header value: " + s); - } - - @Override - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PeerManagerHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PeerManagerHeader.java deleted file mode 100644 index dc0eb17..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PeerManagerHeader.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.ServiceReference; -import org.fourthline.cling.model.message.header.InvalidHeaderException; - -/** - * @author Mario Franco - */ -public class PeerManagerHeader extends DLNAHeader { - - public PeerManagerHeader() { - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - try { - ServiceReference serviceReference = new ServiceReference(s); - if (serviceReference.getUdn()!=null && serviceReference.getServiceId()!=null) { - setValue(serviceReference); - return; - } - } catch (Exception ex) { - } - } - throw new InvalidHeaderException("Invalid PeerManager header value: " + s); - } - - @Override - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PlaySpeedHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PlaySpeedHeader.java deleted file mode 100644 index 5f6e484..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PlaySpeedHeader.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.support.avtransport.lastchange.AVTransportVariable.TransportPlaySpeed; - -/** - * @author Mario Franco - */ -public class PlaySpeedHeader extends DLNAHeader { - - public PlaySpeedHeader() { - } - - public PlaySpeedHeader(TransportPlaySpeed speed) { - setValue(speed); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - try { - TransportPlaySpeed t = new TransportPlaySpeed(s); - setValue(t); - return; - } catch (InvalidValueException invalidValueException) {} - } - throw new InvalidHeaderException("Invalid PlaySpeed header value: " + s); - } - - @Override - public String getString() { - return getValue().getValue(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PragmaHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PragmaHeader.java deleted file mode 100644 index 3755aba..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/PragmaHeader.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import java.util.ArrayList; -import java.util.List; -import org.fourthline.cling.model.message.header.InvalidHeaderException; -import org.fourthline.cling.model.types.PragmaType; - -/** - * DLNA Pragma tokens: - * - getIfoFileURI.dlna.org - * - ifoFileURI.dlna.org - * - * @author Mario Franco - */ -public class PragmaHeader extends DLNAHeader> { - - public PragmaHeader() { - setValue(new ArrayList()); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - if (s.endsWith(";")) { - s = s.substring(0, s.length() - 1); - } - String[] list = s.split("\\s*;\\s*"); - List value = new ArrayList(); - for (String pragma : list) { - value.add(PragmaType.valueOf(pragma)); - } - return; - } - throw new InvalidHeaderException("Invalid Pragma header value: " + s); - } - - @Override - public String getString() { - List v = getValue(); - String r = ""; - for (PragmaType pragma : v) { - r += (r.length() == 0 ? "": "," )+ pragma.getString(); - } - return r; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/RealTimeInfoHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/RealTimeInfoHeader.java deleted file mode 100644 index 821acf4..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/RealTimeInfoHeader.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; -import org.fourthline.cling.support.model.dlna.types.NormalPlayTime; - -/** - * @author Mario Franco - */ -public class RealTimeInfoHeader extends DLNAHeader { - - public static final String PREFIX = "DLNA.ORG_TLAG="; - - public RealTimeInfoHeader() { - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0 && s.startsWith(PREFIX) ) { - try { - s = s.substring(PREFIX.length()); - setValue(s.equals("*") ? null : NormalPlayTime.valueOf(s) ); - return; - } catch (Exception ex) {} - } - throw new InvalidHeaderException("Invalid RealTimeInfo header value: " + s); - } - - @Override - public String getString() { - NormalPlayTime v = getValue(); - if (v == null) - return PREFIX+"*"; - return PREFIX+v.getString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/SCIDHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/SCIDHeader.java deleted file mode 100644 index be9998d..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/SCIDHeader.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; - -/** - * @author Mario Franco - */ -public class SCIDHeader extends DLNAHeader { - - public SCIDHeader() { - setValue(""); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - setValue(s); - return; - } - throw new InvalidHeaderException("Invalid SCID header value: " + s); - } - - @Override - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/ScmsFlagHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/ScmsFlagHeader.java deleted file mode 100644 index 16d1a23..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/ScmsFlagHeader.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import java.util.regex.Pattern; -import org.fourthline.cling.model.message.header.InvalidHeaderException; -import org.fourthline.cling.support.model.dlna.types.ScmsFlagType; - -/** - * @author Mario Franco - */ -public class ScmsFlagHeader extends DLNAHeader { - - final static Pattern pattern = Pattern.compile("^[01]{2}$", Pattern.CASE_INSENSITIVE); - - public ScmsFlagHeader() { - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (pattern.matcher(s).matches()) { - setValue(new ScmsFlagType(s.charAt(0) == '0', s.charAt(1) == '0')); - return; - } - throw new InvalidHeaderException("Invalid ScmsFlag header value: " + s); - } - - @Override - public String getString() { - ScmsFlagType v = getValue(); - return (v.isCopyright()?"0":"1") + (v.isOriginal()?"0":"1"); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/SupportedHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/SupportedHeader.java deleted file mode 100644 index 6917447..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/SupportedHeader.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; - -/** - * @author Mario Franco - */ -public class SupportedHeader extends DLNAHeader { - - public SupportedHeader() { - setValue(new String[]{}); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - if (s.endsWith(";")) - s = s.substring(0, s.length()-1); - setValue(s.split("\\s*,\\s*")); - return; - } - throw new InvalidHeaderException("Invalid Supported header value: " + s); - } - - @Override - public String getString() { - String[] v = getValue(); - String r = v.length>0 ? v[0] : ""; - for (int i = 1; i < v.length; i++) { - r += ","+v[i]; - } - return r; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/TimeSeekRangeHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/TimeSeekRangeHeader.java deleted file mode 100644 index 408c018..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/TimeSeekRangeHeader.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; -import org.fourthline.cling.model.types.BytesRange; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.support.model.dlna.types.NormalPlayTimeRange; -import org.fourthline.cling.support.model.dlna.types.TimeSeekRangeType; - -/** - * @author Mario Franco - */ -public class TimeSeekRangeHeader extends DLNAHeader { - - public TimeSeekRangeHeader() { - } - - public TimeSeekRangeHeader(TimeSeekRangeType timeSeekRange) { - setValue(timeSeekRange); - } - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - String[] params = s.split(" "); - if (params.length>0) { - try { - TimeSeekRangeType t = new TimeSeekRangeType(NormalPlayTimeRange.valueOf(params[0])); - if (params.length > 1) { - t.setBytesRange(BytesRange.valueOf(params[1])); - } - setValue(t); - return; - } catch (InvalidValueException invalidValueException) { - throw new InvalidHeaderException("Invalid TimeSeekRange header value: " + s + "; "+invalidValueException.getMessage()); - } - } - } - throw new InvalidHeaderException("Invalid TimeSeekRange header value: " + s); - } - - @Override - public String getString() { - TimeSeekRangeType t = getValue(); - String s = t.getNormalPlayTimeRange().getString(); - if (t.getBytesRange()!=null) s+= " "+t.getBytesRange().getString(true); - return s; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/TransferModeHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/TransferModeHeader.java deleted file mode 100644 index a3d3938..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/TransferModeHeader.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import org.fourthline.cling.model.message.header.InvalidHeaderException; - -/** - * @author Mario Franco - */ -public class TransferModeHeader extends DLNAHeader { - - public enum Type { - Streaming, - Interactive, - Background; - } - - public TransferModeHeader() { - setValue(Type.Interactive); - } - - public TransferModeHeader(Type mode) { - setValue(mode); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (s.length() != 0) { - try { - setValue(TransferModeHeader.Type.valueOf(s)); - return; - } catch (Exception ex) {} - } - throw new InvalidHeaderException("Invalid TransferMode header value: " + s); - } - - @Override - public String getString() { - return getValue().toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/WCTHeader.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/WCTHeader.java deleted file mode 100644 index 22106df..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/message/header/WCTHeader.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.message.header; - -import java.util.regex.Pattern; -import org.fourthline.cling.model.message.header.InvalidHeaderException; - -/** - * @author Mario Franco - */ -public class WCTHeader extends DLNAHeader { - - final static Pattern pattern = Pattern.compile("^[01]{1}$", Pattern.CASE_INSENSITIVE); - - public WCTHeader() { - setValue(false); - } - - @Override - public void setString(String s) throws InvalidHeaderException { - if (pattern.matcher(s).matches()) { - setValue( s.equals("1")); - return; - } - throw new InvalidHeaderException("Invalid SCID header value: " + s); - } - - @Override - public String getString() { - return getValue() ? "1":"0"; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/AvailableSeekRangeType.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/types/AvailableSeekRangeType.java deleted file mode 100644 index 33d371f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/AvailableSeekRangeType.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.types; - -import org.fourthline.cling.model.types.BytesRange; - -/** - * - * @author Mario Franco - */ -public class AvailableSeekRangeType { - - - public enum Mode { - MODE_0, - MODE_1, - } - - private Mode modeFlag; - private NormalPlayTimeRange normalPlayTimeRange; - private BytesRange bytesRange; - - - public AvailableSeekRangeType(Mode modeFlag, NormalPlayTimeRange nptRange) { - this.modeFlag = modeFlag; - this.normalPlayTimeRange = nptRange; - } - - public AvailableSeekRangeType(Mode modeFlag, BytesRange byteRange) { - this.modeFlag = modeFlag; - this.bytesRange = byteRange; - } - - public AvailableSeekRangeType(Mode modeFlag, NormalPlayTimeRange nptRange, BytesRange byteRange) { - this.modeFlag = modeFlag; - this.normalPlayTimeRange = nptRange; - this.bytesRange = byteRange; - } - - /** - * @return the normalPlayTimeRange - */ - public NormalPlayTimeRange getNormalPlayTimeRange() { - return normalPlayTimeRange; - } - - /** - * @return the bytesRange - */ - public BytesRange getBytesRange() { - return bytesRange; - } - - /** - * @return the modeFlag - */ - public Mode getModeFlag() { - return modeFlag; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/BufferInfoType.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/types/BufferInfoType.java deleted file mode 100644 index e408126..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/BufferInfoType.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.types; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.support.model.dlna.types.CodedDataBuffer.TransferMechanism; - -/** - * - * @author Mario Franco - */ -public class BufferInfoType { - - final static Pattern pattern = Pattern.compile("^dejitter=(\\d{1,10})(;CDB=(\\d{1,10});BTM=(0|1|2))?(;TD=(\\d{1,10}))?(;BFR=(0|1))?$", Pattern.CASE_INSENSITIVE); - private Long dejitterSize; - private CodedDataBuffer cdb; - private Long targetDuration; - private Boolean fullnessReports; - - public BufferInfoType(Long dejitterSize) { - this.dejitterSize = dejitterSize; - } - - public BufferInfoType(Long dejitterSize, CodedDataBuffer cdb, - Long targetDuration, Boolean fullnessReports) { - this.dejitterSize = dejitterSize; - this.cdb = cdb; - this.targetDuration = targetDuration; - this.fullnessReports = fullnessReports; - } - - public static BufferInfoType valueOf(String s) throws InvalidValueException { - Matcher matcher = pattern.matcher(s); - if (matcher.matches()) { - try { - Long dejitterSize = Long.parseLong(matcher.group(1)); - CodedDataBuffer cdb = null; - Long targetDuration = null; - Boolean fullnessReports = null; - - if (matcher.group(2) != null) { - cdb = new CodedDataBuffer(Long.parseLong(matcher.group(3)), - TransferMechanism.values()[Integer.parseInt(matcher.group(4))]); - } - if (matcher.group(5) != null) { - targetDuration = Long.parseLong(matcher.group(6)); - } - if (matcher.group(7) != null) { - fullnessReports = matcher.group(8).equals("1"); - } - return new BufferInfoType(dejitterSize, cdb, targetDuration, fullnessReports); - } catch (NumberFormatException ex1) { - } - } - throw new InvalidValueException("Can't parse BufferInfoType: " + s); - } - - public String getString() { - String s = "dejitter=" + dejitterSize.toString(); - if (cdb != null) { - s += ";CDB=" + cdb.getSize().toString() + ";BTM=" + cdb.getTranfer().ordinal(); - } - if (targetDuration != null) { - s += ";TD=" + targetDuration.toString(); - } - if (fullnessReports != null) { - s += ";BFR=" + (fullnessReports?"1":"0"); - } - return s; - } - - /** - * @return the dejitter size - */ - public Long getDejitterSize() { - return dejitterSize; - } - - /** - * @return the cdb - */ - public CodedDataBuffer getCdb() { - return cdb; - } - - /** - * @return the targetDuration - */ - public Long getTargetDuration() { - return targetDuration; - } - - /** - * @return the fullnessReports - */ - public Boolean isFullnessReports() { - return fullnessReports; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/CodedDataBuffer.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/types/CodedDataBuffer.java deleted file mode 100644 index eb2972a..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/CodedDataBuffer.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.types; - -/** - * - * @author Mario Franco - */ -public class CodedDataBuffer { - - public enum TransferMechanism { - IMMEDIATELY, - TIMESTAMP, - OTHER; - } - - private Long size; - private TransferMechanism tranfer; - - public CodedDataBuffer(Long size, TransferMechanism transfer) { - this.size = size; - this.tranfer = transfer; - } - - /** - * @return the size - */ - public Long getSize() { - return size; - } - - /** - * @return the tranfer - */ - public TransferMechanism getTranfer() { - return tranfer; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/NormalPlayTime.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/types/NormalPlayTime.java deleted file mode 100644 index efd8ac6..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/NormalPlayTime.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.types; - -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * @author Mario Franco - */ -public class NormalPlayTime { - - public enum Format { - - SECONDS, - TIME - } - final static Pattern pattern = Pattern.compile("^(\\d+):(\\d{1,2}):(\\d{1,2})(\\.(\\d{1,3}))?|(\\d+)(\\.(\\d{1,3}))?$", Pattern.CASE_INSENSITIVE); - private long milliseconds; - - public NormalPlayTime(long milliseconds) { - if (milliseconds < 0) { - throw new InvalidValueException("Invalid parameter milliseconds: " + milliseconds); - } - - this.milliseconds = milliseconds; - } - - public NormalPlayTime(long hours, long minutes, long seconds, long milliseconds) throws InvalidValueException { - if (hours < 0) { - throw new InvalidValueException("Invalid parameter hours: " + hours); - } - - if (minutes < 0 || minutes > 59) { - throw new InvalidValueException("Invalid parameter minutes: " + hours); - } - - if (seconds < 0 || seconds > 59) { - throw new InvalidValueException("Invalid parameter seconds: " + hours); - } - if (milliseconds < 0 || milliseconds > 999) { - throw new InvalidValueException("Invalid parameter milliseconds: " + milliseconds); - } - - this.milliseconds = (hours * 60 * 60 + minutes * 60 + seconds) * 1000 + milliseconds; - } - - /** - * @return the milliseconds - */ - public long getMilliseconds() { - return milliseconds; - } - - /** - * @param milliseconds the milliseconds to set - */ - public void setMilliseconds(long milliseconds) { - if (milliseconds < 0) { - throw new InvalidValueException("Invalid parameter milliseconds: " + milliseconds); - } - - this.milliseconds = milliseconds; - } - - public String getString() { - return getString(Format.SECONDS); - } - - /** - * We don't ignore the right zeros in milliseconds, a small compromise - * @param format - */ - public String getString(Format format) { - long seconds = TimeUnit.MILLISECONDS.toSeconds(milliseconds); - long ms = milliseconds % 1000; - switch (format) { - case TIME: - seconds = TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)); - long hours = TimeUnit.MILLISECONDS.toHours(milliseconds); - long minutes = TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)); - return String.format("%d:%02d:%02d.%03d", hours, minutes, seconds, ms); - default: - return String.format("%d.%03d", seconds, ms); - } - } - - public static NormalPlayTime valueOf(String s) throws InvalidValueException { - Matcher matcher = pattern.matcher(s); - if (matcher.matches()) { - int msMultiplier = 0; - try { - if (matcher.group(1) != null) { - msMultiplier = (int) Math.pow(10, 3 - matcher.group(5).length()); - return new NormalPlayTime( - Long.parseLong(matcher.group(1)), - Long.parseLong(matcher.group(2)), - Long.parseLong(matcher.group(3)), - Long.parseLong(matcher.group(5))*msMultiplier); - } else { - msMultiplier = (int) Math.pow(10, 3 - matcher.group(8).length()); - return new NormalPlayTime( - Long.parseLong(matcher.group(6)) * 1000 + Long.parseLong(matcher.group(8))*msMultiplier); - } - } catch (NumberFormatException ex1) { - } - } - throw new InvalidValueException("Can't parse NormalPlayTime: " + s); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/NormalPlayTimeRange.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/types/NormalPlayTimeRange.java deleted file mode 100644 index 42d4620..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/NormalPlayTimeRange.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.types; - -import org.fourthline.cling.model.types.InvalidValueException; - -/** - * - * @author Mario Franco - */ -public class NormalPlayTimeRange { - - public static final String PREFIX = "npt="; - - private NormalPlayTime timeStart; - private NormalPlayTime timeEnd; - private NormalPlayTime timeDuration; - - public NormalPlayTimeRange(long timeStart, long timeEnd) { - this.timeStart = new NormalPlayTime(timeStart); - this.timeEnd = new NormalPlayTime(timeEnd); - } - - public NormalPlayTimeRange(NormalPlayTime timeStart, NormalPlayTime timeEnd) { - this.timeStart = timeStart; - this.timeEnd = timeEnd; - } - - public NormalPlayTimeRange(NormalPlayTime timeStart, NormalPlayTime timeEnd, NormalPlayTime timeDuration) { - this.timeStart = timeStart; - this.timeEnd = timeEnd; - this.timeDuration = timeDuration; - } - - /** - * @return the timeStart - */ - public NormalPlayTime getTimeStart() { - return timeStart; - } - - /** - * @return the timeEnd - */ - public NormalPlayTime getTimeEnd() { - return timeEnd; - } - - /** - * @return the timeDuration - */ - public NormalPlayTime getTimeDuration() { - return timeDuration; - } - - /** - * - * @return String format of Normal Play Time Range for response message header - */ - public String getString() { - return getString(true); - } - - /** - * - * @return String format of Normal Play Time Range for response message header - */ - public String getString(boolean includeDuration) { - String s = PREFIX; - - s += timeStart.getString() + "-"; - if (timeEnd != null) { - s += timeEnd.getString(); - } - if (includeDuration) { - s += "/" + (timeDuration != null ? timeDuration.getString() : "*"); - } - - return s; - } - - public static NormalPlayTimeRange valueOf(String s) throws InvalidValueException { - return valueOf(s, false); - } - - public static NormalPlayTimeRange valueOf(String s, boolean mandatoryTimeEnd) throws InvalidValueException { - if (s.startsWith(PREFIX)) { - NormalPlayTime timeStart, timeEnd = null, timeDuration = null; - String[] params = s.substring(PREFIX.length()).split("[-/]"); - switch (params.length) { - case 3: - if (params[2].length() != 0 && !params[2].equals("*")) { - timeDuration = NormalPlayTime.valueOf(params[2]); - } - case 2: - if (params[1].length() != 0) { - timeEnd = NormalPlayTime.valueOf(params[1]); - } - case 1: - if (params[0].length() != 0 && (!mandatoryTimeEnd || ( mandatoryTimeEnd && params.length>1))) { - timeStart = NormalPlayTime.valueOf(params[0]); - return new NormalPlayTimeRange(timeStart, timeEnd, timeDuration); - } - default: - break; - } - } - throw new InvalidValueException("Can't parse NormalPlayTimeRange: " + s); - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/ScmsFlagType.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/types/ScmsFlagType.java deleted file mode 100644 index 16def45..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/ScmsFlagType.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.types; - -/** - * - * @author Mario Franco - */ -public class ScmsFlagType { - - private boolean copyright; - private boolean original; - - public ScmsFlagType() { - this.copyright = true; - this.original = true; - } - - public ScmsFlagType(boolean copyright, boolean original) { - this.copyright = copyright; - this.original = original; - } - - /** - * @return the copyright - */ - public boolean isCopyright() { - return copyright; - } - - /** - * @return the original - */ - public boolean isOriginal() { - return original; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/TimeSeekRangeType.java b/app/src/main/java/org/fourthline/cling/support/model/dlna/types/TimeSeekRangeType.java deleted file mode 100644 index 6397e55..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/dlna/types/TimeSeekRangeType.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.support.model.dlna.types; - -import org.fourthline.cling.model.types.BytesRange; - -/** - * - * @author Mario Franco - */ -public class TimeSeekRangeType { - - private NormalPlayTimeRange normalPlayTimeRange; - private BytesRange bytesRange; - - - public TimeSeekRangeType(NormalPlayTimeRange nptRange) { - this.normalPlayTimeRange = nptRange; - } - - public TimeSeekRangeType(NormalPlayTimeRange nptRange, BytesRange byteRange) { - this.normalPlayTimeRange = nptRange; - this.bytesRange = byteRange; - } - - /** - * @return the normalPlayTimeRange - */ - public NormalPlayTimeRange getNormalPlayTimeRange() { - return normalPlayTimeRange; - } - - /** - * @return the bytesRange - */ - public BytesRange getBytesRange() { - return bytesRange; - } - - /** - * @param bytesRange the bytesRange to set - */ - public void setBytesRange(BytesRange bytesRange) { - this.bytesRange = bytesRange; - } - - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/AudioBook.java b/app/src/main/java/org/fourthline/cling/support/model/item/AudioBook.java deleted file mode 100644 index f3b347e..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/AudioBook.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.Person; -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.StorageMedium; -import org.fourthline.cling.support.model.container.Container; - -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.DC; -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class AudioBook extends AudioItem { - - public static final Class CLASS = new Class("object.item.audioItem.audioBook"); - - public AudioBook() { - setClazz(CLASS); - } - - public AudioBook(Item other) { - super(other); - } - - public AudioBook(String id, Container parent, String title, String creator, Res... resource) { - this(id, parent.getId(), title, creator, null, null, null, resource); - } - - public AudioBook(String id, Container parent, String title, String creator, String producer, String contributor, String date, Res... resource) { - this(id, parent.getId(), title, creator, new Person(producer), new Person(contributor), date, resource); - } - - public AudioBook(String id, String parentID, String title, String creator, Person producer, Person contributor, String date, Res... resource) { - super(id, parentID, title, creator, resource); - setClazz(CLASS); - if (producer != null) - addProperty(new UPNP.PRODUCER(producer)); - if (contributor != null) - addProperty(new DC.CONTRIBUTOR(contributor)); - if (date != null) - setDate(date); - } - - public StorageMedium getStorageMedium() { - return getFirstPropertyValue(UPNP.STORAGE_MEDIUM.class); - } - - public AudioBook setStorageMedium(StorageMedium storageMedium) { - replaceFirstProperty(new UPNP.STORAGE_MEDIUM(storageMedium)); - return this; - } - - public Person getFirstProducer() { - return getFirstPropertyValue(UPNP.PRODUCER.class); - } - - public Person[] getProducers() { - List list = getPropertyValues(UPNP.PRODUCER.class); - return list.toArray(new Person[list.size()]); - } - - public AudioBook setProducers(Person[] persons) { - removeProperties(UPNP.PRODUCER.class); - for (Person p : persons) { - addProperty(new UPNP.PRODUCER(p)); - } - return this; - } - - public Person getFirstContributor() { - return getFirstPropertyValue(DC.CONTRIBUTOR.class); - } - - public Person[] getContributors() { - List list = getPropertyValues(DC.CONTRIBUTOR.class); - return list.toArray(new Person[list.size()]); - } - - public AudioBook setContributors(Person[] contributors) { - removeProperties(DC.CONTRIBUTOR.class); - for (Person p : contributors) { - addProperty(new DC.CONTRIBUTOR(p)); - } - return this; - } - - public String getDate() { - return getFirstPropertyValue(DC.DATE.class); - } - - public AudioBook setDate(String date) { - replaceFirstProperty(new DC.DATE(date)); - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/AudioBroadcast.java b/app/src/main/java/org/fourthline/cling/support/model/item/AudioBroadcast.java deleted file mode 100644 index b7cd89b..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/AudioBroadcast.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.Res; - -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class AudioBroadcast extends AudioItem { - - public static final Class CLASS = new Class("object.item.audioItem.audioBroadcast"); - - public AudioBroadcast() { - setClazz(CLASS); - } - - public AudioBroadcast(Item other) { - super(other); - } - - public AudioBroadcast(String id, String parentID, String title, String creator, Res... resource) { - super(id, parentID, title, creator, resource); - setClazz(CLASS); - } - - public String getRegion() { - return getFirstPropertyValue(UPNP.REGION.class); - } - - public AudioBroadcast setRegion(String region) { - replaceFirstProperty(new UPNP.REGION(region)); - return this; - } - - public String getRadioCallSign() { - return getFirstPropertyValue(UPNP.RADIO_CALL_SIGN.class); - } - - public AudioBroadcast setRadioCallSign(String radioCallSign) { - replaceFirstProperty(new UPNP.RADIO_CALL_SIGN(radioCallSign)); - return this; - } - - public String getRadioStationID() { - return getFirstPropertyValue(UPNP.RADIO_STATION_ID.class); - } - - public AudioBroadcast setRadioStationID(String radioStationID) { - replaceFirstProperty(new UPNP.RADIO_STATION_ID(radioStationID)); - return this; - } - - public String getRadioBand() { - return getFirstPropertyValue(UPNP.RADIO_BAND.class); - } - - public AudioBroadcast setRadioBand(String radioBand) { - replaceFirstProperty(new UPNP.RADIO_BAND(radioBand)); - return this; - } - - public Integer getChannelNr() { - return getFirstPropertyValue(UPNP.CHANNEL_NR.class); - } - - public AudioBroadcast setChannelNr(Integer channelNr) { - replaceFirstProperty(new UPNP.CHANNEL_NR(channelNr)); - return this; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/AudioItem.java b/app/src/main/java/org/fourthline/cling/support/model/item/AudioItem.java deleted file mode 100644 index 2f75b23..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/AudioItem.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.Person; -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.container.Container; - -import java.net.URI; -import java.util.Arrays; -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.DC; -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class AudioItem extends Item { - - public static final Class CLASS = new Class("object.item.audioItem"); - - public AudioItem() { - setClazz(CLASS); - } - - public AudioItem(Item other) { - super(other); - } - - public AudioItem(String id, Container parent, String title, String creator, Res... resource) { - this(id, parent.getId(), title, creator, resource); - } - - public AudioItem(String id, String parentID, String title, String creator, Res... resource) { - super(id, parentID, title, creator, CLASS); - if (resource != null) { - getResources().addAll(Arrays.asList(resource)); - } - } - - public String getFirstGenre() { - return getFirstPropertyValue(UPNP.GENRE.class); - } - - public String[] getGenres() { - List list = getPropertyValues(UPNP.GENRE.class); - return list.toArray(new String[list.size()]); - } - - public AudioItem setGenres(String[] genres) { - removeProperties(UPNP.GENRE.class); - for (String genre : genres) { - addProperty(new UPNP.GENRE(genre)); - } - return this; - } - - public String getDescription() { - return getFirstPropertyValue(DC.DESCRIPTION.class); - } - - public AudioItem setDescription(String description) { - replaceFirstProperty(new DC.DESCRIPTION(description)); - return this; - } - - public String getLongDescription() { - return getFirstPropertyValue(UPNP.LONG_DESCRIPTION.class); - } - - public AudioItem setLongDescription(String description) { - replaceFirstProperty(new UPNP.LONG_DESCRIPTION(description)); - return this; - } - - public Person getFirstPublisher() { - return getFirstPropertyValue(DC.PUBLISHER.class); - } - - public Person[] getPublishers() { - List list = getPropertyValues(DC.PUBLISHER.class); - return list.toArray(new Person[list.size()]); - } - - public AudioItem setPublishers(Person[] publishers) { - removeProperties(DC.PUBLISHER.class); - for (Person publisher : publishers) { - addProperty(new DC.PUBLISHER(publisher)); - } - return this; - } - - public URI getFirstRelation() { - return getFirstPropertyValue(DC.RELATION.class); - } - - public URI[] getRelations() { - List list = getPropertyValues(DC.RELATION.class); - return list.toArray(new URI[list.size()]); - } - - public AudioItem setRelations(URI[] relations) { - removeProperties(DC.RELATION.class); - for (URI relation : relations) { - addProperty(new DC.RELATION(relation)); - } - return this; - } - - public String getLanguage() { - return getFirstPropertyValue(DC.LANGUAGE.class); - } - - public AudioItem setLanguage(String language) { - replaceFirstProperty(new DC.LANGUAGE(language)); - return this; - } - - public String getFirstRights() { - return getFirstPropertyValue(DC.RIGHTS.class); - } - - public String[] getRights() { - List list = getPropertyValues(DC.RIGHTS.class); - return list.toArray(new String[list.size()]); - } - - public AudioItem setRights(String[] rights) { - removeProperties(DC.RIGHTS.class); - for (String right : rights) { - addProperty(new DC.RIGHTS(right)); - } - return this; - } -} - diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/ImageItem.java b/app/src/main/java/org/fourthline/cling/support/model/item/ImageItem.java deleted file mode 100644 index 5f43043..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/ImageItem.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.Person; -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.StorageMedium; -import org.fourthline.cling.support.model.container.Container; - -import java.util.Arrays; -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.DC; -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class ImageItem extends Item{ - - public static final Class CLASS = new Class("object.item.imageItem"); - - public ImageItem() { - setClazz(CLASS); - } - - public ImageItem(Item other) { - super(other); - } - - public ImageItem(String id, Container parent, String title, String creator, Res... resource) { - this(id, parent.getId(), title, creator, resource); - } - - public ImageItem(String id, String parentID, String title, String creator, Res... resource) { - super(id, parentID, title, creator, CLASS); - if (resource != null) { - getResources().addAll(Arrays.asList(resource)); - } - } - - public String getDescription() { - return getFirstPropertyValue(DC.DESCRIPTION.class); - } - - public ImageItem setDescription(String description) { - replaceFirstProperty(new DC.DESCRIPTION(description)); - return this; - } - - public String getLongDescription() { - return getFirstPropertyValue(UPNP.LONG_DESCRIPTION.class); - } - - public ImageItem setLongDescription(String description) { - replaceFirstProperty(new UPNP.LONG_DESCRIPTION(description)); - return this; - } - - public Person getFirstPublisher() { - return getFirstPropertyValue(DC.PUBLISHER.class); - } - - public Person[] getPublishers() { - List list = getPropertyValues(DC.PUBLISHER.class); - return list.toArray(new Person[list.size()]); - } - - public ImageItem setPublishers(Person[] publishers) { - removeProperties(DC.PUBLISHER.class); - for (Person publisher : publishers) { - addProperty(new DC.PUBLISHER(publisher)); - } - return this; - } - - public StorageMedium getStorageMedium() { - return getFirstPropertyValue(UPNP.STORAGE_MEDIUM.class); - } - - public ImageItem setStorageMedium(StorageMedium storageMedium) { - replaceFirstProperty(new UPNP.STORAGE_MEDIUM(storageMedium)); - return this; - } - - public String getRating() { - return getFirstPropertyValue(UPNP.RATING.class); - } - - public ImageItem setRating(String rating) { - replaceFirstProperty(new UPNP.RATING(rating)); - return this; - } - - public String getDate() { - return getFirstPropertyValue(DC.DATE.class); - } - - public ImageItem setDate(String date) { - replaceFirstProperty(new DC.DATE(date)); - return this; - } - - public String getFirstRights() { - return getFirstPropertyValue(DC.RIGHTS.class); - } - - public String[] getRights() { - List list = getPropertyValues(DC.RIGHTS.class); - return list.toArray(new String[list.size()]); - } - - public ImageItem setRights(String[] rights) { - removeProperties(DC.RIGHTS.class); - for (String right : rights) { - addProperty(new DC.RIGHTS(right)); - } - return this; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/Item.java b/app/src/main/java/org/fourthline/cling/support/model/item/Item.java deleted file mode 100644 index a965da2..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/Item.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.DIDLObject; -import org.fourthline.cling.support.model.DescMeta; -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.WriteStatus; -import org.fourthline.cling.support.model.container.Container; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Christian Bauer - */ -public class Item extends DIDLObject { - - protected String refID; - - public Item() { - } - - public Item(Item other) { - super(other); - setRefID(other.getRefID()); - } - - public Item(String id, String parentID, String title, String creator, boolean restricted, WriteStatus writeStatus, Class clazz, List resources, List properties, List descMetadata) { - super(id, parentID, title, creator, restricted, writeStatus, clazz, resources, properties, descMetadata); - } - - public Item(String id, String parentID, String title, String creator, boolean restricted, WriteStatus writeStatus, Class clazz, List resources, List properties, List descMetadata, String refID) { - super(id, parentID, title, creator, restricted, writeStatus, clazz, resources, properties, descMetadata); - this.refID = refID; - } - - public Item(String id, Container parent, String title, String creator, DIDLObject.Class clazz) { - this(id, parent.getId(), title, creator, false, null, clazz, new ArrayList(), new ArrayList(), new ArrayList()); - } - - public Item(String id, Container parent, String title, String creator, DIDLObject.Class clazz, String refID) { - this(id, parent.getId(), title, creator, false, null, clazz, new ArrayList(), new ArrayList(), new ArrayList(), refID); - } - - public Item(String id, String parentID, String title, String creator, DIDLObject.Class clazz) { - this(id, parentID, title, creator, false, null, clazz, new ArrayList(), new ArrayList(), new ArrayList()); - } - - public Item(String id, String parentID, String title, String creator, DIDLObject.Class clazz, String refID) { - this(id, parentID, title, creator, false, null, clazz, new ArrayList(), new ArrayList(), new ArrayList(), refID); - } - - public String getRefID() { - return refID; - } - - public void setRefID(String refID) { - this.refID = refID; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/Movie.java b/app/src/main/java/org/fourthline/cling/support/model/item/Movie.java deleted file mode 100644 index 2fadf48..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/Movie.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.StorageMedium; -import org.fourthline.cling.support.model.container.Container; - -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class Movie extends VideoItem { - - public static final Class CLASS = new Class("object.item.videoItem.movie"); - - public Movie() { - setClazz(CLASS); - } - - public Movie(Item other) { - super(other); - } - - public Movie(String id, Container parent, String title, String creator, Res... resource) { - this(id, parent.getId(), title, creator, resource); - } - - public Movie(String id, String parentID, String title, String creator, Res... resource) { - super(id, parentID, title, creator, resource); - setClazz(CLASS); - } - - public StorageMedium getStorageMedium() { - return getFirstPropertyValue(UPNP.STORAGE_MEDIUM.class); - } - - public Movie setStorageMedium(StorageMedium storageMedium) { - replaceFirstProperty(new UPNP.STORAGE_MEDIUM(storageMedium)); - return this; - } - - public Integer getDVDRegionCode() { - return getFirstPropertyValue(UPNP.DVD_REGION_CODE.class); - } - - public Movie setDVDRegionCode(Integer DVDRegionCode) { - replaceFirstProperty(new UPNP.DVD_REGION_CODE(DVDRegionCode)); - return this; - } - - public String getChannelName() { - return getFirstPropertyValue(UPNP.CHANNEL_NAME.class); - } - - public Movie setChannelName(String channelName) { - replaceFirstProperty(new UPNP.CHANNEL_NAME(channelName)); - return this; - } - - public String getFirstScheduledStartTime() { - return getFirstPropertyValue(UPNP.SCHEDULED_START_TIME.class); - } - - public String[] getScheduledStartTimes() { - List list = getPropertyValues(UPNP.SCHEDULED_START_TIME.class); - return list.toArray(new String[list.size()]); - } - - public Movie setScheduledStartTimes(String[] strings) { - removeProperties(UPNP.SCHEDULED_START_TIME.class); - for (String s : strings) { - addProperty(new UPNP.SCHEDULED_START_TIME(s)); - } - return this; - } - - public String getFirstScheduledEndTime() { - return getFirstPropertyValue(UPNP.SCHEDULED_END_TIME.class); - } - - public String[] getScheduledEndTimes() { - List list = getPropertyValues(UPNP.SCHEDULED_END_TIME.class); - return list.toArray(new String[list.size()]); - } - - public Movie setScheduledEndTimes(String[] strings) { - removeProperties(UPNP.SCHEDULED_END_TIME.class); - for (String s : strings) { - addProperty(new UPNP.SCHEDULED_END_TIME(s)); - } - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/MusicTrack.java b/app/src/main/java/org/fourthline/cling/support/model/item/MusicTrack.java deleted file mode 100644 index eb9cf1e..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/MusicTrack.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.Person; -import org.fourthline.cling.support.model.PersonWithRole; -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.StorageMedium; -import org.fourthline.cling.support.model.container.Container; - -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.DC; -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class MusicTrack extends AudioItem { - - public static final Class CLASS = new Class("object.item.audioItem.musicTrack"); - - public MusicTrack() { - setClazz(CLASS); - } - - public MusicTrack(Item other) { - super(other); - } - - public MusicTrack(String id, Container parent, String title, String creator, String album, String artist, Res... resource) { - this(id, parent.getId(), title, creator, album, artist, resource); - } - - public MusicTrack(String id, Container parent, String title, String creator, String album, PersonWithRole artist, Res... resource) { - this(id, parent.getId(), title, creator, album, artist, resource); - } - - public MusicTrack(String id, String parentID, String title, String creator, String album, String artist, Res... resource) { - this(id, parentID, title, creator, album, new PersonWithRole(artist), resource); - } - - public MusicTrack(String id, String parentID, String title, String creator, String album, PersonWithRole artist, Res... resource) { - super(id, parentID, title, creator, resource); - setClazz(CLASS); - if (album != null) - setAlbum(album); - if (artist != null) - addProperty(new UPNP.ARTIST(artist)); - } - - public PersonWithRole getFirstArtist() { - return getFirstPropertyValue(UPNP.ARTIST.class); - } - - public PersonWithRole[] getArtists() { - List list = getPropertyValues(UPNP.ARTIST.class); - return list.toArray(new PersonWithRole[list.size()]); - } - - public MusicTrack setArtists(PersonWithRole[] artists) { - removeProperties(UPNP.ARTIST.class); - for (PersonWithRole artist : artists) { - addProperty(new UPNP.ARTIST(artist)); - } - return this; - } - - public String getAlbum() { - return getFirstPropertyValue(UPNP.ALBUM.class); - } - - public MusicTrack setAlbum(String album) { - replaceFirstProperty(new UPNP.ALBUM(album)); - return this; - } - - public Integer getOriginalTrackNumber() { - return getFirstPropertyValue(UPNP.ORIGINAL_TRACK_NUMBER.class); - } - - public MusicTrack setOriginalTrackNumber(Integer number) { - replaceFirstProperty(new UPNP.ORIGINAL_TRACK_NUMBER(number)); - return this; - } - - public String getFirstPlaylist() { - return getFirstPropertyValue(UPNP.PLAYLIST.class); - } - - public String[] getPlaylists() { - List list = getPropertyValues(UPNP.PLAYLIST.class); - return list.toArray(new String[list.size()]); - } - - public MusicTrack setPlaylists(String[] playlists) { - removeProperties(UPNP.PLAYLIST.class); - for (String s : playlists) { - addProperty(new UPNP.PLAYLIST(s)); - } - return this; - } - - public StorageMedium getStorageMedium() { - return getFirstPropertyValue(UPNP.STORAGE_MEDIUM.class); - } - - public MusicTrack setStorageMedium(StorageMedium storageMedium) { - replaceFirstProperty(new UPNP.STORAGE_MEDIUM(storageMedium)); - return this; - } - - public Person getFirstContributor() { - return getFirstPropertyValue(DC.CONTRIBUTOR.class); - } - - public Person[] getContributors() { - List list = getPropertyValues(DC.CONTRIBUTOR.class); - return list.toArray(new Person[list.size()]); - } - - public MusicTrack setContributors(Person[] contributors) { - removeProperties(DC.CONTRIBUTOR.class); - for (Person p : contributors) { - addProperty(new DC.CONTRIBUTOR(p)); - } - return this; - } - - public String getDate() { - return getFirstPropertyValue(DC.DATE.class); - } - - public MusicTrack setDate(String date) { - replaceFirstProperty(new DC.DATE(date)); - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/MusicVideoClip.java b/app/src/main/java/org/fourthline/cling/support/model/item/MusicVideoClip.java deleted file mode 100644 index ebc61a2..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/MusicVideoClip.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.Person; -import org.fourthline.cling.support.model.PersonWithRole; -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.StorageMedium; -import org.fourthline.cling.support.model.container.Container; - -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.DC; -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class MusicVideoClip extends VideoItem { - - public static final Class CLASS = new Class("object.item.videoItem.musicVideoClip"); - - public MusicVideoClip() { - setClazz(CLASS); - } - - public MusicVideoClip(Item other) { - super(other); - } - - public MusicVideoClip(String id, Container parent, String title, String creator, Res... resource) { - this(id, parent.getId(), title, creator, resource); - } - - public MusicVideoClip(String id, String parentID, String title, String creator, Res... resource) { - super(id, parentID, title, creator, resource); - setClazz(CLASS); - } - - public PersonWithRole getFirstArtist() { - return getFirstPropertyValue(UPNP.ARTIST.class); - } - - public PersonWithRole[] getArtists() { - List list = getPropertyValues(UPNP.ARTIST.class); - return list.toArray(new PersonWithRole[list.size()]); - } - - public MusicVideoClip setArtists(PersonWithRole[] artists) { - removeProperties(UPNP.ARTIST.class); - for (PersonWithRole artist : artists) { - addProperty(new UPNP.ARTIST(artist)); - } - return this; - } - - public StorageMedium getStorageMedium() { - return getFirstPropertyValue(UPNP.STORAGE_MEDIUM.class); - } - - public MusicVideoClip setStorageMedium(StorageMedium storageMedium) { - replaceFirstProperty(new UPNP.STORAGE_MEDIUM(storageMedium)); - return this; - } - - public String getAlbum() { - return getFirstPropertyValue(UPNP.ALBUM.class); - } - - public MusicVideoClip setAlbum(String album) { - replaceFirstProperty(new UPNP.ALBUM(album)); - return this; - } - - public String getFirstScheduledStartTime() { - return getFirstPropertyValue(UPNP.SCHEDULED_START_TIME.class); - } - - public String[] getScheduledStartTimes() { - List list = getPropertyValues(UPNP.SCHEDULED_START_TIME.class); - return list.toArray(new String[list.size()]); - } - - public MusicVideoClip setScheduledStartTimes(String[] strings) { - removeProperties(UPNP.SCHEDULED_START_TIME.class); - for (String s : strings) { - addProperty(new UPNP.SCHEDULED_START_TIME(s)); - } - return this; - } - - public String getFirstScheduledEndTime() { - return getFirstPropertyValue(UPNP.SCHEDULED_END_TIME.class); - } - - public String[] getScheduledEndTimes() { - List list = getPropertyValues(UPNP.SCHEDULED_END_TIME.class); - return list.toArray(new String[list.size()]); - } - - public MusicVideoClip setScheduledEndTimes(String[] strings) { - removeProperties(UPNP.SCHEDULED_END_TIME.class); - for (String s : strings) { - addProperty(new UPNP.SCHEDULED_END_TIME(s)); - } - return this; - } - - public Person getFirstContributor() { - return getFirstPropertyValue(DC.CONTRIBUTOR.class); - } - - public Person[] getContributors() { - List list = getPropertyValues(DC.CONTRIBUTOR.class); - return list.toArray(new Person[list.size()]); - } - - public MusicVideoClip setContributors(Person[] contributors) { - removeProperties(DC.CONTRIBUTOR.class); - for (Person p : contributors) { - addProperty(new DC.CONTRIBUTOR(p)); - } - return this; - } - - public String getDate() { - return getFirstPropertyValue(DC.DATE.class); - } - - public MusicVideoClip setDate(String date) { - replaceFirstProperty(new DC.DATE(date)); - return this; - } - - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/Photo.java b/app/src/main/java/org/fourthline/cling/support/model/item/Photo.java deleted file mode 100644 index d43f8ba..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/Photo.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.container.Container; - -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class Photo extends ImageItem { - - public static final Class CLASS = new Class("object.item.imageItem.photo"); - - public Photo() { - setClazz(CLASS); - } - - public Photo(Item other) { - super(other); - } - - public Photo(String id, Container parent, String title, String creator, String album, Res... resource) { - this(id, parent.getId(), title, creator, album, resource); - } - - public Photo(String id, String parentID, String title, String creator, String album, Res... resource) { - super(id, parentID, title, creator, resource); - setClazz(CLASS); - if (album != null) - setAlbum(album); - } - - public String getAlbum() { - return getFirstPropertyValue(UPNP.ALBUM.class); - } - - public Photo setAlbum(String album) { - replaceFirstProperty(new UPNP.ALBUM(album)); - return this; - } - - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/PlaylistItem.java b/app/src/main/java/org/fourthline/cling/support/model/item/PlaylistItem.java deleted file mode 100644 index 5eb6edb..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/PlaylistItem.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.PersonWithRole; -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.StorageMedium; -import org.fourthline.cling.support.model.container.Container; - -import java.util.Arrays; -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.DC; -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class PlaylistItem extends Item { - - public static final Class CLASS = new Class("object.item.playlistItem"); - - public PlaylistItem() { - setClazz(CLASS); - } - - public PlaylistItem(Item other) { - super(other); - } - - public PlaylistItem(String id, Container parent, String title, String creator, Res... resource) { - this(id, parent.getId(), title, creator, resource); - } - - public PlaylistItem(String id, String parentID, String title, String creator, Res... resource) { - super(id, parentID, title, creator, CLASS); - if (resource != null) { - getResources().addAll(Arrays.asList(resource)); - } - } - - public PersonWithRole getFirstArtist() { - return getFirstPropertyValue(UPNP.ARTIST.class); - } - - public PersonWithRole[] getArtists() { - List list = getPropertyValues(UPNP.ARTIST.class); - return list.toArray(new PersonWithRole[list.size()]); - } - - public PlaylistItem setArtists(PersonWithRole[] artists) { - removeProperties(UPNP.ARTIST.class); - for (PersonWithRole artist : artists) { - addProperty(new UPNP.ARTIST(artist)); - } - return this; - } - - public String getFirstGenre() { - return getFirstPropertyValue(UPNP.GENRE.class); - } - - public String[] getGenres() { - List list = getPropertyValues(UPNP.GENRE.class); - return list.toArray(new String[list.size()]); - } - - public PlaylistItem setGenres(String[] genres) { - removeProperties(UPNP.GENRE.class); - for (String genre : genres) { - addProperty(new UPNP.GENRE(genre)); - } - return this; - } - - public String getDescription() { - return getFirstPropertyValue(DC.DESCRIPTION.class); - } - - public PlaylistItem setDescription(String description) { - replaceFirstProperty(new DC.DESCRIPTION(description)); - return this; - } - - public String getLongDescription() { - return getFirstPropertyValue(UPNP.LONG_DESCRIPTION.class); - } - - public PlaylistItem setLongDescription(String description) { - replaceFirstProperty(new UPNP.LONG_DESCRIPTION(description)); - return this; - } - - public String getLanguage() { - return getFirstPropertyValue(DC.LANGUAGE.class); - } - - public PlaylistItem setLanguage(String language) { - replaceFirstProperty(new DC.LANGUAGE(language)); - return this; - } - - public StorageMedium getStorageMedium() { - return getFirstPropertyValue(UPNP.STORAGE_MEDIUM.class); - } - - public PlaylistItem setStorageMedium(StorageMedium storageMedium) { - replaceFirstProperty(new UPNP.STORAGE_MEDIUM(storageMedium)); - return this; - } - - public String getDate() { - return getFirstPropertyValue(DC.DATE.class); - } - - public PlaylistItem setDate(String date) { - replaceFirstProperty(new DC.DATE(date)); - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/TextItem.java b/app/src/main/java/org/fourthline/cling/support/model/item/TextItem.java deleted file mode 100644 index 52a122b..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/TextItem.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.Person; -import org.fourthline.cling.support.model.PersonWithRole; -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.StorageMedium; -import org.fourthline.cling.support.model.container.Container; - -import java.net.URI; -import java.util.Arrays; -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.DC; -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class TextItem extends Item { - - public static final Class CLASS = new Class("object.item.textItem"); - - public TextItem() { - setClazz(CLASS); - } - - public TextItem(Item other) { - super(other); - } - - public TextItem(String id, Container parent, String title, String creator, Res... resource) { - this(id, parent.getId(), title, creator, resource); - } - - public TextItem(String id, String parentID, String title, String creator, Res... resource) { - super(id, parentID, title, creator, CLASS); - if (resource != null) { - getResources().addAll(Arrays.asList(resource)); - } - } - - public PersonWithRole getFirstAuthor() { - return getFirstPropertyValue(UPNP.AUTHOR.class); - } - - public PersonWithRole[] getAuthors() { - List list = getPropertyValues(UPNP.AUTHOR.class); - return list.toArray(new PersonWithRole[list.size()]); - } - - public TextItem setAuthors(PersonWithRole[] persons) { - removeProperties(UPNP.AUTHOR.class); - for (PersonWithRole p: persons) { - addProperty(new UPNP.AUTHOR(p)); - } - return this; - } - - public String getDescription() { - return getFirstPropertyValue(DC.DESCRIPTION.class); - } - - public TextItem setDescription(String description) { - replaceFirstProperty(new DC.DESCRIPTION(description)); - return this; - } - - public String getLongDescription() { - return getFirstPropertyValue(UPNP.LONG_DESCRIPTION.class); - } - - public TextItem setLongDescription(String description) { - replaceFirstProperty(new UPNP.LONG_DESCRIPTION(description)); - return this; - } - - public String getLanguage() { - return getFirstPropertyValue(DC.LANGUAGE.class); - } - - public TextItem setLanguage(String language) { - replaceFirstProperty(new DC.LANGUAGE(language)); - return this; - } - - public StorageMedium getStorageMedium() { - return getFirstPropertyValue(UPNP.STORAGE_MEDIUM.class); - } - - public TextItem setStorageMedium(StorageMedium storageMedium) { - replaceFirstProperty(new UPNP.STORAGE_MEDIUM(storageMedium)); - return this; - } - - public String getDate() { - return getFirstPropertyValue(DC.DATE.class); - } - - public TextItem setDate(String date) { - replaceFirstProperty(new DC.DATE(date)); - return this; - } - - public URI getFirstRelation() { - return getFirstPropertyValue(DC.RELATION.class); - } - - public URI[] getRelations() { - List list = getPropertyValues(DC.RELATION.class); - return list.toArray(new URI[list.size()]); - } - - public TextItem setRelations(URI[] relations) { - removeProperties(DC.RELATION.class); - for (URI relation : relations) { - addProperty(new DC.RELATION(relation)); - } - return this; - } - - public String getFirstRights() { - return getFirstPropertyValue(DC.RIGHTS.class); - } - - public String[] getRights() { - List list = getPropertyValues(DC.RIGHTS.class); - return list.toArray(new String[list.size()]); - } - - public TextItem setRights(String[] rights) { - removeProperties(DC.RIGHTS.class); - for (String right : rights) { - addProperty(new DC.RIGHTS(right)); - } - return this; - } - - public String getRating() { - return getFirstPropertyValue(UPNP.RATING.class); - } - - public TextItem setRating(String rating) { - replaceFirstProperty(new UPNP.RATING(rating)); - return this; - } - - public Person getFirstContributor() { - return getFirstPropertyValue(DC.CONTRIBUTOR.class); - } - - public Person[] getContributors() { - List list = getPropertyValues(DC.CONTRIBUTOR.class); - return list.toArray(new Person[list.size()]); - } - - public TextItem setContributors(Person[] contributors) { - removeProperties(DC.CONTRIBUTOR.class); - for (Person p : contributors) { - addProperty(new DC.CONTRIBUTOR(p)); - } - return this; - } - - public Person getFirstPublisher() { - return getFirstPropertyValue(DC.PUBLISHER.class); - } - - public Person[] getPublishers() { - List list = getPropertyValues(DC.PUBLISHER.class); - return list.toArray(new Person[list.size()]); - } - - public TextItem setPublishers(Person[] publishers) { - removeProperties(DC.PUBLISHER.class); - for (Person publisher : publishers) { - addProperty(new DC.PUBLISHER(publisher)); - } - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/VideoBroadcast.java b/app/src/main/java/org/fourthline/cling/support/model/item/VideoBroadcast.java deleted file mode 100644 index 576735b..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/VideoBroadcast.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.container.Container; - -import java.net.URI; - -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class VideoBroadcast extends VideoItem { - - public static final Class CLASS = new Class("object.item.videoItem.videoBroadcast"); - - public VideoBroadcast() { - setClazz(CLASS); - } - - public VideoBroadcast(Item other) { - super(other); - } - - public VideoBroadcast(String id, Container parent, String title, String creator, Res... resource) { - this(id, parent.getId(), title, creator, resource); - } - - public VideoBroadcast(String id, String parentID, String title, String creator, Res... resource) { - super(id, parentID, title, creator, resource); - setClazz(CLASS); - } - - public URI getIcon() { - return getFirstPropertyValue(UPNP.ICON.class); - } - - public VideoBroadcast setIcon(URI icon) { - replaceFirstProperty(new UPNP.ICON(icon)); - return this; - } - - public String getRegion() { - return getFirstPropertyValue(UPNP.REGION.class); - } - - public VideoBroadcast setRegion(String region) { - replaceFirstProperty(new UPNP.REGION(region)); - return this; - } - - public Integer getChannelNr() { - return getFirstPropertyValue(UPNP.CHANNEL_NR.class); - } - - public VideoBroadcast setChannelNr(Integer channelNr) { - replaceFirstProperty(new UPNP.CHANNEL_NR(channelNr)); - return this; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/model/item/VideoItem.java b/app/src/main/java/org/fourthline/cling/support/model/item/VideoItem.java deleted file mode 100644 index 8c6a83c..0000000 --- a/app/src/main/java/org/fourthline/cling/support/model/item/VideoItem.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.model.item; - -import org.fourthline.cling.support.model.Person; -import org.fourthline.cling.support.model.PersonWithRole; -import org.fourthline.cling.support.model.Res; -import org.fourthline.cling.support.model.container.Container; - -import java.net.URI; -import java.util.Arrays; -import java.util.List; - -import static org.fourthline.cling.support.model.DIDLObject.Property.DC; -import static org.fourthline.cling.support.model.DIDLObject.Property.UPNP; - -/** - * @author Christian Bauer - */ -public class VideoItem extends Item { - - public static final Class CLASS = new Class("object.item.videoItem"); - - public VideoItem() { - setClazz(CLASS); - } - - public VideoItem(Item other) { - super(other); - } - - public VideoItem(String id, Container parent, String title, String creator, Res... resource) { - this(id, parent.getId(), title, creator, resource); - } - - public VideoItem(String id, String parentID, String title, String creator, Res... resource) { - super(id, parentID, title, creator, CLASS); - if (resource != null) { - getResources().addAll(Arrays.asList(resource)); - } - } - - public String getFirstGenre() { - return getFirstPropertyValue(UPNP.GENRE.class); - } - - public String[] getGenres() { - List list = getPropertyValues(UPNP.GENRE.class); - return list.toArray(new String[list.size()]); - } - - public VideoItem setGenres(String[] genres) { - removeProperties(UPNP.GENRE.class); - for (String genre : genres) { - addProperty(new UPNP.GENRE(genre)); - } - return this; - } - - public String getDescription() { - return getFirstPropertyValue(DC.DESCRIPTION.class); - } - - public VideoItem setDescription(String description) { - replaceFirstProperty(new DC.DESCRIPTION(description)); - return this; - } - - public String getLongDescription() { - return getFirstPropertyValue(UPNP.LONG_DESCRIPTION.class); - } - - public VideoItem setLongDescription(String description) { - replaceFirstProperty(new UPNP.LONG_DESCRIPTION(description)); - return this; - } - - public Person getFirstProducer() { - return getFirstPropertyValue(UPNP.PRODUCER.class); - } - - public Person[] getProducers() { - List list = getPropertyValues(UPNP.PRODUCER.class); - return list.toArray(new Person[list.size()]); - } - - public VideoItem setProducers(Person[] persons) { - removeProperties(UPNP.PRODUCER.class); - for (Person p : persons) { - addProperty(new UPNP.PRODUCER(p)); - } - return this; - } - - public String getRating() { - return getFirstPropertyValue(UPNP.RATING.class); - } - - public VideoItem setRating(String rating) { - replaceFirstProperty(new UPNP.RATING(rating)); - return this; - } - - public PersonWithRole getFirstActor() { - return getFirstPropertyValue(UPNP.ACTOR.class); - } - - public PersonWithRole[] getActors() { - List list = getPropertyValues(UPNP.ACTOR.class); - return list.toArray(new PersonWithRole[list.size()]); - } - - public VideoItem setActors(PersonWithRole[] persons) { - removeProperties(UPNP.ACTOR.class); - for (PersonWithRole p : persons) { - addProperty(new UPNP.ACTOR(p)); - } - return this; - } - - public Person getFirstDirector() { - return getFirstPropertyValue(UPNP.DIRECTOR.class); - } - - public Person[] getDirectors() { - List list = getPropertyValues(UPNP.DIRECTOR.class); - return list.toArray(new Person[list.size()]); - } - - public VideoItem setDirectors(Person[] persons) { - removeProperties(UPNP.DIRECTOR.class); - for (Person p : persons) { - addProperty(new UPNP.DIRECTOR(p)); - } - return this; - } - - public Person getFirstPublisher() { - return getFirstPropertyValue(DC.PUBLISHER.class); - } - - public Person[] getPublishers() { - List list = getPropertyValues(DC.PUBLISHER.class); - return list.toArray(new Person[list.size()]); - } - - public VideoItem setPublishers(Person[] publishers) { - removeProperties(DC.PUBLISHER.class); - for (Person publisher : publishers) { - addProperty(new DC.PUBLISHER(publisher)); - } - return this; - } - - public String getLanguage() { - return getFirstPropertyValue(DC.LANGUAGE.class); - } - - public VideoItem setLanguage(String language) { - replaceFirstProperty(new DC.LANGUAGE(language)); - return this; - } - - public URI getFirstRelation() { - return getFirstPropertyValue(DC.RELATION.class); - } - - public URI[] getRelations() { - List list = getPropertyValues(DC.RELATION.class); - return list.toArray(new URI[list.size()]); - } - - public VideoItem setRelations(URI[] relations) { - removeProperties(DC.RELATION.class); - for (URI relation : relations) { - addProperty(new DC.RELATION(relation)); - } - return this; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/AbstractAudioRenderingControl.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/AbstractAudioRenderingControl.java deleted file mode 100644 index a1f52e8..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/AbstractAudioRenderingControl.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol; - -import org.fourthline.cling.binding.annotations.UpnpAction; -import org.fourthline.cling.binding.annotations.UpnpInputArgument; -import org.fourthline.cling.binding.annotations.UpnpOutputArgument; -import org.fourthline.cling.binding.annotations.UpnpService; -import org.fourthline.cling.binding.annotations.UpnpServiceId; -import org.fourthline.cling.binding.annotations.UpnpServiceType; -import org.fourthline.cling.binding.annotations.UpnpStateVariable; -import org.fourthline.cling.binding.annotations.UpnpStateVariables; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.model.types.UnsignedIntegerTwoBytes; -import org.fourthline.cling.support.lastchange.LastChange; -import org.fourthline.cling.support.lastchange.LastChangeDelegator; -import org.fourthline.cling.support.model.Channel; -import org.fourthline.cling.support.model.PresetName; -import org.fourthline.cling.support.model.VolumeDBRange; -import org.fourthline.cling.support.renderingcontrol.lastchange.ChannelLoudness; -import org.fourthline.cling.support.renderingcontrol.lastchange.ChannelMute; -import org.fourthline.cling.support.renderingcontrol.lastchange.ChannelVolume; -import org.fourthline.cling.support.renderingcontrol.lastchange.ChannelVolumeDB; -import org.fourthline.cling.support.renderingcontrol.lastchange.RenderingControlLastChangeParser; -import org.fourthline.cling.support.renderingcontrol.lastchange.RenderingControlVariable; - -import java.beans.PropertyChangeSupport; - -/** - * - */ -@UpnpService( - serviceId = @UpnpServiceId("RenderingControl"), - serviceType = @UpnpServiceType(value = "RenderingControl", version = 1), - stringConvertibleTypes = LastChange.class -) -@UpnpStateVariables({ - @UpnpStateVariable( - name = "PresetNameList", - sendEvents = false, - datatype = "string"), - @UpnpStateVariable( - name = "Mute", - sendEvents = false, - datatype = "boolean"), - @UpnpStateVariable( - name = "Volume", - sendEvents = false, - datatype = "ui2", - allowedValueMinimum = 0, - allowedValueMaximum = 100), - @UpnpStateVariable( - name = "VolumeDB", - sendEvents = false, - datatype = "i2", - allowedValueMinimum = -36864, - allowedValueMaximum = 32767), - @UpnpStateVariable( - name = "Loudness", - sendEvents = false, - datatype = "boolean"), - @UpnpStateVariable( - name = "A_ARG_TYPE_Channel", - sendEvents = false, - allowedValuesEnum = Channel.class), - @UpnpStateVariable( - name = "A_ARG_TYPE_PresetName", - sendEvents = false, - allowedValuesEnum = PresetName.class), - @UpnpStateVariable( - name = "A_ARG_TYPE_InstanceID", - sendEvents = false, - datatype = "ui4") - -}) -public abstract class AbstractAudioRenderingControl implements LastChangeDelegator { - - @UpnpStateVariable(eventMaximumRateMilliseconds = 200) - final private LastChange lastChange; - - final protected PropertyChangeSupport propertyChangeSupport; - - protected AbstractAudioRenderingControl() { - this.propertyChangeSupport = new PropertyChangeSupport(this); - this.lastChange = new LastChange(new RenderingControlLastChangeParser()); - } - - protected AbstractAudioRenderingControl(LastChange lastChange) { - this.propertyChangeSupport = new PropertyChangeSupport(this); - this.lastChange = lastChange; - } - - protected AbstractAudioRenderingControl(PropertyChangeSupport propertyChangeSupport) { - this.propertyChangeSupport = propertyChangeSupport; - this.lastChange = new LastChange(new RenderingControlLastChangeParser()); - } - - protected AbstractAudioRenderingControl(PropertyChangeSupport propertyChangeSupport, LastChange lastChange) { - this.propertyChangeSupport = propertyChangeSupport; - this.lastChange = lastChange; - } - - @Override - public LastChange getLastChange() { - return lastChange; - } - - @Override - public void appendCurrentState(LastChange lc, UnsignedIntegerFourBytes instanceId) throws Exception { - for (Channel channel : getCurrentChannels()) { - String channelString = channel.name(); - lc.setEventedValue( - instanceId, - new RenderingControlVariable.Mute(new ChannelMute(channel, getMute(instanceId, channelString))), - new RenderingControlVariable.Loudness(new ChannelLoudness(channel, getLoudness(instanceId, channelString))), - new RenderingControlVariable.Volume(new ChannelVolume(channel, getVolume(instanceId, channelString).getValue().intValue())), - new RenderingControlVariable.VolumeDB(new ChannelVolumeDB(channel, getVolumeDB(instanceId, channelString))), - new RenderingControlVariable.PresetNameList(PresetName.FactoryDefaults.name()) - ); - } - } - - public PropertyChangeSupport getPropertyChangeSupport() { - return propertyChangeSupport; - } - - public static UnsignedIntegerFourBytes getDefaultInstanceID() { - return new UnsignedIntegerFourBytes(0); - } - - @UpnpAction(out = @UpnpOutputArgument(name = "CurrentPresetNameList", stateVariable = "PresetNameList")) - public String listPresets(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId) throws RenderingControlException { - return PresetName.FactoryDefaults.toString(); - } - - @UpnpAction - public void selectPreset(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "PresetName") String presetName) throws RenderingControlException { - } - - @UpnpAction(out = @UpnpOutputArgument(name = "CurrentMute", stateVariable = "Mute")) - public abstract boolean getMute(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "Channel") String channelName) throws RenderingControlException; - - @UpnpAction - public abstract void setMute(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "Channel") String channelName, - @UpnpInputArgument(name = "DesiredMute", stateVariable = "Mute") boolean desiredMute) throws RenderingControlException; - - @UpnpAction(out = @UpnpOutputArgument(name = "CurrentVolume", stateVariable = "Volume")) - public abstract UnsignedIntegerTwoBytes getVolume(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "Channel") String channelName) throws RenderingControlException; - - @UpnpAction - public abstract void setVolume(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "Channel") String channelName, - @UpnpInputArgument(name = "DesiredVolume", stateVariable = "Volume") UnsignedIntegerTwoBytes desiredVolume) throws RenderingControlException; - - @UpnpAction(out = @UpnpOutputArgument(name = "CurrentVolume", stateVariable = "VolumeDB")) - public Integer getVolumeDB(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "Channel") String channelName) throws RenderingControlException { - return 0; - } - - @UpnpAction - public void setVolumeDB(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "Channel") String channelName, - @UpnpInputArgument(name = "DesiredVolume", stateVariable = "VolumeDB") Integer desiredVolumeDB) throws RenderingControlException { - /* - VolumeDB volumeDB = new VolumeDB(); - volumeDB.setChannel(channelName); - volumeDB.setVal(new BigInteger(desiredVolumeDB.toString())); - */ - } - - @UpnpAction(out = { - @UpnpOutputArgument(name = "MinValue", stateVariable = "VolumeDB", getterName = "getMinValue"), - @UpnpOutputArgument(name = "MaxValue", stateVariable = "VolumeDB", getterName = "getMaxValue") - }) - public VolumeDBRange getVolumeDBRange(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "Channel") String channelName) throws RenderingControlException { - return new VolumeDBRange(0, 0); - } - - @UpnpAction(out = @UpnpOutputArgument(name = "CurrentLoudness", stateVariable = "Loudness")) - public boolean getLoudness(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "Channel") String channelName) throws RenderingControlException { - return false; - } - - @UpnpAction - public void setLoudness(@UpnpInputArgument(name = "InstanceID") UnsignedIntegerFourBytes instanceId, - @UpnpInputArgument(name = "Channel") String channelName, - @UpnpInputArgument(name = "DesiredLoudness", stateVariable = "Loudness") boolean desiredLoudness) throws RenderingControlException { -/* - Loudness loudness = new Loudness(); - loudness.setChannel(channelName); - loudness.setVal(desiredLoudness); -*/ - } - - protected abstract Channel[] getCurrentChannels(); - - protected Channel getChannel(String channelName) throws RenderingControlException { - try { - return Channel.valueOf(channelName); - } catch (IllegalArgumentException ex) { - throw new RenderingControlException(ErrorCode.ARGUMENT_VALUE_INVALID, "Unsupported audio channel: " + channelName); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/RenderingControlErrorCode.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/RenderingControlErrorCode.java deleted file mode 100644 index 03b96dd..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/RenderingControlErrorCode.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol; - -/** - * - */ -public enum RenderingControlErrorCode { - - INVALID_PRESET_NAME(701, "The specified name is not a valid preset name"), - INVALID_INSTANCE_ID(702, "The specified instanceID is invalid for this RenderingControl"); - - private int code; - private String description; - - RenderingControlErrorCode(int code, String description) { - this.code = code; - this.description = description; - } - - public int getCode() { - return code; - } - - public String getDescription() { - return description; - } - - public static RenderingControlErrorCode getByCode(int code) { - for (RenderingControlErrorCode errorCode : RenderingControlErrorCode.values()) { - if (errorCode.getCode() == code) - return errorCode; - } - return null; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/RenderingControlException.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/RenderingControlException.java deleted file mode 100644 index 18fd0f0..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/RenderingControlException.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol; - -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.types.ErrorCode; - -/** - * - */ -public class RenderingControlException extends ActionException { - - public RenderingControlException(int errorCode, String message) { - super(errorCode, message); - } - - public RenderingControlException(int errorCode, String message, Throwable cause) { - super(errorCode, message, cause); - } - - public RenderingControlException(ErrorCode errorCode, String message) { - super(errorCode, message); - } - - public RenderingControlException(ErrorCode errorCode) { - super(errorCode); - } - - public RenderingControlException(RenderingControlErrorCode errorCode, String message) { - super(errorCode.getCode(), errorCode.getDescription() + ". " + message + "."); - } - - public RenderingControlException(RenderingControlErrorCode errorCode) { - super(errorCode.getCode(), errorCode.getDescription()); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/GetMute.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/GetMute.java deleted file mode 100644 index 3f0bc9a..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/GetMute.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.Channel; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class GetMute extends ActionCallback { - - private static Logger log = Logger.getLogger(GetMute.class.getName()); - - public GetMute(Service service) { - this(new UnsignedIntegerFourBytes(0), service); - } - public GetMute(UnsignedIntegerFourBytes instanceId, Service service) { - super(new ActionInvocation(service.getAction("GetMute"))); - getActionInvocation().setInput("InstanceID", instanceId); - getActionInvocation().setInput("Channel", Channel.Master.toString()); - } - - public void success(ActionInvocation invocation) { - boolean currentMute = (Boolean) invocation.getOutput("CurrentMute").getValue(); - received(invocation, currentMute); - } - - public abstract void received(ActionInvocation actionInvocation, boolean currentMute); -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/GetVolume.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/GetVolume.java deleted file mode 100644 index 4059057..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/GetVolume.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.Channel; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class GetVolume extends ActionCallback { - - private static Logger log = Logger.getLogger(GetVolume.class.getName()); - - public GetVolume(Service service) { - this(new UnsignedIntegerFourBytes(0), service); - } - - public GetVolume(UnsignedIntegerFourBytes instanceId, Service service) { - super(new ActionInvocation(service.getAction("GetVolume"))); - getActionInvocation().setInput("InstanceID", instanceId); - getActionInvocation().setInput("Channel", Channel.Master.toString()); - } - - public void success(ActionInvocation invocation) { - boolean ok = true; - int currentVolume = 0; - try { - currentVolume = Integer.valueOf(invocation.getOutput("CurrentVolume").getValue().toString()); // UnsignedIntegerTwoBytes... - } catch (Exception ex) { - invocation.setFailure( - new ActionException(ErrorCode.ACTION_FAILED, "Can't parse ProtocolInfo response: " + ex, ex) - ); - failure(invocation, null); - ok = false; - } - if (ok) received(invocation, currentVolume); - } - - public abstract void received(ActionInvocation actionInvocation, int currentVolume); - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/SetMute.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/SetMute.java deleted file mode 100644 index 0ea6ff2..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/SetMute.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.support.model.Channel; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class SetMute extends ActionCallback { - - private static Logger log = Logger.getLogger(SetMute.class.getName()); - - public SetMute(Service service, boolean desiredMute) { - this(new UnsignedIntegerFourBytes(0), service, desiredMute); - } - - public SetMute(UnsignedIntegerFourBytes instanceId, Service service, boolean desiredMute) { - super(new ActionInvocation(service.getAction("SetMute"))); - getActionInvocation().setInput("InstanceID", instanceId); - getActionInvocation().setInput("Channel", Channel.Master.toString()); - getActionInvocation().setInput("DesiredMute", desiredMute); - } - - @Override - public void success(ActionInvocation invocation) { - log.fine("Executed successfully"); - - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/SetVolume.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/SetVolume.java deleted file mode 100644 index ef6afb9..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/callback/SetVolume.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.callback; - -import org.fourthline.cling.controlpoint.ActionCallback; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.meta.Service; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; -import org.fourthline.cling.model.types.UnsignedIntegerTwoBytes; -import org.fourthline.cling.support.model.Channel; - -import java.util.logging.Logger; - -/** - * - * @author Christian Bauer - */ -public abstract class SetVolume extends ActionCallback { - - private static Logger log = Logger.getLogger(SetVolume.class.getName()); - - public SetVolume(Service service, long newVolume) { - this(new UnsignedIntegerFourBytes(0), service, newVolume); - } - - public SetVolume(UnsignedIntegerFourBytes instanceId, Service service, long newVolume) { - super(new ActionInvocation(service.getAction("SetVolume"))); - getActionInvocation().setInput("InstanceID", instanceId); - getActionInvocation().setInput("Channel", Channel.Master.toString()); - getActionInvocation().setInput("DesiredVolume", new UnsignedIntegerTwoBytes(newVolume)); - } - - @Override - public void success(ActionInvocation invocation) { - log.fine("Executed successfully"); - - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelLoudness.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelLoudness.java deleted file mode 100644 index 96b775f..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelLoudness.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.lastchange; - -import org.fourthline.cling.support.model.Channel; - -/** - * @author Christian Bauer - */ -public class ChannelLoudness { - - protected Channel channel; - protected Boolean loudness; - - public ChannelLoudness(Channel channel, Boolean loudness) { - this.channel = channel; - this.loudness = loudness; - } - - public Channel getChannel() { - return channel; - } - - public Boolean getLoudness() { - return loudness; - } - - @Override - public String toString() { - return "Loudness: " + getLoudness() + " (" + getChannel() + ")"; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelMute.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelMute.java deleted file mode 100644 index b7ec6fe..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelMute.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.lastchange; - -import org.fourthline.cling.support.model.Channel; - -/** - * @author Christian Bauer - */ -public class ChannelMute { - - protected Channel channel; - protected Boolean mute; - - public ChannelMute(Channel channel, Boolean mute) { - this.channel = channel; - this.mute = mute; - } - - public Channel getChannel() { - return channel; - } - - public Boolean getMute() { - return mute; - } - - @Override - public String toString() { - return "Mute: " + getMute() + " (" + getChannel() + ")"; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelVolume.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelVolume.java deleted file mode 100644 index f7e729c..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelVolume.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.lastchange; - -import org.fourthline.cling.support.model.Channel; - -/** - * @author Christian Bauer - */ -public class ChannelVolume { - - protected Channel channel; - protected Integer volume; - - public ChannelVolume(Channel channel, Integer volume) { - this.channel = channel; - this.volume = volume; - } - - public Channel getChannel() { - return channel; - } - - public Integer getVolume() { - return volume; - } - - @Override - public String toString() { - return "Volume: " + getVolume() + " (" + getChannel() + ")"; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelVolumeDB.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelVolumeDB.java deleted file mode 100644 index 7cf219d..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/ChannelVolumeDB.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.lastchange; - -import org.fourthline.cling.support.model.Channel; - -/** - * @author Christian Bauer - */ -public class ChannelVolumeDB { - - protected Channel channel; - protected Integer volumeDB; - - public ChannelVolumeDB(Channel channel, Integer volumeDB) { - this.channel = channel; - this.volumeDB = volumeDB; - } - - public Channel getChannel() { - return channel; - } - - public Integer getVolumeDB() { - return volumeDB; - } - - @Override - public String toString() { - return "VolumeDB: " + getVolumeDB() + " (" + getChannel() + ")"; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelLoudness.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelLoudness.java deleted file mode 100644 index accdb1d..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelLoudness.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.lastchange; - -import org.fourthline.cling.model.types.BooleanDatatype; -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.support.lastchange.EventedValue; -import org.fourthline.cling.support.model.Channel; -import org.fourthline.cling.support.shared.AbstractMap; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public class EventedValueChannelLoudness extends EventedValue { - - public EventedValueChannelLoudness(ChannelLoudness value) { - super(value); - } - - public EventedValueChannelLoudness(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected ChannelLoudness valueOf(Map.Entry[] attributes) throws InvalidValueException { - Channel channel = null; - Boolean loudness = null; - for (Map.Entry attribute : attributes) { - if (attribute.getKey().equals("channel")) - channel = Channel.valueOf(attribute.getValue()); - if (attribute.getKey().equals("val")) - loudness = new BooleanDatatype().valueOf(attribute.getValue()); - } - return channel != null && loudness != null ? new ChannelLoudness(channel, loudness) : null; - } - - @Override - public Map.Entry[] getAttributes() { - return new Map.Entry[]{ - new AbstractMap.SimpleEntry( - "val", - new BooleanDatatype().getString(getValue().getLoudness()) - ), - new AbstractMap.SimpleEntry( - "channel", - getValue().getChannel().name() - ) - }; - } - - @Override - public String toString() { - return getValue().toString(); - } - - @Override - protected Datatype getDatatype() { - return null; // Not needed - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelMute.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelMute.java deleted file mode 100644 index 5f315f9..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelMute.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.lastchange; - -import org.fourthline.cling.model.types.BooleanDatatype; -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.support.lastchange.EventedValue; -import org.fourthline.cling.support.model.Channel; -import org.fourthline.cling.support.shared.AbstractMap; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public class EventedValueChannelMute extends EventedValue { - - public EventedValueChannelMute(ChannelMute value) { - super(value); - } - - public EventedValueChannelMute(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected ChannelMute valueOf(Map.Entry[] attributes) throws InvalidValueException { - Channel channel = null; - Boolean mute = null; - for (Map.Entry attribute : attributes) { - if (attribute.getKey().equals("channel")) - channel = Channel.valueOf(attribute.getValue()); - if (attribute.getKey().equals("val")) - mute = new BooleanDatatype().valueOf(attribute.getValue()); - } - return channel != null && mute != null ? new ChannelMute(channel, mute) : null; - } - - @Override - public Map.Entry[] getAttributes() { - return new Map.Entry[]{ - new AbstractMap.SimpleEntry( - "val", - new BooleanDatatype().getString(getValue().getMute()) - ), - new AbstractMap.SimpleEntry( - "channel", - getValue().getChannel().name() - ) - }; - } - - @Override - public String toString() { - return getValue().toString(); - } - - @Override - protected Datatype getDatatype() { - return null; // Not needed - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelVolume.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelVolume.java deleted file mode 100644 index 8cdbbbf..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelVolume.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.lastchange; - -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.model.types.UnsignedIntegerTwoBytes; -import org.fourthline.cling.model.types.UnsignedIntegerTwoBytesDatatype; -import org.fourthline.cling.support.lastchange.EventedValue; -import org.fourthline.cling.support.model.Channel; -import org.fourthline.cling.support.shared.AbstractMap; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public class EventedValueChannelVolume extends EventedValue { - - public EventedValueChannelVolume(ChannelVolume value) { - super(value); - } - - public EventedValueChannelVolume(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected ChannelVolume valueOf(Map.Entry[] attributes) throws InvalidValueException { - Channel channel = null; - Integer volume = null; - for (Map.Entry attribute : attributes) { - if (attribute.getKey().equals("channel")) - channel = Channel.valueOf(attribute.getValue()); - if (attribute.getKey().equals("val")) - volume = (new UnsignedIntegerTwoBytesDatatype() - .valueOf(attribute.getValue())) - .getValue().intValue(); // Java is fun! - } - return channel != null && volume != null ? new ChannelVolume(channel, volume) : null; - } - - @Override - public Map.Entry[] getAttributes() { - return new Map.Entry[]{ - new AbstractMap.SimpleEntry( - "val", - new UnsignedIntegerTwoBytesDatatype().getString( - new UnsignedIntegerTwoBytes(getValue().getVolume()) - ) - ), - new AbstractMap.SimpleEntry( - "channel", - getValue().getChannel().name() - ) - }; - } - - @Override - public String toString() { - return getValue().toString(); - } - - @Override - protected Datatype getDatatype() { - return null; // Not needed - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelVolumeDB.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelVolumeDB.java deleted file mode 100644 index 1ce9b64..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/EventedValueChannelVolumeDB.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.lastchange; - -import org.fourthline.cling.model.types.Datatype; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.model.types.UnsignedIntegerTwoBytes; -import org.fourthline.cling.model.types.UnsignedIntegerTwoBytesDatatype; -import org.fourthline.cling.support.lastchange.EventedValue; -import org.fourthline.cling.support.model.Channel; -import org.fourthline.cling.support.shared.AbstractMap; - -import java.util.Map; - -/** - * @author Christian Bauer - */ -public class EventedValueChannelVolumeDB extends EventedValue { - - public EventedValueChannelVolumeDB(ChannelVolumeDB value) { - super(value); - } - - public EventedValueChannelVolumeDB(Map.Entry[] attributes) { - super(attributes); - } - - @Override - protected ChannelVolumeDB valueOf(Map.Entry[] attributes) throws InvalidValueException { - Channel channel = null; - Integer volumeDB = null; - for (Map.Entry attribute : attributes) { - if (attribute.getKey().equals("channel")) - channel = Channel.valueOf(attribute.getValue()); - if (attribute.getKey().equals("val")) - volumeDB = (new UnsignedIntegerTwoBytesDatatype() - .valueOf(attribute.getValue())) - .getValue().intValue(); // Java is fun! - } - return channel != null && volumeDB != null ? new ChannelVolumeDB(channel, volumeDB) : null; - } - - @Override - public Map.Entry[] getAttributes() { - return new Map.Entry[]{ - new AbstractMap.SimpleEntry( - "val", - new UnsignedIntegerTwoBytesDatatype().getString( - new UnsignedIntegerTwoBytes(getValue().getVolumeDB()) - ) - ), - new AbstractMap.SimpleEntry( - "channel", - getValue().getChannel().name() - ) - }; - } - - @Override - public String toString() { - return getValue().toString(); - } - - @Override - protected Datatype getDatatype() { - return null; // Not needed - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/RenderingControlLastChangeParser.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/RenderingControlLastChangeParser.java deleted file mode 100644 index 3dc415c..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/RenderingControlLastChangeParser.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.lastchange; - -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.support.lastchange.EventedValue; -import org.fourthline.cling.support.lastchange.LastChangeParser; - -import javax.xml.transform.Source; -import javax.xml.transform.stream.StreamSource; -import java.util.Set; - -/** - * @author Christian Bauer - */ -public class RenderingControlLastChangeParser extends LastChangeParser { - - public static final String NAMESPACE_URI = "urn:schemas-upnp-org:metadata-1-0/RCS/"; - public static final String SCHEMA_RESOURCE = "org/fourthline/cling/support/renderingcontrol/metadata-1.0-rcs.xsd"; - - @Override - protected String getNamespace() { - return NAMESPACE_URI; - } - - @Override - protected Source[] getSchemaSources() { - // TODO: Android 2.2 has a broken SchemaFactory, we can't validate - // http://code.google.com/p/android/issues/detail?id=9491&q=schemafactory&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars - if (!ModelUtil.ANDROID_RUNTIME) { - return new Source[]{new StreamSource( - Thread.currentThread().getContextClassLoader().getResourceAsStream(SCHEMA_RESOURCE) - )}; - } - return null; - } - - @Override - protected Set> getEventedVariables() { - return RenderingControlVariable.ALL; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/RenderingControlVariable.java b/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/RenderingControlVariable.java deleted file mode 100644 index 4772dfb..0000000 --- a/app/src/main/java/org/fourthline/cling/support/renderingcontrol/lastchange/RenderingControlVariable.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.renderingcontrol.lastchange; - -import org.fourthline.cling.model.types.UnsignedIntegerTwoBytes; -import org.fourthline.cling.support.lastchange.EventedValue; -import org.fourthline.cling.support.lastchange.EventedValueShort; -import org.fourthline.cling.support.lastchange.EventedValueString; -import org.fourthline.cling.support.lastchange.EventedValueUnsignedIntegerTwoBytes; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -/** - * @author Christian Bauer - */ -public class RenderingControlVariable { - - public static Set> ALL = new HashSet>() {{ - add(PresetNameList.class); - add(Brightness.class); - add(Contrast.class); - add(Sharpness.class); - add(RedVideoGain.class); - add(BlueVideoGain.class); - add(GreenVideoGain.class); - add(RedVideoBlackLevel.class); - add(BlueVideoBlackLevel.class); - add(GreenVideoBlackLevel.class); - add(ColorTemperature.class); - add(HorizontalKeystone.class); - add(VerticalKeystone.class); - add(Mute.class); - add(VolumeDB.class); - add(Volume.class); - add(Loudness.class); - }}; - - public static class PresetNameList extends EventedValueString { - public PresetNameList(String s) { - super(s); - } - - public PresetNameList(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class Brightness extends EventedValueUnsignedIntegerTwoBytes { - public Brightness(UnsignedIntegerTwoBytes value) { - super(value); - } - - public Brightness(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class Contrast extends EventedValueUnsignedIntegerTwoBytes { - public Contrast(UnsignedIntegerTwoBytes value) { - super(value); - } - - public Contrast(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class Sharpness extends EventedValueUnsignedIntegerTwoBytes { - public Sharpness(UnsignedIntegerTwoBytes value) { - super(value); - } - - public Sharpness(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class RedVideoGain extends EventedValueUnsignedIntegerTwoBytes { - public RedVideoGain(UnsignedIntegerTwoBytes value) { - super(value); - } - - public RedVideoGain(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class BlueVideoGain extends EventedValueUnsignedIntegerTwoBytes { - public BlueVideoGain(UnsignedIntegerTwoBytes value) { - super(value); - } - - public BlueVideoGain(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class GreenVideoGain extends EventedValueUnsignedIntegerTwoBytes { - public GreenVideoGain(UnsignedIntegerTwoBytes value) { - super(value); - } - - public GreenVideoGain(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class RedVideoBlackLevel extends EventedValueUnsignedIntegerTwoBytes { - public RedVideoBlackLevel(UnsignedIntegerTwoBytes value) { - super(value); - } - - public RedVideoBlackLevel(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class BlueVideoBlackLevel extends EventedValueUnsignedIntegerTwoBytes { - public BlueVideoBlackLevel(UnsignedIntegerTwoBytes value) { - super(value); - } - - public BlueVideoBlackLevel(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class GreenVideoBlackLevel extends EventedValueUnsignedIntegerTwoBytes { - public GreenVideoBlackLevel(UnsignedIntegerTwoBytes value) { - super(value); - } - - public GreenVideoBlackLevel(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class ColorTemperature extends EventedValueUnsignedIntegerTwoBytes { - public ColorTemperature(UnsignedIntegerTwoBytes value) { - super(value); - } - - public ColorTemperature(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class HorizontalKeystone extends EventedValueShort { - public HorizontalKeystone(Short value) { - super(value); - } - - public HorizontalKeystone(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class VerticalKeystone extends EventedValueShort { - public VerticalKeystone(Short value) { - super(value); - } - - public VerticalKeystone(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class Mute extends EventedValueChannelMute { - public Mute(ChannelMute value) { - super(value); - } - - public Mute(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class VolumeDB extends EventedValueChannelVolumeDB { - public VolumeDB(ChannelVolumeDB value) { - super(value); - } - - public VolumeDB(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class Volume extends EventedValueChannelVolume { - public Volume(ChannelVolume value) { - super(value); - } - - public Volume(Map.Entry[] attributes) { - super(attributes); - } - } - - public static class Loudness extends EventedValueChannelLoudness { - public Loudness(ChannelLoudness value) { - super(value); - } - - public Loudness(Map.Entry[] attributes) { - super(attributes); - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/shared/AbstractMap.java b/app/src/main/java/org/fourthline/cling/support/shared/AbstractMap.java deleted file mode 100644 index d7188eb..0000000 --- a/app/src/main/java/org/fourthline/cling/support/shared/AbstractMap.java +++ /dev/null @@ -1,506 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.shared; - -import java.io.Serializable; -import java.util.*; - -/** - * A base class for {@code Map} implementations. - * - *

Subclasses that permit new mappings to be added must override {@link - * #put}. - * - *

The default implementations of many methods are inefficient for large - * maps. For example in the default implementation, each call to {@link #get} - * performs a linear iteration of the entry set. Subclasses should override such - * methods to improve their performance. - * - * @since 1.2 - */ -public abstract class AbstractMap implements Map { - - // Lazily initialized key set. - Set keySet; - - Collection valuesCollection; - - /** - * An immutable key-value mapping. Despite the name, this class is non-final - * and its subclasses may be mutable. - * - * @since 1.6 - */ - public static class SimpleImmutableEntry - implements Map.Entry, Serializable { - private static final long serialVersionUID = 7138329143949025153L; - - private final K key; - private final V value; - - public SimpleImmutableEntry(K theKey, V theValue) { - key = theKey; - value = theValue; - } - - /** - * Constructs an instance with the key and value of {@code copyFrom}. - */ - public SimpleImmutableEntry(Map.Entry copyFrom) { - key = copyFrom.getKey(); - value = copyFrom.getValue(); - } - - public K getKey() { - return key; - } - - public V getValue() { - return value; - } - - /** - * This base implementation throws {@code UnsupportedOperationException} - * always. - */ - public V setValue(V object) { - throw new UnsupportedOperationException(); - } - - @Override public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object instanceof Map.Entry) { - Map.Entry entry = (Map.Entry) object; - return (key == null ? entry.getKey() == null : key.equals(entry - .getKey())) - && (value == null ? entry.getValue() == null : value - .equals(entry.getValue())); - } - return false; - } - - @Override public int hashCode() { - return (key == null ? 0 : key.hashCode()) - ^ (value == null ? 0 : value.hashCode()); - } - - @Override public String toString() { - return key + "=" + value; - } - } - - /** - * A key-value mapping with mutable values. - * - * @since 1.6 - */ - public static class SimpleEntry - implements Map.Entry, Serializable { - private static final long serialVersionUID = -8499721149061103585L; - - private final K key; - private V value; - - public SimpleEntry(K theKey, V theValue) { - key = theKey; - value = theValue; - } - - /** - * Constructs an instance with the key and value of {@code copyFrom}. - */ - public SimpleEntry(Map.Entry copyFrom) { - key = copyFrom.getKey(); - value = copyFrom.getValue(); - } - - public K getKey() { - return key; - } - - public V getValue() { - return value; - } - - public V setValue(V object) { - V result = value; - value = object; - return result; - } - - @Override public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object instanceof Map.Entry) { - Map.Entry entry = (Map.Entry) object; - return (key == null ? entry.getKey() == null : key.equals(entry - .getKey())) - && (value == null ? entry.getValue() == null : value - .equals(entry.getValue())); - } - return false; - } - - @Override public int hashCode() { - return (key == null ? 0 : key.hashCode()) - ^ (value == null ? 0 : value.hashCode()); - } - - @Override public String toString() { - return key + "=" + value; - } - } - - protected AbstractMap() { - super(); - } - - /** - * {@inheritDoc} - * - *

This implementation calls {@code entrySet().clear()}. - */ - public void clear() { - entrySet().clear(); - } - - /** - * {@inheritDoc} - * - *

This implementation iterates its key set, looking for a key that - * {@code key} equals. - */ - public boolean containsKey(Object key) { - Iterator> it = entrySet().iterator(); - if (key != null) { - while (it.hasNext()) { - if (key.equals(it.next().getKey())) { - return true; - } - } - } else { - while (it.hasNext()) { - if (it.next().getKey() == null) { - return true; - } - } - } - return false; - } - - /** - * {@inheritDoc} - * - *

This implementation iterates its entry set, looking for an entry with - * a value that {@code value} equals. - */ - public boolean containsValue(Object value) { - Iterator> it = entrySet().iterator(); - if (value != null) { - while (it.hasNext()) { - if (value.equals(it.next().getValue())) { - return true; - } - } - } else { - while (it.hasNext()) { - if (it.next().getValue() == null) { - return true; - } - } - } - return false; - } - - public abstract Set> entrySet(); - - /** - * {@inheritDoc} - * - *

This implementation first checks the structure of {@code object}. If - * it is not a map or of a different size, this returns false. Otherwise it - * iterates its own entry set, looking up each entry's key in {@code - * object}. If any value does not equal the other map's value for the same - * key, this returns false. Otherwise it returns true. - */ - @Override public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object instanceof Map) { - Map map = (Map) object; - if (size() != map.size()) { - return false; - } - - try { - for (Entry entry : entrySet()) { - K key = entry.getKey(); - V mine = entry.getValue(); - Object theirs = map.get(key); - if (mine == null) { - if (theirs != null || !map.containsKey(key)) { - return false; - } - } else if (!mine.equals(theirs)) { - return false; - } - } - } catch (NullPointerException ignored) { - return false; - } catch (ClassCastException ignored) { - return false; - } - return true; - } - return false; - } - - /** - * {@inheritDoc} - * - *

This implementation iterates its entry set, looking for an entry with - * a key that {@code key} equals. - */ - public V get(Object key) { - Iterator> it = entrySet().iterator(); - if (key != null) { - while (it.hasNext()) { - Map.Entry entry = it.next(); - if (key.equals(entry.getKey())) { - return entry.getValue(); - } - } - } else { - while (it.hasNext()) { - Map.Entry entry = it.next(); - if (entry.getKey() == null) { - return entry.getValue(); - } - } - } - return null; - } - - /** - * {@inheritDoc} - * - *

This implementation iterates its entry set, summing the hashcodes of - * its entries. - */ - @Override public int hashCode() { - int result = 0; - Iterator> it = entrySet().iterator(); - while (it.hasNext()) { - result += it.next().hashCode(); - } - return result; - } - - /** - * {@inheritDoc} - * - *

This implementation compares {@code size()} to 0. - */ - public boolean isEmpty() { - return size() == 0; - } - - /** - * {@inheritDoc} - * - *

This implementation returns a view that calls through this to map. Its - * iterator transforms this map's entry set iterator to return keys. - */ - public Set keySet() { - if (keySet == null) { - keySet = new AbstractSet() { - @Override public boolean contains(Object object) { - return containsKey(object); - } - - @Override public int size() { - return AbstractMap.this.size(); - } - - @Override public Iterator iterator() { - return new Iterator() { - Iterator> setIterator = entrySet().iterator(); - - public boolean hasNext() { - return setIterator.hasNext(); - } - - public K next() { - return setIterator.next().getKey(); - } - - public void remove() { - setIterator.remove(); - } - }; - } - }; - } - return keySet; - } - - /** - * {@inheritDoc} - * - *

This base implementation throws {@code UnsupportedOperationException}. - */ - public V put(K key, V value) { - throw new UnsupportedOperationException(); - } - - /** - * {@inheritDoc} - * - *

This implementation iterates through {@code map}'s entry set, calling - * {@code put()} for each. - */ - public void putAll(Map map) { - for (Map.Entry entry : map.entrySet()) { - put(entry.getKey(), entry.getValue()); - } - } - - /** - * {@inheritDoc} - * - *

This implementation iterates its entry set, removing the entry with - * a key that {@code key} equals. - */ - public V remove(Object key) { - Iterator> it = entrySet().iterator(); - if (key != null) { - while (it.hasNext()) { - Map.Entry entry = it.next(); - if (key.equals(entry.getKey())) { - it.remove(); - return entry.getValue(); - } - } - } else { - while (it.hasNext()) { - Map.Entry entry = it.next(); - if (entry.getKey() == null) { - it.remove(); - return entry.getValue(); - } - } - } - return null; - } - - /** - * {@inheritDoc} - * - *

This implementation returns its entry set's size. - */ - public int size() { - return entrySet().size(); - } - - /** - * {@inheritDoc} - * - *

This implementation composes a string by iterating its entry set. If - * this map contains itself as a key or a value, the string "(this Map)" - * will appear in its place. - */ - @Override public String toString() { - if (isEmpty()) { - return "{}"; - } - - StringBuilder buffer = new StringBuilder(size() * 28); - buffer.append('{'); - Iterator> it = entrySet().iterator(); - while (it.hasNext()) { - Map.Entry entry = it.next(); - Object key = entry.getKey(); - if (key != this) { - buffer.append(key); - } else { - buffer.append("(this Map)"); - } - buffer.append('='); - Object value = entry.getValue(); - if (value != this) { - buffer.append(value); - } else { - buffer.append("(this Map)"); - } - if (it.hasNext()) { - buffer.append(", "); - } - } - buffer.append('}'); - return buffer.toString(); - } - - /** - * {@inheritDoc} - * - *

This implementation returns a view that calls through this to map. Its - * iterator transforms this map's entry set iterator to return values. - */ - public Collection values() { - if (valuesCollection == null) { - valuesCollection = new AbstractCollection() { - @Override public int size() { - return AbstractMap.this.size(); - } - - @Override public boolean contains(Object object) { - return containsValue(object); - } - - @Override public Iterator iterator() { - return new Iterator() { - Iterator> setIterator = entrySet().iterator(); - - public boolean hasNext() { - return setIterator.hasNext(); - } - - public V next() { - return setIterator.next().getValue(); - } - - public void remove() { - setIterator.remove(); - } - }; - } - }; - } - return valuesCollection; - } - - @SuppressWarnings("unchecked") - @Override protected Object clone() throws CloneNotSupportedException { - AbstractMap result = (AbstractMap) super.clone(); - result.keySet = null; - result.valuesCollection = null; - return result; - } -} diff --git a/app/src/main/java/org/fourthline/cling/support/xmicrosoft/AbstractMediaReceiverRegistrarService.java b/app/src/main/java/org/fourthline/cling/support/xmicrosoft/AbstractMediaReceiverRegistrarService.java deleted file mode 100644 index a635dcf..0000000 --- a/app/src/main/java/org/fourthline/cling/support/xmicrosoft/AbstractMediaReceiverRegistrarService.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.support.xmicrosoft; - -import org.fourthline.cling.binding.annotations.UpnpAction; -import org.fourthline.cling.binding.annotations.UpnpInputArgument; -import org.fourthline.cling.binding.annotations.UpnpOutputArgument; -import org.fourthline.cling.binding.annotations.UpnpService; -import org.fourthline.cling.binding.annotations.UpnpServiceId; -import org.fourthline.cling.binding.annotations.UpnpServiceType; -import org.fourthline.cling.binding.annotations.UpnpStateVariable; -import org.fourthline.cling.binding.annotations.UpnpStateVariables; -import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; - -import java.beans.PropertyChangeSupport; - -/** - * Basic implementation of service required by MSFT devices such as XBox 360. - * - * @author Mario Franco - */ -@UpnpService( - serviceId = @UpnpServiceId( - namespace = "microsoft.com", - value = "X_MS_MediaReceiverRegistrar" - ), - serviceType = @UpnpServiceType( - namespace = "microsoft.com", - value = "X_MS_MediaReceiverRegistrar", - version = 1 - ) -) -@UpnpStateVariables( - { - @UpnpStateVariable(name = "A_ARG_TYPE_DeviceID", - sendEvents = false, - datatype = "string"), - @UpnpStateVariable(name = "A_ARG_TYPE_Result", - sendEvents = false, - datatype = "int"), - @UpnpStateVariable(name = "A_ARG_TYPE_RegistrationReqMsg", - sendEvents = false, - datatype = "bin.base64"), - @UpnpStateVariable(name = "A_ARG_TYPE_RegistrationRespMsg", - sendEvents = false, - datatype = "bin.base64") - } -) -public abstract class AbstractMediaReceiverRegistrarService { - - final protected PropertyChangeSupport propertyChangeSupport; - - @UpnpStateVariable(eventMinimumDelta = 1) - private UnsignedIntegerFourBytes authorizationGrantedUpdateID = new UnsignedIntegerFourBytes(0); - - @UpnpStateVariable(eventMinimumDelta = 1) - private UnsignedIntegerFourBytes authorizationDeniedUpdateID = new UnsignedIntegerFourBytes(0); - - @UpnpStateVariable - private UnsignedIntegerFourBytes validationSucceededUpdateID = new UnsignedIntegerFourBytes(0); - - @UpnpStateVariable - private UnsignedIntegerFourBytes validationRevokedUpdateID = new UnsignedIntegerFourBytes(0); - - protected AbstractMediaReceiverRegistrarService() { - this(null); - } - - protected AbstractMediaReceiverRegistrarService(PropertyChangeSupport propertyChangeSupport) { - this.propertyChangeSupport = propertyChangeSupport != null ? propertyChangeSupport : new PropertyChangeSupport(this); - } - - public PropertyChangeSupport getPropertyChangeSupport() { - return propertyChangeSupport; - } - - - @UpnpAction(out = @UpnpOutputArgument(name = "AuthorizationGrantedUpdateID")) - public UnsignedIntegerFourBytes getAuthorizationGrantedUpdateID() { - return authorizationGrantedUpdateID; - } - - @UpnpAction(out = @UpnpOutputArgument(name = "AuthorizationDeniedUpdateID")) - public UnsignedIntegerFourBytes getAuthorizationDeniedUpdateID() { - return authorizationDeniedUpdateID; - } - - @UpnpAction(out = @UpnpOutputArgument(name = "ValidationSucceededUpdateID")) - public UnsignedIntegerFourBytes getValidationSucceededUpdateID() { - return validationSucceededUpdateID; - } - - @UpnpAction(out = @UpnpOutputArgument(name = "ValidationRevokedUpdateID")) - public UnsignedIntegerFourBytes getValidationRevokedUpdateID() { - return validationRevokedUpdateID; - } - - @UpnpAction(out = { - @UpnpOutputArgument(name = "Result", - stateVariable = "A_ARG_TYPE_Result") - }) - public int isAuthorized(@UpnpInputArgument(name = "DeviceID", - stateVariable = "A_ARG_TYPE_DeviceID") - String deviceID) { - return 1; - } - - @UpnpAction(out = { - @UpnpOutputArgument(name = "Result", - stateVariable = "A_ARG_TYPE_Result") - }) - public int isValidated(@UpnpInputArgument(name = "DeviceID", - stateVariable = "A_ARG_TYPE_DeviceID") - String deviceID) { - return 1; - } - - @UpnpAction(out = { - @UpnpOutputArgument(name = "RegistrationRespMsg", - stateVariable = "A_ARG_TYPE_RegistrationRespMsg") - }) - public byte[] registerDevice(@UpnpInputArgument(name = "RegistrationReqMsg", - stateVariable = "A_ARG_TYPE_RegistrationReqMsg") - byte[] registrationReqMsg) { - return new byte[]{}; - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/DisableRouter.java b/app/src/main/java/org/fourthline/cling/transport/DisableRouter.java deleted file mode 100644 index e32871f..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/DisableRouter.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport; - -/** - * @author Christian Bauer - */ -public class DisableRouter { -} diff --git a/app/src/main/java/org/fourthline/cling/transport/EnableRouter.java b/app/src/main/java/org/fourthline/cling/transport/EnableRouter.java deleted file mode 100644 index e5c504f..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/EnableRouter.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport; - -/** - * @author Christian Bauer - */ -public class EnableRouter { -} diff --git a/app/src/main/java/org/fourthline/cling/transport/Router.java b/app/src/main/java/org/fourthline/cling/transport/Router.java deleted file mode 100644 index a1f02ab..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/Router.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport; - -import org.fourthline.cling.UpnpServiceConfiguration; -import org.fourthline.cling.model.NetworkAddress; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.OutgoingDatagramMessage; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.transport.spi.UpnpStream; - -import java.net.InetAddress; -import java.util.List; - -/** - * Interface of the network transport layer. - *

- * Encapsulates the transport layer and provides methods to the upper layers for - * sending UPnP stream (HTTP) {@link org.fourthline.cling.model.message.StreamRequestMessage}s, - * sending (UDP) datagram {@link org.fourthline.cling.model.message.OutgoingDatagramMessage}s, - * as well as broadcasting bytes to all LAN participants. - *

- *

- * A router also maintains listening sockets and services, for incoming UDP unicast/multicast - * {@link org.fourthline.cling.model.message.IncomingDatagramMessage} and TCP - * {@link org.fourthline.cling.transport.spi.UpnpStream}s. An implementation of this interface - * handles these messages, e.g. by selecting and executing the right protocol. - *

- *

- * An implementation must be thread-safe, and can be accessed concurrently. If the Router is - * disabled, it doesn't listen on the network for incoming messages and does not send outgoing - * messages. - *

- * - * @see org.fourthline.cling.protocol.ProtocolFactory - * - * @author Christian Bauer - */ -public interface Router { - - /** - * @return The configuration used by this router. - */ - public UpnpServiceConfiguration getConfiguration(); - - /** - * @return The protocol factory used by this router. - */ - public ProtocolFactory getProtocolFactory(); - - /** - * Starts all sockets and listening threads for datagrams and streams. - * - * @return true if the router was enabled. false if it's already running. - */ - boolean enable() throws RouterException; - - /** - * Unbinds all sockets and stops all listening threads for datagrams and streams. - * - * @return true if the router was disabled. false if it wasn't running. - */ - boolean disable() throws RouterException; - - /** - * Disables the router and releases all other resources. - */ - void shutdown() throws RouterException ; - - /** - * - * @return true if the router is currently enabled. - */ - boolean isEnabled() throws RouterException; - - /** - * Called by the {@link #enable()} method before it returns. - * - * @param ex The cause of the failure. - * @throws InitializationException if the exception was not recoverable. - */ - void handleStartFailure(InitializationException ex) throws InitializationException; - - /** - * @param preferredAddress A preferred stream server bound address or null. - * @return An empty list if no stream server is currently active, otherwise a single network - * address if the preferred address is active, or a list of all active bound - * stream servers. - */ - public List getActiveStreamServers(InetAddress preferredAddress) throws RouterException; - - /** - *

- * This method is called internally by the transport layer when a datagram, either unicast or - * multicast, has been received. An implementation of this interface has to handle the received - * message, e.g. selecting and executing a UPnP protocol. This method should not block until - * the execution completes, the calling thread should be free to handle the next reception as - * soon as possible. - *

- * @param msg The received datagram message. - */ - public void received(IncomingDatagramMessage msg); - - /** - *

- * This method is called internally by the transport layer when a TCP stream connection has - * been made and a response has to be returned to the sender. An implementation of this interface - * has to handle the received stream connection and return a response, e.g. selecting and executing - * a UPnP protocol. This method should not block until the execution completes, the calling thread - * should be free to process the next reception as soon as possible. Typically this means starting - * a new thread of execution in this method. - *

- * @param stream - */ - public void received(UpnpStream stream); - - /** - *

- * Call this method to send a UDP datagram message. - *

- * @param msg The UDP datagram message to send. - * @throws RouterException if a recoverable error, such as thread interruption, occurs. - */ - public void send(OutgoingDatagramMessage msg) throws RouterException; - - /** - *

- * Call this method to send a TCP (HTTP) stream message. - *

- * @param msg The TCP (HTTP) stream message to send. - * @return The response received from the server. - * @throws RouterException if a recoverable error, such as thread interruption, occurs. - */ - public StreamResponseMessage send(StreamRequestMessage msg) throws RouterException; - - /** - *

- * Call this method to broadcast a UDP message to all hosts on the network. - *

- * @param bytes The byte payload of the UDP datagram. - * @throws RouterException if a recoverable error, such as thread interruption, occurs. - */ - public void broadcast(byte[] bytes) throws RouterException; - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/RouterException.java b/app/src/main/java/org/fourthline/cling/transport/RouterException.java deleted file mode 100644 index 99065c2..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/RouterException.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.transport; - -/** - * Thrown by the {@link Router} if a non-fatal recoverable exception occurred. - *

- * This exception is thrown if the calling thread wasn't able to obtain - * exclusive read/write access on the router. - *

- *

- * This exception is also thrown when you interrupt the thread calling the - * router. In such a case, the cause of this is an InterruptedException. - *

- * - * @author Christian Bauer - */ -public class RouterException extends Exception { - - public RouterException() { - super(); - } - - public RouterException(String s) { - super(s); - } - - public RouterException(String s, Throwable throwable) { - super(s, throwable); - } - - public RouterException(Throwable throwable) { - super(throwable); - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/RouterImpl.java b/app/src/main/java/org/fourthline/cling/transport/RouterImpl.java deleted file mode 100644 index e96fbe2..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/RouterImpl.java +++ /dev/null @@ -1,525 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport; - -import org.fourthline.cling.UpnpServiceConfiguration; -import org.fourthline.cling.model.NetworkAddress; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.OutgoingDatagramMessage; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.protocol.ProtocolCreationException; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.protocol.ReceivingAsync; -import org.fourthline.cling.transport.spi.DatagramIO; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.transport.spi.MulticastReceiver; -import org.fourthline.cling.transport.spi.NetworkAddressFactory; -import org.fourthline.cling.transport.spi.NoNetworkException; -import org.fourthline.cling.transport.spi.StreamClient; -import org.fourthline.cling.transport.spi.StreamServer; -import org.fourthline.cling.transport.spi.UpnpStream; -import org.seamless.util.Exceptions; - -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Observes; -import javax.enterprise.inject.Default; -import javax.inject.Inject; -import java.net.BindException; -import java.net.DatagramPacket; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Default implementation of network message router. - *

- * Initializes and starts listening for data on the network when enabled. - *

- * - * @author Christian Bauer - */ -@ApplicationScoped -public class RouterImpl implements Router { - - private static Logger log = Logger.getLogger(Router.class.getName()); - - protected UpnpServiceConfiguration configuration; - protected ProtocolFactory protocolFactory; - - protected volatile boolean enabled; - protected ReentrantReadWriteLock routerLock = new ReentrantReadWriteLock(true); - protected Lock readLock = routerLock.readLock(); - protected Lock writeLock = routerLock.writeLock(); - - // These are created/destroyed when the router is enabled/disabled - protected NetworkAddressFactory networkAddressFactory; - protected StreamClient streamClient; - protected final Map multicastReceivers = new HashMap(); - protected final Map datagramIOs = new HashMap(); - protected final Map streamServers = new HashMap(); - - protected RouterImpl() { - } - - /** - * @param configuration The configuration used by this router. - * @param protocolFactory The protocol factory used by this router. - */ - @Inject - public RouterImpl(UpnpServiceConfiguration configuration, ProtocolFactory protocolFactory) { - log.info("Creating Router: " + getClass().getName()); - this.configuration = configuration; - this.protocolFactory = protocolFactory; - } - - public boolean enable(@Observes @Default EnableRouter event) throws RouterException { - return enable(); - } - - public boolean disable(@Observes @Default DisableRouter event) throws RouterException { - return disable(); - } - - public UpnpServiceConfiguration getConfiguration() { - return configuration; - } - - public ProtocolFactory getProtocolFactory() { - return protocolFactory; - } - - /** - * Initializes listening services: First an instance of {@link org.fourthline.cling.transport.spi.MulticastReceiver} - * is bound to each network interface. Then an instance of {@link org.fourthline.cling.transport.spi.DatagramIO} and - * {@link org.fourthline.cling.transport.spi.StreamServer} is bound to each bind address returned by the network - * address factory, respectively. There is only one instance of - * {@link org.fourthline.cling.transport.spi.StreamClient} created and managed by this router. - */ - @Override - public boolean enable() throws RouterException { - lock(writeLock); - try { - if (!enabled) { - try { - log.fine("Starting networking services..."); - networkAddressFactory = getConfiguration().createNetworkAddressFactory(); - - startInterfaceBasedTransports(networkAddressFactory.getNetworkInterfaces()); - startAddressBasedTransports(networkAddressFactory.getBindAddresses()); - - // The transports possibly removed some unusable network interfaces/addresses - if (!networkAddressFactory.hasUsableNetwork()) { - throw new NoNetworkException( - "No usable network interface and/or addresses available, check the log for errors." - ); - } - - // Start the HTTP client last, we don't even have to try if there is no network - streamClient = getConfiguration().createStreamClient(); - - enabled = true; - return true; - } catch (InitializationException ex) { - handleStartFailure(ex); - } - } - return false; - } finally { - unlock(writeLock); - } - } - - @Override - public boolean disable() throws RouterException { - lock(writeLock); - try { - if (enabled) { - log.fine("Disabling network services..."); - - if (streamClient != null) { - log.fine("Stopping stream client connection management/pool"); - streamClient.stop(); - streamClient = null; - } - - for (Map.Entry entry : streamServers.entrySet()) { - log.fine("Stopping stream server on address: " + entry.getKey()); - entry.getValue().stop(); - } - streamServers.clear(); - - for (Map.Entry entry : multicastReceivers.entrySet()) { - log.fine("Stopping multicast receiver on interface: " + entry.getKey().getDisplayName()); - entry.getValue().stop(); - } - multicastReceivers.clear(); - - for (Map.Entry entry : datagramIOs.entrySet()) { - log.fine("Stopping datagram I/O on address: " + entry.getKey()); - entry.getValue().stop(); - } - datagramIOs.clear(); - - networkAddressFactory = null; - enabled = false; - return true; - } - return false; - } finally { - unlock(writeLock); - } - } - - @Override - public void shutdown() throws RouterException { - disable(); - } - - @Override - public boolean isEnabled() { - return enabled; - } - - @Override - public void handleStartFailure(InitializationException ex) throws InitializationException { - if (ex instanceof NoNetworkException) { - log.info("Unable to initialize network router, no network found."); - } else { - log.severe("Unable to initialize network router: " + ex); - log.severe("Cause: " + Exceptions.unwrap(ex)); - } - } - - public List getActiveStreamServers(InetAddress preferredAddress) throws RouterException { - lock(readLock); - try { - if (enabled && streamServers.size() > 0) { - List streamServerAddresses = new ArrayList(); - - StreamServer preferredServer; - if (preferredAddress != null && - (preferredServer = streamServers.get(preferredAddress)) != null) { - streamServerAddresses.add( - new NetworkAddress( - preferredAddress, - preferredServer.getPort(), - networkAddressFactory.getHardwareAddress(preferredAddress) - - ) - ); - return streamServerAddresses; - } - - for (Map.Entry entry : streamServers.entrySet()) { - byte[] hardwareAddress = networkAddressFactory.getHardwareAddress(entry.getKey()); - streamServerAddresses.add( - new NetworkAddress(entry.getKey(), entry.getValue().getPort(), hardwareAddress) - ); - } - return streamServerAddresses; - } else { - return Collections.EMPTY_LIST; - } - } finally { - unlock(readLock); - } - } - - /** - * Obtains the asynchronous protocol {@code Executor} and runs the protocol created - * by the {@link org.fourthline.cling.protocol.ProtocolFactory} for the given message. - *

- * If the factory doesn't create a protocol, the message is dropped immediately without - * creating another thread or consuming further resources. This means we can filter the - * datagrams in the protocol factory and e.g. completely disable discovery or only - * allow notification message from some known services we'd like to work with. - *

- * - * @param msg The received datagram message. - */ - public void received(IncomingDatagramMessage msg) { - if (!enabled) { - log.fine("Router disabled, ignoring incoming message: " + msg); - return; - } - try { - ReceivingAsync protocol = getProtocolFactory().createReceivingAsync(msg); - if (protocol == null) { - if (log.isLoggable(Level.FINEST)) - log.finest("No protocol, ignoring received message: " + msg); - return; - } - if (log.isLoggable(Level.FINE)) - log.fine("Received asynchronous message: " + msg); - getConfiguration().getAsyncProtocolExecutor().execute(protocol); - } catch (ProtocolCreationException ex) { - log.warning("Handling received datagram failed - " + Exceptions.unwrap(ex).toString()); - } - } - - /** - * Obtains the synchronous protocol {@code Executor} and runs the - * {@link org.fourthline.cling.transport.spi.UpnpStream} directly. - * - * @param stream The received {@link org.fourthline.cling.transport.spi.UpnpStream}. - */ - public void received(UpnpStream stream) { - if (!enabled) { - log.fine("Router disabled, ignoring incoming: " + stream); - return; - } - log.fine("Received synchronous stream: " + stream); - getConfiguration().getSyncProtocolExecutorService().execute(stream); - } - - /** - * Sends the UDP datagram on all bound {@link org.fourthline.cling.transport.spi.DatagramIO}s. - * - * @param msg The UDP datagram message to send. - */ - public void send(OutgoingDatagramMessage msg) throws RouterException { - lock(readLock); - try { - if (enabled) { - for (DatagramIO datagramIO : datagramIOs.values()) { - datagramIO.send(msg); - } - } else { - log.fine("Router disabled, not sending datagram: " + msg); - } - } finally { - unlock(readLock); - } - } - - /** - * Sends the TCP stream request with the {@link org.fourthline.cling.transport.spi.StreamClient}. - * - * @param msg The TCP (HTTP) stream message to send. - * @return The return value of the {@link org.fourthline.cling.transport.spi.StreamClient#sendRequest(StreamRequestMessage)} - * method or null if no StreamClient is available. - */ - public StreamResponseMessage send(StreamRequestMessage msg) throws RouterException { - lock(readLock); - try { - if (enabled) { - if (streamClient == null) { - log.fine("No StreamClient available, not sending: " + msg); - return null; - } - log.fine("Sending via TCP unicast stream: " + msg); - try { - return streamClient.sendRequest(msg); - } catch (InterruptedException ex) { - throw new RouterException("Sending stream request was interrupted", ex); - } - } else { - log.fine("Router disabled, not sending stream request: " + msg); - return null; - } - } finally { - unlock(readLock); - } - } - - /** - * Sends the given bytes as a broadcast on all bound {@link org.fourthline.cling.transport.spi.DatagramIO}s, - * using source port 9. - *

- * TODO: Support source port parameter - *

- * - * @param bytes The byte payload of the UDP datagram. - */ - public void broadcast(byte[] bytes) throws RouterException { - lock(readLock); - try { - if (enabled) { - for (Map.Entry entry : datagramIOs.entrySet()) { - InetAddress broadcast = networkAddressFactory.getBroadcastAddress(entry.getKey()); - if (broadcast != null) { - log.fine("Sending UDP datagram to broadcast address: " + broadcast.getHostAddress()); - DatagramPacket packet = new DatagramPacket(bytes, bytes.length, broadcast, 9); - entry.getValue().send(packet); - } - } - } else { - log.fine("Router disabled, not broadcasting bytes: " + bytes.length); - } - } finally { - unlock(readLock); - } - } - - protected void startInterfaceBasedTransports(Iterator interfaces) throws InitializationException { - while (interfaces.hasNext()) { - NetworkInterface networkInterface = interfaces.next(); - - // We only have the MulticastReceiver as an interface-based transport - MulticastReceiver multicastReceiver = getConfiguration().createMulticastReceiver(networkAddressFactory); - if (multicastReceiver == null) { - log.info("Configuration did not create a MulticastReceiver for: " + networkInterface); - } else { - try { - if (log.isLoggable(Level.FINE)) - log.fine("Init multicast receiver on interface: " + networkInterface.getDisplayName()); - multicastReceiver.init( - networkInterface, - this, - networkAddressFactory, - getConfiguration().getDatagramProcessor() - ); - - multicastReceivers.put(networkInterface, multicastReceiver); - } catch (InitializationException ex) { - /* TODO: What are some recoverable exceptions for this? - log.warning( - "Ignoring network interface '" - + networkInterface.getDisplayName() - + "' init failure of MulticastReceiver: " + ex.toString()); - if (log.isLoggable(Level.FINE)) - log.log(Level.FINE, "Initialization exception root cause", Exceptions.unwrap(ex)); - log.warning("Removing unusable interface " + interface); - it.remove(); - continue; // Don't need to try anything else on this interface - */ - throw ex; - } - } - } - - for (Map.Entry entry : multicastReceivers.entrySet()) { - if (log.isLoggable(Level.FINE)) - log.fine("Starting multicast receiver on interface: " + entry.getKey().getDisplayName()); - getConfiguration().getMulticastReceiverExecutor().execute(entry.getValue()); - } - } - - protected void startAddressBasedTransports(Iterator addresses) throws InitializationException { - while (addresses.hasNext()) { - InetAddress address = addresses.next(); - - // HTTP servers - StreamServer streamServer = getConfiguration().createStreamServer(networkAddressFactory); - if (streamServer == null) { - log.info("Configuration did not create a StreamServer for: " + address); - } else { - try { - if (log.isLoggable(Level.FINE)) - log.fine("Init stream server on address: " + address); - streamServer.init(address, this); - streamServers.put(address, streamServer); - } catch (InitializationException ex) { - // Try to recover - Throwable cause = Exceptions.unwrap(ex); - if (cause instanceof BindException) { - log.warning("Failed to init StreamServer: " + cause); - if (log.isLoggable(Level.FINE)) - log.log(Level.FINE, "Initialization exception root cause", cause); - log.warning("Removing unusable address: " + address); - addresses.remove(); - continue; // Don't try anything else with this address - } - throw ex; - } - } - - // Datagram I/O - DatagramIO datagramIO = getConfiguration().createDatagramIO(networkAddressFactory); - if (datagramIO == null) { - log.info("Configuration did not create a StreamServer for: " + address); - } else { - try { - if (log.isLoggable(Level.FINE)) - log.fine("Init datagram I/O on address: " + address); - datagramIO.init(address, this, getConfiguration().getDatagramProcessor()); - datagramIOs.put(address, datagramIO); - } catch (InitializationException ex) { - /* TODO: What are some recoverable exceptions for this? - Throwable cause = Exceptions.unwrap(ex); - if (cause instanceof BindException) { - log.warning("Failed to init datagram I/O: " + cause); - if (log.isLoggable(Level.FINE)) - log.log(Level.FINE, "Initialization exception root cause", cause); - log.warning("Removing unusable address: " + address); - addresses.remove(); - continue; // Don't try anything else with this address - } - */ - throw ex; - } - } - } - - for (Map.Entry entry : streamServers.entrySet()) { - if (log.isLoggable(Level.FINE)) - log.fine("Starting stream server on address: " + entry.getKey()); - getConfiguration().getStreamServerExecutorService().execute(entry.getValue()); - } - - for (Map.Entry entry : datagramIOs.entrySet()) { - if (log.isLoggable(Level.FINE)) - log.fine("Starting datagram I/O on address: " + entry.getKey()); - getConfiguration().getDatagramIOExecutor().execute(entry.getValue()); - } - } - - protected void lock(Lock lock, int timeoutMilliseconds) throws RouterException { - try { - log.finest("Trying to obtain lock with timeout milliseconds '" + timeoutMilliseconds + "': " + lock.getClass().getSimpleName()); - if (lock.tryLock(timeoutMilliseconds, TimeUnit.MILLISECONDS)) { - log.finest("Acquired router lock: " + lock.getClass().getSimpleName()); - } else { - throw new RouterException( - "Router wasn't available exclusively after waiting " + timeoutMilliseconds + "ms, lock failed: " - + lock.getClass().getSimpleName() - ); - } - } catch (InterruptedException ex) { - throw new RouterException( - "Interruption while waiting for exclusive access: " + lock.getClass().getSimpleName(), ex - ); - } - } - - protected void lock(Lock lock) throws RouterException { - lock(lock, getLockTimeoutMillis()); - } - - protected void unlock(Lock lock) { - log.finest("Releasing router lock: " + lock.getClass().getSimpleName()); - lock.unlock(); - } - - /** - * @return Defaults to 6 seconds, should be longer than it takes the router to be enabled/disabled. - */ - protected int getLockTimeoutMillis() { - return 6000; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletStreamServerConfigurationImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletStreamServerConfigurationImpl.java deleted file mode 100644 index 228a400..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletStreamServerConfigurationImpl.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.transport.spi.ServletContainerAdapter; -import org.fourthline.cling.transport.spi.StreamServerConfiguration; - -/** - * Settings for the async Servlet 3.0 implementation. - *

- * If you are trying to integrate Cling with an existing/running servlet - * container, implement {@link org.fourthline.cling.transport.spi.ServletContainerAdapter}. - *

- * - * @author Christian Bauer - */ -public class AsyncServletStreamServerConfigurationImpl implements StreamServerConfiguration { - - protected ServletContainerAdapter servletContainerAdapter; - protected int listenPort = 0; - protected int asyncTimeoutSeconds = 60; - - /** - * Defaults to port '0', ephemeral. - */ - public AsyncServletStreamServerConfigurationImpl(ServletContainerAdapter servletContainerAdapter) { - this.servletContainerAdapter = servletContainerAdapter; - } - - public AsyncServletStreamServerConfigurationImpl(ServletContainerAdapter servletContainerAdapter, - int listenPort) { - this.servletContainerAdapter = servletContainerAdapter; - this.listenPort = listenPort; - } - - public AsyncServletStreamServerConfigurationImpl(ServletContainerAdapter servletContainerAdapter, - int listenPort, - int asyncTimeoutSeconds) { - this.servletContainerAdapter = servletContainerAdapter; - this.listenPort = listenPort; - this.asyncTimeoutSeconds = asyncTimeoutSeconds; - } - - /** - * @return Defaults to 0. - */ - public int getListenPort() { - return listenPort; - } - - public void setListenPort(int listenPort) { - this.listenPort = listenPort; - } - - /** - * The time in seconds this server wait for the {@link org.fourthline.cling.transport.Router} - * to execute a {@link org.fourthline.cling.transport.spi.UpnpStream}. - * - * @return The default of 60 seconds. - */ - public int getAsyncTimeoutSeconds() { - return asyncTimeoutSeconds; - } - - public void setAsyncTimeoutSeconds(int asyncTimeoutSeconds) { - this.asyncTimeoutSeconds = asyncTimeoutSeconds; - } - - public ServletContainerAdapter getServletContainerAdapter() { - return servletContainerAdapter; - } - - public void setServletContainerAdapter(ServletContainerAdapter servletContainerAdapter) { - this.servletContainerAdapter = servletContainerAdapter; - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletStreamServerImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletStreamServerImpl.java deleted file mode 100644 index a8b4ecc..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletStreamServerImpl.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.model.message.Connection; -import org.fourthline.cling.transport.Router; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.transport.spi.StreamServer; - -import javax.servlet.AsyncContext; -import javax.servlet.Servlet; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Implementation based on Servlet 3.0 API. - * - * @author Christian Bauer - */ -public class AsyncServletStreamServerImpl implements StreamServer { - - final private static Logger log = Logger.getLogger(StreamServer.class.getName()); - - final protected AsyncServletStreamServerConfigurationImpl configuration; - protected int localPort; - - public AsyncServletStreamServerImpl(AsyncServletStreamServerConfigurationImpl configuration) { - this.configuration = configuration; - } - - public AsyncServletStreamServerConfigurationImpl getConfiguration() { - return configuration; - } - - synchronized public void init(InetAddress bindAddress, final Router router) throws InitializationException { - try { - log.info("Setting executor service on servlet container adapter"); - getConfiguration().getServletContainerAdapter().setExecutorService( - router.getConfiguration().getStreamServerExecutorService() - ); - - log.info("Adding connector: " + bindAddress + ":" + getConfiguration().getListenPort()); - localPort = getConfiguration().getServletContainerAdapter().addConnector( - bindAddress.getHostAddress(), - getConfiguration().getListenPort() - ); - - String contextPath = router.getConfiguration().getNamespace().getBasePath().getPath(); - getConfiguration().getServletContainerAdapter().registerServlet(contextPath, createServlet(router)); - - } catch (Exception ex) { - throw new InitializationException("Could not initialize " + getClass().getSimpleName() + ": " + ex.toString(), ex); - } - } - - synchronized public int getPort() { - return this.localPort; - } - - synchronized public void stop() { - getConfiguration().getServletContainerAdapter().stopIfRunning(); - } - - public void run() { - getConfiguration().getServletContainerAdapter().startIfNotRunning(); - } - - protected Servlet createServlet(final Router router) { - return new HttpServlet() { - @Override - protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - if (log.isLoggable(Level.FINE)) - log.fine( - "Handling Servlet request asynchronously: " + req - ); - - AsyncContext async = req.startAsync(); - async.setTimeout(getConfiguration().getAsyncTimeoutSeconds()*1000); - - AsyncServletUpnpStream stream = - new AsyncServletUpnpStream(router.getProtocolFactory(), async, req) { - @Override - protected Connection createConnection() { - return new AsyncServletConnection(getRequest()); - } - }; - - router.received(stream); - } - }; - } - - /** - * Override this method if you can check, at a low level, if the client connection is still open - * for the given request. This will likely require access to proprietary APIs of your servlet - * container to obtain the socket/channel for the given request. - * - * @return By default true. - */ - protected boolean isConnectionOpen(HttpServletRequest request) { - return true; - } - - protected class AsyncServletConnection implements Connection { - - protected HttpServletRequest request; - - public AsyncServletConnection(HttpServletRequest request) { - this.request = request; - } - - public HttpServletRequest getRequest() { - return request; - } - - @Override - public boolean isOpen() { - return AsyncServletStreamServerImpl.this.isConnectionOpen(getRequest()); - } - - @Override - public InetAddress getRemoteAddress() { - try { - return InetAddress.getByName(getRequest().getRemoteAddr()); - } catch (UnknownHostException ex) { - throw new RuntimeException(ex); - } - } - - @Override - public InetAddress getLocalAddress() { - try { - return InetAddress.getByName(getRequest().getLocalAddr()); - } catch (UnknownHostException ex) { - throw new RuntimeException(ex); - } - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletUpnpStream.java b/app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletUpnpStream.java deleted file mode 100644 index e7d9de0..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/AsyncServletUpnpStream.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.model.message.Connection; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.UpnpMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.transport.spi.UpnpStream; -import org.seamless.util.Exceptions; -import org.seamless.util.io.IO; - -import javax.servlet.AsyncContext; -import javax.servlet.AsyncEvent; -import javax.servlet.AsyncListener; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URI; -import java.util.Enumeration; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Implementation based on Servlet 3.0 API. - *

- * Concrete implementations must provide a connection wrapper, as this wrapper most likely has - * to access proprietary APIs to implement connection checking. - *

- * - * @author Christian Bauer - */ -public abstract class AsyncServletUpnpStream extends UpnpStream implements AsyncListener { - - final private static Logger log = Logger.getLogger(UpnpStream.class.getName()); - - final protected AsyncContext asyncContext; - final protected HttpServletRequest request; - - protected StreamResponseMessage responseMessage; - - public AsyncServletUpnpStream(ProtocolFactory protocolFactory, - AsyncContext asyncContext, - HttpServletRequest request) { - super(protocolFactory); - this.asyncContext = asyncContext; - this.request = request; - asyncContext.addListener(this); - } - - protected HttpServletRequest getRequest() { - return request; - } - - protected HttpServletResponse getResponse() { - ServletResponse response; - if ((response = asyncContext.getResponse()) == null) { - throw new IllegalStateException( - "Couldn't get response from asynchronous context, already timed out" - ); - } - return (HttpServletResponse) response; - } - - protected void complete() { - try { - asyncContext.complete(); - } catch (IllegalStateException ex) { - // If Jetty's connection, for whatever reason, is in an illegal state, this will be thrown - // and we can "probably" ignore it. The request is complete, no matter how it ended. - log.info("Error calling servlet container's AsyncContext#complete() method: " + ex); - } - } - - @Override - public void run() { - try { - StreamRequestMessage requestMessage = readRequestMessage(); - if (log.isLoggable(Level.FINER)) - log.finer("Processing new request message: " + requestMessage); - - responseMessage = process(requestMessage); - - if (responseMessage != null) { - if (log.isLoggable(Level.FINER)) - log.finer("Preparing HTTP response message: " + responseMessage); - writeResponseMessage(responseMessage); - } else { - // If it's null, it's 404 - if (log.isLoggable(Level.FINER)) - log.finer("Sending HTTP response status: " + HttpURLConnection.HTTP_NOT_FOUND); - getResponse().setStatus(HttpServletResponse.SC_NOT_FOUND); - } - - } catch (Throwable t) { - log.info("Exception occurred during UPnP stream processing: " + t); - if (log.isLoggable(Level.FINER)) { - log.log(Level.FINER, "Cause: " + Exceptions.unwrap(t), Exceptions.unwrap(t)); - } - if (!getResponse().isCommitted()) { - log.finer("Response hasn't been committed, returning INTERNAL SERVER ERROR to client"); - getResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - } else { - log.info("Could not return INTERNAL SERVER ERROR to client, response was already committed"); - } - responseException(t); - } finally { - complete(); - } - } - - @Override - public void onStartAsync(AsyncEvent event) throws IOException { - // This is a completely useless callback, it will only be called on request.startAsync() which - // then immediately removes the listener... what were they thinking. - } - - @Override - public void onComplete(AsyncEvent event) throws IOException { - if (log.isLoggable(Level.FINER)) - log.finer("Completed asynchronous processing of HTTP request: " + event.getSuppliedRequest()); - responseSent(responseMessage); - } - - @Override - public void onTimeout(AsyncEvent event) throws IOException { - if (log.isLoggable(Level.FINER)) - log.finer("Asynchronous processing of HTTP request timed out: " + event.getSuppliedRequest()); - responseException(new Exception("Asynchronous request timed out")); - } - - @Override - public void onError(AsyncEvent event) throws IOException { - if (log.isLoggable(Level.FINER)) - log.finer("Asynchronous processing of HTTP request error: " + event.getThrowable()); - responseException(event.getThrowable()); - } - - protected StreamRequestMessage readRequestMessage() throws IOException { - // Extract what we need from the HTTP httpRequest - String requestMethod = getRequest().getMethod(); - String requestURI = getRequest().getRequestURI(); - - if (log.isLoggable(Level.FINER)) - log.finer("Processing HTTP request: " + requestMethod + " " + requestURI); - - StreamRequestMessage requestMessage; - try { - requestMessage = - new StreamRequestMessage( - UpnpRequest.Method.getByHttpName(requestMethod), - URI.create(requestURI) - ); - } catch (IllegalArgumentException ex) { - throw new RuntimeException("Invalid request URI: " + requestURI, ex); - } - - if (requestMessage.getOperation().getMethod().equals(UpnpRequest.Method.UNKNOWN)) { - throw new RuntimeException("Method not supported: " + requestMethod); - } - - // Connection wrapper - requestMessage.setConnection(createConnection()); - - // Headers - UpnpHeaders headers = new UpnpHeaders(); - Enumeration headerNames = getRequest().getHeaderNames(); - while (headerNames.hasMoreElements()) { - String headerName = headerNames.nextElement(); - Enumeration headerValues = getRequest().getHeaders(headerName); - while (headerValues.hasMoreElements()) { - String headerValue = headerValues.nextElement(); - headers.add(headerName, headerValue); - } - } - requestMessage.setHeaders(headers); - - // Body - byte[] bodyBytes; - InputStream is = null; - try { - is = getRequest().getInputStream(); - bodyBytes = IO.readBytes(is); - } finally { - if (is != null) - is.close(); - } - if (log.isLoggable(Level.FINER)) - log.finer("Reading request body bytes: " + bodyBytes.length); - - if (bodyBytes.length > 0 && requestMessage.isContentTypeMissingOrText()) { - - if (log.isLoggable(Level.FINER)) - log.finer("Request contains textual entity body, converting then setting string on message"); - requestMessage.setBodyCharacters(bodyBytes); - - } else if (bodyBytes.length > 0) { - - if (log.isLoggable(Level.FINER)) - log.finer("Request contains binary entity body, setting bytes on message"); - requestMessage.setBody(UpnpMessage.BodyType.BYTES, bodyBytes); - - } else { - if (log.isLoggable(Level.FINER)) - log.finer("Request did not contain entity body"); - } - - return requestMessage; - } - - protected void writeResponseMessage(StreamResponseMessage responseMessage) throws IOException { - if (log.isLoggable(Level.FINER)) - log.finer("Sending HTTP response status: " + responseMessage.getOperation().getStatusCode()); - - getResponse().setStatus(responseMessage.getOperation().getStatusCode()); - - // Headers - for (Map.Entry> entry : responseMessage.getHeaders().entrySet()) { - for (String value : entry.getValue()) { - getResponse().addHeader(entry.getKey(), value); - } - } - // The Date header is recommended in UDA - getResponse().setDateHeader("Date", System.currentTimeMillis()); - - // Body - byte[] responseBodyBytes = responseMessage.hasBody() ? responseMessage.getBodyBytes() : null; - int contentLength = responseBodyBytes != null ? responseBodyBytes.length : -1; - - if (contentLength > 0) { - getResponse().setContentLength(contentLength); - log.finer("Response message has body, writing bytes to stream..."); - IO.writeBytes(getResponse().getOutputStream(), responseBodyBytes); - } - } - - abstract protected Connection createConnection(); - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/DatagramIOConfigurationImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/DatagramIOConfigurationImpl.java deleted file mode 100644 index cfb10d2..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/DatagramIOConfigurationImpl.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.transport.spi.DatagramIOConfiguration; - -/** - * Settings for the default implementation. - * - * @author Christian Bauer - */ -public class DatagramIOConfigurationImpl implements DatagramIOConfiguration { - - private int timeToLive = 4; - private int maxDatagramBytes = 640; - - /** - * Defaults to TTL of '4' and maximum datagram size of 640 bytes (512 per UDA 1.0, 128 byte header). - */ - public DatagramIOConfigurationImpl() { - } - - public DatagramIOConfigurationImpl(int timeToLive, int maxDatagramBytes) { - this.timeToLive = timeToLive; - this.maxDatagramBytes = maxDatagramBytes; - } - - public int getTimeToLive() { - return timeToLive; - } - - public void setTimeToLive(int timeToLive) { - this.timeToLive = timeToLive; - } - - public int getMaxDatagramBytes() { - return maxDatagramBytes; - } - - public void setMaxDatagramBytes(int maxDatagramBytes) { - this.maxDatagramBytes = maxDatagramBytes; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/DatagramIOImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/DatagramIOImpl.java deleted file mode 100644 index 6892d2b..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/DatagramIOImpl.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.model.message.OutgoingDatagramMessage; -import org.fourthline.cling.transport.Router; -import org.fourthline.cling.transport.spi.DatagramIO; -import org.fourthline.cling.transport.spi.DatagramProcessor; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.model.UnsupportedDataException; - -import java.net.DatagramPacket; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.MulticastSocket; -import java.net.SocketException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Default implementation based on a single shared (receive/send) UDP MulticastSocket. - *

- * Although we do not receive multicast datagrams with this service, sending multicast - * datagrams with a configuration time-to-live requires a MulticastSocket. - *

- *

- * Thread-safety is guaranteed through synchronization of methods of this service and - * by the thread-safe underlying socket. - *

- * @author Christian Bauer - */ -public class DatagramIOImpl implements DatagramIO { - - private static Logger log = Logger.getLogger(DatagramIO.class.getName()); - - /* Implementation notes for unicast/multicast UDP: - - http://forums.sun.com/thread.jspa?threadID=771852 - http://mail.openjdk.java.net/pipermail/net-dev/2008-December/000497.html - https://jira.jboss.org/jira/browse/JGRP-978 - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4701650 - - */ - - final protected DatagramIOConfigurationImpl configuration; - - protected Router router; - protected DatagramProcessor datagramProcessor; - - protected InetSocketAddress localAddress; - protected MulticastSocket socket; // For sending unicast & multicast, and reveiving unicast - - public DatagramIOImpl(DatagramIOConfigurationImpl configuration) { - this.configuration = configuration; - } - - public DatagramIOConfigurationImpl getConfiguration() { - return configuration; - } - - synchronized public void init(InetAddress bindAddress, Router router, DatagramProcessor datagramProcessor) throws InitializationException { - - this.router = router; - this.datagramProcessor = datagramProcessor; - - try { - - // TODO: UPNP VIOLATION: The spec does not prohibit using the 1900 port here again, however, the - // Netgear ReadyNAS miniDLNA implementation will no longer answer if it has to send search response - // back via UDP unicast to port 1900... so we use an ephemeral port - log.info("Creating bound socket (for datagram input/output) on: " + bindAddress); - localAddress = new InetSocketAddress(bindAddress, 0); - socket = new MulticastSocket(localAddress); - socket.setTimeToLive(configuration.getTimeToLive()); - socket.setReceiveBufferSize(262144); // Keep a backlog of incoming datagrams if we are not fast enough - } catch (Exception ex) { - throw new InitializationException("Could not initialize " + getClass().getSimpleName() + ": " + ex); - } - } - - synchronized public void stop() { - if (socket != null && !socket.isClosed()) { - socket.close(); - } - } - - public void run() { - log.fine("Entering blocking receiving loop, listening for UDP datagrams on: " + socket.getLocalAddress()); - - while (true) { - - try { - byte[] buf = new byte[getConfiguration().getMaxDatagramBytes()]; - DatagramPacket datagram = new DatagramPacket(buf, buf.length); - - socket.receive(datagram); - - log.fine( - "UDP datagram received from: " - + datagram.getAddress().getHostAddress() - + ":" + datagram.getPort() - + " on: " + localAddress - ); - - - router.received(datagramProcessor.read(localAddress.getAddress(), datagram)); - - } catch (SocketException ex) { - log.fine("Socket closed"); - break; - } catch (UnsupportedDataException ex) { - log.info("Could not read datagram: " + ex.getMessage()); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - try { - if (!socket.isClosed()) { - log.fine("Closing unicast socket"); - socket.close(); - } - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - synchronized public void send(OutgoingDatagramMessage message) { - log.fine("Sending message from address: " + localAddress); - DatagramPacket packet = datagramProcessor.write(message); - log.fine("Sending UDP datagram packet to: " + message.getDestinationAddress() + ":" + message.getDestinationPort()); - send(packet); - } - - synchronized public void send(DatagramPacket datagram) { - log.fine("Sending message from address: " + localAddress); - - try { - socket.send(datagram); - } catch (SocketException ex) { - log.fine("Socket closed, aborting datagram send to: " + datagram.getAddress()); - } catch (RuntimeException ex) { - throw ex; - } catch (Exception ex) { - log.log(Level.SEVERE, "Exception sending datagram to: " + datagram.getAddress() + ": " + ex, ex); - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/DatagramProcessorImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/DatagramProcessorImpl.java deleted file mode 100644 index 62f6ab5..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/DatagramProcessorImpl.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import java.util.logging.Logger; -import java.util.logging.Level; - -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.OutgoingDatagramMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.UpnpOperation; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.transport.spi.DatagramProcessor; -import org.fourthline.cling.model.UnsupportedDataException; -import org.seamless.http.Headers; - -import java.io.ByteArrayInputStream; -import java.io.UnsupportedEncodingException; -import java.net.DatagramPacket; -import java.net.InetAddress; -import java.util.Locale; - -/** - * Default implementation. - * - * @author Christian Bauer - */ -public class DatagramProcessorImpl implements DatagramProcessor { - - private static Logger log = Logger.getLogger(DatagramProcessor.class.getName()); - - public IncomingDatagramMessage read(InetAddress receivedOnAddress, DatagramPacket datagram) throws UnsupportedDataException { - - try { - - if (log.isLoggable(Level.FINER)) { - log.finer("===================================== DATAGRAM BEGIN ============================================"); - log.finer(new String(datagram.getData())); - log.finer("-===================================== DATAGRAM END ============================================="); - } - - ByteArrayInputStream is = new ByteArrayInputStream(datagram.getData()); - - String[] startLine = Headers.readLine(is).split(" "); - if (startLine[0].startsWith("HTTP/1.")) { - return readResponseMessage(receivedOnAddress, datagram, is, Integer.valueOf(startLine[1]), startLine[2], startLine[0]); - } else { - return readRequestMessage(receivedOnAddress, datagram, is, startLine[0], startLine[2]); - } - - } catch (Exception ex) { - throw new UnsupportedDataException("Could not parse headers: " + ex, ex, datagram.getData()); - } - } - - public DatagramPacket write(OutgoingDatagramMessage message) throws UnsupportedDataException { - - StringBuilder statusLine = new StringBuilder(); - - UpnpOperation operation = message.getOperation(); - - if (operation instanceof UpnpRequest) { - - UpnpRequest requestOperation = (UpnpRequest) operation; - statusLine.append(requestOperation.getHttpMethodName()).append(" * "); - statusLine.append("HTTP/1.").append(operation.getHttpMinorVersion()).append("\r\n"); - - } else if (operation instanceof UpnpResponse) { - UpnpResponse responseOperation = (UpnpResponse) operation; - statusLine.append("HTTP/1.").append(operation.getHttpMinorVersion()).append(" "); - statusLine.append(responseOperation.getStatusCode()).append(" ").append(responseOperation.getStatusMessage()); - statusLine.append("\r\n"); - } else { - throw new UnsupportedDataException( - "Message operation is not request or response, don't know how to process: " + message - ); - } - - // UDA 1.0, 1.1.2: No body but message must have a blank line after header - StringBuilder messageData = new StringBuilder(); - messageData.append(statusLine); - - messageData.append(message.getHeaders().toString()).append("\r\n"); - - if (log.isLoggable(Level.FINER)) { - log.finer("Writing message data for: " + message); - log.finer("---------------------------------------------------------------------------------"); - log.finer(messageData.toString().substring(0, messageData.length() - 2)); // Don't print the blank lines - log.finer("---------------------------------------------------------------------------------"); - } - - try { - // According to HTTP 1.0 RFC, headers and their values are US-ASCII - // TODO: Probably should look into escaping rules, too - byte[] data = messageData.toString().getBytes("US-ASCII"); - - log.fine("Writing new datagram packet with " + data.length + " bytes for: " + message); - return new DatagramPacket(data, data.length, message.getDestinationAddress(), message.getDestinationPort()); - - } catch (UnsupportedEncodingException ex) { - throw new UnsupportedDataException( - "Can't convert message content to US-ASCII: " + ex.getMessage(), ex, messageData - ); - } - } - - protected IncomingDatagramMessage readRequestMessage(InetAddress receivedOnAddress, - DatagramPacket datagram, - ByteArrayInputStream is, - String requestMethod, - String httpProtocol) throws Exception { - - // Headers - UpnpHeaders headers = new UpnpHeaders(is); - - // Assemble message - IncomingDatagramMessage requestMessage; - UpnpRequest upnpRequest = new UpnpRequest(UpnpRequest.Method.getByHttpName(requestMethod)); - upnpRequest.setHttpMinorVersion(httpProtocol.toUpperCase(Locale.ENGLISH).equals("HTTP/1.1") ? 1 : 0); - requestMessage = new IncomingDatagramMessage(upnpRequest, datagram.getAddress(), datagram.getPort(), receivedOnAddress); - - requestMessage.setHeaders(headers); - - return requestMessage; - } - - protected IncomingDatagramMessage readResponseMessage(InetAddress receivedOnAddress, - DatagramPacket datagram, - ByteArrayInputStream is, - int statusCode, - String statusMessage, - String httpProtocol) throws Exception { - - // Headers - UpnpHeaders headers = new UpnpHeaders(is); - - // Assemble the message - IncomingDatagramMessage responseMessage; - UpnpResponse upnpResponse = new UpnpResponse(statusCode, statusMessage); - upnpResponse.setHttpMinorVersion(httpProtocol.toUpperCase(Locale.ENGLISH).equals("HTTP/1.1") ? 1 : 0); - responseMessage = new IncomingDatagramMessage(upnpResponse, datagram.getAddress(), datagram.getPort(), receivedOnAddress); - - responseMessage.setHeaders(headers); - - return responseMessage; - } - - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/GENAEventProcessorImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/GENAEventProcessorImpl.java deleted file mode 100644 index 62f5c6e..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/GENAEventProcessorImpl.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.model.Constants; -import org.fourthline.cling.model.XMLUtil; -import org.fourthline.cling.model.message.UpnpMessage; -import org.fourthline.cling.model.message.gena.IncomingEventRequestMessage; -import org.fourthline.cling.model.message.gena.OutgoingEventRequestMessage; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.state.StateVariableValue; -import org.fourthline.cling.transport.spi.GENAEventProcessor; -import org.fourthline.cling.model.UnsupportedDataException; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.ErrorHandler; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.FactoryConfigurationError; - -import java.io.StringReader; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Default implementation based on the W3C DOM XML processing API. - * - * @author Christian Bauer - */ -public class GENAEventProcessorImpl implements GENAEventProcessor, ErrorHandler { - - private static Logger log = Logger.getLogger(GENAEventProcessor.class.getName()); - - protected DocumentBuilderFactory createDocumentBuilderFactory() throws FactoryConfigurationError { - return DocumentBuilderFactory.newInstance(); - } - - public void writeBody(OutgoingEventRequestMessage requestMessage) throws UnsupportedDataException { - log.fine("Writing body of: " + requestMessage); - - try { - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - Document d = factory.newDocumentBuilder().newDocument(); - Element propertysetElement = writePropertysetElement(d); - - writeProperties(d, propertysetElement, requestMessage); - - requestMessage.setBody(UpnpMessage.BodyType.STRING, toString(d)); - - if (log.isLoggable(Level.FINER)) { - log.finer("===================================== GENA BODY BEGIN ============================================"); - log.finer(requestMessage.getBody().toString()); - log.finer("====================================== GENA BODY END ============================================="); - } - - } catch (Exception ex) { - throw new UnsupportedDataException("Can't transform message payload: " + ex.getMessage(), ex); - } - } - - public void readBody(IncomingEventRequestMessage requestMessage) throws UnsupportedDataException { - - log.fine("Reading body of: " + requestMessage); - if (log.isLoggable(Level.FINER)) { - log.finer("===================================== GENA BODY BEGIN ============================================"); - log.finer(requestMessage.getBody().toString()); - log.finer("-===================================== GENA BODY END ============================================"); - } - - String body = getMessageBody(requestMessage); - try { - - DocumentBuilderFactory factory = createDocumentBuilderFactory(); - factory.setNamespaceAware(true); - DocumentBuilder documentBuilder = factory.newDocumentBuilder(); - documentBuilder.setErrorHandler(this); - - Document d = documentBuilder.parse( - new InputSource(new StringReader(body)) - ); - - Element propertysetElement = readPropertysetElement(d); - - readProperties(propertysetElement, requestMessage); - - } catch (Exception ex) { - throw new UnsupportedDataException("Can't transform message payload: " + ex.getMessage(), ex, body); - } - } - - /* ##################################################################################################### */ - - protected Element writePropertysetElement(Document d) { - Element propertysetElement = d.createElementNS(Constants.NS_UPNP_EVENT_10, "e:propertyset"); - d.appendChild(propertysetElement); - return propertysetElement; - } - - protected Element readPropertysetElement(Document d) { - - Element propertysetElement = d.getDocumentElement(); - if (propertysetElement == null || !getUnprefixedNodeName(propertysetElement).equals("propertyset")) { - throw new RuntimeException("Root element was not 'propertyset'"); - } - return propertysetElement; - } - - /* ##################################################################################################### */ - - protected void writeProperties(Document d, Element propertysetElement, OutgoingEventRequestMessage message) { - for (StateVariableValue stateVariableValue : message.getStateVariableValues()) { - Element propertyElement = d.createElementNS(Constants.NS_UPNP_EVENT_10, "e:property"); - propertysetElement.appendChild(propertyElement); - XMLUtil.appendNewElement( - d, - propertyElement, - stateVariableValue.getStateVariable().getName(), - stateVariableValue.toString() - ); - } - } - - protected void readProperties(Element propertysetElement, IncomingEventRequestMessage message) { - NodeList propertysetElementChildren = propertysetElement.getChildNodes(); - - StateVariable[] stateVariables = message.getService().getStateVariables(); - - for (int i = 0; i < propertysetElementChildren.getLength(); i++) { - Node propertysetChild = propertysetElementChildren.item(i); - - if (propertysetChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (getUnprefixedNodeName(propertysetChild).equals("property")) { - - NodeList propertyChildren = propertysetChild.getChildNodes(); - - for (int j = 0; j < propertyChildren.getLength(); j++) { - Node propertyChild = propertyChildren.item(j); - - if (propertyChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - String stateVariableName = getUnprefixedNodeName(propertyChild); - for (StateVariable stateVariable : stateVariables) { - if (stateVariable.getName().equals(stateVariableName)) { - log.fine("Reading state variable value: " + stateVariableName); - String value = XMLUtil.getTextContent(propertyChild); - message.getStateVariableValues().add( - new StateVariableValue(stateVariable, value) - ); - break; - } - } - - } - } - } - } - - /* ##################################################################################################### */ - - protected String getMessageBody(UpnpMessage message) throws UnsupportedDataException { - if (!message.isBodyNonEmptyString()) - throw new UnsupportedDataException( - "Can't transform null or non-string/zero-length body of: " + message - ); - return message.getBodyString().trim(); - } - - protected String toString(Document d) throws Exception { - // Just to be safe, no newline at the end - String output = XMLUtil.documentToString(d); - while (output.endsWith("\n") || output.endsWith("\r")) { - output = output.substring(0, output.length() - 1); - } - - return output; - } - - protected String getUnprefixedNodeName(Node node) { - return node.getPrefix() != null - ? node.getNodeName().substring(node.getPrefix().length() + 1) - : node.getNodeName(); - } - - public void warning(SAXParseException e) throws SAXException { - log.warning(e.toString()); - } - - public void error(SAXParseException e) throws SAXException { - throw e; - } - - public void fatalError(SAXParseException e) throws SAXException { - throw e; - } -} - diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/HttpExchangeUpnpStream.java b/app/src/main/java/org/fourthline/cling/transport/impl/HttpExchangeUpnpStream.java deleted file mode 100644 index 4fde5ef..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/HttpExchangeUpnpStream.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import com.sun.net.httpserver.HttpExchange; -import org.fourthline.cling.model.message.Connection; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.UpnpMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.transport.spi.UpnpStream; -import org.seamless.util.Exceptions; -import org.seamless.util.io.IO; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.util.Locale; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Default implementation based on the JDK 6.0 built-in HTTP Server. - *

- * Instantiated by a com.sun.net.httpserver.HttpHandler. - *

- * - * @author Christian Bauer - */ -public abstract class HttpExchangeUpnpStream extends UpnpStream { - - private static Logger log = Logger.getLogger(UpnpStream.class.getName()); - - private HttpExchange httpExchange; - - public HttpExchangeUpnpStream(ProtocolFactory protocolFactory, HttpExchange httpExchange) { - super(protocolFactory); - this.httpExchange = httpExchange; - } - - public HttpExchange getHttpExchange() { - return httpExchange; - } - - public void run() { - - try { - log.fine("Processing HTTP request: " + getHttpExchange().getRequestMethod() + " " + getHttpExchange().getRequestURI()); - - // Status - StreamRequestMessage requestMessage = - new StreamRequestMessage( - UpnpRequest.Method.getByHttpName(getHttpExchange().getRequestMethod()), - getHttpExchange().getRequestURI() - ); - - if (requestMessage.getOperation().getMethod().equals(UpnpRequest.Method.UNKNOWN)) { - log.fine("Method not supported by UPnP stack: " + getHttpExchange().getRequestMethod()); - throw new RuntimeException("Method not supported: " + getHttpExchange().getRequestMethod()); - } - - // Protocol - requestMessage.getOperation().setHttpMinorVersion( - getHttpExchange().getProtocol().toUpperCase(Locale.ENGLISH).equals("HTTP/1.1") ? 1 : 0 - ); - - log.fine("Created new request message: " + requestMessage); - - // Connection wrapper - requestMessage.setConnection(createConnection()); - - // Headers - requestMessage.setHeaders(new UpnpHeaders(getHttpExchange().getRequestHeaders())); - - // Body - byte[] bodyBytes; - InputStream is = null; - try { - is = getHttpExchange().getRequestBody(); - bodyBytes = IO.readBytes(is); - } finally { - if (is != null) - is.close(); - } - - log.fine("Reading request body bytes: " + bodyBytes.length); - - if (bodyBytes.length > 0 && requestMessage.isContentTypeMissingOrText()) { - - log.fine("Request contains textual entity body, converting then setting string on message"); - requestMessage.setBodyCharacters(bodyBytes); - - } else if (bodyBytes.length > 0) { - - log.fine("Request contains binary entity body, setting bytes on message"); - requestMessage.setBody(UpnpMessage.BodyType.BYTES, bodyBytes); - - } else { - log.fine("Request did not contain entity body"); - } - - // Process it - StreamResponseMessage responseMessage = process(requestMessage); - - // Return the response - if (responseMessage != null) { - log.fine("Preparing HTTP response message: " + responseMessage); - - // Headers - getHttpExchange().getResponseHeaders().putAll( - responseMessage.getHeaders() - ); - - // Body - byte[] responseBodyBytes = responseMessage.hasBody() ? responseMessage.getBodyBytes() : null; - int contentLength = responseBodyBytes != null ? responseBodyBytes.length : -1; - - log.fine("Sending HTTP response message: " + responseMessage + " with content length: " + contentLength); - getHttpExchange().sendResponseHeaders(responseMessage.getOperation().getStatusCode(), contentLength); - - if (contentLength > 0) { - log.fine("Response message has body, writing bytes to stream..."); - OutputStream os = null; - try { - os = getHttpExchange().getResponseBody(); - IO.writeBytes(os, responseBodyBytes); - os.flush(); - } finally { - if (os != null) - os.close(); - } - } - - } else { - // If it's null, it's 404, everything else needs a proper httpResponse - log.fine("Sending HTTP response status: " + HttpURLConnection.HTTP_NOT_FOUND); - getHttpExchange().sendResponseHeaders(HttpURLConnection.HTTP_NOT_FOUND, -1); - } - - responseSent(responseMessage); - - } catch (Throwable t) { - - // You definitely want to catch all Exceptions here, otherwise the server will - // simply close the socket and you get an "unexpected end of file" on the client. - // The same is true if you just rethrow an IOException - it is a mystery why it - // is declared then on the HttpHandler interface if it isn't handled in any - // way... so we always do error handling here. - - // TODO: We should only send an error if the problem was on our side - // You don't have to catch Throwable unless, like we do here in unit tests, - // you might run into Errors as well (assertions). - log.fine("Exception occured during UPnP stream processing: " + t); - if (log.isLoggable(Level.FINE)) { - log.log(Level.FINE, "Cause: " + Exceptions.unwrap(t), Exceptions.unwrap(t)); - } - try { - httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_INTERNAL_ERROR, -1); - } catch (IOException ex) { - log.warning("Couldn't send error response: " + ex); - } - - responseException(t); - } - } - - abstract protected Connection createConnection(); - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/MulticastReceiverConfigurationImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/MulticastReceiverConfigurationImpl.java deleted file mode 100644 index d8bb5d8..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/MulticastReceiverConfigurationImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.transport.spi.MulticastReceiverConfiguration; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -/** - * Settings for the default implementation. - * - * @author Christian Bauer - */ -public class MulticastReceiverConfigurationImpl implements MulticastReceiverConfiguration { - - private InetAddress group; - private int port; - private int maxDatagramBytes; - - public MulticastReceiverConfigurationImpl(InetAddress group, int port, int maxDatagramBytes) { - this.group = group; - this.port = port; - this.maxDatagramBytes = maxDatagramBytes; - } - - /** - * Defaults to maximum datagram size of 640 bytes (512 per UDA 1.0, 128 byte header). - */ - public MulticastReceiverConfigurationImpl(InetAddress group, int port) { - this(group, port, 640); - } - - public MulticastReceiverConfigurationImpl(String group, int port, int maxDatagramBytes) throws UnknownHostException { - this(InetAddress.getByName(group), port, maxDatagramBytes); - } - - /** - * Defaults to maximum datagram size of 640 bytes (512 per UDA 1.0, 128 byte header). - */ - public MulticastReceiverConfigurationImpl(String group, int port) throws UnknownHostException { - this(InetAddress.getByName(group), port, 640); - } - - public InetAddress getGroup() { - return group; - } - - public void setGroup(InetAddress group) { - this.group = group; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - - public int getMaxDatagramBytes() { - return maxDatagramBytes; - } - - public void setMaxDatagramBytes(int maxDatagramBytes) { - this.maxDatagramBytes = maxDatagramBytes; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/MulticastReceiverImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/MulticastReceiverImpl.java deleted file mode 100644 index 4e3ac31..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/MulticastReceiverImpl.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.transport.Router; -import org.fourthline.cling.transport.spi.DatagramProcessor; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.transport.spi.MulticastReceiver; -import org.fourthline.cling.model.UnsupportedDataException; -import org.fourthline.cling.transport.spi.NetworkAddressFactory; - -import java.net.DatagramPacket; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.MulticastSocket; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.util.logging.Logger; - -/** - * Default implementation based on a UDP MulticastSocket. - *

- * Thread-safety is guaranteed through synchronization of methods of this service and - * by the thread-safe underlying socket. - *

- * @author Christian Bauer - */ -public class MulticastReceiverImpl implements MulticastReceiver { - - private static Logger log = Logger.getLogger(MulticastReceiver.class.getName()); - - final protected MulticastReceiverConfigurationImpl configuration; - - protected Router router; - protected NetworkAddressFactory networkAddressFactory; - protected DatagramProcessor datagramProcessor; - - protected NetworkInterface multicastInterface; - protected InetSocketAddress multicastAddress; - private MulticastSocket socket; - - public MulticastReceiverImpl(MulticastReceiverConfigurationImpl configuration) { - this.configuration = configuration; - } - - public MulticastReceiverConfigurationImpl getConfiguration() { - return configuration; - } - - synchronized public void init(NetworkInterface networkInterface, - Router router, - NetworkAddressFactory networkAddressFactory, - DatagramProcessor datagramProcessor) throws InitializationException { - - this.router = router; - this.networkAddressFactory = networkAddressFactory; - this.datagramProcessor = datagramProcessor; - this.multicastInterface = networkInterface; - - try { - - log.info("Creating wildcard socket (for receiving multicast datagrams) on port: " + configuration.getPort()); - multicastAddress = new InetSocketAddress(configuration.getGroup(), configuration.getPort()); - - socket = new MulticastSocket(configuration.getPort()); - socket.setReuseAddress(true); - socket.setReceiveBufferSize(32768); // Keep a backlog of incoming datagrams if we are not fast enough - - log.info("Joining multicast group: " + multicastAddress + " on network interface: " + multicastInterface.getDisplayName()); - socket.joinGroup(multicastAddress, multicastInterface); - - } catch (Exception ex) { - throw new InitializationException("Could not initialize " + getClass().getSimpleName() + ": " + ex); - } - } - - synchronized public void stop() { - if (socket != null && !socket.isClosed()) { - try { - log.fine("Leaving multicast group"); - socket.leaveGroup(multicastAddress, multicastInterface); - // Well this doesn't work and I have no idea why I get "java.net.SocketException: Can't assign requested address" - } catch (Exception ex) { - log.fine("Could not leave multicast group: " + ex); - } - // So... just close it and ignore the log messages - socket.close(); - } - } - - public void run() { - - log.fine("Entering blocking receiving loop, listening for UDP datagrams on: " + socket.getLocalAddress()); - while (true) { - - try { - byte[] buf = new byte[getConfiguration().getMaxDatagramBytes()]; - DatagramPacket datagram = new DatagramPacket(buf, buf.length); - - socket.receive(datagram); - - InetAddress receivedOnLocalAddress = - networkAddressFactory.getLocalAddress( - multicastInterface, - multicastAddress.getAddress() instanceof Inet6Address, - datagram.getAddress() - ); - - log.fine( - "UDP datagram received from: " + datagram.getAddress().getHostAddress() - + ":" + datagram.getPort() - + " on local interface: " + multicastInterface.getDisplayName() - + " and address: " + receivedOnLocalAddress.getHostAddress() - ); - - router.received(datagramProcessor.read(receivedOnLocalAddress, datagram)); - - } catch (SocketException ex) { - log.fine("Socket closed"); - break; - } catch (UnsupportedDataException ex) { - log.info("Could not read datagram: " + ex.getMessage()); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - try { - if (!socket.isClosed()) { - log.fine("Closing multicast socket"); - socket.close(); - } - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - -} - diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/NetworkAddressFactoryImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/NetworkAddressFactoryImpl.java deleted file mode 100644 index 147d794..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/NetworkAddressFactoryImpl.java +++ /dev/null @@ -1,507 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.model.Constants; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.transport.spi.NetworkAddressFactory; -import org.fourthline.cling.transport.spi.NoNetworkException; -import org.seamless.util.Iterators; - -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.InterfaceAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.Locale; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Default implementation of network interface and address configuration/discovery. - *

- * - * @author Christian Bauer - */ -public class NetworkAddressFactoryImpl implements NetworkAddressFactory { - - // Ephemeral port is the default - public static final int DEFAULT_TCP_HTTP_LISTEN_PORT = 0; - - private static Logger log = Logger.getLogger(NetworkAddressFactoryImpl.class.getName()); - - final protected Set useInterfaces = new HashSet(); - final protected Set useAddresses = new HashSet(); - - final protected List networkInterfaces = new ArrayList(); - final protected List bindAddresses = new ArrayList(); - - protected int streamListenPort; - - /** - * Defaults to an ephemeral port. - */ - public NetworkAddressFactoryImpl() throws InitializationException { - this(DEFAULT_TCP_HTTP_LISTEN_PORT); - } - - public NetworkAddressFactoryImpl(int streamListenPort) throws InitializationException { - - System.setProperty("java.net.preferIPv4Stack", "true"); - - String useInterfacesString = System.getProperty(SYSTEM_PROPERTY_NET_IFACES); - if (useInterfacesString != null) { - String[] userInterfacesStrings = useInterfacesString.split(","); - useInterfaces.addAll(Arrays.asList(userInterfacesStrings)); - } - - String useAddressesString = System.getProperty(SYSTEM_PROPERTY_NET_ADDRESSES); - if (useAddressesString != null) { - String[] useAddressesStrings = useAddressesString.split(","); - useAddresses.addAll(Arrays.asList(useAddressesStrings)); - } - - discoverNetworkInterfaces(); - discoverBindAddresses(); - - if ((networkInterfaces.size() == 0 || bindAddresses.size() == 0)) { - log.warning("No usable network interface or addresses found"); - if(requiresNetworkInterface()) { - throw new NoNetworkException( - "Could not discover any usable network interfaces and/or addresses" - ); - } - } - - this.streamListenPort = streamListenPort; - } - - /** - * @return true (the default) if a MissingNetworkInterfaceException should be thrown - */ - protected boolean requiresNetworkInterface() { - return true; - } - - public void logInterfaceInformation() { - synchronized (networkInterfaces) { - if(networkInterfaces.isEmpty()) { - log.info("No network interface to display!"); - return ; - } - for(NetworkInterface networkInterface : networkInterfaces) { - try { - logInterfaceInformation(networkInterface); - } catch (SocketException ex) { - log.log(Level.WARNING, "Exception while logging network interface information", ex); - } - } - } - } - - public InetAddress getMulticastGroup() { - try { - return InetAddress.getByName(Constants.IPV4_UPNP_MULTICAST_GROUP); - } catch (UnknownHostException ex) { - throw new RuntimeException(ex); - } - } - - public int getMulticastPort() { - return Constants.UPNP_MULTICAST_PORT; - } - - public int getStreamListenPort() { - return streamListenPort; - } - - public Iterator getNetworkInterfaces() { - return new Iterators.Synchronized(networkInterfaces) { - @Override - protected void synchronizedRemove(int index) { - synchronized (networkInterfaces) { - networkInterfaces.remove(index); - } - } - }; - } - - public Iterator getBindAddresses() { - return new Iterators.Synchronized(bindAddresses) { - @Override - protected void synchronizedRemove(int index) { - synchronized (bindAddresses) { - bindAddresses.remove(index); - } - } - }; - } - - public boolean hasUsableNetwork() { - return networkInterfaces.size() > 0 && bindAddresses.size() > 0; - } - - public byte[] getHardwareAddress(InetAddress inetAddress) { - try { - NetworkInterface iface = NetworkInterface.getByInetAddress(inetAddress); - return iface != null ? iface.getHardwareAddress() : null; - } catch (Throwable ex) { - log.log(Level.WARNING, "Cannot get hardware address for: " + inetAddress, ex); - // On Win32: java.lang.Error: IP Helper Library GetIpAddrTable function failed - - // On Android 4.0.3 NullPointerException with inetAddress != null - - // On Android "SocketException: No such device or address" when - // switching networks (mobile -> WiFi) - return null; - } - } - - public InetAddress getBroadcastAddress(InetAddress inetAddress) { - synchronized (networkInterfaces) { - for (NetworkInterface iface : networkInterfaces) { - for (InterfaceAddress interfaceAddress : getInterfaceAddresses(iface)) { - if (interfaceAddress != null && interfaceAddress.getAddress().equals(inetAddress)) { - return interfaceAddress.getBroadcast(); - } - } - } - } - return null; - } - - public Short getAddressNetworkPrefixLength(InetAddress inetAddress) { - synchronized (networkInterfaces) { - for (NetworkInterface iface : networkInterfaces) { - for (InterfaceAddress interfaceAddress : getInterfaceAddresses(iface)) { - if (interfaceAddress != null && interfaceAddress.getAddress().equals(inetAddress)) { - short prefix = interfaceAddress.getNetworkPrefixLength(); - if(prefix > 0 && prefix < 32) return prefix; // some network cards return -1 - return null; - } - } - } - } - return null; - } - - public InetAddress getLocalAddress(NetworkInterface networkInterface, boolean isIPv6, InetAddress remoteAddress) { - - // First try to find a local IP that is in the same subnet as the remote IP - InetAddress localIPInSubnet = getBindAddressInSubnetOf(remoteAddress); - if (localIPInSubnet != null) return localIPInSubnet; - - // There are two reasons why we end up here: - // - // - Windows Vista returns a 64 or 128 CIDR prefix if you ask it for the network prefix length of an IPv4 address! - // - // - We are dealing with genuine IPv6 addresses - // - // - Something is really wrong on the LAN and we received a multicast datagram from a source we can't reach via IP - log.finer("Could not find local bind address in same subnet as: " + remoteAddress.getHostAddress()); - - // Next, just take the given interface (which is really totally random) and get the first address that we like - for (InetAddress interfaceAddress: getInetAddresses(networkInterface)) { - if (isIPv6 && interfaceAddress instanceof Inet6Address) - return interfaceAddress; - if (!isIPv6 && interfaceAddress instanceof Inet4Address) - return interfaceAddress; - } - throw new IllegalStateException("Can't find any IPv4 or IPv6 address on interface: " + networkInterface.getDisplayName()); - } - - protected List getInterfaceAddresses(NetworkInterface networkInterface) { - return networkInterface.getInterfaceAddresses(); - } - - protected List getInetAddresses(NetworkInterface networkInterface) { - return Collections.list(networkInterface.getInetAddresses()); - } - - protected InetAddress getBindAddressInSubnetOf(InetAddress inetAddress) { - synchronized (networkInterfaces) { - for (NetworkInterface iface : networkInterfaces) { - for (InterfaceAddress ifaceAddress : getInterfaceAddresses(iface)) { - - synchronized (bindAddresses) { - if (ifaceAddress == null || !bindAddresses.contains(ifaceAddress.getAddress())) { - continue; - } - } - - if (isInSubnet( - inetAddress.getAddress(), - ifaceAddress.getAddress().getAddress(), - ifaceAddress.getNetworkPrefixLength()) - ) { - return ifaceAddress.getAddress(); - } - } - - } - } - return null; - } - - protected boolean isInSubnet(byte[] ip, byte[] network, short prefix) { - if (ip.length != network.length) { - return false; - } - - if (prefix / 8 > ip.length) { - return false; - } - - int i = 0; - while (prefix >= 8 && i < ip.length) { - if (ip[i] != network[i]) { - return false; - } - i++; - prefix -= 8; - } - if(i == ip.length) return true; - final byte mask = (byte) ~((1 << 8 - prefix) - 1); - - return (ip[i] & mask) == (network[i] & mask); - } - - protected void discoverNetworkInterfaces() throws InitializationException { - try { - - Enumeration interfaceEnumeration = NetworkInterface.getNetworkInterfaces(); - for (NetworkInterface iface : Collections.list(interfaceEnumeration)) { - //displayInterfaceInformation(iface); - - log.finer("Analyzing network interface: " + iface.getDisplayName()); - if (isUsableNetworkInterface(iface)) { - log.fine("Discovered usable network interface: " + iface.getDisplayName()); - synchronized (networkInterfaces) { - networkInterfaces.add(iface); - } - } else { - log.finer("Ignoring non-usable network interface: " + iface.getDisplayName()); - } - } - - } catch (Exception ex) { - throw new InitializationException("Could not not analyze local network interfaces: " + ex, ex); - } - } - - /** - * Validation of every discovered network interface. - *

- * Override this method to customize which network interfaces are used. - *

- *

- * The given implementation ignores interfaces which are - *

- *
    - *
  • loopback (yes, we do not bind to lo0)
  • - *
  • down
  • - *
  • have no bound IP addresses
  • - *
  • named "vmnet*" (OS X VMWare does not properly stop interfaces when it quits)
  • - *
  • named "vnic*" (OS X Parallels interfaces should be ignored as well)
  • - *
  • named "*virtual*" (VirtualBox interfaces, for example
  • - *
  • named "ppp*"
  • - *
- * - * @param iface The interface to validate. - * @return True if the given interface matches all validation criteria. - * @throws Exception If any validation test failed with an un-recoverable error. - */ - protected boolean isUsableNetworkInterface(NetworkInterface iface) throws Exception { - if (!iface.isUp()) { - log.finer("Skipping network interface (down): " + iface.getDisplayName()); - return false; - } - - if (getInetAddresses(iface).size() == 0) { - log.finer("Skipping network interface without bound IP addresses: " + iface.getDisplayName()); - return false; - } - - if (iface.getName().toLowerCase(Locale.ENGLISH).startsWith("vmnet") || - (iface.getDisplayName() != null && iface.getDisplayName().toLowerCase(Locale.ENGLISH).contains("vmnet"))) { - log.finer("Skipping network interface (VMWare): " + iface.getDisplayName()); - return false; - } - - if (iface.getName().toLowerCase(Locale.ENGLISH).startsWith("vnic")) { - log.finer("Skipping network interface (Parallels): " + iface.getDisplayName()); - return false; - } - - if (iface.getName().toLowerCase(Locale.ENGLISH).contains("virtual")) { - log.finer("Skipping network interface (named '*virtual*'): " + iface.getDisplayName()); - return false; - } - - if (iface.getName().toLowerCase(Locale.ENGLISH).startsWith("ppp")) { - log.finer("Skipping network interface (PPP): " + iface.getDisplayName()); - return false; - } - - if (iface.isLoopback()) { - log.finer("Skipping network interface (ignoring loopback): " + iface.getDisplayName()); - return false; - } - - if (useInterfaces.size() > 0 && !useInterfaces.contains(iface.getName())) { - log.finer("Skipping unwanted network interface (-D" + SYSTEM_PROPERTY_NET_IFACES + "): " + iface.getName()); - return false; - } - - if (!iface.supportsMulticast()) - log.warning("Network interface may not be multicast capable: " + iface.getDisplayName()); - - return true; - } - - protected void discoverBindAddresses() throws InitializationException { - try { - - synchronized (networkInterfaces) { - Iterator it = networkInterfaces.iterator(); - while (it.hasNext()) { - NetworkInterface networkInterface = it.next(); - - log.finer("Discovering addresses of interface: " + networkInterface.getDisplayName()); - int usableAddresses = 0; - for (InetAddress inetAddress : getInetAddresses(networkInterface)) { - if (inetAddress == null) { - log.warning("Network has a null address: " + networkInterface.getDisplayName()); - continue; - } - - if (isUsableAddress(networkInterface, inetAddress)) { - log.fine("Discovered usable network interface address: " + inetAddress.getHostAddress()); - usableAddresses++; - synchronized (bindAddresses) { - bindAddresses.add(inetAddress); - } - } else { - log.finer("Ignoring non-usable network interface address: " + inetAddress.getHostAddress()); - } - } - - if (usableAddresses == 0) { - log.finer("Network interface has no usable addresses, removing: " + networkInterface.getDisplayName()); - it.remove(); - } - } - } - - } catch (Exception ex) { - throw new InitializationException("Could not not analyze local network interfaces: " + ex, ex); - } - } - - /** - * Validation of every discovered local address. - *

- * Override this method to customize which network addresses are used. - *

- *

- * The given implementation ignores addresses which are - *

- *
    - *
  • not IPv4
  • - *
  • the local loopback (yes, we ignore 127.0.0.1)
  • - *
- * - * @param networkInterface The interface to validate. - * @param address The address of this interface to validate. - * @return True if the given address matches all validation criteria. - */ - protected boolean isUsableAddress(NetworkInterface networkInterface, InetAddress address) { - if (!(address instanceof Inet4Address)) { - log.finer("Skipping unsupported non-IPv4 address: " + address); - return false; - } - - if (address.isLoopbackAddress()) { - log.finer("Skipping loopback address: " + address); - return false; - } - - if (useAddresses.size() > 0 && !useAddresses.contains(address.getHostAddress())) { - log.finer("Skipping unwanted address: " + address); - return false; - } - - return true; - } - - protected void logInterfaceInformation(NetworkInterface networkInterface) throws SocketException { - log.info("---------------------------------------------------------------------------------"); - log.info(String.format("Interface display name: %s", networkInterface.getDisplayName())); - if (networkInterface.getParent() != null) - log.info(String.format("Parent Info: %s", networkInterface.getParent())); - log.info(String.format("Name: %s", networkInterface.getName())); - - Enumeration inetAddresses = networkInterface.getInetAddresses(); - - for (InetAddress inetAddress : Collections.list(inetAddresses)) { - log.info(String.format("InetAddress: %s", inetAddress)); - } - - List interfaceAddresses = networkInterface.getInterfaceAddresses(); - - for (InterfaceAddress interfaceAddress : interfaceAddresses) { - if (interfaceAddress == null) { - log.warning("Skipping null InterfaceAddress!"); - continue; - } - log.info(" Interface Address"); - log.info(" Address: " + interfaceAddress.getAddress()); - log.info(" Broadcast: " + interfaceAddress.getBroadcast()); - log.info(" Prefix length: " + interfaceAddress.getNetworkPrefixLength()); - } - - Enumeration subIfs = networkInterface.getSubInterfaces(); - - for (NetworkInterface subIf : Collections.list(subIfs)) { - if (subIf == null) { - log.warning("Skipping null NetworkInterface sub-interface"); - continue; - } - log.info(String.format("\tSub Interface Display name: %s", subIf.getDisplayName())); - log.info(String.format("\tSub Interface Name: %s", subIf.getName())); - } - log.info(String.format("Up? %s", networkInterface.isUp())); - log.info(String.format("Loopback? %s", networkInterface.isLoopback())); - log.info(String.format("PointToPoint? %s", networkInterface.isPointToPoint())); - log.info(String.format("Supports multicast? %s", networkInterface.supportsMulticast())); - log.info(String.format("Virtual? %s", networkInterface.isVirtual())); - log.info(String.format("Hardware address: %s", Arrays.toString(networkInterface.getHardwareAddress()))); - log.info(String.format("MTU: %s", networkInterface.getMTU())); - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/PullGENAEventProcessorImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/PullGENAEventProcessorImpl.java deleted file mode 100644 index 1a9fea0..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/PullGENAEventProcessorImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import java.util.logging.Logger; - -import org.fourthline.cling.model.message.gena.IncomingEventRequestMessage; -import org.fourthline.cling.model.meta.StateVariable; -import org.fourthline.cling.model.state.StateVariableValue; -import org.fourthline.cling.transport.spi.GENAEventProcessor; -import org.fourthline.cling.model.UnsupportedDataException; -import org.seamless.xml.XmlPullParserUtils; -import org.xmlpull.v1.XmlPullParser; - -import javax.enterprise.inject.Alternative; - -/** - * Implementation based on the Xml Pull Parser XML processing API. - *

- * This processor is more lenient with parsing, looking only for the required XML tags. - *

- *

- * To use this parser you need to install an implementation of the - * XMLPull API. - *

- * - * @author Michael Pujos - */ -@Alternative -public class PullGENAEventProcessorImpl extends GENAEventProcessorImpl { - - private static Logger log = Logger.getLogger(GENAEventProcessor.class.getName()); - - public void readBody(IncomingEventRequestMessage requestMessage) throws UnsupportedDataException { - String body = getMessageBody(requestMessage); - try { - XmlPullParser xpp = XmlPullParserUtils.createParser(body); - readProperties(xpp, requestMessage); - } catch (Exception ex) { - throw new UnsupportedDataException("Can't transform message payload: " + ex.getMessage(), ex, body); - } - } - - protected void readProperties(XmlPullParser xpp, IncomingEventRequestMessage message) throws Exception { - // We're inside the propertyset tag - StateVariable[] stateVariables = message.getService().getStateVariables(); - int event; - while((event = xpp.next()) != XmlPullParser.END_DOCUMENT) { - if(event != XmlPullParser.START_TAG) continue; - if(xpp.getName().equals("property")) { - readProperty(xpp, message, stateVariables); - } - } - } - - protected void readProperty(XmlPullParser xpp, IncomingEventRequestMessage message, StateVariable[] stateVariables) throws Exception { - // We're inside the property tag - int event ; - do { - event = xpp.next(); - if(event == XmlPullParser.START_TAG) { - - String stateVariableName = xpp.getName(); - for (StateVariable stateVariable : stateVariables) { - if (stateVariable.getName().equals(stateVariableName)) { - log.fine("Reading state variable value: " + stateVariableName); - String value = xpp.nextText(); - message.getStateVariableValues().add(new StateVariableValue(stateVariable, value)); - break; - } - } - } - } while(event != XmlPullParser.END_DOCUMENT && (event != XmlPullParser.END_TAG || !xpp.getName().equals("property"))); - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/PullSOAPActionProcessorImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/PullSOAPActionProcessorImpl.java deleted file mode 100644 index e49745d..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/PullSOAPActionProcessorImpl.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; - -import org.fourthline.cling.model.action.ActionArgumentValue; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.message.control.ActionRequestMessage; -import org.fourthline.cling.model.message.control.ActionResponseMessage; -import org.fourthline.cling.model.meta.ActionArgument; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.transport.spi.SOAPActionProcessor; -import org.fourthline.cling.model.UnsupportedDataException; -import org.seamless.xml.XmlPullParserUtils; -import org.xmlpull.v1.XmlPullParser; - -import javax.enterprise.inject.Alternative; - -/** - * Implementation based on the Xml Pull Parser XML processing API. - *

- * This processor is more lenient with parsing, looking only for the required XML tags. - *

- *

- * To use this parser you need to install an implementation of the - * XMLPull API. - *

- * - * @author Michael Pujos - */ -@Alternative -public class PullSOAPActionProcessorImpl extends SOAPActionProcessorImpl { - - protected static Logger log = Logger.getLogger(SOAPActionProcessor.class.getName()); - - public void readBody(ActionRequestMessage requestMessage, ActionInvocation actionInvocation) throws UnsupportedDataException { - String body = getMessageBody(requestMessage); - try { - XmlPullParser xpp = XmlPullParserUtils.createParser(body); - readBodyRequest(xpp, requestMessage, actionInvocation); - } catch (Exception ex) { - throw new UnsupportedDataException("Can't transform message payload: " + ex, ex, body); - } - } - - public void readBody(ActionResponseMessage responseMsg, ActionInvocation actionInvocation) throws UnsupportedDataException { - String body = getMessageBody(responseMsg); - try { - XmlPullParser xpp = XmlPullParserUtils.createParser(body); - readBodyElement(xpp); - readBodyResponse(xpp, actionInvocation); - } catch (Exception ex) { - throw new UnsupportedDataException("Can't transform message payload: " + ex, ex, body); - } - } - - protected void readBodyElement(XmlPullParser xpp) throws Exception { - XmlPullParserUtils.searchTag(xpp, "Body"); - } - - protected void readBodyRequest(XmlPullParser xpp, ActionRequestMessage requestMessage, ActionInvocation actionInvocation) throws Exception { - XmlPullParserUtils.searchTag(xpp, actionInvocation.getAction().getName()); - readActionInputArguments(xpp, actionInvocation); - } - - protected void readBodyResponse(XmlPullParser xpp, ActionInvocation actionInvocation) throws Exception { - // We're in the "Body" tag - int event; - do { - event = xpp.next(); - if (event == XmlPullParser.START_TAG) { - if (xpp.getName().equals("Fault")) { - ActionException e = readFaultElement(xpp); - actionInvocation.setFailure(e); - return; - } else if (xpp.getName().equals(actionInvocation.getAction().getName() + "Response")) { - readActionOutputArguments(xpp, actionInvocation); - return; - } - } - - } - while (event != XmlPullParser.END_DOCUMENT && (event != XmlPullParser.END_TAG || !xpp.getName().equals("Body"))); - - throw new ActionException( - ErrorCode.ACTION_FAILED, - String.format("Action SOAP response do not contain %s element", - actionInvocation.getAction().getName() + "Response" - ) - ); - } - - protected void readActionInputArguments(XmlPullParser xpp, ActionInvocation actionInvocation) throws Exception { - actionInvocation.setInput(readArgumentValues(xpp, actionInvocation.getAction().getInputArguments())); - } - - protected void readActionOutputArguments(XmlPullParser xpp, ActionInvocation actionInvocation) throws Exception { - actionInvocation.setOutput(readArgumentValues(xpp, actionInvocation.getAction().getOutputArguments())); - } - - protected Map getMatchingNodes(XmlPullParser xpp, ActionArgument[] args) throws Exception { - - // This is a case-insensitive search! - List names = new ArrayList(); - for (ActionArgument argument : args) { - names.add(argument.getName().toUpperCase()); - for (String alias : Arrays.asList(argument.getAliases())) { - names.add(alias.toUpperCase()); - } - } - - Map matches = new HashMap(); - - String enclosingTag = xpp.getName(); - - int event; - do { - event = xpp.next(); - if(event == XmlPullParser.START_TAG && names.contains(xpp.getName().toUpperCase())) { - matches.put(xpp.getName(), xpp.nextText()); - } - - } - while (event != XmlPullParser.END_DOCUMENT && (event != XmlPullParser.END_TAG || !xpp.getName().equals(enclosingTag))); - - if (matches.size() < args.length) { - throw new ActionException( - ErrorCode.ARGUMENT_VALUE_INVALID, - "Invalid number of input or output arguments in XML message, expected " - + args.length + " but found " + matches.size() - ); - } - return matches; - } - - protected ActionArgumentValue[] readArgumentValues(XmlPullParser xpp, ActionArgument[] args) throws Exception { - // We're in the Response tag - Map matches = getMatchingNodes(xpp, args); - - ActionArgumentValue[] values = new ActionArgumentValue[args.length]; - - for (int i = 0; i < args.length; i++) { - - ActionArgument arg = args[i]; - String value = findActionArgumentValue(matches, arg); - if (value == null) { - throw new ActionException( - ErrorCode.ARGUMENT_VALUE_INVALID, - "Could not find argument '" + arg.getName() + "' node"); - } - - log.fine("Reading action argument: " + arg.getName()); - values[i] = createValue(arg, value); - } - return values; - } - - protected String findActionArgumentValue(Map entries, ActionArgument arg) { - for (Map.Entry entry : entries.entrySet()) { - if (arg.isNameOrAlias(entry.getKey())) return entry.getValue(); - } - return null; - } - - protected ActionException readFaultElement(XmlPullParser xpp) throws Exception { - // We're in the "Fault" tag - - String errorCode = null; - String errorDescription = null; - - XmlPullParserUtils.searchTag(xpp, "UPnPError"); - - int event; - do { - event = xpp.next(); - if (event == XmlPullParser.START_TAG) { - String tag = xpp.getName(); - if (tag.equals("errorCode")) { - errorCode = xpp.nextText(); - } else if (tag.equals("errorDescription")) { - errorDescription = xpp.nextText(); - } - } - } - while (event != XmlPullParser.END_DOCUMENT && (event != XmlPullParser.END_TAG || !xpp.getName().equals("UPnPError"))); - - if (errorCode != null) { - try { - int numericCode = Integer.valueOf(errorCode); - ErrorCode standardErrorCode = ErrorCode.getByCode(numericCode); - if (standardErrorCode != null) { - log.fine("Reading fault element: " + standardErrorCode.getCode() + " - " + errorDescription); - return new ActionException(standardErrorCode, errorDescription, false); - } else { - log.fine("Reading fault element: " + numericCode + " - " + errorDescription); - return new ActionException(numericCode, errorDescription); - } - } catch (NumberFormatException ex) { - throw new RuntimeException("Error code was not a number"); - } - } - - throw new RuntimeException("Received fault element but no error code"); - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/RecoveringGENAEventProcessorImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/RecoveringGENAEventProcessorImpl.java deleted file mode 100644 index 70fd0da..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/RecoveringGENAEventProcessorImpl.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.model.UnsupportedDataException; -import org.fourthline.cling.model.XMLUtil; -import org.fourthline.cling.model.message.gena.IncomingEventRequestMessage; -import org.fourthline.cling.transport.spi.GENAEventProcessor; -import org.seamless.xml.XmlPullParserUtils; - -import javax.enterprise.inject.Alternative; -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -/** - * Implementation based on the Xml Pull Parser XML processing API. - *

- * This processor extends {@link PullGENAEventProcessorImpl}, it will always - * first try to read messages regularly with the superclass' methods before - * trying to recover from a failure. - *

- *

- * When the superclass can't read the message, this processor will try to - * recover from broken XML by for example, detecting wrongly encoded XML entities, - * and working around other vendor-specific bugs caused by incompatible UPnP - * stacks in the wild. - *

- *

- * This processor will also return partial results, if at least a single - * state variable value could be recovered from the (broken) event XML. - *

- * - * @author Michael Pujos - */ -@Alternative -public class RecoveringGENAEventProcessorImpl extends PullGENAEventProcessorImpl { - - private static Logger log = Logger.getLogger(GENAEventProcessor.class.getName()); - - public void readBody(IncomingEventRequestMessage requestMessage) throws UnsupportedDataException { - try { - super.readBody(requestMessage); - } catch (UnsupportedDataException ex) { - - // Can't recover from this - if (!requestMessage.isBodyNonEmptyString()) - throw ex; - - log.warning("Trying to recover from invalid GENA XML event: " + ex); - - // Some properties may have been read at this point, so reset the list - requestMessage.getStateVariableValues().clear(); - - String body = getMessageBody(requestMessage); - - String fixedBody = fixXMLEncodedLastChange( - XmlPullParserUtils.fixXMLEntities(body) - ); - - try { - // Try again, if this fails, we are done... - requestMessage.setBody(fixedBody); - super.readBody(requestMessage); - } catch (UnsupportedDataException ex2) { - // Check if some properties were read - if (requestMessage.getStateVariableValues().isEmpty()) { - // Throw the initial exception containing unmodified XML - throw ex; - } - log.warning("Partial read of GENA event properties (probably due to truncated XML)"); - } - } - } - - protected String fixXMLEncodedLastChange(String xml) { - Pattern pattern = Pattern.compile("(.*)", Pattern.DOTALL); - Matcher matcher = pattern.matcher(xml); - - if (matcher.find() && matcher.groupCount() == 1) { - - String lastChange = matcher.group(1); - - if (XmlPullParserUtils.isNullOrEmpty(lastChange)) - return xml; - - lastChange = lastChange.trim(); - - String fixedLastChange = lastChange; - - if (lastChange.charAt(0) == '<') { - // TODO: UPNP VIOLATION: Orange Liveradio does not encode LastChange XML properly - fixedLastChange = XMLUtil.encodeText(fixedLastChange); - } else { - /* Doesn't work for Philips NP2900, there is complete garbage after the HTML - // TODO: UPNP VIOLATION: Philips NP2900 inserts garbage HTML, try to fix it - fixedLastChange = fixedLastChange.replaceAll("<", ""); - fixedLastChange = fixedLastChange.replaceAll(">", ""); - */ - } - - if (fixedLastChange.equals(lastChange)) { - return xml; - } - - return "" + - "" + - "" + - "" + - fixedLastChange + - "" + - "" + - ""; - } - return xml; - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/RecoveringSOAPActionProcessorImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/RecoveringSOAPActionProcessorImpl.java deleted file mode 100644 index 61c9b33..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/RecoveringSOAPActionProcessorImpl.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import java.util.logging.Logger; - -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.message.control.ActionRequestMessage; -import org.fourthline.cling.model.message.control.ActionResponseMessage; -import org.fourthline.cling.transport.spi.SOAPActionProcessor; -import org.fourthline.cling.model.UnsupportedDataException; -import org.seamless.xml.XmlPullParserUtils; - -import javax.enterprise.inject.Alternative; - -/** - * Implementation based on the Xml Pull Parser XML processing API. - *

- * This processor extends {@link PullSOAPActionProcessorImpl}, it will always - * first try to read messages regularly with the superclass' methods before - * trying to recover from a failure. - *

- *

- * When the superclass can't read the message, this processor will try to - * recover from broken XML by for example, detecting wrongly encoded XML entities, - * and working around other vendor-specific bugs caused by incompatible UPnP - * stacks in the wild. - *

- *

- * Additionally any {@link UnsupportedDataException} thrown while reading an - * XML message will be passed on to the - * {@link #handleInvalidMessage(org.fourthline.cling.model.action.ActionInvocation, org.fourthline.cling.model.UnsupportedDataException, org.fourthline.cling.model.UnsupportedDataException)} - * method for you to handle. The default implementation will simply throw the - * original exception from the first processing attempt. - *

- * - * @author Michael Pujos - */ -@Alternative -public class RecoveringSOAPActionProcessorImpl extends PullSOAPActionProcessorImpl { - - private static Logger log = Logger.getLogger(SOAPActionProcessor.class.getName()); - - public void readBody(ActionRequestMessage requestMessage, ActionInvocation actionInvocation) throws UnsupportedDataException { - try { - super.readBody(requestMessage, actionInvocation); - } catch (UnsupportedDataException ex) { - - // Can't recover from this - if (!requestMessage.isBodyNonEmptyString()) - throw ex; - - log.warning("Trying to recover from invalid SOAP XML request: " + ex); - String body = getMessageBody(requestMessage); - - // TODO: UPNP VIOLATION: TwonkyMobile sends unencoded '&' in SetAVTransportURI action calls: - // http://192.168.1.14:56923/content/12a470d854dbc6887e4103e3140783fd.wav?profile_id=0&convert=wav - String fixedBody = XmlPullParserUtils.fixXMLEntities(body); - - try { - // Try again, if this fails, we are done... - requestMessage.setBody(fixedBody); - super.readBody(requestMessage, actionInvocation); - } catch (UnsupportedDataException ex2) { - handleInvalidMessage(actionInvocation, ex, ex2); - } - } - } - - public void readBody(ActionResponseMessage responseMsg, ActionInvocation actionInvocation) throws UnsupportedDataException { - try { - super.readBody(responseMsg, actionInvocation); - } catch (UnsupportedDataException ex) { - - // Can't recover from this - if (!responseMsg.isBodyNonEmptyString()) - throw ex; - - log.warning("Trying to recover from invalid SOAP XML response: " + ex); - String body = getMessageBody(responseMsg); - - // TODO: UPNP VIOLATION: TwonkyMobile doesn't properly encode '&' - String fixedBody = XmlPullParserUtils.fixXMLEntities(body); - - // TODO: UPNP VIOLATION: YAMAHA NP-S2000 does not terminate XML with - // (at least for action GetPositionInfo) - if (fixedBody.endsWith(" - * Typically you want to log this problem or create an error report, and in any - * case, throw an {@link UnsupportedDataException} to notify the caller of the - * processor of this failure. - *

- *

- * You can access the invalid XML with - * {@link org.fourthline.cling.model.UnsupportedDataException#getData()}. - *

- * - * @param originalException The original exception throw by the first parsing attempt - * @param recoveringException The exception thrown after trying to fix the XML. - */ - protected void handleInvalidMessage(ActionInvocation actionInvocation, - UnsupportedDataException originalException, - UnsupportedDataException recoveringException) throws UnsupportedDataException { - throw originalException; - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/SOAPActionProcessorImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/SOAPActionProcessorImpl.java deleted file mode 100644 index dc38946..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/SOAPActionProcessorImpl.java +++ /dev/null @@ -1,632 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.model.Constants; -import org.fourthline.cling.model.XMLUtil; -import org.fourthline.cling.model.action.ActionArgumentValue; -import org.fourthline.cling.model.action.ActionException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.message.control.ActionMessage; -import org.fourthline.cling.model.message.control.ActionRequestMessage; -import org.fourthline.cling.model.message.control.ActionResponseMessage; -import org.fourthline.cling.model.meta.ActionArgument; -import org.fourthline.cling.model.types.ErrorCode; -import org.fourthline.cling.model.types.InvalidValueException; -import org.fourthline.cling.transport.spi.SOAPActionProcessor; -import org.fourthline.cling.model.UnsupportedDataException; -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.ErrorHandler; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.FactoryConfigurationError; - -import java.io.StringReader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Default implementation based on the W3C DOM XML processing API. - * - * @author Christian Bauer - */ -public class SOAPActionProcessorImpl implements SOAPActionProcessor, ErrorHandler { - - private static Logger log = Logger.getLogger(SOAPActionProcessor.class.getName()); - - protected DocumentBuilderFactory createDocumentBuilderFactory() throws FactoryConfigurationError { - return DocumentBuilderFactory.newInstance(); - } - - public void writeBody(ActionRequestMessage requestMessage, ActionInvocation actionInvocation) throws UnsupportedDataException { - - log.fine("Writing body of " + requestMessage + " for: " + actionInvocation); - - try { - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - Document d = factory.newDocumentBuilder().newDocument(); - Element body = writeBodyElement(d); - - writeBodyRequest(d, body, requestMessage, actionInvocation); - - if (log.isLoggable(Level.FINER)) { - log.finer("===================================== SOAP BODY BEGIN ============================================"); - log.finer(requestMessage.getBodyString()); - log.finer("-===================================== SOAP BODY END ============================================"); - } - - } catch (Exception ex) { - throw new UnsupportedDataException("Can't transform message payload: " + ex, ex); - } - } - - public void writeBody(ActionResponseMessage responseMessage, ActionInvocation actionInvocation) throws UnsupportedDataException { - - log.fine("Writing body of " + responseMessage + " for: " + actionInvocation); - - try { - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - Document d = factory.newDocumentBuilder().newDocument(); - Element body = writeBodyElement(d); - - if (actionInvocation.getFailure() != null) { - writeBodyFailure(d, body, responseMessage, actionInvocation); - } else { - writeBodyResponse(d, body, responseMessage, actionInvocation); - } - - if (log.isLoggable(Level.FINER)) { - log.finer("===================================== SOAP BODY BEGIN ============================================"); - log.finer(responseMessage.getBodyString()); - log.finer("-===================================== SOAP BODY END ============================================"); - } - - } catch (Exception ex) { - throw new UnsupportedDataException("Can't transform message payload: " + ex, ex); - } - } - - public void readBody(ActionRequestMessage requestMessage, ActionInvocation actionInvocation) throws UnsupportedDataException { - - log.fine("Reading body of " + requestMessage + " for: " + actionInvocation); - if (log.isLoggable(Level.FINER)) { - log.finer("===================================== SOAP BODY BEGIN ============================================"); - log.finer(requestMessage.getBodyString()); - log.finer("-===================================== SOAP BODY END ============================================"); - } - - String body = getMessageBody(requestMessage); - try { - - DocumentBuilderFactory factory = createDocumentBuilderFactory(); - factory.setNamespaceAware(true); - DocumentBuilder documentBuilder = factory.newDocumentBuilder(); - documentBuilder.setErrorHandler(this); - - Document d = documentBuilder.parse(new InputSource(new StringReader(body))); - - Element bodyElement = readBodyElement(d); - - readBodyRequest(d, bodyElement, requestMessage, actionInvocation); - - } catch (Exception ex) { - throw new UnsupportedDataException("Can't transform message payload: " + ex, ex, body); - } - } - - public void readBody(ActionResponseMessage responseMsg, ActionInvocation actionInvocation) throws UnsupportedDataException { - - log.fine("Reading body of " + responseMsg + " for: " + actionInvocation); - if (log.isLoggable(Level.FINER)) { - log.finer("===================================== SOAP BODY BEGIN ============================================"); - log.finer(responseMsg.getBodyString()); - log.finer("-===================================== SOAP BODY END ============================================"); - } - - String body = getMessageBody(responseMsg); - try { - - DocumentBuilderFactory factory = createDocumentBuilderFactory(); - factory.setNamespaceAware(true); - DocumentBuilder documentBuilder = factory.newDocumentBuilder(); - documentBuilder.setErrorHandler(this); - - Document d = documentBuilder.parse(new InputSource(new StringReader(body))); - - Element bodyElement = readBodyElement(d); - - ActionException failure = readBodyFailure(d, bodyElement); - - if (failure == null) { - readBodyResponse(d, bodyElement, responseMsg, actionInvocation); - } else { - actionInvocation.setFailure(failure); - } - - } catch (Exception ex) { - throw new UnsupportedDataException("Can't transform message payload: " + ex, ex, body); - } - } - - /* ##################################################################################################### */ - - protected void writeBodyFailure(Document d, - Element bodyElement, - ActionResponseMessage message, - ActionInvocation actionInvocation) throws Exception { - - writeFaultElement(d, bodyElement, actionInvocation); - message.setBody(toString(d)); - } - - protected void writeBodyRequest(Document d, - Element bodyElement, - ActionRequestMessage message, - ActionInvocation actionInvocation) throws Exception { - - Element actionRequestElement = writeActionRequestElement(d, bodyElement, message, actionInvocation); - writeActionInputArguments(d, actionRequestElement, actionInvocation); - message.setBody(toString(d)); - - } - - protected void writeBodyResponse(Document d, - Element bodyElement, - ActionResponseMessage message, - ActionInvocation actionInvocation) throws Exception { - - Element actionResponseElement = writeActionResponseElement(d, bodyElement, message, actionInvocation); - writeActionOutputArguments(d, actionResponseElement, actionInvocation); - message.setBody(toString(d)); - } - - protected ActionException readBodyFailure(Document d, Element bodyElement) throws Exception { - return readFaultElement(bodyElement); - } - - protected void readBodyRequest(Document d, - Element bodyElement, - ActionRequestMessage message, - ActionInvocation actionInvocation) throws Exception { - - Element actionRequestElement = readActionRequestElement(bodyElement, message, actionInvocation); - readActionInputArguments(actionRequestElement, actionInvocation); - } - - protected void readBodyResponse(Document d, - Element bodyElement, - ActionResponseMessage message, - ActionInvocation actionInvocation) throws Exception { - - Element actionResponse = readActionResponseElement(bodyElement, actionInvocation); - readActionOutputArguments(actionResponse, actionInvocation); - } - - /* ##################################################################################################### */ - - protected Element writeBodyElement(Document d) { - - Element envelopeElement = d.createElementNS(Constants.SOAP_NS_ENVELOPE, "s:Envelope"); - Attr encodingStyleAttr = d.createAttributeNS(Constants.SOAP_NS_ENVELOPE, "s:encodingStyle"); - encodingStyleAttr.setValue(Constants.SOAP_URI_ENCODING_STYLE); - envelopeElement.setAttributeNode(encodingStyleAttr); - d.appendChild(envelopeElement); - - Element bodyElement = d.createElementNS(Constants.SOAP_NS_ENVELOPE, "s:Body"); - envelopeElement.appendChild(bodyElement); - - return bodyElement; - } - - protected Element readBodyElement(Document d) { - - Element envelopeElement = d.getDocumentElement(); - - if (envelopeElement == null || !getUnprefixedNodeName(envelopeElement).equals("Envelope")) { - throw new RuntimeException("Response root element was not 'Envelope'"); - } - - NodeList envelopeElementChildren = envelopeElement.getChildNodes(); - for (int i = 0; i < envelopeElementChildren.getLength(); i++) { - Node envelopeChild = envelopeElementChildren.item(i); - - if (envelopeChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (getUnprefixedNodeName(envelopeChild).equals("Body")) { - return (Element) envelopeChild; - } - } - - throw new RuntimeException("Response envelope did not contain 'Body' child element"); - } - - /* ##################################################################################################### */ - - protected Element writeActionRequestElement(Document d, - Element bodyElement, - ActionRequestMessage message, - ActionInvocation actionInvocation) { - - log.fine("Writing action request element: " + actionInvocation.getAction().getName()); - - Element actionRequestElement = d.createElementNS( - message.getActionNamespace(), - "u:" + actionInvocation.getAction().getName() - ); - bodyElement.appendChild(actionRequestElement); - - return actionRequestElement; - } - - protected Element readActionRequestElement(Element bodyElement, - ActionRequestMessage message, - ActionInvocation actionInvocation) { - NodeList bodyChildren = bodyElement.getChildNodes(); - - log.fine("Looking for action request element matching namespace:" + message.getActionNamespace()); - - for (int i = 0; i < bodyChildren.getLength(); i++) { - Node bodyChild = bodyChildren.item(i); - - if (bodyChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - String unprefixedName = getUnprefixedNodeName(bodyChild); - if (unprefixedName.equals(actionInvocation.getAction().getName())) { - if (bodyChild.getNamespaceURI() == null - || !bodyChild.getNamespaceURI().equals(message.getActionNamespace())) - throw new UnsupportedDataException( - "Illegal or missing namespace on action request element: " + bodyChild - ); - log.fine("Reading action request element: " + unprefixedName); - return (Element) bodyChild; - } - } - throw new UnsupportedDataException( - "Could not read action request element matching namespace: " + message.getActionNamespace() - ); - } - - /* ##################################################################################################### */ - - protected Element writeActionResponseElement(Document d, - Element bodyElement, - ActionResponseMessage message, - ActionInvocation actionInvocation) { - - log.fine("Writing action response element: " + actionInvocation.getAction().getName()); - Element actionResponseElement = d.createElementNS( - message.getActionNamespace(), - "u:" + actionInvocation.getAction().getName() + "Response" - ); - bodyElement.appendChild(actionResponseElement); - - return actionResponseElement; - } - - protected Element readActionResponseElement(Element bodyElement, ActionInvocation actionInvocation) { - NodeList bodyChildren = bodyElement.getChildNodes(); - - for (int i = 0; i < bodyChildren.getLength(); i++) { - Node bodyChild = bodyChildren.item(i); - - if (bodyChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (getUnprefixedNodeName(bodyChild).equals(actionInvocation.getAction().getName() + "Response")) { - log.fine("Reading action response element: " + getUnprefixedNodeName(bodyChild)); - return (Element) bodyChild; - } - } - log.fine("Could not read action response element"); - return null; - } - - /* ##################################################################################################### */ - - protected void writeActionInputArguments(Document d, - Element actionRequestElement, - ActionInvocation actionInvocation) { - - for (ActionArgument argument : actionInvocation.getAction().getInputArguments()) { - log.fine("Writing action input argument: " + argument.getName()); - String value = actionInvocation.getInput(argument) != null ? actionInvocation.getInput(argument).toString() : ""; - XMLUtil.appendNewElement(d, actionRequestElement, argument.getName(), value); - } - } - - public void readActionInputArguments(Element actionRequestElement, - ActionInvocation actionInvocation) throws ActionException { - actionInvocation.setInput( - readArgumentValues( - actionRequestElement.getChildNodes(), - actionInvocation.getAction().getInputArguments() - ) - ); - } - - /* ##################################################################################################### */ - - protected void writeActionOutputArguments(Document d, - Element actionResponseElement, - ActionInvocation actionInvocation) { - - for (ActionArgument argument : actionInvocation.getAction().getOutputArguments()) { - log.fine("Writing action output argument: " + argument.getName()); - String value = actionInvocation.getOutput(argument) != null ? actionInvocation.getOutput(argument).toString() : ""; - XMLUtil.appendNewElement(d, actionResponseElement, argument.getName(), value); - } - } - - protected void readActionOutputArguments(Element actionResponseElement, - ActionInvocation actionInvocation) throws ActionException { - - actionInvocation.setOutput( - readArgumentValues( - actionResponseElement.getChildNodes(), - actionInvocation.getAction().getOutputArguments() - ) - ); - } - - /* ##################################################################################################### */ - - protected void writeFaultElement(Document d, Element bodyElement, ActionInvocation actionInvocation) { - - Element faultElement = d.createElementNS(Constants.SOAP_NS_ENVELOPE, "s:Fault"); - bodyElement.appendChild(faultElement); - - // This stuff is really completely arbitrary nonsense... let's hope they fired the guy who decided this - XMLUtil.appendNewElement(d, faultElement, "faultcode", "s:Client"); - XMLUtil.appendNewElement(d, faultElement, "faultstring", "UPnPError"); - - Element detailElement = d.createElement("detail"); - faultElement.appendChild(detailElement); - - Element upnpErrorElement = d.createElementNS(Constants.NS_UPNP_CONTROL_10, "UPnPError"); - detailElement.appendChild(upnpErrorElement); - - int errorCode = actionInvocation.getFailure().getErrorCode(); - String errorDescription = actionInvocation.getFailure().getMessage(); - - log.fine("Writing fault element: " + errorCode + " - " + errorDescription); - - XMLUtil.appendNewElement(d, upnpErrorElement, "errorCode", Integer.toString(errorCode)); - XMLUtil.appendNewElement(d, upnpErrorElement, "errorDescription", errorDescription); - - } - - protected ActionException readFaultElement(Element bodyElement) { - - boolean receivedFaultElement = false; - String errorCode = null; - String errorDescription = null; - - NodeList bodyChildren = bodyElement.getChildNodes(); - - for (int i = 0; i < bodyChildren.getLength(); i++) { - Node bodyChild = bodyChildren.item(i); - - if (bodyChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (getUnprefixedNodeName(bodyChild).equals("Fault")) { - - receivedFaultElement = true; - - NodeList faultChildren = bodyChild.getChildNodes(); - - for (int j = 0; j < faultChildren.getLength(); j++) { - Node faultChild = faultChildren.item(j); - - if (faultChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (getUnprefixedNodeName(faultChild).equals("detail")) { - - NodeList detailChildren = faultChild.getChildNodes(); - for (int x = 0; x < detailChildren.getLength(); x++) { - Node detailChild = detailChildren.item(x); - - if (detailChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (getUnprefixedNodeName(detailChild).equals("UPnPError")) { - - NodeList errorChildren = detailChild.getChildNodes(); - for (int y = 0; y < errorChildren.getLength(); y++) { - Node errorChild = errorChildren.item(y); - - if (errorChild.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (getUnprefixedNodeName(errorChild).equals("errorCode")) - errorCode = XMLUtil.getTextContent(errorChild); - - if (getUnprefixedNodeName(errorChild).equals("errorDescription")) - errorDescription = XMLUtil.getTextContent(errorChild); - } - } - } - } - } - } - } - - if (errorCode != null) { - try { - int numericCode = Integer.valueOf(errorCode); - ErrorCode standardErrorCode = ErrorCode.getByCode(numericCode); - if (standardErrorCode != null) { - log.fine("Reading fault element: " + standardErrorCode.getCode() + " - " + errorDescription); - return new ActionException(standardErrorCode, errorDescription, false); - } else { - log.fine("Reading fault element: " + numericCode + " - " + errorDescription); - return new ActionException(numericCode, errorDescription); - } - } catch (NumberFormatException ex) { - throw new RuntimeException("Error code was not a number"); - } - } else if (receivedFaultElement) { - throw new RuntimeException("Received fault element but no error code"); - } - return null; - } - - - /* ##################################################################################################### */ - - protected String getMessageBody(ActionMessage message) throws UnsupportedDataException { - if (!message.isBodyNonEmptyString()) - throw new UnsupportedDataException( - "Can't transform null or non-string/zero-length body of: " + message - ); - return message.getBodyString().trim(); - } - - protected String toString(Document d) throws Exception { - // Just to be safe, no newline at the end - String output = XMLUtil.documentToString(d); - while (output.endsWith("\n") || output.endsWith("\r")) { - output = output.substring(0, output.length() - 1); - } - - return output; - } - - protected String getUnprefixedNodeName(Node node) { - return node.getPrefix() != null - ? node.getNodeName().substring(node.getPrefix().length() + 1) - : node.getNodeName(); - } - - /** - * The UPnP spec says that action arguments must be in the order as declared - * by the service. This method however is lenient, the action argument nodes - * in the XML can be in any order, as long as they are all there everything - * is OK. - */ - protected ActionArgumentValue[] readArgumentValues(NodeList nodeList, ActionArgument[] args) - throws ActionException { - - List nodes = getMatchingNodes(nodeList, args); - - ActionArgumentValue[] values = new ActionArgumentValue[args.length]; - - for (int i = 0; i < args.length; i++) { - - ActionArgument arg = args[i]; - Node node = findActionArgumentNode(nodes, arg); - if(node == null) { - throw new ActionException( - ErrorCode.ARGUMENT_VALUE_INVALID, - "Could not find argument '" + arg.getName() + "' node"); - } - log.fine("Reading action argument: " + arg.getName()); - String value = XMLUtil.getTextContent(node); - values[i] = createValue(arg, value); - } - return values; - } - - /** - * Finds all element nodes in the list that match any argument name or argument - * alias, throws {@link ActionException} if not all arguments were found. - */ - protected List getMatchingNodes(NodeList nodeList, ActionArgument[] args) throws ActionException { - - List names = new ArrayList(); - for (ActionArgument argument : args) { - names.add(argument.getName()); - names.addAll(Arrays.asList(argument.getAliases())); - } - - List matches = new ArrayList(); - for (int i = 0; i < nodeList.getLength(); i++) { - Node child = nodeList.item(i); - - if (child.getNodeType() != Node.ELEMENT_NODE) - continue; - - if (names.contains(getUnprefixedNodeName(child))) - matches.add(child); - } - - if (matches.size() < args.length) { - throw new ActionException( - ErrorCode.ARGUMENT_VALUE_INVALID, - "Invalid number of input or output arguments in XML message, expected " + args.length + " but found " + matches.size() - ); - } - return matches; - } - - /** - * Creates an instance of {@link ActionArgumentValue} and wraps an - * {@link InvalidValueException} as an {@link ActionException} with the - * appropriate {@link ErrorCode}. - */ - protected ActionArgumentValue createValue(ActionArgument arg, String value) throws ActionException { - try { - return new ActionArgumentValue(arg, value); - } catch (InvalidValueException ex) { - throw new ActionException( - ErrorCode.ARGUMENT_VALUE_INVALID, - "Wrong type or invalid value for '" + arg.getName() + "': " + ex.getMessage(), - ex - ); - } - } - - /** - * Returns the node with the same unprefixed name as the action argument - * name/alias or null. - */ - protected Node findActionArgumentNode(List nodes, ActionArgument arg) { - for(Node node : nodes) { - if(arg.isNameOrAlias(getUnprefixedNodeName(node))) return node; - } - return null; - } - - public void warning(SAXParseException e) throws SAXException { - log.warning(e.toString()); - } - - public void error(SAXParseException e) throws SAXException { - throw e; - } - - public void fatalError(SAXParseException e) throws SAXException { - throw e; - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/StreamClientConfigurationImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/StreamClientConfigurationImpl.java deleted file mode 100644 index 0706497..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/StreamClientConfigurationImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.transport.spi.AbstractStreamClientConfiguration; - -import java.util.concurrent.ExecutorService; - -/** - * Settings for the default implementation. - * - * @author Christian Bauer - */ -public class StreamClientConfigurationImpl extends AbstractStreamClientConfiguration { - - private boolean usePersistentConnections = false; - - public StreamClientConfigurationImpl(ExecutorService timeoutExecutorService) { - super(timeoutExecutorService); - } - - public StreamClientConfigurationImpl(ExecutorService timeoutExecutorService, int timeoutSeconds) { - super(timeoutExecutorService, timeoutSeconds); - } - - /** - * Defaults to false, avoiding obscure bugs in the JDK. - */ - public boolean isUsePersistentConnections() { - return usePersistentConnections; - } - - public void setUsePersistentConnections(boolean usePersistentConnections) { - this.usePersistentConnections = usePersistentConnections; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/StreamClientImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/StreamClientImpl.java deleted file mode 100644 index 0bfe9f2..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/StreamClientImpl.java +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.model.ModelUtil; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.UpnpMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.transport.spi.StreamClient; -import org.seamless.http.Headers; -import org.seamless.util.Exceptions; -import org.seamless.util.URIUtil; -import org.seamless.util.io.IO; - -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.ProtocolException; -import java.net.SocketTimeoutException; -import java.net.URL; -import java.net.URLStreamHandlerFactory; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Default implementation based on the JDK's HttpURLConnection. - *

- * This class works around a serious design issue in the SUN JDK, so it will not work on any JDK that - * doesn't offer the sun.net.www.protocol.http.HttpURLConnection implementation. - *

- *

- * This implementation DOES NOT WORK on Android. Read the Cling manual for - * alternatives for Android. - *

- *

- * This implementation DOES NOT support Cling's server-side heartbeat for connection checking. - * Any data returned by a server has to be "valid HTTP", checked in Sun's HttpClient with: - *

- * {@code ret = b[0] == 'H' && b[1] == 'T' && b[2] == 'T' && b[3] == 'P' && b[4] == '/' && b[5] == '1' && b[6] == '.';} - *

- * Hence, if you are using this client, don't call Cling's - * {@link org.fourthline.cling.model.profile.RemoteClientInfo#isRequestCancelled()} function on your - * server to send a heartbeat to the client! - *

- * - * @author Christian Bauer - */ -public class StreamClientImpl implements StreamClient { - - final static String HACK_STREAM_HANDLER_SYSTEM_PROPERTY = "hackStreamHandlerProperty"; - - final private static Logger log = Logger.getLogger(StreamClient.class.getName()); - - final protected StreamClientConfigurationImpl configuration; - - public StreamClientImpl(StreamClientConfigurationImpl configuration) throws InitializationException { - this.configuration = configuration; - - if (ModelUtil.ANDROID_EMULATOR || ModelUtil.ANDROID_RUNTIME) { - /* - See the fantastic PERMITTED_USER_METHODS here: - - https://android.googlesource.com/platform/libcore/+/android-4.0.1_r1.2/luni/src/main/java/java/net/HttpURLConnection.java - - We'd have to basically copy the whole Android code, and have a dependency on - libcore.*, and do much more hacking to allow more HTTP methods. This is the same - problem we are hacking below for the JDK but at least there we don't have a - dependency issue for compiling Cling. These guys all suck, there is no list - of "permitted" HTTP methods. HttpURLConnection and the whole stream handler - factory stuff is the worst Java API ever created. - */ - throw new InitializationException( - "This client does not work on Android. The design of HttpURLConnection is broken, we " - + "can not add additional 'permitted' HTTP methods. Read the Cling manual." - ); - } - - log.fine("Using persistent HTTP stream client connections: " + configuration.isUsePersistentConnections()); - System.setProperty("http.keepAlive", Boolean.toString(configuration.isUsePersistentConnections())); - - // Hack the environment to allow additional HTTP methods - if (System.getProperty(HACK_STREAM_HANDLER_SYSTEM_PROPERTY) == null) { - log.fine("Setting custom static URLStreamHandlerFactory to work around bad JDK defaults"); - try { - // Use reflection to avoid dependency on sun.net package so this class at least - // loads on Android, even if it doesn't work... - URL.setURLStreamHandlerFactory( - (URLStreamHandlerFactory) Class.forName( - "org.fourthline.cling.transport.impl.FixedSunURLStreamHandler" - ).newInstance() - ); - } catch (Throwable t) { - throw new InitializationException( - "Failed to set modified URLStreamHandlerFactory in this environment." - + " Can't use bundled default client based on HTTPURLConnection, see manual." - ); - } - System.setProperty(HACK_STREAM_HANDLER_SYSTEM_PROPERTY, "alreadyWorkedAroundTheEvilJDK"); - } - } - - @Override - public StreamClientConfigurationImpl getConfiguration() { - return configuration; - } - - @Override - public StreamResponseMessage sendRequest(StreamRequestMessage requestMessage) { - - final UpnpRequest requestOperation = requestMessage.getOperation(); - log.fine("Preparing HTTP request message with method '" + requestOperation.getHttpMethodName() + "': " + requestMessage); - - URL url = URIUtil.toURL(requestOperation.getURI()); - - HttpURLConnection urlConnection = null; - InputStream inputStream; - try { - - urlConnection = (HttpURLConnection) url.openConnection(); - - urlConnection.setRequestMethod(requestOperation.getHttpMethodName()); - - // Use the built-in expiration, we can't cancel HttpURLConnection - urlConnection.setReadTimeout(configuration.getTimeoutSeconds() * 1000); - urlConnection.setConnectTimeout(configuration.getTimeoutSeconds() * 1000); - - applyRequestProperties(urlConnection, requestMessage); - applyRequestBody(urlConnection, requestMessage); - - log.fine("Sending HTTP request: " + requestMessage); - inputStream = urlConnection.getInputStream(); - return createResponse(urlConnection, inputStream); - - } catch (ProtocolException ex) { - log.log(Level.WARNING, "HTTP request failed: " + requestMessage, Exceptions.unwrap(ex)); - return null; - } catch (IOException ex) { - - if (urlConnection == null) { - log.log(Level.WARNING, "HTTP request failed: " + requestMessage, Exceptions.unwrap(ex)); - return null; - } - - if (ex instanceof SocketTimeoutException) { - log.info( - "Timeout of " + getConfiguration().getTimeoutSeconds() - + " seconds while waiting for HTTP request to complete, aborting: " + requestMessage - ); - return null; - } - - if (log.isLoggable(Level.FINE)) - log.fine("Exception occurred, trying to read the error stream: " + Exceptions.unwrap(ex)); - try { - inputStream = urlConnection.getErrorStream(); - return createResponse(urlConnection, inputStream); - } catch (Exception errorEx) { - if (log.isLoggable(Level.FINE)) - log.fine("Could not read error stream: " + errorEx); - return null; - } - } catch (Exception ex) { - log.log(Level.WARNING, "HTTP request failed: " + requestMessage, Exceptions.unwrap(ex)); - return null; - - } finally { - - if (urlConnection != null) { - // Release any idle persistent connection, or "indicate that we don't want to use this server for a while" - urlConnection.disconnect(); - } - } - } - - @Override - public void stop() { - // NOOP - } - - protected void applyRequestProperties(HttpURLConnection urlConnection, StreamRequestMessage requestMessage) { - - urlConnection.setInstanceFollowRedirects(false); // Defaults to true but not needed here - - // HttpURLConnection always adds a "Host" header - - // HttpURLConnection always adds an "Accept" header (not needed but shouldn't hurt) - - // Add the default user agent if not already set on the message - if (!requestMessage.getHeaders().containsKey(UpnpHeader.Type.USER_AGENT)) { - urlConnection.setRequestProperty( - UpnpHeader.Type.USER_AGENT.getHttpName(), - getConfiguration().getUserAgentValue(requestMessage.getUdaMajorVersion(), requestMessage.getUdaMinorVersion()) - ); - } - - // Other headers - applyHeaders(urlConnection, requestMessage.getHeaders()); - } - - protected void applyHeaders(HttpURLConnection urlConnection, Headers headers) { - log.fine("Writing headers on HttpURLConnection: " + headers.size()); - for (Map.Entry> entry : headers.entrySet()) { - for (String v : entry.getValue()) { - String headerName = entry.getKey(); - log.fine("Setting header '" + headerName + "': " + v); - urlConnection.setRequestProperty(headerName, v); - } - } - } - - protected void applyRequestBody(HttpURLConnection urlConnection, StreamRequestMessage requestMessage) throws IOException { - - if (requestMessage.hasBody()) { - urlConnection.setDoOutput(true); - } else { - urlConnection.setDoOutput(false); - return; - } - - if (requestMessage.getBodyType().equals(UpnpMessage.BodyType.STRING)) { - IO.writeUTF8(urlConnection.getOutputStream(), requestMessage.getBodyString()); - } else if (requestMessage.getBodyType().equals(UpnpMessage.BodyType.BYTES)) { - IO.writeBytes(urlConnection.getOutputStream(), requestMessage.getBodyBytes()); - } - urlConnection.getOutputStream().flush(); - } - - protected StreamResponseMessage createResponse(HttpURLConnection urlConnection, InputStream inputStream) throws Exception { - - if (urlConnection.getResponseCode() == -1) { - log.warning("Received an invalid HTTP response: " + urlConnection.getURL()); - log.warning("Is your Cling-based server sending connection heartbeats with " + - "RemoteClientInfo#isRequestCancelled? This client can't handle " + - "heartbeats, read the manual."); - return null; - } - - // Status - UpnpResponse responseOperation = new UpnpResponse(urlConnection.getResponseCode(), urlConnection.getResponseMessage()); - - log.fine("Received response: " + responseOperation); - - // Message - StreamResponseMessage responseMessage = new StreamResponseMessage(responseOperation); - - // Headers - responseMessage.setHeaders(new UpnpHeaders(urlConnection.getHeaderFields())); - - // Body - byte[] bodyBytes = null; - InputStream is = null; - try { - is = inputStream; - if (inputStream != null) bodyBytes = IO.readBytes(is); - } finally { - if (is != null) - is.close(); - } - - if (bodyBytes != null && bodyBytes.length > 0 && responseMessage.isContentTypeMissingOrText()) { - - log.fine("Response contains textual entity body, converting then setting string on message"); - responseMessage.setBodyCharacters(bodyBytes); - - } else if (bodyBytes != null && bodyBytes.length > 0) { - - log.fine("Response contains binary entity body, setting bytes on message"); - responseMessage.setBody(UpnpMessage.BodyType.BYTES, bodyBytes); - - } else { - log.fine("Response did not contain entity body"); - } - - log.fine("Response message complete: " + responseMessage); - return responseMessage; - } - -} - - diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/StreamServerConfigurationImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/StreamServerConfigurationImpl.java deleted file mode 100644 index 7866467..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/StreamServerConfigurationImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import org.fourthline.cling.transport.spi.StreamServerConfiguration; - -/** - * Settings for the default implementation. - * - * @author Christian Bauer - */ -public class StreamServerConfigurationImpl implements StreamServerConfiguration { - - private int listenPort; - private int tcpConnectionBacklog; - - /** - * Defaults to port '0', ephemeral. - */ - public StreamServerConfigurationImpl() { - } - - public StreamServerConfigurationImpl(int listenPort) { - this.listenPort = listenPort; - } - - public int getListenPort() { - return listenPort; - } - - public void setListenPort(int listenPort) { - this.listenPort = listenPort; - } - - /** - * @return Maximum number of queued incoming connections to allow on the listening socket, - * default is system default. - */ - public int getTcpConnectionBacklog() { - return tcpConnectionBacklog; - } - - public void setTcpConnectionBacklog(int tcpConnectionBacklog) { - this.tcpConnectionBacklog = tcpConnectionBacklog; - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/StreamServerImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/StreamServerImpl.java deleted file mode 100644 index 5ef09a6..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/StreamServerImpl.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl; - -import com.sun.net.httpserver.HttpExchange; -import com.sun.net.httpserver.HttpHandler; -import com.sun.net.httpserver.HttpServer; -import org.fourthline.cling.model.message.Connection; -import org.fourthline.cling.transport.Router; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.transport.spi.StreamServer; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.util.logging.Logger; - -/** - * Implementation based on the built-in SUN JDK 6.0 HTTP Server. - *

- * See the - * documentation of the SUN JDK 6.0 HTTP Server. - *

- *

- * This implementation DOES NOT WORK on Android. Read the Cling manual for - * alternatives for Android. - *

- *

- * This implementation does not support connection alive checking, as we can't send - * heartbeats to the client. We don't have access to the raw socket with the Sun API. - *

- * - * @author Christian Bauer - */ -public class StreamServerImpl implements StreamServer { - - private static Logger log = Logger.getLogger(StreamServer.class.getName()); - - final protected StreamServerConfigurationImpl configuration; - protected HttpServer server; - - public StreamServerImpl(StreamServerConfigurationImpl configuration) { - this.configuration = configuration; - } - - synchronized public void init(InetAddress bindAddress, Router router) throws InitializationException { - try { - InetSocketAddress socketAddress = new InetSocketAddress(bindAddress, configuration.getListenPort()); - - server = HttpServer.create(socketAddress, configuration.getTcpConnectionBacklog()); - server.createContext("/", new RequestHttpHandler(router)); - - log.info("Created server (for receiving TCP streams) on: " + server.getAddress()); - - } catch (Exception ex) { - throw new InitializationException("Could not initialize " + getClass().getSimpleName() + ": " + ex.toString(), ex); - } - } - - synchronized public int getPort() { - return server.getAddress().getPort(); - } - - public StreamServerConfigurationImpl getConfiguration() { - return configuration; - } - - synchronized public void run() { - log.fine("Starting StreamServer..."); - // Starts a new thread but inherits the properties of the calling thread - server.start(); - } - - synchronized public void stop() { - log.fine("Stopping StreamServer..."); - if (server != null) server.stop(1); - } - - protected class RequestHttpHandler implements HttpHandler { - - private final Router router; - - public RequestHttpHandler(Router router) { - this.router = router; - } - - // This is executed in the request receiving thread! - public void handle(final HttpExchange httpExchange) throws IOException { - // And we pass control to the service, which will (hopefully) start a new thread immediately so we can - // continue the receiving thread ASAP - log.fine("Received HTTP exchange: " + httpExchange.getRequestMethod() + " " + httpExchange.getRequestURI()); - router.received( - new HttpExchangeUpnpStream(router.getProtocolFactory(), httpExchange) { - @Override - protected Connection createConnection() { - return new HttpServerConnection(httpExchange); - } - } - ); - } - } - - /** - * Logs a warning and returns true, we can't access the socket using the awful JDK webserver API. - *

- * Override this method if you know how to do it. - *

- */ - protected boolean isConnectionOpen(HttpExchange exchange) { - log.warning("Can't check client connection, socket access impossible on JDK webserver!"); - return true; - } - - protected class HttpServerConnection implements Connection { - - protected HttpExchange exchange; - - public HttpServerConnection(HttpExchange exchange) { - this.exchange = exchange; - } - - @Override - public boolean isOpen() { - return isConnectionOpen(exchange); - } - - @Override - public InetAddress getRemoteAddress() { - return exchange.getRemoteAddress() != null - ? exchange.getRemoteAddress().getAddress() - : null; - } - - @Override - public InetAddress getLocalAddress() { - return exchange.getLocalAddress() != null - ? exchange.getLocalAddress().getAddress() - : null; - } - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/apache/HeaderUtil.java b/app/src/main/java/org/fourthline/cling/transport/impl/apache/HeaderUtil.java deleted file mode 100644 index 6b27e16..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/apache/HeaderUtil.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl.apache; - -import org.apache.http.Header; -import org.apache.http.HttpMessage; -import org.seamless.http.Headers; - -import java.util.List; -import java.util.Map; - -/** - * Converts from/to Apache HTTP Components header format. - * - * @author Christian Bauer - */ -public class HeaderUtil { - - public static void add(HttpMessage httpMessage, Headers headers) { - for (Map.Entry> entry : headers.entrySet()) { - for (String value : entry.getValue()) { - httpMessage.addHeader(entry.getKey(), value); - } - } - } - - public static Headers get(HttpMessage httpMessage) { - Headers headers = new Headers(); - for (Header header : httpMessage.getAllHeaders()) { - headers.add(header.getName(), header.getValue()); - } - return headers; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/apache/HttpServerConnectionUpnpStream.java b/app/src/main/java/org/fourthline/cling/transport/impl/apache/HttpServerConnectionUpnpStream.java deleted file mode 100644 index dcc271e..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/apache/HttpServerConnectionUpnpStream.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl.apache; - -import org.apache.http.ConnectionClosedException; -import org.apache.http.ConnectionReuseStrategy; -import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; -import org.apache.http.HttpException; -import org.apache.http.HttpRequest; -import org.apache.http.HttpResponse; -import org.apache.http.HttpResponseFactory; -import org.apache.http.HttpServerConnection; -import org.apache.http.HttpStatus; -import org.apache.http.MethodNotSupportedException; -import org.apache.http.ProtocolVersion; -import org.apache.http.entity.ByteArrayEntity; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.DefaultConnectionReuseStrategy; -import org.apache.http.impl.DefaultHttpResponseFactory; -import org.apache.http.message.BasicStatusLine; -import org.apache.http.params.BasicHttpParams; -import org.apache.http.params.DefaultedHttpParams; -import org.apache.http.params.HttpParams; -import org.apache.http.protocol.BasicHttpContext; -import org.apache.http.protocol.BasicHttpProcessor; -import org.apache.http.protocol.HttpContext; -import org.apache.http.protocol.HttpProcessor; -import org.apache.http.protocol.HttpService; -import org.apache.http.protocol.ResponseConnControl; -import org.apache.http.protocol.ResponseContent; -import org.apache.http.protocol.ResponseDate; -import org.apache.http.util.EntityUtils; -import org.fourthline.cling.model.message.Connection; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.UpnpMessage; -import org.fourthline.cling.model.message.UpnpOperation; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.model.UnsupportedDataException; -import org.fourthline.cling.transport.spi.UpnpStream; -import org.seamless.util.Exceptions; - -import java.io.IOException; -import java.net.SocketTimeoutException; -import java.net.URI; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Implementation for Apache HTTP Components API. - * - * @author Christian Bauer - */ -public abstract class HttpServerConnectionUpnpStream extends UpnpStream { - - final private static Logger log = Logger.getLogger(UpnpStream.class.getName()); - - protected final HttpServerConnection connection; - protected final BasicHttpProcessor httpProcessor = new BasicHttpProcessor(); - protected final HttpService httpService; - protected final HttpParams params; - - protected HttpServerConnectionUpnpStream(ProtocolFactory protocolFactory, - HttpServerConnection connection, - final HttpParams params) { - super(protocolFactory); - this.connection = connection; - this.params = params; - - // The Date header is recommended in UDA, need to document the requirement in StreamServer interface? - httpProcessor.addInterceptor(new ResponseDate()); - - // The Server header is only required for Control so callers have to add it to UPnPMessage - // httpProcessor.addInterceptor(new ResponseServer()); - - httpProcessor.addInterceptor(new ResponseContent()); - httpProcessor.addInterceptor(new ResponseConnControl()); - - httpService = - new UpnpHttpService( - httpProcessor, - new DefaultConnectionReuseStrategy(), - new DefaultHttpResponseFactory() - ); - httpService.setParams(params); - } - - public HttpServerConnection getConnection() { - return connection; - } - - public void run() { - - try { - while (!Thread.interrupted() && connection.isOpen()) { - log.fine("Handling request on open connection..."); - HttpContext context = new BasicHttpContext(null); - httpService.handleRequest(connection, context); - } - } catch (ConnectionClosedException ex) { - log.fine("Client closed connection"); - responseException(ex); - } catch (SocketTimeoutException ex) { - log.fine("Server-side closed socket (this is 'normal' behavior of Apache HTTP Core!): " + ex.getMessage()); - } catch (IOException ex) { - log.warning("I/O exception during HTTP request processing: " + ex.getMessage()); - responseException(ex); - } catch (HttpException ex) { - throw new UnsupportedDataException("Request malformed: " + ex.getMessage(), ex); - } finally { - try { - connection.shutdown(); - } catch (IOException ex) { - log.fine("Error closing connection: " + ex.getMessage()); - } - } - } - - /** - * A thread-safe custom service implementation that creates a UPnP message from the request, - * then passes it to UpnpStream#process(), finally sends the response back to the - * client. - */ - protected class UpnpHttpService extends HttpService { - - public UpnpHttpService(HttpProcessor processor, ConnectionReuseStrategy reuse, HttpResponseFactory responseFactory) { - super(processor, reuse, responseFactory); - } - - @Override - protected void doService(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext ctx) - throws HttpException, IOException { - - log.fine("Processing HTTP request: " + httpRequest.getRequestLine().toString()); - - // Extract what we need from the HTTP httpRequest - String requestMethod = httpRequest.getRequestLine().getMethod(); - String requestURI = httpRequest.getRequestLine().getUri(); - - StreamRequestMessage requestMessage; - try { - requestMessage = - new StreamRequestMessage( - UpnpRequest.Method.getByHttpName(requestMethod), - URI.create(requestURI) - ); - } catch(IllegalArgumentException e) { - String msg = "Invalid request URI: " + requestURI + ": " + e.getMessage(); - log.warning(msg); - throw new HttpException(msg, e); - } - - if (requestMessage.getOperation().getMethod().equals(UpnpRequest.Method.UNKNOWN)) { - log.fine("Method not supported by UPnP stack: " + requestMethod); - throw new MethodNotSupportedException("Method not supported: " + requestMethod); - } - - log.fine("Created new request message: " + requestMessage); - - // HTTP version - int requestHttpMinorVersion = httpRequest.getProtocolVersion().getMinor(); - requestMessage.getOperation().setHttpMinorVersion(requestHttpMinorVersion); - - // Connection wrapper - requestMessage.setConnection(createConnection()); - - // Headers - requestMessage.setHeaders(new UpnpHeaders(HeaderUtil.get(httpRequest))); - - // Body - if (httpRequest instanceof HttpEntityEnclosingRequest) { - log.fine("Request contains entity body, setting on UPnP message"); - - HttpEntityEnclosingRequest entityEnclosingHttpRequest = (HttpEntityEnclosingRequest) httpRequest; - - HttpEntity entity = entityEnclosingHttpRequest.getEntity(); - - if (requestMessage.isContentTypeMissingOrText()) { - log.fine("HTTP request message contains text entity"); - requestMessage.setBody(UpnpMessage.BodyType.STRING, EntityUtils.toString(entity)); - } else { - log.fine("HTTP request message contains binary entity"); - requestMessage.setBody(UpnpMessage.BodyType.BYTES, EntityUtils.toByteArray(entity)); - } - - - } else { - log.fine("Request did not contain entity body"); - } - - // Finally process it - StreamResponseMessage responseMsg; - try { - responseMsg = process(requestMessage); - } catch (RuntimeException ex) { - log.fine("Exception occurred during UPnP stream processing: " + ex); - if (log.isLoggable(Level.FINE)) { - log.log(Level.FINE, "Cause: " + Exceptions.unwrap(ex), Exceptions.unwrap(ex)); - } - - log.fine("Sending HTTP response: " + HttpStatus.SC_INTERNAL_SERVER_ERROR); - httpResponse.setStatusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR); - - responseException(ex); - return; - } - - if (responseMsg != null) { - log.fine("Sending HTTP response message: " + responseMsg); - - // Status line - httpResponse.setStatusLine( - new BasicStatusLine( - new ProtocolVersion("HTTP", 1, responseMsg.getOperation().getHttpMinorVersion()), - responseMsg.getOperation().getStatusCode(), - responseMsg.getOperation().getStatusMessage() - ) - ); - - log.fine("Response status line: " + httpResponse.getStatusLine()); - - // Headers - httpResponse.setParams(getResponseParams(requestMessage.getOperation())); - HeaderUtil.add(httpResponse, responseMsg.getHeaders()); - - // Entity - if (responseMsg.hasBody() && responseMsg.getBodyType().equals(UpnpMessage.BodyType.BYTES)) { - httpResponse.setEntity(new ByteArrayEntity(responseMsg.getBodyBytes())); - } else if (responseMsg.hasBody() && responseMsg.getBodyType().equals(UpnpMessage.BodyType.STRING)) { - StringEntity responseEntity = new StringEntity(responseMsg.getBodyString(), "UTF-8"); - httpResponse.setEntity(responseEntity); - } - - } else { - // If it's null, it's 404, everything else needs a proper httpResponse - log.fine("Sending HTTP response: " + HttpStatus.SC_NOT_FOUND); - httpResponse.setStatusCode(HttpStatus.SC_NOT_FOUND); - } - - responseSent(responseMsg); - } - - protected HttpParams getResponseParams(UpnpOperation operation) { - HttpParams localParams = new BasicHttpParams(); - return new DefaultedHttpParams(localParams, params); - } - - } - - abstract protected Connection createConnection(); - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamClientConfigurationImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamClientConfigurationImpl.java deleted file mode 100644 index 86dd8e8..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamClientConfigurationImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl.apache; - -import org.fourthline.cling.transport.spi.AbstractStreamClientConfiguration; - -import java.util.concurrent.ExecutorService; - -/** - * Settings for the Apache HTTP Components implementation. - * - * @author Christian Bauer - */ -public class StreamClientConfigurationImpl extends AbstractStreamClientConfiguration { - - protected int maxTotalConnections = 1024; - protected int maxTotalPerRoute = 100; - protected String contentCharset = "UTF-8"; // UDA spec says it's always UTF-8 entity content - - public StreamClientConfigurationImpl(ExecutorService timeoutExecutorService) { - super(timeoutExecutorService); - } - - public StreamClientConfigurationImpl(ExecutorService timeoutExecutorService, int timeoutSeconds) { - super(timeoutExecutorService, timeoutSeconds); - } - - /** - * Defaults to 1024. - */ - public int getMaxTotalConnections() { - return maxTotalConnections; - } - - public void setMaxTotalConnections(int maxTotalConnections) { - this.maxTotalConnections = maxTotalConnections; - } - - /** - * Defaults to 100. - */ - public int getMaxTotalPerRoute() { - return maxTotalPerRoute; - } - - public void setMaxTotalPerRoute(int maxTotalPerRoute) { - this.maxTotalPerRoute = maxTotalPerRoute; - } - - /** - * @return Character set of textual content, defaults to "UTF-8". - */ - public String getContentCharset() { - return contentCharset; - } - - public void setContentCharset(String contentCharset) { - this.contentCharset = contentCharset; - } - - /** - *

- * Returning -1 will also avoid OOM on the HTC Thunderbolt where default size is 2MB (!): - * http://stackoverflow.com/questions/5358014/android-httpclient-oom-on-4g-lte-htc-thunderbolt - *

- * @return By default -1, enabling HttpClient's default (8192 bytes in version 4.1) - */ - public int getSocketBufferSize() { - return -1; - } - - /** - * @return Whether we should (expensively) check for stale connections, defaults to false. - */ - public boolean getStaleCheckingEnabled() { - return false; - } - - /** - * @return By default 0, use -1 to enable HttpClient's default (3 retries in version 4.1) - */ - public int getRequestRetryCount() { - return 0; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamClientImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamClientImpl.java deleted file mode 100644 index 0741016..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamClientImpl.java +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl.apache; - -import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; -import org.apache.http.HttpResponse; -import org.apache.http.HttpVersion; -import org.apache.http.StatusLine; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.conn.scheme.PlainSocketFactory; -import org.apache.http.conn.scheme.Scheme; -import org.apache.http.conn.scheme.SchemeRegistry; -import org.apache.http.entity.ByteArrayEntity; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; -import org.apache.http.impl.conn.PoolingClientConnectionManager; -import org.apache.http.params.BasicHttpParams; -import org.apache.http.params.CoreProtocolPNames; -import org.apache.http.params.DefaultedHttpParams; -import org.apache.http.params.HttpConnectionParams; -import org.apache.http.params.HttpParams; -import org.apache.http.params.HttpProtocolParams; -import org.apache.http.util.EntityUtils; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.UpnpMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.transport.spi.AbstractStreamClient; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.transport.spi.StreamClient; - -import java.io.IOException; -import java.util.concurrent.Callable; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Implementation based on Apache HTTP Components 4.2. - *

- * This implementation DOES NOT WORK on Android. Read the Cling manual for - * alternatives on Android. - *

- * - * @author Christian Bauer - */ -public class StreamClientImpl extends AbstractStreamClient { - - final private static Logger log = Logger.getLogger(StreamClient.class.getName()); - - final protected StreamClientConfigurationImpl configuration; - final protected PoolingClientConnectionManager clientConnectionManager; - final protected DefaultHttpClient httpClient; - final protected HttpParams globalParams = new BasicHttpParams(); - - public StreamClientImpl(StreamClientConfigurationImpl configuration) throws InitializationException { - this.configuration = configuration; - - HttpProtocolParams.setContentCharset(globalParams, getConfiguration().getContentCharset()); - HttpProtocolParams.setUseExpectContinue(globalParams, false); - - // These are some safety settings, we should never run into these timeouts as we - // do our own expiration checking - HttpConnectionParams.setConnectionTimeout(globalParams, (getConfiguration().getTimeoutSeconds()+5) * 1000); - HttpConnectionParams.setSoTimeout(globalParams, (getConfiguration().getTimeoutSeconds()+5) * 1000); - - HttpConnectionParams.setStaleCheckingEnabled(globalParams, getConfiguration().getStaleCheckingEnabled()); - if (getConfiguration().getSocketBufferSize() != -1) - HttpConnectionParams.setSocketBufferSize(globalParams, getConfiguration().getSocketBufferSize()); - - // Only register 80, not 443 and SSL - SchemeRegistry registry = new SchemeRegistry(); - registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); - - clientConnectionManager = new PoolingClientConnectionManager(registry); - clientConnectionManager.setMaxTotal(getConfiguration().getMaxTotalConnections()); - clientConnectionManager.setDefaultMaxPerRoute(getConfiguration().getMaxTotalPerRoute()); - - httpClient = new DefaultHttpClient(clientConnectionManager, globalParams); - if (getConfiguration().getRequestRetryCount() != -1) { - httpClient.setHttpRequestRetryHandler( - new DefaultHttpRequestRetryHandler(getConfiguration().getRequestRetryCount(), false) - ); - } - } - - @Override - public StreamClientConfigurationImpl getConfiguration() { - return configuration; - } - - - @Override - protected HttpUriRequest createRequest(StreamRequestMessage requestMessage) { - UpnpRequest requestOperation = requestMessage.getOperation(); - HttpUriRequest request; - switch (requestOperation.getMethod()) { - case GET: - request = new HttpGet(requestOperation.getURI()); - break; - case SUBSCRIBE: - request = new HttpGet(requestOperation.getURI()) { - @Override - public String getMethod() { - return UpnpRequest.Method.SUBSCRIBE.getHttpName(); - } - }; - break; - case UNSUBSCRIBE: - request = new HttpGet(requestOperation.getURI()) { - @Override - public String getMethod() { - return UpnpRequest.Method.UNSUBSCRIBE.getHttpName(); - } - }; - break; - case POST: - HttpEntityEnclosingRequest post = new HttpPost(requestOperation.getURI()); - post.setEntity(createHttpRequestEntity(requestMessage)); - request = (HttpUriRequest) post; // Fantastic API - break; - case NOTIFY: - HttpEntityEnclosingRequest notify = new HttpPost(requestOperation.getURI()) { - @Override - public String getMethod() { - return UpnpRequest.Method.NOTIFY.getHttpName(); - } - }; - notify.setEntity(createHttpRequestEntity(requestMessage)); - request = (HttpUriRequest) notify; // Fantastic API - break; - default: - throw new RuntimeException("Unknown HTTP method: " + requestOperation.getHttpMethodName()); - } - - // Headers - request.setParams(getRequestParams(requestMessage)); - HeaderUtil.add(request, requestMessage.getHeaders()); - - return request; - } - - @Override - protected Callable createCallable(final StreamRequestMessage requestMessage, - final HttpUriRequest request) { - return new Callable() { - public StreamResponseMessage call() throws Exception { - - if (log.isLoggable(Level.FINE)) - log.fine("Sending HTTP request: " + requestMessage); - - return httpClient.execute(request, createResponseHandler()); - } - }; - } - - @Override - protected void abort(HttpUriRequest request) { - request.abort(); - } - - @Override - protected boolean logExecutionException(Throwable t) { - if (t instanceof IllegalStateException) { - // TODO: Document when/why this happens and why we can ignore it, violating the - // logging rules of the StreamClient#sendRequest() method - if (log.isLoggable(Level.FINE)) - log.fine("Illegal state: " + t.getMessage()); - return true; - } - return false; - } - - @Override - public void stop() { - if (log.isLoggable(Level.FINE)) - log.fine("Shutting down HTTP client connection manager/pool"); - clientConnectionManager.shutdown(); - } - - protected HttpEntity createHttpRequestEntity(UpnpMessage upnpMessage) { - if (upnpMessage.getBodyType().equals(UpnpMessage.BodyType.BYTES)) { - if (log.isLoggable(Level.FINE)) - log.fine("Preparing HTTP request entity as byte[]"); - return new ByteArrayEntity(upnpMessage.getBodyBytes()); - } else { - if (log.isLoggable(Level.FINE)) - log.fine("Preparing HTTP request entity as string"); - try { - String charset = upnpMessage.getContentTypeCharset(); - return new StringEntity(upnpMessage.getBodyString(), charset != null ? charset : "UTF-8"); - } catch (Exception ex) { - // WTF else am I supposed to do with this exception? - throw new RuntimeException(ex); - } - } - } - - protected ResponseHandler createResponseHandler() { - return new ResponseHandler() { - public StreamResponseMessage handleResponse(final HttpResponse httpResponse) throws IOException { - - StatusLine statusLine = httpResponse.getStatusLine(); - if (log.isLoggable(Level.FINE)) - log.fine("Received HTTP response: " + statusLine); - - // Status - UpnpResponse responseOperation = - new UpnpResponse(statusLine.getStatusCode(), statusLine.getReasonPhrase()); - - // Message - StreamResponseMessage responseMessage = new StreamResponseMessage(responseOperation); - - // Headers - responseMessage.setHeaders(new UpnpHeaders(HeaderUtil.get(httpResponse))); - - // Body - HttpEntity entity = httpResponse.getEntity(); - if (entity == null || entity.getContentLength() == 0) return responseMessage; - - if (responseMessage.isContentTypeMissingOrText()) { - if (log.isLoggable(Level.FINE)) - log.fine("HTTP response message contains text entity"); - responseMessage.setBody(UpnpMessage.BodyType.STRING, EntityUtils.toString(entity)); - } else { - if (log.isLoggable(Level.FINE)) - log.fine("HTTP response message contains binary entity"); - responseMessage.setBody(UpnpMessage.BodyType.BYTES, EntityUtils.toByteArray(entity)); - } - - return responseMessage; - } - }; - } - - protected HttpParams getRequestParams(StreamRequestMessage requestMessage) { - HttpParams localParams = new BasicHttpParams(); - - localParams.setParameter( - CoreProtocolPNames.PROTOCOL_VERSION, - requestMessage.getOperation().getHttpMinorVersion() == 0 ? HttpVersion.HTTP_1_0 : HttpVersion.HTTP_1_1 - ); - - // DefaultHttpClient adds HOST header automatically in its default processor - - // Add the default user agent if not already set on the message - if (!requestMessage.getHeaders().containsKey(UpnpHeader.Type.USER_AGENT)) { - HttpProtocolParams.setUserAgent( - localParams, - getConfiguration().getUserAgentValue(requestMessage.getUdaMajorVersion(), requestMessage.getUdaMinorVersion()) - ); - } - - return new DefaultedHttpParams(localParams, globalParams); - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamServerConfigurationImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamServerConfigurationImpl.java deleted file mode 100644 index 0c19179..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamServerConfigurationImpl.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl.apache; - -import org.fourthline.cling.transport.spi.StreamServerConfiguration; - -/** - * Settings for the Apache HTTP Components implementation. - * - * @author Christian Bauer - */ -public class StreamServerConfigurationImpl implements StreamServerConfiguration { - - private int listenPort = 0; - private int dataWaitTimeoutSeconds = 5; - private int bufferSizeKilobytes = 8; - // TODO: This seems to be only relevant for HTTP clients, no? - private boolean staleConnectionCheck = true; - private boolean tcpNoDelay = true; - private int tcpConnectionBacklog = 0; - - /** - * Defaults to port '0', ephemeral. - */ - public StreamServerConfigurationImpl() { - } - - public StreamServerConfigurationImpl(int listenPort) { - this.listenPort = listenPort; - } - - public int getListenPort() { - return listenPort; - } - - public void setListenPort(int listenPort) { - this.listenPort = listenPort; - } - - /** - * Defines the socket timeout (SO_TIMEOUT) in seconds, which is the timeout for waiting - * for data. Defaults to 5 seconds. - */ - public int getDataWaitTimeoutSeconds() { - return dataWaitTimeoutSeconds; - } - - public void setDataWaitTimeoutSeconds(int dataWaitTimeoutSeconds) { - this.dataWaitTimeoutSeconds = dataWaitTimeoutSeconds; - } - - /** - * Determines the size of the internal socket buffer used to buffer data while - * receiving/transmitting HTTP messages. Defaults to 8 kilobytes. - */ - public int getBufferSizeKilobytes() { - return bufferSizeKilobytes; - } - - public void setBufferSizeKilobytes(int bufferSizeKilobytes) { - this.bufferSizeKilobytes = bufferSizeKilobytes; - } - - /** - * Determines whether stale connection check is to be used. Disabling stale connection - * check may result in slight performance improvement at the risk of getting an I/O - * error when executing a request over a connection that has been closed at the server - * side. Defaults to true. - */ - public boolean isStaleConnectionCheck() { - return staleConnectionCheck; - } - - public void setStaleConnectionCheck(boolean staleConnectionCheck) { - this.staleConnectionCheck = staleConnectionCheck; - } - - /** - * Determines whether Nagle's algorithm is to be used. Defaults to true. - */ - public boolean isTcpNoDelay() { - return tcpNoDelay; - } - - public void setTcpNoDelay(boolean tcpNoDelay) { - this.tcpNoDelay = tcpNoDelay; - } - - /** - * This is the maximum number of queued incoming connections to allow on the listening socket. - * Queued TCP connections exceeding this limit may be rejected by the TCP implementation. - * @return The number of queued connections, defaults to system default. - */ - public int getTcpConnectionBacklog() { - return tcpConnectionBacklog; - } - - public void setTcpConnectionBacklog(int tcpConnectionBacklog) { - this.tcpConnectionBacklog = tcpConnectionBacklog; - } - - - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamServerImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamServerImpl.java deleted file mode 100644 index f74cdbd..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/apache/StreamServerImpl.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl.apache; - -import org.apache.http.HttpRequestFactory; -import org.apache.http.impl.DefaultHttpServerConnection; -import org.apache.http.params.BasicHttpParams; -import org.apache.http.params.CoreConnectionPNames; -import org.apache.http.params.HttpParams; -import org.fourthline.cling.model.message.Connection; -import org.fourthline.cling.transport.Router; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.transport.spi.StreamServer; -import org.fourthline.cling.transport.spi.UpnpStream; - -import java.io.IOException; -import java.io.InterruptedIOException; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.SocketException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Implementation based on Apache HTTP Components 4.2. - *

- * This implementation DOES NOT WORK on Android. Read the Cling manual for - * alternatives on Android. - *

- * - * @author Christian Bauer - */ -public class StreamServerImpl implements StreamServer { - - final private static Logger log = Logger.getLogger(StreamServer.class.getName()); - - final protected StreamServerConfigurationImpl configuration; - - protected Router router; - protected ServerSocket serverSocket; - protected HttpParams globalParams = new BasicHttpParams(); - private volatile boolean stopped = false; - - public StreamServerImpl(StreamServerConfigurationImpl configuration) { - this.configuration = configuration; - } - - public StreamServerConfigurationImpl getConfiguration() { - return configuration; - } - - synchronized public void init(InetAddress bindAddress, Router router) throws InitializationException { - - try { - - this.router = router; - - this.serverSocket = - new ServerSocket( - configuration.getListenPort(), - configuration.getTcpConnectionBacklog(), - bindAddress - ); - - log.info("Created socket (for receiving TCP streams) on: " + serverSocket.getLocalSocketAddress()); - - this.globalParams - .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, configuration.getDataWaitTimeoutSeconds() * 1000) - .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, configuration.getBufferSizeKilobytes() * 1024) - .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, configuration.isStaleConnectionCheck()) - .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, configuration.isTcpNoDelay()); - - } catch (Exception ex) { - throw new InitializationException("Could not initialize "+getClass().getSimpleName()+": " + ex.toString(), ex); - } - - } - - synchronized public int getPort() { - return this.serverSocket.getLocalPort(); - } - - synchronized public void stop() { - stopped = true; - try { - serverSocket.close(); - } catch (IOException ex) { - log.fine("Exception closing streaming server socket: " + ex); - } - } - - public void run() { - - log.fine("Entering blocking receiving loop, listening for HTTP stream requests on: " + serverSocket.getLocalSocketAddress()); - while (!stopped) { - - try { - - // Block until we have a connection - final Socket clientSocket = serverSocket.accept(); - - // We have to force this fantastic library to accept HTTP methods which are not in the holy RFCs. - final DefaultHttpServerConnection httpServerConnection = new DefaultHttpServerConnection() { - @Override - protected HttpRequestFactory createHttpRequestFactory() { - return new UpnpHttpRequestFactory(); - } - }; - - log.fine("Incoming connection from: " + clientSocket.getInetAddress()); - httpServerConnection.bind(clientSocket, globalParams); - - // Wrap the processing of the request in a UpnpStream - UpnpStream connectionStream = - new HttpServerConnectionUpnpStream( - router.getProtocolFactory(), - httpServerConnection, - globalParams - ) { - @Override - protected Connection createConnection() { - return new ApacheServerConnection( - clientSocket, httpServerConnection - ); - - } - }; - - router.received(connectionStream); - - } catch (InterruptedIOException ex) { - log.fine("I/O has been interrupted, stopping receiving loop, bytes transfered: " + ex.bytesTransferred); - break; - } catch (SocketException ex) { - if (!stopped) { - // That's not good, could be anything - log.fine("Exception using server socket: " + ex.getMessage()); - } else { - // Well, it's just been stopped so that's totally fine and expected - } - break; - } catch (IOException ex) { - log.fine("Exception initializing receiving loop: " + ex.getMessage()); - break; - } - } - - try { - log.fine("Receiving loop stopped"); - if (!serverSocket.isClosed()) { - log.fine("Closing streaming server socket"); - serverSocket.close(); - } - } catch (Exception ex) { - log.info("Exception closing streaming server socket: " + ex.getMessage()); - } - - } - - /** - * Writes a space character to the output stream of the socket. - *

- * This space character might confuse the HTTP client. The Cling transports for Jetty Client and - * Apache HttpClient have been tested to work with space characters. Unfortunately, Sun JDK's - * HttpURLConnection does not gracefully handle any garbage in the HTTP request! - *

- */ - protected boolean isConnectionOpen(Socket socket) { - return isConnectionOpen(socket, " ".getBytes()); - } - - protected boolean isConnectionOpen(Socket socket, byte[] heartbeat) { - if (log.isLoggable(Level.FINE)) - log.fine("Checking if client connection is still open on: " + socket.getRemoteSocketAddress()); - try { - socket.getOutputStream().write(heartbeat); - socket.getOutputStream().flush(); - return true; - } catch (IOException ex) { - if (log.isLoggable(Level.FINE)) - log.fine("Client connection has been closed: " + socket.getRemoteSocketAddress()); - return false; - } - } - - protected class ApacheServerConnection implements Connection { - - protected Socket socket; - protected DefaultHttpServerConnection connection; - - public ApacheServerConnection(Socket socket, DefaultHttpServerConnection connection) { - this.socket = socket; - this.connection = connection; - } - - @Override - public boolean isOpen() { - return isConnectionOpen(socket); - } - - @Override - public InetAddress getRemoteAddress() { - return connection.getRemoteAddress(); - } - - @Override - public InetAddress getLocalAddress() { - return connection.getLocalAddress(); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/apache/UpnpHttpRequestFactory.java b/app/src/main/java/org/fourthline/cling/transport/impl/apache/UpnpHttpRequestFactory.java deleted file mode 100644 index e066048..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/apache/UpnpHttpRequestFactory.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl.apache; - -import org.apache.http.HttpRequest; -import org.apache.http.MethodNotSupportedException; -import org.apache.http.RequestLine; -import org.apache.http.impl.DefaultHttpRequestFactory; -import org.apache.http.message.BasicHttpEntityEnclosingRequest; -import org.apache.http.message.BasicHttpRequest; - -/** - * This is how you add new HTTP methods to Apache HTTP Components. - *

- * Yes, Oleg dude, make stuff private! Good idea! - *

- * @author Christian Bauer - */ -public class UpnpHttpRequestFactory extends DefaultHttpRequestFactory { - - private static final String[] BASIC = { - "SUBSCRIBE", - "UNSUBSCRIBE" - }; - - private static final String[] WITH_ENTITY = { - "NOTIFY" - }; - - public UpnpHttpRequestFactory() { - super(); - } - - private static boolean isOneOf(final String[] methods, final String method) { - for (int i = 0; i < methods.length; i++) { - if (methods[i].equalsIgnoreCase(method)) { - return true; - } - } - return false; - } - - public HttpRequest newHttpRequest(final RequestLine requestline) - throws MethodNotSupportedException { - if (requestline == null) { - throw new IllegalArgumentException("Request line may not be null"); - } - String method = requestline.getMethod(); - String uri = requestline.getUri(); - return newHttpRequest(method, uri); - } - - public HttpRequest newHttpRequest(final String method, final String uri) throws MethodNotSupportedException { - if (isOneOf(BASIC, method)) { - return new BasicHttpRequest(method, uri); - } else if (isOneOf(WITH_ENTITY, method)) { - return new BasicHttpEntityEnclosingRequest(method, uri); - } else { - return super.newHttpRequest(method, uri); - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/jetty/JettyServletContainer.java b/app/src/main/java/org/fourthline/cling/transport/impl/jetty/JettyServletContainer.java deleted file mode 100644 index b429919..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/jetty/JettyServletContainer.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl.jetty; - -import org.eclipse.jetty.server.AbstractHttpConnection; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.bio.SocketConnector; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.util.thread.ExecutorThreadPool; -import org.fourthline.cling.transport.spi.ServletContainerAdapter; - -import javax.servlet.Servlet; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; -import java.net.Socket; -import java.util.concurrent.ExecutorService; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * A singleton wrapper of a org.eclipse.jetty.server.Server. - *

- * This {@link org.fourthline.cling.transport.spi.ServletContainerAdapter} starts - * a Jetty 8 instance on its own and stops it. Only one single context and servlet - * is registered, to handle UPnP requests. - *

- *

- * This implementation works on Android, dependencies are jetty-server - * and jetty-servlet Maven modules. - *

- * - * @author Christian Bauer - */ -public class JettyServletContainer implements ServletContainerAdapter { - - final private static Logger log = Logger.getLogger(JettyServletContainer.class.getName()); - - // Singleton - public static final JettyServletContainer INSTANCE = new JettyServletContainer(); - private JettyServletContainer() { - resetServer(); - } - - protected Server server; - - @Override - synchronized public void setExecutorService(ExecutorService executorService) { - if (INSTANCE.server.getThreadPool() == null) { - INSTANCE.server.setThreadPool(new ExecutorThreadPool(executorService) { - @Override - protected void doStop() throws Exception { - // Do nothing, don't shut down the Cling ExecutorService when Jetty stops! - } - }); - } - } - - @Override - synchronized public int addConnector(String host, int port) throws IOException { - SocketConnector connector = new SocketConnector(); - connector.setHost(host); - connector.setPort(port); - - // Open immediately so we can get the assigned local port - connector.open(); - - // Only add if open() succeeded - server.addConnector(connector); - - return connector.getLocalPort(); - } - - @Override - synchronized public void registerServlet(String contextPath, Servlet servlet) { - if (server.getHandler() != null) { - return; - } - log.info("Registering UPnP servlet under context path: " + contextPath); - ServletContextHandler servletHandler = - new ServletContextHandler(ServletContextHandler.NO_SESSIONS); - if (contextPath != null && contextPath.length() > 0) - servletHandler.setContextPath(contextPath); - ServletHolder s = new ServletHolder(servlet); - servletHandler.addServlet(s, "/*"); - server.setHandler(servletHandler); - } - - @Override - synchronized public void startIfNotRunning() { - if (!server.isStarted() && !server.isStarting()) { - log.info("Starting Jetty server... "); - try { - server.start(); - } catch (Exception ex) { - log.severe("Couldn't start Jetty server: " + ex); - throw new RuntimeException(ex); - } - } - } - - @Override - synchronized public void stopIfRunning() { - if (!server.isStopped() && !server.isStopping()) { - log.info("Stopping Jetty server..."); - try { - server.stop(); - } catch (Exception ex) { - log.severe("Couldn't stop Jetty server: " + ex); - throw new RuntimeException(ex); - } finally { - resetServer(); - } - } - } - - protected void resetServer() { - server = new Server(); // Has its own QueuedThreadPool - server.setGracefulShutdown(1000); // Let's wait a second for ongoing transfers to complete - } - - /** - * Casts the request to a Jetty API and tries to write a space character to the output stream of the socket. - *

- * This space character might confuse the HTTP client. The Cling transports for Jetty Client and - * Apache HttpClient have been tested to work with space characters. Unfortunately, Sun JDK's - * HttpURLConnection does not gracefully handle any garbage in the HTTP request! - *

- */ - public static boolean isConnectionOpen(HttpServletRequest request) { - return isConnectionOpen(request, " ".getBytes()); - } - - public static boolean isConnectionOpen(HttpServletRequest request, byte[] heartbeat) { - Request jettyRequest = (Request)request; - AbstractHttpConnection connection = jettyRequest.getConnection(); - Socket socket = (Socket)connection.getEndPoint().getTransport(); - if (log.isLoggable(Level.FINE)) - log.fine("Checking if client connection is still open: " + socket.getRemoteSocketAddress()); - try { - socket.getOutputStream().write(heartbeat); - socket.getOutputStream().flush(); - return true; - } catch (IOException ex) { - if (log.isLoggable(Level.FINE)) - log.fine("Client connection has been closed: " + socket.getRemoteSocketAddress()); - return false; - } - } - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/jetty/StreamClientConfigurationImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/jetty/StreamClientConfigurationImpl.java deleted file mode 100644 index 730e81b..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/jetty/StreamClientConfigurationImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl.jetty; - -import org.fourthline.cling.transport.spi.AbstractStreamClientConfiguration; - -import java.util.concurrent.ExecutorService; - -/** - * Settings for the Jetty 8 implementation. - * - * @author Christian Bauer - */ -public class StreamClientConfigurationImpl extends AbstractStreamClientConfiguration { - - public StreamClientConfigurationImpl(ExecutorService timeoutExecutorService) { - super(timeoutExecutorService); - } - - public StreamClientConfigurationImpl(ExecutorService timeoutExecutorService, int timeoutSeconds) { - super(timeoutExecutorService, timeoutSeconds); - } - - /** - * @return By default 0. - */ - public int getRequestRetryCount() { - return 0; - } - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/impl/jetty/StreamClientImpl.java b/app/src/main/java/org/fourthline/cling/transport/impl/jetty/StreamClientImpl.java deleted file mode 100644 index a66acfb..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/impl/jetty/StreamClientImpl.java +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.impl.jetty; - -import org.eclipse.jetty.client.ContentExchange; -import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.HttpExchange; -import org.eclipse.jetty.http.HttpFields; -import org.eclipse.jetty.http.HttpHeaders; -import org.eclipse.jetty.io.ByteArrayBuffer; -import org.eclipse.jetty.util.thread.ExecutorThreadPool; -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpHeaders; -import org.fourthline.cling.model.message.UpnpMessage; -import org.fourthline.cling.model.message.UpnpRequest; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.model.message.header.ContentTypeHeader; -import org.fourthline.cling.model.message.header.UpnpHeader; -import org.fourthline.cling.transport.spi.AbstractStreamClient; -import org.fourthline.cling.transport.spi.InitializationException; -import org.fourthline.cling.transport.spi.StreamClient; -import org.seamless.util.Exceptions; -import org.seamless.util.MimeType; - -import java.io.UnsupportedEncodingException; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Implementation based on Jetty 8 client API. - *

- * This implementation works on Android, dependencies are the jetty-client - * Maven module. - *

- * - * @author Christian Bauer - */ -public class StreamClientImpl extends AbstractStreamClient { - - final private static Logger log = Logger.getLogger(StreamClient.class.getName()); - - final protected StreamClientConfigurationImpl configuration; - final protected HttpClient client; - - public StreamClientImpl(StreamClientConfigurationImpl configuration) throws InitializationException { - this.configuration = configuration; - - log.info("Starting Jetty HttpClient..."); - client = new HttpClient(); - - // Jetty client needs threads for its internal expiration routines, which we don't need but - // can't disable, so let's abuse the request executor service for this - client.setThreadPool( - new ExecutorThreadPool(getConfiguration().getRequestExecutorService()) { - @Override - protected void doStop() throws Exception { - // Do nothing, don't shut down the Cling ExecutorService when Jetty stops! - } - } - ); - - // These are some safety settings, we should never run into these timeouts as we - // do our own expiration checking - client.setTimeout((configuration.getTimeoutSeconds()+5) * 1000); - client.setConnectTimeout((configuration.getTimeoutSeconds()+5) * 1000); - - client.setMaxRetries(configuration.getRequestRetryCount()); - - try { - client.start(); - } catch (Exception ex) { - throw new InitializationException( - "Could not start Jetty HTTP client: " + ex, ex - ); - } - } - - @Override - public StreamClientConfigurationImpl getConfiguration() { - return configuration; - } - - @Override - protected HttpContentExchange createRequest(StreamRequestMessage requestMessage) { - return new HttpContentExchange(getConfiguration(), client, requestMessage); - } - - @Override - protected Callable createCallable(final StreamRequestMessage requestMessage, - final HttpContentExchange exchange) { - return new Callable() { - public StreamResponseMessage call() throws Exception { - - if (log.isLoggable(Level.FINE)) - log.fine("Sending HTTP request: " + requestMessage); - - client.send(exchange); - int exchangeState = exchange.waitForDone(); - - if (exchangeState == HttpExchange.STATUS_COMPLETED) { - try { - return exchange.createResponse(); - } catch (Throwable t) { - log.log(Level.WARNING, "Error reading response: " + requestMessage, Exceptions.unwrap(t)); - return null; - } - } else if (exchangeState == HttpExchange.STATUS_CANCELLED) { - // That's ok, happens when we abort the exchange after timeout - return null; - } else if (exchangeState == HttpExchange.STATUS_EXCEPTED) { - // The warnings of the "excepted" condition are logged in HttpContentExchange - return null; - } else { - log.warning("Unhandled HTTP exchange status: " + exchangeState); - return null; - } - } - }; - } - - @Override - protected void abort(HttpContentExchange exchange) { - exchange.cancel(); - } - - @Override - protected boolean logExecutionException(Throwable t) { - return false; - } - - @Override - public void stop() { - try { - client.stop(); - } catch (Exception ex) { - log.info("Error stopping HTTP client: " + ex); - } - } - - static public class HttpContentExchange extends ContentExchange { - - final protected StreamClientConfigurationImpl configuration; - final protected HttpClient client; - final protected StreamRequestMessage requestMessage; - - protected Throwable exception; - - public HttpContentExchange(StreamClientConfigurationImpl configuration, - HttpClient client, - StreamRequestMessage requestMessage) { - super(true); - this.configuration = configuration; - this.client = client; - this.requestMessage = requestMessage; - applyRequestURLMethod(); - applyRequestHeaders(); - applyRequestBody(); - } - - @Override - protected void onConnectionFailed(Throwable t) { - log.log(Level.WARNING, "HTTP connection failed: " + requestMessage, Exceptions.unwrap(t)); - } - - @Override - protected void onException(Throwable t) { - log.log(Level.WARNING, "HTTP request failed: " + requestMessage, Exceptions.unwrap(t)); - } - - public StreamClientConfigurationImpl getConfiguration() { - return configuration; - } - - public StreamRequestMessage getRequestMessage() { - return requestMessage; - } - - protected void applyRequestURLMethod() { - final UpnpRequest requestOperation = getRequestMessage().getOperation(); - if (log.isLoggable(Level.FINE)) - log.fine( - "Preparing HTTP request message with method '" - + requestOperation.getHttpMethodName() - + "': " + getRequestMessage() - ); - - setURL(requestOperation.getURI().toString()); - setMethod(requestOperation.getHttpMethodName()); - } - - protected void applyRequestHeaders() { - // Headers - UpnpHeaders headers = getRequestMessage().getHeaders(); - if (log.isLoggable(Level.FINE)) - log.fine("Writing headers on HttpContentExchange: " + headers.size()); - // TODO Always add the Host header - // TODO: ? setRequestHeader(UpnpHeader.Type.HOST.getHttpName(), ); - // Add the default user agent if not already set on the message - if (!headers.containsKey(UpnpHeader.Type.USER_AGENT)) { - setRequestHeader( - UpnpHeader.Type.USER_AGENT.getHttpName(), - getConfiguration().getUserAgentValue( - getRequestMessage().getUdaMajorVersion(), - getRequestMessage().getUdaMinorVersion()) - ); - } - for (Map.Entry> entry : headers.entrySet()) { - for (String v : entry.getValue()) { - String headerName = entry.getKey(); - if (log.isLoggable(Level.FINE)) - log.fine("Setting header '" + headerName + "': " + v); - addRequestHeader(headerName, v); - } - } - } - - protected void applyRequestBody() { - // Body - if (getRequestMessage().hasBody()) { - if (getRequestMessage().getBodyType() == UpnpMessage.BodyType.STRING) { - if (log.isLoggable(Level.FINE)) - log.fine("Writing textual request body: " + getRequestMessage()); - - MimeType contentType = - getRequestMessage().getContentTypeHeader() != null - ? getRequestMessage().getContentTypeHeader().getValue() - : ContentTypeHeader.DEFAULT_CONTENT_TYPE_UTF8; - - String charset = - getRequestMessage().getContentTypeCharset() != null - ? getRequestMessage().getContentTypeCharset() - : "UTF-8"; - - setRequestContentType(contentType.toString()); - ByteArrayBuffer buffer; - try { - buffer = new ByteArrayBuffer(getRequestMessage().getBodyString(), charset); - } catch (UnsupportedEncodingException ex) { - throw new RuntimeException("Unsupported character encoding: " + charset, ex); - } - setRequestHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(buffer.length())); - setRequestContent(buffer); - - } else { - if (log.isLoggable(Level.FINE)) - log.fine("Writing binary request body: " + getRequestMessage()); - - if (getRequestMessage().getContentTypeHeader() == null) - throw new RuntimeException( - "Missing content type header in request message: " + requestMessage - ); - MimeType contentType = getRequestMessage().getContentTypeHeader().getValue(); - - setRequestContentType(contentType.toString()); - ByteArrayBuffer buffer; - buffer = new ByteArrayBuffer(getRequestMessage().getBodyBytes()); - setRequestHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(buffer.length())); - setRequestContent(buffer); - } - } - } - - protected StreamResponseMessage createResponse() { - // Status - UpnpResponse responseOperation = - new UpnpResponse( - getResponseStatus(), - UpnpResponse.Status.getByStatusCode(getResponseStatus()).getStatusMsg() - ); - - if (log.isLoggable(Level.FINE)) - log.fine("Received response: " + responseOperation); - - StreamResponseMessage responseMessage = new StreamResponseMessage(responseOperation); - - // Headers - UpnpHeaders headers = new UpnpHeaders(); - HttpFields responseFields = getResponseFields(); - for (String name : responseFields.getFieldNamesCollection()) { - for (String value : responseFields.getValuesCollection(name)) { - headers.add(name, value); - } - } - responseMessage.setHeaders(headers); - - // Body - byte[] bytes = getResponseContentBytes(); - if (bytes != null && bytes.length > 0 && responseMessage.isContentTypeMissingOrText()) { - - if (log.isLoggable(Level.FINE)) - log.fine("Response contains textual entity body, converting then setting string on message"); - try { - responseMessage.setBodyCharacters(bytes); - } catch (UnsupportedEncodingException ex) { - throw new RuntimeException("Unsupported character encoding: " + ex, ex); - } - - } else if (bytes != null && bytes.length > 0) { - - if (log.isLoggable(Level.FINE)) - log.fine("Response contains binary entity body, setting bytes on message"); - responseMessage.setBody(UpnpMessage.BodyType.BYTES, bytes); - - } else { - if (log.isLoggable(Level.FINE)) - log.fine("Response did not contain entity body"); - } - - if (log.isLoggable(Level.FINE)) - log.fine("Response message complete: " + responseMessage); - return responseMessage; - } - } -} - - diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/AbstractStreamClient.java b/app/src/main/java/org/fourthline/cling/transport/spi/AbstractStreamClient.java deleted file mode 100644 index 8984ac2..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/AbstractStreamClient.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.transport.spi; - -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.seamless.util.Exceptions; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Implements the timeout/callback processing and unifies exception handling. - - * @author Christian Bauer - */ -public abstract class AbstractStreamClient implements StreamClient { - - final private static Logger log = Logger.getLogger(StreamClient.class.getName()); - - @Override - public StreamResponseMessage sendRequest(StreamRequestMessage requestMessage) throws InterruptedException { - - if (log.isLoggable(Level.FINE)) - log.fine("Preparing HTTP request: " + requestMessage); - - REQUEST request = createRequest(requestMessage); - if (request == null) - return null; - - Callable callable = createCallable(requestMessage, request); - - // We want to track how long it takes - long start = System.currentTimeMillis(); - - // Execute the request on a new thread - Future future = - getConfiguration().getRequestExecutorService().submit(callable); - - // Wait on the current thread for completion - try { - if (log.isLoggable(Level.FINE)) - log.fine( - "Waiting " + getConfiguration().getTimeoutSeconds() - + " seconds for HTTP request to complete: " + requestMessage - ); - StreamResponseMessage response = - future.get(getConfiguration().getTimeoutSeconds(), TimeUnit.SECONDS); - - // Log a warning if it took too long - long elapsed = System.currentTimeMillis() - start; - if (log.isLoggable(Level.FINEST)) - log.finest("Got HTTP response in " + elapsed + "ms: " + requestMessage); - if (getConfiguration().getLogWarningSeconds() > 0 - && elapsed > getConfiguration().getLogWarningSeconds()*1000) { - log.warning("HTTP request took a long time (" + elapsed + "ms): " + requestMessage); - } - - return response; - - } catch (InterruptedException ex) { - - if (log.isLoggable(Level.FINE)) - log.fine("Interruption, aborting request: " + requestMessage); - abort(request); - throw new InterruptedException("HTTP request interrupted and aborted"); - - } catch (TimeoutException ex) { - - log.info( - "Timeout of " + getConfiguration().getTimeoutSeconds() - + " seconds while waiting for HTTP request to complete, aborting: " + requestMessage - ); - abort(request); - return null; - - } catch (ExecutionException ex) { - Throwable cause = ex.getCause(); - if (!logExecutionException(cause)) { - log.log(Level.WARNING, "HTTP request failed: " + requestMessage, Exceptions.unwrap(cause)); - } - return null; - } finally { - onFinally(request); - } - } - - /** - * Create a proprietary representation of this request, log warnings and - * return null if creation fails. - */ - abstract protected REQUEST createRequest(StreamRequestMessage requestMessage); - - /** - * Create a callable procedure that will execute the request. - */ - abstract protected Callable createCallable(StreamRequestMessage requestMessage, - REQUEST request); - - /** - * Cancel and abort the request immediately, with the proprietary API. - */ - abstract protected void abort(REQUEST request); - - /** - * @return true if no more logging of this exception should be done. - */ - abstract protected boolean logExecutionException(Throwable t); - - protected void onFinally(REQUEST request) { - // Do nothing - } - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/AbstractStreamClientConfiguration.java b/app/src/main/java/org/fourthline/cling/transport/spi/AbstractStreamClientConfiguration.java deleted file mode 100644 index 0c56ee1..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/AbstractStreamClientConfiguration.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.transport.spi; - -import org.fourthline.cling.model.ServerClientTokens; - -import java.util.concurrent.ExecutorService; - -/** - * @author Christian Bauer - */ -public abstract class AbstractStreamClientConfiguration implements StreamClientConfiguration { - - protected ExecutorService requestExecutorService; - protected int timeoutSeconds = 60; - protected int logWarningSeconds = 5; - - protected AbstractStreamClientConfiguration(ExecutorService requestExecutorService) { - this.requestExecutorService = requestExecutorService; - } - - protected AbstractStreamClientConfiguration(ExecutorService requestExecutorService, int timeoutSeconds) { - this.requestExecutorService = requestExecutorService; - this.timeoutSeconds = timeoutSeconds; - } - - protected AbstractStreamClientConfiguration(ExecutorService requestExecutorService, int timeoutSeconds, int logWarningSeconds) { - this.requestExecutorService = requestExecutorService; - this.timeoutSeconds = timeoutSeconds; - this.logWarningSeconds = logWarningSeconds; - } - - public ExecutorService getRequestExecutorService() { - return requestExecutorService; - } - - public void setRequestExecutorService(ExecutorService requestExecutorService) { - this.requestExecutorService = requestExecutorService; - } - - /** - * @return Configured value or default of 60 seconds. - */ - public int getTimeoutSeconds() { - return timeoutSeconds; - } - - public void setTimeoutSeconds(int timeoutSeconds) { - this.timeoutSeconds = timeoutSeconds; - } - - /** - * @return Configured value or default of 5 seconds. - */ - public int getLogWarningSeconds() { - return logWarningSeconds; - } - - public void setLogWarningSeconds(int logWarningSeconds) { - this.logWarningSeconds = logWarningSeconds; - } - - /** - * @return Defaults to string value of {@link org.fourthline.cling.model.ServerClientTokens}. - */ - public String getUserAgentValue(int majorVersion, int minorVersion) { - return new ServerClientTokens(majorVersion, minorVersion).toString(); - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/DatagramIO.java b/app/src/main/java/org/fourthline/cling/transport/spi/DatagramIO.java deleted file mode 100644 index 4344e59..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/DatagramIO.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -import org.fourthline.cling.transport.Router; -import org.fourthline.cling.model.message.OutgoingDatagramMessage; - -import java.net.InetAddress; -import java.net.DatagramPacket; - -/** - * Service for receiving (unicast only) and sending UDP datagrams, one per bound IP address. - *

- * This service typically listens on a socket for UDP unicast datagrams, with - * an ephemeral port. - *

- *

- * This listening loop is started with the run() method, - * this service is Runnable. Any received datagram is then converted into an - * {@link org.fourthline.cling.model.message.IncomingDatagramMessage} and - * handled by the - * {@link org.fourthline.cling.transport.Router#received(org.fourthline.cling.model.message.IncomingDatagramMessage)} - * method. This conversion is the job of the {@link org.fourthline.cling.transport.spi.DatagramProcessor}. - *

- *

- * Clients of this service use it to send UDP datagrams, either to a unicast - * or multicast destination. Any {@link org.fourthline.cling.model.message.OutgoingDatagramMessage} can - * be converted and written into a datagram with the {@link org.fourthline.cling.transport.spi.DatagramProcessor}. - *

- *

- * An implementation has to be thread-safe. - *

- * - * @param The type of the service's configuration. - * - * @author Christian Bauer - */ -public interface DatagramIO extends Runnable { - - /** - * Configures the service and starts any listening sockets. - * - * @param bindAddress The address to bind any sockets on. - * @param router The router which handles received {@link org.fourthline.cling.model.message.IncomingDatagramMessage}s. - * @param datagramProcessor Reads and writes datagrams. - * @throws InitializationException If the service could not be initialized or started. - */ - public void init(InetAddress bindAddress, Router router, DatagramProcessor datagramProcessor) throws InitializationException; - - /** - * Stops the service, closes any listening sockets. - */ - public void stop(); - - /** - * @return This service's configuration. - */ - public C getConfiguration(); - - /** - * Sends a datagram after conversion with {@link org.fourthline.cling.transport.spi.DatagramProcessor#write(org.fourthline.cling.model.message.OutgoingDatagramMessage)}. - * - * @param message The message to send. - */ - public void send(OutgoingDatagramMessage message); - - /** - * The actual sending of a UDP datagram. - *

- * Recoverable errors should be logged, if appropriate only with debug level. Any - * non-recoverable errors should be thrown as RuntimeExceptions. - *

- * - * @param datagram The UDP datagram to send. - */ - public void send(DatagramPacket datagram); -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/DatagramIOConfiguration.java b/app/src/main/java/org/fourthline/cling/transport/spi/DatagramIOConfiguration.java deleted file mode 100644 index c22cde9..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/DatagramIOConfiguration.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -/** - * Collection of typically needed configuration settings. - * - * @author Christian Bauer - */ -public interface DatagramIOConfiguration { - - /** - * @return The TTL of a UDP datagram sent to a multicast address. - */ - public int getTimeToLive(); - - /** - * @return The maximum buffer size of received UDP datagrams. - */ - public int getMaxDatagramBytes(); - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/DatagramProcessor.java b/app/src/main/java/org/fourthline/cling/transport/spi/DatagramProcessor.java deleted file mode 100644 index 733835f..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/DatagramProcessor.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - - -import org.fourthline.cling.model.UnsupportedDataException; -import org.fourthline.cling.model.message.IncomingDatagramMessage; -import org.fourthline.cling.model.message.OutgoingDatagramMessage; - -import java.net.DatagramPacket; -import java.net.InetAddress; - -/** - * Reads and creates UDP datagrams from and into UPnP messages. - *

- * An implementation of this interface has to be thread-safe. - *

- * - * @author Christian Bauer - */ -public interface DatagramProcessor { - - /** - * Reads the datagram and instantiates a message. - *

- * The message is either a {@link org.fourthline.cling.model.message.UpnpRequest} or - * a {@link org.fourthline.cling.model.message.UpnpResponse} operation type. - *

- * - * @param receivedOnAddress The address of the socket on which this datagram was received. - * @param datagram The received UDP datagram. - * @return The populated instance. - * @throws org.fourthline.cling.model.UnsupportedDataException If the datagram could not be read, or didn't contain required data. - */ - public IncomingDatagramMessage read(InetAddress receivedOnAddress, DatagramPacket datagram) throws UnsupportedDataException; - - /** - * Creates a UDP datagram with the content of a message. - *

- * The outgoing message might be a {@link org.fourthline.cling.model.message.UpnpRequest} or a - * {@link org.fourthline.cling.model.message.UpnpResponse}. - *

- * - * @param message The outgoing datagram message. - * @return An actual UDP datagram. - * @throws UnsupportedDataException If the datagram could not be created. - */ - public DatagramPacket write(OutgoingDatagramMessage message) throws UnsupportedDataException; - -} - - diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/GENAEventProcessor.java b/app/src/main/java/org/fourthline/cling/transport/spi/GENAEventProcessor.java deleted file mode 100644 index 6975d1d..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/GENAEventProcessor.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -import org.fourthline.cling.model.UnsupportedDataException; -import org.fourthline.cling.model.message.gena.IncomingEventRequestMessage; -import org.fourthline.cling.model.message.gena.OutgoingEventRequestMessage; - -/** - * Reads and writes GENA XML content. - * - * @author Christian Bauer - */ -public interface GENAEventProcessor { - - /** - * Transforms a collection of {@link org.fourthline.cling.model.state.StateVariableValue}s into an XML message body. - * - * @param requestMessage The message to transform. - * @throws org.fourthline.cling.model.UnsupportedDataException - */ - public void writeBody(OutgoingEventRequestMessage requestMessage) throws UnsupportedDataException; - - /** - * Transforms an XML message body and adds to a collection of {@link org.fourthline.cling.model.state.StateVariableValue}s.. - * - * @param requestMessage The message to transform. - * @throws UnsupportedDataException - */ - public void readBody(IncomingEventRequestMessage requestMessage) throws UnsupportedDataException; - -} \ No newline at end of file diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/InitializationException.java b/app/src/main/java/org/fourthline/cling/transport/spi/InitializationException.java deleted file mode 100644 index d2643f1..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/InitializationException.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -/** - * Thrown by the transport layer implementation when service setup fails. - *

- * This exception typically indicates a configuration problem and it is not - * recoverable unless you can continue without the service that threw this - * exception. - *

- * - * @author Christian Bauer - */ -public class InitializationException extends RuntimeException { - - public InitializationException(String s) { - super(s); - } - - public InitializationException(String s, Throwable throwable) { - super(s, throwable); - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/MulticastReceiver.java b/app/src/main/java/org/fourthline/cling/transport/spi/MulticastReceiver.java deleted file mode 100644 index 080f9e1..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/MulticastReceiver.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -import org.fourthline.cling.transport.Router; - -import java.net.NetworkInterface; - -/** - * Service for receiving multicast UDP datagrams, one per bound network interface. - *

- * This services typically listens on a socket for UDP datagrams, the socket has joined - * the configured multicast group. - *

- *

- * This listening loop is started with the run() method, - * this service is Runnable. Any received datagram is then converted into an - * {@link org.fourthline.cling.model.message.IncomingDatagramMessage} and - * handled by the - * {@link org.fourthline.cling.transport.Router#received(org.fourthline.cling.model.message.IncomingDatagramMessage)} - * method. This conversion is the job of the {@link org.fourthline.cling.transport.spi.DatagramProcessor}. - *

- *

- * An implementation has to be thread-safe. - *

- * - * @param The type of the service's configuration. - * - * @author Christian Bauer - */ -public interface MulticastReceiver extends Runnable { - - /** - * Configures the service and starts any listening sockets. - * - * @param networkInterface The network interface on which to join the multicast group on. - * @param router The router which handles received {@link org.fourthline.cling.model.message.IncomingDatagramMessage}s. - * @param networkAddressFactory The network address factory to use for local address lookup given a local interface and a remote address. - * @param datagramProcessor Reads and writes datagrams. - * @throws InitializationException If the service could not be initialized or started. - */ - public void init(NetworkInterface networkInterface, - Router router, - NetworkAddressFactory networkAddressFactory, - DatagramProcessor datagramProcessor) throws InitializationException; - - /** - * Stops the service, closes any listening sockets. - */ - public void stop(); - - /** - * @return This service's configuration. - */ - public C getConfiguration(); - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/MulticastReceiverConfiguration.java b/app/src/main/java/org/fourthline/cling/transport/spi/MulticastReceiverConfiguration.java deleted file mode 100644 index 2e401c2..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/MulticastReceiverConfiguration.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -import java.net.InetAddress; - -/** - * Collection of typically needed configuration settings. - * - * @author Christian Bauer - */ -public interface MulticastReceiverConfiguration { - - /** - * @return The multicast group to join. - */ - public InetAddress getGroup(); - - /** - * @return The port to listen on. - */ - public int getPort(); - - /** - * @return The maximum buffer size of received UDP datagrams. - */ - public int getMaxDatagramBytes(); - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/NetworkAddressFactory.java b/app/src/main/java/org/fourthline/cling/transport/spi/NetworkAddressFactory.java deleted file mode 100644 index fa6e8b8..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/NetworkAddressFactory.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.util.Iterator; - -/** - * Configuration utility for network interfaces and addresses. - *

- * An implementation has to be thread-safe. - *

- * - * @author Christian Bauer - */ -public interface NetworkAddressFactory { - - // An implementation can honor these if it wants (the default does) - public static final String SYSTEM_PROPERTY_NET_IFACES = "org.fourthline.cling.network.useInterfaces"; - public static final String SYSTEM_PROPERTY_NET_ADDRESSES = "org.fourthline.cling.network.useAddresses"; - - - /** - * @return The UDP multicast group to join. - */ - public InetAddress getMulticastGroup(); - - /** - * @return The UDP multicast port to listen on. - */ - public int getMulticastPort(); - - /** - * @return The TCP (HTTP) stream request port to listen on. - */ - public int getStreamListenPort(); - - /** - * The caller might remove() an interface if initialization fails. - * - * @return The local network interfaces on which multicast groups will be joined. - */ - public Iterator getNetworkInterfaces(); - - /** - * The caller might remove() an address if initialization fails. - * - * @return The local addresses of the network interfaces bound to - * sockets listening for unicast datagrams and TCP requests. - */ - public Iterator getBindAddresses(); - - /** - * @return true if there is at least one usable network interface and bind address. - */ - public boolean hasUsableNetwork(); - - /** - * @return The network prefix length of this address or null. - */ - public Short getAddressNetworkPrefixLength(InetAddress inetAddress); - - /** - * @param inetAddress An address of a local network interface. - * @return The MAC hardware address of the network interface or null if no - * hardware address could be obtained. - */ - public byte[] getHardwareAddress(InetAddress inetAddress); - - /** - * @param inetAddress An address of a local network interface. - * @return The broadcast address of the network (interface) or null if no - * broadcast address could be obtained. - */ - public InetAddress getBroadcastAddress(InetAddress inetAddress); - - /** - * Best-effort attempt finding a reachable local address for a given remote host. - *

- * This method is called whenever a multicast datagram has been received. We need to be - * able to communicate with the sender using UDP unicast and we need to tell the sender - * how we are reachable with TCP requests. We need a local address that is in the same - * subnet as the senders address, that is reachable from the senders point of view. - *

- * - * @param networkInterface The network interface to examine. - * @param isIPv6 True if the given remote address is an IPv6 address. - * @param remoteAddress The remote address for which to find a local address in the same subnet. - * @return A local address that is reachable from the given remote address. - * @throws IllegalStateException If no local address reachable by the remote address has been found. - */ - public InetAddress getLocalAddress(NetworkInterface networkInterface, - boolean isIPv6, - InetAddress remoteAddress) throws IllegalStateException; - - /** - * For debugging, logs all "usable" network interface(s) details with INFO level. - */ - public void logInterfaceInformation(); -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/NoNetworkException.java b/app/src/main/java/org/fourthline/cling/transport/spi/NoNetworkException.java deleted file mode 100644 index 659eb79..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/NoNetworkException.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ -package org.fourthline.cling.transport.spi; - -/** - * Might be thrown by the constructor of {@link NetworkAddressFactory} and - * {@link org.fourthline.cling.transport.Router} if no usable - * network interfaces/addresses were discovered. - * - * @author Christian Bauer - */ -public class NoNetworkException extends InitializationException { - - public NoNetworkException(String s) { - super(s); - } -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/SOAPActionProcessor.java b/app/src/main/java/org/fourthline/cling/transport/spi/SOAPActionProcessor.java deleted file mode 100644 index 8ca955c..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/SOAPActionProcessor.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -import org.fourthline.cling.model.UnsupportedDataException; -import org.fourthline.cling.model.action.ActionInvocation; -import org.fourthline.cling.model.message.control.ActionRequestMessage; -import org.fourthline.cling.model.message.control.ActionResponseMessage; - -/** - * Converts UPnP SOAP messages from/to action invocations. - *

- * The UPnP protocol layer processes local and remote {@link org.fourthline.cling.model.action.ActionInvocation} - * instances. The UPnP transport layer accepts and returns {@link org.fourthline.cling.model.message.StreamRequestMessage}s - * and {@link org.fourthline.cling.model.message.StreamResponseMessage}s. This processor is an adapter between the - * two layers, reading and writing SOAP content. - *

- * - * @author Christian Bauer - */ -public interface SOAPActionProcessor { - - /** - * Converts the given invocation input into SOAP XML content, setting on the given request message. - * - * @param requestMessage The request message on which the SOAP content is set. - * @param actionInvocation The action invocation from which input argument values are read. - * @throws org.fourthline.cling.model.UnsupportedDataException - */ - public void writeBody(ActionRequestMessage requestMessage, ActionInvocation actionInvocation) throws UnsupportedDataException; - - /** - * Converts the given invocation output into SOAP XML content, setting on the given response message. - * - * @param responseMessage The response message on which the SOAP content is set. - * @param actionInvocation The action invocation from which output argument values are read. - * @throws UnsupportedDataException - */ - public void writeBody(ActionResponseMessage responseMessage, ActionInvocation actionInvocation) throws UnsupportedDataException; - - /** - * Converts SOAP XML content of the request message and sets input argument values on the given invocation. - * - * @param requestMessage The request message from which SOAP content is read. - * @param actionInvocation The action invocation on which input argument values are set. - * @throws UnsupportedDataException - */ - public void readBody(ActionRequestMessage requestMessage, ActionInvocation actionInvocation) throws UnsupportedDataException; - - /** - * Converts SOAP XML content of the response message and sets output argument values on the given invocation. - * - * @param responseMsg The response message from which SOAP content is read. - * @param actionInvocation The action invocation on which output argument values are set. - * @throws UnsupportedDataException - */ - public void readBody(ActionResponseMessage responseMsg, ActionInvocation actionInvocation) throws UnsupportedDataException; - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/ServletContainerAdapter.java b/app/src/main/java/org/fourthline/cling/transport/spi/ServletContainerAdapter.java deleted file mode 100644 index 39f31f8..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/ServletContainerAdapter.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -import javax.servlet.Servlet; -import java.io.IOException; -import java.util.concurrent.ExecutorService; - -/** - * Implement this to provide your own servlet container (instance), - *

- * It's OK if you don't start or stop your container when this adapter is - * called. You can treat the {@link #startIfNotRunning()} and - * {@link #stopIfRunning()} methods as suggestions, they only indicate what - * the UPnP stack wants to do. If your servlet container handles other - * services, keep it running all the time. - *

- *

- * An implementation must be thread-safe, all methods might be called concurrently - * by several threads. - *

- * - * @author Christian Bauer - */ -public interface ServletContainerAdapter { - - /** - * Might be called several times to integrate the servlet container with Cling's executor - * configuration. You can ignore this call if you want to configure the container's thread - * pooling independently from Cling. If you use the given Cling ExecutorService, - * make sure the Jetty container won't shut it down when {@link #stopIfRunning()} is called! - * - * @param executorService The service to use when spawning new servlet execution threads. - */ - void setExecutorService(ExecutorService executorService); - - /** - * Might be called several times to set up the connectors. This is the host/address - * and the port Cling expects to receive HTTP requests on. If you set up your HTTP - * server connectors elsewhere and ignore when Cling calls this method, make sure - * you configure Cling with the correct host/port of your servlet container. - * - * @param host The host address for the socket. - * @param port The port, might be -1 to bind to an ephemeral port. - * @return The actual registered local port. - * @throws IOException If the connector couldn't be opened to retrieve the registered local port. - */ - int addConnector(String host, int port) throws IOException; - - /** - * Might be called several times register (the same) handler for UPnP requests, should only register it once. - * - * @param contextPath The context path prefix for all UPnP requests. - * @param servlet The servlet handling all UPnP requests. - */ - void registerServlet(String contextPath, Servlet servlet); - - /** - * Start your servlet container if it isn't already running, might be called multiple times. - */ - void startIfNotRunning(); - - /** - * Stop your servlet container if it's still running, might be called multiple times. - */ - void stopIfRunning(); - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/StreamClient.java b/app/src/main/java/org/fourthline/cling/transport/spi/StreamClient.java deleted file mode 100644 index 62c6493..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/StreamClient.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; - -/** - * Service for sending TCP (HTTP) stream request messages. - * - *

- * An implementation has to be thread-safe. - * Its constructor may throw {@link org.fourthline.cling.transport.spi.InitializationException}. - *

- * - * @param The type of the service's configuration. - * - * @author Christian Bauer - */ -public interface StreamClient { - - /** - * Sends the given request via TCP (HTTP) and returns the response. - * - *

- * This method must implement expiration of timed out requests using the - * {@link StreamClientConfiguration} settings. When a request expires, a - * null response will be returned. - *

- *

- * This method will always try to complete execution without throwing an exception. It will - * return null if an error occurs, and optionally log any exception messages. - *

- *

- * The rules for logging are: - *

- *
    - *
  • If the caller interrupts the calling thread, log at FINE.
  • - *
  • If the request expires because the timeout has been reached, log at INFO level.
  • - *
  • If another error occurs, log at WARNING level
  • - *
- *

- * This method is required to add a Host HTTP header to the - * outgoing HTTP request, even if the given - * {@link org.fourthline.cling.model.message.StreamRequestMessage} does not contain such a header. - *

- *

- * This method will add the User-Agent HTTP header to the outgoing HTTP request if - * the given message did not already contain such a header. You can set this default value in your - * {@link StreamClientConfiguration}. - *

- * - * @param message The message to send. - * @return The response or null if no response has been received or an error occurred. - * @throws InterruptedException if you interrupt the calling thread. - */ - public StreamResponseMessage sendRequest(StreamRequestMessage message) throws InterruptedException; - - /** - * Stops the service, closes any connection pools etc. - */ - public void stop(); - - /** - * @return This service's configuration. - */ - public C getConfiguration(); - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/StreamClientConfiguration.java b/app/src/main/java/org/fourthline/cling/transport/spi/StreamClientConfiguration.java deleted file mode 100644 index 7e37da5..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/StreamClientConfiguration.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -import java.util.concurrent.ExecutorService; - -/** - * Collection of typically needed configuration settings. - * - * @author Christian Bauer - */ -public interface StreamClientConfiguration { - - /** - * Used to execute the actual HTTP request, the StreamClient waits on the "current" thread for - * completion or timeout. You probably want to use the same executor service for both, so usually - * this is {@link org.fourthline.cling.UpnpServiceConfiguration#getSyncProtocolExecutorService()}. - * - * @return The ExecutorService to use for actual sending of HTTP requests. - */ - public ExecutorService getRequestExecutorService(); - - /** - * @return The number of seconds to wait for a request to expire, spanning connect and data-reads. - */ - public int getTimeoutSeconds(); - - /** - * @return If the request completion takes longer than this, a warning will be logged (0 to disable) - */ - public int getLogWarningSeconds(); - - /** - * Used for outgoing HTTP requests if no other value was already set on messages. - * - * @param majorVersion The UPnP UDA major version. - * @param minorVersion The UPnP UDA minor version. - * @return The HTTP user agent value. - */ - public String getUserAgentValue(int majorVersion, int minorVersion); - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/StreamServer.java b/app/src/main/java/org/fourthline/cling/transport/spi/StreamServer.java deleted file mode 100644 index c9a1fac..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/StreamServer.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -import org.fourthline.cling.transport.Router; - -import java.net.InetAddress; - -/** - * Service for receiving TCP (HTTP) streams, one per bound IP address. - *

- * This service typically listens on a socket for TCP connections. - *

- * This listening loop is started with the run() method, this service is - * Runnable. Then {@link Router#received(UpnpStream)} is called with a custom - * {@link UpnpStream}. This will start processing of the request and run() the - * {@link UpnpStream} (which is also Runnable) in a separate thread, - * freeing up the receiving thread immediately. - *

- *

- * The {@link UpnpStream} then creates a {@link org.fourthline.cling.model.message.StreamRequestMessage} - * and calls the {@link UpnpStream#process(org.fourthline.cling.model.message.StreamRequestMessage)} - * method. The {@link UpnpStream} then returns the response to the network client. - *

- *

- * In pseudo-code: - *

- *
- * MyStreamServer implements StreamServer {
- *      run() {
- *          while (not stopped) {
- *              Connection con = listenToSocketAndBlock();
- *              router.received( new MyUpnpStream(con) );
- *          }
- *      }
- * }
- *
- * MyUpnpStream(con) extends UpnpStream {
- *      run() {
- *          try {
- *              StreamRequestMessage request = // ... Read request
- *              StreamResponseMessage response = process(request);
- *              // ... Send response
- *              responseSent(response))
- *          } catch (Exception ex) {
- *              responseException(ex);
- *          }
- *      }
- * }
- * 
- *

- * An implementation has to be thread-safe. - *

- * - * @param The type of the service's configuration. - * - * @author Christian Bauer - */ -public interface StreamServer extends Runnable { - - /** - * Configures the service and starts any listening sockets. - * - * @param bindAddress The address to bind any sockets on. - * @param router The router which handles the incoming {@link org.fourthline.cling.transport.spi.UpnpStream}. - * @throws InitializationException If the service could not be initialized or started. - */ - public void init(InetAddress bindAddress, Router router) throws InitializationException; - - /** - * This method will be called potentially right after - * {@link #init(java.net.InetAddress, org.fourthline.cling.transport.Router)}, the - * actual assigned local port must be available before the server is started. - * - * @return The TCP port this service is listening on, e.g. the actual ephemeral port. - */ - public int getPort(); - - /** - * Stops the service, closes any listening sockets. - */ - public void stop(); - - /** - * @return This service's configuration. - */ - public C getConfiguration(); - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/StreamServerConfiguration.java b/app/src/main/java/org/fourthline/cling/transport/spi/StreamServerConfiguration.java deleted file mode 100644 index d528125..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/StreamServerConfiguration.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -/** - * Collection of typically needed configuration settings. - * - * @author Christian Bauer - */ -public interface StreamServerConfiguration { - - /** - * @return The TCP port to listen on for HTTP requests. - */ - public int getListenPort(); - -} diff --git a/app/src/main/java/org/fourthline/cling/transport/spi/UpnpStream.java b/app/src/main/java/org/fourthline/cling/transport/spi/UpnpStream.java deleted file mode 100644 index 6f9b35f..0000000 --- a/app/src/main/java/org/fourthline/cling/transport/spi/UpnpStream.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2013 4th Line GmbH, Switzerland - * - * The contents of this file are subject to the terms of either the GNU - * Lesser General Public License Version 2 or later ("LGPL") or the - * Common Development and Distribution License Version 1 or later - * ("CDDL") (collectively, the "License"). You may not use this file - * except in compliance with the License. See LICENSE.txt for more - * information. - * - * 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. - */ - -package org.fourthline.cling.transport.spi; - -import org.fourthline.cling.model.message.StreamRequestMessage; -import org.fourthline.cling.model.message.StreamResponseMessage; -import org.fourthline.cling.model.message.UpnpResponse; -import org.fourthline.cling.protocol.ProtocolCreationException; -import org.fourthline.cling.protocol.ProtocolFactory; -import org.fourthline.cling.protocol.ReceivingSync; -import org.seamless.util.Exceptions; - -import java.util.logging.Logger; - -/** - * A runnable representation of a single HTTP request/response procedure. - *

- * Instantiated by the {@link StreamServer}, executed by the - * {@link org.fourthline.cling.transport.Router}. See the pseudo-code example - * in the documentation of {@link StreamServer}. An implementation's - * run() method has to call the {@link #process(org.fourthline.cling.model.message.StreamRequestMessage)}, - * {@link #responseSent(org.fourthline.cling.model.message.StreamResponseMessage)} and - * {@link #responseException(Throwable)} methods. - *

- *

- * An implementation does not have to be thread-safe. - *

- * @author Christian Bauer - */ -public abstract class UpnpStream implements Runnable { - - private static Logger log = Logger.getLogger(UpnpStream.class.getName()); - - protected final ProtocolFactory protocolFactory; - protected ReceivingSync syncProtocol; - - protected UpnpStream(ProtocolFactory protocolFactory) { - this.protocolFactory = protocolFactory; - } - - public ProtocolFactory getProtocolFactory() { - return protocolFactory; - } - - /** - * Selects a UPnP protocol, runs it within the calling thread, returns the response. - *

- * This method will return null if the UPnP protocol returned null. - * The HTTP response in this case is always 404 NOT FOUND. Any other (HTTP) error - * condition will be encapsulated in the returned response message and has to be - * passed to the HTTP client as it is. - *

- * @param requestMsg The TCP (HTTP) stream request message. - * @return The TCP (HTTP) stream response message, or null if a 404 should be send to the client. - */ - public StreamResponseMessage process(StreamRequestMessage requestMsg) { - log.fine("Processing stream request message: " + requestMsg); - - try { - // Try to get a protocol implementation that matches the request message - syncProtocol = getProtocolFactory().createReceivingSync(requestMsg); - } catch (ProtocolCreationException ex) { - log.warning("Processing stream request failed - " + Exceptions.unwrap(ex).toString()); - return new StreamResponseMessage(UpnpResponse.Status.NOT_IMPLEMENTED); - } - - // Run it - log.fine("Running protocol for synchronous message processing: " + syncProtocol); - syncProtocol.run(); - - // ... then grab the response - StreamResponseMessage responseMsg = syncProtocol.getOutputMessage(); - - if (responseMsg == null) { - // That's ok, the caller is supposed to handle this properly (e.g. convert it to HTTP 404) - log.finer("Protocol did not return any response message"); - return null; - } - log.finer("Protocol returned response: " + responseMsg); - return responseMsg; - } - - /** - * Must be called by a subclass after the response has been successfully sent to the client. - * - * @param responseMessage The response message successfully sent to the client. - */ - protected void responseSent(StreamResponseMessage responseMessage) { - if (syncProtocol != null) - syncProtocol.responseSent(responseMessage); - } - - /** - * Must be called by a subclass if the response was not delivered to the client. - * - * @param t The reason why the response wasn't delivered. - */ - protected void responseException(Throwable t) { - if (syncProtocol != null) - syncProtocol.responseException(t); - } - - @Override - public String toString() { - return "(" + getClass().getSimpleName() + ")"; - } -} diff --git a/build.gradle b/build.gradle index 88d246d..b900551 100644 --- a/build.gradle +++ b/build.gradle @@ -4,12 +4,13 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.2.3' + classpath 'com.android.tools.build:gradle:2.3.0' } } allprojects { repositories { jcenter() + maven { url 'http://4thline.org/m2' } } } diff --git a/gradlew b/gradlew index 91a7e26..9d82f78 100755 --- a/gradlew +++ b/gradlew @@ -42,11 +42,6 @@ case "`uname`" in ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" @@ -61,9 +56,9 @@ while [ -h "$PRG" ] ; do fi done SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -cd "$SAVED" >&- +cd "$SAVED" >/dev/null CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -114,6 +109,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` From b4c0492b11bda6ec3560546e0ea39aadbf75c7f0 Mon Sep 17 00:00:00 2001 From: Kai-Ming Guo Date: Tue, 28 Mar 2017 13:39:29 +0800 Subject: [PATCH 2/2] Remove not used libraries --- app/libs/cdi-api.jar | Bin 47879 -> 0 bytes app/libs/http-2.2.1.jar | Bin 82265 -> 0 bytes app/libs/httpclient-4.2.2.jar | Bin 425677 -> 0 bytes app/libs/httpcore-4.2.3.jar | Bin 227207 -> 0 bytes app/libs/javax.annotation_1.0.jar | Bin 6037 -> 0 bytes app/libs/javax.inject.jar | Bin 2497 -> 0 bytes app/libs/javax.servlet-3.0.0.v201103241009.jar | Bin 200390 -> 0 bytes app/libs/jetty-client-8.1.9.v20130131.jar | Bin 86957 -> 0 bytes .../jetty-continuation-8.1.9.v20130131.jar | Bin 20049 -> 0 bytes app/libs/jetty-http-8.1.9.v20130131.jar | Bin 94594 -> 0 bytes app/libs/jetty-io-8.1.9.v20130131.jar | Bin 102188 -> 0 bytes app/libs/jetty-security-8.1.9.v20130131.jar | Bin 88596 -> 0 bytes app/libs/jetty-server-8.1.9.v20130131.jar | Bin 346775 -> 0 bytes app/libs/jetty-servlet-8.1.9.v20130131.jar | Bin 97838 -> 0 bytes app/libs/jetty-util-8.1.9.v20130131.jar | Bin 283375 -> 0 bytes app/libs/seamless-http-1.0-alpha2.jar | Bin 21473 -> 0 bytes app/libs/seamless-util-1.0-alpha2.jar | Bin 94435 -> 0 bytes app/libs/seamless-xml-1.0-alpha2.jar | Bin 63146 -> 0 bytes app/libs/slf4j-api-1.6.1.jar | Bin 25496 -> 0 bytes app/libs/slf4j-jdk14-1.6.1.jar | Bin 8890 -> 0 bytes ...iversal-image-loader-1.8.4-with-sources.jar | Bin 226585 -> 0 bytes 21 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/libs/cdi-api.jar delete mode 100644 app/libs/http-2.2.1.jar delete mode 100644 app/libs/httpclient-4.2.2.jar delete mode 100644 app/libs/httpcore-4.2.3.jar delete mode 100644 app/libs/javax.annotation_1.0.jar delete mode 100644 app/libs/javax.inject.jar delete mode 100644 app/libs/javax.servlet-3.0.0.v201103241009.jar delete mode 100644 app/libs/jetty-client-8.1.9.v20130131.jar delete mode 100644 app/libs/jetty-continuation-8.1.9.v20130131.jar delete mode 100644 app/libs/jetty-http-8.1.9.v20130131.jar delete mode 100644 app/libs/jetty-io-8.1.9.v20130131.jar delete mode 100644 app/libs/jetty-security-8.1.9.v20130131.jar delete mode 100644 app/libs/jetty-server-8.1.9.v20130131.jar delete mode 100644 app/libs/jetty-servlet-8.1.9.v20130131.jar delete mode 100644 app/libs/jetty-util-8.1.9.v20130131.jar delete mode 100644 app/libs/seamless-http-1.0-alpha2.jar delete mode 100644 app/libs/seamless-util-1.0-alpha2.jar delete mode 100644 app/libs/seamless-xml-1.0-alpha2.jar delete mode 100644 app/libs/slf4j-api-1.6.1.jar delete mode 100644 app/libs/slf4j-jdk14-1.6.1.jar delete mode 100644 app/libs/universal-image-loader-1.8.4-with-sources.jar diff --git a/app/libs/cdi-api.jar b/app/libs/cdi-api.jar deleted file mode 100644 index 41859539094dfe8e4b387d5537af2629535c637d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47879 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 diff --git a/app/libs/http-2.2.1.jar b/app/libs/http-2.2.1.jar deleted file mode 100644 index 6e2b44e69af2717e678c3a9c53bc5d31f3f0e6c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82265 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

Xbr*m*2ZijhJhv58q@^V^(ZGv*ZQ*r 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%0Dn>ExmCOszYS<-T&E? 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�jZnwii!N@a)1 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િ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 z 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ɽ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%0Dfp$2Z-#wEgx)ewYg@W;tq`ol$ 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%0DlJiGeeSMx8dm zla^=oB2ac9_g=NqOTzvLSDCMfE3pnyvFgMK2~uz_i#f6HoEy+k@0yo~>dmFWh>$B7 zyt*+@=Uq#_MSDr)%A6kUyFN(^M6!FGTxorCQpt)AGd2|{t+a%u;m}q|7<9tbifVLA;z$2zM1g>|aH8^HSa%{(4m-Wdv4iw&%F zMyYEUjlH^8=xCpWxJ<(e#U-rZ2#_7j*R@uQ_Tb-Qp2t!(zRVt*3zvto^R9Odoc>)A z-S<$47}o^wbV+M+e)k3#k5g#zwcalCu4qfiBHxtxdxf3UD?+aK z`YrHFsxDo)JN2U=qy`i%i~n? zWKhtvu7fWlzOUZzij3%DMEsNP+()J@WLY8>9?6-C>VxR~4|Y;MRrlVrt*26fW1k2c@KooCmf9#^d33ic7BeMOEIb|CYSc87 zoe`YLUGn+`CHi$9PDn~PR{z~9WXy!;tnJy<$vF*04fKo~_@yxcZms5}I?NiyZd7ji zjA-IL+%y!peP5pT547M5W-U$$5E;xagBWPtXN7wU_93 zZPG2m-ZVBpy&LDI7NLo31yQtg&3e4A&7MK1mXy^|VXr;R{vS%Do4iUY=z+FYpnM1?eUKR^uY89GuIYlWdk}cVdld+ponNNv}e=P8^>C0k5 zhJ|23lzx;F`_64=XMV^5MO(bM(lBPJYYb7!qC>=IF;3X@+2*kOm^&YyQwtDd-HaBx za_OelBDU96%TcG*rv%EyC`bk-im@5G{5^td#b{3O6WkZ5f+?Jn*iGMGhKIauT;NQn zp2k^u{Mv~%rCdvJGk^y_r`1!psVfX3E3?;7q@m81KV!8aP}X;?+LI@B$GK*+lLYH> zs(9UvVWAsKHbWu?E8@64GyJ$cv+%gAGu2@a94R8gFB`NlLaOs-xT_0h(5jyp?Jw^s zJCS5ue%CN2xva5y@twxcHIjE4y*{%&-N=qR?Kn?$R8VhF%j4?q&=5JiY;zf8g1-_^ zk7LoCm-nR#yFP+~>p4o__FWvN74@djlAD`|#Y(#E_gzO5Il8c@sDu?CU8#ka6sDVR zd2jUIMr`0!*y2NB%n3#Tq_KhOyJN)9GE;`zGiIt+Zv<+K!44$a%5n|A#xU>h7EC5o zluQ`?$Z(w~>4HKv2DSocdp-|S{$<88TbuaR$3}v6A9z2p!d0|inXU_2P5IIrNxGtE zRTosJ2ToiO*mcRw&sLwO*t?%*1{RNlgV-`)<*WS*qR-X6Jcu}6bFFdjUpPDAM zW>59()ys>?G^M*lZ4t$!3zLO%(!B5QI!%;nw3T|9S__nFxRvAY3$csq1&-+y|DYe?>ZT+#U`YIT4gkkNL1d@T6fG3pFO@5kSA?J7`4-T9pzOdDr{C1#h1zni&RC17=#FABMl!r@ zfucz38|_@-vO8U$%H__rUMVQl&J}gsj?S;Lp&&D6X>Ugc2O7?3xNf*SCoJTA`jT*0 z@M+CX!q@drf*)bCokH6VD4vl`W8a9l=0vD9B3}{3v0)`o@rk$TfE~4DH$cdy2*$zV zw`v1?LyOW>a#U%kM~lM1SL0iuD{>YE8k{m>=icpo7k*yD3ciCL+PW z+`{|AKC}N6LH(>rJK81jObf+PUxV;K$vL)aw8od3CMYg*qBKh}*0x_aA|cS4sNbBM zhJ9(wdfe7N){fWb!9*2>2EBv43T9YXvkWsOF4JfK>_FtKFdQ#DI4O1YyMz`go9wmb zy_j__>l0nHRmo+>=FUA83kM6|>%MR9FRToF_nKpe>DY)TeqhuabQfW)XyP_o@c5lq z8{}b(LU$+%8eA!+gHak;^p_g$5U)30{IZ)FcCBsmGOkws$WlFb`J12*`sMF#6FX)g z@J^fKyH_}dqf~`EGKw%uiDb-_^mp4`QlD~>Dkt?QFGlcacX;%GzILhsU$`8_Fox0R z{j9y!`wr*NxVVNIo7}wC)Qi5(-zsmcJc#xg&uuBf*$XapFGQJiofbiwy%py0q}=dv z5kC%6A|u?#{P?H%%DRz$*NvoQ=+g~T36=*;Y|i^a3gTP|>cu>L$?;;=yVH#?2G5*x zBbBy&EP{ashp_!sd?4bDj7hK+T%@C~;AG`CBbN8LEpgv%BvAB+)QNn7a>854T5`tQ z$4J}IYHJ-sTjhQlot=+bRCHNr8vc>+2mctJbntj*mr52loWW zqyxMMpOdq(epqu2b@s8~!ywFESCZ`Py_w{(sb z%U&f}hR@z67WU4p6V!SAWgeriYF0lZpCXnE^Xb+%$U|>N&MkL-@8J){=kWAqIc2Knyx;29cGs=^={aasBbzJg-pNvu#Jjg9uvHn?)T_5C;VCRT(Z@Zp;QU4;0$Y}@qqA6$hF~*#kZoH1DrNkJ z*5;kySq@njX7VQ--I957LvB&6mum~BRfMu<0)tzfVtnbAWRBw3ZTMmzFy z-jP}EQl$27Pzf<8KOEu=C$z&H<-KwbHph=Er9q9zFCs@nC}UbjC}+kCjdiLt7{4!f zn&w*|J#%>5^3y5~3=Utt$b@UO>3ro<^=rNJ61w-jjIxlp z%vAUwH!*Pw`ntq345x&alSt~ak;qrMSyZIRNp|!m>bS}G^sO}J4ZN<=Kgw%n4=bHC zag!zP8D~0(xJj49Us0EBQ&Ol|ZSloL%!F6plV>4C%->DY9JA+*dD~#QeOW?jzs2?I zcoyvM*!frSQlu<~*SzLsV(DJzdARgvlc6@x-q9qI)<&1D(|X~$Ra(5`W_lye;`)tm zi?+k(@mj0Z8t(+EBL4Pax0lDei$1o=qyqg(scm;>vlrmfei7jKp z9D|!pn$MCsP)bVFQw%>EY0{@s8+165(!9 zXEH&4zK`P@)w4{a^;0zDs|I@xW$2DwW~UtC?_G$q6ZS>7v@1Qnelo63Fd zGN9s!PlFrvjK+)G10w2B-TPmSs{mAoG=!1HieO&k6x#zYq!e1Y1CG$C|uI+bGl z=*wvEa?V}2mP}8*NN`OO=!)=t+L5Ch1jE{^iohQ8Q)drXS)qYp2iq+@PkH9RZQMG`bxtBw`Rh32}x{(PwWi?4}Bh++}Kw*NeI*_GD|NNl4_8MX!O8 zw}Gj*fw8xNxwipCz#s^{FwKAX6P`iZ*rq`Ed$iyKMa?C>xvq65+=E+V8!}(F=~h}F zeZk&f^+decEcY!^6z?EvU>8B_U5n_ZLv@!zEma^rR#*ZBaubP)WtJ}rwtEbk3J)6o zi=a_!%~;lnZ}sKyWF}*aW_>qOdafjnn0h(R$01l;^x-S%Xp~{%As+C`d`;$~l=wYd zbueUgL7g7eA@L)%P!_zV^Kv&wB0R!7FIwT1NYpa8{5us1EYyo12Lh-`{bq@tQgsy7qUlc#kTw`YgT|@UBQTuy1lMMp86(xwv+<(_-H5(pP35 zfim6vbLU?jKNp^h7s(iX|Ov|4BXGR}#D!0IJ?Y5Ut;%*}iZx zVR~YV3LlD;V$_T;Vn5=h!}sG3P-*&zp!;eH<}qFl^Is}OVOH4CF@qB@&t+}D;0$aO zcw)vH6r)JNVUeGGhbOcw=&tlUO?W>)Rm70ef^Mj%Bg3SC{dK0~aARUjyu>xz?pAqr z$TqQD#ZaC_6=^c!o@nh&C8Un^&Vh>gad^0Z5X?Dj+6|eYrB{~%c%dWQZx{voT3|8b z1*l~IpBrugZnksw`dQ!pOw&efKnzEC>`nGFmEy~_SpioVjBeD4l?vhDkPW1BM)~Qq zCrJ-vW)n*v-0!CET#WeIMR+rAc7nPzs3Af_)U{-1ZNjCy#)EgM$M8|zx$;|kgj-X2 z!8U|Vj@*&HLFD=^}Da> z6bt1gw%9$?>@;*ttue8vo8LA#gPTgL6jJu^m}G=L+FWhWo4d;6^&G`MXsoB)f>Y)wigPSH7+LBk>)_c%B=Ct1~?~%1p+YS59swsw#ac7OO_@pgZS*1oi|KNk` zG^}d3IQE6$ky(yGSXGsYjnoonJY8VBg7%NKkLzdYG(*k)PL^kKq?K&scVa*D7 zJ0+xTEZ`f+;2{uv)obe+D`Ts;zNJt{OTxcbK)DpGa(l#W7TaSvBO$wWz@h}SW$mPuMb+!N`Z z5r36{qCzFj{eg-M#XP6)8odJPJz1%HD+Iy=umeOK%;^e6%F@W;u#OG{BXCMGuOf00 ztX5?)Y6$IL286$?uOTmgAovQ6;+j!oS02N)w9#nHq)1~X%1Q!^^9)j@7xsPC+&MPF z%a(H}qc9dozM!T=f2_ksdP7z3Q){xW$&{~H_--(Nz!2-cUqor{?$vUV)$()SE?7B3Zc5qayunU#1m+clqsrrnog z8#R#pF(}}g15uhT8G7S*&v0(L1m+7vOJ=a-BS{C42pNzJ$qAB?HG`NQwcjqP#`>HJ zMo`aU%LhXR@9v30{-;jzRFd|;0EgyZtEL1td_~zp4xh0 z#uSLicI@ewkPq5Vsr`ri^=wKQI)$PRUjG#V}aN|L%0r zE~{qzU8##xDIxo>;c*hD9};rXPafN+wNMWie-8-aC3vY$5Xj*r)|wDoH#233)vs-9 z8jqBn`l_(3=+}Qc51VfSGcPx;soUc;NirQH|(sE8T={%h~Yhgt8HI@$#XmPjekUj?la+(}=S(aNtWreK;`)=L>J zSJcPStQm+wC?KXGUPt(XfH_}>kYkf?{Rk5gDLp2RO&l5Skuq(z+<92C@goS^}F_HFI+@Q*#9;c9>cG8l&AJ>Mp{H6ErQ%@~K}Ei*Awjy)UaQ zOYK_e_Qm<8tvj#JhlYFxp<5wXKJvz4ZPcHVy=vFcVO+LMn%KPq4-!XN)Kxek!lOhF zkgUv-N?zBzG{&~=xzAlWGnezC+cTDEyFOmpr}nF0Sv+m4R$w?&W$# zu@^~1NP>~h`YZKMt=B87Y)I6%>vmS(!eu&&r#|HUBx25!*ms*rTZg61%GoEo92fq8 zqsFC%O@VRZi7MX{-0RJw%Sjt;!KKExUZhE9Jn3yGtXL&M-e$WiX_i2&*)1(e=#r3H z@M+FoPEg0klVKI6@vA|lux@6SLGom2BehC=KPw)$T+kJ4OBjoCtn9eFhMCWnrY}4) zeVSX=%);#|hVMO7QeR>7&_{kKGZD$bf)g#>xr9IOS;5e2PG1YGQ|>fph$=Qy8YxvsxwR=l_; zg5__MsrZ5~R8QztAD3P&!X%8RI=3E5?15|ltI^eak|+W}BLSw&-eh{Rbb(R(HU2$$ zN#|{^RT!GPd|qxsi(w_6ir=VLn2m_Bm7knpYMbARo0}Yt<`-^GR!o_1zyjtb_0oO{ff59>uC#>_Msdk^?&C~=66!a9)aj9Ul!{pR%qMx+xN2GG zwsCdQ@rqQ>q6Y#Xq2ZR9C>EyvH!@Is?ii(uzRc}2LulOCBch~tTxtxTP6~Rz@sYnW zR0Pe8j<`&Ti@AOMfCs^?;M=E=ov%XDCQCVdMWUtAvEQM6V}C7jZ86ZE&)}svL5qGl zLIo@PUuVHykE*{|4{o*pZk3-!A~{ZSy?g|C0?hR3TI>D-u8FrS=nGR|9d)Dq?)xNvcl$j&V<{Cu+R zQVg5>Q=Y`T_Z3|5Dqh^*y`4fN;O2lsp|mxWS*;F_{Z+75zoLv$Lt|t#5OQtSo9D@3AszC-WK>QR>MNK_b#68_yB09FBl8xPiXIdGS*O+ zcL!Y)KfIFtX%u_1B-OiWpD;KQp+a7EPi@?BdM|!fzUj|?dk4kgfgG?oOAj6Up~A8{n%f2aJFE9 zI6}a(G>at|TTLA7z-e=!px)&Sn8Wkx{u<^ds1Q9~I%UJvFyJ7n+F(vgV#Hu(XNL5qV1Ru>dJ5gFeKFY=$keQyrd|c- z;VvqN^5~DJ(IhlDDQx%gNyYh-b4FP{CP%^(;C6Ja#pcpsXyQeE{xY3E3Wbngg+;o;GUDkr8(4ABG{1)IvR1W~_mlPtq*!!1XN zGV_vW4@Z3~rS%Y2#LroJH?rYzv?Bc-)?{nMeE(poQq{{hSND>;S{hsQqQje5XFnBE zJRA7(9#M$r7CIA+>Xp=59Ca~w2Y1AUscV4_uR3rXTvruB6_%#IMc&dcnUl>h(>XBr zUv|CUE#9jLFH68PM3~yuXDT9D_o$2R6V;Z}b5G8_A~CX_cXgu4EVK_?xO}3!Ee68d zj5(4UmXRMSidxN)#V$2tQr>0a3$t}eyA5;gNjFU>@k8~mkN281Wap{VuM&xSGBG$_ zQEq@dPOy(nxf3COT^&iOrI&zEBl}@y@LKcyei6k$FkYo-US>n7tZee&3xiLkM#$mU zg(X^AQClVPnHz0$n3eGcxFbC^A{yTxFU>7{l0j8^IEYp6GEkU zOFqjkM~WWUA~yBXRF@$nf*m&r2@R`0{03HtQ3+RJ^q>%oE0PewZdMq)QQ9Jw3^JTu zvkKfc^0$^+_@|5>O4a!Ob@rY!!v!m26TEnADfc$eR#KC%mkc_$bKUeGx&{}Hae3qN z#u&#lTx>!lYtt5Pn_O2itK`Kc#r6zAVIS<9pF4L){NaOSCA98q3^K`G6Ocx_cmu7- zD|*fGTv?+Ylk3WRXCrs`5GSoT*$2GC58f$?4~)cCV_;Uede~SNXcjp=QW}dO=f_WC z6gJ4MRt`}h9W0r*rCMg2o^hlLZoNcZ?U92H*K`kK2*Fv%~cG^>p&<`Y%R9 zB9Jhila?Dex=hYYzX&jX-XxWGcK|E+rWwU+EPL9igmae>NHScrGp9dIGaJlO1PCn) zY7n`L)0|&2r@w}CDR(mHs*#lA{Hrwz%P$$#EBm*T-afRvSr<{iGG?dtE$_=p?i?Ho zKHku(cBs2%?^M)SfXdKx=x0g6NEY5(F@Zbhaqi2Gl+~>|`R!Eik@U{pU#igfX26@$ z4V&#<&Kv1=pMx_%iS!ao_P&`}d0gB%Qgj@OfR_s_ag+h6nVp4>j$$wLs2&&MV0z=( zkqv*)MX+RLp7}ag#&_dj{N~!w5D%9Xk2Q+lu;kRsn!;gRjYOwhSoevdQJ0Pp3fI>) zd2Y+*ELG1-Wbg*H#BSAxo65yr;kr=CR1i7cHY}3;6#@C(6AUpD3O5Q()Vs70e%WTJ z>&g|dMLdT0*PiXpr_WPXSUeV2e>+y-JrJLEm(Fmn0{#_uv$~E=pFC?>#(DF~+-#}m zG%9IZjWxpw5IVL#Wt&nX2TcELUEddz=0417F%u?w^X?D1YaE>D_zGWsuNpS{AYm`` zR23E7uk#Wo*^>iDJ}=v+9i?~kJxFTH+|zWC&N+M`5XhpK7)WKCdc>{NIJ-IWL^FM# z-CM?}da8tiVmg1b=lup(=A^vYkcQ8`L1b%!j_{;tB&9HJ>TxD7G&1AkJE6n@rL>2xbg2!52RJ` z&G+r2l@t(Cd?abm)50lQi#iY{&7RcQ&@q(!Y!lPSTjOiuy-3pdl5_+MrBW zowkOZUb4THfBXF8l&;yDw&-|!*)5m!x4x>Of|qo^_zCKIEnd!8H!oS+GC{AzDT}g3 z^bz>@T^!;jqq{BRK5KWwLQnF$Ctvu@R!_USO?9j2H=k3*F1g%r+Zhe>3t=RkyFIad zSL1ftg`piYzFqu(!yokL9^xgYj>RruWV``hvH$l7`R|m1roA52)S<%k`qWVtWhhrF zz@bzL2zADaVpNrH8>v0l-dM*KsvB0+*KYIlZ$&V-*4OvwL*=!)b)LNC0A~|*;D%_R zNH7e6w`-(Zk7`SXjA*&W`|E`r^p)OuaXg=sbre75sg{qd$uf&FjI!=ajrxLk4)z?* zd9YU>JjVkUP?PZM!GKx)5z_n<0{r_KA`B6TcfR3qU1bJApc$A#;T(Mhelz{)z@Pto zrYNo?CoQF>&Y~#&F9Hk?<3fG?{e-Wr>>O>+ggDG2{d^7?-~jSFZ0j%1e=zU^ z0>pbDqjDw^!4c4prr4f_WaV%s3K0}a`e`VR4i0Cx3!0m^C*atbxwt?q4x`S~`;{1q z8w@ZxKQ0{;2YVAYXJ;UvGl8IcO6~+8aKzKuEy9Q5<;DpRf6+Dp$oBMQYq>M66Mr@c3Y+X z&0tHwKL85gb0xJC5loF5(EI`Um!Kmk{%Oe}3$5Tkk4sb*I26U7YX37CdYmDK{%Yb_ zuu6ssoG3RGTnN?ga6deQnuCdrnd>3)&)o_CCg)BjVd#)u0SmZI11&sE?;ky-{&t`S z{5Z!yNc`Fgct}IS)(U9(pJ?z3xD*_os}>LFa2*ihGFS)hng^pyHPQ~nzYz;e#SH??jap9P8_ z0~A5v2ps&D`cJE$jjsUl{2w~yL)$k|WYCULV4KkGAkjaC4j3+udjFc6tD~DM=pHkO z-O09Z@eXxX0Q3YM=!wHK509Qwe|N*v@el3(SLRX~;tcxYWbpP+?L8fU`E4L5Xp`JG zIUO8II)83~pWi}TH;DGw!LR{slBAZW6FD+{HQ;+e7XK%iD{kiIr?tf=w)$}sh<{_T zelBwTE2t~3r<0MebhEcHGnKRdLpOA_zU!U)rMr}1+z`LlemRe2|R0QxlOYiLEHyL~$P ze-uf}*$Qm8Ihpm0i0Gl5_B^~Ywo^$tg<0mY05Jq&FCOixdz z@}Dr|FWgb(2f^UOkW?SgfHr`EqSI;oRMDTiJU6Mz~J{%CE)KA7z1fwlb}&E9!^3XT7W>F*+DoRr*c1Ry94V0h3$`DDkR zX&jw%2(EsRr!OMAI*U%*Rdru+pZ`}WP!EArBO0*u3R6QVbxTt^hl=|b1 zoF~_Qqo>rrdi;;jhp-^dJ1X%zE*Yv8 z!Yk^)Q@;XA1Z`+4lYhiMWcy6H_tD;YKn~Ek0Xo+a+u*m<|I^$l=!YKS5cg*R#2?4u zJ-xcG*c?v|Y z2=o)W5#%3FA@Ls@_~lB^6cfu;69-Y?CIm>2`=d)cr%*WZ6NlpZJ2U%Cm%2gT7&S<|Bic95dFhUGyMA%Xzk*$HMG(Btqb>R-YBVp1KM%ipb$ioUZ9aeKxaTw;h(3}-yi>U+@FDundyJa z=#C@5%5mKA0vwwHj-kC+GRYap5Em;GHINi@bNRRS;yAQP1|>WvV7dc9L&t@NIfTYFpvmMIDZPybJ69(u_c&eNg)gsOANI))FptYEz3PDPdbbkzUY z<=;q!9?xCg4Y2JGIu&|oniTm1k>84Sjw?*INi@l4fNOzy-1HxV;>hDUs3XVnvqxo| z9o!sG?#T0AW0P>e^xZEWpIc3UlHAi^f6C>@O#Nr*cQQCG8|U*~(1kfb3mKuhl11fo z@WZbBgZd>5`9@#@9l-*^hMo~RsGbh|AN4*<0Tsxd`?dkc&w*H=lT}@6r-T0^lAmd$ zlgm+$ck0Se^EMj@k<39P20dDkYW;!KUr33bHHPIXh&4jNG7I!joox6A^uH8U=b$qF zci_c*ehXIlZ2mw&0qnH+N#$%$7CB$9!vIKJ0Ahj`QJCW&NSsg$d%Od%sn1uKg5i1w z_%diW4C{6}`hUZXGc)Y8HaleWfO#q)A83bA>U}!=KdSW0DV%IvLylKjQ-M&XFpdj` z{^lRB)g5fi?9Uc^N{{CJiTp$6KY2eH`2s&@ zM;q`8o&X&>^eT-09r?%lo|LDFnd4#MvIbb~b2%9{1=4-_CFn&iko%*Ba*=g0r@(@( z4~Kb0IeT-5lQBQNSv!AtuUY``>Ck~zW%4PQSG-)!#GRcXUT5Wluu;jDE`T7*2zV=K z+y@z_;7V9Rod1Zcc4wp%7FY=!kOMuG4BkIG1sAwi2UAe&e}-gdkZIMO0b&doFrg*O z^!!xR!*%a7FvWyr(jEXMCVU7qnty1uv3mVG+K<@e53MEU7@BMVt>gfx z(1_pLen=PC8)0PG(RS`Xo59b8VCQr~;nJd^|wn!yY0 z*A<6;$NK9u$~I;8XqOxgg00qYr!pbXEc3)2ZOUwBv8e1eO#E z*QJ28U;dWKk=r^I|DVw1tiH50x@C8mBRb5gLyLUm%c;o!Sr0f1+YeWj<~_hI24N9& z__B3yD)uj_sCzk{q9p3B=g)C~8R$zeGlBL?WJu>uRc)|NYj1HDv%HO(@m!$$z$kHS z1WrKz9ahQVQ0KTALaI{s|M`ker%RXAk+FP0$*1MAIw0d53%DZzX6l=`n?pNK2vV6J9ne`-Q< zD3YKl6@avW7dpzx!#NS}kk8|b?I&BHZsxjjJb*0&FBN!?o>Ko<+!LXHn)c~)1zU!2 z96TUT;De7jd~3WD0sp$Hp|U@<3M`tySpU{r?f54m|EIUkTIge?%IE+o(jPG-v|HXJ zI1%@6*NLOAP4}__;NML{m*{ukBLjADP;dYycQn;Ix!dkgrs#ou0!$<@4d^t(Ao1_e zV426#!Bok?Rn5)uu>9hW;gxrgN;60>!h{2OXv0V#{T=>L&VRRx=XkT|a~tSFVSo)C z4O}8S8TVJlLJkB3&WDrV({lDH{9gMg05u!D)JIATeoOt?$xlWG^8U37cCv_Z;nee2 z0YVl)gtiPniW3n3ywlg4zPjjlfC1)- z$3`GOs^8)MQ&tP~K;05lS(&Oq%ug9B4E@_1_W^b(z=k%7HtI96{{*bOy_xqF0D}qh zF~vfsJrh{Y&d$yC^fZlkcb)+ez?}LGSB36OTp2frv#FWsm0#PxkEio$VjI$RKmgGP z0tkwu4m%W#e+m8XxQB-Db82+Tl=_my4pR^KTo$kiE!V3oC&2wzr_Ro?Z>r4eBRblQ?>WEG7seB|u;eJ%mky zT?5Ah>mN(^M^lVLLp@w(r{*{rI`D&tct2oK0k8|5ml5PS1^N*3%q3&`oVc(dTu}50 z;tuGJQsF%X^EkUFGyBxs>Go|9g~k7tN^=19ZYRp&pAv(!vWbo;C8EGB!3=?z6k5Il z>ZjlyXPBD(WR{hPvEwB{II0HZ0qwN2HBW(7b#QYvQ*$&k0Y|Es9P)oM@+|8Gj6)Z@ z2YL=#Yq^Y0K|WH3lL2|J*~oeU=}rLYLXQH*kW&Evk?zTeiKdp)hg*ZZfNY^hLQ>09 z5RX^{zpl=wH9h}LB2^>6)C0~1n$sAoQ*aMCJxnv5;#(dLOZj#IVX^^kp=S*bz;2r3 znsw-^3_klhKa6 z${z!Ob!X?;!;84Z0He?~NRE!bLu=T(9EC!MlK7Pz`h!o5+jM(11-RD$WT2hGCFkEs z{D_KxpMk2hIa$fZU%w`v28v*UdOXuA`|f$~o*CLq`e}aW^xXeDcX{`oTd;y%(Rw^)Q*{ZDH(Jq!j66u0s$r#Z&_%dx z(XnWVvoG%cwi&yy6mLJ`Qju)br58_-hcnRG-RB+N3*b(4wd#Ahh9ND~+zEtT7s7Rh zp8v6?up^{VftaW(4ez&T>5h1$`MiGjkYs&Yn0^*~KeCVN{mfD=U%9uE^S;aE77K>Qpuz)t zwD5@q0bfLk;bnvtHe+g$s`@@9V>&Z`Nx$g~^3z(n547YTviM zT+5HFx^gl14oZ51>1CXFxv0KNAAU$n7M_zP)%)(P{9Sws>FNVMs_%!6uoeurnW*1g zTQTx0qMnB)RpnTQBbOREiYB%B&fp)HY)#w+{7r;MO)phPop?(oQIdDNomE?IArk8V z?uWnDPdIe?xDzS@ZFN2DKygMNf9rujUV*Rb*_w;kq~ZvLbr#Uhw{>k|4}*JtiJ!V; z{xyu9e|DfDAAORsBc&K9$j0#z-Sl}}(wQrtkpZSVlJBGo4BnibXL@`guD#US4TNCzTJHO#4y;PCj&_a{J$7xaPyZ%C}adk-j@N_AbXG zc^*skYD&qv&v4Cf7_|^ZKyv-Xnt*TLw5Dkaygq}dj8-Bt=^E{5`HU2@6amlzx0wMscPL#u#GGrQaWqZxZmaB7B@FP3J;cZy<0Tg;f+ zpoM^?jd`7&HjD*rcTLi2x{|aA*T2$)E1J|;9g1x;Gc8Rk>He-xdJLO$X=PXmoY2h) zL*tA+uyA?mo&3{!2gzXKi;qB=lyuTUhmg<>T2NN5(18%L6=~O?|**2fB;;8ma>7OkearN z$kz@4K=A)z>jwJ}BLfxyK!FVaP@+waw`wVBtEnjK8whKu1S9($@0_O$S;L!| zGj;6?;vC_PGIJQcM=Y%_@LVW4&1L*Tc($4EeikCkIe02~!++jq(Lw-aQTAk>?z#Cz zZY=HOwJbX^wHw!7a6C;u%SGf1?awGTj&WAC6ySWQuVPzj;f%x0-m1#U85=Z+EU)z@ zXysgFXHTt2@_~RV32}FrCv7_^JwVX1kM^Zvc(q%#*QN}OQDq&^4ttv8v=SR|51Z#- z8zwcNr1N7bB)Y+Va%a|YnsBH|u}NZTGy@4FpELI8^#IDFI}7fv%+)s*YuHi+cr*w*pc8WT;S7t(PVyk36wWscYL^>?uO{Sxjht(~S|K3A(yvNGb6^gJzK%lOF*iL`ib~mt% zI~;=WJhmeMZ0o07xb2?a9)|X7HrlVOr`cTryMp0X2(YcNjkA@TTd#>o$zm=CbN^1gM}#Es=<-m??im`-We zmam_d2h39Q6Q=U%8qTIFz}sJhQAib)o7*EVaOhUDTRe4>gVB5( zdn<6!z`U5qwm#BJ9LD~>n@8#!dz#J7fOB0)y~9xJGie`Qu!#D9Yn`h}LRUKhvRsUi1TB=mnsy0cxV6sLqjr z+B|c(A5m!M4$9hdP$(jHS$Z`inWuae#g@lubjyt8+kPePdck4D=ZH(U;?!3<3ceJR z%S@c{OW6r^=7u?`Vq0nku#@l?oE>Xb+S9?3pwql)iSHpQshj>X38WqfV&1m2$OetQ zfdTMnnnV0%Qrg5`%7x#8-`yJ+uKqCLrZniqAUZU_+6)eQl6w?X{$ zBvMufTah$mMsbd^9@(RG^{o2cDysY955kZem1QP9!0Y8J51z}i`*%07%tnj#n1pdB zK5bvoT<~4s*!aA=O+3rEO5jaqLbeU;_BL9evw$=QZI4lX9T;y~1TXa3Ic5;xt3hhh zHc-NwEwCAr#rRPrGHq9!LGcc4@8v5?M5cy4<6eGstc*tDKyNlq^2|Ej?6}=2|GqMD z=^N^baWa!x7n_q{#%3}3J{{(-1|4N38L2fBMFe$iXmdtUSaZA$CH0N+G;EcIQ!24^ zp$0kdhGk7N>a z;~efOK_YjXgiBk7mIRB&&VFp|OSj<0?$%eVS@KXUFRVQ*VuC4rBU?TTr{H zMyeyXO_G&DNWLlB_bgRXf=K13d7i|E!3Lbw45}?f<~=Kz>5Ao&;z|T{?a8?=4kBTu zjZptaFQy>BDMx7w_%iTL>&LCA5L_h4Dv#?rFtPDMK*JrpNz=UkuA(jM};_RQGmj^ySMVp}Bp3 zQAN`oT&o?=8%n8?4KW5UGbT-z?SS;LM)1@YQuP_f*0*R0R^BX+N9%_U>MyeiEJ1j)sl(-#_C zf##;fhrH}wK#YmEF`?`SBl#%0EwgagypA?H%BZTC5vlELboFeu@rX*SuROL%D zU^WhfGg${i*V^ACRCJbZN3U-o68m}rl+E@hMs73oAT*OF`Q|>w?`<=hnm3H>AdF3- zz6g^6E3@{4xoAWEuGlLx6N#4T-i)kXxf`By?owywC=93f!erBG4FTI@wr~Q_4!g@4 zof+nv?4=LXMJhAD5O>#sI4O)qz`TOQy28$%^I7(uSeK>dJbBcQ15cy~q*ajSN7$NG zYBA#h3*XQ$vD|l0tdt6%8{>J}Gy7GQy4gL({QcluP87w)4z}sKByDKS?zvt%N-UTe zpfGl*rx`}UFrb5Cui>7lPLWgSc7~=lc^|Mm4cBU9`rEdP+Nb4jr=Co;hhedYgkbsX zXF7A20xamUl<5_FFP2Y=n^gOPLoD}kS9Wy%wo-entnZ~pWZCC_JNx@2x1l@MR^3g{ zf{D(iV83*HT%rb)m7(EmV>k_lHVijVpg|F|8(%V~dJWx7M1^;!YEn8TuK z8<)F4Jy;sdG9Z$SYXZ<5$Qv3G*W+(bwPqP{m`3Ih@#0sOPrRGCHgA(04!W6inYrlO zjLe6X7m4S6`f{HSn@o8~MU{Xrm(#&kyGFLbAzBpJ!PP5>rTjE{QMhs$%`Ov1Qgefjv+z1|sy+VD0t(TK zboWmk@A@l$oF^1}SARm*6;>*iw1SkB3<}Rnfo7%#2dquGJ$`38H1(Pb~kis#Ow3|iX}VeNaav1Gel7fx4ggdhy~#ZK7h1qb{dOHSy6%K|EjX|!)LBJ z9FYIF;~&*rF2F-Oeh|G_|KxbLpBeoAuMD2opI^1CrdYrnZhkIJ7HCL%pl?l?nd8FP zk+52PA;sFF`wq!0=x*%o5l~C>N1yZcyLR^5Z#Pz%8u+S}DwUjr#yE#^I_5RUE=hm1 zh#oSiRp~gYb3H1e_QL6zJ}M5AiOYHn87VV&S2AN_ zgjjyD)sE6Sl7Nr=8xU!Zces0zE`}O}xVR=hBRlp%ZL(xG1o%5iH!F`wD%!mVus)ys`0 zcl+=Ch*6aoEr|J#7^NWlz&6{oa&G@{p|_`PapKbLvyA*J0-IFmE+e$COTSJm0a%MP zlPKTzDNcLG#?S?nES#5`1FeTVmuS9AGsj*z#eHQ~8_}*iv zBDeJ>^rX=}#+ta(fI7Ls!L7u}2#%(kZt9OW=)Bo_A8fsX%UbHymMc8G8E2}aw5vl@ z@-+}I2kh!Ybs!krXF-#yxtQwJ^r)=OOCN-t!BriwS6RC2`=p;t9%;nor?KgxLUU

|QO#h(d@zUV@J%uMxfY{z#xM814c={7zw{3+kHFa4i035m|Z}Z~hC9EnUK{ zlIl!I#R;WEa;8}Sq_Be71l_55*!}3#whli7XUX^F_T)T#SAYnX^?cR$CJ^!^Wdqv| z;;Oo&&R|NZFaeuuDmwWF`dT0xxIj^d79R}0n53W~es*4uK*iGpY%5r64rIJ2E_$8& zsdZ*8^4Xj5JN|vVqx?nVvu)8|+E=A0rJSod%aiVd*DJ4+NYs#UZ!w4tsi$##9Ht9x z@3!THEy%3-@5T(|>sAvdOpq;=Nb6*~sTVa|eOo%*aRwWkc}C*t+l(!Si6xlaqEY&W z^aq9@Vac+09W=LsTsBR|b}?=`1<*Q*3C-jpdj0vPf4|~rGNFGT4}bT+4}T#u%8$Y= zX4@L?eC7yw^|G~shx|NxYS7aH?b&gnc2!D;49HaDvoY{ zWWX?g2kmBHPTQxtQ7S26S0Gr1t8L!1YBR6QKGdyrfH5fPm6aH z;RD7sT^6zt3ciqOmR?>sHc#+I!l)x5LEKK!XPUcWBv*n9$n)#_o23`e8eWtdO%kAx zEDK(J!I*J*tkIQu8ROP-&@76cLsQ&=UR-|+T0M7H#p6t>q47PF7UlKt8i(R}F3C>(k=JCmjJg;c*+V!TPO_1+jQnCwI z%$73dimQ_Kwe71}8M~G9EI3|t#lX8pKHuYH5w>IZPzoc@+#ng~jnL-DI$W9)uB%%m zBc^`R!ml$9^n5Y4Mpw*2ZB!zNq>xWCu({%=!BS5f|??M2u-16Ap7MJ%N)!JMOmw{@)=L6CZQPIKl5B_yhir znvMyE*|?s7wV?z5KM(seTVSGL_HZX?gy&8{JC2y&J335c%ogSZ8BFwN^# diff --git a/app/libs/javax.inject.jar b/app/libs/javax.inject.jar deleted file mode 100644 index a9dfb86d27a3b18b646dad07f15b0d28d729cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2497 zcmaJ@3pAAZ8=e__BdVQ6VP}XaB-E%}=Fl*jT7#Vok!`CnuH!OtJISTRAVjlh&B&B% zV#KV z9}|W8xcK}4K;j@WF_?H+Z@m=+!f%9Y$YHsdAIuaauHs)lJhXoB)Jwxl)2($d4RG`JXt;xGjq1L9OcrMJ`MG~U zrfGA#W%{g~Q*R&RMJ!jcUmw470i^6VGu+d_h`WpSp}$Q`<5;GmO^y&Or`POC^6E}x z!dY&MMZc1Z$Dh*wv}7SGvM=*q-Bnw+Wxk0!$zntj5x5>G~}PeCCDO*+hj z?StHR%<;Pz)37Q=LakCVn#5H|s(xWleBtY?1CEsW8~O48k&?U1Zl#9A9qC_(w^GG= zGJBYaH!UkvQf3zTJp_+~N>&|38SVswK=u54Yf=?NNwp#RxVn7d)Ed`-hQ+@2B;?Mq z?n_;<)jOdFbl#S-hgFh`UR94*diQy&^y#c}ugpUK$!+xf2Ae%Zq$`ev@Fo|$*1RQFZqr!~BUQJXyw4^K8|Aa@-{dT6makYuEHU$BudeHve`xfqF z@!gVrb8ccxhF{v{$-w4PP7kKxW{o;RSEHt>-^M6tF4X~h81Ji zIe@k0$hISz*Q6QEUJN8NEzov~#hwL+Y0f1l2Fv;lb-Z5b81}EdYFZ0AH>`=)Mx)Rt zv*u{&C$QE1H1xt_J8Z4j0o?*}p}0+Vx3NjC#_wGu%r8}Jf(Ux+p}i#Z(!) zKUBi6za2^@bh2~|Le8xEzDpV>-3X)h+h_$0Ur~olCmAS)p3eGFv6?~n0iD%cB~eT6 zT_2e29j<7r1$#ZxgHcV6{Py<+su&_?+oz`6)5KpX-;V`#i`_ zBbxTmn9|Xli{p(|tncfn;%+UD*4L#8&2U>=Cy3JC(y@BzZ1(l)gD(2<*8Kwm3(VB9 zh!0^A;D;ELxxTq}JsUmp*Uh#l<;v_XIbXAC{i-t%`4G?FZ$GOzKOUdm=)}9p?I;n~ zjf;#=Du3pJ9uB=YtB#J+O>;sP&Gmk;0{kpsIXc0`h(AD~2z0RP9ADHs(h42+U(TtWRAM!fd@a zc%1`*9DNlk$%OYW+>^iER4ut{-NS|CWLq$j)A`Eo1#Du@3O zB*D|y-P<*g;`^D$8*P>tv+c1T>?S>)_s2+;^jN3wEct0yk;>%}M9^_13$Ka6Br@|+S-ZvX+k0F%UkagIP*qm z@|Pk$4Ti{pHk?}6ZUj!f5d{8n(^g^M#^W}_2v1u$HM1VvFq9~HEsy7#=Bq4$%Gz~;igg^S`^AG`1l+FEs$4T%r QKp+3C)c7P^g9_gM57H-)%K!iX diff --git a/app/libs/javax.servlet-3.0.0.v201103241009.jar b/app/libs/javax.servlet-3.0.0.v201103241009.jar deleted file mode 100644 index 61cfd76b6048b0eabc0b526776472bbc3097b5a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200390 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 z 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�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 IJ~t2#07ls}CIA2c diff --git a/app/libs/jetty-http-8.1.9.v20130131.jar b/app/libs/jetty-http-8.1.9.v20130131.jar deleted file mode 100644 index b9ad88458110d5bc1f9207e9f44407cd5167a6f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94594 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 diff --git a/app/libs/jetty-server-8.1.9.v20130131.jar b/app/libs/jetty-server-8.1.9.v20130131.jar deleted file mode 100644 index 81023a0ec5ec33a521cc516afd56781705101d73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346775 zcmbrlbC@U1voF}TZA{y?ZClf}yT5JQwr$(CZQJf?PtVTp9_%@1_j#Yad+U#?tg84_ zW<+F0JrNn9C<6)x1N5&W$wWZ-e>ML71pW6aC#EVyCnYb=p!n}(P(X=)$*Q0zrggx8 zfXGpRfYAOcnVgWkl(?9RD!rU|iRO;|CO4X&#GzlkduI|6SgW0NC4cl!0``;&ZMWCP zFd7cW0ovh;8^v{fzd1*Ks9}Ty`9hTSF@e0ey>|yp)`L0Oiv>h-bWABh^4z^UpTvVm z`wU)Mfnl38DrLK8FSkUcnZgAd!gvKLc#UY<^HegER5GRMeZkgasXmS=_v)DCOsbK` z5Q}HBj}SMX`!B!WSH5>oYq=SQ#btb1ibmWv>9z6)hAkk%`Qqr=P6!MyC5 zM^qhnEN-2d(0&tGR-0#z{iIDDIz?_OQS>SC&_o5wR)$z{#b2Sh_c`8#AAxXCPVf(- zW$xh1Rc`QN5h^l3{bl)+C<7$}E<+^XAk*$*R&Ydi%TYMNBG-i6-;PZkErS%%-#;jw z{>(wi(yk2~Djc&GxXd4pWkSf`%#*Es<5ad2AB!Ab`?oO^FsHiwv5`7FT@(#G=dHyS zmq`n{BX`1abPZOW8QwP6ej}y>wLCYp2f301wj+1wW~U}M*iGZdFw$jun?#>H79?kE zGABPe6S{P+mEjSHpi!>p)ZRA6CkvI6st6E8cXaQrXOlHS{Yt~pHq+VcV?KDd?-X$8){LC2cc&Yyxf5d}JdRp%f|V4D5)l%XwvmE^g9Y zo;hXx70OgARsQ}8eXzjJ_p}k>sP;}FM?SBd;d6sCA}xp8tjs@bV3G*nle4NlX(C=jrYWM!<-)jD^k7_jbw&&lAqxG zUfA@id=?h{%4mYx#j&re-P89;|F|o?BS#-BbpN9&xny;9SLl&-a(CYiJ-{?P9C$2B ztZMZwE8;W%nHxr{bbY=dG;=lH&3)*t6LTl9H`5pRRGKSLJ+TUjpFGwl8I0Yj6QhL_ z*NVC)qfy}jj^Cq8JE6oLE8(%dpldnQ#T^E7$XyE8rl{!J)HcsAIAqin%Rg zGnf1U2H^ZeHR9{`HLgl(k*Qb7OJOV0;9-U+mVJ`vJ~k~Rj>MnY5aj_jb{iTdl^!NX z4bm|jmpbyqzqd7SsKnC;;dGyaf2mbzPYpBu>29UyuTt)fjHcQyuvT{6xu{3-+@(ZW8+t=uuIT+qjQ3f$*=(++I-k4CDj;_0VkC+Cu*x?Q zweHeL0rio*@LUFp2L%qF#NI%9%Oe@E-x@E!DM0_=iIVje^7mG1|4|OEJJ3(L@2fbx z68hr#7D3-r9N|#g^Q-jOQ%14Jd9x3B-V*v^=q(!kW(Y^>wce)#{X-~9LLLNlWXtyI zCDtwk27-+7#*2v@N4!gvdG9IcU0p&H?(_gTtVjsV_Gl{t6GciX7Md<}ooZAV4=&cI zhyh+ADh;ny9hz2tTM|kOd+1NAA?7HkUamF?(#TA7B1(lGstRG6vQ5mWofr|FG7dG} zDmp0LGE8#OoI*|?(AHC>R$t1Oafzt2;BG@{8#1SzF+FncK#qYpmh}7J#l){KWt05= zRh(o2SVnQjm)(iqXfB)_b>ToYaw<%xaVB;g=?v3#>;pAn+9C1>s7JU>+u1Nl#J7VR zIl9cVz4JgytMXZm>RWh{)SIO`wz-_FLIO_QWZ>aTsv{4N#I1W<~fW5EAcx;(vpa}2^C}*a4$&Xpw)#a z5tx1}%#HwAGs?>i&b~_PxpG(~xmzZ4oN|+w-C-4GFXI=wblZ!PhG!;@oeB~@ zOYAfU{FfCA9k99Kuq9ABSIK;+uIO{sV$1BiiIYZ=glYfA<7`Tz`{7C{vsop(DNU+e zLl?8CE|!FIF5zW$j^ap+IEtjR&@eDLHfN2ho{Xj&b0+vQ3xf}pknZl_$P@%y=pDxZ zqX4Qn%-~0Uw5?{41pcZx%v54GoW@L>yB?&LQ04}cz)+gV5;m{aEROb^sVv$WxT_c) zXo7FhVqIGj&YQtS-qh*1%s@#(wjVFgKpdQBZ!rQnvZku9i+D$_SG{&J5p-D|^&TcU zLpzt`^*-O2p~TkLB+IGiQ6<$DW|K2pry^BT%bLtK3?;bZU}Tgh^b8^cfT1H+IHq$E{T zI>!VmnajJcjs0WyGNe+inT>L-SM6JX&wX{i7C&cCzuTOK<(9o+&RVR-q2wH=ya)+& zmY~KcCX3AFBC07PR^#3DvRT|^oSDjXTj{84CKHCEOsdb~mE_;;KQ#HXR(6IO-1Fq& zjU%2C+^g%XsH<&DxHgadsUS;oge3f2rt4+aE}Gz&LIIhJWMS@Y9S|+S2nMc-H#S#| zB#Dm$GNpK_B%y#TC)HSNr|o1^_rQ#F84DGjY}OKqlU8~g&aLZ=riksiU~>qmR~kNo zeBocwGKja#Cqj&QGcl+hsGpRzozo zjn52P*DmBfpZsutGge?YU;i)zvo+6DC~GNV?U>J^I8bZr>btnQG#!}R!F>IhZ(Qm@ z@QyN@w6NVg%2v}Jk=UkNDJQ^p>R96JswEf8&_)XRj<>v9J^JbqtHnnM8_9)>2gfD*j}HSi_^AIi>A4v z?bRp^nV+HX!DLg}by~;+K$PMw%7@9S7$kTzZK;GHywW5GKAyoRolnfLTlNmm$ceE2 zN3pt-Z6#1RFyqi$=9d3suOln0JbN0+?J)eK4~<;CvOBIuIpsshL12r3x8MHMx3h1p zBIEob(=wwr1LHDtqc9cQ!Rj=ulmBelQLpZJGf1*t_VFs}esHdnhZTY37*~u)Rhu)? zpq$iS2`xl=MhPwKQlfzf01xXm+F*f3z%H{+i!U|+Si-cz3K3A{h#V;>0WZ4mE#|;C z>Hr_1-P#}Wp)Br%U5GYakAcA>0)|wIbKMR?cmWim>wR&HY9kyOO5Zde5SOH=)v)Rm z>R_WBEYuh(@2}K6sqU8P#MP_yXJ9%kD7lhYlVL;opnw}|J{n;Z=)V%K@npW>nM(}t z=$-h`KO(kI3S_1r@;rhkBhF&*=aA^eqkkjoIt9Nvwkoq@QER+lk1bjTVp^O)Qeu(} znE#TVy57(_4180Hr38xW0HMx>r@VkU*SqzP+yR1Dx#b1sb3zpqI0gD})DRSF0_Hn~ zIj7hLM(+UjWH{NC5LDO(n^)lW-;Ej50|GY#_3Wd`e|5msaW4ZMuLA-v9RPE=3!{8G zz$5ymMe2JoYI*pCTKRd!Hml_86D-KPwop(BO^eDKW!BZB%NT&(U4BKbNbU}EwXR9^ zhM#=3@e8&5{=TZQ>3};rl&QMY`zU6LgB*>%ZnP!yC#*LZ1b^g+x1{Z;v&8_zlPv$7 z$_I$Tv1ts4C@Ed`r^=h9v>o|(-oPBno>lJg>(Lo2p#+{SfBpmmBYDGO|J+(PcwE?# zcb8-D;*}f)5WYGR^cwS#Tgc+GJ%@5*1hjDrk70dh&s)dZPT|PzwiP^Y0O1RGrF(Y% zNed!>t+Aji#mYC_j9L+?34%LXKYy^BLn`RUz|gPD`>5mXDYdnIOX;`f%aVKf!tH*E zUG)zE5i^Z>qy2IR+dR)2ZU}DyhLJ5*O{z_XoMQpW z?=}7y5Nt!^oh1vHhTbbG)}JD#3gxxFcx*YB@s>kuviYl3wB}jl<=a)$Ya5JC@CCV^ z@((KMnJZzV^Zg2UoU3!K^O#UaGTqd@)3Ap$njv)s82S>Ry+T*sNohlE?t^>BY>xtf z(K`!M4&++|?E?)9&=Ea9^&8(Y;mQ&yMaTswyw%nydz6vpDA~iG>h?lT*M~}efOXdd znQf68AGWjM7*0(8NaeYr;STxah@bsQYe=^pp`!#&O@?^5TecltD;L|O=jCqlXOW&~ z0CiXD7j`d)!^fDq#hJEa*-aKc%h6OBr&e!*?)-?@NCL-CoCivYIv4 zISxe<0@ewm>_oD96E1=zX66QzIcY9_Vsv*gY9{h3Mq)P;g~5vJ0Q(Z#Wu{lgANEck zhuxDmz2v(rX%AJIpH;DZzBABCFY9$pB{ub;32(J+4U_%$jI7-ulTvRR>BA7V@nm~y z4TE8r4_UEPsm>%Pc}gy#yInsbf+(^e}fU@tLy1qz8oe_vv52up2*(+N#z<~{=HxJoLl(33!dO|xR6K~BW zwr-O9?Svkz1S5+q*sGYJs~GsxgbzUqYpfWV!h}SAl3dipIaNe}WX!qSm{&G1^{DM0 zy0!z63~N9}^_evCp84kjk3>^0o(sY~hda z%rCT5rM1>8O?P-mPgQ3;NC{tq4+P4O&8I>Iu>xl5-O1pm_*%rI-moTCyOV~H>tT?N zID*}1YLL2AzVpN$PTCs4%x`zeO$T)ZA}Yv-dH@lbp1Uf7=|%PAq6f9inTQs*3K!t# z-y5nh`H!VZsoXX$@5qm!xriygdkcL81>_YWr)3|O(Ah=$t{%Y_#EKUzgstwF>1p(1 z6Zu-C)&*J^Mp9iDDb}y1U=NuSa-221gS}Hec8zu-fddV_5TAEwzf5Gy+Ilxv-(&i( zt~WkRLj_+RKZw3ND2;Pu@z%70JI@Sa+VGYHJ1adbc*h==9s*Ua{N=kA{- zPKaOPkA;a;(@L@IgWn64G?2o9NZ1eo4x(;S{0F*E_>;&+t zNjUVBxGP71?#v*lJ0+7;iu4!b6ZUS{``z3V_`bgwkboc-(GStJN_MI|*pXltqm5x~ zYmIhS{Yi0@*pvzIvPySN3^JazNc!b^l&9o}7?HAXNGwJCrN2N>90tOz<)MOAD^Qf5z{zPV zNRH69D)!en?}5G1tQ-(aB++jS`BKgKinMOlUdJf>t)q?bhB+f0WhG6I%x$`z_78id#$eg{wM@l^R~}3Q}s?wO}hYO@cQBw6`=l>SB(1 zsy{mEQ;55(X+u&=(K^~DlQ-(p!p0(_Zbm;PWFI>l!1ri&W^YZBdcPcrb#KaDJ;&y3 z=md}kR~Zx8@p!2}4#(u z(XglHjoKo>vTZnqG%HX*%r7Jt4DlPtFPYO4R9itWJtwE_Zf5${+sDrvgmc)8fQr_% z!NzE0xH5t*bh<)SIgbhJmv|WQ%ClEsfr$*+=7NX@SeyJBNwLvq?U75i;HV==>9b%c zoB`!eDzd=Rv)}?EleL$iUNT(;{?I`jn3}w5MKBU%&9ejosFIQ^i;Jq7Bh=99mkxyD zOP1wJc(3zlyeVhZz0CaKac2P-T}P^;%9RVWPo_L=JF2xOkwbl0zI!in_Q>)6;$8PD zAIG`7%o&U`xR?wbW6D1-PD}VO8Z3A-)MvuK+>bkd6eCi}ifyr+_5;J=V2fm)a!82Z z6;R4hMDhOSUF5klus^!mPDcuw8(;dFjilHQa)_OxC_n5Kv0gsi^Zi$`2{;kU{fFsl zLMh%bY@25j)WO){8mW`Z^|=$jf&RPBe#~(0S%U%r8Nvbqas89dRQ^UiZA<}w<53Rw zcFv}f0Dyyrlc9rysnfq{FDH3MWl0dNf3I|2n2v}DU96l)7*-MuOsO}Sfy&h&lzRGn z0Qy26x>$;0gW3Jze4%eRC^!3IpKzb>(%$p`E~7%PypBf!8H*n z2ori;vfm7(6>3<6Rm9jDY_u_iZGRk}oOiFZxWtC%ZA<#=+oLXxDmGgE{P4H{5YI)FA)?^dB) zh!Fq`NqZHklo~a?82#vUOGj=+iLMk(Q-+1brb@e+H3Sj>E#M_kq&c$){mfk&)?BQm zY6_w>_MYRcRVEj+*lL=AWyhWM`VjUm(<<$Myr3{bk1A=WU)em#N^1(z%9LZ1YhA)w ziGV0cu)+xam{x*rVGQPL9vJnoWdv5&SNK@}gk10~IA^j82^XYV0mJ9xI}B%j0|;G0ljHu)Yj8a_lR`37+acNmmD$}k%B z2YS2aAR>70ZTZ=aXwQL62=bdEbdN}{N8*||NZP_fbSO`&La6Q0rJJNKb z?TMJg3d=uu9mjmcuYY3^f|HzNcSe&n_(nFG*I%Oq7QHPq!-Ta2R;hV^PV_D4dH@7I zMMXrp$lSjn|N9Ddi+;P-Bm@FtQw9QJ{HGNxWaJERGBgH=*xT8e8UyVAec`6)KpUuz zV1Jvx*zTG=Ini-Rh7%j~*F%FTDgh_NJAjEO4iam^%REBCX6>}w2jwf@71g-)^nVVo zqO!tT3`C+Yd+O9k*sfIC-uPHrTVDK`^ZIhfu7l|}~=`pIbuiQjgviGTRp2{~a;V0cm-%|qv z<)5Co-vN&T%8wL??vLim7jwy9A&GsJ*Y>+XtAqlojeRON0;(?x0@17#f0Rx2-wm7J z9~h*+YZ~i*Gp<&@#}Ouhs(vt#{VAFY(meDho25MPy*+>-`O{Sy{vKvAwBx}4z_z97WO9kk$rrY z^uECF3#UdX!=~c>#reUR%P*gALQS?rnIS(BG5i^=>x+^n6_i!}L@S+1Wm#at?vinI z=KRi^(x%LxSE=yw#NO+l=z3Wne<@!ur{d#{JaCY;Nx43^_*b`Q7$1P>M_-PqV9kjDb`b z^ZjjP`3%LXBl$zO^l{3PuQp#P?eyX9{!aOk&#EiYQ?KN)>h~9pZ_Q+#%KI&RUdfm?K%};A#_EMF$u1#o$M{b8ZI3Sd|rwtzB^rQ9?5{)ij8h ztn<{dG?3SZbt*)R{D2GGDCOW`qi_9$L9;dz4}9#^#B*Mq%&%v`lRM{oP%JL8j*-WD zy2(@#tuxHgYdF7jXd{pdUh0Wtv6{&h%ONJNR{8wp+e6}w;QFMa*1#!Uz5UHeMi4tP z6cGcfQOEua7LmU3G%#9(ygLb#t6`>EphuA>`ol=~2%2heFxKf(03_r98 z?`-61YuWjd>`sd;vl1t{#u4_pdj1gm?I5hsqRvIm^aH=sFxYru^;Xr{*IZYEKC`py zXg&CHaRYaAeiMHIGfc|hBqw2gBMLyWN_e-3$*J?m6QhY+8A!m<7iGhgQ5Du4nscj& z*W`**lal~N79A@}nLFQ=r5NjC#!&#=&ae0TfsHZMVlhH#d%oTBoqLeJn!S3 zj$sXH&N0v7+Stw+py3JG$u;9+8yGyaLP3Dh>Q^`Xr!udW%>5(R<&_&AH z9P6zSv86LgUds3~NafQoKggD%DP3w-;T)~=wc=g_-RZ3jP zf`18h;fv47oNyFcnAsBrl7Dh76R(EdtamLZi*c^5ch296dabB7Odl<@I!RL!)Q!*< zN-!NAXamOXtJM!ct95ZdIrxjW|W!W+BczYlte$_tIfOAlX#v*#GbRnIi>7X zKkBIVYMtn)`qFTZQbKNye_RfO6jPFG<3v7_9My>AQecoqs3m38Wv^glaaq&)5zWzR zI=^=r_4E|1TD0{7uQed95!0?dC~AvxGs8V_AU?KA>$OnLO%t+f(?P}#q!Y`d>%eQI zW0bKC-O#u$7fWIW!=FWmPsbC};9TRR;yBdVhrlXVlPkWZwf!Bc92`b6(^rt7eDo>Ph^Y<7XWtcZF z$<1&u_x+Y%Ypos=A{pvnYh;B>`WPI_0WkL*9Eh)$F47_ZDv~mnLfDUgsj=sXdD_z^ zIEAUqoX9(2_quf?)Rc(cRudkOk~yx$F^1YPB)osXRk93IJUms!hyW;4exf=E7uXuj zW%O2h@TOrcULLj=TW1DxZ4klCUZR1U>s3@d__%Xk$xoJqcJm{pxws-t5ZR4i+5W)J z-&xe`Zcxy8ziD497cG@JoiDU)#`~>($u9Q;&H2qh9&(N66SFG~*zI>Y?drxQQM9wr zHe0#pIaBFYY6P4F`sfbZh#jz@-VCt`^UO0Eq|zLRkICoO-qqXq-Gt3EnbB!O=_8Nq zpRDNoNoQG#9z9WJG?x5?G>8ZiiFAoXmpB$>%#M+B1c_kV9Q%*ESblN?iIG8mJ}W}I zS?OR4&!^!yRPmZ_eFdrEf=$-+)y9ib@SNV-(d51FE1yGlB-HHO=ZcIr;f zSin}hJgusRCiYViTHs5l4x#q4ghV9yN!WWr=HnhN!;#;;cHP@8V<=5?mxvi|mqT!4 z(|HQQ6FLgLhrDR;_$1Vx(LThTBkpTi{KX7rUA2QTOwpSWs1(c=ID-?oc;#3WF=P+$ zs7tC8$Sb4v;w@}^-puf6S$6{kN_&87gHWq4eBos0LBK05F6$UrV9kKaeKUkWNS?(# zzjywC`F#h(+<=0j>~SY94liOC+qwk)i^>H!b&uqP%yQLv^TW#pU+xz<{LiqR^4nR@ zCCJ5ncq=MEtASJyM@8ql79B4t{B9xiUVsMc8<*T0J=xttwK1Xsay-6o8bqHzBDU0PzO22X0RngNAi|+0oW3;v*Fv~- zNCYd{08r{ag`?LeNY-9-guyJT?DCRENi3R3AdSQo-@y=6p)UBoWciC zXiS!vFX`Gv50LMOlYGwc1gag^yvZ-;91>_DvV1tCFI31Gpf}wOeai z-K%Y5R&drM0zq}G-<009k7KNFG+#09-nzzQ<)+pCnv_oV1P~I0-~1JF4N^2cawl7C z-(Y?yYJSNc3_=MO-u^YiAy5+V$!_g5(V5D|;G9<1>*8+ko*8Usc7=Mzqkaz}M^fM6 zqi+3Y?p*Q1+LAwb*wh22@AZb2=$Jl|NAt|8SiebndDv)Kmt@7PCs$U@HjgDaP#dh7VKc?W0 z{Zr|^2FEX`FTyQ|7!(i3FDmpm+&$W6;X~Uy56&MhKaC&_NAsuG@*AITV4P5Aj+NjT zoUNU;HwMM8dlqI8`z3nLIM)I4;epw*MR3*5aA{1H3uS6O@e-Q#S5{XtG7TjsHnO#P zYql33X*&}R%WE@fyMkFANmw7_=nUiN3S);^#CHa@Z<-iC(Z)9pDYYC`N|&z>LJy>C1UgTpliDqll!7h>g}bFBv5$x%HDU9{nSL4;u{8Z>R!K<4WMmACRW~(vF#9$~-2=$LH9L2;D>1t!=-% zE;crQF0v(JNdX%d6Ex5+GP}1J2iXhNjWET?+|V?$X%$9BGDLWHH{^52Xi|iLJuAFI z$h;e@5iK$j#Vng|Ir4x)9tBkS)u$|5%aeWOG1a_xjvdV#Od_R(eZWysaC@sYC^6?A zTo0urI7YbUWqjq*q~h2ah2GBb+y1kN^(bVpQe1F|)Es#v<6|E6PQJ@aWDKST)jqSz z59S)_H(4T}LxmE#S#;be2P{%_^e}^roL(2j(43dQK!iM?D=?Vn0hcTC(6;Q>VJ~z1 z01?-xKy(e~nc$K+jZ9jGcy;Z01XKJ5QiTjp55GtdPY)LhuFg8?nsUI;jSt%#P)=R2|e?qKXlPE+c1 z28$Q+W>EnMPWaT)THF<*$GBuPtz_S_F0YE$OuE>|797dhE1aEz1lKt&*9v8hW<&EhZQx~bIkC_twHPL1$YrbuY+ z$ve7RXq%4yN*utaIODmB#$uFtI;%W8b@4YKg)EnG2Thir^?_j16!L&Yfuw<0)lr3P zH6HPdRvqy{5hdz1)Zq&{%(BR2u)Hz}iprKMLW|~HG_+@<+wNf7tau8}DnkjMSe-`p zhcSVE{hCHZZ$xwPHKSZEg#&bn6 zteqLAbtq{+09bMmp*%pkvj`N3LPF)(T?~zD7e%aht#Zt(Ydo*5_f>1}v*r%7`VO<^ zi;U(^MM{wh!=pyc7n}9=mHKyRN}uJ4z1I6&^_MM;pTysFv`YWzR`bP|pf8#LF%1e} z!sOa*5{rE`OYr;gh|-B>OaLry2rcUe+CS=#DFfsN;pUI>4Cl{*HI5CG63MSLT~e5r z*qzS|gp=aV7%u<>J|K7iga!^e0*V9$5ehE|{fiPFViF>scO24ylMH>JtiZ_wI(i*g z0#1<4H%2!WmI_JCXW58h`7-S|M zmQE3>DWQd{z1rE3bUH}eBE*rAki1`*6GA?q!hw1^SZv)GIvZ~4{)$x-X6gXI2|8Gh zf+G3geI9x@Xw{DFd4Lc;c;^5yg9hsj+&7jzK)4@QI-Za0Z1wb`egBBP9#3iG4(qxF z@(=X44Sa4u57#e*RYXC?nNQ*OvauPGC;TCCzSzo14iPII;B#T3>9&HG}sbb2dU}_j=h5 zg2Zz5!pTg7ta25cqEDYOj1u!kK<*1}s)5`qmG3g351LVobb^~!QM8%j8$clL{5We3 ztn2yic$ibvvF^0(g={7MLfwa8E%g7>8or%;@14w4eGAfAgyCT#xF1Ii(m? zV#uo#RT$ZCgAwvh8)_8UkAi`Dm>%}*6F)`m*v9xQ_*ET=AJBDTfi+XPfPcgYF5Z|x zNsCCYh+Z{-aCN@PWZ}&IpPFkgT$(G6&6gW2#g-Bx3!+ja_n+BtUs=eVH1Zc}YkOxvr z05i1VDL>nG5dX_|d*G}{-Zs$k8iY6>JG^KYLneeSm0E|E1m7sbE`kg*R=g@6MF!Lz z@$h+1_J@TMnk(8Ss>%;HV|=RNVNWvXvc!d6^w1R=Rmzty_QYT@9pbj#Bjk`T@bXCb zE(4~q9I;b-R%*qtk>3`&4hCsQvKsk29|(ni2%KE#q75|$G+p6Y8?V65*w+236=NKY z%4D12=R`5k$g4FSDpftqE2@dteonI6;LMS0_Rk42gLMPBO(f2ohpcgs8d`1!V<^&e zL4!N995?A)S5%O(83J3Ipn{Wt+n{KRVGDIkTEHS%Lz9G*Ss8vv zP3SIlvtb{5#3m5o?@oureK`{M z&3;*qe0eD3?S&GU{joKE2Xgl|Hs&R*G;|o(HNAHizl(V;@&z2zpO+v08yn=h?%5Bf zAk-%U;=r2tkMXqDbqd$eh2s@L{1{Db|VEpLZ{2+~NEl5-zB<`!k3sN!=qj*o}M0etq4<(>`@NZhOk zS}EZ`IK4k+iYYbuP^G*Gfhu^iYU{FU>9P@IuOJM0QeSkbpRK-W_EYA8X&j~xwrQHP z-^%a!ylZmS{EOUNur;Qq_}Mw+V<*l_+R@FaCIv0qgDt|bGA>KpsFp5f1uonN%4jci zgJjP{0>e>_~c0F!@%&E-RXOz4F<%yNhsZbTRtyFnth{Z!L_0`e*)H zrbE?6RnTUW9fA_@Jr)~gOFLON+>=)u4eoUZE87}{zCy9?+ZKbNfi%IPec%hHooCRgsUsa`@a7R z%>=k{0Hjd~#-s>WG6QX#>+hQ#K`W&3a$3RJ7XNH>!saA8B7PPWzu2im_fgLJHyhfl zYtW*J!9YQ2I4zWUk3eHV(Zvq0WJ5vm;su*>|BVpa;Im{H*)mN79sTfSS}Y z?LcSn-KY`=dZ()g5UOmNrkK8UKHmhum)gdt{vko1Ecf@N%@Ko3+@DmyUyoKhgL6Tl zdzx+*DbiUD!|~@>E#~2uuewuO*F=rD6Q9=jjzL0K!Vc-#Eewa-Rq^&tw(XbO_R(kY zk^Mxa&7MosQrva*+~BO4%toup((k(tmp^z^**dmSpWVNZJeBt+@s=p02i2t7JB>R6 zORQgl7#wcY6)UzIvU90xyYRo#_3YJuwxRa!HK5u_>SNAW=FB-za2b`#2o*#z6s@QJ zsI6-|KrG@wRyvbgGrS-|!&lcpnYdw>`7DP#bygzfxDCS=q7lA3rGOrTuwxE-p)XBz za7Ky6^~a46&SXROdhAB1JcCa^@mLx-)P;<4rt;<(9JUC(zO85SnzkR%zKGXLNA&1a z@on8XSI=;Ju<>G;+Hg&CY2C4{nqF8B)56ir3f8H0xSAeAn02zv=?L4gzQSvBv4cZ# zA7=Z8t(e`R0B59z&VmGf>q6`Qy#Zx|ExPZY+z+||wS7sR?_L7d+6Z~_qy2_y?G2;? z$~RsvxUEaHJXvP!598LCTl-mELad)8cdvS&UpC-tXajKmA_S66i@r~?0R(4ckcrk` zRH47`&r;JirtO(nNgsgBb1;kVkS29w=d5+d6yogW*_Ev1Eo~V9Vv3MV?OY(80VzRU z6Wd{R(?QTw7ssG@kN+g!%@1MGNxB`yvRjXxZ0nx24gR`-tKM@&ckjzeW3fdDW#b|M zv*^MCjfjF?oElZ$CX9e0Gl;mzF>j@aY{mnY9KtBegNyWFXGKi2%O_%G9WT4Op97RER56Y;U zQQ<$BXcK14j-zsGU<6AaRRJUb(7Q~*s`VyBqjscJ$!-X9(uqE?p`b7KsbCo1$Q?9g zGv6}dlaD51tMbDj*n|WBB@h~xcz<6qtc60bacX1-s!ENEUx!9=ogrRNxFB2Dj4N|W zBSv;#LcQf2KOUa6kNs7!vLzDzXWi_}<2cNy=H^$|z7hoei_)s*A1u(GiQo+Tf#Q)I z;W@#UlF1UNwdAFvW+f};`Ka=`N852FdViD?;cYrhkr*dvydqr~mgFgeRwpi6#ag6n z@DXG6t{JT^Dv@J%5HAeO_#r06iI>fWUETX+0)OPl`Rude0lC{&iZy8lKY;{^^Y$x$ zRXfN!Cy7+hM~|tpO^O({l+FNNBJf6if@f+MP!GHSn<UR?M2%6Iz02U3UbXTa^43>3!|;5^AEwd#fLud8v!>LM|5(v}Yv1 z19vjX{AT+S%hoR4Ow?p?Xlaznv?_t9tUkA(uJDI(y%#mteK2~E`%^(;p-<+i>D3^O zQ5G-Lkmq_h^X`6Y-OXJ6>px2x|1I4P*U@g(5F7|-;BV2F;6LutJA2p}|J|YoSlYQ5 z0{)d}CiJf-Vy=Ia?orW0Kt0~x)itYzE3>r)`6)T;FtxQL< z49&?Z8kp!2IajgHAo;bObQEScO*!K1c@_iz!*TTNJm+QfQ554*-f_@J&J4R;rkwO} z*zcEZ-@e~Id+)PtU4Gxcr|f}V4yM%31y%p5wdtq*3(!BU{mZTGwrho)*S);Dz~rPCW_8ZYM&a72OD&`Xil zWK~EmH^8xo39_AHwTY3RIZQKCs&x893E^_c8OD^lY+U<*HWRFBmd>@q#9TTIk6U^W&B%LQ z3#rM&`rVXtC@;UhVt!*Y+B~8-hYmAgK~9CWDvMRhnb(DnxtdI%0E;~iX<-X&se*z(liJtjJ=(IcEFEyp%YOFb~kcl=uo@Qx3Z%3l;pATxMj4_8_h{pInwS|%f#=hkfm$fn9*^A3;0;-1pj zoz`@7q0#D0g?V^9w|>LQQ(XMy8{wI?D=2k7Q_$}nPaC^hIi=EHJ{Th@GYa)!Q9(`- zOH4%Xm8L{l^`3U+tE(&qB!nt3l^(EI5=cHNX3jBy#*3~U2|P` zwPzxP&a_ktwp>h%80{)G@vBU0R8GTjbW(Wh{@ME(me9F7gVMk)j%^buO3V++w(lqn z&36#ZCGXk{Re*z1fhw#&edU#o5pxpD8xC_%jUkJEtf#P5nobq6|=VnsD0`5=b ze#^bFVitpc$SbYjjZd_iM=%8L7OsxQSpnb3+Ok#Q>YW7vTq|VWess1K;%P%D4jrJT zWJ9TzAOc-&YefhcZf`8$EvQjl=t z$pSPP-$J!>zSw5S%#?yVWe1AJ5Kr;LQ5L(O%2Z&M2GT)*A#1y zO5(nUIWRA!=uLzx0Ln3Ter}M-6ZBa{H;CB`tKYZZ7C%27a(h(>?+1LN3l@VCVCW5l z!8qR4B3zsY`7O+f1`s;H0otEz(Mf={9oXs*$~2>GWXt3O0q`*6H91R>om<3ojOW6Hi?9jFRpv zoEo4?v3Y=^*DprsmM$<;$OE1UMBm|x(sj|B0Js)K=pynHu3NmL{>{Dcn|r|4nNZ`fI|O|M$!{)4v()64gC>6d|PV)S~QcjRL3|c5Nl418J^Lkt*Az;du7U zd~%}?-+qW#-Pg+<;Z2G^2F z62ztGUYDKr`~x5%%#>CQu_X(v@&nQF+3;Iq!{9Coj#A#@VJnPNh@WVAk#G1+IZ8;l zg5HIp2$uOM;5^3bm+pgVXSQ;^(44yFN_ZPY2;e*nBnn*gB{ksiE6xlrFftDMye$<{W;Tf+zmOTCY6I z?XpAYU;h_l?-VRb)MV@Ky=>dIZQHhO+qP}nwr$(C?R9s@`8#g(c{tH;RS)%2Sv61@n$xLCVj^ zKHxYnSqL|WXUzloB}pmKau%S}?f(cHLSxj8#}FhH#5`OePtTW_i-}v^`4&)1L$GK= z#*b{1W(enOi-aAta<{WiyhdkMneMa{;IgdI5lhAfok~ zA<##qqp{NW)8)|!%c<$BRlh$BoY+V<0ot&(E3CTo8HY-Gw!)L0w^`_xyDYzQ-B9d% zY6{hW$(C7%JR8hj6>|j2KhLrYmXL7ypy@ETaoJ-~3pgr%wM(Z`^X?hzb6iMnXa@r9UEo z)d-dR8^%cWBeB|4OV%k0U$K>rOM&RPR1eD^GR<=-giP@>Z#Df6wFJF$CJO}lq-OYJ zqs~%US;d`UPc%j{zR4d15=WDK+b40XDRcwhjZYN7A592>HXDXcD~4WM2iDlZz95Fb z8I5^S!)`QoGRAneE2b!wbH%jA`9BvJvYsINw0{hC3+6wIp8r=U|Jy&}KVcO6KXwvC zat^j`?n<`*MQIy5{Qn{T?_?3&OYs@|_vcsoap4JBBH01SYOa7dA85FcQVz0M4Bt8) zMax-Z@n{}IP)AxPuWt^!L%Own+R#ykwbXIDM8>WKSYAGz!#Q(wE9-HsyMOE4Db%rJ z_qO}#xtOT<3efB0XZ5z{ajEl_7if=ZpIm^@=6F`MJI#L+Y3n8!Qui>E6Ul2Ea+m|^ z?iBOuy(GZa-L4ds;^tw`MyFRh%Cj!gwUfIo6?XT2kB0}=gFZ+f_JwRsGwQQ`RuTzk zZxWQ-Ee!wl@l?OZC#anFVweN#Zm&~^D`fQj4oJ{i84Fr*Fyja2A%^ zErd4L7-N>)Z6^?yz8F<49v5|=)GgkXSNSd>AlF?!GBy2*aO#yER!4tJ75$YN)@LRa z^v#a1pBCv$p}!WWq+0sodz0hIg}Pl>lI0>i2!-CjLx9h^#JhnWN2a(b=?~DBwm3D` zHVGYT6L}XgmK0{a8(je@!MTxwBwD`+cQ&2MnI>X>9sIdARi2Y`DXYy=0zjjnM+0e@ z@Iie~63SK)`bdkO6f6yEF8IQtuoG1EE?n7!sF%?u!VO_m!Hb$KfmKmrM&AW^9#y^G z!M>1e-L}{W0(T@ftMzuK*zNGMP+J`(2Ft)u-sBwSA^m{Loh3t3^X;5;AUpJOmSAg= z`HY?|8+`O)#$R1y?8=8Yf|DH@!WMN&^!;gX00U;peBuJjXSIPQDH%c`mwU91U>ZBG z=dQuJ2mO%nw2h-H-_-$TYpo&8*i(tbm%r1OED3FB)^!fq2QWu#*0A zJ_YL{g0el<2UAQeUR)S8Qb>}E_8ElC&&=eg`S@t(fAtq7QM1P|mm zwj^_=3`x!@;;>o;clJf0YqVGS8Tg{S(gnkFmzgD-Nmb(uPpD)DIefynQ*OR+wvD`+ z8n?9bJ#hiHzDA0)h>VH~{CC)}sRG4eYD*Kp4gqakuUJpXPmfxHFhT}4A&DVrYXKU6 z%~B#YxrL_Dz8z6Pv4XNGO%X&XZujd0u}_W>nx>X9Z~b%2<++iNCb}UaZtAq&U(5Uh zt}b0+(iv6zzb%Rl(s}v}XST{!0LK};rF2y1gKKD~s|6_-k1IH1T_3iqI0Goic+dNk@9var4bmq$776f6az{kh6tz`n&U zJ%*;)wVIdV#9mkeLxZjK<+d-y3^BCWn)^s!(!-cIFbP*$p9W5EG<4V zsI8tXnoc|TRSb`74Ub6!m=9789h9K_9b@7Nj$XRd%~F6#&*T}WIb}GKF3zMcG#LYB zoEcZ&%9lf3eR^C&Kij$>myQ6?OtIMR$CPI+j85R1RAezs6!Q_7BZ)9V?ZEe|7FjMs zOz?qY7x)U3ec)9;+SyBy8}mk!&OcGN@6jVa7vJJ};Tc7Wzn29-krG=BI_uVusH^r2RH__3p<1lv$}ywIIFEho6MK1^swt+*yxWpFk}+Qzu3Q0QbpyBipCW-C(c20MphPM zaUvd5PUOnkyUXjVorO7>%eH(l{Y|k4x!CWivQJ6NpeGI0zSg8EMKKmmtoyJ&ig^Ql znrr<)jk%QnG%Zx=)iBY_X;NMjZ`5Uxf^N{B;#k%!2~Q=Tpyf3siK27h%Ce#E0R}nZ zXV(Nr{s2OL`SXkY(m{NE?p-)R7uvzuY*1z^O3*{i;zfKtg6==BLKV2N>LcwDe9Q!8 zuE`3=E72>b>=CKQSg=DgJ8*QIZHw9oVWSd4rFGgQXk>JPjcfXmT`MPydsr5-N)krj znCa!yPPS*`p;y}AF3mI~=u1HWPmsXoFZtpQ=}5t&39P&OHymD79*WkKEG)xKxTY)7 zGEj?ROs?NeAkt~7800^tH>7A{F*JD8!*z$j`$}+V8LUg%5P5@ZHeL5OHJsOg(ib-N z?e?HDLh_AN;;kgCFY3a7yNA+QiU)TgOGEK=(gE(A8>B&{kY9lVu*Iw^b>Z;FRM zJ5byJW8RMT?Lcmm^xP(z6K!e)n3Fnr7qI0Q*Z?1Dgt!w&d0(Ox+r zj0vmm7^HN26%ztFO(7AH>=imfC|F_K%Ja|6Tp<$3aBN{eeDm;(AGF*Q1mfuxs@E8Ahnc!pd19VqX^x=}9RW#qgWIw_!{l%3D*kn@LDreYHo?VVCo$dyw?Ae*uhrOcT&6xQFf@k9;+KJM-H7TFT4{kycQI~fLE~*Rb%fti=tb2EJ;v+?Fq`f&LFqd!ApMgIB5!U2+Mdz`=K|s>b62&bTX2i&%x)&tviB{3;b)EeI zhlOk(yk${SYpA*ua}hInurM=kr0g+=?XIku&`6p%4zoMAIi54G*^V|pAFrvRe`fZ& zfj;bbV9;xc<^olbjowXSY;_Jz+kvcU?XH}Eo%w5!5Uy-UIk_ zX~Yx?Gj2a2v#+HKwe*UBOYSV&oPwm>U)zBy$5EO5KH@o-2vf%)1|R=UP`zsjaNYXo z+>Qd}z@*HK)G0^Avau#`7I6|Dg6mkNnup52Mblk;_Hpz zqLEDV?wMEoR}mqr)>RoqiE8wBQouM!4T2+=zB?cT16NYS90mpDYwJb>S}o7L6eXIDmH0pnG)~p)J?;NCdlUA zgJYFcJ}MWkR4ff=J~D5Yq&m~M@$0RRo672ahL5gv34GlSwS33k923gU_3Gn(XNJ%Z zkp593*$Ac+`^S*>81G0l*mD%}=Q{_vV5o;%5j6vvOKPzTSStD9?gMKmul_C6LCb)C zI7t1?bHZ<+EYF485P5SQgC$$=7Wxqi$XjA5KvESi2Enr>B$+w9c}L5Zbm|H3_xc18 zE%DhzkT;DhWDbQK2m!7|LTJi36A3KRCY>5#%Q*6cG`&Z6-x&Z{H}=BW>p8H;E!D+6 zA`}J|{pE+P_Fa4rk`vC(8<Nh(Nbscw%W@8M1A1GHbQ6!m7#1fAo|BhKsH=O+7+?~{Kur<=r01uR&|yqVCjNop z9>5Vvl6_BN<(@Dv!19gqvDv7Kwa2HyFu&i`o&*yH?ZKzsMYy~TTgEnc=APNN;ZxjL zP5O7H#9P{2SCJ!+JmBtbF0nx7mf#|a_M(QA;xOXidJnPaXD&ZB3G3j@5Nl5)4|X1# zUvs$*?9q>-S$f~wbMTAxpTL^bIi+1N`MU01%OQ4%o_`^dOU>V9jL`MSGC?roGb zXQi;uEu^c9zQXQO8wZu$zeacdu^-0c7JsN%%pXozWAVV_$QiC+Vobuea7_)3mFZIw zn?f_aVZQM`Z2x|@-RP1>fM5r>73yQR8~vgxK;%(Tm7;-Bil!Iq-jn*;5tl2G`b#0# zO-5ET-^J%`H+4Po#n`}fZGR{7GID=N<5kty%xG@pn>9}yQ<@aO(HEENx#hzdBMm?l zKfkRzZ{!p%&IlyanrC=lj~wzee_aTS(42^Kp5HE}tiD+7Uh%`eRtfDupx!GTl(vmT zz`uk_ysXMdkW$@jf!8fDDylit#~FTWNNC0qGqT8^bo!%x6@7Mlw{6hKOy~1eAk%a5 zmNh0e2fXLA*lV%Y480eeI&kei-315Vc_w<&2h3eG_TZNQ>!<}3BBDKu*)c=fR%mNU zZJ`YFVoGu;ZL!pVx?*18&f(Td&{tw!!P?=VZySAr;i7LM2bxymUZJ?ca_{v!?-7^oA7ON0ltK()Im8ho_>==KSjhK7r|u`)KQmX3Q5p4@ z>hs|g>sBB25VF?b9zCXnDGt)?`4)7wjC+q5Z$H1lT^5&-d6=#}s+b74CP9RS5fZXUvPklFu*F{o@4PZrzc`4YS z&qwh3YL1>tZuc*4yNWZCc{p+k` z$aHwGb z|7X6z%{RfzoL8~_T-@+LCjaVrJ-NQRGGPVH;59Mb`P^~Uz3t}mdHF&7BUh+ZCI}0nMF;Ep z&?@;xIEJeYB}gM@Ukd32#dzhiPZM<)TLx*kHi+B#eyH%XR=BUj(@Kj;I~aREdi-^7 z|MM0kgP42NsM>ZX(G`KXIg9EY!OJs^n`^&sdT;UbmKA9x`o4LJu5%c0{{|eg`Y^0J zHF9|;3DtWQFrHO8?#AtVb?T^Vzpr|4N%O_A)3eAV38oU^X~Kw67>fmch7-m{Ej?CwzDsE_U>HwzTfnH zvlgA_bYOSy5lUC@tpJka9zBGX-b;PZnFeg1lEw>J_b{*5_>B`)$ewg?m+=cwVCIG9 zcE--AkQV_uNDyp|XaoR%Gp%JC_dy5isde#5C1~q<(^J5|=0-1-7wIrCc$%}jvwNA} zwye;@n+gHUd5V+>dS8y|1bUdoBaqt%h)k*s* zw#nX~?NUFNwQU{~{LYsB?5K)>E*z}i3?ld|J|vG7<9TtYEB`@`gjYNv0LGWf9YMdu z^uqmYD7i04?(p0)u-w2bmJjJ^v|=^07hET41_NOQGdu|&$y(A>$aD_3K%BS_H=FTn z|B}f0O$uqVvzz|IDBGT�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 diff --git a/app/libs/jetty-servlet-8.1.9.v20130131.jar b/app/libs/jetty-servlet-8.1.9.v20130131.jar deleted file mode 100644 index eb8dc4a002dc6cfcefdff4242418718120e489c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97838 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Û 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%0D%po6Q)u0~jS7!g%_1(Cfm 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%0AR=f(?qKIJ(e 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 O8JL{DKma;kg#Q6*!8L9G diff --git a/app/libs/seamless-http-1.0-alpha2.jar b/app/libs/seamless-http-1.0-alpha2.jar deleted file mode 100644 index 34aff41ee7cee66ebeab33d9a190379ab123d374..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21473 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

%^7qd;qomq(;nTpDP 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 Vy?;Z-1&P+B{0~yn_P_uD diff --git a/app/libs/seamless-xml-1.0-alpha2.jar b/app/libs/seamless-xml-1.0-alpha2.jar deleted file mode 100644 index 4f8da5aa47310d89b5110f07ef1d42ed0c61b3a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63146 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

0M;Az1ni>7m{{Pf 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 diff --git a/app/libs/slf4j-api-1.6.1.jar b/app/libs/slf4j-api-1.6.1.jar deleted file mode 100644 index f1f4fdd214940c76cefaad2419e538e4c13cef6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25496 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 diff --git a/app/libs/slf4j-jdk14-1.6.1.jar b/app/libs/slf4j-jdk14-1.6.1.jar deleted file mode 100644 index 6eb6367e86a4db3184e648896e0535c3e4153307..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8890 zcmb7q1z1$+`!*mg-QCU5-Al*NAtBwJLpRbX-CZI`w}doE3=Ab8ARr|TN-BKtb9dd< z-M#+bJJ-xPbLP44bDp=J_j&J81wMjBhI%Mc4V%LMJNf+s>HerBttrkTuPno+`nwq- zl;pkHdmqO#c4#Ol4HzgWoWGhWi7U&?NNZ@aD#?T;PC16K)J%`t~a@8Zb(&22ebj0xVd7Jtyw&wn56N@5CKP;1yXpagD*G6jt`{3{#9* zH^V~B5;yQDwnw0v-i&<2`A}D8kM5-mR2|O5kyv!g6{pJLqsLUSJxLV0Je6@*b3rmk z7T}UtY8YyV3~x?|eXzdXy7FSi!Dl+m@+Fk5j>wtU1j>o)>VfYf=6e+oi5|Irh}!n- zJzHf4A@`xZQr_iF4)LFCB=x9?@ck&`@hIAg?oH)ICV5-_=yp6{?KK9xmly1lnOzAj z5sH_aWN+z?HZ0b&T{`Icg*S9C&@dnCXoO7}64WK-oF(-sk#ta)`Yh`+YZu~f zpc)rpx@wq=^GeUoZuVu9)6HkCo7;w_TYGRPmwnp)7+v_cZ1HRKkl^4%Ca&%zF^u)d4|G zK+Mv&=GdcFj%3M>~zBNU$>RBi#i<6ICWGcL;lovnzv9yZ^k6blbK5HSBDAqc3c$PV9ID!a0pNxOHAarxX)gE;~+!CKS zffnl}0O0;qWvrY~>7>;s6E1a9qUAWE!`AyXIdu}gI&`>g|i^T1esxJ zX8}FT)QV2~a-oJ2w^6}hG4=TC7j$Ed{Tp?ck%V#DQM!?q+V!^<^$WNTN?iaZXzCq6d&xQT7}rDcc3uI(=v$fT|j;ne8~PH9@I%@Z z=hmvE6#hU#187s4#2Lt~lAWz}L>&*+Vi4XY^hCK@8H}Yz0!K4Np|sDVDKZDX#7SbH zw2l8#C8tM_3zZHAF+n<&!>%VPV&A$m!GU6kZ~-lrZ3bTUYJPMhagPgOd0MFVlcnYL zVYAmZ2;+pyn6b1^uOyy&L^Sr$veEu5H4a%?(o zN63p1?GtRc?E-mmF^^#{r5?);)(uoRu}!npez4al822kox8^ak=;r*_bK(Hs$FRl1 z5tsbot4x=qyiAuOw*?>6``gOJAl{~!ig1CwOPnie$E=1)CwUV;S7Lyu+f>n0vot^qLVG=O7YKdA*IA2i%w_5@+%8*6WFym;M zFAq^}yTK+n9zS zMg8y!wF+|-jVSTXymFwj95(55z1LUQ?A|Hu*2${KoD&f+tV@M^q`#WhQ`aGw?3N!?QzGv2{fyW#q*Nf*6C$4a;7se+l=AzeFKex)ZXR< zOgKae=L0^m?eroH4YQ?aXtu(rH$%g≠S98d?;xP63>jjm8}Q5Wurgm7Xw8zz{N1 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 ZVX8p5`yCu8DD?Z6&i!~+BzySw{{U|){?-5h diff --git a/app/libs/universal-image-loader-1.8.4-with-sources.jar b/app/libs/universal-image-loader-1.8.4-with-sources.jar deleted file mode 100644 index cad873ad70b56ee4260179ddaace05c68fd9ed06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226585 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

d>?9OjbYOa~ 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 UVGjxE0r=-Eh(V9oKqN%^AG<7itN;K2