1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #ifndef nsServiceManagerUtils_h__
8 #define nsServiceManagerUtils_h__
9
10 #include "nsIServiceManager.h"
11 #include "nsCOMPtr.h"
12
13 inline const nsGetServiceByCID
do_GetService(const nsCID & aCID)14 do_GetService(const nsCID& aCID)
15 {
16 return nsGetServiceByCID(aCID);
17 }
18
19 inline const nsGetServiceByCIDWithError
do_GetService(const nsCID & aCID,nsresult * aError)20 do_GetService(const nsCID& aCID, nsresult* aError)
21 {
22 return nsGetServiceByCIDWithError(aCID, aError);
23 }
24
25 inline const nsGetServiceByContractID
do_GetService(const char * aContractID)26 do_GetService(const char* aContractID)
27 {
28 return nsGetServiceByContractID(aContractID);
29 }
30
31 inline const nsGetServiceByContractIDWithError
do_GetService(const char * aContractID,nsresult * aError)32 do_GetService(const char* aContractID, nsresult* aError)
33 {
34 return nsGetServiceByContractIDWithError(aContractID, aError);
35 }
36
37 class MOZ_STACK_CLASS nsGetServiceFromCategory final : public nsCOMPtr_helper
38 {
39 public:
nsGetServiceFromCategory(const char * aCategory,const char * aEntry,nsresult * aErrorPtr)40 nsGetServiceFromCategory(const char* aCategory, const char* aEntry,
41 nsresult* aErrorPtr)
42 : mCategory(aCategory)
43 , mEntry(aEntry)
44 , mErrorPtr(aErrorPtr)
45 {
46 }
47
48 virtual nsresult NS_FASTCALL operator()(const nsIID&, void**) const
49 override;
50 protected:
51 const char* mCategory;
52 const char* mEntry;
53 nsresult* mErrorPtr;
54 };
55
56 inline const nsGetServiceFromCategory
57 do_GetServiceFromCategory(const char* aCategory, const char* aEntry,
58 nsresult* aError = 0)
59 {
60 return nsGetServiceFromCategory(aCategory, aEntry, aError);
61 }
62
63 nsresult CallGetService(const nsCID& aClass, const nsIID& aIID, void** aResult);
64
65 nsresult CallGetService(const char* aContractID, const nsIID& aIID,
66 void** aResult);
67
68 // type-safe shortcuts for calling |GetService|
69 template<class DestinationType>
70 inline nsresult
CallGetService(const nsCID & aClass,DestinationType ** aDestination)71 CallGetService(const nsCID& aClass,
72 DestinationType** aDestination)
73 {
74 NS_PRECONDITION(aDestination, "null parameter");
75
76 return CallGetService(aClass,
77 NS_GET_TEMPLATE_IID(DestinationType),
78 reinterpret_cast<void**>(aDestination));
79 }
80
81 template<class DestinationType>
82 inline nsresult
CallGetService(const char * aContractID,DestinationType ** aDestination)83 CallGetService(const char* aContractID,
84 DestinationType** aDestination)
85 {
86 NS_PRECONDITION(aContractID, "null parameter");
87 NS_PRECONDITION(aDestination, "null parameter");
88
89 return CallGetService(aContractID,
90 NS_GET_TEMPLATE_IID(DestinationType),
91 reinterpret_cast<void**>(aDestination));
92 }
93
94 #endif
95