save images to external storage instead of internal. this requires more permissions. fixed #150 fixed #177 fixed #333 - this might need some more polish though
This commit is contained in:
		
							parent
							
								
									620d1df82e
								
							
						
					
					
						commit
						98a80ffc61
					
				| @ -8,6 +8,8 @@ | |||||||
|         android:minSdkVersion="14" |         android:minSdkVersion="14" | ||||||
|         android:targetSdkVersion="19" /> |         android:targetSdkVersion="19" /> | ||||||
| 
 | 
 | ||||||
|  |     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> | ||||||
|  |     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> | ||||||
|     <uses-permission android:name="android.permission.READ_CONTACTS" /> |     <uses-permission android:name="android.permission.READ_CONTACTS" /> | ||||||
|     <uses-permission android:name="android.permission.READ_PROFILE" /> |     <uses-permission android:name="android.permission.READ_PROFILE" /> | ||||||
|     <uses-permission android:name="android.permission.INTERNET" /> |     <uses-permission android:name="android.permission.INTERNET" /> | ||||||
|  | |||||||
| @ -20,7 +20,6 @@ import android.content.Context; | |||||||
| import android.database.Cursor; | import android.database.Cursor; | ||||||
| import android.graphics.Bitmap; | import android.graphics.Bitmap; | ||||||
| import android.graphics.BitmapFactory; | import android.graphics.BitmapFactory; | ||||||
| import android.net.Uri; |  | ||||||
| 
 | 
 | ||||||
