diff --git a/.gitignore b/.gitignore
index fc80e3d8f..3e162d2d6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,6 @@ WORK
Makefile
OUTPUT
git-clang-format.diff
+submodules/tunnel
+submodules/binaries/dummy-*.a
+linphone-iphone.ipa
diff --git a/Classes/Base.lproj/ChatRoomViewController.strings b/Classes/Base.lproj/ChatRoomViewController.strings
index 93c9cfce9..fcaf31239 100644
Binary files a/Classes/Base.lproj/ChatRoomViewController.strings and b/Classes/Base.lproj/ChatRoomViewController.strings differ
diff --git a/Classes/Base.lproj/DialerViewController.strings b/Classes/Base.lproj/DialerViewController.strings
index 886464095..4ad85d54f 100644
Binary files a/Classes/Base.lproj/DialerViewController.strings and b/Classes/Base.lproj/DialerViewController.strings differ
diff --git a/Classes/Base.lproj/DialerViewController~ipad.strings b/Classes/Base.lproj/DialerViewController~ipad.strings
index a3c0320f6..31b19f8b6 100644
Binary files a/Classes/Base.lproj/DialerViewController~ipad.strings and b/Classes/Base.lproj/DialerViewController~ipad.strings differ
diff --git a/Classes/Base.lproj/DialerViewController~ipad.xib b/Classes/Base.lproj/DialerViewController~ipad.xib
index bc0b8d564..a2a75db10 100644
--- a/Classes/Base.lproj/DialerViewController~ipad.xib
+++ b/Classes/Base.lproj/DialerViewController~ipad.xib
@@ -77,7 +77,7 @@
-
+
diff --git a/Classes/Base.lproj/WizardViews.strings b/Classes/Base.lproj/WizardViews.strings
index 25d437836..8b6aa3f3b 100644
Binary files a/Classes/Base.lproj/WizardViews.strings and b/Classes/Base.lproj/WizardViews.strings differ
diff --git a/Classes/ChatRoomTableViewController.m b/Classes/ChatRoomTableViewController.m
index f1791d01c..d526fc5b6 100644
--- a/Classes/ChatRoomTableViewController.m
+++ b/Classes/ChatRoomTableViewController.m
@@ -58,9 +58,10 @@
// also append transient upload messages because they are not in history yet!
for (FileTransferDelegate *ftd in [[LinphoneManager instance] fileTransferDelegates]) {
- if (linphone_chat_room_get_peer_address(linphone_chat_message_get_chat_room(ftd.message)) ==
- linphone_chat_room_get_peer_address(chatRoom) &&
- linphone_chat_message_is_outgoing(ftd.message)) {
+ const LinphoneAddress *ftd_peer =
+ linphone_chat_room_get_peer_address(linphone_chat_message_get_chat_room(ftd.message));
+ const LinphoneAddress *peer = linphone_chat_room_get_peer_address(chatRoom);
+ if (linphone_address_equal(ftd_peer, peer) && linphone_chat_message_is_outgoing(ftd.message)) {
LOGI(@"Appending transient upload message %p", ftd.message);
self->messageList = ms_list_append(self->messageList, linphone_chat_message_ref(ftd.message));
}
diff --git a/Classes/ChatTableViewController.m b/Classes/ChatTableViewController.m
index bb6bdbfe4..5aa56bf61 100644
--- a/Classes/ChatTableViewController.m
+++ b/Classes/ChatTableViewController.m
@@ -50,8 +50,8 @@
#pragma mark - ViewController Functions
-- (void)viewDidAppear:(BOOL)animated {
- [super viewDidAppear:animated];
+- (void)viewWillAppear:(BOOL)animated {
+ [super viewWillAppear:animated];
self.tableView.accessibilityIdentifier = @"ChatRoom list";
[self loadData];
}
@@ -75,8 +75,8 @@ static int sorted_history_comparison(LinphoneChatRoom *to_insert, LinphoneChatRo
- (MSList *)sortChatRooms {
MSList *sorted = nil;
- MSList *unsorted = linphone_core_get_chat_rooms([LinphoneManager getLc]);
- MSList *iter = unsorted;
+ const MSList *unsorted = linphone_core_get_chat_rooms([LinphoneManager getLc]);
+ const MSList *iter = unsorted;
while (iter) {
// store last message in user data
@@ -174,8 +174,7 @@ static void chatTable_free_chatrooms(void *data) {
[ftd cancel];
}
}
- linphone_chat_room_delete_history(chatRoom);
- linphone_chat_room_unref(chatRoom);
+ linphone_core_delete_chat_room(linphone_chat_room_get_lc(chatRoom), chatRoom);
data = ms_list_remove(data, chatRoom);
// will force a call to [self loadData]
diff --git a/Classes/ChatViewController.m b/Classes/ChatViewController.m
index 3750c9565..d02d2e408 100644
--- a/Classes/ChatViewController.m
+++ b/Classes/ChatViewController.m
@@ -79,14 +79,12 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)startChatRoom {
// Push ChatRoom
LinphoneChatRoom *room =
- linphone_core_get_or_create_chat_room([LinphoneManager getLc], [addressField.text UTF8String]);
+ linphone_core_get_chat_room_from_uri([LinphoneManager getLc], [addressField.text UTF8String]);
if (room != nil) {
ChatRoomViewController *controller = DYNAMIC_CAST(
[[PhoneMainView instance] changeCurrentView:[ChatRoomViewController compositeViewDescription] push:TRUE],
ChatRoomViewController);
if (controller != nil) {
- LinphoneChatRoom *room =
- linphone_core_get_or_create_chat_room([LinphoneManager getLc], [addressField.text UTF8String]);
[controller setChatRoom:room];
}
} else {
diff --git a/Classes/ContactDetailsTableViewController.m b/Classes/ContactDetailsTableViewController.m
index a4d4c28c9..93db73d09 100644
--- a/Classes/ContactDetailsTableViewController.m
+++ b/Classes/ContactDetailsTableViewController.m
@@ -627,7 +627,7 @@ static const ContactSections_e contactSections[ContactSections_MAX] = {ContactSe
ChatRoomViewController);
if (controller != nil) {
LinphoneChatRoom *room =
- linphone_core_get_or_create_chat_room([LinphoneManager getLc], [dest UTF8String]);
+ linphone_core_get_chat_room_from_uri([LinphoneManager getLc], [dest UTF8String]);
[controller setChatRoom:room];
}
}
diff --git a/Classes/HistoryDetailsViewController.m b/Classes/HistoryDetailsViewController.m
index 65ce3dad3..a283fb850 100644
--- a/Classes/HistoryDetailsViewController.m
+++ b/Classes/HistoryDetailsViewController.m
@@ -232,11 +232,8 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (IBAction)onChatClick:(id)event {
- LinphoneAddress *addr;
- addr = linphone_call_log_get_remote_address(callLog);
-
- char *lAddress = linphone_address_as_string_uri_only(addr);
- if (lAddress == NULL)
+ const LinphoneAddress *addr = linphone_call_log_get_remote_address(callLog);
+ if (addr == NULL)
return;
// Go to ChatRoom view
[[PhoneMainView instance] changeCurrentView:[ChatViewController compositeViewDescription]];
@@ -244,10 +241,9 @@ static UICompositeViewDescription *compositeDescription = nil;
[[PhoneMainView instance] changeCurrentView:[ChatRoomViewController compositeViewDescription] push:TRUE],
ChatRoomViewController);
if (controller != nil) {
- LinphoneChatRoom *room = linphone_core_get_or_create_chat_room([LinphoneManager getLc], lAddress);
+ LinphoneChatRoom *room = linphone_core_get_chat_room([LinphoneManager getLc], addr);
[controller setChatRoom:room];
}
- ms_free(lAddress);
}
@end
diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m
index fe20e12c3..60ce84ba9 100644
--- a/Classes/LinphoneAppDelegate.m
+++ b/Classes/LinphoneAppDelegate.m
@@ -179,9 +179,8 @@
}
} else {
if (!instance.isTesting) {
- NSUInteger notifTypes = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound |
- UIRemoteNotificationTypeBadge |
- UIRemoteNotificationTypeNewsstandContentAvailability;
+ NSUInteger notifTypes =
+ UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge;
[app registerForRemoteNotificationTypes:notifTypes];
}
}
@@ -318,7 +317,7 @@
}
- (LinphoneChatRoom *)findChatRoomForContact:(NSString *)contact {
- MSList *rooms = linphone_core_get_chat_rooms([LinphoneManager getLc]);
+ const MSList *rooms = linphone_core_get_chat_rooms([LinphoneManager getLc]);
const char *from = [contact UTF8String];
while (rooms) {
const LinphoneAddress *room_from_address = linphone_chat_room_get_peer_address((LinphoneChatRoom *)rooms->data);
@@ -446,7 +445,7 @@
[self application:application didReceiveLocalNotification:notification];
} else if ([identifier isEqualToString:@"mark_read"]) {
NSString *from = [notification.userInfo objectForKey:@"from_addr"];
- LinphoneChatRoom *room = linphone_core_get_or_create_chat_room(lc, [from UTF8String]);
+ LinphoneChatRoom *room = linphone_core_get_chat_room_from_uri(lc, [from UTF8String]);
if (room) {
linphone_chat_room_mark_as_read(room);
[[PhoneMainView instance] updateApplicationBadgeNumber];
diff --git a/Classes/LinphoneManager.h b/Classes/LinphoneManager.h
index 68b4d2b44..c4a9d221b 100644
--- a/Classes/LinphoneManager.h
+++ b/Classes/LinphoneManager.h
@@ -191,6 +191,8 @@ typedef struct _LinphoneManagerSounds {
- (void)silentPushFailed:(NSTimer*)timer;
+- (void)removeAllAccounts;
+
@property (readonly) BOOL isTesting;
@property (readonly, strong) FastAddressBook* fastAddressBook;
@property Connectivity connectivity;
diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m
index 4b71ad810..03ee20a38 100644
--- a/Classes/LinphoneManager.m
+++ b/Classes/LinphoneManager.m
@@ -1382,28 +1382,14 @@ static BOOL libStarted = FALSE;
connectivity = none;
ms_init(); // Need to initialize mediastreamer2 before loading the plugins
-
+ // Load plugins if available in the linphone SDK - otherwise these calls will do nothing
libmsilbc_init();
-#if defined(HAVE_SILK)
libmssilk_init();
-#endif
-#ifdef HAVE_AMR
- libmsamr_init(); // load amr plugin if present from the liblinphone sdk
-#endif
-#ifdef HAVE_X264
- libmsx264_init(); // load x264 plugin if present from the liblinphone sdk
-#endif
-#ifdef HAVE_OPENH264
- libmsopenh264_init(); // load openh264 plugin if present from the liblinphone sdk
-#endif
-
-#if HAVE_G729
- libmsbcg729_init(); // load g729 plugin
-#endif
-
-#ifdef HAVE_WEBRTC
+ libmsamr_init();
+ libmsx264_init();
+ libmsopenh264_init();
+ libmsbcg729_init();
libmswebrtc_init();
-#endif
// Set audio assets
const char *lRing =
@@ -1840,6 +1826,7 @@ static void audioRouteChangeListenerCallback(void *inUserData, // 1
}
- (void)call:(NSString *)address displayName:(NSString *)displayName transfer:(BOOL)transfer {
+ // First verify that network is available, abort otherwise.
if (!linphone_core_is_network_reachable(theLinphoneCore)) {
UIAlertView *error = [[UIAlertView alloc]
initWithTitle:NSLocalizedString(@"Network Error", nil)
@@ -1848,96 +1835,92 @@ static void audioRouteChangeListenerCallback(void *inUserData, // 1
@"There is no network connection available, enable WIFI or WWAN prior to place a call",
nil)
delegate:nil
- cancelButtonTitle:NSLocalizedString(@"Continue", nil)
+ cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
otherButtonTitles:nil];
[error show];
return;
}
+ // Then check that no GSM calls are in progress, abort otherwise.
CTCallCenter *callCenter = [[CTCallCenter alloc] init];
if ([callCenter currentCalls] != nil) {
LOGE(@"GSM call in progress, cancelling outgoing SIP call request");
- UIAlertView *error = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Cannot make call", nil)
- message:NSLocalizedString(@"Please terminate GSM call", nil)
- delegate:nil
- cancelButtonTitle:NSLocalizedString(@"Continue", nil)
- otherButtonTitles:nil];
+ UIAlertView *error =
+ [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Cannot make call", nil)
+ message:NSLocalizedString(@"Please terminate GSM call first.", nil)
+ delegate:nil
+ cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
+ otherButtonTitles:nil];
[error show];
return;
}
- LinphoneProxyConfig *proxyCfg;
- // get default proxy
- linphone_core_get_default_proxy(theLinphoneCore, &proxyCfg);
- LinphoneCallParams *lcallParams = linphone_core_create_default_call_parameters(theLinphoneCore);
- if ([self lpConfigBoolForKey:@"edge_opt_preference"]) {
- bool low_bandwidth = self.network == network_2g;
- if (low_bandwidth) {
- LOGI(@"Low bandwidth mode");
- }
- linphone_call_params_enable_low_bandwidth(lcallParams, low_bandwidth);
- }
- LinphoneCall *call = NULL;
-
- BOOL addressIsASCII = [address canBeConvertedToEncoding:[NSString defaultCStringEncoding]];
-
- if ([address length] == 0)
- return; // just return
- if (!addressIsASCII) {
- UIAlertView *error =
- [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Invalid SIP address", nil)
- message:NSLocalizedString(@"The address should only contain ASCII data", nil)
- delegate:nil
- cancelButtonTitle:NSLocalizedString(@"Continue", nil)
- otherButtonTitles:nil];
+ LinphoneAddress *addr = NULL;
+ // Continue by checking that the provided address is a valid SIP address, abort otherwise.
+ if ([address length] == 0) {
+ // no address provided... nothing to do
+ } else if (![address canBeConvertedToEncoding:[NSString defaultCStringEncoding]]) {
+ UIAlertView *error = [[UIAlertView alloc]
+ initWithTitle:NSLocalizedString(@"Invalid SIP address", nil)
+ message:NSLocalizedString(
+ @"Some invalid characters where found in the given SIP address. Please correct it.",
+ nil)
+ delegate:nil
+ cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
+ otherButtonTitles:nil];
[error show];
- }
- LinphoneAddress *linphoneAddress =
- linphone_core_interpret_url(theLinphoneCore, [address cStringUsingEncoding:[NSString defaultCStringEncoding]]);
-
- if (linphoneAddress) {
-
- if (displayName != nil) {
- linphone_address_set_display_name(linphoneAddress,
- [displayName cStringUsingEncoding:[NSString defaultCStringEncoding]]);
- }
- if ([[LinphoneManager instance] lpConfigBoolForKey:@"override_domain_with_default_one"])
- linphone_address_set_domain(
- linphoneAddress, [[[LinphoneManager instance] lpConfigStringForKey:@"domain" forSection:@"wizard"]
- cStringUsingEncoding:[NSString defaultCStringEncoding]]);
- if (transfer) {
- linphone_core_transfer_call(theLinphoneCore, linphone_core_get_current_call(theLinphoneCore),
- [address cStringUsingEncoding:[NSString defaultCStringEncoding]]);
- } else {
- call = linphone_core_invite_address_with_params(theLinphoneCore, linphoneAddress, lcallParams);
- }
- linphone_address_destroy(linphoneAddress);
-
- } else {
-
+ } else if ((addr = linphone_core_interpret_url(
+ theLinphoneCore, [address cStringUsingEncoding:[NSString defaultCStringEncoding]])) == NULL) {
UIAlertView *error = [[UIAlertView alloc]
initWithTitle:NSLocalizedString(@"Invalid SIP address", nil)
message:NSLocalizedString(@"Either configure a SIP proxy server from settings prior to place a "
@"call or use a valid SIP address (I.E sip:john@example.net)",
nil)
delegate:nil
- cancelButtonTitle:NSLocalizedString(@"Continue", nil)
+ cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
otherButtonTitles:nil];
[error show];
- }
+ } else {
+ // Finally we can make the call
+ LinphoneProxyConfig *proxyCfg;
+ linphone_core_get_default_proxy(theLinphoneCore, &proxyCfg);
+ LinphoneCallParams *lcallParams = linphone_core_create_default_call_parameters(theLinphoneCore);
+ if ([self lpConfigBoolForKey:@"edge_opt_preference"] && (self.network == network_2g)) {
+ LOGI(@"Enabling low bandwidth mode");
+ linphone_call_params_enable_low_bandwidth(lcallParams, YES);
+ }
+ if (displayName != nil) {
+ linphone_address_set_display_name(addr,
+ [displayName cStringUsingEncoding:[NSString defaultCStringEncoding]]);
+ }
+ if ([[LinphoneManager instance] lpConfigBoolForKey:@"override_domain_with_default_one"]) {
+ linphone_address_set_domain(
+ addr, [[[LinphoneManager instance] lpConfigStringForKey:@"domain" forSection:@"wizard"]
+ cStringUsingEncoding:[NSString defaultCStringEncoding]]);
+ }
- if (call) {
- // The LinphoneCallAppData object should be set on call creation with callback
- // - (void)onCall:StateChanged:withMessage:. If not, we are in big trouble and expect it to crash
- // We are NOT responsible for creating the AppData.
- LinphoneCallAppData *data = (__bridge LinphoneCallAppData *)linphone_call_get_user_data(call);
- if (data == nil)
- LOGE(@"New call instanciated but app data was not set. Expect it to crash.");
- /* will be used later to notify user if video was not activated because of the linphone core*/
- else
- data->videoRequested = linphone_call_params_video_enabled(lcallParams);
+ if (transfer) {
+ char *caddr = linphone_address_as_string(addr);
+ linphone_core_transfer_call(theLinphoneCore, linphone_core_get_current_call(theLinphoneCore), caddr);
+ ms_free(caddr);
+ } else {
+ LinphoneCall *call = linphone_core_invite_address_with_params(theLinphoneCore, addr, lcallParams);
+ if (call) {
+ // The LinphoneCallAppData object should be set on call creation with callback
+ // - (void)onCall:StateChanged:withMessage:. If not, we are in big trouble and expect it to crash
+ // We are NOT responsible for creating the AppData.
+ LinphoneCallAppData *data = (__bridge LinphoneCallAppData *)linphone_call_get_user_data(call);
+ if (data == nil) {
+ LOGE(@"New call instanciated but app data was not set. Expect it to crash.");
+ /* will be used later to notify user if video was not activated because of the linphone core*/
+ } else {
+ data->videoRequested = linphone_call_params_video_enabled(lcallParams);
+ }
+ }
+ }
+ linphone_address_destroy(addr);
+ linphone_call_params_destroy(lcallParams);
}
- linphone_call_params_destroy(lcallParams);
}
#pragma mark - Property Functions
@@ -2020,8 +2003,8 @@ static void audioRouteChangeListenerCallback(void *inUserData, // 1
+ (int)unreadMessageCount {
int count = 0;
- MSList *rooms = linphone_core_get_chat_rooms([LinphoneManager getLc]);
- MSList *item = rooms;
+ const MSList *rooms = linphone_core_get_chat_rooms([LinphoneManager getLc]);
+ const MSList *item = rooms;
while (item) {
LinphoneChatRoom *room = (LinphoneChatRoom *)item->data;
if (room) {
@@ -2286,4 +2269,10 @@ static void audioRouteChangeListenerCallback(void *inUserData, // 1
// Query our in-app server to retrieve InApp purchases
[_iapManager retrievePurchases];
}
+
+- (void)removeAllAccounts {
+ linphone_core_clear_proxy_config([LinphoneManager getLc]);
+ linphone_core_clear_all_auth_info([LinphoneManager getLc]);
+}
+
@end
diff --git a/Classes/LinphoneUI/Base.lproj/UICallCell.strings b/Classes/LinphoneUI/Base.lproj/UICallCell.strings
index d1f90f404..cc5ae2ee6 100644
Binary files a/Classes/LinphoneUI/Base.lproj/UICallCell.strings and b/Classes/LinphoneUI/Base.lproj/UICallCell.strings differ
diff --git a/Classes/LinphoneUI/Base.lproj/UIChatCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatCell.strings
index 7b10fdec3..679cbe790 100644
Binary files a/Classes/LinphoneUI/Base.lproj/UIChatCell.strings and b/Classes/LinphoneUI/Base.lproj/UIChatCell.strings differ
diff --git a/Classes/LinphoneUI/Base.lproj/UIChatRoomCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatRoomCell.strings
index e6c0b4afb..aa7f96da1 100644
Binary files a/Classes/LinphoneUI/Base.lproj/UIChatRoomCell.strings and b/Classes/LinphoneUI/Base.lproj/UIChatRoomCell.strings differ
diff --git a/Classes/LinphoneUI/UIChatRoomCell.m b/Classes/LinphoneUI/UIChatRoomCell.m
index d5e855778..06fb1f4ca 100644
--- a/Classes/LinphoneUI/UIChatRoomCell.m
+++ b/Classes/LinphoneUI/UIChatRoomCell.m
@@ -65,8 +65,7 @@ static UIFont *CELL_FONT = nil;
resendTapGestureRecognizer =
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onResendClick:)];
- [dateLabel addGestureRecognizer:resendTapGestureRecognizer];
- [statusImage addGestureRecognizer:resendTapGestureRecognizer];
+ [innerView addGestureRecognizer:resendTapGestureRecognizer];
[self addSubview:innerView];
[deleteButton setAlpha:0.0f];
diff --git a/Classes/LinphoneUI/UIStateBar.m b/Classes/LinphoneUI/UIStateBar.m
index 2e5ca917a..1124220b9 100644
--- a/Classes/LinphoneUI/UIStateBar.m
+++ b/Classes/LinphoneUI/UIStateBar.m
@@ -203,6 +203,7 @@
break;
}
[registrationState setTitle:message forState:UIControlStateNormal];
+ registrationState.accessibilityValue = message;
[registrationState setImage:image forState:UIControlStateNormal];
}
diff --git a/Classes/LinphoneUI/UIVideoButton.m b/Classes/LinphoneUI/UIVideoButton.m
index 5729b8033..d6651a8aa 100644
--- a/Classes/LinphoneUI/UIVideoButton.m
+++ b/Classes/LinphoneUI/UIVideoButton.m
@@ -99,15 +99,14 @@
- (bool)onUpdate {
bool video_enabled = false;
-
-#ifdef VIDEO_ENABLED
- LinphoneCall *currentCall = linphone_core_get_current_call([LinphoneManager getLc]);
- if (linphone_core_video_enabled([LinphoneManager getLc]) && currentCall &&
- !linphone_call_media_in_progress(currentCall) &&
- linphone_call_get_state(currentCall) == LinphoneCallStreamsRunning) {
- video_enabled = TRUE;
+ LinphoneCore *lc = [LinphoneManager getLc];
+ LinphoneCall *currentCall = linphone_core_get_current_call(lc);
+ if (linphone_core_video_supported(lc)) {
+ if (linphone_core_video_enabled(lc) && currentCall && !linphone_call_media_in_progress(currentCall) &&
+ linphone_call_get_state(currentCall) == LinphoneCallStreamsRunning) {
+ video_enabled = TRUE;
+ }
}
-#endif // VIDEO_ENABLED
[self setEnabled:video_enabled];
if (last_update_state != video_enabled)
diff --git a/Classes/LinphoneUI/ar.lproj/UICallCell.strings b/Classes/LinphoneUI/ar.lproj/UICallCell.strings
index 0e75aee0c..a5eb47831 100644
Binary files a/Classes/LinphoneUI/ar.lproj/UICallCell.strings and b/Classes/LinphoneUI/ar.lproj/UICallCell.strings differ
diff --git a/Classes/LinphoneUI/ar.lproj/UIChatCell.strings b/Classes/LinphoneUI/ar.lproj/UIChatCell.strings
index fb308e7ca..06636797f 100644
Binary files a/Classes/LinphoneUI/ar.lproj/UIChatCell.strings and b/Classes/LinphoneUI/ar.lproj/UIChatCell.strings differ
diff --git a/Classes/LinphoneUI/ar.lproj/UIChatRoomCell.strings b/Classes/LinphoneUI/ar.lproj/UIChatRoomCell.strings
index 9c28be881..23bd6fc18 100644
Binary files a/Classes/LinphoneUI/ar.lproj/UIChatRoomCell.strings and b/Classes/LinphoneUI/ar.lproj/UIChatRoomCell.strings differ
diff --git a/Classes/LinphoneUI/de.lproj/UICallCell.strings b/Classes/LinphoneUI/de.lproj/UICallCell.strings
index 0c4232ce2..3329cc3f6 100644
Binary files a/Classes/LinphoneUI/de.lproj/UICallCell.strings and b/Classes/LinphoneUI/de.lproj/UICallCell.strings differ
diff --git a/Classes/LinphoneUI/de.lproj/UIChatCell.strings b/Classes/LinphoneUI/de.lproj/UIChatCell.strings
index ec85a65fa..e3f49202f 100644
Binary files a/Classes/LinphoneUI/de.lproj/UIChatCell.strings and b/Classes/LinphoneUI/de.lproj/UIChatCell.strings differ
diff --git a/Classes/LinphoneUI/de.lproj/UIChatRoomCell.strings b/Classes/LinphoneUI/de.lproj/UIChatRoomCell.strings
index bb0ec0b8f..e2110e9a8 100644
Binary files a/Classes/LinphoneUI/de.lproj/UIChatRoomCell.strings and b/Classes/LinphoneUI/de.lproj/UIChatRoomCell.strings differ
diff --git a/Classes/LinphoneUI/fr.lproj/UICallCell.strings b/Classes/LinphoneUI/fr.lproj/UICallCell.strings
index 528217606..477fc2fd7 100644
Binary files a/Classes/LinphoneUI/fr.lproj/UICallCell.strings and b/Classes/LinphoneUI/fr.lproj/UICallCell.strings differ
diff --git a/Classes/LinphoneUI/fr.lproj/UIChatCell.strings b/Classes/LinphoneUI/fr.lproj/UIChatCell.strings
index bbf54c0fc..0f2b4601f 100644
Binary files a/Classes/LinphoneUI/fr.lproj/UIChatCell.strings and b/Classes/LinphoneUI/fr.lproj/UIChatCell.strings differ
diff --git a/Classes/LinphoneUI/fr.lproj/UIChatRoomCell.strings b/Classes/LinphoneUI/fr.lproj/UIChatRoomCell.strings
index 53010b51d..de063b598 100644
Binary files a/Classes/LinphoneUI/fr.lproj/UIChatRoomCell.strings and b/Classes/LinphoneUI/fr.lproj/UIChatRoomCell.strings differ
diff --git a/Classes/LinphoneUI/ja.lproj/UICallCell.strings b/Classes/LinphoneUI/ja.lproj/UICallCell.strings
index 508e91b9f..a5a987148 100644
Binary files a/Classes/LinphoneUI/ja.lproj/UICallCell.strings and b/Classes/LinphoneUI/ja.lproj/UICallCell.strings differ
diff --git a/Classes/LinphoneUI/ja.lproj/UIChatCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatCell.strings
index 189ff976b..ac598a83f 100644
Binary files a/Classes/LinphoneUI/ja.lproj/UIChatCell.strings and b/Classes/LinphoneUI/ja.lproj/UIChatCell.strings differ
diff --git a/Classes/LinphoneUI/ja.lproj/UIChatRoomCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatRoomCell.strings
index 8c644d98e..1c2582d0b 100644
Binary files a/Classes/LinphoneUI/ja.lproj/UIChatRoomCell.strings and b/Classes/LinphoneUI/ja.lproj/UIChatRoomCell.strings differ
diff --git a/Classes/LinphoneUI/nl.lproj/UICallCell.strings b/Classes/LinphoneUI/nl.lproj/UICallCell.strings
index ffdb4d952..bc7116b5f 100644
Binary files a/Classes/LinphoneUI/nl.lproj/UICallCell.strings and b/Classes/LinphoneUI/nl.lproj/UICallCell.strings differ
diff --git a/Classes/LinphoneUI/nl.lproj/UIChatCell.strings b/Classes/LinphoneUI/nl.lproj/UIChatCell.strings
index b9b54b4d4..549ac9f14 100644
Binary files a/Classes/LinphoneUI/nl.lproj/UIChatCell.strings and b/Classes/LinphoneUI/nl.lproj/UIChatCell.strings differ
diff --git a/Classes/LinphoneUI/nl.lproj/UIChatRoomCell.strings b/Classes/LinphoneUI/nl.lproj/UIChatRoomCell.strings
index 26f3304fd..254e8b072 100644
Binary files a/Classes/LinphoneUI/nl.lproj/UIChatRoomCell.strings and b/Classes/LinphoneUI/nl.lproj/UIChatRoomCell.strings differ
diff --git a/Classes/LinphoneUI/ru.lproj/UICallCell.strings b/Classes/LinphoneUI/ru.lproj/UICallCell.strings
index b997cc9fb..c615374a4 100644
Binary files a/Classes/LinphoneUI/ru.lproj/UICallCell.strings and b/Classes/LinphoneUI/ru.lproj/UICallCell.strings differ
diff --git a/Classes/LinphoneUI/ru.lproj/UIChatCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatCell.strings
index 7b10fdec3..230842181 100644
Binary files a/Classes/LinphoneUI/ru.lproj/UIChatCell.strings and b/Classes/LinphoneUI/ru.lproj/UIChatCell.strings differ
diff --git a/Classes/LinphoneUI/zh_TW.lproj/UICallCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UICallCell.strings
index a95eadf7a..df97e341e 100644
Binary files a/Classes/LinphoneUI/zh_TW.lproj/UICallCell.strings and b/Classes/LinphoneUI/zh_TW.lproj/UICallCell.strings differ
diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIChatCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIChatCell.strings
index 7b10fdec3..230842181 100644
Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIChatCell.strings and b/Classes/LinphoneUI/zh_TW.lproj/UIChatCell.strings differ
diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m
index 39299f014..49b73ad5e 100644
--- a/Classes/PhoneMainView.m
+++ b/Classes/PhoneMainView.m
@@ -77,24 +77,36 @@ static RootViewManager *rootViewManagerInstance = nil;
currentViewController = newMainView;
LinphoneAppDelegate *delegate = (LinphoneAppDelegate *)[UIApplication sharedApplication].delegate;
- [UIView transitionWithView:delegate.window
- duration:0.3
- options:UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionAllowAnimatedContent
- animations:^{
- delegate.window.rootViewController = newMainView;
- // when going to landscape-enabled view, we have to get the current portrait frame and orientation,
- // because it could still have landscape-based size
- if (nextViewOrientation != previousOrientation && newMainView == self.rotatingViewController) {
- newMainView.view.frame = previousMainView.view.frame;
- [newMainView.mainViewController.view setFrame:previousMainView.mainViewController.view.frame];
- [newMainView willRotateToInterfaceOrientation:previousOrientation duration:0.3];
- [newMainView willAnimateRotationToInterfaceOrientation:previousOrientation duration:0.3];
- [newMainView didRotateFromInterfaceOrientation:nextViewOrientation];
- }
-
+ if ([[LinphoneManager instance] lpConfigBoolForKey:@"animations_preference"] == true) {
+ [UIView transitionWithView:delegate.window
+ duration:0.3
+ options:UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionAllowAnimatedContent
+ animations:^{
+ delegate.window.rootViewController = newMainView;
+ // when going to landscape-enabled view, we have to get the current portrait frame and orientation,
+ // because it could still have landscape-based size
+ if (nextViewOrientation != previousOrientation && newMainView == self.rotatingViewController) {
+ newMainView.view.frame = previousMainView.view.frame;
+ [newMainView.mainViewController.view setFrame:previousMainView.mainViewController.view.frame];
+ [newMainView willRotateToInterfaceOrientation:previousOrientation duration:0.3];
+ [newMainView willAnimateRotationToInterfaceOrientation:previousOrientation duration:0.3];
+ [newMainView didRotateFromInterfaceOrientation:nextViewOrientation];
+ }
+ }
+ completion:^(BOOL finished){
+ }];
+ } else {
+ delegate.window.rootViewController = newMainView;
+ // when going to landscape-enabled view, we have to get the current portrait frame and orientation,
+ // because it could still have landscape-based size
+ if (nextViewOrientation != previousOrientation && newMainView == self.rotatingViewController) {
+ newMainView.view.frame = previousMainView.view.frame;
+ [newMainView.mainViewController.view setFrame:previousMainView.mainViewController.view.frame];
+ [newMainView willRotateToInterfaceOrientation:previousOrientation duration:0.];
+ [newMainView willAnimateRotationToInterfaceOrientation:previousOrientation duration:0.];
+ [newMainView didRotateFromInterfaceOrientation:nextViewOrientation];
}
- completion:^(BOOL finished){
- }];
+ }
}
return currentViewController;
}
@@ -630,21 +642,28 @@ static RootViewManager *rootViewManagerInstance = nil;
@"SIP account configuration in the settings.",
nil);
} else {
- lMessage = [NSString stringWithFormat:NSLocalizedString(@"Cannot call %@", nil), lUserName];
+ lMessage = [NSString stringWithFormat:NSLocalizedString(@"Cannot call %@.", nil), lUserName];
}
- if (linphone_call_get_reason(call) == LinphoneReasonNotFound) {
- lMessage = [NSString stringWithFormat:NSLocalizedString(@"%@ not registered", nil), lUserName];
- } else {
- if (message != nil) {
- lMessage = [NSString stringWithFormat:NSLocalizedString(@"%@\nReason was: %@", nil), lMessage, message];
- }
+ switch (linphone_call_get_reason(call)) {
+ case LinphoneReasonNotFound:
+ lMessage = [NSString stringWithFormat:NSLocalizedString(@"%@ is not registered.", nil), lUserName];
+ break;
+ case LinphoneReasonBusy:
+ lMessage = [NSString stringWithFormat:NSLocalizedString(@"%@ is busy.", nil), lUserName];
+ break;
+ default:
+ if (message != nil) {
+ lMessage = [NSString stringWithFormat:NSLocalizedString(@"%@\nReason was: %@", nil), lMessage, message];
+ }
+ break;
}
+
lTitle = NSLocalizedString(@"Call failed", nil);
UIAlertView *error = [[UIAlertView alloc] initWithTitle:lTitle
message:lMessage
delegate:nil
- cancelButtonTitle:NSLocalizedString(@"Dismiss", nil)
+ cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
otherButtonTitles:nil];
[error show];
}
diff --git a/Classes/SettingsViewController.m b/Classes/SettingsViewController.m
index ea58f52c4..6fb714d55 100644
--- a/Classes/SettingsViewController.m
+++ b/Classes/SettingsViewController.m
@@ -343,7 +343,7 @@
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
[UINavigationControllerEx removeBackground:viewController.view];
- [viewController viewWillAppear:animated]; // Force view
+ [viewController view]; // Force view
UILabel *labelTitleView = [[UILabel alloc] init];
labelTitleView.backgroundColor = [UIColor clearColor];
labelTitleView.textColor = [UIColor colorWithRed:0x41 / 255.0f green:0x48 / 255.0f blue:0x4f / 255.0f alpha:1.0];
@@ -498,74 +498,47 @@ static UICompositeViewDescription *compositeDescription = nil;
#pragma mark -
-+ (IASKSpecifier *)disableCodecSpecifier:(IASKSpecifier *)specifier {
- NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:[specifier specifierDict]];
-
- NSMutableString *type = [NSMutableString stringWithString:[dict objectForKey:kIASKType]];
- [type setString:kIASKPSTitleValueSpecifier];
- [dict setObject:type forKey:kIASKType];
-
- NSMutableArray *values =
- [NSMutableArray arrayWithObjects:[NSNumber numberWithInt:0], [NSNumber numberWithInt:1], nil];
- [dict setObject:values forKey:kIASKValues];
-
- NSString *title = NSLocalizedString(@"Disabled, build from sources to enable", nil);
- NSMutableArray *titles = [NSMutableArray arrayWithObjects:title, title, nil];
- [dict setObject:titles forKey:kIASKTitles];
-
- return [[IASKSpecifier alloc] initWithSpecifier:dict];
-}
-
+ (IASKSpecifier *)filterSpecifier:(IASKSpecifier *)specifier {
-#ifndef HAVE_SSL
- if ([[specifier key] isEqualToString:@"transport_preference"]) {
- NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:[specifier specifierDict]];
- NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]];
- [titles removeObject:@"TLS"];
- [dict setObject:titles forKey:@"Titles"];
- NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]];
- [values removeObject:@"tls"];
- [dict setObject:values forKey:@"Values"];
- return [[IASKSpecifier alloc] initWithSpecifier:dict];
- }
-#else
- if ([[specifier key] isEqualToString:@"media_encryption_preference"]) {
- NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:[specifier specifierDict]];
- if (!linphone_core_media_encryption_supported([LinphoneManager getLc], LinphoneMediaEncryptionZRTP)) {
+ if (!linphone_core_sip_transport_supported([LinphoneManager getLc], LinphoneTransportTls)) {
+ if ([[specifier key] isEqualToString:@"transport_preference"]) {
+ NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:[specifier specifierDict]];
NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]];
- [titles removeObject:@"ZRTP"];
+ [titles removeObject:@"TLS"];
[dict setObject:titles forKey:@"Titles"];
NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]];
- [values removeObject:@"ZRTP"];
+ [values removeObject:@"tls"];
[dict setObject:values forKey:@"Values"];
+ return [[IASKSpecifier alloc] initWithSpecifier:dict];
}
- if (!linphone_core_media_encryption_supported([LinphoneManager getLc], LinphoneMediaEncryptionSRTP)) {
- NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]];
- [titles removeObject:@"SRTP"];
- [dict setObject:titles forKey:@"Titles"];
- NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]];
- [values removeObject:@"SRTP"];
- [dict setObject:values forKey:@"Values"];
+ } else {
+ if ([[specifier key] isEqualToString:@"media_encryption_preference"]) {
+ NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:[specifier specifierDict]];
+ if (!linphone_core_media_encryption_supported([LinphoneManager getLc], LinphoneMediaEncryptionZRTP)) {
+ NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]];
+ [titles removeObject:@"ZRTP"];
+ [dict setObject:titles forKey:@"Titles"];
+ NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]];
+ [values removeObject:@"ZRTP"];
+ [dict setObject:values forKey:@"Values"];
+ }
+ if (!linphone_core_media_encryption_supported([LinphoneManager getLc], LinphoneMediaEncryptionSRTP)) {
+ NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]];
+ [titles removeObject:@"SRTP"];
+ [dict setObject:titles forKey:@"Titles"];
+ NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]];
+ [values removeObject:@"SRTP"];
+ [dict setObject:values forKey:@"Values"];
+ }
+ if (!linphone_core_media_encryption_supported([LinphoneManager getLc], LinphoneMediaEncryptionDTLS)) {
+ NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]];
+ [titles removeObject:@"DTLS"];
+ [dict setObject:titles forKey:@"Titles"];
+ NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]];
+ [values removeObject:@"DTLS"];
+ [dict setObject:values forKey:@"Values"];
+ }
+ return [[IASKSpecifier alloc] initWithSpecifier:dict];
}
- if (!linphone_core_media_encryption_supported([LinphoneManager getLc], LinphoneMediaEncryptionDTLS)) {
- NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]];
- [titles removeObject:@"DTLS"];
- [dict setObject:titles forKey:@"Titles"];
- NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]];
- [values removeObject:@"DTLS"];
- [dict setObject:values forKey:@"Values"];
- }
- return [[IASKSpecifier alloc] initWithSpecifier:dict];
- }
-
-#endif // HAVE_SSL
-
- // Add "build from source" if MPEG4 or H264 disabled
- if ([[specifier key] isEqualToString:@"h264_preference"] && ![LinphoneManager isCodecSupported:"h264"]) {
- return [SettingsViewController disableCodecSpecifier:specifier];
- }
- if ([[specifier key] isEqualToString:@"mp4v-es_preference"] && ![LinphoneManager isCodecSupported:"mp4v-es"]) {
- return [SettingsViewController disableCodecSpecifier:specifier];
}
return specifier;
@@ -575,9 +548,9 @@ static UICompositeViewDescription *compositeDescription = nil;
LinphoneManager *lm = [LinphoneManager instance];
NSMutableSet *hiddenKeys = [NSMutableSet set];
-#ifndef HAVE_SSL
- [hiddenKeys addObject:@"media_encryption_preference"];
-#endif
+ if (!linphone_core_sip_transport_supported([LinphoneManager getLc], LinphoneTransportTls)) {
+ [hiddenKeys addObject:@"media_encryption_preference"];
+ }
#ifndef DEBUG
[hiddenKeys addObject:@"release_button"];
@@ -606,6 +579,13 @@ static UICompositeViewDescription *compositeDescription = nil;
if (!linphone_core_video_supported([LinphoneManager getLc]))
[hiddenKeys addObject:@"video_menu"];
+ if (![LinphoneManager isCodecSupported:"h264"]) {
+ [hiddenKeys addObject:@"h264_preference"];
+ }
+ if (![LinphoneManager isCodecSupported:"mp4v-es"]) {
+ [hiddenKeys addObject:@"mp4v-es_preference"];
+ }
+
if (![LinphoneManager isNotIphone3G])
[hiddenKeys addObject:@"silk_24k_preference"];
@@ -621,9 +601,9 @@ static UICompositeViewDescription *compositeDescription = nil;
[hiddenKeys addObject:@"enable_first_login_view_preference"];
-#ifndef VIDEO_ENABLED
- [hiddenKeys addObject:@"enable_video_preference"];
-#endif // VIDEO_ENABLED
+ if (!linphone_core_video_supported([LinphoneManager getLc])) {
+ [hiddenKeys addObject:@"enable_video_preference"];
+ }
if (!linphone_core_video_enabled([LinphoneManager getLc])) {
[hiddenKeys addObject:@"video_menu"];
diff --git a/Classes/Utils/FileTransferDelegate.m b/Classes/Utils/FileTransferDelegate.m
index 112c62b9b..28b74008d 100644
--- a/Classes/Utils/FileTransferDelegate.m
+++ b/Classes/Utils/FileTransferDelegate.m
@@ -137,19 +137,20 @@ static LinphoneBuffer *linphone_iphone_file_transfer_send(LinphoneChatMessage *m
}
- (void)upload:(UIImage *)image withURL:(NSURL *)url forChatRoom:(LinphoneChatRoom *)chatRoom {
- [[[LinphoneManager instance] fileTransferDelegates] addObject:self];
+ [LinphoneManager.instance.fileTransferDelegates addObject:self];
LinphoneContent *content = linphone_core_create_content(linphone_chat_room_get_lc(chatRoom));
_data = [NSMutableData dataWithData:UIImageJPEGRepresentation(image, 1.0)];
linphone_content_set_type(content, "image");
linphone_content_set_subtype(content, "jpeg");
linphone_content_set_name(content,
- [[NSString stringWithFormat:@"%li-%f.jpg", (long)[image hash],
+ [[NSString stringWithFormat:@"%li-%f.jpg", (long)image.hash,
[NSDate timeIntervalSinceReferenceDate]] UTF8String]);
- linphone_content_set_size(content, [_data length]);
+ linphone_content_set_size(content, _data.length);
_message = linphone_chat_room_create_file_transfer_message(chatRoom, content);
- linphone_chat_message_ref(_message);
+ linphone_content_unref(content);
+
linphone_chat_message_cbs_set_file_transfer_send(linphone_chat_message_get_callbacks(_message),
linphone_iphone_file_transfer_send);
@@ -158,7 +159,7 @@ static LinphoneBuffer *linphone_iphone_file_transfer_send(LinphoneChatMessage *m
[LinphoneManager setValueInMessageAppData:[url absoluteString] forKey:@"localimage" inMessage:_message];
}
- LOGI(@"%p Uploading content in %p", self, _message);
+ LOGI(@"%p Uploading content from message %p", self, _message);
linphone_chat_room_send_chat_message(chatRoom, _message);
}
@@ -187,13 +188,17 @@ static LinphoneBuffer *linphone_iphone_file_transfer_send(LinphoneChatMessage *m
- (void)stopAndDestroy {
[[[LinphoneManager instance] fileTransferDelegates] removeObject:self];
if (_message != NULL) {
- LOGI(@"%p Cancelling transfer from %p", self, _message);
- linphone_chat_message_cbs_set_file_transfer_send(linphone_chat_message_get_callbacks(_message), NULL);
- linphone_chat_message_cbs_set_file_transfer_recv(linphone_chat_message_get_callbacks(_message), NULL);
- linphone_chat_message_cancel_file_transfer(_message);
- linphone_chat_message_unref(_message);
+ LinphoneChatMessage *msg = _message;
+ _message = NULL;
+ LOGI(@"%p Cancelling transfer from %p", self, msg);
+ linphone_chat_message_cbs_set_file_transfer_send(linphone_chat_message_get_callbacks(msg), NULL);
+ linphone_chat_message_cbs_set_file_transfer_recv(linphone_chat_message_get_callbacks(msg), NULL);
+ // when we cancel file transfer, this will automatically trigger NotDelivered callback... recalling ourself a
+ // second time
+ // so we have to unset message BEFORE calling this
+ linphone_chat_message_cancel_file_transfer(msg);
+ linphone_chat_message_unref(msg);
}
- _message = nil;
_data = nil;
LOGI(@"%p Destroying", self);
}
diff --git a/Classes/Utils/Utils.m b/Classes/Utils/Utils.m
index 6a8a62156..46e962d5b 100644
--- a/Classes/Utils/Utils.m
+++ b/Classes/Utils/Utils.m
@@ -23,11 +23,9 @@
@implementation LinphoneLogger
-+ (void)logv:(OrtpLogLevel)severity
- file:(const char *)file
- line:(int)line
- format:(NSString *)format
- args:(va_list)args {
++ (void)log:(OrtpLogLevel)severity file:(const char *)file line:(int)line format:(NSString *)format, ... {
+ va_list args;
+ va_start(args, format);
NSString *str = [[NSString alloc] initWithFormat:format arguments:args];
int filesize = 20;
if (severity <= ORTP_DEBUG) {
@@ -38,12 +36,6 @@
ortp_log(severity, "%*s:%3d - %s", filesize, file + MAX((int)strlen(file) - filesize, 0), line,
[str UTF8String]);
}
-}
-
-+ (void)log:(OrtpLogLevel)severity file:(const char *)file line:(int)line format:(NSString *)format, ... {
- va_list args;
- va_start(args, format);
- [LinphoneLogger logv:severity file:file line:line format:format args:args];
va_end(args);
}
diff --git a/Classes/WizardViewController.m b/Classes/WizardViewController.m
index 36c02719d..1a62c2d6f 100644
--- a/Classes/WizardViewController.m
+++ b/Classes/WizardViewController.m
@@ -198,7 +198,7 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (void)reset {
- [self clearProxyConfig];
+ [[LinphoneManager instance] removeAllAccounts];
[[LinphoneManager instance] lpConfigSetBool:FALSE forKey:@"pushnotification_preference"];
LinphoneCore *lc = [LinphoneManager getLc];
@@ -320,17 +320,6 @@ static UICompositeViewDescription *compositeDescription = nil;
[_contentView setContentSize:[view bounds].size];
}
-- (void)clearProxyConfig {
- linphone_core_clear_proxy_config([LinphoneManager getLc]);
- linphone_core_clear_all_auth_info([LinphoneManager getLc]);
-}
-
-- (void)setDefaultSettings:(LinphoneProxyConfig *)proxyCfg {
- LinphoneManager *lm = [LinphoneManager instance];
-
- [lm configurePushTokenForProxyConfig:proxyCfg];
-}
-
- (BOOL)addProxyConfig:(NSString *)username
password:(NSString *)password
domain:(NSString *)domain
@@ -388,9 +377,9 @@ static UICompositeViewDescription *compositeDescription = nil;
LinphoneAuthInfo *info = linphone_auth_info_new([username UTF8String], NULL, [password UTF8String], NULL, NULL,
linphone_proxy_config_get_domain(proxyCfg));
- [self setDefaultSettings:proxyCfg];
-
- [self clearProxyConfig];
+ LinphoneManager *lm = [LinphoneManager instance];
+ [lm configurePushTokenForProxyConfig:proxyCfg];
+ [lm removeAllAccounts];
linphone_proxy_config_enable_register(proxyCfg, true);
linphone_core_add_auth_info(lc, info);
@@ -402,8 +391,7 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (void)addProvisionedProxy:(NSString *)username withPassword:(NSString *)password withDomain:(NSString *)domain {
- [self clearProxyConfig];
-
+ [[LinphoneManager instance] removeAllAccounts];
LinphoneProxyConfig *proxyCfg = linphone_core_create_proxy_config([LinphoneManager getLc]);
const char *addr = linphone_proxy_config_get_domain(proxyCfg);
@@ -505,6 +493,9 @@ static UICompositeViewDescription *compositeDescription = nil;
}
case LinphoneRegistrationFailed: {
_waitView.hidden = true;
+ if ([message isEqualToString:@"Forbidden"]) {
+ message = NSLocalizedString(@"Incorrect username or password.", nil);
+ }
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Registration failure", nil)
message:message
delegate:nil
@@ -893,9 +884,8 @@ static UICompositeViewDescription *compositeDescription = nil;
otherButtonTitles:nil, nil];
[errorView show];
} else if ([response object] != nil) { // Don't handle if not object: HTTP/Communication Error
- NSString *value = [response object];
if ([[request method] isEqualToString:@"check_account"]) {
- if ([value integerValue] == 1) {
+ if ([response.object isEqualToNumber:[NSNumber numberWithInt:1]]) {
UIAlertView *errorView =
[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Check issue", nil)
message:NSLocalizedString(@"Username already exists", nil)
@@ -911,7 +901,7 @@ static UICompositeViewDescription *compositeDescription = nil;
[self createAccount:identity password:password email:email];
}
} else if ([[request method] isEqualToString:@"create_account_with_useragent"]) {
- if ([value integerValue] == 0) {
+ if ([response.object isEqualToNumber:[NSNumber numberWithInt:0]]) {
NSString *username = [WizardViewController findTextField:ViewElement_Username view:_contentView].text;
NSString *password = [WizardViewController findTextField:ViewElement_Password view:_contentView].text;
[self changeView:_validateAccountView back:FALSE animation:TRUE];
@@ -927,7 +917,7 @@ static UICompositeViewDescription *compositeDescription = nil;
[errorView show];
}
} else if ([[request method] isEqualToString:@"check_account_validated"]) {
- if ([value integerValue] == 1) {
+ if ([response.object isEqualToNumber:[NSNumber numberWithInt:1]]) {
NSString *username = [WizardViewController findTextField:ViewElement_Username view:_contentView].text;
NSString *password = [WizardViewController findTextField:ViewElement_Password view:_contentView].text;
[self addProxyConfig:username password:password domain:nil withTransport:nil];
diff --git a/Classes/ar.lproj/AboutViewController.strings b/Classes/ar.lproj/AboutViewController.strings
index e87200985..ad954b45f 100644
Binary files a/Classes/ar.lproj/AboutViewController.strings and b/Classes/ar.lproj/AboutViewController.strings differ
diff --git a/Classes/ar.lproj/ChatRoomViewController.strings b/Classes/ar.lproj/ChatRoomViewController.strings
index c1bade640..7f67666e7 100644
Binary files a/Classes/ar.lproj/ChatRoomViewController.strings and b/Classes/ar.lproj/ChatRoomViewController.strings differ
diff --git a/Classes/ar.lproj/DialerViewController.strings b/Classes/ar.lproj/DialerViewController.strings
index dd8e8fb99..0d050fc7f 100644
Binary files a/Classes/ar.lproj/DialerViewController.strings and b/Classes/ar.lproj/DialerViewController.strings differ
diff --git a/Classes/ar.lproj/DialerViewController~ipad.strings b/Classes/ar.lproj/DialerViewController~ipad.strings
index 25b63bc28..aaf670cba 100644
Binary files a/Classes/ar.lproj/DialerViewController~ipad.strings and b/Classes/ar.lproj/DialerViewController~ipad.strings differ
diff --git a/Classes/ar.lproj/WizardViews.strings b/Classes/ar.lproj/WizardViews.strings
index db03ac124..497aa319d 100644
Binary files a/Classes/ar.lproj/WizardViews.strings and b/Classes/ar.lproj/WizardViews.strings differ
diff --git a/Classes/de.lproj/ChatRoomViewController.strings b/Classes/de.lproj/ChatRoomViewController.strings
index 3afa89d93..52f33c128 100644
Binary files a/Classes/de.lproj/ChatRoomViewController.strings and b/Classes/de.lproj/ChatRoomViewController.strings differ
diff --git a/Classes/de.lproj/DialerViewController.strings b/Classes/de.lproj/DialerViewController.strings
index bbc5e3bbd..4feccb95b 100644
Binary files a/Classes/de.lproj/DialerViewController.strings and b/Classes/de.lproj/DialerViewController.strings differ
diff --git a/Classes/de.lproj/DialerViewController~ipad.strings b/Classes/de.lproj/DialerViewController~ipad.strings
index 2802cfdb5..1455b6eb6 100644
Binary files a/Classes/de.lproj/DialerViewController~ipad.strings and b/Classes/de.lproj/DialerViewController~ipad.strings differ
diff --git a/Classes/de.lproj/WizardViews.strings b/Classes/de.lproj/WizardViews.strings
index 924c05771..135adbe94 100644
Binary files a/Classes/de.lproj/WizardViews.strings and b/Classes/de.lproj/WizardViews.strings differ
diff --git a/Classes/fr.lproj/ChatRoomViewController.strings b/Classes/fr.lproj/ChatRoomViewController.strings
index c57f80328..902e15653 100644
Binary files a/Classes/fr.lproj/ChatRoomViewController.strings and b/Classes/fr.lproj/ChatRoomViewController.strings differ
diff --git a/Classes/fr.lproj/DialerViewController.strings b/Classes/fr.lproj/DialerViewController.strings
index 0c09ead5a..fb4629fcb 100644
Binary files a/Classes/fr.lproj/DialerViewController.strings and b/Classes/fr.lproj/DialerViewController.strings differ
diff --git a/Classes/fr.lproj/DialerViewController~ipad.strings b/Classes/fr.lproj/DialerViewController~ipad.strings
index 9ed2b307c..87fdedcf5 100644
Binary files a/Classes/fr.lproj/DialerViewController~ipad.strings and b/Classes/fr.lproj/DialerViewController~ipad.strings differ
diff --git a/Classes/fr.lproj/WizardViews.strings b/Classes/fr.lproj/WizardViews.strings
index a848126ff..ae67dba8a 100644
Binary files a/Classes/fr.lproj/WizardViews.strings and b/Classes/fr.lproj/WizardViews.strings differ
diff --git a/Classes/ja.lproj/ChatRoomViewController.strings b/Classes/ja.lproj/ChatRoomViewController.strings
index fb8d77a85..0674cec33 100644
Binary files a/Classes/ja.lproj/ChatRoomViewController.strings and b/Classes/ja.lproj/ChatRoomViewController.strings differ
diff --git a/Classes/ja.lproj/DialerViewController.strings b/Classes/ja.lproj/DialerViewController.strings
index c838177f7..7e66f6fbc 100644
Binary files a/Classes/ja.lproj/DialerViewController.strings and b/Classes/ja.lproj/DialerViewController.strings differ
diff --git a/Classes/ja.lproj/DialerViewController~ipad.strings b/Classes/ja.lproj/DialerViewController~ipad.strings
index 95ad97363..878b45f09 100644
Binary files a/Classes/ja.lproj/DialerViewController~ipad.strings and b/Classes/ja.lproj/DialerViewController~ipad.strings differ
diff --git a/Classes/ja.lproj/WizardViews.strings b/Classes/ja.lproj/WizardViews.strings
index 7e1a68a70..75bbd975a 100644
Binary files a/Classes/ja.lproj/WizardViews.strings and b/Classes/ja.lproj/WizardViews.strings differ
diff --git a/Classes/nl.lproj/ChatRoomViewController.strings b/Classes/nl.lproj/ChatRoomViewController.strings
index d917cace1..72c87d738 100644
Binary files a/Classes/nl.lproj/ChatRoomViewController.strings and b/Classes/nl.lproj/ChatRoomViewController.strings differ
diff --git a/Classes/nl.lproj/DialerViewController.strings b/Classes/nl.lproj/DialerViewController.strings
index 9194b3ea3..119c0f1c0 100644
Binary files a/Classes/nl.lproj/DialerViewController.strings and b/Classes/nl.lproj/DialerViewController.strings differ
diff --git a/Classes/nl.lproj/DialerViewController~ipad.strings b/Classes/nl.lproj/DialerViewController~ipad.strings
index b4cb3d935..acb2bdc9c 100644
Binary files a/Classes/nl.lproj/DialerViewController~ipad.strings and b/Classes/nl.lproj/DialerViewController~ipad.strings differ
diff --git a/Classes/nl.lproj/WizardViews.strings b/Classes/nl.lproj/WizardViews.strings
index c33ea7838..a61cbcce9 100644
Binary files a/Classes/nl.lproj/WizardViews.strings and b/Classes/nl.lproj/WizardViews.strings differ
diff --git a/Classes/ru.lproj/ChatRoomViewController.strings b/Classes/ru.lproj/ChatRoomViewController.strings
index 880056bf0..00213048d 100644
Binary files a/Classes/ru.lproj/ChatRoomViewController.strings and b/Classes/ru.lproj/ChatRoomViewController.strings differ
diff --git a/Classes/ru.lproj/DialerViewController.strings b/Classes/ru.lproj/DialerViewController.strings
index 9eab509a0..805ac8272 100644
Binary files a/Classes/ru.lproj/DialerViewController.strings and b/Classes/ru.lproj/DialerViewController.strings differ
diff --git a/Classes/ru.lproj/DialerViewController~ipad.strings b/Classes/ru.lproj/DialerViewController~ipad.strings
index 5f7423174..ad8ebdf51 100644
Binary files a/Classes/ru.lproj/DialerViewController~ipad.strings and b/Classes/ru.lproj/DialerViewController~ipad.strings differ
diff --git a/Classes/ru.lproj/WizardViews.strings b/Classes/ru.lproj/WizardViews.strings
index 288c7f0a1..b03c240ea 100644
Binary files a/Classes/ru.lproj/WizardViews.strings and b/Classes/ru.lproj/WizardViews.strings differ
diff --git a/Classes/zh_TW.lproj/ChatRoomViewController.strings b/Classes/zh_TW.lproj/ChatRoomViewController.strings
index 081da5bb6..0daf7d801 100644
Binary files a/Classes/zh_TW.lproj/ChatRoomViewController.strings and b/Classes/zh_TW.lproj/ChatRoomViewController.strings differ
diff --git a/Classes/zh_TW.lproj/DialerViewController.strings b/Classes/zh_TW.lproj/DialerViewController.strings
index 1412c98fc..957c0c687 100644
Binary files a/Classes/zh_TW.lproj/DialerViewController.strings and b/Classes/zh_TW.lproj/DialerViewController.strings differ
diff --git a/Classes/zh_TW.lproj/DialerViewController~ipad.strings b/Classes/zh_TW.lproj/DialerViewController~ipad.strings
index 556597fc7..cc89bfe55 100644
Binary files a/Classes/zh_TW.lproj/DialerViewController~ipad.strings and b/Classes/zh_TW.lproj/DialerViewController~ipad.strings differ
diff --git a/Classes/zh_TW.lproj/WizardViews.strings b/Classes/zh_TW.lproj/WizardViews.strings
index 25d437836..a71b3edde 100644
Binary files a/Classes/zh_TW.lproj/WizardViews.strings and b/Classes/zh_TW.lproj/WizardViews.strings differ
diff --git a/LiblinphoneTester/MasterViewController.m b/LiblinphoneTester/MasterViewController.m
index ab5856a02..66ed6ad15 100644
--- a/LiblinphoneTester/MasterViewController.m
+++ b/LiblinphoneTester/MasterViewController.m
@@ -41,7 +41,7 @@ NSString *const kLogsUpdateNotification = @"kLogsUpdateNotification";
lastLogs = [[NSMutableArray alloc] initWithCapacity:kLastLogsCapacity];
logsBuffer = [NSMutableArray arrayWithCapacity:kLogsBufferCapacity];
- linphone_core_set_log_level(ORTP_WARNING);
+ linphone_core_set_log_level(ORTP_MESSAGE);
linphone_core_set_log_handler((OrtpLogFunc)linphone_iphone_log_handler);
}
diff --git a/README.md b/README.md
index 3683a4d43..3dfdc0228 100644
--- a/README.md
+++ b/README.md
@@ -1,67 +1,104 @@
[](https://travis-ci.org/BelledonneCommunications/linphone-iphone)
-# BUILDING THE SDK
+Linphone is a free VoIP and video softphone based on the SIP protocol.
+
+
+
+# Getting started
+
+Here's how to launch Linphone for iPhone (more details below):
+
+1. Install [Xcode from AppStore](https://itunes.apple.com/us/app/Xcode/id497799835?mt=12#).
+2. Install [HomeBrew, a package manager for OS X](http://brew.sh) (MacPorts is supported but deprecated).
+3. Install Linphone dependencies: open iTerm.app in the current directory and list dependencies to install using:
+ `./prepare.py`
+4. Build SDK (see below for options and explanations):
+ `./prepare.py -c && ./prepare.py && make`
+5. Open linphone.xcodeproj in Xcode: `open linphone.xcodeproj`
+6. Press `⌘R` and voilà!
+
+# Building the SDK
Linphone for iPhone depends on liblinphone SDK. This SDK is generated from makefiles and shell scripts.
-* GPL third parties versus non GPL third parties
+ To generate the liblinphone multi-arch SDK in GPL mode, simply invoke:
- This SDK can be generated in 2 flavors. First is with GPL third parties, it means liblinphone includes GPL third parties like FFMPEG or X264.
- If you choose this flavor, your final application must comply with GPL in any case. This is the default mode.
+ ./prepare.py [options] && make
- Note: We are not compiling for the 32 bits i386 simulator by default because since iPhone 6 / iOS 8 simulators run in 64 bits. If you want to activate it, you should call prepare.py "i386" architecture.
+**The resulting SDK is located in `liblinphone-sdk/` root directory.**
- To generate the liblinphone multi arch SDK in GPL mode, do:
+## Licensing: GPL third parties versus non GPL third parties
- ./prepare.py && make
+This SDK can be generated in 2 flavors:
- ALTERNATIVELY, you can force liblinphone to use only non GPL code except for liblinphone, mediastreamer2, oRTP, belle-sip.
- If you choose this flavor, your final application is still subject to GPL except if you have a commercial license for liblinphone, mediastreamer2, oRTP, belle-sip.
+* GPL third parties enabled means that liblinphone includes GPL third parties like FFmpeg or X264. If you choose this flavor, your final application **must comply with GPL in any case**. This is the default mode.
- To generate the liblinphone multi arch SDK in non GPL mode, do:
+* NO GPL third parties means that Linphone will only use non GPL code except for `liblinphone`, `mediastreamer2`, `oRTP` and `belle-sip`. If you choose this flavor, your final application is **still subject to GPL except if you have a [commercial license for the mentioned libraries](http://www.belledonne-communications.com/products.html)**.
+ To generate the liblinphone multi arch SDK without GPL third parties, invoke:
- ./prepare.py -DENABLE_GPL_THIRD_PARTIES=NO && make
+ ./prepare.py --disable-gpl-third-parties=no [other options] && make
-* In case you upgrade your IOS SDK, you may force rebuilding everything, by doing
+## Customizing features
- ./prepare.py -c && ./prepare.py && make
+You can enable all non-free codecs using `--enable-non-free-codecs`.
+You can also choose to enable/disable features one by one (custom audio/video codecs, media encryption, etc.). To get a list of all features, the simplest way is to invoke `prepare.py` with `--list-features`:
-**The resulting sdk is in `liblinphone-sdk/` root directory.**
+ ./prepare.py --list-features
-# BUILDING THE APPLICATION
+You can for instance enable X264 by using:
+
+ ./prepare.py -DENABLE_X264=ON [other options]
+
+## Built architectures
+
+4 architectures currently exists on iOS:
+
+- 64 bits ARM64 for iPhone 5s, iPad Air, iPad mini 2, iPhone 6, iPhone 6 Plus, iPad Air 2, iPad mini 3.
+- 32 bits ARMv7 for older devices.
+- 64 bits x86_64 for simulator for all ARM64 devices.
+- 32 bits i386 for simulator for all ARMv7 older devices.
+
+ Note: We are not compiling for the 32 bits i386 simulator by default because Xcode default device (iPhone 6) runs in 64 bits. If you want to enable it, you should invoke `prepare.py` with `i386` argument: `./prepare.py i386 [other options]`.
+
+## Upgrading your iOS SDK
+
+Simply re-invoking `make` should update your SDK. If compilation fails, you may need to rebuilding everything by invoking:
+
+ ./prepare.py -c && ./prepare.py [options] && make
+
+# Building the application
After the SDK is built, just open the Linphone Xcode project with Xcode, and press `Run`.
-* Note regarding third party components subject to license:
+## Note regarding third party components subject to license
- The liblinphone-sdk is compiled with third parties code that are subject to patent license, specially: AMR, SILK G729 and H264 codecs.
- Linphone controls the embedding of these codecs thanks to the preprocessor macros HAVE_SILK, HAVE_AMR, HAVE_G729 HAVE_OPENH264 positioned in Xcode project.
- Before embedding these 4 codecs in the final application, make sure to have the right to do so.
+ The liblinphone SDK is compiled with third parties code that are subject to patent license, specially: AMR, SILK G729 and H264 codecs.
+ Linphone controls the embedding of these codecs by generating dummy libraries when there are not available. You can enable them using `prepare.py`
+ script (see `--enable-non-free-codecs` option). Before embedding these 4 codecs in the final application, **make sure to have the right to do so**.
-# TESTING THE APPLICATION
+# Testing the application
We are using the KIF framework to test the UI of Linphone. It is used as a submodule (instead of CocoaPods) for ease.
-Simply press `Command + U` and the default simulator / device will launch and try to pass all the tests.
+Simply press `⌘U` and the default simulator / device will launch and try to pass all the tests.
-# LIMITATIONS, KNOWN BUGS
+# Limitations and known bugs
-* Video capture does not work in simulator (not implemented by simulator?).
+* Video capture will not work in simulator (not implemented in it).
-# DEBUGING THE SDK
+# Debugging the SDK
-Sometime it can be useful to step into liblinphone SDK functions. To allow Xcode to enable breakpoint within liblinphone, SDK must be built with debug symbols.
-To add debug symbol to liblinphone SDK, use:
+Sometime it can be useful to step into liblinphone SDK functions. To allow Xcode to enable breakpoint within liblinphone, SDK must be built with debug symbols by using option `--debug`:
- ./prepare.py -d && make
+ ./prepare.py --debug [other options] && make
-# DEBUGING MEDIASTREAMER2
+## Debugging mediastreamer2
For iOS specific media development like audio video capture/playback it may be interesting to use `mediastream` test tool.
The project `submodule/liblinphone.xcodeproj` can be used for this purpose.
-# Quick UI reference for Linphone iOS:
+# Quick UI reference
- The app is contained in a window, which resides in the MainStoryboard file.
- The delegate is set to LinphoneAppDelegate in main.m, in the UIApplicationMain() by passing its class
@@ -86,7 +123,7 @@ MainStoryboard
#--> tabBar
-When the app is started, the phoneMainView gets asked to transition to the Dialer view or the Wizard view.
+When the application is started, the phoneMainView gets asked to transition to the Dialer view or the Wizard view.
PhoneMainView exposes the -changeCurrentView: method, which will setup its
Any Linphone view is actually presented in the UICompositeViewController, with or without a stateBar and tabBar.
diff --git a/Resources/ar.lproj/Localizable.strings b/Resources/ar.lproj/Localizable.strings
index 315cda811..c6362341a 100644
Binary files a/Resources/ar.lproj/Localizable.strings and b/Resources/ar.lproj/Localizable.strings differ
diff --git a/Resources/de.lproj/Localizable.strings b/Resources/de.lproj/Localizable.strings
index 872136b17..6bae1b237 100644
Binary files a/Resources/de.lproj/Localizable.strings and b/Resources/de.lproj/Localizable.strings differ
diff --git a/Resources/en.lproj/Localizable.strings b/Resources/en.lproj/Localizable.strings
index c9e1b2b28..b4d50ae97 100644
Binary files a/Resources/en.lproj/Localizable.strings and b/Resources/en.lproj/Localizable.strings differ
diff --git a/Resources/fr.lproj/Localizable.strings b/Resources/fr.lproj/Localizable.strings
index 80a3c5ce6..7396b4111 100644
Binary files a/Resources/fr.lproj/Localizable.strings and b/Resources/fr.lproj/Localizable.strings differ
diff --git a/Resources/ja.lproj/Localizable.strings b/Resources/ja.lproj/Localizable.strings
index 1f7d8c8ae..c6d2059c8 100644
Binary files a/Resources/ja.lproj/Localizable.strings and b/Resources/ja.lproj/Localizable.strings differ
diff --git a/Resources/nl.lproj/Localizable.strings b/Resources/nl.lproj/Localizable.strings
index 3aaf4fe79..e73fc007d 100644
Binary files a/Resources/nl.lproj/Localizable.strings and b/Resources/nl.lproj/Localizable.strings differ
diff --git a/Resources/ru.lproj/Localizable.strings b/Resources/ru.lproj/Localizable.strings
index 36ef11b63..dbe715f2f 100644
Binary files a/Resources/ru.lproj/Localizable.strings and b/Resources/ru.lproj/Localizable.strings differ
diff --git a/Resources/zh_TW.lproj/Localizable.strings b/Resources/zh_TW.lproj/Localizable.strings
index a4f1a9c09..6609b4448 100644
Binary files a/Resources/zh_TW.lproj/Localizable.strings and b/Resources/zh_TW.lproj/Localizable.strings differ
diff --git a/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings
index e507c833c..beda4ca62 100644
Binary files a/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings and b/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings differ
diff --git a/Settings/InAppSettings.bundle/ar.lproj/Audio.strings b/Settings/InAppSettings.bundle/ar.lproj/Audio.strings
index 5cb4f358d..e82411dff 100644
Binary files a/Settings/InAppSettings.bundle/ar.lproj/Audio.strings and b/Settings/InAppSettings.bundle/ar.lproj/Audio.strings differ
diff --git a/Settings/InAppSettings.bundle/ar.lproj/Call.strings b/Settings/InAppSettings.bundle/ar.lproj/Call.strings
index 38e1bd90d..554a66082 100644
Binary files a/Settings/InAppSettings.bundle/ar.lproj/Call.strings and b/Settings/InAppSettings.bundle/ar.lproj/Call.strings differ
diff --git a/Settings/InAppSettings.bundle/ar.lproj/Network.strings b/Settings/InAppSettings.bundle/ar.lproj/Network.strings
index f3f1b6dae..dee6be3f2 100644
Binary files a/Settings/InAppSettings.bundle/ar.lproj/Network.strings and b/Settings/InAppSettings.bundle/ar.lproj/Network.strings differ
diff --git a/Settings/InAppSettings.bundle/ar.lproj/Root.strings b/Settings/InAppSettings.bundle/ar.lproj/Root.strings
index e8f29b405..916a33cdc 100644
Binary files a/Settings/InAppSettings.bundle/ar.lproj/Root.strings and b/Settings/InAppSettings.bundle/ar.lproj/Root.strings differ
diff --git a/Settings/InAppSettings.bundle/ar.lproj/Video.strings b/Settings/InAppSettings.bundle/ar.lproj/Video.strings
index 19bfcdd39..f64008c00 100644
Binary files a/Settings/InAppSettings.bundle/ar.lproj/Video.strings and b/Settings/InAppSettings.bundle/ar.lproj/Video.strings differ
diff --git a/Settings/InAppSettings.bundle/de.lproj/Audio.strings b/Settings/InAppSettings.bundle/de.lproj/Audio.strings
index e9c2a5512..32b1fb205 100644
Binary files a/Settings/InAppSettings.bundle/de.lproj/Audio.strings and b/Settings/InAppSettings.bundle/de.lproj/Audio.strings differ
diff --git a/Settings/InAppSettings.bundle/de.lproj/Call.strings b/Settings/InAppSettings.bundle/de.lproj/Call.strings
index 8597ac972..d25fb7033 100644
Binary files a/Settings/InAppSettings.bundle/de.lproj/Call.strings and b/Settings/InAppSettings.bundle/de.lproj/Call.strings differ
diff --git a/Settings/InAppSettings.bundle/de.lproj/Network.strings b/Settings/InAppSettings.bundle/de.lproj/Network.strings
index 987d15c85..037fd04be 100644
Binary files a/Settings/InAppSettings.bundle/de.lproj/Network.strings and b/Settings/InAppSettings.bundle/de.lproj/Network.strings differ
diff --git a/Settings/InAppSettings.bundle/de.lproj/Root.strings b/Settings/InAppSettings.bundle/de.lproj/Root.strings
index 41d2a5e00..52a71eeda 100644
Binary files a/Settings/InAppSettings.bundle/de.lproj/Root.strings and b/Settings/InAppSettings.bundle/de.lproj/Root.strings differ
diff --git a/Settings/InAppSettings.bundle/de.lproj/Video.strings b/Settings/InAppSettings.bundle/de.lproj/Video.strings
index 3ff7eacd3..2eaf397ee 100644
Binary files a/Settings/InAppSettings.bundle/de.lproj/Video.strings and b/Settings/InAppSettings.bundle/de.lproj/Video.strings differ
diff --git a/Settings/InAppSettings.bundle/en.lproj/Audio.strings b/Settings/InAppSettings.bundle/en.lproj/Audio.strings
index 3bf01c791..f6d77bfc8 100644
--- a/Settings/InAppSettings.bundle/en.lproj/Audio.strings
+++ b/Settings/InAppSettings.bundle/en.lproj/Audio.strings
@@ -14,13 +14,12 @@
"G.729" = "G.729";
"GSM" = "GSM";
"iLBC" = "iLBC";
+"iSAC" = "iSAC";
"PCMU" = "PCMU";
"PCMA" = "PCMA";
"Advanced" = "Advanced";
"Playback gain" = "Playback gain";
"Microphone gain" = "Microphone gain";
-"Adaptive rate control" = "Adaptive rate control";
-"Adaptive rate algorithm" = "Adaptive rate algorithm";
"Codec bitrate limit" = "Codec bitrate limit";
"Enable Voice Processing" = "Enable Voice Processing";
"Enable Bass Boost" = "Enable Bass Boost";
diff --git a/Settings/InAppSettings.bundle/en.lproj/Call.strings b/Settings/InAppSettings.bundle/en.lproj/Call.strings
index 20d54ef56..6b175c9d3 100644
--- a/Settings/InAppSettings.bundle/en.lproj/Call.strings
+++ b/Settings/InAppSettings.bundle/en.lproj/Call.strings
@@ -5,3 +5,4 @@
"Incoming call timeout" = "Incoming call timeout";
"In call timeout" = "In call timeout";
"Voice mail URI" = "Voice mail URI";
+"Repeat call notification" = "Repeat call notification";
diff --git a/Settings/InAppSettings.bundle/en.lproj/Network.strings b/Settings/InAppSettings.bundle/en.lproj/Network.strings
index 603793659..c090abb46 100644
--- a/Settings/InAppSettings.bundle/en.lproj/Network.strings
+++ b/Settings/InAppSettings.bundle/en.lproj/Network.strings
@@ -10,5 +10,6 @@
"Media Encryption" = "Media Encryption";
"Push Notification" = "Push Notification";
"Limits" = "Limits";
-"Upload bandwidth" = "Upload bandwidth";
-"Download bandwidth" = "Download bandwidth";
+"Adaptive rate control" = "Adaptive rate control";
+"Adaptive rate control" = "Adaptive rate control";
+"Adaptive rate algorithm" = "Adaptive rate algorithm";
diff --git a/Settings/InAppSettings.bundle/en.lproj/Root.strings b/Settings/InAppSettings.bundle/en.lproj/Root.strings
index a4f199b92..b570484c6 100644
--- a/Settings/InAppSettings.bundle/en.lproj/Root.strings
+++ b/Settings/InAppSettings.bundle/en.lproj/Root.strings
@@ -18,10 +18,9 @@
"Network" = "Network";
"Tunnel" = "Tunnel";
"Advanced" = "Advanced";
-"Extra features" = "Extra features";
"Development debug actions" = "Development debug actions";
"About" = "About";
"Quit" = "Quit";
-"Exit" = "Exit";
+"Release core" = "Release core";
"Clear cache" = "Clear cache";
"Battery alert" = "Battery alert";
diff --git a/Settings/InAppSettings.bundle/en.lproj/Video.strings b/Settings/InAppSettings.bundle/en.lproj/Video.strings
index 598678c4c..c30eed42b 100644
--- a/Settings/InAppSettings.bundle/en.lproj/Video.strings
+++ b/Settings/InAppSettings.bundle/en.lproj/Video.strings
@@ -2,7 +2,10 @@
"Automatically accept" = "Automatically accept";
"Show self view" = "Show self view";
"Show preview" = "Show preview";
+"Video preset" = "Video preset";
"Preferred video size" = "Preferred video size";
+"Preferred FPS" = "Preferred FPS";
+"Bandwidth limit in kbits/s" = "Bandwidth limit in kbits/s";
"Codecs" = "Codecs";
"MPEG-4" = "MPEG-4";
"H.264" = "H.264";
diff --git a/Settings/InAppSettings.bundle/fr.lproj/Audio.strings b/Settings/InAppSettings.bundle/fr.lproj/Audio.strings
index 9bb1b7819..e124e98a6 100644
Binary files a/Settings/InAppSettings.bundle/fr.lproj/Audio.strings and b/Settings/InAppSettings.bundle/fr.lproj/Audio.strings differ
diff --git a/Settings/InAppSettings.bundle/fr.lproj/Call.strings b/Settings/InAppSettings.bundle/fr.lproj/Call.strings
index 2ca653c3c..e95196b88 100644
Binary files a/Settings/InAppSettings.bundle/fr.lproj/Call.strings and b/Settings/InAppSettings.bundle/fr.lproj/Call.strings differ
diff --git a/Settings/InAppSettings.bundle/fr.lproj/Network.strings b/Settings/InAppSettings.bundle/fr.lproj/Network.strings
index 6b78bf767..014bf5b59 100644
Binary files a/Settings/InAppSettings.bundle/fr.lproj/Network.strings and b/Settings/InAppSettings.bundle/fr.lproj/Network.strings differ
diff --git a/Settings/InAppSettings.bundle/fr.lproj/Root.strings b/Settings/InAppSettings.bundle/fr.lproj/Root.strings
index 8ca735725..9140a72eb 100644
Binary files a/Settings/InAppSettings.bundle/fr.lproj/Root.strings and b/Settings/InAppSettings.bundle/fr.lproj/Root.strings differ
diff --git a/Settings/InAppSettings.bundle/fr.lproj/Video.strings b/Settings/InAppSettings.bundle/fr.lproj/Video.strings
index d7b6da9ab..a530a1e8d 100644
Binary files a/Settings/InAppSettings.bundle/fr.lproj/Video.strings and b/Settings/InAppSettings.bundle/fr.lproj/Video.strings differ
diff --git a/Settings/InAppSettings.bundle/ja.lproj/Audio.strings b/Settings/InAppSettings.bundle/ja.lproj/Audio.strings
index 8dc312533..2c781dc34 100644
Binary files a/Settings/InAppSettings.bundle/ja.lproj/Audio.strings and b/Settings/InAppSettings.bundle/ja.lproj/Audio.strings differ
diff --git a/Settings/InAppSettings.bundle/ja.lproj/Network.strings b/Settings/InAppSettings.bundle/ja.lproj/Network.strings
index cb18d9969..bf538146c 100644
Binary files a/Settings/InAppSettings.bundle/ja.lproj/Network.strings and b/Settings/InAppSettings.bundle/ja.lproj/Network.strings differ
diff --git a/Settings/InAppSettings.bundle/ja.lproj/Root.strings b/Settings/InAppSettings.bundle/ja.lproj/Root.strings
index 08ed64e65..44960cb5d 100644
Binary files a/Settings/InAppSettings.bundle/ja.lproj/Root.strings and b/Settings/InAppSettings.bundle/ja.lproj/Root.strings differ
diff --git a/Settings/InAppSettings.bundle/ja.lproj/Video.strings b/Settings/InAppSettings.bundle/ja.lproj/Video.strings
index bb336f09c..fa870bafc 100644
Binary files a/Settings/InAppSettings.bundle/ja.lproj/Video.strings and b/Settings/InAppSettings.bundle/ja.lproj/Video.strings differ
diff --git a/Settings/InAppSettings.bundle/nl.lproj/Audio.strings b/Settings/InAppSettings.bundle/nl.lproj/Audio.strings
index 8dc312533..2c781dc34 100644
Binary files a/Settings/InAppSettings.bundle/nl.lproj/Audio.strings and b/Settings/InAppSettings.bundle/nl.lproj/Audio.strings differ
diff --git a/Settings/InAppSettings.bundle/nl.lproj/Call.strings b/Settings/InAppSettings.bundle/nl.lproj/Call.strings
index 779209858..095fbb9d9 100644
Binary files a/Settings/InAppSettings.bundle/nl.lproj/Call.strings and b/Settings/InAppSettings.bundle/nl.lproj/Call.strings differ
diff --git a/Settings/InAppSettings.bundle/nl.lproj/Network.strings b/Settings/InAppSettings.bundle/nl.lproj/Network.strings
index cb18d9969..bf538146c 100644
Binary files a/Settings/InAppSettings.bundle/nl.lproj/Network.strings and b/Settings/InAppSettings.bundle/nl.lproj/Network.strings differ
diff --git a/Settings/InAppSettings.bundle/nl.lproj/Root.strings b/Settings/InAppSettings.bundle/nl.lproj/Root.strings
index a2f24cb67..2868adeda 100644
Binary files a/Settings/InAppSettings.bundle/nl.lproj/Root.strings and b/Settings/InAppSettings.bundle/nl.lproj/Root.strings differ
diff --git a/Settings/InAppSettings.bundle/nl.lproj/Video.strings b/Settings/InAppSettings.bundle/nl.lproj/Video.strings
index bb336f09c..fa870bafc 100644
Binary files a/Settings/InAppSettings.bundle/nl.lproj/Video.strings and b/Settings/InAppSettings.bundle/nl.lproj/Video.strings differ
diff --git a/Settings/InAppSettings.bundle/ru.lproj/Audio.strings b/Settings/InAppSettings.bundle/ru.lproj/Audio.strings
index cbe619ed6..28476bf72 100644
Binary files a/Settings/InAppSettings.bundle/ru.lproj/Audio.strings and b/Settings/InAppSettings.bundle/ru.lproj/Audio.strings differ
diff --git a/Settings/InAppSettings.bundle/ru.lproj/Call.strings b/Settings/InAppSettings.bundle/ru.lproj/Call.strings
index 48bffaded..2ae0d1fea 100644
Binary files a/Settings/InAppSettings.bundle/ru.lproj/Call.strings and b/Settings/InAppSettings.bundle/ru.lproj/Call.strings differ
diff --git a/Settings/InAppSettings.bundle/ru.lproj/Network.strings b/Settings/InAppSettings.bundle/ru.lproj/Network.strings
index 1139751c8..e0e20f8cf 100644
Binary files a/Settings/InAppSettings.bundle/ru.lproj/Network.strings and b/Settings/InAppSettings.bundle/ru.lproj/Network.strings differ
diff --git a/Settings/InAppSettings.bundle/ru.lproj/Root.strings b/Settings/InAppSettings.bundle/ru.lproj/Root.strings
index 81e404f9c..e39421e08 100644
Binary files a/Settings/InAppSettings.bundle/ru.lproj/Root.strings and b/Settings/InAppSettings.bundle/ru.lproj/Root.strings differ
diff --git a/Settings/InAppSettings.bundle/ru.lproj/Video.strings b/Settings/InAppSettings.bundle/ru.lproj/Video.strings
index 645f88014..7c377bb18 100644
Binary files a/Settings/InAppSettings.bundle/ru.lproj/Video.strings and b/Settings/InAppSettings.bundle/ru.lproj/Video.strings differ
diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Audio.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Audio.strings
index 8dc312533..2c781dc34 100644
Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Audio.strings and b/Settings/InAppSettings.bundle/zh_TW.lproj/Audio.strings differ
diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Network.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Network.strings
index cb18d9969..bf538146c 100644
Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Network.strings and b/Settings/InAppSettings.bundle/zh_TW.lproj/Network.strings differ
diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Root.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Root.strings
index 602fdf1a3..bc45f1ab9 100644
Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Root.strings and b/Settings/InAppSettings.bundle/zh_TW.lproj/Root.strings differ
diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Video.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Video.strings
index bb336f09c..fa870bafc 100644
Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Video.strings and b/Settings/InAppSettings.bundle/zh_TW.lproj/Video.strings differ
diff --git a/TestsUI/CallTester.h b/TestsUI/CallTester.h
new file mode 100644
index 000000000..9f89b98e3
--- /dev/null
+++ b/TestsUI/CallTester.h
@@ -0,0 +1,13 @@
+//
+// CallTester.h
+// linphone
+//
+// Created by Gautier Pelloux-Prayer on 24/08/15.
+//
+//
+
+#import "LinphoneTestCase.h"
+
+@interface CallTester : LinphoneTestCase
+
+@end
diff --git a/TestsUI/CallTester.m b/TestsUI/CallTester.m
new file mode 100644
index 000000000..b51398e24
--- /dev/null
+++ b/TestsUI/CallTester.m
@@ -0,0 +1,62 @@
+//
+// CallTester.m
+// linphone
+//
+// Created by Gautier Pelloux-Prayer on 24/08/15.
+//
+//
+
+#import "CallTester.h"
+#include "LinphoneManager.h"
+
+@implementation CallTester
+
+- (void)beforeAll {
+ [super beforeAll];
+ [self switchToValidAccountIfNeeded];
+}
+
+- (void)beforeEach {
+ [super beforeEach];
+ if ([tester tryFindingTappableViewWithAccessibilityLabel:@"Back" error:nil]) {
+ [tester tapViewWithAccessibilityLabel:@"Back"];
+ }
+ [tester tapViewWithAccessibilityLabel:@"Dialer"];
+}
+
+- (void)afterEach {
+ if ([tester tryFindingTappableViewWithAccessibilityLabel:@"Hangup" error:nil]) {
+ [tester tapViewWithAccessibilityLabel:@"Hangup"];
+ }
+ [super afterEach];
+}
+#pragma mark - Tools
+
+- (void)callURI:(NSString *)address {
+ [tester enterText:address intoViewWithAccessibilityLabel:@"Enter an address"];
+ [tester tapViewWithAccessibilityLabel:@"Call" traits:UIAccessibilityTraitButton];
+}
+
+#pragma mark - Tests
+
+- (void)testCallMeBusy {
+ [self callURI:[self me]];
+ [tester waitForViewWithAccessibilityLabel:[NSString stringWithFormat:@"%@ is busy.", [self me]]];
+ [tester tapViewWithAccessibilityLabel:@"Cancel" traits:UIAccessibilityTraitButton];
+}
+
+- (void)testCallUnregisteredUser {
+ NSString *unregisteredUser = [self getUUID];
+ [self callURI:unregisteredUser];
+ [tester waitForViewWithAccessibilityLabel:[NSString stringWithFormat:@"%@ is not registered.", unregisteredUser]];
+ [tester tapViewWithAccessibilityLabel:@"Cancel" traits:UIAccessibilityTraitButton];
+}
+
+- (void)testDialInvalidSIPURI {
+ [self callURI:@"123 😀"];
+ [tester waitForViewWithAccessibilityLabel:
+ @"Some invalid characters where found in the given SIP address. Please correct it."];
+ [tester tapViewWithAccessibilityLabel:@"Cancel" traits:UIAccessibilityTraitButton];
+}
+
+@end
diff --git a/TestsUI/ChatTester.m b/TestsUI/ChatTester.m
index 95a81c1cc..4c9bf5c1a 100644
--- a/TestsUI/ChatTester.m
+++ b/TestsUI/ChatTester.m
@@ -101,77 +101,11 @@
[tester waitForViewWithAccessibilityLabel:@"Download"];
[tester tapViewWithAccessibilityLabel:@"Download"];
[tester waitForTimeInterval:.5f]; // just wait a few secs to start download
- ASSERT_EQ([[[LinphoneManager instance] fileTransferDelegates] count], 1);
+ ASSERT_EQ(LinphoneManager.instance.fileTransferDelegates.count, 1);
}
#pragma mark - tests
-- (void)test3DownloadsSimultanously {
- [self startChatWith:[self me]];
- [self uploadImageWithQuality:@"Maximum"];
- [self uploadImageWithQuality:@"Average"];
- [self uploadImageWithQuality:@"Minimum"];
- UITableView *tv = [self findTableView:@"Chat list"];
- // wait for ALL uploads to terminate...
- for (int i = 0; i < 45; i++) {
- [tester waitForTimeInterval:1.f];
- if ([tv numberOfRowsInSection:0] == 6)
- break;
- }
- [tester waitForTimeInterval:.5f];
- ASSERT_EQ([[LinphoneManager instance] fileTransferDelegates].count, 0);
- [tester scrollViewWithAccessibilityIdentifier:@"Chat list" byFractionOfSizeHorizontal:0.f vertical:1.f];
- for (int i = 0; i < 3; i++) {
- // messages order is not known: if upload bitrate is huge, first image can be uploaded before last started
- while (![tester tryFindingTappableViewWithAccessibilityLabel:@"Download" error:nil]) {
- [tester scrollViewWithAccessibilityIdentifier:@"Chat list" byFractionOfSizeHorizontal:0.f vertical:-.1f];
- }
- [tester waitForViewWithAccessibilityLabel:@"Download"];
- [tester tapViewWithAccessibilityLabel:@"Download"];
- [tester waitForTimeInterval:.2f]; // just wait a few secs to start download
- }
- while ([LinphoneManager instance].fileTransferDelegates.count > 0) {
- [tester waitForTimeInterval:.5];
- }
- [self goBackFromChat];
-}
-
-- (void)test3UploadsSimultanously {
- [self startChatWith:[self me]];
- // use Maximum quality to be sure that first transfer is not terminated when the third begins
- [self uploadImageWithQuality:@"Maximum"];
- [self uploadImageWithQuality:@"Average"];
- [self uploadImageWithQuality:@"Minimum"];
- UITableView *tv = [self findTableView:@"Chat list"];
- // wait for ALL uploads to terminate...
- for (int i = 0; i < 45; i++) {
- [tester waitForTimeInterval:1.f];
- if ([tv numberOfRowsInSection:0] == 6)
- break;
- }
- [tester waitForTimeInterval:.5f];
- ASSERT_EQ([[LinphoneManager instance] fileTransferDelegates].count, 0);
- ASSERT_EQ([tv numberOfRowsInSection:0], 6);
- [self goBackFromChat];
-}
-
-- (void)testCancelDownloadImage {
- [self downloadImage];
- [tester tapViewWithAccessibilityLabel:@"Cancel transfer"];
- ASSERT_EQ([[[LinphoneManager instance] fileTransferDelegates] count], 0);
-}
-
-- (void)testCancelUploadImage {
- [self startChatWith:[self me]];
- [self uploadImageWithQuality:@"Minimum"];
- [tester tapViewWithAccessibilityLabel:@"Cancel transfer"];
- if ([[[LinphoneManager instance] fileTransferDelegates] count] != 0) {
- [[UIApplication sharedApplication] writeScreenshotForLine:__LINE__ inFile:@__FILE__ description:nil error:NULL];
- ;
- }
- ASSERT_EQ([[[LinphoneManager instance] fileTransferDelegates] count], 0);
-}
-
- (void)testChatFromContactPhoneNumber {
[tester tapViewWithAccessibilityLabel:@"New Discussion"];
[tester tapViewWithAccessibilityLabel:@"Anna Haro"];
@@ -184,10 +118,12 @@
traits:UIAccessibilityTraitStaticText];
}
-- (void)testDownloadImage {
- [self downloadImage];
- [tester waitForAbsenceOfViewWithAccessibilityLabel:@"Cancel transfer"];
- ASSERT_EQ([[[LinphoneManager instance] fileTransferDelegates] count], 0);
+- (void)testInvalidSIPAddress {
+
+ [self startChatWith:@"sip://toto"];
+
+ [tester waitForViewWithAccessibilityLabel:@"Invalid address" traits:UIAccessibilityTraitStaticText];
+ [tester tapViewWithAccessibilityLabel:@"Cancel"];
}
- (void)testMessageRemoval {
@@ -218,12 +154,47 @@
[self goBackFromChat];
}
-- (void)testInvalidSIPAddress {
+- (void)testPerformanceHugeChatList {
+ [tester tapViewWithAccessibilityLabel:@"Dialer"];
- [self startChatWith:@"sip://toto"];
+ // create lots of chat rooms...
+ LinphoneCore *lc = [LinphoneManager getLc];
+ for (int i = 0; i < 100; i++) {
+ LinphoneChatRoom *room =
+ linphone_core_get_chat_room_from_uri(lc, [[NSString stringWithFormat:@"%@ - %d", [self me], i] UTF8String]);
+ linphone_chat_room_send_message(room, "Hello");
+ }
- [tester waitForViewWithAccessibilityLabel:@"Invalid address" traits:UIAccessibilityTraitStaticText];
- [tester tapViewWithAccessibilityLabel:@"Cancel"];
+ [tester waitForTimeInterval:5]; // wait for all messages to be delivered
+
+ NSTimeInterval before = [[NSDate date] timeIntervalSince1970];
+ [tester tapViewWithAccessibilityLabel:@"Chat"];
+ NSTimeInterval after = [[NSDate date] timeIntervalSince1970];
+
+ // conversation loading MUST be less than 1 sec
+ XCTAssertLessThan(after - before, 1.);
+}
+
+- (void)testPerformanceHugeConversation {
+ int count = 0;
+ LinphoneCore *lc = [LinphoneManager getLc];
+ LinphoneChatRoom *room = linphone_core_get_chat_room_from_uri(lc, [[self me] UTF8String]);
+ // generate lots of messages...
+ for (; count < 100; count++) {
+ linphone_chat_room_send_message(room, [[NSString stringWithFormat:@"Message %d", count + 1] UTF8String]);
+ }
+ [tester waitForTimeInterval:5]; // wait for all messages to be delivered
+ // TODO: FIX below code: unread count is not always 100 messages while it should...
+ [tester waitForViewWithAccessibilityLabel:@"Contact name, Message, Unread message number"
+ value:[NSString stringWithFormat:@"%@ - Message %d (%d)", self.me, count, count]
+ traits:UIAccessibilityTraitStaticText];
+
+ NSTimeInterval before = [[NSDate date] timeIntervalSince1970];
+ [self startChatWith:[self me]];
+ NSTimeInterval after = [[NSDate date] timeIntervalSince1970];
+
+ // conversation loading MUST be less than 1 sec - opening an empty conversation is around 2.15 sec
+ XCTAssertLessThan(after - before, 2.15 + 1.);
}
- (void)testRemoveAllChats {
@@ -278,7 +249,75 @@
[self goBackFromChat];
}
-- (void)testUploadImage {
+- (void)testTransfer3DownloadsSimultanously {
+ [self startChatWith:[self me]];
+ [self uploadImageWithQuality:@"Maximum"];
+ [self uploadImageWithQuality:@"Average"];
+ [self uploadImageWithQuality:@"Minimum"];
+ UITableView *tv = [self findTableView:@"Chat list"];
+ // wait for ALL uploads to terminate...
+ for (int i = 0; i < 45; i++) {
+ [tester waitForTimeInterval:1.f];
+ if ([tv numberOfRowsInSection:0] == 6)
+ break;
+ }
+ [tester waitForTimeInterval:.5f];
+ ASSERT_EQ([[LinphoneManager instance] fileTransferDelegates].count, 0);
+ [tester scrollViewWithAccessibilityIdentifier:@"Chat list" byFractionOfSizeHorizontal:0.f vertical:1.f];
+ for (int i = 0; i < 3; i++) {
+ // messages order is not known: if upload bitrate is huge, first image can be uploaded before last started
+ while (![tester tryFindingTappableViewWithAccessibilityLabel:@"Download" error:nil]) {
+ [tester scrollViewWithAccessibilityIdentifier:@"Chat list" byFractionOfSizeHorizontal:0.f vertical:-.1f];
+ }
+ [tester waitForViewWithAccessibilityLabel:@"Download"];
+ [tester tapViewWithAccessibilityLabel:@"Download"];
+ [tester waitForTimeInterval:.2f]; // just wait a few secs to start download
+ }
+ while ([LinphoneManager instance].fileTransferDelegates.count > 0) {
+ [tester waitForTimeInterval:.5];
+ }
+ [self goBackFromChat];
+}
+
+- (void)testTransfer3UploadsSimultanously {
+ [self startChatWith:[self me]];
+ // use Maximum quality to be sure that first transfer is not terminated when the third begins
+ [self uploadImageWithQuality:@"Maximum"];
+ [self uploadImageWithQuality:@"Average"];
+ [self uploadImageWithQuality:@"Minimum"];
+ UITableView *tv = [self findTableView:@"Chat list"];
+ // wait for ALL uploads to terminate...
+ for (int i = 0; i < 45; i++) {
+ [tester waitForTimeInterval:1.f];
+ if ([tv numberOfRowsInSection:0] == 6)
+ break;
+ }
+ [tester waitForTimeInterval:.5f];
+ ASSERT_EQ([[LinphoneManager instance] fileTransferDelegates].count, 0);
+ ASSERT_EQ([tv numberOfRowsInSection:0], 6);
+ [self goBackFromChat];
+}
+
+- (void)testTransferCancelDownloadImage {
+ [self downloadImage];
+ [tester tapViewWithAccessibilityLabel:@"Cancel transfer"];
+ ASSERT_EQ([[[LinphoneManager instance] fileTransferDelegates] count], 0);
+}
+
+- (void)testTransferCancelUploadImage {
+ [self startChatWith:[self me]];
+ [self uploadImageWithQuality:@"Minimum"];
+ [tester tapViewWithAccessibilityLabel:@"Cancel transfer"];
+ ASSERT_EQ([[[LinphoneManager instance] fileTransferDelegates] count], 0);
+}
+
+- (void)testTransferDownloadImage {
+ [self downloadImage];
+ [tester waitForAbsenceOfViewWithAccessibilityLabel:@"Cancel transfer"];
+ ASSERT_EQ([[[LinphoneManager instance] fileTransferDelegates] count], 0);
+}
+
+- (void)testTransferUploadImage {
[self startChatWith:[self me]];
ASSERT_EQ([[LinphoneManager instance] fileTransferDelegates].count, 0);
diff --git a/TestsUI/ContactsTester.m b/TestsUI/ContactsTester.m
index 2bbafee77..638fe66db 100644
--- a/TestsUI/ContactsTester.m
+++ b/TestsUI/ContactsTester.m
@@ -14,8 +14,11 @@
#pragma mark - Setup
-- (void)beforeAll {
- [super beforeAll];
+- (void)beforeEach {
+ [super beforeEach];
+ if ([tester tryFindingTappableViewWithAccessibilityLabel:@"Back" error:nil]) {
+ [tester tapViewWithAccessibilityLabel:@"Back"];
+ }
[tester tapViewWithAccessibilityLabel:@"Contacts"];
}
@@ -63,7 +66,6 @@
}
[tester tapViewWithAccessibilityLabel:@"Edit"];
- [tester tapViewWithAccessibilityLabel:@"Back"];
}
- (void)tapCellForRowAtIndexPath:(NSInteger)idx inSection:(NSInteger)section atX:(CGFloat)x {
@@ -117,15 +119,17 @@
- (void)testCallContactWithInvalidPhoneNumber {
NSString *contactName = [self getUUID];
- [self createContact:contactName lastName:@"dummy" phoneNumber:@"5 15 #0664;447*46" SIPAddress:nil];
- NSString *fullName = [contactName stringByAppendingString:@" dummy"];
- [tester tapViewWithAccessibilityLabel:fullName traits:UIAccessibilityTraitStaticText];
- [tester tapViewWithAccessibilityLabel:@"Chat"];
+ NSString *phone = @"+5 15 #0664;447*46";
+ [self createContact:contactName lastName:@"dummy" phoneNumber:phone SIPAddress:nil];
+ [tester tapViewWithAccessibilityLabel:[@"Linphone, " stringByAppendingString:phone]];
+ [tester waitForViewWithAccessibilityLabel:[phone stringByAppendingString:@" is not registered."]];
+ [tester tapViewWithAccessibilityLabel:@"Cancel"];
}
- (void)testDeleteContact {
NSString *contactName = [self getUUID];
[self createContact:contactName lastName:@"dummy" phoneNumber:@"0102030405" SIPAddress:[self me]];
+ [tester tapViewWithAccessibilityLabel:@"Back"];
NSString *fullName = [contactName stringByAppendingString:@" dummy"];
@@ -146,8 +150,6 @@
NSString *fullName = [contactName stringByAppendingString:@" dummy"];
[self createContact:contactName lastName:@"dummy" phoneNumber:nil SIPAddress:nil];
- [tester tapViewWithAccessibilityLabel:fullName traits:UIAccessibilityTraitStaticText];
-
/* Phone number */
NSArray *phones = @[ @"01234", @"56789" ];
[self addEntries:phones inSection:ContactSections_Number];
diff --git a/TestsUI/LinphoneTestCase.m b/TestsUI/LinphoneTestCase.m
index 2812779c9..aa3f2b2a1 100644
--- a/TestsUI/LinphoneTestCase.m
+++ b/TestsUI/LinphoneTestCase.m
@@ -23,7 +23,7 @@
if (!([language isEqualToString:@"en"] || [language containsString:@"en-"])) {
LOGF(@"Language must be 'en' (English) instead of %@", language);
}
- linphone_core_set_log_level(ORTP_WARNING);
+ linphone_core_set_log_level(ORTP_MESSAGE);
}
- (void)beforeAll {
@@ -34,7 +34,7 @@
};
#endif
// go to dialer
- for (NSString *button in @[ @"Cancel", @"Back", @"Dialer" ]) {
+ for (NSString *button in @[ @"Cancel", @"Back", @"Hangup", @"Dialer" ]) {
if ([tester tryFindingTappableViewWithAccessibilityLabel:button error:nil]) {
[tester tapViewWithAccessibilityLabel:button traits:UIAccessibilityTraitButton];
}
@@ -42,11 +42,12 @@
}
- (NSString *)me {
- return @"testios";
+ return [NSString
+ stringWithFormat:@"testios-%@", [[UIDevice currentDevice].identifierForVendor.UUIDString substringToIndex:6]];
}
- (NSString *)accountDomain {
- return @"sip.linphone.org";
+ return @"test.linphone.org";
}
- (NSString *)getUUID {
@@ -101,26 +102,48 @@ static bool invalidAccount = true;
[UIView setAnimationsEnabled:false];
if (invalidAccount && ![self hasValidProxyConfig]) {
+ LOGI(@"Switching to a test account...");
- [tester tapViewWithAccessibilityLabel:@"Settings"];
- [tester tapViewWithAccessibilityLabel:@"Run assistant"];
- [tester waitForTimeInterval:0.5];
- if ([tester tryFindingViewWithAccessibilityLabel:@"Launch Wizard" error:nil]) {
- [tester tapViewWithAccessibilityLabel:@"Launch Wizard"];
- [tester waitForTimeInterval:0.5];
- }
+ LinphoneCore *lc = [LinphoneManager getLc];
+ linphone_core_clear_proxy_config(lc);
+ linphone_core_clear_all_auth_info(lc);
- LOGI(@"Switching to a valid account");
+ LinphoneAddress *testAddr = linphone_address_new(
+ [[NSString stringWithFormat:@"sip:%@@%@", [self me], [self accountDomain]] UTF8String]);
+ linphone_address_set_header(testAddr, "X-Create-Account", "yes");
+ linphone_address_set_transport(testAddr, LinphoneTransportTcp);
+ linphone_address_set_port(testAddr, 0);
- [tester tapViewWithAccessibilityLabel:@"Start"];
- [tester tapViewWithAccessibilityLabel:@"Sign in linphone.org account"];
+ LinphoneProxyConfig *testProxy = linphone_proxy_config_new();
+ linphone_proxy_config_set_identity_address(testProxy, testAddr);
+ char *server_addr = ms_strdup_printf("%s;transport=tcp", linphone_address_get_domain(testAddr));
+ linphone_proxy_config_set_server_addr(testProxy, server_addr);
+ linphone_proxy_config_set_route(testProxy, server_addr);
+ ms_free(server_addr);
- [tester enterText:[self me] intoViewWithAccessibilityLabel:@"Username"];
- [tester enterText:@"testtest" intoViewWithAccessibilityLabel:@"Password"];
+ LinphoneAuthInfo *testAuth = linphone_auth_info_new(linphone_address_get_username(testAddr), NULL,
+ linphone_address_get_password(testAddr), NULL, NULL,
+ linphone_address_get_domain(testAddr));
- [tester tapViewWithAccessibilityLabel:@"Sign in"];
+ [[LinphoneManager instance] configurePushTokenForProxyConfig:testProxy];
+ [[LinphoneManager instance] removeAllAccounts];
+
+ linphone_proxy_config_enable_register(testProxy, true);
+ linphone_core_add_auth_info(lc, testAuth);
+ linphone_core_add_proxy_config(lc, testProxy);
+ linphone_core_set_default_proxy_config(lc, testProxy);
+
+ linphone_proxy_config_unref(testProxy);
+ linphone_auth_info_destroy(testAuth);
+ linphone_address_destroy(testAddr);
+
+ // reload address book to prepend proxy config domain to contacts' phone number
+ [[[LinphoneManager instance] fastAddressBook] reload];
+
+ [tester waitForViewWithAccessibilityLabel:@"Registration state"
+ value:@"Registered"
+ traits:UIAccessibilityTraitStaticText];
- [tester waitForViewWithAccessibilityLabel:@"Dialer"];
invalidAccount = false;
}
}
diff --git a/TestsUI/WizardTester.m b/TestsUI/WizardTester.m
index 03fe024a2..3e39986fc 100644
--- a/TestsUI/WizardTester.m
+++ b/TestsUI/WizardTester.m
@@ -100,24 +100,24 @@
}
- (void)testLinphoneLogin {
-
- [self _linphoneLogin:[self me] withPW:@"testtest"];
+ [self _linphoneLogin:@"testios" withPW:@"testtest"];
// check the registration state
- UIView *regState = [tester waitForViewWithAccessibilityLabel:@"Registration state"];
- [tester waitForTimeInterval:1];
- [tester expectView:regState toContainText:@"Registered"];
+ [tester waitForViewWithAccessibilityLabel:@"Registration state"
+ value:@"Registered"
+ traits:UIAccessibilityTraitStaticText];
}
- (void)testLinphoneLoginWithBadPassword {
- [self _linphoneLogin:[self me] withPW:@"badPass"];
+ [self _linphoneLogin:@"testios" withPW:@"badPass"];
[self setInvalidAccountSet:true];
UIView *alertViewText =
[tester waitForViewWithAccessibilityLabel:@"Registration failure" traits:UIAccessibilityTraitStaticText];
if (alertViewText) {
- UIView *reason = [tester waitForViewWithAccessibilityLabel:@"Forbidden" traits:UIAccessibilityTraitStaticText];
+ UIView *reason = [tester waitForViewWithAccessibilityLabel:@"Incorrect username or password."
+ traits:UIAccessibilityTraitStaticText];
if (reason == nil) {
[tester fail];
} else {
diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj
index 415c58e16..a1e5b98c9 100755
--- a/linphone.xcodeproj/project.pbxproj
+++ b/linphone.xcodeproj/project.pbxproj
@@ -7,51 +7,30 @@
objects = {
/* Begin PBXBuildFile section */
- 045B5CB318D72E9A0088350C /* libbzrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 045B5CB218D72E9A0088350C /* libbzrtp.a */; };
- 152F22341B15E83B008C0621 /* libilbcrfc3951.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 152F22331B15E83B008C0621 /* libilbcrfc3951.a */; };
152F22361B15E889008C0621 /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 152F22351B15E889008C0621 /* libxml2.dylib */; };
- 1560821F18EEF26100765332 /* libmsopenh264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1560821E18EEF26100765332 /* libmsopenh264.a */; };
15F728731B16FF8B00A1C901 /* libilbcrfc3951.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 152F22331B15E83B008C0621 /* libilbcrfc3951.a */; };
15F728741B16FF9A00A1C901 /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 152F22351B15E889008C0621 /* libxml2.dylib */; };
1D3623260D0F684500981E51 /* LinphoneAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* LinphoneAppDelegate.m */; };
1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
- 220FAD3210765B400068D98F /* libgsm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2910765B400068D98F /* libgsm.a */; };
- 220FAD3810765B400068D98F /* libspeex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2F10765B400068D98F /* libspeex.a */; };
- 220FAD3910765B400068D98F /* libspeexdsp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD3010765B400068D98F /* libspeexdsp.a */; };
2214EB7A12F846B1002A5394 /* UICallButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EB7912F846B1002A5394 /* UICallButton.m */; };
2214EB8912F84EBB002A5394 /* UIHangUpButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EB8812F84EBB002A5394 /* UIHangUpButton.m */; };
2214EBF312F86360002A5394 /* UIMicroButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EBF212F86360002A5394 /* UIMicroButton.m */; };
2218A92512FBE1340088A667 /* FirstLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2218A92312FBE1340088A667 /* FirstLoginViewController.m */; };
- 22276E8313C73D3100210156 /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8013C73D3100210156 /* libavcodec.a */; };
- 22276E8413C73D3100210156 /* libavutil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8113C73D3100210156 /* libavutil.a */; };
- 22276E8513C73D3100210156 /* libswscale.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8213C73D3100210156 /* libswscale.a */; };
22276E8713C73D8A00210156 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8613C73D8A00210156 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8813C73DC000210156 /* CoreMedia.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
- 223148E61178A09900637D6A /* libmsilbc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223148E51178A09900637D6A /* libmsilbc.a */; };
- 223CA7E616D9255800EF1BEC /* libantlr3c.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223CA7E416D9255800EF1BEC /* libantlr3c.a */; };
- 223CA7E716D9255800EF1BEC /* libbellesip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223CA7E516D9255800EF1BEC /* libbellesip.a */; };
22405EEE1600B4E400B92522 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22405EED1600B4E400B92522 /* AssetsLibrary.framework */; };
22405F001601C19200B92522 /* ImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22405EFE1601C19100B92522 /* ImageViewController.m */; };
224567C2107B968500F10948 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 224567C1107B968500F10948 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
2248E90E12F7E4CF00220D9C /* UIDigitButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */; };
- 22509042196BD902007863F6 /* libopenh264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22509041196BD902007863F6 /* libopenh264.a */; };
- 226183AE1472527D0037138E /* libsrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AB1472527D0037138E /* libsrtp.a */; };
- 226183B0147259670037138E /* libmssilk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AF147259670037138E /* libmssilk.a */; };
2264B6D211200342002C2C53 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2264B6D111200342002C2C53 /* SystemConfiguration.framework */; };
- 226CDAE014E2D0B800513B67 /* libmsbcg729.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226CDADE14E2D0B800513B67 /* libmsbcg729.a */; };
226EF06C15FA256B005865C7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 226EF06B15FA256B005865C7 /* MobileCoreServices.framework */; };
- 226F2ED61344B0EF00F6EF27 /* libopencore-amrwb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED31344B0EF00F6EF27 /* libopencore-amrwb.a */; };
- 226F2ED71344B0EF00F6EF27 /* libopencore-amrnb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED41344B0EF00F6EF27 /* libopencore-amrnb.a */; };
- 226F2ED81344B0EF00F6EF27 /* libmsamr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED51344B0EF00F6EF27 /* libmsamr.a */; };
2274401A106F31BD006EC466 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22744019106F31BD006EC466 /* CoreAudio.framework */; };
2274402F106F335E006EC466 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2274402E106F335E006EC466 /* AudioToolbox.framework */; };
228697C411AC29B800E9E0CA /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 228697C311AC29B800E9E0CA /* CFNetwork.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
22968A5F12F875C600588287 /* UISpeakerButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22968A5E12F875C600588287 /* UISpeakerButton.m */; };
- 22A10F3B11F8960300373793 /* libortp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2C10765B400068D98F /* libortp.a */; };
22AA8B0113D83F6300B30535 /* UICamSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 22AA8B0013D83F6300B30535 /* UICamSwitch.m */; };
- 22AF73C21754C0D100BE8398 /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AF73C11754C0D000BE8398 /* libopus.a */; };
22B5EFA310CE50BD00777D97 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */; };
22B5F03510CE6B2F00777D97 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22B5F03410CE6B2F00777D97 /* AddressBook.framework */; };
22C755601317E59C007BC101 /* UIBluetoothButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22C7555F1317E59C007BC101 /* UIBluetoothButton.m */; };
@@ -64,7 +43,6 @@
34216F401547EBCD00EA9777 /* VideoZoomHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 34216F3F1547EBCD00EA9777 /* VideoZoomHandler.m */; };
344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDEF14850AE9007420B6 /* libc++.1.dylib */; settings = {ATTRIBUTES = (Weak, ); }; };
344ABDF214850AE9007420B6 /* libstdc++.6.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDF014850AE9007420B6 /* libstdc++.6.dylib */; settings = {ATTRIBUTES = (Weak, ); }; };
- 57B0E360173C010400A476B8 /* libpolarssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 57B0E35F173C010400A476B8 /* libpolarssl.a */; };
630589E71B4E810900EFAE36 /* ChatTester.m in Sources */ = {isa = PBXBuildFile; fileRef = 630589DF1B4E810900EFAE36 /* ChatTester.m */; };
630589E81B4E810900EFAE36 /* ContactsTester.m in Sources */ = {isa = PBXBuildFile; fileRef = 630589E11B4E810900EFAE36 /* ContactsTester.m */; };
630589EA1B4E810900EFAE36 /* LinphoneTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 630589E41B4E810900EFAE36 /* LinphoneTestCase.m */; };
@@ -271,7 +249,6 @@
639CEB031A1DF4EB004DE38F /* UICompositeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB051A1DF4EB004DE38F /* UICompositeViewController.xib */; };
639CEB061A1DF4F1004DE38F /* UIChatRoomCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB081A1DF4F1004DE38F /* UIChatRoomCell.xib */; };
639CEB091A1DF4FA004DE38F /* UIChatCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB0B1A1DF4FA004DE38F /* UIChatCell.xib */; };
- 63A4280A1B26F576000DAB93 /* libSKP_SILK_SDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AA1472527D0037138E /* libSKP_SILK_SDK.a */; };
63AADBE81B6A0FF200AA16FD /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBC41B6A0FF200AA16FD /* Localizable.strings */; };
63AADBE91B6A0FF200AA16FD /* hold.wav in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBC91B6A0FF200AA16FD /* hold.wav */; };
63AADBEA1B6A0FF200AA16FD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBCA1B6A0FF200AA16FD /* Images.xcassets */; };
@@ -304,9 +281,40 @@
63B81A0F1B57DA33009604A6 /* TPKeyboardAvoidingTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A091B57DA33009604A6 /* TPKeyboardAvoidingTableView.m */; };
63B81A101B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A0B1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m */; };
63CD4B4F1A5AAC8C00B84282 /* DTAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63CD4B4E1A5AAC8C00B84282 /* DTAlertView.m */; };
+ 63CFEDE81B9EDD74007EA5BD /* libantlr3c.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223CA7E416D9255800EF1BEC /* libantlr3c.a */; };
+ 63CFEDE91B9EDD74007EA5BD /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8013C73D3100210156 /* libavcodec.a */; };
+ 63CFEDEA1B9EDD74007EA5BD /* libavutil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8113C73D3100210156 /* libavutil.a */; };
+ 63CFEDEB1B9EDD74007EA5BD /* libbcg729.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 63CFEDE41B9EDD36007EA5BD /* libbcg729.a */; };
+ 63CFEDEC1B9EDD74007EA5BD /* libbellesip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223CA7E516D9255800EF1BEC /* libbellesip.a */; };
+ 63CFEDED1B9EDD74007EA5BD /* libbzrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 045B5CB218D72E9A0088350C /* libbzrtp.a */; };
+ 63CFEDEF1B9EDD74007EA5BD /* libgsm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2910765B400068D98F /* libgsm.a */; };
+ 63CFEDF11B9EDD74007EA5BD /* libilbcrfc3951.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 152F22331B15E83B008C0621 /* libilbcrfc3951.a */; };
+ 63CFEDF21B9EDD74007EA5BD /* liblinphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2211DB911475562600DEE054 /* liblinphone.a */; };
+ 63CFEDF41B9EDD74007EA5BD /* libmediastreamer_base.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22405EE916006F0700B92522 /* libmediastreamer_base.a */; };
+ 63CFEDF51B9EDD74007EA5BD /* libmediastreamer_voip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22405EEA16006F0700B92522 /* libmediastreamer_voip.a */; };
+ 63CFEDF61B9EDD74007EA5BD /* libopencore-amrnb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED41344B0EF00F6EF27 /* libopencore-amrnb.a */; };
+ 63CFEDF71B9EDD74007EA5BD /* libopencore-amrwb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED31344B0EF00F6EF27 /* libopencore-amrwb.a */; };
+ 63CFEDF81B9EDD74007EA5BD /* libopenh264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22509041196BD902007863F6 /* libopenh264.a */; };
+ 63CFEDF91B9EDD74007EA5BD /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AF73C11754C0D000BE8398 /* libopus.a */; };
+ 63CFEDFA1B9EDD74007EA5BD /* libortp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2C10765B400068D98F /* libortp.a */; };
+ 63CFEDFB1B9EDD74007EA5BD /* libpolarssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 57B0E35F173C010400A476B8 /* libpolarssl.a */; };
+ 63CFEDFD1B9EDD74007EA5BD /* libspeex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2F10765B400068D98F /* libspeex.a */; };
+ 63CFEDFE1B9EDD74007EA5BD /* libspeexdsp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD3010765B400068D98F /* libspeexdsp.a */; };
+ 63CFEDFF1B9EDD74007EA5BD /* libsrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AB1472527D0037138E /* libsrtp.a */; };
+ 63CFEE011B9EDD74007EA5BD /* libswscale.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8213C73D3100210156 /* libswscale.a */; };
+ 63CFEE021B9EDD74007EA5BD /* libtunnel.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D30BF33216A427BC00AF0026 /* libtunnel.a */; };
+ 63CFEE041B9EDD74007EA5BD /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7066FC0B13E830E400EFC6DC /* libvpx.a */; };
+ 63CFEE051B9EDD74007EA5BD /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFB13D7125500B30535 /* libx264.a */; };
+ 63CFEE061B9EDD88007EA5BD /* libmsamr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED51344B0EF00F6EF27 /* libmsamr.a */; };
+ 63CFEE071B9EDD88007EA5BD /* libmsbcg729.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226CDADE14E2D0B800513B67 /* libmsbcg729.a */; };
+ 63CFEE081B9EDD88007EA5BD /* libmsilbc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223148E51178A09900637D6A /* libmsilbc.a */; };
+ 63CFEE091B9EDD88007EA5BD /* libmsopenh264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1560821E18EEF26100765332 /* libmsopenh264.a */; };
+ 63CFEE0A1B9EDD88007EA5BD /* libmssilk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AF147259670037138E /* libmssilk.a */; };
+ 63CFEE0B1B9EDD88007EA5BD /* libmswebrtc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 63EA4C941B50189D00922857 /* libmswebrtc.a */; };
+ 63CFEE0C1B9EDD88007EA5BD /* libmsx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFC13D7125500B30535 /* libmsx264.a */; };
+ 63CFEE131B9EDF65007EA5BD /* libvo-amrwbenc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 63CFEDE31B9EDD36007EA5BD /* libvo-amrwbenc.a */; };
63E59A3F1ADE70D900646FB3 /* InAppProductsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */; };
63FB30351A680E73008CA393 /* UIRoundedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63FB30341A680E73008CA393 /* UIRoundedImageView.m */; };
- 7066FC0C13E830E400EFC6DC /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7066FC0B13E830E400EFC6DC /* libvpx.a */; };
70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; };
70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; };
C90FAA7915AF54E6002091CB /* HistoryDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C90FAA7715AF54E6002091CB /* HistoryDetailsViewController.m */; };
@@ -340,8 +348,6 @@
D37DC6C11594AE1800B2A5EB /* LinphoneCoreSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = D37DC6C01594AE1800B2A5EB /* LinphoneCoreSettingsStore.m */; };
D37DC7181594AF3400B2A5EB /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D37DC7171594AF3400B2A5EB /* MessageUI.framework */; };
D37E3ECD1619C27A0087659A /* CAAnimation+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = D37E3ECC1619C27A0087659A /* CAAnimation+Blocks.m */; };
- D37EE10916032DA4003608A6 /* libmediastreamer_base.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22405EE916006F0700B92522 /* libmediastreamer_base.a */; };
- D37EE10A16032DA4003608A6 /* libmediastreamer_voip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22405EEA16006F0700B92522 /* libmediastreamer_voip.a */; };
D37EE10D16035793003608A6 /* ImageViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D37EE11016035793003608A6 /* ImageViewController.xib */; };
D37EE162160377D7003608A6 /* DTActionSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = D37EE161160377D7003608A6 /* DTActionSheet.m */; };
D3807FBF15C28940005BE9BC /* DCRoundSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FB815C28940005BE9BC /* DCRoundSwitch.m */; };
@@ -450,7 +456,6 @@
F0BB8C4D193631DF00974404 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 224567C1107B968500F10948 /* AVFoundation.framework */; };
F0C1F8EB1A277ADA009402C9 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = F0C1F8EA1A277ADA009402C9 /* LaunchScreen.xib */; };
F0FF66AC1ACAEF4F008A4486 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0FF66AA1ACAEEB0008A4486 /* IOKit.framework */; };
- F476004B147AAF2800FFF19B /* liblinphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2211DB911475562600DEE054 /* liblinphone.a */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -897,6 +902,9 @@
63B81A0B1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+TPKeyboardAvoidingAdditions.m"; sourceTree = ""; };
63CD4B4D1A5AAC8C00B84282 /* DTAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DTAlertView.h; sourceTree = ""; };
63CD4B4E1A5AAC8C00B84282 /* DTAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DTAlertView.m; sourceTree = ""; };
+ 63CFEDE21B9EDD36007EA5BD /* libswresample.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libswresample.a; path = "liblinphone-sdk/apple-darwin/lib/libswresample.a"; sourceTree = ""; };
+ 63CFEDE31B9EDD36007EA5BD /* libvo-amrwbenc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libvo-amrwbenc.a"; path = "liblinphone-sdk/apple-darwin/lib/libvo-amrwbenc.a"; sourceTree = ""; };
+ 63CFEDE41B9EDD36007EA5BD /* libbcg729.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libbcg729.a; path = "liblinphone-sdk/apple-darwin/lib/libbcg729.a"; sourceTree = ""; };
63E59A3D1ADE6ECB00646FB3 /* InAppProductsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppProductsManager.h; sourceTree = ""; };
63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppProductsManager.m; sourceTree = ""; };
63EA4C941B50189D00922857 /* libmswebrtc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmswebrtc.a; path = "liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/libmswebrtc.a"; sourceTree = ""; };
@@ -1161,19 +1169,38 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 63A4280A1B26F576000DAB93 /* libSKP_SILK_SDK.a in Frameworks */,
- 152F22361B15E889008C0621 /* libxml2.dylib in Frameworks */,
- 152F22341B15E83B008C0621 /* libilbcrfc3951.a in Frameworks */,
- F0B026F31AA710AF00FF49F7 /* libiconv.dylib in Frameworks */,
- F05BAA621A5D594E00411815 /* libz.dylib in Frameworks */,
- 1560821F18EEF26100765332 /* libmsopenh264.a in Frameworks */,
- 22509042196BD902007863F6 /* libopenh264.a in Frameworks */,
- 22AF73C21754C0D100BE8398 /* libopus.a in Frameworks */,
- 57B0E360173C010400A476B8 /* libpolarssl.a in Frameworks */,
- 223CA7E616D9255800EF1BEC /* libantlr3c.a in Frameworks */,
- 223CA7E716D9255800EF1BEC /* libbellesip.a in Frameworks */,
- 045B5CB318D72E9A0088350C /* libbzrtp.a in Frameworks */,
- D30562161671DC4900C97967 /* libXMLRPC.a in Frameworks */,
+ 63CFEDE81B9EDD74007EA5BD /* libantlr3c.a in Frameworks */,
+ 63CFEDE91B9EDD74007EA5BD /* libavcodec.a in Frameworks */,
+ 63CFEDEA1B9EDD74007EA5BD /* libavutil.a in Frameworks */,
+ 63CFEDEB1B9EDD74007EA5BD /* libbcg729.a in Frameworks */,
+ 63CFEDEC1B9EDD74007EA5BD /* libbellesip.a in Frameworks */,
+ 63CFEDED1B9EDD74007EA5BD /* libbzrtp.a in Frameworks */,
+ 63CFEDEF1B9EDD74007EA5BD /* libgsm.a in Frameworks */,
+ 63CFEDF11B9EDD74007EA5BD /* libilbcrfc3951.a in Frameworks */,
+ 63CFEDF21B9EDD74007EA5BD /* liblinphone.a in Frameworks */,
+ 63CFEDF41B9EDD74007EA5BD /* libmediastreamer_base.a in Frameworks */,
+ 63CFEDF51B9EDD74007EA5BD /* libmediastreamer_voip.a in Frameworks */,
+ 63CFEE061B9EDD88007EA5BD /* libmsamr.a in Frameworks */,
+ 63CFEE071B9EDD88007EA5BD /* libmsbcg729.a in Frameworks */,
+ 63CFEE081B9EDD88007EA5BD /* libmsilbc.a in Frameworks */,
+ 63CFEE091B9EDD88007EA5BD /* libmsopenh264.a in Frameworks */,
+ 63CFEE0A1B9EDD88007EA5BD /* libmssilk.a in Frameworks */,
+ 63CFEE0B1B9EDD88007EA5BD /* libmswebrtc.a in Frameworks */,
+ 63CFEE0C1B9EDD88007EA5BD /* libmsx264.a in Frameworks */,
+ 63CFEDF61B9EDD74007EA5BD /* libopencore-amrnb.a in Frameworks */,
+ 63CFEDF71B9EDD74007EA5BD /* libopencore-amrwb.a in Frameworks */,
+ 63CFEDF81B9EDD74007EA5BD /* libopenh264.a in Frameworks */,
+ 63CFEDF91B9EDD74007EA5BD /* libopus.a in Frameworks */,
+ 63CFEDFA1B9EDD74007EA5BD /* libortp.a in Frameworks */,
+ 63CFEDFB1B9EDD74007EA5BD /* libpolarssl.a in Frameworks */,
+ 63CFEDFD1B9EDD74007EA5BD /* libspeex.a in Frameworks */,
+ 63CFEDFE1B9EDD74007EA5BD /* libspeexdsp.a in Frameworks */,
+ 63CFEDFF1B9EDD74007EA5BD /* libsrtp.a in Frameworks */,
+ 63CFEE011B9EDD74007EA5BD /* libswscale.a in Frameworks */,
+ 63CFEE021B9EDD74007EA5BD /* libtunnel.a in Frameworks */,
+ 63CFEE131B9EDF65007EA5BD /* libvo-amrwbenc.a in Frameworks */,
+ 63CFEE041B9EDD74007EA5BD /* libvpx.a in Frameworks */,
+ 63CFEE051B9EDD74007EA5BD /* libx264.a in Frameworks */,
22B5F03510CE6B2F00777D97 /* AddressBook.framework in Frameworks */,
22B5EFA310CE50BD00777D97 /* AddressBookUI.framework in Frameworks */,
22405EEE1600B4E400B92522 /* AssetsLibrary.framework in Frameworks */,
@@ -1193,28 +1220,14 @@
70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */,
2264B6D211200342002C2C53 /* SystemConfiguration.framework in Frameworks */,
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
+ D30562161671DC4900C97967 /* libXMLRPC.a in Frameworks */,
+ 152F22361B15E889008C0621 /* libxml2.dylib in Frameworks */,
+ F0B026F31AA710AF00FF49F7 /* libiconv.dylib in Frameworks */,
+ F05BAA621A5D594E00411815 /* libz.dylib in Frameworks */,
344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */,
D32B6E2F15A5C0AC0033019F /* libsqlite3.dylib in Frameworks */,
344ABDF214850AE9007420B6 /* libstdc++.6.dylib in Frameworks */,
22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */,
- 22276E8313C73D3100210156 /* libavcodec.a in Frameworks */,
- 22276E8413C73D3100210156 /* libavutil.a in Frameworks */,
- 220FAD3210765B400068D98F /* libgsm.a in Frameworks */,
- F476004B147AAF2800FFF19B /* liblinphone.a in Frameworks */,
- D37EE10916032DA4003608A6 /* libmediastreamer_base.a in Frameworks */,
- D37EE10A16032DA4003608A6 /* libmediastreamer_voip.a in Frameworks */,
- 226F2ED81344B0EF00F6EF27 /* libmsamr.a in Frameworks */,
- 223148E61178A09900637D6A /* libmsilbc.a in Frameworks */,
- 226183B0147259670037138E /* libmssilk.a in Frameworks */,
- 22A10F3B11F8960300373793 /* libortp.a in Frameworks */,
- 226F2ED71344B0EF00F6EF27 /* libopencore-amrnb.a in Frameworks */,
- 226F2ED61344B0EF00F6EF27 /* libopencore-amrwb.a in Frameworks */,
- 226CDAE014E2D0B800513B67 /* libmsbcg729.a in Frameworks */,
- 220FAD3810765B400068D98F /* libspeex.a in Frameworks */,
- 220FAD3910765B400068D98F /* libspeexdsp.a in Frameworks */,
- 226183AE1472527D0037138E /* libsrtp.a in Frameworks */,
- 22276E8513C73D3100210156 /* libswscale.a in Frameworks */,
- 7066FC0C13E830E400EFC6DC /* libvpx.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1505,6 +1518,9 @@
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
isa = PBXGroup;
children = (
+ 63CFEDE21B9EDD36007EA5BD /* libswresample.a */,
+ 63CFEDE31B9EDD36007EA5BD /* libvo-amrwbenc.a */,
+ 63CFEDE41B9EDD36007EA5BD /* libbcg729.a */,
63EA4C941B50189D00922857 /* libmswebrtc.a */,
63158FAC1B468E0E00969917 /* ImageOptim.sh */,
152F22351B15E889008C0621 /* libxml2.dylib */,
@@ -3124,12 +3140,8 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = linphone_Prefix.pch;
GCC_PREPROCESSOR_DEFINITIONS = (
- VIDEO_ENABLED,
- HAVE_OPENH264,
- HAVE_SILK,
- HAVE_SSL,
- DEBUG,
USE_APN_DEV,
+ DEBUG,
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
@@ -3214,12 +3226,6 @@
GCC_OPTIMIZATION_LEVEL = s;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = linphone_Prefix.pch;
- GCC_PREPROCESSOR_DEFINITIONS = (
- VIDEO_ENABLED,
- HAVE_SILK,
- HAVE_SSL,
- HAVE_OPENH264,
- );
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
@@ -3302,12 +3308,7 @@
GCC_OPTIMIZATION_LEVEL = s;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = linphone_Prefix.pch;
- GCC_PREPROCESSOR_DEFINITIONS = (
- VIDEO_ENABLED,
- HAVE_SILK,
- HAVE_SSL,
- USE_APN_DEV,
- );
+ GCC_PREPROCESSOR_DEFINITIONS = USE_APN_DEV;
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
@@ -3391,11 +3392,6 @@
GCC_OPTIMIZATION_LEVEL = s;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = linphone_Prefix.pch;
- GCC_PREPROCESSOR_DEFINITIONS = (
- VIDEO_ENABLED,
- HAVE_SILK,
- HAVE_SSL,
- );
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
diff --git a/prepare.py b/prepare.py
index 7a7089c38..b14456239 100755
--- a/prepare.py
+++ b/prepare.py
@@ -26,15 +26,18 @@ import argparse
import os
import re
import shutil
+import tempfile
import sys
+from logging import *
from distutils.spawn import find_executable
from subprocess import Popen, PIPE
sys.dont_write_bytecode = True
sys.path.insert(0, 'submodules/cmake-builder')
try:
import prepare
-except:
- print("Could not find prepare module, probably missing submodules/cmake-builder? Try running git submodule update --init --recursive")
+except Exception as e:
+ error(
+ "Could not find prepare module: {}, probably missing submodules/cmake-builder? Try running:\ngit submodule update --init --recursive".format(e))
exit(1)
@@ -107,127 +110,149 @@ class PlatformListAction(argparse.Action):
setattr(namespace, self.dest, values)
-def warning(platforms):
- gpl_third_parties_enabled = False
- regex = re.compile("^ENABLE_GPL_THIRD_PARTIES:BOOL=ON")
- f = open(
- 'WORK/ios-{arch}/cmake/CMakeCache.txt'.format(arch=platforms[0]), 'r')
- for line in f:
- if regex.match(line):
- gpl_third_parties_enabled = True
- break
- f.close()
+def gpl_disclaimer(platforms):
+ cmakecache = 'WORK/ios-{arch}/cmake/CMakeCache.txt'.format(arch=platforms[0])
+ gpl_third_parties_enabled = "ENABLE_GPL_THIRD_PARTIES:BOOL=YES" in open(cmakecache).read() or "ENABLE_GPL_THIRD_PARTIES:BOOL=ON" in open(cmakecache).read()
if gpl_third_parties_enabled:
- print("***************************************************************************\n"
- "***************************************************************************\n"
- "***** CAUTION, this liblinphone SDK is built using 3rd party GPL code *****\n"
- "***** Even if you acquired a proprietary license from Belledonne *****\n"
- "***** Communications, this SDK is GPL and GPL only. *****\n"
- "***** To disable 3rd party gpl code, please use: *****\n"
- "***** $ ./prepare.py -DENABLE_GPL_THIRD_PARTIES=NO *****\n"
- "***************************************************************************\n"
- "***************************************************************************\n")
+ warning("\n***************************************************************************"
+ "\n***************************************************************************"
+ "\n***** CAUTION, this liblinphone SDK is built using 3rd party GPL code *****"
+ "\n***** Even if you acquired a proprietary license from Belledonne *****"
+ "\n***** Communications, this SDK is GPL and GPL only. *****"
+ "\n***** To disable 3rd party gpl code, please use: *****"
+ "\n***** $ ./prepare.py -DENABLE_GPL_THIRD_PARTIES=NO *****"
+ "\n***************************************************************************"
+ "\n***************************************************************************")
else:
- print("*****************************************************************\n"
- "*****************************************************************\n"
- "***** Linphone SDK without 3rd party GPL software *****\n"
- "***** If you acquired a proprietary license from Belledonne *****\n"
- "***** Communications, this SDK can be used to create *****\n"
- "***** a proprietary linphone-based application. *****\n"
- "*****************************************************************\n"
- "*****************************************************************\n")
+ warning("\n***************************************************************************"
+ "\n***************************************************************************"
+ "\n***** Linphone SDK without 3rd party GPL software *****"
+ "\n***** If you acquired a proprietary license from Belledonne *****"
+ "\n***** Communications, this SDK can be used to create *****"
+ "\n***** a proprietary linphone-based application. *****"
+ "\n***************************************************************************"
+ "\n***************************************************************************")
def extract_libs_list():
l = []
# name = libspeexdsp.a; path = "liblinphone-sdk/apple-darwin/lib/libspeexdsp.a"; sourceTree = ""; };
- regex = re.compile("name = (lib(\S+)\.a); path = \"liblinphone-sdk/apple-darwin/")
+ regex = re.compile("name = (\")*(lib(\S+))\.a(\")*; path = \"liblinphone-sdk/apple-darwin/")
f = open('linphone.xcodeproj/project.pbxproj', 'r')
lines = f.readlines()
f.close()
for line in lines:
m = regex.search(line)
if m is not None:
- l += [m.group(1)]
+ l += [m.group(2)]
return list(set(l))
-def check_installed(binary, prog=None, warn=True):
+missing_dependencies = {}
+
+
+def check_is_installed(binary, prog=None, warn=True):
if not find_executable(binary):
if warn:
- print("Could not find {}. Please install {}.".format(binary, prog))
- return 1
- return 0
+ missing_dependencies[binary] = prog
+ # error("Could not find {}. Please install {}.".format(binary, prog))
+ return False
+ return True
+
+
+def detect_package_manager():
+ if find_executable("brew"):
+ return "brew"
+ elif find_executable("port"):
+ return "sudo port"
+ else:
+ error(
+ "No package manager found. Please README or install brew using:\n\truby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"")
+ return "brew"
def check_tools():
- ret = 0
+ package_manager_info = {"brew-pkg-config": "pkg-config",
+ "sudo port-pkg-config": "pkgconfig",
+ "brew-binary-path": "/usr/local/bin/",
+ "sudo port-binary-path": "/opt/local/bin/"
+ }
+ reterr = 0
if " " in os.path.dirname(os.path.realpath(__file__)):
- print("Invalid location: linphone-iphone path should not contain any spaces.")
- ret = 1
+ error("Invalid location: linphone-iphone path should not contain any spaces.")
+ reterr = 1
- for prog in ["autoconf", "automake", "pkg-config", "doxygen", "java", "nasm", "cmake", "wget", "yasm", "optipng"]:
- ret |= check_installed(prog, "it")
- ret |= check_installed("ginstall", "coreutils")
- ret |= check_installed("intltoolize", "intltool")
- ret |= check_installed("convert", "imagemagick")
+ for prog in ["autoconf", "automake", "doxygen", "java", "nasm", "cmake", "wget", "yasm", "optipng"]:
+ reterr |= not check_is_installed(prog, prog)
- if not check_installed("libtoolize", warn=False):
- if check_installed("glibtoolize", "libtool"):
+ reterr |= not check_is_installed("pkg-config", package_manager_info[detect_package_manager() + "-pkg-config"])
+ reterr |= not check_is_installed("ginstall", "coreutils")
+ reterr |= not check_is_installed("intltoolize", "intltool")
+ reterr |= not check_is_installed("convert", "imagemagick")
+
+ if find_executable("nasm"):
+ nasm_output = Popen("nasm -f elf32".split(" "), stderr=PIPE, stdout=PIPE).stderr.read()
+ if "fatal: unrecognised output format" in nasm_output:
+ missing_dependencies["nasm"] = "nasm"
+ reterr = 1
+
+ if check_is_installed("libtoolize", warn=False):
+ if not check_is_installed("glibtoolize", "libtool"):
glibtoolize_path = find_executable(glibtoolize)
- ret = 1
- error = "Please do a symbolic link from glibtoolize to libtoolize: 'ln -s {} ${}'."
- print(error.format(glibtoolize_path, glibtoolize_path.replace("glibtoolize", "libtoolize")))
+ reterr = 1
+ msg = "Please do a symbolic link from glibtoolize to libtoolize:\n\tln -s {} ${}"
+ error(msg.format(glibtoolize_path, glibtoolize_path.replace("glibtoolize", "libtoolize")))
+
+ # list all missing packages to install
+ if missing_dependencies:
+ error("The following binaries are missing: {}. Please install them using:\n\t{} install {}".format(
+ " ".join(missing_dependencies.keys()),
+ detect_package_manager(),
+ " ".join(missing_dependencies.values())))
devnull = open(os.devnull, 'wb')
- # just ensure that JDK is installed - if not, it will automatiaclyl display a popup to user
+ # just ensure that JDK is installed - if not, it will automatically display a popup to user
p = Popen("java -version".split(" "), stderr=devnull, stdout=devnull)
p.wait()
if p.returncode != 0:
- print(p.returncode)
- print("Please install Java JDK (not just JRE).")
- ret = 1
+ error("Please install Java JDK (not just JRE).")
+ reterr = 1
# needed by x264
- check_installed("gas-preprocessor.pl", """it:
- wget --no-check-certificate https://raw.github.com/yuvi/gas-preprocessor/master/gas-preprocessor.pl
- chmod +x gas-preprocessor.pl
- sudo mv gas-preprocessor.pl /usr/local/bin/""")
+ if not find_executable("gas-preprocessor.pl"):
+ error("""Could not find gas-preprocessor.pl, please install it:
+ wget --no-check-certificate https://raw.github.com/yuvi/gas-preprocessor/master/gas-preprocessor.pl && \\
+ chmod +x gas-preprocessor.pl && \\
+ sudo mv gas-preprocessor.pl {}""".format(package_manager_info[detect_package_manager() + "-binary-path"]))
+ reterr = 1
- nasm_output = Popen("nasm -f elf32".split(" "), stderr=PIPE, stdout=PIPE).stderr.read()
- if "fatal: unrecognised output format" in nasm_output:
- print(
- "Invalid version of nasm: your version does not support elf32 output format. If you have installed nasm, please check that your PATH env variable is set correctly.")
- ret = 1
+ if not os.path.isdir("submodules/linphone/mediastreamer2") or not os.path.isdir("submodules/linphone/oRTP"):
+ error("Missing some git submodules. Did you run:\n\tgit submodule update --init --recursive")
+ reterr = 1
- if not os.path.isdir("submodules/linphone/mediastreamer2") or not os.path.isdir("submodules/linphone/oRTP"):
- print("Missing some git submodules. Did you run 'git submodule update --init --recursive'?")
- ret = 1
p = Popen("xcrun --sdk iphoneos --show-sdk-path".split(" "), stdout=devnull, stderr=devnull)
p.wait()
if p.returncode != 0:
- print("iOS SDK not found, please install Xcode from AppStore or equivalent.")
- ret = 1
+ error("iOS SDK not found, please install Xcode from AppStore or equivalent.")
+ reterr = 1
else:
- sdk_platform_path = Popen("xcrun --sdk iphonesimulator --show-sdk-platform-path".split(" "), stdout=PIPE, stderr=devnull).stdout.read()[:-1]
+ sdk_platform_path = Popen(
+ "xcrun --sdk iphonesimulator --show-sdk-platform-path".split(" "), stdout=PIPE, stderr=devnull).stdout.read()[:-1]
sdk_strings_path = "{}/{}".format(sdk_platform_path, "Developer/usr/bin/strings")
if not os.path.isfile(sdk_strings_path):
strings_path = find_executable("strings")
- print("strings binary missing, please run 'sudo ln -s {} {}'.".format(strings_path, sdk_strings_path))
- ret = 1
+ error("strings binary missing, please run:\n\tsudo ln -s {} {}".format(strings_path, sdk_strings_path))
+ reterr = 1
- if ret == 1:
- print("Failed to detect required tools, aborting.")
-
- return ret
+ return reterr
def install_git_hook():
git_hook_path = ".git{sep}hooks{sep}pre-commit".format(sep=os.sep)
if os.path.isdir(".git{sep}hooks".format(sep=os.sep)) and not os.path.isfile(git_hook_path):
- print("Installing Git pre-commit hook")
+ info("Installing Git pre-commit hook")
shutil.copyfile(".git-pre-commit", git_hook_path)
os.chmod(git_hook_path, 0755)
@@ -301,7 +326,7 @@ def generate_makefile(platforms, generator):
multiarch = ""
for arch in platforms[1:]:
multiarch += \
-"""\tif test -f "$${arch}_path"; then \\
+ """\tif test -f "$${arch}_path"; then \\
\t\tall_paths=`echo $$all_paths $${arch}_path`; \\
\t\tall_archs="$$all_archs,{arch}" ; \\
\telse \\
@@ -351,14 +376,20 @@ veryclean-%: package-in-list-%
\tdone; \\
\techo "Run 'make build-$*' to rebuild $* correctly."
-build: libs
-
clean: $(addprefix clean-,$(packages))
veryclean: $(addprefix veryclean-,$(packages))
+generate-dummy-%:
+\t@echo "[{archs}] Generating dummy $* static library." ; \\
+\tprintf "void $*_init() {{}}" | tr '-' '_' > .dummy.c ; \\
+\tfor arch in {archs}; do clang -c .dummy.c -arch $$arch -o .dummy-$$arch.a; done ; \\
+\tlipo -create -output .dummy.a .dummy-*.a ; \\
+\trm .dummy-*.a .dummy.c
+
lipo:
\tarchives=`find liblinphone-sdk/{first_arch}-apple-darwin.ios -name *.a` && \\
+\trm -rf liblinphone-sdk/apple-darwin && \\
\tmkdir -p liblinphone-sdk/apple-darwin && \\
\tcp -rf liblinphone-sdk/{first_arch}-apple-darwin.ios/include liblinphone-sdk/apple-darwin/. && \\
\tcp -rf liblinphone-sdk/{first_arch}-apple-darwin.ios/share liblinphone-sdk/apple-darwin/. && \\
@@ -372,29 +403,29 @@ lipo:
\t\tall_archs="{first_arch}"; \\
\t\tmkdir -p `dirname $$destpath`; \\
\t\t{multiarch} \\
-\t\techo "[$$all_archs] Mixing `basename $$archive` in $$destpath"; \\
+\t\techo "[{archs}] Mixing `basename $$archive` in $$destpath"; \\
\t\tlipo -create $$all_paths -output $$destpath; \\
\tdone && \\
\tfor lib in {libs_list} ; do \\
\t\tif [ $${{lib:0:5}} = "libms" ] ; then \\
-\t\t\tlibrary_path=liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/$$lib ; \\
+\t\t\tlibrary_path=liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/$${{lib}}.a ; \\
\t\telse \\
-\t\t\tlibrary_path=liblinphone-sdk/apple-darwin/lib/$$lib ; \\
+\t\t\tlibrary_path=liblinphone-sdk/apple-darwin/lib/$${{lib}}.a ; \\
\t\tfi ; \\
\t\tif ! test -f $$library_path ; then \\
-\t\t\techo "[$$all_archs] Generating dummy $$lib static library." ; \\
-\t\t\tcp -f submodules/binaries/libdummy.a $$library_path ; \\
+\t\t\t$(MAKE) generate-dummy-$$lib ; \\
+\t\t\tmv .dummy.a $$library_path ; \\
\t\tfi \\
\tdone
-libs: $(addprefix all-,$(archs))
+build: $(addprefix all-,$(archs))
\t$(MAKE) lipo
ipa: build
\txcodebuild -configuration Release \\
-\t&& xcrun -sdk iphoneos PackageApplication -v build/Release-iphoneos/linphone.app -o linphone-iphone.ipa
+\t&& xcrun -sdk iphoneos PackageApplication -v build/Release-iphoneos/linphone.app -o $$PWD/linphone-iphone.ipa
-sdk: libs
+sdk: build
\techo "Generating SDK zip file for version $(LINPHONE_IPHONE_VERSION)"
\tzip -r liblinphone-iphone-sdk-$(LINPHONE_IPHONE_VERSION).zip \\
\tliblinphone-sdk/apple-darwin \\
@@ -408,7 +439,7 @@ pull-transifex:
push-transifex:
\t./Tools/i18n_generate_strings_files.sh && \\
-\ttx push -s -t -f --no-interactive
+\ttx push -s -f --no-interactive
zipres:
\t@tar -czf ios_assets.tar.gz Resources iTunesArtwork
@@ -426,19 +457,18 @@ help: help-prepare-options
\t@echo ""
\t@echo "Available targets:"
\t@echo ""
-\t@echo " * all : builds all architectures and creates the liblinphone sdk"
-\t@echo " * zipres : creates a tar.gz file with all the resources (images)"
+\t@echo " * all or build: builds all architectures and creates the liblinphone SDK"
+\t@echo " * sdk: generates a ZIP archive of liblinphone-sdk/apple-darwin containing the SDK. Use this only after a full build."
+\t@echo " * zipres: creates a tar.gz file with all the resources (images)"
\t@echo ""
\t@echo "=== Advanced usage ==="
\t@echo ""
-\t@echo " * build-[package] : builds the package for all architectures"
-\t@echo " * clean-[package] : clean the package for all architectures"
+\t@echo " * build-[package]: builds the package for all architectures"
+\t@echo " * clean-[package]: cleans the package for all architectures"
\t@echo ""
-\t@echo " * [{arch_opts}]-build-[package] : builds a package for the selected architecture"
-\t@echo " * [{arch_opts}]-clean-[package] : clean the package for the selected architecture"
+\t@echo " * [{arch_opts}]-build-[package]: builds a package for the selected architecture"
+\t@echo " * [{arch_opts}]-clean-[package]: cleans the package for the selected architecture"
\t@echo ""
-\t@echo " * sdk : re-add all generated libraries to the SDK. Use this only after a full build."
-\t@echo " * libs : after a rebuild of a subpackage, will mix the new libs in liblinphone-sdk/apple-darwin directory"
""".format(archs=' '.join(platforms), arch_opts='|'.join(platforms),
first_arch=platforms[0], options=' '.join(sys.argv),
arch_targets=arch_targets, packages=' '.join(packages),
@@ -447,10 +477,12 @@ help: help-prepare-options
f = open('Makefile', 'w')
f.write(makefile)
f.close()
- warning(platforms)
+ gpl_disclaimer(platforms)
def main(argv=None):
+ basicConfig(format="%(levelname)s: %(message)s", level=INFO)
+
if argv is None:
argv = sys.argv
argparser = argparse.ArgumentParser(
@@ -464,34 +496,70 @@ def main(argv=None):
argparser.add_argument(
'-f', '--force', help="Force preparation, even if working directory already exist.", action='store_true')
argparser.add_argument(
- '-G' '--generator', help="CMake build system generator (default: Unix Makefiles).", default='Unix Makefiles', choices=['Unix Makefiles', 'Ninja'])
+ '--disable-gpl-third-parties', help="Disable GPL third parties such as FFMpeg, x264.", action='store_true')
+ argparser.add_argument(
+ '--enable-non-free-codecs', help="Enable non-free codecs such as OpenH264, MPEG4, etc.. Final application must comply with their respective license (see README.md).", action='store_true')
+ argparser.add_argument(
+ '-G' '--generator', help="CMake build system generator (default: Unix Makefiles).", default='Unix Makefiles', choices=['Unix Makefiles', 'Ninja'], dest='generator')
argparser.add_argument(
'-L', '--list-cmake-variables', help="List non-advanced CMake cache variables.", action='store_true', dest='list_cmake_variables')
+ argparser.add_argument(
+ '-lf', '--list-features', help="List optional features and their default values.", action='store_true', dest='list_features')
+ argparser.add_argument(
+ '-t', '--tunnel', help="Enable Tunnel.", action='store_true')
argparser.add_argument('platform', nargs='*', action=PlatformListAction, default=[
'x86_64', 'devices'], help="The platform to build for (default is 'x86_64 devices'). Space separated architectures in list: {0}.".format(', '.join([repr(platform) for platform in platforms])))
args, additional_args = argparser.parse_known_args()
- if args.debug_verbose:
- additional_args += ["-DENABLE_DEBUG_LOGS=YES"]
-
- if os.path.isdir("submodules/tunnel"):
- print("Enabling tunnel")
- additional_args += ["-DENABLE_TUNNEL=YES"]
-
- if check_tools() != 0:
- return 1
-
- install_git_hook()
-
- additional_args += ["-G", args.G__generator]
- if args.G__generator == 'Ninja':
- if check_installed("ninja", "it") != 0:
+ additional_args += ["-G", args.generator]
+ if args.generator == 'Ninja':
+ if not check_is_installed("ninja", "it"):
return 1
generator = 'ninja -C'
else:
generator = '$(MAKE) -C'
+ if check_tools() != 0:
+ return 1
+
+ if args.debug_verbose is True:
+ additional_args += ["-DENABLE_DEBUG_LOGS=YES"]
+ if args.enable_non_free_codecs is True:
+ additional_args += ["-DENABLE_NON_FREE_CODECS=YES"]
+ if args.disable_gpl_third_parties is True:
+ additional_args += ["-DENABLE_GPL_THIRD_PARTIES=NO"]
+
+ if args.tunnel or os.path.isdir("submodules/tunnel"):
+ if not os.path.isdir("submodules/tunnel"):
+ info("Tunnel wanted but not found yet, trying to clone it...")
+ p = Popen("git clone gitosis@git.linphone.org:tunnel.git submodules/tunnel".split(" "))
+ p.wait()
+ if p.retcode != 0:
+ error("Could not clone tunnel. Please see http://www.belledonne-communications.com/voiptunnel.html")
+ return 1
+ warning("Tunnel enabled, disabling GPL third parties.")
+ additional_args += ["-DENABLE_TUNNEL=ON", "-DENABLE_GPL_THIRD_PARTIES=OFF"]
+
+ if args.list_features:
+ tmpdir = tempfile.mkdtemp(prefix="linphone-iphone")
+ tmptarget = IOSarm64Target()
+ tmptarget.abs_cmake_dir = tmpdir
+
+ option_regex = re.compile("ENABLE_(.*):(.*)=(.*)")
+ option_list = [""]
+ build_type = 'Debug' if args.debug else 'Release'
+ for line in Popen(tmptarget.cmake_command(build_type, False, True, additional_args),
+ cwd=tmpdir, shell=False, stdout=PIPE).stdout.readlines():
+ match = option_regex.match(line)
+ if match is not None:
+ option_list.append("ENABLE_{} (is currently {})".format(match.groups()[0], match.groups()[2]))
+ info("Here is the list of available features: {}".format("\n\t".join(option_list)))
+ info("To enable some feature, please use -DENABLE_SOMEOPTION=ON")
+ info("Similarly, to disable some feature, please use -DENABLE_SOMEOPTION=OFF")
+ shutil.rmtree(tmpdir)
+ return 0
+
selected_platforms = []
for platform in args.platform:
if platform == 'all':
@@ -510,7 +578,7 @@ def main(argv=None):
if args.clean:
target.clean()
else:
- retcode = prepare.run(target, args.debug, False, args.list_cmake_variables, args.force, additional_args)
+ retcode = prepare.run (target, args.debug, False, args.list_cmake_variables, args.force, additional_args)
if retcode != 0:
if retcode == 51:
Popen("make help-prepare-options".split(" "))
@@ -521,6 +589,7 @@ def main(argv=None):
if os.path.isfile('Makefile'):
os.remove('Makefile')
elif selected_platforms:
+ install_git_hook()
generate_makefile(selected_platforms, generator)
return 0
diff --git a/submodules/belle-sip b/submodules/belle-sip
index 3cf82aaf9..8115fd975 160000
--- a/submodules/belle-sip
+++ b/submodules/belle-sip
@@ -1 +1 @@
-Subproject commit 3cf82aaf9e1a84a8438341b026abd8c13520e005
+Subproject commit 8115fd9758f4e0e16e3352e1531a6f095fe60ef2
diff --git a/submodules/binaries/dummy.c b/submodules/binaries/dummy.c
deleted file mode 100644
index bf722ecc4..000000000
--- a/submodules/binaries/dummy.c
+++ /dev/null
@@ -1,6 +0,0 @@
-//regenerate libdummy.a using:
-// for arch in arm64 armv7 i386 x86_64; do
-// clang -c dummy.c -o dummy-$arch.a -arch $arch
-// done
-// lipo -create -output libdummy.a dummy-*.a
-void dummy_does_nothing() {}
diff --git a/submodules/binaries/libdummy.a b/submodules/binaries/libdummy.a
deleted file mode 100644
index 7f9f9467f..000000000
Binary files a/submodules/binaries/libdummy.a and /dev/null differ
diff --git a/submodules/binaries/libvpx-armv7.a b/submodules/binaries/libvpx-armv7.a
deleted file mode 100644
index 888bdc235..000000000
Binary files a/submodules/binaries/libvpx-armv7.a and /dev/null differ
diff --git a/submodules/binaries/libvpx-armv7s.a b/submodules/binaries/libvpx-armv7s.a
deleted file mode 100644
index c36d5f299..000000000
Binary files a/submodules/binaries/libvpx-armv7s.a and /dev/null differ
diff --git a/submodules/binaries/libvpx-i386.a b/submodules/binaries/libvpx-i386.a
deleted file mode 100644
index 6d8042248..000000000
Binary files a/submodules/binaries/libvpx-i386.a and /dev/null differ
diff --git a/submodules/binaries/why.txt b/submodules/binaries/why.txt
deleted file mode 100644
index 5325fecad..000000000
--- a/submodules/binaries/why.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-Notes:
-
-This directory is here because some of our dependencies compile incorrecly
-(or not at all) with the compilers that Apple ships with its newer Xcode versions.
-
-You'll find here the reasons why certain libs are furnished pre-compiled.
-
-Additionaly, the libdummy.a is an empty library created to stub the tunnel extension.
-
-= Libvpx =
-
-Binary version compiled with XCode 5.0, with the patch suggested here for
-garbage video fix: https://code.google.com/p/webm/issues/detail?id=603#c45
-
-Compiles OK on XCode 5.1 but results in a crash in-app.
-Bug is here: https://code.google.com/p/webm/issues/detail?id=737
-
diff --git a/submodules/linphone b/submodules/linphone
index 617b75356..352b9c840 160000
--- a/submodules/linphone
+++ b/submodules/linphone
@@ -1 +1 @@
-Subproject commit 617b75356252dfa4942ea2b7a8e0bb4f4b33bb1c
+Subproject commit 352b9c84067692131b2c58ad8d2d62a37b664e9e