|
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
|
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 |
|
7 /** |
|
8 * A Test application that exercises the sample moudule. This is intented |
|
9 * to be a sample application for using xpcom standalone. |
|
10 */ |
|
11 |
|
12 #include <stdio.h> |
|
13 |
|
14 #include "nsXPCOMGlue.h" |
|
15 #include "nsXPCOM.h" |
|
16 #include "nsCOMPtr.h" |
|
17 #include "nsISample.h" |
|
18 #include "nsIServiceManager.h" |
|
19 #include "nsIComponentManager.h" |
|
20 #include "nsIComponentRegistrar.h" |
|
21 |
|
22 #define NS_SAMPLE_CONTRACTID "@mozilla.org/sample;1" |
|
23 |
|
24 int |
|
25 main(void) |
|
26 { |
|
27 nsresult rv; |
|
28 |
|
29 XPCOMGlueStartup(nullptr); |
|
30 |
|
31 // Initialize XPCOM |
|
32 nsCOMPtr<nsIServiceManager> servMan; |
|
33 rv = NS_InitXPCOM2(getter_AddRefs(servMan), nullptr, nullptr); |
|
34 if (NS_FAILED(rv)) |
|
35 { |
|
36 printf("ERROR: XPCOM intialization error [%x].\n", |
|
37 static_cast<uint32_t>(rv)); |
|
38 return -1; |
|
39 } |
|
40 |
|
41 nsCOMPtr<nsIComponentManager> manager = do_QueryInterface(servMan); |
|
42 |
|
43 // Create an instance of our component |
|
44 nsCOMPtr<nsISample> mysample; |
|
45 rv = manager->CreateInstanceByContractID(NS_SAMPLE_CONTRACTID, |
|
46 nullptr, |
|
47 NS_GET_IID(nsISample), |
|
48 getter_AddRefs(mysample)); |
|
49 if (NS_FAILED(rv)) |
|
50 { |
|
51 printf("ERROR: Cannot create instance of component " NS_SAMPLE_CONTRACTID " [%x].\n" |
|
52 "Debugging hint:\n" |
|
53 "\tsetenv NSPR_LOG_MODULES nsComponentManager:5\n" |
|
54 "\tsetenv NSPR_LOG_FILE xpcom.log\n" |
|
55 "\t./nsTestSample\n" |
|
56 "\t<check the contents for xpcom.log for possible cause of error>.\n", |
|
57 static_cast<uint32_t>(rv)); |
|
58 return -2; |
|
59 } |
|
60 |
|
61 // Call methods on our sample to test it out. |
|
62 rv = mysample->WriteValue("Inital print:"); |
|
63 if (NS_FAILED(rv)) |
|
64 { |
|
65 printf("ERROR: Calling nsISample::WriteValue() [%x]\n", |
|
66 static_cast<uint32_t>(rv)); |
|
67 return -3; |
|
68 } |
|
69 |
|
70 const char *testValue = "XPCOM defies gravity"; |
|
71 rv = mysample->SetValue(testValue); |
|
72 if (NS_FAILED(rv)) |
|
73 { |
|
74 printf("ERROR: Calling nsISample::SetValue() [%x]\n", |
|
75 static_cast<uint32_t>(rv)); |
|
76 return -3; |
|
77 } |
|
78 printf("Set value to: %s\n", testValue); |
|
79 char *str; |
|
80 rv = mysample->GetValue(&str); |
|
81 |
|
82 if (NS_FAILED(rv)) |
|
83 { |
|
84 printf("ERROR: Calling nsISample::GetValue() [%x]\n", |
|
85 static_cast<uint32_t>(rv)); |
|
86 return -3; |
|
87 } |
|
88 if (strcmp(str, testValue)) |
|
89 { |
|
90 printf("Test FAILED.\n"); |
|
91 return -4; |
|
92 } |
|
93 |
|
94 NS_Free(str); |
|
95 |
|
96 rv = mysample->WriteValue("Final print :"); |
|
97 printf("Test passed.\n"); |
|
98 |
|
99 // All nsCOMPtr's must be deleted prior to calling shutdown XPCOM |
|
100 // as we should not hold references passed XPCOM Shutdown. |
|
101 servMan = 0; |
|
102 manager = 0; |
|
103 mysample = 0; |
|
104 |
|
105 // Shutdown XPCOM |
|
106 NS_ShutdownXPCOM(nullptr); |
|
107 |
|
108 return 0; |
|
109 } |