From ed182bd99f018e0353a1c2a6d0c356d54aca6328 Mon Sep 17 00:00:00 2001 From: "Philipp, Zagar" Date: Thu, 24 Nov 2022 22:17:07 +0100 Subject: [PATCH 01/14] v4.1 (#517) * Fix/widget and movie bugs (#511) * change tabbar items of Widgets & Grades to "outline" * change studyroom widget icon * bugfix: show events on same day -> filter past events out before building dict * Improve MovieCard Design * Update Version Number * Make Widgets only available on phone * Fix/token permissions UI (#512) * Adding a new warning if not all permissions are granted. * Spacers and Localizables * bugfix: fix tower image (#509) Closes #508 * Design/login (#513) * Move Calendar Picker to bottom * Rename Widget Tabbaritem * Make LecturesView icons outline * LectureView: reduce Lecture Info Text sizes * Remove Calendar EventsView * Fix Movie Title Image gray bar * - fix TUM logo white pixelation - calendar picker back to top * Redesign some stuff for the Login Process * Remove old tum logo_white images * A few Login Design changes * Add Need Help Button to Check Permissions View * Remove red x from Check Token Button * Add personal NavigationTitle to Widget View * Today Btn press in Calendar forwards to day view * Adjust Login Design to iPad * Localize Mensa Garching traffic * Remove icon from Semester List Group Header on Grades & Lectures * Adjust Grades Info Design to Lectures (-> icon outline, text larger) * LectureDetails: Add contact btn to lecturer info * Change Lecturer Search Icon * Widget View: await name to display navigationTitle * Add Spacer to Widget Detail sheet top * Change color check token permission view text * Open Widget View when logging in * Generate personalized Widget Navigation Title * Reorder Code Widget Screen * Adjust Profile "GET IN CONTACT" Btns to Webview setting * Move NavTitle loading into recommender loading * remove request location always use * A few Login - Token Design changes Co-authored-by: August Wittgenstein <75639931+AW-tum@users.noreply.github.com> Co-authored-by: August Wittgenstein Co-authored-by: 14slash12 <59373377+14slash12@users.noreply.github.com> Co-authored-by: Thomas Schuster <82888998+twihno@users.noreply.github.com> --- Campus-iOS.xcodeproj/project.pbxproj | 8 +- Campus-iOS/App.swift | 30 +-- .../logo-white.imageset/Contents.json | 2 +- .../logo-white.imageset/TUM2.png | Bin 0 -> 16048 bytes .../TUMLogo_oZ_Vollfl_negativ_RGB.png | Bin 490 -> 0 bytes .../set-permissions.imageset/Contents.json | 21 ++ .../set-permissions.png | Bin 0 -> 88699 bytes .../tower.imageset/image4-94.png | Bin 337977 -> 123977 bytes .../ViewModel/CalendarViewModel.swift | 3 +- .../Views/CalendarContentView.swift | 8 +- .../Views/CalendarToolbar.swift | 52 ----- .../Views/CalendarWidgetView.swift | 6 +- .../Campus-iOS/Base.lproj/Localizable.strings | 12 +- .../Campus-iOS/de.lproj/Localizable.strings | 12 +- .../GradesComponent/Views/GradeView.swift | 12 +- .../GradesComponent/Views/GradesView.swift | 9 +- .../LectureDetailsBasicInfoView.swift | 16 +- .../LectureComponent/Views/LectureView.swift | 13 +- .../LectureComponent/Views/LecturesView.swift | 8 +- ...nPermissionsViewModel+PermissionType.swift | 12 +- .../LoginComponent/Views/LoginView.swift | 39 +--- .../Views/TokenConfirmationView.swift | 166 +++++++-------- .../Views/TokenPermissionsView.swift | 192 +++++++++++------- .../View/Cafeterias/CafeteriaRowView.swift | 2 +- .../MapComponent/View/MapContentView.swift | 1 - .../View/StudyRooms/StudyRoomGroupView.swift | 1 + .../View/StudyRooms/StudyRoomWidgetView.swift | 2 +- .../MoviesComponent/Views/MovieCard.swift | 15 +- .../MoviesComponent/Views/MoviesView.swift | 6 +- .../ProfileComponent/View/ProfileView.swift | 33 ++- .../WidgetComponent/Screen/WidgetScreen.swift | 8 + 31 files changed, 360 insertions(+), 329 deletions(-) create mode 100644 Campus-iOS/Assets.xcassets/logo-white.imageset/TUM2.png delete mode 100644 Campus-iOS/Assets.xcassets/logo-white.imageset/TUMLogo_oZ_Vollfl_negativ_RGB.png create mode 100644 Campus-iOS/Assets.xcassets/set-permissions.imageset/Contents.json create mode 100644 Campus-iOS/Assets.xcassets/set-permissions.imageset/set-permissions.png delete mode 100644 Campus-iOS/CalendarComponent/Views/CalendarToolbar.swift diff --git a/Campus-iOS.xcodeproj/project.pbxproj b/Campus-iOS.xcodeproj/project.pbxproj index e6dd78ae..65d9e7ac 100644 --- a/Campus-iOS.xcodeproj/project.pbxproj +++ b/Campus-iOS.xcodeproj/project.pbxproj @@ -226,7 +226,6 @@ 36BBE7342798B04D0018FD3F /* NewsSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36BBE7332798B04D0018FD3F /* NewsSource.swift */; }; 36C70FB128538A190097416E /* PanelContentCafeteriasListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C70FB028538A190097416E /* PanelContentCafeteriasListView.swift */; }; 36C70FB32854D2AB0097416E /* PanelContentStudyGroupsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C70FB22854D2AB0097416E /* PanelContentStudyGroupsListView.swift */; }; - 36E964A32774932B0055777F /* CalendarToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E964A22774932B0055777F /* CalendarToolbar.swift */; }; 36E964A5277493D90055777F /* CalendarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E964A4277493D90055777F /* CalendarViewModel.swift */; }; 36E964A7277498540055777F /* CalendarContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E964A6277498540055777F /* CalendarContentView.swift */; }; 36E964AA277498B60055777F /* KVKCalendar in Frameworks */ = {isa = PBXBuildFile; productRef = 36E964A9277498B60055777F /* KVKCalendar */; }; @@ -498,7 +497,6 @@ 36BBE7332798B04D0018FD3F /* NewsSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsSource.swift; sourceTree = ""; }; 36C70FB028538A190097416E /* PanelContentCafeteriasListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PanelContentCafeteriasListView.swift; sourceTree = ""; }; 36C70FB22854D2AB0097416E /* PanelContentStudyGroupsListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PanelContentStudyGroupsListView.swift; sourceTree = ""; }; - 36E964A22774932B0055777F /* CalendarToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarToolbar.swift; sourceTree = ""; }; 36E964A4277493D90055777F /* CalendarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarViewModel.swift; sourceTree = ""; }; 36E964A6277498540055777F /* CalendarContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarContentView.swift; sourceTree = ""; }; 36E964AB277499860055777F /* CalendarDisplayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarDisplayView.swift; sourceTree = ""; }; @@ -1468,7 +1466,6 @@ 36E9649F277492B70055777F /* Views */ = { isa = PBXGroup; children = ( - 36E964A22774932B0055777F /* CalendarToolbar.swift */, 36E964A6277498540055777F /* CalendarContentView.swift */, 36E964AB277499860055777F /* CalendarDisplayView.swift */, 36AD5CF327B8C83500DAE143 /* CalendarSingleEventView.swift */, @@ -1722,7 +1719,6 @@ 36BB6F7027B1197400F224AB /* Profile.swift in Sources */, 08D0703A28776DD6004140B1 /* TextWidgetView.swift in Sources */, 08FAFD15287DC484006A0E27 /* CalendarWidgetView.swift in Sources */, - 36E964A32774932B0055777F /* CalendarToolbar.swift in Sources */, 3654F3762851710E008AD5DC /* RoomFinderViewModel.swift in Sources */, 36108BC427A3046B007DC62D /* LectureDetailsDetailedInfoRowView.swift in Sources */, 36108C1C27A307FA007DC62D /* GradesView.swift in Sources */, @@ -2106,7 +2102,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 4.0; + MARKETING_VERSION = 4.1; PRODUCT_BUNDLE_IDENTIFIER = de.tum.tca; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; @@ -2149,7 +2145,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 4.0; + MARKETING_VERSION = 4.1; PRODUCT_BUNDLE_IDENTIFIER = de.tum.tca; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; diff --git a/Campus-iOS/App.swift b/Campus-iOS/App.swift index ab8df676..2f42c943 100644 --- a/Campus-iOS/App.swift +++ b/Campus-iOS/App.swift @@ -34,7 +34,7 @@ struct CampusApp: App { NavigationView { LoginView(model: model) .onAppear { - selectedTab = 2 + selectedTab = 0 } } .navigationViewStyle(.stack) @@ -82,19 +82,21 @@ struct CampusApp: App { view.navigationViewStyle(.stack) }) - NavigationView { - WidgetScreen(model: model) - //.navigationTitle("My Widgets") - .toolbar { - ToolbarItemGroup(placement: .navigationBarTrailing) { - ProfileToolbar(model: model) + if UIDevice.current.userInterfaceIdiom == .phone { + NavigationView { + WidgetScreen(model: model) + + .toolbar { + ToolbarItemGroup(placement: .navigationBarTrailing) { + ProfileToolbar(model: model) + } } - } - } - .navigationViewStyle(.stack) - .tag(0) - .tabItem { - Label("My Widgets", systemImage: "rectangle.3.group") + } + .navigationViewStyle(.stack) + .tag(0) + .tabItem { + Label("Home", systemImage: "rectangle.3.group").environment(\.symbolVariants, .none) + } } NavigationView { @@ -108,7 +110,7 @@ struct CampusApp: App { } .tag(2) .tabItem { - Label("Grades", systemImage: "checkmark.shield") + Label("Grades", systemImage: "checkmark.shield").environment(\.symbolVariants, .none) } .if(UIDevice.current.userInterfaceIdiom == .pad, transformT: { view in view.navigationViewStyle(.stack) diff --git a/Campus-iOS/Assets.xcassets/logo-white.imageset/Contents.json b/Campus-iOS/Assets.xcassets/logo-white.imageset/Contents.json index a4e18160..fa8517e3 100644 --- a/Campus-iOS/Assets.xcassets/logo-white.imageset/Contents.json +++ b/Campus-iOS/Assets.xcassets/logo-white.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "TUMLogo_oZ_Vollfl_negativ_RGB.png", + "filename" : "TUM2.png", "idiom" : "universal", "scale" : "1x" }, diff --git a/Campus-iOS/Assets.xcassets/logo-white.imageset/TUM2.png b/Campus-iOS/Assets.xcassets/logo-white.imageset/TUM2.png new file mode 100644 index 0000000000000000000000000000000000000000..49c0e8d91fb669816bc70d689235db3515dd4918 GIT binary patch literal 16048 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 Lh>}-^CFT4Fc==K4 literal 0 HcmV?d00001 diff --git a/Campus-iOS/Assets.xcassets/logo-white.imageset/TUMLogo_oZ_Vollfl_negativ_RGB.png b/Campus-iOS/Assets.xcassets/logo-white.imageset/TUMLogo_oZ_Vollfl_negativ_RGB.png deleted file mode 100644 index 34d87e426d2cc2aedebc5fb61fc4788209a879e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^_kp;KgAGV}ymA9ca29w(7BevDDT6R$#Zvn+prB-l zYeY$Kep*R+Vo@rCV@iHfs)A>3VtQ&&YGO)d;mK4R1_s7*PZ!6Kid%2)9OOJ?Aky&A z&8k6pN2l!3z*i~9cx4U>?sBYQcRUz<(wXT#`_X8rxW7x|f}&=;$kkmMW1KJ0|5i-C zJFx$C0*iv3fIK$b!7m_>z&GUMUuK-Lys&(l%f^4NvJcpwaXTfCUT87i{?9P=gI)*8nmEyQ4tj2uGo_kFa;}Bk&tzX~(YM?6-4j`WG8^ z_s38F&KhU!2zCY`YbPxD&gc~#v-R_={wI<)!ryFG=~n*Dx-YNK$i{HNSMf-xL|Qm7 Po)|n`{an^LB{Ts5Bu$~o diff --git a/Campus-iOS/Assets.xcassets/set-permissions.imageset/Contents.json b/Campus-iOS/Assets.xcassets/set-permissions.imageset/Contents.json new file mode 100644 index 00000000..4c7dc2d4 --- /dev/null +++ b/Campus-iOS/Assets.xcassets/set-permissions.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "set-permissions.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Campus-iOS/Assets.xcassets/set-permissions.imageset/set-permissions.png b/Campus-iOS/Assets.xcassets/set-permissions.imageset/set-permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..53edded9d042d047f0d51421df3fb28780e2336b GIT binary patch literal 88699 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

Fq${{8OIOp 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 HPLclyZU6(Y literal 0 HcmV?d00001 diff --git a/Campus-iOS/Assets.xcassets/tower.imageset/image4-94.png b/Campus-iOS/Assets.xcassets/tower.imageset/image4-94.png index c79b3adb7434fb61beeec43589c835f360f08dd4..257443f164ac6e48abfe1ac757ed7df9b8479e23 100644 GIT binary patch literal 123977 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

`zz~Gfv(FK}vZ~lw2DW5Rs%=ul`P$ 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 z zB1!0RyY=dCyWTb6Fu}3!KoVT%>U?rYB_p7HKTkq`CtKD=%1{B6IBFQr3eOM0rf-Q@ z((biGiwAR<@cAmP3*m&f?tf9jK<4K>LOOUxzCk*o-NQZlX%*KEo1aSgTc_1#H+u8f zoSHRo5Dt^2-+94eEnr$PxCSK>pZ(K!KD0B2xOA^xH=2$M&bi^xwYj$0s2^8KA$yL? z4K&Xh1?JFNw!cIcZp%|W5qu`6H0y2u%}n2vgczzNlx7%r|F>vY41(gxvWLk|t%_CF zL<={K>i-0u*7qQliyZyJYWyaxU(`6-!y-juAbvx2Do1Mn`{j#? zA|HIvv7_?g2uh?#e?aZ$LF$bep0>txNE8dW+iEzmk;gRP$08JzBWBsm-Wo>toE0gLG@f_f78~ zD0CGordMy;b1_w_(Q89e%Zj3(o4-bsvLzVJA75!sOe5xc*?{8APQIOnX<6n} z3hx|i3n&Nz7ZPZK2u2xD#7;rAZyR+5a{_9VTqsqvAZ4F{eQDU`*!mxztNcHuMr|?k z?c?hP57lR!LhC$EETeyb z5mS4Z{ygLVVDz&hxDyjK_a2b=<%X+g2Y?4I&BD)__uX>25Oog-`)MA@2A@f9kG>@O#cLxcWCjEl?Aay0JN2&Q+hfEBjgY z=*FI#6CLY=nW1z*4H-hI@F>exDxGzPL;>jsx)W%9V=3)@BlbG^Wp4KxiuhlyG^8U} z;+PMdm{aLpNhrFkUsoQKuv=YEb5IUxkRsT_vCdBt^TE+vex}Ym%8PhQewU&mjkekY z3ZR)O|0fx4rs!oyE1k_sNY}*2**=thbWKW>J;wA4)AXRN7$sNg;qYY>4%?hS8q2=&G(;%EFA)yq_^H2X zV=^qz`A3Nq|60T#xh=e<3>W={F+a89&GHLxP793>E}O}Mgt0CKzcr35+@RUNk1fYr ze^32xr0Dm>@rx|z*naX`QWT$#hPEQ&%|F=Z5M&oXkdxjRD{T9=y`w`U_)J2k656M1*-*i?YWVBWl8dhONU9IDwXjrtyS?kb}Gw1uz9(%d967=!|kPmw%V z*~{h_#JJGS-%4ADetEs=l$DM}J!H?H^NuG$5|q$qxE3D@U^sRoL@^ZFJ(uqTORhcn zcv+m3ip~@d>Al!D>M5C7a|C#auQ+8(XjC>Zl9Rg;4SfrLPD;w3BqY_T2+jc?24K@=Uh~i^2bk9JfHgY z&(hff->wMGz%2fk<@f~z3}a8#7=o-e56De5ioCEsw%98kR+J4phj~hC2rxWZFeK`1*XVj~(m9OJ2lI+|P$b}q$&A$YbaEs7LO>euS zE4=1wx4h0-1WlP4ZMhaOBM+P8zsI`y9l)Ji#u|9pEI3?75ZfJVKa@RopY<;o95m5b zA?dXZqCCvh@HoXV`gP|X2tY7ib82`ydRs(${v85b?$ss(dl9Pr5GLxB4Fc;V22az3;1j*60z{j%dJm*6nJF!XvvGgYHm!O)!Eip z%v#8??%TNjn_HYp`?e>zrrbM!|F@0KHV548=t(+tRt;YevdEmjz{5v54g3@Y!m6jG z

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 z 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 z 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%0Du6PO|)l8~QzU+KOE?7wJ({;v?s38UGoe zvrKBO{HLr?;KNc8#%y+2dYiq|aFvidQ_X33luU_w)rFy4+s7RqnM;ZJ(<06DX4a{- zJ%HMJNPuVs+^c4R2Egr53i_(&yA(naCnx7&#Y5lTt=6UgSE+&t{CWHNSth%*m<`BW z%zf;%_H=9mk$ShQwBU4qgk5)6nqltwK?LYrYX`U^OcyRY+oP#=IO_U?n8?p0VyOiM zVl@@9b+Igfi~4Q#Ln)QaUfhIh5Ph;9C}T)e4jM3#*|U!^i*js zHBA|o4K@3fWWgvF&&(2Yc61c;aTv|xRT+GBIH;$QnI)-%N$rSMB}=_B6ZUfL+>79d zW1S;!xWhR?l(u|{tT0@ivGh77>m4KbPwQ2Szp-kc4&l$qDal7-sQoEKokQ%W7maNF zpCap)k33PfScoBRSLylcm_OA1DqPA^-x{~Gd~b7X zHz%HO(pJ~nU9vcHSk{PSIp@w6I9{JOh%VWRkZ)Lzmk!)ZKXSdCj%ah@YP?7X za%!fjMg28xLB3IvSXP?hHq(Mw9Mx_k6aV`nXk80R6`#Y3d!RFtCs>S0)oRj=?OfJC zdl?Teoi;c++)ic$X8~}pY`fmAb$jFUzAw2sHginArtKZ06v-QXH!4RJ*4>M0|Mktu zEz7|@)q>WEo6fU`q*WIAsy3^baWk7Gk7mjiuKSwXncEwsyUw|rY8&1ka32)@1tcQ+ z*A(heEA0TI)y!_0BKa_!Q#W^-=D3Ysr$r0KZ~1Uy8f{I_=|J8j&llX`P}#Re2Cyiq zeUt`Lyyr1jMz3Zo)h7kq`>Rt(>}#zSputtX1>_T`h5g@dJuFccM#F>n{<_f>ICHMr z?1GO_vzr9#xI0N1$pTd(X5inj7b4$=04zlM%#Of$z#~m2pY@^6!(}91_!?$!IA{G} z0F4giBJyAJ>tEFEIG4bG=%`;BWw>>oHN_13ljMK9GXMSdU%LDa%l-G;Kj+YYW#hjR t@n4Df3&i-ZF#J~-{;vwdvoFLeUg}=hp}g*})jQBfTv$e^TtLt7{{T*np&S4J diff --git a/Campus-iOS/CalendarComponent/ViewModel/CalendarViewModel.swift b/Campus-iOS/CalendarComponent/ViewModel/CalendarViewModel.swift index 9f383763..8a7643f2 100644 --- a/Campus-iOS/CalendarComponent/ViewModel/CalendarViewModel.swift +++ b/Campus-iOS/CalendarComponent/ViewModel/CalendarViewModel.swift @@ -55,7 +55,8 @@ class CalendarViewModel: ObservableObject { var eventsByDate: [Date? : [CalendarEvent]] { let sortedEvents = events.sorted { $0.startDate ?? Date() < $1.startDate ?? Date() } - let dictionary = Dictionary(grouping: sortedEvents, by: { $0.startDate?.removeTimeStamp }) + let filteredEvents = sortedEvents.filter { Date() <= $0.startDate ?? Date() } + let dictionary = Dictionary(grouping: filteredEvents, by: { $0.startDate?.removeTimeStamp }) return dictionary } } diff --git a/Campus-iOS/CalendarComponent/Views/CalendarContentView.swift b/Campus-iOS/CalendarComponent/Views/CalendarContentView.swift index 45371818..54176ec3 100644 --- a/Campus-iOS/CalendarComponent/Views/CalendarContentView.swift +++ b/Campus-iOS/CalendarComponent/Views/CalendarContentView.swift @@ -71,7 +71,12 @@ struct CalendarContentView: View { } .toolbar { ToolbarItemGroup(placement: .navigationBarLeading) { - CalendarToolbar(viewModel: self.viewModel, selectedEventID: self.$selectedEventID, isTodayPressed: self.$isTodayPressed) + Button(action: { + self.isTodayPressed = true + selectedType = .day + }) { + Text("Today") + } } ToolbarItem(placement: .principal) { Picker("Calendar Type", selection: $selectedType) { @@ -88,6 +93,7 @@ struct CalendarContentView: View { } } } + .opacity(1.0) .pickerStyle(.segmented) .onAppear { UISegmentedControl.appearance().backgroundColor = UIColor.systemBlue.withAlphaComponent(0.2) diff --git a/Campus-iOS/CalendarComponent/Views/CalendarToolbar.swift b/Campus-iOS/CalendarComponent/Views/CalendarToolbar.swift deleted file mode 100644 index 73b6339b..00000000 --- a/Campus-iOS/CalendarComponent/Views/CalendarToolbar.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// CalendarToolbar.swift -// Campus-iOS -// -// Created by Milen Vitanov on 23.12.21. -// - -import SwiftUI - -struct CalendarToolbar: View { - @ObservedObject var viewModel: CalendarViewModel - - @Binding var selectedEventID: String? - @Binding var isTodayPressed: Bool - - var body: some View { - HStack() { - NavigationLink(destination: - VStack{ - GeometryReader { geo in - CalendarDisplayView(events: viewModel.events.map({ $0.kvkEvent }), type: .list, selectedEventID: self.$selectedEventID, frame: CalendarContentView.getSafeAreaFrame(geometry: geo), todayPressed: self.$isTodayPressed, calendarWeekDays: 7) - .navigationBarTitle(Text("Events")) - } - } - .edgesIgnoringSafeArea(.all) - .toolbar { - ToolbarItemGroup(placement: .navigationBarTrailing) { - ProfileToolbar(model: self.viewModel.model) - } - } - ) { - Label("", systemImage: "list.bullet") - } - - Spacer().frame(width: 15) - Button(action: { self.isTodayPressed = true }) { - Text("Today") - } - } - } -} - -struct CalendarToolbar_Previews: PreviewProvider { - - @State static var selectedEventId: String? = "test123" - @State static var todayPressed = false - static var model = MockModel() - - static var previews: some View { - CalendarToolbar(viewModel: CalendarViewModel(model: model), selectedEventID: $selectedEventId, isTodayPressed: $todayPressed) - } -} diff --git a/Campus-iOS/CalendarComponent/Views/CalendarWidgetView.swift b/Campus-iOS/CalendarComponent/Views/CalendarWidgetView.swift index dc2c6ef1..bddb41d3 100644 --- a/Campus-iOS/CalendarComponent/Views/CalendarWidgetView.swift +++ b/Campus-iOS/CalendarComponent/Views/CalendarWidgetView.swift @@ -28,7 +28,6 @@ struct CalendarWidgetView: View { var body: some View { // Show the events on the earliest date which is not in the past. let events = viewModel.eventsByDate - .filter { Date() <= $0.key ?? Date() } .min { $0.key ?? Date() < $1.key ?? Date() }?.value ?? [] WidgetFrameView( @@ -52,7 +51,10 @@ struct CalendarWidgetView: View { showDetails.toggle() } .sheet(isPresented: $showDetails) { - CalendarContentView(model: model, refresh: .constant(false)) + VStack { + Spacer().frame(height: 10) + CalendarContentView(model: model, refresh: .constant(false)) + } } .expandable(size: $size, initialSize: initialSize, scale: $scale) } diff --git a/Campus-iOS/Campus-iOS/Base.lproj/Localizable.strings b/Campus-iOS/Campus-iOS/Base.lproj/Localizable.strings index cdfeebd5..ed06fb86 100644 --- a/Campus-iOS/Campus-iOS/Base.lproj/Localizable.strings +++ b/Campus-iOS/Campus-iOS/Base.lproj/Localizable.strings @@ -81,7 +81,6 @@ // TokenConfirmationView "Back" = "Back"; "Log in on " = "Log in on "; -"TUMOnline" = "TUMOnline"; "Select **Token-Management**" = "Select **Token-Management**"; "Activate the newly created token and enable your desired permissions" = "Activate the newly created token and enable your desired permissions"; "Contact Support" = "Contact Support"; @@ -92,16 +91,16 @@ "Leaving now will invalidate the current token!" = "Leaving now will invalidate the current token!"; "Leave" = "Leave"; -"Open TUMOnline" = "Open TUMOnline"; -"Check Token" = "Check Token"; "Token inactive" = "Token inactive"; -"Please activate the latest token on TUMOnline" = "Please activate the latest token on TUMOnline"; "Token active" = "Token active"; // TokenPermissionsView -"You can change your permissions on TUMOnline" = "You can change your permissions on TUMOnline"; +"You can change your permissions in TUMOnline" = "You can change your permissions in TUMOnline"; "Identification (TUM ID and name)" = "Identification (TUM ID and name)"; -"Check Permissions" = "Check Permissions"; +"Permissions" = "Permissions"; +"You have not granted the following permissions: \n\n" = "You have not granted the following permissions: \n\n"; +"\nJust be aware that the app will not fully work without all permissions. You can change the permissions every time in TUMOnline." = "\nJust be aware that the app will not fully work without all permissions. You can change the permissions every time in TUMOnline."; +"Continue anyways" = "Continue anyways"; // ProfileView "Token Permissions" = "Token Permissions"; @@ -176,6 +175,7 @@ // Map "Search ..." = "Search ..."; +"Traffic" = "Traffic"; // Movies "No more movies this semester 😢\nGet excited for the next season!" = "No more movies this semester 😢\nGet excited for the next season!"; diff --git a/Campus-iOS/Campus-iOS/de.lproj/Localizable.strings b/Campus-iOS/Campus-iOS/de.lproj/Localizable.strings index d2bdb252..01d54482 100644 --- a/Campus-iOS/Campus-iOS/de.lproj/Localizable.strings +++ b/Campus-iOS/Campus-iOS/de.lproj/Localizable.strings @@ -75,7 +75,6 @@ // TokenConfirmationView "Back" = "Zurück"; "Log in on " = "Melde dich auf "; -"TUMOnline" = "TUMOnline an"; "Select **Token-Management**" = "Gehe auf **Token Verwaltung**"; "Activate the newly created token and enable your desired permissions" = "Aktiviere den Token und stelle die benötigten Rechte ein"; "Contact Support" = "Support kontaktieren"; @@ -86,16 +85,16 @@ "Leaving now will invalidate the current token!" = "Wenn du jetzt die Seite verlässt wird der aktuelle Token ungültig!"; "Leave" = "Verlassen"; -"Open TUMOnline" = "Öffne TUMOnline"; -"Check Token" = "Token überprüfen"; "Token inactive" = "Token inaktiv"; -"Please activate the latest token on TUMOnline" = "Bitte aktiviere den neusten Token auf TUMOnline"; "Token active" = "Token aktiv"; // TokenPermissionsView -"You can change your permissions on TUMOnline" = "Du kannst deine Rechte auf TUMOnline anpassen"; +"You can change your permissions in TUMOnline" = "Du kannst deine Rechte in TUMOnline anpassen"; "Identification (TUM ID and name)" = "Identifikation (TUM ID und Name)"; -"Check Permissions" = "Rechte überprüfen"; +"Permissions" = "Rechte"; +"You have not granted the following permissions: \n\n" = "Du hast nicht alle Rechte freigegeben: \n\n"; +"\nJust be aware that the app will not fully work without all permissions. You can change the permissions every time in TUMOnline." = "\nDadurch können nicht alle Features der App genutzt werden. Du kannst die Rechte jederzeit auf TUMOnline anpassen."; +"Continue anyways" = "Trotzdem weiter"; // ProfileView "Token Permissions" = "Token Rechte"; @@ -170,6 +169,7 @@ // Map "Search ..." = "Suchen ..."; +"Traffic" = "Auslastung"; // Movies "No more movies this semester 😢\nGet excited for the next season!" = "Keine Filme mehr dieses Semester 😢\nMacht euch ready für die nächste Saison!"; diff --git a/Campus-iOS/GradesComponent/Views/GradeView.swift b/Campus-iOS/GradesComponent/Views/GradeView.swift index 384cbeca..0d4784ab 100644 --- a/Campus-iOS/GradesComponent/Views/GradeView.swift +++ b/Campus-iOS/GradesComponent/Views/GradeView.swift @@ -36,22 +36,22 @@ struct GradeView: View { VStack(alignment: .leading, spacing: 8) { HStack(spacing: 16) { HStack { - Image(systemName: "pencil.circle.fill") + Image(systemName: "pencil.circle") .frame(width: 12, height: 12) .foregroundColor(Color("tumBlue")) Text(grade.modusShort) - .font(.system(size: 12)) + .font(.footnote) .foregroundColor(colorScheme == .dark ? .init(UIColor.lightGray) : .init(UIColor.darkGray)) Spacer() } .frame(minWidth: 0, maxWidth: .infinity) HStack { - Image(systemName: "number.circle.fill") + Image(systemName: "number.circle") .frame(width: 12, height: 12) .foregroundColor(Color("tumBlue")) Text(grade.lvNumber) - .font(.system(size: 12)) + .font(.footnote) .foregroundColor(colorScheme == .dark ? .init(UIColor.lightGray) : .init(UIColor.darkGray)) Spacer() } @@ -59,11 +59,11 @@ struct GradeView: View { }.foregroundColor(.init(.darkGray)) HStack { - Image(systemName: "person.circle.fill") + Image(systemName: "person.circle") .frame(width: 12, height: 12) .foregroundColor(Color("tumBlue")) Text(grade.examiner) - .font(.system(size: 12)) + .font(.footnote) .foregroundColor(colorScheme == .dark ? .init(UIColor.lightGray) : .init(UIColor.darkGray)) .fixedSize(horizontal: false, vertical: true) }.foregroundColor(.init(.darkGray)) diff --git a/Campus-iOS/GradesComponent/Views/GradesView.swift b/Campus-iOS/GradesComponent/Views/GradesView.swift index 11ea6c39..6826efcc 100644 --- a/Campus-iOS/GradesComponent/Views/GradesView.swift +++ b/Campus-iOS/GradesComponent/Views/GradesView.swift @@ -32,12 +32,9 @@ struct GradesView: View { } ForEach(self.vm.gradesByDegreeAndSemester[index].1, id: \.0) { gradesBySemester in - Section( - header: - GroupBoxLabelView( - iconName: "graduationcap.fill", - text: gradesBySemester.0 - ) + Section(header: Text(gradesBySemester.0) + .font(.headline.bold()) + .foregroundColor(Color("tumBlue")) ) { ForEach(gradesBySemester.1) { item in VStack { diff --git a/Campus-iOS/LectureComponent/Views/LectureDetailsViews/LectureDetailsBasicInfoView.swift b/Campus-iOS/LectureComponent/Views/LectureDetailsViews/LectureDetailsBasicInfoView.swift index e938d072..b99a17cc 100644 --- a/Campus-iOS/LectureComponent/Views/LectureDetailsViews/LectureDetailsBasicInfoView.swift +++ b/Campus-iOS/LectureComponent/Views/LectureDetailsViews/LectureDetailsBasicInfoView.swift @@ -62,12 +62,16 @@ struct LectureDetailsBasicInfoView: View { text: lectureDetails.organisation ) Divider() - LectureDetailsBasicInfoRowView( - iconName: "person.fill", - text: lectureDetails.speaker - ) - .onTapGesture { - self.showActionSheet = true + HStack { + LectureDetailsBasicInfoRowView( + iconName: "person.fill", + text: lectureDetails.speaker + ) + Spacer() + Button( + action: { self.showActionSheet = true }, + label: { Image(systemName: "magnifyingglass").foregroundColor(.blue) } + ) } if let firstMeeting = lectureDetails.firstScheduledDate { Divider() diff --git a/Campus-iOS/LectureComponent/Views/LectureView.swift b/Campus-iOS/LectureComponent/Views/LectureView.swift index 02db111a..9359ee02 100644 --- a/Campus-iOS/LectureComponent/Views/LectureView.swift +++ b/Campus-iOS/LectureComponent/Views/LectureView.swift @@ -15,26 +15,25 @@ struct LectureView: View { VStack(alignment: .leading, spacing: 8) { Text(lecture.title) .bold() - .font(.title3) HStack(spacing: 16) { HStack { - Image(systemName: "pencil.circle.fill") + Image(systemName: "pencil.circle") .frame(width: 12, height: 12) .foregroundColor(Color("tumBlue")) Text(lecture.eventType) - .font(.subheadline) + .font(.footnote) .foregroundColor(colorScheme == .dark ? .init(UIColor.lightGray) : .init(UIColor.darkGray)) Spacer() } .frame(minWidth: 0, maxWidth: .infinity) HStack { - Image(systemName: "clock.fill") + Image(systemName: "clock") .frame(width: 12, height: 12) .foregroundColor(Color("tumBlue")) Text(lecture.duration + " SWS") - .font(.subheadline) + .font(.footnote) .foregroundColor(colorScheme == .dark ? .init(UIColor.lightGray) : .init(UIColor.darkGray)) Spacer() } @@ -42,11 +41,11 @@ struct LectureView: View { }.foregroundColor(.init(.darkGray)) HStack { - Image(systemName: "person.circle.fill") + Image(systemName: "person.circle") .frame(width: 12, height: 12) .foregroundColor(Color("tumBlue")) Text(lecture.speaker) - .font(.subheadline) + .font(.footnote) .foregroundColor(colorScheme == .dark ? .init(UIColor.lightGray) : .init(UIColor.darkGray)) .fixedSize(horizontal: false, vertical: true) }.foregroundColor(.init(.darkGray)) diff --git a/Campus-iOS/LectureComponent/Views/LecturesView.swift b/Campus-iOS/LectureComponent/Views/LecturesView.swift index e33d1ab0..b5433da2 100644 --- a/Campus-iOS/LectureComponent/Views/LecturesView.swift +++ b/Campus-iOS/LectureComponent/Views/LecturesView.swift @@ -29,11 +29,9 @@ struct LecturesView: View { var body: some View { List { ForEach(lecturesBySemesterSearchResult, id: \.0) { lecturesBySemester in - Section( - header: GroupBoxLabelView( - iconName: "graduationcap.fill", - text: lecturesBySemester.0 - ) + Section(header: Text(lecturesBySemester.0) + .font(.headline.bold()) + .foregroundColor(Color("tumBlue")) ) { ForEach(lecturesBySemester.1) { item in VStack { diff --git a/Campus-iOS/LoginComponent/ViewModel/TokenPermissionsViewModel+PermissionType.swift b/Campus-iOS/LoginComponent/ViewModel/TokenPermissionsViewModel+PermissionType.swift index 8423ed5e..67f97fa0 100644 --- a/Campus-iOS/LoginComponent/ViewModel/TokenPermissionsViewModel+PermissionType.swift +++ b/Campus-iOS/LoginComponent/ViewModel/TokenPermissionsViewModel+PermissionType.swift @@ -8,11 +8,11 @@ import Foundation extension TokenPermissionsViewModel { - enum PermissionType { - case grades - case calendar - case lectures - case tuitionFees - case identification + enum PermissionType: String { + case grades = "Grades" + case calendar = "Calendar" + case lectures = "Lectures" + case tuitionFees = "Tuition Fees" + case identification = "Identification (TUM ID and name)" } } diff --git a/Campus-iOS/LoginComponent/Views/LoginView.swift b/Campus-iOS/LoginComponent/Views/LoginView.swift index 0ed68447..f171a86d 100644 --- a/Campus-iOS/LoginComponent/Views/LoginView.swift +++ b/Campus-iOS/LoginComponent/Views/LoginView.swift @@ -18,6 +18,8 @@ struct LoginView: View { @ObservedObject var viewModel: LoginViewModel @FocusState private var focusedField: Field? + @State var isActive = true + @State var logInState: LoginViewModel.LoginState = .notChecked @State var showLoginAlert: Bool = false @State var buttonBackgroundColor: Color = .tumBlue @@ -108,7 +110,7 @@ struct LoginView: View { switch result { case .success: withAnimation() { - buttonBackgroundColor = .green + buttonBackgroundColor = .blue logInState = .loggedIn } print("Log in Successfull") @@ -148,20 +150,12 @@ struct LoginView: View { } } case .loggedIn: - HStack { - Image(systemName: "checkmark.circle.fill") - Text("Log in Successfull") - } - .lineLimit(1) - .font(.title3) - .frame(alignment: .center) - .onAppear() { - Task { - try? await Task.sleep(nanoseconds: 1_500_000_000) - withAnimation() { - showLoginButton = false - } - } + NavigationLink(destination: + TokenConfirmationView(viewModel: self.viewModel).navigationBarTitle(Text("Check Token")), isActive: $isActive) { + Text("Log in 🎓") + .lineLimit(1) + .font(.title3) + .frame(alignment: .center) } } @@ -175,21 +169,6 @@ struct LoginView: View { .cornerRadius(10) .buttonStyle(.plain) } - - - if !showLoginButton { - NavigationLink(destination: - TokenConfirmationView(viewModel: self.viewModel).navigationBarTitle(Text("Check Token"))) { - Text("Next") - .font(.body) - .frame(width: 200, height: 48, alignment: .center) - .foregroundColor(.white) - .background(.green) - .cornerRadius(10) - .buttonStyle(.plain) - } - } - Spacer().frame(height: 20) diff --git a/Campus-iOS/LoginComponent/Views/TokenConfirmationView.swift b/Campus-iOS/LoginComponent/Views/TokenConfirmationView.swift index 0dab18ba..23aa8da3 100644 --- a/Campus-iOS/LoginComponent/Views/TokenConfirmationView.swift +++ b/Campus-iOS/LoginComponent/Views/TokenConfirmationView.swift @@ -21,6 +21,8 @@ struct TokenConfirmationView: View { @State var showCheckTokenButton: Bool = true @State var showTUMOnline = false @State var currentStep: Int = 1 + @State var isActive = true + /// The `LoginViewModel` that manages the content of the login screen @ObservedObject var viewModel: LoginViewModel @@ -102,102 +104,101 @@ struct TokenConfirmationView: View { .shadow(radius: 10) // Video is 2532 x 1170 .frame(width: screenWidth*0.109*5, height: screenWidth*0.185*5, alignment: .center) + VStack { Spacer() - Button { - self.showTUMOnline = true - } label: { - HStack { - Image(systemName: "globe") - Text("Open TUMOnline") + HStack { + Spacer() + Button { + self.showTUMOnline = true + } label: { + HStack { + Image(systemName: "globe") + Text("TUMOnline") + } + .lineLimit(1) + .font(.system(size: 15, weight: .bold)) + .frame(width: 150, height: 48, alignment: .center) } - .lineLimit(1).font(.body) - .frame(width: 200, height: 48, alignment: .center) - } - .font(.title) - .foregroundColor(.white) - .background(Color(.tumBlue)) - .cornerRadius(10) - - Spacer() - - if !tokenPermissionButton { - Button(action: { - self.viewModel.checkAuthorization() { result in - switch result { - case .success: - withAnimation { - tokenState = .active - buttonBackgroundColor = .green - showTokenHelp = false - } - case .failure(_): - withAnimation { - tokenState = .inactive - buttonBackgroundColor = .red - showTokenHelp = true + .foregroundColor(.white) + .background(Color(.tumBlue)) + .cornerRadius(10) + .padding() + + Spacer() + + if !tokenPermissionButton { + Button(action: { + self.viewModel.checkAuthorization() { result in + switch result { + case .success: + withAnimation { + tokenState = .active + buttonBackgroundColor = .green + showTokenHelp = false + } + case .failure(_): + withAnimation { + tokenState = .inactive + buttonBackgroundColor = .red + showTokenHelp = true + } } } - } - }) { - switch tokenState { - case .notChecked: - Text("Check Token").lineLimit(1).font(.body) - case .inactive: - VStack { + }) { + switch tokenState { + case .notChecked: HStack { - Image(systemName: "x.circle.fill") - Text("Token inactive").lineLimit(1).font(.body) + Text("Check Token") + .lineLimit(1) + .font(.system(size: 15, weight: .bold)) + Image(systemName: "arrow.right") } - } - .padding() - .onAppear() { - Task { - try? await Task.sleep(nanoseconds: 1_500_000_000) - withAnimation(.easeInOut) { - tokenState = .notChecked - buttonBackgroundColor = .tumBlue + + case .inactive: + VStack { + HStack { + Text("Token inactive") + .lineLimit(1) + .font(.system(size: 14, weight: .bold)) } } - } - case .active: - HStack { - Image(systemName: "checkmark.circle.fill") - Text("Token active").lineLimit(1).font(.body) - } - .padding() - .onAppear() { - Task { - try? await Task.sleep(nanoseconds: 3_000_000_000) - withAnimation() { - tokenPermissionButton = true -// showCheckTokenButton = false + .padding() + .onAppear() { + Task { + try? await Task.sleep(nanoseconds: 1_500_000_000) + withAnimation(.easeInOut) { + tokenState = .notChecked + buttonBackgroundColor = .tumBlue + } + } + } + case .active: + if let model = self.viewModel.model { + NavigationLink(destination: TokenPermissionsView(viewModel: TokenPermissionsViewModel(model: model)).navigationTitle("Check Permissions"), isActive: $isActive) { + Text("Next") + .lineLimit(1) + .font(.body) + .frame(width: 200, height: 48, alignment: .center) + .foregroundColor(.white) + .background(.green) + .cornerRadius(10) + .buttonStyle(.plain) } } } } + .frame(width: 150, height: 48, alignment: .center) + .font(.system(size: 14, weight: .bold)) + .foregroundColor(.white) + .background(buttonBackgroundColor) + .cornerRadius(10) + .buttonStyle(.plain) + .padding() } - .frame(width: 200, height: 48, alignment: .center) - .font(.title) - .foregroundColor(.white) - .background(buttonBackgroundColor) - .cornerRadius(10) - .buttonStyle(.plain) - } - - if tokenPermissionButton, let model = self.viewModel.model { - NavigationLink(destination: TokenPermissionsView(viewModel: TokenPermissionsViewModel(model: model)).navigationTitle("Check Permissions")) { - Text("Next") - .lineLimit(1) - .font(.body) - .frame(width: 200, height: 48, alignment: .center) - .foregroundColor(.white) - .background(.green) - .cornerRadius(10) - .buttonStyle(.plain) - } + Spacer() } if showTokenHelp { @@ -226,9 +227,10 @@ struct TokenConfirmationView: View { self.showBackButtonAlert = true }) { HStack { - Image(systemName: "arrow.left") + Image(systemName: "chevron.left") Text("Back") - }.foregroundColor(Color(.tumBlue)) + } + .foregroundColor(Color(.tumBlue)) } ) .alert(isPresented: $showBackButtonAlert) { diff --git a/Campus-iOS/LoginComponent/Views/TokenPermissionsView.swift b/Campus-iOS/LoginComponent/Views/TokenPermissionsView.swift index 478b7f87..7fc1f9d7 100644 --- a/Campus-iOS/LoginComponent/Views/TokenPermissionsView.swift +++ b/Campus-iOS/LoginComponent/Views/TokenPermissionsView.swift @@ -13,108 +13,115 @@ struct TokenPermissionsView: View { @Environment(\.dismiss) var dismiss @State var doneButton = false @State var showTUMOnline = false + @State var notAllPermissionsGranted = false + @State var permissionsWarning = "" + @State var showHelp = true var dismissWhenDone: Bool = false + let permissionTypes: [TokenPermissionsViewModel.PermissionType] = [.calendar, .lectures, .grades, .tuitionFees, .identification] + var body: some View { - VStack() { - Text("You can change your permissions on TUMOnline") - .foregroundColor(.tumBlue) + VStack(alignment: .center) { HStack { - VStack(alignment: .leading) { - Text("Calendar").padding() - Text("Lectures").padding() - Text("Grades").padding() - Text("Tuition fees").padding() - Text("Identification (TUM ID and name)").padding() - } - Spacer() - VStack { - if let currentState = viewModel.states[.calendar] { - check(state: currentState).padding() - } else { - Image(systemName: "questionmark.circle.fill").foregroundColor(.gray).padding() - } - - if let currentState = viewModel.states[.lectures] { - check(state: currentState).padding() - } else { - Image(systemName: "questionmark.circle.fill").foregroundColor(.gray).padding() - } - - if let currentState = viewModel.states[.grades] { - check(state: currentState).padding() - } else { - Image(systemName: "questionmark.circle.fill").foregroundColor(.gray).padding() - } - - if let currentState = viewModel.states[.tuitionFees] { - check(state: currentState).padding() - } else { - Image(systemName: "questionmark.circle.fill").foregroundColor(.gray).padding() - } - - if let currentState = viewModel.states[.identification] { - check(state: currentState).padding() - } else { - Image(systemName: "questionmark.circle.fill").foregroundColor(.gray).padding() - } - } + Spacer(minLength: 10) + Text("You can change your permissions in TUMOnline") + .foregroundColor(.blue) + .lineLimit(2) + .multilineTextAlignment(.center) + .font(.title2) + Spacer(minLength: 10) } - .font(.system(size: 20)) - .padding() - VStack (){ - Button { - self.showTUMOnline = true - } label: { + VStack(spacing: 0) { + ForEach(permissionTypes, id: \.self) { permissionType in HStack { - Image(systemName: "globe") - Text("Open TUMOnline") + Text(permissionType.rawValue) + Spacer() + if let currentState = viewModel.states[permissionType] { + check(state: currentState).padding() + } else { + Image(systemName: "questionmark.circle.fill").foregroundColor(.gray).padding() + } } - .lineLimit(1).font(.body) - .frame(width: 200, height: 48, alignment: .center) } - .font(.title) - .foregroundColor(.white) - .background(Color(.tumBlue)) - .cornerRadius(10) - - Button { - Task { - await viewModel.checkPermissionFor(types: [.grades, .lectures, .calendar, .identification, .tuitionFees]) - - withAnimation() { - doneButton = true + } + .padding() + + VStack { + HStack (){ + Button { + self.showTUMOnline = true + self.doneButton = false + } label: { + HStack { + Image(systemName: "globe") + Text("TUMOnline") } + .lineLimit(1) + .font(.system(size: 15, weight: .bold)) + .frame(width: 150, height: 48, alignment: .center) } - } label: { - Text("Check Permissions") + .foregroundColor(.white) + .background(Color(.tumBlue)) + .cornerRadius(10) + .padding() + + Spacer() + + Button { + Task { + await viewModel.checkPermissionFor(types: [.grades, .lectures, .calendar, .identification, .tuitionFees]) + + withAnimation() { + doneButton = true + } + } + } label: { + HStack { + Text("Permissions").font(.system(size: 15, weight: .bold)) + Image(systemName: "questionmark.circle").font(.system(size: 15, weight: .bold)) + } .lineLimit(1) - .font(.body) - .frame(width: 200, height: 48, alignment: .center) + .frame(width: 150, height: 48, alignment: .center) .foregroundColor(.white) .background(Color(.tumBlue)) .cornerRadius(10) .buttonStyle(.plain) + } + .padding() } if doneButton { + // Insert the warning string and switch bool + Button { - if dismissWhenDone { - // Dismiss when view is opened from Profile/Settings. - dismiss() + if allPermissionsAreGranted() { + if dismissWhenDone { + // Dismiss when view is opened from Profile/Settings. + dismiss() + } else { + // Used when shown via the login process sheet. + self.viewModel.model.isLoginSheetPresented = false + } } else { - // Used when shown via the login process sheet. - self.viewModel.model.isLoginSheetPresented = false + // Not all permissions were granted + + permissionsWarning = "You have not granted the following permissions: \n\n" + for permission in notGrantedPermissions() { + self.permissionsWarning.append("\(permission.rawValue)\n ") + } + permissionsWarning.append("\nJust be aware that the app will not fully work without all permissions. You can change the permissions every time in TUMOnline.") + + notAllPermissionsGranted = true } } label: { Text("Done") .lineLimit(1) - .font(.body) + .font(.system(size: 17, weight: .bold)) .frame(width: 200, height: 48, alignment: .center) .foregroundColor(.white) - .background(.green) + .background(allPermissionsAreGranted() ? .green : .tumBlue) .cornerRadius(10) .buttonStyle(.plain) } @@ -125,6 +132,43 @@ struct TokenPermissionsView: View { .sheet(isPresented: $showTUMOnline) { SFSafariViewWrapper(url: Constants.tokenManagementTUMOnlineUrl).edgesIgnoringSafeArea(.bottom) } + .alert(isPresented: $notAllPermissionsGranted) { + Alert(title: Text("Permissions Warning"), message: Text(permissionsWarning), primaryButton: Alert.Button.cancel(), secondaryButton: Alert.Button.destructive(Text("Continue anyways"), action: { + if dismissWhenDone { + // Dismiss when view is opened from Profile/Settings. + dismiss() + } else { + // Used when shown via the login process sheet. + self.viewModel.model.isLoginSheetPresented = false + } + })) + } + .task { + await viewModel.checkPermissionFor(types: [.grades, .lectures, .calendar, .identification, .tuitionFees]) + + withAnimation() { + doneButton = true + } + } + } + + func notGrantedPermissions() -> [TokenPermissionsViewModel.PermissionType] { + return permissionTypes.filter { permissionType in + if case .success = viewModel.states[permissionType] { + return false + } else { + return true + } + } + } + + func allPermissionsAreGranted() -> Bool { + for permissionType in permissionTypes { + if case .success = viewModel.states[permissionType] {} else { + return false + } + } + return true } @ViewBuilder diff --git a/Campus-iOS/MapComponent/View/Cafeterias/CafeteriaRowView.swift b/Campus-iOS/MapComponent/View/Cafeterias/CafeteriaRowView.swift index 8d55eb02..2a1e6ec4 100644 --- a/Campus-iOS/MapComponent/View/Cafeterias/CafeteriaRowView.swift +++ b/Campus-iOS/MapComponent/View/Cafeterias/CafeteriaRowView.swift @@ -31,7 +31,7 @@ struct CafeteriaRowView: View { .font(.title3) Spacer() if let queue = cafeteria.queue { - let explainText = explainStatus ? "Auslastung " : "" + let explainText = explainStatus ? "Traffic " : "" Text("\(explainText)\(Int(queue.percent))%") .font(.footnote) .onTapGesture { diff --git a/Campus-iOS/MapComponent/View/MapContentView.swift b/Campus-iOS/MapComponent/View/MapContentView.swift index 09a0e8cd..3ade4103 100644 --- a/Campus-iOS/MapComponent/View/MapContentView.swift +++ b/Campus-iOS/MapComponent/View/MapContentView.swift @@ -39,7 +39,6 @@ struct MapContentView: UIViewRepresentable { handleCafeterias() mapView.showsUserLocation = true - self.locationManager.requestAlwaysAuthorization() self.locationManager.requestWhenInUseAuthorization() return mapView diff --git a/Campus-iOS/MapComponent/View/StudyRooms/StudyRoomGroupView.swift b/Campus-iOS/MapComponent/View/StudyRooms/StudyRoomGroupView.swift index 041602b1..9b179512 100644 --- a/Campus-iOS/MapComponent/View/StudyRooms/StudyRoomGroupView.swift +++ b/Campus-iOS/MapComponent/View/StudyRooms/StudyRoomGroupView.swift @@ -50,6 +50,7 @@ struct StudyRoomGroupView: View { VStack(spacing: 1) { HStack{ VStack(alignment: .leading){ + Spacer().frame(height: 10).gesture(panelDragGesture) Text(group.name ?? "") .bold() .font(.title3) diff --git a/Campus-iOS/MapComponent/View/StudyRooms/StudyRoomWidgetView.swift b/Campus-iOS/MapComponent/View/StudyRooms/StudyRoomWidgetView.swift index 6669bdd1..879bda65 100644 --- a/Campus-iOS/MapComponent/View/StudyRooms/StudyRoomWidgetView.swift +++ b/Campus-iOS/MapComponent/View/StudyRooms/StudyRoomWidgetView.swift @@ -173,7 +173,7 @@ struct StudyRoomWidgetHeaderView: View { VStack(alignment: .leading) { HStack { - Image(systemName: "house") + Image(systemName: "book") Text(studyGroup) .bold() .lineLimit(2) diff --git a/Campus-iOS/MoviesComponent/Views/MovieCard.swift b/Campus-iOS/MoviesComponent/Views/MovieCard.swift index 747cc4bf..bb352d45 100644 --- a/Campus-iOS/MoviesComponent/Views/MovieCard.swift +++ b/Campus-iOS/MoviesComponent/Views/MovieCard.swift @@ -19,11 +19,12 @@ struct MovieCard: View { AsyncImage(url: link) { image in switch image { case .empty: - ProgressView() + ProgressView().padding(UIScreen.main.bounds.width/2) case .success(let image): image .resizable() - .frame(width: 390 * 0.425, height: 390 * 0.525) + .aspectRatio(contentMode: .fill) + .frame(width: 390 * 0.425, height: 390 * 0.6) .clipped() case .failure: Image("movie") @@ -47,20 +48,22 @@ struct MovieCard: View { } // Stack bottom half of card - VStack(alignment: .leading, spacing: 6) { + VStack(alignment: .leading, spacing: 2) { Text(self.movie.title ?? "") .fontWeight(Font.Weight.heavy) .font(.subheadline).foregroundColor(colorScheme == .dark ? .init(UIColor.white) : .init(UIColor.black)) .fixedSize(horizontal: false, vertical: true) - .lineLimit(2) + .lineLimit(1) Text(self.movie.date ?? Date(), style: .date) .font(Font.custom("HelveticaNeue-Bold", size: 12)) .foregroundColor(Color.gray) + Spacer() } - .padding(12) + .padding(EdgeInsets(top: 15, leading: 10, bottom: 10, trailing: 5)) + .frame(height: 55) } - .frame(width: 390 * 0.425, height: 390 * 0.7) + .frame(width: 390 * 0.425, height: 390 * 0.73) .background(Color(.systemGray5)) .cornerRadius(15) .shadow(color: Color.black.opacity(0.2), radius: 7, x: 0, y: 2) diff --git a/Campus-iOS/MoviesComponent/Views/MoviesView.swift b/Campus-iOS/MoviesComponent/Views/MoviesView.swift index 707a5f22..0e20d911 100644 --- a/Campus-iOS/MoviesComponent/Views/MoviesView.swift +++ b/Campus-iOS/MoviesComponent/Views/MoviesView.swift @@ -21,9 +21,9 @@ struct MoviesView: View { Text("No more movies this semester 😢\nGet excited for the next season!") .foregroundColor(Color(UIColor.lightGray)) ScrollView(.vertical) { - LazyVGrid(columns: items, spacing: 6) { + LazyVGrid(columns: items, spacing: 10) { ForEach(self.viewModel.movies, id: \.id ) { movie in - MovieCard(movie: movie).padding(10) + MovieCard(movie: movie).padding(7) .onTapGesture { selectedMovie = movie } @@ -32,7 +32,7 @@ struct MoviesView: View { MovieDetailedView(movie: movie) } } - .padding(15) + .padding(10) .background(Color.systemsBackground) } } diff --git a/Campus-iOS/ProfileComponent/View/ProfileView.swift b/Campus-iOS/ProfileComponent/View/ProfileView.swift index 40eba78f..dbdc579e 100644 --- a/Campus-iOS/ProfileComponent/View/ProfileView.swift +++ b/Campus-iOS/ProfileComponent/View/ProfileView.swift @@ -13,6 +13,8 @@ struct ProfileView: View { @AppStorage("useBuildInWebView") var useBuildInWebView: Bool = true @AppStorage("calendarWeekDays") var calendarWeekDays: Int = 7 @Environment(\.colorScheme) var colorScheme + @State var isWebViewShowed = false + @State var selectedLink: URL? = nil var body: some View { @@ -110,11 +112,25 @@ struct ProfileView: View { } Section("GET IN CONTACT") { - Link(LocalizedStringKey("Join Beta"), destination: URL(string: "https://testflight.apple.com/join/4Ddi6f2f")!) - - Link(LocalizedStringKey("TUM Dev on Github"), destination: URL(string: "https://github.com/TUM-Dev")!) - - Link("TUM Dev Website", destination: URL(string: "https://tum.app")!) + if self.useBuildInWebView { + Button("Join Beta") { + self.selectedLink = URL(string: "https://testflight.apple.com/join/4Ddi6f2f") + } + + Button("TUM Dev on Github") { + self.selectedLink = URL(string: "https://github.com/TUM-Dev") + } + + Button("TUM Dev Website") { + self.selectedLink = URL(string: "https://tum.app") + } + } else { + Link(LocalizedStringKey("Join Beta"), destination: URL(string: "https://testflight.apple.com/join/4Ddi6f2f")!) + + Link(LocalizedStringKey("TUM Dev on Github"), destination: URL(string: "https://github.com/TUM-Dev")!) + + Link("TUM Dev Website", destination: URL(string: "https://tum.app")!) + } Button("Feedback") { let mailToString = "mailto:app@tum.de?subject=[IOS]&body=Hello I have an issue...".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) @@ -156,7 +172,7 @@ struct ProfileView: View { }) { HStack { Spacer() - Text("Version 4.0").foregroundColor(colorScheme == .dark ? .init(UIColor.lightGray) : .init(UIColor.darkGray)) + Text("Version 4.1").foregroundColor(colorScheme == .dark ? .init(UIColor.lightGray) : .init(UIColor.darkGray)) Spacer() } } @@ -186,6 +202,11 @@ struct ProfileView: View { Text("Done").bold() } } + .sheet(item: $selectedLink) { selectedLink in + if let link = selectedLink { + SFSafariViewWrapper(url: link) + } + } } } } diff --git a/Campus-iOS/WidgetComponent/Screen/WidgetScreen.swift b/Campus-iOS/WidgetComponent/Screen/WidgetScreen.swift index 7d38c7b0..9ded3a0c 100644 --- a/Campus-iOS/WidgetComponent/Screen/WidgetScreen.swift +++ b/Campus-iOS/WidgetComponent/Screen/WidgetScreen.swift @@ -11,7 +11,9 @@ import MapKit struct WidgetScreen: View { @StateObject private var recommender: WidgetRecommender + @StateObject var model: Model = Model() @State private var refresh = false + @State private var widgetTitle = String() private let timer = Timer.publish(every: 60, on: .main, in: .common).autoconnect() init(model: Model) { @@ -39,6 +41,8 @@ struct WidgetScreen: View { } .task { try? await recommender.fetchRecommendations() + if let firstName = model.profile.profile?.firstname { widgetTitle = "Hi, " + firstName } + else { widgetTitle = "Welcome"} } .onReceive(timer) { _ in refresh.toggle() @@ -53,6 +57,9 @@ struct WidgetScreen: View { var previousHeight = CGFloat.zero let maxWidth = WidgetSize.bigSquare.dimensions.0 + 2 * WidgetSize.padding + if let firstName = model.profile.profile?.firstname { widgetTitle = "Hi, " + firstName } + else { widgetTitle = "Welcome"} + return ZStack(alignment: .topLeading) { ForEach(0.. Date: Tue, 29 Nov 2022 16:08:09 +0100 Subject: [PATCH 02/14] added gRPC client and basic apns device id registering --- Campus-iOS.xcodeproj/project.pbxproj | 88 +- Campus-iOS/App.swift | 22 +- Campus-iOS/AppDelegate.swift | 44 + .../Base/Networking/CampusBackend.grpc.swift | 4057 ++++++++++++++ .../Base/Networking/CampusBackend.pb.swift | 4949 +++++++++++++++++ .../Base/Networking/CampusBackend.swift | 34 + Campus-iOS/Campus-iOS.entitlements | 4 + Campus-iOS/Info.plist | 4 + .../PushNotifications/PushNotifications.swift | 29 + 9 files changed, 9221 insertions(+), 10 deletions(-) create mode 100644 Campus-iOS/AppDelegate.swift create mode 100644 Campus-iOS/Base/Networking/CampusBackend.grpc.swift create mode 100644 Campus-iOS/Base/Networking/CampusBackend.pb.swift create mode 100644 Campus-iOS/Base/Networking/CampusBackend.swift create mode 100644 Campus-iOS/PushNotifications/PushNotifications.swift diff --git a/Campus-iOS.xcodeproj/project.pbxproj b/Campus-iOS.xcodeproj/project.pbxproj index 65d9e7ac..49c44d50 100644 --- a/Campus-iOS.xcodeproj/project.pbxproj +++ b/Campus-iOS.xcodeproj/project.pbxproj @@ -255,6 +255,16 @@ 97997AE7277234120079F809 /* XMLCoder in Frameworks */ = {isa = PBXBuildFile; productRef = 97997AE6277234120079F809 /* XMLCoder */; }; 97C9AB1227732A200097B10C /* SwiftUICharts in Frameworks */ = {isa = PBXBuildFile; productRef = 97C9AB1127732A200097B10C /* SwiftUICharts */; }; 97F8A79327E641570099EE83 /* AcademicDegree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97F8A79227E641570099EE83 /* AcademicDegree.swift */; }; + 9958318029361F6F00F25E11 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9958317F29361F6F00F25E11 /* AppDelegate.swift */; }; + 99583183293621A200F25E11 /* PushNotifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99583182293621A200F25E11 /* PushNotifications.swift */; }; + 9958318529362F9A00F25E11 /* CampusBackend.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9958318429362F9A00F25E11 /* CampusBackend.pb.swift */; }; + 9958318829362FCE00F25E11 /* SwiftProtobuf in Frameworks */ = {isa = PBXBuildFile; productRef = 9958318729362FCE00F25E11 /* SwiftProtobuf */; }; + 9958318A29362FCE00F25E11 /* SwiftProtobufPluginLibrary in Frameworks */ = {isa = PBXBuildFile; productRef = 9958318929362FCE00F25E11 /* SwiftProtobufPluginLibrary */; }; + 9958318C2936319900F25E11 /* CampusBackend.grpc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9958318B2936319900F25E11 /* CampusBackend.grpc.swift */; }; + 9958318F2936336900F25E11 /* CGRPCZlib in Frameworks */ = {isa = PBXBuildFile; productRef = 9958318E2936336900F25E11 /* CGRPCZlib */; }; + 995831912936336900F25E11 /* GRPC in Frameworks */ = {isa = PBXBuildFile; productRef = 995831902936336900F25E11 /* GRPC */; }; + 995831932936336900F25E11 /* protoc-gen-grpc-swift in Frameworks */ = {isa = PBXBuildFile; productRef = 995831922936336900F25E11 /* protoc-gen-grpc-swift */; }; + 995831952936469100F25E11 /* CampusBackend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 995831942936469000F25E11 /* CampusBackend.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -517,6 +527,11 @@ 97270F5927AB2A4900BB25E4 /* Array+Rearrange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+Rearrange.swift"; sourceTree = ""; }; 974D5B9927E5E9CB00FD7B11 /* GlowBorder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlowBorder.swift; sourceTree = ""; }; 97F8A79227E641570099EE83 /* AcademicDegree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcademicDegree.swift; sourceTree = ""; }; + 9958317F29361F6F00F25E11 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 99583182293621A200F25E11 /* PushNotifications.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushNotifications.swift; sourceTree = ""; }; + 9958318429362F9A00F25E11 /* CampusBackend.pb.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampusBackend.pb.swift; sourceTree = ""; }; + 9958318B2936319900F25E11 /* CampusBackend.grpc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampusBackend.grpc.swift; sourceTree = ""; }; + 995831942936469000F25E11 /* CampusBackend.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampusBackend.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -530,11 +545,16 @@ 97C9AB1227732A200097B10C /* SwiftUICharts in Frameworks */, 36E964AA277498B60055777F /* KVKCalendar in Frameworks */, 36FF90722773BFC300F4C785 /* FirebaseAnalytics in Frameworks */, + 995831932936336900F25E11 /* protoc-gen-grpc-swift in Frameworks */, 36FF90682773BCA600F4C785 /* SWXMLHash in Frameworks */, 36FF90742773BFC300F4C785 /* FirebaseAnalyticsSwift-Beta in Frameworks */, + 9958318A29362FCE00F25E11 /* SwiftProtobufPluginLibrary in Frameworks */, + 9958318F2936336900F25E11 /* CGRPCZlib in Frameworks */, 36FF90762773BFC300F4C785 /* FirebaseCrashlytics in Frameworks */, + 995831912936336900F25E11 /* GRPC in Frameworks */, 36203E832761BDD100C24658 /* KeychainAccess in Frameworks */, 97997AE127722D660079F809 /* Alamofire in Frameworks */, + 9958318829362FCE00F25E11 /* SwiftProtobuf in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1083,6 +1103,7 @@ 366F0E8227580CFB0091651D /* Campus-iOS */ = { isa = PBXGroup; children = ( + 995831812936215D00F25E11 /* PushNotifications */, 085DE9C428AB7C3D0045095F /* AnalyticsComponent */, 3654F3692851710E008AD5DC /* RoomFinder */, 36BB6F8027B39B2200F224AB /* LectureSearchComponent */, @@ -1115,6 +1136,7 @@ 36AD5CFD27BA064E00DAE143 /* GoogleService-Info.plist */, 366F0E8E27580CFD0091651D /* Campus_iOS.xcdatamodeld */, 366F0E8927580CFD0091651D /* Preview Content */, + 9958317F29361F6F00F25E11 /* AppDelegate.swift */, ); path = "Campus-iOS"; sourceTree = ""; @@ -1197,6 +1219,9 @@ 36AF61C127A2FD7700FEBD98 /* TUMOnlineAPI.swift */, 36AF61C227A2FD7700FEBD98 /* Cache.swift */, 36AF61C327A2FD7700FEBD98 /* TUMCabeAPI.swift */, + 9958318429362F9A00F25E11 /* CampusBackend.pb.swift */, + 9958318B2936319900F25E11 /* CampusBackend.grpc.swift */, + 995831942936469000F25E11 /* CampusBackend.swift */, ); path = Networking; sourceTree = ""; @@ -1514,6 +1539,14 @@ path = Icons; sourceTree = ""; }; + 995831812936215D00F25E11 /* PushNotifications */ = { + isa = PBXGroup; + children = ( + 99583182293621A200F25E11 /* PushNotifications.swift */, + ); + path = PushNotifications; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1542,6 +1575,11 @@ 36E964A9277498B60055777F /* KVKCalendar */, 226CB51D2798DF9C0043ABCA /* Snap */, 41D55D6D27A2EFB200DE7155 /* LRUCache */, + 9958318729362FCE00F25E11 /* SwiftProtobuf */, + 9958318929362FCE00F25E11 /* SwiftProtobufPluginLibrary */, + 9958318E2936336900F25E11 /* CGRPCZlib */, + 995831902936336900F25E11 /* GRPC */, + 995831922936336900F25E11 /* protoc-gen-grpc-swift */, ); productName = "Campus-iOS"; productReference = 366F0E8027580CFB0091651D /* Campus-iOS.app */; @@ -1626,6 +1664,8 @@ 36E964A8277498B60055777F /* XCRemoteSwiftPackageReference "KVKCalendar" */, 226CB51C2798DF9C0043ABCA /* XCRemoteSwiftPackageReference "Snap" */, 41D55D6C27A2EFB200DE7155 /* XCRemoteSwiftPackageReference "LRUCache" */, + 9958318629362FCE00F25E11 /* XCRemoteSwiftPackageReference "swift-protobuf" */, + 9958318D2936336900F25E11 /* XCRemoteSwiftPackageReference "grpc-swift" */, ); productRefGroup = 366F0E8127580CFB0091651D /* Products */; projectDirPath = ""; @@ -1734,12 +1774,14 @@ 3654F358285167C3008AD5DC /* StudyRoomsService.swift in Sources */, 36AD5CF227B7FEAD00DAE143 /* TumCalendarStyle.swift in Sources */, 36BB6F7F27B386D100F224AB /* AddToContactsView.swift in Sources */, + 9958318029361F6F00F25E11 /* AppDelegate.swift in Sources */, 36AF61DF27A2FD7800FEBD98 /* TUMOnlineAPI.swift in Sources */, 3654F37B2851710E008AD5DC /* RoomFinderListView.swift in Sources */, 36C70FB32854D2AB0097416E /* PanelContentStudyGroupsListView.swift in Sources */, 36C70FB128538A190097416E /* PanelContentCafeteriasListView.swift in Sources */, 36BB6F7D27B356C200F224AB /* PersonDetailedCellView.swift in Sources */, 36108BE727A304B5007DC62D /* MenuViewModel.swift in Sources */, + 9958318C2936319900F25E11 /* CampusBackend.grpc.swift in Sources */, 36AF61E127A2FD7800FEBD98 /* TUMCabeAPI.swift in Sources */, 3654F37D2851710E008AD5DC /* RoomFinderDetailsMapImagesView.swift in Sources */, 36108BB627A3046B007DC62D /* LectureDetailsViewModel+State.swift in Sources */, @@ -1762,6 +1804,7 @@ 3629BA3127A1D0AD0036AC80 /* ScrollableCardsViewModifier.swift in Sources */, 36108C1927A307FA007DC62D /* Grade.swift in Sources */, 36108BBA27A3046B007DC62D /* LectureDetailsScreen.swift in Sources */, + 99583183293621A200F25E11 /* PushNotifications.swift in Sources */, 36203E8D2761C6EC00C24658 /* Credentials.swift in Sources */, 08573BA7287B6152006AC06F /* GradeWidgetView.swift in Sources */, 0805E72228CA9DF5003C5CFD /* AppUsageData.swift in Sources */, @@ -1791,6 +1834,7 @@ 3654F364285168D2008AD5DC /* MapImagesHorizontalScrollingView.swift in Sources */, 36E964A5277493D90055777F /* CalendarViewModel.swift in Sources */, 0805E72428CAABB3003C5CFD /* AnalyticsError.swift in Sources */, + 9958318529362F9A00F25E11 /* CampusBackend.pb.swift in Sources */, 3654F361285168D2008AD5DC /* StudyRoomGroup.swift in Sources */, 36BB6F7927B26DE300F224AB /* TuitionView.swift in Sources */, 3654F3782851710E008AD5DC /* FoundRoom.swift in Sources */, @@ -1849,6 +1893,7 @@ 08D9535A28E34596007ED2F1 /* Array+Groups.swift in Sources */, 36108C1A27A307FA007DC62D /* Modus.swift in Sources */, 3654F38028517156008AD5DC /* ImageFullScreenView.swift in Sources */, + 995831952936469100F25E11 /* CampusBackend.swift in Sources */, 36108BC127A3046B007DC62D /* LectureView.swift in Sources */, 366F0E9027580CFD0091651D /* Campus_iOS.xcdatamodeld in Sources */, 36108BFC27A30517007DC62D /* MovieCard.swift in Sources */, @@ -2124,7 +2169,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 53; DEVELOPMENT_ASSET_PATHS = "\"Campus-iOS/Preview Content\""; - DEVELOPMENT_TEAM = 7PLLZ436SG; + DEVELOPMENT_TEAM = 2J3C6P6X3N; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -2366,6 +2411,22 @@ version = 2.10.1; }; }; + 9958318629362FCE00F25E11 /* XCRemoteSwiftPackageReference "swift-protobuf" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/apple/swift-protobuf.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; + 9958318D2936336900F25E11 /* XCRemoteSwiftPackageReference "grpc-swift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/grpc/grpc-swift.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -2424,6 +2485,31 @@ package = 97C9AB1027732A200097B10C /* XCRemoteSwiftPackageReference "SwiftUICharts" */; productName = SwiftUICharts; }; + 9958318729362FCE00F25E11 /* SwiftProtobuf */ = { + isa = XCSwiftPackageProductDependency; + package = 9958318629362FCE00F25E11 /* XCRemoteSwiftPackageReference "swift-protobuf" */; + productName = SwiftProtobuf; + }; + 9958318929362FCE00F25E11 /* SwiftProtobufPluginLibrary */ = { + isa = XCSwiftPackageProductDependency; + package = 9958318629362FCE00F25E11 /* XCRemoteSwiftPackageReference "swift-protobuf" */; + productName = SwiftProtobufPluginLibrary; + }; + 9958318E2936336900F25E11 /* CGRPCZlib */ = { + isa = XCSwiftPackageProductDependency; + package = 9958318D2936336900F25E11 /* XCRemoteSwiftPackageReference "grpc-swift" */; + productName = CGRPCZlib; + }; + 995831902936336900F25E11 /* GRPC */ = { + isa = XCSwiftPackageProductDependency; + package = 9958318D2936336900F25E11 /* XCRemoteSwiftPackageReference "grpc-swift" */; + productName = GRPC; + }; + 995831922936336900F25E11 /* protoc-gen-grpc-swift */ = { + isa = XCSwiftPackageProductDependency; + package = 9958318D2936336900F25E11 /* XCRemoteSwiftPackageReference "grpc-swift" */; + productName = "protoc-gen-grpc-swift"; + }; /* End XCSwiftPackageProductDependency section */ /* Begin XCVersionGroup section */ diff --git a/Campus-iOS/App.swift b/Campus-iOS/App.swift index 2f42c943..34fd0970 100644 --- a/Campus-iOS/App.swift +++ b/Campus-iOS/App.swift @@ -17,10 +17,14 @@ struct CampusApp: App { let persistenceController = PersistenceController.shared @State var selectedTab = 0 @State var isLoginSheetPresented = false - + + @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate + init() { FirebaseApp.configure() + UITabBar.appearance().isOpaque = true + if #available(iOS 15.0, *) { let appearance = UITabBarAppearance() UITabBar.appearance().scrollEdgeAppearance = appearance @@ -67,12 +71,12 @@ struct CampusApp: App { model: model, service: LecturesService() ), refresh: $model.isUserAuthenticated) - .navigationTitle("Lectures") - .toolbar { - ToolbarItemGroup(placement: .navigationBarTrailing) { - ProfileToolbar(model: model) - } + .navigationTitle("Lectures") + .toolbar { + ToolbarItemGroup(placement: .navigationBarTrailing) { + ProfileToolbar(model: model) } + } } .tag(1) .tabItem { @@ -81,8 +85,8 @@ struct CampusApp: App { .if(UIDevice.current.userInterfaceIdiom == .pad, transformT: { view in view.navigationViewStyle(.stack) }) - - if UIDevice.current.userInterfaceIdiom == .phone { + + if UIDevice.current.userInterfaceIdiom == .phone { NavigationView { WidgetScreen(model: model) @@ -116,7 +120,7 @@ struct CampusApp: App { view.navigationViewStyle(.stack) }) - NavigationView { + NavigationView { MapScreenView(vm: MapViewModel(cafeteriaService: CafeteriasService(), studyRoomsService: StudyRoomsService())) } .tag(3) diff --git a/Campus-iOS/AppDelegate.swift b/Campus-iOS/AppDelegate.swift new file mode 100644 index 00000000..5b6c427b --- /dev/null +++ b/Campus-iOS/AppDelegate.swift @@ -0,0 +1,44 @@ +// +// AppDelegate.swift +// Campus-iOS +// +// Created by Anton Wyrowski on 29.11.22. +// + +import Foundation +import UIKit +import UserNotifications + + +class AppDelegate: NSObject, UIApplicationDelegate { + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { + + UIApplication.shared.registerForRemoteNotifications() + registerForPushNotifications() + + return true + } + + func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { + let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) } + let token = tokenParts.joined() + + Task { + await PushNotifications.shared.registerDeviceToken(token) + } + } + + func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { + print("Failed to register for remote notifications") + print(error.localizedDescription) + } + + func registerForPushNotifications() { + UNUserNotificationCenter.current() + .requestAuthorization(options: [.alert, .sound, .badge]) { granted, _ in + print("Permission granted: \(granted)") + } + } + +} diff --git a/Campus-iOS/Base/Networking/CampusBackend.grpc.swift b/Campus-iOS/Base/Networking/CampusBackend.grpc.swift new file mode 100644 index 00000000..4f949764 --- /dev/null +++ b/Campus-iOS/Base/Networking/CampusBackend.grpc.swift @@ -0,0 +1,4057 @@ +// +// DO NOT EDIT. +// +// Generated by the protocol buffer compiler. +// Source: CampusService.proto +// + +// +// Copyright 2018, gRPC Authors All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +import GRPC +import NIO +import NIOConcurrencyHelpers +import SwiftProtobuf + + +/// Usage: instantiate `Api_CampusClient`, then call methods of this protocol to make API calls. +public protocol Api_CampusClientProtocol: GRPCClient { + var serviceName: String { get } + var interceptors: Api_CampusClientInterceptorFactoryProtocol? { get } + + func getTopNews( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getNewsSources( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func searchRooms( + _ request: Api_SearchRoomsRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getLocations( + _ request: Api_GetLocationsRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getRoomMaps( + _ request: Api_GetRoomMapsRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getRoomCoordinates( + _ request: Api_GetRoomCoordinatesRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getRoomSchedule( + _ request: Api_GetRoomScheduleRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getCafeteriaRatings( + _ request: Api_CafeteriaRatingRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getDishRatings( + _ request: Api_DishRatingRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func newCafeteriaRating( + _ request: Api_NewCafeteriaRatingRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func newDishRating( + _ request: Api_NewDishRatingRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getAvailableDishTags( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getNameTags( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getAvailableCafeteriaTags( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getCafeterias( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getDishes( + _ request: Api_GetDishesRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getResponsiblePerson( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getBuilding2Gps( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getAreaFacilitiesByBuildingNr( + _ request: Api_GetAreaFacilitiesByBuildingNrRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getListOfToilets( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getListOfElevators( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getMoreInformation( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getOpeningTimes( + _ request: Api_GetOpeningTimesRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getUpdateNote( + _ request: Api_GetUpdateNoteRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getStudyRoomList( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getEventList( + _ request: Api_GetEventListRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getKino( + _ request: Api_GetKinoRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func sendFeedback( + _ request: Api_SendFeedbackRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func sendFeedbackImage( + _ request: Api_SendFeedbackImageRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func registerDevice( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func verifyKey( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func deviceUploadGcmToken( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> UnaryCall + + func getUploadStatus( + _ request: Api_GetUploadStatusRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getNotification( + _ request: Api_NotificationsRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getNotificationConfirm( + _ request: Api_NotificationsRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func getMembers( + _ request: Api_GetMembersRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func registerIOSDevice( + _ request: Api_RegisterIOSDeviceRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func removeIOSDevice( + _ request: Api_RemoveIOSDeviceRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func addIOSDeviceUsage( + _ request: Api_AddIOSDeviceUsageRequest, + callOptions: CallOptions? + ) -> UnaryCall +} + +extension Api_CampusClientProtocol { + public var serviceName: String { + return "api.Campus" + } + + /// Unary call to GetTopNews + /// + /// - Parameters: + /// - request: Request to send to GetTopNews. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getTopNews( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getTopNews.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetTopNewsInterceptors() ?? [] + ) + } + + /// Unary call to GetNewsSources + /// + /// - Parameters: + /// - request: Request to send to GetNewsSources. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getNewsSources( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getNewsSources.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNewsSourcesInterceptors() ?? [] + ) + } + + /// Unary call to SearchRooms + /// + /// - Parameters: + /// - request: Request to send to SearchRooms. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func searchRooms( + _ request: Api_SearchRoomsRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.searchRooms.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeSearchRoomsInterceptors() ?? [] + ) + } + + /// a location is a campus location/building, e.g. "Garching Forschungszentrum" + /// + /// - Parameters: + /// - request: Request to send to GetLocations. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getLocations( + _ request: Api_GetLocationsRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getLocations.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetLocationsInterceptors() ?? [] + ) + } + + /// Unary call to GetRoomMaps + /// + /// - Parameters: + /// - request: Request to send to GetRoomMaps. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getRoomMaps( + _ request: Api_GetRoomMapsRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getRoomMaps.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetRoomMapsInterceptors() ?? [] + ) + } + + /// Unary call to GetRoomCoordinates + /// + /// - Parameters: + /// - request: Request to send to GetRoomCoordinates. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getRoomCoordinates( + _ request: Api_GetRoomCoordinatesRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getRoomCoordinates.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetRoomCoordinatesInterceptors() ?? [] + ) + } + + /// Unary call to GetRoomSchedule + /// + /// - Parameters: + /// - request: Request to send to GetRoomSchedule. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getRoomSchedule( + _ request: Api_GetRoomScheduleRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getRoomSchedule.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetRoomScheduleInterceptors() ?? [] + ) + } + + /// This endpoint retrieves Cafeteria Ratings from the Backend. + /// + /// - Parameters: + /// - request: Request to send to GetCafeteriaRatings. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getCafeteriaRatings( + _ request: Api_CafeteriaRatingRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getCafeteriaRatings.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetCafeteriaRatingsInterceptors() ?? [] + ) + } + + /// Unary call to GetDishRatings + /// + /// - Parameters: + /// - request: Request to send to GetDishRatings. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getDishRatings( + _ request: Api_DishRatingRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getDishRatings.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetDishRatingsInterceptors() ?? [] + ) + } + + /// Unary call to NewCafeteriaRating + /// + /// - Parameters: + /// - request: Request to send to NewCafeteriaRating. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func newCafeteriaRating( + _ request: Api_NewCafeteriaRatingRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.newCafeteriaRating.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeNewCafeteriaRatingInterceptors() ?? [] + ) + } + + /// Unary call to NewDishRating + /// + /// - Parameters: + /// - request: Request to send to NewDishRating. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func newDishRating( + _ request: Api_NewDishRatingRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.newDishRating.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeNewDishRatingInterceptors() ?? [] + ) + } + + /// Unary call to GetAvailableDishTags + /// + /// - Parameters: + /// - request: Request to send to GetAvailableDishTags. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getAvailableDishTags( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getAvailableDishTags.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetAvailableDishTagsInterceptors() ?? [] + ) + } + + /// Unary call to GetNameTags + /// + /// - Parameters: + /// - request: Request to send to GetNameTags. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getNameTags( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getNameTags.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNameTagsInterceptors() ?? [] + ) + } + + /// Unary call to GetAvailableCafeteriaTags + /// + /// - Parameters: + /// - request: Request to send to GetAvailableCafeteriaTags. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getAvailableCafeteriaTags( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getAvailableCafeteriaTags.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetAvailableCafeteriaTagsInterceptors() ?? [] + ) + } + + /// Unary call to GetCafeterias + /// + /// - Parameters: + /// - request: Request to send to GetCafeterias. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getCafeterias( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getCafeterias.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetCafeteriasInterceptors() ?? [] + ) + } + + /// Unary call to GetDishes + /// + /// - Parameters: + /// - request: Request to send to GetDishes. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getDishes( + _ request: Api_GetDishesRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getDishes.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetDishesInterceptors() ?? [] + ) + } + + /// Unary call to GetResponsiblePerson + /// + /// - Parameters: + /// - request: Request to send to GetResponsiblePerson. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getResponsiblePerson( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getResponsiblePerson.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetResponsiblePersonInterceptors() ?? [] + ) + } + + /// Unary call to GetBuilding2Gps + /// + /// - Parameters: + /// - request: Request to send to GetBuilding2Gps. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getBuilding2Gps( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getBuilding2Gps.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetBuilding2GpsInterceptors() ?? [] + ) + } + + /// Unary call to GetAreaFacilitiesByBuildingNr + /// + /// - Parameters: + /// - request: Request to send to GetAreaFacilitiesByBuildingNr. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getAreaFacilitiesByBuildingNr( + _ request: Api_GetAreaFacilitiesByBuildingNrRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getAreaFacilitiesByBuildingNr.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetAreaFacilitiesByBuildingNrInterceptors() ?? [] + ) + } + + /// Unary call to GetListOfToilets + /// + /// - Parameters: + /// - request: Request to send to GetListOfToilets. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getListOfToilets( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getListOfToilets.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetListOfToiletsInterceptors() ?? [] + ) + } + + /// Unary call to GetListOfElevators + /// + /// - Parameters: + /// - request: Request to send to GetListOfElevators. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getListOfElevators( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getListOfElevators.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetListOfElevatorsInterceptors() ?? [] + ) + } + + /// Unary call to GetMoreInformation + /// + /// - Parameters: + /// - request: Request to send to GetMoreInformation. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getMoreInformation( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getMoreInformation.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetMoreInformationInterceptors() ?? [] + ) + } + + /// Unary call to GetOpeningTimes + /// + /// - Parameters: + /// - request: Request to send to GetOpeningTimes. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getOpeningTimes( + _ request: Api_GetOpeningTimesRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getOpeningTimes.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetOpeningTimesInterceptors() ?? [] + ) + } + + /// Unary call to GetUpdateNote + /// + /// - Parameters: + /// - request: Request to send to GetUpdateNote. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getUpdateNote( + _ request: Api_GetUpdateNoteRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getUpdateNote.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetUpdateNoteInterceptors() ?? [] + ) + } + + /// Unary call to GetStudyRoomList + /// + /// - Parameters: + /// - request: Request to send to GetStudyRoomList. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getStudyRoomList( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getStudyRoomList.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetStudyRoomListInterceptors() ?? [] + ) + } + + /// Unary call to GetEventList + /// + /// - Parameters: + /// - request: Request to send to GetEventList. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getEventList( + _ request: Api_GetEventListRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getEventList.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetEventListInterceptors() ?? [] + ) + } + + /// Unary call to GetKino + /// + /// - Parameters: + /// - request: Request to send to GetKino. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getKino( + _ request: Api_GetKinoRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getKino.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetKinoInterceptors() ?? [] + ) + } + + /// Unary call to SendFeedback + /// + /// - Parameters: + /// - request: Request to send to SendFeedback. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func sendFeedback( + _ request: Api_SendFeedbackRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.sendFeedback.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeSendFeedbackInterceptors() ?? [] + ) + } + + /// Unary call to SendFeedbackImage + /// + /// - Parameters: + /// - request: Request to send to SendFeedbackImage. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func sendFeedbackImage( + _ request: Api_SendFeedbackImageRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.sendFeedbackImage.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeSendFeedbackImageInterceptors() ?? [] + ) + } + + /// Unary call to RegisterDevice + /// + /// - Parameters: + /// - request: Request to send to RegisterDevice. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func registerDevice( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.registerDevice.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [] + ) + } + + /// Unary call to VerifyKey + /// + /// - Parameters: + /// - request: Request to send to VerifyKey. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func verifyKey( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.verifyKey.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeVerifyKeyInterceptors() ?? [] + ) + } + + /// Unary call to DeviceUploadGcmToken + /// + /// - Parameters: + /// - request: Request to send to DeviceUploadGcmToken. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func deviceUploadGcmToken( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.deviceUploadGcmToken.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeDeviceUploadGcmTokenInterceptors() ?? [] + ) + } + + /// Unary call to GetUploadStatus + /// + /// - Parameters: + /// - request: Request to send to GetUploadStatus. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getUploadStatus( + _ request: Api_GetUploadStatusRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getUploadStatus.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetUploadStatusInterceptors() ?? [] + ) + } + + /// Unary call to GetNotification + /// + /// - Parameters: + /// - request: Request to send to GetNotification. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getNotification( + _ request: Api_NotificationsRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getNotification.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNotificationInterceptors() ?? [] + ) + } + + /// Unary call to GetNotificationConfirm + /// + /// - Parameters: + /// - request: Request to send to GetNotificationConfirm. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getNotificationConfirm( + _ request: Api_NotificationsRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getNotificationConfirm.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNotificationConfirmInterceptors() ?? [] + ) + } + + /// Unary call to GetMembers + /// + /// - Parameters: + /// - request: Request to send to GetMembers. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func getMembers( + _ request: Api_GetMembersRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getMembers.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetMembersInterceptors() ?? [] + ) + } + + /// register your ios device for push notifications + /// + /// - Parameters: + /// - request: Request to send to RegisterIOSDevice. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func registerIOSDevice( + _ request: Api_RegisterIOSDeviceRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.registerIOSDevice.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeRegisterIOSDeviceInterceptors() ?? [] + ) + } + + /// remove your ios device from the db and unregister it from push notifications + /// + /// - Parameters: + /// - request: Request to send to RemoveIOSDevice. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func removeIOSDevice( + _ request: Api_RemoveIOSDeviceRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.removeIOSDevice.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeRemoveIOSDeviceInterceptors() ?? [] + ) + } + + /// add ios device usage log to calculate notification priority + /// + /// - Parameters: + /// - request: Request to send to AddIOSDeviceUsage. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + public func addIOSDeviceUsage( + _ request: Api_AddIOSDeviceUsageRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.addIOSDeviceUsage.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeAddIOSDeviceUsageInterceptors() ?? [] + ) + } +} + +#if compiler(>=5.6) +@available(*, deprecated) +extension Api_CampusClient: @unchecked Sendable {} +#endif // compiler(>=5.6) + +@available(*, deprecated, renamed: "Api_CampusNIOClient") +public final class Api_CampusClient: Api_CampusClientProtocol { + private let lock = Lock() + private var _defaultCallOptions: CallOptions + private var _interceptors: Api_CampusClientInterceptorFactoryProtocol? + public let channel: GRPCChannel + public var defaultCallOptions: CallOptions { + get { self.lock.withLock { return self._defaultCallOptions } } + set { self.lock.withLockVoid { self._defaultCallOptions = newValue } } + } + public var interceptors: Api_CampusClientInterceptorFactoryProtocol? { + get { self.lock.withLock { return self._interceptors } } + set { self.lock.withLockVoid { self._interceptors = newValue } } + } + + /// Creates a client for the api.Campus service. + /// + /// - Parameters: + /// - channel: `GRPCChannel` to the service host. + /// - defaultCallOptions: Options to use for each service call if the user doesn't provide them. + /// - interceptors: A factory providing interceptors for each RPC. + public init( + channel: GRPCChannel, + defaultCallOptions: CallOptions = CallOptions(), + interceptors: Api_CampusClientInterceptorFactoryProtocol? = nil + ) { + self.channel = channel + self._defaultCallOptions = defaultCallOptions + self._interceptors = interceptors + } +} + +public struct Api_CampusNIOClient: Api_CampusClientProtocol { + public var channel: GRPCChannel + public var defaultCallOptions: CallOptions + public var interceptors: Api_CampusClientInterceptorFactoryProtocol? + + /// Creates a client for the api.Campus service. + /// + /// - Parameters: + /// - channel: `GRPCChannel` to the service host. + /// - defaultCallOptions: Options to use for each service call if the user doesn't provide them. + /// - interceptors: A factory providing interceptors for each RPC. + public init( + channel: GRPCChannel, + defaultCallOptions: CallOptions = CallOptions(), + interceptors: Api_CampusClientInterceptorFactoryProtocol? = nil + ) { + self.channel = channel + self.defaultCallOptions = defaultCallOptions + self.interceptors = interceptors + } +} + +#if compiler(>=5.6) +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +public protocol Api_CampusAsyncClientProtocol: GRPCClient { + static var serviceDescriptor: GRPCServiceDescriptor { get } + var interceptors: Api_CampusClientInterceptorFactoryProtocol? { get } + + func makeGetTopNewsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetNewsSourcesCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeSearchRoomsCall( + _ request: Api_SearchRoomsRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetLocationsCall( + _ request: Api_GetLocationsRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetRoomMapsCall( + _ request: Api_GetRoomMapsRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetRoomCoordinatesCall( + _ request: Api_GetRoomCoordinatesRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetRoomScheduleCall( + _ request: Api_GetRoomScheduleRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetCafeteriaRatingsCall( + _ request: Api_CafeteriaRatingRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetDishRatingsCall( + _ request: Api_DishRatingRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeNewCafeteriaRatingCall( + _ request: Api_NewCafeteriaRatingRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeNewDishRatingCall( + _ request: Api_NewDishRatingRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetAvailableDishTagsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetNameTagsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetAvailableCafeteriaTagsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetCafeteriasCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetDishesCall( + _ request: Api_GetDishesRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetResponsiblePersonCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetBuilding2GpsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetAreaFacilitiesByBuildingNrCall( + _ request: Api_GetAreaFacilitiesByBuildingNrRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetListOfToiletsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetListOfElevatorsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetMoreInformationCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetOpeningTimesCall( + _ request: Api_GetOpeningTimesRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetUpdateNoteCall( + _ request: Api_GetUpdateNoteRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetStudyRoomListCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetEventListCall( + _ request: Api_GetEventListRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetKinoCall( + _ request: Api_GetKinoRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeSendFeedbackCall( + _ request: Api_SendFeedbackRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeSendFeedbackImageCall( + _ request: Api_SendFeedbackImageRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeRegisterDeviceCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeVerifyKeyCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeDeviceUploadGcmTokenCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetUploadStatusCall( + _ request: Api_GetUploadStatusRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetNotificationCall( + _ request: Api_NotificationsRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetNotificationConfirmCall( + _ request: Api_NotificationsRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeGetMembersCall( + _ request: Api_GetMembersRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeRegisterIosdeviceCall( + _ request: Api_RegisterIOSDeviceRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeRemoveIosdeviceCall( + _ request: Api_RemoveIOSDeviceRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeAddIosdeviceUsageCall( + _ request: Api_AddIOSDeviceUsageRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +extension Api_CampusAsyncClientProtocol { + public static var serviceDescriptor: GRPCServiceDescriptor { + return Api_CampusClientMetadata.serviceDescriptor + } + + public var interceptors: Api_CampusClientInterceptorFactoryProtocol? { + return nil + } + + public func makeGetTopNewsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getTopNews.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetTopNewsInterceptors() ?? [] + ) + } + + public func makeGetNewsSourcesCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getNewsSources.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNewsSourcesInterceptors() ?? [] + ) + } + + public func makeSearchRoomsCall( + _ request: Api_SearchRoomsRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.searchRooms.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeSearchRoomsInterceptors() ?? [] + ) + } + + public func makeGetLocationsCall( + _ request: Api_GetLocationsRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getLocations.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetLocationsInterceptors() ?? [] + ) + } + + public func makeGetRoomMapsCall( + _ request: Api_GetRoomMapsRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getRoomMaps.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetRoomMapsInterceptors() ?? [] + ) + } + + public func makeGetRoomCoordinatesCall( + _ request: Api_GetRoomCoordinatesRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getRoomCoordinates.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetRoomCoordinatesInterceptors() ?? [] + ) + } + + public func makeGetRoomScheduleCall( + _ request: Api_GetRoomScheduleRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getRoomSchedule.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetRoomScheduleInterceptors() ?? [] + ) + } + + public func makeGetCafeteriaRatingsCall( + _ request: Api_CafeteriaRatingRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getCafeteriaRatings.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetCafeteriaRatingsInterceptors() ?? [] + ) + } + + public func makeGetDishRatingsCall( + _ request: Api_DishRatingRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getDishRatings.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetDishRatingsInterceptors() ?? [] + ) + } + + public func makeNewCafeteriaRatingCall( + _ request: Api_NewCafeteriaRatingRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.newCafeteriaRating.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeNewCafeteriaRatingInterceptors() ?? [] + ) + } + + public func makeNewDishRatingCall( + _ request: Api_NewDishRatingRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.newDishRating.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeNewDishRatingInterceptors() ?? [] + ) + } + + public func makeGetAvailableDishTagsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getAvailableDishTags.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetAvailableDishTagsInterceptors() ?? [] + ) + } + + public func makeGetNameTagsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getNameTags.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNameTagsInterceptors() ?? [] + ) + } + + public func makeGetAvailableCafeteriaTagsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getAvailableCafeteriaTags.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetAvailableCafeteriaTagsInterceptors() ?? [] + ) + } + + public func makeGetCafeteriasCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getCafeterias.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetCafeteriasInterceptors() ?? [] + ) + } + + public func makeGetDishesCall( + _ request: Api_GetDishesRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getDishes.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetDishesInterceptors() ?? [] + ) + } + + public func makeGetResponsiblePersonCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getResponsiblePerson.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetResponsiblePersonInterceptors() ?? [] + ) + } + + public func makeGetBuilding2GpsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getBuilding2Gps.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetBuilding2GpsInterceptors() ?? [] + ) + } + + public func makeGetAreaFacilitiesByBuildingNrCall( + _ request: Api_GetAreaFacilitiesByBuildingNrRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getAreaFacilitiesByBuildingNr.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetAreaFacilitiesByBuildingNrInterceptors() ?? [] + ) + } + + public func makeGetListOfToiletsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getListOfToilets.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetListOfToiletsInterceptors() ?? [] + ) + } + + public func makeGetListOfElevatorsCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getListOfElevators.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetListOfElevatorsInterceptors() ?? [] + ) + } + + public func makeGetMoreInformationCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getMoreInformation.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetMoreInformationInterceptors() ?? [] + ) + } + + public func makeGetOpeningTimesCall( + _ request: Api_GetOpeningTimesRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getOpeningTimes.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetOpeningTimesInterceptors() ?? [] + ) + } + + public func makeGetUpdateNoteCall( + _ request: Api_GetUpdateNoteRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getUpdateNote.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetUpdateNoteInterceptors() ?? [] + ) + } + + public func makeGetStudyRoomListCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getStudyRoomList.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetStudyRoomListInterceptors() ?? [] + ) + } + + public func makeGetEventListCall( + _ request: Api_GetEventListRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getEventList.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetEventListInterceptors() ?? [] + ) + } + + public func makeGetKinoCall( + _ request: Api_GetKinoRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getKino.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetKinoInterceptors() ?? [] + ) + } + + public func makeSendFeedbackCall( + _ request: Api_SendFeedbackRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.sendFeedback.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeSendFeedbackInterceptors() ?? [] + ) + } + + public func makeSendFeedbackImageCall( + _ request: Api_SendFeedbackImageRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.sendFeedbackImage.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeSendFeedbackImageInterceptors() ?? [] + ) + } + + public func makeRegisterDeviceCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.registerDevice.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [] + ) + } + + public func makeVerifyKeyCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.verifyKey.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeVerifyKeyInterceptors() ?? [] + ) + } + + public func makeDeviceUploadGcmTokenCall( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.deviceUploadGcmToken.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeDeviceUploadGcmTokenInterceptors() ?? [] + ) + } + + public func makeGetUploadStatusCall( + _ request: Api_GetUploadStatusRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getUploadStatus.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetUploadStatusInterceptors() ?? [] + ) + } + + public func makeGetNotificationCall( + _ request: Api_NotificationsRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getNotification.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNotificationInterceptors() ?? [] + ) + } + + public func makeGetNotificationConfirmCall( + _ request: Api_NotificationsRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getNotificationConfirm.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNotificationConfirmInterceptors() ?? [] + ) + } + + public func makeGetMembersCall( + _ request: Api_GetMembersRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getMembers.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetMembersInterceptors() ?? [] + ) + } + + public func makeRegisterIosdeviceCall( + _ request: Api_RegisterIOSDeviceRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.registerIOSDevice.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeRegisterIOSDeviceInterceptors() ?? [] + ) + } + + public func makeRemoveIosdeviceCall( + _ request: Api_RemoveIOSDeviceRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.removeIOSDevice.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeRemoveIOSDeviceInterceptors() ?? [] + ) + } + + public func makeAddIosdeviceUsageCall( + _ request: Api_AddIOSDeviceUsageRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.addIOSDeviceUsage.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeAddIOSDeviceUsageInterceptors() ?? [] + ) + } +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +extension Api_CampusAsyncClientProtocol { + public func getTopNews( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_GetTopNewsReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getTopNews.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetTopNewsInterceptors() ?? [] + ) + } + + public func getNewsSources( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_NewsSourceArray { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getNewsSources.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNewsSourcesInterceptors() ?? [] + ) + } + + public func searchRooms( + _ request: Api_SearchRoomsRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_SearchRoomsReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.searchRooms.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeSearchRoomsInterceptors() ?? [] + ) + } + + public func getLocations( + _ request: Api_GetLocationsRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetLocationsReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getLocations.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetLocationsInterceptors() ?? [] + ) + } + + public func getRoomMaps( + _ request: Api_GetRoomMapsRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetRoomMapsReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getRoomMaps.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetRoomMapsInterceptors() ?? [] + ) + } + + public func getRoomCoordinates( + _ request: Api_GetRoomCoordinatesRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetRoomCoordinatesReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getRoomCoordinates.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetRoomCoordinatesInterceptors() ?? [] + ) + } + + public func getRoomSchedule( + _ request: Api_GetRoomScheduleRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetRoomScheduleReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getRoomSchedule.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetRoomScheduleInterceptors() ?? [] + ) + } + + public func getCafeteriaRatings( + _ request: Api_CafeteriaRatingRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_CafeteriaRatingReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getCafeteriaRatings.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetCafeteriaRatingsInterceptors() ?? [] + ) + } + + public func getDishRatings( + _ request: Api_DishRatingRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_DishRatingReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getDishRatings.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetDishRatingsInterceptors() ?? [] + ) + } + + public func newCafeteriaRating( + _ request: Api_NewCafeteriaRatingRequest, + callOptions: CallOptions? = nil + ) async throws -> SwiftProtobuf.Google_Protobuf_Empty { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.newCafeteriaRating.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeNewCafeteriaRatingInterceptors() ?? [] + ) + } + + public func newDishRating( + _ request: Api_NewDishRatingRequest, + callOptions: CallOptions? = nil + ) async throws -> SwiftProtobuf.Google_Protobuf_Empty { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.newDishRating.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeNewDishRatingInterceptors() ?? [] + ) + } + + public func getAvailableDishTags( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_GetTagsReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getAvailableDishTags.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetAvailableDishTagsInterceptors() ?? [] + ) + } + + public func getNameTags( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_GetTagsReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getNameTags.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNameTagsInterceptors() ?? [] + ) + } + + public func getAvailableCafeteriaTags( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_GetTagsReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getAvailableCafeteriaTags.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetAvailableCafeteriaTagsInterceptors() ?? [] + ) + } + + public func getCafeterias( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_GetCafeteriaReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getCafeterias.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetCafeteriasInterceptors() ?? [] + ) + } + + public func getDishes( + _ request: Api_GetDishesRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetDishesReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getDishes.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetDishesInterceptors() ?? [] + ) + } + + public func getResponsiblePerson( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_GetResponsiblePersonReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getResponsiblePerson.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetResponsiblePersonInterceptors() ?? [] + ) + } + + public func getBuilding2Gps( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_GetBuilding2GpsReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getBuilding2Gps.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetBuilding2GpsInterceptors() ?? [] + ) + } + + public func getAreaFacilitiesByBuildingNr( + _ request: Api_GetAreaFacilitiesByBuildingNrRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetAreaFacilitiesByBuildingNrReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getAreaFacilitiesByBuildingNr.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetAreaFacilitiesByBuildingNrInterceptors() ?? [] + ) + } + + public func getListOfToilets( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_GetListOfToiletsReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getListOfToilets.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetListOfToiletsInterceptors() ?? [] + ) + } + + public func getListOfElevators( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_GetListOfElevatorsReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getListOfElevators.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetListOfElevatorsInterceptors() ?? [] + ) + } + + public func getMoreInformation( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_GetMoreInformationReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getMoreInformation.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetMoreInformationInterceptors() ?? [] + ) + } + + public func getOpeningTimes( + _ request: Api_GetOpeningTimesRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetOpeningTimesReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getOpeningTimes.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetOpeningTimesInterceptors() ?? [] + ) + } + + public func getUpdateNote( + _ request: Api_GetUpdateNoteRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetUpdateNoteReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getUpdateNote.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetUpdateNoteInterceptors() ?? [] + ) + } + + public func getStudyRoomList( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_GetStudyRoomListReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getStudyRoomList.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetStudyRoomListInterceptors() ?? [] + ) + } + + public func getEventList( + _ request: Api_GetEventListRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetEventListReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getEventList.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetEventListInterceptors() ?? [] + ) + } + + public func getKino( + _ request: Api_GetKinoRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetKinoReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getKino.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetKinoInterceptors() ?? [] + ) + } + + public func sendFeedback( + _ request: Api_SendFeedbackRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_SendFeedbackImageReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.sendFeedback.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeSendFeedbackInterceptors() ?? [] + ) + } + + public func sendFeedbackImage( + _ request: Api_SendFeedbackImageRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_SendFeedbackImageReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.sendFeedbackImage.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeSendFeedbackImageInterceptors() ?? [] + ) + } + + public func registerDevice( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_TUMCabeStatus { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.registerDevice.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [] + ) + } + + public func verifyKey( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_TUMCabeStatus { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.verifyKey.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeVerifyKeyInterceptors() ?? [] + ) + } + + public func deviceUploadGcmToken( + _ request: SwiftProtobuf.Google_Protobuf_Empty, + callOptions: CallOptions? = nil + ) async throws -> Api_TUMCabeStatus { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.deviceUploadGcmToken.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeDeviceUploadGcmTokenInterceptors() ?? [] + ) + } + + public func getUploadStatus( + _ request: Api_GetUploadStatusRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetUploadStatusReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getUploadStatus.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetUploadStatusInterceptors() ?? [] + ) + } + + public func getNotification( + _ request: Api_NotificationsRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetNotificationsReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getNotification.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNotificationInterceptors() ?? [] + ) + } + + public func getNotificationConfirm( + _ request: Api_NotificationsRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetNotificationsConfirmReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getNotificationConfirm.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetNotificationConfirmInterceptors() ?? [] + ) + } + + public func getMembers( + _ request: Api_GetMembersRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_GetMembersReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.getMembers.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetMembersInterceptors() ?? [] + ) + } + + public func registerIOSDevice( + _ request: Api_RegisterIOSDeviceRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_RegisterIOSDeviceReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.registerIOSDevice.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeRegisterIOSDeviceInterceptors() ?? [] + ) + } + + public func removeIOSDevice( + _ request: Api_RemoveIOSDeviceRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_RemoveIOSDeviceReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.removeIOSDevice.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeRemoveIOSDeviceInterceptors() ?? [] + ) + } + + public func addIOSDeviceUsage( + _ request: Api_AddIOSDeviceUsageRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_AddIOSDeviceUsageReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.addIOSDeviceUsage.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeAddIOSDeviceUsageInterceptors() ?? [] + ) + } +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +public struct Api_CampusAsyncClient: Api_CampusAsyncClientProtocol { + public var channel: GRPCChannel + public var defaultCallOptions: CallOptions + public var interceptors: Api_CampusClientInterceptorFactoryProtocol? + + public init( + channel: GRPCChannel, + defaultCallOptions: CallOptions = CallOptions(), + interceptors: Api_CampusClientInterceptorFactoryProtocol? = nil + ) { + self.channel = channel + self.defaultCallOptions = defaultCallOptions + self.interceptors = interceptors + } +} + +#endif // compiler(>=5.6) + +public protocol Api_CampusClientInterceptorFactoryProtocol: GRPCSendable { + + /// - Returns: Interceptors to use when invoking 'getTopNews'. + func makeGetTopNewsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getNewsSources'. + func makeGetNewsSourcesInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'searchRooms'. + func makeSearchRoomsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getLocations'. + func makeGetLocationsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getRoomMaps'. + func makeGetRoomMapsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getRoomCoordinates'. + func makeGetRoomCoordinatesInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getRoomSchedule'. + func makeGetRoomScheduleInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getCafeteriaRatings'. + func makeGetCafeteriaRatingsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getDishRatings'. + func makeGetDishRatingsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'newCafeteriaRating'. + func makeNewCafeteriaRatingInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'newDishRating'. + func makeNewDishRatingInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getAvailableDishTags'. + func makeGetAvailableDishTagsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getNameTags'. + func makeGetNameTagsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getAvailableCafeteriaTags'. + func makeGetAvailableCafeteriaTagsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getCafeterias'. + func makeGetCafeteriasInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getDishes'. + func makeGetDishesInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getResponsiblePerson'. + func makeGetResponsiblePersonInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getBuilding2Gps'. + func makeGetBuilding2GpsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getAreaFacilitiesByBuildingNr'. + func makeGetAreaFacilitiesByBuildingNrInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getListOfToilets'. + func makeGetListOfToiletsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getListOfElevators'. + func makeGetListOfElevatorsInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getMoreInformation'. + func makeGetMoreInformationInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getOpeningTimes'. + func makeGetOpeningTimesInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getUpdateNote'. + func makeGetUpdateNoteInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getStudyRoomList'. + func makeGetStudyRoomListInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getEventList'. + func makeGetEventListInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getKino'. + func makeGetKinoInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'sendFeedback'. + func makeSendFeedbackInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'sendFeedbackImage'. + func makeSendFeedbackImageInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'registerDevice'. + func makeRegisterDeviceInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'verifyKey'. + func makeVerifyKeyInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'deviceUploadGcmToken'. + func makeDeviceUploadGcmTokenInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getUploadStatus'. + func makeGetUploadStatusInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getNotification'. + func makeGetNotificationInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getNotificationConfirm'. + func makeGetNotificationConfirmInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'getMembers'. + func makeGetMembersInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'registerIOSDevice'. + func makeRegisterIOSDeviceInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'removeIOSDevice'. + func makeRemoveIOSDeviceInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'addIOSDeviceUsage'. + func makeAddIOSDeviceUsageInterceptors() -> [ClientInterceptor] +} + +public enum Api_CampusClientMetadata { + public static let serviceDescriptor = GRPCServiceDescriptor( + name: "Campus", + fullName: "api.Campus", + methods: [ + Api_CampusClientMetadata.Methods.getTopNews, + Api_CampusClientMetadata.Methods.getNewsSources, + Api_CampusClientMetadata.Methods.searchRooms, + Api_CampusClientMetadata.Methods.getLocations, + Api_CampusClientMetadata.Methods.getRoomMaps, + Api_CampusClientMetadata.Methods.getRoomCoordinates, + Api_CampusClientMetadata.Methods.getRoomSchedule, + Api_CampusClientMetadata.Methods.getCafeteriaRatings, + Api_CampusClientMetadata.Methods.getDishRatings, + Api_CampusClientMetadata.Methods.newCafeteriaRating, + Api_CampusClientMetadata.Methods.newDishRating, + Api_CampusClientMetadata.Methods.getAvailableDishTags, + Api_CampusClientMetadata.Methods.getNameTags, + Api_CampusClientMetadata.Methods.getAvailableCafeteriaTags, + Api_CampusClientMetadata.Methods.getCafeterias, + Api_CampusClientMetadata.Methods.getDishes, + Api_CampusClientMetadata.Methods.getResponsiblePerson, + Api_CampusClientMetadata.Methods.getBuilding2Gps, + Api_CampusClientMetadata.Methods.getAreaFacilitiesByBuildingNr, + Api_CampusClientMetadata.Methods.getListOfToilets, + Api_CampusClientMetadata.Methods.getListOfElevators, + Api_CampusClientMetadata.Methods.getMoreInformation, + Api_CampusClientMetadata.Methods.getOpeningTimes, + Api_CampusClientMetadata.Methods.getUpdateNote, + Api_CampusClientMetadata.Methods.getStudyRoomList, + Api_CampusClientMetadata.Methods.getEventList, + Api_CampusClientMetadata.Methods.getKino, + Api_CampusClientMetadata.Methods.sendFeedback, + Api_CampusClientMetadata.Methods.sendFeedbackImage, + Api_CampusClientMetadata.Methods.registerDevice, + Api_CampusClientMetadata.Methods.verifyKey, + Api_CampusClientMetadata.Methods.deviceUploadGcmToken, + Api_CampusClientMetadata.Methods.getUploadStatus, + Api_CampusClientMetadata.Methods.getNotification, + Api_CampusClientMetadata.Methods.getNotificationConfirm, + Api_CampusClientMetadata.Methods.getMembers, + Api_CampusClientMetadata.Methods.registerIOSDevice, + Api_CampusClientMetadata.Methods.removeIOSDevice, + Api_CampusClientMetadata.Methods.addIOSDeviceUsage, + ] + ) + + public enum Methods { + public static let getTopNews = GRPCMethodDescriptor( + name: "GetTopNews", + path: "/api.Campus/GetTopNews", + type: GRPCCallType.unary + ) + + public static let getNewsSources = GRPCMethodDescriptor( + name: "GetNewsSources", + path: "/api.Campus/GetNewsSources", + type: GRPCCallType.unary + ) + + public static let searchRooms = GRPCMethodDescriptor( + name: "SearchRooms", + path: "/api.Campus/SearchRooms", + type: GRPCCallType.unary + ) + + public static let getLocations = GRPCMethodDescriptor( + name: "GetLocations", + path: "/api.Campus/GetLocations", + type: GRPCCallType.unary + ) + + public static let getRoomMaps = GRPCMethodDescriptor( + name: "GetRoomMaps", + path: "/api.Campus/GetRoomMaps", + type: GRPCCallType.unary + ) + + public static let getRoomCoordinates = GRPCMethodDescriptor( + name: "GetRoomCoordinates", + path: "/api.Campus/GetRoomCoordinates", + type: GRPCCallType.unary + ) + + public static let getRoomSchedule = GRPCMethodDescriptor( + name: "GetRoomSchedule", + path: "/api.Campus/GetRoomSchedule", + type: GRPCCallType.unary + ) + + public static let getCafeteriaRatings = GRPCMethodDescriptor( + name: "GetCafeteriaRatings", + path: "/api.Campus/GetCafeteriaRatings", + type: GRPCCallType.unary + ) + + public static let getDishRatings = GRPCMethodDescriptor( + name: "GetDishRatings", + path: "/api.Campus/GetDishRatings", + type: GRPCCallType.unary + ) + + public static let newCafeteriaRating = GRPCMethodDescriptor( + name: "NewCafeteriaRating", + path: "/api.Campus/NewCafeteriaRating", + type: GRPCCallType.unary + ) + + public static let newDishRating = GRPCMethodDescriptor( + name: "NewDishRating", + path: "/api.Campus/NewDishRating", + type: GRPCCallType.unary + ) + + public static let getAvailableDishTags = GRPCMethodDescriptor( + name: "GetAvailableDishTags", + path: "/api.Campus/GetAvailableDishTags", + type: GRPCCallType.unary + ) + + public static let getNameTags = GRPCMethodDescriptor( + name: "GetNameTags", + path: "/api.Campus/GetNameTags", + type: GRPCCallType.unary + ) + + public static let getAvailableCafeteriaTags = GRPCMethodDescriptor( + name: "GetAvailableCafeteriaTags", + path: "/api.Campus/GetAvailableCafeteriaTags", + type: GRPCCallType.unary + ) + + public static let getCafeterias = GRPCMethodDescriptor( + name: "GetCafeterias", + path: "/api.Campus/GetCafeterias", + type: GRPCCallType.unary + ) + + public static let getDishes = GRPCMethodDescriptor( + name: "GetDishes", + path: "/api.Campus/GetDishes", + type: GRPCCallType.unary + ) + + public static let getResponsiblePerson = GRPCMethodDescriptor( + name: "GetResponsiblePerson", + path: "/api.Campus/GetResponsiblePerson", + type: GRPCCallType.unary + ) + + public static let getBuilding2Gps = GRPCMethodDescriptor( + name: "GetBuilding2Gps", + path: "/api.Campus/GetBuilding2Gps", + type: GRPCCallType.unary + ) + + public static let getAreaFacilitiesByBuildingNr = GRPCMethodDescriptor( + name: "GetAreaFacilitiesByBuildingNr", + path: "/api.Campus/GetAreaFacilitiesByBuildingNr", + type: GRPCCallType.unary + ) + + public static let getListOfToilets = GRPCMethodDescriptor( + name: "GetListOfToilets", + path: "/api.Campus/GetListOfToilets", + type: GRPCCallType.unary + ) + + public static let getListOfElevators = GRPCMethodDescriptor( + name: "GetListOfElevators", + path: "/api.Campus/GetListOfElevators", + type: GRPCCallType.unary + ) + + public static let getMoreInformation = GRPCMethodDescriptor( + name: "GetMoreInformation", + path: "/api.Campus/GetMoreInformation", + type: GRPCCallType.unary + ) + + public static let getOpeningTimes = GRPCMethodDescriptor( + name: "GetOpeningTimes", + path: "/api.Campus/GetOpeningTimes", + type: GRPCCallType.unary + ) + + public static let getUpdateNote = GRPCMethodDescriptor( + name: "GetUpdateNote", + path: "/api.Campus/GetUpdateNote", + type: GRPCCallType.unary + ) + + public static let getStudyRoomList = GRPCMethodDescriptor( + name: "GetStudyRoomList", + path: "/api.Campus/GetStudyRoomList", + type: GRPCCallType.unary + ) + + public static let getEventList = GRPCMethodDescriptor( + name: "GetEventList", + path: "/api.Campus/GetEventList", + type: GRPCCallType.unary + ) + + public static let getKino = GRPCMethodDescriptor( + name: "GetKino", + path: "/api.Campus/GetKino", + type: GRPCCallType.unary + ) + + public static let sendFeedback = GRPCMethodDescriptor( + name: "SendFeedback", + path: "/api.Campus/SendFeedback", + type: GRPCCallType.unary + ) + + public static let sendFeedbackImage = GRPCMethodDescriptor( + name: "SendFeedbackImage", + path: "/api.Campus/SendFeedbackImage", + type: GRPCCallType.unary + ) + + public static let registerDevice = GRPCMethodDescriptor( + name: "RegisterDevice", + path: "/api.Campus/RegisterDevice", + type: GRPCCallType.unary + ) + + public static let verifyKey = GRPCMethodDescriptor( + name: "VerifyKey", + path: "/api.Campus/VerifyKey", + type: GRPCCallType.unary + ) + + public static let deviceUploadGcmToken = GRPCMethodDescriptor( + name: "DeviceUploadGcmToken", + path: "/api.Campus/DeviceUploadGcmToken", + type: GRPCCallType.unary + ) + + public static let getUploadStatus = GRPCMethodDescriptor( + name: "GetUploadStatus", + path: "/api.Campus/GetUploadStatus", + type: GRPCCallType.unary + ) + + public static let getNotification = GRPCMethodDescriptor( + name: "GetNotification", + path: "/api.Campus/GetNotification", + type: GRPCCallType.unary + ) + + public static let getNotificationConfirm = GRPCMethodDescriptor( + name: "GetNotificationConfirm", + path: "/api.Campus/GetNotificationConfirm", + type: GRPCCallType.unary + ) + + public static let getMembers = GRPCMethodDescriptor( + name: "GetMembers", + path: "/api.Campus/GetMembers", + type: GRPCCallType.unary + ) + + public static let registerIOSDevice = GRPCMethodDescriptor( + name: "RegisterIOSDevice", + path: "/api.Campus/RegisterIOSDevice", + type: GRPCCallType.unary + ) + + public static let removeIOSDevice = GRPCMethodDescriptor( + name: "RemoveIOSDevice", + path: "/api.Campus/RemoveIOSDevice", + type: GRPCCallType.unary + ) + + public static let addIOSDeviceUsage = GRPCMethodDescriptor( + name: "AddIOSDeviceUsage", + path: "/api.Campus/AddIOSDeviceUsage", + type: GRPCCallType.unary + ) + } +} + +/// To build a server, implement a class that conforms to this protocol. +public protocol Api_CampusProvider: CallHandlerProvider { + var interceptors: Api_CampusServerInterceptorFactoryProtocol? { get } + + func getTopNews(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getNewsSources(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func searchRooms(request: Api_SearchRoomsRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + /// a location is a campus location/building, e.g. "Garching Forschungszentrum" + func getLocations(request: Api_GetLocationsRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getRoomMaps(request: Api_GetRoomMapsRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getRoomCoordinates(request: Api_GetRoomCoordinatesRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getRoomSchedule(request: Api_GetRoomScheduleRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + /// This endpoint retrieves Cafeteria Ratings from the Backend. + func getCafeteriaRatings(request: Api_CafeteriaRatingRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getDishRatings(request: Api_DishRatingRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func newCafeteriaRating(request: Api_NewCafeteriaRatingRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func newDishRating(request: Api_NewDishRatingRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getAvailableDishTags(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getNameTags(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getAvailableCafeteriaTags(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getCafeterias(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getDishes(request: Api_GetDishesRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getResponsiblePerson(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getBuilding2Gps(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getAreaFacilitiesByBuildingNr(request: Api_GetAreaFacilitiesByBuildingNrRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getListOfToilets(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getListOfElevators(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getMoreInformation(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getOpeningTimes(request: Api_GetOpeningTimesRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getUpdateNote(request: Api_GetUpdateNoteRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getStudyRoomList(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getEventList(request: Api_GetEventListRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getKino(request: Api_GetKinoRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func sendFeedback(request: Api_SendFeedbackRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func sendFeedbackImage(request: Api_SendFeedbackImageRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func registerDevice(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func verifyKey(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func deviceUploadGcmToken(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture + + func getUploadStatus(request: Api_GetUploadStatusRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getNotification(request: Api_NotificationsRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getNotificationConfirm(request: Api_NotificationsRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + func getMembers(request: Api_GetMembersRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + /// register your ios device for push notifications + func registerIOSDevice(request: Api_RegisterIOSDeviceRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + /// remove your ios device from the db and unregister it from push notifications + func removeIOSDevice(request: Api_RemoveIOSDeviceRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + /// add ios device usage log to calculate notification priority + func addIOSDeviceUsage(request: Api_AddIOSDeviceUsageRequest, context: StatusOnlyCallContext) -> EventLoopFuture +} + +extension Api_CampusProvider { + public var serviceName: Substring { + return Api_CampusServerMetadata.serviceDescriptor.fullName[...] + } + + /// Determines, calls and returns the appropriate request handler, depending on the request's method. + /// Returns nil for methods not handled by this service. + public func handle( + method name: Substring, + context: CallHandlerContext + ) -> GRPCServerHandlerProtocol? { + switch name { + case "GetTopNews": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetTopNewsInterceptors() ?? [], + userFunction: self.getTopNews(request:context:) + ) + + case "GetNewsSources": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetNewsSourcesInterceptors() ?? [], + userFunction: self.getNewsSources(request:context:) + ) + + case "SearchRooms": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeSearchRoomsInterceptors() ?? [], + userFunction: self.searchRooms(request:context:) + ) + + case "GetLocations": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetLocationsInterceptors() ?? [], + userFunction: self.getLocations(request:context:) + ) + + case "GetRoomMaps": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetRoomMapsInterceptors() ?? [], + userFunction: self.getRoomMaps(request:context:) + ) + + case "GetRoomCoordinates": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetRoomCoordinatesInterceptors() ?? [], + userFunction: self.getRoomCoordinates(request:context:) + ) + + case "GetRoomSchedule": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetRoomScheduleInterceptors() ?? [], + userFunction: self.getRoomSchedule(request:context:) + ) + + case "GetCafeteriaRatings": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetCafeteriaRatingsInterceptors() ?? [], + userFunction: self.getCafeteriaRatings(request:context:) + ) + + case "GetDishRatings": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetDishRatingsInterceptors() ?? [], + userFunction: self.getDishRatings(request:context:) + ) + + case "NewCafeteriaRating": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeNewCafeteriaRatingInterceptors() ?? [], + userFunction: self.newCafeteriaRating(request:context:) + ) + + case "NewDishRating": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeNewDishRatingInterceptors() ?? [], + userFunction: self.newDishRating(request:context:) + ) + + case "GetAvailableDishTags": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetAvailableDishTagsInterceptors() ?? [], + userFunction: self.getAvailableDishTags(request:context:) + ) + + case "GetNameTags": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetNameTagsInterceptors() ?? [], + userFunction: self.getNameTags(request:context:) + ) + + case "GetAvailableCafeteriaTags": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetAvailableCafeteriaTagsInterceptors() ?? [], + userFunction: self.getAvailableCafeteriaTags(request:context:) + ) + + case "GetCafeterias": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetCafeteriasInterceptors() ?? [], + userFunction: self.getCafeterias(request:context:) + ) + + case "GetDishes": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetDishesInterceptors() ?? [], + userFunction: self.getDishes(request:context:) + ) + + case "GetResponsiblePerson": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetResponsiblePersonInterceptors() ?? [], + userFunction: self.getResponsiblePerson(request:context:) + ) + + case "GetBuilding2Gps": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetBuilding2GpsInterceptors() ?? [], + userFunction: self.getBuilding2Gps(request:context:) + ) + + case "GetAreaFacilitiesByBuildingNr": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetAreaFacilitiesByBuildingNrInterceptors() ?? [], + userFunction: self.getAreaFacilitiesByBuildingNr(request:context:) + ) + + case "GetListOfToilets": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetListOfToiletsInterceptors() ?? [], + userFunction: self.getListOfToilets(request:context:) + ) + + case "GetListOfElevators": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetListOfElevatorsInterceptors() ?? [], + userFunction: self.getListOfElevators(request:context:) + ) + + case "GetMoreInformation": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetMoreInformationInterceptors() ?? [], + userFunction: self.getMoreInformation(request:context:) + ) + + case "GetOpeningTimes": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetOpeningTimesInterceptors() ?? [], + userFunction: self.getOpeningTimes(request:context:) + ) + + case "GetUpdateNote": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetUpdateNoteInterceptors() ?? [], + userFunction: self.getUpdateNote(request:context:) + ) + + case "GetStudyRoomList": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetStudyRoomListInterceptors() ?? [], + userFunction: self.getStudyRoomList(request:context:) + ) + + case "GetEventList": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetEventListInterceptors() ?? [], + userFunction: self.getEventList(request:context:) + ) + + case "GetKino": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetKinoInterceptors() ?? [], + userFunction: self.getKino(request:context:) + ) + + case "SendFeedback": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeSendFeedbackInterceptors() ?? [], + userFunction: self.sendFeedback(request:context:) + ) + + case "SendFeedbackImage": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeSendFeedbackImageInterceptors() ?? [], + userFunction: self.sendFeedbackImage(request:context:) + ) + + case "RegisterDevice": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [], + userFunction: self.registerDevice(request:context:) + ) + + case "VerifyKey": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeVerifyKeyInterceptors() ?? [], + userFunction: self.verifyKey(request:context:) + ) + + case "DeviceUploadGcmToken": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeDeviceUploadGcmTokenInterceptors() ?? [], + userFunction: self.deviceUploadGcmToken(request:context:) + ) + + case "GetUploadStatus": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetUploadStatusInterceptors() ?? [], + userFunction: self.getUploadStatus(request:context:) + ) + + case "GetNotification": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetNotificationInterceptors() ?? [], + userFunction: self.getNotification(request:context:) + ) + + case "GetNotificationConfirm": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetNotificationConfirmInterceptors() ?? [], + userFunction: self.getNotificationConfirm(request:context:) + ) + + case "GetMembers": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetMembersInterceptors() ?? [], + userFunction: self.getMembers(request:context:) + ) + + case "RegisterIOSDevice": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeRegisterIOSDeviceInterceptors() ?? [], + userFunction: self.registerIOSDevice(request:context:) + ) + + case "RemoveIOSDevice": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeRemoveIOSDeviceInterceptors() ?? [], + userFunction: self.removeIOSDevice(request:context:) + ) + + case "AddIOSDeviceUsage": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeAddIOSDeviceUsageInterceptors() ?? [], + userFunction: self.addIOSDeviceUsage(request:context:) + ) + + default: + return nil + } + } +} + +#if compiler(>=5.6) + +/// To implement a server, implement an object which conforms to this protocol. +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +public protocol Api_CampusAsyncProvider: CallHandlerProvider { + static var serviceDescriptor: GRPCServiceDescriptor { get } + var interceptors: Api_CampusServerInterceptorFactoryProtocol? { get } + + @Sendable func getTopNews( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetTopNewsReply + + @Sendable func getNewsSources( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_NewsSourceArray + + @Sendable func searchRooms( + request: Api_SearchRoomsRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_SearchRoomsReply + + /// a location is a campus location/building, e.g. "Garching Forschungszentrum" + @Sendable func getLocations( + request: Api_GetLocationsRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetLocationsReply + + @Sendable func getRoomMaps( + request: Api_GetRoomMapsRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetRoomMapsReply + + @Sendable func getRoomCoordinates( + request: Api_GetRoomCoordinatesRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetRoomCoordinatesReply + + @Sendable func getRoomSchedule( + request: Api_GetRoomScheduleRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetRoomScheduleReply + + /// This endpoint retrieves Cafeteria Ratings from the Backend. + @Sendable func getCafeteriaRatings( + request: Api_CafeteriaRatingRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_CafeteriaRatingReply + + @Sendable func getDishRatings( + request: Api_DishRatingRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_DishRatingReply + + @Sendable func newCafeteriaRating( + request: Api_NewCafeteriaRatingRequest, + context: GRPCAsyncServerCallContext + ) async throws -> SwiftProtobuf.Google_Protobuf_Empty + + @Sendable func newDishRating( + request: Api_NewDishRatingRequest, + context: GRPCAsyncServerCallContext + ) async throws -> SwiftProtobuf.Google_Protobuf_Empty + + @Sendable func getAvailableDishTags( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetTagsReply + + @Sendable func getNameTags( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetTagsReply + + @Sendable func getAvailableCafeteriaTags( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetTagsReply + + @Sendable func getCafeterias( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetCafeteriaReply + + @Sendable func getDishes( + request: Api_GetDishesRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetDishesReply + + @Sendable func getResponsiblePerson( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetResponsiblePersonReply + + @Sendable func getBuilding2Gps( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetBuilding2GpsReply + + @Sendable func getAreaFacilitiesByBuildingNr( + request: Api_GetAreaFacilitiesByBuildingNrRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetAreaFacilitiesByBuildingNrReply + + @Sendable func getListOfToilets( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetListOfToiletsReply + + @Sendable func getListOfElevators( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetListOfElevatorsReply + + @Sendable func getMoreInformation( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetMoreInformationReply + + @Sendable func getOpeningTimes( + request: Api_GetOpeningTimesRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetOpeningTimesReply + + @Sendable func getUpdateNote( + request: Api_GetUpdateNoteRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetUpdateNoteReply + + @Sendable func getStudyRoomList( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetStudyRoomListReply + + @Sendable func getEventList( + request: Api_GetEventListRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetEventListReply + + @Sendable func getKino( + request: Api_GetKinoRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetKinoReply + + @Sendable func sendFeedback( + request: Api_SendFeedbackRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_SendFeedbackImageReply + + @Sendable func sendFeedbackImage( + request: Api_SendFeedbackImageRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_SendFeedbackImageReply + + @Sendable func registerDevice( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_TUMCabeStatus + + @Sendable func verifyKey( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_TUMCabeStatus + + @Sendable func deviceUploadGcmToken( + request: SwiftProtobuf.Google_Protobuf_Empty, + context: GRPCAsyncServerCallContext + ) async throws -> Api_TUMCabeStatus + + @Sendable func getUploadStatus( + request: Api_GetUploadStatusRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetUploadStatusReply + + @Sendable func getNotification( + request: Api_NotificationsRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetNotificationsReply + + @Sendable func getNotificationConfirm( + request: Api_NotificationsRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetNotificationsConfirmReply + + @Sendable func getMembers( + request: Api_GetMembersRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetMembersReply + + /// register your ios device for push notifications + @Sendable func registerIOSDevice( + request: Api_RegisterIOSDeviceRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_RegisterIOSDeviceReply + + /// remove your ios device from the db and unregister it from push notifications + @Sendable func removeIOSDevice( + request: Api_RemoveIOSDeviceRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_RemoveIOSDeviceReply + + /// add ios device usage log to calculate notification priority + @Sendable func addIOSDeviceUsage( + request: Api_AddIOSDeviceUsageRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_AddIOSDeviceUsageReply +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +extension Api_CampusAsyncProvider { + public static var serviceDescriptor: GRPCServiceDescriptor { + return Api_CampusServerMetadata.serviceDescriptor + } + + public var serviceName: Substring { + return Api_CampusServerMetadata.serviceDescriptor.fullName[...] + } + + public var interceptors: Api_CampusServerInterceptorFactoryProtocol? { + return nil + } + + public func handle( + method name: Substring, + context: CallHandlerContext + ) -> GRPCServerHandlerProtocol? { + switch name { + case "GetTopNews": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetTopNewsInterceptors() ?? [], + wrapping: self.getTopNews(request:context:) + ) + + case "GetNewsSources": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetNewsSourcesInterceptors() ?? [], + wrapping: self.getNewsSources(request:context:) + ) + + case "SearchRooms": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeSearchRoomsInterceptors() ?? [], + wrapping: self.searchRooms(request:context:) + ) + + case "GetLocations": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetLocationsInterceptors() ?? [], + wrapping: self.getLocations(request:context:) + ) + + case "GetRoomMaps": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetRoomMapsInterceptors() ?? [], + wrapping: self.getRoomMaps(request:context:) + ) + + case "GetRoomCoordinates": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetRoomCoordinatesInterceptors() ?? [], + wrapping: self.getRoomCoordinates(request:context:) + ) + + case "GetRoomSchedule": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetRoomScheduleInterceptors() ?? [], + wrapping: self.getRoomSchedule(request:context:) + ) + + case "GetCafeteriaRatings": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetCafeteriaRatingsInterceptors() ?? [], + wrapping: self.getCafeteriaRatings(request:context:) + ) + + case "GetDishRatings": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetDishRatingsInterceptors() ?? [], + wrapping: self.getDishRatings(request:context:) + ) + + case "NewCafeteriaRating": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeNewCafeteriaRatingInterceptors() ?? [], + wrapping: self.newCafeteriaRating(request:context:) + ) + + case "NewDishRating": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeNewDishRatingInterceptors() ?? [], + wrapping: self.newDishRating(request:context:) + ) + + case "GetAvailableDishTags": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetAvailableDishTagsInterceptors() ?? [], + wrapping: self.getAvailableDishTags(request:context:) + ) + + case "GetNameTags": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetNameTagsInterceptors() ?? [], + wrapping: self.getNameTags(request:context:) + ) + + case "GetAvailableCafeteriaTags": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetAvailableCafeteriaTagsInterceptors() ?? [], + wrapping: self.getAvailableCafeteriaTags(request:context:) + ) + + case "GetCafeterias": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetCafeteriasInterceptors() ?? [], + wrapping: self.getCafeterias(request:context:) + ) + + case "GetDishes": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetDishesInterceptors() ?? [], + wrapping: self.getDishes(request:context:) + ) + + case "GetResponsiblePerson": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetResponsiblePersonInterceptors() ?? [], + wrapping: self.getResponsiblePerson(request:context:) + ) + + case "GetBuilding2Gps": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetBuilding2GpsInterceptors() ?? [], + wrapping: self.getBuilding2Gps(request:context:) + ) + + case "GetAreaFacilitiesByBuildingNr": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetAreaFacilitiesByBuildingNrInterceptors() ?? [], + wrapping: self.getAreaFacilitiesByBuildingNr(request:context:) + ) + + case "GetListOfToilets": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetListOfToiletsInterceptors() ?? [], + wrapping: self.getListOfToilets(request:context:) + ) + + case "GetListOfElevators": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetListOfElevatorsInterceptors() ?? [], + wrapping: self.getListOfElevators(request:context:) + ) + + case "GetMoreInformation": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetMoreInformationInterceptors() ?? [], + wrapping: self.getMoreInformation(request:context:) + ) + + case "GetOpeningTimes": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetOpeningTimesInterceptors() ?? [], + wrapping: self.getOpeningTimes(request:context:) + ) + + case "GetUpdateNote": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetUpdateNoteInterceptors() ?? [], + wrapping: self.getUpdateNote(request:context:) + ) + + case "GetStudyRoomList": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetStudyRoomListInterceptors() ?? [], + wrapping: self.getStudyRoomList(request:context:) + ) + + case "GetEventList": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetEventListInterceptors() ?? [], + wrapping: self.getEventList(request:context:) + ) + + case "GetKino": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetKinoInterceptors() ?? [], + wrapping: self.getKino(request:context:) + ) + + case "SendFeedback": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeSendFeedbackInterceptors() ?? [], + wrapping: self.sendFeedback(request:context:) + ) + + case "SendFeedbackImage": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeSendFeedbackImageInterceptors() ?? [], + wrapping: self.sendFeedbackImage(request:context:) + ) + + case "RegisterDevice": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [], + wrapping: self.registerDevice(request:context:) + ) + + case "VerifyKey": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeVerifyKeyInterceptors() ?? [], + wrapping: self.verifyKey(request:context:) + ) + + case "DeviceUploadGcmToken": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeDeviceUploadGcmTokenInterceptors() ?? [], + wrapping: self.deviceUploadGcmToken(request:context:) + ) + + case "GetUploadStatus": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetUploadStatusInterceptors() ?? [], + wrapping: self.getUploadStatus(request:context:) + ) + + case "GetNotification": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetNotificationInterceptors() ?? [], + wrapping: self.getNotification(request:context:) + ) + + case "GetNotificationConfirm": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetNotificationConfirmInterceptors() ?? [], + wrapping: self.getNotificationConfirm(request:context:) + ) + + case "GetMembers": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetMembersInterceptors() ?? [], + wrapping: self.getMembers(request:context:) + ) + + case "RegisterIOSDevice": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeRegisterIOSDeviceInterceptors() ?? [], + wrapping: self.registerIOSDevice(request:context:) + ) + + case "RemoveIOSDevice": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeRemoveIOSDeviceInterceptors() ?? [], + wrapping: self.removeIOSDevice(request:context:) + ) + + case "AddIOSDeviceUsage": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeAddIOSDeviceUsageInterceptors() ?? [], + wrapping: self.addIOSDeviceUsage(request:context:) + ) + + default: + return nil + } + } +} + +#endif // compiler(>=5.6) + +public protocol Api_CampusServerInterceptorFactoryProtocol { + + /// - Returns: Interceptors to use when handling 'getTopNews'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetTopNewsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getNewsSources'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetNewsSourcesInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'searchRooms'. + /// Defaults to calling `self.makeInterceptors()`. + func makeSearchRoomsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getLocations'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetLocationsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getRoomMaps'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetRoomMapsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getRoomCoordinates'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetRoomCoordinatesInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getRoomSchedule'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetRoomScheduleInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getCafeteriaRatings'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetCafeteriaRatingsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getDishRatings'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetDishRatingsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'newCafeteriaRating'. + /// Defaults to calling `self.makeInterceptors()`. + func makeNewCafeteriaRatingInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'newDishRating'. + /// Defaults to calling `self.makeInterceptors()`. + func makeNewDishRatingInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getAvailableDishTags'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetAvailableDishTagsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getNameTags'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetNameTagsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getAvailableCafeteriaTags'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetAvailableCafeteriaTagsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getCafeterias'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetCafeteriasInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getDishes'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetDishesInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getResponsiblePerson'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetResponsiblePersonInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getBuilding2Gps'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetBuilding2GpsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getAreaFacilitiesByBuildingNr'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetAreaFacilitiesByBuildingNrInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getListOfToilets'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetListOfToiletsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getListOfElevators'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetListOfElevatorsInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getMoreInformation'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetMoreInformationInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getOpeningTimes'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetOpeningTimesInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getUpdateNote'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetUpdateNoteInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getStudyRoomList'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetStudyRoomListInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getEventList'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetEventListInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getKino'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetKinoInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'sendFeedback'. + /// Defaults to calling `self.makeInterceptors()`. + func makeSendFeedbackInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'sendFeedbackImage'. + /// Defaults to calling `self.makeInterceptors()`. + func makeSendFeedbackImageInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'registerDevice'. + /// Defaults to calling `self.makeInterceptors()`. + func makeRegisterDeviceInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'verifyKey'. + /// Defaults to calling `self.makeInterceptors()`. + func makeVerifyKeyInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'deviceUploadGcmToken'. + /// Defaults to calling `self.makeInterceptors()`. + func makeDeviceUploadGcmTokenInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getUploadStatus'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetUploadStatusInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getNotification'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetNotificationInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getNotificationConfirm'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetNotificationConfirmInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'getMembers'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetMembersInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'registerIOSDevice'. + /// Defaults to calling `self.makeInterceptors()`. + func makeRegisterIOSDeviceInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'removeIOSDevice'. + /// Defaults to calling `self.makeInterceptors()`. + func makeRemoveIOSDeviceInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'addIOSDeviceUsage'. + /// Defaults to calling `self.makeInterceptors()`. + func makeAddIOSDeviceUsageInterceptors() -> [ServerInterceptor] +} + +public enum Api_CampusServerMetadata { + public static let serviceDescriptor = GRPCServiceDescriptor( + name: "Campus", + fullName: "api.Campus", + methods: [ + Api_CampusServerMetadata.Methods.getTopNews, + Api_CampusServerMetadata.Methods.getNewsSources, + Api_CampusServerMetadata.Methods.searchRooms, + Api_CampusServerMetadata.Methods.getLocations, + Api_CampusServerMetadata.Methods.getRoomMaps, + Api_CampusServerMetadata.Methods.getRoomCoordinates, + Api_CampusServerMetadata.Methods.getRoomSchedule, + Api_CampusServerMetadata.Methods.getCafeteriaRatings, + Api_CampusServerMetadata.Methods.getDishRatings, + Api_CampusServerMetadata.Methods.newCafeteriaRating, + Api_CampusServerMetadata.Methods.newDishRating, + Api_CampusServerMetadata.Methods.getAvailableDishTags, + Api_CampusServerMetadata.Methods.getNameTags, + Api_CampusServerMetadata.Methods.getAvailableCafeteriaTags, + Api_CampusServerMetadata.Methods.getCafeterias, + Api_CampusServerMetadata.Methods.getDishes, + Api_CampusServerMetadata.Methods.getResponsiblePerson, + Api_CampusServerMetadata.Methods.getBuilding2Gps, + Api_CampusServerMetadata.Methods.getAreaFacilitiesByBuildingNr, + Api_CampusServerMetadata.Methods.getListOfToilets, + Api_CampusServerMetadata.Methods.getListOfElevators, + Api_CampusServerMetadata.Methods.getMoreInformation, + Api_CampusServerMetadata.Methods.getOpeningTimes, + Api_CampusServerMetadata.Methods.getUpdateNote, + Api_CampusServerMetadata.Methods.getStudyRoomList, + Api_CampusServerMetadata.Methods.getEventList, + Api_CampusServerMetadata.Methods.getKino, + Api_CampusServerMetadata.Methods.sendFeedback, + Api_CampusServerMetadata.Methods.sendFeedbackImage, + Api_CampusServerMetadata.Methods.registerDevice, + Api_CampusServerMetadata.Methods.verifyKey, + Api_CampusServerMetadata.Methods.deviceUploadGcmToken, + Api_CampusServerMetadata.Methods.getUploadStatus, + Api_CampusServerMetadata.Methods.getNotification, + Api_CampusServerMetadata.Methods.getNotificationConfirm, + Api_CampusServerMetadata.Methods.getMembers, + Api_CampusServerMetadata.Methods.registerIOSDevice, + Api_CampusServerMetadata.Methods.removeIOSDevice, + Api_CampusServerMetadata.Methods.addIOSDeviceUsage, + ] + ) + + public enum Methods { + public static let getTopNews = GRPCMethodDescriptor( + name: "GetTopNews", + path: "/api.Campus/GetTopNews", + type: GRPCCallType.unary + ) + + public static let getNewsSources = GRPCMethodDescriptor( + name: "GetNewsSources", + path: "/api.Campus/GetNewsSources", + type: GRPCCallType.unary + ) + + public static let searchRooms = GRPCMethodDescriptor( + name: "SearchRooms", + path: "/api.Campus/SearchRooms", + type: GRPCCallType.unary + ) + + public static let getLocations = GRPCMethodDescriptor( + name: "GetLocations", + path: "/api.Campus/GetLocations", + type: GRPCCallType.unary + ) + + public static let getRoomMaps = GRPCMethodDescriptor( + name: "GetRoomMaps", + path: "/api.Campus/GetRoomMaps", + type: GRPCCallType.unary + ) + + public static let getRoomCoordinates = GRPCMethodDescriptor( + name: "GetRoomCoordinates", + path: "/api.Campus/GetRoomCoordinates", + type: GRPCCallType.unary + ) + + public static let getRoomSchedule = GRPCMethodDescriptor( + name: "GetRoomSchedule", + path: "/api.Campus/GetRoomSchedule", + type: GRPCCallType.unary + ) + + public static let getCafeteriaRatings = GRPCMethodDescriptor( + name: "GetCafeteriaRatings", + path: "/api.Campus/GetCafeteriaRatings", + type: GRPCCallType.unary + ) + + public static let getDishRatings = GRPCMethodDescriptor( + name: "GetDishRatings", + path: "/api.Campus/GetDishRatings", + type: GRPCCallType.unary + ) + + public static let newCafeteriaRating = GRPCMethodDescriptor( + name: "NewCafeteriaRating", + path: "/api.Campus/NewCafeteriaRating", + type: GRPCCallType.unary + ) + + public static let newDishRating = GRPCMethodDescriptor( + name: "NewDishRating", + path: "/api.Campus/NewDishRating", + type: GRPCCallType.unary + ) + + public static let getAvailableDishTags = GRPCMethodDescriptor( + name: "GetAvailableDishTags", + path: "/api.Campus/GetAvailableDishTags", + type: GRPCCallType.unary + ) + + public static let getNameTags = GRPCMethodDescriptor( + name: "GetNameTags", + path: "/api.Campus/GetNameTags", + type: GRPCCallType.unary + ) + + public static let getAvailableCafeteriaTags = GRPCMethodDescriptor( + name: "GetAvailableCafeteriaTags", + path: "/api.Campus/GetAvailableCafeteriaTags", + type: GRPCCallType.unary + ) + + public static let getCafeterias = GRPCMethodDescriptor( + name: "GetCafeterias", + path: "/api.Campus/GetCafeterias", + type: GRPCCallType.unary + ) + + public static let getDishes = GRPCMethodDescriptor( + name: "GetDishes", + path: "/api.Campus/GetDishes", + type: GRPCCallType.unary + ) + + public static let getResponsiblePerson = GRPCMethodDescriptor( + name: "GetResponsiblePerson", + path: "/api.Campus/GetResponsiblePerson", + type: GRPCCallType.unary + ) + + public static let getBuilding2Gps = GRPCMethodDescriptor( + name: "GetBuilding2Gps", + path: "/api.Campus/GetBuilding2Gps", + type: GRPCCallType.unary + ) + + public static let getAreaFacilitiesByBuildingNr = GRPCMethodDescriptor( + name: "GetAreaFacilitiesByBuildingNr", + path: "/api.Campus/GetAreaFacilitiesByBuildingNr", + type: GRPCCallType.unary + ) + + public static let getListOfToilets = GRPCMethodDescriptor( + name: "GetListOfToilets", + path: "/api.Campus/GetListOfToilets", + type: GRPCCallType.unary + ) + + public static let getListOfElevators = GRPCMethodDescriptor( + name: "GetListOfElevators", + path: "/api.Campus/GetListOfElevators", + type: GRPCCallType.unary + ) + + public static let getMoreInformation = GRPCMethodDescriptor( + name: "GetMoreInformation", + path: "/api.Campus/GetMoreInformation", + type: GRPCCallType.unary + ) + + public static let getOpeningTimes = GRPCMethodDescriptor( + name: "GetOpeningTimes", + path: "/api.Campus/GetOpeningTimes", + type: GRPCCallType.unary + ) + + public static let getUpdateNote = GRPCMethodDescriptor( + name: "GetUpdateNote", + path: "/api.Campus/GetUpdateNote", + type: GRPCCallType.unary + ) + + public static let getStudyRoomList = GRPCMethodDescriptor( + name: "GetStudyRoomList", + path: "/api.Campus/GetStudyRoomList", + type: GRPCCallType.unary + ) + + public static let getEventList = GRPCMethodDescriptor( + name: "GetEventList", + path: "/api.Campus/GetEventList", + type: GRPCCallType.unary + ) + + public static let getKino = GRPCMethodDescriptor( + name: "GetKino", + path: "/api.Campus/GetKino", + type: GRPCCallType.unary + ) + + public static let sendFeedback = GRPCMethodDescriptor( + name: "SendFeedback", + path: "/api.Campus/SendFeedback", + type: GRPCCallType.unary + ) + + public static let sendFeedbackImage = GRPCMethodDescriptor( + name: "SendFeedbackImage", + path: "/api.Campus/SendFeedbackImage", + type: GRPCCallType.unary + ) + + public static let registerDevice = GRPCMethodDescriptor( + name: "RegisterDevice", + path: "/api.Campus/RegisterDevice", + type: GRPCCallType.unary + ) + + public static let verifyKey = GRPCMethodDescriptor( + name: "VerifyKey", + path: "/api.Campus/VerifyKey", + type: GRPCCallType.unary + ) + + public static let deviceUploadGcmToken = GRPCMethodDescriptor( + name: "DeviceUploadGcmToken", + path: "/api.Campus/DeviceUploadGcmToken", + type: GRPCCallType.unary + ) + + public static let getUploadStatus = GRPCMethodDescriptor( + name: "GetUploadStatus", + path: "/api.Campus/GetUploadStatus", + type: GRPCCallType.unary + ) + + public static let getNotification = GRPCMethodDescriptor( + name: "GetNotification", + path: "/api.Campus/GetNotification", + type: GRPCCallType.unary + ) + + public static let getNotificationConfirm = GRPCMethodDescriptor( + name: "GetNotificationConfirm", + path: "/api.Campus/GetNotificationConfirm", + type: GRPCCallType.unary + ) + + public static let getMembers = GRPCMethodDescriptor( + name: "GetMembers", + path: "/api.Campus/GetMembers", + type: GRPCCallType.unary + ) + + public static let registerIOSDevice = GRPCMethodDescriptor( + name: "RegisterIOSDevice", + path: "/api.Campus/RegisterIOSDevice", + type: GRPCCallType.unary + ) + + public static let removeIOSDevice = GRPCMethodDescriptor( + name: "RemoveIOSDevice", + path: "/api.Campus/RemoveIOSDevice", + type: GRPCCallType.unary + ) + + public static let addIOSDeviceUsage = GRPCMethodDescriptor( + name: "AddIOSDeviceUsage", + path: "/api.Campus/AddIOSDeviceUsage", + type: GRPCCallType.unary + ) + } +} diff --git a/Campus-iOS/Base/Networking/CampusBackend.pb.swift b/Campus-iOS/Base/Networking/CampusBackend.pb.swift new file mode 100644 index 00000000..e0d98487 --- /dev/null +++ b/Campus-iOS/Base/Networking/CampusBackend.pb.swift @@ -0,0 +1,4949 @@ +// DO NOT EDIT. +// swift-format-ignore-file +// +// Generated by the Swift generator plugin for the protocol buffer compiler. +// Source: CampusService.proto +// +// For information on using the generated types, please see the documentation: +// https://github.com/apple/swift-protobuf/ + +import Foundation +import SwiftProtobuf + +// If the compiler emits an error on this type, it is because this file +// was generated by a version of the `protoc` Swift plug-in that is +// incompatible with the version of SwiftProtobuf to which you are linking. +// Please ensure that you are building against the same version of the API +// that was used to generate this file. +fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAPIVersionCheck { + struct _2: SwiftProtobuf.ProtobufAPIVersion_2 {} + typealias Version = _2 +} + +public struct Api_AddIOSDeviceUsageRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var deviceID: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_AddIOSDeviceUsageReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var id: UInt32 = 0 + + public var deviceID: String = String() + + public var createdAt: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_RemoveIOSDeviceRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var deviceID: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_RemoveIOSDeviceReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var message: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_RegisterIOSDeviceRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var deviceID: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_RegisterIOSDeviceReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var deviceID: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetRoomScheduleRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var room: Int32 = 0 + + public var start: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _start ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_start = newValue} + } + /// Returns true if `start` has been explicitly set. + public var hasStart: Bool {return self._start != nil} + /// Clears the value of `start`. Subsequent reads from it will return its default value. + public mutating func clearStart() {self._start = nil} + + public var end: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _end ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_end = newValue} + } + /// Returns true if `end` has been explicitly set. + public var hasEnd: Bool {return self._end != nil} + /// Clears the value of `end`. Subsequent reads from it will return its default value. + public mutating func clearEnd() {self._end = nil} + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + + fileprivate var _start: SwiftProtobuf.Google_Protobuf_Timestamp? = nil + fileprivate var _end: SwiftProtobuf.Google_Protobuf_Timestamp? = nil +} + +public struct Api_GetRoomScheduleReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var events: [Api_GetRoomScheduleReply.RoomScheduleEvent] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public struct RoomScheduleEvent { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var start: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _start ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_start = newValue} + } + /// Returns true if `start` has been explicitly set. + public var hasStart: Bool {return self._start != nil} + /// Clears the value of `start`. Subsequent reads from it will return its default value. + public mutating func clearStart() {self._start = nil} + + public var end: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _end ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_end = newValue} + } + /// Returns true if `end` has been explicitly set. + public var hasEnd: Bool {return self._end != nil} + /// Clears the value of `end`. Subsequent reads from it will return its default value. + public mutating func clearEnd() {self._end = nil} + + public var title: String = String() + + public var eventID: Int32 = 0 + + public var courseCode: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + + fileprivate var _start: SwiftProtobuf.Google_Protobuf_Timestamp? = nil + fileprivate var _end: SwiftProtobuf.Google_Protobuf_Timestamp? = nil + } + + public init() {} +} + +public struct Api_GetRoomCoordinatesRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var archID: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetRoomCoordinatesReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var utmZone: String = String() + + public var utmEasting: Float = 0 + + public var utmNorthing: Float = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetRoomMapsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var archID: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetRoomMapsReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var maps: [Api_GetRoomMapsReply.Map] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public struct Map { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var mapID: Int64 = 0 + + public var description_p: String = String() + + public var scale: Int64 = 0 + + public var width: Int64 = 0 + + public var height: Int64 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + } + + public init() {} +} + +public struct Api_GetLocationsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var location: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetLocationsReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var locations: [Api_GetLocationsReply.Location] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public struct Location { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var location: String = String() + + public var name: String = String() + + public var lon: String = String() + + public var lat: String = String() + + public var radius: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + } + + public init() {} +} + +public struct Api_SearchRoomsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var query: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_SearchRoomsReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var rooms: [Api_Room] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_Room { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var roomID: Int32 = 0 + + public var roomCode: String = String() + + public var buildingNr: String = String() + + public var archID: String = String() + + public var info: String = String() + + public var address: String = String() + + public var purpose: String = String() + + public var campus: String = String() + + public var name: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_NewsSourceArray { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var sources: [Api_NewsSource] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_NewsSource { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var source: String = String() + + public var title: String = String() + + public var icon: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetTopNewsReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var imageURL: String = String() + + public var link: String = String() + + public var created: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _created ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_created = newValue} + } + /// Returns true if `created` has been explicitly set. + public var hasCreated: Bool {return self._created != nil} + /// Clears the value of `created`. Subsequent reads from it will return its default value. + public mutating func clearCreated() {self._created = nil} + + public var from: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _from ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_from = newValue} + } + /// Returns true if `from` has been explicitly set. + public var hasFrom: Bool {return self._from != nil} + /// Clears the value of `from`. Subsequent reads from it will return its default value. + public mutating func clearFrom() {self._from = nil} + + public var to: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _to ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_to = newValue} + } + /// Returns true if `to` has been explicitly set. + public var hasTo: Bool {return self._to != nil} + /// Clears the value of `to`. Subsequent reads from it will return its default value. + public mutating func clearTo() {self._to = nil} + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + + fileprivate var _created: SwiftProtobuf.Google_Protobuf_Timestamp? = nil + fileprivate var _from: SwiftProtobuf.Google_Protobuf_Timestamp? = nil + fileprivate var _to: SwiftProtobuf.Google_Protobuf_Timestamp? = nil +} + +public struct Api_CafeteriaRatingRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// cafeteriaId Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") + public var cafeteriaID: String = String() + + /// Optional Parameter to define an interval for the ratings (Lower bound) + public var from: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _from ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_from = newValue} + } + /// Returns true if `from` has been explicitly set. + public var hasFrom: Bool {return self._from != nil} + /// Clears the value of `from`. Subsequent reads from it will return its default value. + public mutating func clearFrom() {self._from = nil} + + /// Optional Parameter to define an interval for the ratings (Upper bound) + public var to: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _to ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_to = newValue} + } + /// Returns true if `to` has been explicitly set. + public var hasTo: Bool {return self._to != nil} + /// Clears the value of `to`. Subsequent reads from it will return its default value. + public mutating func clearTo() {self._to = nil} + + /// Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" + public var limit: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + + fileprivate var _from: SwiftProtobuf.Google_Protobuf_Timestamp? = nil + fileprivate var _to: SwiftProtobuf.Google_Protobuf_Timestamp? = nil +} + +public struct Api_DishRatingRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") + public var cafeteriaID: String = String() + + /// Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa + public var dish: String = String() + + /// Optional Parameter to define an interval for the ratings (Lower bound) + public var from: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _from ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_from = newValue} + } + /// Returns true if `from` has been explicitly set. + public var hasFrom: Bool {return self._from != nil} + /// Clears the value of `from`. Subsequent reads from it will return its default value. + public mutating func clearFrom() {self._from = nil} + + /// Optional Parameter to define an interval for the ratings (Upper bound) + public var to: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _to ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_to = newValue} + } + /// Returns true if `to` has been explicitly set. + public var hasTo: Bool {return self._to != nil} + /// Clears the value of `to`. Subsequent reads from it will return its default value. + public mutating func clearTo() {self._to = nil} + + /// Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" + public var limit: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + + fileprivate var _from: SwiftProtobuf.Google_Protobuf_Timestamp? = nil + fileprivate var _to: SwiftProtobuf.Google_Protobuf_Timestamp? = nil +} + +public struct Api_CafeteriaRatingReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var rating: [Api_SingleRatingReply] = [] + + public var avg: Double = 0 + + public var std: Double = 0 + + public var min: Int32 = 0 + + public var max: Int32 = 0 + + public var ratingTags: [Api_RatingTagResult] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_DishRatingReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var rating: [Api_SingleRatingReply] = [] + + public var avg: Double = 0 + + public var std: Double = 0 + + public var min: Int32 = 0 + + public var max: Int32 = 0 + + public var ratingTags: [Api_RatingTagResult] = [] + + public var nameTags: [Api_RatingTagResult] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_SingleRatingReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// number in the range 1-5 + public var points: Int32 = 0 + + /// Optional JPEG image in Base64 + public var image: Data = Data() + + /// Optional comment (max 256 chars) + public var comment: String = String() + + public var ratingTags: [Api_RatingTagNewRequest] = [] + + public var visited: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _visited ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_visited = newValue} + } + /// Returns true if `visited` has been explicitly set. + public var hasVisited: Bool {return self._visited != nil} + /// Clears the value of `visited`. Subsequent reads from it will return its default value. + public mutating func clearVisited() {self._visited = nil} + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + + fileprivate var _visited: SwiftProtobuf.Google_Protobuf_Timestamp? = nil +} + +public struct Api_NewCafeteriaRatingRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// number in the range 1-5 + public var points: Int32 = 0 + + public var cafeteriaID: String = String() + + public var image: Data = Data() + + /// Optional list of tag ratings add as many tags with a rating (1-5) of the list of cafeteriaRatingTags + public var ratingTags: [Api_RatingTag] = [] + + /// Optional comment (max 256 chars) + public var comment: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_NewDishRatingRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// number in the range 1-5 + public var points: Int32 = 0 + + /// Mandatory Name of the dish (EAT-API naming scheme "MENSA_GARCHING") Must be available int the given mensa + public var cafeteriaID: String = String() + + /// Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa + public var dish: String = String() + + /// Optional JPEG image in Base64 + public var image: Data = Data() + + /// Optional list of tag ratings add as many tags with a rating (1-5) of the list of dishRatingTags + public var ratingTags: [Api_RatingTag] = [] + + /// Optional comment (max 256 chars) + public var comment: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetTagsReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var ratingTags: [Api_TagsOverview] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_TagsOverview { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var tagID: Int32 = 0 + + public var de: String = String() + + public var en: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_RatingTag { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var tagID: Int32 = 0 + + public var points: Double = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_RatingTagNewRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var tagID: Int32 = 0 + + public var points: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_RatingTagResult { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var tagID: Int32 = 0 + + public var avg: Double = 0 + + public var std: Double = 0 + + public var min: Int32 = 0 + + public var max: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetCafeteriaReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var cafeteria: [Api_Cafeteria] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_Cafeteria { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var id: String = String() + + public var address: String = String() + + public var longitude: Double = 0 + + public var latitude: Double = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetDishesRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var cafeteriaID: String = String() + + /// >=2022 until the current year + public var year: Int32 = 0 + + /// range 1 - 53 + public var week: Int32 = 0 + + /// range 0 (Monday) - 4 (Friday) + public var day: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetDishesReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var dish: [String] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetResponsiblePersonReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var responsiblePerson: [Api_ResponsiblePersonElement] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_ResponsiblePersonElement { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var name: String = String() + + public var telephone: String = String() + + public var email: String = String() + + public var faculty: String = String() + + public var tumID: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetBuilding2GpsReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var building2Gps: [Api_Building2GpsElement] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_Building2GpsElement { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var id: String = String() + + public var latitude: String = String() + + public var longitude: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetAreaFacilitiesByBuildingNrReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var areaFacilitiesByBuildingNr: [Api_RoomInformationElement] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetAreaFacilitiesByBuildingNrRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var buildingNr: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetListOfToiletsReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var listOfToilets: [Api_RoomInformationElement] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_RoomInformationElement { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var roomID: Int32 = 0 + + public var roomCode: String = String() + + public var buildingNr: String = String() + + public var archID: String = String() + + public var info: String = String() + + public var address: String = String() + + public var purpose: String = String() + + public var campus: String = String() + + public var name: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetListOfElevatorsReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var listOfElevators: [Api_RoomInformationElement] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetMoreInformationReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var information: [Api_MoreInformationElement] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_MoreInformationElement { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var title: String = String() + + public var category: String = String() + + public var url: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetOpeningTimesRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var language: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetOpeningTimesReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var facilities: [Api_OpeningTimesMsgElement] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_OpeningTimesMsgElement { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var id: Int32 = 0 + + public var category: String = String() + + public var name: String = String() + + public var address: String = String() + + public var room: String = String() + + public var transportStation: String = String() + + public var openingHours: String = String() + + public var infos: String = String() + + public var url: String = String() + + public var language: String = String() + + public var referenceID: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetUpdateNoteRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var version: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetUpdateNoteReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var message: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetStudyRoomListReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var rooms: [Api_StudyRoomMsgElement] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_StudyRoomMsgElement { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var id: Int32 = 0 + + public var name: String = String() + + public var details: String = String() + + public var rooms: [Api_StudyRoom] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_StudyRoom { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var groupID: Int32 = 0 + + public var roomID: Int32 = 0 + + public var roomCode: String = String() + + public var roomName: String = String() + + public var buildingName: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetEventListRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// optional parameter, will return all events if no id is specified + public var eventID: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetEventListReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var events: [Api_EventListMsgElement] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_EventListMsgElement { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var name: String = String() + + public var path: String = String() + + public var event: Int32 = 0 + + public var news: Int32 = 0 + + public var kino: Int32 = 0 + + public var file: Int32 = 0 + + public var title: String = String() + + public var description_p: String = String() + + public var locality: String = String() + + public var link: String = String() + + public var start: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _start ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_start = newValue} + } + /// Returns true if `start` has been explicitly set. + public var hasStart: Bool {return self._start != nil} + /// Clears the value of `start`. Subsequent reads from it will return its default value. + public mutating func clearStart() {self._start = nil} + + public var end: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _end ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_end = newValue} + } + /// Returns true if `end` has been explicitly set. + public var hasEnd: Bool {return self._end != nil} + /// Clears the value of `end`. Subsequent reads from it will return its default value. + public mutating func clearEnd() {self._end = nil} + + public var ticketGroup: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + + fileprivate var _start: SwiftProtobuf.Google_Protobuf_Timestamp? = nil + fileprivate var _end: SwiftProtobuf.Google_Protobuf_Timestamp? = nil +} + +public struct Api_GetKinoRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var lastID: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetKinoReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var kinos: [Api_KinoMsgElement] = [] + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_KinoMsgElement { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var name: String { + get {return _storage._name} + set {_uniqueStorage()._name = newValue} + } + + public var path: String { + get {return _storage._path} + set {_uniqueStorage()._path = newValue} + } + + public var kino: Int32 { + get {return _storage._kino} + set {_uniqueStorage()._kino = newValue} + } + + public var date: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _storage._date ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_uniqueStorage()._date = newValue} + } + /// Returns true if `date` has been explicitly set. + public var hasDate: Bool {return _storage._date != nil} + /// Clears the value of `date`. Subsequent reads from it will return its default value. + public mutating func clearDate() {_uniqueStorage()._date = nil} + + public var created: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _storage._created ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_uniqueStorage()._created = newValue} + } + /// Returns true if `created` has been explicitly set. + public var hasCreated: Bool {return _storage._created != nil} + /// Clears the value of `created`. Subsequent reads from it will return its default value. + public mutating func clearCreated() {_uniqueStorage()._created = nil} + + public var title: String { + get {return _storage._title} + set {_uniqueStorage()._title = newValue} + } + + public var year: String { + get {return _storage._year} + set {_uniqueStorage()._year = newValue} + } + + public var runtime: String { + get {return _storage._runtime} + set {_uniqueStorage()._runtime = newValue} + } + + public var genre: String { + get {return _storage._genre} + set {_uniqueStorage()._genre = newValue} + } + + public var director: String { + get {return _storage._director} + set {_uniqueStorage()._director = newValue} + } + + public var actors: String { + get {return _storage._actors} + set {_uniqueStorage()._actors = newValue} + } + + public var rating: String { + get {return _storage._rating} + set {_uniqueStorage()._rating = newValue} + } + + public var description_p: String { + get {return _storage._description_p} + set {_uniqueStorage()._description_p = newValue} + } + + public var cover: Int32 { + get {return _storage._cover} + set {_uniqueStorage()._cover = newValue} + } + + public var trailer: String { + get {return _storage._trailer} + set {_uniqueStorage()._trailer = newValue} + } + + public var link: String { + get {return _storage._link} + set {_uniqueStorage()._link = newValue} + } + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} + + fileprivate var _storage = _StorageClass.defaultInstance +} + +public struct Api_SendFeedbackRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var topic: String = String() + + public var email: String = String() + + public var emailID: String = String() + + public var message: String = String() + + public var imageCount: Int32 = 0 + + public var latitude: Double = 0 + + public var longitude: Double = 0 + + public var osVersion: String = String() + + public var appVersion: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_SendFeedbackImageReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var status: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_SendFeedbackImageRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var id: Int32 = 0 + + ///todo where does the file come from? + public var imageNr: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetMembersRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var lrzID: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetMembersReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var lrzID: String = String() + + public var name: String = String() + + public var memberID: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_TUMCabeStatus { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var status: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetUploadStatusRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var lrzID: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetUploadStatusReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var fcmToken: String = String() + + public var publicKey: String = String() + + public var studentID: Bool = false + + public var employeeID: Bool = false + + public var externalID: Bool = false + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetNotificationsReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var notificationID: Int32 = 0 + + public var type: Int32 = 0 + + public var title: String = String() + + public var description_p: String = String() + + public var signature: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_NotificationsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var notificationID: Int32 = 0 + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +public struct Api_GetNotificationsConfirmReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + public var status: String = String() + + public var unknownFields = SwiftProtobuf.UnknownStorage() + + public init() {} +} + +#if swift(>=5.5) && canImport(_Concurrency) +extension Api_AddIOSDeviceUsageRequest: @unchecked Sendable {} +extension Api_AddIOSDeviceUsageReply: @unchecked Sendable {} +extension Api_RemoveIOSDeviceRequest: @unchecked Sendable {} +extension Api_RemoveIOSDeviceReply: @unchecked Sendable {} +extension Api_RegisterIOSDeviceRequest: @unchecked Sendable {} +extension Api_RegisterIOSDeviceReply: @unchecked Sendable {} +extension Api_GetRoomScheduleRequest: @unchecked Sendable {} +extension Api_GetRoomScheduleReply: @unchecked Sendable {} +extension Api_GetRoomScheduleReply.RoomScheduleEvent: @unchecked Sendable {} +extension Api_GetRoomCoordinatesRequest: @unchecked Sendable {} +extension Api_GetRoomCoordinatesReply: @unchecked Sendable {} +extension Api_GetRoomMapsRequest: @unchecked Sendable {} +extension Api_GetRoomMapsReply: @unchecked Sendable {} +extension Api_GetRoomMapsReply.Map: @unchecked Sendable {} +extension Api_GetLocationsRequest: @unchecked Sendable {} +extension Api_GetLocationsReply: @unchecked Sendable {} +extension Api_GetLocationsReply.Location: @unchecked Sendable {} +extension Api_SearchRoomsRequest: @unchecked Sendable {} +extension Api_SearchRoomsReply: @unchecked Sendable {} +extension Api_Room: @unchecked Sendable {} +extension Api_NewsSourceArray: @unchecked Sendable {} +extension Api_NewsSource: @unchecked Sendable {} +extension Api_GetTopNewsReply: @unchecked Sendable {} +extension Api_CafeteriaRatingRequest: @unchecked Sendable {} +extension Api_DishRatingRequest: @unchecked Sendable {} +extension Api_CafeteriaRatingReply: @unchecked Sendable {} +extension Api_DishRatingReply: @unchecked Sendable {} +extension Api_SingleRatingReply: @unchecked Sendable {} +extension Api_NewCafeteriaRatingRequest: @unchecked Sendable {} +extension Api_NewDishRatingRequest: @unchecked Sendable {} +extension Api_GetTagsReply: @unchecked Sendable {} +extension Api_TagsOverview: @unchecked Sendable {} +extension Api_RatingTag: @unchecked Sendable {} +extension Api_RatingTagNewRequest: @unchecked Sendable {} +extension Api_RatingTagResult: @unchecked Sendable {} +extension Api_GetCafeteriaReply: @unchecked Sendable {} +extension Api_Cafeteria: @unchecked Sendable {} +extension Api_GetDishesRequest: @unchecked Sendable {} +extension Api_GetDishesReply: @unchecked Sendable {} +extension Api_GetResponsiblePersonReply: @unchecked Sendable {} +extension Api_ResponsiblePersonElement: @unchecked Sendable {} +extension Api_GetBuilding2GpsReply: @unchecked Sendable {} +extension Api_Building2GpsElement: @unchecked Sendable {} +extension Api_GetAreaFacilitiesByBuildingNrReply: @unchecked Sendable {} +extension Api_GetAreaFacilitiesByBuildingNrRequest: @unchecked Sendable {} +extension Api_GetListOfToiletsReply: @unchecked Sendable {} +extension Api_RoomInformationElement: @unchecked Sendable {} +extension Api_GetListOfElevatorsReply: @unchecked Sendable {} +extension Api_GetMoreInformationReply: @unchecked Sendable {} +extension Api_MoreInformationElement: @unchecked Sendable {} +extension Api_GetOpeningTimesRequest: @unchecked Sendable {} +extension Api_GetOpeningTimesReply: @unchecked Sendable {} +extension Api_OpeningTimesMsgElement: @unchecked Sendable {} +extension Api_GetUpdateNoteRequest: @unchecked Sendable {} +extension Api_GetUpdateNoteReply: @unchecked Sendable {} +extension Api_GetStudyRoomListReply: @unchecked Sendable {} +extension Api_StudyRoomMsgElement: @unchecked Sendable {} +extension Api_StudyRoom: @unchecked Sendable {} +extension Api_GetEventListRequest: @unchecked Sendable {} +extension Api_GetEventListReply: @unchecked Sendable {} +extension Api_EventListMsgElement: @unchecked Sendable {} +extension Api_GetKinoRequest: @unchecked Sendable {} +extension Api_GetKinoReply: @unchecked Sendable {} +extension Api_KinoMsgElement: @unchecked Sendable {} +extension Api_SendFeedbackRequest: @unchecked Sendable {} +extension Api_SendFeedbackImageReply: @unchecked Sendable {} +extension Api_SendFeedbackImageRequest: @unchecked Sendable {} +extension Api_GetMembersRequest: @unchecked Sendable {} +extension Api_GetMembersReply: @unchecked Sendable {} +extension Api_TUMCabeStatus: @unchecked Sendable {} +extension Api_GetUploadStatusRequest: @unchecked Sendable {} +extension Api_GetUploadStatusReply: @unchecked Sendable {} +extension Api_GetNotificationsReply: @unchecked Sendable {} +extension Api_NotificationsRequest: @unchecked Sendable {} +extension Api_GetNotificationsConfirmReply: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + +// MARK: - Code below here is support for the SwiftProtobuf runtime. + +fileprivate let _protobuf_package = "api" + +extension Api_AddIOSDeviceUsageRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".AddIOSDeviceUsageRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "deviceId"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.deviceID.isEmpty { + try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_AddIOSDeviceUsageRequest, rhs: Api_AddIOSDeviceUsageRequest) -> Bool { + if lhs.deviceID != rhs.deviceID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_AddIOSDeviceUsageReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".AddIOSDeviceUsageReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "id"), + 2: .same(proto: "deviceId"), + 3: .same(proto: "createdAt"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.id) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.createdAt) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.id != 0 { + try visitor.visitSingularUInt32Field(value: self.id, fieldNumber: 1) + } + if !self.deviceID.isEmpty { + try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 2) + } + if !self.createdAt.isEmpty { + try visitor.visitSingularStringField(value: self.createdAt, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_AddIOSDeviceUsageReply, rhs: Api_AddIOSDeviceUsageReply) -> Bool { + if lhs.id != rhs.id {return false} + if lhs.deviceID != rhs.deviceID {return false} + if lhs.createdAt != rhs.createdAt {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_RemoveIOSDeviceRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".RemoveIOSDeviceRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "deviceId"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.deviceID.isEmpty { + try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_RemoveIOSDeviceRequest, rhs: Api_RemoveIOSDeviceRequest) -> Bool { + if lhs.deviceID != rhs.deviceID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_RemoveIOSDeviceReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".RemoveIOSDeviceReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "message"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.message) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.message.isEmpty { + try visitor.visitSingularStringField(value: self.message, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_RemoveIOSDeviceReply, rhs: Api_RemoveIOSDeviceReply) -> Bool { + if lhs.message != rhs.message {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_RegisterIOSDeviceRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".RegisterIOSDeviceRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "deviceId"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.deviceID.isEmpty { + try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_RegisterIOSDeviceRequest, rhs: Api_RegisterIOSDeviceRequest) -> Bool { + if lhs.deviceID != rhs.deviceID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_RegisterIOSDeviceReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".RegisterIOSDeviceReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "deviceId"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.deviceID.isEmpty { + try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_RegisterIOSDeviceReply, rhs: Api_RegisterIOSDeviceReply) -> Bool { + if lhs.deviceID != rhs.deviceID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetRoomScheduleRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetRoomScheduleRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "room"), + 2: .same(proto: "start"), + 3: .same(proto: "end"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.room) }() + case 2: try { try decoder.decodeSingularMessageField(value: &self._start) }() + case 3: try { try decoder.decodeSingularMessageField(value: &self._end) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + if self.room != 0 { + try visitor.visitSingularInt32Field(value: self.room, fieldNumber: 1) + } + try { if let v = self._start { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } }() + try { if let v = self._end { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } }() + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetRoomScheduleRequest, rhs: Api_GetRoomScheduleRequest) -> Bool { + if lhs.room != rhs.room {return false} + if lhs._start != rhs._start {return false} + if lhs._end != rhs._end {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetRoomScheduleReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetRoomScheduleReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "events"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.events) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.events.isEmpty { + try visitor.visitRepeatedMessageField(value: self.events, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetRoomScheduleReply, rhs: Api_GetRoomScheduleReply) -> Bool { + if lhs.events != rhs.events {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetRoomScheduleReply.RoomScheduleEvent: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = Api_GetRoomScheduleReply.protoMessageName + ".RoomScheduleEvent" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "start"), + 2: .same(proto: "end"), + 3: .same(proto: "title"), + 4: .standard(proto: "event_id"), + 5: .standard(proto: "course_code"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._start) }() + case 2: try { try decoder.decodeSingularMessageField(value: &self._end) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.title) }() + case 4: try { try decoder.decodeSingularInt32Field(value: &self.eventID) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.courseCode) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + try { if let v = self._start { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } }() + try { if let v = self._end { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } }() + if !self.title.isEmpty { + try visitor.visitSingularStringField(value: self.title, fieldNumber: 3) + } + if self.eventID != 0 { + try visitor.visitSingularInt32Field(value: self.eventID, fieldNumber: 4) + } + if !self.courseCode.isEmpty { + try visitor.visitSingularStringField(value: self.courseCode, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetRoomScheduleReply.RoomScheduleEvent, rhs: Api_GetRoomScheduleReply.RoomScheduleEvent) -> Bool { + if lhs._start != rhs._start {return false} + if lhs._end != rhs._end {return false} + if lhs.title != rhs.title {return false} + if lhs.eventID != rhs.eventID {return false} + if lhs.courseCode != rhs.courseCode {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetRoomCoordinatesRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetRoomCoordinatesRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "arch_id"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.archID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.archID.isEmpty { + try visitor.visitSingularStringField(value: self.archID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetRoomCoordinatesRequest, rhs: Api_GetRoomCoordinatesRequest) -> Bool { + if lhs.archID != rhs.archID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetRoomCoordinatesReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetRoomCoordinatesReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "utm_zone"), + 2: .standard(proto: "utm_easting"), + 3: .standard(proto: "utm_northing"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.utmZone) }() + case 2: try { try decoder.decodeSingularFloatField(value: &self.utmEasting) }() + case 3: try { try decoder.decodeSingularFloatField(value: &self.utmNorthing) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.utmZone.isEmpty { + try visitor.visitSingularStringField(value: self.utmZone, fieldNumber: 1) + } + if self.utmEasting != 0 { + try visitor.visitSingularFloatField(value: self.utmEasting, fieldNumber: 2) + } + if self.utmNorthing != 0 { + try visitor.visitSingularFloatField(value: self.utmNorthing, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetRoomCoordinatesReply, rhs: Api_GetRoomCoordinatesReply) -> Bool { + if lhs.utmZone != rhs.utmZone {return false} + if lhs.utmEasting != rhs.utmEasting {return false} + if lhs.utmNorthing != rhs.utmNorthing {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetRoomMapsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetRoomMapsRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "arch_id"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.archID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.archID.isEmpty { + try visitor.visitSingularStringField(value: self.archID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetRoomMapsRequest, rhs: Api_GetRoomMapsRequest) -> Bool { + if lhs.archID != rhs.archID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetRoomMapsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetRoomMapsReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "maps"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.maps) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.maps.isEmpty { + try visitor.visitRepeatedMessageField(value: self.maps, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetRoomMapsReply, rhs: Api_GetRoomMapsReply) -> Bool { + if lhs.maps != rhs.maps {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetRoomMapsReply.Map: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = Api_GetRoomMapsReply.protoMessageName + ".Map" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "map_id"), + 2: .same(proto: "description"), + 3: .same(proto: "scale"), + 4: .same(proto: "width"), + 5: .same(proto: "height"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt64Field(value: &self.mapID) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.description_p) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.scale) }() + case 4: try { try decoder.decodeSingularInt64Field(value: &self.width) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &self.height) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.mapID != 0 { + try visitor.visitSingularInt64Field(value: self.mapID, fieldNumber: 1) + } + if !self.description_p.isEmpty { + try visitor.visitSingularStringField(value: self.description_p, fieldNumber: 2) + } + if self.scale != 0 { + try visitor.visitSingularInt64Field(value: self.scale, fieldNumber: 3) + } + if self.width != 0 { + try visitor.visitSingularInt64Field(value: self.width, fieldNumber: 4) + } + if self.height != 0 { + try visitor.visitSingularInt64Field(value: self.height, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetRoomMapsReply.Map, rhs: Api_GetRoomMapsReply.Map) -> Bool { + if lhs.mapID != rhs.mapID {return false} + if lhs.description_p != rhs.description_p {return false} + if lhs.scale != rhs.scale {return false} + if lhs.width != rhs.width {return false} + if lhs.height != rhs.height {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetLocationsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetLocationsRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "location"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.location) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.location.isEmpty { + try visitor.visitSingularStringField(value: self.location, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetLocationsRequest, rhs: Api_GetLocationsRequest) -> Bool { + if lhs.location != rhs.location {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetLocationsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetLocationsReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "locations"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.locations) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.locations.isEmpty { + try visitor.visitRepeatedMessageField(value: self.locations, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetLocationsReply, rhs: Api_GetLocationsReply) -> Bool { + if lhs.locations != rhs.locations {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetLocationsReply.Location: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = Api_GetLocationsReply.protoMessageName + ".Location" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "location"), + 2: .same(proto: "name"), + 3: .same(proto: "lon"), + 4: .same(proto: "lat"), + 5: .same(proto: "radius"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.location) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.name) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.lon) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.lat) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.radius) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.location.isEmpty { + try visitor.visitSingularStringField(value: self.location, fieldNumber: 1) + } + if !self.name.isEmpty { + try visitor.visitSingularStringField(value: self.name, fieldNumber: 2) + } + if !self.lon.isEmpty { + try visitor.visitSingularStringField(value: self.lon, fieldNumber: 3) + } + if !self.lat.isEmpty { + try visitor.visitSingularStringField(value: self.lat, fieldNumber: 4) + } + if !self.radius.isEmpty { + try visitor.visitSingularStringField(value: self.radius, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetLocationsReply.Location, rhs: Api_GetLocationsReply.Location) -> Bool { + if lhs.location != rhs.location {return false} + if lhs.name != rhs.name {return false} + if lhs.lon != rhs.lon {return false} + if lhs.lat != rhs.lat {return false} + if lhs.radius != rhs.radius {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_SearchRoomsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".SearchRoomsRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "query"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.query) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.query.isEmpty { + try visitor.visitSingularStringField(value: self.query, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_SearchRoomsRequest, rhs: Api_SearchRoomsRequest) -> Bool { + if lhs.query != rhs.query {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_SearchRoomsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".SearchRoomsReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "rooms"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.rooms) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.rooms.isEmpty { + try visitor.visitRepeatedMessageField(value: self.rooms, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_SearchRoomsReply, rhs: Api_SearchRoomsReply) -> Bool { + if lhs.rooms != rhs.rooms {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_Room: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".Room" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "roomId"), + 2: .standard(proto: "room_code"), + 3: .standard(proto: "building_nr"), + 4: .standard(proto: "arch_id"), + 5: .same(proto: "info"), + 6: .same(proto: "address"), + 7: .same(proto: "purpose"), + 8: .same(proto: "campus"), + 9: .same(proto: "name"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.roomID) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.roomCode) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.buildingNr) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.archID) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.info) }() + case 6: try { try decoder.decodeSingularStringField(value: &self.address) }() + case 7: try { try decoder.decodeSingularStringField(value: &self.purpose) }() + case 8: try { try decoder.decodeSingularStringField(value: &self.campus) }() + case 9: try { try decoder.decodeSingularStringField(value: &self.name) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.roomID != 0 { + try visitor.visitSingularInt32Field(value: self.roomID, fieldNumber: 1) + } + if !self.roomCode.isEmpty { + try visitor.visitSingularStringField(value: self.roomCode, fieldNumber: 2) + } + if !self.buildingNr.isEmpty { + try visitor.visitSingularStringField(value: self.buildingNr, fieldNumber: 3) + } + if !self.archID.isEmpty { + try visitor.visitSingularStringField(value: self.archID, fieldNumber: 4) + } + if !self.info.isEmpty { + try visitor.visitSingularStringField(value: self.info, fieldNumber: 5) + } + if !self.address.isEmpty { + try visitor.visitSingularStringField(value: self.address, fieldNumber: 6) + } + if !self.purpose.isEmpty { + try visitor.visitSingularStringField(value: self.purpose, fieldNumber: 7) + } + if !self.campus.isEmpty { + try visitor.visitSingularStringField(value: self.campus, fieldNumber: 8) + } + if !self.name.isEmpty { + try visitor.visitSingularStringField(value: self.name, fieldNumber: 9) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_Room, rhs: Api_Room) -> Bool { + if lhs.roomID != rhs.roomID {return false} + if lhs.roomCode != rhs.roomCode {return false} + if lhs.buildingNr != rhs.buildingNr {return false} + if lhs.archID != rhs.archID {return false} + if lhs.info != rhs.info {return false} + if lhs.address != rhs.address {return false} + if lhs.purpose != rhs.purpose {return false} + if lhs.campus != rhs.campus {return false} + if lhs.name != rhs.name {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_NewsSourceArray: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".NewsSourceArray" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "sources"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.sources) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.sources.isEmpty { + try visitor.visitRepeatedMessageField(value: self.sources, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_NewsSourceArray, rhs: Api_NewsSourceArray) -> Bool { + if lhs.sources != rhs.sources {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_NewsSource: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".NewsSource" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "source"), + 2: .same(proto: "title"), + 3: .same(proto: "icon"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.source) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.title) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.icon) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.source.isEmpty { + try visitor.visitSingularStringField(value: self.source, fieldNumber: 1) + } + if !self.title.isEmpty { + try visitor.visitSingularStringField(value: self.title, fieldNumber: 2) + } + if !self.icon.isEmpty { + try visitor.visitSingularStringField(value: self.icon, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_NewsSource, rhs: Api_NewsSource) -> Bool { + if lhs.source != rhs.source {return false} + if lhs.title != rhs.title {return false} + if lhs.icon != rhs.icon {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetTopNewsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetTopNewsReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "image_url"), + 2: .same(proto: "link"), + 3: .same(proto: "created"), + 4: .same(proto: "from"), + 5: .same(proto: "to"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.imageURL) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.link) }() + case 3: try { try decoder.decodeSingularMessageField(value: &self._created) }() + case 4: try { try decoder.decodeSingularMessageField(value: &self._from) }() + case 5: try { try decoder.decodeSingularMessageField(value: &self._to) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + if !self.imageURL.isEmpty { + try visitor.visitSingularStringField(value: self.imageURL, fieldNumber: 1) + } + if !self.link.isEmpty { + try visitor.visitSingularStringField(value: self.link, fieldNumber: 2) + } + try { if let v = self._created { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } }() + try { if let v = self._from { + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + } }() + try { if let v = self._to { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } }() + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetTopNewsReply, rhs: Api_GetTopNewsReply) -> Bool { + if lhs.imageURL != rhs.imageURL {return false} + if lhs.link != rhs.link {return false} + if lhs._created != rhs._created {return false} + if lhs._from != rhs._from {return false} + if lhs._to != rhs._to {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_CafeteriaRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".CafeteriaRatingRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "cafeteriaId"), + 2: .same(proto: "from"), + 3: .same(proto: "to"), + 4: .same(proto: "limit"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.cafeteriaID) }() + case 2: try { try decoder.decodeSingularMessageField(value: &self._from) }() + case 3: try { try decoder.decodeSingularMessageField(value: &self._to) }() + case 4: try { try decoder.decodeSingularInt32Field(value: &self.limit) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + if !self.cafeteriaID.isEmpty { + try visitor.visitSingularStringField(value: self.cafeteriaID, fieldNumber: 1) + } + try { if let v = self._from { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } }() + try { if let v = self._to { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } }() + if self.limit != 0 { + try visitor.visitSingularInt32Field(value: self.limit, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_CafeteriaRatingRequest, rhs: Api_CafeteriaRatingRequest) -> Bool { + if lhs.cafeteriaID != rhs.cafeteriaID {return false} + if lhs._from != rhs._from {return false} + if lhs._to != rhs._to {return false} + if lhs.limit != rhs.limit {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_DishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".DishRatingRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "cafeteriaId"), + 2: .same(proto: "dish"), + 3: .same(proto: "from"), + 4: .same(proto: "to"), + 5: .same(proto: "limit"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.cafeteriaID) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.dish) }() + case 3: try { try decoder.decodeSingularMessageField(value: &self._from) }() + case 4: try { try decoder.decodeSingularMessageField(value: &self._to) }() + case 5: try { try decoder.decodeSingularInt32Field(value: &self.limit) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + if !self.cafeteriaID.isEmpty { + try visitor.visitSingularStringField(value: self.cafeteriaID, fieldNumber: 1) + } + if !self.dish.isEmpty { + try visitor.visitSingularStringField(value: self.dish, fieldNumber: 2) + } + try { if let v = self._from { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } }() + try { if let v = self._to { + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + } }() + if self.limit != 0 { + try visitor.visitSingularInt32Field(value: self.limit, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_DishRatingRequest, rhs: Api_DishRatingRequest) -> Bool { + if lhs.cafeteriaID != rhs.cafeteriaID {return false} + if lhs.dish != rhs.dish {return false} + if lhs._from != rhs._from {return false} + if lhs._to != rhs._to {return false} + if lhs.limit != rhs.limit {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_CafeteriaRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".CafeteriaRatingReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "rating"), + 2: .same(proto: "avg"), + 3: .same(proto: "std"), + 4: .same(proto: "min"), + 5: .same(proto: "max"), + 6: .same(proto: "ratingTags"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.rating) }() + case 2: try { try decoder.decodeSingularDoubleField(value: &self.avg) }() + case 3: try { try decoder.decodeSingularDoubleField(value: &self.std) }() + case 4: try { try decoder.decodeSingularInt32Field(value: &self.min) }() + case 5: try { try decoder.decodeSingularInt32Field(value: &self.max) }() + case 6: try { try decoder.decodeRepeatedMessageField(value: &self.ratingTags) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.rating.isEmpty { + try visitor.visitRepeatedMessageField(value: self.rating, fieldNumber: 1) + } + if self.avg != 0 { + try visitor.visitSingularDoubleField(value: self.avg, fieldNumber: 2) + } + if self.std != 0 { + try visitor.visitSingularDoubleField(value: self.std, fieldNumber: 3) + } + if self.min != 0 { + try visitor.visitSingularInt32Field(value: self.min, fieldNumber: 4) + } + if self.max != 0 { + try visitor.visitSingularInt32Field(value: self.max, fieldNumber: 5) + } + if !self.ratingTags.isEmpty { + try visitor.visitRepeatedMessageField(value: self.ratingTags, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_CafeteriaRatingReply, rhs: Api_CafeteriaRatingReply) -> Bool { + if lhs.rating != rhs.rating {return false} + if lhs.avg != rhs.avg {return false} + if lhs.std != rhs.std {return false} + if lhs.min != rhs.min {return false} + if lhs.max != rhs.max {return false} + if lhs.ratingTags != rhs.ratingTags {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_DishRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".DishRatingReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "rating"), + 2: .same(proto: "avg"), + 3: .same(proto: "std"), + 4: .same(proto: "min"), + 5: .same(proto: "max"), + 6: .same(proto: "ratingTags"), + 7: .same(proto: "nameTags"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.rating) }() + case 2: try { try decoder.decodeSingularDoubleField(value: &self.avg) }() + case 3: try { try decoder.decodeSingularDoubleField(value: &self.std) }() + case 4: try { try decoder.decodeSingularInt32Field(value: &self.min) }() + case 5: try { try decoder.decodeSingularInt32Field(value: &self.max) }() + case 6: try { try decoder.decodeRepeatedMessageField(value: &self.ratingTags) }() + case 7: try { try decoder.decodeRepeatedMessageField(value: &self.nameTags) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.rating.isEmpty { + try visitor.visitRepeatedMessageField(value: self.rating, fieldNumber: 1) + } + if self.avg != 0 { + try visitor.visitSingularDoubleField(value: self.avg, fieldNumber: 2) + } + if self.std != 0 { + try visitor.visitSingularDoubleField(value: self.std, fieldNumber: 3) + } + if self.min != 0 { + try visitor.visitSingularInt32Field(value: self.min, fieldNumber: 4) + } + if self.max != 0 { + try visitor.visitSingularInt32Field(value: self.max, fieldNumber: 5) + } + if !self.ratingTags.isEmpty { + try visitor.visitRepeatedMessageField(value: self.ratingTags, fieldNumber: 6) + } + if !self.nameTags.isEmpty { + try visitor.visitRepeatedMessageField(value: self.nameTags, fieldNumber: 7) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_DishRatingReply, rhs: Api_DishRatingReply) -> Bool { + if lhs.rating != rhs.rating {return false} + if lhs.avg != rhs.avg {return false} + if lhs.std != rhs.std {return false} + if lhs.min != rhs.min {return false} + if lhs.max != rhs.max {return false} + if lhs.ratingTags != rhs.ratingTags {return false} + if lhs.nameTags != rhs.nameTags {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_SingleRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".SingleRatingReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "points"), + 2: .same(proto: "image"), + 3: .same(proto: "comment"), + 4: .same(proto: "ratingTags"), + 5: .same(proto: "visited"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.points) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.image) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.comment) }() + case 4: try { try decoder.decodeRepeatedMessageField(value: &self.ratingTags) }() + case 5: try { try decoder.decodeSingularMessageField(value: &self._visited) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + if self.points != 0 { + try visitor.visitSingularInt32Field(value: self.points, fieldNumber: 1) + } + if !self.image.isEmpty { + try visitor.visitSingularBytesField(value: self.image, fieldNumber: 2) + } + if !self.comment.isEmpty { + try visitor.visitSingularStringField(value: self.comment, fieldNumber: 3) + } + if !self.ratingTags.isEmpty { + try visitor.visitRepeatedMessageField(value: self.ratingTags, fieldNumber: 4) + } + try { if let v = self._visited { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } }() + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_SingleRatingReply, rhs: Api_SingleRatingReply) -> Bool { + if lhs.points != rhs.points {return false} + if lhs.image != rhs.image {return false} + if lhs.comment != rhs.comment {return false} + if lhs.ratingTags != rhs.ratingTags {return false} + if lhs._visited != rhs._visited {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_NewCafeteriaRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".NewCafeteriaRatingRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "points"), + 2: .same(proto: "cafeteriaId"), + 3: .same(proto: "image"), + 4: .same(proto: "ratingTags"), + 6: .same(proto: "comment"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.points) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.cafeteriaID) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self.image) }() + case 4: try { try decoder.decodeRepeatedMessageField(value: &self.ratingTags) }() + case 6: try { try decoder.decodeSingularStringField(value: &self.comment) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.points != 0 { + try visitor.visitSingularInt32Field(value: self.points, fieldNumber: 1) + } + if !self.cafeteriaID.isEmpty { + try visitor.visitSingularStringField(value: self.cafeteriaID, fieldNumber: 2) + } + if !self.image.isEmpty { + try visitor.visitSingularBytesField(value: self.image, fieldNumber: 3) + } + if !self.ratingTags.isEmpty { + try visitor.visitRepeatedMessageField(value: self.ratingTags, fieldNumber: 4) + } + if !self.comment.isEmpty { + try visitor.visitSingularStringField(value: self.comment, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_NewCafeteriaRatingRequest, rhs: Api_NewCafeteriaRatingRequest) -> Bool { + if lhs.points != rhs.points {return false} + if lhs.cafeteriaID != rhs.cafeteriaID {return false} + if lhs.image != rhs.image {return false} + if lhs.ratingTags != rhs.ratingTags {return false} + if lhs.comment != rhs.comment {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_NewDishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".NewDishRatingRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "points"), + 2: .same(proto: "cafeteriaId"), + 3: .same(proto: "dish"), + 4: .same(proto: "image"), + 5: .same(proto: "ratingTags"), + 7: .same(proto: "comment"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.points) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.cafeteriaID) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.dish) }() + case 4: try { try decoder.decodeSingularBytesField(value: &self.image) }() + case 5: try { try decoder.decodeRepeatedMessageField(value: &self.ratingTags) }() + case 7: try { try decoder.decodeSingularStringField(value: &self.comment) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.points != 0 { + try visitor.visitSingularInt32Field(value: self.points, fieldNumber: 1) + } + if !self.cafeteriaID.isEmpty { + try visitor.visitSingularStringField(value: self.cafeteriaID, fieldNumber: 2) + } + if !self.dish.isEmpty { + try visitor.visitSingularStringField(value: self.dish, fieldNumber: 3) + } + if !self.image.isEmpty { + try visitor.visitSingularBytesField(value: self.image, fieldNumber: 4) + } + if !self.ratingTags.isEmpty { + try visitor.visitRepeatedMessageField(value: self.ratingTags, fieldNumber: 5) + } + if !self.comment.isEmpty { + try visitor.visitSingularStringField(value: self.comment, fieldNumber: 7) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_NewDishRatingRequest, rhs: Api_NewDishRatingRequest) -> Bool { + if lhs.points != rhs.points {return false} + if lhs.cafeteriaID != rhs.cafeteriaID {return false} + if lhs.dish != rhs.dish {return false} + if lhs.image != rhs.image {return false} + if lhs.ratingTags != rhs.ratingTags {return false} + if lhs.comment != rhs.comment {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetTagsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetTagsReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "ratingTags"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.ratingTags) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.ratingTags.isEmpty { + try visitor.visitRepeatedMessageField(value: self.ratingTags, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetTagsReply, rhs: Api_GetTagsReply) -> Bool { + if lhs.ratingTags != rhs.ratingTags {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_TagsOverview: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".TagsOverview" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "tagId"), + 2: .same(proto: "de"), + 3: .same(proto: "en"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.tagID) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.de) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.en) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.tagID != 0 { + try visitor.visitSingularInt32Field(value: self.tagID, fieldNumber: 1) + } + if !self.de.isEmpty { + try visitor.visitSingularStringField(value: self.de, fieldNumber: 2) + } + if !self.en.isEmpty { + try visitor.visitSingularStringField(value: self.en, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_TagsOverview, rhs: Api_TagsOverview) -> Bool { + if lhs.tagID != rhs.tagID {return false} + if lhs.de != rhs.de {return false} + if lhs.en != rhs.en {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_RatingTag: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".RatingTag" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "tagId"), + 2: .same(proto: "points"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.tagID) }() + case 2: try { try decoder.decodeSingularDoubleField(value: &self.points) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.tagID != 0 { + try visitor.visitSingularInt32Field(value: self.tagID, fieldNumber: 1) + } + if self.points != 0 { + try visitor.visitSingularDoubleField(value: self.points, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_RatingTag, rhs: Api_RatingTag) -> Bool { + if lhs.tagID != rhs.tagID {return false} + if lhs.points != rhs.points {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_RatingTagNewRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".RatingTagNewRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "tagId"), + 2: .same(proto: "points"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.tagID) }() + case 2: try { try decoder.decodeSingularInt32Field(value: &self.points) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.tagID != 0 { + try visitor.visitSingularInt32Field(value: self.tagID, fieldNumber: 1) + } + if self.points != 0 { + try visitor.visitSingularInt32Field(value: self.points, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_RatingTagNewRequest, rhs: Api_RatingTagNewRequest) -> Bool { + if lhs.tagID != rhs.tagID {return false} + if lhs.points != rhs.points {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_RatingTagResult: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".RatingTagResult" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "tagId"), + 2: .same(proto: "avg"), + 3: .same(proto: "std"), + 4: .same(proto: "min"), + 5: .same(proto: "max"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.tagID) }() + case 2: try { try decoder.decodeSingularDoubleField(value: &self.avg) }() + case 3: try { try decoder.decodeSingularDoubleField(value: &self.std) }() + case 4: try { try decoder.decodeSingularInt32Field(value: &self.min) }() + case 5: try { try decoder.decodeSingularInt32Field(value: &self.max) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.tagID != 0 { + try visitor.visitSingularInt32Field(value: self.tagID, fieldNumber: 1) + } + if self.avg != 0 { + try visitor.visitSingularDoubleField(value: self.avg, fieldNumber: 2) + } + if self.std != 0 { + try visitor.visitSingularDoubleField(value: self.std, fieldNumber: 3) + } + if self.min != 0 { + try visitor.visitSingularInt32Field(value: self.min, fieldNumber: 4) + } + if self.max != 0 { + try visitor.visitSingularInt32Field(value: self.max, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_RatingTagResult, rhs: Api_RatingTagResult) -> Bool { + if lhs.tagID != rhs.tagID {return false} + if lhs.avg != rhs.avg {return false} + if lhs.std != rhs.std {return false} + if lhs.min != rhs.min {return false} + if lhs.max != rhs.max {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetCafeteriaReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetCafeteriaReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "cafeteria"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.cafeteria) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.cafeteria.isEmpty { + try visitor.visitRepeatedMessageField(value: self.cafeteria, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetCafeteriaReply, rhs: Api_GetCafeteriaReply) -> Bool { + if lhs.cafeteria != rhs.cafeteria {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_Cafeteria: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".Cafeteria" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "id"), + 2: .same(proto: "address"), + 3: .same(proto: "longitude"), + 4: .same(proto: "latitude"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.id) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.address) }() + case 3: try { try decoder.decodeSingularDoubleField(value: &self.longitude) }() + case 4: try { try decoder.decodeSingularDoubleField(value: &self.latitude) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.id.isEmpty { + try visitor.visitSingularStringField(value: self.id, fieldNumber: 1) + } + if !self.address.isEmpty { + try visitor.visitSingularStringField(value: self.address, fieldNumber: 2) + } + if self.longitude != 0 { + try visitor.visitSingularDoubleField(value: self.longitude, fieldNumber: 3) + } + if self.latitude != 0 { + try visitor.visitSingularDoubleField(value: self.latitude, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_Cafeteria, rhs: Api_Cafeteria) -> Bool { + if lhs.id != rhs.id {return false} + if lhs.address != rhs.address {return false} + if lhs.longitude != rhs.longitude {return false} + if lhs.latitude != rhs.latitude {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetDishesRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetDishesRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "cafeteriaId"), + 2: .same(proto: "year"), + 3: .same(proto: "week"), + 4: .same(proto: "day"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.cafeteriaID) }() + case 2: try { try decoder.decodeSingularInt32Field(value: &self.year) }() + case 3: try { try decoder.decodeSingularInt32Field(value: &self.week) }() + case 4: try { try decoder.decodeSingularInt32Field(value: &self.day) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.cafeteriaID.isEmpty { + try visitor.visitSingularStringField(value: self.cafeteriaID, fieldNumber: 1) + } + if self.year != 0 { + try visitor.visitSingularInt32Field(value: self.year, fieldNumber: 2) + } + if self.week != 0 { + try visitor.visitSingularInt32Field(value: self.week, fieldNumber: 3) + } + if self.day != 0 { + try visitor.visitSingularInt32Field(value: self.day, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetDishesRequest, rhs: Api_GetDishesRequest) -> Bool { + if lhs.cafeteriaID != rhs.cafeteriaID {return false} + if lhs.year != rhs.year {return false} + if lhs.week != rhs.week {return false} + if lhs.day != rhs.day {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetDishesReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetDishesReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "dish"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedStringField(value: &self.dish) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.dish.isEmpty { + try visitor.visitRepeatedStringField(value: self.dish, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetDishesReply, rhs: Api_GetDishesReply) -> Bool { + if lhs.dish != rhs.dish {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetResponsiblePersonReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetResponsiblePersonReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "responsiblePerson"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.responsiblePerson) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.responsiblePerson.isEmpty { + try visitor.visitRepeatedMessageField(value: self.responsiblePerson, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetResponsiblePersonReply, rhs: Api_GetResponsiblePersonReply) -> Bool { + if lhs.responsiblePerson != rhs.responsiblePerson {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_ResponsiblePersonElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".ResponsiblePersonElement" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "name"), + 2: .same(proto: "telephone"), + 3: .same(proto: "email"), + 4: .same(proto: "faculty"), + 5: .same(proto: "tumID"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.name) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.telephone) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.email) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.faculty) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.tumID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.name.isEmpty { + try visitor.visitSingularStringField(value: self.name, fieldNumber: 1) + } + if !self.telephone.isEmpty { + try visitor.visitSingularStringField(value: self.telephone, fieldNumber: 2) + } + if !self.email.isEmpty { + try visitor.visitSingularStringField(value: self.email, fieldNumber: 3) + } + if !self.faculty.isEmpty { + try visitor.visitSingularStringField(value: self.faculty, fieldNumber: 4) + } + if !self.tumID.isEmpty { + try visitor.visitSingularStringField(value: self.tumID, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_ResponsiblePersonElement, rhs: Api_ResponsiblePersonElement) -> Bool { + if lhs.name != rhs.name {return false} + if lhs.telephone != rhs.telephone {return false} + if lhs.email != rhs.email {return false} + if lhs.faculty != rhs.faculty {return false} + if lhs.tumID != rhs.tumID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetBuilding2GpsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetBuilding2GpsReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "building2Gps"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.building2Gps) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.building2Gps.isEmpty { + try visitor.visitRepeatedMessageField(value: self.building2Gps, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetBuilding2GpsReply, rhs: Api_GetBuilding2GpsReply) -> Bool { + if lhs.building2Gps != rhs.building2Gps {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_Building2GpsElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".Building2GpsElement" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "id"), + 2: .same(proto: "latitude"), + 3: .same(proto: "longitude"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.id) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.latitude) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.longitude) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.id.isEmpty { + try visitor.visitSingularStringField(value: self.id, fieldNumber: 1) + } + if !self.latitude.isEmpty { + try visitor.visitSingularStringField(value: self.latitude, fieldNumber: 2) + } + if !self.longitude.isEmpty { + try visitor.visitSingularStringField(value: self.longitude, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_Building2GpsElement, rhs: Api_Building2GpsElement) -> Bool { + if lhs.id != rhs.id {return false} + if lhs.latitude != rhs.latitude {return false} + if lhs.longitude != rhs.longitude {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetAreaFacilitiesByBuildingNrReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetAreaFacilitiesByBuildingNrReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "areaFacilitiesByBuildingNr"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.areaFacilitiesByBuildingNr) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.areaFacilitiesByBuildingNr.isEmpty { + try visitor.visitRepeatedMessageField(value: self.areaFacilitiesByBuildingNr, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetAreaFacilitiesByBuildingNrReply, rhs: Api_GetAreaFacilitiesByBuildingNrReply) -> Bool { + if lhs.areaFacilitiesByBuildingNr != rhs.areaFacilitiesByBuildingNr {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetAreaFacilitiesByBuildingNrRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetAreaFacilitiesByBuildingNrRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "building_nr"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.buildingNr) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.buildingNr.isEmpty { + try visitor.visitSingularStringField(value: self.buildingNr, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetAreaFacilitiesByBuildingNrRequest, rhs: Api_GetAreaFacilitiesByBuildingNrRequest) -> Bool { + if lhs.buildingNr != rhs.buildingNr {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetListOfToiletsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetListOfToiletsReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "listOfToilets"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.listOfToilets) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.listOfToilets.isEmpty { + try visitor.visitRepeatedMessageField(value: self.listOfToilets, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetListOfToiletsReply, rhs: Api_GetListOfToiletsReply) -> Bool { + if lhs.listOfToilets != rhs.listOfToilets {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_RoomInformationElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".RoomInformationElement" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "roomId"), + 2: .standard(proto: "room_code"), + 3: .standard(proto: "building_nr"), + 4: .standard(proto: "arch_id"), + 5: .same(proto: "info"), + 6: .same(proto: "address"), + 7: .same(proto: "purpose"), + 8: .same(proto: "campus"), + 9: .same(proto: "name"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.roomID) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.roomCode) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.buildingNr) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.archID) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.info) }() + case 6: try { try decoder.decodeSingularStringField(value: &self.address) }() + case 7: try { try decoder.decodeSingularStringField(value: &self.purpose) }() + case 8: try { try decoder.decodeSingularStringField(value: &self.campus) }() + case 9: try { try decoder.decodeSingularStringField(value: &self.name) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.roomID != 0 { + try visitor.visitSingularInt32Field(value: self.roomID, fieldNumber: 1) + } + if !self.roomCode.isEmpty { + try visitor.visitSingularStringField(value: self.roomCode, fieldNumber: 2) + } + if !self.buildingNr.isEmpty { + try visitor.visitSingularStringField(value: self.buildingNr, fieldNumber: 3) + } + if !self.archID.isEmpty { + try visitor.visitSingularStringField(value: self.archID, fieldNumber: 4) + } + if !self.info.isEmpty { + try visitor.visitSingularStringField(value: self.info, fieldNumber: 5) + } + if !self.address.isEmpty { + try visitor.visitSingularStringField(value: self.address, fieldNumber: 6) + } + if !self.purpose.isEmpty { + try visitor.visitSingularStringField(value: self.purpose, fieldNumber: 7) + } + if !self.campus.isEmpty { + try visitor.visitSingularStringField(value: self.campus, fieldNumber: 8) + } + if !self.name.isEmpty { + try visitor.visitSingularStringField(value: self.name, fieldNumber: 9) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_RoomInformationElement, rhs: Api_RoomInformationElement) -> Bool { + if lhs.roomID != rhs.roomID {return false} + if lhs.roomCode != rhs.roomCode {return false} + if lhs.buildingNr != rhs.buildingNr {return false} + if lhs.archID != rhs.archID {return false} + if lhs.info != rhs.info {return false} + if lhs.address != rhs.address {return false} + if lhs.purpose != rhs.purpose {return false} + if lhs.campus != rhs.campus {return false} + if lhs.name != rhs.name {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetListOfElevatorsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetListOfElevatorsReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "listOfElevators"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.listOfElevators) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.listOfElevators.isEmpty { + try visitor.visitRepeatedMessageField(value: self.listOfElevators, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetListOfElevatorsReply, rhs: Api_GetListOfElevatorsReply) -> Bool { + if lhs.listOfElevators != rhs.listOfElevators {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetMoreInformationReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetMoreInformationReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "information"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.information) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.information.isEmpty { + try visitor.visitRepeatedMessageField(value: self.information, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetMoreInformationReply, rhs: Api_GetMoreInformationReply) -> Bool { + if lhs.information != rhs.information {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_MoreInformationElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".MoreInformationElement" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "title"), + 2: .same(proto: "category"), + 3: .same(proto: "url"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.title) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.category) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.url) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.title.isEmpty { + try visitor.visitSingularStringField(value: self.title, fieldNumber: 1) + } + if !self.category.isEmpty { + try visitor.visitSingularStringField(value: self.category, fieldNumber: 2) + } + if !self.url.isEmpty { + try visitor.visitSingularStringField(value: self.url, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_MoreInformationElement, rhs: Api_MoreInformationElement) -> Bool { + if lhs.title != rhs.title {return false} + if lhs.category != rhs.category {return false} + if lhs.url != rhs.url {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetOpeningTimesRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetOpeningTimesRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "language"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.language) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.language.isEmpty { + try visitor.visitSingularStringField(value: self.language, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetOpeningTimesRequest, rhs: Api_GetOpeningTimesRequest) -> Bool { + if lhs.language != rhs.language {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetOpeningTimesReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetOpeningTimesReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "facilities"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.facilities) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.facilities.isEmpty { + try visitor.visitRepeatedMessageField(value: self.facilities, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetOpeningTimesReply, rhs: Api_GetOpeningTimesReply) -> Bool { + if lhs.facilities != rhs.facilities {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_OpeningTimesMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".OpeningTimesMsgElement" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "id"), + 2: .same(proto: "category"), + 3: .same(proto: "name"), + 4: .same(proto: "address"), + 5: .same(proto: "room"), + 6: .standard(proto: "transport_station"), + 7: .standard(proto: "opening_hours"), + 8: .same(proto: "infos"), + 9: .same(proto: "url"), + 10: .same(proto: "language"), + 11: .standard(proto: "reference_id"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.id) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.category) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.name) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.address) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.room) }() + case 6: try { try decoder.decodeSingularStringField(value: &self.transportStation) }() + case 7: try { try decoder.decodeSingularStringField(value: &self.openingHours) }() + case 8: try { try decoder.decodeSingularStringField(value: &self.infos) }() + case 9: try { try decoder.decodeSingularStringField(value: &self.url) }() + case 10: try { try decoder.decodeSingularStringField(value: &self.language) }() + case 11: try { try decoder.decodeSingularInt32Field(value: &self.referenceID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.id != 0 { + try visitor.visitSingularInt32Field(value: self.id, fieldNumber: 1) + } + if !self.category.isEmpty { + try visitor.visitSingularStringField(value: self.category, fieldNumber: 2) + } + if !self.name.isEmpty { + try visitor.visitSingularStringField(value: self.name, fieldNumber: 3) + } + if !self.address.isEmpty { + try visitor.visitSingularStringField(value: self.address, fieldNumber: 4) + } + if !self.room.isEmpty { + try visitor.visitSingularStringField(value: self.room, fieldNumber: 5) + } + if !self.transportStation.isEmpty { + try visitor.visitSingularStringField(value: self.transportStation, fieldNumber: 6) + } + if !self.openingHours.isEmpty { + try visitor.visitSingularStringField(value: self.openingHours, fieldNumber: 7) + } + if !self.infos.isEmpty { + try visitor.visitSingularStringField(value: self.infos, fieldNumber: 8) + } + if !self.url.isEmpty { + try visitor.visitSingularStringField(value: self.url, fieldNumber: 9) + } + if !self.language.isEmpty { + try visitor.visitSingularStringField(value: self.language, fieldNumber: 10) + } + if self.referenceID != 0 { + try visitor.visitSingularInt32Field(value: self.referenceID, fieldNumber: 11) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_OpeningTimesMsgElement, rhs: Api_OpeningTimesMsgElement) -> Bool { + if lhs.id != rhs.id {return false} + if lhs.category != rhs.category {return false} + if lhs.name != rhs.name {return false} + if lhs.address != rhs.address {return false} + if lhs.room != rhs.room {return false} + if lhs.transportStation != rhs.transportStation {return false} + if lhs.openingHours != rhs.openingHours {return false} + if lhs.infos != rhs.infos {return false} + if lhs.url != rhs.url {return false} + if lhs.language != rhs.language {return false} + if lhs.referenceID != rhs.referenceID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetUpdateNoteRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetUpdateNoteRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "version"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.version) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.version != 0 { + try visitor.visitSingularInt32Field(value: self.version, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetUpdateNoteRequest, rhs: Api_GetUpdateNoteRequest) -> Bool { + if lhs.version != rhs.version {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetUpdateNoteReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetUpdateNoteReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "message"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.message) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.message.isEmpty { + try visitor.visitSingularStringField(value: self.message, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetUpdateNoteReply, rhs: Api_GetUpdateNoteReply) -> Bool { + if lhs.message != rhs.message {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetStudyRoomListReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetStudyRoomListReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "rooms"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.rooms) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.rooms.isEmpty { + try visitor.visitRepeatedMessageField(value: self.rooms, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetStudyRoomListReply, rhs: Api_GetStudyRoomListReply) -> Bool { + if lhs.rooms != rhs.rooms {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_StudyRoomMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".StudyRoomMsgElement" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "id"), + 2: .same(proto: "name"), + 3: .same(proto: "details"), + 4: .same(proto: "rooms"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.id) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.name) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.details) }() + case 4: try { try decoder.decodeRepeatedMessageField(value: &self.rooms) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.id != 0 { + try visitor.visitSingularInt32Field(value: self.id, fieldNumber: 1) + } + if !self.name.isEmpty { + try visitor.visitSingularStringField(value: self.name, fieldNumber: 2) + } + if !self.details.isEmpty { + try visitor.visitSingularStringField(value: self.details, fieldNumber: 3) + } + if !self.rooms.isEmpty { + try visitor.visitRepeatedMessageField(value: self.rooms, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_StudyRoomMsgElement, rhs: Api_StudyRoomMsgElement) -> Bool { + if lhs.id != rhs.id {return false} + if lhs.name != rhs.name {return false} + if lhs.details != rhs.details {return false} + if lhs.rooms != rhs.rooms {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_StudyRoom: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".StudyRoom" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "group_id"), + 2: .same(proto: "roomId"), + 3: .standard(proto: "room_code"), + 4: .standard(proto: "room_name"), + 5: .standard(proto: "building_name"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.groupID) }() + case 2: try { try decoder.decodeSingularInt32Field(value: &self.roomID) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.roomCode) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.roomName) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.buildingName) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.groupID != 0 { + try visitor.visitSingularInt32Field(value: self.groupID, fieldNumber: 1) + } + if self.roomID != 0 { + try visitor.visitSingularInt32Field(value: self.roomID, fieldNumber: 2) + } + if !self.roomCode.isEmpty { + try visitor.visitSingularStringField(value: self.roomCode, fieldNumber: 3) + } + if !self.roomName.isEmpty { + try visitor.visitSingularStringField(value: self.roomName, fieldNumber: 4) + } + if !self.buildingName.isEmpty { + try visitor.visitSingularStringField(value: self.buildingName, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_StudyRoom, rhs: Api_StudyRoom) -> Bool { + if lhs.groupID != rhs.groupID {return false} + if lhs.roomID != rhs.roomID {return false} + if lhs.roomCode != rhs.roomCode {return false} + if lhs.roomName != rhs.roomName {return false} + if lhs.buildingName != rhs.buildingName {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetEventListRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetEventListRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "eventId"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.eventID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.eventID != 0 { + try visitor.visitSingularInt32Field(value: self.eventID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetEventListRequest, rhs: Api_GetEventListRequest) -> Bool { + if lhs.eventID != rhs.eventID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetEventListReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetEventListReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "events"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.events) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.events.isEmpty { + try visitor.visitRepeatedMessageField(value: self.events, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetEventListReply, rhs: Api_GetEventListReply) -> Bool { + if lhs.events != rhs.events {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_EventListMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".EventListMsgElement" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "name"), + 2: .same(proto: "path"), + 3: .same(proto: "event"), + 4: .same(proto: "news"), + 5: .same(proto: "kino"), + 6: .same(proto: "file"), + 7: .same(proto: "title"), + 8: .same(proto: "description"), + 9: .same(proto: "locality"), + 10: .same(proto: "link"), + 11: .same(proto: "start"), + 12: .same(proto: "end"), + 13: .standard(proto: "ticket_group"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.name) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.path) }() + case 3: try { try decoder.decodeSingularInt32Field(value: &self.event) }() + case 4: try { try decoder.decodeSingularInt32Field(value: &self.news) }() + case 5: try { try decoder.decodeSingularInt32Field(value: &self.kino) }() + case 6: try { try decoder.decodeSingularInt32Field(value: &self.file) }() + case 7: try { try decoder.decodeSingularStringField(value: &self.title) }() + case 8: try { try decoder.decodeSingularStringField(value: &self.description_p) }() + case 9: try { try decoder.decodeSingularStringField(value: &self.locality) }() + case 10: try { try decoder.decodeSingularStringField(value: &self.link) }() + case 11: try { try decoder.decodeSingularMessageField(value: &self._start) }() + case 12: try { try decoder.decodeSingularMessageField(value: &self._end) }() + case 13: try { try decoder.decodeSingularInt32Field(value: &self.ticketGroup) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + if !self.name.isEmpty { + try visitor.visitSingularStringField(value: self.name, fieldNumber: 1) + } + if !self.path.isEmpty { + try visitor.visitSingularStringField(value: self.path, fieldNumber: 2) + } + if self.event != 0 { + try visitor.visitSingularInt32Field(value: self.event, fieldNumber: 3) + } + if self.news != 0 { + try visitor.visitSingularInt32Field(value: self.news, fieldNumber: 4) + } + if self.kino != 0 { + try visitor.visitSingularInt32Field(value: self.kino, fieldNumber: 5) + } + if self.file != 0 { + try visitor.visitSingularInt32Field(value: self.file, fieldNumber: 6) + } + if !self.title.isEmpty { + try visitor.visitSingularStringField(value: self.title, fieldNumber: 7) + } + if !self.description_p.isEmpty { + try visitor.visitSingularStringField(value: self.description_p, fieldNumber: 8) + } + if !self.locality.isEmpty { + try visitor.visitSingularStringField(value: self.locality, fieldNumber: 9) + } + if !self.link.isEmpty { + try visitor.visitSingularStringField(value: self.link, fieldNumber: 10) + } + try { if let v = self._start { + try visitor.visitSingularMessageField(value: v, fieldNumber: 11) + } }() + try { if let v = self._end { + try visitor.visitSingularMessageField(value: v, fieldNumber: 12) + } }() + if self.ticketGroup != 0 { + try visitor.visitSingularInt32Field(value: self.ticketGroup, fieldNumber: 13) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_EventListMsgElement, rhs: Api_EventListMsgElement) -> Bool { + if lhs.name != rhs.name {return false} + if lhs.path != rhs.path {return false} + if lhs.event != rhs.event {return false} + if lhs.news != rhs.news {return false} + if lhs.kino != rhs.kino {return false} + if lhs.file != rhs.file {return false} + if lhs.title != rhs.title {return false} + if lhs.description_p != rhs.description_p {return false} + if lhs.locality != rhs.locality {return false} + if lhs.link != rhs.link {return false} + if lhs._start != rhs._start {return false} + if lhs._end != rhs._end {return false} + if lhs.ticketGroup != rhs.ticketGroup {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetKinoRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetKinoRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "lastId"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.lastID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.lastID != 0 { + try visitor.visitSingularInt32Field(value: self.lastID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetKinoRequest, rhs: Api_GetKinoRequest) -> Bool { + if lhs.lastID != rhs.lastID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetKinoReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetKinoReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "kinos"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.kinos) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.kinos.isEmpty { + try visitor.visitRepeatedMessageField(value: self.kinos, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetKinoReply, rhs: Api_GetKinoReply) -> Bool { + if lhs.kinos != rhs.kinos {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_KinoMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".KinoMsgElement" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "name"), + 2: .same(proto: "path"), + 3: .same(proto: "kino"), + 4: .same(proto: "date"), + 5: .same(proto: "created"), + 6: .same(proto: "title"), + 7: .same(proto: "year"), + 8: .same(proto: "runtime"), + 9: .same(proto: "genre"), + 10: .same(proto: "director"), + 11: .same(proto: "actors"), + 12: .same(proto: "rating"), + 13: .same(proto: "description"), + 14: .same(proto: "cover"), + 15: .same(proto: "trailer"), + 16: .same(proto: "link"), + ] + + fileprivate class _StorageClass { + var _name: String = String() + var _path: String = String() + var _kino: Int32 = 0 + var _date: SwiftProtobuf.Google_Protobuf_Timestamp? = nil + var _created: SwiftProtobuf.Google_Protobuf_Timestamp? = nil + var _title: String = String() + var _year: String = String() + var _runtime: String = String() + var _genre: String = String() + var _director: String = String() + var _actors: String = String() + var _rating: String = String() + var _description_p: String = String() + var _cover: Int32 = 0 + var _trailer: String = String() + var _link: String = String() + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _name = source._name + _path = source._path + _kino = source._kino + _date = source._date + _created = source._created + _title = source._title + _year = source._year + _runtime = source._runtime + _genre = source._genre + _director = source._director + _actors = source._actors + _rating = source._rating + _description_p = source._description_p + _cover = source._cover + _trailer = source._trailer + _link = source._link + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + public mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &_storage._name) }() + case 2: try { try decoder.decodeSingularStringField(value: &_storage._path) }() + case 3: try { try decoder.decodeSingularInt32Field(value: &_storage._kino) }() + case 4: try { try decoder.decodeSingularMessageField(value: &_storage._date) }() + case 5: try { try decoder.decodeSingularMessageField(value: &_storage._created) }() + case 6: try { try decoder.decodeSingularStringField(value: &_storage._title) }() + case 7: try { try decoder.decodeSingularStringField(value: &_storage._year) }() + case 8: try { try decoder.decodeSingularStringField(value: &_storage._runtime) }() + case 9: try { try decoder.decodeSingularStringField(value: &_storage._genre) }() + case 10: try { try decoder.decodeSingularStringField(value: &_storage._director) }() + case 11: try { try decoder.decodeSingularStringField(value: &_storage._actors) }() + case 12: try { try decoder.decodeSingularStringField(value: &_storage._rating) }() + case 13: try { try decoder.decodeSingularStringField(value: &_storage._description_p) }() + case 14: try { try decoder.decodeSingularInt32Field(value: &_storage._cover) }() + case 15: try { try decoder.decodeSingularStringField(value: &_storage._trailer) }() + case 16: try { try decoder.decodeSingularStringField(value: &_storage._link) }() + default: break + } + } + } + } + + public func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + if !_storage._name.isEmpty { + try visitor.visitSingularStringField(value: _storage._name, fieldNumber: 1) + } + if !_storage._path.isEmpty { + try visitor.visitSingularStringField(value: _storage._path, fieldNumber: 2) + } + if _storage._kino != 0 { + try visitor.visitSingularInt32Field(value: _storage._kino, fieldNumber: 3) + } + try { if let v = _storage._date { + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + } }() + try { if let v = _storage._created { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } }() + if !_storage._title.isEmpty { + try visitor.visitSingularStringField(value: _storage._title, fieldNumber: 6) + } + if !_storage._year.isEmpty { + try visitor.visitSingularStringField(value: _storage._year, fieldNumber: 7) + } + if !_storage._runtime.isEmpty { + try visitor.visitSingularStringField(value: _storage._runtime, fieldNumber: 8) + } + if !_storage._genre.isEmpty { + try visitor.visitSingularStringField(value: _storage._genre, fieldNumber: 9) + } + if !_storage._director.isEmpty { + try visitor.visitSingularStringField(value: _storage._director, fieldNumber: 10) + } + if !_storage._actors.isEmpty { + try visitor.visitSingularStringField(value: _storage._actors, fieldNumber: 11) + } + if !_storage._rating.isEmpty { + try visitor.visitSingularStringField(value: _storage._rating, fieldNumber: 12) + } + if !_storage._description_p.isEmpty { + try visitor.visitSingularStringField(value: _storage._description_p, fieldNumber: 13) + } + if _storage._cover != 0 { + try visitor.visitSingularInt32Field(value: _storage._cover, fieldNumber: 14) + } + if !_storage._trailer.isEmpty { + try visitor.visitSingularStringField(value: _storage._trailer, fieldNumber: 15) + } + if !_storage._link.isEmpty { + try visitor.visitSingularStringField(value: _storage._link, fieldNumber: 16) + } + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_KinoMsgElement, rhs: Api_KinoMsgElement) -> Bool { + if lhs._storage !== rhs._storage { + let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let rhs_storage = _args.1 + if _storage._name != rhs_storage._name {return false} + if _storage._path != rhs_storage._path {return false} + if _storage._kino != rhs_storage._kino {return false} + if _storage._date != rhs_storage._date {return false} + if _storage._created != rhs_storage._created {return false} + if _storage._title != rhs_storage._title {return false} + if _storage._year != rhs_storage._year {return false} + if _storage._runtime != rhs_storage._runtime {return false} + if _storage._genre != rhs_storage._genre {return false} + if _storage._director != rhs_storage._director {return false} + if _storage._actors != rhs_storage._actors {return false} + if _storage._rating != rhs_storage._rating {return false} + if _storage._description_p != rhs_storage._description_p {return false} + if _storage._cover != rhs_storage._cover {return false} + if _storage._trailer != rhs_storage._trailer {return false} + if _storage._link != rhs_storage._link {return false} + return true + } + if !storagesAreEqual {return false} + } + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_SendFeedbackRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".SendFeedbackRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "topic"), + 2: .same(proto: "email"), + 3: .same(proto: "emailId"), + 4: .same(proto: "message"), + 5: .standard(proto: "image_count"), + 6: .same(proto: "latitude"), + 7: .same(proto: "longitude"), + 8: .same(proto: "osVersion"), + 9: .same(proto: "appVersion"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.topic) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.email) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.emailID) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.message) }() + case 5: try { try decoder.decodeSingularInt32Field(value: &self.imageCount) }() + case 6: try { try decoder.decodeSingularDoubleField(value: &self.latitude) }() + case 7: try { try decoder.decodeSingularDoubleField(value: &self.longitude) }() + case 8: try { try decoder.decodeSingularStringField(value: &self.osVersion) }() + case 9: try { try decoder.decodeSingularStringField(value: &self.appVersion) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.topic.isEmpty { + try visitor.visitSingularStringField(value: self.topic, fieldNumber: 1) + } + if !self.email.isEmpty { + try visitor.visitSingularStringField(value: self.email, fieldNumber: 2) + } + if !self.emailID.isEmpty { + try visitor.visitSingularStringField(value: self.emailID, fieldNumber: 3) + } + if !self.message.isEmpty { + try visitor.visitSingularStringField(value: self.message, fieldNumber: 4) + } + if self.imageCount != 0 { + try visitor.visitSingularInt32Field(value: self.imageCount, fieldNumber: 5) + } + if self.latitude != 0 { + try visitor.visitSingularDoubleField(value: self.latitude, fieldNumber: 6) + } + if self.longitude != 0 { + try visitor.visitSingularDoubleField(value: self.longitude, fieldNumber: 7) + } + if !self.osVersion.isEmpty { + try visitor.visitSingularStringField(value: self.osVersion, fieldNumber: 8) + } + if !self.appVersion.isEmpty { + try visitor.visitSingularStringField(value: self.appVersion, fieldNumber: 9) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_SendFeedbackRequest, rhs: Api_SendFeedbackRequest) -> Bool { + if lhs.topic != rhs.topic {return false} + if lhs.email != rhs.email {return false} + if lhs.emailID != rhs.emailID {return false} + if lhs.message != rhs.message {return false} + if lhs.imageCount != rhs.imageCount {return false} + if lhs.latitude != rhs.latitude {return false} + if lhs.longitude != rhs.longitude {return false} + if lhs.osVersion != rhs.osVersion {return false} + if lhs.appVersion != rhs.appVersion {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_SendFeedbackImageReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".SendFeedbackImageReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "status"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.status) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.status.isEmpty { + try visitor.visitSingularStringField(value: self.status, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_SendFeedbackImageReply, rhs: Api_SendFeedbackImageReply) -> Bool { + if lhs.status != rhs.status {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_SendFeedbackImageRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".SendFeedbackImageRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "id"), + 2: .same(proto: "imageNr"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.id) }() + case 2: try { try decoder.decodeSingularInt32Field(value: &self.imageNr) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.id != 0 { + try visitor.visitSingularInt32Field(value: self.id, fieldNumber: 1) + } + if self.imageNr != 0 { + try visitor.visitSingularInt32Field(value: self.imageNr, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_SendFeedbackImageRequest, rhs: Api_SendFeedbackImageRequest) -> Bool { + if lhs.id != rhs.id {return false} + if lhs.imageNr != rhs.imageNr {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetMembersRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetMembersRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "lrzId"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.lrzID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.lrzID.isEmpty { + try visitor.visitSingularStringField(value: self.lrzID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetMembersRequest, rhs: Api_GetMembersRequest) -> Bool { + if lhs.lrzID != rhs.lrzID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetMembersReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetMembersReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "lrzId"), + 2: .same(proto: "name"), + 3: .same(proto: "memberId"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.lrzID) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.name) }() + case 3: try { try decoder.decodeSingularInt32Field(value: &self.memberID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.lrzID.isEmpty { + try visitor.visitSingularStringField(value: self.lrzID, fieldNumber: 1) + } + if !self.name.isEmpty { + try visitor.visitSingularStringField(value: self.name, fieldNumber: 2) + } + if self.memberID != 0 { + try visitor.visitSingularInt32Field(value: self.memberID, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetMembersReply, rhs: Api_GetMembersReply) -> Bool { + if lhs.lrzID != rhs.lrzID {return false} + if lhs.name != rhs.name {return false} + if lhs.memberID != rhs.memberID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_TUMCabeStatus: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".TUMCabeStatus" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "status"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.status) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.status.isEmpty { + try visitor.visitSingularStringField(value: self.status, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_TUMCabeStatus, rhs: Api_TUMCabeStatus) -> Bool { + if lhs.status != rhs.status {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetUploadStatusRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetUploadStatusRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "lrzId"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.lrzID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.lrzID.isEmpty { + try visitor.visitSingularStringField(value: self.lrzID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetUploadStatusRequest, rhs: Api_GetUploadStatusRequest) -> Bool { + if lhs.lrzID != rhs.lrzID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetUploadStatusReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetUploadStatusReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "fcm_token"), + 2: .standard(proto: "public_key"), + 3: .standard(proto: "student_id"), + 4: .standard(proto: "employee_id"), + 5: .standard(proto: "external_id"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.fcmToken) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.publicKey) }() + case 3: try { try decoder.decodeSingularBoolField(value: &self.studentID) }() + case 4: try { try decoder.decodeSingularBoolField(value: &self.employeeID) }() + case 5: try { try decoder.decodeSingularBoolField(value: &self.externalID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.fcmToken.isEmpty { + try visitor.visitSingularStringField(value: self.fcmToken, fieldNumber: 1) + } + if !self.publicKey.isEmpty { + try visitor.visitSingularStringField(value: self.publicKey, fieldNumber: 2) + } + if self.studentID != false { + try visitor.visitSingularBoolField(value: self.studentID, fieldNumber: 3) + } + if self.employeeID != false { + try visitor.visitSingularBoolField(value: self.employeeID, fieldNumber: 4) + } + if self.externalID != false { + try visitor.visitSingularBoolField(value: self.externalID, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetUploadStatusReply, rhs: Api_GetUploadStatusReply) -> Bool { + if lhs.fcmToken != rhs.fcmToken {return false} + if lhs.publicKey != rhs.publicKey {return false} + if lhs.studentID != rhs.studentID {return false} + if lhs.employeeID != rhs.employeeID {return false} + if lhs.externalID != rhs.externalID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetNotificationsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetNotificationsReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "notificationId"), + 2: .same(proto: "type"), + 3: .same(proto: "title"), + 4: .same(proto: "description"), + 5: .same(proto: "signature"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.notificationID) }() + case 2: try { try decoder.decodeSingularInt32Field(value: &self.type) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.title) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.description_p) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.signature) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.notificationID != 0 { + try visitor.visitSingularInt32Field(value: self.notificationID, fieldNumber: 1) + } + if self.type != 0 { + try visitor.visitSingularInt32Field(value: self.type, fieldNumber: 2) + } + if !self.title.isEmpty { + try visitor.visitSingularStringField(value: self.title, fieldNumber: 3) + } + if !self.description_p.isEmpty { + try visitor.visitSingularStringField(value: self.description_p, fieldNumber: 4) + } + if !self.signature.isEmpty { + try visitor.visitSingularStringField(value: self.signature, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetNotificationsReply, rhs: Api_GetNotificationsReply) -> Bool { + if lhs.notificationID != rhs.notificationID {return false} + if lhs.type != rhs.type {return false} + if lhs.title != rhs.title {return false} + if lhs.description_p != rhs.description_p {return false} + if lhs.signature != rhs.signature {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_NotificationsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".NotificationsRequest" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "notificationId"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.notificationID) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if self.notificationID != 0 { + try visitor.visitSingularInt32Field(value: self.notificationID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_NotificationsRequest, rhs: Api_NotificationsRequest) -> Bool { + if lhs.notificationID != rhs.notificationID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetNotificationsConfirmReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + public static let protoMessageName: String = _protobuf_package + ".GetNotificationsConfirmReply" + public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "status"), + ] + + public mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.status) }() + default: break + } + } + } + + public func traverse(visitor: inout V) throws { + if !self.status.isEmpty { + try visitor.visitSingularStringField(value: self.status, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + public static func ==(lhs: Api_GetNotificationsConfirmReply, rhs: Api_GetNotificationsConfirmReply) -> Bool { + if lhs.status != rhs.status {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + diff --git a/Campus-iOS/Base/Networking/CampusBackend.swift b/Campus-iOS/Base/Networking/CampusBackend.swift new file mode 100644 index 00000000..cdfca371 --- /dev/null +++ b/Campus-iOS/Base/Networking/CampusBackend.swift @@ -0,0 +1,34 @@ +// +// CampusBackend.swift +// Campus-iOS +// +// Created by Anton Wyrowski on 29.11.22. +// + +import Foundation +import GRPC + +struct CampusBackend { + + private static let s = CampusBackend() + + static let shared = s.client + + let client: Api_CampusAsyncClient + + private init() { + let group = PlatformSupport.makeEventLoopGroup(loopCount: 1) + + do { + let channel = try GRPCChannelPool.with( + target: .host("localhost", port: 50051), + transportSecurity: .plaintext, + eventLoopGroup: group + ) + + client = Api_CampusAsyncClient(channel: channel) + } catch { + fatalError("Couldn't start campus backend client!") + } + } +} diff --git a/Campus-iOS/Campus-iOS.entitlements b/Campus-iOS/Campus-iOS.entitlements index b8cf6f9e..5e138e78 100644 --- a/Campus-iOS/Campus-iOS.entitlements +++ b/Campus-iOS/Campus-iOS.entitlements @@ -2,6 +2,10 @@ + aps-environment + development + com.apple.developer.aps-environment + development com.apple.security.personal-information.location diff --git a/Campus-iOS/Info.plist b/Campus-iOS/Info.plist index 5afd3719..dccfcab1 100644 --- a/Campus-iOS/Info.plist +++ b/Campus-iOS/Info.plist @@ -62,6 +62,10 @@ UINewsstandBindingTypeMagazine + UIBackgroundModes + + remote-notification + UILaunchScreen UIColorName diff --git a/Campus-iOS/PushNotifications/PushNotifications.swift b/Campus-iOS/PushNotifications/PushNotifications.swift new file mode 100644 index 00000000..a1d926ab --- /dev/null +++ b/Campus-iOS/PushNotifications/PushNotifications.swift @@ -0,0 +1,29 @@ +// +// PushNotifications.swift +// Campus-iOS +// +// Created by Anton Wyrowski on 29.11.22. +// + +import Foundation + +class PushNotifications { + + static let shared = PushNotifications() + + func registerDeviceToken(_ deviceToken: String) async -> Void { + print("Registering token \(deviceToken)") + + let device: Api_RegisterIOSDeviceRequest = .with({ + $0.deviceID = deviceToken + }) + + do { + print("Sending device id to server") + let _ = try await CampusBackend.shared.registerIOSDevice(device) + } catch { + print("Failed registering ios device token!") + } + + } +} From 8f45604d6840e2733dd82369d4ddb91b24bafdbd Mon Sep 17 00:00:00 2001 From: Anton Wyrowski Date: Wed, 25 Jan 2023 10:56:12 +0100 Subject: [PATCH 03/14] Integrated gRPC CampusBackend Service --- .../Base/Networking/CampusBackend.swift | 29 +- ...nd.grpc.swift => CampusService.grpc.swift} | 1100 ++++----- ...ackend.pb.swift => CampusService.pb.swift} | 2038 +++++++++-------- 3 files changed, 1573 insertions(+), 1594 deletions(-) rename Campus-iOS/Base/Networking/{CampusBackend.grpc.swift => CampusService.grpc.swift} (82%) rename Campus-iOS/Base/Networking/{CampusBackend.pb.swift => CampusService.pb.swift} (72%) diff --git a/Campus-iOS/Base/Networking/CampusBackend.swift b/Campus-iOS/Base/Networking/CampusBackend.swift index cdfca371..debf701b 100644 --- a/Campus-iOS/Base/Networking/CampusBackend.swift +++ b/Campus-iOS/Base/Networking/CampusBackend.swift @@ -7,6 +7,7 @@ import Foundation import GRPC +import Logging struct CampusBackend { @@ -19,16 +20,22 @@ struct CampusBackend { private init() { let group = PlatformSupport.makeEventLoopGroup(loopCount: 1) - do { - let channel = try GRPCChannelPool.with( - target: .host("localhost", port: 50051), - transportSecurity: .plaintext, - eventLoopGroup: group - ) - - client = Api_CampusAsyncClient(channel: channel) - } catch { - fatalError("Couldn't start campus backend client!") - } + var logger = Logger(label: "gRPC", factory: StreamLogHandler.standardOutput(label:)) + logger.logLevel = .debug + + + let channel = ClientConnection + .usingPlatformAppropriateTLS(for: group) + .withBackgroundActivityLogger(logger) + .connect(host: "vmott65.in.tum.de", port: 443) + + // For local development will be removed after + // backend changes are merged + /* let channel = ClientConnection + .insecure(group: group) + .withBackgroundActivityLogger(logger) + .connect(host: "10.181.217.246", port: 50051)*/ + + client = Api_CampusAsyncClient(channel: channel) } } diff --git a/Campus-iOS/Base/Networking/CampusBackend.grpc.swift b/Campus-iOS/Base/Networking/CampusService.grpc.swift similarity index 82% rename from Campus-iOS/Base/Networking/CampusBackend.grpc.swift rename to Campus-iOS/Base/Networking/CampusService.grpc.swift index 4f949764..3319ba14 100644 --- a/Campus-iOS/Base/Networking/CampusBackend.grpc.swift +++ b/Campus-iOS/Base/Networking/CampusService.grpc.swift @@ -27,7 +27,7 @@ import SwiftProtobuf /// Usage: instantiate `Api_CampusClient`, then call methods of this protocol to make API calls. -public protocol Api_CampusClientProtocol: GRPCClient { +internal protocol Api_CampusClientProtocol: GRPCClient { var serviceName: String { get } var interceptors: Api_CampusClientInterceptorFactoryProtocol? { get } @@ -176,21 +176,6 @@ public protocol Api_CampusClientProtocol: GRPCClient { callOptions: CallOptions? ) -> UnaryCall - func registerDevice( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? - ) -> UnaryCall - - func verifyKey( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? - ) -> UnaryCall - - func deviceUploadGcmToken( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? - ) -> UnaryCall - func getUploadStatus( _ request: Api_GetUploadStatusRequest, callOptions: CallOptions? @@ -211,24 +196,29 @@ public protocol Api_CampusClientProtocol: GRPCClient { callOptions: CallOptions? ) -> UnaryCall - func registerIOSDevice( - _ request: Api_RegisterIOSDeviceRequest, + func getCanteenHeadCount( + _ request: Api_GetCanteenHeadCountRequest, + callOptions: CallOptions? + ) -> UnaryCall + + func iOSDeviceRequestResponse( + _ request: Api_IOSDeviceRequestResponseRequest, callOptions: CallOptions? - ) -> UnaryCall + ) -> UnaryCall - func removeIOSDevice( - _ request: Api_RemoveIOSDeviceRequest, + func registerDevice( + _ request: Api_RegisterDeviceRequest, callOptions: CallOptions? - ) -> UnaryCall + ) -> UnaryCall - func addIOSDeviceUsage( - _ request: Api_AddIOSDeviceUsageRequest, + func removeDevice( + _ request: Api_RemoveDeviceRequest, callOptions: CallOptions? - ) -> UnaryCall + ) -> UnaryCall } extension Api_CampusClientProtocol { - public var serviceName: String { + internal var serviceName: String { return "api.Campus" } @@ -238,7 +228,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetTopNews. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getTopNews( + internal func getTopNews( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -256,7 +246,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetNewsSources. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getNewsSources( + internal func getNewsSources( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -274,7 +264,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to SearchRooms. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func searchRooms( + internal func searchRooms( _ request: Api_SearchRoomsRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -292,7 +282,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetLocations. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getLocations( + internal func getLocations( _ request: Api_GetLocationsRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -310,7 +300,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetRoomMaps. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getRoomMaps( + internal func getRoomMaps( _ request: Api_GetRoomMapsRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -328,7 +318,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetRoomCoordinates. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getRoomCoordinates( + internal func getRoomCoordinates( _ request: Api_GetRoomCoordinatesRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -346,7 +336,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetRoomSchedule. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getRoomSchedule( + internal func getRoomSchedule( _ request: Api_GetRoomScheduleRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -364,7 +354,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetCafeteriaRatings. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getCafeteriaRatings( + internal func getCafeteriaRatings( _ request: Api_CafeteriaRatingRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -382,7 +372,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetDishRatings. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getDishRatings( + internal func getDishRatings( _ request: Api_DishRatingRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -400,7 +390,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to NewCafeteriaRating. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func newCafeteriaRating( + internal func newCafeteriaRating( _ request: Api_NewCafeteriaRatingRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -418,7 +408,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to NewDishRating. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func newDishRating( + internal func newDishRating( _ request: Api_NewDishRatingRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -436,7 +426,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetAvailableDishTags. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getAvailableDishTags( + internal func getAvailableDishTags( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -454,7 +444,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetNameTags. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getNameTags( + internal func getNameTags( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -472,7 +462,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetAvailableCafeteriaTags. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getAvailableCafeteriaTags( + internal func getAvailableCafeteriaTags( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -490,7 +480,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetCafeterias. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getCafeterias( + internal func getCafeterias( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -508,7 +498,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetDishes. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getDishes( + internal func getDishes( _ request: Api_GetDishesRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -526,7 +516,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetResponsiblePerson. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getResponsiblePerson( + internal func getResponsiblePerson( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -544,7 +534,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetBuilding2Gps. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getBuilding2Gps( + internal func getBuilding2Gps( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -562,7 +552,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetAreaFacilitiesByBuildingNr. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getAreaFacilitiesByBuildingNr( + internal func getAreaFacilitiesByBuildingNr( _ request: Api_GetAreaFacilitiesByBuildingNrRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -580,7 +570,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetListOfToilets. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getListOfToilets( + internal func getListOfToilets( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -598,7 +588,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetListOfElevators. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getListOfElevators( + internal func getListOfElevators( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -616,7 +606,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetMoreInformation. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getMoreInformation( + internal func getMoreInformation( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -634,7 +624,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetOpeningTimes. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getOpeningTimes( + internal func getOpeningTimes( _ request: Api_GetOpeningTimesRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -652,7 +642,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetUpdateNote. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getUpdateNote( + internal func getUpdateNote( _ request: Api_GetUpdateNoteRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -670,7 +660,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetStudyRoomList. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getStudyRoomList( + internal func getStudyRoomList( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -688,7 +678,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetEventList. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getEventList( + internal func getEventList( _ request: Api_GetEventListRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -706,7 +696,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetKino. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getKino( + internal func getKino( _ request: Api_GetKinoRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -724,7 +714,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to SendFeedback. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func sendFeedback( + internal func sendFeedback( _ request: Api_SendFeedbackRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -742,7 +732,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to SendFeedbackImage. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func sendFeedbackImage( + internal func sendFeedbackImage( _ request: Api_SendFeedbackImageRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -754,67 +744,13 @@ extension Api_CampusClientProtocol { ) } - /// Unary call to RegisterDevice - /// - /// - Parameters: - /// - request: Request to send to RegisterDevice. - /// - callOptions: Call options. - /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func registerDevice( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? = nil - ) -> UnaryCall { - return self.makeUnaryCall( - path: Api_CampusClientMetadata.Methods.registerDevice.path, - request: request, - callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [] - ) - } - - /// Unary call to VerifyKey - /// - /// - Parameters: - /// - request: Request to send to VerifyKey. - /// - callOptions: Call options. - /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func verifyKey( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? = nil - ) -> UnaryCall { - return self.makeUnaryCall( - path: Api_CampusClientMetadata.Methods.verifyKey.path, - request: request, - callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeVerifyKeyInterceptors() ?? [] - ) - } - - /// Unary call to DeviceUploadGcmToken - /// - /// - Parameters: - /// - request: Request to send to DeviceUploadGcmToken. - /// - callOptions: Call options. - /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func deviceUploadGcmToken( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? = nil - ) -> UnaryCall { - return self.makeUnaryCall( - path: Api_CampusClientMetadata.Methods.deviceUploadGcmToken.path, - request: request, - callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeDeviceUploadGcmTokenInterceptors() ?? [] - ) - } - /// Unary call to GetUploadStatus /// /// - Parameters: /// - request: Request to send to GetUploadStatus. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getUploadStatus( + internal func getUploadStatus( _ request: Api_GetUploadStatusRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -832,7 +768,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetNotification. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getNotification( + internal func getNotification( _ request: Api_NotificationsRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -850,7 +786,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetNotificationConfirm. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getNotificationConfirm( + internal func getNotificationConfirm( _ request: Api_NotificationsRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -868,7 +804,7 @@ extension Api_CampusClientProtocol { /// - request: Request to send to GetMembers. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func getMembers( + internal func getMembers( _ request: Api_GetMembersRequest, callOptions: CallOptions? = nil ) -> UnaryCall { @@ -880,57 +816,75 @@ extension Api_CampusClientProtocol { ) } - /// register your ios device for push notifications + /// Unary call to GetCanteenHeadCount + /// + /// - Parameters: + /// - request: Request to send to GetCanteenHeadCount. + /// - callOptions: Call options. + /// - Returns: A `UnaryCall` with futures for the metadata, status and response. + internal func getCanteenHeadCount( + _ request: Api_GetCanteenHeadCountRequest, + callOptions: CallOptions? = nil + ) -> UnaryCall { + return self.makeUnaryCall( + path: Api_CampusClientMetadata.Methods.getCanteenHeadCount.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeGetCanteenHeadCountInterceptors() ?? [] + ) + } + + /// Endpoint for the iOS app to respond to background notifications requests /// /// - Parameters: - /// - request: Request to send to RegisterIOSDevice. + /// - request: Request to send to IOSDeviceRequestResponse. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func registerIOSDevice( - _ request: Api_RegisterIOSDeviceRequest, + internal func iOSDeviceRequestResponse( + _ request: Api_IOSDeviceRequestResponseRequest, callOptions: CallOptions? = nil - ) -> UnaryCall { + ) -> UnaryCall { return self.makeUnaryCall( - path: Api_CampusClientMetadata.Methods.registerIOSDevice.path, + path: Api_CampusClientMetadata.Methods.iOSDeviceRequestResponse.path, request: request, callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeRegisterIOSDeviceInterceptors() ?? [] + interceptors: self.interceptors?.makeIOSDeviceRequestResponseInterceptors() ?? [] ) } - /// remove your ios device from the db and unregister it from push notifications + /// Register an Android, iOS or Windows device for push notifications /// /// - Parameters: - /// - request: Request to send to RemoveIOSDevice. + /// - request: Request to send to RegisterDevice. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func removeIOSDevice( - _ request: Api_RemoveIOSDeviceRequest, + internal func registerDevice( + _ request: Api_RegisterDeviceRequest, callOptions: CallOptions? = nil - ) -> UnaryCall { + ) -> UnaryCall { return self.makeUnaryCall( - path: Api_CampusClientMetadata.Methods.removeIOSDevice.path, + path: Api_CampusClientMetadata.Methods.registerDevice.path, request: request, callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeRemoveIOSDeviceInterceptors() ?? [] + interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [] ) } - /// add ios device usage log to calculate notification priority + /// Unregister it from push notifications /// /// - Parameters: - /// - request: Request to send to AddIOSDeviceUsage. + /// - request: Request to send to RemoveDevice. /// - callOptions: Call options. /// - Returns: A `UnaryCall` with futures for the metadata, status and response. - public func addIOSDeviceUsage( - _ request: Api_AddIOSDeviceUsageRequest, + internal func removeDevice( + _ request: Api_RemoveDeviceRequest, callOptions: CallOptions? = nil - ) -> UnaryCall { + ) -> UnaryCall { return self.makeUnaryCall( - path: Api_CampusClientMetadata.Methods.addIOSDeviceUsage.path, + path: Api_CampusClientMetadata.Methods.removeDevice.path, request: request, callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeAddIOSDeviceUsageInterceptors() ?? [] + interceptors: self.interceptors?.makeRemoveDeviceInterceptors() ?? [] ) } } @@ -941,16 +895,16 @@ extension Api_CampusClient: @unchecked Sendable {} #endif // compiler(>=5.6) @available(*, deprecated, renamed: "Api_CampusNIOClient") -public final class Api_CampusClient: Api_CampusClientProtocol { +internal final class Api_CampusClient: Api_CampusClientProtocol { private let lock = Lock() private var _defaultCallOptions: CallOptions private var _interceptors: Api_CampusClientInterceptorFactoryProtocol? - public let channel: GRPCChannel - public var defaultCallOptions: CallOptions { + internal let channel: GRPCChannel + internal var defaultCallOptions: CallOptions { get { self.lock.withLock { return self._defaultCallOptions } } set { self.lock.withLockVoid { self._defaultCallOptions = newValue } } } - public var interceptors: Api_CampusClientInterceptorFactoryProtocol? { + internal var interceptors: Api_CampusClientInterceptorFactoryProtocol? { get { self.lock.withLock { return self._interceptors } } set { self.lock.withLockVoid { self._interceptors = newValue } } } @@ -961,7 +915,7 @@ public final class Api_CampusClient: Api_CampusClientProtocol { /// - channel: `GRPCChannel` to the service host. /// - defaultCallOptions: Options to use for each service call if the user doesn't provide them. /// - interceptors: A factory providing interceptors for each RPC. - public init( + internal init( channel: GRPCChannel, defaultCallOptions: CallOptions = CallOptions(), interceptors: Api_CampusClientInterceptorFactoryProtocol? = nil @@ -972,10 +926,10 @@ public final class Api_CampusClient: Api_CampusClientProtocol { } } -public struct Api_CampusNIOClient: Api_CampusClientProtocol { - public var channel: GRPCChannel - public var defaultCallOptions: CallOptions - public var interceptors: Api_CampusClientInterceptorFactoryProtocol? +internal struct Api_CampusNIOClient: Api_CampusClientProtocol { + internal var channel: GRPCChannel + internal var defaultCallOptions: CallOptions + internal var interceptors: Api_CampusClientInterceptorFactoryProtocol? /// Creates a client for the api.Campus service. /// @@ -983,7 +937,7 @@ public struct Api_CampusNIOClient: Api_CampusClientProtocol { /// - channel: `GRPCChannel` to the service host. /// - defaultCallOptions: Options to use for each service call if the user doesn't provide them. /// - interceptors: A factory providing interceptors for each RPC. - public init( + internal init( channel: GRPCChannel, defaultCallOptions: CallOptions = CallOptions(), interceptors: Api_CampusClientInterceptorFactoryProtocol? = nil @@ -996,7 +950,7 @@ public struct Api_CampusNIOClient: Api_CampusClientProtocol { #if compiler(>=5.6) @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) -public protocol Api_CampusAsyncClientProtocol: GRPCClient { +internal protocol Api_CampusAsyncClientProtocol: GRPCClient { static var serviceDescriptor: GRPCServiceDescriptor { get } var interceptors: Api_CampusClientInterceptorFactoryProtocol? { get } @@ -1145,21 +1099,6 @@ public protocol Api_CampusAsyncClientProtocol: GRPCClient { callOptions: CallOptions? ) -> GRPCAsyncUnaryCall - func makeRegisterDeviceCall( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? - ) -> GRPCAsyncUnaryCall - - func makeVerifyKeyCall( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? - ) -> GRPCAsyncUnaryCall - - func makeDeviceUploadGcmTokenCall( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? - ) -> GRPCAsyncUnaryCall - func makeGetUploadStatusCall( _ request: Api_GetUploadStatusRequest, callOptions: CallOptions? @@ -1180,33 +1119,38 @@ public protocol Api_CampusAsyncClientProtocol: GRPCClient { callOptions: CallOptions? ) -> GRPCAsyncUnaryCall - func makeRegisterIosdeviceCall( - _ request: Api_RegisterIOSDeviceRequest, + func makeGetCanteenHeadCountCall( + _ request: Api_GetCanteenHeadCountRequest, callOptions: CallOptions? - ) -> GRPCAsyncUnaryCall + ) -> GRPCAsyncUnaryCall - func makeRemoveIosdeviceCall( - _ request: Api_RemoveIOSDeviceRequest, + func makeIosdeviceRequestResponseCall( + _ request: Api_IOSDeviceRequestResponseRequest, callOptions: CallOptions? - ) -> GRPCAsyncUnaryCall + ) -> GRPCAsyncUnaryCall - func makeAddIosdeviceUsageCall( - _ request: Api_AddIOSDeviceUsageRequest, + func makeRegisterDeviceCall( + _ request: Api_RegisterDeviceRequest, + callOptions: CallOptions? + ) -> GRPCAsyncUnaryCall + + func makeRemoveDeviceCall( + _ request: Api_RemoveDeviceRequest, callOptions: CallOptions? - ) -> GRPCAsyncUnaryCall + ) -> GRPCAsyncUnaryCall } @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) extension Api_CampusAsyncClientProtocol { - public static var serviceDescriptor: GRPCServiceDescriptor { + internal static var serviceDescriptor: GRPCServiceDescriptor { return Api_CampusClientMetadata.serviceDescriptor } - public var interceptors: Api_CampusClientInterceptorFactoryProtocol? { + internal var interceptors: Api_CampusClientInterceptorFactoryProtocol? { return nil } - public func makeGetTopNewsCall( + internal func makeGetTopNewsCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1218,7 +1162,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetNewsSourcesCall( + internal func makeGetNewsSourcesCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1230,7 +1174,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeSearchRoomsCall( + internal func makeSearchRoomsCall( _ request: Api_SearchRoomsRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1242,7 +1186,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetLocationsCall( + internal func makeGetLocationsCall( _ request: Api_GetLocationsRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1254,7 +1198,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetRoomMapsCall( + internal func makeGetRoomMapsCall( _ request: Api_GetRoomMapsRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1266,7 +1210,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetRoomCoordinatesCall( + internal func makeGetRoomCoordinatesCall( _ request: Api_GetRoomCoordinatesRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1278,7 +1222,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetRoomScheduleCall( + internal func makeGetRoomScheduleCall( _ request: Api_GetRoomScheduleRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1290,7 +1234,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetCafeteriaRatingsCall( + internal func makeGetCafeteriaRatingsCall( _ request: Api_CafeteriaRatingRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1302,7 +1246,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetDishRatingsCall( + internal func makeGetDishRatingsCall( _ request: Api_DishRatingRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1314,7 +1258,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeNewCafeteriaRatingCall( + internal func makeNewCafeteriaRatingCall( _ request: Api_NewCafeteriaRatingRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1326,7 +1270,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeNewDishRatingCall( + internal func makeNewDishRatingCall( _ request: Api_NewDishRatingRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1338,7 +1282,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetAvailableDishTagsCall( + internal func makeGetAvailableDishTagsCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1350,7 +1294,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetNameTagsCall( + internal func makeGetNameTagsCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1362,7 +1306,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetAvailableCafeteriaTagsCall( + internal func makeGetAvailableCafeteriaTagsCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1374,7 +1318,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetCafeteriasCall( + internal func makeGetCafeteriasCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1386,7 +1330,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetDishesCall( + internal func makeGetDishesCall( _ request: Api_GetDishesRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1398,7 +1342,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetResponsiblePersonCall( + internal func makeGetResponsiblePersonCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1410,7 +1354,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetBuilding2GpsCall( + internal func makeGetBuilding2GpsCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1422,7 +1366,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetAreaFacilitiesByBuildingNrCall( + internal func makeGetAreaFacilitiesByBuildingNrCall( _ request: Api_GetAreaFacilitiesByBuildingNrRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1434,7 +1378,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetListOfToiletsCall( + internal func makeGetListOfToiletsCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1446,7 +1390,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetListOfElevatorsCall( + internal func makeGetListOfElevatorsCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1458,7 +1402,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetMoreInformationCall( + internal func makeGetMoreInformationCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1470,7 +1414,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetOpeningTimesCall( + internal func makeGetOpeningTimesCall( _ request: Api_GetOpeningTimesRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1482,7 +1426,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetUpdateNoteCall( + internal func makeGetUpdateNoteCall( _ request: Api_GetUpdateNoteRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1494,7 +1438,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetStudyRoomListCall( + internal func makeGetStudyRoomListCall( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1506,7 +1450,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetEventListCall( + internal func makeGetEventListCall( _ request: Api_GetEventListRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1518,7 +1462,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetKinoCall( + internal func makeGetKinoCall( _ request: Api_GetKinoRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1530,7 +1474,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeSendFeedbackCall( + internal func makeSendFeedbackCall( _ request: Api_SendFeedbackRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1542,7 +1486,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeSendFeedbackImageCall( + internal func makeSendFeedbackImageCall( _ request: Api_SendFeedbackImageRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1554,43 +1498,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeRegisterDeviceCall( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? = nil - ) -> GRPCAsyncUnaryCall { - return self.makeAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.registerDevice.path, - request: request, - callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [] - ) - } - - public func makeVerifyKeyCall( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? = nil - ) -> GRPCAsyncUnaryCall { - return self.makeAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.verifyKey.path, - request: request, - callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeVerifyKeyInterceptors() ?? [] - ) - } - - public func makeDeviceUploadGcmTokenCall( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? = nil - ) -> GRPCAsyncUnaryCall { - return self.makeAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.deviceUploadGcmToken.path, - request: request, - callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeDeviceUploadGcmTokenInterceptors() ?? [] - ) - } - - public func makeGetUploadStatusCall( + internal func makeGetUploadStatusCall( _ request: Api_GetUploadStatusRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1602,7 +1510,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetNotificationCall( + internal func makeGetNotificationCall( _ request: Api_NotificationsRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1614,7 +1522,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetNotificationConfirmCall( + internal func makeGetNotificationConfirmCall( _ request: Api_NotificationsRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1626,7 +1534,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeGetMembersCall( + internal func makeGetMembersCall( _ request: Api_GetMembersRequest, callOptions: CallOptions? = nil ) -> GRPCAsyncUnaryCall { @@ -1638,46 +1546,58 @@ extension Api_CampusAsyncClientProtocol { ) } - public func makeRegisterIosdeviceCall( - _ request: Api_RegisterIOSDeviceRequest, + internal func makeGetCanteenHeadCountCall( + _ request: Api_GetCanteenHeadCountRequest, callOptions: CallOptions? = nil - ) -> GRPCAsyncUnaryCall { + ) -> GRPCAsyncUnaryCall { return self.makeAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.registerIOSDevice.path, + path: Api_CampusClientMetadata.Methods.getCanteenHeadCount.path, request: request, callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeRegisterIOSDeviceInterceptors() ?? [] + interceptors: self.interceptors?.makeGetCanteenHeadCountInterceptors() ?? [] ) } - public func makeRemoveIosdeviceCall( - _ request: Api_RemoveIOSDeviceRequest, + internal func makeIosdeviceRequestResponseCall( + _ request: Api_IOSDeviceRequestResponseRequest, callOptions: CallOptions? = nil - ) -> GRPCAsyncUnaryCall { + ) -> GRPCAsyncUnaryCall { return self.makeAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.removeIOSDevice.path, + path: Api_CampusClientMetadata.Methods.iOSDeviceRequestResponse.path, request: request, callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeRemoveIOSDeviceInterceptors() ?? [] + interceptors: self.interceptors?.makeIOSDeviceRequestResponseInterceptors() ?? [] ) } - public func makeAddIosdeviceUsageCall( - _ request: Api_AddIOSDeviceUsageRequest, + internal func makeRegisterDeviceCall( + _ request: Api_RegisterDeviceRequest, callOptions: CallOptions? = nil - ) -> GRPCAsyncUnaryCall { + ) -> GRPCAsyncUnaryCall { return self.makeAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.addIOSDeviceUsage.path, + path: Api_CampusClientMetadata.Methods.registerDevice.path, request: request, callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeAddIOSDeviceUsageInterceptors() ?? [] + interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [] + ) + } + + internal func makeRemoveDeviceCall( + _ request: Api_RemoveDeviceRequest, + callOptions: CallOptions? = nil + ) -> GRPCAsyncUnaryCall { + return self.makeAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.removeDevice.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeRemoveDeviceInterceptors() ?? [] ) } } @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) extension Api_CampusAsyncClientProtocol { - public func getTopNews( + internal func getTopNews( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_GetTopNewsReply { @@ -1689,7 +1609,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getNewsSources( + internal func getNewsSources( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_NewsSourceArray { @@ -1701,7 +1621,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func searchRooms( + internal func searchRooms( _ request: Api_SearchRoomsRequest, callOptions: CallOptions? = nil ) async throws -> Api_SearchRoomsReply { @@ -1713,7 +1633,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getLocations( + internal func getLocations( _ request: Api_GetLocationsRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetLocationsReply { @@ -1725,7 +1645,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getRoomMaps( + internal func getRoomMaps( _ request: Api_GetRoomMapsRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetRoomMapsReply { @@ -1737,7 +1657,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getRoomCoordinates( + internal func getRoomCoordinates( _ request: Api_GetRoomCoordinatesRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetRoomCoordinatesReply { @@ -1749,7 +1669,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getRoomSchedule( + internal func getRoomSchedule( _ request: Api_GetRoomScheduleRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetRoomScheduleReply { @@ -1761,7 +1681,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getCafeteriaRatings( + internal func getCafeteriaRatings( _ request: Api_CafeteriaRatingRequest, callOptions: CallOptions? = nil ) async throws -> Api_CafeteriaRatingReply { @@ -1773,7 +1693,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getDishRatings( + internal func getDishRatings( _ request: Api_DishRatingRequest, callOptions: CallOptions? = nil ) async throws -> Api_DishRatingReply { @@ -1785,7 +1705,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func newCafeteriaRating( + internal func newCafeteriaRating( _ request: Api_NewCafeteriaRatingRequest, callOptions: CallOptions? = nil ) async throws -> SwiftProtobuf.Google_Protobuf_Empty { @@ -1797,7 +1717,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func newDishRating( + internal func newDishRating( _ request: Api_NewDishRatingRequest, callOptions: CallOptions? = nil ) async throws -> SwiftProtobuf.Google_Protobuf_Empty { @@ -1809,7 +1729,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getAvailableDishTags( + internal func getAvailableDishTags( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_GetTagsReply { @@ -1821,7 +1741,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getNameTags( + internal func getNameTags( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_GetTagsReply { @@ -1833,7 +1753,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getAvailableCafeteriaTags( + internal func getAvailableCafeteriaTags( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_GetTagsReply { @@ -1845,7 +1765,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getCafeterias( + internal func getCafeterias( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_GetCafeteriaReply { @@ -1857,7 +1777,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getDishes( + internal func getDishes( _ request: Api_GetDishesRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetDishesReply { @@ -1869,7 +1789,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getResponsiblePerson( + internal func getResponsiblePerson( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_GetResponsiblePersonReply { @@ -1881,7 +1801,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getBuilding2Gps( + internal func getBuilding2Gps( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_GetBuilding2GpsReply { @@ -1893,7 +1813,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getAreaFacilitiesByBuildingNr( + internal func getAreaFacilitiesByBuildingNr( _ request: Api_GetAreaFacilitiesByBuildingNrRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetAreaFacilitiesByBuildingNrReply { @@ -1905,7 +1825,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getListOfToilets( + internal func getListOfToilets( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_GetListOfToiletsReply { @@ -1917,7 +1837,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getListOfElevators( + internal func getListOfElevators( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_GetListOfElevatorsReply { @@ -1929,7 +1849,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getMoreInformation( + internal func getMoreInformation( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_GetMoreInformationReply { @@ -1941,7 +1861,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getOpeningTimes( + internal func getOpeningTimes( _ request: Api_GetOpeningTimesRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetOpeningTimesReply { @@ -1953,7 +1873,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getUpdateNote( + internal func getUpdateNote( _ request: Api_GetUpdateNoteRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetUpdateNoteReply { @@ -1965,7 +1885,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getStudyRoomList( + internal func getStudyRoomList( _ request: SwiftProtobuf.Google_Protobuf_Empty, callOptions: CallOptions? = nil ) async throws -> Api_GetStudyRoomListReply { @@ -1977,7 +1897,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getEventList( + internal func getEventList( _ request: Api_GetEventListRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetEventListReply { @@ -1989,7 +1909,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getKino( + internal func getKino( _ request: Api_GetKinoRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetKinoReply { @@ -2001,7 +1921,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func sendFeedback( + internal func sendFeedback( _ request: Api_SendFeedbackRequest, callOptions: CallOptions? = nil ) async throws -> Api_SendFeedbackImageReply { @@ -2013,7 +1933,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func sendFeedbackImage( + internal func sendFeedbackImage( _ request: Api_SendFeedbackImageRequest, callOptions: CallOptions? = nil ) async throws -> Api_SendFeedbackImageReply { @@ -2025,43 +1945,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func registerDevice( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? = nil - ) async throws -> Api_TUMCabeStatus { - return try await self.performAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.registerDevice.path, - request: request, - callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [] - ) - } - - public func verifyKey( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? = nil - ) async throws -> Api_TUMCabeStatus { - return try await self.performAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.verifyKey.path, - request: request, - callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeVerifyKeyInterceptors() ?? [] - ) - } - - public func deviceUploadGcmToken( - _ request: SwiftProtobuf.Google_Protobuf_Empty, - callOptions: CallOptions? = nil - ) async throws -> Api_TUMCabeStatus { - return try await self.performAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.deviceUploadGcmToken.path, - request: request, - callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeDeviceUploadGcmTokenInterceptors() ?? [] - ) - } - - public func getUploadStatus( + internal func getUploadStatus( _ request: Api_GetUploadStatusRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetUploadStatusReply { @@ -2073,7 +1957,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getNotification( + internal func getNotification( _ request: Api_NotificationsRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetNotificationsReply { @@ -2085,7 +1969,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getNotificationConfirm( + internal func getNotificationConfirm( _ request: Api_NotificationsRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetNotificationsConfirmReply { @@ -2097,7 +1981,7 @@ extension Api_CampusAsyncClientProtocol { ) } - public func getMembers( + internal func getMembers( _ request: Api_GetMembersRequest, callOptions: CallOptions? = nil ) async throws -> Api_GetMembersReply { @@ -2109,50 +1993,62 @@ extension Api_CampusAsyncClientProtocol { ) } - public func registerIOSDevice( - _ request: Api_RegisterIOSDeviceRequest, + internal func getCanteenHeadCount( + _ request: Api_GetCanteenHeadCountRequest, callOptions: CallOptions? = nil - ) async throws -> Api_RegisterIOSDeviceReply { + ) async throws -> Api_GetCanteenHeadCountReply { return try await self.performAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.registerIOSDevice.path, + path: Api_CampusClientMetadata.Methods.getCanteenHeadCount.path, request: request, callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeRegisterIOSDeviceInterceptors() ?? [] + interceptors: self.interceptors?.makeGetCanteenHeadCountInterceptors() ?? [] ) } - public func removeIOSDevice( - _ request: Api_RemoveIOSDeviceRequest, + internal func iOSDeviceRequestResponse( + _ request: Api_IOSDeviceRequestResponseRequest, callOptions: CallOptions? = nil - ) async throws -> Api_RemoveIOSDeviceReply { + ) async throws -> Api_IOSDeviceRequestResponseReply { return try await self.performAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.removeIOSDevice.path, + path: Api_CampusClientMetadata.Methods.iOSDeviceRequestResponse.path, request: request, callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeRemoveIOSDeviceInterceptors() ?? [] + interceptors: self.interceptors?.makeIOSDeviceRequestResponseInterceptors() ?? [] ) } - public func addIOSDeviceUsage( - _ request: Api_AddIOSDeviceUsageRequest, + internal func registerDevice( + _ request: Api_RegisterDeviceRequest, callOptions: CallOptions? = nil - ) async throws -> Api_AddIOSDeviceUsageReply { + ) async throws -> Api_RegisterDeviceReply { return try await self.performAsyncUnaryCall( - path: Api_CampusClientMetadata.Methods.addIOSDeviceUsage.path, + path: Api_CampusClientMetadata.Methods.registerDevice.path, request: request, callOptions: callOptions ?? self.defaultCallOptions, - interceptors: self.interceptors?.makeAddIOSDeviceUsageInterceptors() ?? [] + interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [] + ) + } + + internal func removeDevice( + _ request: Api_RemoveDeviceRequest, + callOptions: CallOptions? = nil + ) async throws -> Api_RemoveDeviceReply { + return try await self.performAsyncUnaryCall( + path: Api_CampusClientMetadata.Methods.removeDevice.path, + request: request, + callOptions: callOptions ?? self.defaultCallOptions, + interceptors: self.interceptors?.makeRemoveDeviceInterceptors() ?? [] ) } } @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) -public struct Api_CampusAsyncClient: Api_CampusAsyncClientProtocol { - public var channel: GRPCChannel - public var defaultCallOptions: CallOptions - public var interceptors: Api_CampusClientInterceptorFactoryProtocol? +internal struct Api_CampusAsyncClient: Api_CampusAsyncClientProtocol { + internal var channel: GRPCChannel + internal var defaultCallOptions: CallOptions + internal var interceptors: Api_CampusClientInterceptorFactoryProtocol? - public init( + internal init( channel: GRPCChannel, defaultCallOptions: CallOptions = CallOptions(), interceptors: Api_CampusClientInterceptorFactoryProtocol? = nil @@ -2165,7 +2061,7 @@ public struct Api_CampusAsyncClient: Api_CampusAsyncClientProtocol { #endif // compiler(>=5.6) -public protocol Api_CampusClientInterceptorFactoryProtocol: GRPCSendable { +internal protocol Api_CampusClientInterceptorFactoryProtocol: GRPCSendable { /// - Returns: Interceptors to use when invoking 'getTopNews'. func makeGetTopNewsInterceptors() -> [ClientInterceptor] @@ -2254,15 +2150,6 @@ public protocol Api_CampusClientInterceptorFactoryProtocol: GRPCSendable { /// - Returns: Interceptors to use when invoking 'sendFeedbackImage'. func makeSendFeedbackImageInterceptors() -> [ClientInterceptor] - /// - Returns: Interceptors to use when invoking 'registerDevice'. - func makeRegisterDeviceInterceptors() -> [ClientInterceptor] - - /// - Returns: Interceptors to use when invoking 'verifyKey'. - func makeVerifyKeyInterceptors() -> [ClientInterceptor] - - /// - Returns: Interceptors to use when invoking 'deviceUploadGcmToken'. - func makeDeviceUploadGcmTokenInterceptors() -> [ClientInterceptor] - /// - Returns: Interceptors to use when invoking 'getUploadStatus'. func makeGetUploadStatusInterceptors() -> [ClientInterceptor] @@ -2275,18 +2162,21 @@ public protocol Api_CampusClientInterceptorFactoryProtocol: GRPCSendable { /// - Returns: Interceptors to use when invoking 'getMembers'. func makeGetMembersInterceptors() -> [ClientInterceptor] - /// - Returns: Interceptors to use when invoking 'registerIOSDevice'. - func makeRegisterIOSDeviceInterceptors() -> [ClientInterceptor] + /// - Returns: Interceptors to use when invoking 'getCanteenHeadCount'. + func makeGetCanteenHeadCountInterceptors() -> [ClientInterceptor] - /// - Returns: Interceptors to use when invoking 'removeIOSDevice'. - func makeRemoveIOSDeviceInterceptors() -> [ClientInterceptor] + /// - Returns: Interceptors to use when invoking 'iOSDeviceRequestResponse'. + func makeIOSDeviceRequestResponseInterceptors() -> [ClientInterceptor] - /// - Returns: Interceptors to use when invoking 'addIOSDeviceUsage'. - func makeAddIOSDeviceUsageInterceptors() -> [ClientInterceptor] + /// - Returns: Interceptors to use when invoking 'registerDevice'. + func makeRegisterDeviceInterceptors() -> [ClientInterceptor] + + /// - Returns: Interceptors to use when invoking 'removeDevice'. + func makeRemoveDeviceInterceptors() -> [ClientInterceptor] } -public enum Api_CampusClientMetadata { - public static let serviceDescriptor = GRPCServiceDescriptor( +internal enum Api_CampusClientMetadata { + internal static let serviceDescriptor = GRPCServiceDescriptor( name: "Campus", fullName: "api.Campus", methods: [ @@ -2319,258 +2209,244 @@ public enum Api_CampusClientMetadata { Api_CampusClientMetadata.Methods.getKino, Api_CampusClientMetadata.Methods.sendFeedback, Api_CampusClientMetadata.Methods.sendFeedbackImage, - Api_CampusClientMetadata.Methods.registerDevice, - Api_CampusClientMetadata.Methods.verifyKey, - Api_CampusClientMetadata.Methods.deviceUploadGcmToken, Api_CampusClientMetadata.Methods.getUploadStatus, Api_CampusClientMetadata.Methods.getNotification, Api_CampusClientMetadata.Methods.getNotificationConfirm, Api_CampusClientMetadata.Methods.getMembers, - Api_CampusClientMetadata.Methods.registerIOSDevice, - Api_CampusClientMetadata.Methods.removeIOSDevice, - Api_CampusClientMetadata.Methods.addIOSDeviceUsage, + Api_CampusClientMetadata.Methods.getCanteenHeadCount, + Api_CampusClientMetadata.Methods.iOSDeviceRequestResponse, + Api_CampusClientMetadata.Methods.registerDevice, + Api_CampusClientMetadata.Methods.removeDevice, ] ) - public enum Methods { - public static let getTopNews = GRPCMethodDescriptor( + internal enum Methods { + internal static let getTopNews = GRPCMethodDescriptor( name: "GetTopNews", path: "/api.Campus/GetTopNews", type: GRPCCallType.unary ) - public static let getNewsSources = GRPCMethodDescriptor( + internal static let getNewsSources = GRPCMethodDescriptor( name: "GetNewsSources", path: "/api.Campus/GetNewsSources", type: GRPCCallType.unary ) - public static let searchRooms = GRPCMethodDescriptor( + internal static let searchRooms = GRPCMethodDescriptor( name: "SearchRooms", path: "/api.Campus/SearchRooms", type: GRPCCallType.unary ) - public static let getLocations = GRPCMethodDescriptor( + internal static let getLocations = GRPCMethodDescriptor( name: "GetLocations", path: "/api.Campus/GetLocations", type: GRPCCallType.unary ) - public static let getRoomMaps = GRPCMethodDescriptor( + internal static let getRoomMaps = GRPCMethodDescriptor( name: "GetRoomMaps", path: "/api.Campus/GetRoomMaps", type: GRPCCallType.unary ) - public static let getRoomCoordinates = GRPCMethodDescriptor( + internal static let getRoomCoordinates = GRPCMethodDescriptor( name: "GetRoomCoordinates", path: "/api.Campus/GetRoomCoordinates", type: GRPCCallType.unary ) - public static let getRoomSchedule = GRPCMethodDescriptor( + internal static let getRoomSchedule = GRPCMethodDescriptor( name: "GetRoomSchedule", path: "/api.Campus/GetRoomSchedule", type: GRPCCallType.unary ) - public static let getCafeteriaRatings = GRPCMethodDescriptor( + internal static let getCafeteriaRatings = GRPCMethodDescriptor( name: "GetCafeteriaRatings", path: "/api.Campus/GetCafeteriaRatings", type: GRPCCallType.unary ) - public static let getDishRatings = GRPCMethodDescriptor( + internal static let getDishRatings = GRPCMethodDescriptor( name: "GetDishRatings", path: "/api.Campus/GetDishRatings", type: GRPCCallType.unary ) - public static let newCafeteriaRating = GRPCMethodDescriptor( + internal static let newCafeteriaRating = GRPCMethodDescriptor( name: "NewCafeteriaRating", path: "/api.Campus/NewCafeteriaRating", type: GRPCCallType.unary ) - public static let newDishRating = GRPCMethodDescriptor( + internal static let newDishRating = GRPCMethodDescriptor( name: "NewDishRating", path: "/api.Campus/NewDishRating", type: GRPCCallType.unary ) - public static let getAvailableDishTags = GRPCMethodDescriptor( + internal static let getAvailableDishTags = GRPCMethodDescriptor( name: "GetAvailableDishTags", path: "/api.Campus/GetAvailableDishTags", type: GRPCCallType.unary ) - public static let getNameTags = GRPCMethodDescriptor( + internal static let getNameTags = GRPCMethodDescriptor( name: "GetNameTags", path: "/api.Campus/GetNameTags", type: GRPCCallType.unary ) - public static let getAvailableCafeteriaTags = GRPCMethodDescriptor( + internal static let getAvailableCafeteriaTags = GRPCMethodDescriptor( name: "GetAvailableCafeteriaTags", path: "/api.Campus/GetAvailableCafeteriaTags", type: GRPCCallType.unary ) - public static let getCafeterias = GRPCMethodDescriptor( + internal static let getCafeterias = GRPCMethodDescriptor( name: "GetCafeterias", path: "/api.Campus/GetCafeterias", type: GRPCCallType.unary ) - public static let getDishes = GRPCMethodDescriptor( + internal static let getDishes = GRPCMethodDescriptor( name: "GetDishes", path: "/api.Campus/GetDishes", type: GRPCCallType.unary ) - public static let getResponsiblePerson = GRPCMethodDescriptor( + internal static let getResponsiblePerson = GRPCMethodDescriptor( name: "GetResponsiblePerson", path: "/api.Campus/GetResponsiblePerson", type: GRPCCallType.unary ) - public static let getBuilding2Gps = GRPCMethodDescriptor( + internal static let getBuilding2Gps = GRPCMethodDescriptor( name: "GetBuilding2Gps", path: "/api.Campus/GetBuilding2Gps", type: GRPCCallType.unary ) - public static let getAreaFacilitiesByBuildingNr = GRPCMethodDescriptor( + internal static let getAreaFacilitiesByBuildingNr = GRPCMethodDescriptor( name: "GetAreaFacilitiesByBuildingNr", path: "/api.Campus/GetAreaFacilitiesByBuildingNr", type: GRPCCallType.unary ) - public static let getListOfToilets = GRPCMethodDescriptor( + internal static let getListOfToilets = GRPCMethodDescriptor( name: "GetListOfToilets", path: "/api.Campus/GetListOfToilets", type: GRPCCallType.unary ) - public static let getListOfElevators = GRPCMethodDescriptor( + internal static let getListOfElevators = GRPCMethodDescriptor( name: "GetListOfElevators", path: "/api.Campus/GetListOfElevators", type: GRPCCallType.unary ) - public static let getMoreInformation = GRPCMethodDescriptor( + internal static let getMoreInformation = GRPCMethodDescriptor( name: "GetMoreInformation", path: "/api.Campus/GetMoreInformation", type: GRPCCallType.unary ) - public static let getOpeningTimes = GRPCMethodDescriptor( + internal static let getOpeningTimes = GRPCMethodDescriptor( name: "GetOpeningTimes", path: "/api.Campus/GetOpeningTimes", type: GRPCCallType.unary ) - public static let getUpdateNote = GRPCMethodDescriptor( + internal static let getUpdateNote = GRPCMethodDescriptor( name: "GetUpdateNote", path: "/api.Campus/GetUpdateNote", type: GRPCCallType.unary ) - public static let getStudyRoomList = GRPCMethodDescriptor( + internal static let getStudyRoomList = GRPCMethodDescriptor( name: "GetStudyRoomList", path: "/api.Campus/GetStudyRoomList", type: GRPCCallType.unary ) - public static let getEventList = GRPCMethodDescriptor( + internal static let getEventList = GRPCMethodDescriptor( name: "GetEventList", path: "/api.Campus/GetEventList", type: GRPCCallType.unary ) - public static let getKino = GRPCMethodDescriptor( + internal static let getKino = GRPCMethodDescriptor( name: "GetKino", path: "/api.Campus/GetKino", type: GRPCCallType.unary ) - public static let sendFeedback = GRPCMethodDescriptor( + internal static let sendFeedback = GRPCMethodDescriptor( name: "SendFeedback", path: "/api.Campus/SendFeedback", type: GRPCCallType.unary ) - public static let sendFeedbackImage = GRPCMethodDescriptor( + internal static let sendFeedbackImage = GRPCMethodDescriptor( name: "SendFeedbackImage", path: "/api.Campus/SendFeedbackImage", type: GRPCCallType.unary ) - public static let registerDevice = GRPCMethodDescriptor( - name: "RegisterDevice", - path: "/api.Campus/RegisterDevice", - type: GRPCCallType.unary - ) - - public static let verifyKey = GRPCMethodDescriptor( - name: "VerifyKey", - path: "/api.Campus/VerifyKey", - type: GRPCCallType.unary - ) - - public static let deviceUploadGcmToken = GRPCMethodDescriptor( - name: "DeviceUploadGcmToken", - path: "/api.Campus/DeviceUploadGcmToken", - type: GRPCCallType.unary - ) - - public static let getUploadStatus = GRPCMethodDescriptor( + internal static let getUploadStatus = GRPCMethodDescriptor( name: "GetUploadStatus", path: "/api.Campus/GetUploadStatus", type: GRPCCallType.unary ) - public static let getNotification = GRPCMethodDescriptor( + internal static let getNotification = GRPCMethodDescriptor( name: "GetNotification", path: "/api.Campus/GetNotification", type: GRPCCallType.unary ) - public static let getNotificationConfirm = GRPCMethodDescriptor( + internal static let getNotificationConfirm = GRPCMethodDescriptor( name: "GetNotificationConfirm", path: "/api.Campus/GetNotificationConfirm", type: GRPCCallType.unary ) - public static let getMembers = GRPCMethodDescriptor( + internal static let getMembers = GRPCMethodDescriptor( name: "GetMembers", path: "/api.Campus/GetMembers", type: GRPCCallType.unary ) - public static let registerIOSDevice = GRPCMethodDescriptor( - name: "RegisterIOSDevice", - path: "/api.Campus/RegisterIOSDevice", + internal static let getCanteenHeadCount = GRPCMethodDescriptor( + name: "GetCanteenHeadCount", + path: "/api.Campus/GetCanteenHeadCount", type: GRPCCallType.unary ) - public static let removeIOSDevice = GRPCMethodDescriptor( - name: "RemoveIOSDevice", - path: "/api.Campus/RemoveIOSDevice", + internal static let iOSDeviceRequestResponse = GRPCMethodDescriptor( + name: "IOSDeviceRequestResponse", + path: "/api.Campus/IOSDeviceRequestResponse", type: GRPCCallType.unary ) - public static let addIOSDeviceUsage = GRPCMethodDescriptor( - name: "AddIOSDeviceUsage", - path: "/api.Campus/AddIOSDeviceUsage", + internal static let registerDevice = GRPCMethodDescriptor( + name: "RegisterDevice", + path: "/api.Campus/RegisterDevice", + type: GRPCCallType.unary + ) + + internal static let removeDevice = GRPCMethodDescriptor( + name: "RemoveDevice", + path: "/api.Campus/RemoveDevice", type: GRPCCallType.unary ) } } /// To build a server, implement a class that conforms to this protocol. -public protocol Api_CampusProvider: CallHandlerProvider { +internal protocol Api_CampusProvider: CallHandlerProvider { var interceptors: Api_CampusServerInterceptorFactoryProtocol? { get } func getTopNews(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture @@ -2633,12 +2509,6 @@ public protocol Api_CampusProvider: CallHandlerProvider { func sendFeedbackImage(request: Api_SendFeedbackImageRequest, context: StatusOnlyCallContext) -> EventLoopFuture - func registerDevice(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture - - func verifyKey(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture - - func deviceUploadGcmToken(request: SwiftProtobuf.Google_Protobuf_Empty, context: StatusOnlyCallContext) -> EventLoopFuture - func getUploadStatus(request: Api_GetUploadStatusRequest, context: StatusOnlyCallContext) -> EventLoopFuture func getNotification(request: Api_NotificationsRequest, context: StatusOnlyCallContext) -> EventLoopFuture @@ -2647,24 +2517,26 @@ public protocol Api_CampusProvider: CallHandlerProvider { func getMembers(request: Api_GetMembersRequest, context: StatusOnlyCallContext) -> EventLoopFuture - /// register your ios device for push notifications - func registerIOSDevice(request: Api_RegisterIOSDeviceRequest, context: StatusOnlyCallContext) -> EventLoopFuture + func getCanteenHeadCount(request: Api_GetCanteenHeadCountRequest, context: StatusOnlyCallContext) -> EventLoopFuture + + /// Endpoint for the iOS app to respond to background notifications requests + func iOSDeviceRequestResponse(request: Api_IOSDeviceRequestResponseRequest, context: StatusOnlyCallContext) -> EventLoopFuture - /// remove your ios device from the db and unregister it from push notifications - func removeIOSDevice(request: Api_RemoveIOSDeviceRequest, context: StatusOnlyCallContext) -> EventLoopFuture + /// Register an Android, iOS or Windows device for push notifications + func registerDevice(request: Api_RegisterDeviceRequest, context: StatusOnlyCallContext) -> EventLoopFuture - /// add ios device usage log to calculate notification priority - func addIOSDeviceUsage(request: Api_AddIOSDeviceUsageRequest, context: StatusOnlyCallContext) -> EventLoopFuture + /// Unregister it from push notifications + func removeDevice(request: Api_RemoveDeviceRequest, context: StatusOnlyCallContext) -> EventLoopFuture } extension Api_CampusProvider { - public var serviceName: Substring { + internal var serviceName: Substring { return Api_CampusServerMetadata.serviceDescriptor.fullName[...] } /// Determines, calls and returns the appropriate request handler, depending on the request's method. /// Returns nil for methods not handled by this service. - public func handle( + internal func handle( method name: Substring, context: CallHandlerContext ) -> GRPCServerHandlerProtocol? { @@ -2930,33 +2802,6 @@ extension Api_CampusProvider { userFunction: self.sendFeedbackImage(request:context:) ) - case "RegisterDevice": - return UnaryServerHandler( - context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [], - userFunction: self.registerDevice(request:context:) - ) - - case "VerifyKey": - return UnaryServerHandler( - context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeVerifyKeyInterceptors() ?? [], - userFunction: self.verifyKey(request:context:) - ) - - case "DeviceUploadGcmToken": - return UnaryServerHandler( - context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeDeviceUploadGcmTokenInterceptors() ?? [], - userFunction: self.deviceUploadGcmToken(request:context:) - ) - case "GetUploadStatus": return UnaryServerHandler( context: context, @@ -2993,31 +2838,40 @@ extension Api_CampusProvider { userFunction: self.getMembers(request:context:) ) - case "RegisterIOSDevice": + case "GetCanteenHeadCount": + return UnaryServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetCanteenHeadCountInterceptors() ?? [], + userFunction: self.getCanteenHeadCount(request:context:) + ) + + case "IOSDeviceRequestResponse": return UnaryServerHandler( context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeRegisterIOSDeviceInterceptors() ?? [], - userFunction: self.registerIOSDevice(request:context:) + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeIOSDeviceRequestResponseInterceptors() ?? [], + userFunction: self.iOSDeviceRequestResponse(request:context:) ) - case "RemoveIOSDevice": + case "RegisterDevice": return UnaryServerHandler( context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeRemoveIOSDeviceInterceptors() ?? [], - userFunction: self.removeIOSDevice(request:context:) + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [], + userFunction: self.registerDevice(request:context:) ) - case "AddIOSDeviceUsage": + case "RemoveDevice": return UnaryServerHandler( context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeAddIOSDeviceUsageInterceptors() ?? [], - userFunction: self.addIOSDeviceUsage(request:context:) + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeRemoveDeviceInterceptors() ?? [], + userFunction: self.removeDevice(request:context:) ) default: @@ -3030,7 +2884,7 @@ extension Api_CampusProvider { /// To implement a server, implement an object which conforms to this protocol. @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) -public protocol Api_CampusAsyncProvider: CallHandlerProvider { +internal protocol Api_CampusAsyncProvider: CallHandlerProvider { static var serviceDescriptor: GRPCServiceDescriptor { get } var interceptors: Api_CampusServerInterceptorFactoryProtocol? { get } @@ -3181,21 +3035,6 @@ public protocol Api_CampusAsyncProvider: CallHandlerProvider { context: GRPCAsyncServerCallContext ) async throws -> Api_SendFeedbackImageReply - @Sendable func registerDevice( - request: SwiftProtobuf.Google_Protobuf_Empty, - context: GRPCAsyncServerCallContext - ) async throws -> Api_TUMCabeStatus - - @Sendable func verifyKey( - request: SwiftProtobuf.Google_Protobuf_Empty, - context: GRPCAsyncServerCallContext - ) async throws -> Api_TUMCabeStatus - - @Sendable func deviceUploadGcmToken( - request: SwiftProtobuf.Google_Protobuf_Empty, - context: GRPCAsyncServerCallContext - ) async throws -> Api_TUMCabeStatus - @Sendable func getUploadStatus( request: Api_GetUploadStatusRequest, context: GRPCAsyncServerCallContext @@ -3216,40 +3055,45 @@ public protocol Api_CampusAsyncProvider: CallHandlerProvider { context: GRPCAsyncServerCallContext ) async throws -> Api_GetMembersReply - /// register your ios device for push notifications - @Sendable func registerIOSDevice( - request: Api_RegisterIOSDeviceRequest, + @Sendable func getCanteenHeadCount( + request: Api_GetCanteenHeadCountRequest, + context: GRPCAsyncServerCallContext + ) async throws -> Api_GetCanteenHeadCountReply + + /// Endpoint for the iOS app to respond to background notifications requests + @Sendable func iOSDeviceRequestResponse( + request: Api_IOSDeviceRequestResponseRequest, context: GRPCAsyncServerCallContext - ) async throws -> Api_RegisterIOSDeviceReply + ) async throws -> Api_IOSDeviceRequestResponseReply - /// remove your ios device from the db and unregister it from push notifications - @Sendable func removeIOSDevice( - request: Api_RemoveIOSDeviceRequest, + /// Register an Android, iOS or Windows device for push notifications + @Sendable func registerDevice( + request: Api_RegisterDeviceRequest, context: GRPCAsyncServerCallContext - ) async throws -> Api_RemoveIOSDeviceReply + ) async throws -> Api_RegisterDeviceReply - /// add ios device usage log to calculate notification priority - @Sendable func addIOSDeviceUsage( - request: Api_AddIOSDeviceUsageRequest, + /// Unregister it from push notifications + @Sendable func removeDevice( + request: Api_RemoveDeviceRequest, context: GRPCAsyncServerCallContext - ) async throws -> Api_AddIOSDeviceUsageReply + ) async throws -> Api_RemoveDeviceReply } @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) extension Api_CampusAsyncProvider { - public static var serviceDescriptor: GRPCServiceDescriptor { + internal static var serviceDescriptor: GRPCServiceDescriptor { return Api_CampusServerMetadata.serviceDescriptor } - public var serviceName: Substring { + internal var serviceName: Substring { return Api_CampusServerMetadata.serviceDescriptor.fullName[...] } - public var interceptors: Api_CampusServerInterceptorFactoryProtocol? { + internal var interceptors: Api_CampusServerInterceptorFactoryProtocol? { return nil } - public func handle( + internal func handle( method name: Substring, context: CallHandlerContext ) -> GRPCServerHandlerProtocol? { @@ -3515,33 +3359,6 @@ extension Api_CampusAsyncProvider { wrapping: self.sendFeedbackImage(request:context:) ) - case "RegisterDevice": - return GRPCAsyncServerHandler( - context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [], - wrapping: self.registerDevice(request:context:) - ) - - case "VerifyKey": - return GRPCAsyncServerHandler( - context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeVerifyKeyInterceptors() ?? [], - wrapping: self.verifyKey(request:context:) - ) - - case "DeviceUploadGcmToken": - return GRPCAsyncServerHandler( - context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeDeviceUploadGcmTokenInterceptors() ?? [], - wrapping: self.deviceUploadGcmToken(request:context:) - ) - case "GetUploadStatus": return GRPCAsyncServerHandler( context: context, @@ -3578,31 +3395,40 @@ extension Api_CampusAsyncProvider { wrapping: self.getMembers(request:context:) ) - case "RegisterIOSDevice": + case "GetCanteenHeadCount": return GRPCAsyncServerHandler( context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeRegisterIOSDeviceInterceptors() ?? [], - wrapping: self.registerIOSDevice(request:context:) + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeGetCanteenHeadCountInterceptors() ?? [], + wrapping: self.getCanteenHeadCount(request:context:) ) - case "RemoveIOSDevice": + case "IOSDeviceRequestResponse": return GRPCAsyncServerHandler( context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeRemoveIOSDeviceInterceptors() ?? [], - wrapping: self.removeIOSDevice(request:context:) + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeIOSDeviceRequestResponseInterceptors() ?? [], + wrapping: self.iOSDeviceRequestResponse(request:context:) ) - case "AddIOSDeviceUsage": + case "RegisterDevice": return GRPCAsyncServerHandler( context: context, - requestDeserializer: ProtobufDeserializer(), - responseSerializer: ProtobufSerializer(), - interceptors: self.interceptors?.makeAddIOSDeviceUsageInterceptors() ?? [], - wrapping: self.addIOSDeviceUsage(request:context:) + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeRegisterDeviceInterceptors() ?? [], + wrapping: self.registerDevice(request:context:) + ) + + case "RemoveDevice": + return GRPCAsyncServerHandler( + context: context, + requestDeserializer: ProtobufDeserializer(), + responseSerializer: ProtobufSerializer(), + interceptors: self.interceptors?.makeRemoveDeviceInterceptors() ?? [], + wrapping: self.removeDevice(request:context:) ) default: @@ -3613,7 +3439,7 @@ extension Api_CampusAsyncProvider { #endif // compiler(>=5.6) -public protocol Api_CampusServerInterceptorFactoryProtocol { +internal protocol Api_CampusServerInterceptorFactoryProtocol { /// - Returns: Interceptors to use when handling 'getTopNews'. /// Defaults to calling `self.makeInterceptors()`. @@ -3731,18 +3557,6 @@ public protocol Api_CampusServerInterceptorFactoryProtocol { /// Defaults to calling `self.makeInterceptors()`. func makeSendFeedbackImageInterceptors() -> [ServerInterceptor] - /// - Returns: Interceptors to use when handling 'registerDevice'. - /// Defaults to calling `self.makeInterceptors()`. - func makeRegisterDeviceInterceptors() -> [ServerInterceptor] - - /// - Returns: Interceptors to use when handling 'verifyKey'. - /// Defaults to calling `self.makeInterceptors()`. - func makeVerifyKeyInterceptors() -> [ServerInterceptor] - - /// - Returns: Interceptors to use when handling 'deviceUploadGcmToken'. - /// Defaults to calling `self.makeInterceptors()`. - func makeDeviceUploadGcmTokenInterceptors() -> [ServerInterceptor] - /// - Returns: Interceptors to use when handling 'getUploadStatus'. /// Defaults to calling `self.makeInterceptors()`. func makeGetUploadStatusInterceptors() -> [ServerInterceptor] @@ -3759,21 +3573,25 @@ public protocol Api_CampusServerInterceptorFactoryProtocol { /// Defaults to calling `self.makeInterceptors()`. func makeGetMembersInterceptors() -> [ServerInterceptor] - /// - Returns: Interceptors to use when handling 'registerIOSDevice'. + /// - Returns: Interceptors to use when handling 'getCanteenHeadCount'. + /// Defaults to calling `self.makeInterceptors()`. + func makeGetCanteenHeadCountInterceptors() -> [ServerInterceptor] + + /// - Returns: Interceptors to use when handling 'iOSDeviceRequestResponse'. /// Defaults to calling `self.makeInterceptors()`. - func makeRegisterIOSDeviceInterceptors() -> [ServerInterceptor] + func makeIOSDeviceRequestResponseInterceptors() -> [ServerInterceptor] - /// - Returns: Interceptors to use when handling 'removeIOSDevice'. + /// - Returns: Interceptors to use when handling 'registerDevice'. /// Defaults to calling `self.makeInterceptors()`. - func makeRemoveIOSDeviceInterceptors() -> [ServerInterceptor] + func makeRegisterDeviceInterceptors() -> [ServerInterceptor] - /// - Returns: Interceptors to use when handling 'addIOSDeviceUsage'. + /// - Returns: Interceptors to use when handling 'removeDevice'. /// Defaults to calling `self.makeInterceptors()`. - func makeAddIOSDeviceUsageInterceptors() -> [ServerInterceptor] + func makeRemoveDeviceInterceptors() -> [ServerInterceptor] } -public enum Api_CampusServerMetadata { - public static let serviceDescriptor = GRPCServiceDescriptor( +internal enum Api_CampusServerMetadata { + internal static let serviceDescriptor = GRPCServiceDescriptor( name: "Campus", fullName: "api.Campus", methods: [ @@ -3806,251 +3624,237 @@ public enum Api_CampusServerMetadata { Api_CampusServerMetadata.Methods.getKino, Api_CampusServerMetadata.Methods.sendFeedback, Api_CampusServerMetadata.Methods.sendFeedbackImage, - Api_CampusServerMetadata.Methods.registerDevice, - Api_CampusServerMetadata.Methods.verifyKey, - Api_CampusServerMetadata.Methods.deviceUploadGcmToken, Api_CampusServerMetadata.Methods.getUploadStatus, Api_CampusServerMetadata.Methods.getNotification, Api_CampusServerMetadata.Methods.getNotificationConfirm, Api_CampusServerMetadata.Methods.getMembers, - Api_CampusServerMetadata.Methods.registerIOSDevice, - Api_CampusServerMetadata.Methods.removeIOSDevice, - Api_CampusServerMetadata.Methods.addIOSDeviceUsage, + Api_CampusServerMetadata.Methods.getCanteenHeadCount, + Api_CampusServerMetadata.Methods.iOSDeviceRequestResponse, + Api_CampusServerMetadata.Methods.registerDevice, + Api_CampusServerMetadata.Methods.removeDevice, ] ) - public enum Methods { - public static let getTopNews = GRPCMethodDescriptor( + internal enum Methods { + internal static let getTopNews = GRPCMethodDescriptor( name: "GetTopNews", path: "/api.Campus/GetTopNews", type: GRPCCallType.unary ) - public static let getNewsSources = GRPCMethodDescriptor( + internal static let getNewsSources = GRPCMethodDescriptor( name: "GetNewsSources", path: "/api.Campus/GetNewsSources", type: GRPCCallType.unary ) - public static let searchRooms = GRPCMethodDescriptor( + internal static let searchRooms = GRPCMethodDescriptor( name: "SearchRooms", path: "/api.Campus/SearchRooms", type: GRPCCallType.unary ) - public static let getLocations = GRPCMethodDescriptor( + internal static let getLocations = GRPCMethodDescriptor( name: "GetLocations", path: "/api.Campus/GetLocations", type: GRPCCallType.unary ) - public static let getRoomMaps = GRPCMethodDescriptor( + internal static let getRoomMaps = GRPCMethodDescriptor( name: "GetRoomMaps", path: "/api.Campus/GetRoomMaps", type: GRPCCallType.unary ) - public static let getRoomCoordinates = GRPCMethodDescriptor( + internal static let getRoomCoordinates = GRPCMethodDescriptor( name: "GetRoomCoordinates", path: "/api.Campus/GetRoomCoordinates", type: GRPCCallType.unary ) - public static let getRoomSchedule = GRPCMethodDescriptor( + internal static let getRoomSchedule = GRPCMethodDescriptor( name: "GetRoomSchedule", path: "/api.Campus/GetRoomSchedule", type: GRPCCallType.unary ) - public static let getCafeteriaRatings = GRPCMethodDescriptor( + internal static let getCafeteriaRatings = GRPCMethodDescriptor( name: "GetCafeteriaRatings", path: "/api.Campus/GetCafeteriaRatings", type: GRPCCallType.unary ) - public static let getDishRatings = GRPCMethodDescriptor( + internal static let getDishRatings = GRPCMethodDescriptor( name: "GetDishRatings", path: "/api.Campus/GetDishRatings", type: GRPCCallType.unary ) - public static let newCafeteriaRating = GRPCMethodDescriptor( + internal static let newCafeteriaRating = GRPCMethodDescriptor( name: "NewCafeteriaRating", path: "/api.Campus/NewCafeteriaRating", type: GRPCCallType.unary ) - public static let newDishRating = GRPCMethodDescriptor( + internal static let newDishRating = GRPCMethodDescriptor( name: "NewDishRating", path: "/api.Campus/NewDishRating", type: GRPCCallType.unary ) - public static let getAvailableDishTags = GRPCMethodDescriptor( + internal static let getAvailableDishTags = GRPCMethodDescriptor( name: "GetAvailableDishTags", path: "/api.Campus/GetAvailableDishTags", type: GRPCCallType.unary ) - public static let getNameTags = GRPCMethodDescriptor( + internal static let getNameTags = GRPCMethodDescriptor( name: "GetNameTags", path: "/api.Campus/GetNameTags", type: GRPCCallType.unary ) - public static let getAvailableCafeteriaTags = GRPCMethodDescriptor( + internal static let getAvailableCafeteriaTags = GRPCMethodDescriptor( name: "GetAvailableCafeteriaTags", path: "/api.Campus/GetAvailableCafeteriaTags", type: GRPCCallType.unary ) - public static let getCafeterias = GRPCMethodDescriptor( + internal static let getCafeterias = GRPCMethodDescriptor( name: "GetCafeterias", path: "/api.Campus/GetCafeterias", type: GRPCCallType.unary ) - public static let getDishes = GRPCMethodDescriptor( + internal static let getDishes = GRPCMethodDescriptor( name: "GetDishes", path: "/api.Campus/GetDishes", type: GRPCCallType.unary ) - public static let getResponsiblePerson = GRPCMethodDescriptor( + internal static let getResponsiblePerson = GRPCMethodDescriptor( name: "GetResponsiblePerson", path: "/api.Campus/GetResponsiblePerson", type: GRPCCallType.unary ) - public static let getBuilding2Gps = GRPCMethodDescriptor( + internal static let getBuilding2Gps = GRPCMethodDescriptor( name: "GetBuilding2Gps", path: "/api.Campus/GetBuilding2Gps", type: GRPCCallType.unary ) - public static let getAreaFacilitiesByBuildingNr = GRPCMethodDescriptor( + internal static let getAreaFacilitiesByBuildingNr = GRPCMethodDescriptor( name: "GetAreaFacilitiesByBuildingNr", path: "/api.Campus/GetAreaFacilitiesByBuildingNr", type: GRPCCallType.unary ) - public static let getListOfToilets = GRPCMethodDescriptor( + internal static let getListOfToilets = GRPCMethodDescriptor( name: "GetListOfToilets", path: "/api.Campus/GetListOfToilets", type: GRPCCallType.unary ) - public static let getListOfElevators = GRPCMethodDescriptor( + internal static let getListOfElevators = GRPCMethodDescriptor( name: "GetListOfElevators", path: "/api.Campus/GetListOfElevators", type: GRPCCallType.unary ) - public static let getMoreInformation = GRPCMethodDescriptor( + internal static let getMoreInformation = GRPCMethodDescriptor( name: "GetMoreInformation", path: "/api.Campus/GetMoreInformation", type: GRPCCallType.unary ) - public static let getOpeningTimes = GRPCMethodDescriptor( + internal static let getOpeningTimes = GRPCMethodDescriptor( name: "GetOpeningTimes", path: "/api.Campus/GetOpeningTimes", type: GRPCCallType.unary ) - public static let getUpdateNote = GRPCMethodDescriptor( + internal static let getUpdateNote = GRPCMethodDescriptor( name: "GetUpdateNote", path: "/api.Campus/GetUpdateNote", type: GRPCCallType.unary ) - public static let getStudyRoomList = GRPCMethodDescriptor( + internal static let getStudyRoomList = GRPCMethodDescriptor( name: "GetStudyRoomList", path: "/api.Campus/GetStudyRoomList", type: GRPCCallType.unary ) - public static let getEventList = GRPCMethodDescriptor( + internal static let getEventList = GRPCMethodDescriptor( name: "GetEventList", path: "/api.Campus/GetEventList", type: GRPCCallType.unary ) - public static let getKino = GRPCMethodDescriptor( + internal static let getKino = GRPCMethodDescriptor( name: "GetKino", path: "/api.Campus/GetKino", type: GRPCCallType.unary ) - public static let sendFeedback = GRPCMethodDescriptor( + internal static let sendFeedback = GRPCMethodDescriptor( name: "SendFeedback", path: "/api.Campus/SendFeedback", type: GRPCCallType.unary ) - public static let sendFeedbackImage = GRPCMethodDescriptor( + internal static let sendFeedbackImage = GRPCMethodDescriptor( name: "SendFeedbackImage", path: "/api.Campus/SendFeedbackImage", type: GRPCCallType.unary ) - public static let registerDevice = GRPCMethodDescriptor( - name: "RegisterDevice", - path: "/api.Campus/RegisterDevice", - type: GRPCCallType.unary - ) - - public static let verifyKey = GRPCMethodDescriptor( - name: "VerifyKey", - path: "/api.Campus/VerifyKey", - type: GRPCCallType.unary - ) - - public static let deviceUploadGcmToken = GRPCMethodDescriptor( - name: "DeviceUploadGcmToken", - path: "/api.Campus/DeviceUploadGcmToken", - type: GRPCCallType.unary - ) - - public static let getUploadStatus = GRPCMethodDescriptor( + internal static let getUploadStatus = GRPCMethodDescriptor( name: "GetUploadStatus", path: "/api.Campus/GetUploadStatus", type: GRPCCallType.unary ) - public static let getNotification = GRPCMethodDescriptor( + internal static let getNotification = GRPCMethodDescriptor( name: "GetNotification", path: "/api.Campus/GetNotification", type: GRPCCallType.unary ) - public static let getNotificationConfirm = GRPCMethodDescriptor( + internal static let getNotificationConfirm = GRPCMethodDescriptor( name: "GetNotificationConfirm", path: "/api.Campus/GetNotificationConfirm", type: GRPCCallType.unary ) - public static let getMembers = GRPCMethodDescriptor( + internal static let getMembers = GRPCMethodDescriptor( name: "GetMembers", path: "/api.Campus/GetMembers", type: GRPCCallType.unary ) - public static let registerIOSDevice = GRPCMethodDescriptor( - name: "RegisterIOSDevice", - path: "/api.Campus/RegisterIOSDevice", + internal static let getCanteenHeadCount = GRPCMethodDescriptor( + name: "GetCanteenHeadCount", + path: "/api.Campus/GetCanteenHeadCount", + type: GRPCCallType.unary + ) + + internal static let iOSDeviceRequestResponse = GRPCMethodDescriptor( + name: "IOSDeviceRequestResponse", + path: "/api.Campus/IOSDeviceRequestResponse", type: GRPCCallType.unary ) - public static let removeIOSDevice = GRPCMethodDescriptor( - name: "RemoveIOSDevice", - path: "/api.Campus/RemoveIOSDevice", + internal static let registerDevice = GRPCMethodDescriptor( + name: "RegisterDevice", + path: "/api.Campus/RegisterDevice", type: GRPCCallType.unary ) - public static let addIOSDeviceUsage = GRPCMethodDescriptor( - name: "AddIOSDeviceUsage", - path: "/api.Campus/AddIOSDeviceUsage", + internal static let removeDevice = GRPCMethodDescriptor( + name: "RemoveDevice", + path: "/api.Campus/RemoveDevice", type: GRPCCallType.unary ) } diff --git a/Campus-iOS/Base/Networking/CampusBackend.pb.swift b/Campus-iOS/Base/Networking/CampusService.pb.swift similarity index 72% rename from Campus-iOS/Base/Networking/CampusBackend.pb.swift rename to Campus-iOS/Base/Networking/CampusService.pb.swift index e0d98487..21de6ff5 100644 --- a/Campus-iOS/Base/Networking/CampusBackend.pb.swift +++ b/Campus-iOS/Base/Networking/CampusService.pb.swift @@ -20,1428 +20,1518 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP typealias Version = _2 } -public struct Api_AddIOSDeviceUsageRequest { +enum Api_DeviceType: SwiftProtobuf.Enum { + typealias RawValue = Int + case ios // = 0 + case android // = 1 + case windows // = 2 + case UNRECOGNIZED(Int) + + init() { + self = .ios + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .ios + case 1: self = .android + case 2: self = .windows + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .ios: return 0 + case .android: return 1 + case .windows: return 2 + case .UNRECOGNIZED(let i): return i + } + } + +} + +#if swift(>=4.2) + +extension Api_DeviceType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Api_DeviceType] = [ + .ios, + .android, + .windows, + ] +} + +#endif // swift(>=4.2) + +struct Api_RegisterDeviceRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var deviceID: String = String() + var deviceID: String = String() + + var publicKey: String { + get {return _publicKey ?? String()} + set {_publicKey = newValue} + } + /// Returns true if `publicKey` has been explicitly set. + var hasPublicKey: Bool {return self._publicKey != nil} + /// Clears the value of `publicKey`. Subsequent reads from it will return its default value. + mutating func clearPublicKey() {self._publicKey = nil} + + var deviceType: Api_DeviceType = .ios + + var unknownFields = SwiftProtobuf.UnknownStorage() - public var unknownFields = SwiftProtobuf.UnknownStorage() + init() {} - public init() {} + fileprivate var _publicKey: String? = nil } -public struct Api_AddIOSDeviceUsageReply { +struct Api_RegisterDeviceReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var id: UInt32 = 0 + var deviceID: String = String() - public var deviceID: String = String() + var unknownFields = SwiftProtobuf.UnknownStorage() - public var createdAt: String = String() - - public var unknownFields = SwiftProtobuf.UnknownStorage() - - public init() {} + init() {} } -public struct Api_RemoveIOSDeviceRequest { +struct Api_RemoveDeviceRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var deviceID: String = String() + var deviceID: String = String() + + var deviceType: Api_DeviceType = .ios - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_RemoveIOSDeviceReply { +struct Api_RemoveDeviceReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var message: String = String() + var deviceID: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_RegisterIOSDeviceRequest { +struct Api_IOSDeviceRequestResponseRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var deviceID: String = String() + var requestID: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var payload: String = String() - public init() {} + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} } -public struct Api_RegisterIOSDeviceReply { +struct Api_IOSDeviceRequestResponseReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var deviceID: String = String() + var message: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetRoomScheduleRequest { +struct Api_GetRoomScheduleRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var room: Int32 = 0 + var room: Int32 = 0 - public var start: SwiftProtobuf.Google_Protobuf_Timestamp { + var start: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _start ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_start = newValue} } /// Returns true if `start` has been explicitly set. - public var hasStart: Bool {return self._start != nil} + var hasStart: Bool {return self._start != nil} /// Clears the value of `start`. Subsequent reads from it will return its default value. - public mutating func clearStart() {self._start = nil} + mutating func clearStart() {self._start = nil} - public var end: SwiftProtobuf.Google_Protobuf_Timestamp { + var end: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _end ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_end = newValue} } /// Returns true if `end` has been explicitly set. - public var hasEnd: Bool {return self._end != nil} + var hasEnd: Bool {return self._end != nil} /// Clears the value of `end`. Subsequent reads from it will return its default value. - public mutating func clearEnd() {self._end = nil} + mutating func clearEnd() {self._end = nil} - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} fileprivate var _start: SwiftProtobuf.Google_Protobuf_Timestamp? = nil fileprivate var _end: SwiftProtobuf.Google_Protobuf_Timestamp? = nil } -public struct Api_GetRoomScheduleReply { +struct Api_GetRoomScheduleReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var events: [Api_GetRoomScheduleReply.RoomScheduleEvent] = [] + var events: [Api_GetRoomScheduleReply.RoomScheduleEvent] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public struct RoomScheduleEvent { + struct RoomScheduleEvent { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var start: SwiftProtobuf.Google_Protobuf_Timestamp { + var start: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _start ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_start = newValue} } /// Returns true if `start` has been explicitly set. - public var hasStart: Bool {return self._start != nil} + var hasStart: Bool {return self._start != nil} /// Clears the value of `start`. Subsequent reads from it will return its default value. - public mutating func clearStart() {self._start = nil} + mutating func clearStart() {self._start = nil} - public var end: SwiftProtobuf.Google_Protobuf_Timestamp { + var end: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _end ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_end = newValue} } /// Returns true if `end` has been explicitly set. - public var hasEnd: Bool {return self._end != nil} + var hasEnd: Bool {return self._end != nil} /// Clears the value of `end`. Subsequent reads from it will return its default value. - public mutating func clearEnd() {self._end = nil} + mutating func clearEnd() {self._end = nil} - public var title: String = String() + var title: String = String() - public var eventID: Int32 = 0 + var eventID: Int32 = 0 - public var courseCode: String = String() + var courseCode: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} fileprivate var _start: SwiftProtobuf.Google_Protobuf_Timestamp? = nil fileprivate var _end: SwiftProtobuf.Google_Protobuf_Timestamp? = nil } - public init() {} + init() {} } -public struct Api_GetRoomCoordinatesRequest { +struct Api_GetRoomCoordinatesRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var archID: String = String() + var archID: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetRoomCoordinatesReply { +struct Api_GetRoomCoordinatesReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var utmZone: String = String() + var utmZone: String = String() - public var utmEasting: Float = 0 + var utmEasting: Float = 0 - public var utmNorthing: Float = 0 + var utmNorthing: Float = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetRoomMapsRequest { +struct Api_GetRoomMapsRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var archID: String = String() + var archID: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetRoomMapsReply { +struct Api_GetRoomMapsReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var maps: [Api_GetRoomMapsReply.Map] = [] + var maps: [Api_GetRoomMapsReply.Map] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public struct Map { + struct Map { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var mapID: Int64 = 0 + var mapID: Int64 = 0 - public var description_p: String = String() + var description_p: String = String() - public var scale: Int64 = 0 + var scale: Int64 = 0 - public var width: Int64 = 0 + var width: Int64 = 0 - public var height: Int64 = 0 + var height: Int64 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } - public init() {} + init() {} } -public struct Api_GetLocationsRequest { +struct Api_GetLocationsRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var location: String = String() + var location: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetLocationsReply { +struct Api_GetLocationsReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var locations: [Api_GetLocationsReply.Location] = [] + var locations: [Api_GetLocationsReply.Location] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public struct Location { + struct Location { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var location: String = String() + var location: String = String() - public var name: String = String() + var name: String = String() - public var lon: String = String() + var lon: String = String() - public var lat: String = String() + var lat: String = String() - public var radius: String = String() + var radius: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } - public init() {} + init() {} } -public struct Api_SearchRoomsRequest { +struct Api_SearchRoomsRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var query: String = String() + var query: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_SearchRoomsReply { +struct Api_SearchRoomsReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var rooms: [Api_Room] = [] + var rooms: [Api_Room] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_Room { +struct Api_Room { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var roomID: Int32 = 0 + var roomID: Int32 = 0 - public var roomCode: String = String() + var roomCode: String = String() - public var buildingNr: String = String() + var buildingNr: String = String() - public var archID: String = String() + var archID: String = String() - public var info: String = String() + var info: String = String() - public var address: String = String() + var address: String = String() - public var purpose: String = String() + var purpose: String = String() - public var campus: String = String() + var campus: String = String() - public var name: String = String() + var name: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_NewsSourceArray { +struct Api_NewsSourceArray { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var sources: [Api_NewsSource] = [] + var sources: [Api_NewsSource] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_NewsSource { +struct Api_NewsSource { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var source: String = String() + var source: String = String() - public var title: String = String() + var title: String = String() - public var icon: String = String() + var icon: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetTopNewsReply { +struct Api_GetTopNewsReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var imageURL: String = String() + var imageURL: String = String() - public var link: String = String() + var link: String = String() - public var created: SwiftProtobuf.Google_Protobuf_Timestamp { + var created: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _created ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_created = newValue} } /// Returns true if `created` has been explicitly set. - public var hasCreated: Bool {return self._created != nil} + var hasCreated: Bool {return self._created != nil} /// Clears the value of `created`. Subsequent reads from it will return its default value. - public mutating func clearCreated() {self._created = nil} + mutating func clearCreated() {self._created = nil} - public var from: SwiftProtobuf.Google_Protobuf_Timestamp { + var from: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _from ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_from = newValue} } /// Returns true if `from` has been explicitly set. - public var hasFrom: Bool {return self._from != nil} + var hasFrom: Bool {return self._from != nil} /// Clears the value of `from`. Subsequent reads from it will return its default value. - public mutating func clearFrom() {self._from = nil} + mutating func clearFrom() {self._from = nil} - public var to: SwiftProtobuf.Google_Protobuf_Timestamp { + var to: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _to ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_to = newValue} } /// Returns true if `to` has been explicitly set. - public var hasTo: Bool {return self._to != nil} + var hasTo: Bool {return self._to != nil} /// Clears the value of `to`. Subsequent reads from it will return its default value. - public mutating func clearTo() {self._to = nil} + mutating func clearTo() {self._to = nil} - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} fileprivate var _created: SwiftProtobuf.Google_Protobuf_Timestamp? = nil fileprivate var _from: SwiftProtobuf.Google_Protobuf_Timestamp? = nil fileprivate var _to: SwiftProtobuf.Google_Protobuf_Timestamp? = nil } -public struct Api_CafeteriaRatingRequest { +struct Api_CafeteriaRatingRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. /// cafeteriaId Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") - public var cafeteriaID: String = String() + var cafeteriaID: String = String() /// Optional Parameter to define an interval for the ratings (Lower bound) - public var from: SwiftProtobuf.Google_Protobuf_Timestamp { + var from: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _from ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_from = newValue} } /// Returns true if `from` has been explicitly set. - public var hasFrom: Bool {return self._from != nil} + var hasFrom: Bool {return self._from != nil} /// Clears the value of `from`. Subsequent reads from it will return its default value. - public mutating func clearFrom() {self._from = nil} + mutating func clearFrom() {self._from = nil} /// Optional Parameter to define an interval for the ratings (Upper bound) - public var to: SwiftProtobuf.Google_Protobuf_Timestamp { + var to: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _to ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_to = newValue} } /// Returns true if `to` has been explicitly set. - public var hasTo: Bool {return self._to != nil} + var hasTo: Bool {return self._to != nil} /// Clears the value of `to`. Subsequent reads from it will return its default value. - public mutating func clearTo() {self._to = nil} + mutating func clearTo() {self._to = nil} /// Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" - public var limit: Int32 = 0 + var limit: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} fileprivate var _from: SwiftProtobuf.Google_Protobuf_Timestamp? = nil fileprivate var _to: SwiftProtobuf.Google_Protobuf_Timestamp? = nil } -public struct Api_DishRatingRequest { +struct Api_DishRatingRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. /// Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") - public var cafeteriaID: String = String() + var cafeteriaID: String = String() /// Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa - public var dish: String = String() + var dish: String = String() /// Optional Parameter to define an interval for the ratings (Lower bound) - public var from: SwiftProtobuf.Google_Protobuf_Timestamp { + var from: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _from ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_from = newValue} } /// Returns true if `from` has been explicitly set. - public var hasFrom: Bool {return self._from != nil} + var hasFrom: Bool {return self._from != nil} /// Clears the value of `from`. Subsequent reads from it will return its default value. - public mutating func clearFrom() {self._from = nil} + mutating func clearFrom() {self._from = nil} /// Optional Parameter to define an interval for the ratings (Upper bound) - public var to: SwiftProtobuf.Google_Protobuf_Timestamp { + var to: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _to ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_to = newValue} } /// Returns true if `to` has been explicitly set. - public var hasTo: Bool {return self._to != nil} + var hasTo: Bool {return self._to != nil} /// Clears the value of `to`. Subsequent reads from it will return its default value. - public mutating func clearTo() {self._to = nil} + mutating func clearTo() {self._to = nil} /// Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" - public var limit: Int32 = 0 + var limit: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} fileprivate var _from: SwiftProtobuf.Google_Protobuf_Timestamp? = nil fileprivate var _to: SwiftProtobuf.Google_Protobuf_Timestamp? = nil } -public struct Api_CafeteriaRatingReply { +struct Api_CafeteriaRatingReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var rating: [Api_SingleRatingReply] = [] + var rating: [Api_SingleRatingReply] = [] - public var avg: Double = 0 + var avg: Double = 0 - public var std: Double = 0 + var std: Double = 0 - public var min: Int32 = 0 + var min: Int32 = 0 - public var max: Int32 = 0 + var max: Int32 = 0 - public var ratingTags: [Api_RatingTagResult] = [] + var ratingTags: [Api_RatingTagResult] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_DishRatingReply { +struct Api_DishRatingReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var rating: [Api_SingleRatingReply] = [] + var rating: [Api_SingleRatingReply] = [] - public var avg: Double = 0 + var avg: Double = 0 - public var std: Double = 0 + var std: Double = 0 - public var min: Int32 = 0 + var min: Int32 = 0 - public var max: Int32 = 0 + var max: Int32 = 0 - public var ratingTags: [Api_RatingTagResult] = [] + var ratingTags: [Api_RatingTagResult] = [] - public var nameTags: [Api_RatingTagResult] = [] + var nameTags: [Api_RatingTagResult] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_SingleRatingReply { +struct Api_SingleRatingReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. /// number in the range 1-5 - public var points: Int32 = 0 + var points: Int32 = 0 /// Optional JPEG image in Base64 - public var image: Data = Data() + var image: Data = Data() /// Optional comment (max 256 chars) - public var comment: String = String() + var comment: String = String() - public var ratingTags: [Api_RatingTagNewRequest] = [] + var ratingTags: [Api_RatingTagNewRequest] = [] - public var visited: SwiftProtobuf.Google_Protobuf_Timestamp { + var visited: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _visited ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_visited = newValue} } /// Returns true if `visited` has been explicitly set. - public var hasVisited: Bool {return self._visited != nil} + var hasVisited: Bool {return self._visited != nil} /// Clears the value of `visited`. Subsequent reads from it will return its default value. - public mutating func clearVisited() {self._visited = nil} + mutating func clearVisited() {self._visited = nil} - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} fileprivate var _visited: SwiftProtobuf.Google_Protobuf_Timestamp? = nil } -public struct Api_NewCafeteriaRatingRequest { +struct Api_NewCafeteriaRatingRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. /// number in the range 1-5 - public var points: Int32 = 0 + var points: Int32 = 0 - public var cafeteriaID: String = String() + var cafeteriaID: String = String() - public var image: Data = Data() + var image: Data = Data() /// Optional list of tag ratings add as many tags with a rating (1-5) of the list of cafeteriaRatingTags - public var ratingTags: [Api_RatingTag] = [] + var ratingTags: [Api_RatingTag] = [] /// Optional comment (max 256 chars) - public var comment: String = String() + var comment: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_NewDishRatingRequest { +struct Api_NewDishRatingRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. /// number in the range 1-5 - public var points: Int32 = 0 + var points: Int32 = 0 /// Mandatory Name of the dish (EAT-API naming scheme "MENSA_GARCHING") Must be available int the given mensa - public var cafeteriaID: String = String() + var cafeteriaID: String = String() /// Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa - public var dish: String = String() + var dish: String = String() /// Optional JPEG image in Base64 - public var image: Data = Data() + var image: Data = Data() /// Optional list of tag ratings add as many tags with a rating (1-5) of the list of dishRatingTags - public var ratingTags: [Api_RatingTag] = [] + var ratingTags: [Api_RatingTag] = [] /// Optional comment (max 256 chars) - public var comment: String = String() + var comment: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetTagsReply { +struct Api_GetTagsReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var ratingTags: [Api_TagsOverview] = [] + var ratingTags: [Api_TagsOverview] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_TagsOverview { +struct Api_TagsOverview { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var tagID: Int32 = 0 + var tagID: Int32 = 0 - public var de: String = String() + var de: String = String() - public var en: String = String() + var en: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_RatingTag { +struct Api_RatingTag { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var tagID: Int32 = 0 + var tagID: Int32 = 0 - public var points: Double = 0 + var points: Double = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_RatingTagNewRequest { +struct Api_RatingTagNewRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var tagID: Int32 = 0 + var tagID: Int32 = 0 - public var points: Int32 = 0 + var points: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_RatingTagResult { +struct Api_RatingTagResult { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var tagID: Int32 = 0 + var tagID: Int32 = 0 - public var avg: Double = 0 + var avg: Double = 0 - public var std: Double = 0 + var std: Double = 0 - public var min: Int32 = 0 + var min: Int32 = 0 - public var max: Int32 = 0 + var max: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetCafeteriaReply { +struct Api_GetCafeteriaReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var cafeteria: [Api_Cafeteria] = [] + var cafeteria: [Api_Cafeteria] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_Cafeteria { +struct Api_Cafeteria { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var id: String = String() + var id: String = String() - public var address: String = String() + var address: String = String() - public var longitude: Double = 0 + var longitude: Double = 0 - public var latitude: Double = 0 + var latitude: Double = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetDishesRequest { +struct Api_GetDishesRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var cafeteriaID: String = String() + var cafeteriaID: String = String() /// >=2022 until the current year - public var year: Int32 = 0 + var year: Int32 = 0 /// range 1 - 53 - public var week: Int32 = 0 + var week: Int32 = 0 /// range 0 (Monday) - 4 (Friday) - public var day: Int32 = 0 + var day: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetDishesReply { +struct Api_GetDishesReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var dish: [String] = [] + var dish: [String] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetResponsiblePersonReply { +struct Api_GetResponsiblePersonReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var responsiblePerson: [Api_ResponsiblePersonElement] = [] + var responsiblePerson: [Api_ResponsiblePersonElement] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_ResponsiblePersonElement { +struct Api_ResponsiblePersonElement { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var name: String = String() + var name: String = String() - public var telephone: String = String() + var telephone: String = String() - public var email: String = String() + var email: String = String() - public var faculty: String = String() + var faculty: String = String() - public var tumID: String = String() + var tumID: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetBuilding2GpsReply { +struct Api_GetBuilding2GpsReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var building2Gps: [Api_Building2GpsElement] = [] + var building2Gps: [Api_Building2GpsElement] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_Building2GpsElement { +struct Api_Building2GpsElement { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var id: String = String() + var id: String = String() - public var latitude: String = String() + var latitude: String = String() - public var longitude: String = String() + var longitude: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetAreaFacilitiesByBuildingNrReply { +struct Api_GetAreaFacilitiesByBuildingNrReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var areaFacilitiesByBuildingNr: [Api_RoomInformationElement] = [] + var areaFacilitiesByBuildingNr: [Api_RoomInformationElement] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetAreaFacilitiesByBuildingNrRequest { +struct Api_GetAreaFacilitiesByBuildingNrRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var buildingNr: String = String() + var buildingNr: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetListOfToiletsReply { +struct Api_GetListOfToiletsReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var listOfToilets: [Api_RoomInformationElement] = [] + var listOfToilets: [Api_RoomInformationElement] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_RoomInformationElement { +struct Api_RoomInformationElement { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var roomID: Int32 = 0 + var roomID: Int32 = 0 - public var roomCode: String = String() + var roomCode: String = String() - public var buildingNr: String = String() + var buildingNr: String = String() - public var archID: String = String() + var archID: String = String() - public var info: String = String() + var info: String = String() - public var address: String = String() + var address: String = String() - public var purpose: String = String() + var purpose: String = String() - public var campus: String = String() + var campus: String = String() - public var name: String = String() + var name: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetListOfElevatorsReply { +struct Api_GetListOfElevatorsReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var listOfElevators: [Api_RoomInformationElement] = [] + var listOfElevators: [Api_RoomInformationElement] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetMoreInformationReply { +struct Api_GetMoreInformationReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var information: [Api_MoreInformationElement] = [] + var information: [Api_MoreInformationElement] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_MoreInformationElement { +struct Api_MoreInformationElement { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var title: String = String() + var title: String = String() - public var category: String = String() + var category: String = String() - public var url: String = String() + var url: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetOpeningTimesRequest { +struct Api_GetOpeningTimesRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var language: String = String() + var language: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetOpeningTimesReply { +struct Api_GetOpeningTimesReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var facilities: [Api_OpeningTimesMsgElement] = [] + var facilities: [Api_OpeningTimesMsgElement] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_OpeningTimesMsgElement { +struct Api_OpeningTimesMsgElement { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var id: Int32 = 0 + var id: Int32 = 0 - public var category: String = String() + var category: String = String() - public var name: String = String() + var name: String = String() - public var address: String = String() + var address: String = String() - public var room: String = String() + var room: String = String() - public var transportStation: String = String() + var transportStation: String = String() - public var openingHours: String = String() + var openingHours: String = String() - public var infos: String = String() + var infos: String = String() - public var url: String = String() + var url: String = String() - public var language: String = String() + var language: String = String() - public var referenceID: Int32 = 0 + var referenceID: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetUpdateNoteRequest { +struct Api_GetUpdateNoteRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var version: Int32 = 0 + var version: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetUpdateNoteReply { +struct Api_GetUpdateNoteReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var message: String = String() + var message: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetStudyRoomListReply { +struct Api_GetStudyRoomListReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var rooms: [Api_StudyRoomMsgElement] = [] + var rooms: [Api_StudyRoomMsgElement] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_StudyRoomMsgElement { +struct Api_StudyRoomMsgElement { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var id: Int32 = 0 + var id: Int32 = 0 - public var name: String = String() + var name: String = String() - public var details: String = String() + var details: String = String() - public var rooms: [Api_StudyRoom] = [] + var rooms: [Api_StudyRoom] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_StudyRoom { +struct Api_StudyRoom { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var groupID: Int32 = 0 + var groupID: Int32 = 0 - public var roomID: Int32 = 0 + var roomID: Int32 = 0 - public var roomCode: String = String() + var roomCode: String = String() - public var roomName: String = String() + var roomName: String = String() - public var buildingName: String = String() + var buildingName: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetEventListRequest { +struct Api_GetEventListRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. /// optional parameter, will return all events if no id is specified - public var eventID: Int32 = 0 + var eventID: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetEventListReply { +struct Api_GetEventListReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var events: [Api_EventListMsgElement] = [] + var events: [Api_EventListMsgElement] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_EventListMsgElement { +struct Api_EventListMsgElement { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var name: String = String() + var name: String = String() - public var path: String = String() + var path: String = String() - public var event: Int32 = 0 + var event: Int32 = 0 - public var news: Int32 = 0 + var news: Int32 = 0 - public var kino: Int32 = 0 + var kino: Int32 = 0 - public var file: Int32 = 0 + var file: Int32 = 0 - public var title: String = String() + var title: String = String() - public var description_p: String = String() + var description_p: String = String() - public var locality: String = String() + var locality: String = String() - public var link: String = String() + var link: String = String() - public var start: SwiftProtobuf.Google_Protobuf_Timestamp { + var start: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _start ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_start = newValue} } /// Returns true if `start` has been explicitly set. - public var hasStart: Bool {return self._start != nil} + var hasStart: Bool {return self._start != nil} /// Clears the value of `start`. Subsequent reads from it will return its default value. - public mutating func clearStart() {self._start = nil} + mutating func clearStart() {self._start = nil} - public var end: SwiftProtobuf.Google_Protobuf_Timestamp { + var end: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _end ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_end = newValue} } /// Returns true if `end` has been explicitly set. - public var hasEnd: Bool {return self._end != nil} + var hasEnd: Bool {return self._end != nil} /// Clears the value of `end`. Subsequent reads from it will return its default value. - public mutating func clearEnd() {self._end = nil} + mutating func clearEnd() {self._end = nil} - public var ticketGroup: Int32 = 0 + var ticketGroup: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} fileprivate var _start: SwiftProtobuf.Google_Protobuf_Timestamp? = nil fileprivate var _end: SwiftProtobuf.Google_Protobuf_Timestamp? = nil } -public struct Api_GetKinoRequest { +struct Api_GetKinoRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var lastID: Int32 = 0 + var lastID: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetKinoReply { +struct Api_GetKinoReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var kinos: [Api_KinoMsgElement] = [] + var kinos: [Api_KinoMsgElement] = [] - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_KinoMsgElement { +struct Api_KinoMsgElement { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var name: String { + var name: String { get {return _storage._name} set {_uniqueStorage()._name = newValue} } - public var path: String { + var path: String { get {return _storage._path} set {_uniqueStorage()._path = newValue} } - public var kino: Int32 { + var kino: Int32 { get {return _storage._kino} set {_uniqueStorage()._kino = newValue} } - public var date: SwiftProtobuf.Google_Protobuf_Timestamp { + var date: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _storage._date ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_uniqueStorage()._date = newValue} } /// Returns true if `date` has been explicitly set. - public var hasDate: Bool {return _storage._date != nil} + var hasDate: Bool {return _storage._date != nil} /// Clears the value of `date`. Subsequent reads from it will return its default value. - public mutating func clearDate() {_uniqueStorage()._date = nil} + mutating func clearDate() {_uniqueStorage()._date = nil} - public var created: SwiftProtobuf.Google_Protobuf_Timestamp { + var created: SwiftProtobuf.Google_Protobuf_Timestamp { get {return _storage._created ?? SwiftProtobuf.Google_Protobuf_Timestamp()} set {_uniqueStorage()._created = newValue} } /// Returns true if `created` has been explicitly set. - public var hasCreated: Bool {return _storage._created != nil} + var hasCreated: Bool {return _storage._created != nil} /// Clears the value of `created`. Subsequent reads from it will return its default value. - public mutating func clearCreated() {_uniqueStorage()._created = nil} + mutating func clearCreated() {_uniqueStorage()._created = nil} - public var title: String { + var title: String { get {return _storage._title} set {_uniqueStorage()._title = newValue} } - public var year: String { + var year: String { get {return _storage._year} set {_uniqueStorage()._year = newValue} } - public var runtime: String { + var runtime: String { get {return _storage._runtime} set {_uniqueStorage()._runtime = newValue} } - public var genre: String { + var genre: String { get {return _storage._genre} set {_uniqueStorage()._genre = newValue} } - public var director: String { + var director: String { get {return _storage._director} set {_uniqueStorage()._director = newValue} } - public var actors: String { + var actors: String { get {return _storage._actors} set {_uniqueStorage()._actors = newValue} } - public var rating: String { + var rating: String { get {return _storage._rating} set {_uniqueStorage()._rating = newValue} } - public var description_p: String { + var description_p: String { get {return _storage._description_p} set {_uniqueStorage()._description_p = newValue} } - public var cover: Int32 { + var cover: Int32 { get {return _storage._cover} set {_uniqueStorage()._cover = newValue} } - public var trailer: String { + var trailer: String { get {return _storage._trailer} set {_uniqueStorage()._trailer = newValue} } - public var link: String { + var link: String { get {return _storage._link} set {_uniqueStorage()._link = newValue} } - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} fileprivate var _storage = _StorageClass.defaultInstance } -public struct Api_SendFeedbackRequest { +struct Api_SendFeedbackRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var topic: String = String() + var topic: String = String() - public var email: String = String() + var email: String = String() - public var emailID: String = String() + var emailID: String = String() - public var message: String = String() + var message: String = String() - public var imageCount: Int32 = 0 + var imageCount: Int32 = 0 - public var latitude: Double = 0 + var latitude: Double = 0 - public var longitude: Double = 0 + var longitude: Double = 0 - public var osVersion: String = String() + var osVersion: String = String() - public var appVersion: String = String() + var appVersion: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_SendFeedbackImageReply { +struct Api_SendFeedbackImageReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var status: String = String() + var status: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_SendFeedbackImageRequest { +struct Api_SendFeedbackImageRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var id: Int32 = 0 + var id: Int32 = 0 ///todo where does the file come from? - public var imageNr: Int32 = 0 + var imageNr: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetMembersRequest { +struct Api_GetMembersRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var lrzID: String = String() + var lrzID: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetMembersReply { +struct Api_GetMembersReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var lrzID: String = String() + var lrzID: String = String() - public var name: String = String() + var name: String = String() - public var memberID: Int32 = 0 + var memberID: Int32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_TUMCabeStatus { +struct Api_GetUploadStatusRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var status: String = String() + var lrzID: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetUploadStatusRequest { +struct Api_GetUploadStatusReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var lrzID: String = String() + var fcmToken: String = String() + + var publicKey: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var studentID: Bool = false - public init() {} + var employeeID: Bool = false + + var externalID: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} } -public struct Api_GetUploadStatusReply { +struct Api_GetNotificationsReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var fcmToken: String = String() + var notificationID: Int32 = 0 - public var publicKey: String = String() + var type: Int32 = 0 - public var studentID: Bool = false + var title: String = String() - public var employeeID: Bool = false + var description_p: String = String() - public var externalID: Bool = false + var signature: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetNotificationsReply { +struct Api_NotificationsRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var notificationID: Int32 = 0 + var notificationID: Int32 = 0 - public var type: Int32 = 0 + var unknownFields = SwiftProtobuf.UnknownStorage() - public var title: String = String() + init() {} +} - public var description_p: String = String() +struct Api_GetNotificationsConfirmReply { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. - public var signature: String = String() + var status: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_NotificationsRequest { +struct Api_GetCanteenHeadCountRequest { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var notificationID: Int32 = 0 + /// The requested canteen ID + var canteenID: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} } -public struct Api_GetNotificationsConfirmReply { +struct Api_GetCanteenHeadCountReply { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. - public var status: String = String() + /// The absolut count of humans in the canteen. Only valid in case percent != -1. + var count: UInt32 = 0 + + /// The maximum nunmber of humans in the canteen for the percent to be 100.00. Only valid in case percent != -1. + var maxCount: UInt32 = 0 - public var unknownFields = SwiftProtobuf.UnknownStorage() + /// Current capacity utilization of the canteen clamped to 0 and 100 or -1 in case no data is available. + var percent: Float = 0 + + /// A time stamp indicating how up to date the response is. Only valid in case percent != -1. + var timestamp: SwiftProtobuf.Google_Protobuf_Timestamp { + get {return _timestamp ?? SwiftProtobuf.Google_Protobuf_Timestamp()} + set {_timestamp = newValue} + } + /// Returns true if `timestamp` has been explicitly set. + var hasTimestamp: Bool {return self._timestamp != nil} + /// Clears the value of `timestamp`. Subsequent reads from it will return its default value. + mutating func clearTimestamp() {self._timestamp = nil} - public init() {} + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _timestamp: SwiftProtobuf.Google_Protobuf_Timestamp? = nil } #if swift(>=5.5) && canImport(_Concurrency) -extension Api_AddIOSDeviceUsageRequest: @unchecked Sendable {} -extension Api_AddIOSDeviceUsageReply: @unchecked Sendable {} -extension Api_RemoveIOSDeviceRequest: @unchecked Sendable {} -extension Api_RemoveIOSDeviceReply: @unchecked Sendable {} -extension Api_RegisterIOSDeviceRequest: @unchecked Sendable {} -extension Api_RegisterIOSDeviceReply: @unchecked Sendable {} +extension Api_DeviceType: @unchecked Sendable {} +extension Api_RegisterDeviceRequest: @unchecked Sendable {} +extension Api_RegisterDeviceReply: @unchecked Sendable {} +extension Api_RemoveDeviceRequest: @unchecked Sendable {} +extension Api_RemoveDeviceReply: @unchecked Sendable {} +extension Api_IOSDeviceRequestResponseRequest: @unchecked Sendable {} +extension Api_IOSDeviceRequestResponseReply: @unchecked Sendable {} extension Api_GetRoomScheduleRequest: @unchecked Sendable {} extension Api_GetRoomScheduleReply: @unchecked Sendable {} extension Api_GetRoomScheduleReply.RoomScheduleEvent: @unchecked Sendable {} @@ -1505,231 +1595,256 @@ extension Api_SendFeedbackImageReply: @unchecked Sendable {} extension Api_SendFeedbackImageRequest: @unchecked Sendable {} extension Api_GetMembersRequest: @unchecked Sendable {} extension Api_GetMembersReply: @unchecked Sendable {} -extension Api_TUMCabeStatus: @unchecked Sendable {} extension Api_GetUploadStatusRequest: @unchecked Sendable {} extension Api_GetUploadStatusReply: @unchecked Sendable {} extension Api_GetNotificationsReply: @unchecked Sendable {} extension Api_NotificationsRequest: @unchecked Sendable {} extension Api_GetNotificationsConfirmReply: @unchecked Sendable {} +extension Api_GetCanteenHeadCountRequest: @unchecked Sendable {} +extension Api_GetCanteenHeadCountReply: @unchecked Sendable {} #endif // swift(>=5.5) && canImport(_Concurrency) // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "api" -extension Api_AddIOSDeviceUsageRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".AddIOSDeviceUsageRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ +extension Api_DeviceType: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "IOS"), + 1: .same(proto: "ANDROID"), + 2: .same(proto: "WINDOWS"), + ] +} + +extension Api_RegisterDeviceRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".RegisterDeviceRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "deviceId"), + 2: .same(proto: "publicKey"), + 3: .same(proto: "deviceType"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { case 1: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() + case 2: try { try decoder.decodeSingularStringField(value: &self._publicKey) }() + case 3: try { try decoder.decodeSingularEnumField(value: &self.deviceType) }() default: break } } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 if !self.deviceID.isEmpty { try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 1) } + try { if let v = self._publicKey { + try visitor.visitSingularStringField(value: v, fieldNumber: 2) + } }() + if self.deviceType != .ios { + try visitor.visitSingularEnumField(value: self.deviceType, fieldNumber: 3) + } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_AddIOSDeviceUsageRequest, rhs: Api_AddIOSDeviceUsageRequest) -> Bool { + static func ==(lhs: Api_RegisterDeviceRequest, rhs: Api_RegisterDeviceRequest) -> Bool { if lhs.deviceID != rhs.deviceID {return false} + if lhs._publicKey != rhs._publicKey {return false} + if lhs.deviceType != rhs.deviceType {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } } -extension Api_AddIOSDeviceUsageReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".AddIOSDeviceUsageReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .same(proto: "id"), - 2: .same(proto: "deviceId"), - 3: .same(proto: "createdAt"), +extension Api_RegisterDeviceReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".RegisterDeviceReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "deviceId"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularUInt32Field(value: &self.id) }() - case 2: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() - case 3: try { try decoder.decodeSingularStringField(value: &self.createdAt) }() + case 1: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() default: break } } } - public func traverse(visitor: inout V) throws { - if self.id != 0 { - try visitor.visitSingularUInt32Field(value: self.id, fieldNumber: 1) - } + func traverse(visitor: inout V) throws { if !self.deviceID.isEmpty { - try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 2) - } - if !self.createdAt.isEmpty { - try visitor.visitSingularStringField(value: self.createdAt, fieldNumber: 3) + try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_AddIOSDeviceUsageReply, rhs: Api_AddIOSDeviceUsageReply) -> Bool { - if lhs.id != rhs.id {return false} + static func ==(lhs: Api_RegisterDeviceReply, rhs: Api_RegisterDeviceReply) -> Bool { if lhs.deviceID != rhs.deviceID {return false} - if lhs.createdAt != rhs.createdAt {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } } -extension Api_RemoveIOSDeviceRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".RemoveIOSDeviceRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ +extension Api_RemoveDeviceRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".RemoveDeviceRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "deviceId"), + 2: .same(proto: "deviceType"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { case 1: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() + case 2: try { try decoder.decodeSingularEnumField(value: &self.deviceType) }() default: break } } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.deviceID.isEmpty { try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 1) } + if self.deviceType != .ios { + try visitor.visitSingularEnumField(value: self.deviceType, fieldNumber: 2) + } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_RemoveIOSDeviceRequest, rhs: Api_RemoveIOSDeviceRequest) -> Bool { + static func ==(lhs: Api_RemoveDeviceRequest, rhs: Api_RemoveDeviceRequest) -> Bool { if lhs.deviceID != rhs.deviceID {return false} + if lhs.deviceType != rhs.deviceType {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } } -extension Api_RemoveIOSDeviceReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".RemoveIOSDeviceReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .same(proto: "message"), +extension Api_RemoveDeviceReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".RemoveDeviceReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "deviceId"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularStringField(value: &self.message) }() + case 1: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() default: break } } } - public func traverse(visitor: inout V) throws { - if !self.message.isEmpty { - try visitor.visitSingularStringField(value: self.message, fieldNumber: 1) + func traverse(visitor: inout V) throws { + if !self.deviceID.isEmpty { + try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_RemoveIOSDeviceReply, rhs: Api_RemoveIOSDeviceReply) -> Bool { - if lhs.message != rhs.message {return false} + static func ==(lhs: Api_RemoveDeviceReply, rhs: Api_RemoveDeviceReply) -> Bool { + if lhs.deviceID != rhs.deviceID {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } } -extension Api_RegisterIOSDeviceRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".RegisterIOSDeviceRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .same(proto: "deviceId"), +extension Api_IOSDeviceRequestResponseRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".IOSDeviceRequestResponseRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "requestId"), + 2: .same(proto: "payload"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() + case 1: try { try decoder.decodeSingularStringField(value: &self.requestID) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.payload) }() default: break } } } - public func traverse(visitor: inout V) throws { - if !self.deviceID.isEmpty { - try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 1) + func traverse(visitor: inout V) throws { + if !self.requestID.isEmpty { + try visitor.visitSingularStringField(value: self.requestID, fieldNumber: 1) + } + if !self.payload.isEmpty { + try visitor.visitSingularStringField(value: self.payload, fieldNumber: 2) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_RegisterIOSDeviceRequest, rhs: Api_RegisterIOSDeviceRequest) -> Bool { - if lhs.deviceID != rhs.deviceID {return false} + static func ==(lhs: Api_IOSDeviceRequestResponseRequest, rhs: Api_IOSDeviceRequestResponseRequest) -> Bool { + if lhs.requestID != rhs.requestID {return false} + if lhs.payload != rhs.payload {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } } -extension Api_RegisterIOSDeviceReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".RegisterIOSDeviceReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .same(proto: "deviceId"), +extension Api_IOSDeviceRequestResponseReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".IOSDeviceRequestResponseReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "message"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() + case 1: try { try decoder.decodeSingularStringField(value: &self.message) }() default: break } } } - public func traverse(visitor: inout V) throws { - if !self.deviceID.isEmpty { - try visitor.visitSingularStringField(value: self.deviceID, fieldNumber: 1) + func traverse(visitor: inout V) throws { + if !self.message.isEmpty { + try visitor.visitSingularStringField(value: self.message, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_RegisterIOSDeviceReply, rhs: Api_RegisterIOSDeviceReply) -> Bool { - if lhs.deviceID != rhs.deviceID {return false} + static func ==(lhs: Api_IOSDeviceRequestResponseReply, rhs: Api_IOSDeviceRequestResponseReply) -> Bool { + if lhs.message != rhs.message {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } } extension Api_GetRoomScheduleRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetRoomScheduleRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetRoomScheduleRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "room"), 2: .same(proto: "start"), 3: .same(proto: "end"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -1743,7 +1858,7 @@ extension Api_GetRoomScheduleRequest: SwiftProtobuf.Message, SwiftProtobuf._Mess } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every if/case branch local when no optimizations // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and @@ -1760,7 +1875,7 @@ extension Api_GetRoomScheduleRequest: SwiftProtobuf.Message, SwiftProtobuf._Mess try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetRoomScheduleRequest, rhs: Api_GetRoomScheduleRequest) -> Bool { + static func ==(lhs: Api_GetRoomScheduleRequest, rhs: Api_GetRoomScheduleRequest) -> Bool { if lhs.room != rhs.room {return false} if lhs._start != rhs._start {return false} if lhs._end != rhs._end {return false} @@ -1770,12 +1885,12 @@ extension Api_GetRoomScheduleRequest: SwiftProtobuf.Message, SwiftProtobuf._Mess } extension Api_GetRoomScheduleReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetRoomScheduleReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetRoomScheduleReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "events"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -1787,14 +1902,14 @@ extension Api_GetRoomScheduleReply: SwiftProtobuf.Message, SwiftProtobuf._Messag } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.events.isEmpty { try visitor.visitRepeatedMessageField(value: self.events, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetRoomScheduleReply, rhs: Api_GetRoomScheduleReply) -> Bool { + static func ==(lhs: Api_GetRoomScheduleReply, rhs: Api_GetRoomScheduleReply) -> Bool { if lhs.events != rhs.events {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -1802,8 +1917,8 @@ extension Api_GetRoomScheduleReply: SwiftProtobuf.Message, SwiftProtobuf._Messag } extension Api_GetRoomScheduleReply.RoomScheduleEvent: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = Api_GetRoomScheduleReply.protoMessageName + ".RoomScheduleEvent" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = Api_GetRoomScheduleReply.protoMessageName + ".RoomScheduleEvent" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "start"), 2: .same(proto: "end"), 3: .same(proto: "title"), @@ -1811,7 +1926,7 @@ extension Api_GetRoomScheduleReply.RoomScheduleEvent: SwiftProtobuf.Message, Swi 5: .standard(proto: "course_code"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -1827,7 +1942,7 @@ extension Api_GetRoomScheduleReply.RoomScheduleEvent: SwiftProtobuf.Message, Swi } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every if/case branch local when no optimizations // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and @@ -1850,7 +1965,7 @@ extension Api_GetRoomScheduleReply.RoomScheduleEvent: SwiftProtobuf.Message, Swi try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetRoomScheduleReply.RoomScheduleEvent, rhs: Api_GetRoomScheduleReply.RoomScheduleEvent) -> Bool { + static func ==(lhs: Api_GetRoomScheduleReply.RoomScheduleEvent, rhs: Api_GetRoomScheduleReply.RoomScheduleEvent) -> Bool { if lhs._start != rhs._start {return false} if lhs._end != rhs._end {return false} if lhs.title != rhs.title {return false} @@ -1862,12 +1977,12 @@ extension Api_GetRoomScheduleReply.RoomScheduleEvent: SwiftProtobuf.Message, Swi } extension Api_GetRoomCoordinatesRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetRoomCoordinatesRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetRoomCoordinatesRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .standard(proto: "arch_id"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -1879,14 +1994,14 @@ extension Api_GetRoomCoordinatesRequest: SwiftProtobuf.Message, SwiftProtobuf._M } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.archID.isEmpty { try visitor.visitSingularStringField(value: self.archID, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetRoomCoordinatesRequest, rhs: Api_GetRoomCoordinatesRequest) -> Bool { + static func ==(lhs: Api_GetRoomCoordinatesRequest, rhs: Api_GetRoomCoordinatesRequest) -> Bool { if lhs.archID != rhs.archID {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -1894,14 +2009,14 @@ extension Api_GetRoomCoordinatesRequest: SwiftProtobuf.Message, SwiftProtobuf._M } extension Api_GetRoomCoordinatesReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetRoomCoordinatesReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetRoomCoordinatesReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .standard(proto: "utm_zone"), 2: .standard(proto: "utm_easting"), 3: .standard(proto: "utm_northing"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -1915,7 +2030,7 @@ extension Api_GetRoomCoordinatesReply: SwiftProtobuf.Message, SwiftProtobuf._Mes } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.utmZone.isEmpty { try visitor.visitSingularStringField(value: self.utmZone, fieldNumber: 1) } @@ -1928,7 +2043,7 @@ extension Api_GetRoomCoordinatesReply: SwiftProtobuf.Message, SwiftProtobuf._Mes try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetRoomCoordinatesReply, rhs: Api_GetRoomCoordinatesReply) -> Bool { + static func ==(lhs: Api_GetRoomCoordinatesReply, rhs: Api_GetRoomCoordinatesReply) -> Bool { if lhs.utmZone != rhs.utmZone {return false} if lhs.utmEasting != rhs.utmEasting {return false} if lhs.utmNorthing != rhs.utmNorthing {return false} @@ -1938,12 +2053,12 @@ extension Api_GetRoomCoordinatesReply: SwiftProtobuf.Message, SwiftProtobuf._Mes } extension Api_GetRoomMapsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetRoomMapsRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetRoomMapsRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .standard(proto: "arch_id"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -1955,14 +2070,14 @@ extension Api_GetRoomMapsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageI } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.archID.isEmpty { try visitor.visitSingularStringField(value: self.archID, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetRoomMapsRequest, rhs: Api_GetRoomMapsRequest) -> Bool { + static func ==(lhs: Api_GetRoomMapsRequest, rhs: Api_GetRoomMapsRequest) -> Bool { if lhs.archID != rhs.archID {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -1970,12 +2085,12 @@ extension Api_GetRoomMapsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageI } extension Api_GetRoomMapsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetRoomMapsReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetRoomMapsReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "maps"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -1987,14 +2102,14 @@ extension Api_GetRoomMapsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImp } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.maps.isEmpty { try visitor.visitRepeatedMessageField(value: self.maps, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetRoomMapsReply, rhs: Api_GetRoomMapsReply) -> Bool { + static func ==(lhs: Api_GetRoomMapsReply, rhs: Api_GetRoomMapsReply) -> Bool { if lhs.maps != rhs.maps {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -2002,8 +2117,8 @@ extension Api_GetRoomMapsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImp } extension Api_GetRoomMapsReply.Map: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = Api_GetRoomMapsReply.protoMessageName + ".Map" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = Api_GetRoomMapsReply.protoMessageName + ".Map" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .standard(proto: "map_id"), 2: .same(proto: "description"), 3: .same(proto: "scale"), @@ -2011,7 +2126,7 @@ extension Api_GetRoomMapsReply.Map: SwiftProtobuf.Message, SwiftProtobuf._Messag 5: .same(proto: "height"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2027,7 +2142,7 @@ extension Api_GetRoomMapsReply.Map: SwiftProtobuf.Message, SwiftProtobuf._Messag } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.mapID != 0 { try visitor.visitSingularInt64Field(value: self.mapID, fieldNumber: 1) } @@ -2046,7 +2161,7 @@ extension Api_GetRoomMapsReply.Map: SwiftProtobuf.Message, SwiftProtobuf._Messag try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetRoomMapsReply.Map, rhs: Api_GetRoomMapsReply.Map) -> Bool { + static func ==(lhs: Api_GetRoomMapsReply.Map, rhs: Api_GetRoomMapsReply.Map) -> Bool { if lhs.mapID != rhs.mapID {return false} if lhs.description_p != rhs.description_p {return false} if lhs.scale != rhs.scale {return false} @@ -2058,12 +2173,12 @@ extension Api_GetRoomMapsReply.Map: SwiftProtobuf.Message, SwiftProtobuf._Messag } extension Api_GetLocationsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetLocationsRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetLocationsRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "location"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2075,14 +2190,14 @@ extension Api_GetLocationsRequest: SwiftProtobuf.Message, SwiftProtobuf._Message } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.location.isEmpty { try visitor.visitSingularStringField(value: self.location, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetLocationsRequest, rhs: Api_GetLocationsRequest) -> Bool { + static func ==(lhs: Api_GetLocationsRequest, rhs: Api_GetLocationsRequest) -> Bool { if lhs.location != rhs.location {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -2090,12 +2205,12 @@ extension Api_GetLocationsRequest: SwiftProtobuf.Message, SwiftProtobuf._Message } extension Api_GetLocationsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetLocationsReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetLocationsReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "locations"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2107,14 +2222,14 @@ extension Api_GetLocationsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.locations.isEmpty { try visitor.visitRepeatedMessageField(value: self.locations, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetLocationsReply, rhs: Api_GetLocationsReply) -> Bool { + static func ==(lhs: Api_GetLocationsReply, rhs: Api_GetLocationsReply) -> Bool { if lhs.locations != rhs.locations {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -2122,8 +2237,8 @@ extension Api_GetLocationsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } extension Api_GetLocationsReply.Location: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = Api_GetLocationsReply.protoMessageName + ".Location" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = Api_GetLocationsReply.protoMessageName + ".Location" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "location"), 2: .same(proto: "name"), 3: .same(proto: "lon"), @@ -2131,7 +2246,7 @@ extension Api_GetLocationsReply.Location: SwiftProtobuf.Message, SwiftProtobuf._ 5: .same(proto: "radius"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2147,7 +2262,7 @@ extension Api_GetLocationsReply.Location: SwiftProtobuf.Message, SwiftProtobuf._ } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.location.isEmpty { try visitor.visitSingularStringField(value: self.location, fieldNumber: 1) } @@ -2166,7 +2281,7 @@ extension Api_GetLocationsReply.Location: SwiftProtobuf.Message, SwiftProtobuf._ try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetLocationsReply.Location, rhs: Api_GetLocationsReply.Location) -> Bool { + static func ==(lhs: Api_GetLocationsReply.Location, rhs: Api_GetLocationsReply.Location) -> Bool { if lhs.location != rhs.location {return false} if lhs.name != rhs.name {return false} if lhs.lon != rhs.lon {return false} @@ -2178,12 +2293,12 @@ extension Api_GetLocationsReply.Location: SwiftProtobuf.Message, SwiftProtobuf._ } extension Api_SearchRoomsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".SearchRoomsRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".SearchRoomsRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "query"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2195,14 +2310,14 @@ extension Api_SearchRoomsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageI } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.query.isEmpty { try visitor.visitSingularStringField(value: self.query, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_SearchRoomsRequest, rhs: Api_SearchRoomsRequest) -> Bool { + static func ==(lhs: Api_SearchRoomsRequest, rhs: Api_SearchRoomsRequest) -> Bool { if lhs.query != rhs.query {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -2210,12 +2325,12 @@ extension Api_SearchRoomsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageI } extension Api_SearchRoomsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".SearchRoomsReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".SearchRoomsReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "rooms"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2227,14 +2342,14 @@ extension Api_SearchRoomsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImp } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.rooms.isEmpty { try visitor.visitRepeatedMessageField(value: self.rooms, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_SearchRoomsReply, rhs: Api_SearchRoomsReply) -> Bool { + static func ==(lhs: Api_SearchRoomsReply, rhs: Api_SearchRoomsReply) -> Bool { if lhs.rooms != rhs.rooms {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -2242,8 +2357,8 @@ extension Api_SearchRoomsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImp } extension Api_Room: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".Room" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".Room" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "roomId"), 2: .standard(proto: "room_code"), 3: .standard(proto: "building_nr"), @@ -2255,7 +2370,7 @@ extension Api_Room: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB 9: .same(proto: "name"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2275,7 +2390,7 @@ extension Api_Room: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.roomID != 0 { try visitor.visitSingularInt32Field(value: self.roomID, fieldNumber: 1) } @@ -2306,7 +2421,7 @@ extension Api_Room: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_Room, rhs: Api_Room) -> Bool { + static func ==(lhs: Api_Room, rhs: Api_Room) -> Bool { if lhs.roomID != rhs.roomID {return false} if lhs.roomCode != rhs.roomCode {return false} if lhs.buildingNr != rhs.buildingNr {return false} @@ -2322,12 +2437,12 @@ extension Api_Room: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB } extension Api_NewsSourceArray: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".NewsSourceArray" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".NewsSourceArray" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "sources"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2339,14 +2454,14 @@ extension Api_NewsSourceArray: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.sources.isEmpty { try visitor.visitRepeatedMessageField(value: self.sources, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_NewsSourceArray, rhs: Api_NewsSourceArray) -> Bool { + static func ==(lhs: Api_NewsSourceArray, rhs: Api_NewsSourceArray) -> Bool { if lhs.sources != rhs.sources {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -2354,14 +2469,14 @@ extension Api_NewsSourceArray: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl } extension Api_NewsSource: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".NewsSource" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".NewsSource" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "source"), 2: .same(proto: "title"), 3: .same(proto: "icon"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2375,7 +2490,7 @@ extension Api_NewsSource: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.source.isEmpty { try visitor.visitSingularStringField(value: self.source, fieldNumber: 1) } @@ -2388,7 +2503,7 @@ extension Api_NewsSource: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_NewsSource, rhs: Api_NewsSource) -> Bool { + static func ==(lhs: Api_NewsSource, rhs: Api_NewsSource) -> Bool { if lhs.source != rhs.source {return false} if lhs.title != rhs.title {return false} if lhs.icon != rhs.icon {return false} @@ -2398,8 +2513,8 @@ extension Api_NewsSource: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement } extension Api_GetTopNewsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetTopNewsReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetTopNewsReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .standard(proto: "image_url"), 2: .same(proto: "link"), 3: .same(proto: "created"), @@ -2407,7 +2522,7 @@ extension Api_GetTopNewsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl 5: .same(proto: "to"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2423,7 +2538,7 @@ extension Api_GetTopNewsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every if/case branch local when no optimizations // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and @@ -2446,7 +2561,7 @@ extension Api_GetTopNewsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetTopNewsReply, rhs: Api_GetTopNewsReply) -> Bool { + static func ==(lhs: Api_GetTopNewsReply, rhs: Api_GetTopNewsReply) -> Bool { if lhs.imageURL != rhs.imageURL {return false} if lhs.link != rhs.link {return false} if lhs._created != rhs._created {return false} @@ -2458,15 +2573,15 @@ extension Api_GetTopNewsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl } extension Api_CafeteriaRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".CafeteriaRatingRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".CafeteriaRatingRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "cafeteriaId"), 2: .same(proto: "from"), 3: .same(proto: "to"), 4: .same(proto: "limit"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2481,7 +2596,7 @@ extension Api_CafeteriaRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._Mess } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every if/case branch local when no optimizations // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and @@ -2501,7 +2616,7 @@ extension Api_CafeteriaRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._Mess try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_CafeteriaRatingRequest, rhs: Api_CafeteriaRatingRequest) -> Bool { + static func ==(lhs: Api_CafeteriaRatingRequest, rhs: Api_CafeteriaRatingRequest) -> Bool { if lhs.cafeteriaID != rhs.cafeteriaID {return false} if lhs._from != rhs._from {return false} if lhs._to != rhs._to {return false} @@ -2512,8 +2627,8 @@ extension Api_CafeteriaRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._Mess } extension Api_DishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".DishRatingRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".DishRatingRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "cafeteriaId"), 2: .same(proto: "dish"), 3: .same(proto: "from"), @@ -2521,7 +2636,7 @@ extension Api_DishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageIm 5: .same(proto: "limit"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2537,7 +2652,7 @@ extension Api_DishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every if/case branch local when no optimizations // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and @@ -2560,7 +2675,7 @@ extension Api_DishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageIm try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_DishRatingRequest, rhs: Api_DishRatingRequest) -> Bool { + static func ==(lhs: Api_DishRatingRequest, rhs: Api_DishRatingRequest) -> Bool { if lhs.cafeteriaID != rhs.cafeteriaID {return false} if lhs.dish != rhs.dish {return false} if lhs._from != rhs._from {return false} @@ -2572,8 +2687,8 @@ extension Api_DishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } extension Api_CafeteriaRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".CafeteriaRatingReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".CafeteriaRatingReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "rating"), 2: .same(proto: "avg"), 3: .same(proto: "std"), @@ -2582,7 +2697,7 @@ extension Api_CafeteriaRatingReply: SwiftProtobuf.Message, SwiftProtobuf._Messag 6: .same(proto: "ratingTags"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2599,7 +2714,7 @@ extension Api_CafeteriaRatingReply: SwiftProtobuf.Message, SwiftProtobuf._Messag } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.rating.isEmpty { try visitor.visitRepeatedMessageField(value: self.rating, fieldNumber: 1) } @@ -2621,7 +2736,7 @@ extension Api_CafeteriaRatingReply: SwiftProtobuf.Message, SwiftProtobuf._Messag try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_CafeteriaRatingReply, rhs: Api_CafeteriaRatingReply) -> Bool { + static func ==(lhs: Api_CafeteriaRatingReply, rhs: Api_CafeteriaRatingReply) -> Bool { if lhs.rating != rhs.rating {return false} if lhs.avg != rhs.avg {return false} if lhs.std != rhs.std {return false} @@ -2634,8 +2749,8 @@ extension Api_CafeteriaRatingReply: SwiftProtobuf.Message, SwiftProtobuf._Messag } extension Api_DishRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".DishRatingReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".DishRatingReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "rating"), 2: .same(proto: "avg"), 3: .same(proto: "std"), @@ -2645,7 +2760,7 @@ extension Api_DishRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl 7: .same(proto: "nameTags"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2663,7 +2778,7 @@ extension Api_DishRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.rating.isEmpty { try visitor.visitRepeatedMessageField(value: self.rating, fieldNumber: 1) } @@ -2688,7 +2803,7 @@ extension Api_DishRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_DishRatingReply, rhs: Api_DishRatingReply) -> Bool { + static func ==(lhs: Api_DishRatingReply, rhs: Api_DishRatingReply) -> Bool { if lhs.rating != rhs.rating {return false} if lhs.avg != rhs.avg {return false} if lhs.std != rhs.std {return false} @@ -2702,8 +2817,8 @@ extension Api_DishRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl } extension Api_SingleRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".SingleRatingReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".SingleRatingReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "points"), 2: .same(proto: "image"), 3: .same(proto: "comment"), @@ -2711,7 +2826,7 @@ extension Api_SingleRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageIm 5: .same(proto: "visited"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2727,7 +2842,7 @@ extension Api_SingleRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every if/case branch local when no optimizations // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and @@ -2750,7 +2865,7 @@ extension Api_SingleRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageIm try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_SingleRatingReply, rhs: Api_SingleRatingReply) -> Bool { + static func ==(lhs: Api_SingleRatingReply, rhs: Api_SingleRatingReply) -> Bool { if lhs.points != rhs.points {return false} if lhs.image != rhs.image {return false} if lhs.comment != rhs.comment {return false} @@ -2762,8 +2877,8 @@ extension Api_SingleRatingReply: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } extension Api_NewCafeteriaRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".NewCafeteriaRatingRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".NewCafeteriaRatingRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "points"), 2: .same(proto: "cafeteriaId"), 3: .same(proto: "image"), @@ -2771,7 +2886,7 @@ extension Api_NewCafeteriaRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._M 6: .same(proto: "comment"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2787,7 +2902,7 @@ extension Api_NewCafeteriaRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._M } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.points != 0 { try visitor.visitSingularInt32Field(value: self.points, fieldNumber: 1) } @@ -2806,7 +2921,7 @@ extension Api_NewCafeteriaRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._M try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_NewCafeteriaRatingRequest, rhs: Api_NewCafeteriaRatingRequest) -> Bool { + static func ==(lhs: Api_NewCafeteriaRatingRequest, rhs: Api_NewCafeteriaRatingRequest) -> Bool { if lhs.points != rhs.points {return false} if lhs.cafeteriaID != rhs.cafeteriaID {return false} if lhs.image != rhs.image {return false} @@ -2818,8 +2933,8 @@ extension Api_NewCafeteriaRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._M } extension Api_NewDishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".NewDishRatingRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".NewDishRatingRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "points"), 2: .same(proto: "cafeteriaId"), 3: .same(proto: "dish"), @@ -2828,7 +2943,7 @@ extension Api_NewDishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._Messag 7: .same(proto: "comment"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2845,7 +2960,7 @@ extension Api_NewDishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._Messag } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.points != 0 { try visitor.visitSingularInt32Field(value: self.points, fieldNumber: 1) } @@ -2867,7 +2982,7 @@ extension Api_NewDishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._Messag try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_NewDishRatingRequest, rhs: Api_NewDishRatingRequest) -> Bool { + static func ==(lhs: Api_NewDishRatingRequest, rhs: Api_NewDishRatingRequest) -> Bool { if lhs.points != rhs.points {return false} if lhs.cafeteriaID != rhs.cafeteriaID {return false} if lhs.dish != rhs.dish {return false} @@ -2880,12 +2995,12 @@ extension Api_NewDishRatingRequest: SwiftProtobuf.Message, SwiftProtobuf._Messag } extension Api_GetTagsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetTagsReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetTagsReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "ratingTags"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2897,14 +3012,14 @@ extension Api_GetTagsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.ratingTags.isEmpty { try visitor.visitRepeatedMessageField(value: self.ratingTags, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetTagsReply, rhs: Api_GetTagsReply) -> Bool { + static func ==(lhs: Api_GetTagsReply, rhs: Api_GetTagsReply) -> Bool { if lhs.ratingTags != rhs.ratingTags {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -2912,14 +3027,14 @@ extension Api_GetTagsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme } extension Api_TagsOverview: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".TagsOverview" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".TagsOverview" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "tagId"), 2: .same(proto: "de"), 3: .same(proto: "en"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2933,7 +3048,7 @@ extension Api_TagsOverview: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.tagID != 0 { try visitor.visitSingularInt32Field(value: self.tagID, fieldNumber: 1) } @@ -2946,7 +3061,7 @@ extension Api_TagsOverview: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_TagsOverview, rhs: Api_TagsOverview) -> Bool { + static func ==(lhs: Api_TagsOverview, rhs: Api_TagsOverview) -> Bool { if lhs.tagID != rhs.tagID {return false} if lhs.de != rhs.de {return false} if lhs.en != rhs.en {return false} @@ -2956,13 +3071,13 @@ extension Api_TagsOverview: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme } extension Api_RatingTag: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".RatingTag" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".RatingTag" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "tagId"), 2: .same(proto: "points"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -2975,7 +3090,7 @@ extension Api_RatingTag: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.tagID != 0 { try visitor.visitSingularInt32Field(value: self.tagID, fieldNumber: 1) } @@ -2985,7 +3100,7 @@ extension Api_RatingTag: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_RatingTag, rhs: Api_RatingTag) -> Bool { + static func ==(lhs: Api_RatingTag, rhs: Api_RatingTag) -> Bool { if lhs.tagID != rhs.tagID {return false} if lhs.points != rhs.points {return false} if lhs.unknownFields != rhs.unknownFields {return false} @@ -2994,13 +3109,13 @@ extension Api_RatingTag: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa } extension Api_RatingTagNewRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".RatingTagNewRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".RatingTagNewRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "tagId"), 2: .same(proto: "points"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3013,7 +3128,7 @@ extension Api_RatingTagNewRequest: SwiftProtobuf.Message, SwiftProtobuf._Message } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.tagID != 0 { try visitor.visitSingularInt32Field(value: self.tagID, fieldNumber: 1) } @@ -3023,7 +3138,7 @@ extension Api_RatingTagNewRequest: SwiftProtobuf.Message, SwiftProtobuf._Message try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_RatingTagNewRequest, rhs: Api_RatingTagNewRequest) -> Bool { + static func ==(lhs: Api_RatingTagNewRequest, rhs: Api_RatingTagNewRequest) -> Bool { if lhs.tagID != rhs.tagID {return false} if lhs.points != rhs.points {return false} if lhs.unknownFields != rhs.unknownFields {return false} @@ -3032,8 +3147,8 @@ extension Api_RatingTagNewRequest: SwiftProtobuf.Message, SwiftProtobuf._Message } extension Api_RatingTagResult: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".RatingTagResult" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".RatingTagResult" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "tagId"), 2: .same(proto: "avg"), 3: .same(proto: "std"), @@ -3041,7 +3156,7 @@ extension Api_RatingTagResult: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl 5: .same(proto: "max"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3057,7 +3172,7 @@ extension Api_RatingTagResult: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.tagID != 0 { try visitor.visitSingularInt32Field(value: self.tagID, fieldNumber: 1) } @@ -3076,7 +3191,7 @@ extension Api_RatingTagResult: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_RatingTagResult, rhs: Api_RatingTagResult) -> Bool { + static func ==(lhs: Api_RatingTagResult, rhs: Api_RatingTagResult) -> Bool { if lhs.tagID != rhs.tagID {return false} if lhs.avg != rhs.avg {return false} if lhs.std != rhs.std {return false} @@ -3088,12 +3203,12 @@ extension Api_RatingTagResult: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl } extension Api_GetCafeteriaReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetCafeteriaReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetCafeteriaReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "cafeteria"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3105,14 +3220,14 @@ extension Api_GetCafeteriaReply: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.cafeteria.isEmpty { try visitor.visitRepeatedMessageField(value: self.cafeteria, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetCafeteriaReply, rhs: Api_GetCafeteriaReply) -> Bool { + static func ==(lhs: Api_GetCafeteriaReply, rhs: Api_GetCafeteriaReply) -> Bool { if lhs.cafeteria != rhs.cafeteria {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3120,15 +3235,15 @@ extension Api_GetCafeteriaReply: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } extension Api_Cafeteria: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".Cafeteria" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".Cafeteria" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "id"), 2: .same(proto: "address"), 3: .same(proto: "longitude"), 4: .same(proto: "latitude"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3143,7 +3258,7 @@ extension Api_Cafeteria: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.id.isEmpty { try visitor.visitSingularStringField(value: self.id, fieldNumber: 1) } @@ -3159,7 +3274,7 @@ extension Api_Cafeteria: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_Cafeteria, rhs: Api_Cafeteria) -> Bool { + static func ==(lhs: Api_Cafeteria, rhs: Api_Cafeteria) -> Bool { if lhs.id != rhs.id {return false} if lhs.address != rhs.address {return false} if lhs.longitude != rhs.longitude {return false} @@ -3170,15 +3285,15 @@ extension Api_Cafeteria: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa } extension Api_GetDishesRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetDishesRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetDishesRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "cafeteriaId"), 2: .same(proto: "year"), 3: .same(proto: "week"), 4: .same(proto: "day"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3193,7 +3308,7 @@ extension Api_GetDishesRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImp } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.cafeteriaID.isEmpty { try visitor.visitSingularStringField(value: self.cafeteriaID, fieldNumber: 1) } @@ -3209,7 +3324,7 @@ extension Api_GetDishesRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImp try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetDishesRequest, rhs: Api_GetDishesRequest) -> Bool { + static func ==(lhs: Api_GetDishesRequest, rhs: Api_GetDishesRequest) -> Bool { if lhs.cafeteriaID != rhs.cafeteriaID {return false} if lhs.year != rhs.year {return false} if lhs.week != rhs.week {return false} @@ -3220,12 +3335,12 @@ extension Api_GetDishesRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImp } extension Api_GetDishesReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetDishesReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetDishesReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "dish"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3237,14 +3352,14 @@ extension Api_GetDishesReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImple } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.dish.isEmpty { try visitor.visitRepeatedStringField(value: self.dish, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetDishesReply, rhs: Api_GetDishesReply) -> Bool { + static func ==(lhs: Api_GetDishesReply, rhs: Api_GetDishesReply) -> Bool { if lhs.dish != rhs.dish {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3252,12 +3367,12 @@ extension Api_GetDishesReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImple } extension Api_GetResponsiblePersonReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetResponsiblePersonReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetResponsiblePersonReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "responsiblePerson"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3269,14 +3384,14 @@ extension Api_GetResponsiblePersonReply: SwiftProtobuf.Message, SwiftProtobuf._M } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.responsiblePerson.isEmpty { try visitor.visitRepeatedMessageField(value: self.responsiblePerson, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetResponsiblePersonReply, rhs: Api_GetResponsiblePersonReply) -> Bool { + static func ==(lhs: Api_GetResponsiblePersonReply, rhs: Api_GetResponsiblePersonReply) -> Bool { if lhs.responsiblePerson != rhs.responsiblePerson {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3284,8 +3399,8 @@ extension Api_GetResponsiblePersonReply: SwiftProtobuf.Message, SwiftProtobuf._M } extension Api_ResponsiblePersonElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".ResponsiblePersonElement" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".ResponsiblePersonElement" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "name"), 2: .same(proto: "telephone"), 3: .same(proto: "email"), @@ -3293,7 +3408,7 @@ extension Api_ResponsiblePersonElement: SwiftProtobuf.Message, SwiftProtobuf._Me 5: .same(proto: "tumID"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3309,7 +3424,7 @@ extension Api_ResponsiblePersonElement: SwiftProtobuf.Message, SwiftProtobuf._Me } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.name.isEmpty { try visitor.visitSingularStringField(value: self.name, fieldNumber: 1) } @@ -3328,7 +3443,7 @@ extension Api_ResponsiblePersonElement: SwiftProtobuf.Message, SwiftProtobuf._Me try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_ResponsiblePersonElement, rhs: Api_ResponsiblePersonElement) -> Bool { + static func ==(lhs: Api_ResponsiblePersonElement, rhs: Api_ResponsiblePersonElement) -> Bool { if lhs.name != rhs.name {return false} if lhs.telephone != rhs.telephone {return false} if lhs.email != rhs.email {return false} @@ -3340,12 +3455,12 @@ extension Api_ResponsiblePersonElement: SwiftProtobuf.Message, SwiftProtobuf._Me } extension Api_GetBuilding2GpsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetBuilding2GpsReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetBuilding2GpsReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "building2Gps"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3357,14 +3472,14 @@ extension Api_GetBuilding2GpsReply: SwiftProtobuf.Message, SwiftProtobuf._Messag } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.building2Gps.isEmpty { try visitor.visitRepeatedMessageField(value: self.building2Gps, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetBuilding2GpsReply, rhs: Api_GetBuilding2GpsReply) -> Bool { + static func ==(lhs: Api_GetBuilding2GpsReply, rhs: Api_GetBuilding2GpsReply) -> Bool { if lhs.building2Gps != rhs.building2Gps {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3372,14 +3487,14 @@ extension Api_GetBuilding2GpsReply: SwiftProtobuf.Message, SwiftProtobuf._Messag } extension Api_Building2GpsElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".Building2GpsElement" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".Building2GpsElement" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "id"), 2: .same(proto: "latitude"), 3: .same(proto: "longitude"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3393,7 +3508,7 @@ extension Api_Building2GpsElement: SwiftProtobuf.Message, SwiftProtobuf._Message } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.id.isEmpty { try visitor.visitSingularStringField(value: self.id, fieldNumber: 1) } @@ -3406,7 +3521,7 @@ extension Api_Building2GpsElement: SwiftProtobuf.Message, SwiftProtobuf._Message try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_Building2GpsElement, rhs: Api_Building2GpsElement) -> Bool { + static func ==(lhs: Api_Building2GpsElement, rhs: Api_Building2GpsElement) -> Bool { if lhs.id != rhs.id {return false} if lhs.latitude != rhs.latitude {return false} if lhs.longitude != rhs.longitude {return false} @@ -3416,12 +3531,12 @@ extension Api_Building2GpsElement: SwiftProtobuf.Message, SwiftProtobuf._Message } extension Api_GetAreaFacilitiesByBuildingNrReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetAreaFacilitiesByBuildingNrReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetAreaFacilitiesByBuildingNrReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "areaFacilitiesByBuildingNr"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3433,14 +3548,14 @@ extension Api_GetAreaFacilitiesByBuildingNrReply: SwiftProtobuf.Message, SwiftPr } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.areaFacilitiesByBuildingNr.isEmpty { try visitor.visitRepeatedMessageField(value: self.areaFacilitiesByBuildingNr, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetAreaFacilitiesByBuildingNrReply, rhs: Api_GetAreaFacilitiesByBuildingNrReply) -> Bool { + static func ==(lhs: Api_GetAreaFacilitiesByBuildingNrReply, rhs: Api_GetAreaFacilitiesByBuildingNrReply) -> Bool { if lhs.areaFacilitiesByBuildingNr != rhs.areaFacilitiesByBuildingNr {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3448,12 +3563,12 @@ extension Api_GetAreaFacilitiesByBuildingNrReply: SwiftProtobuf.Message, SwiftPr } extension Api_GetAreaFacilitiesByBuildingNrRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetAreaFacilitiesByBuildingNrRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetAreaFacilitiesByBuildingNrRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .standard(proto: "building_nr"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3465,14 +3580,14 @@ extension Api_GetAreaFacilitiesByBuildingNrRequest: SwiftProtobuf.Message, Swift } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.buildingNr.isEmpty { try visitor.visitSingularStringField(value: self.buildingNr, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetAreaFacilitiesByBuildingNrRequest, rhs: Api_GetAreaFacilitiesByBuildingNrRequest) -> Bool { + static func ==(lhs: Api_GetAreaFacilitiesByBuildingNrRequest, rhs: Api_GetAreaFacilitiesByBuildingNrRequest) -> Bool { if lhs.buildingNr != rhs.buildingNr {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3480,12 +3595,12 @@ extension Api_GetAreaFacilitiesByBuildingNrRequest: SwiftProtobuf.Message, Swift } extension Api_GetListOfToiletsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetListOfToiletsReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetListOfToiletsReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "listOfToilets"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3497,14 +3612,14 @@ extension Api_GetListOfToiletsReply: SwiftProtobuf.Message, SwiftProtobuf._Messa } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.listOfToilets.isEmpty { try visitor.visitRepeatedMessageField(value: self.listOfToilets, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetListOfToiletsReply, rhs: Api_GetListOfToiletsReply) -> Bool { + static func ==(lhs: Api_GetListOfToiletsReply, rhs: Api_GetListOfToiletsReply) -> Bool { if lhs.listOfToilets != rhs.listOfToilets {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3512,8 +3627,8 @@ extension Api_GetListOfToiletsReply: SwiftProtobuf.Message, SwiftProtobuf._Messa } extension Api_RoomInformationElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".RoomInformationElement" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".RoomInformationElement" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "roomId"), 2: .standard(proto: "room_code"), 3: .standard(proto: "building_nr"), @@ -3525,7 +3640,7 @@ extension Api_RoomInformationElement: SwiftProtobuf.Message, SwiftProtobuf._Mess 9: .same(proto: "name"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3545,7 +3660,7 @@ extension Api_RoomInformationElement: SwiftProtobuf.Message, SwiftProtobuf._Mess } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.roomID != 0 { try visitor.visitSingularInt32Field(value: self.roomID, fieldNumber: 1) } @@ -3576,7 +3691,7 @@ extension Api_RoomInformationElement: SwiftProtobuf.Message, SwiftProtobuf._Mess try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_RoomInformationElement, rhs: Api_RoomInformationElement) -> Bool { + static func ==(lhs: Api_RoomInformationElement, rhs: Api_RoomInformationElement) -> Bool { if lhs.roomID != rhs.roomID {return false} if lhs.roomCode != rhs.roomCode {return false} if lhs.buildingNr != rhs.buildingNr {return false} @@ -3592,12 +3707,12 @@ extension Api_RoomInformationElement: SwiftProtobuf.Message, SwiftProtobuf._Mess } extension Api_GetListOfElevatorsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetListOfElevatorsReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetListOfElevatorsReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "listOfElevators"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3609,14 +3724,14 @@ extension Api_GetListOfElevatorsReply: SwiftProtobuf.Message, SwiftProtobuf._Mes } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.listOfElevators.isEmpty { try visitor.visitRepeatedMessageField(value: self.listOfElevators, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetListOfElevatorsReply, rhs: Api_GetListOfElevatorsReply) -> Bool { + static func ==(lhs: Api_GetListOfElevatorsReply, rhs: Api_GetListOfElevatorsReply) -> Bool { if lhs.listOfElevators != rhs.listOfElevators {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3624,12 +3739,12 @@ extension Api_GetListOfElevatorsReply: SwiftProtobuf.Message, SwiftProtobuf._Mes } extension Api_GetMoreInformationReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetMoreInformationReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetMoreInformationReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "information"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3641,14 +3756,14 @@ extension Api_GetMoreInformationReply: SwiftProtobuf.Message, SwiftProtobuf._Mes } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.information.isEmpty { try visitor.visitRepeatedMessageField(value: self.information, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetMoreInformationReply, rhs: Api_GetMoreInformationReply) -> Bool { + static func ==(lhs: Api_GetMoreInformationReply, rhs: Api_GetMoreInformationReply) -> Bool { if lhs.information != rhs.information {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3656,14 +3771,14 @@ extension Api_GetMoreInformationReply: SwiftProtobuf.Message, SwiftProtobuf._Mes } extension Api_MoreInformationElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".MoreInformationElement" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".MoreInformationElement" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "title"), 2: .same(proto: "category"), 3: .same(proto: "url"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3677,7 +3792,7 @@ extension Api_MoreInformationElement: SwiftProtobuf.Message, SwiftProtobuf._Mess } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.title.isEmpty { try visitor.visitSingularStringField(value: self.title, fieldNumber: 1) } @@ -3690,7 +3805,7 @@ extension Api_MoreInformationElement: SwiftProtobuf.Message, SwiftProtobuf._Mess try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_MoreInformationElement, rhs: Api_MoreInformationElement) -> Bool { + static func ==(lhs: Api_MoreInformationElement, rhs: Api_MoreInformationElement) -> Bool { if lhs.title != rhs.title {return false} if lhs.category != rhs.category {return false} if lhs.url != rhs.url {return false} @@ -3700,12 +3815,12 @@ extension Api_MoreInformationElement: SwiftProtobuf.Message, SwiftProtobuf._Mess } extension Api_GetOpeningTimesRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetOpeningTimesRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetOpeningTimesRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "language"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3717,14 +3832,14 @@ extension Api_GetOpeningTimesRequest: SwiftProtobuf.Message, SwiftProtobuf._Mess } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.language.isEmpty { try visitor.visitSingularStringField(value: self.language, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetOpeningTimesRequest, rhs: Api_GetOpeningTimesRequest) -> Bool { + static func ==(lhs: Api_GetOpeningTimesRequest, rhs: Api_GetOpeningTimesRequest) -> Bool { if lhs.language != rhs.language {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3732,12 +3847,12 @@ extension Api_GetOpeningTimesRequest: SwiftProtobuf.Message, SwiftProtobuf._Mess } extension Api_GetOpeningTimesReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetOpeningTimesReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetOpeningTimesReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "facilities"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3749,14 +3864,14 @@ extension Api_GetOpeningTimesReply: SwiftProtobuf.Message, SwiftProtobuf._Messag } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.facilities.isEmpty { try visitor.visitRepeatedMessageField(value: self.facilities, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetOpeningTimesReply, rhs: Api_GetOpeningTimesReply) -> Bool { + static func ==(lhs: Api_GetOpeningTimesReply, rhs: Api_GetOpeningTimesReply) -> Bool { if lhs.facilities != rhs.facilities {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3764,8 +3879,8 @@ extension Api_GetOpeningTimesReply: SwiftProtobuf.Message, SwiftProtobuf._Messag } extension Api_OpeningTimesMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".OpeningTimesMsgElement" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".OpeningTimesMsgElement" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "id"), 2: .same(proto: "category"), 3: .same(proto: "name"), @@ -3779,7 +3894,7 @@ extension Api_OpeningTimesMsgElement: SwiftProtobuf.Message, SwiftProtobuf._Mess 11: .standard(proto: "reference_id"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3801,7 +3916,7 @@ extension Api_OpeningTimesMsgElement: SwiftProtobuf.Message, SwiftProtobuf._Mess } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.id != 0 { try visitor.visitSingularInt32Field(value: self.id, fieldNumber: 1) } @@ -3838,7 +3953,7 @@ extension Api_OpeningTimesMsgElement: SwiftProtobuf.Message, SwiftProtobuf._Mess try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_OpeningTimesMsgElement, rhs: Api_OpeningTimesMsgElement) -> Bool { + static func ==(lhs: Api_OpeningTimesMsgElement, rhs: Api_OpeningTimesMsgElement) -> Bool { if lhs.id != rhs.id {return false} if lhs.category != rhs.category {return false} if lhs.name != rhs.name {return false} @@ -3856,12 +3971,12 @@ extension Api_OpeningTimesMsgElement: SwiftProtobuf.Message, SwiftProtobuf._Mess } extension Api_GetUpdateNoteRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetUpdateNoteRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetUpdateNoteRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "version"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3873,14 +3988,14 @@ extension Api_GetUpdateNoteRequest: SwiftProtobuf.Message, SwiftProtobuf._Messag } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.version != 0 { try visitor.visitSingularInt32Field(value: self.version, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetUpdateNoteRequest, rhs: Api_GetUpdateNoteRequest) -> Bool { + static func ==(lhs: Api_GetUpdateNoteRequest, rhs: Api_GetUpdateNoteRequest) -> Bool { if lhs.version != rhs.version {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3888,12 +4003,12 @@ extension Api_GetUpdateNoteRequest: SwiftProtobuf.Message, SwiftProtobuf._Messag } extension Api_GetUpdateNoteReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetUpdateNoteReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetUpdateNoteReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "message"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3905,14 +4020,14 @@ extension Api_GetUpdateNoteReply: SwiftProtobuf.Message, SwiftProtobuf._MessageI } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.message.isEmpty { try visitor.visitSingularStringField(value: self.message, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetUpdateNoteReply, rhs: Api_GetUpdateNoteReply) -> Bool { + static func ==(lhs: Api_GetUpdateNoteReply, rhs: Api_GetUpdateNoteReply) -> Bool { if lhs.message != rhs.message {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3920,12 +4035,12 @@ extension Api_GetUpdateNoteReply: SwiftProtobuf.Message, SwiftProtobuf._MessageI } extension Api_GetStudyRoomListReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetStudyRoomListReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetStudyRoomListReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "rooms"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3937,14 +4052,14 @@ extension Api_GetStudyRoomListReply: SwiftProtobuf.Message, SwiftProtobuf._Messa } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.rooms.isEmpty { try visitor.visitRepeatedMessageField(value: self.rooms, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetStudyRoomListReply, rhs: Api_GetStudyRoomListReply) -> Bool { + static func ==(lhs: Api_GetStudyRoomListReply, rhs: Api_GetStudyRoomListReply) -> Bool { if lhs.rooms != rhs.rooms {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -3952,15 +4067,15 @@ extension Api_GetStudyRoomListReply: SwiftProtobuf.Message, SwiftProtobuf._Messa } extension Api_StudyRoomMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".StudyRoomMsgElement" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".StudyRoomMsgElement" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "id"), 2: .same(proto: "name"), 3: .same(proto: "details"), 4: .same(proto: "rooms"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -3975,7 +4090,7 @@ extension Api_StudyRoomMsgElement: SwiftProtobuf.Message, SwiftProtobuf._Message } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.id != 0 { try visitor.visitSingularInt32Field(value: self.id, fieldNumber: 1) } @@ -3991,7 +4106,7 @@ extension Api_StudyRoomMsgElement: SwiftProtobuf.Message, SwiftProtobuf._Message try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_StudyRoomMsgElement, rhs: Api_StudyRoomMsgElement) -> Bool { + static func ==(lhs: Api_StudyRoomMsgElement, rhs: Api_StudyRoomMsgElement) -> Bool { if lhs.id != rhs.id {return false} if lhs.name != rhs.name {return false} if lhs.details != rhs.details {return false} @@ -4002,8 +4117,8 @@ extension Api_StudyRoomMsgElement: SwiftProtobuf.Message, SwiftProtobuf._Message } extension Api_StudyRoom: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".StudyRoom" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".StudyRoom" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .standard(proto: "group_id"), 2: .same(proto: "roomId"), 3: .standard(proto: "room_code"), @@ -4011,7 +4126,7 @@ extension Api_StudyRoom: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa 5: .standard(proto: "building_name"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4027,7 +4142,7 @@ extension Api_StudyRoom: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.groupID != 0 { try visitor.visitSingularInt32Field(value: self.groupID, fieldNumber: 1) } @@ -4046,7 +4161,7 @@ extension Api_StudyRoom: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_StudyRoom, rhs: Api_StudyRoom) -> Bool { + static func ==(lhs: Api_StudyRoom, rhs: Api_StudyRoom) -> Bool { if lhs.groupID != rhs.groupID {return false} if lhs.roomID != rhs.roomID {return false} if lhs.roomCode != rhs.roomCode {return false} @@ -4058,12 +4173,12 @@ extension Api_StudyRoom: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa } extension Api_GetEventListRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetEventListRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetEventListRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "eventId"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4075,14 +4190,14 @@ extension Api_GetEventListRequest: SwiftProtobuf.Message, SwiftProtobuf._Message } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.eventID != 0 { try visitor.visitSingularInt32Field(value: self.eventID, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetEventListRequest, rhs: Api_GetEventListRequest) -> Bool { + static func ==(lhs: Api_GetEventListRequest, rhs: Api_GetEventListRequest) -> Bool { if lhs.eventID != rhs.eventID {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -4090,12 +4205,12 @@ extension Api_GetEventListRequest: SwiftProtobuf.Message, SwiftProtobuf._Message } extension Api_GetEventListReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetEventListReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetEventListReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "events"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4107,14 +4222,14 @@ extension Api_GetEventListReply: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.events.isEmpty { try visitor.visitRepeatedMessageField(value: self.events, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetEventListReply, rhs: Api_GetEventListReply) -> Bool { + static func ==(lhs: Api_GetEventListReply, rhs: Api_GetEventListReply) -> Bool { if lhs.events != rhs.events {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -4122,8 +4237,8 @@ extension Api_GetEventListReply: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } extension Api_EventListMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".EventListMsgElement" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".EventListMsgElement" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "name"), 2: .same(proto: "path"), 3: .same(proto: "event"), @@ -4139,7 +4254,7 @@ extension Api_EventListMsgElement: SwiftProtobuf.Message, SwiftProtobuf._Message 13: .standard(proto: "ticket_group"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4163,7 +4278,7 @@ extension Api_EventListMsgElement: SwiftProtobuf.Message, SwiftProtobuf._Message } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every if/case branch local when no optimizations // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and @@ -4210,7 +4325,7 @@ extension Api_EventListMsgElement: SwiftProtobuf.Message, SwiftProtobuf._Message try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_EventListMsgElement, rhs: Api_EventListMsgElement) -> Bool { + static func ==(lhs: Api_EventListMsgElement, rhs: Api_EventListMsgElement) -> Bool { if lhs.name != rhs.name {return false} if lhs.path != rhs.path {return false} if lhs.event != rhs.event {return false} @@ -4230,12 +4345,12 @@ extension Api_EventListMsgElement: SwiftProtobuf.Message, SwiftProtobuf._Message } extension Api_GetKinoRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetKinoRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetKinoRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "lastId"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4247,14 +4362,14 @@ extension Api_GetKinoRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImple } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.lastID != 0 { try visitor.visitSingularInt32Field(value: self.lastID, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetKinoRequest, rhs: Api_GetKinoRequest) -> Bool { + static func ==(lhs: Api_GetKinoRequest, rhs: Api_GetKinoRequest) -> Bool { if lhs.lastID != rhs.lastID {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -4262,12 +4377,12 @@ extension Api_GetKinoRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImple } extension Api_GetKinoReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetKinoReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetKinoReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "kinos"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4279,14 +4394,14 @@ extension Api_GetKinoReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.kinos.isEmpty { try visitor.visitRepeatedMessageField(value: self.kinos, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetKinoReply, rhs: Api_GetKinoReply) -> Bool { + static func ==(lhs: Api_GetKinoReply, rhs: Api_GetKinoReply) -> Bool { if lhs.kinos != rhs.kinos {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -4294,8 +4409,8 @@ extension Api_GetKinoReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme } extension Api_KinoMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".KinoMsgElement" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".KinoMsgElement" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "name"), 2: .same(proto: "path"), 3: .same(proto: "kino"), @@ -4363,7 +4478,7 @@ extension Api_KinoMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImple return _storage } - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { _ = _uniqueStorage() try withExtendedLifetime(_storage) { (_storage: _StorageClass) in while let fieldNumber = try decoder.nextFieldNumber() { @@ -4393,7 +4508,7 @@ extension Api_KinoMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImple } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { try withExtendedLifetime(_storage) { (_storage: _StorageClass) in // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every if/case branch local when no optimizations @@ -4451,7 +4566,7 @@ extension Api_KinoMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImple try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_KinoMsgElement, rhs: Api_KinoMsgElement) -> Bool { + static func ==(lhs: Api_KinoMsgElement, rhs: Api_KinoMsgElement) -> Bool { if lhs._storage !== rhs._storage { let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in let _storage = _args.0 @@ -4482,8 +4597,8 @@ extension Api_KinoMsgElement: SwiftProtobuf.Message, SwiftProtobuf._MessageImple } extension Api_SendFeedbackRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".SendFeedbackRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".SendFeedbackRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "topic"), 2: .same(proto: "email"), 3: .same(proto: "emailId"), @@ -4495,7 +4610,7 @@ extension Api_SendFeedbackRequest: SwiftProtobuf.Message, SwiftProtobuf._Message 9: .same(proto: "appVersion"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4515,7 +4630,7 @@ extension Api_SendFeedbackRequest: SwiftProtobuf.Message, SwiftProtobuf._Message } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.topic.isEmpty { try visitor.visitSingularStringField(value: self.topic, fieldNumber: 1) } @@ -4546,7 +4661,7 @@ extension Api_SendFeedbackRequest: SwiftProtobuf.Message, SwiftProtobuf._Message try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_SendFeedbackRequest, rhs: Api_SendFeedbackRequest) -> Bool { + static func ==(lhs: Api_SendFeedbackRequest, rhs: Api_SendFeedbackRequest) -> Bool { if lhs.topic != rhs.topic {return false} if lhs.email != rhs.email {return false} if lhs.emailID != rhs.emailID {return false} @@ -4562,12 +4677,12 @@ extension Api_SendFeedbackRequest: SwiftProtobuf.Message, SwiftProtobuf._Message } extension Api_SendFeedbackImageReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".SendFeedbackImageReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".SendFeedbackImageReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "status"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4579,14 +4694,14 @@ extension Api_SendFeedbackImageReply: SwiftProtobuf.Message, SwiftProtobuf._Mess } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.status.isEmpty { try visitor.visitSingularStringField(value: self.status, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_SendFeedbackImageReply, rhs: Api_SendFeedbackImageReply) -> Bool { + static func ==(lhs: Api_SendFeedbackImageReply, rhs: Api_SendFeedbackImageReply) -> Bool { if lhs.status != rhs.status {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -4594,13 +4709,13 @@ extension Api_SendFeedbackImageReply: SwiftProtobuf.Message, SwiftProtobuf._Mess } extension Api_SendFeedbackImageRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".SendFeedbackImageRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".SendFeedbackImageRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "id"), 2: .same(proto: "imageNr"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4613,7 +4728,7 @@ extension Api_SendFeedbackImageRequest: SwiftProtobuf.Message, SwiftProtobuf._Me } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.id != 0 { try visitor.visitSingularInt32Field(value: self.id, fieldNumber: 1) } @@ -4623,7 +4738,7 @@ extension Api_SendFeedbackImageRequest: SwiftProtobuf.Message, SwiftProtobuf._Me try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_SendFeedbackImageRequest, rhs: Api_SendFeedbackImageRequest) -> Bool { + static func ==(lhs: Api_SendFeedbackImageRequest, rhs: Api_SendFeedbackImageRequest) -> Bool { if lhs.id != rhs.id {return false} if lhs.imageNr != rhs.imageNr {return false} if lhs.unknownFields != rhs.unknownFields {return false} @@ -4632,12 +4747,12 @@ extension Api_SendFeedbackImageRequest: SwiftProtobuf.Message, SwiftProtobuf._Me } extension Api_GetMembersRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetMembersRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetMembersRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "lrzId"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4649,14 +4764,14 @@ extension Api_GetMembersRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.lrzID.isEmpty { try visitor.visitSingularStringField(value: self.lrzID, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetMembersRequest, rhs: Api_GetMembersRequest) -> Bool { + static func ==(lhs: Api_GetMembersRequest, rhs: Api_GetMembersRequest) -> Bool { if lhs.lrzID != rhs.lrzID {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -4664,14 +4779,14 @@ extension Api_GetMembersRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageIm } extension Api_GetMembersReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetMembersReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetMembersReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "lrzId"), 2: .same(proto: "name"), 3: .same(proto: "memberId"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4685,7 +4800,7 @@ extension Api_GetMembersReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.lrzID.isEmpty { try visitor.visitSingularStringField(value: self.lrzID, fieldNumber: 1) } @@ -4698,7 +4813,7 @@ extension Api_GetMembersReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetMembersReply, rhs: Api_GetMembersReply) -> Bool { + static func ==(lhs: Api_GetMembersReply, rhs: Api_GetMembersReply) -> Bool { if lhs.lrzID != rhs.lrzID {return false} if lhs.name != rhs.name {return false} if lhs.memberID != rhs.memberID {return false} @@ -4707,45 +4822,13 @@ extension Api_GetMembersReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl } } -extension Api_TUMCabeStatus: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".TUMCabeStatus" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .same(proto: "status"), - ] - - public mutating func decodeMessage(decoder: inout D) throws { - while let fieldNumber = try decoder.nextFieldNumber() { - // The use of inline closures is to circumvent an issue where the compiler - // allocates stack space for every case branch when no optimizations are - // enabled. https://github.com/apple/swift-protobuf/issues/1034 - switch fieldNumber { - case 1: try { try decoder.decodeSingularStringField(value: &self.status) }() - default: break - } - } - } - - public func traverse(visitor: inout V) throws { - if !self.status.isEmpty { - try visitor.visitSingularStringField(value: self.status, fieldNumber: 1) - } - try unknownFields.traverse(visitor: &visitor) - } - - public static func ==(lhs: Api_TUMCabeStatus, rhs: Api_TUMCabeStatus) -> Bool { - if lhs.status != rhs.status {return false} - if lhs.unknownFields != rhs.unknownFields {return false} - return true - } -} - extension Api_GetUploadStatusRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetUploadStatusRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetUploadStatusRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "lrzId"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4757,14 +4840,14 @@ extension Api_GetUploadStatusRequest: SwiftProtobuf.Message, SwiftProtobuf._Mess } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.lrzID.isEmpty { try visitor.visitSingularStringField(value: self.lrzID, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetUploadStatusRequest, rhs: Api_GetUploadStatusRequest) -> Bool { + static func ==(lhs: Api_GetUploadStatusRequest, rhs: Api_GetUploadStatusRequest) -> Bool { if lhs.lrzID != rhs.lrzID {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -4772,8 +4855,8 @@ extension Api_GetUploadStatusRequest: SwiftProtobuf.Message, SwiftProtobuf._Mess } extension Api_GetUploadStatusReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetUploadStatusReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetUploadStatusReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .standard(proto: "fcm_token"), 2: .standard(proto: "public_key"), 3: .standard(proto: "student_id"), @@ -4781,7 +4864,7 @@ extension Api_GetUploadStatusReply: SwiftProtobuf.Message, SwiftProtobuf._Messag 5: .standard(proto: "external_id"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4797,7 +4880,7 @@ extension Api_GetUploadStatusReply: SwiftProtobuf.Message, SwiftProtobuf._Messag } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.fcmToken.isEmpty { try visitor.visitSingularStringField(value: self.fcmToken, fieldNumber: 1) } @@ -4816,7 +4899,7 @@ extension Api_GetUploadStatusReply: SwiftProtobuf.Message, SwiftProtobuf._Messag try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetUploadStatusReply, rhs: Api_GetUploadStatusReply) -> Bool { + static func ==(lhs: Api_GetUploadStatusReply, rhs: Api_GetUploadStatusReply) -> Bool { if lhs.fcmToken != rhs.fcmToken {return false} if lhs.publicKey != rhs.publicKey {return false} if lhs.studentID != rhs.studentID {return false} @@ -4828,8 +4911,8 @@ extension Api_GetUploadStatusReply: SwiftProtobuf.Message, SwiftProtobuf._Messag } extension Api_GetNotificationsReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetNotificationsReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetNotificationsReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "notificationId"), 2: .same(proto: "type"), 3: .same(proto: "title"), @@ -4837,7 +4920,7 @@ extension Api_GetNotificationsReply: SwiftProtobuf.Message, SwiftProtobuf._Messa 5: .same(proto: "signature"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4853,7 +4936,7 @@ extension Api_GetNotificationsReply: SwiftProtobuf.Message, SwiftProtobuf._Messa } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.notificationID != 0 { try visitor.visitSingularInt32Field(value: self.notificationID, fieldNumber: 1) } @@ -4872,7 +4955,7 @@ extension Api_GetNotificationsReply: SwiftProtobuf.Message, SwiftProtobuf._Messa try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetNotificationsReply, rhs: Api_GetNotificationsReply) -> Bool { + static func ==(lhs: Api_GetNotificationsReply, rhs: Api_GetNotificationsReply) -> Bool { if lhs.notificationID != rhs.notificationID {return false} if lhs.type != rhs.type {return false} if lhs.title != rhs.title {return false} @@ -4884,12 +4967,12 @@ extension Api_GetNotificationsReply: SwiftProtobuf.Message, SwiftProtobuf._Messa } extension Api_NotificationsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".NotificationsRequest" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".NotificationsRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "notificationId"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4901,14 +4984,14 @@ extension Api_NotificationsRequest: SwiftProtobuf.Message, SwiftProtobuf._Messag } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if self.notificationID != 0 { try visitor.visitSingularInt32Field(value: self.notificationID, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_NotificationsRequest, rhs: Api_NotificationsRequest) -> Bool { + static func ==(lhs: Api_NotificationsRequest, rhs: Api_NotificationsRequest) -> Bool { if lhs.notificationID != rhs.notificationID {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -4916,12 +4999,12 @@ extension Api_NotificationsRequest: SwiftProtobuf.Message, SwiftProtobuf._Messag } extension Api_GetNotificationsConfirmReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let protoMessageName: String = _protobuf_package + ".GetNotificationsConfirmReply" - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let protoMessageName: String = _protobuf_package + ".GetNotificationsConfirmReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "status"), ] - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { // The use of inline closures is to circumvent an issue where the compiler // allocates stack space for every case branch when no optimizations are @@ -4933,17 +5016,102 @@ extension Api_GetNotificationsConfirmReply: SwiftProtobuf.Message, SwiftProtobuf } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.status.isEmpty { try visitor.visitSingularStringField(value: self.status, fieldNumber: 1) } try unknownFields.traverse(visitor: &visitor) } - public static func ==(lhs: Api_GetNotificationsConfirmReply, rhs: Api_GetNotificationsConfirmReply) -> Bool { + static func ==(lhs: Api_GetNotificationsConfirmReply, rhs: Api_GetNotificationsConfirmReply) -> Bool { if lhs.status != rhs.status {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } } +extension Api_GetCanteenHeadCountRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".GetCanteenHeadCountRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "canteenId"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.canteenID) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.canteenID.isEmpty { + try visitor.visitSingularStringField(value: self.canteenID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Api_GetCanteenHeadCountRequest, rhs: Api_GetCanteenHeadCountRequest) -> Bool { + if lhs.canteenID != rhs.canteenID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Api_GetCanteenHeadCountReply: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".GetCanteenHeadCountReply" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "count"), + 2: .same(proto: "maxCount"), + 3: .same(proto: "percent"), + 4: .same(proto: "timestamp"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.count) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.maxCount) }() + case 3: try { try decoder.decodeSingularFloatField(value: &self.percent) }() + case 4: try { try decoder.decodeSingularMessageField(value: &self._timestamp) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + if self.count != 0 { + try visitor.visitSingularUInt32Field(value: self.count, fieldNumber: 1) + } + if self.maxCount != 0 { + try visitor.visitSingularUInt32Field(value: self.maxCount, fieldNumber: 2) + } + if self.percent != 0 { + try visitor.visitSingularFloatField(value: self.percent, fieldNumber: 3) + } + try { if let v = self._timestamp { + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + } }() + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Api_GetCanteenHeadCountReply, rhs: Api_GetCanteenHeadCountReply) -> Bool { + if lhs.count != rhs.count {return false} + if lhs.maxCount != rhs.maxCount {return false} + if lhs.percent != rhs.percent {return false} + if lhs._timestamp != rhs._timestamp {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} From 296db994a59ef263c1c0524d2fbb431d8d8a9cc8 Mon Sep 17 00:00:00 2001 From: Anton Wyrowski Date: Wed, 25 Jan 2023 10:57:55 +0100 Subject: [PATCH 04/14] integrated notification extension to decrypt notifications before displaying them --- Campus-iOS/Campus-iOS.entitlements | 8 + NotificationService/Info.plist | 13 ++ .../NotificationService.entitlements | 14 ++ NotificationService/NotificationService.swift | 141 ++++++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 NotificationService/Info.plist create mode 100644 NotificationService/NotificationService.entitlements create mode 100644 NotificationService/NotificationService.swift diff --git a/Campus-iOS/Campus-iOS.entitlements b/Campus-iOS/Campus-iOS.entitlements index 5e138e78..2cbc780f 100644 --- a/Campus-iOS/Campus-iOS.entitlements +++ b/Campus-iOS/Campus-iOS.entitlements @@ -6,7 +6,15 @@ development com.apple.developer.aps-environment development + com.apple.security.application-groups + + group.de.tum.tca.notificationserviceextension + com.apple.security.personal-information.location + keychain-access-groups + + $(AppIdentifierPrefix)de.tum.tca.notificationextension + diff --git a/NotificationService/Info.plist b/NotificationService/Info.plist new file mode 100644 index 00000000..57421ebf --- /dev/null +++ b/NotificationService/Info.plist @@ -0,0 +1,13 @@ + + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.usernotifications.service + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).NotificationService + + + diff --git a/NotificationService/NotificationService.entitlements b/NotificationService/NotificationService.entitlements new file mode 100644 index 00000000..d098bdce --- /dev/null +++ b/NotificationService/NotificationService.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.network.client + + keychain-access-groups + + $(AppIdentifierPrefix)de.tum.tca.notificationextension + + + diff --git a/NotificationService/NotificationService.swift b/NotificationService/NotificationService.swift new file mode 100644 index 00000000..02f27f93 --- /dev/null +++ b/NotificationService/NotificationService.swift @@ -0,0 +1,141 @@ +// +// NotificationService.swift +// NotificationService +// +// Created by Anton Wyrowski on 13.12.22. +// + +import UserNotifications + +enum RSAKeyPairError: Error { + case failedObtainingPrivateKeyFromKeyChain + case failedObtainingStringRepresentationOfPrivateKey +} + + +class NotificationService: UNNotificationServiceExtension { + + var contentHandler: ((UNNotificationContent) -> Void)? + var bestAttemptContent: UNMutableNotificationContent? + + private static let privateKeyApplicationTag = "de.tum.tca.keys.push_public_key" + private static let keychainAccessGroupName = "2J3C6P6X3N.de.tum.tca.notificationextension" + + private var privateKeyKeychainQuery: [String: Any] = [ + kSecClass as String: kSecClassKey, + kSecAttrKeyClass as String: kSecAttrKeyClassPrivate, + kSecAttrKeyType as String: kSecAttrKeyTypeRSA, + kSecAttrKeySizeInBits as String: 2048, + kSecAttrApplicationTag as String: privateKeyApplicationTag, + kSecReturnRef as String: true, + kSecAttrAccessGroup as String: NotificationService.keychainAccessGroupName + ] + + override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { + self.contentHandler = contentHandler + bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) + + + if let bestAttemptContent = bestAttemptContent { + + let exists = checkIfPrivateKeyAlreadyExists() + + func shouldNotHappen(_ error: String = "") { + bestAttemptContent.title = "Encrypted Notification Payloud 🚨" + bestAttemptContent.subtitle = "Message our support if that happens again." + bestAttemptContent.body = error + + contentHandler(bestAttemptContent) + } + + if !exists { + return shouldNotHappen("Encryption key does not exist in KeyChain") + } + + do { + let privateKey = try obtainRawPrivateKeyFromKeyChain() + + if bestAttemptContent.title != "" { + let plainText = decrypt(cypherText: bestAttemptContent.title, privateKey: privateKey) + + bestAttemptContent.title = plainText ?? "Decryption Error" + } + + if bestAttemptContent.subtitle != "" { + let plainText = decrypt(cypherText: bestAttemptContent.subtitle, privateKey: privateKey) + + bestAttemptContent.subtitle = plainText ?? "Decryption Error" + } + + if bestAttemptContent.body != "" { + let plainText = decrypt(cypherText: bestAttemptContent.body, privateKey: privateKey) + + bestAttemptContent.body = plainText ?? "Decryption Error" + } + + contentHandler(bestAttemptContent) + } catch { + shouldNotHappen("Something went wrong decrypting the push notification content. Error: \(error)") + } + } + } + + override func serviceExtensionTimeWillExpire() { + // Called just before the extension will be terminated by the system. + // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. + if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { + contentHandler(bestAttemptContent) + } + } + + private func decrypt(cypherText: String, privateKey: SecKey) -> String? { + let cipherData = Data(base64Encoded: cypherText)! as CFData + + var error: Unmanaged? + let plaintext = SecKeyCreateDecryptedData(privateKey, .rsaEncryptionOAEPSHA256, cipherData, &error) + + guard plaintext != nil else { + return nil + } + + let data: NSData = plaintext! + + return String(data: data as Data, encoding: .utf8) + } + + private func checkIfPrivateKeyAlreadyExists() -> Bool { + do { + let _ = try obtainPrivateKeyFromKeyChain() + } catch { + return false + } + + return true + } + + private func obtainRawPrivateKeyFromKeyChain() throws -> SecKey { + var item: CFTypeRef? + let status = SecItemCopyMatching(privateKeyKeychainQuery as CFDictionary, &item) + + guard status == errSecSuccess && item != nil else { + throw RSAKeyPairError.failedObtainingPrivateKeyFromKeyChain + } + + return item as! SecKey + } + + + private func obtainPrivateKeyFromKeyChain() throws -> String { + let privateKey = try obtainRawPrivateKeyFromKeyChain() + + var error: Unmanaged? + guard let privateERData = SecKeyCopyExternalRepresentation(privateKey, &error) else { + throw RSAKeyPairError.failedObtainingStringRepresentationOfPrivateKey + } + + let privateData: Data = privateERData as Data + + return privateData.base64EncodedString() + } + +} From 01c6660ebf337bd18aa5f72d99176540ef1b2241 Mon Sep 17 00:00:00 2001 From: Anton Wyrowski Date: Wed, 25 Jan 2023 11:00:25 +0100 Subject: [PATCH 05/14] Integrated background notification handling --- Campus-iOS.xcodeproj/project.pbxproj | 182 ++++++++++- Campus-iOS/AppDelegate.swift | 15 + .../CryptoExportImportManager.swift | 287 ++++++++++++++++++ .../PushNotifications/PushNotifications.swift | 193 +++++++++++- 4 files changed, 663 insertions(+), 14 deletions(-) create mode 100644 Campus-iOS/PushNotifications/CryptoExportImportManager.swift diff --git a/Campus-iOS.xcodeproj/project.pbxproj b/Campus-iOS.xcodeproj/project.pbxproj index 49c44d50..bcd7c092 100644 --- a/Campus-iOS.xcodeproj/project.pbxproj +++ b/Campus-iOS.xcodeproj/project.pbxproj @@ -255,16 +255,20 @@ 97997AE7277234120079F809 /* XMLCoder in Frameworks */ = {isa = PBXBuildFile; productRef = 97997AE6277234120079F809 /* XMLCoder */; }; 97C9AB1227732A200097B10C /* SwiftUICharts in Frameworks */ = {isa = PBXBuildFile; productRef = 97C9AB1127732A200097B10C /* SwiftUICharts */; }; 97F8A79327E641570099EE83 /* AcademicDegree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97F8A79227E641570099EE83 /* AcademicDegree.swift */; }; + 99438F012950770400766197 /* CampusService.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99438EFF2950770400766197 /* CampusService.pb.swift */; }; + 99438F022950770400766197 /* CampusService.grpc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99438F002950770400766197 /* CampusService.grpc.swift */; }; 9958318029361F6F00F25E11 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9958317F29361F6F00F25E11 /* AppDelegate.swift */; }; 99583183293621A200F25E11 /* PushNotifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99583182293621A200F25E11 /* PushNotifications.swift */; }; - 9958318529362F9A00F25E11 /* CampusBackend.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9958318429362F9A00F25E11 /* CampusBackend.pb.swift */; }; 9958318829362FCE00F25E11 /* SwiftProtobuf in Frameworks */ = {isa = PBXBuildFile; productRef = 9958318729362FCE00F25E11 /* SwiftProtobuf */; }; 9958318A29362FCE00F25E11 /* SwiftProtobufPluginLibrary in Frameworks */ = {isa = PBXBuildFile; productRef = 9958318929362FCE00F25E11 /* SwiftProtobufPluginLibrary */; }; - 9958318C2936319900F25E11 /* CampusBackend.grpc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9958318B2936319900F25E11 /* CampusBackend.grpc.swift */; }; 9958318F2936336900F25E11 /* CGRPCZlib in Frameworks */ = {isa = PBXBuildFile; productRef = 9958318E2936336900F25E11 /* CGRPCZlib */; }; 995831912936336900F25E11 /* GRPC in Frameworks */ = {isa = PBXBuildFile; productRef = 995831902936336900F25E11 /* GRPC */; }; 995831932936336900F25E11 /* protoc-gen-grpc-swift in Frameworks */ = {isa = PBXBuildFile; productRef = 995831922936336900F25E11 /* protoc-gen-grpc-swift */; }; 995831952936469100F25E11 /* CampusBackend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 995831942936469000F25E11 /* CampusBackend.swift */; }; + 9973857C29490EFE00B1AE34 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9973857B29490EFE00B1AE34 /* NotificationService.swift */; }; + 9973858029490EFE00B1AE34 /* NotificationService.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 9973857929490EFE00B1AE34 /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 997385862949324F00B1AE34 /* CryptoExportImportManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997385852949324F00B1AE34 /* CryptoExportImportManager.swift */; }; + 997385872949324F00B1AE34 /* CryptoExportImportManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997385852949324F00B1AE34 /* CryptoExportImportManager.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -282,8 +286,29 @@ remoteGlobalIDString = 366F0E7F27580CFB0091651D; remoteInfo = "Campus-iOS"; }; + 9973857E29490EFE00B1AE34 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 366F0E7827580CFB0091651D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9973857829490EFE00B1AE34; + remoteInfo = NotificationService; + }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 997385742949004E00B1AE34 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 9973858029490EFE00B1AE34 /* NotificationService.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 08038F95287430FB0048DAE5 /* WidgetTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetTitleView.swift; sourceTree = ""; }; 0805DB7628C7F3E600712FF2 /* AnalyticsOptInView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsOptInView.swift; sourceTree = ""; }; @@ -527,11 +552,16 @@ 97270F5927AB2A4900BB25E4 /* Array+Rearrange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+Rearrange.swift"; sourceTree = ""; }; 974D5B9927E5E9CB00FD7B11 /* GlowBorder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlowBorder.swift; sourceTree = ""; }; 97F8A79227E641570099EE83 /* AcademicDegree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcademicDegree.swift; sourceTree = ""; }; + 99438EFF2950770400766197 /* CampusService.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CampusService.pb.swift; sourceTree = ""; }; + 99438F002950770400766197 /* CampusService.grpc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CampusService.grpc.swift; sourceTree = ""; }; 9958317F29361F6F00F25E11 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 99583182293621A200F25E11 /* PushNotifications.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushNotifications.swift; sourceTree = ""; }; - 9958318429362F9A00F25E11 /* CampusBackend.pb.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampusBackend.pb.swift; sourceTree = ""; }; - 9958318B2936319900F25E11 /* CampusBackend.grpc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampusBackend.grpc.swift; sourceTree = ""; }; 995831942936469000F25E11 /* CampusBackend.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampusBackend.swift; sourceTree = ""; }; + 9973857929490EFE00B1AE34 /* NotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 9973857B29490EFE00B1AE34 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; + 9973857D29490EFE00B1AE34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9973858129490EFE00B1AE34 /* NotificationService.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NotificationService.entitlements; sourceTree = ""; }; + 997385852949324F00B1AE34 /* CryptoExportImportManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CryptoExportImportManager.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -572,6 +602,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9973857629490EFE00B1AE34 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -1085,6 +1122,7 @@ 366F0E8227580CFB0091651D /* Campus-iOS */, 366F0E9827580CFD0091651D /* Campus-iOSTests */, 366F0EA227580CFD0091651D /* Campus-iOSUITests */, + 9973857A29490EFE00B1AE34 /* NotificationService */, 366F0E8127580CFB0091651D /* Products */, 1FFEF086284E417E00ADD201 /* Recovered References */, ); @@ -1096,6 +1134,7 @@ 366F0E8027580CFB0091651D /* Campus-iOS.app */, 366F0E9527580CFD0091651D /* Campus-iOSTests.xctest */, 366F0E9F27580CFD0091651D /* Campus-iOSUITests.xctest */, + 9973857929490EFE00B1AE34 /* NotificationService.appex */, ); name = Products; sourceTree = ""; @@ -1219,8 +1258,8 @@ 36AF61C127A2FD7700FEBD98 /* TUMOnlineAPI.swift */, 36AF61C227A2FD7700FEBD98 /* Cache.swift */, 36AF61C327A2FD7700FEBD98 /* TUMCabeAPI.swift */, - 9958318429362F9A00F25E11 /* CampusBackend.pb.swift */, - 9958318B2936319900F25E11 /* CampusBackend.grpc.swift */, + 99438F002950770400766197 /* CampusService.grpc.swift */, + 99438EFF2950770400766197 /* CampusService.pb.swift */, 995831942936469000F25E11 /* CampusBackend.swift */, ); path = Networking; @@ -1543,10 +1582,21 @@ isa = PBXGroup; children = ( 99583182293621A200F25E11 /* PushNotifications.swift */, + 997385852949324F00B1AE34 /* CryptoExportImportManager.swift */, ); path = PushNotifications; sourceTree = ""; }; + 9973857A29490EFE00B1AE34 /* NotificationService */ = { + isa = PBXGroup; + children = ( + 9973858129490EFE00B1AE34 /* NotificationService.entitlements */, + 9973857B29490EFE00B1AE34 /* NotificationService.swift */, + 9973857D29490EFE00B1AE34 /* Info.plist */, + ); + path = NotificationService; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1557,10 +1607,12 @@ 366F0E7C27580CFB0091651D /* Sources */, 366F0E7D27580CFB0091651D /* Frameworks */, 366F0E7E27580CFB0091651D /* Resources */, + 997385742949004E00B1AE34 /* Embed Foundation Extensions */, ); buildRules = ( ); dependencies = ( + 9973857F29490EFE00B1AE34 /* PBXTargetDependency */, ); name = "Campus-iOS"; packageProductDependencies = ( @@ -1621,6 +1673,23 @@ productReference = 366F0E9F27580CFD0091651D /* Campus-iOSUITests.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; + 9973857829490EFE00B1AE34 /* NotificationService */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9973858229490EFE00B1AE34 /* Build configuration list for PBXNativeTarget "NotificationService" */; + buildPhases = ( + 9973857529490EFE00B1AE34 /* Sources */, + 9973857629490EFE00B1AE34 /* Frameworks */, + 9973857729490EFE00B1AE34 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = NotificationService; + productName = NotificationService; + productReference = 9973857929490EFE00B1AE34 /* NotificationService.appex */; + productType = "com.apple.product-type.app-extension"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -1628,7 +1697,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1310; + LastSwiftUpdateCheck = 1410; LastUpgradeCheck = 1320; TargetAttributes = { 366F0E7F27580CFB0091651D = { @@ -1642,6 +1711,9 @@ CreatedOnToolsVersion = 13.1; TestTargetID = 366F0E7F27580CFB0091651D; }; + 9973857829490EFE00B1AE34 = { + CreatedOnToolsVersion = 14.1; + }; }; }; buildConfigurationList = 366F0E7B27580CFB0091651D /* Build configuration list for PBXProject "Campus-iOS" */; @@ -1674,6 +1746,7 @@ 366F0E7F27580CFB0091651D /* Campus-iOS */, 366F0E9427580CFD0091651D /* Campus-iOSTests */, 366F0E9E27580CFD0091651D /* Campus-iOSUITests */, + 9973857829490EFE00B1AE34 /* NotificationService */, ); }; /* End PBXProject section */ @@ -1719,6 +1792,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9973857729490EFE00B1AE34 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1781,7 +1861,6 @@ 36C70FB128538A190097416E /* PanelContentCafeteriasListView.swift in Sources */, 36BB6F7D27B356C200F224AB /* PersonDetailedCellView.swift in Sources */, 36108BE727A304B5007DC62D /* MenuViewModel.swift in Sources */, - 9958318C2936319900F25E11 /* CampusBackend.grpc.swift in Sources */, 36AF61E127A2FD7800FEBD98 /* TUMCabeAPI.swift in Sources */, 3654F37D2851710E008AD5DC /* RoomFinderDetailsMapImagesView.swift in Sources */, 36108BB627A3046B007DC62D /* LectureDetailsViewModel+State.swift in Sources */, @@ -1806,6 +1885,7 @@ 36108BBA27A3046B007DC62D /* LectureDetailsScreen.swift in Sources */, 99583183293621A200F25E11 /* PushNotifications.swift in Sources */, 36203E8D2761C6EC00C24658 /* Credentials.swift in Sources */, + 99438F022950770400766197 /* CampusService.grpc.swift in Sources */, 08573BA7287B6152006AC06F /* GradeWidgetView.swift in Sources */, 0805E72228CA9DF5003C5CFD /* AppUsageData.swift in Sources */, 08FAFD1E288DEDD3006A0E27 /* WidgetRecommenderStrategy.swift in Sources */, @@ -1834,7 +1914,6 @@ 3654F364285168D2008AD5DC /* MapImagesHorizontalScrollingView.swift in Sources */, 36E964A5277493D90055777F /* CalendarViewModel.swift in Sources */, 0805E72428CAABB3003C5CFD /* AnalyticsError.swift in Sources */, - 9958318529362F9A00F25E11 /* CampusBackend.pb.swift in Sources */, 3654F361285168D2008AD5DC /* StudyRoomGroup.swift in Sources */, 36BB6F7927B26DE300F224AB /* TuitionView.swift in Sources */, 3654F3782851710E008AD5DC /* FoundRoom.swift in Sources */, @@ -1861,11 +1940,13 @@ 36BB6F7527B1D87200F224AB /* Tuition.swift in Sources */, 3616C4CD279020A0000A1BC9 /* TUMSexyView.swift in Sources */, 1F4C836728300E79006971C0 /* CafeteriasService.swift in Sources */, + 997385862949324F00B1AE34 /* CryptoExportImportManager.swift in Sources */, 36108C1E27A307FA007DC62D /* BarChartView.swift in Sources */, 3654F368285169AC008AD5DC /* TUMDevAppAPI.swift in Sources */, 3683C31A2758118A00082930 /* MockModel.swift in Sources */, 08DFB9812867ACB600E357DF /* StudyRoomWidgetViewModel.swift in Sources */, 3629BA3327A1E4A90036AC80 /* RoundedCornersShape.swift in Sources */, + 99438F012950770400766197 /* CampusService.pb.swift in Sources */, 1F2068E228FD73C400DBDF67 /* TokenPermissionsViewModel+State.swift in Sources */, 3654F37C2851710E008AD5DC /* RoomFinderView.swift in Sources */, 36BBE72F27989F8C0018FD3F /* SFSafariViewWrapper.swift in Sources */, @@ -1966,6 +2047,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9973857529490EFE00B1AE34 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9973857C29490EFE00B1AE34 /* NotificationService.swift in Sources */, + 997385872949324F00B1AE34 /* CryptoExportImportManager.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -1979,6 +2069,11 @@ target = 366F0E7F27580CFB0091651D /* Campus-iOS */; targetProxy = 366F0EA027580CFD0091651D /* PBXContainerItemProxy */; }; + 9973857F29490EFE00B1AE34 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9973857829490EFE00B1AE34 /* NotificationService */; + targetProxy = 9973857E29490EFE00B1AE34 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -2118,6 +2213,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 0805E72D28CC2462003C5CFD /* Secrets.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; @@ -2162,6 +2258,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 0805E72D28CC2462003C5CFD /* Secrets.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; @@ -2297,6 +2394,64 @@ }; name = Release; }; + 9973858329490EFE00B1AE34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 2J3C6P6X3N; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = NotificationService/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NotificationService; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 16.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = de.tum.tca.NotificationService; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 9973858429490EFE00B1AE34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_ENTITLEMENTS = NotificationService/NotificationService.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 2J3C6P6X3N; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = NotificationService/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NotificationService; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 16.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = de.tum.tca.NotificationService; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -2336,6 +2491,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 9973858229490EFE00B1AE34 /* Build configuration list for PBXNativeTarget "NotificationService" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9973858329490EFE00B1AE34 /* Debug */, + 9973858429490EFE00B1AE34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ diff --git a/Campus-iOS/AppDelegate.swift b/Campus-iOS/AppDelegate.swift index 5b6c427b..d983388e 100644 --- a/Campus-iOS/AppDelegate.swift +++ b/Campus-iOS/AppDelegate.swift @@ -40,5 +40,20 @@ class AppDelegate: NSObject, UIApplicationDelegate { print("Permission granted: \(granted)") } } + + func application( + _ application: UIApplication, + didReceiveRemoteNotification userInfo: [AnyHashable : Any], + fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void + ) { + Task { + do { + try await PushNotifications.shared.handleBackgroundNotification(data: userInfo) + completionHandler(.noData) + } catch { + completionHandler(.failed) + } + } + } } diff --git a/Campus-iOS/PushNotifications/CryptoExportImportManager.swift b/Campus-iOS/PushNotifications/CryptoExportImportManager.swift new file mode 100644 index 00000000..4b3cbd10 --- /dev/null +++ b/Campus-iOS/PushNotifications/CryptoExportImportManager.swift @@ -0,0 +1,287 @@ +// +// CryptoExportImportManager +// CryptoExportImportManager +// +// Created by Ignacio Nieto Carvajal on 6/10/15. +// Copyright © 2015 Ignacio Nieto Carvajal. All rights reserved. +// +import UIKit + +/* +EC keys: http://www.opensource.apple.com/source/security_certtool/security_certtool-55103/src/dumpasn1.cfg +EC param 1 +OID = 06 07 2A 86 48 CE 3D 02 01 +Comment = ANSI X9.62 public key type +Description = ecPublicKey (1 2 840 10045 2 1) +EC param 2 +OID = 06 08 2A 86 48 CE 3D 03 01 07 +Comment = ANSI X9.62 named elliptic curve +Description = ansiX9p256r1 (1 2 840 10045 3 1 7) +OID = 06 05 2B 81 04 00 22 +Comment = SECG (Certicom) named elliptic curve +Description = secp384r1 (1 3 132 0 34) +OID = 06 05 2B 81 04 00 23 +Comment = SECG (Certicom) named elliptic curve +Description = secp521r1 (1 3 132 0 35) +EC params sequence: public key + curve 256r1 +30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 86 48 CE 3D 03 01 07 +*/ + +// SECP256R1 EC public key header (length + EC params (sequence) + bitstring +private let kCryptoExportImportManagerSecp256r1CurveLen = 256 +private let kCryptoExportImportManagerSecp256r1header: [UInt8] = [0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00] +private let kCryptoExportImportManagerSecp256r1headerLen = 26 + +private let kCryptoExportImportManagerSecp384r1CurveLen = 384 +private let kCryptoExportImportManagerSecp384r1header: [UInt8] = [0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00] +private let kCryptoExportImportManagerSecp384r1headerLen = 23 + +private let kCryptoExportImportManagerSecp521r1CurveLen = 521 +private let kCryptoExportImportManagerSecp521r1header: [UInt8] = [0x30, 0x81, 0x9B, 0x30, 0x10, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x23, 0x03, 0x81, 0x86, 0x00] +private let kCryptoExportImportManagerSecp521r1headerLen = 25 + +/* +RSA keys: http://www.opensource.apple.com/source/security_certtool/security_certtool-55103/src/dumpasn1.cfg +OID = 06 09 2A 86 48 86 F7 0D 01 01 01 +Comment = PKCS #1 +Description = rsaEncryption (1 2 840 113549 1 1 1) +NULL byte: 05 00 +*/ + +// RSA OID header +private let kCryptoExportImportManagerRSAOIDHeader: [UInt8] = [0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00] +private let kCryptoExportImportManagerRSAOIDHeaderLength = 15 + +// ASN.1 encoding parameters. +private let kCryptoExportImportManagerASNHeaderSequenceMark: UInt8 = 48 // 0x30 +private let kCryptoExportImportManagerASNHeaderIntegerMark: UInt8 = 02 // 0x32 +private let kCryptoExportImportManagerASNHeaderBitstringMark: UInt8 = 03 //0x03 +private let kCryptoExportImportManagerASNHeaderNullMark: UInt8 = 05 //0x05 +private let kCryptoExportImportManagerASNHeaderRSAEncryptionObjectMark: UInt8 = 06 //0x06 +private let kCryptoExportImportManagerExtendedLengthMark: UInt8 = 128 // 0x80 +private let kCryptoExportImportManagerASNHeaderLengthForRSA = 15 + +// PEM encoding constants +private let kCryptoExportImportManagerPublicKeyInitialTag = "-----BEGIN PUBLIC KEY-----\n" +private let kCryptoExportImportManagerPublicKeyFinalTag = "-----END PUBLIC KEY-----" +private let kCryptoExportImportManagerPublicNumberOfCharactersInALine = 64 + +/** + * This class exists due to the easy and intuitive way of using public keys generated outside iOS in + * the Security framework and CommonCrypto tools (yes, I'm being sarcastic here). + * CryptoCertificateImportManager is in charge of importing a certificate and obtaining a valid key + * reference to use in any of SecKey operations (SecKeyEncrypt, SecKeyRawVerify...). + * As far as I know, any other way of importing and using public keys from the outside is not + * advised: https://devforums.apple.com/message/301532#301532 + */ +class CryptoExportImportManager: NSObject { + // MARK: - Import methods. + + /** + * Extracts the public key from a X.509 certificate and returns a valid SecKeyRef that can be + * used in any of SecKey operations (SecKeyEncrypt, SecKeyRawVerify...). + * Receives the certificate data in DER format. + */ + func importPublicKeyReferenceFromDERCertificate(_ certData: Data) -> SecKey? { + // first we create the certificate reference + guard let certRef = SecCertificateCreateWithData(nil, certData as CFData) else { return nil } + print("Successfully generated a valid certificate reference from the data.") + + // now create a SecTrust structure from the certificate where to extract the key from + var secTrust: SecTrust? + let secTrustStatus = SecTrustCreateWithCertificates(certRef, nil, &secTrust) + print("Generating a SecTrust reference from the certificate: \(secTrustStatus)") + if secTrustStatus != errSecSuccess { return nil } + + // now evaluate the certificate. + var resultType: SecTrustResultType = SecTrustResultType(rawValue: UInt32(0))! // result will be ignored. + let evaluateStatus = SecTrustEvaluate(secTrust!, &resultType) + print("Evaluating the obtained SecTrust reference: \(evaluateStatus)") + if evaluateStatus != errSecSuccess { return nil } + + // lastly, once evaluated, we can export the public key from the certificate leaf. + let publicKeyRef = SecTrustCopyPublicKey(secTrust!) + print("Got public key reference: \(String(describing: publicKeyRef))") + return publicKeyRef + } + + // MARK: - Export methods. + + /** + * Exports a key retrieved from the keychain so it can be used outside iOS (i.e: in OpenSSL). + * Returns a DER representation of the key. + */ + func exportPublicKeyToDER(_ rawPublicKeyBytes: Data, keyType: String, keySize: Int) -> Data? { + if keyType == kSecAttrKeyTypeEC as String { + return exportECPublicKeyToDER(rawPublicKeyBytes, keyType: keyType, keySize: keySize) + } else if keyType == kSecAttrKeyTypeRSA as String { + return exportRSAPublicKeyToDER(rawPublicKeyBytes, keyType: keyType, keySize: keySize) + } + // unknown key type? return nil + return nil + } + + /** + * Exports a key retrieved from the keychain so it can be used outside iOS (i.e: in OpenSSL). + * Returns a PEM representation of the key. + */ + func exportPublicKeyToPEM(_ rawPublicKeyBytes: Data, keyType: String, keySize: Int) -> String? { + if keyType == kSecAttrKeyTypeEC as String { + return exportECPublicKeyToPEM(rawPublicKeyBytes, keyType: keyType, keySize: keySize) + } else if keyType == kSecAttrKeyTypeRSA as String { + return exportRSAPublicKeyToPEM(rawPublicKeyBytes, keyType: keyType, keySize: keySize) + } + // unknown key type? return nil + return nil + } + + /** + * This function prepares a RSA public key generated with Apple SecKeyGeneratePair to be exported + * and used outisde iOS, be it openSSL, PHP, Perl, whatever. By default Apple exports RSA public + * keys in a very raw format. If we want to use it on OpenSSL, PHP or almost anywhere outside iOS, we + * need to remove add the full PKCS#1 ASN.1 wrapping. Returns a DER representation of the key. + */ + func exportRSAPublicKeyToDER(_ rawPublicKeyBytes: Data, keyType: String, keySize: Int) -> Data { + // first we create the space for the ASN.1 header and decide about its length + let bitstringEncodingLength = bytesNeededForRepresentingInteger(rawPublicKeyBytes.count) + + // start building the ASN.1 header + var headerBuffer = [UInt8](repeating: 0, count: kCryptoExportImportManagerASNHeaderLengthForRSA); + headerBuffer[0] = kCryptoExportImportManagerASNHeaderSequenceMark; + + // total size (OID + encoding + key size) + 2 (marks) + let totalSize = kCryptoExportImportManagerRSAOIDHeaderLength + bitstringEncodingLength + rawPublicKeyBytes.count + 3 + let totalSizebitstringEncodingLength = encodeASN1LengthParameter(totalSize, buffer: &(headerBuffer[1])) + + // bitstring header + var keyLengthBytesEncoded = 0 + var bitstringBuffer = [UInt8](repeating: 0, count: kCryptoExportImportManagerASNHeaderLengthForRSA); + bitstringBuffer[0] = kCryptoExportImportManagerASNHeaderBitstringMark + keyLengthBytesEncoded = encodeASN1LengthParameter(rawPublicKeyBytes.count+1, buffer: &(bitstringBuffer[1])) + bitstringBuffer[keyLengthBytesEncoded + 1] = 0x00 + + // build DER key. + var derKey = Data(capacity: totalSize + totalSizebitstringEncodingLength) + derKey.append(headerBuffer, count: totalSizebitstringEncodingLength + 1) + derKey.append(kCryptoExportImportManagerRSAOIDHeader, count: kCryptoExportImportManagerRSAOIDHeaderLength) // Add OID header + derKey.append(bitstringBuffer, count: keyLengthBytesEncoded + 2) // 0x03 + key bitstring length + 0x00 + derKey.append(rawPublicKeyBytes) // public key raw data. + return derKey + } + + /** + * This function prepares a RSA public key generated with Apple SecKeyGeneratePair to be exported + * and used outisde iOS, be it openSSL, PHP, Perl, whatever. By default Apple exports RSA public + * keys in a very raw format. If we want to use it on OpenSSL, PHP or almost anywhere outside iOS, we + * need to remove add the full PKCS#1 ASN.1 wrapping. Returns a DER representation of the key. + */ + func exportRSAPublicKeyToPEM(_ rawPublicKeyBytes: Data, keyType: String, keySize: Int) -> String { + return PEMKeyFromDERKey(exportRSAPublicKeyToDER(rawPublicKeyBytes, keyType: keyType, keySize: keySize)) + } + + + /** + * Returns the number of bytes needed to represent an integer. + */ + func bytesNeededForRepresentingInteger(_ number: Int) -> Int { + if number <= 0 { return 0 } + var i = 1 + while (i < 8 && number >= (1 << (i * 8))) { i += 1 } + return i + } + + /** + * Generates an ASN.1 length sequence for the given length. Modifies the buffer parameter by + * writing the ASN.1 sequence. The memory of buffer must be initialized (i.e: from an NSData). + * Returns the number of bytes used to write the sequence. + */ + func encodeASN1LengthParameter(_ length: Int, buffer: UnsafeMutablePointer) -> Int { + if length < Int(kCryptoExportImportManagerExtendedLengthMark) { + buffer[0] = UInt8(length) + return 1 // just one byte was used, no need for length starting mark (0x80). + } else { + let extraBytes = bytesNeededForRepresentingInteger(length) + var currentLengthValue = length + + buffer[0] = kCryptoExportImportManagerExtendedLengthMark + UInt8(extraBytes) + for i in 0 ..< extraBytes { + buffer[extraBytes - i] = UInt8(currentLengthValue & 0xff) + currentLengthValue = currentLengthValue >> 8 + } + return extraBytes + 1 // 1 byte for the starting mark (0x80 + bytes used) + bytes used to encode length. + } + } + + + /** + * This function prepares a EC public key generated with Apple SecKeyGeneratePair to be exported + * and used outisde iOS, be it openSSL, PHP, Perl, whatever. It basically adds the proper ASN.1 + * header and codifies the result as valid base64 string, 64 characters split. + * Returns a DER representation of the key. + */ + func exportECPublicKeyToDER(_ rawPublicKeyBytes: Data, keyType: String, keySize: Int) -> Data { + print("Exporting EC raw key: \(rawPublicKeyBytes)") + // first retrieve the header with the OID for the proper key curve. + let curveOIDHeader: [UInt8] + let curveOIDHeaderLen: Int + switch (keySize) { + case kCryptoExportImportManagerSecp256r1CurveLen: + curveOIDHeader = kCryptoExportImportManagerSecp256r1header + curveOIDHeaderLen = kCryptoExportImportManagerSecp256r1headerLen + case kCryptoExportImportManagerSecp384r1CurveLen: + curveOIDHeader = kCryptoExportImportManagerSecp384r1header + curveOIDHeaderLen = kCryptoExportImportManagerSecp384r1headerLen + case kCryptoExportImportManagerSecp521r1CurveLen: + curveOIDHeader = kCryptoExportImportManagerSecp521r1header + curveOIDHeaderLen = kCryptoExportImportManagerSecp521r1headerLen + default: + curveOIDHeader = [] + curveOIDHeaderLen = 0 + } + var data = Data(bytes: curveOIDHeader, count: curveOIDHeaderLen) + + // now add the raw data from the retrieved public key + data.append(rawPublicKeyBytes) + return data + } + + /** + * This function prepares a EC public key generated with Apple SecKeyGeneratePair to be exported + * and used outisde iOS, be it openSSL, PHP, Perl, whatever. It basically adds the proper ASN.1 + * header and codifies the result as valid base64 string, 64 characters split. + * Returns a DER representation of the key. + */ + func exportECPublicKeyToPEM(_ rawPublicKeyBytes: Data, keyType: String, keySize: Int) -> String { + return PEMKeyFromDERKey(exportECPublicKeyToDER(rawPublicKeyBytes, keyType: keyType, keySize: keySize)) + } + + /** + * This method transforms a DER encoded key to PEM format. It gets a Base64 representation of + * the key and then splits this base64 string in 64 character chunks. Then it wraps it in + * BEGIN and END key tags. + */ + func PEMKeyFromDERKey(_ data: Data) -> String { + // base64 encode the result + let base64EncodedString = data.base64EncodedString(options: []) + + // split in lines of 64 characters. + var currentLine = "" + var resultString = kCryptoExportImportManagerPublicKeyInitialTag + var charCount = 0 + for character in base64EncodedString { + charCount += 1 + currentLine.append(character) + if charCount == kCryptoExportImportManagerPublicNumberOfCharactersInALine { + resultString += currentLine + "\n" + charCount = 0 + currentLine = "" + } + } + // final line (if any) + if currentLine.count > 0 { resultString += currentLine + "\n" } + // final tag + resultString += kCryptoExportImportManagerPublicKeyFinalTag + return resultString + } + +} diff --git a/Campus-iOS/PushNotifications/PushNotifications.swift b/Campus-iOS/PushNotifications/PushNotifications.swift index a1d926ab..d09d1a9e 100644 --- a/Campus-iOS/PushNotifications/PushNotifications.swift +++ b/Campus-iOS/PushNotifications/PushNotifications.swift @@ -6,24 +6,207 @@ // import Foundation +import KeychainAccess + +typealias RSAKeyPair = (privateKey: String, publicKey: String) + +enum RSAKeyPairError: Error { + case failedGeneratingPrivateKey + case failedObtainingKeyPairFromKeyChain + case failedObtainingPublicKeyFromPrivateKey + case failedObtainingStringRepresentationOfPrivateKey + case failedObtainingStringRepresentationOfPublicKey + case failedToExportPublicKey +} + +enum HandlePushDeviceRequestError: Error { + case noCampusToken + case noRequestId + case noNotificationType + case invalidNotificationType +} class PushNotifications { + private static let privateKeyApplicationTag = "de.tum.tca.keys.push_public_key" + private static let keychainAccessGroupName = "2J3C6P6X3N.de.tum.tca.notificationextension" + private static let keyType = kSecAttrKeyTypeRSA as String + private static let keySize = 2048 + private static let keychain = Keychain(service: "de.tum.campusapp") + .synchronizable(true) + .accessibility(.afterFirstUnlock) + static let shared = PushNotifications() func registerDeviceToken(_ deviceToken: String) async -> Void { print("Registering token \(deviceToken)") - let device: Api_RegisterIOSDeviceRequest = .with({ - $0.deviceID = deviceToken + do { + let keyPair = try getPublicPrivateKeys() + + let device: Api_RegisterDeviceRequest = .with({ + $0.deviceID = deviceToken + $0.publicKey = keyPair.publicKey + $0.deviceType = .ios + }) + + let response = try await CampusBackend.shared.registerDevice(device) + + } catch RSAKeyPairError.failedGeneratingPrivateKey { + print("Something went wrong while generating the rsa private key") + } catch RSAKeyPairError.failedObtainingKeyPairFromKeyChain { + print("Something went wrong while obtaining the rsa private key") + } catch { + print("Failed registering ios device token! \(error)") + } + + } + + func handleBackgroundNotification(data: [AnyHashable : Any]) async throws { + guard let requestId = data["request_id"] as? String else { + print("Failed responding to push device request because no 'request_id' was defined") + throw HandlePushDeviceRequestError.noRequestId + } + + guard let notificationType = data["notification_type"] as? String else { + print("Failed responding to push device request because no 'notification_type' was defined") + throw HandlePushDeviceRequestError.noNotificationType + } + + switch notificationType { + case "CAMPUS_TOKEN_REQUEST": + return try await handleCampusTokenRequest(requestId) + default: + print("Failed responding to push device request because 'notification_type' was invalid") + throw HandlePushDeviceRequestError.invalidNotificationType + } + } + + private func handleCampusTokenRequest(_ requestId: String) async throws { + print("---- Getting Campus Token ----") + + guard let campusToken = self.campusToken else { + print("Failed responding to push device request because no campus token was available") + throw HandlePushDeviceRequestError.noCampusToken + } + + print("---- Got Campus Token \(campusToken) ----") + + let response: Api_IOSDeviceRequestResponseRequest = .with({ + $0.payload = campusToken + $0.requestID = requestId }) + print("---- Setting Up Response \(response) ----") + + let res = try await CampusBackend.shared.iOSDeviceRequestResponse(response) + + print("---- Response Result: \(res) ----") + } + + private var campusToken: String? { + switch credentials { + case .none, .noTumID: + return nil + case .tumID(_, let token): + return token + case .tumIDAndKey(_, let token, _): + return token + } + } + + private var credentials: Credentials? { + guard let data = PushNotifications.keychain[data: "credentials"] else { return nil } + return try? PropertyListDecoder().decode(Credentials.self, from: data) + } + + private func getPublicPrivateKeys() throws -> RSAKeyPair { + if checkIfPrivateKeyAlreadyExists() { + return try obtainPublicPrivateKeyFromKeyChain() + } + + try generatePrivateKeys() + + return try obtainPublicPrivateKeyFromKeyChain() + } + + private func exportPublicKeyAsValidPEM(_ publicKey: Data) -> String { + let exportManager = CryptoExportImportManager() + + return exportManager.exportRSAPublicKeyToPEM(publicKey, keyType: PushNotifications.keyType, keySize: PushNotifications.keySize) + } + + private func generatePrivateKeys() throws { + let attributes: [String: Any] = [ + kSecAttrKeyType as String: kSecAttrKeyTypeEC, + kSecAttrKeySizeInBits as String: 2048, + kSecPrivateKeyAttrs as String: [ + kSecAttrIsPermanent as String: true, + kSecAttrApplicationTag as String: PushNotifications.privateKeyApplicationTag + ], + kSecAttrAccessGroup as String: PushNotifications.keychainAccessGroupName + ] + + var error: Unmanaged? + guard SecKeyCreateRandomKey(attributes as CFDictionary, &error) != nil else { + throw RSAKeyPairError.failedGeneratingPrivateKey + } + } + + private func checkIfPrivateKeyAlreadyExists() -> Bool { do { - print("Sending device id to server") - let _ = try await CampusBackend.shared.registerIOSDevice(device) + let _ = try obtainPrivateKeyFromKeyChain() } catch { - print("Failed registering ios device token!") + return false } + return true } + + private func obtainPrivateKeyFromKeyChain() throws -> SecKey { + var item: CFTypeRef? + let status = SecItemCopyMatching(privateKeyKeychainQuery as CFDictionary, &item) + + guard status == errSecSuccess && item != nil else { + throw RSAKeyPairError.failedObtainingKeyPairFromKeyChain + } + + return item as! SecKey + } + + + private func obtainPublicPrivateKeyFromKeyChain() throws -> RSAKeyPair { + let privateKey = try obtainPrivateKeyFromKeyChain() + + guard let publicKey = SecKeyCopyPublicKey(privateKey) else { + throw RSAKeyPairError.failedObtainingPublicKeyFromPrivateKey + } + + var error: Unmanaged? + guard let privateERData = SecKeyCopyExternalRepresentation(privateKey, &error) else { + throw RSAKeyPairError.failedObtainingStringRepresentationOfPrivateKey + } + + let privateData: Data = privateERData as Data + + guard let publicERData = SecKeyCopyExternalRepresentation(publicKey, &error) else { + throw RSAKeyPairError.failedObtainingStringRepresentationOfPublicKey + } + + let publicData: Data = publicERData as Data + + return (privateData.base64EncodedString(), exportPublicKeyAsValidPEM(publicData)) + } + + private var privateKeyKeychainQuery: [String: Any] = [ + kSecClass as String: kSecClassKey, + kSecAttrKeyClass as String: kSecAttrKeyClassPrivate, + kSecAttrKeyType as String: PushNotifications.keyType, + kSecAttrKeySizeInBits as String: PushNotifications.keySize, + kSecAttrApplicationTag as String: privateKeyApplicationTag, + kSecReturnRef as String: true, + kSecAttrAccessGroup as String: PushNotifications.keychainAccessGroupName + ] + + } From d1f2a7cb05c3ab3d16c5e50638b9b288e76796d0 Mon Sep 17 00:00:00 2001 From: Anton Wyrowski Date: Wed, 25 Jan 2023 11:02:39 +0100 Subject: [PATCH 06/14] cleaned up logging --- Campus-iOS/PushNotifications/PushNotifications.swift | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/Campus-iOS/PushNotifications/PushNotifications.swift b/Campus-iOS/PushNotifications/PushNotifications.swift index d09d1a9e..0dc979c5 100644 --- a/Campus-iOS/PushNotifications/PushNotifications.swift +++ b/Campus-iOS/PushNotifications/PushNotifications.swift @@ -39,8 +39,6 @@ class PushNotifications { static let shared = PushNotifications() func registerDeviceToken(_ deviceToken: String) async -> Void { - print("Registering token \(deviceToken)") - do { let keyPair = try getPublicPrivateKeys() @@ -51,7 +49,6 @@ class PushNotifications { }) let response = try await CampusBackend.shared.registerDevice(device) - } catch RSAKeyPairError.failedGeneratingPrivateKey { print("Something went wrong while generating the rsa private key") } catch RSAKeyPairError.failedObtainingKeyPairFromKeyChain { @@ -83,25 +80,17 @@ class PushNotifications { } private func handleCampusTokenRequest(_ requestId: String) async throws { - print("---- Getting Campus Token ----") - guard let campusToken = self.campusToken else { print("Failed responding to push device request because no campus token was available") throw HandlePushDeviceRequestError.noCampusToken } - print("---- Got Campus Token \(campusToken) ----") - let response: Api_IOSDeviceRequestResponseRequest = .with({ $0.payload = campusToken $0.requestID = requestId }) - print("---- Setting Up Response \(response) ----") - let res = try await CampusBackend.shared.iOSDeviceRequestResponse(response) - - print("---- Response Result: \(res) ----") } private var campusToken: String? { From 958344cdd36e461f438f2427aaf9184fdfd99b66 Mon Sep 17 00:00:00 2001 From: Anton Wyrowski Date: Wed, 25 Jan 2023 17:00:27 +0100 Subject: [PATCH 07/14] Added comments --- .../PushNotifications/PushNotifications.swift | 76 ++++++++++++++++--- NotificationService/NotificationService.swift | 24 ++++-- 2 files changed, 81 insertions(+), 19 deletions(-) diff --git a/Campus-iOS/PushNotifications/PushNotifications.swift b/Campus-iOS/PushNotifications/PushNotifications.swift index 0dc979c5..057cc064 100644 --- a/Campus-iOS/PushNotifications/PushNotifications.swift +++ b/Campus-iOS/PushNotifications/PushNotifications.swift @@ -26,9 +26,19 @@ enum HandlePushDeviceRequestError: Error { case invalidNotificationType } +enum BackgroundNotificationType: String { + case campusTokenRequest = "CAMPUS_TOKEN_REQUEST" +} + + +/** + Integrates keychain management, including generating and storing of public and private RSA keys. + Handles registering the device id in the backend, responding to background notifications and reading the Campus API Token from the keychain. + + The `PushNotification` class can be used as singleton by accessing the static `shared` property. + */ class PushNotifications { - - private static let privateKeyApplicationTag = "de.tum.tca.keys.push_public_key" + private static let privateKeyApplicationTag = "de.tum.tca.keys.push_rsa_key" private static let keychainAccessGroupName = "2J3C6P6X3N.de.tum.tca.notificationextension" private static let keyType = kSecAttrKeyTypeRSA as String private static let keySize = 2048 @@ -38,6 +48,11 @@ class PushNotifications { static let shared = PushNotifications() + /** + Registers the `deviceToken` in the backend to receive push notifications. + + - Parameter deviceToken: the current device token + */ func registerDeviceToken(_ deviceToken: String) async -> Void { do { let keyPair = try getPublicPrivateKeys() @@ -48,7 +63,9 @@ class PushNotifications { $0.deviceType = .ios }) - let response = try await CampusBackend.shared.registerDevice(device) + print(keyPair.publicKey) + + let _ = try await CampusBackend.shared.registerDevice(device) } catch RSAKeyPairError.failedGeneratingPrivateKey { print("Something went wrong while generating the rsa private key") } catch RSAKeyPairError.failedObtainingKeyPairFromKeyChain { @@ -59,6 +76,16 @@ class PushNotifications { } + /** + Handles incoming background notification requests from the backend. + + - Throws: + - `HandlePushDeviceRequestError.noRequestId`: if the push notification body does not contain the `request_id` parameter + - `HandlePushDeviceRequestError.noNotificationType`: if if the push notification body does not contain the `notification_type` parameter + - `HandlePushDeviceRequestError.invalidNotificationType`: if the `notification_type` is other then `BackgroundNotificationType` + + - Parameter data: the background notification body + */ func handleBackgroundNotification(data: [AnyHashable : Any]) async throws { guard let requestId = data["request_id"] as? String else { print("Failed responding to push device request because no 'request_id' was defined") @@ -71,7 +98,7 @@ class PushNotifications { } switch notificationType { - case "CAMPUS_TOKEN_REQUEST": + case BackgroundNotificationType.campusTokenRequest.rawValue: return try await handleCampusTokenRequest(requestId) default: print("Failed responding to push device request because 'notification_type' was invalid") @@ -79,6 +106,13 @@ class PushNotifications { } } + /** + Handles a `BackgroundNotificationType.campusTokenRequest`. + Reads the `campusToken` from the keychain and sends it to the backend including the `requestId`. + + - Parameter requestId: identifies the background notification request in the backend and needs to be transmitted with the campus token + - Throws: `HandlePushDeviceRequestError.noCampusToken` if the campus token cannot be read from the keychain + */ private func handleCampusTokenRequest(_ requestId: String) async throws { guard let campusToken = self.campusToken else { print("Failed responding to push device request because no campus token was available") @@ -90,7 +124,7 @@ class PushNotifications { $0.requestID = requestId }) - let res = try await CampusBackend.shared.iOSDeviceRequestResponse(response) + let _ = try await CampusBackend.shared.iOSDeviceRequestResponse(response) } private var campusToken: String? { @@ -109,26 +143,38 @@ class PushNotifications { return try? PropertyListDecoder().decode(Credentials.self, from: data) } + /** + Checks if the there are already public and private keys stored in the keychain. If yes, it just returns them, otherwise it generates new ones. + + - Returns: A tuple containing the RSA public and private key + */ private func getPublicPrivateKeys() throws -> RSAKeyPair { - if checkIfPrivateKeyAlreadyExists() { + /* if checkIfPrivateKeyAlreadyExists() { + print("Obtaining private key from keychain") return try obtainPublicPrivateKeyFromKeyChain() - } + }*/ - try generatePrivateKeys() + try generatePrivateKey() return try obtainPublicPrivateKeyFromKeyChain() } + /** + Uses `CryptoExportImportManager` to export the public key in a format (PEM) that can be read by the backend + */ private func exportPublicKeyAsValidPEM(_ publicKey: Data) -> String { let exportManager = CryptoExportImportManager() return exportManager.exportRSAPublicKeyToPEM(publicKey, keyType: PushNotifications.keyType, keySize: PushNotifications.keySize) } - private func generatePrivateKeys() throws { + /** + Generates a private inside the Keychain can then be queried afterwards + */ + private func generatePrivateKey() throws { let attributes: [String: Any] = [ - kSecAttrKeyType as String: kSecAttrKeyTypeEC, - kSecAttrKeySizeInBits as String: 2048, + kSecAttrKeyType as String: PushNotifications.keyType, + kSecAttrKeySizeInBits as String: PushNotifications.keySize, kSecPrivateKeyAttrs as String: [ kSecAttrIsPermanent as String: true, kSecAttrApplicationTag as String: PushNotifications.privateKeyApplicationTag @@ -142,6 +188,7 @@ class PushNotifications { } } + private func checkIfPrivateKeyAlreadyExists() -> Bool { do { let _ = try obtainPrivateKeyFromKeyChain() @@ -152,6 +199,9 @@ class PushNotifications { return true } + /** + Tries to query for the private key using the `privateKeyKeychainQuery` + */ private func obtainPrivateKeyFromKeyChain() throws -> SecKey { var item: CFTypeRef? let status = SecItemCopyMatching(privateKeyKeychainQuery as CFDictionary, &item) @@ -163,7 +213,9 @@ class PushNotifications { return item as! SecKey } - + /** + Obtains the private key from the keychain, creates a public key from the private key and finally returns an external representation for the keys. + */ private func obtainPublicPrivateKeyFromKeyChain() throws -> RSAKeyPair { let privateKey = try obtainPrivateKeyFromKeyChain() diff --git a/NotificationService/NotificationService.swift b/NotificationService/NotificationService.swift index 02f27f93..e1e95152 100644 --- a/NotificationService/NotificationService.swift +++ b/NotificationService/NotificationService.swift @@ -18,7 +18,7 @@ class NotificationService: UNNotificationServiceExtension { var contentHandler: ((UNNotificationContent) -> Void)? var bestAttemptContent: UNMutableNotificationContent? - private static let privateKeyApplicationTag = "de.tum.tca.keys.push_public_key" + private static let privateKeyApplicationTag = "de.tum.tca.keys.push_rsa_key" private static let keychainAccessGroupName = "2J3C6P6X3N.de.tum.tca.notificationextension" private var privateKeyKeychainQuery: [String: Any] = [ @@ -31,11 +31,13 @@ class NotificationService: UNNotificationServiceExtension { kSecAttrAccessGroup as String: NotificationService.keychainAccessGroupName ] + /** + Called before the push notification is displayed to the user + */ override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { self.contentHandler = contentHandler bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) - if let bestAttemptContent = bestAttemptContent { let exists = checkIfPrivateKeyAlreadyExists() @@ -56,19 +58,19 @@ class NotificationService: UNNotificationServiceExtension { let privateKey = try obtainRawPrivateKeyFromKeyChain() if bestAttemptContent.title != "" { - let plainText = decrypt(cypherText: bestAttemptContent.title, privateKey: privateKey) + let plainText = decrypt(cipherText: bestAttemptContent.title, privateKey: privateKey) bestAttemptContent.title = plainText ?? "Decryption Error" } if bestAttemptContent.subtitle != "" { - let plainText = decrypt(cypherText: bestAttemptContent.subtitle, privateKey: privateKey) + let plainText = decrypt(cipherText: bestAttemptContent.subtitle, privateKey: privateKey) bestAttemptContent.subtitle = plainText ?? "Decryption Error" } if bestAttemptContent.body != "" { - let plainText = decrypt(cypherText: bestAttemptContent.body, privateKey: privateKey) + let plainText = decrypt(cipherText: bestAttemptContent.body, privateKey: privateKey) bestAttemptContent.body = plainText ?? "Decryption Error" } @@ -88,8 +90,16 @@ class NotificationService: UNNotificationServiceExtension { } } - private func decrypt(cypherText: String, privateKey: SecKey) -> String? { - let cipherData = Data(base64Encoded: cypherText)! as CFData + /** + Decrypts a given `cipherText` using the RSA `privateKey` + + - Parameters: + - cipherText: Encrypted text that should be decrypted + - privateKey: RSA PrivateKey from the keychain + + */ + private func decrypt(cipherText: String, privateKey: SecKey) -> String? { + let cipherData = Data(base64Encoded: cipherText)! as CFData var error: Unmanaged? let plaintext = SecKeyCreateDecryptedData(privateKey, .rsaEncryptionOAEPSHA256, cipherData, &error) From ba475fb839b2dd71983e15eeae9710d97e4ef5a3 Mon Sep 17 00:00:00 2001 From: Anton Wyrowski Date: Sat, 28 Jan 2023 19:00:02 +0100 Subject: [PATCH 08/14] created keychain service --- Campus-iOS.xcodeproj/project.pbxproj | 6 + .../PushNotifications/KeychainService.swift | 166 ++++++++++++++++++ .../PushNotifications/PushNotifications.swift | 149 +--------------- NotificationService/NotificationService.swift | 33 +--- 4 files changed, 177 insertions(+), 177 deletions(-) create mode 100644 Campus-iOS/PushNotifications/KeychainService.swift diff --git a/Campus-iOS.xcodeproj/project.pbxproj b/Campus-iOS.xcodeproj/project.pbxproj index bcd7c092..13b04df8 100644 --- a/Campus-iOS.xcodeproj/project.pbxproj +++ b/Campus-iOS.xcodeproj/project.pbxproj @@ -265,6 +265,8 @@ 995831912936336900F25E11 /* GRPC in Frameworks */ = {isa = PBXBuildFile; productRef = 995831902936336900F25E11 /* GRPC */; }; 995831932936336900F25E11 /* protoc-gen-grpc-swift in Frameworks */ = {isa = PBXBuildFile; productRef = 995831922936336900F25E11 /* protoc-gen-grpc-swift */; }; 995831952936469100F25E11 /* CampusBackend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 995831942936469000F25E11 /* CampusBackend.swift */; }; + 99706872298572A50028D235 /* KeychainService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99706871298572A50028D235 /* KeychainService.swift */; }; + 997068732985752E0028D235 /* KeychainService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99706871298572A50028D235 /* KeychainService.swift */; }; 9973857C29490EFE00B1AE34 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9973857B29490EFE00B1AE34 /* NotificationService.swift */; }; 9973858029490EFE00B1AE34 /* NotificationService.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 9973857929490EFE00B1AE34 /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 997385862949324F00B1AE34 /* CryptoExportImportManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997385852949324F00B1AE34 /* CryptoExportImportManager.swift */; }; @@ -557,6 +559,7 @@ 9958317F29361F6F00F25E11 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 99583182293621A200F25E11 /* PushNotifications.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushNotifications.swift; sourceTree = ""; }; 995831942936469000F25E11 /* CampusBackend.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampusBackend.swift; sourceTree = ""; }; + 99706871298572A50028D235 /* KeychainService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainService.swift; sourceTree = ""; }; 9973857929490EFE00B1AE34 /* NotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 9973857B29490EFE00B1AE34 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; 9973857D29490EFE00B1AE34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -1583,6 +1586,7 @@ children = ( 99583182293621A200F25E11 /* PushNotifications.swift */, 997385852949324F00B1AE34 /* CryptoExportImportManager.swift */, + 99706871298572A50028D235 /* KeychainService.swift */, ); path = PushNotifications; sourceTree = ""; @@ -1967,6 +1971,7 @@ 36AF61EA27A2FD7800FEBD98 /* Environment+Error.swift in Sources */, 3654F38A28518640008AD5DC /* StudyRoomDetailsView.swift in Sources */, 36AF61ED27A2FD7800FEBD98 /* FailedView.swift in Sources */, + 99706872298572A50028D235 /* KeychainService.swift in Sources */, 36108BBE27A3046B007DC62D /* LecturesService.swift in Sources */, 36108BF027A304B6007DC62D /* PanelContentView.swift in Sources */, 36AF61F127A2FD7800FEBD98 /* XMLSerializer.swift in Sources */, @@ -2053,6 +2058,7 @@ files = ( 9973857C29490EFE00B1AE34 /* NotificationService.swift in Sources */, 997385872949324F00B1AE34 /* CryptoExportImportManager.swift in Sources */, + 997068732985752E0028D235 /* KeychainService.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Campus-iOS/PushNotifications/KeychainService.swift b/Campus-iOS/PushNotifications/KeychainService.swift new file mode 100644 index 00000000..bc8f4bc2 --- /dev/null +++ b/Campus-iOS/PushNotifications/KeychainService.swift @@ -0,0 +1,166 @@ +// +// KeychainService.swift +// Campus-iOS +// +// Created by Anton Wyrowski on 28.01.23. +// + +import Foundation +import KeychainAccess + +typealias RSAKeyPair = (privateKey: String, publicKey: String) + +enum RSAKeyPairError: Error { + case failedGeneratingPrivateKey + case failedObtainingKeyPairFromKeyChain + case failedObtainingPublicKeyFromPrivateKey + case failedObtainingStringRepresentationOfPrivateKey + case failedObtainingStringRepresentationOfPublicKey + case failedToExportPublicKey +} + +class KeychainService { + private let privateKeyApplicationTag = "de.tum.tca.keys.push_rsa_key" + private let keychainAccessGroupName = "2J3C6P6X3N.de.tum.tca.notificationextension" + private let keyType = kSecAttrKeyTypeRSA as String + private let keySize = 2048 + private let keychain = Keychain(service: "de.tum.campusapp") + .synchronizable(true) + .accessibility(.afterFirstUnlock) + + private var credentials: Credentials? { + guard let data = keychain[data: "credentials"] else { return nil } + return try? PropertyListDecoder().decode(Credentials.self, from: data) + } + + var campusToken: String? { + switch credentials { + case .none, .noTumID: + return nil + case .tumID(_, let token): + return token + case .tumIDAndKey(_, let token, _): + return token + } + } + + /** + Checks if the there are already public and private keys stored in the keychain. If yes, it just returns them, otherwise it generates new ones. + + - Returns: A tuple containing the RSA public and private key + */ + func getPublicPrivateKeys() throws -> RSAKeyPair { + if checkIfPrivateKeyAlreadyExists() { + return try obtainPublicPrivateKeyFromKeyChain() + } + + try generatePrivateKey() + + return try obtainPublicPrivateKeyFromKeyChain() + } + + /** + Uses `CryptoExportImportManager` to export the public key in a format (PEM) that can be read by the backend + */ + private func exportPublicKeyAsValidPEM(_ publicKey: Data) -> String { + let exportManager = CryptoExportImportManager() + + return exportManager.exportRSAPublicKeyToPEM(publicKey, keyType: keyType, keySize: keySize) + } + + /** + Generates a private inside the Keychain can then be queried afterwards + */ + private func generatePrivateKey() throws { + let attributes: [String: Any] = [ + kSecAttrKeyType as String: keyType, + kSecAttrKeySizeInBits as String: keySize, + kSecPrivateKeyAttrs as String: [ + kSecAttrIsPermanent as String: true, + kSecAttrApplicationTag as String: privateKeyApplicationTag + ], + kSecAttrAccessGroup as String: keychainAccessGroupName + ] + + var error: Unmanaged? + guard SecKeyCreateRandomKey(attributes as CFDictionary, &error) != nil else { + throw RSAKeyPairError.failedGeneratingPrivateKey + } + } + + + private func checkIfPrivateKeyAlreadyExists() -> Bool { + do { + let _ = try obtainPrivateKeyFromKeyChain() + } catch { + return false + } + + return true + } + + /** + Tries to query for the private key using the `privateKeyKeychainQuery` + */ + func obtainPrivateKeyFromKeyChain() throws -> SecKey { + var item: CFTypeRef? + let status = SecItemCopyMatching(privateKeyKeychainQuery as CFDictionary, &item) + + guard status == errSecSuccess && item != nil else { + throw RSAKeyPairError.failedObtainingKeyPairFromKeyChain + } + + return item as! SecKey + } + + func obtainPrivateKeyFromKeyChain() throws -> String { + let privateKey: SecKey = try obtainPrivateKeyFromKeyChain() + + var error: Unmanaged? + guard let privateERData = SecKeyCopyExternalRepresentation(privateKey, &error) else { + throw RSAKeyPairError.failedObtainingStringRepresentationOfPrivateKey + } + + let privateData: Data = privateERData as Data + + return privateData.base64EncodedString() + } + + /** + Obtains the private key from the keychain, creates a public key from the private key and finally returns an external representation for the keys. + */ + private func obtainPublicPrivateKeyFromKeyChain() throws -> RSAKeyPair { + let privateKey: SecKey = try obtainPrivateKeyFromKeyChain() + + guard let publicKey = SecKeyCopyPublicKey(privateKey) else { + throw RSAKeyPairError.failedObtainingPublicKeyFromPrivateKey + } + + var error: Unmanaged? + guard let privateERData = SecKeyCopyExternalRepresentation(privateKey, &error) else { + throw RSAKeyPairError.failedObtainingStringRepresentationOfPrivateKey + } + + let privateData: Data = privateERData as Data + + guard let publicERData = SecKeyCopyExternalRepresentation(publicKey, &error) else { + throw RSAKeyPairError.failedObtainingStringRepresentationOfPublicKey + } + + let publicData: Data = publicERData as Data + + return (privateData.base64EncodedString(), exportPublicKeyAsValidPEM(publicData)) + } + + private var privateKeyKeychainQuery: [String: Any] { + return [ + kSecClass as String: kSecClassKey, + kSecAttrKeyClass as String: kSecAttrKeyClassPrivate, + kSecAttrKeyType as String: keyType, + kSecAttrKeySizeInBits as String: keySize, + kSecAttrApplicationTag as String: privateKeyApplicationTag, + kSecReturnRef as String: true, + kSecAttrAccessGroup as String: keychainAccessGroupName + ] + } +} diff --git a/Campus-iOS/PushNotifications/PushNotifications.swift b/Campus-iOS/PushNotifications/PushNotifications.swift index 057cc064..52ed8ab4 100644 --- a/Campus-iOS/PushNotifications/PushNotifications.swift +++ b/Campus-iOS/PushNotifications/PushNotifications.swift @@ -6,18 +6,6 @@ // import Foundation -import KeychainAccess - -typealias RSAKeyPair = (privateKey: String, publicKey: String) - -enum RSAKeyPairError: Error { - case failedGeneratingPrivateKey - case failedObtainingKeyPairFromKeyChain - case failedObtainingPublicKeyFromPrivateKey - case failedObtainingStringRepresentationOfPrivateKey - case failedObtainingStringRepresentationOfPublicKey - case failedToExportPublicKey -} enum HandlePushDeviceRequestError: Error { case noCampusToken @@ -30,7 +18,6 @@ enum BackgroundNotificationType: String { case campusTokenRequest = "CAMPUS_TOKEN_REQUEST" } - /** Integrates keychain management, including generating and storing of public and private RSA keys. Handles registering the device id in the backend, responding to background notifications and reading the Campus API Token from the keychain. @@ -38,13 +25,7 @@ enum BackgroundNotificationType: String { The `PushNotification` class can be used as singleton by accessing the static `shared` property. */ class PushNotifications { - private static let privateKeyApplicationTag = "de.tum.tca.keys.push_rsa_key" - private static let keychainAccessGroupName = "2J3C6P6X3N.de.tum.tca.notificationextension" - private static let keyType = kSecAttrKeyTypeRSA as String - private static let keySize = 2048 - private static let keychain = Keychain(service: "de.tum.campusapp") - .synchronizable(true) - .accessibility(.afterFirstUnlock) + private final let keychain: KeychainService = KeychainService() static let shared = PushNotifications() @@ -55,7 +36,7 @@ class PushNotifications { */ func registerDeviceToken(_ deviceToken: String) async -> Void { do { - let keyPair = try getPublicPrivateKeys() + let keyPair = try keychain.getPublicPrivateKeys() let device: Api_RegisterDeviceRequest = .with({ $0.deviceID = deviceToken @@ -114,7 +95,7 @@ class PushNotifications { - Throws: `HandlePushDeviceRequestError.noCampusToken` if the campus token cannot be read from the keychain */ private func handleCampusTokenRequest(_ requestId: String) async throws { - guard let campusToken = self.campusToken else { + guard let campusToken = keychain.campusToken else { print("Failed responding to push device request because no campus token was available") throw HandlePushDeviceRequestError.noCampusToken } @@ -126,128 +107,4 @@ class PushNotifications { let _ = try await CampusBackend.shared.iOSDeviceRequestResponse(response) } - - private var campusToken: String? { - switch credentials { - case .none, .noTumID: - return nil - case .tumID(_, let token): - return token - case .tumIDAndKey(_, let token, _): - return token - } - } - - private var credentials: Credentials? { - guard let data = PushNotifications.keychain[data: "credentials"] else { return nil } - return try? PropertyListDecoder().decode(Credentials.self, from: data) - } - - /** - Checks if the there are already public and private keys stored in the keychain. If yes, it just returns them, otherwise it generates new ones. - - - Returns: A tuple containing the RSA public and private key - */ - private func getPublicPrivateKeys() throws -> RSAKeyPair { - /* if checkIfPrivateKeyAlreadyExists() { - print("Obtaining private key from keychain") - return try obtainPublicPrivateKeyFromKeyChain() - }*/ - - try generatePrivateKey() - - return try obtainPublicPrivateKeyFromKeyChain() - } - - /** - Uses `CryptoExportImportManager` to export the public key in a format (PEM) that can be read by the backend - */ - private func exportPublicKeyAsValidPEM(_ publicKey: Data) -> String { - let exportManager = CryptoExportImportManager() - - return exportManager.exportRSAPublicKeyToPEM(publicKey, keyType: PushNotifications.keyType, keySize: PushNotifications.keySize) - } - - /** - Generates a private inside the Keychain can then be queried afterwards - */ - private func generatePrivateKey() throws { - let attributes: [String: Any] = [ - kSecAttrKeyType as String: PushNotifications.keyType, - kSecAttrKeySizeInBits as String: PushNotifications.keySize, - kSecPrivateKeyAttrs as String: [ - kSecAttrIsPermanent as String: true, - kSecAttrApplicationTag as String: PushNotifications.privateKeyApplicationTag - ], - kSecAttrAccessGroup as String: PushNotifications.keychainAccessGroupName - ] - - var error: Unmanaged? - guard SecKeyCreateRandomKey(attributes as CFDictionary, &error) != nil else { - throw RSAKeyPairError.failedGeneratingPrivateKey - } - } - - - private func checkIfPrivateKeyAlreadyExists() -> Bool { - do { - let _ = try obtainPrivateKeyFromKeyChain() - } catch { - return false - } - - return true - } - - /** - Tries to query for the private key using the `privateKeyKeychainQuery` - */ - private func obtainPrivateKeyFromKeyChain() throws -> SecKey { - var item: CFTypeRef? - let status = SecItemCopyMatching(privateKeyKeychainQuery as CFDictionary, &item) - - guard status == errSecSuccess && item != nil else { - throw RSAKeyPairError.failedObtainingKeyPairFromKeyChain - } - - return item as! SecKey - } - - /** - Obtains the private key from the keychain, creates a public key from the private key and finally returns an external representation for the keys. - */ - private func obtainPublicPrivateKeyFromKeyChain() throws -> RSAKeyPair { - let privateKey = try obtainPrivateKeyFromKeyChain() - - guard let publicKey = SecKeyCopyPublicKey(privateKey) else { - throw RSAKeyPairError.failedObtainingPublicKeyFromPrivateKey - } - - var error: Unmanaged? - guard let privateERData = SecKeyCopyExternalRepresentation(privateKey, &error) else { - throw RSAKeyPairError.failedObtainingStringRepresentationOfPrivateKey - } - - let privateData: Data = privateERData as Data - - guard let publicERData = SecKeyCopyExternalRepresentation(publicKey, &error) else { - throw RSAKeyPairError.failedObtainingStringRepresentationOfPublicKey - } - - let publicData: Data = publicERData as Data - - return (privateData.base64EncodedString(), exportPublicKeyAsValidPEM(publicData)) - } - - private var privateKeyKeychainQuery: [String: Any] = [ - kSecClass as String: kSecClassKey, - kSecAttrKeyClass as String: kSecAttrKeyClassPrivate, - kSecAttrKeyType as String: PushNotifications.keyType, - kSecAttrKeySizeInBits as String: PushNotifications.keySize, - kSecAttrApplicationTag as String: privateKeyApplicationTag, - kSecReturnRef as String: true, - kSecAttrAccessGroup as String: PushNotifications.keychainAccessGroupName - ] - - } diff --git a/NotificationService/NotificationService.swift b/NotificationService/NotificationService.swift index e1e95152..09df9dc9 100644 --- a/NotificationService/NotificationService.swift +++ b/NotificationService/NotificationService.swift @@ -7,30 +7,12 @@ import UserNotifications -enum RSAKeyPairError: Error { - case failedObtainingPrivateKeyFromKeyChain - case failedObtainingStringRepresentationOfPrivateKey -} - - class NotificationService: UNNotificationServiceExtension { - var contentHandler: ((UNNotificationContent) -> Void)? var bestAttemptContent: UNMutableNotificationContent? - private static let privateKeyApplicationTag = "de.tum.tca.keys.push_rsa_key" - private static let keychainAccessGroupName = "2J3C6P6X3N.de.tum.tca.notificationextension" + private final let keychain: KeychainService = KeychainService() - private var privateKeyKeychainQuery: [String: Any] = [ - kSecClass as String: kSecClassKey, - kSecAttrKeyClass as String: kSecAttrKeyClassPrivate, - kSecAttrKeyType as String: kSecAttrKeyTypeRSA, - kSecAttrKeySizeInBits as String: 2048, - kSecAttrApplicationTag as String: privateKeyApplicationTag, - kSecReturnRef as String: true, - kSecAttrAccessGroup as String: NotificationService.keychainAccessGroupName - ] - /** Called before the push notification is displayed to the user */ @@ -123,20 +105,9 @@ class NotificationService: UNNotificationServiceExtension { return true } - private func obtainRawPrivateKeyFromKeyChain() throws -> SecKey { - var item: CFTypeRef? - let status = SecItemCopyMatching(privateKeyKeychainQuery as CFDictionary, &item) - - guard status == errSecSuccess && item != nil else { - throw RSAKeyPairError.failedObtainingPrivateKeyFromKeyChain - } - - return item as! SecKey - } - private func obtainPrivateKeyFromKeyChain() throws -> String { - let privateKey = try obtainRawPrivateKeyFromKeyChain() + let privateKey = try keychain.obtainPrivateKeyFromKeyChain() var error: Unmanaged? guard let privateERData = SecKeyCopyExternalRepresentation(privateKey, &error) else { From 70fc34e37cf9d642f4a47ab8c32948c135676bff Mon Sep 17 00:00:00 2001 From: Anton Wyrowski Date: Sat, 28 Jan 2023 23:36:22 +0100 Subject: [PATCH 09/14] resolved requested comments --- Campus-iOS.xcodeproj/project.pbxproj | 22 +-- Campus-iOS/AppDelegate.swift | 5 +- .../Crashlytics/CrashlyticsService.swift | 2 +- .../PushNotifications/KeychainService.swift | 132 +++++++++++------- .../PushNotifications/PushNotifications.swift | 26 ++-- NotificationService/NotificationService.swift | 113 ++++----------- 6 files changed, 144 insertions(+), 156 deletions(-) diff --git a/Campus-iOS.xcodeproj/project.pbxproj b/Campus-iOS.xcodeproj/project.pbxproj index d3132792..47e08d12 100644 --- a/Campus-iOS.xcodeproj/project.pbxproj +++ b/Campus-iOS.xcodeproj/project.pbxproj @@ -265,13 +265,14 @@ 995831912936336900F25E11 /* GRPC in Frameworks */ = {isa = PBXBuildFile; productRef = 995831902936336900F25E11 /* GRPC */; }; 995831932936336900F25E11 /* protoc-gen-grpc-swift in Frameworks */ = {isa = PBXBuildFile; productRef = 995831922936336900F25E11 /* protoc-gen-grpc-swift */; }; 995831952936469100F25E11 /* CampusBackend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 995831942936469000F25E11 /* CampusBackend.swift */; }; + 99706870298569E10028D235 /* CrashlyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9970686F298569E10028D235 /* CrashlyticsService.swift */; }; 99706872298572A50028D235 /* KeychainService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99706871298572A50028D235 /* KeychainService.swift */; }; 997068732985752E0028D235 /* KeychainService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99706871298572A50028D235 /* KeychainService.swift */; }; 9973857C29490EFE00B1AE34 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9973857B29490EFE00B1AE34 /* NotificationService.swift */; }; 9973858029490EFE00B1AE34 /* NotificationService.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 9973857929490EFE00B1AE34 /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 997385862949324F00B1AE34 /* CryptoExportImportManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997385852949324F00B1AE34 /* CryptoExportImportManager.swift */; }; 997385872949324F00B1AE34 /* CryptoExportImportManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997385852949324F00B1AE34 /* CryptoExportImportManager.swift */; }; - 99706870298569E10028D235 /* CrashlyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9970686F298569E10028D235 /* CrashlyticsService.swift */; }; + 999E324B29859DDA0099755D /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36203E8A2761C6EC00C24658 /* Credentials.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -555,12 +556,12 @@ 97270F5927AB2A4900BB25E4 /* Array+Rearrange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+Rearrange.swift"; sourceTree = ""; }; 974D5B9927E5E9CB00FD7B11 /* GlowBorder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlowBorder.swift; sourceTree = ""; }; 97F8A79227E641570099EE83 /* AcademicDegree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcademicDegree.swift; sourceTree = ""; }; - 9970686F298569E10028D235 /* CrashlyticsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashlyticsService.swift; sourceTree = ""; }; 99438EFF2950770400766197 /* CampusService.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CampusService.pb.swift; sourceTree = ""; }; 99438F002950770400766197 /* CampusService.grpc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CampusService.grpc.swift; sourceTree = ""; }; 9958317F29361F6F00F25E11 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 99583182293621A200F25E11 /* PushNotifications.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushNotifications.swift; sourceTree = ""; }; 995831942936469000F25E11 /* CampusBackend.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampusBackend.swift; sourceTree = ""; }; + 9970686F298569E10028D235 /* CrashlyticsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashlyticsService.swift; sourceTree = ""; }; 99706871298572A50028D235 /* KeychainService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainService.swift; sourceTree = ""; }; 9973857929490EFE00B1AE34 /* NotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 9973857B29490EFE00B1AE34 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; @@ -1584,14 +1585,6 @@ path = Icons; sourceTree = ""; }; - 9970686E298569CE0028D235 /* Crashlytics */ = { - isa = PBXGroup; - children = ( - 9970686F298569E10028D235 /* CrashlyticsService.swift */, - ); - path = Crashlytics; - sourceTree = ""; - }; 995831812936215D00F25E11 /* PushNotifications */ = { isa = PBXGroup; children = ( @@ -1602,6 +1595,14 @@ path = PushNotifications; sourceTree = ""; }; + 9970686E298569CE0028D235 /* Crashlytics */ = { + isa = PBXGroup; + children = ( + 9970686F298569E10028D235 /* CrashlyticsService.swift */, + ); + path = Crashlytics; + sourceTree = ""; + }; 9973857A29490EFE00B1AE34 /* NotificationService */ = { isa = PBXGroup; children = ( @@ -2070,6 +2071,7 @@ files = ( 9973857C29490EFE00B1AE34 /* NotificationService.swift in Sources */, 997385872949324F00B1AE34 /* CryptoExportImportManager.swift in Sources */, + 999E324B29859DDA0099755D /* Credentials.swift in Sources */, 997068732985752E0028D235 /* KeychainService.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Campus-iOS/AppDelegate.swift b/Campus-iOS/AppDelegate.swift index d983388e..7e2e564f 100644 --- a/Campus-iOS/AppDelegate.swift +++ b/Campus-iOS/AppDelegate.swift @@ -30,14 +30,13 @@ class AppDelegate: NSObject, UIApplicationDelegate { } func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { - print("Failed to register for remote notifications") - print(error.localizedDescription) + CrashlyticsService.log("Failed to register for remote notifications with error message: \(error.localizedDescription)") } func registerForPushNotifications() { UNUserNotificationCenter.current() .requestAuthorization(options: [.alert, .sound, .badge]) { granted, _ in - print("Permission granted: \(granted)") + print("Notification Permission granted: \(granted)") } } diff --git a/Campus-iOS/Crashlytics/CrashlyticsService.swift b/Campus-iOS/Crashlytics/CrashlyticsService.swift index 27d3f320..7bc4b1cf 100644 --- a/Campus-iOS/Crashlytics/CrashlyticsService.swift +++ b/Campus-iOS/Crashlytics/CrashlyticsService.swift @@ -17,7 +17,7 @@ class CrashlyticsService { #endif } - static func log(_ value: String) -> Void { + static func log(_ error: String) -> Void { #if !DEBUG CrashlyticsService.crashlytics.log(value) #endif diff --git a/Campus-iOS/PushNotifications/KeychainService.swift b/Campus-iOS/PushNotifications/KeychainService.swift index bc8f4bc2..3a6337b2 100644 --- a/Campus-iOS/PushNotifications/KeychainService.swift +++ b/Campus-iOS/PushNotifications/KeychainService.swift @@ -11,12 +11,11 @@ import KeychainAccess typealias RSAKeyPair = (privateKey: String, publicKey: String) enum RSAKeyPairError: Error { - case failedGeneratingPrivateKey + case failedGeneratingPrivateKey(_ error: String) case failedObtainingKeyPairFromKeyChain case failedObtainingPublicKeyFromPrivateKey - case failedObtainingStringRepresentationOfPrivateKey - case failedObtainingStringRepresentationOfPublicKey - case failedToExportPublicKey + case failedObtainingExternalRepresentationOfKey(_ error: String) + case failedToExportPublicKey(_ error: String) } class KeychainService { @@ -49,23 +48,16 @@ class KeychainService { - Returns: A tuple containing the RSA public and private key */ - func getPublicPrivateKeys() throws -> RSAKeyPair { - if checkIfPrivateKeyAlreadyExists() { - return try obtainPublicPrivateKeyFromKeyChain() + func obtainOrGeneratePublicPrivateKeys() throws -> RSAKeyPair { + guard let privateKey = optionalOptainPrivateKey() else { + try generatePrivateKey() + + return try obtainPublicPrivateKey() } - try generatePrivateKey() + let publicKey = try obtainPublicKey(privateKey) - return try obtainPublicPrivateKeyFromKeyChain() - } - - /** - Uses `CryptoExportImportManager` to export the public key in a format (PEM) that can be read by the backend - */ - private func exportPublicKeyAsValidPEM(_ publicKey: Data) -> String { - let exportManager = CryptoExportImportManager() - - return exportManager.exportRSAPublicKeyToPEM(publicKey, keyType: keyType, keySize: keySize) + return try publicPrivateKeyToValidFormat(publicKey: publicKey, privateKey: privateKey) } /** @@ -84,75 +76,121 @@ class KeychainService { var error: Unmanaged? guard SecKeyCreateRandomKey(attributes as CFDictionary, &error) != nil else { - throw RSAKeyPairError.failedGeneratingPrivateKey + throw RSAKeyPairError.failedGeneratingPrivateKey(error.debugDescription) } } - private func checkIfPrivateKeyAlreadyExists() -> Bool { + func optionalOptainPrivateKey() -> SecKey? { do { - let _ = try obtainPrivateKeyFromKeyChain() + return try obtainPrivateKey() } catch { - return false + return nil } - - return true } /** Tries to query for the private key using the `privateKeyKeychainQuery` */ - func obtainPrivateKeyFromKeyChain() throws -> SecKey { + func obtainPrivateKey() throws -> SecKey { var item: CFTypeRef? - let status = SecItemCopyMatching(privateKeyKeychainQuery as CFDictionary, &item) + let status = SecItemCopyMatching(privateKeyQuery as CFDictionary, &item) - guard status == errSecSuccess && item != nil else { + guard status == errSecSuccess && item != nil && CFGetTypeID(item) == SecKeyGetTypeID() else { throw RSAKeyPairError.failedObtainingKeyPairFromKeyChain } return item as! SecKey } - func obtainPrivateKeyFromKeyChain() throws -> String { - let privateKey: SecKey = try obtainPrivateKeyFromKeyChain() + func obtainPrivateKey() throws -> String { + let privateKey: SecKey = try obtainPrivateKey() + + let privateData = try getExternalRepresenation(privateKey) + + return exportPrivateKeyAsValidString(privateData) + } + + /** + Obtains the private key from the keychain, creates a public key from the private key and finally returns an external representation for the keys. + */ + private func obtainPublicPrivateKey() throws -> RSAKeyPair { + let privateKey: SecKey = try obtainPrivateKey() + + let publicKey = try obtainPublicKey(privateKey) + + return try publicPrivateKeyToValidFormat(publicKey: publicKey, privateKey: privateKey) + } + + + /** + Creates an external representation for both the `publicKey` and the `privateKey` + */ + private func publicPrivateKeyToValidFormat(publicKey: SecKey, privateKey: SecKey) throws -> RSAKeyPair { + let privateData = try getExternalRepresenation(privateKey) + + let publicData = try getExternalRepresenation(publicKey) + return (exportPrivateKeyAsValidString(privateData), exportPublicKeyAsValidPEM(publicData)) + } + + private func getExternalRepresenation(_ key: SecKey) throws -> Data { var error: Unmanaged? - guard let privateERData = SecKeyCopyExternalRepresentation(privateKey, &error) else { - throw RSAKeyPairError.failedObtainingStringRepresentationOfPrivateKey + guard let keyERData = SecKeyCopyExternalRepresentation(key, &error) else { + throw RSAKeyPairError.failedObtainingExternalRepresentationOfKey(error.debugDescription) } - let privateData: Data = privateERData as Data + return keyERData as Data + } + + private func exportPrivateKeyAsValidString(_ privateKey: Data) -> String { + return privateKey.base64EncodedString() + } + + /** + Uses `CryptoExportImportManager` to export the public key in a format (PEM) that can be read by the backend + */ + private func exportPublicKeyAsValidPEM(_ publicKey: Data) -> String { + let exportManager = CryptoExportImportManager() - return privateData.base64EncodedString() + return exportManager.exportRSAPublicKeyToPEM(publicKey, keyType: keyType, keySize: keySize) } /** - Obtains the private key from the keychain, creates a public key from the private key and finally returns an external representation for the keys. + Generates a public key, from a `privateKey` */ - private func obtainPublicPrivateKeyFromKeyChain() throws -> RSAKeyPair { - let privateKey: SecKey = try obtainPrivateKeyFromKeyChain() - + private func obtainPublicKey(_ privateKey: SecKey) throws -> SecKey { guard let publicKey = SecKeyCopyPublicKey(privateKey) else { throw RSAKeyPairError.failedObtainingPublicKeyFromPrivateKey } - var error: Unmanaged? - guard let privateERData = SecKeyCopyExternalRepresentation(privateKey, &error) else { - throw RSAKeyPairError.failedObtainingStringRepresentationOfPrivateKey + return publicKey + } + + /** + Decrypts a given `cipherText` using the RSA `privateKey` + + - Parameters: + - cipherText: Encrypted text that should be decrypted + - privateKey: RSA PrivateKey from the keychain + + */ + func decrypt(cipherText: String, privateKey: SecKey) -> String? { + guard let cipherData = Data(base64Encoded: cipherText) else { + return nil } - let privateData: Data = privateERData as Data + var error: Unmanaged? + let plaintext = SecKeyCreateDecryptedData(privateKey, .rsaEncryptionOAEPSHA256, cipherData as CFData, &error) - guard let publicERData = SecKeyCopyExternalRepresentation(publicKey, &error) else { - throw RSAKeyPairError.failedObtainingStringRepresentationOfPublicKey + guard let data: NSData = plaintext else { + return nil } - let publicData: Data = publicERData as Data - - return (privateData.base64EncodedString(), exportPublicKeyAsValidPEM(publicData)) + return String(data: data as Data, encoding: .utf8) } - private var privateKeyKeychainQuery: [String: Any] { + private var privateKeyQuery: [String: Any] { return [ kSecClass as String: kSecClassKey, kSecAttrKeyClass as String: kSecAttrKeyClassPrivate, diff --git a/Campus-iOS/PushNotifications/PushNotifications.swift b/Campus-iOS/PushNotifications/PushNotifications.swift index 52ed8ab4..b5b550b6 100644 --- a/Campus-iOS/PushNotifications/PushNotifications.swift +++ b/Campus-iOS/PushNotifications/PushNotifications.swift @@ -36,7 +36,7 @@ class PushNotifications { */ func registerDeviceToken(_ deviceToken: String) async -> Void { do { - let keyPair = try keychain.getPublicPrivateKeys() + let keyPair = try keychain.obtainOrGeneratePublicPrivateKeys() let device: Api_RegisterDeviceRequest = .with({ $0.deviceID = deviceToken @@ -44,15 +44,19 @@ class PushNotifications { $0.deviceType = .ios }) - print(keyPair.publicKey) - let _ = try await CampusBackend.shared.registerDevice(device) - } catch RSAKeyPairError.failedGeneratingPrivateKey { - print("Something went wrong while generating the rsa private key") + } catch RSAKeyPairError.failedGeneratingPrivateKey(let error) { + CrashlyticsService.log("Something went wrong while generating the rsa private key with error message: \(error)") } catch RSAKeyPairError.failedObtainingKeyPairFromKeyChain { - print("Something went wrong while obtaining the rsa private key") + CrashlyticsService.log("Something went wrong while obtaining the rsa private key") + } catch RSAKeyPairError.failedObtainingPublicKeyFromPrivateKey { + CrashlyticsService.log("Something went wrong while obtaining the public key from the private key") + } catch RSAKeyPairError.failedObtainingExternalRepresentationOfKey(let error) { + CrashlyticsService.log("Something went wrong while obtaining the external string representation of a key with error message: \(error)") + } catch RSAKeyPairError.failedToExportPublicKey(let error) { + CrashlyticsService.log("Something went wrong while exporting the public key with error message: \(error)") } catch { - print("Failed registering ios device token! \(error)") + CrashlyticsService.log("Failed registering ios device token! \(error)") } } @@ -69,12 +73,12 @@ class PushNotifications { */ func handleBackgroundNotification(data: [AnyHashable : Any]) async throws { guard let requestId = data["request_id"] as? String else { - print("Failed responding to push device request because no 'request_id' was defined") + CrashlyticsService.log("Failed responding to push device request because no 'request_id' was defined") throw HandlePushDeviceRequestError.noRequestId } guard let notificationType = data["notification_type"] as? String else { - print("Failed responding to push device request because no 'notification_type' was defined") + CrashlyticsService.log("Failed responding to push device request because no 'notification_type' was defined") throw HandlePushDeviceRequestError.noNotificationType } @@ -82,7 +86,7 @@ class PushNotifications { case BackgroundNotificationType.campusTokenRequest.rawValue: return try await handleCampusTokenRequest(requestId) default: - print("Failed responding to push device request because 'notification_type' was invalid") + CrashlyticsService.log("Failed responding to push device request because 'notification_type' was invalid") throw HandlePushDeviceRequestError.invalidNotificationType } } @@ -96,7 +100,7 @@ class PushNotifications { */ private func handleCampusTokenRequest(_ requestId: String) async throws { guard let campusToken = keychain.campusToken else { - print("Failed responding to push device request because no campus token was available") + CrashlyticsService.log("Failed responding to push device request because no campus token was available") throw HandlePushDeviceRequestError.noCampusToken } diff --git a/NotificationService/NotificationService.swift b/NotificationService/NotificationService.swift index 09df9dc9..c78179a3 100644 --- a/NotificationService/NotificationService.swift +++ b/NotificationService/NotificationService.swift @@ -20,103 +20,48 @@ class NotificationService: UNNotificationServiceExtension { self.contentHandler = contentHandler bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) - if let bestAttemptContent = bestAttemptContent { - - let exists = checkIfPrivateKeyAlreadyExists() - - func shouldNotHappen(_ error: String = "") { - bestAttemptContent.title = "Encrypted Notification Payloud 🚨" - bestAttemptContent.subtitle = "Message our support if that happens again." - bestAttemptContent.body = error - - contentHandler(bestAttemptContent) - } + guard let bestAttemptContent = bestAttemptContent else { + return + } - if !exists { - return shouldNotHappen("Encryption key does not exist in KeyChain") - } + func shouldNotHappen(_ error: String = "") { + bestAttemptContent.title = "Encrypted Notification Payload 🚨" + bestAttemptContent.subtitle = "Message our support if that happens again." + bestAttemptContent.body = error - do { - let privateKey = try obtainRawPrivateKeyFromKeyChain() - - if bestAttemptContent.title != "" { - let plainText = decrypt(cipherText: bestAttemptContent.title, privateKey: privateKey) - - bestAttemptContent.title = plainText ?? "Decryption Error" - } - - if bestAttemptContent.subtitle != "" { - let plainText = decrypt(cipherText: bestAttemptContent.subtitle, privateKey: privateKey) - - bestAttemptContent.subtitle = plainText ?? "Decryption Error" - } - - if bestAttemptContent.body != "" { - let plainText = decrypt(cipherText: bestAttemptContent.body, privateKey: privateKey) - - bestAttemptContent.body = plainText ?? "Decryption Error" - } - - contentHandler(bestAttemptContent) - } catch { - shouldNotHappen("Something went wrong decrypting the push notification content. Error: \(error)") - } - } - } - - override func serviceExtensionTimeWillExpire() { - // Called just before the extension will be terminated by the system. - // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. - if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { contentHandler(bestAttemptContent) } - } - - /** - Decrypts a given `cipherText` using the RSA `privateKey` - - - Parameters: - - cipherText: Encrypted text that should be decrypted - - privateKey: RSA PrivateKey from the keychain - - */ - private func decrypt(cipherText: String, privateKey: SecKey) -> String? { - let cipherData = Data(base64Encoded: cipherText)! as CFData - var error: Unmanaged? - let plaintext = SecKeyCreateDecryptedData(privateKey, .rsaEncryptionOAEPSHA256, cipherData, &error) + guard let privateKey = keychain.optionalOptainPrivateKey() else { + return shouldNotHappen("Encryption key does not exist in KeyChain") + } - guard plaintext != nil else { - return nil + if bestAttemptContent.title != "" { + let plainText = keychain.decrypt(cipherText: bestAttemptContent.title, privateKey: privateKey) + + bestAttemptContent.title = plainText ?? "Decryption Error" } - let data: NSData = plaintext! + if bestAttemptContent.subtitle != "" { + let plainText = keychain.decrypt(cipherText: bestAttemptContent.subtitle, privateKey: privateKey) + + bestAttemptContent.subtitle = plainText ?? "Decryption Error" + } - return String(data: data as Data, encoding: .utf8) - } - - private func checkIfPrivateKeyAlreadyExists() -> Bool { - do { - let _ = try obtainPrivateKeyFromKeyChain() - } catch { - return false + if bestAttemptContent.body != "" { + let plainText = keychain.decrypt(cipherText: bestAttemptContent.body, privateKey: privateKey) + + bestAttemptContent.body = plainText ?? "Decryption Error" } - return true + contentHandler(bestAttemptContent) } - - private func obtainPrivateKeyFromKeyChain() throws -> String { - let privateKey = try keychain.obtainPrivateKeyFromKeyChain() - - var error: Unmanaged? - guard let privateERData = SecKeyCopyExternalRepresentation(privateKey, &error) else { - throw RSAKeyPairError.failedObtainingStringRepresentationOfPrivateKey + override func serviceExtensionTimeWillExpire() { + // Called just before the extension will be terminated by the system. + // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. + if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { + contentHandler(bestAttemptContent) } - - let privateData: Data = privateERData as Data - - return privateData.base64EncodedString() } - } From f80bd7a160cd9666522c918c19841ee947d1719b Mon Sep 17 00:00:00 2001 From: Anton Wyrowski Date: Sun, 29 Jan 2023 15:25:09 +0100 Subject: [PATCH 10/14] added keychain access framework to notification service --- Campus-iOS.xcodeproj/project.pbxproj | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Campus-iOS.xcodeproj/project.pbxproj b/Campus-iOS.xcodeproj/project.pbxproj index 47e08d12..7ca17fd7 100644 --- a/Campus-iOS.xcodeproj/project.pbxproj +++ b/Campus-iOS.xcodeproj/project.pbxproj @@ -273,6 +273,7 @@ 997385862949324F00B1AE34 /* CryptoExportImportManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997385852949324F00B1AE34 /* CryptoExportImportManager.swift */; }; 997385872949324F00B1AE34 /* CryptoExportImportManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997385852949324F00B1AE34 /* CryptoExportImportManager.swift */; }; 999E324B29859DDA0099755D /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36203E8A2761C6EC00C24658 /* Credentials.swift */; }; + 99F1850B2986B8FB00F5F920 /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 99F1850A2986B8FB00F5F920 /* KeychainAccess */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -612,6 +613,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 99F1850B2986B8FB00F5F920 /* KeychainAccess in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1131,6 +1133,7 @@ 9973857A29490EFE00B1AE34 /* NotificationService */, 366F0E8127580CFB0091651D /* Products */, 1FFEF086284E417E00ADD201 /* Recovered References */, + 99F185092986B8FB00F5F920 /* Frameworks */, ); sourceTree = ""; }; @@ -1613,6 +1616,13 @@ path = NotificationService; sourceTree = ""; }; + 99F185092986B8FB00F5F920 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1702,6 +1712,9 @@ dependencies = ( ); name = NotificationService; + packageProductDependencies = ( + 99F1850A2986B8FB00F5F920 /* KeychainAccess */, + ); productName = NotificationService; productReference = 9973857929490EFE00B1AE34 /* NotificationService.appex */; productType = "com.apple.product-type.app-extension"; @@ -2694,6 +2707,11 @@ package = 9958318D2936336900F25E11 /* XCRemoteSwiftPackageReference "grpc-swift" */; productName = "protoc-gen-grpc-swift"; }; + 99F1850A2986B8FB00F5F920 /* KeychainAccess */ = { + isa = XCSwiftPackageProductDependency; + package = 36203E812761BDD100C24658 /* XCRemoteSwiftPackageReference "KeychainAccess" */; + productName = KeychainAccess; + }; /* End XCSwiftPackageProductDependency section */ /* Begin XCVersionGroup section */ From ba972434d330e62780b9fc29de486b3a62f90a84 Mon Sep 17 00:00:00 2001 From: "Philipp, Zagar" Date: Wed, 1 Feb 2023 16:52:20 +0100 Subject: [PATCH 11/14] Bring main up to date (#521) * Fix/widget and movie bugs (#511) * change tabbar items of Widgets & Grades to "outline" * change studyroom widget icon * bugfix: show events on same day -> filter past events out before building dict * Improve MovieCard Design * Update Version Number * Make Widgets only available on phone * Fix/token permissions UI (#512) * Adding a new warning if not all permissions are granted. * Spacers and Localizables * bugfix: fix tower image (#509) Closes #508 * Design/login (#513) * Move Calendar Picker to bottom * Rename Widget Tabbaritem * Make LecturesView icons outline * LectureView: reduce Lecture Info Text sizes * Remove Calendar EventsView * Fix Movie Title Image gray bar * - fix TUM logo white pixelation - calendar picker back to top * Redesign some stuff for the Login Process * Remove old tum logo_white images * A few Login Design changes * Add Need Help Button to Check Permissions View * Remove red x from Check Token Button * Add personal NavigationTitle to Widget View * Today Btn press in Calendar forwards to day view * Adjust Login Design to iPad * Localize Mensa Garching traffic * Remove icon from Semester List Group Header on Grades & Lectures * Adjust Grades Info Design to Lectures (-> icon outline, text larger) * LectureDetails: Add contact btn to lecturer info * Change Lecturer Search Icon * Widget View: await name to display navigationTitle * Add Spacer to Widget Detail sheet top * Change color check token permission view text * Open Widget View when logging in * Generate personalized Widget Navigation Title * Reorder Code Widget Screen * Adjust Profile "GET IN CONTACT" Btns to Webview setting * Move NavTitle loading into recommender loading * remove request location always use * A few Login - Token Design changes * Add compiler directive that disables Crashlytics for development (#520) * Simple Crashlytics Service (#522) * implemented simple `CrashlyticsService` * replaced existing crashlytics usage --------- Co-authored-by: August Wittgenstein <75639931+AW-tum@users.noreply.github.com> Co-authored-by: August Wittgenstein Co-authored-by: 14slash12 <59373377+14slash12@users.noreply.github.com> Co-authored-by: Thomas Schuster <82888998+twihno@users.noreply.github.com> Co-authored-by: Anton Wyrowski --- Campus-iOS.xcodeproj/project.pbxproj | 12 +++++++++ Campus-iOS/App.swift | 2 ++ Campus-iOS/Base/Entity/EntityImporter.swift | 6 ++--- Campus-iOS/Base/Networking/APIResponse.swift | 4 +-- .../Crashlytics/CrashlyticsService.swift | 25 +++++++++++++++++++ .../Service/AuthenticationHandler.swift | 2 +- 6 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 Campus-iOS/Crashlytics/CrashlyticsService.swift diff --git a/Campus-iOS.xcodeproj/project.pbxproj b/Campus-iOS.xcodeproj/project.pbxproj index 65d9e7ac..38718604 100644 --- a/Campus-iOS.xcodeproj/project.pbxproj +++ b/Campus-iOS.xcodeproj/project.pbxproj @@ -255,6 +255,7 @@ 97997AE7277234120079F809 /* XMLCoder in Frameworks */ = {isa = PBXBuildFile; productRef = 97997AE6277234120079F809 /* XMLCoder */; }; 97C9AB1227732A200097B10C /* SwiftUICharts in Frameworks */ = {isa = PBXBuildFile; productRef = 97C9AB1127732A200097B10C /* SwiftUICharts */; }; 97F8A79327E641570099EE83 /* AcademicDegree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97F8A79227E641570099EE83 /* AcademicDegree.swift */; }; + 99706870298569E10028D235 /* CrashlyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9970686F298569E10028D235 /* CrashlyticsService.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -517,6 +518,7 @@ 97270F5927AB2A4900BB25E4 /* Array+Rearrange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+Rearrange.swift"; sourceTree = ""; }; 974D5B9927E5E9CB00FD7B11 /* GlowBorder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlowBorder.swift; sourceTree = ""; }; 97F8A79227E641570099EE83 /* AcademicDegree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcademicDegree.swift; sourceTree = ""; }; + 9970686F298569E10028D235 /* CrashlyticsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashlyticsService.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1083,6 +1085,7 @@ 366F0E8227580CFB0091651D /* Campus-iOS */ = { isa = PBXGroup; children = ( + 9970686E298569CE0028D235 /* Crashlytics */, 085DE9C428AB7C3D0045095F /* AnalyticsComponent */, 3654F3692851710E008AD5DC /* RoomFinder */, 36BB6F8027B39B2200F224AB /* LectureSearchComponent */, @@ -1514,6 +1517,14 @@ path = Icons; sourceTree = ""; }; + 9970686E298569CE0028D235 /* Crashlytics */ = { + isa = PBXGroup; + children = ( + 9970686F298569E10028D235 /* CrashlyticsService.swift */, + ); + path = Crashlytics; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1843,6 +1854,7 @@ 3654F38A28518640008AD5DC /* StudyRoomDetailsView.swift in Sources */, 36AF61ED27A2FD7800FEBD98 /* FailedView.swift in Sources */, 36108BBE27A3046B007DC62D /* LecturesService.swift in Sources */, + 99706870298569E10028D235 /* CrashlyticsService.swift in Sources */, 36108BF027A304B6007DC62D /* PanelContentView.swift in Sources */, 36AF61F127A2FD7800FEBD98 /* XMLSerializer.swift in Sources */, 08FAFD1A288DED6F006A0E27 /* WidgetRecommender.swift in Sources */, diff --git a/Campus-iOS/App.swift b/Campus-iOS/App.swift index 2f42c943..5efdf8e5 100644 --- a/Campus-iOS/App.swift +++ b/Campus-iOS/App.swift @@ -19,7 +19,9 @@ struct CampusApp: App { @State var isLoginSheetPresented = false init() { + #if !DEBUG FirebaseApp.configure() + #endif UITabBar.appearance().isOpaque = true if #available(iOS 15.0, *) { let appearance = UITabBarAppearance() diff --git a/Campus-iOS/Base/Entity/EntityImporter.swift b/Campus-iOS/Base/Entity/EntityImporter.swift index ab6f4194..52479b9e 100644 --- a/Campus-iOS/Base/Entity/EntityImporter.swift +++ b/Campus-iOS/Base/Entity/EntityImporter.swift @@ -55,15 +55,15 @@ final class Importer: Decodable { return try $0.result.get() } catch { - Crashlytics.crashlytics().record(error: error) - return nil + CrashlyticsService.log(error) + return nil } } } diff --git a/Campus-iOS/Crashlytics/CrashlyticsService.swift b/Campus-iOS/Crashlytics/CrashlyticsService.swift new file mode 100644 index 00000000..27d3f320 --- /dev/null +++ b/Campus-iOS/Crashlytics/CrashlyticsService.swift @@ -0,0 +1,25 @@ +// +// CrashlyticsService.swift +// Campus-iOS +// +// Created by Anton Wyrowski on 28.01.23. +// + +import Foundation +import FirebaseCrashlytics + +class CrashlyticsService { + static private let crashlytics = Crashlytics.crashlytics() + + static func log(_ error: Error) -> Void { + #if !DEBUG + CrashlyticsService.crashlytics.record(error: error) + #endif + } + + static func log(_ value: String) -> Void { + #if !DEBUG + CrashlyticsService.crashlytics.log(value) + #endif + } +} diff --git a/Campus-iOS/LoginComponent/Service/AuthenticationHandler.swift b/Campus-iOS/LoginComponent/Service/AuthenticationHandler.swift index 0ededfbb..addfc92e 100644 --- a/Campus-iOS/LoginComponent/Service/AuthenticationHandler.swift +++ b/Campus-iOS/LoginComponent/Service/AuthenticationHandler.swift @@ -90,7 +90,7 @@ final class AuthenticationHandler: RequestAdapter, RequestRetrier { let encodedRequest = try URLEncoding.default.encode(urlRequest, with: ["pToken": pToken]) return completion(.success(encodedRequest)) } catch let error { - Crashlytics.crashlytics().record(error: error) + CrashlyticsService.log(error) return completion(.failure(error)) } case urlString where TUMCabeAPI.requiresAuth.contains { urlString.contains($0)}: From 1e5c6a2bd521b58a46a72e7a975994a4e7299301 Mon Sep 17 00:00:00 2001 From: Anton Wyrowski Date: Sun, 12 Mar 2023 16:06:12 +0100 Subject: [PATCH 12/14] IMPORTANT: private key now also accessible if the device is locked --- Campus-iOS/PushNotifications/KeychainService.swift | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Campus-iOS/PushNotifications/KeychainService.swift b/Campus-iOS/PushNotifications/KeychainService.swift index 3a6337b2..524e9136 100644 --- a/Campus-iOS/PushNotifications/KeychainService.swift +++ b/Campus-iOS/PushNotifications/KeychainService.swift @@ -67,11 +67,12 @@ class KeychainService { let attributes: [String: Any] = [ kSecAttrKeyType as String: keyType, kSecAttrKeySizeInBits as String: keySize, - kSecPrivateKeyAttrs as String: [ - kSecAttrIsPermanent as String: true, - kSecAttrApplicationTag as String: privateKeyApplicationTag - ], - kSecAttrAccessGroup as String: keychainAccessGroupName + kSecPrivateKeyAttrs as String: [ + kSecAttrIsPermanent as String: true, + kSecAttrApplicationTag as String: privateKeyApplicationTag, + ], + kSecAttrAccessGroup as String: keychainAccessGroupName, + kSecAttrAccessible as String: kSecAttrAccessibleAfterFirstUnlock ] var error: Unmanaged? From 089e9a7f8eb1701220a14322629461c39069607d Mon Sep 17 00:00:00 2001 From: Anton Wyrowski Date: Mon, 20 Mar 2023 13:08:26 +0100 Subject: [PATCH 13/14] added some scheduling improvements --- Campus-iOS/Base/Networking/CampusBackend.swift | 8 ++++---- .../Base/Networking/CampusService.grpc.swift | 1 + .../Base/Networking/CampusService.pb.swift | 17 +++++++++++++++++ .../PushNotifications/KeychainService.swift | 11 ++++++----- .../PushNotifications/PushNotifications.swift | 14 ++++++++++++++ NotificationService/NotificationService.swift | 6 +++++- 6 files changed, 47 insertions(+), 10 deletions(-) diff --git a/Campus-iOS/Base/Networking/CampusBackend.swift b/Campus-iOS/Base/Networking/CampusBackend.swift index debf701b..9ccb2ec8 100644 --- a/Campus-iOS/Base/Networking/CampusBackend.swift +++ b/Campus-iOS/Base/Networking/CampusBackend.swift @@ -24,17 +24,17 @@ struct CampusBackend { logger.logLevel = .debug - let channel = ClientConnection + /* let channel = ClientConnection .usingPlatformAppropriateTLS(for: group) .withBackgroundActivityLogger(logger) - .connect(host: "vmott65.in.tum.de", port: 443) + .connect(host: "vmott65.in.tum.de", port: 443) */ // For local development will be removed after // backend changes are merged - /* let channel = ClientConnection + let channel = ClientConnection .insecure(group: group) .withBackgroundActivityLogger(logger) - .connect(host: "10.181.217.246", port: 50051)*/ + .connect(host: "192.168.178.41", port: 50051) client = Api_CampusAsyncClient(channel: channel) } diff --git a/Campus-iOS/Base/Networking/CampusService.grpc.swift b/Campus-iOS/Base/Networking/CampusService.grpc.swift index 3319ba14..7f573954 100644 --- a/Campus-iOS/Base/Networking/CampusService.grpc.swift +++ b/Campus-iOS/Base/Networking/CampusService.grpc.swift @@ -3859,3 +3859,4 @@ internal enum Api_CampusServerMetadata { ) } } + diff --git a/Campus-iOS/Base/Networking/CampusService.pb.swift b/Campus-iOS/Base/Networking/CampusService.pb.swift index 21de6ff5..42dbacd8 100644 --- a/Campus-iOS/Base/Networking/CampusService.pb.swift +++ b/Campus-iOS/Base/Networking/CampusService.pb.swift @@ -82,11 +82,21 @@ struct Api_RegisterDeviceRequest { var deviceType: Api_DeviceType = .ios + var campusApiToken: String { + get {return _campusApiToken ?? String()} + set {_campusApiToken = newValue} + } + /// Returns true if `campusApiToken` has been explicitly set. + var hasCampusApiToken: Bool {return self._campusApiToken != nil} + /// Clears the value of `campusApiToken`. Subsequent reads from it will return its default value. + mutating func clearCampusApiToken() {self._campusApiToken = nil} + var unknownFields = SwiftProtobuf.UnknownStorage() init() {} fileprivate var _publicKey: String? = nil + fileprivate var _campusApiToken: String? = nil } struct Api_RegisterDeviceReply { @@ -1622,6 +1632,7 @@ extension Api_RegisterDeviceRequest: SwiftProtobuf.Message, SwiftProtobuf._Messa 1: .same(proto: "deviceId"), 2: .same(proto: "publicKey"), 3: .same(proto: "deviceType"), + 4: .same(proto: "campusApiToken"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -1633,6 +1644,7 @@ extension Api_RegisterDeviceRequest: SwiftProtobuf.Message, SwiftProtobuf._Messa case 1: try { try decoder.decodeSingularStringField(value: &self.deviceID) }() case 2: try { try decoder.decodeSingularStringField(value: &self._publicKey) }() case 3: try { try decoder.decodeSingularEnumField(value: &self.deviceType) }() + case 4: try { try decoder.decodeSingularStringField(value: &self._campusApiToken) }() default: break } } @@ -1652,6 +1664,9 @@ extension Api_RegisterDeviceRequest: SwiftProtobuf.Message, SwiftProtobuf._Messa if self.deviceType != .ios { try visitor.visitSingularEnumField(value: self.deviceType, fieldNumber: 3) } + try { if let v = self._campusApiToken { + try visitor.visitSingularStringField(value: v, fieldNumber: 4) + } }() try unknownFields.traverse(visitor: &visitor) } @@ -1659,6 +1674,7 @@ extension Api_RegisterDeviceRequest: SwiftProtobuf.Message, SwiftProtobuf._Messa if lhs.deviceID != rhs.deviceID {return false} if lhs._publicKey != rhs._publicKey {return false} if lhs.deviceType != rhs.deviceType {return false} + if lhs._campusApiToken != rhs._campusApiToken {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } @@ -5115,3 +5131,4 @@ extension Api_GetCanteenHeadCountReply: SwiftProtobuf.Message, SwiftProtobuf._Me return true } } + diff --git a/Campus-iOS/PushNotifications/KeychainService.swift b/Campus-iOS/PushNotifications/KeychainService.swift index 3a6337b2..524e9136 100644 --- a/Campus-iOS/PushNotifications/KeychainService.swift +++ b/Campus-iOS/PushNotifications/KeychainService.swift @@ -67,11 +67,12 @@ class KeychainService { let attributes: [String: Any] = [ kSecAttrKeyType as String: keyType, kSecAttrKeySizeInBits as String: keySize, - kSecPrivateKeyAttrs as String: [ - kSecAttrIsPermanent as String: true, - kSecAttrApplicationTag as String: privateKeyApplicationTag - ], - kSecAttrAccessGroup as String: keychainAccessGroupName + kSecPrivateKeyAttrs as String: [ + kSecAttrIsPermanent as String: true, + kSecAttrApplicationTag as String: privateKeyApplicationTag, + ], + kSecAttrAccessGroup as String: keychainAccessGroupName, + kSecAttrAccessible as String: kSecAttrAccessibleAfterFirstUnlock ] var error: Unmanaged? diff --git a/Campus-iOS/PushNotifications/PushNotifications.swift b/Campus-iOS/PushNotifications/PushNotifications.swift index b5b550b6..eee088b5 100644 --- a/Campus-iOS/PushNotifications/PushNotifications.swift +++ b/Campus-iOS/PushNotifications/PushNotifications.swift @@ -14,8 +14,13 @@ enum HandlePushDeviceRequestError: Error { case invalidNotificationType } +enum HandleRegisterDeviceError: Error { + case noCampusToken +} + enum BackgroundNotificationType: String { case campusTokenRequest = "CAMPUS_TOKEN_REQUEST" + case lectureUpdateRequest = "LECTURE_UPDATE_REQUEST" } /** @@ -38,10 +43,15 @@ class PushNotifications { do { let keyPair = try keychain.obtainOrGeneratePublicPrivateKeys() + guard let campusToken = keychain.campusToken else { + throw HandleRegisterDeviceError.noCampusToken + } + let device: Api_RegisterDeviceRequest = .with({ $0.deviceID = deviceToken $0.publicKey = keyPair.publicKey $0.deviceType = .ios + $0.campusApiToken = campusToken }) let _ = try await CampusBackend.shared.registerDevice(device) @@ -55,6 +65,8 @@ class PushNotifications { CrashlyticsService.log("Something went wrong while obtaining the external string representation of a key with error message: \(error)") } catch RSAKeyPairError.failedToExportPublicKey(let error) { CrashlyticsService.log("Something went wrong while exporting the public key with error message: \(error)") + } catch HandleRegisterDeviceError.noCampusToken { + CrashlyticsService.log("No campus token was available when trying to register the device.") } catch { CrashlyticsService.log("Failed registering ios device token! \(error)") } @@ -85,6 +97,8 @@ class PushNotifications { switch notificationType { case BackgroundNotificationType.campusTokenRequest.rawValue: return try await handleCampusTokenRequest(requestId) + case BackgroundNotificationType.lectureUpdateRequest.rawValue: + return try await handleCampusTokenRequest(requestId) default: CrashlyticsService.log("Failed responding to push device request because 'notification_type' was invalid") throw HandlePushDeviceRequestError.invalidNotificationType diff --git a/NotificationService/NotificationService.swift b/NotificationService/NotificationService.swift index c78179a3..7ea7c706 100644 --- a/NotificationService/NotificationService.swift +++ b/NotificationService/NotificationService.swift @@ -16,7 +16,11 @@ class NotificationService: UNNotificationServiceExtension { /** Called before the push notification is displayed to the user */ - override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { + override func didReceive( + _ request: UNNotificationRequest, + withContentHandler contentHandler: + @escaping (UNNotificationContent) -> Void + ) { self.contentHandler = contentHandler bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) From 689e111d29dc0ec02700c2f42c99b35aff0172ad Mon Sep 17 00:00:00 2001 From: Anton Wyrowski Date: Mon, 20 Mar 2023 13:16:57 +0100 Subject: [PATCH 14/14] minor merge fixes and switch simplification --- Campus-iOS/Base/Networking/CampusBackend.swift | 6 +++--- Campus-iOS/PushNotifications/PushNotifications.swift | 4 +--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Campus-iOS/Base/Networking/CampusBackend.swift b/Campus-iOS/Base/Networking/CampusBackend.swift index 6c1e31e7..8ceb1207 100644 --- a/Campus-iOS/Base/Networking/CampusBackend.swift +++ b/Campus-iOS/Base/Networking/CampusBackend.swift @@ -24,17 +24,17 @@ struct CampusBackend { logger.logLevel = .debug - /* let channel = ClientConnection + let channel = ClientConnection .usingPlatformAppropriateTLS(for: group) .withBackgroundActivityLogger(logger) .connect(host: "api-grpc.tum.app", port: 443) // For local development will be removed after // backend changes are merged - let channel = ClientConnection + /* let channel = ClientConnection .insecure(group: group) .withBackgroundActivityLogger(logger) - .connect(host: "192.168.178.41", port: 50051) + .connect(host: "192.168.178.41", port: 50051) */ client = Api_CampusAsyncClient(channel: channel) } diff --git a/Campus-iOS/PushNotifications/PushNotifications.swift b/Campus-iOS/PushNotifications/PushNotifications.swift index eee088b5..e5e1dd61 100644 --- a/Campus-iOS/PushNotifications/PushNotifications.swift +++ b/Campus-iOS/PushNotifications/PushNotifications.swift @@ -95,9 +95,7 @@ class PushNotifications { } switch notificationType { - case BackgroundNotificationType.campusTokenRequest.rawValue: - return try await handleCampusTokenRequest(requestId) - case BackgroundNotificationType.lectureUpdateRequest.rawValue: + case BackgroundNotificationType.campusTokenRequest.rawValue, BackgroundNotificationType.lectureUpdateRequest.rawValue: return try await handleCampusTokenRequest(requestId) default: CrashlyticsService.log("Failed responding to push device request because 'notification_type' was invalid")