From c384b0b36298c4e23358e4d99d9b32d5cfa8c92d Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 9 Sep 2014 12:39:39 +0200 Subject: [PATCH] Started Java impl of file transfer --- .../core/tutorials/TutorialBuddyStatus.java | 7 ++++++ .../core/tutorials/TutorialChatRoom.java | 7 ++++++ .../core/tutorials/TutorialHelloWorld.java | 7 ++++++ .../core/tutorials/TutorialRegistration.java | 7 ++++++ coreapi/linphonecore.c | 4 ++++ coreapi/linphonecore.h | 7 ++++++ coreapi/linphonecore_jni.cc | 21 +++++++++++++++++ .../linphone/core/LinphoneChatMessage.java | 13 +++++++---- .../org/linphone/core/LinphoneChatRoom.java | 23 +++++++++++++++++++ .../org/linphone/core/LinphoneCore.java | 13 ++++++++++- .../linphone/core/LinphoneCoreListener.java | 10 +++++++- .../linphone/core/LinphoneChatRoomImpl.java | 19 +++++++++++++++ .../org/linphone/core/LinphoneCoreImpl.java | 13 ++++++++++- 13 files changed, 143 insertions(+), 8 deletions(-) diff --git a/coreapi/help/java/org/linphone/core/tutorials/TutorialBuddyStatus.java b/coreapi/help/java/org/linphone/core/tutorials/TutorialBuddyStatus.java index 03942d559..e73e2bcae 100644 --- a/coreapi/help/java/org/linphone/core/tutorials/TutorialBuddyStatus.java +++ b/coreapi/help/java/org/linphone/core/tutorials/TutorialBuddyStatus.java @@ -300,5 +300,12 @@ public class TutorialBuddyStatus implements LinphoneCoreListener { } + @Override + public void fileTransferProgressIndication(LinphoneCore lc, + LinphoneChatMessage message, LinphoneContent content, int progress) { + // TODO Auto-generated method stub + + } + } diff --git a/coreapi/help/java/org/linphone/core/tutorials/TutorialChatRoom.java b/coreapi/help/java/org/linphone/core/tutorials/TutorialChatRoom.java index bf1d93d6d..eb488a91a 100644 --- a/coreapi/help/java/org/linphone/core/tutorials/TutorialChatRoom.java +++ b/coreapi/help/java/org/linphone/core/tutorials/TutorialChatRoom.java @@ -218,5 +218,12 @@ public class TutorialChatRoom implements LinphoneCoreListener, LinphoneChatMessa } + @Override + public void fileTransferProgressIndication(LinphoneCore lc, + LinphoneChatMessage message, LinphoneContent content, int progress) { + // TODO Auto-generated method stub + + } + } diff --git a/coreapi/help/java/org/linphone/core/tutorials/TutorialHelloWorld.java b/coreapi/help/java/org/linphone/core/tutorials/TutorialHelloWorld.java index 8c1eeafb4..247bac7e5 100644 --- a/coreapi/help/java/org/linphone/core/tutorials/TutorialHelloWorld.java +++ b/coreapi/help/java/org/linphone/core/tutorials/TutorialHelloWorld.java @@ -220,5 +220,12 @@ public class TutorialHelloWorld implements LinphoneCoreListener { } + @Override + public void fileTransferProgressIndication(LinphoneCore lc, + LinphoneChatMessage message, LinphoneContent content, int progress) { + // TODO Auto-generated method stub + + } + } diff --git a/coreapi/help/java/org/linphone/core/tutorials/TutorialRegistration.java b/coreapi/help/java/org/linphone/core/tutorials/TutorialRegistration.java index 616914c54..b346bc67d 100644 --- a/coreapi/help/java/org/linphone/core/tutorials/TutorialRegistration.java +++ b/coreapi/help/java/org/linphone/core/tutorials/TutorialRegistration.java @@ -251,6 +251,13 @@ public class TutorialRegistration implements LinphoneCoreListener { } + @Override + public void fileTransferProgressIndication(LinphoneCore lc, + LinphoneChatMessage message, LinphoneContent content, int progress) { + // TODO Auto-generated method stub + + } + } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 257b55a11..37a8d6235 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -6399,6 +6399,10 @@ void linphone_core_set_file_transfer_server(LinphoneCore *core, const char * ser core->file_transfer_server=ms_strdup(server_url); } +const char * linphone_core_get_file_transfer_server(LinphoneCore *core) { + return core->file_transfer_server; +} + /** * This function controls signaling features supported by the core. * They are typically included in a SIP Supported header. diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 5e1a5e431..6029f86af 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -2854,6 +2854,13 @@ LINPHONE_PUBLIC void linphone_core_set_tone(LinphoneCore *lc, LinphoneToneID id, * */ LINPHONE_PUBLIC void linphone_core_set_file_transfer_server(LinphoneCore *core, const char * server_url); +/** + * Get the globaly set http file transfer server to be used for content type application/vnd.gsma.rcs-ft-http+xml. + * @param[in] core #LinphoneCore from which to get the server_url + * @return URL of the file server like https://file.linphone.org/upload.php + * */ +LINPHONE_PUBLIC const char * linphone_core_get_file_transfer_server(LinphoneCore *core); + /** * Returns a null terminated table of strings containing the file format extension supported for call recording. * @param core the core diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 7f3d59a0f..68851865c 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -208,6 +208,7 @@ public: vTable.notify_received=notifyReceived; vTable.publish_state_changed=publishStateChanged; vTable.configuring_status=configuringStatus; + vTable.file_transfer_progress_indication=fileTransferProgressIndication; listenerClass = (jclass)env->NewGlobalRef(env->GetObjectClass( alistener)); @@ -310,6 +311,8 @@ public: configuringStateId = env->GetMethodID(listenerClass,"configuringStatus","(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneCore$RemoteProvisioningState;Ljava/lang/String;)V"); configuringStateClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneCore$RemoteProvisioningState")); configuringStateFromIntId = env->GetStaticMethodID(configuringStateClass,"fromInt","(I)Lorg/linphone/core/LinphoneCore$RemoteProvisioningState;"); + + fileTransferProgressIndicationId = env->GetMethodID(listenerClass, "fileTransferProgressIndication", "(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneContent;I)V"); } ~LinphoneCoreData() { @@ -417,6 +420,8 @@ public: jclass subscriptionDirClass; jmethodID subscriptionDirFromIntId; + jmethodID fileTransferProgressIndicationId; + LinphoneCoreVTable vTable; static void showInterfaceCb(LinphoneCore *lc) { @@ -792,6 +797,22 @@ public: LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc); env->CallVoidMethod(lcData->listener, lcData->configuringStateId, lcData->core, env->CallStaticObjectMethod(lcData->configuringStateClass,lcData->configuringStateFromIntId,(jint)status), message ? env->NewStringUTF(message) : NULL); } + + static void fileTransferProgressIndication(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, size_t progress) { + JNIEnv *env = 0; + jint result = jvm->AttachCurrentThread(&env,NULL); + if (result != 0) { + ms_error("cannot attach VM"); + return; + } + LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc); + env->CallVoidMethod(lcData->listener, + lcData->fileTransferProgressIndicationId, + lcData->core, + message ? env->NewObject(lcData->chatMessageClass, lcData->chatMessageCtrId, (jlong)message) : NULL, + content ? create_java_linphone_content(env, content) : NULL, + progress); + } }; extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_newLinphoneCore(JNIEnv* env diff --git a/java/common/org/linphone/core/LinphoneChatMessage.java b/java/common/org/linphone/core/LinphoneChatMessage.java index d103ba26d..376b501e1 100644 --- a/java/common/org/linphone/core/LinphoneChatMessage.java +++ b/java/common/org/linphone/core/LinphoneChatMessage.java @@ -14,21 +14,25 @@ public interface LinphoneChatMessage { private final String mStringValue; /** - * Idle + * Initial state */ public final static State Idle = new State(0,"Idle"); /** - * Incoming call received. + * Delivery in progress */ public final static State InProgress = new State(1,"InProgress"); /** - * Outgoing call initialiazed. + * Message succesffully delivered an acknoleged by remote end point */ public final static State Delivered = new State(2,"Delivered"); /** - * Outgoing call in progress. + * Message was not delivered */ public final static State NotDelivered = new State(3,"NotDelivered"); + /** + * Message was received(and acknowledged) but cannot get file from server + */ + public final static State FileTransferError = new State(4,"FileTransferError"); private State(int value,String stringValue) { mValue = value; @@ -153,5 +157,4 @@ public interface LinphoneChatMessage { * @return an ErrorInfo. */ ErrorInfo getErrorInfo(); - } diff --git a/java/common/org/linphone/core/LinphoneChatRoom.java b/java/common/org/linphone/core/LinphoneChatRoom.java index 722073779..b79dbc9e1 100644 --- a/java/common/org/linphone/core/LinphoneChatRoom.java +++ b/java/common/org/linphone/core/LinphoneChatRoom.java @@ -33,11 +33,13 @@ public interface LinphoneChatRoom { * @return LinphoneAddress peer address */ LinphoneAddress getPeerAddress(); + /** * send a message to peer member of this chat room. * @param message to be sent */ void sendMessage(String message); + /** * Send a message to peer member of this chat room. * @param chat message @@ -128,9 +130,30 @@ public interface LinphoneChatRoom { * @return LinphoneChatMessage object */ LinphoneChatMessage createLinphoneChatMessage(String message, String url, State state, long timestamp, boolean isRead, boolean isIncoming); + /** * Returns a back pointer to the core managing the chat room. * @return the LinphoneCore */ LinphoneCore getCore(); + + /** + * Create a message attached to a dedicated chat room with a particular content. + * @param content LinphoneContent initial content. + * @return a new LinphoneChatMessage + */ + LinphoneChatMessage createFileTransferMessage(LinphoneContent content); + + /** + * Cancel an ongoing file transfer attached to this message (upload or download) + * @param message + */ + void cancelFileTransfer(LinphoneChatMessage message); + + /** + * Get the file_transfer_information (used by call backs to recover informations during a rcs file transfer) + * @param message + * @return a pointer to the LinphoneContent structure or NULL if not present. + */ + LinphoneContent getFileTransferInformation(LinphoneChatMessage message); } diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index 445622425..ca46eb2ed 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -18,7 +18,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone.core; -import java.util.List; import java.util.Vector; import org.linphone.mediastream.video.AndroidVideoWindowImpl; @@ -1695,4 +1694,16 @@ public interface LinphoneCore { * @param value the jitter buffer size in milliseconds. */ public void setVideoJittcomp(int value); + + /** + * Globaly set an http file transfer server to be used for content type application/vnd.gsma.rcs-ft-http+xml. + * @param serverUrl URL of the file server like https://file.linphone.org/upload.php + */ + public void setFileTransferServer(String serverUrl); + + /** + * Get the globaly set http file transfer server to be used for content type application/vnd.gsma.rcs-ft-http+xml. + * @return the serverUrl + */ + public String getFileTransferServer(); } diff --git a/java/common/org/linphone/core/LinphoneCoreListener.java b/java/common/org/linphone/core/LinphoneCoreListener.java index bd83172a9..5d0db571f 100644 --- a/java/common/org/linphone/core/LinphoneCoreListener.java +++ b/java/common/org/linphone/core/LinphoneCoreListener.java @@ -188,6 +188,14 @@ public interface LinphoneCoreListener { /** @Deprecated Callback to display a warning to the user * @return */ void displayWarning(LinphoneCore lc,String message); - + + /** + * Callback to be notified about the transfer progress. + * @param lc the LinphoneCore + * @param message the LinphoneChatMessage + * @param content the LinphoneContent + * @param progress percentage of the transfer done + */ + void fileTransferProgressIndication(LinphoneCore lc, LinphoneChatMessage message, LinphoneContent content, int progress); } diff --git a/java/impl/org/linphone/core/LinphoneChatRoomImpl.java b/java/impl/org/linphone/core/LinphoneChatRoomImpl.java index 5ca8e5628..036ba56df 100644 --- a/java/impl/org/linphone/core/LinphoneChatRoomImpl.java +++ b/java/impl/org/linphone/core/LinphoneChatRoomImpl.java @@ -168,4 +168,23 @@ class LinphoneChatRoomImpl implements LinphoneChatRoom { return messages; } + + @Override + public LinphoneChatMessage createFileTransferMessage(LinphoneContent content) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void cancelFileTransfer(LinphoneChatMessage message) { + // TODO Auto-generated method stub + + } + + @Override + public LinphoneContent getFileTransferInformation( + LinphoneChatMessage message) { + // TODO Auto-generated method stub + return null; + } } diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java index fd6892eb4..8fe26f251 100644 --- a/java/impl/org/linphone/core/LinphoneCoreImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java @@ -22,7 +22,6 @@ import static android.media.AudioManager.MODE_IN_CALL; import java.io.File; import java.io.IOException; -import java.util.List; import org.linphone.core.LinphoneCall.State; import org.linphone.mediastream.Log; @@ -1241,5 +1240,17 @@ class LinphoneCoreImpl implements LinphoneCore { public synchronized void setVideoJittcomp(int value) { setVideoJittcomp(nativePtr,value); } + + @Override + public void setFileTransferServer(String serverUrl) { + // TODO Auto-generated method stub + + } + + @Override + public String getFileTransferServer() { + // TODO Auto-generated method stub + return null; + } }