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 @@ [![Build Status](https://travis-ci.org/BelledonneCommunications/linphone-iphone.svg?branch=master)](https://travis-ci.org/BelledonneCommunications/linphone-iphone) -# BUILDING THE SDK +Linphone is a free VoIP and video softphone based on the SIP protocol. + +![Dialer screenshot](http://www.linphone.org/img/slideshow-phone.png) + +# 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