using System; using System.Collections.Generic; using System.Threading.Tasks; using TINK.Model.Bikes.BikeInfoNS.BluetoothLock; using TINK.Model.Connector; using TINK.Repository.Request; using TINK.Repository.Response; using TINK.Repository.Response.Stations; namespace TINK.Repository { public class CopriCallsMemory : ICopriServer { /// Part in file specifying api server. private static string CopriDevelHostUri = @"https://tinkwwp.copri-bike.de/APIjsonserver"; public const string DO_AUTH_Unknown_User_FILE = @" { ""shareejson"" : { ""response"" : ""authorization"", ""authcookie"" : 0, ""response_state"" : ""Failure: cannot generate authcookie"", ""apiserver"" : ""https://tinkwwp.copri-bike.de"" } }"; public const string DO_AUTH_SET02_001_FILE = @" { ""shareejson"" : { ""response"" : ""authorization"", ""authcookie"" : ""4da3044c8657a04ba60e2eaa753bc51a"", ""user_group"" : [""TINK""], ""response_state"" : ""OK"", ""apiserver"" : ""https://tinkwwp.copri-bike.de"" } }"; public const string DO_AUTHOUT_SET02_001_FILE = @"{ ""shareejson"" : { ""apiserver"" : ""https://app.tink-konstanz.de"", ""user_id"" : ""ohauff@posteo.de"", ""response_state"" : ""OK"", ""authcookie"" : ""1"", ""response"" : ""authout"", ""user_group"" : [ """" ], ""debuglevel"" : ""1"", ""copri_version"" : ""4.1.0.0"" } }"; /// /// Station TINK: 4, 5, 7, 8, 10, 11, 12, 31 /// Station Konrad: 14, 31 /// Stations: /// 4. Available: 26 Trike, 14, Cargo, 5 Cargo /// 5. Available: 45 Cargo, 11 Cargo T, 2 Cargo, 52 Sr /// 7. Available: 20 Cargo, /// 8. Available: 19 Cargo /// 10. Available: 18 Cargo /// 11. Available: 17 Cargo /// 12. Available: 13 Cargo /// /// /// public const string STATIONS_SET02_001_FILE = @" { ""shareejson"": { ""authcookie"": 0, ""apiserver"": ""https://tinkwwp.copri-bike.de"", ""response"": ""stations_all"", ""stations"": { ""5786"": { ""station"" : ""4"", ""station_group"" : [ ""TINK"" ], ""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" } }, ""2456"": { ""station"" : ""5"", ""station_group"" : [ ""TINK"" ], ""gps"" : { ""latitude"": ""47.6675153333"", ""longitude"": ""9.16473216667"" } }, ""2798"": { ""station"" : ""12"", ""station_group"" : [ ""TINK"" ], ""gps"" : { ""latitude"": ""47.6748671667"", ""longitude"": ""9.17326583333"" } }, ""3214"": { ""station"" : ""8"", ""station_group"" : [ ""TINK"" ], ""gps"" : { ""latitude"": ""47.666401"", ""longitude"": ""9.175902"" } }, ""5462"": { ""station"" : ""11"", ""station_group"" : [ ""TINK"" ], ""gps"" : { ""latitude"": ""47.672231"", ""longitude"": ""9.175862"" } }, ""3965"": { ""station"" : ""10"", ""station_group"" : [ ""TINK"" ], ""gps"" : { ""latitude"": ""47.665556"", ""longitude"": ""9.17095133333"" } }, ""5423"": { ""station"" : ""7"", ""station_group"" : [ ""TINK"" ], ""gps"" : { ""latitude"": ""47.6612413333"", ""longitude"": ""9.16641016667"" } }, ""14"": { ""station_group"" : [ ""Konrad"" ], ""description"": """", ""station"" : ""14"", ""gps"" : { ""latitude"": ""47.66698054007847"", ""longitude"": ""9.169303178787231"" } }, ""31"": { ""station_group"": [ ""TINK"" , ""Konrad""], ""description"": ""Südstadt Station"", ""station"" : ""31"", ""gps"" : { ""latitude"": ""47.69489"", ""longitude"": ""9.19"" } } }, ""response_state"": ""OK"", ""copri_version"" : ""4.1.0.0"" } }"; /// public const string STATIONS_AVAILABLE_LOGGEDIN_20210720 = @" { ""shareejson"": { ""lang"": ""DE"", ""impress_html"": ""site/impress.html"", ""tariff_info_html"": ""site/tariff_info_1.html"", ""debuglevel"": ""1"", ""user_tour"": [ null, """" ], ""response"": ""stations_available"", ""user_id"": ""ohauff@posteo.de"", ""stations"": { ""LV_3"": { ""service_tour"": ""LV_1"", ""uri_operator"": ""https://shareeapp-lv.copri.eu"", ""authed"": ""1"", ""station"": ""LV_3"", ""gps"": { ""latitude"": ""47.9973"", ""longitude"": ""7.8585"" }, ""gps_radius"": ""100"", ""description"": ""Katholische Akademie"", ""state"": ""available"", ""operator_data"": { ""operator_color"": ""#006269"", ""operator_hours"": """", ""operator_name"": ""LastenVelo Freiburg"", ""operator_email"": ""info@lastenvelofreiburg.de"", ""operator_phone"": """" }, ""station_group"": [ ""LV_300005"" ] }, ""LV_1"": { ""uri_operator"": ""https://shareeapp-lv.copri.eu"", ""station"": ""LV_1"", ""gps"": { ""latitude"": ""47.9848"", ""longitude"": ""7.848666"" }, ""authed"": ""1"", ""service_tour"": ""LV_1"", ""operator_data"": { ""operator_hours"": """", ""operator_email"": ""info@lastenvelofreiburg.de"", ""operator_name"": ""LastenVelo Freiburg"", ""operator_color"": ""#006269"", ""operator_phone"": """" }, ""state"": ""available"", ""description"": ""Parkplatz Feuerwehr Wiehre"", ""station_group"": [ ""LV_300005"" ], ""gps_radius"": ""100"" }, ""FR_105"": { ""gps_radius"": ""50"", ""station_group"": [ ""FR_300029"" ], ""state"": ""available"", ""description"": ""Contributor-Station Rainer"", ""operator_data"": { ""operator_phone"": ""+49 761 45370097"", ""operator_hours"": ""B�rozeiten: Montag, Mittwoch, Freitag 9-12 Uhr"", ""operator_name"": ""sharee.bike | TeilRad GmbH"", ""operator_email"": ""hotline@sharee.bike"", ""operator_color"": ""#009699"" }, ""service_tour"": ""FR_1"", ""authed"": ""1"", ""station"": ""FR_105"", ""gps"": { ""longitude"": "" 7.973855"", ""latitude"": ""47.927738"" }, ""uri_operator"": ""https://shareeapp-fr01.copri.eu"" }, ""FR_104"": { ""gps_radius"": ""50"", ""operator_data"": { ""operator_phone"": ""+49 761 45370097"", ""operator_color"": ""#009699"", ""operator_email"": ""hotline@sharee.bike"", ""operator_name"": ""sharee.bike | TeilRad GmbH"", ""operator_hours"": ""B�rozeiten: Montag, Mittwoch, Freitag 9-12 Uhr"" }, ""description"": ""Contributor-Station fahrradspezialitäten"", ""state"": ""available"", ""station_group"": [ ""FR_300029"" ], ""service_tour"": ""FR_1"", ""uri_operator"": ""https://shareeapp-fr01.copri.eu"", ""gps"": { ""latitude"": ""47.989807"", ""longitude"": "" 7.837621"" }, ""station"": ""FR_104"", ""authed"": ""1"" }, ""FR_103"": { ""uri_operator"": ""https://shareeapp-fr01.copri.eu"", ""authed"": ""1"", ""gps"": { ""longitude"": "" 7.785428"", ""latitude"": ""47.997930"" }, ""station"": ""FR_103"", ""service_tour"": ""FR_1"", ""description"": ""Contributor-Station Oliver"", ""state"": ""available"", ""operator_data"": { ""operator_phone"": ""+49 761 45370097"", ""operator_hours"": ""B�rozeiten: Montag, Mittwoch, Freitag 9-12 Uhr"", ""operator_name"": ""sharee.bike | TeilRad GmbH"", ""operator_email"": ""hotline@sharee.bike"", ""operator_color"": ""#009699"" }, ""station_group"": [ ""FR_300029"" ], ""gps_radius"": ""50"" }, ""LV_88"": { ""station_group"": [ ""LV_300005"" ], ""state"": ""available"", ""description"": ""TINK Test KN"", ""operator_data"": { ""operator_name"": ""LastenVelo Freiburg"", ""operator_email"": ""info@lastenvelofreiburg.de"", ""operator_hours"": """", ""operator_color"": ""#006269"", ""operator_phone"": """" }, ""gps_radius"": ""50"", ""authed"": ""1"", ""gps"": { ""latitude"": ""47.65934079179006"", ""longitude"": "" 9.166126178863573"" }, ""station"": ""LV_88"", ""uri_operator"": ""https://shareeapp-lv.copri.eu"", ""service_tour"": ""LV_2"" }, ""LV_4"": { ""uri_operator"": ""https://shareeapp-lv.copri.eu"", ""authed"": ""1"", ""station"": ""LV_4"", ""gps"": { ""latitude"": ""48.01095"", ""longitude"": ""7.8553"" }, ""service_tour"": ""LV_1"", ""state"": ""available"", ""description"": ""Fabrik Habsburger Straße"", ""operator_data"": { ""operator_phone"": """", ""operator_hours"": """", ""operator_email"": ""info@lastenvelofreiburg.de"", ""operator_name"": ""LastenVelo Freiburg"", ""operator_color"": ""#006269"" }, ""station_group"": [ ""LV_300005"" ], ""gps_radius"": ""100"" }, ""LV_2"": { ""uri_operator"": ""https://shareeapp-lv.copri.eu"", ""authed"": ""1"", ""gps"": { ""longitude"": ""7.84795"", ""latitude"": ""47.99762"" }, ""station"": ""LV_2"", ""service_tour"": ""LV_1"", ""description"": ""Predigertor ADAC"", ""state"": ""available"", ""operator_data"": { ""operator_phone"": """", ""operator_name"": ""LastenVelo Freiburg"", ""operator_email"": ""info@lastenvelofreiburg.de"", ""operator_hours"": """", ""operator_color"": ""#006269"" }, ""station_group"": [ ""LV_300005"" ], ""gps_radius"": ""100"" }, ""FR_102"": { ""description"": ""Contributor-Station Dieter"", ""state"": ""available"", ""operator_data"": { ""operator_phone"": ""+49 761 45370097"", ""operator_hours"": ""B�rozeiten: Montag, Mittwoch, Freitag 9-12 Uhr"", ""operator_email"": ""hotline@sharee.bike"", ""operator_name"": ""sharee.bike | TeilRad GmbH"", ""operator_color"": ""#009699"" }, ""station_group"": [ ""FR_300029"" ], ""gps_radius"": ""50"", ""uri_operator"": ""https://shareeapp-fr01.copri.eu"", ""authed"": ""1"", ""station"": ""FR_102"", ""gps"": { ""longitude"": "" 7.835669"", ""latitude"": ""47.994371"" }, ""service_tour"": ""FR_1"" }, ""FR_101"": { ""station_group"": [ ""FR_300001"" ], ""state"": ""available"", ""description"": ""Villaban sharee Station"", ""operator_data"": { ""operator_color"": ""#009699"", ""operator_email"": ""hotline@sharee.bike"", ""operator_name"": ""sharee.bike | TeilRad GmbH"", ""operator_hours"": ""B�rozeiten: Montag, Mittwoch, Freitag 9-12 Uhr"", ""operator_phone"": ""+49 761 45370097"" }, ""gps_radius"": ""50"", ""authed"": ""1"", ""gps"": { ""longitude"": "" 7.825490"", ""latitude"": ""47.976634"" }, ""station"": ""FR_101"", ""uri_operator"": ""https://shareeapp-fr01.copri.eu"", ""service_tour"": ""FR_1"" } }, ""response_state"": ""OK, nothing todo"", ""agb_checked"": ""1"", ""agb_html"": ""site/agb.html"", ""authcookie"": ""5781_f172cf59108fe53e7524c841847fee69_oiF2kahH"", ""Ilockit_admin"": ""1"", ""copri_version"": ""4.1.0.0"", ""bike_info_html"": ""site/bike_info.html"", ""uri_operator_array"": [ ""https://shareeapp-lv.copri.eu"", ""https://shareeapp-fr01.copri.eu"" ], ""uri_primary"": ""https://shareeapp-primary.copri.eu"", ""apiserver"": ""https://shareeapp-primary.copri.eu"", ""last_used_operator"": { ""operator_phone"": ""+49 761 45370097"", ""operator_color"": ""#009699"", ""operator_email"": ""hotline@sharee.bike"", ""operator_name"": ""sharee.bike | TeilRad GmbH"", ""operator_hours"": ""Bürozeiten: Montag, Mittwoch, Freitag 9-12 Uhr"" }, ""clearing_cache"": ""0"", ""user_group"": [ ""LV_300005"", ""FR_300029"", ""FR_300001"" ], ""privacy_html"": ""site/privacy.html"", ""new_authcoo"": ""0"" } } "; const string BOOKING_REQUEST_SET02_001_FILE = @" { ""shareejson"" : { ""response_state"" : ""OK: requested bike 8"", ""bikes_occupied"" : { ""87781"" : { ""timeCode"" : ""3630"", ""state"" : ""occupied"", ""station"" : ""5"", ""description"" : ""Cargo Long"", ""start_time"" : ""2017-11-28 11:01:51.637747+01"", ""bike"" : ""8"" }, ""87780"" : { ""timeCode"" : ""1056"", ""state"" : ""occupied"", ""station"" : ""4"", ""description"" : ""Cargo Long"", ""start_time"" : ""2017-11-28 10:43:24.886288+01"", ""bike"" : ""7"" } }, ""timeCode"" : ""3630"", ""response"" : ""booking_request"", ""authcookie"" : ""4da3044c8657a04ba60e2eaa753bc51aoiF2kahH"", ""apiserver"" : ""https://tinkwwp.copri-bike.de"" } } "; /// /// Holds three rented bc- bikes. /// const string BIKES_OCCUPIED_REQUEST_SET01_001_FILE = @" { ""shareejson"" : { ""apiserver"" : ""https://tinkwwp.copri-bike.de"", ""bikes_occupied"" : { ""87785"" : { ""station"" : ""2"", ""state"" : ""occupied"", ""bike"" : ""20"", ""description"" : ""Cargo Long"", ""start_time"" : ""2017-12-01 22:21:57.740069+01"", ""timeCode"" : ""6603"" }, ""87782"" : { ""station"" : ""4"", ""state"" : ""occupied"", ""bike"" : ""7"", ""description"" : ""Cargo Long"", ""start_time"" : ""2017-11-28 13:06:55.147368+01"", ""timeCode"" : ""2931"" }, ""87781"" : { ""station"" : ""5"", ""state"" : ""occupied"", ""bike"" : ""8"", ""description"" : ""Cargo Long"", ""start_time"" : ""2017-11-28 11:01:51.637747+01"", ""timeCode"" : ""3630"" }, }, ""response_state"" : ""OK"", ""authcookie"" : ""4da3044c8657a04ba60e2eaa753bc51a"", ""response"" : ""user_bikes_occupied"", ""copri_version"" : ""4.1.0.0"" } }"; /// /// Two rented bc bikes. /// const string BIKES_OCCUPIED_REQUEST_SET02_001_FILE = @" { ""shareejson"": { ""response_state"": ""OK"", ""bikes_occupied"": { ""87781"": { ""timeCode"": ""3630"", ""state"": ""occupied"", ""station"" : ""5"", ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""start_time"": ""2017-11-28 11:01:51.637747+01"", ""bike"": ""8"" }, ""87782"": { ""timeCode"": ""2931"", ""state"": ""occupied"", ""station"" : ""4"", ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""start_time"": ""2017-11-28 13:06:55.147368+01"", ""bike"": ""7"" } }, ""authcookie"": ""4da3044c8657a04ba60e2eaa753bc51a"", ""response"": ""user_bikes_occupied"", ""apiserver"": ""https://tinkwwp.copri-bike.de"", ""copri_version"" : ""4.1.0.0"" } }"; /// /// One reserved and two rented bikes. /// const string BIKES_OCCUPIED_REQUEST_SET02_002_FILE = @" { ""shareejson"": { ""response_state"": ""OK"", ""bikes_occupied"": { ""87781"": { ""timeCode"": ""3630"", ""state"": ""occupied"", ""station"" : ""5"", ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""start_time"": ""2017-11-28 11:01:51.637747+01"", ""bike"": ""8"" }, ""87782"": { ""timeCode"": ""2931"", ""state"": ""occupied"", ""station"" : ""4"", ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""start_time"": ""2017-11-28 13:06:55.147368+01"", ""bike"": ""7"" }, ""2360"": { ""timeCode"": ""2360"", ""state"": ""reserved"", ""station"" : ""4"", ""description"": ""Cargo Long"", ""bike_type"": { ""category"": ""cargo"", ""wheels"": ""2"" }, ""bike_group"" : [ ""TINK"" ], ""start_time"": ""2017-11-28 14:07:13.745568+01"", ""bike"": ""5"" } }, ""authcookie"": ""4da3044c8657a04ba60e2eaa753bc51a"", ""response"": ""user_bikes_occupied"", ""apiserver"": ""https://tinkwwp.copri-bike.de"", ""copri_version"" : ""4.1.0.0"" } }"; /// /// Three rented bikes. /// const string BIKES_OCCUPIED_REQUEST_SET02_003_FILE = @" { ""shareejson"": { ""response_state"": ""OK"", ""bikes_occupied"": { ""87781"": { ""timeCode"": ""3630"", ""state"": ""occupied"", ""station"" : ""5"", ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""start_time"": ""2017-11-28 11:01:51.637747+01"", ""bike"": ""8"" }, ""87782"": { ""timeCode"": ""2931"", ""state"": ""occupied"", ""station"" : ""4"", ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""start_time"": ""2017-11-28 13:06:55.147368+01"", ""bike"": ""7"" }, ""2360"": { ""timeCode"": ""2360"", ""state"": ""occupied"", ""station"" : ""4"", ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""start_time"": ""2017-11-28 14:08:32.756368+01"", ""bike"": ""5"", ""bike_type"": { ""category"": ""cargo"", ""wheels"": ""2"" }, } }, ""authcookie"": ""4da3044c8657a04ba60e2eaa753bc51a"", ""response"": ""user_bikes_occupied"", ""apiserver"": ""https://tinkwwp.copri-bike.de"", ""copri_version"" : ""4.1.0.0"" } }"; /// /// Two rented bikes. /// const string BIKES_OCCUPIED_REQUEST_SHAREEFR01_SET1_FILE = @" { ""shareejson"": { ""privacy_html"": ""site/privacy.html"", ""response"": ""user_bikes_occupied"", ""apiserver"": ""https://shareeapp-fr01.copri.eu"", ""authcookie"": ""5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH"", ""impress_html"": ""site/impress.html"", ""tariff_info_html"": ""site/tariff_info.html"", ""bikes_occupied"": { ""155776"": { ""K_a"": ""[-83, 104, 55, -74, 16, -105, 124, -103, -68, -17, -127, -113, 56, 43, -61, -86, 124, -54, 63, 57, 0, 0, 0, 0]"", ""real_hours"": ""49.3"", ""bike"": ""1545"", ""tariff_description"": { ""eur_per_hour"" : ""2.50"", ""number"" : ""5494"", ""name"" : ""Tester Basic"", ""max_eur_per_day"" : ""10.00"" }, ""lock_state"": ""unlocked"", ""total_price"": ""23.75"", ""station"" : ""103"", ""gps"" : { ""latitude"": ""47.9980383301154"", ""longitude"": ""7.78496129438281"" }, ""system"": ""Ilockit"", ""end_time"": ""2020-11-08 19:11:27"", ""bike_group"" : [ ""300029"" ], ""Ilockit_ID"": ""ISHAREIT-2200545"", ""start_time"": ""2020-11-06 17:53:22.784681+01"", ""unit_price"": ""2.50"", ""request_time"": ""2020-11-06 17:52:56.832138+01"", ""state"": ""occupied"", ""Ilockit_GUID"": ""00000000-0000-0000-0000-e38bf9d32234"", ""computed_hours"": ""9.50"", ""K_u"": ""[53, 92, -55, -109, 112, 38, -35, 43, -18, 122, 115, 50, -85, -57, 62, -57, -112, 2, 117, -47, 0, 0, 0, 0]"", ""description"": ""Tester-bike (Ilockit)"", ""K_seed"": ""[119, -47, -91, -36, -29, -17, 35, 47, -80, -112, -55, 2, 70, -45, 60, -62]"" }, ""155744"": { ""Ilockit_GUID"": ""00000000-0000-0000-0000-d589a8023487"", ""unit_price"": ""2.50"", ""start_time"": ""2020-10-12 08:38:30.401679+02"", ""request_time"": ""2020-10-12 08:38:12.374231+02"", ""state"": ""occupied"", ""K_u"": ""[93, -45, -89, -38, 50, 107, 21, -119, -26, -90, -15, 99, 17, 44, -20, 24, 34, -111, 125, -31, 0, 0, 0, 0]"", ""computed_hours"": ""112"", ""K_seed"": ""[24, 69, -21, 52, 55, 3, -71, 30, -71, 43, 108, -100, 15, 126, -117, 40]"", ""description"": ""Oliver (Ilockit)"", ""tariff_description"": { ""eur_per_hour"" : ""2.50"", ""number"" : ""5494"", ""name"" : ""Tester Basic"", ""max_eur_per_day"" : ""10.00"" }, ""bike"": ""1537"", ""real_hours"": ""659.55"", ""lock_state"": ""locked"", ""K_a"": ""[109, 35, -55, 78, -65, 87, -43, -4, -90, -104, -16, -45, -80, -80, 106, -25, -77, 111, -79, 58, 0, 0, 0, 0]"", ""system"": ""Ilockit"", ""gps"" : { ""latitude"": ""47.9977741744369"", ""longitude"": ""7.78484562411904"" }, ""station"" : ""103"", ""total_price"": ""280.00"", ""Ilockit_ID"": ""ISHAREIT-2200537"", ""bike_group"" : [ ""300029"" ], ""end_time"": ""2020-11-08 19:11:25"" } }, ""bike_info_html"": ""site/bike_info.html"", ""agb_html"": ""site/agb.html"", ""agb_checked"": ""1"", ""user_id"": ""ohauff@posteo.de"", ""response_state"": ""OK: nothing todo "", ""lang"": ""DE"", ""user_group"": [ ""300029"", ""300001"" ], ""debuglevel"": ""1"", ""copri_version"" : ""4.1.0.0"" } }"; /// /// One reserved and two rented bikes. /// /// /// Response from BIKES_OCCUPIED_REQUEST_SHAREEFR01_SET2_FILE taken (does not yet contain uri_operator) and reserved bike added. /// const string BIKES_OCCUPIED_REQUEST_SHAREEFR01_SET2_FILE = @" { ""shareejson"": { ""privacy_html"": ""site/privacy.html"", ""response"": ""user_bikes_occupied"", ""apiserver"": ""https://shareeapp-fr01.copri.eu"", ""authcookie"": ""5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH"", ""impress_html"": ""site/impress.html"", ""tariff_info_html"": ""site/tariff_info.html"", ""bikes_occupied"": { ""155776"": { ""K_a"": ""[-83, 104, 55, -74, 16, -105, 124, -103, -68, -17, -127, -113, 56, 43, -61, -86, 124, -54, 63, 57, 0, 0, 0, 0]"", ""real_hours"": ""49.3"", ""bike"": ""1545"", ""tariff_description"": { ""eur_per_hour"" : ""2.50"", ""number"" : ""5494"", ""name"" : ""Tester Basic"", ""max_eur_per_day"" : ""10.00"" }, ""lock_state"": ""unlocked"", ""total_price"": ""23.75"", ""station"" : ""103"", ""gps"" : { ""latitude"": ""47.9980383301154"", ""longitude"": ""7.78496129438281"" }, ""system"": ""Ilockit"", ""end_time"": ""2020-11-08 19:11:27"", ""bike_group"" : [ ""300029"" ], ""Ilockit_ID"": ""ISHAREIT-2200545"", ""start_time"": ""2020-11-06 17:53:22.784681+01"", ""unit_price"": ""2.50"", ""request_time"": ""2020-11-06 17:52:56.832138+01"", ""state"": ""occupied"", ""Ilockit_GUID"": ""00000000-0000-0000-0000-e38bf9d32234"", ""computed_hours"": ""9.50"", ""K_u"": ""[53, 92, -55, -109, 112, 38, -35, 43, -18, 122, 115, 50, -85, -57, 62, -57, -112, 2, 117, -47, 0, 0, 0, 0]"", ""description"": ""Tester-bike (Ilockit)"", ""K_seed"": ""[119, -47, -91, -36, -29, -17, 35, 47, -80, -112, -55, 2, 70, -45, 60, -62]"" }, ""155744"": { ""Ilockit_GUID"": ""00000000-0000-0000-0000-d589a8023487"", ""unit_price"": ""2.50"", ""start_time"": ""2020-10-12 08:38:30.401679+02"", ""request_time"": ""2020-10-12 08:38:12.374231+02"", ""state"": ""occupied"", ""K_u"": ""[93, -45, -89, -38, 50, 107, 21, -119, -26, -90, -15, 99, 17, 44, -20, 24, 34, -111, 125, -31, 0, 0, 0, 0]"", ""computed_hours"": ""112"", ""K_seed"": ""[24, 69, -21, 52, 55, 3, -71, 30, -71, 43, 108, -100, 15, 126, -117, 40]"", ""description"": ""Oliver (Ilockit)"", ""tariff_description"": { ""eur_per_hour"" : ""2.50"", ""number"" : ""5494"", ""name"" : ""Tester Basic"", ""max_eur_per_day"" : ""10.00"" }, ""bike"": ""1537"", ""uri_operator"" : ""https://shareeapp-fr01.copri.eu"", ""real_hours"": ""659.55"", ""lock_state"": ""locked"", ""K_a"": ""[109, 35, -55, 78, -65, 87, -43, -4, -90, -104, -16, -45, -80, -80, 106, -25, -77, 111, -79, 58, 0, 0, 0, 0]"", ""system"": ""Ilockit"", ""gps"" : { ""latitude"": ""47.9977741744369"", ""longitude"": ""7.78484562411904"" }, ""station"" : ""103"", ""total_price"": ""280.00"", ""Ilockit_ID"": ""ISHAREIT-2200537"", ""bike_group"" : [ ""300029"" ], ""end_time"": ""2020-11-08 19:11:25"" }, ""156350"" : { ""total_price"" : ""0.00"", ""description"" : ""Tester-bike Oliver 2"", ""K_u"" : ""[-72, 88, 96, -80, -2, 82, 36, -67, 48, 101, -55, 127, -85, 95, -83, -77, 14, -103, -14, -47, 0, 0, 0, 0]"", ""real_hours"" : ""0"", ""state"" : ""requested"", ""tariff_description"" : { ""eur_per_hour"" : ""3.00"", ""max_eur_per_day"" : ""10.00"", ""number"" : ""5494"", ""name"" : ""Tester Basic"" }, ""station"" : ""FR_103"", ""Ilockit_ID"" : ""ISHAREIT-2302373"", ""K_seed"" : ""[-93, -36, 49, -84, 65, 107, 74, 125, -91, -59, 43, 45, 85, -126, 91, -27]"", ""K_a"" : ""[-76, 86, 39, -62, 89, 76, 23, -37, 108, -4, 4, -36, -48, 26, -110, -75, 96, -101, -26, -51, 0, 0, 0, 0]"", ""end_time"" : ""2021-07-04 17:46:00+02"", ""system"" : ""Ilockit"", ""computed_hours"" : ""0"", ""bike"" : ""FR_1004"", ""uri_operator"" : ""https://shareeapp-fr01.copri.eu"", ""start_time"" : ""2021-07-04 17:46:36.237404+02"", ""bike_group"" : [ ""FR_300029"" ], ""gps"" : { ""latitude"" : ""47.9978876"", ""longitude"" : ""7.7849563"" }, ""unit_price"" : ""3.00"", ""lock_state"" : ""locked"", ""Ilockit_GUID"" : ""00000000-0000-0000-0000-fe3962c08bcc"", ""request_time"" : ""2021-07-04 17:46:36.237404+02"" } }, ""bike_info_html"": ""site/bike_info.html"", ""agb_html"": ""site/agb.html"", ""agb_checked"": ""1"", ""user_id"": ""ohauff@posteo.de"", ""response_state"": ""OK: nothing todo "", ""lang"": ""DE"", ""user_group"": [ ""300029"", ""300001"" ], ""debuglevel"": ""1"", ""copri_version"" : ""4.1.0.0"" } }"; const string BIKES_AVAILABLE_SET01_001_FILE = @" { ""shareejson"" : { ""bikes"" : { ""2352"" : { ""description"" : ""Cargo Long"", ""state"" : ""available"", ""bike"" : ""1"", ""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" }, ""station"" : ""9"" }, ""2379"" : { ""description"" : ""Cargo Long"", ""state"" : ""available"", ""bike"" : ""19"", ""gps"" : { ""latitude"": ""47.6597846667"", ""longitude"": ""9.177439"" }, ""station"" : ""3"" }, ""2354"" : { ""description"" : ""Cargo Long"", ""state"" : ""available"", ""bike"" : ""2"", ""gps"" : { ""latitude"": ""47.6721741667"", ""longitude"": ""9.176165"" }, ""station"" : ""11"" } }, ""response_state"" : ""OK"", ""authcookie"" : ""4da3044c8657a04ba60e2eaa753bc51a"", ""apiserver"" : ""https://tinkwwp.copri-bike.de"", ""response"" : ""bikes_available"", ""copri_version"" : ""4.1.0.0"" } } "; const string BIKES_AVAILABLE_SET02_001_FILE = @" { ""shareejson"" : { ""authcookie"" : 0, ""apiserver"" : ""https://tinkwwp.copri-bike.de"", ""response"" : ""bikes_available"", ""bikes"" : { ""3399"" : { ""description"" : ""Cargo Trike"", ""bike_group"" : [ ""TINK"" ], ""bike"" : ""26"", ""state"" : ""available"", ""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" }, ""system"" : ""BC"", ""station"" : ""4"" }, ""3398"" : { ""description"" : ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"" : ""25"", ""state"" : ""available"", ""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168173"" }, ""system"" : ""BC"", ""station"" : ""5"" }, ""2374"" : { ""description"" : ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"" : ""14"", ""state"" : ""available"", ""gps"" : { ""latitude"": ""0.0"", ""longitude"": ""0.0"" }, ""system"" : ""BC"", ""station"" : ""4"" }, ""2373"" : { ""description"" : ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"" : ""13"", ""state"" : ""available"", ""gps"" : { ""latitude"": ""47.6748671667"", ""longitude"": ""9.17326583333"" }, ""system"" : ""BC"", ""station"" : ""12"" }, ""2366"" : { ""description"" : ""Cargo Trike"", ""bike_group"" : [ ""TINK"" ], ""bike"" : ""11"", ""state"" : ""available"", ""gps"" : { ""latitude"": ""47.667938"", ""longitude"": ""9.164895"" }, ""system"" : ""BC"", ""station"" : ""5"" }, ""2379"" : { ""description"" : ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"" : ""19"", ""state"" : ""available"", ""gps"" : { ""latitude"": ""47.666401"", ""longitude"": ""9.175902"" }, ""system"" : ""BC"", ""station"" : ""8"" }, ""2377"" : { ""description"" : ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"" : ""17"", ""state"" : ""available"", ""gps"" : { ""latitude"": ""47.672231"", ""longitude"": ""9.175862"" }, ""system"" : ""BC"", ""station"" : ""11"" }, ""2378"" : { ""description"" : ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"" : ""18"", ""state"" : ""available"", ""gps"" : { ""latitude"": ""47.665556"", ""longitude"": ""9.17095133333"" }, ""system"" : ""BC"", ""station"" : ""10"" }, ""2354"" : { ""description"" : ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"" : ""2"", ""state"" : ""available"", ""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168159"" }, ""system"" : ""BC"", ""station"" : ""5"" }, ""2360"" : { ""description"" : ""Cargo long"", ""bike_group"" : [ ""TINK"" ], ""bike"" : ""5"", ""bike_type"": { ""category"": ""cargo"", ""wheels"": ""2"" }, ""state"" : ""available"", ""gps"" : { ""latitude"": ""47.672082"", ""longitude"": ""9.17655283333"" }, ""system"" : ""BC"", ""station"" : ""4"" }, ""2380"" : { ""description"" : ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"" : ""20"", ""state"" : ""available"", ""gps"" : { ""latitude"": ""47.6612413333"", ""longitude"": ""9.16641016667"" }, ""system"" : ""BC"", ""station"" : ""7"" }, ""52"" : { ""state"" : ""available"", ""bike"" : ""52"", ""description"" : ""Stadtflitzer"", ""bike_group"" : [ ""Konrad"" ], ""station"" : ""31"", ""system"" : ""BC"", ""gps"" : { ""latitude"": ""47.67484"", ""longitude"": ""9.17254"" } } }, ""response_state"" : ""OK"", ""copri_version"" : ""4.1.0.0"" } }"; const string BIKES_AVAILABLE_SET02_002_FILE = @" { ""shareejson"": { ""authcookie"": 0, ""apiserver"": ""https://tinkwwp.copri-bike.de"", ""response"": ""bikes_available"", ""bikes"": { ""3399"": { ""description"": ""Cargo Trike"", ""bike_group"" : [ ""TINK"" ], ""bike"": 26, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" }, ""station"" : ""4"" }, ""3398"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 25, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168173"" }, ""station"" : ""5"" }, ""2374"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 14, ""state"": ""available"", ""gps"" : { ""latitude"": ""0.0"", ""longitude"": ""0.0"" }, ""station"" : ""4"" }, ""2373"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 13, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.6748671667"", ""longitude"": ""9.17326583333"" }, ""station"" : ""12"" }, ""2366"": { ""description"": ""Cargo Trike"", ""bike_group"" : [ ""TINK"" ], ""bike"": 11, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.667938"", ""longitude"": ""9.164895"" }, ""station"" : ""5"" }, ""2379"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 19, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.666401"", ""longitude"": ""9.175902"" }, ""station"" : ""8"" }, ""2377"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 17, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.672231"", ""longitude"": ""9.175862"" }, ""station"" : ""11"" }, ""2378"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 18, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.665556"", ""longitude"": ""9.17095133333"" }, ""station"" : ""10"" }, ""2354"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 2, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168159"" }, ""station"" : ""5"" }, ""2380"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 20, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.6612413333"", ""longitude"": ""9.16641016667"" }, ""station"" : ""7"" }, ""52"" : { ""state"" : ""available"", ""bike"" : ""52"", ""description"" : ""Stadtflitzer"", ""bike_group"" : [ ""Konrad"" ], ""station"" : ""5"", ""gps"" : { ""latitude"": ""47.67484"", ""longitude"": ""9.17254"" } } }, ""response_state"": ""OK"", ""copri_version"" : ""4.1.0.0"" } }"; const string BIKES_AVAILABLE_SET02_003_FILE = @" { ""shareejson"": { ""authcookie"": 0, ""apiserver"": ""https://tinkwwp.copri-bike.de"", ""response"": ""bikes_available"", ""bikes"": { ""3399"": { ""description"": ""Cargo Trike"", ""bike_group"" : [ ""TINK"" ], ""bike"": 26, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" }, ""station"" : ""4"" }, ""3398"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 25, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168173"" }, ""station"" : ""5"" }, ""2374"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 14, ""state"": ""available"", ""gps"" : { ""latitude"": ""0.0"", ""longitude"": ""0.0"" }, ""station"" : ""4"" }, ""2373"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 13, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.6748671667"", ""longitude"": ""9.17326583333"" }, ""station"" : ""12"" }, ""2366"": { ""description"": ""Cargo Trike"", ""bike_group"" : [ ""TINK"" ], ""bike"": 11, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.667938"", ""longitude"": ""9.164895"" }, ""station"" : ""5"" }, ""2379"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 19, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.666401"", ""longitude"": ""9.175902"" }, ""station"" : ""8"" }, ""2377"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 17, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.672231"", ""longitude"": ""9.175862"" }, ""station"" : ""11"" }, ""2378"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 18, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.665556"", ""longitude"": ""9.17095133333"" }, ""station"" : ""10"" }, ""2354"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 2, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.669895"", ""longitude"": ""9.168159"" }, ""station"" : ""5"" }, ""2380"": { ""description"": ""Cargo Long"", ""bike_group"" : [ ""TINK"" ], ""bike"": 20, ""state"": ""available"", ""gps"" : { ""latitude"": ""47.6612413333"", ""longitude"": ""9.16641016667"" }, ""station"" : ""7"" }, ""52"" : { ""state"" : ""available"", ""bike"" : ""52"", ""description"" : ""Stadtflitzer"", ""bike_group"" : [ ""Konrad"" ], ""station"" : ""5"", ""gps"" : { ""latitude"": ""47.67484"", ""longitude"": ""9.17254"" } } }, ""response_state"": ""OK"", ""copri_version"" : ""4.1.0.0"" } }"; /// /// Five available bikes. /// const string BIKES_AVAILABLE_REQUEST_SHAREEFR01_SET1_FILE = @" { ""shareejson"": { ""user_id"": ""ohauff@posteo.de"", ""privacy_html"": ""site/privacy.html"", ""agb_checked"": ""1"", ""debuglevel"": ""1"", ""agb_html"": ""site/agb.html"", ""bike_info_html"": ""site/bike_info.html"", ""copri_version"": ""4.1.0.0"", ""apiserver"": ""https://shareeapp-fr01.copri.eu"", ""lang"": ""DE"", ""impress_html"": ""site/impress.html"", ""response"": ""bikes_available"", ""tariff_info_html"": ""site/tariff_info.html"", ""user_group"": [ ""300029"", ""300001"" ], ""authcookie"": ""5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH"", ""response_state"": ""OK: nothing todo "", ""bikes"": { ""1536"": { ""bike"": ""1536"", ""tariff_description"": { ""eur_per_hour"" : ""3.00"", ""number"" : ""5491"", ""name"" : ""Vauban Basic"", ""max_eur_per_day"" : ""15.00"" }, ""description"": ""Vauban-bike (Ilockit)"", ""state"": ""available"", ""station"" : ""101"", ""gps"" : { ""latitude"": ""47.976741"", ""longitude"": ""7.8257615"" }, ""lock_state"": ""locked"", ""Ilockit_ID"": ""ISHAREIT-2200536"", ""Ilockit_GUID"": ""00000000-0000-0000-0000-caa87760e53e"", ""system"": ""Ilockit"", ""bike_group"" : [ ""300001"" ] }, ""1539"": { ""gps"" : { ""latitude"": ""47.992718"", ""longitude"": ""7.833071"" }, ""station"" : ""104"", ""tariff_description"": { ""eur_per_hour"" : ""3.00"", ""number"" : ""5494"", ""name"" : ""Tester Basic"", ""max_eur_per_day"" : ""10.00"" }, ""description"": ""Tester-bike (Ilockit)"", ""bike"": ""1539"", ""state"": ""available"", ""bike_group"" : [ ""300029"" ], ""system"": ""Ilockit"", ""lock_state"": ""unlocked"", ""Ilockit_ID"": ""ISHAREIT-2200539"", ""Ilockit_GUID"": ""00000000-0000-0000-0000-f0b4a692e169"" }, ""1315"": { ""system"": ""Ilockit"", ""bike_group"" : [ ""300029"" ], ""Ilockit_GUID"": ""00000000-0000-0000-e57e6b9aee16"", ""Ilockit_ID"": ""ISHAREIT-2200315"", ""lock_state"": ""locked"", ""gps"" : { ""latitude"": ""47.997930"", ""longitude"": ""7.785428"" }, ""station"" : ""103"", ""state"": ""available"", ""bike"": ""1315"", ""description"": ""Tester-bike (Ilockit)"", ""tariff_description"": { ""eur_per_hour"" : ""3.00"", ""number"" : ""5494"", ""name"" : ""Tester Basic"", ""max_eur_per_day"" : ""10.00"" }, }, ""1544"": { ""station"" : ""101"", ""gps"" : { ""latitude"": ""47.976634"", ""longitude"": ""7.825490"" }, ""state"": ""available"", ""tariff_description"": { ""eur_per_hour"" : ""3.00"", ""number"" : ""5491"", ""name"" : ""Vauban Basic"", ""max_eur_per_day"" : ""15.00"" }, ""description"": ""Vauban-bike (Ilockit)"", ""bike"": ""1544"", ""bike_group"" : [ ""300001"" ], ""system"": ""Ilockit"", ""Ilockit_GUID"": ""00000000-0000-0000-0000-dc969f648732"", ""Ilockit_ID"": ""ISHAREIT-2200544"", ""lock_state"": ""locked"" }, ""1543"": { ""gps"" : { ""latitude"": ""47.9979824"", ""longitude"": ""7.7848131"" }, ""station"" : ""103"", ""bike"": ""1543"", ""description"": ""Tester-bike (Ilockit)"", ""tariff_description"": { ""eur_per_hour"" : ""3.00"", ""number"" : ""5494"", ""name"" : ""Tester Basic"", ""max_eur_per_day"" : ""10.00"" }, ""state"": ""available"", ""system"": ""Ilockit"", ""bike_group"" : [ ""300029"" ], ""Ilockit_ID"": ""ISHAREIT-2200543"", ""lock_state"": ""locked"", ""Ilockit_GUID"": ""00000000-0000-0000-0000-cc141a6f68bb"" } } } }"; private const SampleSets DEFAULT_SAMPLE_SET = SampleSets.Set2; private const int DEFAULT_STAGE_INDEX = 1; private IRequestBuilder requestBuilder; public CopriCallsMemory( string merchantId, SampleSets? sampleSet = null, int? index = null, string sessionCookie = null) { MerchantId = merchantId ?? throw new ArgumentNullException(nameof(merchantId)); ActiveSampleSet = sampleSet ?? DEFAULT_SAMPLE_SET; ActiveStageIndex = index ?? DEFAULT_STAGE_INDEX; SessionCookie = sessionCookie; requestBuilder = string.IsNullOrEmpty(sessionCookie) ? new RequestBuilder(MerchantId, null /*UI language */, null /* smart device */) as IRequestBuilder : new RequestBuilderLoggedIn(MerchantId, null /*UI language */, sessionCookie, null /* smart device */); } /// Holds the session id of the logged in user, null otherwise. public string SessionCookie { get; private set; } /// Logs user in. /// User to log in. /// Id specifying user and hardware. /// Mailaddress of user to log in. /// Password to log in. /// Response which holds auth cookie public async Task DoAuthorizationAsync( string p_strMailAddress, string p_strPassword, string p_strDeviceId) { return await Task.Run(() => DoAuthorize(p_strMailAddress, p_strPassword, p_strDeviceId)); } /// Logs user out. /// User to log in. /// Response which holds auth cookie public async Task DoAuthoutAsync() { return await Task.Run(() => DoAuthout(SessionCookie)); } /// /// Gets list of bikes from memory. /// /// public async Task GetBikesAvailableAsync() { return await Task.Run(() => GetBikesAvailable(null, SessionCookie, ActiveSampleSet, ActiveStageIndex)); } /// /// Gets a list of bikes reserved/ booked by active user from Copri. /// /// Cookie to authenticate user. /// Response holding list of bikes. public async Task GetBikesOccupiedAsync() { try { requestBuilder.GetBikesOccupied(); // Non mock implementation if ICopriServer call this member as well. To ensure comparable behavior this member is called here as well. } catch (NotSupportedException) { // No user logged in. await Task.CompletedTask; return ResponseHelper.GetBikesOccupiedNone(); } return await Task.Run(() => GetBikesOccupied(SessionCookie, ActiveSampleSet, ActiveStageIndex)); } /// /// Get list of stations from file. /// /// Auto cookie of user if user is logged in. /// List of files. public async Task GetStationsAsync() { return await Task.Run(() => GetStationsAll(null, SessionCookie, ActiveSampleSet, ActiveStageIndex)); } /// /// Gets booking request response. /// /// Id of the bike to book. /// Booking response. public async Task DoReserveAsync(string bikeId, Uri operatorUri) { return await Task.Run(() => DoReserve(bikeId, SessionCookie, ActiveSampleSet, ActiveStageIndex)); } /// /// Gets canel booking request response. /// /// Id of the bike to book. /// Cookie of the logged in user. /// Response on cancel booking request. public async Task DoCancelReservationAsync(string bikeId, Uri operatorUri) { return await Task.Run(() => DoCancelReservation(bikeId, SessionCookie, ActiveSampleSet, ActiveStageIndex)); } /// /// Gets the count of stages that exist for a given sample set. /// /// /// public int StagesCount { get { var l_iCount = 1; while (GetBikesAvailable(CopriDevelHostUri, MerchantId, sampleSet: ActiveSampleSet, stageIndex: l_iCount) != null) { l_iCount++; } return l_iCount - 1; } } /// Gets the merchant id. public string MerchantId { get; private set; } /// /// Gets the active sample set. /// public SampleSets ActiveSampleSet { get; } /// /// Gets the active stage index. /// public int ActiveStageIndex { get; } /// Returns false because cached values are returned. public bool IsConnected => false; /// Logs user in. /// User to log in. /// Id specifying user and hardware. /// Mailaddress of user to log in. /// Password to log in. /// Response which holds auth cookie public static AuthorizationResponse DoAuthorize( string p_strMailAddress, string p_strPassword, string p_strDeviceId, SampleSets p_eSampleSet = DEFAULT_SAMPLE_SET, long p_lStageIndex = DEFAULT_STAGE_INDEX) { switch (p_eSampleSet) { case SampleSets.Set2: switch (p_lStageIndex) { case 1: // Response contains auth cookie of user "JavaministerHardwareNr1" // For this reason do not return answer if mail and pwd do not match. return p_strMailAddress == "javaminister@gmail.com" && p_strPassword == "javaminister" && p_strDeviceId == "HwId1000000000000" ? JsonConvertRethrow.DeserializeObject>(DO_AUTH_SET02_001_FILE).shareejson : JsonConvertRethrow.DeserializeObject>(DO_AUTH_Unknown_User_FILE).shareejson; default: return null; } default: return null; } } /// Logs user in. /// Response which holds auth cookie public static AuthorizationoutResponse DoAuthout( string sessionCookie, SampleSets p_eSampleSet = DEFAULT_SAMPLE_SET, long p_lStageIndex = DEFAULT_STAGE_INDEX) { switch (p_eSampleSet) { case SampleSets.Set2: switch (p_lStageIndex) { case 1: // Response contains auth cookie of user "JavaministerHardwareNr1" // For this reason do not return answer if mail and pwd do not match. return !string.IsNullOrEmpty(sessionCookie) ? JsonConvertRethrow.DeserializeObject>(DO_AUTHOUT_SET02_001_FILE).shareejson : throw new NotSupportedException(); default: return null; } default: return null; } } /// /// Gets list of bikes from memory. /// /// Id of the merchant. /// Auto cookie of user if user is logged in. /// Set of samples. /// Index of the stage. /// public static BikesAvailableResponse GetBikesAvailable( string merchantId, string sessionCookie = null, SampleSets sampleSet = DEFAULT_SAMPLE_SET, long stageIndex = DEFAULT_STAGE_INDEX) { switch (sampleSet) { case SampleSets.Set1: switch (stageIndex) { case 1: return CopriCallsStatic.DeserializeResponse(BIKES_AVAILABLE_SET01_001_FILE); default: return null; } case SampleSets.Set2: switch (stageIndex) { case 1: return CopriCallsStatic.DeserializeResponse(BIKES_AVAILABLE_SET02_001_FILE); case 2: return CopriCallsStatic.DeserializeResponse(BIKES_AVAILABLE_SET02_002_FILE); case 3: return CopriCallsStatic.DeserializeResponse(BIKES_AVAILABLE_SET02_003_FILE); default: return null; } case SampleSets.ShareeFr01_Set1: switch (stageIndex) { case 1: return CopriCallsStatic.DeserializeResponse(BIKES_AVAILABLE_REQUEST_SHAREEFR01_SET1_FILE); default: return null; } default: return null; } } /// /// Gets stations response. /// /// Id of the merchant. /// Auto cookie of user if user is logged in. /// /// /// public static StationsAvailableResponse GetStationsAll( string merchantId, string cookie = null, SampleSets p_eSampleSet = DEFAULT_SAMPLE_SET, long p_lStageIndex = DEFAULT_STAGE_INDEX) { switch (p_eSampleSet) { case SampleSets.Set2: switch (p_lStageIndex) { case 1: return JsonConvertRethrow.DeserializeObject>(STATIONS_SET02_001_FILE).shareejson; default: return null; } default: return null; } } /// /// Gets booking request response. /// /// Id of the bike. /// Identifies the logged in user. /// Sample set to use. /// Index of the stage. /// public static ReservationBookingResponse DoReserve( string bikeId, string sessionCookie, SampleSets sampleSet = DEFAULT_SAMPLE_SET, long stageIndex = DEFAULT_STAGE_INDEX) { ReservationBookingResponse l_oResponse; switch (sampleSet) { case SampleSets.Set2: switch (stageIndex) { case 1: l_oResponse = JsonConvertRethrow.DeserializeObject>(BOOKING_REQUEST_SET02_001_FILE).shareejson; break; default: return null; } break; default: return null; } return l_oResponse; } /// /// Gets canel booking request response. /// /// Id of the bike to book. /// Cookie of the logged in user. /// Response on cancel booking request. public static ReservationCancelReturnResponse DoCancelReservation( string bikeId, string cookie, SampleSets sampleSet = DEFAULT_SAMPLE_SET, long stageIndex = DEFAULT_STAGE_INDEX) { return null; } public Task CalculateAuthKeysAsync(string bikeId, Uri operatorUri) => null; public Task StartReturningBike( string bikeId, Uri operatorUri) => null; public Task UpdateLockingStateAsync( string bikeId, lock_state state, Uri operatorUri, LocationDto geolocation, double batteryLevel, IVersionInfo versionInfo) => null; public Task DoBookAsync(Uri operatorUri, string bikeId, Guid guid, double batteryPercentage, LockingAction? nextAction = null) => null; public Task BookAvailableAndStartOpeningAsync( string bikeId, Uri operatorUri) => null; public Task BookReservedAndStartOpeningAsync( string bikeId, Uri operatorUri) => null; public Task DoReturn( string bikeId, LocationDto geolocation, Uri operatorUri) => null; public Task ReturnAndStartClosingAsync( string bikeId, Uri operatorUri) => throw new NotImplementedException(); public Task DoSubmitFeedback(string bikeId, int? currentChargeBars, string message, bool isBikeBroken, Uri operatorUri) => null; /// Submits mini survey to copri server. /// Collection of answers. public Task DoSubmitMiniSurvey(IDictionary answers) => null; /// /// Gets a list of bikes reserved/ booked by active user from Copri. /// /// Cookie to authenticate user. /// Sample set to use. /// Index of the stage. /// Response holding list of bikes. public static BikesReservedOccupiedResponse GetBikesOccupied( string sessionCookie = null, SampleSets sampleSet = DEFAULT_SAMPLE_SET, long stageIndex = DEFAULT_STAGE_INDEX) { BikesReservedOccupiedResponse response; switch (sampleSet) { case SampleSets.Set1: switch (stageIndex) { case 1: response = CopriCallsStatic.DeserializeResponse(BIKES_OCCUPIED_REQUEST_SET01_001_FILE); break; default: return null; } break; case SampleSets.Set2: switch (stageIndex) { case 1: response = CopriCallsStatic.DeserializeResponse(BIKES_OCCUPIED_REQUEST_SET02_001_FILE); break; case 2: response = CopriCallsStatic.DeserializeResponse(BIKES_OCCUPIED_REQUEST_SET02_002_FILE); break; case 3: response = CopriCallsStatic.DeserializeResponse(BIKES_OCCUPIED_REQUEST_SET02_003_FILE); break; default: return null; } break; case SampleSets.ShareeFr01_Set1: switch (stageIndex) { case 1: response = CopriCallsStatic.DeserializeResponse(BIKES_OCCUPIED_REQUEST_SHAREEFR01_SET1_FILE); break; case 2: response = CopriCallsStatic.DeserializeResponse(BIKES_OCCUPIED_REQUEST_SHAREEFR01_SET2_FILE); break; default: return null; } break; default: return null; } return sessionCookie == null || response?.authcookie == sessionCookie ? response : ResponseHelper.GetBikesOccupiedNone(sessionCookie); } public enum SampleSets { /// Used for tests and demo GUI. Set1, /// /// Sample set nr. 2. /// Bikes values from first Copri- JSON returns these values. /// Set2, /// /// Sharee server /// ShareeFr01_Set1, } } }