ios/iosremote/iosremote/Base64.h | 33 --- ios/iosremote/iosremote/Base64.m | 100 +-------- ios/iosremote/iosremote/Communication/Client.h | 6 ios/iosremote/iosremote/Communication/Client.m | 54 +++-- ios/iosremote/iosremote/Communication/CommandInterpreter.m | 6 ios/iosremote/iosremote/Communication/CommandTransmitter.m | 6 ios/iosremote/iosremote/Communication/CommunicationManager.h | 15 + ios/iosremote/iosremote/Communication/CommunicationManager.m | 102 ++++++++++ ios/iosremote/iosremote/Communication/Server.h | 2 ios/iosremote/iosremote/Communication/Server.m | 17 + ios/iosremote/iosremote/Communication/SlideShow.h | 5 ios/iosremote/iosremote/Communication/SlideShow.m | 22 +- ios/iosremote/iosremote/en.lproj/MainStoryboard_iPad.storyboard | 86 +++++++- ios/iosremote/iosremote/libreoffice_sdremoteViewController.m | 13 + ios/iosremote/iosremote/slideShowViewController.h | 6 ios/iosremote/iosremote/slideShowViewController.m | 24 ++ 16 files changed, 345 insertions(+), 152 deletions(-)
New commits: commit 651a96e3fde964164f80aa7c83af01168465aa2b Author: siqi <[email protected]> Date: Wed Jun 12 09:01:15 2013 +0200 multithreading in comManager diff --git a/ios/iosremote/iosremote/Communication/Client.h b/ios/iosremote/iosremote/Communication/Client.h index 94fe6c7..45f7e95 100644 --- a/ios/iosremote/iosremote/Communication/Client.h +++ b/ios/iosremote/iosremote/Communication/Client.h @@ -13,11 +13,13 @@ @interface Client : NSObject -@property BOOL ready; +@property BOOL connected; @property (nonatomic, strong) NSNumber* pin; @property (nonatomic, strong) NSString* name; +@property (nonatomic, weak) Server* server; --(void) connect; +- (BOOL) connect; +- (void) disconnect; - (id) initWithServer:(Server*)server managedBy:(CommunicationManager*)manager diff --git a/ios/iosremote/iosremote/Communication/Client.m b/ios/iosremote/iosremote/Communication/Client.m index 3b1f1b6..bfa7648 100644 --- a/ios/iosremote/iosremote/Communication/Client.m +++ b/ios/iosremote/iosremote/Communication/Client.m @@ -21,13 +21,12 @@ @property uint mPort; -@property (nonatomic, weak) Server* server; @property (nonatomic, weak) CommandInterpreter* receiver; @property (nonatomic, weak) CommunicationManager* comManager; @end - +NSCondition *connected; @implementation Client @@ -37,7 +36,7 @@ @synthesize name = _mName; @synthesize server = _mServer; @synthesize comManager = _mComManager; -@synthesize ready = _mReady; +@synthesize connected = _mReady; @synthesize receiver = _receiver; - (id) initWithServer:(Server*)server @@ -47,7 +46,8 @@ self = [self init]; if (self) { - self.ready = NO; + connected = [NSCondition new]; + self.connected = NO; self.name = [[UIDevice currentDevice] name]; self.pin = [NSNumber numberWithInteger:[self getPin]]; self.server = server; @@ -99,14 +99,6 @@ [self.outputStream setDelegate:self]; [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [self.outputStream open]; - - // NSLog(@"Stream opened %@ %@", @"iPad", self.mPin); - - NSArray *temp = [[NSArray alloc]initWithObjects:@"LO_SERVER_CLIENT_PAIR\n", self.name, @"\n", self.pin, @"\n\n", nil]; - - NSString *command = [temp componentsJoinedByString:@""]; - - [self sendCommand:command]; } } @@ -122,12 +114,22 @@ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { switch(eventCode) { - case NSStreamEventOpenCompleted: + case NSStreamEventOpenCompleted:{ NSLog(@"Connection established"); - self.ready = YES; + [connected lock]; + NSArray *temp = [[NSArray alloc]initWithObjects:@"LO_SERVER_CLIENT_PAIR\n", self.name, @"\n", self.pin, @"\n\n", nil]; + NSString *command = [temp componentsJoinedByString:@""]; + [self sendCommand:command]; + self.connected = YES; + [connected signal]; + [connected unlock]; + } + break; - case NSStreamEventErrorOccurred: + case NSStreamEventErrorOccurred:{ NSLog(@"Connection error occured"); + [self disconnect]; + } break; case NSStreamEventHasBytesAvailable: { @@ -153,7 +155,6 @@ } NSArray *commands = [str componentsSeparatedByString:@"\n"]; -// NSLog(@"Data Received: %@", commands); [self.receiver parse:commands]; data = nil; @@ -167,10 +168,29 @@ } } +- (void) disconnect +{ + if(self.inputStream == nil && self.outputStream == nil) + return; + [self.inputStream close]; + [self.outputStream close]; + self.inputStream = nil; + self.outputStream = nil; + self.connected = NO; +} -- (void) connect +- (BOOL) connect { [self streamOpenWithIp:self.server.serverAddress withPortNumber:self.mPort]; + [connected lock]; + if([connected waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]]){ + [connected unlock]; + return YES; + } else { + [self disconnect]; + [connected unlock]; + return NO; + } } diff --git a/ios/iosremote/iosremote/Communication/CommunicationManager.h b/ios/iosremote/iosremote/Communication/CommunicationManager.h index 93046a1..f64edb7 100644 --- a/ios/iosremote/iosremote/Communication/CommunicationManager.h +++ b/ios/iosremote/iosremote/Communication/CommunicationManager.h @@ -48,6 +48,7 @@ enum ConnectionState : NSInteger { CONNECTED }; +dispatch_queue_t backgroundQueue; @interface CommunicationManager : NSObject diff --git a/ios/iosremote/iosremote/Communication/CommunicationManager.m b/ios/iosremote/iosremote/Communication/CommunicationManager.m index a629886..fdd4ade 100644 --- a/ios/iosremote/iosremote/Communication/CommunicationManager.m +++ b/ios/iosremote/iosremote/Communication/CommunicationManager.m @@ -12,11 +12,13 @@ #import "Server.h" #import "CommandTransmitter.h" #import "CommandInterpreter.h" +#import <dispatch/dispatch.h> @interface CommunicationManager() @property (nonatomic, strong) Client* client; @property (nonatomic, strong) CommandInterpreter* interpreter; +@property (nonatomic, strong) CommandTransmitter* transmitter; @property (atomic, strong) NSMutableArray* servers; @end @@ -27,8 +29,11 @@ @synthesize client = _client; @synthesize state = _state; @synthesize interpreter = _interpreter; +@synthesize transmitter = _transmitter; @synthesize servers = _servers; +NSLock *connectionLock; + + (CommunicationManager *)sharedComManager { static CommunicationManager *sharedComManager = nil; @@ -46,13 +51,15 @@ { self = [super init]; self.state = DISCONNECTED; + connectionLock = [NSLock new]; + backgroundQueue = dispatch_queue_create("org.libreoffice.iosremote", NULL); return self; } - (id) initWithExistingServers { self = [self init]; - + NSUserDefaults * userDefaluts = [NSUserDefaults standardUserDefaults]; if(!userDefaluts) @@ -69,6 +76,39 @@ } } +- (void) connectToServer:(Server*)server +{ + dispatch_async(backgroundQueue, ^(void) { + if ([connectionLock tryLock]) { + self.state = CONNECTING; + [self.client disconnect]; + // initialise it with a given server + self.client = [[Client alloc]initWithServer:server managedBy:self interpretedBy:self.interpreter]; + if([self.client connect]){ + self.state = CONNECTED; + self.transmitter = [[CommandTransmitter alloc] initWithClient:self.client]; + } + else{ + // streams closing is handled by client itself in case of connection failure + self.state = DISCONNECTED; + } + [connectionLock unlock]; + } + else + // Already a threading working on that ... and that thread will unlock in 5 seconds anyway, so just return for now. + return; + }); +} + +- (NSNumber *) getPairingPin{ + return [self.client pin]; +} + +- (NSString *) getPairingDeviceName +{ + return [self.client name]; +} + + (id)allocWithZone:(NSZone *)zone { return [self sharedComManager]; diff --git a/ios/iosremote/iosremote/Communication/SlideShow.h b/ios/iosremote/iosremote/Communication/SlideShow.h index b43c810..7160100 100644 --- a/ios/iosremote/iosremote/Communication/SlideShow.h +++ b/ios/iosremote/iosremote/Communication/SlideShow.h @@ -8,11 +8,13 @@ #import <Foundation/Foundation.h> +#import "slideShowViewController.h" @interface SlideShow : NSObject @property uint size; @property uint currentSlide; +@property (nonatomic, weak) id delegate; - (void) putImage: (NSString *)img AtIndex: (uint) index; - (void) putNotes: (NSString *)notes AtIndex: (uint) index; diff --git a/ios/iosremote/iosremote/Communication/SlideShow.m b/ios/iosremote/iosremote/Communication/SlideShow.m index dfecb9f..7bd8c55 100644 --- a/ios/iosremote/iosremote/Communication/SlideShow.m +++ b/ios/iosremote/iosremote/Communication/SlideShow.m @@ -9,6 +9,7 @@ #import "SlideShow.h" #import "Base64.h" +#import "slideShowViewController.h" @interface SlideShow() @@ -21,6 +22,7 @@ @synthesize size = _size; @synthesize currentSlide = _currentSlide; +@synthesize delegate = _delegate; - (SlideShow *) init{ self = [super init]; @@ -35,12 +37,14 @@ NSData* data = [NSData dataWithBase64String:img]; UIImage* image = [UIImage imageWithData:data]; [self.imagesArray insertObject:image atIndex:index]; - [[NSNotificationCenter defaultCenter] postNotificationName:@"IMAGE_READY" object:nil]; + slideShowViewController* vc = [self delegate]; + [[vc image] setImage:image]; } - (void) putNotes: (NSString *)notes AtIndex: (uint) index{ [self.notesArray insertObject:notes atIndex:index]; - [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTE_READY" object:nil]; + slideShowViewController* vc = [self delegate]; + [[vc lecturer_notes] loadHTMLString:notes baseURL:nil]; } - (UIImage *) getImageAtIndex: (uint) index diff --git a/ios/iosremote/iosremote/libreoffice_sdremoteViewController.m b/ios/iosremote/iosremote/libreoffice_sdremoteViewController.m index 0f913db..a44eacb 100644 --- a/ios/iosremote/iosremote/libreoffice_sdremoteViewController.m +++ b/ios/iosremote/iosremote/libreoffice_sdremoteViewController.m @@ -49,6 +49,7 @@ if ([segue.identifier isEqualToString:@"slidesPreviewSegue"]) { slideShowViewController *destViewController = segue.destinationViewController; destViewController.slideshow = [self.interpreter slideShow]; + [destViewController.slideshow setDelegate:destViewController]; } } @@ -66,7 +67,7 @@ self.client = [[Client alloc] initWithServer:self.server managedBy:nil interpretedBy:self.interpreter]; [self.client connect]; - if([self.client ready]) + if([self.client connected]) { [self.pinLabel setText:[NSString stringWithFormat:@"%@", self.client.pin]]; } diff --git a/ios/iosremote/iosremote/slideShowViewController.m b/ios/iosremote/iosremote/slideShowViewController.m index d79cb28..9f9bf75 100644 --- a/ios/iosremote/iosremote/slideShowViewController.m +++ b/ios/iosremote/iosremote/slideShowViewController.m @@ -32,20 +32,20 @@ { [super viewDidLoad]; - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; - [self.image setImage:[self.slideshow getImageAtIndex:0]]; - [self.lecturer_notes loadHTMLString: [self.slideshow getNotesAtIndex:0]baseURL:nil]; - self.slideShowImageReadyObserver = [center addObserverForName:@"IMAGE_READY" object:nil - queue:mainQueue usingBlock:^(NSNotification *note) { - NSLog(@"Getting image to display: %@", [self.slideshow getImageAtIndex:0]); - [self.image setImage:[self.slideshow getImageAtIndex:0]]; - }]; - self.slideShowNoteReadyObserver = [center addObserverForName:@"NOTE_READY" object:nil - queue:mainQueue usingBlock:^(NSNotification *note) { - NSLog(@"Getting note to display: %@", [self.slideshow getNotesAtIndex:0]); - [self.lecturer_notes loadHTMLString: [self.slideshow getNotesAtIndex:0]baseURL:nil]; - }]; +// NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; +// NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; +// [self.image setImage:[self.slideshow getImageAtIndex:0]]; +// [self.lecturer_notes loadHTMLString: [self.slideshow getNotesAtIndex:0]baseURL:nil]; +// self.slideShowImageReadyObserver = [center addObserverForName:@"IMAGE_READY" object:nil +// queue:mainQueue usingBlock:^(NSNotification *note) { +// NSLog(@"Getting image to display: %@", [self.slideshow getImageAtIndex:0]); +// [self.image setImage:[self.slideshow getImageAtIndex:0]]; +// }]; +// self.slideShowNoteReadyObserver = [center addObserverForName:@"NOTE_READY" object:nil +// queue:mainQueue usingBlock:^(NSNotification *note) { +// NSLog(@"Getting note to display: %@", [self.slideshow getNotesAtIndex:0]); +// [self.lecturer_notes loadHTMLString: [self.slideshow getNotesAtIndex:0]baseURL:nil]; +// }] } commit 22e4465d8cbc7b8cbc29948705994284c84475a1 Author: siqi <[email protected]> Date: Tue Jun 11 22:44:00 2013 +0200 loading existing server lsit diff --git a/ios/iosremote/iosremote/Communication/CommunicationManager.h b/ios/iosremote/iosremote/Communication/CommunicationManager.h index 3612a50..93046a1 100644 --- a/ios/iosremote/iosremote/Communication/CommunicationManager.h +++ b/ios/iosremote/iosremote/Communication/CommunicationManager.h @@ -8,6 +8,9 @@ #import <Foundation/Foundation.h> +#import "Client.h" +#import "Server.h" +#import "CommandInterpreter.h" #define MSG_SLIDESHOW_STARTED @"SLIDESHOW_STARTED" #define MSG_SLIDE_CHANGED @"SLIDE_CHANGED" diff --git a/ios/iosremote/iosremote/Communication/CommunicationManager.m b/ios/iosremote/iosremote/Communication/CommunicationManager.m index 2be29fc..a629886 100644 --- a/ios/iosremote/iosremote/Communication/CommunicationManager.m +++ b/ios/iosremote/iosremote/Communication/CommunicationManager.m @@ -16,6 +16,8 @@ @interface CommunicationManager() @property (nonatomic, strong) Client* client; +@property (nonatomic, strong) CommandInterpreter* interpreter; +@property (atomic, strong) NSMutableArray* servers; @end @@ -24,6 +26,8 @@ @synthesize client = _client; @synthesize state = _state; +@synthesize interpreter = _interpreter; +@synthesize servers = _servers; + (CommunicationManager *)sharedComManager { @@ -45,6 +49,26 @@ return self; } +- (id) initWithExistingServers +{ + self = [self init]; + + NSUserDefaults * userDefaluts = [NSUserDefaults standardUserDefaults]; + + if(!userDefaluts) + NSLog(@"userDefaults nil"); + + NSData *dataRepresentingExistingServers = [userDefaluts objectForKey:@"ExistingServers"]; + if (dataRepresentingExistingServers != nil) + { + NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingExistingServers]; + if (oldSavedArray != nil) + self.servers = [[NSMutableArray alloc] initWithArray:oldSavedArray]; + else + self.servers = [[NSMutableArray alloc] init]; + } +} + + (id)allocWithZone:(NSZone *)zone { return [self sharedComManager]; diff --git a/ios/iosremote/iosremote/Communication/Server.h b/ios/iosremote/iosremote/Communication/Server.h index ceeff1f..0fb6c9d 100644 --- a/ios/iosremote/iosremote/Communication/Server.h +++ b/ios/iosremote/iosremote/Communication/Server.h @@ -10,7 +10,7 @@ typedef enum protocol {NETWORK} Protocol_t; -@interface Server : NSObject +@interface Server : NSObject <NSCoding> @property (nonatomic) Protocol_t protocol; @property (nonatomic, strong) NSString* serverName; diff --git a/ios/iosremote/iosremote/Communication/Server.m b/ios/iosremote/iosremote/Communication/Server.m index 08061ff..71547c7 100644 --- a/ios/iosremote/iosremote/Communication/Server.m +++ b/ios/iosremote/iosremote/Communication/Server.m @@ -16,11 +16,28 @@ @implementation Server + @synthesize protocol = _protocol; @synthesize serverName = _serverName; @synthesize serverAddress = _serverAddress; +- (void)encodeWithCoder:(NSCoder *)coder; +{ + [coder encodeObject:self.serverName forKey:@"name"]; + [coder encodeObject:self.serverAddress forKey:@"address"]; + [coder encodeInteger:self.protocol forKey:@"protocol"]; +} + +- (id)initWithCoder:(NSCoder *)coder; +{ + self = [self initWithProtocol:[coder decodeIntegerForKey:@"protocol"] + atAddress:[coder decodeObjectForKey:@"address"] + ofName:[coder decodeObjectForKey:@"name"]]; + return self; +} + + - (id)initWithProtocol:(Protocol_t)protocal atAddress:(NSString*) address ofName:(NSString*) name diff --git a/ios/iosremote/iosremote/Communication/SlideShow.m b/ios/iosremote/iosremote/Communication/SlideShow.m index 7cecc70..dfecb9f 100644 --- a/ios/iosremote/iosremote/Communication/SlideShow.m +++ b/ios/iosremote/iosremote/Communication/SlideShow.m @@ -35,7 +35,6 @@ NSData* data = [NSData dataWithBase64String:img]; UIImage* image = [UIImage imageWithData:data]; [self.imagesArray insertObject:image atIndex:index]; - [[NSNotificationCenter defaultCenter] postNotificationName:@"IMAGE_READY" object:nil]; } diff --git a/ios/iosremote/iosremote/slideShowViewController.m b/ios/iosremote/iosremote/slideShowViewController.m index f39bead..d79cb28 100644 --- a/ios/iosremote/iosremote/slideShowViewController.m +++ b/ios/iosremote/iosremote/slideShowViewController.m @@ -34,6 +34,8 @@ NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; + [self.image setImage:[self.slideshow getImageAtIndex:0]]; + [self.lecturer_notes loadHTMLString: [self.slideshow getNotesAtIndex:0]baseURL:nil]; self.slideShowImageReadyObserver = [center addObserverForName:@"IMAGE_READY" object:nil queue:mainQueue usingBlock:^(NSNotification *note) { NSLog(@"Getting image to display: %@", [self.slideshow getImageAtIndex:0]); commit 5705833197bceff4fc1be5bd179d8eff3225b386 Author: siqi <[email protected]> Date: Tue Jun 11 17:41:43 2013 +0200 slides preview works diff --git a/ios/iosremote/iosremote/Base64.h b/ios/iosremote/iosremote/Base64.h index f61160d..71c4070 100644 --- a/ios/iosremote/iosremote/Base64.h +++ b/ios/iosremote/iosremote/Base64.h @@ -1,29 +1,16 @@ -// -// Base64.h -// CryptTest -// -// Created by Kiichi Takeuchi on 4/20/10. -// Copyright 2010 ObjectGraph LLC. All rights reserved. -// -// Original Source Code is donated by Cyrus -// Public Domain License -// http://www.cocoadev.com/index.pl?BaseSixtyFour +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ #import <Foundation/Foundation.h> -@interface Base64 : NSObject { +@interface NSData (Base64) -} ++(id)dataWithBase64String:(NSString *)base64String; -+ (void) initialize; - -+ (NSString*) encode:(const uint8_t*) input length:(NSInteger) length; - -+ (NSString*) encode:(NSData*) rawBytes; - -+ (NSData*) decode:(const char*) string length:(NSInteger) inputLength; - -+ (NSData*) decode:(NSString*) string; - -@end +@end \ No newline at end of file diff --git a/ios/iosremote/iosremote/Base64.m b/ios/iosremote/iosremote/Base64.m index fc2a369..9b380eb 100644 --- a/ios/iosremote/iosremote/Base64.m +++ b/ios/iosremote/iosremote/Base64.m @@ -1,97 +1,23 @@ -// -// Base64.m -// CryptTest -// -// Created by Kiichi Takeuchi on 4/20/10. -// Copyright 2010 ObjectGraph LLC. All rights reserved. -// +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ #import "Base64.h" +@implementation NSData(Base64) -@implementation Base64 -#define ArrayLength(x) (sizeof(x)/sizeof(*(x))) - -static char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -static char decodingTable[128]; - -+ (void) initialize { - if (self == [Base64 class]) { - memset(decodingTable, 0, ArrayLength(decodingTable)); - for (NSInteger i = 0; i < ArrayLength(encodingTable); i++) { - decodingTable[encodingTable[i]] = i; - } - } -} - - -+ (NSString*) encode:(const uint8_t*) input length:(NSInteger) length { - NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4]; - uint8_t* output = (uint8_t*)data.mutableBytes; - - for (NSInteger i = 0; i < length; i += 3) { - NSInteger value = 0; - for (NSInteger j = i; j < (i + 3); j++) { - value <<= 8; - - if (j < length) { - value |= (0xFF & input[j]); - } - } - - NSInteger index = (i / 3) * 4; - output[index + 0] = encodingTable[(value >> 18) & 0x3F]; - output[index + 1] = encodingTable[(value >> 12) & 0x3F]; - output[index + 2] = (i + 1) < length ? encodingTable[(value >> 6) & 0x3F] : '='; - output[index + 3] = (i + 2) < length ? encodingTable[(value >> 0) & 0x3F] : '='; - } - - return [[NSString alloc] initWithData:data - encoding:NSASCIIStringEncoding]; -} - - -+ (NSString*) encode:(NSData*) rawBytes { - return [self encode:(const uint8_t*) rawBytes.bytes length:rawBytes.length]; -} - - -+ (NSData*) decode:(const char*) string length:(NSInteger) inputLength { - if ((string == NULL) || (inputLength % 4 != 0)) { ++ (id) dataWithBase64String:(NSString *)base64Encoding +{ + if ([base64Encoding length] % 4 != 0) return nil; - } - - while (inputLength > 0 && string[inputLength - 1] == '=') { - inputLength--; - } - NSInteger outputLength = inputLength * 3 / 4; - NSMutableData* data = [NSMutableData dataWithLength:outputLength]; - uint8_t* output = data.mutableBytes; - - NSInteger inputPoint = 0; - NSInteger outputPoint = 0; - while (inputPoint < inputLength) { - char i0 = string[inputPoint++]; - char i1 = string[inputPoint++]; - char i2 = inputPoint < inputLength ? string[inputPoint++] : 'A'; /* 'A' will decode to \0 */ - char i3 = inputPoint < inputLength ? string[inputPoint++] : 'A'; - - output[outputPoint++] = (decodingTable[i0] << 2) | (decodingTable[i1] >> 4); - if (outputPoint < outputLength) { - output[outputPoint++] = ((decodingTable[i1] & 0xf) << 4) | (decodingTable[i2] >> 2); - } - if (outputPoint < outputLength) { - output[outputPoint++] = ((decodingTable[i2] & 0x3) << 6) | decodingTable[i3]; - } - } - - return data; + NSString *plist = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><plist version=\"1.0\"><data>%@</data></plist>", base64Encoding]; + return [NSPropertyListSerialization propertyListWithData:[plist dataUsingEncoding:NSASCIIStringEncoding] options:0 format:NULL error:NULL]; } -+ (NSData*) decode:(NSString*) string { - return [self decode:[string cStringUsingEncoding:NSASCIIStringEncoding] length:string.length]; -} - @end diff --git a/ios/iosremote/iosremote/Communication/CommandInterpreter.m b/ios/iosremote/iosremote/Communication/CommandInterpreter.m index 05708e1..184633f 100644 --- a/ios/iosremote/iosremote/Communication/CommandInterpreter.m +++ b/ios/iosremote/iosremote/Communication/CommandInterpreter.m @@ -73,13 +73,11 @@ AtIndex:slideNumber]; [[NSNotificationCenter defaultCenter] postNotificationName:MSG_SLIDE_PREVIEW object:[NSNumber numberWithUnsignedInt:slideNumber]]; } else if ([instruction isEqualToString:@"slide_notes"]){ - NSLog(@"Interpreter: slide_notes"); uint slideNumber = [[command objectAtIndex:1] integerValue]; - NSString *notes; + NSMutableString *notes = [[NSMutableString alloc] init]; for (int i = 2; i<command.count; ++i) { - [notes stringByAppendingString:[command objectAtIndex:i]]; + [notes appendString:[command objectAtIndex:i]]; } - [self.slideShow putNotes:notes AtIndex:slideNumber]; [[NSNotificationCenter defaultCenter] postNotificationName:MSG_SLIDE_NOTES object: [NSNumber numberWithUnsignedInt:slideNumber]]; diff --git a/ios/iosremote/iosremote/Communication/CommandTransmitter.m b/ios/iosremote/iosremote/Communication/CommandTransmitter.m index 43c1361..ae7c12a 100644 --- a/ios/iosremote/iosremote/Communication/CommandTransmitter.m +++ b/ios/iosremote/iosremote/Communication/CommandTransmitter.m @@ -62,11 +62,11 @@ */ - (void) blankScreenWithColor:(UIColor*)color { - CGColorRef colorRef = color.CGColor; - NSString *colorString = [CIColor colorWithCGColor:colorRef].stringRepresentation; +// CGColorRef colorRef = color.CGColor; +// NSString *colorString = [CIColor colorWithCGColor:colorRef].stringRepresentation; // Need new server-end interface, since this is a platform dependent representation - [self.client sendCommand:[NSString stringWithFormat:@"presentation_blank_screen\n%@\n\n", colorString]]; +// [self.client sendCommand:[NSString stringWithFormat:@"presentation_blank_screen\n%@\n\n", colorString]]; } - (void) resume diff --git a/ios/iosremote/iosremote/Communication/CommunicationManager.h b/ios/iosremote/iosremote/Communication/CommunicationManager.h index 5f6de05..3612a50 100644 --- a/ios/iosremote/iosremote/Communication/CommunicationManager.h +++ b/ios/iosremote/iosremote/Communication/CommunicationManager.h @@ -36,7 +36,18 @@ #define STATUS_CONNECTION_FAILED @"STATUS_CONNECTION_FAILED" +typedef enum ConnectionState : NSInteger ConnectionState; + +enum ConnectionState : NSInteger { + DISCONNECTED, + SEARCHING, + CONNECTING, + CONNECTED +}; + @interface CommunicationManager : NSObject +@property ConnectionState state; + @end diff --git a/ios/iosremote/iosremote/Communication/CommunicationManager.m b/ios/iosremote/iosremote/Communication/CommunicationManager.m index d155a46..2be29fc 100644 --- a/ios/iosremote/iosremote/Communication/CommunicationManager.m +++ b/ios/iosremote/iosremote/Communication/CommunicationManager.m @@ -8,12 +8,50 @@ #import "CommunicationManager.h" +#import "Client.h" +#import "Server.h" +#import "CommandTransmitter.h" +#import "CommandInterpreter.h" @interface CommunicationManager() +@property (nonatomic, strong) Client* client; @end +// Singlton Pattern @implementation CommunicationManager +@synthesize client = _client; +@synthesize state = _state; + ++ (CommunicationManager *)sharedComManager +{ + static CommunicationManager *sharedComManager = nil; + + static dispatch_once_t _singletonPredicate; + + dispatch_once(&_singletonPredicate, ^{ + sharedComManager = [[super allocWithZone:nil] init]; + }); + + return sharedComManager; +} + +- (id) init +{ + self = [super init]; + self.state = DISCONNECTED; + return self; +} + ++ (id)allocWithZone:(NSZone *)zone +{ + return [self sharedComManager]; +} + + + + + @end diff --git a/ios/iosremote/iosremote/Communication/SlideShow.h b/ios/iosremote/iosremote/Communication/SlideShow.h index c2e30cc..b43c810 100644 --- a/ios/iosremote/iosremote/Communication/SlideShow.h +++ b/ios/iosremote/iosremote/Communication/SlideShow.h @@ -17,4 +17,7 @@ - (void) putImage: (NSString *)img AtIndex: (uint) index; - (void) putNotes: (NSString *)notes AtIndex: (uint) index; +- (UIImage *) getImageAtIndex: (uint) index; +- (NSString *) getNotesAtIndex: (uint) index; + @end diff --git a/ios/iosremote/iosremote/Communication/SlideShow.m b/ios/iosremote/iosremote/Communication/SlideShow.m index b2a4c08..7cecc70 100644 --- a/ios/iosremote/iosremote/Communication/SlideShow.m +++ b/ios/iosremote/iosremote/Communication/SlideShow.m @@ -24,21 +24,36 @@ - (SlideShow *) init{ self = [super init]; + self.imagesArray = [[NSMutableArray alloc] init]; + self.notesArray = [[NSMutableArray alloc] init]; _size = 0; _currentSlide = 0; return self; } - (void) putImage: (NSString *)img AtIndex: (uint) index{ - [Base64 initialize]; - NSData* data = [Base64 decode:img]; + NSData* data = [NSData dataWithBase64String:img]; UIImage* image = [UIImage imageWithData:data]; [self.imagesArray insertObject:image atIndex:index]; + + [[NSNotificationCenter defaultCenter] postNotificationName:@"IMAGE_READY" object:nil]; } - (void) putNotes: (NSString *)notes AtIndex: (uint) index{ [self.notesArray insertObject:notes atIndex:index]; + [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTE_READY" object:nil]; } +- (UIImage *) getImageAtIndex: (uint) index +{ + return [self.imagesArray objectAtIndex:index]; +} + +- (NSString *) getNotesAtIndex: (uint) index +{ + return [self.notesArray objectAtIndex:index]; +} + + @end diff --git a/ios/iosremote/iosremote/en.lproj/MainStoryboard_iPad.storyboard b/ios/iosremote/iosremote/en.lproj/MainStoryboard_iPad.storyboard index cb43691..4dc5762 100644 --- a/ios/iosremote/iosremote/en.lproj/MainStoryboard_iPad.storyboard +++ b/ios/iosremote/iosremote/en.lproj/MainStoryboard_iPad.storyboard @@ -12,7 +12,7 @@ <rect key="frame" x="0.0" y="64" width="768" height="960"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> - <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="192.168.1.97" borderStyle="roundedRect" minimumFontSize="17" id="9w1-Ym-HcF"> + <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="172.25.19.11" borderStyle="roundedRect" minimumFontSize="17" id="9w1-Ym-HcF"> <rect key="frame" x="234" y="402" width="301" height="30"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <fontDescription key="fontDescription" type="system" pointSize="14"/> @@ -38,30 +38,88 @@ <connections> <outlet property="ipAddressTextEdit" destination="9w1-Ym-HcF" id="hab-JH-3Lf"/> <outlet property="pinLabel" destination="Cg3-f5-zuM" id="HaU-jr-8oJ"/> - <segue destination="zdX-BL-bmY" kind="push" identifier="slidesPreview" id="9Yb-di-Q6v"/> + <segue destination="zdX-BL-bmY" kind="push" identifier="slidesPreviewSegue" id="9Yb-di-Q6v"/> </connections> </viewController> <placeholder placeholderIdentifier="IBFirstResponder" id="3" sceneMemberID="firstResponder"/> </objects> - <point key="canvasLocation" x="1618" y="-293"/> + <point key="canvasLocation" x="2766" y="-569"/> + </scene> + <!--Table View Controller--> + <scene sceneID="Whz-cu-Rds"> + <objects> + <tableViewController id="Q3M-g5-7cc" sceneMemberID="viewController"> + <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Wpt-pb-meU"> + <rect key="frame" x="0.0" y="20" width="768" height="1004"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + <prototypes> + <tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" textLabel="PmM-ch-mza" detailTextLabel="epJ-IU-4Ja" style="IBUITableViewCellStyleValue1" id="Jgt-j6-gHM"> + <rect key="frame" x="0.0" y="22" width="768" height="44"/> + <autoresizingMask key="autoresizingMask"/> + <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center"> + <rect key="frame" x="0.0" y="0.0" width="748" height="43"/> + <autoresizingMask key="autoresizingMask"/> + <subviews> + <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Servername" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="PmM-ch-mza"> + <rect key="frame" x="10" y="11" width="98" height="21"/> + <autoresizingMask key="autoresizingMask"/> + <fontDescription key="fontDescription" type="boldSystem" pointSize="17"/> + <color key="textColor" cocoaTouchSystemColor="darkTextColor"/> + <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/> + </label> + <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="IP Address" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="epJ-IU-4Ja"> + <rect key="frame" x="654" y="11" width="84" height="21"/> + <autoresizingMask key="autoresizingMask"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <color key="textColor" red="0.2196078431372549" green="0.32941176470588235" blue="0.52941176470588236" alpha="1" colorSpace="calibratedRGB"/> + <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/> + </label> + </subviews> + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> + </view> + </tableViewCell> + </prototypes> + <connections> + <outlet property="dataSource" destination="Q3M-g5-7cc" id="Ram-95-c0p"/> + <outlet property="delegate" destination="Q3M-g5-7cc" id="B8s-db-s0A"/> + </connections> + </tableView> + <navigationItem key="navigationItem" id="Jgb-PO-hv6"> + <barButtonItem key="rightBarButtonItem" title="Add new Server" id="OYa-b3-ARI"/> + </navigationItem> + <connections> + <segue destination="2" kind="push" id="e6A-u1-Kqr"/> + </connections> + </tableViewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="Nq5-gt-sEh" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="1640" y="-1071"/> </scene> <!--Navigation Controller--> <scene sceneID="00H-XM-3gJ"> <objects> - <navigationController id="KFV-Ae-zm8" sceneMemberID="viewController"> - <toolbarItems/> + <navigationController toolbarHidden="NO" id="KFV-Ae-zm8" sceneMemberID="viewController"> + <toolbarItems> + <barButtonItem title="Diconnect" id="U8F-bC-QHV"/> + </toolbarItems> + <simulatedToolbarMetrics key="simulatedBottomBarMetrics" barStyle="blackTranslucent"/> <navigationBar key="navigationBar" contentMode="scaleToFill" id="QnQ-yW-KgX"> <rect key="frame" x="0.0" y="0.0" width="768" height="44"/> <autoresizingMask key="autoresizingMask"/> </navigationBar> <nil name="viewControllers"/> + <toolbar key="toolbar" opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" barStyle="blackTranslucent" id="Eh6-CN-U8v"> + <rect key="frame" x="0.0" y="980" width="768" height="44"/> + <autoresizingMask key="autoresizingMask"/> + </toolbar> <connections> - <segue destination="2" kind="relationship" relationship="rootViewController" id="nce-OO-TOv"/> + <segue destination="2" kind="relationship" relationship="rootViewController" id="m46-Fm-sAa"/> </connections> </navigationController> <placeholder placeholderIdentifier="IBFirstResponder" id="sOJ-6b-jVh" userLabel="First Responder" sceneMemberID="firstResponder"/> </objects> - <point key="canvasLocation" x="721" y="-301"/> + <point key="canvasLocation" x="1666" y="89"/> </scene> <!--Slide Show View Controller--> <scene sceneID="wDH-NE-E5t"> @@ -72,21 +130,26 @@ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <subviews> <imageView userInteractionEnabled="NO" contentMode="scaleToFill" id="T6z-xu-j8h"> - <rect key="frame" x="0.0" y="0.0" width="768" height="960"/> + <rect key="frame" x="0.0" y="0.0" width="768" height="458"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> </imageView> + <webView contentMode="scaleToFill" id="y0E-Wp-yUc"> + <rect key="frame" x="20" y="492" width="728" height="378"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/> + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/> + </webView> </subviews> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> </view> <navigationItem key="navigationItem" id="uc0-p3-wnG"/> <connections> <outlet property="image" destination="T6z-xu-j8h" id="o1L-LM-TbP"/> - <outlet property="view" destination="T6z-xu-j8h" id="YKN-ib-gU3"/> + <outlet property="lecturer_notes" destination="y0E-Wp-yUc" id="qNC-Bc-jAZ"/> </connections> </viewController> <placeholder placeholderIdentifier="IBFirstResponder" id="Dqn-Ae-ABD" userLabel="First Responder" sceneMemberID="firstResponder"/> </objects> - <point key="canvasLocation" x="2616" y="-293"/> + <point key="canvasLocation" x="3804" y="-569"/> </scene> </scenes> <simulatedMetricsContainer key="defaultSimulatedMetrics"> @@ -94,4 +157,7 @@ <simulatedOrientationMetrics key="orientation"/> <simulatedScreenMetrics key="destination"/> </simulatedMetricsContainer> + <inferredMetricsTieBreakers> + <segue reference="m46-Fm-sAa"/> + </inferredMetricsTieBreakers> </document> \ No newline at end of file diff --git a/ios/iosremote/iosremote/libreoffice_sdremoteViewController.m b/ios/iosremote/iosremote/libreoffice_sdremoteViewController.m index 45e23ee..0f913db 100644 --- a/ios/iosremote/iosremote/libreoffice_sdremoteViewController.m +++ b/ios/iosremote/iosremote/libreoffice_sdremoteViewController.m @@ -10,6 +10,7 @@ #import "libreoffice_sdremoteViewController.h" #import "Server.h" #import "Client.h" +#import "slideShowViewController.h" @interface libreoffice_sdremoteViewController () @@ -39,11 +40,18 @@ self.slideShowPreviewStartObserver = [self.center addObserverForName:STATUS_CONNECTED_SLIDESHOW_RUNNING object:nil queue:mainQueue usingBlock:^(NSNotification *note) { NSLog(@"Received performSegue!"); - [self performSegueWithIdentifier:@"slidesPreview" sender:self]; + [self performSegueWithIdentifier:@"slidesPreviewSegue" sender:self]; }]; } +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + if ([segue.identifier isEqualToString:@"slidesPreviewSegue"]) { + slideShowViewController *destViewController = segue.destinationViewController; + destViewController.slideshow = [self.interpreter slideShow]; + } +} + - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; diff --git a/ios/iosremote/iosremote/slideShowViewController.h b/ios/iosremote/iosremote/slideShowViewController.h index f44b849..314bd12 100644 --- a/ios/iosremote/iosremote/slideShowViewController.h +++ b/ios/iosremote/iosremote/slideShowViewController.h @@ -7,9 +7,15 @@ // #import <UIKit/UIKit.h> +#import "SlideShow.h" @interface slideShowViewController : UIViewController @property (weak, nonatomic) IBOutlet UIImageView *image; +@property (weak, nonatomic) IBOutlet UIWebView *lecturer_notes; + +@property (nonatomic, strong) SlideShow *slideshow; +@property (nonatomic, strong) id slideShowImageReadyObserver; +@property (nonatomic, strong) id slideShowNoteReadyObserver; @end diff --git a/ios/iosremote/iosremote/slideShowViewController.m b/ios/iosremote/iosremote/slideShowViewController.m index cd04f39..f39bead 100644 --- a/ios/iosremote/iosremote/slideShowViewController.m +++ b/ios/iosremote/iosremote/slideShowViewController.m @@ -7,6 +7,7 @@ // #import "slideShowViewController.h" +#import "SlideShow.h" @interface slideShowViewController () @@ -14,6 +15,10 @@ @implementation slideShowViewController +@synthesize slideshow = _slideshow; +@synthesize slideShowImageReadyObserver = _slideShowImageReadyObserver; +@synthesize slideShowNoteReadyObserver = _slideShowNoteReadyObserver; + - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; @@ -26,9 +31,23 @@ - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view. + + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; + self.slideShowImageReadyObserver = [center addObserverForName:@"IMAGE_READY" object:nil + queue:mainQueue usingBlock:^(NSNotification *note) { + NSLog(@"Getting image to display: %@", [self.slideshow getImageAtIndex:0]); + [self.image setImage:[self.slideshow getImageAtIndex:0]]; + }]; + self.slideShowNoteReadyObserver = [center addObserverForName:@"NOTE_READY" object:nil + queue:mainQueue usingBlock:^(NSNotification *note) { + NSLog(@"Getting note to display: %@", [self.slideshow getNotesAtIndex:0]); + [self.lecturer_notes loadHTMLString: [self.slideshow getNotesAtIndex:0]baseURL:nil]; + }]; } + + - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; @@ -37,6 +56,7 @@ - (void)viewDidUnload { [self setImage:nil]; + [self setLecturer_notes:nil]; [super viewDidUnload]; } @end _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
