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