diff --git a/bundles/org.openhab.binding.xmppclient/pom.xml b/bundles/org.openhab.binding.xmppclient/pom.xml index 26684f2f62fbc..04d84db12ed1b 100644 --- a/bundles/org.openhab.binding.xmppclient/pom.xml +++ b/bundles/org.openhab.binding.xmppclient/pom.xml @@ -43,6 +43,12 @@ ${smack.version} compile + + org.igniterealtime.smack + smack-experimental + ${smack.version} + compile + org.minidns minidns-core diff --git a/bundles/org.openhab.binding.xmppclient/src/main/feature/feature.xml b/bundles/org.openhab.binding.xmppclient/src/main/feature/feature.xml index 6207675a23b63..f9d20cc4d999e 100644 --- a/bundles/org.openhab.binding.xmppclient/src/main/feature/feature.xml +++ b/bundles/org.openhab.binding.xmppclient/src/main/feature/feature.xml @@ -6,12 +6,14 @@ openhab-runtime-base mvn:org.igniterealtime.smack/smack-extensions/4.3.3 + mvn:org.igniterealtime.smack/smack-experimental/4.3.3 mvn:org.igniterealtime.smack/smack-im/4.3.3 mvn:org.igniterealtime.smack/smack-tcp/4.3.3 mvn:org.jxmpp/jxmpp-core/0.6.3 mvn:org.jxmpp/jxmpp-jid/0.6.3 mvn:org.jxmpp/jxmpp-util-cache/0.6.3 mvn:org.minidns/minidns-core/0.3.3 + mvn:org.bouncycastle/bcprov-jdk15on/1.69 mvn:org.igniterealtime.smack/smack-core/4.3.3 mvn:org.igniterealtime.smack/smack-sasl-javax/4.3.3 mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xpp3/1.1.4c_7 diff --git a/bundles/org.openhab.binding.xmppclient/src/main/java/org/openhab/binding/xmppclient/internal/XMPPClient.java b/bundles/org.openhab.binding.xmppclient/src/main/java/org/openhab/binding/xmppclient/internal/XMPPClient.java index 1d80f19ccdf52..eafe406dec7b0 100644 --- a/bundles/org.openhab.binding.xmppclient/src/main/java/org/openhab/binding/xmppclient/internal/XMPPClient.java +++ b/bundles/org.openhab.binding.xmppclient/src/main/java/org/openhab/binding/xmppclient/internal/XMPPClient.java @@ -12,7 +12,9 @@ */ package org.openhab.binding.xmppclient.internal; +import java.io.File; import java.io.IOException; +import java.net.URL; import java.util.HashSet; import java.util.Set; @@ -30,6 +32,7 @@ import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; import org.jivesoftware.smackx.disco.packet.DiscoverInfo.Identity; +import org.jivesoftware.smackx.httpfileupload.HttpFileUploadManager; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.jxmpp.stringprep.XmppStringprepException; @@ -46,6 +49,7 @@ public class XMPPClient implements IncomingChatMessageListener, ConnectionListen private final Logger logger = LoggerFactory.getLogger(XMPPClient.class); private AbstractXMPPConnection connection; private ChatManager chatManager; + private HttpFileUploadManager httpFileUploadManager; private Set subscribers = new HashSet<>(); public void subscribe(XMPPClientMessageSubscriber channel) { @@ -90,6 +94,7 @@ public void connect(String host, Integer port, String login, String domain, Stri chatManager = ChatManager.getInstanceFor(connection); chatManager.addIncomingListener(this); + httpFileUploadManager = HttpFileUploadManager.getInstanceFor(connection); } public void disconnect() { @@ -116,6 +121,24 @@ public void sendMessage(String to, String message) { } } + public void sendImageByHTTP(String to, String filename) { + if (connection == null) { + logger.warn("XMPP connection is null"); + return; + } + if (httpFileUploadManager == null) { + logger.warn("XMPP httpFileUploadManager is null"); + return; + } + try { + URL u = httpFileUploadManager.uploadFile(new File(filename)); + // Use Stanza oob + this.sendMessage(to, u.toString()); + } catch (XMPPException.XMPPErrorException | SmackException | InterruptedException | IOException e) { + logger.warn("XMPP HTTP image sending error", e); + } + } + @Override public void newIncomingMessage(EntityBareJid from, Message message, Chat chat) { logger.debug("XMPP {} says {}", from.asBareJid().toString(), message.getBody()); diff --git a/bundles/org.openhab.binding.xmppclient/src/main/java/org/openhab/binding/xmppclient/internal/action/XMPPActions.java b/bundles/org.openhab.binding.xmppclient/src/main/java/org/openhab/binding/xmppclient/internal/action/XMPPActions.java index a25ca84b09ceb..2b2b11f6a7dee 100644 --- a/bundles/org.openhab.binding.xmppclient/src/main/java/org/openhab/binding/xmppclient/internal/action/XMPPActions.java +++ b/bundles/org.openhab.binding.xmppclient/src/main/java/org/openhab/binding/xmppclient/internal/action/XMPPActions.java @@ -66,7 +66,33 @@ public void publishXMPP(@ActionInput(name = "to", label = "To", description = "S connection.sendMessage(to, text); } + @RuleAction(label = "publish an image by HTTP", description = "Publish an image by HTTP using XMPP.") + public void publishXMPPImageByHTTP( + @ActionInput(name = "to", label = "To", description = "Send to") @Nullable String to, + @ActionInput(name = "filename", label = "Filename", description = "Image Filename") @Nullable String filename) { + XMPPClientHandler clientHandler = handler; + if (clientHandler == null) { + logger.warn("XMPP ThingHandler is null"); + return; + } + + XMPPClient connection = clientHandler.getXMPPClient(); + if (connection == null) { + logger.warn("XMPP ThingHandler connection is null"); + return; + } + if ((to == null) || (filename == null)) { + logger.warn("Skipping XMPP messaging to {} value {}", to, filename); + return; + } + connection.sendImageByHTTP(to, filename); + } + public static void publishXMPP(ThingActions actions, @Nullable String to, @Nullable String text) { ((XMPPActions) actions).publishXMPP(to, text); } + + public static void publishXMPPImageByHTTP(ThingActions actions, @Nullable String to, @Nullable String filename) { + ((XMPPActions) actions).publishXMPPImageByHTTP(to, filename); + } }