/*
 *  Copyright 2015 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#import "RTCDataChannelConfiguration+Private.h"

#import "helpers/NSString+StdString.h"

@implementation RTC_OBJC_TYPE (RTCDataChannelConfiguration)

@synthesize nativeDataChannelInit = _nativeDataChannelInit;

- (BOOL)isOrdered {
  return _nativeDataChannelInit.ordered;
}

- (void)setIsOrdered:(BOOL)isOrdered {
  _nativeDataChannelInit.ordered = isOrdered;
}

- (NSInteger)maxRetransmitTimeMs {
  return self.maxPacketLifeTime;
}

- (void)setMaxRetransmitTimeMs:(NSInteger)maxRetransmitTimeMs {
  self.maxPacketLifeTime = maxRetransmitTimeMs;
}

- (int)maxPacketLifeTime {
  return *_nativeDataChannelInit.maxRetransmitTime;
}

- (void)setMaxPacketLifeTime:(int)maxPacketLifeTime {
  _nativeDataChannelInit.maxRetransmitTime = maxPacketLifeTime;
}

- (int)maxRetransmits {
  if (_nativeDataChannelInit.maxRetransmits) {
    return *_nativeDataChannelInit.maxRetransmits;
  } else {
    return -1;
  }
}

- (void)setMaxRetransmits:(int)maxRetransmits {
  _nativeDataChannelInit.maxRetransmits = maxRetransmits;
}

- (NSString *)protocol {
  return [NSString stringForStdString:_nativeDataChannelInit.protocol];
}

- (void)setProtocol:(NSString *)protocol {
  _nativeDataChannelInit.protocol = [NSString stdStringForString:protocol];
}

- (BOOL)isNegotiated {
  return _nativeDataChannelInit.negotiated;
}

- (void)setIsNegotiated:(BOOL)isNegotiated {
  _nativeDataChannelInit.negotiated = isNegotiated;
}

- (int)streamId {
  return self.channelId;
}

- (void)setStreamId:(int)streamId {
  self.channelId = streamId;
}

- (int)channelId {
  return _nativeDataChannelInit.id;
}

- (void)setChannelId:(int)channelId {
  _nativeDataChannelInit.id = channelId;
}

@end
