Merge branch 'master' into tunnel

Conflicts:
	Classes/LinphoneUI/LinphoneManager.h
	Classes/LinphoneUI/LinphoneManager.m
	linphone.xcodeproj/project.pbxproj
This commit is contained in:
Jehan Monnier 2011-05-30 17:33:02 +02:00
commit 0bc5c52e23
6 changed files with 339 additions and 192 deletions

View file

@ -0,0 +1,41 @@
/* FastAddressBook.h
*
* Copyright (C) 2011 Belledonne Comunications, Grenoble, France
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import <Foundation/Foundation.h>
#import <AddressBook/AddressBook.h>
@interface Contact : NSObject {
ABRecordRef record;
NSString* numberType;
}
-(id) initWithRecord:(ABRecordRef) record ofType:(NSString*) type;
@property (nonatomic, readonly) ABRecordRef record;
@property (nonatomic, readonly) NSString* numberType;
@end
@interface FastAddressBook : NSObject {
NSMutableDictionary* mAddressBookMap;
}
-(Contact*) getMatchingRecord:(NSString*) number ;
+(NSString*) appendCountryCodeIfPossible:(NSString*) number ;
+(NSString*) normalizePhoneNumber:(NSString*) number ;
-(id) init ;
@end

View file

@ -0,0 +1,98 @@
/* FastAddressBook.h
*
* Copyright (C) 2011 Belledonne Comunications, Grenoble, France
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import "FastAddressBook.h"
@implementation FastAddressBook
-(Contact*) getMatchingRecord:(NSString*) number {
@synchronized (mAddressBookMap){
return (Contact*) [mAddressBookMap objectForKey:number];
}
}
+(NSString*) appendCountryCodeIfPossible:(NSString*) number {
if (![number hasPrefix:@"+"] && ![number hasPrefix:@"00"]) {
NSString* lCountryCode = [[NSUserDefaults standardUserDefaults] stringForKey:@"countrycode_preference"];
if (lCountryCode && [lCountryCode length]>0) {
//append country code
return [lCountryCode stringByAppendingString:number];
}
}
return number;
}
+(NSString*) normalizePhoneNumber:(NSString*) number {
NSString* lNormalizedNumber = [(NSString*)number stringByReplacingOccurrencesOfString:@" " withString:@""];
lNormalizedNumber = [lNormalizedNumber stringByReplacingOccurrencesOfString:@"(" withString:@""];
lNormalizedNumber = [lNormalizedNumber stringByReplacingOccurrencesOfString:@")" withString:@""];
lNormalizedNumber = [lNormalizedNumber stringByReplacingOccurrencesOfString:@"-" withString:@""];
lNormalizedNumber = [FastAddressBook appendCountryCodeIfPossible:lNormalizedNumber];
return lNormalizedNumber;
}
void sync_address_book (ABAddressBookRef addressBook, CFDictionaryRef info, void *context) {
NSMutableDictionary* lAddressBookMap = (NSMutableDictionary*)context;
@synchronized (lAddressBookMap) {
[lAddressBookMap removeAllObjects];
NSArray *lContacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
for (id lPerson in lContacts) {
ABMutableMultiValueRef lPhoneNumbers = ABRecordCopyValue((ABRecordRef)lPerson, kABPersonPhoneProperty);
for ( int i=0; i<ABMultiValueGetCount(lPhoneNumbers); i++) {
CFStringRef lValue = ABMultiValueCopyValueAtIndex(lPhoneNumbers,i);
CFStringRef lLabel = ABMultiValueCopyLabelAtIndex(lPhoneNumbers,i);
CFStringRef lLocalizedLabel = ABAddressBookCopyLocalizedLabel(lLabel);
NSString* lNormalizedKey = [FastAddressBook normalizePhoneNumber:(NSString*)lValue];
Contact* lContact = [[Contact alloc] initWithRecord:lPerson ofType:(NSString *)lLocalizedLabel];
[lAddressBookMap setObject:lContact forKey:lNormalizedKey];
CFRelease(lValue);
CFRelease(lLabel);
CFRelease(lLocalizedLabel);
}
CFRelease(lPhoneNumbers);
}
CFRelease(lContacts);
}
}
-(FastAddressBook*) init {
if ((self = [super init])) {
mAddressBookMap = [[NSMutableDictionary alloc] init];
ABAddressBookRef lAddressBook = ABAddressBookCreate();
ABAddressBookRegisterExternalChangeCallback (lAddressBook,sync_address_book,mAddressBookMap);
sync_address_book(lAddressBook,nil,mAddressBookMap);
}
return self;
}
@end
@implementation Contact
@synthesize record;
@synthesize numberType;
-(id) initWithRecord:(ABRecordRef) aRecord ofType:(NSString*) type {
if ((self = [super init])) {
record=CFRetain(aRecord);
numberType= [type retain];
}
return self;
}
- (void)dealloc {
[super dealloc];
CFRelease(record);
[numberType release];
}
@end

View file

@ -27,8 +27,7 @@ typedef enum _Connectivity {
wwan
,none
} Connectivity;
@class FastAddressBook;
@interface LinphoneManager : NSObject {
@private
SCNetworkReachabilityContext proxyReachabilityContext;
@ -42,6 +41,7 @@ typedef enum _Connectivity {
UIViewController* mCurrentViewController;
Connectivity connectivity;
FastAddressBook* mFastAddressBook;
}
+(LinphoneManager*) instance;
@ -61,3 +61,5 @@ typedef enum _Connectivity {
@property (nonatomic, retain) id<LinphoneUIRegistrationDelegate> registrationDelegate;
@property Connectivity connectivity;
@end

View file

@ -25,6 +25,7 @@
#include <netdb.h>
#import <AVFoundation/AVAudioSession.h>
#import <AudioToolbox/AudioToolbox.h>
#import "FastAddressBook.h"
#include "tunnel/TunnelManager.hh"
#import <AddressBook/AddressBook.h>
@ -44,14 +45,19 @@ extern void libmsamr_init();
@synthesize registrationDelegate;
@synthesize connectivity;
-(id) init {
if ((self= [super init])) {
mFastAddressBook = [[FastAddressBook alloc] init];
}
return self;
}
+(LinphoneManager*) instance {
if (theLinphoneManager==nil) {
theLinphoneManager = [LinphoneManager alloc];
theLinphoneManager = [[LinphoneManager alloc] init];
}
return theLinphoneManager;
}
-(NSString*) appendCountryCodeIfPossible:(NSString*) number {
if (![number hasPrefix:@"+"] && ![number hasPrefix:@"00"]) {
NSString* lCountryCode = [[NSUserDefaults standardUserDefaults] stringForKey:@"countrycode_preference"];
@ -64,41 +70,24 @@ extern void libmsamr_init();
}
-(NSString*) getDisplayNameFromAddressBook:(NSString*) number andUpdateCallLog:(LinphoneCallLog*)log {
ABAddressBookRef lAddressBook = ABAddressBookCreate();
NSArray *lContacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(lAddressBook);
for (id lContact in lContacts) {
ABMutableMultiValueRef lPhoneNumbers = ABRecordCopyValue((ABRecordRef)lContact, kABPersonPhoneProperty);
for ( int i=0; i<ABMultiValueGetCount(lPhoneNumbers); i++) {
CFStringRef lLabel = ABMultiValueCopyLabelAtIndex(lPhoneNumbers,i);
CFStringRef lValue = (CFStringRef)ABMultiValueCopyValueAtIndex(lPhoneNumbers,i);
CFStringRef lLocalizedLabel = ABAddressBookCopyLocalizedLabel(lLabel);
NSString* lNormalizedNumber = [(NSString*)lValue stringByReplacingOccurrencesOfString:@" " withString:@""];
lNormalizedNumber = [lNormalizedNumber stringByReplacingOccurrencesOfString:@"(" withString:@""];
lNormalizedNumber = [lNormalizedNumber stringByReplacingOccurrencesOfString:@")" withString:@""];
lNormalizedNumber = [lNormalizedNumber stringByReplacingOccurrencesOfString:@"-" withString:@""];
lNormalizedNumber = [self appendCountryCodeIfPossible:lNormalizedNumber];
number = [self appendCountryCodeIfPossible:number];
if([lNormalizedNumber isEqualToString:number]) {
CFStringRef lDisplayName = ABRecordCopyCompositeName(lContact);
if (log) {
//add phone type
char ltmpString[256];
CFStringRef lFormatedString = CFStringCreateWithFormat(NULL,NULL,CFSTR("phone_type:%@;"),lLocalizedLabel);
CFStringGetCString(lFormatedString, ltmpString,sizeof(ltmpString), kCFStringEncodingUTF8);
linphone_call_log_set_ref_key(log, ltmpString);
CFRelease(lFormatedString);
}
return (NSString*)lDisplayName;
}
CFRelease(lLabel);
CFRelease(lValue);
CFRelease(lLocalizedLabel);
}
//1 normalize
NSString* lNormalizedNumber = [FastAddressBook normalizePhoneNumber:number];
Contact* lContact = [mFastAddressBook getMatchingRecord:lNormalizedNumber];
if (lContact) {
CFStringRef lDisplayName = ABRecordCopyCompositeName(lContact.record);
if (log) {
//add phone type
char ltmpString[256];
CFStringRef lFormatedString = CFStringCreateWithFormat(NULL,NULL,CFSTR("phone_type:%@;"),lContact.numberType);
CFStringGetCString(lFormatedString, ltmpString,sizeof(ltmpString), kCFStringEncodingUTF8);
linphone_call_log_set_ref_key(log, ltmpString);
CFRelease(lFormatedString);
}
return (NSString*)lDisplayName;
}
//[number release];
return nil;
}
-(void) updateCallWithAddressBookData:(LinphoneCall*) call {
@ -436,6 +425,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach
const char* proxy = [proxyAddress cStringUsingEncoding:[NSString defaultCStringEncoding]];
NSString* prefix = [[NSUserDefaults standardUserDefaults] stringForKey:@"prefix_preference"];
bool substitute_plus_by_00 = [[NSUserDefaults standardUserDefaults] boolForKey:@"substitute_+_by_00_preference"];
//possible valid config detected
LinphoneProxyConfig* proxyCfg;
proxyCfg = linphone_proxy_config_new();
@ -460,7 +450,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach
if ([prefix length]>0) {
linphone_proxy_config_set_dial_prefix(proxyCfg, [prefix cStringUsingEncoding:[NSString defaultCStringEncoding]]);
}
linphone_proxy_config_set_dial_escape_plus(proxyCfg,TRUE);
linphone_proxy_config_set_dial_escape_plus(proxyCfg,substitute_plus_by_00);
linphone_core_add_proxy_config(theLinphoneCore,proxyCfg);
//set to default proxy

View file

@ -2,167 +2,163 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>SIP account</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>User name</string>
<key>AutocapitalizationType</key>
<string>None</string>
<key>AutocorrectionType</key>
<string>No</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<false/>
<key>Key</key>
<string>username_preference</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<false/>
<key>KeyboardType</key>
<string>Alphabet</string>
<key>Title</key>
<string>User name</string>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
</dict>
<dict>
<key>AutocapitalizationType</key>
<string>None</string>
<key>AutocorrectionType</key>
<string>No</string>
</dict>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>Password</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<true/>
<key>Key</key>
<string>password_preference</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<true/>
<key>KeyboardType</key>
<string>Alphabet</string>
<key>Title</key>
<string>Password</string>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
</dict>
<dict>
<key>AutocapitalizationType</key>
<string>None</string>
<key>AutocorrectionType</key>
<string>No</string>
</dict>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>Domain</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<false/>
<key>Key</key>
<string>domain_preference</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<false/>
<key>KeyboardType</key>
<string>URL</string>
<key>AutocapitalizationType</key>
<string>None</string>
<key>AutocorrectionType</key>
<string>No</string>
</dict>
<dict>
<key>Title</key>
<string>Domain</string>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>Proxy</string>
<key>Key</key>
<string>proxy_preference</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<false/>
<key>KeyboardType</key>
<string>URL</string>
</dict>
<dict>
<key>AutocapitalizationType</key>
<string>None</string>
<key>AutocorrectionType</key>
<string>No</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<false/>
<key>Key</key>
<string>proxy_preference</string>
<key>KeyboardType</key>
<string>URL</string>
<key>Title</key>
<string>Proxy</string>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Outbound proxy</string>
<key>Key</key>
<string>outbound_proxy_preference</string>
<key>DefaultValue</key>
<false/>
<key>Key</key>
<string>outbound_proxy_preference</string>
<key>Title</key>
<string>Outbound proxy</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Codecs</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Speex 16Khz</string>
<key>Key</key>
<string>speex_16k_preference</string>
<key>DefaultValue</key>
<true/>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Speex 8Khz</string>
<key>Key</key>
<string>speex_8k_preference</string>
<key>DefaultValue</key>
<true/>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>GSM</string>
<key>Key</key>
<string>gsm_8k_preference</string>
<key>DefaultValue</key>
<true/>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>ILBC</string>
<key>Key</key>
<string>ilbc_preference</string>
<key>DefaultValue</key>
<true/>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>PCMU</string>
<key>Key</key>
<string>pcmu_preference</string>
<key>DefaultValue</key>
<true/>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>PCMA</string>
<key>Key</key>
<string>pcma_preference</string>
<key>DefaultValue</key>
<true/>
</dict>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
<key>Key</key>
<string>speex_16k_preference</string>
<key>Title</key>
<string>Speex 16Khz</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
<key>Key</key>
<string>speex_8k_preference</string>
<key>Title</key>
<string>Speex 8Khz</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
<key>Key</key>
<string>gsm_8k_preference</string>
<key>Title</key>
<string>GSM</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
<key>Key</key>
<string>ilbc_preference</string>
<key>Title</key>
<string>ILBC</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
<key>Key</key>
<string>pcmu_preference</string>
<key>Title</key>
<string>PCMU</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
<key>Key</key>
<string>pcma_preference</string>
<key>Title</key>
<string>PCMA</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>Title</key>
<string>Tunnel</string>
</dict>
@ -197,36 +193,59 @@
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Advanced</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Debug</string>
<key>DefaultValue</key>
<false/>
<key>Key</key>
<string>debugenable_preference</string>
<key>DefaultValue</key>
<false/>
<key>Title</key>
<string>Debug</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>Prefix</string>
<key>Key</key>
<string>prefix_preference</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<false/>
<key>KeyboardType</key>
<string>NumberPad</string>
<key>AutocapitalizationType</key>
<string>None</string>
<key>AutocorrectionType</key>
<string>No</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<false/>
<key>Key</key>
<string>prefix_preference</string>
<key>KeyboardType</key>
<string>NumberPad</string>
<key>Title</key>
<string>Prefix</string>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<false/>
<key>Key</key>
<string>substitute_+_by_00_preference</string>
<key>Title</key>
<string>Substitue + by 00</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<string>udp</string>
<key>Key</key>
<string>transport_preference</string>
<key>Title</key>
<string>Transport</string>
<key>Titles</key>
<array>
<string>udp</string>
<string>tcp</string>
</array>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>Values</key>
@ -234,28 +253,19 @@
<string>udp</string>
<string>tcp</string>
</array>
<key>Titles</key>
<array>
<string>udp</string>
<string>tcp</string>
</array>
<key>Title</key>
<string>Transport</string>
<key>Key</key>
<string>transport_preference</string>
<key>DefaultValue</key>
<string>udp</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Background mode</string>
<key>Key</key>
<string>backgroundmode_preference</string>
<key>DefaultValue</key>
<false/>
<key>Key</key>
<string>backgroundmode_preference</string>
<key>Title</key>
<string>Background mode</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
</array>
<key>StringsTable</key>
<string>Root</string>
</dict>
</plist>

View file

@ -80,6 +80,7 @@
22E0A824111C44E100B04932 /* ConsoleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E0A81F111C44E100B04932 /* ConsoleViewController.m */; };
22E19E1E1386AFB900FBFE87 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 22E19E1C1386AFB900FBFE87 /* Localizable.strings */; };
22E19E5A138A89F800FBFE87 /* missed_call.png in Resources */ = {isa = PBXBuildFile; fileRef = 22E19E59138A89F800FBFE87 /* missed_call.png */; };
22E5AF6F1393F01800E4B43D /* FastAddressBook.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E5AF6D1393F01800E4B43D /* FastAddressBook.m */; };
22F2508E107141E100AC9B3F /* PhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22F2508C107141E100AC9B3F /* PhoneViewController.m */; };
22F2508F107141E100AC9B3F /* PhoneViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22F2508D107141E100AC9B3F /* PhoneViewController.xib */; };
22F254811073D99800AC9B3F /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 22F254801073D99800AC9B3F /* ringback.wav */; };
@ -393,6 +394,8 @@
22E0A820111C44E100B04932 /* ConsoleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConsoleViewController.h; sourceTree = "<group>"; };
22E19E1D1386AFB900FBFE87 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = "<group>"; };
22E19E59138A89F800FBFE87 /* missed_call.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = missed_call.png; path = Resources/missed_call.png; sourceTree = "<group>"; };
22E5AF6D1393F01800E4B43D /* FastAddressBook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FastAddressBook.m; sourceTree = "<group>"; };
22E5AF6E1393F01800E4B43D /* FastAddressBook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FastAddressBook.h; sourceTree = "<group>"; };
22F2508B107141E100AC9B3F /* PhoneViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhoneViewController.h; sourceTree = "<group>"; };
22F2508C107141E100AC9B3F /* PhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhoneViewController.m; sourceTree = "<group>"; };
22F2508D107141E100AC9B3F /* PhoneViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PhoneViewController.xib; sourceTree = "<group>"; };
@ -673,6 +676,8 @@
2214EB7012F84668002A5394 /* LinphoneUI */ = {
isa = PBXGroup;
children = (
22E5AF6D1393F01800E4B43D /* FastAddressBook.m */,
22E5AF6E1393F01800E4B43D /* FastAddressBook.h */,
22BB1D3413322A58005CD7AA /* UIEraseButton.m */,
22BB1D3513322A58005CD7AA /* UIEraseButton.h */,
2248E90C12F7E4CF00220D9C /* UIDigitButton.h */,
@ -1032,6 +1037,7 @@
22C755601317E59C007BC101 /* UIBluetoothButton.m in Sources */,
22323037132A28AE00F10886 /* TunnelManager.cc in Sources */,
22BB1D3613322A58005CD7AA /* UIEraseButton.m in Sources */,
22E5AF6F1393F01800E4B43D /* FastAddressBook.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};