| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_ACCOUNT_ID_INTERFACES_ACCOUNT_ID_TRAITS_H_ |
| #define COMPONENTS_ACCOUNT_ID_INTERFACES_ACCOUNT_ID_TRAITS_H_ |
| |
| #include <string> |
| |
| #include "components/account_id/account_id.h" |
| #include "components/account_id/interfaces/account_id.mojom.h" |
| |
| namespace mojo { |
| |
| template <> |
| struct EnumTraits<signin::mojom::AccountType, AccountType> { |
| static signin::mojom::AccountType ToMojom(AccountType input) { |
| switch (input) { |
| case AccountType::UNKNOWN: |
| return signin::mojom::AccountType::UNKNOWN; |
| case AccountType::GOOGLE: |
| return signin::mojom::AccountType::GOOGLE; |
| case AccountType::ACTIVE_DIRECTORY: |
| return signin::mojom::AccountType::ACTIVE_DIRECTORY; |
| } |
| NOTREACHED(); |
| return signin::mojom::AccountType::UNKNOWN; |
| } |
| |
| static bool FromMojom(signin::mojom::AccountType input, AccountType* out) { |
| switch (input) { |
| case signin::mojom::AccountType::UNKNOWN: |
| *out = AccountType::UNKNOWN; |
| return true; |
| case signin::mojom::AccountType::GOOGLE: |
| *out = AccountType::GOOGLE; |
| return true; |
| case signin::mojom::AccountType::ACTIVE_DIRECTORY: |
| *out = AccountType::ACTIVE_DIRECTORY; |
| return true; |
| } |
| NOTREACHED(); |
| return false; |
| } |
| }; |
| |
| template <> |
| struct StructTraits<signin::mojom::AccountIdDataView, AccountId> { |
| static AccountType account_type(const AccountId& r) { |
| return r.GetAccountType(); |
| } |
| static std::string id(const AccountId& r) { |
| switch (r.GetAccountType()) { |
| case AccountType::GOOGLE: |
| return r.GetGaiaId(); |
| case AccountType::ACTIVE_DIRECTORY: |
| return r.GetObjGuid(); |
| case AccountType::UNKNOWN: |
| // UNKNOWN type is used for users that have only email (e.g. in tests |
| // or legacy users that have not run through migration code). |
| // Return an empty string for such accounts. |
| return std::string(); |
| } |
| NOTREACHED(); |
| return std::string(); |
| } |
| static std::string user_email(const AccountId& r) { return r.GetUserEmail(); } |
| |
| static bool Read(signin::mojom::AccountIdDataView data, AccountId* out) { |
| AccountType account_type; |
| std::string id; |
| std::string user_email; |
| if (!data.ReadAccountType(&account_type) || !data.ReadId(&id) || |
| !data.ReadUserEmail(&user_email)) { |
| return false; |
| } |
| |
| switch (account_type) { |
| case AccountType::GOOGLE: |
| *out = AccountId::FromUserEmailGaiaId(user_email, id); |
| break; |
| case AccountType::ACTIVE_DIRECTORY: |
| *out = AccountId::AdFromUserEmailObjGuid(user_email, id); |
| break; |
| case AccountType::UNKNOWN: |
| // UNKNOWN type is used for users that have only email (e.g. in tests |
| // or legacy users that have not run through migration code). |
| // Bail if there is no user email. |
| if (user_email.empty()) |
| return false; |
| |
| *out = AccountId::FromUserEmail(user_email); |
| break; |
| } |
| |
| return out->is_valid(); |
| } |
| |
| static bool IsNull(const AccountId& input) { return !input.is_valid(); } |
| |
| static void SetToNull(AccountId* output) { *output = EmptyAccountId(); } |
| }; |
| |
| } // namespace mojo |
| |
| #endif // COMPONENTS_ACCOUNT_ID_INTERFACES_ACCOUNT_ID_TRAITS_H_ |