add methods to check max file size for http upload

This commit is contained in:
Daniel Gultsch 2016-03-31 21:56:59 +02:00
parent e074104004
commit 74c496fe3e
5 changed files with 41 additions and 12 deletions

View file

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

View file

@ -190,6 +190,19 @@ public class ServiceDiscoveryResult {
return false; 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() { protected byte[] mkCapHash() {
StringBuilder s = new StringBuilder(); StringBuilder s = new StringBuilder();

View file

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

View file

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

View file

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