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);
+ }
}