summaryrefslogtreecommitdiff
path: root/ios
diff options
context:
space:
mode:
authorSiqi LIU <me@siqi.fr>2013-07-19 18:58:42 +0200
committerSiqi LIU <me@siqi.fr>2013-07-19 18:59:03 +0200
commit793f19d17111af6b79713f98a1e841d6e132248f (patch)
treec0776ff986e7b28aea318423baac8244e38d45ec /ios
parentb5e915acd523fa0d2ebbd6629e96b61975de59c0 (diff)
bonjour autodiscovery for mac osx, let me know if it crashes on other build
Change-Id: Ibbaa7b583aaf48b28a913dfd8c12742b76c31d82
Diffstat (limited to 'ios')
-rw-r--r--ios/iosremote/iosremote/Communication/Client.m2
-rw-r--r--ios/iosremote/iosremote/Communication/CommunicationManager.h1
-rw-r--r--ios/iosremote/iosremote/Communication/CommunicationManager.m3
-rw-r--r--ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard74
-rw-r--r--ios/iosremote/iosremote/serverList_vc.m219
5 files changed, 278 insertions, 21 deletions
diff --git a/ios/iosremote/iosremote/Communication/Client.m b/ios/iosremote/iosremote/Communication/Client.m
index 4ad51f8b5ab0..417b4188e7be 100644
--- a/ios/iosremote/iosremote/Communication/Client.m
+++ b/ios/iosremote/iosremote/Communication/Client.m
@@ -202,8 +202,6 @@ int count = 0;
}
}
}
- // NSLog(@"Command:%@", str);
-
backgroundQueue = dispatch_queue_create("com.libreoffice.iosremote", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(backgroundQueue, ^(void) {
NSArray *commands = [str componentsSeparatedByString:@"\n"];
diff --git a/ios/iosremote/iosremote/Communication/CommunicationManager.h b/ios/iosremote/iosremote/Communication/CommunicationManager.h
index d4a1f75dd05d..af7b6c078253 100644
--- a/ios/iosremote/iosremote/Communication/CommunicationManager.h
+++ b/ios/iosremote/iosremote/Communication/CommunicationManager.h
@@ -72,6 +72,7 @@ enum ConnectionState : NSInteger {
@property ConnectionState state;
@property (nonatomic, strong) id delegate;
@property (atomic, strong) NSMutableArray* servers;
+@property (atomic, strong) NSMutableArray* autoDiscoveryServers;
@property (nonatomic, strong) Client* client;
@property (nonatomic, strong) CommandInterpreter* interpreter;
@property (nonatomic, strong) CommandTransmitter* transmitter;
diff --git a/ios/iosremote/iosremote/Communication/CommunicationManager.m b/ios/iosremote/iosremote/Communication/CommunicationManager.m
index 199f69c93c0e..c2c0332817c7 100644
--- a/ios/iosremote/iosremote/Communication/CommunicationManager.m
+++ b/ios/iosremote/iosremote/Communication/CommunicationManager.m
@@ -30,6 +30,7 @@
@synthesize transmitter = _transmitter;
@synthesize servers = _servers;
@synthesize delegate = _delegate;
+@synthesize autoDiscoveryServers = _autoDiscoveryServers;
+ (CommunicationManager *)sharedComManager
{
@@ -116,7 +117,7 @@
selector: @selector(connectionStatusHandler:)
name: @"connection.status.disconnected"
object: nil];
-
+ self.autoDiscoveryServers = [[NSMutableArray alloc] init];
return self;
}
diff --git a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard
index 5a17393de83b..e03f4bf84a31 100644
--- a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard
+++ b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard
@@ -8,15 +8,15 @@
<scene sceneID="5">
<objects>
<viewController id="2" customClass="server_list_vc" sceneMemberID="viewController">
- <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" showsSelectionImmediatelyOnTouchBegin="NO" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="naQ-T4-jWV">
+ <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="singleLineEtched" showsSelectionImmediatelyOnTouchBegin="NO" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="naQ-T4-jWV">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
- <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="server_item_cell" editingAccessoryType="disclosureIndicator" textLabel="Rg3-PU-OuS" detailTextLabel="9Mc-gD-acc" style="IBUITableViewCellStyleValue1" id="Pvl-Uw-Ghs">
- <rect key="frame" x="0.0" y="22" width="320" height="44"/>
+ <rect key="frame" x="0.0" y="46" width="320" height="46"/>
<autoresizingMask key="autoresizingMask"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
+ <rect key="frame" x="10" y="1" width="300" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Rg3-PU-OuS">
@@ -26,7 +26,7 @@
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Detail" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="9Mc-gD-acc">
- <rect key="frame" x="266" y="11" width="44" height="21"/>
+ <rect key="frame" x="246" y="11" width="44" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.21960784310000001" green="0.3294117647" blue="0.52941176469999995" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
@@ -555,13 +555,75 @@
<image name="timer_clear_btn.png" width="74" height="74"/>
<image name="timer_start_btn.png" width="74" height="74"/>
</resources>
+ <classes>
+ <class className="EditableTableViewCell" superclassName="UITableViewCell">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/EditableTableViewCell.h"/>
+ </class>
+ <class className="SWRevealViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/SWRevealViewController.h"/>
+ </class>
+ <class className="newServerViewController" superclassName="UITableViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/newServerViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="save:"/>
+ </relationships>
+ </class>
+ <class className="pinValidation_vc" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/pinValidation_vc.h"/>
+ <relationships>
+ <relationship kind="outlet" name="pinLabel" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="statusLabel" candidateClass="UILabel"/>
+ </relationships>
+ </class>
+ <class className="server_list_vc" superclassName="UITableViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/server_list_vc.h"/>
+ <relationships>
+ <relationship kind="outlet" name="serverTable" candidateClass="UITableView"/>
+ </relationships>
+ </class>
+ <class className="slideShowPreviewTable_vc" superclassName="UITableViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/slideShowPreviewTable_vc.h"/>
+ <relationships>
+ <relationship kind="action" name="startPresentationAction:"/>
+ <relationship kind="outlet" name="optionsTable" candidateClass="UITableView"/>
+ </relationships>
+ </class>
+ <class className="slideShowSwipeInList" superclassName="UITableViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/slideShowSwipeInList.h"/>
+ <relationships>
+ <relationship kind="action" name="stopWatchClear:"/>
+ <relationship kind="action" name="stopWatchStart:"/>
+ </relationships>
+ </class>
+ <class className="slideShow_vc" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/slideShow_vc.h"/>
+ <relationships>
+ <relationship kind="action" name="accPointerAction:"/>
+ <relationship kind="action" name="nextSlideAction:"/>
+ <relationship kind="action" name="pointerAction:"/>
+ <relationship kind="action" name="previousSlideAction:"/>
+ <relationship kind="outlet" name="blockingView" candidateClass="UIView"/>
+ <relationship kind="outlet" name="bottomView" candidateClass="UIView"/>
+ <relationship kind="outlet" name="lecturer_notes" candidateClass="UIWebView"/>
+ <relationship kind="outlet" name="movingPointer" candidateClass="UIView"/>
+ <relationship kind="outlet" name="notesView" candidateClass="UIView"/>
+ <relationship kind="outlet" name="pointerBtn" candidateClass="UIButton"/>
+ <relationship kind="outlet" name="revealButtonItem" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="secondarySlideView" candidateClass="UIImageView"/>
+ <relationship kind="outlet" name="slideNumber" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="slideView" candidateClass="UIImageView"/>
+ <relationship kind="outlet" name="touchPointerImage" candidateClass="UIImageView"/>
+ <relationship kind="outlet" name="touchPointerScrollView" candidateClass="UIScrollView"/>
+ </relationships>
+ </class>
+ </classes>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
<inferredMetricsTieBreakers>
- <segue reference="pTl-ua-9pr"/>
<segue reference="eIY-4P-1sI"/>
+ <segue reference="EWS-Nn-mQc"/>
</inferredMetricsTieBreakers>
</document> \ No newline at end of file
diff --git a/ios/iosremote/iosremote/serverList_vc.m b/ios/iosremote/iosremote/serverList_vc.m
index 5d26463a9d49..28ebba7fe6f1 100644
--- a/ios/iosremote/iosremote/serverList_vc.m
+++ b/ios/iosremote/iosremote/serverList_vc.m
@@ -12,7 +12,11 @@
#import "Server.h"
#import "Client.h"
-@interface server_list_vc ()
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+@interface server_list_vc () <NSNetServiceBrowserDelegate, NSNetServiceDelegate>
@property (nonatomic, strong) CommunicationManager *comManager;
@property (nonatomic, weak) NSNotificationCenter* center;
@@ -20,6 +24,7 @@
@property (nonatomic, strong) id pinValidationObserver;
@property (atomic, strong) NSIndexPath *lastSpinningCellIndex;
+@property (nonatomic, strong) NSNetServiceBrowser *serviceBrowser;
@end
@implementation server_list_vc
@@ -29,6 +34,83 @@
@synthesize lastSpinningCellIndex = _lastSpinningCellIndex;
@synthesize slideShowPreviewStartObserver = _slideShowPreviewStartObserver;
@synthesize pinValidationObserver = _pinValidationObserver;
+@synthesize serviceBrowser = _serviceBrowser;
+
+#pragma mark - netservice resolve delegate
+-(void) netServiceDidResolveAddress:(NSNetService *)sender
+{
+ if ([sender.addresses count]){
+ NSData * address = [[sender addresses] objectAtIndex: 0];
+ struct sockaddr_in *socketAddress = (struct sockaddr_in *) [address bytes];
+ NSString * ipString = [NSString stringWithFormat: @"%s",inet_ntoa(socketAddress->sin_addr)];
+ int port = socketAddress->sin_port;
+ NSLog(@"Resolved at %@:%u", ipString, port);
+
+ [self.comManager.autoDiscoveryServers replaceObjectAtIndex:[self.comManager.autoDiscoveryServers count]-1
+ withObject:[[Server alloc] initWithProtocol:NETWORK atAddress:ipString ofName:sender.name]];
+ [self.tableView reloadData];
+ }
+}
+
+-(void) netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict
+{
+ NSLog(@"Failed to resolve");
+}
+
+#pragma mark - bonjour service discovery
+
+-(void) netServiceBrowserWillSearch:(NSNetServiceBrowser *)aNetServiceBrowser
+{
+ NSLog(@"Will search");
+ UITableViewCell * cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
+ [(UIActivityIndicatorView *)[cell viewWithTag:5] startAnimating];
+}
+
+-(void) netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)aNetServiceBrowser
+{
+ NSLog(@"End search");
+ UITableViewCell * cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
+ [(UIActivityIndicatorView *)[cell viewWithTag:5] stopAnimating];
+}
+
+- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didNotSearch:(NSDictionary *)errorDict
+{
+ NSLog(@"search error");
+ UITableViewCell * cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
+ [(UIActivityIndicatorView *)[cell viewWithTag:5] stopAnimating];
+}
+
+- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser
+ didFindService:(NSNetService *)aNetService
+ moreComing:(BOOL)moreComing
+{
+ [self.comManager.autoDiscoveryServers addObject:aNetService];
+
+ NSLog(@"Got service %p with hostname %@\n", aNetService,
+ [aNetService name]);
+ [aNetService resolveWithTimeout:0.0];
+
+ [aNetService setDelegate:self];
+
+ if(!moreComing)
+ {
+ UITableViewCell * cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
+ [(UIActivityIndicatorView *)[cell viewWithTag:5] stopAnimating];
+ }
+}
+
+// Sent when a service disappears
+- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
+ didRemoveService:(NSNetService *)aNetService
+ moreComing:(BOOL)moreComing
+{
+ [self.comManager.autoDiscoveryServers removeObject:aNetService];
+
+ if(!moreComing)
+ {
+ [self.tableView reloadData];
+ }
+}
- (id)initWithStyle:(UITableViewStyle)style
{
@@ -48,7 +130,6 @@
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
-// self.lastSpinningCellIndex = [[NSIndexPath alloc] init];
self.center = [NSNotificationCenter defaultCenter];
self.comManager = [CommunicationManager sharedComManager];
self.serverTable.dataSource = self;
@@ -77,6 +158,13 @@
[self performSegueWithIdentifier:@"SlideShowPreview" sender:self ];
}];
[super viewDidAppear:animated];
+
+ NSLog(@"Clear auto discovered servers");
+ [self.comManager.autoDiscoveryServers removeAllObjects];
+ self.serviceBrowser = [[NSNetServiceBrowser alloc] init];
+ [self.serviceBrowser setDelegate:self];
+ [self.serviceBrowser searchForServicesOfType:@"_impressRemote._tcp" inDomain:@"local"];
+ [self.serviceBrowser scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void) viewWillDisappear:(BOOL)animated
@@ -122,6 +210,11 @@
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
+
+ if ([cell.detailTextLabel.text isEqualToString:@""]) {
+ [tableView deselectRowAtIndexPath:indexPath animated:YES];
+ return;
+ }
if(self.comManager.state!=CONNECTING){
self.lastSpinningCellIndex = indexPath;
@@ -130,8 +223,14 @@
[cell setAccessoryView:activityView];
}
- NSLog(@"Connecting to %@:%@", [[self.comManager.servers objectAtIndex:indexPath.row] serverName], [[self.comManager.servers objectAtIndex:indexPath.row] serverAddress]);
- [self.comManager connectToServer:[self.comManager.servers objectAtIndex:indexPath.row]];
+ if (indexPath.section == 1){
+ NSLog(@"Connecting to %@:%@", [[self.comManager.servers objectAtIndex:indexPath.row] serverName], [[self.comManager.servers objectAtIndex:indexPath.row] serverAddress]);
+ [self.comManager connectToServer:[self.comManager.servers objectAtIndex:indexPath.row]];
+ } else if (indexPath.section == 0){
+ NSLog(@"Connecting to %@:%@", [[self.comManager.servers objectAtIndex:indexPath.row] serverName], [[self.comManager.autoDiscoveryServers objectAtIndex:indexPath.row] serverAddress]);
+ [self.comManager connectToServer:[self.comManager.autoDiscoveryServers objectAtIndex:indexPath.row]];
+ }
+
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
@@ -140,29 +239,125 @@
[super viewDidUnload];
}
+- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
+
+ NSString *sectionName = nil;
+
+ switch (section) {
+ case 0:
+ sectionName = [NSString stringWithFormat:@"Visible computers"];
+ break;
+ case 1:
+ sectionName = [NSString stringWithFormat:@"Manual computers"];
+ break;
+ }
+
+ UILabel *sectionHeader = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 200, 40)];
+ sectionHeader.backgroundColor = [UIColor clearColor];
+ sectionHeader.font = [UIFont boldSystemFontOfSize:18];
+ sectionHeader.textColor = [UIColor darkTextColor];
+ sectionHeader.text = sectionName;
+
+ UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, [self tableView:tableView heightForHeaderInSection:section])];
+ [view addSubview:sectionHeader];
+
+ return view;
+}
+
+- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
+ if ([self.comManager.servers count] == 0 && section == 1) {
+ UILabel *sectionFooter = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, tableView.frame.size.width - 50, 40)];
+ [sectionFooter setLineBreakMode:NSLineBreakByCharWrapping];
+ [sectionFooter setNumberOfLines:5];
+ sectionFooter.backgroundColor = [UIColor clearColor];
+ sectionFooter.font = [UIFont systemFontOfSize:14];
+ sectionFooter.textColor = [UIColor colorWithRed:0.22 green:0.33 blue:0.53 alpha:1.0];
+ sectionFooter.text = @"Please manually add a computer with its IP address.";
+
+ UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, [self tableView:tableView heightForHeaderInSection:section])];
+ [view addSubview:sectionFooter];
+ return view;
+ }
+ return nil;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
+{
+ return 50.0;
+}
+
+-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
+{
+ return 2;
+}
+
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
- return [self.comManager.servers count];
+ switch (section) {
+ case 0:
+ return [self.comManager.autoDiscoveryServers count] == 0 ? 1 : [self.comManager.autoDiscoveryServers count];
+ break;
+ case 1:
+ return [self.comManager.servers count];
+ default:
+ return -1;
+ break;
+ }
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"server_item_cell";
-
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
- Server *s = [self.comManager.servers objectAtIndex:indexPath.row];
-
- [cell.textLabel setText:[s serverName]];
- [cell.detailTextLabel setText:[s serverAddress]];
+ if (indexPath.section == 0){
+ if ([self.comManager.autoDiscoveryServers count] == 0){
+ // Looking for one
+ UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
+ int vCenter = [cell frame].size.height / 2;
+ int hCenter = [cell frame].size.width / 2;
+
+ int SPINNER_SIZE = spinner.frame.size.width;
+ [spinner setFrame:CGRectMake(hCenter - SPINNER_SIZE, vCenter - SPINNER_SIZE/2, SPINNER_SIZE, SPINNER_SIZE)];
+ [[cell contentView] addSubview:spinner];
+
+ [spinner setTag:5];
+
+ cell.textLabel.text = @"";
+ cell.detailTextLabel.text = @"";
+ } else {
+ id s = [self.comManager.autoDiscoveryServers objectAtIndex:indexPath.row];
+
+ if ([s isKindOfClass:[Server class]]) {
+ [cell.textLabel setText:[s serverName]];
+ [cell.detailTextLabel setText:[s serverAddress]];
+ } else if ([s isKindOfClass:[NSNetService class]]){
+ [cell.textLabel setText:[s name]];
+ [cell.detailTextLabel setText:@"loading..."];
+ }
+ }
+ }
+ else {
+ Server *s = [self.comManager.servers objectAtIndex:indexPath.row];
+
+ [cell.textLabel setText:[s serverName]];
+ [cell.detailTextLabel setText:[s serverAddress]];
+ }
return cell;
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
- return YES;
+ if (indexPath.section == 1)
+ return YES;
+ else
+ return NO;
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
- return UITableViewCellEditingStyleDelete;
+ if (indexPath.section == 1) {
+ return UITableViewCellEditingStyleDelete;
+ } else {
+ return UITableViewCellEditingStyleNone;
+ }
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{