From 78025bf92290e78fc3165668e3168b4b3a59e5e5 Mon Sep 17 00:00:00 2001 From: schmidt9 Date: Sat, 13 Aug 2016 08:10:45 +0300 Subject: [PATCH] Add iOS support --- ios.h | 42 +++++++++++++++++++++++++++ ios.mm | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tz.cpp | 9 ++++++ 3 files changed, 141 insertions(+) create mode 100644 ios.h create mode 100644 ios.mm diff --git a/ios.h b/ios.h new file mode 100644 index 0000000..7b9c3d9 --- /dev/null +++ b/ios.h @@ -0,0 +1,42 @@ +// +// ios.h +// DateTimeLib +// +// The MIT License (MIT) +// +// Copyright (c) 2016 Alexander Kormanovsky +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef ios_hpp +#define ios_hpp + +#include + +namespace date +{ +namespace iOSUtils +{ + +std::string get_tzdata_path(); + +} // namespace iOSUtils +} // namespace date + +#endif // ios_hpp diff --git a/ios.mm b/ios.mm new file mode 100644 index 0000000..79252d4 --- /dev/null +++ b/ios.mm @@ -0,0 +1,90 @@ +// +// ios.cpp +// DateTimeLib +// +// The MIT License (MIT) +// +// Copyright (c) 2016 Alexander Kormanovsky +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#if HAS_IOS + +#include "ios.h" +#include "NVHTarGzip.h" + +namespace date +{ +namespace iOSUtils +{ + +std::string +get_tzdata_path() +{ + static NSString *result = @""; + NSFileManager *manager = [NSFileManager defaultManager]; + static dispatch_once_t onceToken; + + dispatch_once(&onceToken, + ^{ + NSArray *paths = [NSBundle pathsForResourcesOfType:@"tar.gz" + inDirectory:[[NSBundle mainBundle] bundlePath]]; + + if (paths.count != 0) + { + NSString *archivePath = paths[0]; + NSURL *docsURL = [[[NSFileManager defaultManager] + URLsForDirectory:NSDocumentDirectory + inDomains:NSUserDomainMask] lastObject]; + + NSString *path = [[docsURL URLByAppendingPathComponent:@"tzdata"] path]; + + if ([manager fileExistsAtPath:path]) + { + result = path; + return; + } + + [manager createDirectoryAtPath:path withIntermediateDirectories:NO + attributes:nil error:nil]; + + NSError *error; + + [[NVHTarGzip sharedInstance] unTarGzipFileAtPath:archivePath + toPath:path error:&error]; + + if (error != nil) + { + NSLog(@"%s Error extracting %@", __func__, error); + } + else + { + result = path; + } + + } + }); + + return [result UTF8String]; +} + +} // namespace iOSUtils +} // namespace date + +#endif diff --git a/tz.cpp b/tz.cpp index fe75e32..dd2b757 100644 --- a/tz.cpp +++ b/tz.cpp @@ -2,6 +2,7 @@ // // Copyright (c) 2015, 2016 Howard Hinnant // Copyright (c) 2015 Ville Voutilainen +// Copyright (c) 2016 Alexander Kormanovsky // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -116,6 +117,10 @@ # endif //!USE_SHELL_API #endif // !WIN32 +#ifdef HAS_IOS +#include "ios.h" +#endif + #if HAS_REMOTE_API // Note curl includes windows.h so we must include curl AFTER definitions of things // that effect windows.h such as NOMINMAX. @@ -179,12 +184,16 @@ static std::string expand_path(std::string path) { +#ifndef HAS_IOS ::wordexp_t w{}; ::wordexp(path.c_str(), &w, 0); assert(w.we_wordc == 1); path = w.we_wordv[0]; ::wordfree(&w); return path; +#else + return date::iOSUtils::get_tzdata_path(); +#endif } #endif // !_WIN32