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 <stddef.h> // for nullptr
8 #include "mozilla/Module.h" // for Module, Module::CIDEntry, etc
9 #include "mozilla/ModuleUtils.h"
10 #include "mozilla/mozalloc.h" // for operator new
11 #include "nsCOMPtr.h" // for nsCOMPtr, getter_AddRefs, etc
12 #include "nsComponentManagerUtils.h" // for do_CreateInstance
13 #include "nsComposeTxtSrvFilter.h" // for nsComposeTxtSrvFilter, etc
14 #include "nsComposerController.h" // for nsComposerController, etc
15 #include "nsDebug.h" // for NS_ENSURE_SUCCESS
16 #include "nsEditingSession.h" // for NS_EDITINGSESSION_CID, etc
17 #include "nsEditorSpellCheck.h" // for NS_EDITORSPELLCHECK_CID, etc
18 #include "nsError.h" // for NS_ERROR_NO_AGGREGATION, etc
19 #include "nsIController.h" // for nsIController
20 #include "nsIControllerCommandTable.h" // for nsIControllerCommandTable, etc
21 #include "nsIControllerContext.h" // for nsIControllerContext
22 #include "nsID.h" // for NS_DEFINE_NAMED_CID, etc
23 #include "nsISupportsImpl.h"
24 #include "nsISupportsUtils.h" // for NS_ADDREF, NS_RELEASE
25 #include "nsServiceManagerUtils.h" // for do_GetService
26 #include "nscore.h" // for nsresult
30 #define NS_HTMLEDITOR_COMMANDTABLE_CID \
31 { 0x13e50d8d, 0x9cee, 0x4ad1, { 0xa3, 0xa2, 0x4a, 0x44, 0x2f, 0xdf, 0x7d, 0xfa } }
33 #define NS_HTMLEDITOR_DOCSTATE_COMMANDTABLE_CID \
34 { 0xa33982d3, 0x1adf, 0x4162, { 0x99, 0x41, 0xf7, 0x34, 0xbc, 0x45, 0xe4, 0xed } }
37 static NS_DEFINE_CID(kHTMLEditorCommandTableCID
, NS_HTMLEDITOR_COMMANDTABLE_CID
);
38 static NS_DEFINE_CID(kHTMLEditorDocStateCommandTableCID
, NS_HTMLEDITOR_DOCSTATE_COMMANDTABLE_CID
);
41 ////////////////////////////////////////////////////////////////////////
42 // Define the contructor function for the objects
44 // NOTE: This creates an instance of objects by using the default constructor
47 NS_GENERIC_FACTORY_CONSTRUCTOR(nsEditingSession
)
48 NS_GENERIC_FACTORY_CONSTRUCTOR(nsEditorSpellCheck
)
50 // There are no macros that enable us to have 2 constructors
51 // for the same object
53 // Here we are creating the same object with two different contract IDs
54 // and then initializing it different.
55 // Basically, we need to tell the filter whether it is doing mail or not
57 nsComposeTxtSrvFilterConstructor(nsISupports
*aOuter
, REFNSIID aIID
,
58 void **aResult
, bool aIsForMail
)
61 if (nullptr != aOuter
)
63 return NS_ERROR_NO_AGGREGATION
;
65 nsComposeTxtSrvFilter
* inst
= new nsComposeTxtSrvFilter();
68 return NS_ERROR_OUT_OF_MEMORY
;
71 inst
->Init(aIsForMail
);
72 nsresult rv
= inst
->QueryInterface(aIID
, aResult
);
78 nsComposeTxtSrvFilterConstructorForComposer(nsISupports
*aOuter
,
82 return nsComposeTxtSrvFilterConstructor(aOuter
, aIID
, aResult
, false);
86 nsComposeTxtSrvFilterConstructorForMail(nsISupports
*aOuter
,
90 return nsComposeTxtSrvFilterConstructor(aOuter
, aIID
, aResult
, true);
94 // Constructor for a controller set up with a command table specified
95 // by the CID passed in. This function uses do_GetService to get the
96 // command table, so that every controller shares a single command
97 // table, for space-efficiency.
99 // The only reason to go via the service manager for the command table
100 // is that it holds onto the singleton for us, avoiding static variables here.
102 CreateControllerWithSingletonCommandTable(const nsCID
& inCommandTableCID
, nsIController
**aResult
)
105 nsCOMPtr
<nsIController
> controller
= do_CreateInstance("@mozilla.org/embedcomp/base-command-controller;1", &rv
);
106 NS_ENSURE_SUCCESS(rv
, rv
);
108 nsCOMPtr
<nsIControllerCommandTable
> composerCommandTable
= do_GetService(inCommandTableCID
, &rv
);
109 NS_ENSURE_SUCCESS(rv
, rv
);
111 // this guy is a singleton, so make it immutable
112 composerCommandTable
->MakeImmutable();
114 nsCOMPtr
<nsIControllerContext
> controllerContext
= do_QueryInterface(controller
, &rv
);
115 NS_ENSURE_SUCCESS(rv
, rv
);
117 rv
= controllerContext
->Init(composerCommandTable
);
118 NS_ENSURE_SUCCESS(rv
, rv
);
120 *aResult
= controller
;
126 // Here we make an instance of the controller that holds doc state commands.
127 // We set it up with a singleton command table.
129 nsHTMLEditorDocStateControllerConstructor(nsISupports
*aOuter
, REFNSIID aIID
,
132 nsCOMPtr
<nsIController
> controller
;
133 nsresult rv
= CreateControllerWithSingletonCommandTable(kHTMLEditorDocStateCommandTableCID
, getter_AddRefs(controller
));
134 NS_ENSURE_SUCCESS(rv
, rv
);
136 return controller
->QueryInterface(aIID
, aResult
);
139 // Tere we make an instance of the controller that holds composer commands.
140 // We set it up with a singleton command table.
142 nsHTMLEditorControllerConstructor(nsISupports
*aOuter
, REFNSIID aIID
, void **aResult
)
144 nsCOMPtr
<nsIController
> controller
;
145 nsresult rv
= CreateControllerWithSingletonCommandTable(kHTMLEditorCommandTableCID
, getter_AddRefs(controller
));
146 NS_ENSURE_SUCCESS(rv
, rv
);
148 return controller
->QueryInterface(aIID
, aResult
);
151 // Constructor for a command table that is pref-filled with HTML editor commands
153 nsHTMLEditorCommandTableConstructor(nsISupports
*aOuter
, REFNSIID aIID
,
157 nsCOMPtr
<nsIControllerCommandTable
> commandTable
=
158 do_CreateInstance(NS_CONTROLLERCOMMANDTABLE_CONTRACTID
, &rv
);
159 NS_ENSURE_SUCCESS(rv
, rv
);
161 rv
= nsComposerController::RegisterHTMLEditorCommands(commandTable
);
162 NS_ENSURE_SUCCESS(rv
, rv
);
164 // we don't know here whether we're being created as an instance,
165 // or a service, so we can't become immutable
167 return commandTable
->QueryInterface(aIID
, aResult
);
171 // Constructor for a command table that is pref-filled with HTML editor doc state commands
173 nsHTMLEditorDocStateCommandTableConstructor(nsISupports
*aOuter
, REFNSIID aIID
,
177 nsCOMPtr
<nsIControllerCommandTable
> commandTable
=
178 do_CreateInstance(NS_CONTROLLERCOMMANDTABLE_CONTRACTID
, &rv
);
179 NS_ENSURE_SUCCESS(rv
, rv
);
181 rv
= nsComposerController::RegisterEditorDocStateCommands(commandTable
);
182 NS_ENSURE_SUCCESS(rv
, rv
);
184 // we don't know here whether we're being created as an instance,
185 // or a service, so we can't become immutable
187 return commandTable
->QueryInterface(aIID
, aResult
);
190 NS_DEFINE_NAMED_CID(NS_HTMLEDITORCONTROLLER_CID
);
191 NS_DEFINE_NAMED_CID(NS_EDITORDOCSTATECONTROLLER_CID
);
192 NS_DEFINE_NAMED_CID(NS_HTMLEDITOR_COMMANDTABLE_CID
);
193 NS_DEFINE_NAMED_CID(NS_HTMLEDITOR_DOCSTATE_COMMANDTABLE_CID
);
194 NS_DEFINE_NAMED_CID(NS_EDITINGSESSION_CID
);
195 NS_DEFINE_NAMED_CID(NS_EDITORSPELLCHECK_CID
);
196 NS_DEFINE_NAMED_CID(NS_COMPOSERTXTSRVFILTER_CID
);
197 NS_DEFINE_NAMED_CID(NS_COMPOSERTXTSRVFILTERMAIL_CID
);
200 static const mozilla::Module::CIDEntry kComposerCIDs
[] = {
201 { &kNS_HTMLEDITORCONTROLLER_CID
, false, nullptr, nsHTMLEditorControllerConstructor
},
202 { &kNS_EDITORDOCSTATECONTROLLER_CID
, false, nullptr, nsHTMLEditorDocStateControllerConstructor
},
203 { &kNS_HTMLEDITOR_COMMANDTABLE_CID
, false, nullptr, nsHTMLEditorCommandTableConstructor
},
204 { &kNS_HTMLEDITOR_DOCSTATE_COMMANDTABLE_CID
, false, nullptr, nsHTMLEditorDocStateCommandTableConstructor
},
205 { &kNS_EDITINGSESSION_CID
, false, nullptr, nsEditingSessionConstructor
},
206 { &kNS_EDITORSPELLCHECK_CID
, false, nullptr, nsEditorSpellCheckConstructor
},
207 { &kNS_COMPOSERTXTSRVFILTER_CID
, false, nullptr, nsComposeTxtSrvFilterConstructorForComposer
},
208 { &kNS_COMPOSERTXTSRVFILTERMAIL_CID
, false, nullptr, nsComposeTxtSrvFilterConstructorForMail
},
212 static const mozilla::Module::ContractIDEntry kComposerContracts
[] = {
213 { "@mozilla.org/editor/htmleditorcontroller;1", &kNS_HTMLEDITORCONTROLLER_CID
},
214 { "@mozilla.org/editor/editordocstatecontroller;1", &kNS_EDITORDOCSTATECONTROLLER_CID
},
215 { "@mozilla.org/editor/editingsession;1", &kNS_EDITINGSESSION_CID
},
216 { "@mozilla.org/editor/editorspellchecker;1", &kNS_EDITORSPELLCHECK_CID
},
217 { COMPOSER_TXTSRVFILTER_CONTRACTID
, &kNS_COMPOSERTXTSRVFILTER_CID
},
218 { COMPOSER_TXTSRVFILTERMAIL_CONTRACTID
, &kNS_COMPOSERTXTSRVFILTERMAIL_CID
},
222 static const mozilla::Module kComposerModule
= {
223 mozilla::Module::kVersion
,
228 NSMODULE_DEFN(nsComposerModule
) = &kComposerModule
;