--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ai_content_model_api/ai_content_model_api.metaxml Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<api id="e0fdab3ac028999293009f1a1b34299e" dataversion="1.0">
+ <name>AI Content Model API</name>
+ <description>AI Content Model API provides an abstraction to access the plug-in content, enables service request routing to the plug-in, and provides a callback interface used by the Active Idle plug-ins to give notification about modifications in the content and/or internal state.Each Active Idle plug-in must implement this interface together with the plug-in proprietary Content Model API, which specifies the content provided by the plug-in at run time, uniquely identifies content type and the logical means of every content entity, and specifies set of services supported by the plug-in. AI Content Model and the plug-in proprietary Content Model API are used at Active Idle UI and/or Theme development time.</description>
+ <type>c++</type>
+ <subsystem>activeidle</subsystem>
+ <libs>
+ <lib name="Ai3XmlUiMain.lib" />
+ </libs>
+ <release category="domain"/>
+ <attributes>
+ <!-- This indicates wether the api provedes separate html documentation -->
+ <!-- or is the additional documentation generated from headers. -->
+ <!-- If you are unsuere then the value is "no" -->
+ <htmldocprovided>yes</htmldocprovided>
+ <adaptation>no</adaptation>
+ </attributes>
+</api>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ai_content_model_api/ai_content_model_api.pro Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TEMPLATE = subdirs
+
+SUBDIRS += group
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ai_content_model_api/group/group.pro Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TEMPLATE = subdirs
+
+BLD_INF_RULES.prj_exports += \
+ "$${LITERAL_HASH}include <platform_paths.hrh>" \
+ "../inc/aicontentmodel.h MW_LAYER_PLATFORM_EXPORT_PATH(aicontentmodel.h)"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ai_content_model_api/inc/aicontentmodel.h Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,229 @@
+/*
+* Copyright (c) 2006-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#ifndef M_AICONTENTMODEL_H
+#define M_AICONTENTMODEL_H
+
+#include <e32base.h>
+#include <libc/stddef.h> // For wchar_t
+
+/**
+ * Maximum length for a content item textual id.
+ *
+ * @see TAiContentItem::id
+ */
+const TInt KAiContentIdMaxLength = 255;
+
+/**
+ * Maximum length for content type.
+ *
+ * @see TAiContentItem::type
+ */
+const TInt KAiContentTypeMaxLength = 255;
+
+/**
+ * Null value for content id. Plug-in content model should never use this id
+ * value in its content model.
+ */
+const TInt KAiNullContentId = KErrNotFound;
+
+/**
+ * Encapsulates metadata of single plug-ins content item. The class is used
+ * as building block for the plug-ins content model, abstracts content
+ * selector, content reference and event.
+ */
+struct TAiContentItem
+{
+ /**
+ * Plug-in specific id of this content item.
+ */
+ TInt id;
+
+ /**
+ * Textual id of this content item. Used for binding content items to
+ * UI elements.
+ *
+ * @see KAiContentIdMaxLength
+ */
+ const wchar_t* cid;
+
+ /**
+ * Content item data MIME type. For example "text/plain" for textual
+ * content.
+ *
+ * @see KAiContentTypeMaxLength
+ */
+ const char* type;
+};
+
+/**
+ * Helper function for accessing Content item textual id TAiContentItem::cid.
+ *
+ * This function's performance is relative to O(N) where N is the length of
+ * the textual id in characters. If the id of the same content item is accessed
+ * repeatedly (for example in a loop) store the returned id in a local TPtrC
+ * variable instead of calling this function repeatedly.
+ *
+ * @param aContentItem content item whose textual id to return.
+ * @return textual id of aContentItem as a descriptor.
+ */
+inline TPtrC16 ContentCid( const TAiContentItem& aContentItem )
+ {
+ return TPtrC16( (const TText16*) aContentItem.cid );
+ }
+
+/**
+ * Helper function for accessing Content item data type TAiContentItem::type.
+ *
+ * This function's performance is relative to O(N) where N is the length of
+ * the type name in characters. If the type of the same content item is accessed
+ * repeatedly (for example in a loop) store the returned type in a local TPtrC8
+ * variable instead of calling this function repeatedly.
+ *
+ * @param aContentItem content item whose type to return.
+ * @return data type of aContentItem as a descriptor.
+ */
+inline TPtrC8 ContentType( const TAiContentItem& aContentItem )
+ {
+ return TPtrC8( (const TText8*) aContentItem.type );
+ }
+
+
+/**
+ * Mime type for passing bitmap content data.
+ * The content data should contain a packaged CGulIcon object pointer when this
+ * MIME tyoe is used.
+ *
+ * @see CGulIcon
+ * @see MAiContentObserver::PublishPtr
+ */
+const char KAiContentTypeBitmap[] = "image/x-s60-bitmap";
+
+/**
+ * MIME type for passing textual data.
+ *
+ * @see MAiContentObserver::Publish
+ */
+const char KAiContentTypeText[] = "text/plain";
+
+
+/**
+ * Abstract interface which provides services to iterate content items
+ * supported by the plug-in. Only used by the Active Idle Framework.
+ * Each plug-in must provide implementation of interface to access:
+ * content selectors, content references, and events. Instances of interface
+ * are accessed through method GetProperty in interface CAiContentPublisher.
+ *
+ * @since S60 3.2
+ */
+class MAiContentItemIterator
+{
+public:
+ /**
+ * Tests if this enumeration contains more elements.
+ *
+ * @return ETrue if this iterator object contains at least one more
+ * element to provide; EFalse otherwise.
+ */
+ virtual TBool HasNext() const = 0;
+
+ /**
+ * Returns the next element of this iterator if this enumeration object
+ * has at least one more element to provide.
+ *
+ * @return The next element.
+ * @leave KErrOverflow if iterator is at the end of range.
+ */
+ virtual const TAiContentItem& NextL() = 0;
+
+ /**
+ * Returns the first element of this iterator which matches aId.
+ *
+ * @param aId - unique identification of the content item, corresponds
+ * to TAiContentItem::id.
+ * @return The first element matching aId.
+ * @leave KErrNotFound if element matching aId is not found from the
+ * complete iterator range.
+ */
+ virtual const TAiContentItem& ItemL( TInt aId ) const = 0;
+
+ /**
+ * Returns the first element of this iterator which matches aCid.
+ *
+ * @param aCid - textual identification of the content item, corresponds
+ * to TAiContentItem::cid.
+ * @return The first element matching aCid.
+ * @leave KErrNotFound if element matching aCid is not found from the
+ * complete iterator range.
+ */
+ virtual const TAiContentItem& ItemL( const TDesC& aCid ) const = 0;
+
+ /**
+ * Resets iterator to the first item in the list.
+ */
+ virtual void Reset() = 0;
+
+ /**
+ * Release the iterator.
+ */
+ virtual void Release() = 0;
+
+protected:
+ /**
+ * Protected destructor prevents deletion through this interface.
+ */
+ ~MAiContentItemIterator() { }
+
+private:
+ /**
+ * Required to implement CleanupReleasePushL(MAiContentItemIterator*).
+ */
+ static void Cleanup(TAny* aSelf);
+ friend void CleanupReleasePushL(MAiContentItemIterator*);
+};
+
+/**
+ * Helper function which calls MAiContentItemIterator::Release() with NULL
+ * checking. Especially useful in destructors.
+ */
+inline void Release(MAiContentItemIterator* aObj)
+ {
+ if (aObj) aObj->Release();
+ }
+
+/**
+ *
+ */
+inline void CleanupReleasePushL(MAiContentItemIterator* aObj)
+ {
+ CleanupStack::PushL(
+ TCleanupItem(&MAiContentItemIterator::Cleanup, aObj) );
+ }
+
+/**
+ * Required to implement CleanupReleasePushL(MAiContentItemIterator*).
+ * Inline to avoid problems with multiple definitions.
+ */
+inline void MAiContentItemIterator::Cleanup(TAny* aSelf)
+ {
+ ::Release(static_cast<MAiContentItemIterator*>(aSelf));
+ }
+
+
+
+#endif // M_AICONTENTMODEL_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ai_plugin_information_api/ai_plugin_information_api.metaxml Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<api id="41b4bfa2b5209c5a38f99f5cdc28cc25" dataversion="1.0">
+ <name>AI Plug-in Information API</name>
+ <description>Provides infomration about loaded active idle plug-ins</description>
+ <type>c++</type>
+ <subsystem>activeidle</subsystem>
+ <libs>
+ <lib name="aifw.lib" />
+ </libs>
+ <release category="domain"/>
+ <attributes>
+ <!-- This indicates wether the api provedes separate html documentation -->
+ <!-- or is the additional documentation generated from headers. -->
+ <!-- If you are unsuere then the value is "no" -->
+ <htmldocprovided>yes</htmldocprovided>
+ <adaptation>no</adaptation>
+ </attributes>
+</api>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ai_plugin_information_api/ai_plugin_information_api.pro Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TEMPLATE = subdirs
+
+SUBDIRS += group
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ai_plugin_information_api/group/group.pro Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TEMPLATE = subdirs
+
+BLD_INF_RULES.prj_exports += \
+ "$${LITERAL_HASH}include <platform_paths.hrh>" \
+ "../inc/activeidle2domainpskeys.h MW_LAYER_PLATFORM_EXPORT_PATH(activeidle2domainpskeys.h)" \
+ "../inc/aicontentpublisheruid.hrh MW_LAYER_PLATFORM_EXPORT_PATH(aicontentpublisheruid.hrh)"
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ai_plugin_information_api/inc/activeidle2domainpskeys.h Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,187 @@
+/*
+* Copyright (c) 2006-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#ifndef ACTIVEIDLE2_DOMAIN_PS_KEYS_H
+#define ACTIVEIDLE2_DOMAIN_PS_KEYS_H
+
+/**
+* PubSub Category AI information API
+*/
+const TUid KPSUidAiInformation = {0x101FD657};
+
+/**
+* PubSub keys
+*/
+const TUint KActiveIdleUid = 0x00000001; // Contains UID of StandbyUI (Active Idle) application
+
+const TUint KActiveIdleState = 0x00000002; // Contains one value from following emuneration
+
+enum EPSActiveIdleState
+{
+ // Indicates that Active Idle goes to background
+ // Value is triggered by KAknFullOrPartialForegroundLost event
+ //
+ // Corresponds to value EPSTelephonyNotIdle writtern to former KTelephonyIdleStatus
+ EPSAiBackground = 0,
+
+ // Indicates that Active Idle goes to foreground
+ // Value is triggered by KAknFullOrPartialForegroundGained event
+ //
+ // Corresponds to value EPSTelephonyIdle writtern to former KTelephonyIdleStatus
+ EPSAiForeground,
+
+ // Indicates that Active Idle goes to background and keyboard focus goes to Phone app for Tel number entry
+ // The key is managed by windows server plug-in depends on the key pressed by end-user (See Chapter "Key event handling" from Active Idle SWAD)
+ //
+ // Corresponds to value EPSTelephonyIncomingKeyEvents written to former KTelephonyFocusInfo
+ EPSAiNumberEntry
+};
+
+const TUint KActiveIdlePopupState = 0x00000003; // Contains one value from following emuneration
+
+enum EPSActiveIdlePopupState
+{
+ // Indicates that Active Idle is displaying dialog or menu
+ // The key is managed by windows server plug-in to determine whether to enable keylock handling
+ EPSAiDisplayingMenuOrDialog,
+
+ // Indicates that Active Idle is not displaying dialog or menu
+ // The key is managed by windows server plug-in to determine whether to enable keylock handling
+ EPSAiNotDisplayingMenuOrDialog
+};
+
+
+const TUint KActiveIdleActOnSendKey = 0x00000004; // Contains 0 if we are to ignore the send or > 0 if we need to react to it
+
+const TUint KActiveIdleTouchToolbarWidth = 0x00000005;
+
+const TUint KActiveIdleTouchToolbarHeight = 0x00000006;
+
+const TUint KActiveIdleSimRegFailedReceived = 0x00000007; // Contains 1 if we have received sim reg failed message, 0 if not.
+
+enum EPSActiveIdleSimRegReceiveStatus
+{
+ // Indicates that Active Idle is displaying dialog or menu
+ // The key is managed by windows server plug-in to determine whether to enable keylock handling
+ EPSSimRegFailedMessageNotReceived = 0,
+
+ // Indicates that Active Idle is not displaying dialog or menu
+ // The key is managed by windows server plug-in to determine whether to enable keylock handling
+ EPSSimRegFailedMessageReceived
+};
+
+const TUint KActiveIdleThemeSupportsXsp = 0x00000008; // Contains one value from following enumeration
+
+enum EPSActiveIdleThemeSupportsXsp
+{
+ // Value indicates that xSP feature is not supported in currently active theme
+ EPSAiXspNotSupported,
+
+ // Value indicates that the current theme supports the xSP feature
+ EPSAiXspIsSupported
+};
+
+const TUint KActiveIdleLaunch = 0x00000009; // Contains information if shortcut launching is ongoing or not
+
+enum EPSActiveIdleIdleLaunch
+{
+
+ // Value indicates that no shortcut is in launching state and new launch tapping can be handled
+ EPSAiLaunchNotActive = 0,
+
+ // Value indicates that active idle shortcut is launching
+ EPSAiLaunchIsActive
+};
+
+
+// Indicates that Active Idle 2 should be restarted.
+const TUint KActiveIdleRestartAI2 = 0x0000000B;
+
+// Indicates that all the CPS Harvester plugins have been updated
+const TUint KActiveIdleCpsPluginsUpdated = 0x0000000C;
+
+enum EPSActiveIdleCpsPluginsUpdated
+ {
+ EPSAiPluginsNotUpdated = 0,
+ EPSAiPluginsUpdated
+ };
+
+// Key to indicate wether the WS plug-in forwards all the numeric keypad
+// events to telephone or not.
+const TUint KActiveIdleForwardNumericKeysToPhone = 0x0000000D;
+
+enum EActiveIdleForwardNumericKeysToPhone
+ {
+ // Forward events to phone
+ EPSAiForwardNumericKeysToPhone,
+
+ // Don't forward events to phone
+ EPSAiDontForwardNumericKeysToPhone
+ };
+
+// Indicates that in ExtHS mode the LSK should have a locked shortcut.
+// Contains the full shortcut definition string.
+const TUint KActiveIdleExtHS_LSKLocked = 0x00000501;
+
+// Indicates that in ExtHS mode the RSK should have a locked shortcut.
+// Contains the full shortcut definition string.
+const TUint KActiveIdleExtHS_RSKLocked = 0x00000502;
+
+// Indicates that in ExtHS mode the plugin configuration has changed.
+const TUint KActiveIdleExtHS_PluginConfChange = 0x00000503;
+
+/**
+* PubSub Category AI plug-in registry API
+*/
+const TUid KPSUidActiveIdle2 = {0x102750F0}; // ActiveIdle2 SID
+
+/**
+*
+* First iterate Active plugin UID range to find all
+* active plugin UID's. Use that UID as a key to find the plugins name
+* from the name range.
+*
+*/
+
+/**
+* Active plugin count
+*
+* Possible integer values:
+* 0x000000000 - 0xFFFFFFFF : Active plugin count
+*/
+const TUint KAIActivePluginCount = 0x00000000;
+
+/**
+* Active plugin UID range
+*
+* Possible integer values:
+* 0x100000000 - 0xFFFFFFFF : Active plugins UID
+*/
+const TUint KAIActivePluginRangeStart = 0x00000001;
+const TUint KAIActivePluginRangeEnd = 0x0FFFFFFF;
+
+/**
+* Active plugin name range
+*
+* Possible string values:
+* Plugin name
+*/
+const TUint KAIPluginNameRangeStart = 0x10000000;
+const TUint KAIPluginNameRangeEnd = 0xFFFFFFFF;
+
+#endif // ACTIVEIDLE2_DOMAIN_PS_KEYS_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ai_plugin_information_api/inc/aicontentpublisheruid.hrh Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2006-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+
+#ifndef AICONTENTPUBLISHERUID_HRH
+#define AICONTENTPUBLISHERUID_HRH
+
+/**
+ * Ecom interface uid for CAiContentPublisher.
+ *
+ * Example resource of a plugin that implements content publisher interface.
+ * @code
+ * #include <aicontentpublisheruid.hrh>
+ * #include <ecom/registryinfov2.rh>
+ *
+ * #define MY_DLL_UID 0xFFEEDDCC
+ * #define MY_PLUGIN_IMPLEMENTATION_UID 0xBBAA9988
+ *
+ * RESOURCE REGISTRY_INFO registry_info
+ * {
+ * resource_format_version = RESOURCE_FORMAT_VERSION_2;
+ * dll_uid = MY_DLL_UID;
+ *
+ * // Interface info array
+ * interfaces =
+ * {
+ * INTERFACE_INFO
+ * {
+ * // UID of the implemented interface
+ * interface_uid = AI_UID_ECOM_INTERFACE_CONTENTPUBLISHER;
+ *
+ * implementations =
+ * {
+ * IMPLEMENTATION_INFO
+ * {
+ * implementation_uid = MY_PLUGIN_IMPLEMENTATION_UID;
+ * version_no = 1;
+ * display_name = "My plugin";
+ * }
+ * };
+ * }
+ * };
+ * }
+ * @endcode
+ */
+#define AI_UID_ECOM_INTERFACE_CONTENTPUBLISHER 0x102750ED
+
+#endif // AICONTENTPUBLISHERUID_HRH
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreensrvlegacy.pro Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TEMPLATE = subdirs
+
+SUBDIRS += ai_content_model_api \
+ ai_plugin_information_api
+
+CONFIG += ordered
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/layers.sysdef.xml Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_5_1.dtd" [
+ <!ENTITY layer_real_source_path "sf/mw/homescreensrvlegacy" >
+]>
+
+<SystemDefinition name="homescreensrvlegacy" schema="1.5.1">
+ <systemModel>
+
+ <layer name="mw_layer">
+ <module name="homescreensrvlegacy">
+ <unit unitID="hs.homescreensrvlegacy" mrp="" bldFile="&layer_real_source_path;" name="homescreensrvlegacy" proFile="homescreensrvlegacy.pro" qmakeArgs="-r"/>
+ </module>
+ </layer>
+
+ </systemModel>
+</SystemDefinition>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysdef_1_5_1.dtd Fri Mar 19 09:35:24 2010 +0200
@@ -0,0 +1,88 @@
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+ name CDATA #REQUIRED
+ schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+ name CDATA #REQUIRED
+ levels CDATA #IMPLIED
+ span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+ name CDATA #REQUIRED
+ level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+ unitID ID #REQUIRED
+ name CDATA #REQUIRED
+ mrp CDATA #REQUIRED
+ filter CDATA #IMPLIED
+ bldFile CDATA #REQUIRED
+ priority CDATA #IMPLIED
+ contract CDATA #IMPLIED
+ proFile CDATA #IMPLIED
+ qmakeArgs CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+ name CDATA #REQUIRED
+ mrp CDATA #REQUIRED
+ filter CDATA #IMPLIED
+ contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+ name CDATA #REQUIRED
+ version CDATA #REQUIRED
+ late (Y|N) #IMPLIED
+ filter CDATA #IMPLIED
+ contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+ name ID #REQUIRED
+ description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+ name ID #REQUIRED
+ description CDATA #REQUIRED
+ target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+ name ID #REQUIRED
+ abldTarget CDATA #REQUIRED
+ description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+ name ID #REQUIRED
+ abldOption CDATA #REQUIRED
+ description CDATA #REQUIRED
+ enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+ name ID #REQUIRED
+ description CDATA #REQUIRED
+ filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+ command CDATA #REQUIRED
+ targetList IDREFS #IMPLIED
+ unitParallel (Y | N | y | n) #REQUIRED
+ targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+ name CDATA #REQUIRED
+ cwd CDATA #REQUIRED
+ command CDATA #REQUIRED>