| public class Account  extends AbstractEntity{ | public class Account  extends AbstractEntity{ | ||||||
| 	 | 	 | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ import android.graphics.Matrix; | |||||||
| import android.graphics.RectF; | import android.graphics.RectF; | ||||||
| import android.media.ExifInterface; | import android.media.ExifInterface; | ||||||
| import android.net.Uri; | import android.net.Uri; | ||||||
|  | import android.os.Environment; | ||||||
| import android.util.Base64; | import android.util.Base64; | ||||||
| import android.util.Base64OutputStream; | import android.util.Base64OutputStream; | ||||||
| import android.util.Log; | import android.util.Log; | ||||||
| @ -27,6 +28,7 @@ import android.util.LruCache; | |||||||
| import eu.siacs.conversations.R; | import eu.siacs.conversations.R; | ||||||
| import eu.siacs.conversations.entities.Conversation; | import eu.siacs.conversations.entities.Conversation; | ||||||
| import eu.siacs.conversations.entities.Message; | import eu.siacs.conversations.entities.Message; | ||||||
|  | import eu.siacs.conversations.services.ImageProvider; | ||||||
| import eu.siacs.conversations.utils.CryptoHelper; | import eu.siacs.conversations.utils.CryptoHelper; | ||||||
| import eu.siacs.conversations.xmpp.jingle.JingleFile; | import eu.siacs.conversations.xmpp.jingle.JingleFile; | ||||||
| import eu.siacs.conversations.xmpp.pep.Avatar; | import eu.siacs.conversations.xmpp.pep.Avatar; | ||||||
| @ -55,11 +57,11 @@ public class FileBackend { | |||||||
| 		return thumbnailCache; | 		return thumbnailCache; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public JingleFile getJingleFile(Message message) { | 	public JingleFile getJingleFileLegacy(Message message) { | ||||||
| 		return getJingleFile(message, true); | 		return getJingleFileLegacy(message, true); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public JingleFile getJingleFile(Message message, boolean decrypted) { | 	public JingleFile getJingleFileLegacy(Message message, boolean decrypted) { | ||||||
| 		Conversation conversation = message.getConversation(); | 		Conversation conversation = message.getConversation(); | ||||||
| 		String prefix = context.getFilesDir().getAbsolutePath(); | 		String prefix = context.getFilesDir().getAbsolutePath(); | ||||||
| 		String path = prefix + "/" + conversation.getAccount().getJid() + "/" | 		String path = prefix + "/" + conversation.getAccount().getJid() + "/" | ||||||
| @ -77,6 +79,27 @@ public class FileBackend { | |||||||
| 		return new JingleFile(path + "/" + filename); | 		return new JingleFile(path + "/" + filename); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | 	public JingleFile getJingleFile(Message message) { | ||||||
|  | 		return getJingleFile(message, true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public JingleFile getJingleFile(Message message, boolean decrypted) { | ||||||
|  | 		StringBuilder filename = new StringBuilder(); | ||||||
|  | 		filename.append(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()); | ||||||
|  | 		filename.append("/Conversations/"); | ||||||
|  | 		filename.append(message.getUuid()); | ||||||
|  | 		if ((decrypted) || (message.getEncryption() == Message.ENCRYPTION_NONE)) { | ||||||
|  | 			filename.append(".webp"); | ||||||
|  | 		} else { | ||||||
|  | 			if (message.getEncryption() == Message.ENCRYPTION_OTR) { | ||||||
|  | 				filename.append(".webp"); | ||||||
|  | 			} else { | ||||||
|  | 				filename.append(".webp.pgp"); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return new JingleFile(filename.toString()); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
| 	public Bitmap resize(Bitmap originalBitmap, int size) { | 	public Bitmap resize(Bitmap originalBitmap, int size) { | ||||||
| 		int w = originalBitmap.getWidth(); | 		int w = originalBitmap.getWidth(); | ||||||
| 		int h = originalBitmap.getHeight(); | 		int h = originalBitmap.getHeight(); | ||||||
| @ -190,8 +213,11 @@ public class FileBackend { | |||||||
| 			throws FileNotFoundException { | 			throws FileNotFoundException { | ||||||
| 		Bitmap thumbnail = thumbnailCache.get(message.getUuid()); | 		Bitmap thumbnail = thumbnailCache.get(message.getUuid()); | ||||||
| 		if ((thumbnail == null) && (!cacheOnly)) { | 		if ((thumbnail == null) && (!cacheOnly)) { | ||||||
| 			Bitmap fullsize = BitmapFactory.decodeFile(getJingleFile(message) | 			File file = getJingleFile(message); | ||||||
| 					.getAbsolutePath()); | 			if (!file.exists()) { | ||||||
|  | 				file = getJingleFileLegacy(message); | ||||||
|  | 			} | ||||||
|  | 			Bitmap fullsize = BitmapFactory.decodeFile(file.getAbsolutePath()); | ||||||
| 			if (fullsize == null) { | 			if (fullsize == null) { | ||||||
| 				throw new FileNotFoundException(); | 				throw new FileNotFoundException(); | ||||||
| 			} | 			} | ||||||
| @ -348,6 +374,15 @@ public class FileBackend { | |||||||
| 
 | 
 | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | 	public Uri getJingleFileUri(Message message) { | ||||||
|  | 		File file = getJingleFile(message); | ||||||
|  | 		if (file.exists()) { | ||||||
|  | 			return Uri.parse("file://"+file.getAbsolutePath()); | ||||||
|  | 		} else { | ||||||
|  | 			return ImageProvider.getProviderUri(message); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	public class ImageCopyException extends Exception { | 	public class ImageCopyException extends Exception { | ||||||
| 		private static final long serialVersionUID = -1010013599132881427L; | 		private static final long serialVersionUID = -1010013599132881427L; | ||||||
| 		private int resId; | 		private int resId; | ||||||
|  | |||||||
| @ -61,7 +61,7 @@ public class ImageProvider extends ContentProvider { | |||||||
| 			message.setConversation(conversation); | 			message.setConversation(conversation); | ||||||
| 			conversation.setAccount(account); | 			conversation.setAccount(account); | ||||||
| 	 | 	 | ||||||
| 			File file = fileBackend.getJingleFile(message); | 			File file = fileBackend.getJingleFileLegacy(message); | ||||||
| 			pfd = ParcelFileDescriptor.open(file, | 			pfd = ParcelFileDescriptor.open(file, | ||||||
| 					ParcelFileDescriptor.MODE_READ_ONLY); | 					ParcelFileDescriptor.MODE_READ_ONLY); | ||||||
| 			return pfd; | 			return pfd; | ||||||
| @ -110,7 +110,7 @@ public class ImageProvider extends ContentProvider { | |||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	public static Uri getContentUri(Message message) { | 	public static Uri getProviderUri(Message message) { | ||||||
| 		return Uri | 		return Uri | ||||||
| 				.parse("content://eu.siacs.conversations.images/" | 				.parse("content://eu.siacs.conversations.images/" | ||||||
| 						+ message.getConversationUuid() | 						+ message.getConversationUuid() | ||||||
|  | |||||||
| @ -52,8 +52,8 @@ public class MessageAdapter extends ArrayAdapter<Message> { | |||||||
| 		if (this.accountBitmap == null) { | 		if (this.accountBitmap == null) { | ||||||
| 
 | 
 | ||||||
| 			if (getCount() > 0) { | 			if (getCount() > 0) { | ||||||
| 				this.accountBitmap = getItem(0) | 				this.accountBitmap = getItem(0).getConversation().getAccount() | ||||||
| 						.getConversation().getAccount().getImage(getContext(), 48); | 						.getImage(getContext(), 48); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		return this.accountBitmap; | 		return this.accountBitmap; | ||||||
| @ -237,8 +237,8 @@ public class MessageAdapter extends ArrayAdapter<Message> { | |||||||
| 			@Override | 			@Override | ||||||
| 			public void onClick(View v) { | 			public void onClick(View v) { | ||||||
| 				Intent intent = new Intent(Intent.ACTION_VIEW); | 				Intent intent = new Intent(Intent.ACTION_VIEW); | ||||||
| 				intent.setDataAndType(ImageProvider.getContentUri(message), | 				intent.setDataAndType(activity.xmppConnectionService | ||||||
| 						"image/*"); | 						.getFileBackend().getJingleFileUri(message), "image/*"); | ||||||
| 				getContext().startActivity(intent); | 				getContext().startActivity(intent); | ||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
| @ -249,7 +249,8 @@ public class MessageAdapter extends ArrayAdapter<Message> { | |||||||
| 				Intent shareIntent = new Intent(); | 				Intent shareIntent = new Intent(); | ||||||
| 				shareIntent.setAction(Intent.ACTION_SEND); | 				shareIntent.setAction(Intent.ACTION_SEND); | ||||||
| 				shareIntent.putExtra(Intent.EXTRA_STREAM, | 				shareIntent.putExtra(Intent.EXTRA_STREAM, | ||||||
| 						ImageProvider.getContentUri(message)); | 						activity.xmppConnectionService.getFileBackend() | ||||||
|  | 								.getJingleFileUri(message)); | ||||||
| 				shareIntent.setType("image/webp"); | 				shareIntent.setType("image/webp"); | ||||||
| 				getContext().startActivity( | 				getContext().startActivity( | ||||||
| 						Intent.createChooser(shareIntent, | 						Intent.createChooser(shareIntent, | ||||||
| @ -452,7 +453,8 @@ public class MessageAdapter extends ArrayAdapter<Message> { | |||||||
| 
 | 
 | ||||||
| 		public Bitmap get(Contact contact, Context context) { | 		public Bitmap get(Contact contact, Context context) { | ||||||
| 			if (!contactBitmaps.containsKey(contact.getJid())) { | 			if (!contactBitmaps.containsKey(contact.getJid())) { | ||||||
| 				contactBitmaps.put(contact.getJid(), contact.getImage(48, context)); | 				contactBitmaps.put(contact.getJid(), | ||||||
|  | 						contact.getImage(48, context)); | ||||||
| 			} | 			} | ||||||
| 			return contactBitmaps.get(contact.getJid()); | 			return contactBitmaps.get(contact.getJid()); | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -8,7 +8,9 @@ import java.util.List; | |||||||
| import java.util.Locale; | import java.util.Locale; | ||||||
| import java.util.Map.Entry; | import java.util.Map.Entry; | ||||||
| 
 | 
 | ||||||
|  | import android.content.Intent; | ||||||
| import android.graphics.BitmapFactory; | import android.graphics.BitmapFactory; | ||||||
|  | import android.net.Uri; | ||||||
| import android.util.Log; | import android.util.Log; | ||||||
| import eu.siacs.conversations.entities.Account; | import eu.siacs.conversations.entities.Account; | ||||||
| import eu.siacs.conversations.entities.Conversation; | import eu.siacs.conversations.entities.Conversation; | ||||||
| @ -68,7 +70,8 @@ public class JingleConnection { | |||||||
| 		public void onIqPacketReceived(Account account, IqPacket packet) { | 		public void onIqPacketReceived(Account account, IqPacket packet) { | ||||||
| 			if (packet.getType() == IqPacket.TYPE_ERROR) { | 			if (packet.getType() == IqPacket.TYPE_ERROR) { | ||||||
| 				if (initiator.equals(account.getFullJid())) { | 				if (initiator.equals(account.getFullJid())) { | ||||||
| 					mXmppConnectionService.markMessage(message, Message.STATUS_SEND_FAILED); | 					mXmppConnectionService.markMessage(message, | ||||||
|  | 							Message.STATUS_SEND_FAILED); | ||||||
| 				} | 				} | ||||||
| 				status = STATUS_FAILED; | 				status = STATUS_FAILED; | ||||||
| 			} | 			} | ||||||
| @ -83,18 +86,27 @@ public class JingleConnection { | |||||||
| 				sendSuccess(); | 				sendSuccess(); | ||||||
| 				if (acceptedAutomatically) { | 				if (acceptedAutomatically) { | ||||||
| 					message.markUnread(); | 					message.markUnread(); | ||||||
| 					JingleConnection.this.mXmppConnectionService.notifyUi(message.getConversation(), true); | 					JingleConnection.this.mXmppConnectionService.notifyUi( | ||||||
|  | 							message.getConversation(), true); | ||||||
| 				} | 				} | ||||||
| 				BitmapFactory.Options options = new BitmapFactory.Options(); | 				BitmapFactory.Options options = new BitmapFactory.Options(); | ||||||
| 				options.inJustDecodeBounds = true; | 				options.inJustDecodeBounds = true; | ||||||
| 				BitmapFactory.decodeFile(file.getAbsolutePath(), options); | 				BitmapFactory.decodeFile(file.getAbsolutePath(), options); | ||||||
| 				int imageHeight = options.outHeight; | 				int imageHeight = options.outHeight; | ||||||
| 				int imageWidth = options.outWidth; | 				int imageWidth = options.outWidth; | ||||||
| 				message.setBody(""+file.getSize()+","+imageWidth+","+imageHeight); | 				message.setBody("" + file.getSize() + "," + imageWidth + "," | ||||||
|  | 						+ imageHeight); | ||||||
| 				mXmppConnectionService.databaseBackend.createMessage(message); | 				mXmppConnectionService.databaseBackend.createMessage(message); | ||||||
| 				mXmppConnectionService.markMessage(message, Message.STATUS_RECIEVED); | 				mXmppConnectionService.markMessage(message, | ||||||
|  | 						Message.STATUS_RECIEVED); | ||||||
|  | 			} | ||||||
|  | 			Log.d("xmppService", | ||||||
|  | 					"sucessfully transmitted file:" + file.getAbsolutePath()); | ||||||
|  | 			if (message.getEncryption()!=Message.ENCRYPTION_PGP) { | ||||||
|  | 				Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); | ||||||
|  | 				intent.setData(Uri.fromFile(file)); | ||||||
|  | 				mXmppConnectionService.sendBroadcast(intent); | ||||||
| 			} | 			} | ||||||
| 			Log.d("xmppService","sucessfully transmitted file:"+file.getAbsolutePath()); |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		@Override | 		@Override | ||||||
| @ -125,7 +137,8 @@ public class JingleConnection { | |||||||
| 
 | 
 | ||||||
| 	public JingleConnection(JingleConnectionManager mJingleConnectionManager) { | 	public JingleConnection(JingleConnectionManager mJingleConnectionManager) { | ||||||
| 		this.mJingleConnectionManager = mJingleConnectionManager; | 		this.mJingleConnectionManager = mJingleConnectionManager; | ||||||
| 		this.mXmppConnectionService = mJingleConnectionManager.getXmppConnectionService(); | 		this.mXmppConnectionService = mJingleConnectionManager | ||||||
|  | 				.getXmppConnectionService(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public String getSessionId() { | 	public String getSessionId() { | ||||||
| @ -164,12 +177,14 @@ public class JingleConnection { | |||||||
| 				returnResult = this.receiveFallbackToIbb(packet); | 				returnResult = this.receiveFallbackToIbb(packet); | ||||||
| 			} else { | 			} else { | ||||||
| 				returnResult = false; | 				returnResult = false; | ||||||
| 				Log.d("xmppService","trying to fallback to something unknown"+packet.toString()); | 				Log.d("xmppService", "trying to fallback to something unknown" | ||||||
|  | 						+ packet.toString()); | ||||||
| 			} | 			} | ||||||
| 		} else if (packet.isAction("transport-accept")) { | 		} else if (packet.isAction("transport-accept")) { | ||||||
| 			returnResult = this.receiveTransportAccept(packet); | 			returnResult = this.receiveTransportAccept(packet); | ||||||
| 		} else { | 		} else { | ||||||
| 			Log.d("xmppService","packet arrived in connection. action was "+packet.getAction()); | 			Log.d("xmppService", "packet arrived in connection. action was " | ||||||
|  | 					+ packet.getAction()); | ||||||
| 			returnResult = false; | 			returnResult = false; | ||||||
| 		} | 		} | ||||||
| 		IqPacket response; | 		IqPacket response; | ||||||
| @ -193,31 +208,39 @@ public class JingleConnection { | |||||||
| 		if (this.candidates.size() > 0) { | 		if (this.candidates.size() > 0) { | ||||||
| 			this.sendInitRequest(); | 			this.sendInitRequest(); | ||||||
| 		} else { | 		} else { | ||||||
| 			this.mJingleConnectionManager.getPrimaryCandidate(account, new OnPrimaryCandidateFound() { | 			this.mJingleConnectionManager.getPrimaryCandidate(account, | ||||||
|  | 					new OnPrimaryCandidateFound() { | ||||||
| 
 | 
 | ||||||
| 						@Override | 						@Override | ||||||
| 				public void onPrimaryCandidateFound(boolean success, final JingleCandidate candidate) { | 						public void onPrimaryCandidateFound(boolean success, | ||||||
|  | 								final JingleCandidate candidate) { | ||||||
| 							if (success) { | 							if (success) { | ||||||
| 						final JingleSocks5Transport socksConnection = new JingleSocks5Transport(JingleConnection.this, candidate); | 								final JingleSocks5Transport socksConnection = new JingleSocks5Transport( | ||||||
| 						connections.put(candidate.getCid(), socksConnection); | 										JingleConnection.this, candidate); | ||||||
| 						socksConnection.connect(new OnTransportConnected() { | 								connections.put(candidate.getCid(), | ||||||
|  | 										socksConnection); | ||||||
|  | 								socksConnection | ||||||
|  | 										.connect(new OnTransportConnected() { | ||||||
| 
 | 
 | ||||||
| 											@Override | 											@Override | ||||||
| 											public void failed() { | 											public void failed() { | ||||||
| 								Log.d("xmppService","connection to our own primary candidete failed"); | 												Log.d("xmppService", | ||||||
|  | 														"connection to our own primary candidete failed"); | ||||||
| 												sendInitRequest(); | 												sendInitRequest(); | ||||||
| 											} | 											} | ||||||
| 
 | 
 | ||||||
| 											@Override | 											@Override | ||||||
| 											public void established() { | 											public void established() { | ||||||
| 								Log.d("xmppService","succesfully connected to our own primary candidate"); | 												Log.d("xmppService", | ||||||
|  | 														"succesfully connected to our own primary candidate"); | ||||||
| 												mergeCandidate(candidate); | 												mergeCandidate(candidate); | ||||||
| 												sendInitRequest(); | 												sendInitRequest(); | ||||||
| 											} | 											} | ||||||
| 										}); | 										}); | ||||||
| 								mergeCandidate(candidate); | 								mergeCandidate(candidate); | ||||||
| 							} else { | 							} else { | ||||||
| 						Log.d("xmppService","no primary candidate of our own was found"); | 								Log.d("xmppService", | ||||||
|  | 										"no primary candidate of our own was found"); | ||||||
| 								sendInitRequest(); | 								sendInitRequest(); | ||||||
| 							} | 							} | ||||||
| 						} | 						} | ||||||
| @ -228,7 +251,9 @@ public class JingleConnection { | |||||||
| 
 | 
 | ||||||
| 	public void init(Account account, JinglePacket packet) { | 	public void init(Account account, JinglePacket packet) { | ||||||
| 		this.status = STATUS_INITIATED; | 		this.status = STATUS_INITIATED; | ||||||
| 		Conversation conversation = this.mXmppConnectionService.findOrCreateConversation(account, packet.getFrom().split("/")[0], false); | 		Conversation conversation = this.mXmppConnectionService | ||||||
|  | 				.findOrCreateConversation(account, | ||||||
|  | 						packet.getFrom().split("/")[0], false); | ||||||
| 		this.message = new Message(conversation, "", Message.ENCRYPTION_NONE); | 		this.message = new Message(conversation, "", Message.ENCRYPTION_NONE); | ||||||
| 		this.message.setType(Message.TYPE_IMAGE); | 		this.message.setType(Message.TYPE_IMAGE); | ||||||
| 		this.message.setStatus(Message.STATUS_RECEIVED_OFFER); | 		this.message.setStatus(Message.STATUS_RECEIVED_OFFER); | ||||||
| @ -243,25 +268,32 @@ public class JingleConnection { | |||||||
| 		this.contentCreator = content.getAttribute("creator"); | 		this.contentCreator = content.getAttribute("creator"); | ||||||
| 		this.contentName = content.getAttribute("name"); | 		this.contentName = content.getAttribute("name"); | ||||||
| 		this.transportId = content.getTransportId(); | 		this.transportId = content.getTransportId(); | ||||||
| 		this.mergeCandidates(JingleCandidate.parse(content.socks5transport().getChildren())); | 		this.mergeCandidates(JingleCandidate.parse(content.socks5transport() | ||||||
|  | 				.getChildren())); | ||||||
| 		this.fileOffer = packet.getJingleContent().getFileOffer(); | 		this.fileOffer = packet.getJingleContent().getFileOffer(); | ||||||
| 		if (fileOffer != null) { | 		if (fileOffer != null) { | ||||||
| 			Element fileSize = fileOffer.findChild("size"); | 			Element fileSize = fileOffer.findChild("size"); | ||||||
| 			Element fileNameElement = fileOffer.findChild("name"); | 			Element fileNameElement = fileOffer.findChild("name"); | ||||||
| 			if (fileNameElement != null) { | 			if (fileNameElement != null) { | ||||||
| 				boolean supportedFile = false; | 				boolean supportedFile = false; | ||||||
| 				String[] filename = fileNameElement.getContent().toLowerCase(Locale.US).split("\\."); | 				String[] filename = fileNameElement.getContent() | ||||||
| 				if (Arrays.asList(this.extensions).contains(filename[filename.length - 1])) { | 						.toLowerCase(Locale.US).split("\\."); | ||||||
|  | 				if (Arrays.asList(this.extensions).contains( | ||||||
|  | 						filename[filename.length - 1])) { | ||||||
| 					supportedFile = true; | 					supportedFile = true; | ||||||
| 				} else if (Arrays.asList(this.cryptoExtensions).contains(filename[filename.length - 1])) { | 				} else if (Arrays.asList(this.cryptoExtensions).contains( | ||||||
|  | 						filename[filename.length - 1])) { | ||||||
| 					if (filename.length == 3) { | 					if (filename.length == 3) { | ||||||
| 						if (Arrays.asList(this.extensions).contains(filename[filename.length -2])) { | 						if (Arrays.asList(this.extensions).contains( | ||||||
|  | 								filename[filename.length - 2])) { | ||||||
| 							supportedFile = true; | 							supportedFile = true; | ||||||
| 							if (filename[filename.length - 1].equals("otr")) { | 							if (filename[filename.length - 1].equals("otr")) { | ||||||
| 								Log.d("xmppService", "receiving otr file"); | 								Log.d("xmppService", "receiving otr file"); | ||||||
| 								this.message.setEncryption(Message.ENCRYPTION_OTR); | 								this.message | ||||||
|  | 										.setEncryption(Message.ENCRYPTION_OTR); | ||||||
| 							} else { | 							} else { | ||||||
| 								this.message.setEncryption(Message.ENCRYPTION_PGP); | 								this.message | ||||||
|  | 										.setEncryption(Message.ENCRYPTION_PGP); | ||||||
| 							} | 							} | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| @ -270,16 +302,25 @@ public class JingleConnection { | |||||||
| 					long size = Long.parseLong(fileSize.getContent()); | 					long size = Long.parseLong(fileSize.getContent()); | ||||||
| 					message.setBody("" + size); | 					message.setBody("" + size); | ||||||
| 					conversation.getMessages().add(message); | 					conversation.getMessages().add(message); | ||||||
| 					if (size<=this.mJingleConnectionManager.getAutoAcceptFileSize()) { | 					if (size <= this.mJingleConnectionManager | ||||||
| 						Log.d("xmppService","auto accepting file from "+packet.getFrom()); | 							.getAutoAcceptFileSize()) { | ||||||
|  | 						Log.d("xmppService", "auto accepting file from " | ||||||
|  | 								+ packet.getFrom()); | ||||||
| 						this.acceptedAutomatically = true; | 						this.acceptedAutomatically = true; | ||||||
| 						this.sendAccept(); | 						this.sendAccept(); | ||||||
| 					} else { | 					} else { | ||||||
| 						message.markUnread(); | 						message.markUnread(); | ||||||
| 						Log.d("xmppService","not auto accepting new file offer with size: "+size+" allowed size:"+this.mJingleConnectionManager.getAutoAcceptFileSize()); | 						Log.d("xmppService", | ||||||
| 						this.mXmppConnectionService.notifyUi(conversation, true); | 								"not auto accepting new file offer with size: " | ||||||
|  | 										+ size | ||||||
|  | 										+ " allowed size:" | ||||||
|  | 										+ this.mJingleConnectionManager | ||||||
|  | 												.getAutoAcceptFileSize()); | ||||||
|  | 						this.mXmppConnectionService | ||||||
|  | 								.notifyUi(conversation, true); | ||||||
| 					} | 					} | ||||||
| 					this.file = this.mXmppConnectionService.getFileBackend().getJingleFile(message,false); | 					this.file = this.mXmppConnectionService.getFileBackend() | ||||||
|  | 							.getJingleFile(message, false); | ||||||
| 					if (message.getEncryption() == Message.ENCRYPTION_OTR) { | 					if (message.getEncryption() == Message.ENCRYPTION_OTR) { | ||||||
| 						byte[] key = conversation.getSymmetricKey(); | 						byte[] key = conversation.getSymmetricKey(); | ||||||
| 						if (key == null) { | 						if (key == null) { | ||||||
| @ -310,7 +351,8 @@ public class JingleConnection { | |||||||
| 		Content content = new Content(this.contentCreator, this.contentName); | 		Content content = new Content(this.contentCreator, this.contentName); | ||||||
| 		if (message.getType() == Message.TYPE_IMAGE) { | 		if (message.getType() == Message.TYPE_IMAGE) { | ||||||
| 			content.setTransportId(this.transportId); | 			content.setTransportId(this.transportId); | ||||||
| 			this.file = this.mXmppConnectionService.getFileBackend().getJingleFile(message,false); | 			this.file = this.mXmppConnectionService.getFileBackend() | ||||||
|  | 					.getJingleFile(message, false); | ||||||
| 			if (message.getEncryption() == Message.ENCRYPTION_OTR) { | 			if (message.getEncryption() == Message.ENCRYPTION_OTR) { | ||||||
| 				Conversation conversation = this.message.getConversation(); | 				Conversation conversation = this.message.getConversation(); | ||||||
| 				this.mXmppConnectionService.renewSymmetricKey(conversation); | 				this.mXmppConnectionService.renewSymmetricKey(conversation); | ||||||
| @ -339,23 +381,29 @@ public class JingleConnection { | |||||||
| 	private void sendAccept() { | 	private void sendAccept() { | ||||||
| 		status = STATUS_ACCEPTED; | 		status = STATUS_ACCEPTED; | ||||||
| 		mXmppConnectionService.markMessage(message, Message.STATUS_RECIEVING); | 		mXmppConnectionService.markMessage(message, Message.STATUS_RECIEVING); | ||||||
| 		this.mJingleConnectionManager.getPrimaryCandidate(this.account, new OnPrimaryCandidateFound() { | 		this.mJingleConnectionManager.getPrimaryCandidate(this.account, | ||||||
|  | 				new OnPrimaryCandidateFound() { | ||||||
| 
 | 
 | ||||||
| 					@Override | 					@Override | ||||||
| 			public void onPrimaryCandidateFound(boolean success,final JingleCandidate candidate) { | 					public void onPrimaryCandidateFound(boolean success, | ||||||
|  | 							final JingleCandidate candidate) { | ||||||
| 						final JinglePacket packet = bootstrapPacket("session-accept"); | 						final JinglePacket packet = bootstrapPacket("session-accept"); | ||||||
| 				final Content content = new Content(contentCreator,contentName); | 						final Content content = new Content(contentCreator, | ||||||
|  | 								contentName); | ||||||
| 						content.setFileOffer(fileOffer); | 						content.setFileOffer(fileOffer); | ||||||
| 						content.setTransportId(transportId); | 						content.setTransportId(transportId); | ||||||
| 						if ((success) && (!equalCandidateExists(candidate))) { | 						if ((success) && (!equalCandidateExists(candidate))) { | ||||||
| 					final JingleSocks5Transport socksConnection = new JingleSocks5Transport(JingleConnection.this, candidate); | 							final JingleSocks5Transport socksConnection = new JingleSocks5Transport( | ||||||
|  | 									JingleConnection.this, candidate); | ||||||
| 							connections.put(candidate.getCid(), socksConnection); | 							connections.put(candidate.getCid(), socksConnection); | ||||||
| 							socksConnection.connect(new OnTransportConnected() { | 							socksConnection.connect(new OnTransportConnected() { | ||||||
| 
 | 
 | ||||||
| 								@Override | 								@Override | ||||||
| 								public void failed() { | 								public void failed() { | ||||||
| 							Log.d("xmppService","connection to our own primary candidate failed"); | 									Log.d("xmppService", | ||||||
| 							content.socks5transport().setChildren(getCandidatesAsElements()); | 											"connection to our own primary candidate failed"); | ||||||
|  | 									content.socks5transport().setChildren( | ||||||
|  | 											getCandidatesAsElements()); | ||||||
| 									packet.setContent(content); | 									packet.setContent(content); | ||||||
| 									sendJinglePacket(packet); | 									sendJinglePacket(packet); | ||||||
| 									connectNextCandidate(); | 									connectNextCandidate(); | ||||||
| @ -363,17 +411,21 @@ public class JingleConnection { | |||||||
| 
 | 
 | ||||||
| 								@Override | 								@Override | ||||||
| 								public void established() { | 								public void established() { | ||||||
| 							Log.d("xmppService","connected to primary candidate"); | 									Log.d("xmppService", | ||||||
|  | 											"connected to primary candidate"); | ||||||
| 									mergeCandidate(candidate); | 									mergeCandidate(candidate); | ||||||
| 							content.socks5transport().setChildren(getCandidatesAsElements()); | 									content.socks5transport().setChildren( | ||||||
|  | 											getCandidatesAsElements()); | ||||||
| 									packet.setContent(content); | 									packet.setContent(content); | ||||||
| 									sendJinglePacket(packet); | 									sendJinglePacket(packet); | ||||||
| 									connectNextCandidate(); | 									connectNextCandidate(); | ||||||
| 								} | 								} | ||||||
| 							}); | 							}); | ||||||
| 						} else { | 						} else { | ||||||
| 					Log.d("xmppService","did not find a primary candidate for ourself"); | 							Log.d("xmppService", | ||||||
| 					content.socks5transport().setChildren(getCandidatesAsElements()); | 									"did not find a primary candidate for ourself"); | ||||||
|  | 							content.socks5transport().setChildren( | ||||||
|  | 									getCandidatesAsElements()); | ||||||
| 							packet.setContent(content); | 							packet.setContent(content); | ||||||
| 							sendJinglePacket(packet); | 							sendJinglePacket(packet); | ||||||
| 							connectNextCandidate(); | 							connectNextCandidate(); | ||||||
| @ -400,7 +452,8 @@ public class JingleConnection { | |||||||
| 
 | 
 | ||||||
| 	private boolean receiveAccept(JinglePacket packet) { | 	private boolean receiveAccept(JinglePacket packet) { | ||||||
| 		Content content = packet.getJingleContent(); | 		Content content = packet.getJingleContent(); | ||||||
| 		mergeCandidates(JingleCandidate.parse(content.socks5transport().getChildren())); | 		mergeCandidates(JingleCandidate.parse(content.socks5transport() | ||||||
|  | 				.getChildren())); | ||||||
| 		this.status = STATUS_ACCEPTED; | 		this.status = STATUS_ACCEPTED; | ||||||
| 		mXmppConnectionService.markMessage(message, Message.STATUS_UNSEND); | 		mXmppConnectionService.markMessage(message, Message.STATUS_UNSEND); | ||||||
| 		this.connectNextCandidate(); | 		this.connectNextCandidate(); | ||||||
| @ -411,12 +464,16 @@ public class JingleConnection { | |||||||
| 		Content content = packet.getJingleContent(); | 		Content content = packet.getJingleContent(); | ||||||
| 		if (content.hasSocks5Transport()) { | 		if (content.hasSocks5Transport()) { | ||||||
| 			if (content.socks5transport().hasChild("activated")) { | 			if (content.socks5transport().hasChild("activated")) { | ||||||
| 				if ((this.transport!=null)&&(this.transport instanceof JingleSocks5Transport)) { | 				if ((this.transport != null) | ||||||
|  | 						&& (this.transport instanceof JingleSocks5Transport)) { | ||||||
| 					onProxyActivated.success(); | 					onProxyActivated.success(); | ||||||
| 				} else { | 				} else { | ||||||
| 					String cid = content.socks5transport().findChild("activated").getAttribute("cid"); | 					String cid = content.socks5transport() | ||||||
| 					Log.d("xmppService","received proxy activated ("+cid+")prior to choosing our own transport"); | 							.findChild("activated").getAttribute("cid"); | ||||||
| 					JingleSocks5Transport connection = this.connections.get(cid); | 					Log.d("xmppService", "received proxy activated (" + cid | ||||||
|  | 							+ ")prior to choosing our own transport"); | ||||||
|  | 					JingleSocks5Transport connection = this.connections | ||||||
|  | 							.get(cid); | ||||||
| 					if (connection != null) { | 					if (connection != null) { | ||||||
| 						connection.setActivated(true); | 						connection.setActivated(true); | ||||||
| 					} else { | 					} else { | ||||||
| @ -437,7 +494,8 @@ public class JingleConnection { | |||||||
| 				} | 				} | ||||||
| 				return true; | 				return true; | ||||||
| 			} else if (content.socks5transport().hasChild("candidate-used")) { | 			} else if (content.socks5transport().hasChild("candidate-used")) { | ||||||
| 				String cid = content.socks5transport().findChild("candidate-used").getAttribute("cid"); | 				String cid = content.socks5transport() | ||||||
|  | 						.findChild("candidate-used").getAttribute("cid"); | ||||||
| 				if (cid != null) { | 				if (cid != null) { | ||||||
| 					Log.d("xmppService", "candidate used by counterpart:" + cid); | 					Log.d("xmppService", "candidate used by counterpart:" + cid); | ||||||
| 					JingleCandidate candidate = getCandidate(cid); | 					JingleCandidate candidate = getCandidate(cid); | ||||||
| @ -446,7 +504,8 @@ public class JingleConnection { | |||||||
| 					if ((status == STATUS_ACCEPTED) && (this.sentCandidate)) { | 					if ((status == STATUS_ACCEPTED) && (this.sentCandidate)) { | ||||||
| 						this.connect(); | 						this.connect(); | ||||||
| 					} else { | 					} else { | ||||||
| 						Log.d("xmppService","ignoring because file is already in transmission or we havent sent our candidate yet"); | 						Log.d("xmppService", | ||||||
|  | 								"ignoring because file is already in transmission or we havent sent our candidate yet"); | ||||||
| 					} | 					} | ||||||
| 					return true; | 					return true; | ||||||
| 				} else { | 				} else { | ||||||
| @ -473,25 +532,35 @@ public class JingleConnection { | |||||||
| 			this.status = STATUS_TRANSMITTING; | 			this.status = STATUS_TRANSMITTING; | ||||||
| 			if (connection.needsActivation()) { | 			if (connection.needsActivation()) { | ||||||
| 				if (connection.getCandidate().isOurs()) { | 				if (connection.getCandidate().isOurs()) { | ||||||
| 					Log.d("xmppService","candidate "+connection.getCandidate().getCid()+" was our proxy. going to activate"); | 					Log.d("xmppService", "candidate " | ||||||
|  | 							+ connection.getCandidate().getCid() | ||||||
|  | 							+ " was our proxy. going to activate"); | ||||||
| 					IqPacket activation = new IqPacket(IqPacket.TYPE_SET); | 					IqPacket activation = new IqPacket(IqPacket.TYPE_SET); | ||||||
| 					activation.setTo(connection.getCandidate().getJid()); | 					activation.setTo(connection.getCandidate().getJid()); | ||||||
| 					activation.query("http://jabber.org/protocol/bytestreams").setAttribute("sid", this.getSessionId()); | 					activation.query("http://jabber.org/protocol/bytestreams") | ||||||
| 					activation.query().addChild("activate").setContent(this.getCounterPart()); | 							.setAttribute("sid", this.getSessionId()); | ||||||
| 					this.account.getXmppConnection().sendIqPacket(activation, new OnIqPacketReceived() { | 					activation.query().addChild("activate") | ||||||
|  | 							.setContent(this.getCounterPart()); | ||||||
|  | 					this.account.getXmppConnection().sendIqPacket(activation, | ||||||
|  | 							new OnIqPacketReceived() { | ||||||
| 
 | 
 | ||||||
| 								@Override | 								@Override | ||||||
| 						public void onIqPacketReceived(Account account, IqPacket packet) { | 								public void onIqPacketReceived(Account account, | ||||||
|  | 										IqPacket packet) { | ||||||
| 									if (packet.getType() == IqPacket.TYPE_ERROR) { | 									if (packet.getType() == IqPacket.TYPE_ERROR) { | ||||||
| 										onProxyActivated.failed(); | 										onProxyActivated.failed(); | ||||||
| 									} else { | 									} else { | ||||||
| 										onProxyActivated.success(); | 										onProxyActivated.success(); | ||||||
| 								sendProxyActivated(connection.getCandidate().getCid()); | 										sendProxyActivated(connection | ||||||
|  | 												.getCandidate().getCid()); | ||||||
| 									} | 									} | ||||||
| 								} | 								} | ||||||
| 							}); | 							}); | ||||||
| 				} else { | 				} else { | ||||||
| 					Log.d("xmppService","candidate "+connection.getCandidate().getCid()+" was a proxy. waiting for other party to activate"); | 					Log.d("xmppService", | ||||||
|  | 							"candidate " | ||||||
|  | 									+ connection.getCandidate().getCid() | ||||||
|  | 									+ " was a proxy. waiting for other party to activate"); | ||||||
| 				} | 				} | ||||||
| 			} else { | 			} else { | ||||||
| 				if (initiator.equals(account.getFullJid())) { | 				if (initiator.equals(account.getFullJid())) { | ||||||
| @ -507,17 +576,22 @@ public class JingleConnection { | |||||||
| 
 | 
 | ||||||
| 	private JingleSocks5Transport chooseConnection() { | 	private JingleSocks5Transport chooseConnection() { | ||||||
| 		JingleSocks5Transport connection = null; | 		JingleSocks5Transport connection = null; | ||||||
| 		for (Entry<String, JingleSocks5Transport> cursor : connections.entrySet()) { | 		for (Entry<String, JingleSocks5Transport> cursor : connections | ||||||
|  | 				.entrySet()) { | ||||||
| 			JingleSocks5Transport currentConnection = cursor.getValue(); | 			JingleSocks5Transport currentConnection = cursor.getValue(); | ||||||
| 			// Log.d("xmppService","comparing candidate: "+currentConnection.getCandidate().toString()); | 			// Log.d("xmppService","comparing candidate: "+currentConnection.getCandidate().toString()); | ||||||
| 	        if (currentConnection.isEstablished()&&(currentConnection.getCandidate().isUsedByCounterpart()||(!currentConnection.getCandidate().isOurs()))) { | 			if (currentConnection.isEstablished() | ||||||
|  | 					&& (currentConnection.getCandidate().isUsedByCounterpart() || (!currentConnection | ||||||
|  | 							.getCandidate().isOurs()))) { | ||||||
| 				// Log.d("xmppService","is usable"); | 				// Log.d("xmppService","is usable"); | ||||||
| 				if (connection == null) { | 				if (connection == null) { | ||||||
| 					connection = currentConnection; | 					connection = currentConnection; | ||||||
| 				} else { | 				} else { | ||||||
| 	        		if (connection.getCandidate().getPriority()<currentConnection.getCandidate().getPriority()) { | 					if (connection.getCandidate().getPriority() < currentConnection | ||||||
|  | 							.getCandidate().getPriority()) { | ||||||
| 						connection = currentConnection; | 						connection = currentConnection; | ||||||
| 	        		} else if (connection.getCandidate().getPriority()==currentConnection.getCandidate().getPriority()) { | 					} else if (connection.getCandidate().getPriority() == currentConnection | ||||||
|  | 							.getCandidate().getPriority()) { | ||||||
| 						// Log.d("xmppService","found two candidates with same priority"); | 						// Log.d("xmppService","found two candidates with same priority"); | ||||||
| 						if (initiator.equals(account.getFullJid())) { | 						if (initiator.equals(account.getFullJid())) { | ||||||
| 							if (currentConnection.getCandidate().isOurs()) { | 							if (currentConnection.getCandidate().isOurs()) { | ||||||
| @ -543,7 +617,8 @@ public class JingleConnection { | |||||||
| 		this.sendJinglePacket(packet); | 		this.sendJinglePacket(packet); | ||||||
| 		this.disconnect(); | 		this.disconnect(); | ||||||
| 		this.status = STATUS_FINISHED; | 		this.status = STATUS_FINISHED; | ||||||
| 		this.mXmppConnectionService.markMessage(this.message, Message.STATUS_RECIEVED); | 		this.mXmppConnectionService.markMessage(this.message, | ||||||
|  | 				Message.STATUS_RECIEVED); | ||||||
| 		this.mJingleConnectionManager.finishConnection(this); | 		this.mJingleConnectionManager.finishConnection(this); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -552,13 +627,15 @@ public class JingleConnection { | |||||||
| 		Content content = new Content(this.contentCreator, this.contentName); | 		Content content = new Content(this.contentCreator, this.contentName); | ||||||
| 		this.transportId = this.mJingleConnectionManager.nextRandomId(); | 		this.transportId = this.mJingleConnectionManager.nextRandomId(); | ||||||
| 		content.setTransportId(this.transportId); | 		content.setTransportId(this.transportId); | ||||||
| 		content.ibbTransport().setAttribute("block-size",""+this.ibbBlockSize); | 		content.ibbTransport().setAttribute("block-size", | ||||||
|  | 				"" + this.ibbBlockSize); | ||||||
| 		packet.setContent(content); | 		packet.setContent(content); | ||||||
| 		this.sendJinglePacket(packet); | 		this.sendJinglePacket(packet); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private boolean receiveFallbackToIbb(JinglePacket packet) { | 	private boolean receiveFallbackToIbb(JinglePacket packet) { | ||||||
| 		String receivedBlockSize = packet.getJingleContent().ibbTransport().getAttribute("block-size"); | 		String receivedBlockSize = packet.getJingleContent().ibbTransport() | ||||||
|  | 				.getAttribute("block-size"); | ||||||
| 		if (receivedBlockSize != null) { | 		if (receivedBlockSize != null) { | ||||||
| 			int bs = Integer.parseInt(receivedBlockSize); | 			int bs = Integer.parseInt(receivedBlockSize); | ||||||
| 			if (bs > this.ibbBlockSize) { | 			if (bs > this.ibbBlockSize) { | ||||||
| @ -566,12 +643,14 @@ public class JingleConnection { | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		this.transportId = packet.getJingleContent().getTransportId(); | 		this.transportId = packet.getJingleContent().getTransportId(); | ||||||
| 		this.transport = new JingleInbandTransport(this.account,this.responder,this.transportId,this.ibbBlockSize); | 		this.transport = new JingleInbandTransport(this.account, | ||||||
|  | 				this.responder, this.transportId, this.ibbBlockSize); | ||||||
| 		this.transport.receive(file, onFileTransmissionSatusChanged); | 		this.transport.receive(file, onFileTransmissionSatusChanged); | ||||||
| 		JinglePacket answer = bootstrapPacket("transport-accept"); | 		JinglePacket answer = bootstrapPacket("transport-accept"); | ||||||
| 		Content content = new Content("initiator", "a-file-offer"); | 		Content content = new Content("initiator", "a-file-offer"); | ||||||
| 		content.setTransportId(this.transportId); | 		content.setTransportId(this.transportId); | ||||||
| 		content.ibbTransport().setAttribute("block-size", ""+this.ibbBlockSize); | 		content.ibbTransport().setAttribute("block-size", | ||||||
|  | 				"" + this.ibbBlockSize); | ||||||
| 		answer.setContent(content); | 		answer.setContent(content); | ||||||
| 		this.sendJinglePacket(answer); | 		this.sendJinglePacket(answer); | ||||||
| 		return true; | 		return true; | ||||||
| @ -579,14 +658,16 @@ public class JingleConnection { | |||||||
| 
 | 
 | ||||||
| 	private boolean receiveTransportAccept(JinglePacket packet) { | 	private boolean receiveTransportAccept(JinglePacket packet) { | ||||||
| 		if (packet.getJingleContent().hasIbbTransport()) { | 		if (packet.getJingleContent().hasIbbTransport()) { | ||||||
| 			String receivedBlockSize = packet.getJingleContent().ibbTransport().getAttribute("block-size"); | 			String receivedBlockSize = packet.getJingleContent().ibbTransport() | ||||||
|  | 					.getAttribute("block-size"); | ||||||
| 			if (receivedBlockSize != null) { | 			if (receivedBlockSize != null) { | ||||||
| 				int bs = Integer.parseInt(receivedBlockSize); | 				int bs = Integer.parseInt(receivedBlockSize); | ||||||
| 				if (bs > this.ibbBlockSize) { | 				if (bs > this.ibbBlockSize) { | ||||||
| 					this.ibbBlockSize = bs; | 					this.ibbBlockSize = bs; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			this.transport = new JingleInbandTransport(this.account,this.responder,this.transportId,this.ibbBlockSize); | 			this.transport = new JingleInbandTransport(this.account, | ||||||
|  | 					this.responder, this.transportId, this.ibbBlockSize); | ||||||
| 			this.transport.connect(new OnTransportConnected() { | 			this.transport.connect(new OnTransportConnected() { | ||||||
| 
 | 
 | ||||||
| 				@Override | 				@Override | ||||||
| @ -596,7 +677,8 @@ public class JingleConnection { | |||||||
| 
 | 
 | ||||||
| 				@Override | 				@Override | ||||||
| 				public void established() { | 				public void established() { | ||||||
| 					JingleConnection.this.transport.send(file, onFileTransmissionSatusChanged); | 					JingleConnection.this.transport.send(file, | ||||||
|  | 							onFileTransmissionSatusChanged); | ||||||
| 				} | 				} | ||||||
| 			}); | 			}); | ||||||
| 			return true; | 			return true; | ||||||
| @ -607,7 +689,8 @@ public class JingleConnection { | |||||||
| 
 | 
 | ||||||
| 	private void receiveSuccess() { | 	private void receiveSuccess() { | ||||||
| 		this.status = STATUS_FINISHED; | 		this.status = STATUS_FINISHED; | ||||||
| 		this.mXmppConnectionService.markMessage(this.message, Message.STATUS_SEND); | 		this.mXmppConnectionService.markMessage(this.message, | ||||||
|  | 				Message.STATUS_SEND); | ||||||
| 		this.disconnect(); | 		this.disconnect(); | ||||||
| 		this.mJingleConnectionManager.finishConnection(this); | 		this.mJingleConnectionManager.finishConnection(this); | ||||||
| 	} | 	} | ||||||
| @ -616,12 +699,15 @@ public class JingleConnection { | |||||||
| 		this.disconnect(); | 		this.disconnect(); | ||||||
| 		if (this.message != null) { | 		if (this.message != null) { | ||||||
| 			if (this.responder.equals(account.getFullJid())) { | 			if (this.responder.equals(account.getFullJid())) { | ||||||
| 				this.mXmppConnectionService.markMessage(this.message, Message.STATUS_RECEPTION_FAILED); | 				this.mXmppConnectionService.markMessage(this.message, | ||||||
|  | 						Message.STATUS_RECEPTION_FAILED); | ||||||
| 			} else { | 			} else { | ||||||
| 				if (this.status == STATUS_INITIATED) { | 				if (this.status == STATUS_INITIATED) { | ||||||
| 					this.mXmppConnectionService.markMessage(this.message, Message.STATUS_SEND_REJECTED); | 					this.mXmppConnectionService.markMessage(this.message, | ||||||
|  | 							Message.STATUS_SEND_REJECTED); | ||||||
| 				} else { | 				} else { | ||||||
| 					this.mXmppConnectionService.markMessage(this.message, Message.STATUS_SEND_FAILED); | 					this.mXmppConnectionService.markMessage(this.message, | ||||||
|  | 							Message.STATUS_SEND_FAILED); | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @ -639,7 +725,8 @@ public class JingleConnection { | |||||||
| 
 | 
 | ||||||
| 	private void connectNextCandidate() { | 	private void connectNextCandidate() { | ||||||
| 		for (JingleCandidate candidate : this.candidates) { | 		for (JingleCandidate candidate : this.candidates) { | ||||||
| 			if ((!connections.containsKey(candidate.getCid())&&(!candidate.isOurs()))) { | 			if ((!connections.containsKey(candidate.getCid()) && (!candidate | ||||||
|  | 					.isOurs()))) { | ||||||
| 				this.connectWithCandidate(candidate); | 				this.connectWithCandidate(candidate); | ||||||
| 				return; | 				return; | ||||||
| 			} | 			} | ||||||
| @ -648,26 +735,32 @@ public class JingleConnection { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private void connectWithCandidate(final JingleCandidate candidate) { | 	private void connectWithCandidate(final JingleCandidate candidate) { | ||||||
| 		final JingleSocks5Transport socksConnection = new JingleSocks5Transport(this,candidate); | 		final JingleSocks5Transport socksConnection = new JingleSocks5Transport( | ||||||
|  | 				this, candidate); | ||||||
| 		connections.put(candidate.getCid(), socksConnection); | 		connections.put(candidate.getCid(), socksConnection); | ||||||
| 		socksConnection.connect(new OnTransportConnected() { | 		socksConnection.connect(new OnTransportConnected() { | ||||||
| 
 | 
 | ||||||
| 			@Override | 			@Override | ||||||
| 			public void failed() { | 			public void failed() { | ||||||
| 				Log.d("xmppService", "connection failed with "+candidate.getHost()+":"+candidate.getPort()); | 				Log.d("xmppService", | ||||||
|  | 						"connection failed with " + candidate.getHost() + ":" | ||||||
|  | 								+ candidate.getPort()); | ||||||
| 				connectNextCandidate(); | 				connectNextCandidate(); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			@Override | 			@Override | ||||||
| 			public void established() { | 			public void established() { | ||||||
| 				Log.d("xmppService", "established connection with "+candidate.getHost()+":"+candidate.getPort()); | 				Log.d("xmppService", | ||||||
|  | 						"established connection with " + candidate.getHost() | ||||||
|  | 								+ ":" + candidate.getPort()); | ||||||
| 				sendCandidateUsed(candidate.getCid()); | 				sendCandidateUsed(candidate.getCid()); | ||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private void disconnect() { | 	private void disconnect() { | ||||||
| 		Iterator<Entry<String, JingleSocks5Transport>> it = this.connections.entrySet().iterator(); | 		Iterator<Entry<String, JingleSocks5Transport>> it = this.connections | ||||||
|  | 				.entrySet().iterator(); | ||||||
| 		while (it.hasNext()) { | 		while (it.hasNext()) { | ||||||
| 			Entry<String, JingleSocks5Transport> pairs = it.next(); | 			Entry<String, JingleSocks5Transport> pairs = it.next(); | ||||||
| 			pairs.getValue().disconnect(); | 			pairs.getValue().disconnect(); | ||||||
| @ -679,7 +772,8 @@ public class JingleConnection { | |||||||
| 		JinglePacket packet = bootstrapPacket("transport-info"); | 		JinglePacket packet = bootstrapPacket("transport-info"); | ||||||
| 		Content content = new Content(this.contentCreator, this.contentName); | 		Content content = new Content(this.contentCreator, this.contentName); | ||||||
| 		content.setTransportId(this.transportId); | 		content.setTransportId(this.transportId); | ||||||
| 		content.socks5transport().addChild("activated").setAttribute("cid", cid); | 		content.socks5transport().addChild("activated") | ||||||
|  | 				.setAttribute("cid", cid); | ||||||
| 		packet.setContent(content); | 		packet.setContent(content); | ||||||
| 		this.sendJinglePacket(packet); | 		this.sendJinglePacket(packet); | ||||||
| 	} | 	} | ||||||
| @ -688,7 +782,8 @@ public class JingleConnection { | |||||||
| 		JinglePacket packet = bootstrapPacket("transport-info"); | 		JinglePacket packet = bootstrapPacket("transport-info"); | ||||||
| 		Content content = new Content(this.contentCreator, this.contentName); | 		Content content = new Content(this.contentCreator, this.contentName); | ||||||
| 		content.setTransportId(this.transportId); | 		content.setTransportId(this.transportId); | ||||||
| 		content.socks5transport().addChild("candidate-used").setAttribute("cid", cid); | 		content.socks5transport().addChild("candidate-used") | ||||||
|  | 				.setAttribute("cid", cid); | ||||||
| 		packet.setContent(content); | 		packet.setContent(content); | ||||||
| 		this.sentCandidate = true; | 		this.sentCandidate = true; | ||||||
| 		if ((receivedCandidate) && (status == STATUS_ACCEPTED)) { | 		if ((receivedCandidate) && (status == STATUS_ACCEPTED)) { | ||||||
| @ -757,6 +852,7 @@ public class JingleConnection { | |||||||
| 
 | 
 | ||||||
| 	interface OnProxyActivated { | 	interface OnProxyActivated { | ||||||
| 		public void success(); | 		public void success(); | ||||||
|  | 
 | ||||||
| 		public void failed(); | 		public void failed(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 iNPUTmice
						iNPUTmice