Home | History | Annotate | Download | only in objctests
      1 /*
      2  * libjingle
      3  * Copyright 2013 Google Inc.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are met:
      7  *
      8  *  1. Redistributions of source code must retain the above copyright notice,
      9  *     this list of conditions and the following disclaimer.
     10  *  2. Redistributions in binary form must reproduce the above copyright notice,
     11  *     this list of conditions and the following disclaimer in the documentation
     12  *     and/or other materials provided with the distribution.
     13  *  3. The name of the author may not be used to endorse or promote products
     14  *     derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #if !defined(__has_feature) || !__has_feature(objc_arc)
     29 #error "This file requires ARC support."
     30 #endif
     31 
     32 #import "RTCSessionDescriptionSyncObserver.h"
     33 
     34 #import "RTCSessionDescription.h"
     35 
     36 @interface RTCSessionDescriptionSyncObserver ()
     37 
     38 // CondVar used to wait for, and signal arrival of, an SDP-related callback.
     39 @property(nonatomic, strong) NSCondition* condition;
     40 // Whether an SDP-related callback has fired; cleared before wait returns.
     41 @property(atomic, assign) BOOL signaled;
     42 
     43 @end
     44 
     45 @implementation RTCSessionDescriptionSyncObserver
     46 
     47 @synthesize error = _error;
     48 @synthesize sessionDescription = _sessionDescription;
     49 @synthesize success = _success;
     50 @synthesize condition = _condition;
     51 @synthesize signaled = _signaled;
     52 
     53 - (id)init {
     54   if ((self = [super init])) {
     55     if (!(_condition = [[NSCondition alloc] init]))
     56       self = nil;
     57   }
     58   return self;
     59 }
     60 
     61 - (void)signal {
     62   self.signaled = YES;
     63   [self.condition signal];
     64 }
     65 
     66 - (void)wait {
     67   [self.condition lock];
     68   if (!self.signaled)
     69     [self.condition wait];
     70   self.signaled = NO;
     71   [self.condition unlock];
     72 }
     73 
     74 #pragma mark - RTCSessionDescriptionDelegate methods
     75 - (void)peerConnection:(RTCPeerConnection*)peerConnection
     76     didCreateSessionDescription:(RTCSessionDescription*)sdp
     77                           error:(NSError*)error {
     78   [self.condition lock];
     79   if (error) {
     80     self.success = NO;
     81     self.error = error.description;
     82   } else {
     83     self.success = YES;
     84     self.sessionDescription = sdp;
     85   }
     86   [self signal];
     87   [self.condition unlock];
     88 }
     89 
     90 - (void)peerConnection:(RTCPeerConnection*)peerConnection
     91     didSetSessionDescriptionWithError:(NSError*)error {
     92   [self.condition lock];
     93   if (error) {
     94     self.success = NO;
     95     self.error = error.description;
     96   } else {
     97     self.success = YES;
     98   }
     99   [self signal];
    100   [self.condition unlock];
    101 }
    102 
    103 @end
    104