|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #include <iostream.h> |
|
7 #include "plstr.h" |
|
8 #include "prlink.h" |
|
9 #include "nsIComponentRegistrar.h" |
|
10 #include "nsIComponentManager.h" |
|
11 #include "nsIServiceManager.h" |
|
12 #include "nsIFile.h" |
|
13 #include "nsCOMPtr.h" |
|
14 #include "nsString.h" |
|
15 |
|
16 static bool gUnreg = false; |
|
17 |
|
18 void print_err(nsresult err) |
|
19 { |
|
20 switch (err) { |
|
21 case NS_ERROR_FACTORY_NOT_LOADED: |
|
22 cerr << "Factory not loaded"; |
|
23 break; |
|
24 case NS_NOINTERFACE: |
|
25 cerr << "No Interface"; |
|
26 break; |
|
27 case NS_ERROR_NULL_POINTER: |
|
28 cerr << "Null pointer"; |
|
29 break; |
|
30 case NS_ERROR_OUT_OF_MEMORY: |
|
31 cerr << "Out of memory"; |
|
32 break; |
|
33 default: |
|
34 cerr << hex << err << dec; |
|
35 } |
|
36 } |
|
37 |
|
38 nsresult Register(nsIComponentRegistrar* registrar, const char *path) |
|
39 { |
|
40 nsCOMPtr<nsIFile> file; |
|
41 nsresult rv = |
|
42 NS_NewLocalFile( |
|
43 NS_ConvertUTF8toUTF16(path), |
|
44 true, |
|
45 getter_AddRefs(file)); |
|
46 if (NS_FAILED(rv)) return rv; |
|
47 rv = registrar->AutoRegister(file); |
|
48 return rv; |
|
49 } |
|
50 |
|
51 nsresult Unregister(const char *path) |
|
52 { |
|
53 /* NEEDS IMPLEMENTATION */ |
|
54 #if 0 |
|
55 nsresult res = nsComponentManager::AutoUnregisterComponent(path); |
|
56 return res; |
|
57 #else |
|
58 return NS_ERROR_FAILURE; |
|
59 #endif |
|
60 } |
|
61 |
|
62 int ProcessArgs(nsIComponentRegistrar* registrar, int argc, char *argv[]) |
|
63 { |
|
64 int i = 1; |
|
65 nsresult res; |
|
66 |
|
67 while (i < argc) { |
|
68 if (argv[i][0] == '-') { |
|
69 int j; |
|
70 for (j = 1; argv[i][j] != '\0'; j++) { |
|
71 switch (argv[i][j]) { |
|
72 case 'u': |
|
73 gUnreg = true; |
|
74 break; |
|
75 default: |
|
76 cerr << "Unknown option '" << argv[i][j] << "'\n"; |
|
77 } |
|
78 } |
|
79 i++; |
|
80 } else { |
|
81 if (gUnreg) { |
|
82 res = Unregister(argv[i]); |
|
83 if (NS_SUCCEEDED(res)) { |
|
84 cout << "Successfully unregistered: " << argv[i] << "\n"; |
|
85 } else { |
|
86 cerr << "Unregister failed ("; |
|
87 print_err(res); |
|
88 cerr << "): " << argv[i] << "\n"; |
|
89 } |
|
90 } else { |
|
91 res = Register(registrar, argv[i]); |
|
92 if (NS_SUCCEEDED(res)) { |
|
93 cout << "Successfully registered: " << argv[i] << "\n"; |
|
94 } else { |
|
95 cerr << "Register failed ("; |
|
96 print_err(res); |
|
97 cerr << "): " << argv[i] << "\n"; |
|
98 } |
|
99 } |
|
100 i++; |
|
101 } |
|
102 } |
|
103 return 0; |
|
104 } |
|
105 |
|
106 int main(int argc, char *argv[]) |
|
107 { |
|
108 int ret = 0; |
|
109 nsresult rv; |
|
110 { |
|
111 nsCOMPtr<nsIServiceManager> servMan; |
|
112 rv = NS_InitXPCOM2(getter_AddRefs(servMan), nullptr, nullptr); |
|
113 if (NS_FAILED(rv)) return -1; |
|
114 nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servMan); |
|
115 NS_ASSERTION(registrar, "Null nsIComponentRegistrar"); |
|
116 |
|
117 /* With no arguments, RegFactory will autoregister */ |
|
118 if (argc <= 1) |
|
119 { |
|
120 rv = registrar->AutoRegister(nullptr); |
|
121 ret = (NS_FAILED(rv)) ? -1 : 0; |
|
122 } |
|
123 else |
|
124 ret = ProcessArgs(registrar, argc, argv); |
|
125 } // this scopes the nsCOMPtrs |
|
126 // no nsCOMPtrs are allowed to be alive when you call NS_ShutdownXPCOM |
|
127 rv = NS_ShutdownXPCOM(nullptr); |
|
128 NS_ASSERTION(NS_SUCCEEDED(rv), "NS_ShutdownXPCOM failed"); |
|
129 return ret; |
|
130 } |