Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'iphone/Maps/Classes/MWMOpeningHours.mm')
-rw-r--r--iphone/Maps/Classes/MWMOpeningHours.mm128
1 files changed, 128 insertions, 0 deletions
diff --git a/iphone/Maps/Classes/MWMOpeningHours.mm b/iphone/Maps/Classes/MWMOpeningHours.mm
new file mode 100644
index 0000000000..62fe8b8e53
--- /dev/null
+++ b/iphone/Maps/Classes/MWMOpeningHours.mm
@@ -0,0 +1,128 @@
+#import "MWMOpeningHours.h"
+#import "MWMOpeningHoursCommon.h"
+
+
+#include "3party/opening_hours/opening_hours.hpp"
+#include "editor/opening_hours_ui.hpp"
+#include "editor/ui2oh.hpp"
+
+using namespace editor;
+using namespace osmoh;
+
+namespace
+{
+NSString * stringFromTimeSpan(Timespan const & timeSpan)
+{
+ return [NSString stringWithFormat:@"%@ - %@", stringFromTime(timeSpan.GetStart()),
+ stringFromTime(timeSpan.GetEnd())];
+}
+
+NSString * breaksFromClosedTime(TTimespans const & closedTimes)
+{
+ NSMutableString * breaks = [@"" mutableCopy];
+ for (auto & ct : closedTimes)
+ {
+ [breaks appendString:@"\n"];
+ [breaks appendString:stringFromTimeSpan(ct)];
+ }
+ return breaks.copy;
+}
+
+void addToday(ui::TimeTable const & tt, vector<Day> & allDays)
+{
+ NSString * workingDays;
+ NSString * workingTimes;
+ NSString * breaks;
+
+ if (tt.IsTwentyFourHours())
+ {
+ workingDays = L(@"twentyfour_seven");
+ workingTimes = @"";
+ breaks = @"";
+ }
+ else
+ {
+ BOOL const everyDay = (tt.GetOpeningDays().size() == 7);
+ workingDays = everyDay ? L(@"daily") : L(@"today");
+ workingTimes = stringFromTimeSpan(tt.GetOpeningTime());
+ breaks = breaksFromClosedTime(tt.GetExcludeTime());
+ }
+
+ allDays.emplace(allDays.begin(), workingDays, workingTimes, breaks);
+}
+
+void addClosedToday(vector<Day> & allDays)
+{
+ allDays.emplace(allDays.begin(), L(@"day_off_today"));
+}
+
+void addDay(ui::TimeTable const & tt, vector<Day> & allDays)
+{
+ NSString * workingDays = stringFromOpeningDays(tt.GetOpeningDays());
+ NSString * workingTimes;
+ NSString * breaks;
+ if (tt.IsTwentyFourHours())
+ {
+ workingTimes = L(@"twentyfour_seven");
+ }
+ else
+ {
+ workingTimes = stringFromTimeSpan(tt.GetOpeningTime());
+ breaks = breaksFromClosedTime(tt.GetExcludeTime());
+ }
+ allDays.emplace_back(workingDays, workingTimes, breaks);
+}
+
+void addUnhandledDays(ui::TOpeningDays const & days, vector<Day> & allDays)
+{
+ if (days.empty())
+ return;
+
+ allDays.emplace_back(stringFromOpeningDays(days));
+}
+
+} // namespace
+
+@implementation MWMOpeningHours
+
++ (vector<Day>)processRawString:(NSString *)str
+{
+ ui::TimeTableSet timeTableSet;
+ osmoh::OpeningHours oh(str.UTF8String);
+ if (!MakeTimeTableSet(oh, timeTableSet))
+ return {};
+
+ vector<Day> days;
+
+ NSCalendar * cal = [NSCalendar currentCalendar];
+ cal.locale = [NSLocale currentLocale];
+
+ auto const timeTablesSize = timeTableSet.Size();
+ auto const today = static_cast<Weekday>([cal components:NSCalendarUnitWeekday fromDate:[NSDate date]].weekday);
+ auto const unhandledDays = timeTableSet.GetUnhandledDays();
+
+ /// Schedule contains more than one rule for all days or unhandled days.
+ BOOL const isExtendedSchedule = timeTablesSize != 1 || !unhandledDays.empty();
+ BOOL hasCurrentDay = NO;
+
+ for (auto const & tt : timeTableSet)
+ {
+ ui::TOpeningDays const & workingDays = tt.GetOpeningDays();
+ if (workingDays.find(today) != workingDays.end())
+ {
+ hasCurrentDay = YES;
+ addToday(tt, days);
+ }
+
+ if (isExtendedSchedule)
+ addDay(tt, days);
+ }
+
+ if (!hasCurrentDay)
+ addClosedToday(days);
+
+ addUnhandledDays(unhandledDays, days);
+ return days;
+}
+
+@end