diff --git a/src/time_zone_lookup.cc b/src/time_zone_lookup.cc index ddc48e7..53fd40b 100644 --- a/src/time_zone_lookup.cc +++ b/src/time_zone_lookup.cc @@ -20,11 +20,12 @@ #if defined(__APPLE__) #include + #include #endif #if defined(__Fuchsia__) -#include +#include #include #include #include @@ -218,32 +219,31 @@ time_zone local_time_zone() { // Note: We can't use the synchronous FIDL API here because it doesn't // allow timeouts; if the FIDL call failed, local_time_zone() would never // return. - const zx::duration kTimeout = zx::msec(500); // Don't attach to the thread because otherwise the thread's dispatcher // would be set to null when the loop is destroyed, causing any other FIDL // code running on the same thread to crash. async::Loop loop(&kAsyncLoopConfigNeverAttachToThread); - - fuchsia::intl::PropertyProviderHandle handle; + auto endpoints = + fidl::Endpoints::Create(); zx_status_t status = fdio_service_connect_by_name( - fuchsia::intl::PropertyProvider::Name_, - handle.NewRequest().TakeChannel().release()); - if (status != ZX_OK) { - return; - } - - fuchsia::intl::PropertyProviderPtr intl_provider; - status = intl_provider.Bind(std::move(handle), loop.dispatcher()); + fidl::DiscoverableProtocolName, + endpoints.server.TakeChannel().release()); if (status != ZX_OK) { return; } - - intl_provider->GetProfile( - [&loop, &primary_tz](fuchsia::intl::Profile profile) { - if (!profile.time_zones().empty()) { - primary_tz = profile.time_zones()[0].id; + fidl::Client intl_provider( + std::move(endpoints.client), loop.dispatcher()); + + // Attempt to initialize the time zone only once, and fail quietly. + // The end result of an error is an empty time zone string. + intl_provider->GetProfile().Then( + [&loop, &primary_tz]( + fidl::Result& result) { + if (result.is_ok()) { + const auto& response = result.value(); + primary_tz = response.profile().time_zones().value()[0].id(); } loop.Quit(); });