From 855e4eac4ff9ef779a715c49d972bb6b4f8098fe Mon Sep 17 00:00:00 2001
From: Eike Ziller <eike.ziller@nokia.com>
Date: Mon, 28 Nov 2011 08:27:50 +0100
Subject: [PATCH] Add document on plugin life cycle.

Change-Id: Iec868cdb8158726d91bcece935a9d6269219c056
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@nokia.com>
---
 doc/api/plugin-lifecycle.qdoc      | 122 +++++++++++++++++++++++++++++
 doc/api/plugin-specifications.qdoc |   3 +-
 doc/doc.pri                        |   1 +
 3 files changed, 125 insertions(+), 1 deletion(-)
 create mode 100644 doc/api/plugin-lifecycle.qdoc

diff --git a/doc/api/plugin-lifecycle.qdoc b/doc/api/plugin-lifecycle.qdoc
new file mode 100644
index 00000000000..afaf055e9c4
--- /dev/null
+++ b/doc/api/plugin-lifecycle.qdoc
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (info@qt.nokia.com)
+**
+**
+** GNU Free Documentation License
+**
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of this
+** file.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at info@qt.nokia.com.
+**
+****************************************************************************/
+
+/*!
+    \page plugin-lifecycle.html
+    \title Plugin Life Cycle
+
+    To be able to write \QC plugins, you must understand the steps that the plugin
+    manager takes when you start or shut down \QC. This section describes
+    the process and the state that plugins go through in detail.
+
+    When you start \QC, the plugin manager does the following:
+
+    \list 1
+        \o Looks in its search paths for
+           all .pluginspec files, and reads them. This is the first point where
+           loading a plugin can fail in the worst case of a malformed plugin spec.
+
+        \o Creates an instance of the \l{ExtensionSystem::PluginSpec} class for
+           each plugin. This class is a container for
+           all the information from the plugin specification, and additionally
+           tracks the state of the plugin.
+           You can get the \l{ExtensionSystem::PluginSpec} instances via the
+           plugin manager's \l{ExtensionSystem::PluginManager::plugins()}{plugins()}
+           method, or, after a plugin is loaded, through the plugin's
+           \l{ExtensionSystem::IPlugin::pluginSpec()}{pluginSpec()} method.
+
+        \o Sets the plugins to \c Read state.
+
+        \o Verifies that the dependencies of each plugin
+           exist and are compatible. For more information about plugin dependencies,
+           see \l{Plugin Specifications}.
+
+        \o Sets the plugins to \c Resolved state.
+
+        \o Sorts all plugins into a list that we call the \e{load queue}, where the
+           dependencies of a plugin are positioned after the plugin
+           (but not necessarily \e directly after the plugin).
+           It will make sure that we load
+           and initialize the plugins in proper order.
+
+        \o Loads the plugins' libraries, and creates their IPlugin instances
+           in the order of the load queue. At this point the
+           plugin constructors are called. Plugins that other plugins depend on
+           are created first.
+
+        \o Sets the plugins to \c Loaded state.
+
+        \o Calls the \l{ExtensionSystem::IPlugin::initialize()}{initialize()} methods of
+           all plugins in the order of the load queue. In the initialize method,
+           a plugin should make sure that all exported interfaces are set up and available
+           to other plugins. A plugin can assume that plugins they depend on have set up
+           their exported interfaces. For example, the \c Core plugin sets up the
+           \l{Core::ActionManager}, \l{Core::EditorManager} and all other publicly available
+           interfaces, so other plugins can request and use them.
+
+           The \l{ExtensionSystem::IPlugin::initialize()}{initialize()} method of a plugin
+           is a good place for
+           \list
+               \o registering objects in the plugin manager's object pool
+                  (see \l{The Plugin Manager, the Object Pool, and Registered Objects})
+               \o loading settings
+               \o adding new menus, and new actions to menus
+               \o connecting to other plugin's signals.
+           \endlist
+
+        \o Sets the plugins to \c Initialized state.
+
+        \o Calls the \l{ExtensionSystem::IPlugin::extensionsInitialized()}{extensionsInitialized()}
+           methods of all plugins in \e reverse order of the load queue. After
+           the extensionsInitialized method, a plugin should be fully initialized, set up
+           and running. A plugin can assume that plugins that depend on it are fully set up,
+           and can finish the initialization of parts that can be extended by other plugins.
+           For example, the \c Core plugin assumes that all plugins have registered
+           their actions, and finishes initialization of the action manager.
+
+        \o Sets the plugins to \c Running state.
+    \endlist
+
+    At the end of startup, the \c Core plugin's \l{Core::ICore} sends two signals.
+    Before the \QC UI is shown it sends \l{Core::ICore::coreAboutToOpen()}{coreAboutToOpen()},
+    and afterwards \l{Core::ICore::coreOpened()}{coreOpened()}.
+
+    Before shutdown, the \c Core plugin's \l{Core::ICore} sends the
+    \l{Core::ICore::coreAboutToClose()}{coreAboutToClose()} signal. After that, the
+    plugin manager starts its shutdown sequence:
+
+    \list 1
+        \o Calls the \l{ExtensionSystem::IPlugin::aboutToShutdown()}{aboutToShutdown()} methods of
+           all plugins in the order of the load queue. Plugins should perform measures
+           for speeding up the actual shutdown here, like disconnecting signals that
+           would otherwise needlessly be called.
+           If a plugin needs to delay the real shutdown for a while, for example if
+           it needs to wait for external processes to finish for a clean shutdown,
+           the plugin can return \l{ExtensionSystem::IPlugin::AsynchronousShutdown} from this
+           method. This will make the plugin manager wait with the next step, and keep the main
+           event loop running, until all plugins requesting AsynchronousShutdown have sent
+           the asynchronousShutdownFinished() signal.
+
+        \o Destroys all plugins by deleting their \l{ExtensionSystem::IPlugin}
+           instances in \e reverse order of the load queue. At this point the plugin destructors
+           are called. Plugins should clean up after themselves by freeing memory and other resources.
+    \endlist
+*/
diff --git a/doc/api/plugin-specifications.qdoc b/doc/api/plugin-specifications.qdoc
index 6469dff998c..f38d9d39eff 100644
--- a/doc/api/plugin-specifications.qdoc
+++ b/doc/api/plugin-specifications.qdoc
@@ -180,7 +180,8 @@
     the \c{-help} command line argument, and the plugin manager does its command
     line parsing and sanity checks based on that information.
     If the plugin manager finds matching command line arguments for a plugin,
-    it passes them on to the plugin's \l{IPlugin::initialize} method.
+    it passes them on to the plugin's
+    \l{ExtensionSystem::IPlugin::initialize()}{initialize()} method.
 
     All command line argument definitions are enclosed by a single \c argumentList
     tag. The individual command line arguments are defined by the \c argument tag,
diff --git a/doc/doc.pri b/doc/doc.pri
index be1c1dcf0bb..a5e39f4e5e3 100644
--- a/doc/doc.pri
+++ b/doc/doc.pri
@@ -55,6 +55,7 @@ DEV_HELP_DEP_FILES = \
     $$PWD/api/getting-and-building.qdoc \
     $$PWD/api/first-plugin.qdoc \
     $$PWD/api/plugin-specifications.qdoc \
+    $$PWD/api/plugin-lifecycle.qdoc \
     $$PWD/api/qtcreator-dev.qdocconf
 
 dev_html_docs.commands = $$qdoc($$OUT_PWD/doc/html-dev) $$PWD/api/qtcreator-dev.qdocconf
-- 
GitLab