Chromium Code Reviews| Index: chrome/browser/password_manager/native_backend_gnome_x.h |
| =================================================================== |
| --- chrome/browser/password_manager/native_backend_gnome_x.h (revision 92796) |
| +++ chrome/browser/password_manager/native_backend_gnome_x.h (working copy) |
| @@ -6,6 +6,8 @@ |
| #define CHROME_BROWSER_PASSWORD_MANAGER_NATIVE_BACKEND_GNOME_X_H_ |
| #pragma once |
| +#include <gnome-keyring.h> |
| + |
| #include <string> |
| #include "base/basictypes.h" |
| @@ -19,8 +21,50 @@ |
| struct PasswordForm; |
| } |
| +// Many of the gnome_keyring_* functions use variable arguments, which makes |
| +// them difficult if not impossible to truly wrap in C. Therefore, we use |
| +// appropriately-typed function pointers and scoping to make the fact that we |
| +// might be dynamically loading the library almost invisible. As a bonus, we |
| +// also get a simple way to mock the library for testing. Classes that inherit |
| +// from GnomeKeyringLoader will use its versions of the gnome_keyring_* |
| +// functions. Note that it has only static fields. |
| +class GnomeKeyringLoader { |
| + protected: |
| + static bool LoadGnomeKeyring(); |
| + |
| +// Call a given parameter with the name of each function we use from GNOME |
| +// Keyring. Make sure to adjust the unit test if you change these. |
| +#define GNOME_KEYRING_FOR_EACH_FUNC(F) \ |
| + F(is_available) \ |
| + F(store_password) \ |
| + F(delete_password) \ |
| + F(find_itemsv) \ |
| + F(result_to_message) |
| + |
| +// Declare the actual function pointers that we'll use in client code. |
| +#define GNOME_KEYRING_DECLARE_POINTER(name) \ |
| + static typeof(&::gnome_keyring_##name) gnome_keyring_##name; |
| + GNOME_KEYRING_FOR_EACH_FUNC(GNOME_KEYRING_DECLARE_POINTER) |
| +#undef GNOME_KEYRING_DECLARE_POINTER |
| + |
| + // Set to true if LoadGnomeKeyring() has already succeeded. |
| + static bool keyring_loaded; |
| + |
| + private: |
| +#if defined(DLOPEN_GNOME_KEYRING) |
| + struct FunctionInfo { |
| + const char* name; |
| + void** pointer; |
| + }; |
| + |
| + // Make it easy to initialize the function pointers in LoadGnomeKeyring(). |
| + static const FunctionInfo functions[]; |
|
Evan Martin
2011/07/18 15:31:00
I'm surprised this is legal -- you'd think the arr
Mike Mammarella
2011/07/19 00:20:35
Yes, static is what saves us. Would you be as surp
|
| +#endif // !defined(DLOPEN_GNOME_KEYRING) |
| +}; |
| + |
| // NativeBackend implementation using GNOME Keyring. |
| -class NativeBackendGnome : public PasswordStoreX::NativeBackend { |
| +class NativeBackendGnome : public PasswordStoreX::NativeBackend, |
| + public GnomeKeyringLoader { |
|
Evan Martin
2011/07/18 15:31:00
This is weird. The class is all statics, right?
Mike Mammarella
2011/07/19 00:20:35
The comment above explains this somewhat; is it no
|
| public: |
| NativeBackendGnome(LocalProfileId id, PrefService* prefs); |