Bug 1869043 assert that graph set access is main thread only r=padenot
[gecko.git] / xpcom / tests / RegFactory.cpp
blob7130ee5e1cce3a662f04ab81ceb294191f5d3476
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/. */
6 #include <iostream.h>
7 #include "prlink.h"
8 #include "nsIComponentRegistrar.h"
9 #include "nsIServiceManager.h"
10 #include "nsIFile.h"
11 #include "nsCOMPtr.h"
12 #include "nsString.h"
14 static bool gUnreg = false;
16 void print_err(nsresult err) {
17 switch (err) {
18 case NS_ERROR_FACTORY_NOT_LOADED:
19 cerr << "Factory not loaded";
20 break;
21 case NS_NOINTERFACE:
22 cerr << "No Interface";
23 break;
24 case NS_ERROR_NULL_POINTER:
25 cerr << "Null pointer";
26 break;
27 case NS_ERROR_OUT_OF_MEMORY:
28 cerr << "Out of memory";
29 break;
30 default:
31 cerr << hex << err << dec;
35 nsresult Register(nsIComponentRegistrar* registrar, const char* path) {
36 nsCOMPtr<nsIFile> file;
37 nsresult rv =
38 NS_NewLocalFile(NS_ConvertUTF8toUTF16(path), true, getter_AddRefs(file));
39 if (NS_FAILED(rv)) return rv;
40 rv = registrar->AutoRegister(file);
41 return rv;
44 nsresult Unregister(const char* path) {
45 /* NEEDS IMPLEMENTATION */
46 #if 0
47 nsresult res = nsComponentManager::AutoUnregisterComponent(path);
48 return res;
49 #else
50 return NS_ERROR_FAILURE;
51 #endif
54 int ProcessArgs(nsIComponentRegistrar* registrar, int argc, char* argv[]) {
55 int i = 1;
56 nsresult res;
58 while (i < argc) {
59 if (argv[i][0] == '-') {
60 int j;
61 for (j = 1; argv[i][j] != '\0'; j++) {
62 switch (argv[i][j]) {
63 case 'u':
64 gUnreg = true;
65 break;
66 default:
67 cerr << "Unknown option '" << argv[i][j] << "'\n";
70 i++;
71 } else {
72 if (gUnreg) {
73 res = Unregister(argv[i]);
74 if (NS_SUCCEEDED(res)) {
75 cout << "Successfully unregistered: " << argv[i] << "\n";
76 } else {
77 cerr << "Unregister failed (";
78 print_err(res);
79 cerr << "): " << argv[i] << "\n";
81 } else {
82 res = Register(registrar, argv[i]);
83 if (NS_SUCCEEDED(res)) {
84 cout << "Successfully registered: " << argv[i] << "\n";
85 } else {
86 cerr << "Register failed (";
87 print_err(res);
88 cerr << "): " << argv[i] << "\n";
91 i++;
94 return 0;
97 int main(int argc, char* argv[]) {
98 int ret = 0;
99 nsresult rv;
101 nsCOMPtr<nsIServiceManager> servMan;
102 rv = NS_InitXPCOM(getter_AddRefs(servMan), nullptr, nullptr);
103 if (NS_FAILED(rv)) return -1;
104 nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servMan);
105 NS_ASSERTION(registrar, "Null nsIComponentRegistrar");
107 /* With no arguments, RegFactory will autoregister */
108 if (argc <= 1) {
109 rv = registrar->AutoRegister(nullptr);
110 ret = (NS_FAILED(rv)) ? -1 : 0;
111 } else
112 ret = ProcessArgs(registrar, argc, argv);
113 } // this scopes the nsCOMPtrs
114 // no nsCOMPtrs are allowed to be alive when you call NS_ShutdownXPCOM
115 rv = NS_ShutdownXPCOM(nullptr);
116 NS_ASSERTION(NS_SUCCEEDED(rv), "NS_ShutdownXPCOM failed");
117 return ret;