CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 Cross Platform Extras Sample Implementation User’s Guide Motion Picture Laboratories, Inc. CONFIDENTIAL 1 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 CONTENTS 1 2 3 4 5 6 Introduction .............................................................................................................................. 5 1.1 Scope ............................................................................................................................... 5 1.1.1 Cross Platform Extras Sample Implementation ......................................................... 5 1.1.2 Intended Audience .................................................................................................... 5 1.2 Document Organization .................................................................................................... 5 1.3 References ....................................................................................................................... 6 1.4 Resources ........................................................................................................................ 6 1.5 Acknowledgements .......................................................................................................... 6 Demonstrating the CPE APIs ................................................................................................... 7 2.1 Capabilities ....................................................................................................................... 7 2.2 Available Content ............................................................................................................. 7 2.3 Using ................................................................................................................................ 7 2.3.1 Accessing ................................................................................................................. 7 2.3.2 Package Selection .................................................................................................... 8 2.3.3 Sintel Intro................................................................................................................. 9 2.3.4 Sintel Main Menu Page ........................................................................................... 10 2.3.5 Creating an Account & Logging In ........................................................................... 11 2.3.6 ‘Acquiring’ Content Rights ....................................................................................... 11 2.3.7 Playing a Movie ...................................................................................................... 11 2.3.8 Timed Events .......................................................................................................... 11 Learning and Using the Sample Implementation .................................................................... 13 3.1 Testbed Set-up and Configuration .................................................................................. 13 3.2 Package Integration ........................................................................................................ 14 3.2.1 Accessing the Framework API ................................................................................ 14 3.2.2 Making a Package Available for Selection............................................................... 16 3.2.3 Making a Package Runable .................................................................................... 17 3.2.4 Interactions with the Framework ............................................................................. 18 Developing and Customizing .................................................................................................. 19 4.1 Overview ........................................................................................................................ 19 4.2 Use of Source Code and Licensing................................................................................. 19 4.3 SI Framework Architecture ............................................................................................. 19 4.3.1 HTML ...................................................................................................................... 19 4.3.2 JavaScript for Framework ....................................................................................... 21 4.3.3 JavaScript for UI Construction................................................................................. 22 4.3.4 Stylesheets ............................................................................................................. 23 4.3.5 Accessing Back-End Services (BES) ...................................................................... 23 4.4 RI Package Architecture ................................................................................................. 25 4.4.1 Overview ................................................................................................................. 25 4.4.2 Interactions between Package and Base ................................................................ 26 Framework Development & Customization ............................................................................. 37 Package Development & Customization ................................................................................. 37 Motion Picture Laboratories, Inc. CONFIDENTIAL 2 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 NOTICES This work is licensed under a Creative Commons Attribution 3.0 Unported License. NOTE: No effort is being made by the Motion Picture Laboratories to in any way obligate any market participant to adhere to this specification. Whether to adopt this specification in whole or in part is left entirely to the individual discretion of individual market participants, using their own independent business judgment. Moreover, Motion Picture Laboratories disclaims any warranty or representation as to the suitability of this specification for any purpose, and any liability for any damages or other harm you may incur as a result of subscribing to this specification. Motion Picture Laboratories, Inc. CONFIDENTIAL 3 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 REVISION HISTORY Version Date Motion Picture Laboratories, Inc. Description CONFIDENTIAL 4 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 1 INTRODUCTION 1.1 Scope 1.1.1 Cross Platform Extras Sample Implementation This guide provides both an overview and technical introduction to the Cross Platform Extras Sample Implementation (CPE-SI). The Sample Implementation is itself intended to serve multiple purposes. These include: • To provide a hands-on interactive demonstration of the concepts and capabilities of the CPE API • To validate the Cross Platform Extras API. • To provide developers with a test environment that includes a sample implementation of the API that may be used to test the compliance of their framework or package. • To provide open source code for developers to use as a starting point for their own development efforts. The structure and content of this document therefore reflects the variety of concerns and goals that users of the Sample Implementation may have. 1.1.2 Intended Audience It is assumed that readers of this document are familiar with the goals of the Cross Platform Extras project. Information can be found at www.movielabs.com/cpe. Developers must be familiar with the APIs document in Cross Platform Extras Interface [CPE-API]. It is strongly recommended that developers read Sections 1 to 4 of [CPE-API] to familiarize themselves with the concepts behind the API. Developers are assumed to be proficient in both JavaScript and CSS. 1.2 Document Organization The organization of this document reflects the intended uses of the Sample Implementation. Section 1, this part, provides introductory material including references and links to additional resources. Sections 2 through 4 each address a different use: Section 2: Use of the SI web site to demonstrate the Cross Platforms Extra concept Motion Picture Laboratories, Inc. CONFIDENTIAL 5 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 Section 3: Use of the SI software as a testbed for validating package integration Section 4: Use of SI code as basis for further development of custom framework or packages. Sections 5 and 6 are intended to cover in more detail the material presented in Section 4. 1.3 References [CPE-API] Cross Platform Extras, www.movielabs.com/cpe 1.4 Resources The Sample Implementation is hosted online for those who wish to test or demonstrate its capabilities using a standard web browser. The implementation currently exists here, although it may be removed at any time. Please contact MovieLabs for the latest version. http://www.criticalarchitectures.com/projects/MovieLab/CPE/Demo03/html/DemoRetailer.html Code and supporting resources used in the Sample Implementation will ultimately be hosted online. In the meantime, please contact MovieLabs. 1.5 Acknowledgements Our demonstration uses work associated with the Blender Foundation. We gratefully acknowledge the organization and the people behind it, and the fine work that makes our demonstration possible. Please visit www.blender.org. Motion Picture Laboratories, Inc. CONFIDENTIAL 6 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 2 DEMONSTRATING THE CPE APIS The CPE-SI demonstration web site is intended to provide a hands-on interactive demonstration of the concepts and capabilities provided by a CPE implementation and to validate the Cross Platform Extras API. The demonstration site mimics an on-line retail distribution channel that allows consumers to 'buy' or 'rent' content packages. 2.1 Capabilities Current functionality provided by the demonstration site includes: Access via any HTML5-compliant browser. Creation of a user account. Each account is allocated 20 credits for 'buying' and 'renting' content. Selection of a package with immediate access to any 'free' content. Logged-in users may use available credits to buy or rent content. Access rights that have been purchased are available when logging in from any device or platform. 2.2 Available Content All content is open-source and freely available on the Internet (see Acknowledgements in 1.5). The use of credits for 'buying' and 'renting' content is strictly for the purpose of emulating actual transactions. No ownership or actual rights are obtained or transferred via the use of this software. 2.3 Using 2.3.1 Accessing The demonstration is accessed via any HTML5-compliant browser. See Resources in Section 1.4 for information where to obtain the demo. Figure 1 shows the initial view, referred to as the storefront. Graphics for all known packages are shown. In this case there are three, although currently only the first one is active. The user may log in or out at any time. Motion Picture Laboratories, Inc. CONFIDENTIAL 7 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 Figure 1: Storefront view 2.3.2 Package Selection Packages are selected by a LEFT-click on the associated graphic. Three packages are currently displayed. From left to right these are Sintel, Big Buck Bunny, and Tears of Steel. This is, however, a scrollable display and two additional packages may be displayed: Sita Sings the Blues and Elephant Dreams. Currently, only the first package, Sintel, is accessible. Selection of any of the others will result in a “work in progress” pop-up message. To dismiss the pop-up, LEFT-click anywhere outside of the pop-up. Motion Picture Laboratories, Inc. CONFIDENTIAL 8 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 2.3.3 Sintel Intro If the Sintel package is selected, control of the main pane of the browser window is handed over to the package. Note that while the package has control of the page's central panel, the framework (i.e., retailer) retains control of the Retailer's menu bar which is always displayed at the top of the page: It is up to the implementer of a package what will be shown to a user at any point, what the available options are, and how users will navigate through the package's display modes. The Sintel demo package will initially display an introduction consisting of the movie poster on one side and a slide-show that continually loops on the other: To exit the intro and access the package's main-menu, LEFT click anywhere on the page. Motion Picture Laboratories, Inc. CONFIDENTIAL 9 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 2.3.4 Sintel Main Menu Page The demo package uses a Main Menu page with a collapsible menu bar on the right side of the page and a poster graphic in the center: The menu may be collapsed or expanded using the button at the top: Selecting the Trailer icon will allow the user to view the Sintel trailer. Note that this icon is enabled because the trailer has been designated as free content. The movie itself, however, has not. The Play icon, therefore, will remain disabled until the logged-in user has acquired the rights to view it. Before the rights may be acquired (i.e., the move purchased or rented) the user must, however, log in. Motion Picture Laboratories, Inc. CONFIDENTIAL 10 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 2.3.5 Creating an Account & Logging In To either log in or to create a new account use the log-in button in the Retailer's menu bar. When a new account has been successfully created a welcome message will be displayed: Once a user has logged in, the Retailer's menu bar will display the user's name and the Login button will be changed to a Logout button: 2.3.6 ‘Acquiring’ Content Rights Clicking on the Acquire icon will activate the Retailer's Purchase Dialog. The one used by the demo site is as follows: Once rights are acquired the Play icon will be activated. 2.3.7 Playing a Movie All video content is played using a standard HTML5 Video element. Users may enter and exit full-screen mode, adjust volume, pause, or resume using the standard control bar. 2.3.8 Timed Events At several points during the playing of Sintel, simulated social commentary will be displayed in red text at the bottom center of the player area: Motion Picture Laboratories, Inc. CONFIDENTIAL 11 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 Currently the demo software only allows the display of these Notices. Future releases will also support social networking functions supported by the API. Motion Picture Laboratories, Inc. CONFIDENTIAL 12 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 3 LEARNING AND USING THE SAMPLE IMPLEMENTATION Following are key design points for the Sample Implementation • Implemented in JavaScript • The API is instantiated via one set of JavaScript files that define all the constants that are included in the API. The implementation of the packages and framework is in another set of JavaScript files. • All interactions of a package with the framework are handled by globally accessible modules. • The modular design of the framework is closely matched to the groups and subgroups defined by the API (e.g., CPX_PackageMgmt implements the Package Management group). See Section 3.2.1 for details. Additional modules that are used by the Framework are covered in the sections discussing Developing and Customizing. • To deploy a package the developer must provide: 1. one or more JavaScript files 2. a single image file that will act as the 'storefront icon' for the package. 3. A JSON-formatted file with metadata regarding any content accessible via the package. This metadata includes the specification of access rights that a consumer may acquire and a URL from which to stream or download the content. • There is also the option to provide a CSS file. 3.1 Testbed Set-up and Configuration A CPE testbed may be set-up using any available web server. 1. Download the latest version of the CPE_RefImplementation zip file into a sub-directory of your web server's directory tree. This will be the {Install_dir} 2. Unzip into the {Install_dir}. The following sub-directories will be created: • {Install_dir}/html • {Install_dir}/resources • {Install_dir}/scripts Motion Picture Laboratories, Inc. CONFIDENTIAL 13 CPE Sample Implementation DRAFT • Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 {Install_dir}/styles 3. The testbed requires the use of a back-end service to support various functions relating to social networking, account access, and cross-platform preferences. The testbed is currently configured to use Firebase. Free accounts are available at www.firebase.com to support up to fifty users. Once an account has been created, the URL that has been assigned to it must be entered into the testbed. This is done by editing the file {Install_dir}/scripts/demo/framework/BES/FireBase.js. The value of the variable accntRoot should be changed to that associated with your account, e.g., var accntRoot = 'https://furious-flame-21234.firebaseio.com/'; 4. You may now run the Demo Retailer to verify proper installation. Use any browser to access the URL mapping to {Install_dir}/html/DemoRetailer.html The downloaded zip file includes all of the files required to access the packages described in Section 2. If you are unable to create a new user account and/or login it is probably due to not having configured the Firebase accntRoot correctly. 3.2 Package Integration This section describes the procedure for integrating a CPE package with the Sample Implementation (SI) framework. It is strongly recommended that readers be familiar with the material covered in the Cross Platform Extras Interface document. A working knowledge of JavaScript is also highly advantageous. 3.2.1 Accessing the Framework API The CPE API is defined in terms of six groups: • Package Management API Group • Content Access API Group • Account Access API Group • Player Interaction API Group • Social Networking API Group • Enhancements API Group Each group is further divided into sub-groups. A sub-group may be designated as OPTIONAL or MANDATORY. The table below indicates which sub-groups are currently supported by the Sample Implementation framework and, if supported, the method for invoking. Motion Picture Laboratories, Inc. CONFIDENTIAL 14 CPE Sample Implementation Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 DRAFT For most sub-groups, access to a function is via a global variable defined for the group. For example, the Content Access API Group is supported by var CPX_ContentMgmt. Thus, to invoke the 'getAvailability' function, a package could use the code var accessCodes = CPX_ContentMgmt.getAvailability(contentId); The exception to this design pattern is the Player Interaction group. The functionality of the Lifecycle sub-group is accessed via a global CPX variable. This may be used to create media players which, in the Sample Implementation framework, are represented by an instance of the PlayerWrapper class. Access to all other player-related sub-groups is via a PlayerWrapper. Group Package Mgmt. Subgroup Lifecycle Status M - Supported Connectivity Environment O O Availability Access Event M - Supported M - Supported Download O Account Access Basic Account Event M - Supported M - Supported var CPX_AccountMgmt Player Interaction Lifecycle M - Supported var CPX_PlayerMgmt Basic M - Supported instance of PlayerWrapper Trickplay O Controls Sound O O Player Event M - Supported instance of PlayerWrapper M - Supported O instance of PlayerWrapper Social Networking Geometry Sharing Enhancements Social Event Wishlists M O Bookmarks O Package History O Content Access Access Mechanism var CPX_PackageMgmt var CPX_ContentMgmt var CPX_ContentMgmt The following example shows how to create a new player and then add an event listener: var statusDesc = CPX_PlayerMgmt.createPlayer(contentId, playerId); // aget the PlayerWrapper instance var mainPlayer = statusDesc.context; // add an event listener playerListener = new DemoPlayerListener(); mainPlayer.addListener(playerListener); Motion Picture Laboratories, Inc. CONFIDENTIAL 15 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 3.2.2 Making a Package Available for Selection When a consumer first accesses the application they are presented with the storefront display showing all available packages: The packages to be displayed to consumers are specified in a JSON file. The file, {Install_dir}/resources/framework/StorefrontDb.json, contains one entry for each package: { "packages":[ { "id":"sintel01", "title":"Sintel", "display":"../resources/framework/images/PackageLogos/sintel.jpg", "status":"AVAILABLE" }, { "id":"bbb", "title":"Big Buck Bunny", "display":"../resources/framework/images/PackageLogos/bbb.jpg", "status":"PENDING" }, { "id":"tos", "title":"Tears of Steal", "display":"../resources/framework/images/PackageLogos/tos.jpg", "status":"PENDING" } } When adding a package entry to the JSON, the following requirements must be met: • The “id” will be used to identify the package JavaScript file. For example, the package for the movie “Tears of Steal” is implemented in the JavaScript file “tos.js”. Motion Picture Laboratories, Inc. CONFIDENTIAL 16 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 • The “display” attribute is the relative path to the graphic that will be shown in the storefront display. By convention, these are placed in the ../resources/framework/images/PackageLogo directory. That is not, however, a requirement. • The storefront's display graphics will be sized to a uniform size. Currently, this is specified as 260px x 110px. Image sizes not consistent with this aspect may appear distorted when displayed to users. • The “status” may be set to either AVAILABLE or PENDING. 3.2.3 Making a Package Runable When a user selects a package the framework will add the supporting javascript file to the DOM tree and then invoke the package's initialization and start-up functions. The “id” field in the JSON file is used to identify the appropriate JavaScript file. For example, a package with id : fooBar01 will be expected to have its JavaScript file named fooBar01.js. The framework will expect to find the file in directory {Install_dir}/scripts/packages The framework will only initiate a load of the package's JavaScript file. It is the responsibility of the package to single to the framework when it has completed its loading process and is ready to be initialized and displayed to the user. The complete sequence of events is: 1. the framework's PackageMgmt module loads the package by appending the appropriate JavaScript to the DOM 2. the package will assign to the global variable CPX_Package a function that implements it's side of the Cross-Platform Extras interface. 3. at the completion of the loading, the package sets its state to P_STATE_LOADED 4. the package signals to the framework a state change: var statusDesc = new StatusDescriptor(LEVEL_INFO, CC_STATE_CHANGE); // Notify framework: CPX_PackageMgmt.status(statusDesc); 5. the framework will query the package for its current state, which is now P_STATE_LOADED: var curPState = CPX_Package.getState(); 6. the framework then invokes the package's initialization function: CPX_Package.initialize("FooBar", this, packageDiv); 7. The package initialization code will first change the package state to P_STATE_INIT. It will then proceed with the initialization process. At the completion will set the state to P_STATE_AVAILABLE and the notify the framework: Motion Picture Laboratories, Inc. CONFIDENTIAL 17 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 packState = P_STATE_AVAILABLE; // Notify framework: statusDesc = new StatusDescriptor(LEVEL_INFO, CC_STATE_CHANGE); CPX_PackageMgmt.status(statusDesc); 8. the framework will make the package visible to the consumer. Each package must have a primary JavaScript file that follows the naming convention and sequence of events described in the previous paragraphs. It must also the functions defined in Section 4.3.1 of the API document. There is, however, the option of having the primary JavaScript add additional js and css files to the DOM. The Sintel package uses this approach. See Section 4.4 of this document for details and code snippets. Note that this design pattern is optional. If a package does append additional styles or JavaScript to the DOM, it is also responsible for cleaning up upon termination. The file sintel01.js includes a function, loadBase(), that will execute when the js file completes loading. It will trigger the loading of the 'base' file blenderBase.js. This second file provides a set of functions intended to provide a common look-n-feel across all packages developed by this content provider (i.e., blender.org). A second purpose is to provide utility functions that are generic to this content provider but not provided at the framework level (e.g., event listeners). 3.2.4 Interactions with the Framework The API defines a number of codes that may be passed between the framework and package. For example, Section 5.1 of the API documentation defines Content Access Codes, such as ACC_AVAIL_2BUY. Where codes are defined as integer or other non-string types, a global variable with the appropriate value assignment is defined by the JavaScript in the directory {Install_dir}/scripts/API. As an example, the file ContentAccess.js contains the following: var var var var var var var var var ACC_AVAIL_2BUY = 5001; ACC_AVAIL_2RENT = 5002; ACC_AVAIL_FREE = 5003; ACC_AVAIL_BOUGHT = 5004; ACC_AVAIL_RENTED = 5005; ACC_AVAIL_PENDING = 5006; ACC_AVAIL_UNAVAIL = 5007; ACC_AVAIL_UNK = 5008; ACC_CONTENT_UNK = 5009; The API specifies the names but not the values. Framework implementers are free to change the values but may not change the names. Packages must reference any codes by the correct name. Motion Picture Laboratories, Inc. CONFIDENTIAL 18 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 4 DEVELOPING AND CUSTOMIZING 4.1 Overview The JavaScript and style sheets used in the Cross Platform Extras Sample Implementation are available to developers wishing to create their own framework and/or package implementations. Since the entire purpose of the Cross Platform Extras API is to decouple the framework implementation from that of the package, a developer is free to implement • Only a Framework, • Only a Package • Both Framework and Package Each topic is, therefore, covered separately. The overview material regarding framework development and customization are covered in Section 4.3 while Section 4.4 addresses the package side of the API. Detailed information for each area is presented in Sections 0 and 0 respectively. 4.2 Use of Source Code and Licensing All code and supporting constructs (e.g., CSS) developed by Movie Labs and used in the Cross Platform Extras Sample Implementation is licensed under a Creative Commons Attribution (CC BY) 3.0 Unported license. 4.3 SI Framework Architecture The CPE Sample Implementation (SI) is built using HTML5 technologies. This means that, with exception of any back-end (i.e., cloud-based) services, all functionality is implemented using HTML, JavaScript, and CSS. The following subsections provide an overview how each of these technologies is used. Refer to Section 5 for detailed information. 4.3.1 HTML The SI uses a single HTML page: {Install_dir}/html/DemoRetailer.html. The only HTML constructs explicitly defined in the body section of this page are the three buttons that make up the header bar. All remaining elements DOM nodes that are presented to the consumer are created by the JavaScript. A pair of nested <div> elements acts as the container for this dynamic content. The menu bar is defined by the following HTML: Motion Picture Laboratories, Inc. CONFIDENTIAL 19 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 <ul id="cpx_header_bar"> <img id="cpx_hdrBtn_logInOut" class="cpx_hdrBtn" src="../resources/framework/images/LoginBtn.jpg" onclick="CPX_AccountMgmt.logInOut( )" onmouseover="this.src='../resources/framework/images/LoginBtn2.jpg';" onmouseout="this.src='../resources/framework/images/LoginBtn.jpg';"></img> <img id="cpx_hdrBtn_about" class="cpx_hdrBtn" src="../resources/framework/images/AboutBtn.jpg" onclick="Retailer.showAbout()" onmouseover="this.src='../resources/framework/images/AboutBtn2.jpg';" onmouseout="this.src='../resources/framework/images/AboutBtn.jpg';"></img> <img id="cpx_hdrBtn_contact" class="cpx_hdrBtn" src="../resources/framework/images/ContactBtn.jpg" onclick='Retailer.contact()' onmouseover="this.src='../resources/framework/images/ContactBtn2.jpg';" onmouseout="this.src='../resources/framework/images/ContactBtn.jpg';"></img> </ul> Note that the 'onclick' parameters for these buttons refer to specific variables defined within the javascript Main.js. The HTML defines an 'onLoad' parameter that points to the javascript that will dynamically build the remaining HTML: <body onLoad="Retailer.initialize( )"> The Retailer object is defined in the file Main.js. There are four categories of JavaScript that the HTML page loads: • API definition: this currently consists of five files, each of which is specific to one of the groups defined by the Cross Platform Extras interface and discussed previously in Section 3.2. The files are all located in the directory {Install_dir}/scripts/API. Future releases of the Sample Implementation will include a single-file minified version. • Framework implementation: This set of files is located in the directory {Install_dir}/scripts/demo/framework. As in the case of the API files, a minified version will be included with future releases. • Sample Implementation utilities: these files provide support for GUI-building and include widgets (e.g., expandable/collapsible menus) and layout managers and are intended to act as the foundation for what will eventually evolve into a Common Extras Menu Metadata capability. This is intended to allow the creation of a simple interactive experience directly from XML. See http://www.movielabs.com/md/extras/#current for current status. • 3rd party libraries: this includes libraries such as jQuery and jssor. The HTML page also loads two CSS style sheets, both discussed further in Section 4.3.4. Motion Picture Laboratories, Inc. CONFIDENTIAL 20 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 The JavaScript and CSS files used to implement packages are not loaded by the HTML. It is, instead, loaded on an 'as-needed' basis. See Section 3.2.3 for further details. 4.3.2 JavaScript for Framework The JavaScript used to create the framework for the CPE Sample Implementation is highly modular. The architecture is shown below in Figure 1. At the core is the Retailer, which is defined in the file Main.js. The Retailer module is responsible for configuring the framework by loading and initializing the modules that will provide the functionality specified in the Cross Platform Extras Interface. As noted in the previous section, the HTML page identifies Retailer.initialize() as the 'onLoad' function. The primary task of this function is to initialize five global singleton variables: var var var var var CPX_PlayerMgmt = null; CPX_AccountMgmt = null; CPX_PackageMgmt = null; CPX_ContentMgmt = null; CPX_BackEndSvc = null; The first four of these all are mapped to instances of modules that implement one of the API sub-groups. For example, CPX_AccountMgmt = AccountMgmt(); enables the software that will support account management functions such as signing in. That software itself is contained in the file AccountMgmt.js. There are equivalent files and initialization code for PackageMgmt, ContentMgmt, and PlayerMgmt. The last of the CPX_ globals is CPX_BackEndSvc. The term “back-end services” (or “BES”) refers to the JavaScript that is used to access any cloud-based (i.e., off-platform) capabilities. Authentication of a consumer's login credentials is one example of a capability that requires access to a back-end service. As noted in Section 3.1, the Sample Implementation is currently configured to use Firebase as its BES provider. It is recognized, however, that each retailer and distribution channel will wish to use its own preferred BES provider, whether 3rd party or in-house. To facilitate this, the Sample Implementation defines a BES Interface and API. This is entirely independent of the Cross Platform Extras Interface, is informative (i.e., not normative), and has no official standing. Its sole purpose is to make it easier for developers to adapt the Sample Implementation to their own environment and needs. Refer to Section 4.3.5 for additional information on the customization and use of back-end services. Motion Picture Laboratories, Inc. CONFIDENTIAL 21 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 Figure 1 SI Architecture The last major component configured as part of the Retailer initialization process is the Storefront. The Storefront class is responsible for the visual and interactive aspects of package selection. The Storefront is, therefore, instantiating the 'view' aspect of a MVC approach. The Storefront determines which packages to display to a consumer by retrieving the JSON file previously discussed in Section 3.2.2. It also determines the appropriate response to any user interaction with the display (e.g., clicking on a package icon). If the appropriate response is to activate the package, the Storefront will inform the PackageMgmt component. In terms of user interaction, the key modules are therefore: • Storefront: handles presentation of available packages, including browsing, search, and selection. • Player: media playback with controls for pause, rewind, etc. • Package: responsible for all other aspects of an experience. 4.3.3 JavaScript for UI Construction As noted previously in Section 4.3.1, the Sample Implementation makes use of a set of utilities that provide support for GUI-building. The JavaScript files are located in directory {Install_dir}/scripts/util. The functionality is provided by three separate files, each with a different focus: Motion Picture Laboratories, Inc. CONFIDENTIAL 22 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 • CPE-UI-Widgets.js: provides component widgets (e.g., buttons, expandable/collapsible menus). These widgets are 'active' in that they respond to either user interactions, background events, or both. • CPE-UI-Layouts.js: provides layouts and layout managers. It also provides support for video overlays in a 'safe' area. • CPE-UI-FX.js: provides effects such as transitions (fade in/out) and slide shows. These are all 1st generation capabilities and are intended to act as the foundation for what will eventually evolve into a Common Extras Menu Metadata capability. The ultimate goal is to allow the creation of a simple interactive experience directly from XML. They may, however, also be used to facilitate the creation of packages when implementing directly via JavaScript. The Sintel package provides several examples of this approach. 4.3.4 Stylesheets The HTML page for the Sample Implementation links two CSS files. These are: • ../styles/CPE-UI.css – this contains styles used by one or more of the CPE-UI JavaScript files. Changes may impact proper operation of layouts or component widgets. • ../styles/MLabsRI.css – contains styles used only in the context of the Sample Implementation framework (e.g., background color of the menu header bar) Any CSS files used by a specific package should be added and removed by the JavaScript implementing the package's initialize() and terminate() functions. 4.3.5 Accessing Back-End Services (BES) The term “back-end services” refers to any service that requires interaction with a remote server, whether cloud-based or organic to the retailer's infrastructure. A primary use of back-end services is to provide a mechanism for persisting and retrieving information specific to an individual consumer. Examples include user preferences, content access rights, and viewing history. Backend services are also used to authenticate login credentials. It is recognized, however, that each retailer and distribution channel will wish to use its own preferred BES provider, whether 3rd party or in-house. To facilitate this, the Sample Implementation defines a BES Interface and API. This is entirely independent of the Cross Platform Extras Interface, is informative (i.e., not normative), and has no official standing. Its sole purpose is to make it easier for developers to adapt the Sample Implementation to their own environment and needs. The BES Interface is depicted in Figure 1 as the vertical rectangle on the left side of the diagram. It is defined by the JavaScript in {Install_dir}/scripts/demo/framework/BES_Interface.js. This file is located in the demo, rather than API, directory tree because, as noted above, it is not specified as part of the Cross Motion Picture Laboratories, Inc. CONFIDENTIAL 23 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 Platform Extras Interface and, therefore, has no official status. It may be freely modified and adapted by developers or may be ignored entirely. The BES Interface contains two sets of information. The first is a set of constants specifying event codes passed across the interface. The current set is: var var var var var BES_SVC_LOGIN = "logIn"; BES_SVC_LOGOUT = "logOut"; BES_SVC_ADDACCNT = "addAccnt"; BES_SVC_CAR_SET = "setCAR"; BES_SVC_CAR_GET = "getCAR"; var var var var var BES_STATUS_SUCCESS = 100; BES_STATUS_FAILURE = 200; BES_STATUS_UNK_USER = 201; BES_STATUS_BAD_PWD = 202; BES_STATUS_DUP_USER = 203; The remainder of the file contains a template for implementing a back-end service. This specifies all the functions that are used by the Framework's modules. The current set, as grouped by the module that access it, includes: return { // Account Mgmt capabilities: login : login, logout : logout, addAccount : addAccount, // Content Mgmt capabilities: getContentRecord : getContentRecord, loadUserRights : loadUserRights, getDefaultRights : getDefaultRights, getUserRights : getUserRights, updateUserRights : updateUserRights }; The BES Interface is a work-in-progress as is expected to expand significantly in future versions of the Sample Implementation. In particular, note that the SI does not at this time support the functions in the optional groups and sub-groups of Cross Platform Extras Interface. Several these, such as the Enhancements Group, will require additions to the BES Interface. Refer to Section 3.2.1 to identify which groups and sub-groups are currently supported. The Sample Implementation currently provides two different BES implementations: • BES_Pseudo: Implements a fake back-end cloud-based service. This is DEMO code used to validate the API and as a proof-of-concept. Actual accounts are NOT supported. Instead a pseudo-capability is implemented using cookies and no actual ready-for-prime-time account DB or back-end-service provided. Motion Picture Laboratories, Inc. CONFIDENTIAL 24 CPE Sample Implementation DRAFT • Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 BES_FireBase: This module provides access to a true cloud-based BES capability. The underlying provider is Firebase. The demo is currently configured to use Firebase. Developers who wish to use Firebase as their BES will first need to establish an account. Free accounts are available to support up to fifty users. Once an account has been created, the URL that has been assigned to it must be entered into the testbed. This is done by editing the value of the variable accntRoot. Please do not use the same account as the demonstration implementation. Developers may also choose to use a different BES provider. To do so in a manner transparent to the other framework components, the developer will need to: 1. implement a module that is compatible with the BES Interface definition 2. edit the Retailer.initialize() code in Main.js to assign the new module as the CPX_BackEndSvc 4.4 RI Package Architecture This section provides an overview of the architecture used by the Sample Implementation to implement a package. This is only one of the many possible ways to design a Cross-Platform Extras package. The material in this section is provided as guidance for any developers who wish to understand or adapt the SI package code. Developers are expected to be familiar with the material covered in Section 3.2.3 of this document prior to reading the material in this section. In particular, they should understand the sequence of events that takes place during the package activation process. 4.4.1 Overview The SI approach to package implementation is based on the following design patterns: (a) all HTML is built as-needed by the JavaScript. No predefined HTML files are used. (b) A package is structured as a finite state machine (FSM) with state transitions triggered by the user's actions. (c) The functionality is divided between two JavaScript files: • a base file contains a set of functions intended to provide a common look-n-feel across all packages developed by a content provider (e.g., a movie studio). A second purpose is to provide utility functions that are generic to this content provider but not provided at the framework level (e.g., event listeners). Motion Picture Laboratories, Inc. CONFIDENTIAL 25 CPE Sample Implementation DRAFT • Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 A content-specific file acts as the primary interface between the framework and the package. It also contains all the functionality and properties specific to a single package. In the case of the Sample Implementation's demonstration packages, the “content provider” is, for most of the material, the Blender Foundation so there is a file named blenderBase.js. The content-specific code for Sintel is in the file sintel01.js. Both are located in {Install_dir}/scripts/packages The design patterns identified above result in the following code structure: • The base file has responsibility for implementing a common look-and-feel across packages. Since a large part of the visual appearance is determined by the HTML, which is generated on-demand by JavaScript, the code to carry out this type of function is located in the base files. • The content-specific file controls the state transitions. It therefore assumes much of the responsibility for event handling. • When entering a new state, the content-specific file determines the specific media (i.e., images, video, and audio) files to show or link to. The base file will insert these into the presentation template it uses for the requested state. 4.4.2 Interactions between Package and Base 4.4.2.1 Loading of JavaScript The framework will load the content-specific js file (e.g. sintel01.js). This file is responsible, in turn, for loading the base file (i.e., blenderBase.js). Once the base file has completed loading, it invokes the content-specific file's _Base_completedLoad() function. The content-specific file is then responsible for notifying the framework that the load process has completed. The following example code is from the Sintel file: /* * Invoked by the 'base' script when it has completed loading and is available */ _Base_completedLoad = function() { console.log("Package " + packID + ": loading completed"); var statusDesc = new StatusDescriptor(LEVEL_INFO, CC_STATE_CHANGE); // Notify framework: CPX_PackageMgmt.status(statusDesc); }; var loadBase = function() { var bodyEl = document.body; var pscriptEl = document.createElement('script'); pscriptEl.type = 'text/javascript'; Motion Picture Laboratories, Inc. CONFIDENTIAL 26 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 pscriptEl.async = false; var envDesc = CPX_PackageMgmt.getEnvironmentDesc(); var packageUrl = envDesc['packageDir'] + 'blenderBase.js'; pscriptEl.src = packageUrl; if (typeof pscriptEl != "undefined") { console.log("Adding package BASE script " + packageUrl); document.getElementsByTagName("head")[0].appendChild(pscriptEl); } else { alert("Unable to add package script " + packageUrl); } }; /* * This code will execute when the js file completes loading. It will trigger * the loading of the abstract 'base' package that is generic across all * packages provided by this content provider. */ loadBase(); The base side of the interaction is a single line of code at the end of the file: _Base_completedLoad(); 4.4.2.2 Initialization Initialization is completed when the package is in a state allowing the control of the UI to be passed to it (i.e., it is in the Available state). The nature of the operations that are carried out during initialization may vary from package to package and may take some time if remote resources are required. The package is, therefore, allowed to complete the initialization process asynchronously. The package should verify before returning that it can access the framework, that it recognizes the context, and that it is compatible with the viewing environment. Any additional initialization may take place asynchronously. As with all interactions in which the framework invokes a function provided by a package, the SI design has the initial point-of-invocation being provided by the content-specific file. The first step it takes is to change its state to P_STATE_INIT and notify the framework of the change: function initialize(_context, _framework, _container) { packState = P_STATE_INIT; // Notify framework: var statusDesc = new StatusDescriptor(LEVEL_INFO, CC_STATE_CHANGE); CPX_PackageMgmt.status(statusDesc); The next step is to save the arguments passed by the framework and then to invoke the base initialization process: context = _context; framework = _framework; Motion Picture Laboratories, Inc. CONFIDENTIAL 27 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 container = _container; BlenderBase.initialize("sintel", context, framework, container, "style01"); The base code initialization is focused on two requirements: loading the content provider's own style sheets (i.e., CSS files) and initializing any variables used to retrieve media files: function initialize(_packageId, context, framework, _container, _styleId) { container = _container; packageId = _packageId; pkgStyleId = _styleId; debug("Initializing for package '" + packageId + "'"); /* * Style is added ... */ style = document.createElement('link'); style.rel = 'stylesheet'; style.type = 'text/css'; style.href = rsrcPathBase + 'package.css'; document.getElementsByTagName('head')[0].appendChild(style); debug("added CSS " + rsrcPathBase + 'package.css'); var envDesc = CPX_PackageMgmt.getEnvironmentDesc(); rsrcPathBase = envDesc['rsrcDir'] + 'blender/'; pkgRsrcPath = rsrcPathBase + packageId + '/'; pkgRsrcPathImg = pkgRsrcPath + "images/"; pkgRsrcPathAudio = pkgRsrcPath + "audio/"; /* * let player mgmt know default path to find media */ CPX_PlayerMgmt.setMediaPath(pkgRsrcPath); Another aspect of look-and-feel is the use of animation. In the SI code the Blender base code uses the CPE-UI library to set up a fade-out/fade-in effect to transition between states: /* * Instantiate a transition effect for top-level UI screens */ uiSwapper = DivSwapFadding(container, swapSpeed); The last step in the base initialization is to register as a listener with the CPE-UI's layout manager: var ll = new LayoutListener(); Package_Layout_Mgr.addListener(ll); } Motion Picture Laboratories, Inc. CONFIDENTIAL 28 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 At this point the initialization process reverts to the control of the content-specific code. Since this is the module responsible for the management of state transitions, its primary concern is registering to receive event notifications: /* add an event listener to the BODY */ var bodyEl = document.body.addEventListener("click", evtHandlerClicks, false); /* * we want to be informed of changes to the user's access rights to the * content. That includes changes in log-in state */ carEvtListener = new AccessEventListener(); CPX_ContentMgmt.addListener(carEvtListener); accntEvtListener = new AccountEventListener(); CPX_AccountMgmt.addListener(accntEvtListener); The last step of initialization is to build the UI structure that will be displayed to the consumer when the package is first enabled. This consists of an HTML <div> that is inserted into the DOM whenever the state is entered and then removed when the state is exited. State transitions are described in more detail in Section 0. In terms of the initialization process a single line of code is all that is required: enterState01(); The specifics of what this function does are covered in next in Section 4.4.2.3. For now all that needs to be understood is that this function results in the construction of the required <div> element which is then saved as var rootElState01. The last step is to update the package's state and then notify the framework that the initialization process has completed: packState = P_STATE_AVAILABLE; // Notify framework: statusDesc = new StatusDescriptor(LEVEL_INFO, CC_STATE_CHANGE); CPX_PackageMgmt.status(statusDesc); } 4.4.2.3 UI Construction The Sample Implementation is a work-in-progress as is expected to expand significantly in future versions. In particular, note that the SI does not at this time support the functions in the optional groups and sub-groups of Cross Platform Extras Interface. Several these will result in new states and UI screens being added to the demo packages. This, in turn, will require additions to the code described in this section. The Blender base code used for the demonstration packages provides several functions that implement various template screens. The current capabilities include: Motion Picture Laboratories, Inc. CONFIDENTIAL 29 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 • addSlideCarousel: creates a slide show with background soundtrack and (optional) poster • buildState02: In this state the user is shown the top-level menu for a package. This includes a menu with icons to access main content and (possibly) a free 'teaser' clip and any extras. • buildPlaybackState: This is applicable to any state in which video is being made available to the consumer. This includes, but is not limited to, the main (i.e., feature) content, trailers and previews of coming attractions, interviews with cast, or behind-the-scenes documentaries. The role of the content-specific code is to invoke these template patterns with arguments pointing to the appropriate media. For example, in the SI demo the Blender “look and feel” for a package is to open with a slide show, before continuing to the main navigation menu. The following code snippet from the Sintel file shows how to create the slide show display shown in Section 2.3.3: rootElState01 = document.createElement('div'); var imgSeq = new Array(); imgSeq.push("01a_comp_000197-1100x600.jpg"); imgSeq.push("01a_comp_000559-1100x600.jpg"); imgSeq.push("02.b_comp_000296-1100x600.jpg"); imgSeq.push("02.d_comp_000411-1100x600.jpg"); imgSeq.push("02.g_comp_000106-1100x600.jpg"); var audioSrc = "3-The_Ziggurat.mp3"; var poster = "sintel_poster.jpg"; slideShow01 = BlenderBase.addSlideCarousel(rootElState01, imgSeq, audioSrc, poster); Creation of the “main-menu”, shown in Figure XX in Section 2.3.4, is even simpler: var teaser = "blender:sintel:trailer:v01:720p"; var poster = "sintel_cover.jpg"; rootElState02 = BlenderBase.buildState02(primaryContentId, teaser, poster, "style01"); The main menu gives the consumer the ability to view either a free teaser clip or, if they have acquired the rights, the actual movie. Both of these UI states are easily constructed using the buildPlaybackState function. The UI for playing the teaser is built using a single line of code: rootElState04 = BlenderBase.buildPlaybackState(contentId, enabledState, false, "EntryScreen01.png", popupEvents); Building the UI for playback of the movie is virtually identical. The only change is the Boolean argument indicating if the UI is to be used for showing the main feature of for showing some supplementary content: rootElState03 = BlenderBase.buildPlaybackState(contentId, enabledState, true, "EntryScreen01.png", popupEvents); Motion Picture Laboratories, Inc. CONFIDENTIAL 30 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 The next section will cover how the package software implements the transition from one state (e.g., display of an introductory slide show) to another (e.g., display of a main menu). 4.4.2.4 UI State Transitions The states referred to in this section are UI states as opposed to package states. The latter are defined by Section 4.1.1 of the Cross Platforms Experience Interface. The UI states are an artifact of the SI demonstration package code and are not defined in any controlled API or interface document. Any reference to the package states (e.g., P_STATE_RUNNING) will explicit indicate that a package, rather than UI, state is being referred to. The package base code provides three functions that the content-specific code uses to initiate FSM transitions: launch: used to load the initial display into the UI transitionTo: implements the visual aspects of transition from one state to another terminate: clean-up and garbage collection. The termination process is covered in more detail in Section 4.4.2.6. The remainder of this section will discuss the launch and transition processes. 4.4.2.4.1 Launching The base-code launch function takes a single argument: the root <div> for the initial display. In the previous section it was explained how the Sintel package creates an initial slide show to be used as the first screen shown to a consumer. This code snippet begins with the instruction rootElState01 = document.createElement('div'); This <div> is what will be passed by the content-specific code to the base code when it is ready to take control of the user interface and be displayed to the consumer. The entire initialization process is described in Section 3.2.3. The change to the P_STATE_AVAILABLE, at the end of the 7th step in that process, is the trigger for the UI launch. The exact sequence of interactions between the modules is: 1. the package changes the package state to P_STATE_AVAILABLE and then signals the framework that there has been a state change. 2. The framework will respond by querying the package for its current pckage state. When it determines that the package is now P_STATE_AVAILABLE, the framework will invoke CPX_Package.enable(). 3. The enable() function will invoke the launch mechanism, as well as handling and changes to the state variables: Motion Picture Laboratories, Inc. CONFIDENTIAL 31 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 function enable() { BlenderBase.launch(rootElState01); packState = P_STATE_RUNNING; // Notify framework: statusDesc = new StatusDescriptor(LEVEL_INFO, CC_STATE_CHANGE); CPX_PackageMgmt.status(statusDesc); } 4.4.2.4.2 Transition To The transition process is an event-driven procedure. The package contains several event listeners, which are described in detail in Section 4.4.2.5. For now it suffices to know that the package may receive events that are generated due to a variety of causes including, but not limited to: A user action (e.g., mouse click), A change in the user’s login status, A player-related event (e.g., the end of the movie was reached), or A change to the user’s rights to content (e.g., a rental period has expired). The design pattern used in the SI demo packages is that when an event handler determines that a state transition is required, it invokes the transition() function in the content-specific package module. This takes two mandatory arguments, both of which are functions. The first function is the exit handler for the current state and the second the entry handler for the new state. A third optional argument is used to pass any context information associated with the triggering event. The following code traces the sequence of actions that occur when the user clicks anywhere on the screen during the initial introductory slide show described in Section 2.3.3. This is intended to terminate the slide show and transition to a display of the package’s main menu. The starting point is, therefore, the event handler for mouse clicks. This will kick-off the process: transition(exitState01, enterState02); The transition() function is fairly simple: function transition(exitFunc, enterFunc, context) { var curGuiRoot = exitFunc(); var nextGuiRoot = enterFunc(context); BlenderBase.transitionTo(curGuiRoot, nextGuiRoot); } The exit and enter functions both return the root <div> for their respective UI states. These will be passed to the base module’s transitionTo() function. This is, for the SI demo packages, a very simple function. If you refer back to the description of the initialization process in Section 4.4.2.2, you will note that the 2nd from last step of the base initialization process was the use of the CPE-UI library to set up a fade-out/fade-in effect to transition between UI states: Motion Picture Laboratories, Inc. CONFIDENTIAL 32 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 /* * Instantiate a transition effect for top-level UI screens */ uiSwapper = DivSwapFadding(container, swapSpeed); The transitionTo() function simply applies that effect: function transitionTo(currentEl, nextEl) { uiSwapper.changeTo(currentEl, nextEl); } In the above discussion, the details of the exit and enter functions was skipped over. The enter functions have already been introduced in the previous section as part of the UI construction process. Recall the description on page 30 of how the GUI for movie playback is created. This is associated with UI state 3. Hence the enterState03 function is: /* * STATE 3: Player state, used for actually playing a movie */ function enterState03(contentId) { var enabledState = "UI03"; if (rootElState03 != null) { // IMPORTANT: Indicate the state transition uiState = enabledState; return rootElState03; } rootElState03 = BlenderBase.buildPlaybackState(contentId, enabledState, true, "EntryScreen01.png", popupEvents); // IMPORTANT: Indicate the state transition uiState = enabledState; return rootElState03; } The exit functions are primarily dealing with graceful shutdown and exit. For UI state 3 that means stopping the player: function exitState03() { // make sure player is stopped var curPlayer = BlenderBase.getPlayer(BlenderBase.playerId); curPlayer.stop(); // IMPORTANT: Indicate the state transition uiState = null; return rootElState03; } Also note that the last step in the exit function is to set the uiState to null. This indicates that there is at this point no package-specific component in the DOM being displayed to the user. Motion Picture Laboratories, Inc. CONFIDENTIAL 33 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 4.4.2.5 Event Handling As noted in the preceding section, the package may receive events that are generated due to a variety of causes including, but not limited to a user action (e.g., mouse click), a change in the user’s login status, a player-related event (e.g., the end of the movie was reached), or a change to the user’s rights to content (e.g., a rental period has expired). The design pattern used by the SI demo package to deal with these types of events is 1. The base module provides the code for establishing a variety of event listeners 2. Depending on the type of event, the listener will either: Pass the event to a handler function in the base module, Pass the event to a handler in the content-specific module, Handle the event itself, or Ignore the event. Mouse-click events are the exception to this design pattern. Refer to Section 4.4.2.5.5 for further details. The following are the event listeners used and the response mode of each 4.4.2.5.1 Player Events The base module provides a sub-class (i.e., extension) of the PlayerEventListener called DemoPlayerListener. The event processing is as follows: READY, VISIBILITY, or STOPPED: Pass the event to a handler in the content-specific module. The reasoning is that auto-play, restart, or automatic state-transitions upon completion may all be appropriate actions to take but only the package will be in a position to decide. PLAYING or RESUMED: handled in-line. The response is to expand or collapse any menus. GEOMETRY_CHANGE: handled in-line. TIME_EVT_R: handled in-line. The response is to display a text message in a pop-up overlay for 3 seconds. Note that this is a temporary demo-only feature used to demonstrate several capabilities of the CP Extras API. All other player-related events are currently ignored. Motion Picture Laboratories, Inc. CONFIDENTIAL 34 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 4.4.2.5.2 Content Access Events The base module provides a sub-class (i.e., extension) of the CAEventListener prototype called AccessEventListener. The listener response to all events is to pass the event to a handler in the content-specific module by invoking CPX_Package.updateAccessRts(). 4.4.2.5.3 Account Events The base module provides a sub-class (i.e., extension) of the Listener prototype called AccountEventListener. The listener response to either a log-in or log-out event is to invoke the content-specific module CPX_Package.updateAccessRts(). 4.4.2.5.4 Layout Events Layout events are generated by the CPEx-UI Layout Manager when the browser window changes shape, size, or orientation. Since this is primarily a look-n-feel issue the response is to handle it within the base module by invoking the function BlenderBase.respondToLayout(). 4.4.2.5.5 Mouse Click Events This category of events is primarily dealing with the user clicking on menu items or icons. The current code deviates from the normal design pattern in that neither the base module nor the framework provide a listener prototype. Instead, the content-specific module provides a listener function that is added to the DOM body as part of the initialization process: var bodyEl = document.body; bodyEl.addEventListener("click", evtHandlerClicks, false); The function evtHandlerClicks() determines whether or not a UI state change is warranted and, if so, invokes the state transition process described in Section 4.4.2.4.2 4.4.2.6 Termination and Shutdown In the SI demonstration the starting point for the termination and shutdown of a package is the user clicking on an EXIT icon within one of the menus. This will result in an event delivery to the mouse-click listener described in the previous section. The listener will, in this situation, call the package’s exit() function. The exit handler will immediately change the package state to P_STATE_EXITING and then notify the framework of the change in status: packState = P_STATE_EXITING; var statusDesc = new StatusDescriptor(LEVEL_INFO, CC_STATE_CHANGE); CPX_PackageMgmt.status(statusDesc); The framework will perform any required preliminary steps and then, when ready, call CPX_Package.terminate(). The content-specific module contains the terminate function. This immediately changes the package state and then calls the base module’s terminate function, removes any listeners, and then finally notifies the framework it has completed all shutdown operations: Motion Picture Laboratories, Inc. CONFIDENTIAL 35 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 function terminate() { packState = P_STATE_TERMINATED; BlenderBase.terminate(); var bodyEl = document.body; bodyEl.removeEventListener("click", evtHandlerClicks, false); CPX_ContentMgmt.removeListener(carEvtListener); CPX_AccountMgmt.removeListener(accntEvtListener); var statusDesc = new StatusDescriptor(LEVEL_INFO, CC_STATE_CHANGE); CPX_PackageMgmt.status(statusDesc); } The base module’s termination actions are for the most part fairly simple garbage collection and clean-up activities. One key point, however, is that it is responsible for removing any CSS style sheets that it has added to the DOM: function terminate() { debug("termination initiated"); rsrcPathBase = null; packageId = null; pkgRsrcPath = null; pkgRsrcPathImg = null; pkgRsrcPathAudio = null; container = null; uiSwapper = null; requiredNotices = false; requiredNoticesDiv = null; if (style != null) { $(style).remove(); style = null; } } Motion Picture Laboratories, Inc. CONFIDENTIAL 36 CPE Sample Implementation DRAFT Ref : TR-CPE-SIMPL Version : v0.8 Date: August 27, 2014 5 FRAMEWORK DEVELOPMENT & CUSTOMIZATION TBS 6 PACKAGE DEVELOPMENT & CUSTOMIZATION TBS Motion Picture Laboratories, Inc. CONFIDENTIAL 37