1// Protocol Buffers - Google's data interchange format 2// Copyright 2015 Google Inc. All rights reserved. 3// https://developers.google.com/protocol-buffers/ 4// 5// Redistribution and use in source and binary forms, with or without 6// modification, are permitted provided that the following conditions are 7// met: 8// 9// * Redistributions of source code must retain the above copyright 10// notice, this list of conditions and the following disclaimer. 11// * Redistributions in binary form must reproduce the above 12// copyright notice, this list of conditions and the following disclaimer 13// in the documentation and/or other materials provided with the 14// distribution. 15// * Neither the name of Google Inc. nor the names of its 16// contributors may be used to endorse or promote products derived from 17// this software without specific prior written permission. 18// 19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31// Importing sources here to force the linker to include our category methods in 32// the static library. If these were compiled separately, the category methods 33// below would be stripped by the linker. 34 35#import "GPBWellKnownTypes.h" 36 37static NSTimeInterval TimeIntervalSince1970FromSecondsAndNanos(int64_t seconds, 38 int32_t nanos) { 39 return seconds + (NSTimeInterval)nanos / 1e9; 40} 41 42static int32_t SecondsAndNanosFromTimeIntervalSince1970(NSTimeInterval time, 43 int64_t *outSeconds) { 44 NSTimeInterval seconds; 45 NSTimeInterval nanos = modf(time, &seconds); 46 nanos *= 1e9; 47 *outSeconds = (int64_t)seconds; 48 return (int32_t)nanos; 49} 50 51@implementation GPBTimestamp (GBPWellKnownTypes) 52 53- (instancetype)initWithDate:(NSDate *)date { 54 return [self initWithTimeIntervalSince1970:date.timeIntervalSince1970]; 55} 56 57- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970 { 58 if ((self = [super init])) { 59 int64_t seconds; 60 int32_t nanos = SecondsAndNanosFromTimeIntervalSince1970( 61 timeIntervalSince1970, &seconds); 62 self.seconds = seconds; 63 self.nanos = nanos; 64 } 65 return self; 66} 67 68- (NSDate *)date { 69 return [NSDate dateWithTimeIntervalSince1970:self.timeIntervalSince1970]; 70} 71 72- (void)setDate:(NSDate *)date { 73 self.timeIntervalSince1970 = date.timeIntervalSince1970; 74} 75 76- (NSTimeInterval)timeIntervalSince1970 { 77 return TimeIntervalSince1970FromSecondsAndNanos(self.seconds, self.nanos); 78} 79 80- (void)setTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970 { 81 int64_t seconds; 82 int32_t nanos = 83 SecondsAndNanosFromTimeIntervalSince1970(timeIntervalSince1970, &seconds); 84 self.seconds = seconds; 85 self.nanos = nanos; 86} 87 88@end 89 90@implementation GPBDuration (GBPWellKnownTypes) 91 92- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970 { 93 if ((self = [super init])) { 94 int64_t seconds; 95 int32_t nanos = SecondsAndNanosFromTimeIntervalSince1970( 96 timeIntervalSince1970, &seconds); 97 self.seconds = seconds; 98 self.nanos = nanos; 99 } 100 return self; 101} 102 103- (NSTimeInterval)timeIntervalSince1970 { 104 return TimeIntervalSince1970FromSecondsAndNanos(self.seconds, self.nanos); 105} 106 107- (void)setTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970 { 108 int64_t seconds; 109 int32_t nanos = 110 SecondsAndNanosFromTimeIntervalSince1970(timeIntervalSince1970, &seconds); 111 self.seconds = seconds; 112 self.nanos = nanos; 113} 114 115@end 116