add methods to check max file size for http upload

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/Account.java                |  6 
src/main/java/eu/siacs/conversations/entities/ServiceDiscoveryResult.java | 13 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java  |  3 
src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java          |  2 
src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java             | 29 
5 files changed, 41 insertions(+), 12 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Account.java 🔗

@@ -52,8 +52,12 @@ public class Account extends AbstractEntity {
 	public static final int OPTION_USECOMPRESSION = 3;
 	public final HashSet<Pair<String, String>> inProgressDiscoFetches = new HashSet<>();
 
+	public boolean httpUploadAvailable(long filesize) {
+		return xmppConnection != null && xmppConnection.getFeatures().httpUpload(filesize);
+	}
+
 	public boolean httpUploadAvailable() {
-		return xmppConnection != null && xmppConnection.getFeatures().httpUpload();
+		return httpUploadAvailable(0);
 	}
 
 	public void setDisplayName(String displayName) {

src/main/java/eu/siacs/conversations/entities/ServiceDiscoveryResult.java 🔗

@@ -190,6 +190,19 @@ public class ServiceDiscoveryResult {
 		return false;
 	}
 
+	public String getExtendedDiscoInformation(String formType, String name) {
+		for(Data form : this.forms) {
+			if (formType.equals(form.getFormType())) {
+				for(Field field: form.getFields()) {
+					if (name.equals(field.getFieldName())) {
+						return field.getValue();
+					}
+				}
+			}
+		}
+		return null;
+	}
+
 	protected byte[] mkCapHash() {
 		StringBuilder s = new StringBuilder();
 

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -847,8 +847,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 	private void sendFileMessage(final Message message, final boolean delay) {
 		Log.d(Config.LOGTAG, "send file message");
 		final Account account = message.getConversation().getAccount();
-		final XmppConnection connection = account.getXmppConnection();
-		if (connection != null && connection.getFeatures().httpUpload()) {
+		if (account.httpUploadAvailable()) {
 			mHttpConnectionManager.createNewUploadConnection(message, delay);
 		} else {
 			mJingleConnectionManager.createNewConnection(message);

src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java 🔗

@@ -688,7 +688,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
 			} else {
 				this.mServerInfoPep.setText(R.string.server_info_unavailable);
 			}
-			if (features.httpUpload()) {
+			if (features.httpUpload(0)) {
 				this.mServerInfoHttpUpload.setText(R.string.server_info_available);
 			} else {
 				this.mServerInfoHttpUpload.setText(R.string.server_info_unavailable);

src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java 🔗

@@ -1346,12 +1346,12 @@ public class XmppConnection implements Runnable {
 		this.streamId = null;
 	}
 
-	public List<Jid> findDiscoItemsByFeature(final String feature) {
+	private List<Entry<Jid, ServiceDiscoveryResult>> findDiscoItemsByFeature(final String feature) {
 		synchronized (this.disco) {
-			final List<Jid> items = new ArrayList<>();
+			final List<Entry<Jid, ServiceDiscoveryResult>> items = new ArrayList<>();
 			for (final Entry<Jid, ServiceDiscoveryResult> cursor : this.disco.entrySet()) {
 				if (cursor.getValue().getFeatures().contains(feature)) {
-					items.add(cursor.getKey());
+					items.add(cursor);
 				}
 			}
 			return items;
@@ -1359,9 +1359,9 @@ public class XmppConnection implements Runnable {
 	}
 
 	public Jid findDiscoItemByFeature(final String feature) {
-		final List<Jid> items = findDiscoItemsByFeature(feature);
+		final List<Entry<Jid, ServiceDiscoveryResult>> items = findDiscoItemsByFeature(feature);
 		if (items.size() >= 1) {
-			return items.get(0);
+			return items.get(0).getKey();
 		}
 		return null;
 	}
@@ -1505,7 +1505,6 @@ public class XmppConnection implements Runnable {
 
 		public boolean pep() {
 			synchronized (XmppConnection.this.disco) {
-				final Pair<String, String> needle = new Pair<>("pubsub", "pep");
 				ServiceDiscoveryResult info = disco.get(account.getServer());
 				if (info != null && info.hasIdentity("pubsub", "pep")) {
 					return true;
@@ -1534,8 +1533,22 @@ public class XmppConnection implements Runnable {
 			this.blockListRequested = value;
 		}
 
-		public boolean httpUpload() {
-			return !Config.DISABLE_HTTP_UPLOAD && findDiscoItemsByFeature(Xmlns.HTTP_UPLOAD).size() > 0;
+		public boolean httpUpload(long filesize) {
+			if (Config.DISABLE_HTTP_UPLOAD) {
+				return false;
+			} else {
+				List<Entry<Jid, ServiceDiscoveryResult>> items = findDiscoItemsByFeature(Xmlns.HTTP_UPLOAD);
+				if (items.size() > 0) {
+					try {
+						long maxsize = Long.parseLong(items.get(0).getValue().getExtendedDiscoInformation(Xmlns.HTTP_UPLOAD, "max-file-size"));
+						return maxsize <= filesize;
+					} catch (Exception e) {
+						return filesize <= 0;
+					}
+				} else {
+					return false;
+				}
+			}
 		}
 	}