From ca7fa46814bb7386c74e32c1f452aa8fb0906d67 Mon Sep 17 00:00:00 2001 From: Rusty Lynch Date: Wed, 22 Oct 2008 04:21:53 -0700 Subject: * Adding initial ribosome (helix build system) and helix-libs recipes --- meta/packages/helix/helix-libs.bb | 59 + meta/packages/helix/helix-libs/add-clutter.patch | 12668 +++++++++++++++++++++ meta/packages/helix/helix-libs/helix-player.pc | 11 + meta/packages/helix/helix-libs/hxclient.pc | 11 + meta/packages/helix/ribosome.bb | 37 + meta/packages/helix/ribosome/buildrc | 4 + meta/packages/helix/ribosome/clutter.bif | 68 + 7 files changed, 12858 insertions(+) create mode 100644 meta/packages/helix/helix-libs.bb create mode 100644 meta/packages/helix/helix-libs/add-clutter.patch create mode 100644 meta/packages/helix/helix-libs/helix-player.pc create mode 100644 meta/packages/helix/helix-libs/hxclient.pc create mode 100644 meta/packages/helix/ribosome.bb create mode 100644 meta/packages/helix/ribosome/buildrc create mode 100755 meta/packages/helix/ribosome/clutter.bif (limited to 'meta') diff --git a/meta/packages/helix/helix-libs.bb b/meta/packages/helix/helix-libs.bb new file mode 100644 index 000000000..83c9d8139 --- /dev/null +++ b/meta/packages/helix/helix-libs.bb @@ -0,0 +1,59 @@ +DESCRIPTION = "Helix Client Libraries" +SECTION = "base" +DEPENDS = "ribosome gtk+ libxv" +HOMEPAGE = "http://helixcommunity.org" +LICENSE = "RPSL" + +_SNAPSHOT = "atlas310_11212008" +_TARBALL_SERVER = "http://git.moblin.org/repos/users/rusty" + +PV="r0" + +SRC_URI = "${_TARBALL_SERVER}/helix-libs_${_SNAPSHOT}.tar.bz2 \ + file://helix-libs/helix-player.pc \ + file://helix-libs/add-clutter.patch;patch=1" +S = "${WORKDIR}/helix-libs_${_SNAPSHOT}" + +export BUILD_ROOT=${STAGING_DIR_HOST}${libdir}/ribosome +export BUILDRC=${BUILD_ROOT}/buildrc +export SYSTEM_ID=linux-2.2-libc6-gcc32-i586 +export BUILD=$BUILD_ROOT/bin/build.py + +do_compile() { + ${BUILD} -k -trelease -mclutter -Phelix-client-all-defines clutter +} + +do_stage() { + mkdir -p ${STAGING_DIR_HOST}/opt/helix/lib + mkdir -p ${STAGING_DIR_HOST}/opt/helix/include + mkdir -p ${STAGING_DIR_HOST}/usr/lib/pkgconfig + + install -m 0644 clientapps/clutter/player.h \ + ${STAGING_DIR_HOST}/opt/helix/include + install -m 0644 ../helix-libs/helix-player.pc \ + ${STAGING_DIR_HOST}/usr/lib/pkgconfig + + install -m 0644 release/*.so ${STAGING_DIR_HOST}/opt/helix/lib + + install -d ${STAGING_DIR_HOST}${libdir} + install -m 0644 release/libhelix-player.so ${STAGING_DIR_HOST}${libdir} +} + +do_install() { + mkdir -p ${D}/opt/helix/lib + mkdir -p ${D}/opt/helix/include + mkdir -p ${D}/usr/lib/pkgconfig + + install -m 0644 clientapps/clutter/player.h ${D}/opt/helix/include/ + install -m 0644 ../helix-libs/helix-player.pc ${D}/usr/lib/pkgconfig + + install -m 0644 release/*.so ${D}/opt/helix/lib + + install -d ${D}${libdir} + install -m 0644 release/libhelix-player.so ${D}${libdir} +} + +FILES_${PN} = "/usr/lib/libhelix-player.so" +FILES_${PN} += "/opt/helix/lib" +FILES_${PN}-dev = "/usr/lib/pkgconfig" +FILES_${PN}-dev += "/opt/helix/include" diff --git a/meta/packages/helix/helix-libs/add-clutter.patch b/meta/packages/helix/helix-libs/add-clutter.patch new file mode 100644 index 000000000..eb545ff73 --- /dev/null +++ b/meta/packages/helix/helix-libs/add-clutter.patch @@ -0,0 +1,12668 @@ +Index: helix-libs/clientapps/clutter/LICENSE.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/LICENSE.txt 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,30 @@ ++ Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ ++ The contents of this directory, and (except where otherwise ++ indicated) the directories included within this directory, are ++ subject to the current version of the RealNetworks Public Source ++ License (the "RPSL") available at RPSL.txt in this directory, unless ++ you have licensed the directory under the current version of the ++ RealNetworks Community Source License (the "RCSL") available at ++ RCSL.txt in this directory, in which case the RCSL will apply. You ++ may also obtain the license terms directly from RealNetworks. You ++ may not use the files in this directory except in compliance with the ++ RPSL or, if you have a valid RCSL with RealNetworks applicable to ++ this directory, the RCSL. Please see the applicable RPSL or RCSL for ++ the rights, obligations and limitations governing use of the contents ++ of the directory. ++ ++ This directory is part of the Helix DNA Technology. RealNetworks is ++ the developer of the Original Code and owns the copyrights in the ++ portions it created. ++ ++ This directory, and the directories included with this directory, are ++ distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY ++ OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY ++ DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY ++ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, ++ QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ ++ Technology Compatibility Kit Test Suite(s) Location: ++ http://www.helixcommunity.org/content/tck ++ +Index: helix-libs/clientapps/clutter/RCSL.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/RCSL.txt 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,948 @@ ++The RCSL is made up of a base agreement and a few Attachments. ++ ++For Research and Development use, you agree to the terms of the ++RCSL R&D License (base RCSL and Attachments A, B, and C) ++ ++For Commercial Use (either distribution or internal commercial ++deployment) of the Helix DNA with or without support for RealNetworks' ++RealAudio and RealVideo Add-on Technology, you agree to the ++terms of the same RCSL R&D license ++and execute one or more additional Commercial Use License attachments ++. ++ ++------------------------------------------------------------------------ ++ ++ ++ REALNETWORKS COMMUNITY SOURCE LICENSE ++ ++Version 1.2 (Rev. Date: January 22, 2003). ++ ++ ++ RECITALS ++ ++Original Contributor has developed Specifications, Source Code ++implementations and Executables of certain Technology; and ++ ++Original Contributor desires to license the Technology to a large ++community to facilitate research, innovation and product development ++while maintaining compatibility of such products with the Technology as ++delivered by Original Contributor; and ++ ++Original Contributor desires to license certain Trademarks for the ++purpose of branding products that are compatible with the relevant ++Technology delivered by Original Contributor; and ++ ++You desire to license the Technology and possibly certain Trademarks ++from Original Contributor on the terms and conditions specified in this ++License. ++ ++In consideration for the mutual covenants contained herein, You and ++Original Contributor agree as follows: ++ ++ ++ AGREEMENT ++ ++*1. Introduction.* ++ ++The RealNetworks Community Source License ("RCSL") and effective ++attachments ("License") may include five distinct licenses: ++ ++i) Research Use license -- License plus Attachments A, B and C only. ++ ++ii) Commercial Use and Trademark License, which may be for Internal ++Deployment Use or external distribution, or both -- License plus ++Attachments A, B, C, and D. ++ ++iii) Technology Compatibility Kit (TCK) license -- Attachment C. ++ ++iv) Add-On Technology License (Executable) Commercial Use License ++-Attachment F. ++ ++v) Add-On Technology Source Code Porting and Optimization ++License-Attachment G. ++ ++The Research Use license is effective when You click and accept this ++License. The TCK is effective when You click and accept this License, ++unless otherwise specified in the TCK attachments. The Commercial Use ++and Trademark, Add-On Technology License, and the Add-On Technology ++Source Code Porting and Optimization licenses must each be signed by You ++and Original Contributor to become effective. Once effective, these ++licenses and the associated requirements and responsibilities are ++cumulative. Capitalized terms used in this License are defined in the ++Glossary. ++ ++*2. License Grants.* ++ ++2.1 Original Contributor Grant. ++ ++Subject to Your compliance with Sections 3, 8.10 and Attachment A of ++this License, Original Contributor grants to You a worldwide, ++royalty-free, non-exclusive license, to the extent of Original ++Contributor's Intellectual Property Rights covering the Original Code, ++Upgraded Code and Specifications, to do the following: ++ ++(a) Research Use License: ++ ++(i) use, reproduce and modify the Original Code, Upgraded Code and ++Specifications to create Modifications and Reformatted Specifications ++for Research Use by You; ++ ++(ii) publish and display Original Code, Upgraded Code and Specifications ++with, or as part of Modifications, as permitted under Section 3.1(b) below; ++ ++(iii) reproduce and distribute copies of Original Code and Upgraded Code ++to Licensees and students for Research Use by You; ++ ++(iv) compile, reproduce and distribute Original Code and Upgraded Code ++in Executable form, and Reformatted Specifications to anyone for ++Research Use by You. ++ ++(b) Other than the licenses expressly granted in this License, Original ++Contributor retains all right, title, and interest in Original Code and ++Upgraded Code and Specifications. ++ ++2.2 Your Grants. ++ ++(a) To Other Licensees. You hereby grant to each Licensee a license to ++Your Error Corrections and Shared Modifications, of the same scope and ++extent as Original Contributor's licenses under Section 2.1 a) above ++relative to Research Use and Attachment D relative to Commercial Use. ++ ++(b) To Original Contributor. You hereby grant to Original Contributor a ++worldwide, royalty-free, non-exclusive, perpetual and irrevocable ++license, to the extent of Your Intellectual Property Rights covering ++Your Error Corrections, Shared Modifications and Reformatted ++Specifications, to use, reproduce, modify, display and distribute Your ++Error Corrections, Shared Modifications and Reformatted Specifications, ++in any form, including the right to sublicense such rights through ++multiple tiers of distribution. ++ ++(c) Other than the licenses expressly granted in Sections 2.2(a) and (b) ++above, and the restrictions set forth in Section 3.1(d)(iv) below, You ++retain all right, title, and interest in Your Error Corrections, Shared ++Modifications and Reformatted Specifications. ++ ++2.3 Contributor Modifications. ++ ++You may use, reproduce, modify, display and distribute Contributor Error ++Corrections, Shared Modifications and Reformatted Specifications, ++obtained by You under this License, to the same scope and extent as with ++Original Code, Upgraded Code and Specifications. ++ ++2.4 Subcontracting. ++ ++You may deliver the Source Code of Covered Code to other Licensees ++having at least a Research Use license, for the sole purpose of ++furnishing development services to You in connection with Your rights ++granted in this License. All such Licensees must execute appropriate ++documents with respect to such work consistent with the terms of this ++License, and acknowledging their work-made-for-hire status or assigning ++exclusive right to the work product and associated Intellectual Property ++Rights to You. ++ ++*3. Requirements and Responsibilities*. ++ ++3.1 Research Use License. ++ ++As a condition of exercising the rights granted under Section 2.1(a) ++above, You agree to comply with the following: ++ ++(a) Your Contribution to the Community. All Error Corrections and Shared ++Modifications which You create or contribute to are automatically ++subject to the licenses granted under Section 2.2 above. You are ++encouraged to license all of Your other Modifications under Section 2.2 ++as Shared Modifications, but are not required to do so. You agree to ++notify Original Contributor of any errors in the Specification. ++ ++(b) Source Code Availability. You agree to provide all Your Error ++Corrections to Original Contributor as soon as reasonably practicable ++and, in any event, prior to Internal Deployment Use or Commercial Use, ++if applicable. Original Contributor may, at its discretion, post Source ++Code for Your Error Corrections and Shared Modifications on the ++Community Webserver. You may also post Error Corrections and Shared ++Modifications on a web-server of Your choice; provided, that You must ++take reasonable precautions to ensure that only Licensees have access to ++such Error Corrections and Shared Modifications. Such precautions shall ++include, without limitation, a password protection scheme limited to ++Licensees and a click-on, download certification of Licensee status ++required of those attempting to download from the server. An example of ++an acceptable certification is attached as Attachment A-2. ++ ++(c) Notices. All Error Corrections and Shared Modifications You create ++or contribute to must include a file documenting the additions and ++changes You made and the date of such additions and changes. You must ++also include the notice set forth in Attachment A-1 in the file header. ++If it is not possible to put the notice in a particular Source Code file ++due to its structure, then You must include the notice in a location ++(such as a relevant directory file), where a recipient would be most ++likely to look for such a notice. ++ ++(d) Redistribution. ++ ++(i) Source. Covered Code may be distributed in Source Code form only to ++another Licensee (except for students as provided below). You may not ++offer or impose any terms on any Covered Code that alter the rights, ++requirements, or responsibilities of such Licensee. You may distribute ++Covered Code to students for use in connection with their course work ++and research projects undertaken at accredited educational institutions. ++Such students need not be Licensees, but must be given a copy of the ++notice set forth in Attachment A-3 and such notice must also be included ++in a file header or prominent location in the Source Code made available ++to such students. ++ ++(ii) Executable. You may distribute Executable version(s) of Covered ++Code to Licensees and other third parties only for the purpose of ++evaluation and comment in connection with Research Use by You and under ++a license of Your choice, but which limits use of such Executable ++version(s) of Covered Code only to that purpose. ++ ++(iii) Modified Class, Interface and Package Naming. In connection with ++Research Use by You only, You may use Original Contributor's class, ++Interface and package names only to accurately reference or invoke the ++Source Code files You modify. Original Contributor grants to You a ++limited license to the extent necessary for such purposes. ++ ++(iv) You expressly agree that any distribution, in whole or in part, of ++Modifications developed by You shall only be done pursuant to the terms ++and conditions of this License. ++ ++(e) Extensions. ++ ++(i) Covered Code. You may not include any Source Code of Community Code ++in any Extensions. You may include the compiled Header Files of ++Community Code in an Extension provided that Your use of the Covered ++Code, including Heading Files, complies with the Commercial Use License, ++the TCK and all other terms of this License. ++ ++(ii) Publication. No later than the date on which You first distribute ++such Extension for Commercial Use, You must publish to the industry, on ++a non-confidential basis and free of all copyright restrictions with ++respect to reproduction and use, an accurate and current specification ++for any Extension. In addition, You must make available an appropriate ++test suite, pursuant to the same rights as the specification, ++sufficiently detailed to allow any third party reasonably skilled in the ++technology to produce implementations of the Extension compatible with ++the specification. Such test suites must be made available as soon as ++reasonably practicable but, in no event, later than ninety (90) days ++after Your first Commercial Use of the Extension. You must use ++reasonable efforts to promptly clarify and correct the specification and ++the test suite upon written request by Original Contributor. ++ ++(iii) Open. You agree to refrain from enforcing any Intellectual ++Property Rights You may have covering any interface(s) of Your ++Extension, which would prevent the implementation of such interface(s) ++by Original Contributor or any Licensee. This obligation does not ++prevent You from enforcing any Intellectual Property Right You have that ++would otherwise be infringed by an implementation of Your Extension. ++ ++(iv) Interface Modifications and Naming. You may not modify or add to ++the GUID space * * "xxxxxxxx-0901-11d1-8B06-00A024406D59" or any other ++GUID space designated by Original Contributor. You may not modify any ++Interface prefix provided with the Covered Code or any other prefix ++designated by Original Contributor.* * ++ ++* * ++ ++(f) You agree that any Specifications provided to You by Original ++Contributor are confidential and proprietary information of Original ++Contributor. You must maintain the confidentiality of the Specifications ++and may not disclose them to any third party without Original ++Contributor's prior written consent. You may only use the Specifications ++under the terms of this License and only for the purpose of implementing ++the terms of this License with respect to Covered Code. You agree not ++use, copy or distribute any such Specifications except as provided in ++writing by Original Contributor. ++ ++3.2 Commercial Use License. ++ ++You may not make Commercial Use of any Covered Code unless You and ++Original Contributor have executed a copy of the Commercial Use and ++Trademark License attached as Attachment D. ++ ++*4. Versions of the License.* ++ ++4.1 License Versions. ++ ++Original Contributor may publish revised versions of the License from ++time to time. Each version will be given a distinguishing version number. ++ ++4.2 Effect. ++ ++Once a particular version of Covered Code has been provided under a ++version of the License, You may always continue to use such Covered Code ++under the terms of that version of the License. You may also choose to ++use such Covered Code under the terms of any subsequent version of the ++License. No one other than Original Contributor has the right to ++promulgate License versions. ++ ++4.3 Multiple-Licensed Code. ++ ++Original Contributor may designate portions of the Covered Code as ++"Multiple-Licensed." "Multiple-Licensed" means that the Original ++Contributor permits You to utilize those designated portions of the ++Covered Code under Your choice of this License or the alternative ++license(s), if any, specified by the Original Contributor in an ++Attachment to this License. ++ ++*5. Disclaimer of Warranty.* ++ ++5.1 COVERED CODE PROVIDED AS IS. ++ ++COVERED CODE IS PROVIDED UNDER THIS LICENSE "AS IS," WITHOUT WARRANTY OF ++ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ++WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT ++FOR A PARTICULAR PURPOSE OR NON-INFRINGING. YOU AGREE TO BEAR THE ENTIRE ++RISK IN CONNECTION WITH YOUR USE AND DISTRIBUTION OF COVERED CODE UNDER ++THIS LICENSE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART ++OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER ++EXCEPT SUBJECT TO THIS DISCLAIMER. ++ ++5.2 Not Designed for High Risk Activities. ++ ++You acknowledge that Original Code, Upgraded Code and Specifications are ++not designed or intended for use in high risk activities including, but ++not limited to: (i) on-line control of aircraft, air traffic, aircraft ++navigation or aircraft communications; or (ii) in the design, ++construction, operation or maintenance of any nuclear facility. Original ++Contributor disclaims any express or implied warranty of fitness for ++such uses. ++ ++*6. Termination.* ++ ++6.1 By You. ++ ++You may terminate this Research Use license at anytime by providing ++written notice to Original Contributor. ++ ++6.2 By Original Contributor. ++ ++This License and the rights granted hereunder will terminate: ++ ++(i) automatically if You fail to comply with the terms of this License ++and fail to cure such breach within 30 days of receipt of written notice ++of the breach; ++ ++(ii) immediately in the event of circumstances specified in Sections 7.1 ++and 8.4; or ++ ++(iii) at Original Contributor's discretion upon any action initiated by ++You (including by cross-claim or counter claim) alleging that use or ++distribution by Original Contributor or any Licensee, of Original Code, ++Upgraded Code, Error Corrections, Shared Modifications or Specifications ++infringe a patent owned or controlled by You. ++ ++6.3 Effective of Termination. ++ ++Upon termination, You agree to discontinue use of and destroy all copies ++of Covered Code in Your possession. All sublicenses to the Covered Code ++which You have properly granted shall survive any termination of this ++License. Provisions that, by their nature, should remain in effect ++beyond the termination of this License shall survive including, without ++limitation, Sections 2.2, 3, 5, 7 and 8. ++ ++6.4 No Compensation. ++ ++Each party waives and releases the other from any claim to compensation ++or indemnity for permitted or lawful termination of the business ++relationship established by this License. ++ ++*7. Liability.* ++ ++7.1 Infringement. Should any of the Original Code, Upgraded Code, TCK or ++Specifications ("Materials") become the subject of a claim of ++infringement, Original Contributor may, at its sole option, (i) attempt ++to procure the rights necessary for You to continue using the Materials, ++(ii) modify the Materials so that they are no longer infringing, or ++(iii) terminate Your right to use the Materials, immediately upon ++written notice, and refund to You the amount, if any, having then ++actually been paid by You to Original Contributor for the Original Code, ++Upgraded Code and TCK, depreciated on a straight line, five year basis. ++ ++7.2 LIMITATION OF LIABILITY. TO THE FULL EXTENT ALLOWED BY APPLICABLE ++LAW, ORIGINAL CONTRIBUTOR'S LIABILITY TO YOU FOR CLAIMS RELATING TO THIS ++LICENSE, WHETHER FOR BREACH OR IN TORT, SHALL BE LIMITED TO ONE HUNDRED ++PERCENT (100%) OF THE AMOUNT HAVING THEN ACTUALLY BEEN PAID BY YOU TO ++ORIGINAL CONTRIBUTOR FOR ALL COPIES LICENSED HEREUNDER OF THE PARTICULAR ++ITEMS GIVING RISE TO SUCH CLAIM, IF ANY, DURING THE TWELVE MONTHS ++PRECEDING THE CLAIMED BREACH. IN NO EVENT WILL YOU (RELATIVE TO YOUR ++SHARED MODIFICATIONS OR ERROR CORRECTIONS) OR ORIGINAL CONTRIBUTOR BE ++LIABLE FOR ANY INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL ++DAMAGES IN CONNECTION WITH OR RISING OUT OF THIS LICENSE (INCLUDING, ++WITHOUT LIMITATION, LOSS OF PROFITS, USE, DATA, OR OTHER ECONOMIC ++ADVANTAGE), HOWEVER IT ARISES AND ON ANY THEORY OF LIABILITY, WHETHER IN ++AN ACTION FOR CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE) ++OR OTHERWISE, WHETHER OR NOT YOU OR ORIGINAL CONTRIBUTOR HAS BEEN ++ADVISED OF THE POSSIBILITY OF SUCH DAMAGE AND NOTWITHSTANDING THE ++FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. ++ ++*8. Miscellaneous.* ++ ++8.1 Trademark. ++ ++You shall not use any Trademark unless You and Original Contributor ++execute a copy of the Commercial Use and Trademark License Agreement ++attached hereto as Attachment D. Except as expressly provided in the ++License, You are granted no right, title or license to, or interest in, ++any Trademarks. Whether or not You and Original Contributor enter into ++the Trademark License, You agree not to (i) challenge Original ++Contributor's ownership or use of Trademarks; (ii) attempt to register ++any Trademarks, or any mark or logo substantially similar thereto; or ++(iii) incorporate any Trademarks into Your own trademarks, product ++names, service marks, company names, or domain names. ++ ++8.2 Integration. ++ ++This License represents the complete agreement concerning the subject ++matter hereof. ++ ++8.3 Assignment. ++ ++Original Contributor may assign this License, and its rights and ++obligations hereunder, in its sole discretion. You may assign the ++Research Use portions of this License and the TCK license to a third ++party upon prior written notice to Original Contributor (which may be ++provided electronically via the Community Web-Server). You may not ++assign the Commercial Use and Trademark license, the Add-On Technology ++License, or the Add-On Technology Source Code Porting License, including ++by way of merger (regardless of whether You are the surviving entity) or ++acquisition, without Original Contributor's prior written consent. ++ ++8.4 Severability. ++ ++If any provision of this License is held to be unenforceable, such ++provision shall be reformed only to the extent necessary to make it ++enforceable. Notwithstanding the foregoing, if You are prohibited by law ++from fully and specifically complying with Sections 2.2 or 3, this ++License will immediately terminate and You must immediately discontinue ++any use of Covered Code. ++ ++8.5 Governing Law. ++ ++This License shall be governed by the laws of the United States and the ++State of Washington, as applied to contracts entered into and to be ++performed in Washington between Washington residents. The application of ++the United Nations Convention on Contracts for the International Sale of ++Goods is expressly excluded. You agree that the state and federal courts ++located in Seattle, Washington have exclusive jurisdiction over any ++claim relating to the License, including contract and tort claims. ++ ++8.6 Dispute Resolution. ++ ++a) Arbitration. Any dispute arising out of or relating to this License ++shall be finally settled by arbitration as set out herein, except that ++either party may bring any action, in a court of competent jurisdiction ++(which jurisdiction shall be exclusive), with respect to any dispute ++relating to such party's Intellectual Property Rights or with respect to ++Your compliance with the TCK license. Arbitration shall be administered: ++(i) by the American Arbitration Association (AAA), (ii) in accordance ++with the rules of the United Nations Commission on International Trade ++Law (UNCITRAL) (the "Rules") in effect at the time of arbitration as ++modified herein; and (iii) the arbitrator will apply the substantive ++laws of Washington and the United States. Judgment upon the award ++rendered by the arbitrator may be entered in any court having ++jurisdiction to enforce such award. ++ ++b) Arbitration language, venue and damages. All arbitration proceedings ++shall be conducted in English by a single arbitrator selected in ++accordance with the Rules, who must be fluent in English and be either a ++retired judge or practicing attorney having at least ten (10) years ++litigation experience and be reasonably familiar with the technology ++matters relative to the dispute. Unless otherwise agreed, arbitration ++venue shall be in Seattle, Washington. The arbitrator may award monetary ++damages only and nothing shall preclude either party from seeking ++provisional or emergency relief from a court of competent jurisdiction. ++The arbitrator shall have no authority to award damages in excess of ++those permitted in this License and any such award in excess is void. ++All awards will be payable in U.S. dollars and may include, for the ++prevailing party (i) pre-judgment award interest, (ii) reasonable ++attorneys' fees incurred in connection with the arbitration, and (iii) ++reasonable costs and expenses incurred in enforcing the award. The ++arbitrator will order each party to produce identified documents and ++respond to no more than twenty-five single question interrogatories. ++ ++8.7 Construction. ++ ++Any law or regulation, which provides that the language of a contract ++shall be construed against the drafter, shall not apply to this License. ++ ++8.8 U.S. Government End Users. ++ ++The Covered Code is a "commercial item," as that term is defined in 48 ++C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" ++and "commercial computer software documentation," as such terms are used ++in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and ++48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government ++End Users acquire Covered Code with only those rights set forth herein. ++You agree to pass this notice to our licensees. ++ ++8.9 Marketing Activities. ++ ++Licensee hereby grants Original Contributor a non-exclusive, ++non-transferable, limited license to use the Licensee's company name and ++logo ("Licensee Marks") in any presentations, press releases, or ++marketing materials solely for the purpose of identifying Licensee as a ++member of the Helix Community. Licensee shall provide samples of ++Licensee Marks to Original Contributor upon request by Original ++Contributor. Original Contributor acknowledges that the Licensee Marks ++are the trademarks of Licensee. Original Contributor shall not use the ++Licensee Marks in a way that may imply that Original Contributor is an ++agency or branch of Licensee. Original Contributor understands and ++agrees that the use of any Licensee Marks in connection with this ++Agreement shall not create any right, title or interest, in, or to the ++Licensee Marks or any Licensee trademarks and that all such use and ++goodwill associated with any such trademarks will inure to the benefit ++of Licensee. Further the Original Contributor will stop usage of the ++Licensee Marks upon Licensee's request. ++ ++8.10 Press Announcements. ++ ++You may make press announcements or other public statements regarding ++this License without the prior written consent of the Original ++Contributor, if Your statement is limited to announcing the licensing of ++the Covered Code or the availability of Your Product and its ++compatibility with the Covered Code. All other public announcements ++regarding this license require the prior written consent of the Original ++Contributor. Consent requests are welcome at press@helixcommunity.org. ++ ++8.11 International Use. ++ ++a) Export/Import laws. Covered Code is subject to U.S. export control ++laws and may be subject to export or import regulations in other ++countries. Each party agrees to comply strictly with all such laws and ++regulations and acknowledges their responsibility to obtain such ++licenses to export, re-export, or import as may be required. You agree ++to pass these obligations to Your licensees. ++ ++b) Intellectual Property Protection. Due to limited intellectual ++property protection and enforcement in certain countries, You agree not ++to redistribute the Original Code, Upgraded Code, TCK and Specifications ++to any country on the list of restricted countries on the Community Web ++Server. ++ ++8.12 Language. ++ ++This License is in the English language only, which language shall be ++controlling in all respects, and all versions of this License in any ++other language shall be for accommodation only and shall not be binding ++on the parties to this License. All communications and notices made or ++given pursuant to this License, and all documentation and support to be ++provided, unless otherwise noted, shall be in the English language. ++ ++PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE ++"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND ++CONDITIONS OF THIS LICENSE WITH REALNETWORKS, INC. IF YOU ARE AGREEING ++TO THIS LICENSE ON BEHALF OF A COMPANY, YOU REPRESENT THAT YOU ARE ++AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. WHETHER YOU ARE ACTING ++ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, YOU MUST BE OF MAJORITY ++AGE AND BE OTHERWISE COMPETENT TO ENTER INTO CONTRACTS. IF YOU DO NOT ++MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY OF THE TERMS AND ++CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON TO EXIT. ++ ++ ++ GLOSSARY ++ ++1. *"Added Value"* means code which: ++ ++(i) has a principal purpose which is substantially different from that ++of the stand-alone Technology; ++ ++(ii) represents a significant functional and value enhancement to the ++Technology; ++ ++(iii) operates in conjunction with the Technology; and ++ ++(iv) is not marketed as a technology which replaces or substitutes for ++the Technology ++ ++2. "*Applicable Patent Rights*" mean: (a) in the case where Original ++Contributor is the grantor of rights, claims of patents that (i) are now ++or hereafter acquired, owned by or assigned to Original Contributor and ++(ii) are necessarily infringed by using or making the Original Code or ++Upgraded Code, including Modifications provided by Original Contributor, ++alone and not in combination with other software or hardware; and (b) in ++the case where Licensee is the grantor of rights, claims of patents that ++(i) are now or hereafter acquired, owned by or assigned to Licensee and ++(ii) are infringed (directly or indirectly) by using or making ++Licensee's Modifications or Error Corrections, taken alone or in ++combination with Covered Code. ++ ++3. "*Application Programming Interfaces (APIs)"* means the interfaces, ++associated header files, service provider interfaces, and protocols that ++enable a device, application, Operating System, or other program to ++obtain services from or make requests of (or provide services in ++response to requests from) other programs, and to use, benefit from, or ++rely on the resources, facilities, and capabilities of the relevant ++programs using the APIs. APIs includes the technical documentation ++describing the APIs, the Source Code constituting the API, and any ++Header Files used with the APIs. ++ ++4. "*Commercial Use*" means any use (internal or external), copying, ++sublicensing or distribution (internal or external), directly or ++indirectly of Covered Code by You other than Your Research Use of ++Covered Code within Your business or organization or in conjunction with ++other Licensees with equivalent Research Use rights. Commercial Use ++includes any use of the Covered Code for direct or indirect commercial ++or strategic gain, advantage or other business purpose. Any Commercial ++Use requires execution of Attachment D by You and Original Contributor. ++ ++5. "*Community Code*" means the Original Code, Upgraded Code, Error ++Corrections, Shared Modifications, or any combination thereof. ++ ++6. "*Community Webserver(s)"* means the webservers designated by ++Original Contributor for access to the Original Code, Upgraded Code, TCK ++and Specifications and for posting Error Corrections and Shared ++Modifications. ++ ++7. "*Compliant Covered Code*" means Covered Code that complies with the ++requirements of the TCK. ++ ++8. "*Contributor*" means each Licensee that creates or contributes to ++the creation of any Error Correction or Shared Modification. ++ ++9. "*Covered Code*" means the Original Code, Upgraded Code, ++Modifications, or any combination thereof. ++ ++10. "*Error Correction*" means any change made to Community Code which ++conforms to the Specification and corrects the adverse effect of a ++failure of Community Code to perform any function set forth in or ++required by the Specifications. ++ ++11. "*Executable*" means Covered Code that has been converted from ++Source Code to the preferred form for execution by a computer or digital ++processor (e.g. binary form). ++ ++12. "*Extension(s)"* means any additional Interfaces developed by or for ++You which: (i) are designed for use with the Technology; (ii) constitute ++an API for a library of computing functions or services; and (iii) are ++disclosed or otherwise made available to third party software developers ++for the purpose of developing software which invokes such additional ++Interfaces. The foregoing shall not apply to software developed by Your ++subcontractors to be exclusively used by You. ++ ++13. "*Header File(s)"* means that portion of the Source Code that ++provides the names and types of member functions, data members, class ++definitions, and interface definitions necessary to implement the APIs ++for the Covered Code. Header Files include, files specifically ++designated by Original Contributor as Header Files. Header Files do not ++include the code necessary to implement the functionality underlying the ++Interface. ++ ++14. *"Helix DNA Server Technology"* means the program(s) that implement ++the Helix Universal Server streaming engine for the Technology as ++defined in the Specification. ++ ++15. *"Helix DNA Client Technology"* means the Covered Code that ++implements the RealOne Player engine as defined in the Specification. ++ ++16. *"Helix DNA Producer Technology"* means the Covered Code that ++implements the Helix Producer engine as defined in the Specification. ++ ++17. *"Helix DNA Technology"* means the Helix DNA Server Technology, the ++Helix DNA Client Technology, the Helix DNA Producer Technology and other ++Helix technologies designated by Original Contributor. ++ ++18. "*Intellectual Property Rights*" means worldwide statutory and ++common law rights associated solely with (i) Applicable Patent Rights; ++(ii) works of authorship including copyrights, copyright applications, ++copyright registrations and "moral rights"; (iii) the protection of ++trade and industrial secrets and confidential information; and (iv) ++divisions, continuations, renewals, and re-issuances of the foregoing ++now existing or acquired in the future. ++ ++19. *"Interface*" means interfaces, functions, properties, class ++definitions, APIs, Header Files, GUIDs, V-Tables, and/or protocols ++allowing one piece of software, firmware or hardware to communicate or ++interoperate with another piece of software, firmware or hardware. ++ ++20. "*Internal Deployment Use*" means use of Compliant Covered Code ++(excluding Research Use) within Your business or organization only by ++Your employees and/or agents on behalf of Your business or organization, ++but not to provide services, including content distribution, to third ++parties, subject to execution of Attachment D by You and Original ++Contributor, if required. ++ ++21. "*Licensee*" means any party that has entered into and has in effect ++a version of this License with Original Contributor. ++ ++22. "*MIME type*" means a description of what type of media or other ++content is in a file, including by way of example but not limited to ++'audio/x-pn-realaudio-plugin.' ++ ++23. "*Modification(s)"* means (i) any addition to, deletion from and/or ++change to the substance and/or structure of the Covered Code, including ++Interfaces; (ii) the combination of any Covered Code and any previous ++Modifications; (iii) any new file or other representation of computer ++program statements that contains any portion of Covered Code; and/or ++(iv) any new Source Code implementing any portion of the Specifications. ++ ++24. "*MP3 Patents*" means any patents necessary to make, use or sell ++technology implementing any portion of the specification developed by ++the Moving Picture Experts Group known as MPEG-1 Audio Layer-3 or MP3, ++including but not limited to all past and future versions, profiles, ++extensions, parts and amendments relating to the MP3 specification. ++ ++25. "*MPEG-4 Patents*" means any patents necessary to make, use or sell ++technology implementing any portion of the specification developed by ++the Moving Pictures Experts Group known as MPEG-4, including but not ++limited to all past and future versions, profiles, extensions, parts and ++amendments relating to the MPEG-4 specification. ++ ++26. "*Original Code*" means the initial Source Code for the Technology ++as described on the Community Web Server. ++ ++27. "*Original Contributor*" means RealNetworks, Inc., its affiliates ++and its successors and assigns. ++ ++28. "*Original Contributor MIME Type*" means the MIME registry, browser ++preferences, or local file/protocol associations invoking any Helix DNA ++Client-based application, including the RealOne Player, for playback of ++RealAudio, RealVideo, other RealMedia MIME types or datatypes (e.g., ++.ram, .rnx, .rpm, .ra, .rm, .rp, .rt, .rf, .prx, .mpe, .rmp, .rmj, .rav, ++.rjs, .rmx, .rjt, .rms), and any other Original Contributor-specific or ++proprietary MIME types that Original Contributor may introduce in the ++future. ++ ++29. "*Personal Use*" means use of Covered Code by an individual solely ++for his or her personal, private and non-commercial purposes. An ++individual's use of Covered Code in his or her capacity as an officer, ++employee, member, independent contractor or agent of a corporation, ++business or organization (commercial or non-commercial) does not qualify ++as Personal Use. ++ ++30. "*RealMedia File Format*" means the file format designed and ++developed by RealNetworks for storing multimedia data and used to store ++RealAudio and RealVideo encoded streams. Valid RealMedia File Format ++extensions include: .rm, .rmj, .rmc, .rmvb, .rms. ++ ++31. "*RCSL Webpage*" means the RealNetworks Community Source License ++webpage located at https://www.helixcommunity.org/content/rcsl or such ++other URL that Original Contributor may designate from time to time. ++ ++32. "*Reformatted Specifications*" means any revision to the ++Specifications which translates or reformats the Specifications (as for ++example in connection with Your documentation) but which does not alter, ++subset or superset * *the functional or operational aspects of the ++Specifications. ++ ++33. "*Research Use*" means use and distribution of Covered Code only for ++Your Personal Use, research or development use and expressly excludes ++Internal Deployment Use and Commercial Use. Research Use also includes ++use of Covered Code to teach individuals how to use Covered Code. ++ ++34. "*Shared Modifications*" means Modifications that You distribute or ++use for a Commercial Use, in addition to any Modifications provided by ++You, at Your option, pursuant to Section 2.2, or received by You from a ++Contributor pursuant to Section 2.3. ++ ++35. "*Source Code*" means the preferred form of the Covered Code for ++making modifications to it, including all modules it contains, plus any ++associated interface definition files, scripts used to control ++compilation and installation of an Executable, or source code ++differential comparisons against either the Original Code or another ++well known, available Covered Code of the Contributor's choice. The ++Source Code can be in a compressed or archival form, provided the ++appropriate decompression or de-archiving software is widely available ++for no charge. ++ ++36. "*Specifications*" means the specifications for the Technology and ++other documentation, as designated on the Community Web Server, as may ++be revised by Original Contributor from time to time. ++ ++37. "*Trademarks*" means Original Contributor's trademarks and logos, ++including, but not limited to, RealNetworks, RealAudio, RealVideo, ++RealOne, RealSystem, SureStream, Helix, Helix DNA and other trademarks ++whether now used or adopted in the future. ++ ++38. "*Technology*" means the technology described in Attachment B, and ++Upgrades. ++ ++39. "*Technology Compatibility Kit"* or *"TCK*" means the test programs, ++procedures, acceptance criteria and/or other requirements, designated by ++Original Contributor for use in verifying compliance of Covered Code ++with the Specifications, in conjunction with the Original Code and ++Upgraded Code. Original Contributor may, in its sole discretion and from ++time to time, revise a TCK to correct errors and/or omissions and in ++connection with Upgrades. ++ ++40. "*Upgrade(s)"* means new versions of Technology designated ++exclusively by Original Contributor as an "Upgrade" and released by ++Original Contributor from time to time under the terms of the License. ++ ++41. "*Upgraded Code*" means the Source Code and/or Executables for ++Upgrades, possibly including Modifications made by Contributors. ++ ++42. *"User's Guide"* means the users guide for the TCK which Original ++Contributor makes available to You to provide direction in how to run ++the TCK and properly interpret the results, as may be revised by ++Original Contributor from time to time. ++ ++43. "*You(r)*" means an individual, or a legal entity acting by and ++through an individual or individuals, exercising rights either under ++this License or under a future version of this License issued pursuant ++to Section 4.1. For legal entities, "You(r)" includes any entity that by ++majority voting interest controls, is controlled by, or is under common ++control with You. ++ ++44. "*Your Products*" means any (i) hardware products You distribute ++integrating the Covered Code; (ii) any software products You distribute ++with the Covered Code that utilize the APIs of the Covered Code; or ++(iii) any services You provide using the Covered Code. ++ ++ ++ ATTACHMENT A ++ ++REQUIRED NOTICES ++ ++ ++ ATTACHMENT A-1 ++ ++REQUIRED IN ALL CASES ++ ++Notice to be included in header file of all Error Corrections and Shared ++Modifications: ++ ++Portions Copyright 1994-2003 © RealNetworks, Inc. All rights reserved. ++ ++The contents of this file, and the files included with this file, are ++subject to the current version of RealNetworks Community Source License ++Version 1.1 (the "License"). You may not use this file except in ++compliance with the License executed by both You and RealNetworks. You ++may obtain a copy of the License at * ++https://www.helixcommunity.org/content/rcsl.* You may also obtain a copy ++of the License by contacting RealNetworks directly. Please see the ++License for the rights, obligations and limitations governing use of the ++contents of the file. ++ ++This file is part of the Helix DNA technology. RealNetworks, Inc., is ++the developer of the Original code and owns the copyrights in the ++portions it created. ++ ++This file, and the files included with this file, are distributed on an ++'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, ++AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT ++LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR ++PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ ++Contributor(s): ++ ++_______________________________________________ ++ ++Technology Compatibility Kit Test Suite(s) Location: ++ ++________________________________ ++ ++ ++ ATTACHMENT A-2 ++ ++SAMPLE LICENSEE CERTIFICATION ++ ++"By clicking the `Agree' button below, You certify that You are a ++Licensee in good standing under the RealNetworks Community Source ++License, ("License") and that Your access, use and distribution of code ++and information You may obtain at this site is subject to the License. ++If You are not a Licensee under the RealNetworks Community Source ++License You agree not to download, copy or use the Helix DNA technology. ++ ++ ++ ATTACHMENT A-3 ++ ++REQUIRED STUDENT NOTIFICATION ++ ++"This software and related documentation has been obtained by Your ++educational institution subject to the RealNetworks Community Source ++License. You have been provided access to the software and related ++documentation for use only in connection with your course work and ++research activities as a matriculated student of Your educational ++institution. Any other use is expressly prohibited. ++ ++THIS SOFTWARE AND RELATED DOCUMENTATION CONTAINS PROPRIETARY MATERIAL OF ++REALNETWORKS, INC, WHICH ARE PROTECTED BY VARIOUS INTELLECTUAL PROPERTY ++RIGHTS. ++ ++You may not use this file except in compliance with the License. You may ++obtain a copy of the License on the web at ++https://www.helixcommunity.org/content/rcsl. ++ ++* ++* ++ ++ ++ ATTACHMENT B ++ ++Description of Technology ++ ++Helix DNA, which consists of Helix DNA Client, Helix DNA Server and ++Helix DNA Producer. ++ ++Description of "Technology" ++ ++Helix DNA Technology v1.0 as described on the Community Web Server. ++ ++ ++ ATTACHMENT C ++ ++TECHNOLOGY COMPATIBILITY KIT LICENSE ++ ++The following license is effective for the *Helix DNA* Technology ++Compatibility Kit - as described on the Community Web Server. The ++Technology Compatibility Kit(s) for the Technology specified in ++Attachment B may be accessed at the Community Web Server. ++ ++1. TCK License. ++ ++1.1 Grants to use TCK ++ ++Subject to the terms and restrictions set forth below and the ++RealNetworks Community Source License, and the Research Use license, ++Original Contributor grants to You a worldwide, non-exclusive, ++non-transferable license, to the extent of Original Contributor's ++Intellectual Property Rights in the TCK (without the right to ++sublicense), to use the TCK to develop and test Covered Code. ++ ++1.2 TCK Use Restrictions. ++ ++You are not authorized to create derivative works of the TCK or use the ++TCK to test any implementation of the Specification that is not Covered ++Code. You may not publish Your test results or make claims of ++comparative compatibility with respect to other implementations of the ++Specification. In consideration for the license grant in Section 1.1 ++above You agree not to develop Your own tests that are intended to ++validate conformation with the Specification. ++ ++2. Test Results. ++ ++You agree to provide to Original Contributor or the third party test ++facility if applicable, Your test results that demonstrate that Covered ++Code is Compliant Covered Code and that Original Contributor may publish ++or otherwise distribute such test results. ++ ++PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE ++"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND ++CONDITIONS OF THIS LICENSE WITH THE ORIGINAL CONTRIBUTOR, REALNETWORKS, ++INC. IF YOU ARE AGREEING TO THIS LICENSE ON BEHALF OF A COMPANY, YOU ++REPRESENT THAT YOU ARE AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. ++WHETHER YOU ARE ACTING ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, ++YOU MUST BE OF MAJORITY AGE AND BE OTHERWISE COMPETENT TO ENTER INTO ++CONTRACTS. IF YOU DO NOT MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY ++OF THE TERMS AND CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON ++TO EXIT. ++ ++*ACCEPT / REJECT ++* ++ ++* ++* ++ ++*To agree to the R&D/academic terms of this license, please register ++ on the site -- ++you will then be given a chance to agree to the clickwrap RCSL ++ ++R&D License ++ ++and gain access to the RCSL-licensed source code. To build or deploy ++commercial applications based on the RCSL, you will need to agree to the ++Commercial Use license attachments ++* ++ ++ ++ +Index: helix-libs/clientapps/clutter/RPSL.txt +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/RPSL.txt 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,518 @@ ++RealNetworks Public Source License Version 1.0 ++(Rev. Date October 28, 2002) ++ ++1. General Definitions. This License applies to any program or other work which ++RealNetworks, Inc., or any other entity that elects to use this license, ++("Licensor") makes publicly available and which contains a notice placed by ++Licensor identifying such program or work as "Original Code" and stating that it ++is subject to the terms of this RealNetworks Public Source License version 1.0 ++(or subsequent version thereof) ("License"). You are not required to accept this ++License. However, nothing else grants You permission to use, copy, modify or ++distribute the software or its derivative works. These actions are prohibited by ++law if You do not accept this License. Therefore, by modifying, copying or ++distributing the software (or any work based on the software), You indicate your ++acceptance of this License to do so, and all its terms and conditions. In ++addition, you agree to the terms of this License by clicking the Accept button ++or downloading the software. As used in this License: ++ ++1.1 "Applicable Patent Rights" mean: (a) in the case where Licensor is the ++grantor of rights, claims of patents that (i) are now or hereafter acquired, ++owned by or assigned to Licensor and (ii) are necessarily infringed by using or ++making the Original Code alone and not in combination with other software or ++hardware; and (b) in the case where You are the grantor of rights, claims of ++patents that (i) are now or hereafter acquired, owned by or assigned to You and ++(ii) are infringed (directly or indirectly) by using or making Your ++Modifications, taken alone or in combination with Original Code. ++ ++1.2 "Compatible Source License" means any one of the licenses listed on Exhibit ++B or at https://www.helixcommunity.org/content/complicense or other licenses ++specifically identified by Licensor in writing. Notwithstanding any term to the ++contrary in any Compatible Source License, any code covered by any Compatible ++Source License that is used with Covered Code must be made readily available in ++Source Code format for royalty-free use under the terms of the Compatible Source ++License or this License. ++ ++1.3 "Contributor" means any person or entity that creates or contributes to the ++creation of Modifications. ++ ++1.4 "Covered Code" means the Original Code, Modifications, the combination of ++Original Code and any Modifications, and/or any respective portions thereof. ++ ++1.5 "Deploy" means to use, sublicense or distribute Covered Code other than for ++Your internal research and development (R&D) and/or Personal Use, and includes ++without limitation, any and all internal use or distribution of Covered Code ++within Your business or organization except for R&D use and/or Personal Use, as ++well as direct or indirect sublicensing or distribution of Covered Code by You ++to any third party in any form or manner. ++ ++1.6 "Derivative Work" means either the Covered Code or any derivative work under ++United States copyright law, and including any work containing or including any ++portion of the Covered Code or Modifications, either verbatim or with ++modifications and/or translated into another language. Derivative Work also ++includes any work which combines any portion of Covered Code or Modifications ++with code not otherwise governed by the terms of this License. ++ ++1.7 "Externally Deploy" means to Deploy the Covered Code in any way that may be ++accessed or used by anyone other than You, used to provide any services to ++anyone other than You, or used in any way to deliver any content to anyone other ++than You, whether the Covered Code is distributed to those parties, made ++available as an application intended for use over a computer network, or used to ++provide services or otherwise deliver content to anyone other than You. ++ ++1.8. "Interface" means interfaces, functions, properties, class definitions, ++APIs, header files, GUIDs, V-Tables, and/or protocols allowing one piece of ++software, firmware or hardware to communicate or interoperate with another piece ++of software, firmware or hardware. ++ ++1.9 "Modifications" mean any addition to, deletion from, and/or change to, the ++substance and/or structure of the Original Code, any previous Modifications, the ++combination of Original Code and any previous Modifications, and/or any ++respective portions thereof. When code is released as a series of files, a ++Modification is: (a) any addition to or deletion from the contents of a file ++containing Covered Code; and/or (b) any new file or other representation of ++computer program statements that contains any part of Covered Code. ++ ++1.10 "Original Code" means (a) the Source Code of a program or other work as ++originally made available by Licensor under this License, including the Source ++Code of any updates or upgrades to such programs or works made available by ++Licensor under this License, and that has been expressly identified by Licensor ++as such in the header file(s) of such work; and (b) the object code compiled ++from such Source Code and originally made available by Licensor under this ++License. ++ ++1.11 "Personal Use" means use of Covered Code by an individual solely for his or ++her personal, private and non-commercial purposes. An individual's use of ++Covered Code in his or her capacity as an officer, employee, member, independent ++contractor or agent of a corporation, business or organization (commercial or ++non-commercial) does not qualify as Personal Use. ++ ++1.12 "Source Code" means the human readable form of a program or other work that ++is suitable for making modifications to it, including all modules it contains, ++plus any associated interface definition files, scripts used to control ++compilation and installation of an executable (object code). ++ ++1.13 "You" or "Your" means an individual or a legal entity exercising rights ++under this License. For legal entities, "You" or "Your" includes any entity ++which controls, is controlled by, or is under common control with, You, where ++"control" means (a) the power, direct or indirect, to cause the direction or ++management of such entity, whether by contract or otherwise, or (b) ownership of ++fifty percent (50%) or more of the outstanding shares or beneficial ownership of ++such entity. ++ ++2. Permitted Uses; Conditions & Restrictions. Subject to the terms and ++conditions of this License, Licensor hereby grants You, effective on the date ++You accept this License (via downloading or using Covered Code or otherwise ++indicating your acceptance of this License), a worldwide, royalty-free, ++non-exclusive copyright license, to the extent of Licensor's copyrights cover ++the Original Code, to do the following: ++ ++2.1 You may reproduce, display, perform, modify and Deploy Covered Code, ++provided that in each instance: ++ ++(a) You must retain and reproduce in all copies of Original Code the copyright ++and other proprietary notices and disclaimers of Licensor as they appear in the ++Original Code, and keep intact all notices in the Original Code that refer to ++this License; ++ ++(b) You must include a copy of this License with every copy of Source Code of ++Covered Code and documentation You distribute, and You may not offer or impose ++any terms on such Source Code that alter or restrict this License or the ++recipients' rights hereunder, except as permitted under Section 6; ++ ++(c) You must duplicate, to the extent it does not already exist, the notice in ++Exhibit A in each file of the Source Code of all Your Modifications, and cause ++the modified files to carry prominent notices stating that You changed the files ++and the date of any change; ++ ++(d) You must make Source Code of all Your Externally Deployed Modifications ++publicly available under the terms of this License, including the license grants ++set forth in Section 3 below, for as long as you Deploy the Covered Code or ++twelve (12) months from the date of initial Deployment, whichever is longer. You ++should preferably distribute the Source Code of Your Deployed Modifications ++electronically (e.g. download from a web site); and ++ ++(e) if You Deploy Covered Code in object code, executable form only, You must ++include a prominent notice, in the code itself as well as in related ++documentation, stating that Source Code of the Covered Code is available under ++the terms of this License with information on how and where to obtain such ++Source Code. You must also include the Object Code Notice set forth in Exhibit A ++in the "about" box or other appropriate place where other copyright notices are ++placed, including any packaging materials. ++ ++2.2 You expressly acknowledge and agree that although Licensor and each ++Contributor grants the licenses to their respective portions of the Covered Code ++set forth herein, no assurances are provided by Licensor or any Contributor that ++the Covered Code does not infringe the patent or other intellectual property ++rights of any other entity. Licensor and each Contributor disclaim any liability ++to You for claims brought by any other entity based on infringement of ++intellectual property rights or otherwise. As a condition to exercising the ++rights and licenses granted hereunder, You hereby assume sole responsibility to ++secure any other intellectual property rights needed, if any. For example, if a ++third party patent license is required to allow You to make, use, sell, import ++or offer for sale the Covered Code, it is Your responsibility to acquire such ++license(s). ++ ++2.3 Subject to the terms and conditions of this License, Licensor hereby grants ++You, effective on the date You accept this License (via downloading or using ++Covered Code or otherwise indicating your acceptance of this License), a ++worldwide, royalty-free, perpetual, non-exclusive patent license under ++Licensor's Applicable Patent Rights to make, use, sell, offer for sale and ++import the Covered Code, provided that in each instance you comply with the ++terms of this License. ++ ++3. Your Grants. In consideration of, and as a condition to, the licenses granted ++to You under this License: ++ ++(a) You grant to Licensor and all third parties a non-exclusive, perpetual, ++irrevocable, royalty free license under Your Applicable Patent Rights and other ++intellectual property rights owned or controlled by You, to make, sell, offer ++for sale, use, import, reproduce, display, perform, modify, distribute and ++Deploy Your Modifications of the same scope and extent as Licensor's licenses ++under Sections 2.1 and 2.2; and ++ ++(b) You grant to Licensor and its subsidiaries a non-exclusive, worldwide, ++royalty-free, perpetual and irrevocable license, under Your Applicable Patent ++Rights and other intellectual property rights owned or controlled by You, to ++make, use, sell, offer for sale, import, reproduce, display, perform, ++distribute, modify or have modified (for Licensor and/or its subsidiaries), ++sublicense and distribute Your Modifications, in any form and for any purpose, ++through multiple tiers of distribution. ++ ++(c) You agree not use any information derived from Your use and review of the ++Covered Code, including but not limited to any algorithms or inventions that may ++be contained in the Covered Code, for the purpose of asserting any of Your ++patent rights, or assisting a third party to assert any of its patent rights, ++against Licensor or any Contributor. ++ ++4. Derivative Works. You may create a Derivative Work by combining Covered Code ++with other code not otherwise governed by the terms of this License and ++distribute the Derivative Work as an integrated product. In each such instance, ++You must make sure the requirements of this License are fulfilled for the ++Covered Code or any portion thereof, including all Modifications. ++ ++4.1 You must cause any Derivative Work that you distribute, publish or ++Externally Deploy, that in whole or in part contains or is derived from the ++Covered Code or any part thereof, to be licensed as a whole at no charge to all ++third parties under the terms of this License and no other license except as ++provided in Section 4.2. You also must make Source Code available for the ++Derivative Work under the same terms as Modifications, described in Sections 2 ++and 3, above. ++ ++4.2 Compatible Source Licenses. Software modules that have been independently ++developed without any use of Covered Code and which contain no portion of the ++Covered Code, Modifications or other Derivative Works, but are used or combined ++in any way wtih the Covered Code or any Derivative Work to form a larger ++Derivative Work, are exempt from the conditions described in Section 4.1 but ++only to the extent that: the software module, including any software that is ++linked to, integrated with, or part of the same applications as, the software ++module by any method must be wholly subject to one of the Compatible Source ++Licenses. Notwithstanding the foregoing, all Covered Code must be subject to the ++terms of this License. Thus, the entire Derivative Work must be licensed under a ++combination of the RPSL (for Covered Code) and a Compatible Source License for ++any independently developed software modules within the Derivative Work. The ++foregoing requirement applies even if the Compatible Source License would ++ordinarily allow the software module to link with, or form larger works with, ++other software that is not subject to the Compatible Source License. For ++example, although the Mozilla Public License v1.1 allows Mozilla code to be ++combined with proprietary software that is not subject to the MPL, if ++MPL-licensed code is used with Covered Code the MPL-licensed code could not be ++combined or linked with any code not governed by the MPL. The general intent of ++this section 4.2 is to enable use of Covered Code with applications that are ++wholly subject to an acceptable open source license. You are responsible for ++determining whether your use of software with Covered Code is allowed under Your ++license to such software. ++ ++4.3 Mere aggregation of another work not based on the Covered Code with the ++Covered Code (or with a work based on the Covered Code) on a volume of a storage ++or distribution medium does not bring the other work under the scope of this ++License. If You deliver the Covered Code for combination and/or integration with ++an application previously provided by You (for example, via automatic updating ++technology), such combination and/or integration constitutes a Derivative Work ++subject to the terms of this License. ++ ++5. Exclusions From License Grant. Nothing in this License shall be deemed to ++grant any rights to trademarks, copyrights, patents, trade secrets or any other ++intellectual property of Licensor or any Contributor except as expressly stated ++herein. No right is granted to the trademarks of Licensor or any Contributor ++even if such marks are included in the Covered Code. Nothing in this License ++shall be interpreted to prohibit Licensor from licensing under different terms ++from this License any code that Licensor otherwise would have a right to ++license. Modifications, Derivative Works and/or any use or combination of ++Covered Code with other technology provided by Licensor or third parties may ++require additional patent licenses from Licensor which Licensor may grant in its ++sole discretion. No patent license is granted separate from the Original Code or ++combinations of the Original Code with other software or hardware. ++ ++5.1. Trademarks. This License does not grant any rights to use the trademarks or ++trade names owned by Licensor ("Licensor Marks" defined in Exhibit C) or to any ++trademark or trade name belonging to any Contributor. No Licensor Marks may be ++used to endorse or promote products derived from the Original Code other than as ++permitted by the Licensor Trademark Policy defined in Exhibit C. ++ ++6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, ++support, indemnity or liability obligations and/or other rights consistent with ++the scope of the license granted herein ("Additional Terms") to one or more ++recipients of Covered Code. However, You may do so only on Your own behalf and ++as Your sole responsibility, and not on behalf of Licensor or any Contributor. ++You must obtain the recipient's agreement that any such Additional Terms are ++offered by You alone, and You hereby agree to indemnify, defend and hold ++Licensor and every Contributor harmless for any liability incurred by or claims ++asserted against Licensor or such Contributor by reason of any such Additional ++Terms. ++ ++7. Versions of the License. Licensor may publish revised and/or new versions of ++this License from time to time. Each version will be given a distinguishing ++version number. Once Original Code has been published under a particular version ++of this License, You may continue to use it under the terms of that version. You ++may also choose to use such Original Code under the terms of any subsequent ++version of this License published by Licensor. No one other than Licensor has ++the right to modify the terms applicable to Covered Code created under this ++License. ++ ++8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part ++pre-release, untested, or not fully tested works. The Covered Code may contain ++errors that could cause failures or loss of data, and may be incomplete or ++contain inaccuracies. You expressly acknowledge and agree that use of the ++Covered Code, or any portion thereof, is at Your sole and entire risk. THE ++COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ++ANY KIND AND LICENSOR AND LICENSOR'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS ++"LICENSOR" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY ++DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT ++NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF ++SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ++ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. LICENSOR AND EACH ++CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE ++COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR ++REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR ++ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR ++WRITTEN DOCUMENTATION, INFORMATION OR ADVICE GIVEN BY LICENSOR, A LICENSOR ++AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You ++acknowledge that the Covered Code is not intended for use in high risk ++activities, including, but not limited to, the design, construction, operation ++or maintenance of nuclear facilities, aircraft navigation, aircraft ++communication systems, or air traffic control machines in which case the failure ++of the Covered Code could lead to death, personal injury, or severe physical or ++environmental damage. Licensor disclaims any express or implied warranty of ++fitness for such uses. ++ ++9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT ++SHALL LICENSOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, ++INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR ++YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER ++UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR STRICT ++LIABILITY), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF LICENSOR OR SUCH ++CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND ++NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME ++JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR ++CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event ++shall Licensor's total liability to You for all damages (other than as may be ++required by applicable law) under this License exceed the amount of ten dollars ++($10.00). ++ ++10. Ownership. Subject to the licenses granted under this License, each ++Contributor retains all rights, title and interest in and to any Modifications ++made by such Contributor. Licensor retains all rights, title and interest in and ++to the Original Code and any Modifications made by or on behalf of Licensor ++("Licensor Modifications"), and such Licensor Modifications will not be ++automatically subject to this License. Licensor may, at its sole discretion, ++choose to license such Licensor Modifications under this License, or on ++different terms from those contained in this License or may choose not to ++license them at all. ++ ++11. Termination. ++ ++11.1 Term and Termination. The term of this License is perpetual unless ++terminated as provided below. This License and the rights granted hereunder will ++terminate: ++ ++(a) automatically without notice from Licensor if You fail to comply with any ++term(s) of this License and fail to cure such breach within 30 days of becoming ++aware of such breach; ++ ++(b) immediately in the event of the circumstances described in Section 12.5(b); ++or ++ ++(c) automatically without notice from Licensor if You, at any time during the ++term of this License, commence an action for patent infringement against ++Licensor (including by cross-claim or counter claim in a lawsuit); ++ ++(d) upon written notice from Licensor if You, at any time during the term of ++this License, commence an action for patent infringement against any third party ++alleging that the Covered Code itself (excluding combinations with other ++software or hardware) infringes any patent (including by cross-claim or counter ++claim in a lawsuit). ++ ++11.2 Effect of Termination. Upon termination, You agree to immediately stop any ++further use, reproduction, modification, sublicensing and distribution of the ++Covered Code and to destroy all copies of the Covered Code that are in your ++possession or control. All sublicenses to the Covered Code which have been ++properly granted prior to termination shall survive any termination of this ++License. Provisions which, by their nature, should remain in effect beyond the ++termination of this License shall survive, including but not limited to Sections ++3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for ++compensation, indemnity or damages of any sort solely as a result of terminating ++this License in accordance with its terms, and termination of this License will ++be without prejudice to any other right or remedy of any party. ++ ++12. Miscellaneous. ++ ++12.1 Government End Users. The Covered Code is a "commercial item" as defined in ++FAR 2.101. Government software and technical data rights in the Covered Code ++include only those rights customarily provided to the public as defined in this ++License. This customary commercial license in technical data and software is ++provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer ++Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical ++Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software ++or Computer Software Documentation). Accordingly, all U.S. Government End Users ++acquire Covered Code with only those rights set forth herein. ++ ++12.2 Relationship of Parties. This License will not be construed as creating an ++agency, partnership, joint venture or any other form of legal association ++between or among You, Licensor or any Contributor, and You will not represent to ++the contrary, whether expressly, by implication, appearance or otherwise. ++ ++12.3 Independent Development. Nothing in this License will impair Licensor's ++right to acquire, license, develop, have others develop for it, market and/or ++distribute technology or products that perform the same or similar functions as, ++or otherwise compete with, Modifications, Derivative Works, technology or ++products that You may develop, produce, market or distribute. ++ ++12.4 Waiver; Construction. Failure by Licensor or any Contributor to enforce any ++provision of this License will not be deemed a waiver of future enforcement of ++that or any other provision. Any law or regulation which provides that the ++language of a contract shall be construed against the drafter will not apply to ++this License. ++ ++12.5 Severability. (a) If for any reason a court of competent jurisdiction finds ++any provision of this License, or portion thereof, to be unenforceable, that ++provision of the License will be enforced to the maximum extent permissible so ++as to effect the economic benefits and intent of the parties, and the remainder ++of this License will continue in full force and effect. (b) Notwithstanding the ++foregoing, if applicable law prohibits or restricts You from fully and/or ++specifically complying with Sections 2 and/or 3 or prevents the enforceability ++of either of those Sections, this License will immediately terminate and You ++must immediately discontinue any use of the Covered Code and destroy all copies ++of it that are in your possession or control. ++ ++12.6 Dispute Resolution. Any litigation or other dispute resolution between You ++and Licensor relating to this License shall take place in the Seattle, ++Washington, and You and Licensor hereby consent to the personal jurisdiction of, ++and venue in, the state and federal courts within that District with respect to ++this License. The application of the United Nations Convention on Contracts for ++the International Sale of Goods is expressly excluded. ++ ++12.7 Export/Import Laws. This software is subject to all export and import laws ++and restrictions and regulations of the country in which you receive the Covered ++Code and You are solely responsible for ensuring that You do not export, ++re-export or import the Covered Code or any direct product thereof in violation ++of any such restrictions, laws or regulations, or without all necessary ++authorizations. ++ ++12.8 Entire Agreement; Governing Law. This License constitutes the entire ++agreement between the parties with respect to the subject matter hereof. This ++License shall be governed by the laws of the United States and the State of ++Washington. ++ ++Where You are located in the province of Quebec, Canada, the following clause ++applies: The parties hereby confirm that they have requested that this License ++and all related documents be drafted in English. Les parties ont exigé ++que le présent contrat et tous les documents connexes soient ++rédigés en anglais. ++ ++ EXHIBIT A. ++ ++"Copyright © 1995-2002 ++RealNetworks, Inc. and/or its licensors. All Rights Reserved. ++ ++The contents of this file, and the files included with this file, are subject to ++the current version of the RealNetworks Public Source License Version 1.0 (the ++"RPSL") available at https://www.helixcommunity.org/content/rpsl unless you have ++licensed the file under the RealNetworks Community Source License Version 1.0 ++(the "RCSL") available at https://www.helixcommunity.org/content/rcsl, in which ++case the RCSL will apply. You may also obtain the license terms directly from ++RealNetworks. You may not use this file except in compliance with the RPSL or, ++if you have a valid RCSL with RealNetworks applicable to this file, the RCSL. ++Please see the applicable RPSL or RCSL for the rights, obligations and ++limitations governing use of the contents of the file. ++ ++This file is part of the Helix DNA Technology. RealNetworks is the developer of ++the Original code and owns the copyrights in the portions it created. ++ ++This file, and the files included with this file, is distributed and made ++available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR ++IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING ++WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR ++PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ ++Contributor(s): ____________________________________ ++ ++Technology Compatibility Kit Test ++Suite(s) Location (if licensed under the RCSL): ______________________________ ++ ++Object Code Notice: Helix DNA Client technology included. Copyright (c) ++RealNetworks, Inc., 1995-2002. All rights reserved. ++ ++ ++ EXHIBIT B ++ ++Compatible Source Licenses for the RealNetworks Public Source License. The ++following list applies to the most recent version of the license as of October ++25, 2002, unless otherwise indicated. ++ ++* Academic Free License ++* Apache Software License ++* Apple Public Source License ++* Artistic license ++* Attribution Assurance Licenses ++* BSD license ++* Common Public License (1) ++* Eiffel Forum License ++* GNU General Public License (GPL) (1) ++* GNU Library or "Lesser" General Public License (LGPL) (1) ++* IBM Public License ++* Intel Open Source License ++* Jabber Open Source License ++* MIT license ++* MITRE Collaborative Virtual Workspace License (CVW License) ++* Motosoto License ++* Mozilla Public License 1.0 (MPL) ++* Mozilla Public License 1.1 (MPL) ++* Nokia Open Source License ++* Open Group Test Suite License ++* Python Software Foundation License ++* Ricoh Source Code Public License ++* Sun Industry Standards Source License (SISSL) ++* Sun Public License ++* University of Illinois/NCSA Open Source License ++* Vovida Software License v. 1.0 ++* W3C License ++* X.Net License ++* Zope Public License ++* zlib/libpng license ++ ++(1) Note: because this license contains certain reciprocal licensing terms that ++purport to extend to independently developed code, You may be prohibited under ++the terms of this otherwise compatible license from using code licensed under ++its terms with Covered Code because Covered Code may only be licensed under the ++RealNetworks Public Source License. Any attempt to apply non RPSL license terms, ++including without limitation the GPL, to Covered Code is expressly forbidden. ++You are responsible for ensuring that Your use of Compatible Source Licensed ++code does not violate either the RPSL or the Compatible Source License. ++ ++The latest version of this list can be found at: ++https://www.helixcommunity.org/content/complicense ++ ++ EXHIBIT C ++ ++RealNetworks' Trademark policy. ++ ++RealNetworks defines the following trademarks collectively as "Licensor ++Trademarks": "RealNetworks", "RealPlayer", "RealJukebox", "RealSystem", ++"RealAudio", "RealVideo", "RealOne Player", "RealMedia", "Helix" or any other ++trademarks or trade names belonging to RealNetworks. ++ ++RealNetworks "Licensor Trademark Policy" forbids any use of Licensor Trademarks ++except as permitted by and in strict compliance at all times with RealNetworks' ++third party trademark usage guidelines which are posted at ++http://www.realnetworks.com/info/helixlogo.html. ++ +Index: helix-libs/clientapps/clutter/Umakefil +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/Umakefil 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,325 @@ ++# ++# ***** BEGIN LICENSE BLOCK ***** ++# Version: RCSL 1.0/RPSL 1.0 ++# ++# Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++# ++# The contents of this file, and the files included with this file, are ++# subject to the current version of the RealNetworks Public Source License ++# Version 1.0 (the "RPSL") available at ++# http://www.helixcommunity.org/content/rpsl unless you have licensed ++# the file under the RealNetworks Community Source License Version 1.0 ++# (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++# in which case the RCSL will apply. You may also obtain the license terms ++# directly from RealNetworks. You may not use this file except in ++# compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++# applicable to this file, the RCSL. Please see the applicable RPSL or ++# RCSL for the rights, obligations and limitations governing use of the ++# contents of the file. ++# ++# This file is part of the Helix DNA Technology. RealNetworks is the ++# developer of the Original Code and owns the copyrights in the portions ++# it created. ++# ++# This file, and the files included with this file, is distributed and made ++# available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++# EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++# FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++# ++# Technology Compatibility Kit Test Suite(s) Location: ++# http://www.helixcommunity.org/content/tck ++# ++# Contributor(s): ++# ++# ***** END LICENSE BLOCK ***** ++# ++ ++UmakefileVersion(2,2) ++ ++project.AddModuleIncludes("common/include", ++ "common/runtime/pub", ++ "client/include", ++ "client/common/system/pub", ++ "client/common/container/pub", ++ "client/audiosvc/pub", ++ "common/container/pub", ++ "video/sitelib/pub", ++ "video/colconverter/pub", ++ "video/sitelib/pub/platform/unix", ++ "video/sitelib", ++ "datatype/rm/include", ++ "client/core") ++ ++project.AddSources("player.cpp", ++ "excontxt.cpp", ++ "exsite.cpp", ++ "exroot.cpp", ++ "exadvsnk.cpp", ++ "exerror.cpp", ++ "iids.cpp", ++ "exstateadvsnk.cpp", ++ "excallback.cpp", ++ "print.cpp") ++ ++project.AddModuleLibraries( ++ "common/runtime[runtlib]", ++ "common/system[syslib]", ++ "common/container[contlib]", ++ "common/runtime[runtlib]", ++ "client/common/system[sysclntlib]", ++ "common/dbgtool[debuglib]", ++ "common/util[utillib]", ++ "video/sitelib[sitelib]", ++ "video/sitelib[sitecreatelib]", ++ "common/log/logutil[logutillib]", ++ "video/vidutil[vidutillib]" ++ ) ++project.AddSystemLibraries('Xv', 'Xext') ++ ++if project.IsDefined("HELIX_FEATURE_PREFERENCES"): ++ project.AddSources("preflist.cpp") ++ ++if project.IsDefined("HELIX_FEATURE_AUTHENTICATION"): ++ project.AddSources("exaumgr.cpp") ++ ++if project.IsDefined("HELIX_FEATURE_VIDEO"): ++ project.AddSources("exsitsup.cpp", ++ "fivemmap.cpp") ++ project.AddModuleIncludes('video/include') ++ if project.IsDefined("HELIX_FEATURE_PNG"): ++ project.AddModuleIncludes('datatype/image/png/common/pub') ++ project.AddModuleLibraries("common/import/zlib[zlib]", ++ "datatype/image/png/import/libpng[libpng]", ++ "datatype/image/png/common[pngcomlib]") ++ ++if project.IsDefined("HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS"): ++ project.AddSources("exprdnld.cpp") ++ ++if project.BuildOption("nodll"): ++ ## Client core ++ static_plugin_list = ["clntcore"] ++ project.AddModuleLibraries("common/runtime[runtlib]", ++ "common/fileio[fileiolib]", ++ "client/common/system[sysclntlib]", ++ "client/common/container[contclntlib]", ++ "client/core[clntcorelib]") ++ if not project.IsDefined("HELIX_FEATURE_LOGLEVEL_NONE"): ++ project.AddModuleLibraries("common/log/logutil[logutillib]") ++ if not project.IsDefined("HELIX_CONFIG_MINIMIZE_SIZE"): ++ project.AddModuleLibraries("client/common/util[utlclntlib]") ++ ## Client core libraries ++ if project.IsDefined("HELIX_FEATURE_AUDIO"): ++ project.AddModuleLibraries("audio/device[auddevlib]", ++ "client/audiosvc[audsvclib]") ++ if ('HELIX_FEATURE_VOLUME' in project.defines): ++ project.AddModuleLibraries("audio/gaintool[audgainlib]" ) ++ if ('HELIX_FEATURE_VOLUME' in project.defines): ++ project.AddModuleLibraries("audio/crossfade[audxfadelib]") ++ if project.IsDefined("HELIX_FEATURE_MIXER"): ++ project.AddModuleLibraries("audio/mixer[audmixlib]") ++ if project.IsDefined("HELIX_FEATURE_RESAMPLER"): ++ project.AddModuleLibraries("audio/resampler[audresamplib]") ++ if project.IsDefined("HELIX_FEATURE_LIMITER"): ++ project.AddModuleLibraries("audio/limiter[audlimiter]") ++ ++ if project.IsDefined("HELIX_FEATURE_VIDEO"): ++ project.AddModuleLibraries("client/videosvc[vidsvclib]", ++ "protocol/sdp[sdplib]") ++ if project.IsDefined("HELIX_FEATURE_PLAYBACK_NET"): ++ project.AddModuleLibraries("client/netwksvc[netsvclib]", ++ "common/netio[netiolib]", ++ "client/common/netio[netioclntlib]", ++ "protocol/transport/common/system[systranlib]", ++ "protocol/transport/rtp[rtptranlib]", ++ "protocol/common/util[protutillib]", ++ "protocol/rtsp[rtsplib]") ++ if project.IsDefined("HELIX_FEATURE_RDT"): ++ project.AddLibraries(GetSDKPath("prtclrdt_lib")) ++ project.AddModuleLibraries("protocol/transport/rdt[rdttranlib]") ++ if project.IsDefined("HELIX_FEATURE_PNA"): ++ project.AddLibraries(GetSDKPath("prtclpna_lib")) ++ if project.IsDefined("HELIX_FEATURE_XMLPARSER"): ++ project.AddModuleLibraries("common/lang/xml[xmllib]") ++ ## Add RAM file format and renderer ++ if project.IsDefined("HELIX_FEATURE_META"): ++ static_plugin_list[-1:-1] = ["ramfformat", "ramrender"] ++ project.AddModuleLibraries("datatype/ram/renderer[ramrendrlib]") ++ ## Add local file system ++ if project.IsDefined("HELIX_FEATURE_PLAYBACK_LOCAL"): ++ static_plugin_list[-1:-1] = ["smplfsys"] ++ project.AddModuleLibraries("common/fileio[fileiolib]") ++ ## Add http file system ++ if project.IsDefined("HELIX_FEATURE_PLAYBACK_NET"): ++ static_plugin_list[-1:-1] = ["hxsdp", "httpfsys"] ++ project.AddModuleLibraries("protocol/http[httplib]", ++ "protocol/common/util[protutillib]", ++ "protocol/sdp[sdplib]", ++ "filesystem/data[datafsys]", ++ "common/fileio[fileiolib]", ++ "common/import/zlib[zlib]") ++ ## Add realmedia file format ++ if project.IsDefined("HELIX_FEATURE_PLAYBACK_LOCAL") and \ ++ (project.IsDefined("HELIX_FEATURE_AUDIO_REAL") or \ ++ project.IsDefined("HELIX_FEATURE_VIDEO_REAL")): ++ static_plugin_list[-1:-1] = ["rmfformat"] ++ project.AddModuleLibraries("datatype/common/util[dtutillib]", ++ "datatype/common/container[dtcomcontlib]") ++ project.AddLibraries(GetSDKPath("rmcom_lib"), ++ GetSDKPath("rmacom_lib"), ++ GetSDKPath("rmff_lib"), ++ GetSDKPath("rmvidpyld_lib")) ++ ++ ## Add realmedia renderer ++ if project.IsDefined("HELIX_FEATURE_AUDIO_REAL"): ++ static_plugin_list[-1:-1] = ["rarender"] ++ project.AddModuleLibraries("datatype/rm/audio/payload[rapayld]") ++ project.AddLibraries(GetSDKPath("rmarend_lib"), ++ GetSDKPath("rmacom_lib")) ++ ## Add mp3 file format and renderer ++ if project.IsDefined("HELIX_FEATURE_AUDIO_MPA_LAYER3") or \ ++ project.IsDefined("HELIX_FEATURE_AUDIO_MPA_LAYER2") or \ ++ project.IsDefined("HELIX_FEATURE_AUDIO_MPA_LAYER1"): ++ static_plugin_list[-1:-1] = ["mp3render"] ++ project.AddModuleLibraries("datatype/mp3/codec/fltpt[mp3codecfltpt]", ++ "datatype/mp3/common[mp3lib]", ++ "datatype/mp3/payload[mp3payld]", ++ "datatype/common/util[dtutillib]") ++ if project.IsDefined("HELIX_FEATURE_PLAYBACK_LOCAL"): ++ static_plugin_list[-1:-1] = ["mp3fformat"] ++ project.AddModuleLibraries("datatype/mp3/common[mp3lib]") ++ ## Add gecko realmedia codec ++ if project.IsDefined("HELIX_FEATURE_AUDIO_CODEC_GECKO"): ++ static_plugin_list[-1:-1] = ["cook"] ++ if not project.IsDefined("HELIX_CONFIG_FIXEDPOINT"): ++ project.AddLibraries(GetSDKPath("ra8lbrdec_flt_lib")) ++ else: ++ project.AddLibraries(GetSDKPath("ra8lbrdec_fix_lib")) ++ project.AddModuleLibraries("datatype/rm/audio/codec/common[racompat]") ++ ## Add RAAC codec ++ if project.IsDefined("HELIX_FEATURE_AUDIO_CODEC_RAAC"): ++ static_plugin_list[-1:-1] = ["raac"] ++ project.AddModuleLibraries("datatype/mp4/common[mp4comlib]", ++ "datatype/aac/codec/fixpt/decoder/hxwrap[aacdeclib]") ++ ## Add sipro realmedia codec ++ ## (Right now this only works for floating-point platforms) ++ if project.IsDefined("HELIX_FEATURE_AUDIO_CODEC_SIPRO"): ++ static_plugin_list[-1:-1] = ["sipr"] ++ project.AddLibraries(GetSDKPath("sipro_flt_backend_lib")) ++ ## Add tokyo realmedia codec ++ if project.IsDefined("HELIX_FEATURE_AUDIO_CODEC_TOKYO"): ++ static_plugin_list[-1:-1] = ["atrc"] ++ project.AddLibraries(GetSDKPath("ra8hbr_lib")) ++ ## ++ if project.IsDefined("HELIX_FEATURE_VIDEO"): ++ static_plugin_list[-1:-1] = ["vidsite"] ++ static_plugin_list[-1:-1] = ["hxltcolor"] ++ project.AddModuleLibraries("datatype/common/vidrend[vidrend]", ++ "video/sitelib[sitelib]", ++ "video/site[vidsite]", ++ "video/colconverter[hxltcolor]", ++ "datatype/rm/common[rmcomlib]", ++ "video/vidutil[vidutillib]") ++ ++ if (project.IsDefined('HELIX_FEATURE_ALTERNATE_SITE_CREATE_LIB')): ++ project.AddLibraries(GetSDKPath("sitecreate_lib")) ++ else: ++ project.AddModuleLibraries('video/sitelib[sitecreatelib]') ++ ++ ## Add realvideo renderer ++ if project.IsDefined("HELIX_FEATURE_VIDEO_REAL"): ++ project.AddModuleLibraries("datatype/rm/video/renderer[rvxrendlib]") ++ project.AddLibraries(GetSDKPath("rmvidcom_lib"), ++ GetSDKPath("rmvidpyld_lib"), ++ GetSDKPath("rvcodcom_lib")) ++ project.AddModuleLibraries("datatype/common/util[dtutillib]") ++ static_plugin_list[-1:-1] = ["rvrender"] ++ ++ ## Add mpeg4 file format ++ if project.IsDefined("HELIX_FEATURE_PLAYBACK_LOCAL")and \ ++ (project.IsDefined("HELIX_FEATURE_VIDEO_H263") or \ ++ project.IsDefined("HELIX_FEATURE_VIDEO_MPEG4") or \ ++ project.IsDefined("HELIX_FEATURE_AUDIO_MPEG4")): ++ static_plugin_list[-1:-1] = ["mp4fformat"] ++ project.AddModuleLibraries("datatype/common/util[dtutillib]", ++ "datatype/common/audrend", ++ "datatype/mp4/common[mp4comlib]", ++ "datatype/mp4/payload[mp4pyldlib]", ++ "datatype/mp4/fileformat[mp4fformatlib]") ++ if not project.IsDefined("HELIX_FEATURE_MP4_FILEFORMAT_M4A_ONLY"): ++ project.AddModuleLibraries("protocol/sdp[sdplib]", ++ "protocol/rtsp[rtsplib]", ++ "protocol/common/util[protutillib]", ++ "datatype/rm/common[rmcomlib]", ++ "datatype/amr/common[amrcomlib]") ++ ## Add h.263 renderer ++ if project.IsDefined("HELIX_FEATURE_VIDEO_H263"): ++ project.AddModuleLibraries("datatype/h263/payload[h263pyldlib]") ++ static_plugin_list[-1:-1] = ["h263render"] ++ ## Add MPEG4 renderer ++# if project.IsDefined("HELIX_FEATURE_VIDEO_MPEG4"): ++# static_plugin_list[-1:-1] = ["mp4xrender"] ++ ## Add mpeg 4 audio renderer ++ if project.IsDefined("HELIX_FEATURE_AUDIO_MPEG4"): ++ static_plugin_list[-1:-1] = ["mp4arender"] ++ project.AddModuleLibraries("datatype/mp4/audio/renderer[mp4arenderlib]") ++ if not project.IsDefined("HELIX_FEATURE_MP4_FILEFORMAT_M4A_ONLY"): ++ project.AddModuleLibraries("datatype/amr/common[amrcomlib]") ++ ## Add RV10 codec ++ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV10"): ++ project.AddLibraries(GetSDKPath("rv1dec_libs")+"[rv10lib]", ++ GetSDKPath("rv1dec_libs")+"[drv1lib]") ++ static_plugin_list[-1:-1] = ["rv10", "drv1"] ++ ## Add RV20 codec ++ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV20"): ++ project.AddLibraries(GetSDKPath("rvg2dec_libs")+"[rv20lib]", ++ GetSDKPath("rvg2dec_libs")+"[drv2lib]") ++ static_plugin_list[-1:-1] = ["rv20", "drv2"] ++ ++ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV30") or \ ++ project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV40"): ++ static_plugin_list[-1:-1] = ["drvc"] ++ if project.IsDefined("HELIX_FEATURE_ANSIC_RV89COMBO"): ++ project.AddLibraries(GetSDKPath("rv89combo_c_libs")+"[drvc]") ++ else: ++ project.AddLibraries(GetSDKPath("rv89combo_libs")+"[drvclib]") ++ ++ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV30"): ++ static_plugin_list[-1:-1] = ["rv30"] ++ project.AddLibraries(GetSDKPath("rv89combo_libs")+"[rv3xlib]") ++ project.AddModuleLibraries("datatype/rm/video/codec/rv89combo[rv30]") ++ ++ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV40"): ++ static_plugin_list[-1:-1] = ["rv40"] ++ project.AddLibraries(GetSDKPath("rv89combo_libs")+"[rv4xlib]") ++ project.AddModuleLibraries("datatype/rm/video/codec/rv89combo[rv40]") ++ ++# if project.IsDefined("HELIX_FEATURE_AUDIO_CODEC_AAC"): ++# static_plugin_list[-1:-1] = ["aac4"] ++ ++ CreateStaticPluginTable(static_plugin_list) ++ ++project.ExportFunction("init_main", "void") ++project.ExportFunction("deinit_main", "void") ++project.ExportFunction("get_player", "void **ppPlayer", ++ "on_buffering_cb_t on_buffering_cb", ++ "on_pos_length_cb_t on_pos_length_cb") ++project.ExportFunction("player_openurl", "void *pPlayerHandle", ++ "char *pszRawURL") ++project.ExportFunction("put_player", "void *pPlayerHandle") ++project.ExportFunction("player_geturl", "void *pPlayerHandle", "char **pszURL") ++project.ExportFunction("player_begin", "void *pPlayerHandle") ++project.ExportFunction("player_stop", "void *pPlayerHandle") ++project.ExportFunction("player_pause", "void *pPlayerHandle") ++project.ExportFunction("player_seek", "void *pPlayerHandle", "int pos") ++project.ExportFunction("get_curr_playtime", "void *pPlayerHandle") ++project.ExportFunction("player_getvolume", "void *pPlayerHandle") ++project.ExportFunction("player_canseek", "void *pPlayerHandle") ++project.ExportFunction("player_setvolume", "void *pPlayerHandle", "unsigned short volumn") ++ ++ ++ ++DLLTarget('libhelix-player') ++ ++DependTarget() ++ +Index: helix-libs/clientapps/clutter/exabd.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exabd.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,245 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include ++ ++#include "hxtypes.h" ++ ++#include "hxcom.h" ++#include "hxcomm.h" ++#include "hxmon.h" ++#include "hxcore.h" ++#include "hxengin.h" ++#include "chxpckts.h" ++#include "hxclsnk.h" ++#include "hxstrutl.h" ++#include "exabd.h" ++ ++#include "print.h" ++ ++#include "globals.h" ++ ++struct _stGlobals*& GetGlobal(); //in main.cpp ++ ++ExampleABD::ExampleABD(IUnknown* pUnknown) ++ : m_lRefCount (0) ++ , m_pUnknown (NULL) ++ , m_ulABDStartTime(0) ++ , m_ulABDResult(0) ++ , m_bABDDone(FALSE) ++{ ++ if (pUnknown) ++ { ++ m_pUnknown = pUnknown; ++ m_pUnknown->AddRef(); ++ } ++} ++ ++ExampleABD::~ExampleABD(void) ++{ ++ HX_RELEASE(m_pUnknown); ++} ++ ++ ++// *** IUnknown methods *** ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::QueryInterface ++// Purpose: ++// Implement this to export the interfaces supported by your ++// object. ++// ++STDMETHODIMP ExampleABD::QueryInterface(REFIID riid, void** ppvObj) ++{ ++ if (IsEqualIID(riid, IID_IUnknown)) ++ { ++ AddRef(); ++ *ppvObj = (IUnknown*)(IHXAutoBWCalibrationAdviseSink*)this; ++ return HXR_OK; ++ } ++ else if (IsEqualIID(riid, IID_IHXAutoBWCalibrationAdviseSink)) ++ { ++ AddRef(); ++ *ppvObj = (IHXAutoBWCalibrationAdviseSink*)this; ++ return HXR_OK; ++ } ++ ++ *ppvObj = NULL; ++ return HXR_NOINTERFACE; ++} ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::AddRef ++// Purpose: ++// Everyone usually implements this the same... feel free to use ++// this implementation. ++// ++STDMETHODIMP_(ULONG32) ExampleABD::AddRef() ++{ ++ return InterlockedIncrement(&m_lRefCount); ++} ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::Release ++// Purpose: ++// Everyone usually implements this the same... feel free to use ++// this implementation. ++// ++STDMETHODIMP_(ULONG32) ExampleABD::Release() ++{ ++ if (InterlockedDecrement(&m_lRefCount) > 0) ++ { ++ return m_lRefCount; ++ } ++ ++ delete this; ++ return 0; ++} ++ ++/* ++ * IHXAutoBWCalibrationAdviseSink methods ++ */ ++STDMETHODIMP ++ExampleABD::AutoBWCalibrationStarted (const char* pszServer) ++{ ++ if (pszServer) ++ { ++ STDOUT("ABD: contacting %s\n", pszServer); ++ } ++ ++ return HXR_OK; ++} ++ ++STDMETHODIMP ++ExampleABD::AutoBWCalibrationDone(HX_RESULT status, ++ UINT32 ulBW) ++{ ++ m_bABDDone = TRUE; ++ ++ if (HXR_OK == status) ++ { ++ m_ulABDResult = ulBW; ++ STDOUT("ABD: %lu(Kbps) %lu(ms)\n", ulBW, GetTickCount() - m_ulABDStartTime); ++ } ++ else ++ { ++ STDOUT("ABD failed: %lu\n", status); ++ } ++ ++ return HXR_OK; ++} ++ ++HX_RESULT ++ExampleABD::DoABD(const char* pszServer, ++ UINT32 mode, ++ UINT32 packetSize, ++ UINT32 packetNum) ++{ ++ HX_RESULT rc = HXR_OK; ++ UINT32 length = 0; ++ IHXAutoBWCalibration* pABD = NULL; ++ IHXValues* pValues = NULL; ++ IHXBuffer* pBuffer = NULL; ++ ++ m_ulABDStartTime = GetTickCount(); ++ m_ulABDResult = 0; ++ m_bABDDone = FALSE; ++ ++ if (m_pUnknown && ++ HXR_OK == m_pUnknown->QueryInterface(IID_IHXAutoBWCalibration, (void**)&pABD)) ++ { ++ pValues = (IHXValues*) new CHXHeader(); ++ pValues->AddRef(); ++ ++ pBuffer = (IHXBuffer*) new CHXBuffer(); ++ pBuffer->AddRef(); ++ ++ pBuffer->Set((UCHAR*)pszServer, strlen(pszServer)+1); ++ pValues->SetPropertyCString("ABDServers", pBuffer); ++ ++ pValues->SetPropertyULONG32("AutoBWDetectionMode", mode); ++ pValues->SetPropertyULONG32("AutoBWDetectionPacketSize", packetSize); ++ pValues->SetPropertyULONG32("AutoBWDetectionPackets", packetNum); ++ ++ pABD->AddAutoBWCalibrationSink((IHXAutoBWCalibrationAdviseSink*)this); ++ pABD->InitAutoBWCalibration(pValues); ++ ++ pABD->StartAutoBWCalibration(); ++ ++ while (!m_bABDDone) ++ { ++ MSG msg; ++ DWORD starttime, endtime, i; ++ BOOL sleep = TRUE; ++ static const int checkinterval = 10; ++ ++ starttime = GetTickCount(); ++ endtime = starttime + (20); ++ i = 0; ++ while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) ++ { ++ DispatchMessage(&msg); ++ if ((i % checkinterval) == 0) ++ { ++ if (GetTickCount() > endtime) ++ break; ++ ++i; ++ } ++ sleep = FALSE; ++ } ++ ++ if (sleep) ++ Sleep(10); ++ } ++ } ++ ++cleanup: ++ ++ if (pABD) ++ { ++ pABD->RemoveAutoBWCalibrationSink((IHXAutoBWCalibrationAdviseSink*)this); ++ } ++ ++ HX_RELEASE(pBuffer); ++ HX_RELEASE(pValues); ++ HX_RELEASE(pABD); ++ ++ return rc; ++} ++ ++ +Index: helix-libs/clientapps/clutter/exabd.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exabd.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,85 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _EXAMPLEABD_ ++#define _EXAMPLEABD_ ++ ++struct IHXAutoBWCalibrationAdviseSink; ++struct IUnknown; ++ ++class ExampleABD : public IHXAutoBWCalibrationAdviseSink ++{ ++ private: ++ LONG32 m_lRefCount; ++ IUnknown* m_pUnknown; ++ UINT32 m_ulABDStartTime; ++ UINT32 m_ulABDResult; ++ BOOL m_bABDDone; ++ ++ ~ExampleABD(); ++ ++ public: ++ ++ ExampleABD(IUnknown* /*IN*/ pUnknown); ++ ++ /* ++ * IUnknown methods ++ */ ++ STDMETHOD(QueryInterface) (THIS_ ++ REFIID riid, ++ void** ppvObj); ++ ++ STDMETHOD_(ULONG32,AddRef) (THIS); ++ ++ STDMETHOD_(ULONG32,Release) (THIS); ++ ++ /* ++ * IHXAutoBWCalibrationAdviseSink methods ++ */ ++ STDMETHOD(AutoBWCalibrationStarted) (THIS_ ++ const char* pszServer); ++ STDMETHOD(AutoBWCalibrationDone) (THIS_ ++ HX_RESULT status, ++ UINT32 ulBW); ++ ++ HX_RESULT DoABD(const char* pszServer, ++ UINT32 mode, ++ UINT32 packetSize, ++ UINT32 packetNum); ++ ++ UINT32 GetABD(void) { return m_ulABDResult; }; ++}; ++ ++#endif /* _EXAMPLEABDSNK_ */ +Index: helix-libs/clientapps/clutter/exadvsnk.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exadvsnk.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,1116 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include ++ ++#include "hxtypes.h" ++ ++#include "hxcom.h" ++#include "hxcomm.h" ++#include "hxmon.h" ++#include "hxcore.h" ++#include "hxengin.h" ++#include "hxclsnk.h" ++#include "hxgroup.h" ++#include "hxstrutl.h" ++#include "exadvsnk.h" ++#include "hxstring.h" ++#include "hxprefs.h" ++#include "excontxt.h" ++ ++#include "print.h" ++ ++#include "globals.h" ++#include "player.h" ++ ++struct _stGlobals*& GetGlobal(); //in main.cpp ++ ++#ifdef __TCS__ ++extern unsigned long gStreamTime; ++ ++static int iOpened = 0; ++ ++ ++#if defined(__cplusplus) ++extern "C" { ++#endif /* defined(__cplusplus) */ ++ ++typedef enum hookBuffering { ++ eContacting = 0, ++ eConnecting = 1, ++ eBuffering = 2, ++ ePlaying = 3 ++}hookBuffering; ++ ++void hookRealAudio_Buffering(hookBuffering connectState, int pct); ++ ++void hookRealAudio_PlayPosition(unsigned long current,unsigned long duration); ++ ++typedef enum hookState { ++ ePlay = 0, ++ ePause = 1, ++ eStop = 2, ++ eResume = 3, ++ eComplete // Clip is done playing ++}hookState; ++void hookRealAudio_State(hookState newState); ++ ++ ++#if defined(__cplusplus) ++} ++#endif /* defined(__cplusplus) */ ++ ++#endif // __TCS__ ++ ++void PrintBuffer(const char* pszName,const unsigned char* pbBuf, unsigned int dwBytes); ++ ++ExampleClientAdviceSink::ExampleClientAdviceSink(IUnknown* pUnknown, LONG32 lClientIndex, on_buffering_cb_t on_buffering_cb, on_pos_length_cb_t on_pos_length_cb, void *context) ++ : m_lRefCount (0) ++ , m_lClientIndex (lClientIndex) ++ , m_pUnknown (NULL) ++ , m_pRegistry (NULL) ++ , m_pScheduler (NULL) ++ , m_lCurrentBandwidth(0) ++ , m_lAverageBandwidth(0) ++ , m_bOnStop(0) ++ , m_pPlayer(0) ++ , m_bWaitForTrackStart(0) ++ , m_on_buffering_cb(on_buffering_cb) ++ , m_on_pos_length_cb(on_pos_length_cb) ++ , m_context(context) ++{ ++ if (pUnknown) ++ { ++ m_pUnknown = pUnknown; ++ m_pUnknown->AddRef(); ++ ++ if (HXR_OK != m_pUnknown->QueryInterface(IID_IHXRegistry, (void**)&m_pRegistry)) ++ { ++ m_pRegistry = NULL; ++ } ++ ++ if (HXR_OK != m_pUnknown->QueryInterface(IID_IHXScheduler, (void**)&m_pScheduler)) ++ { ++ m_pScheduler = NULL; ++ } ++ ++ IHXPlayer* pPlayer; ++ if(HXR_OK == m_pUnknown->QueryInterface(IID_IHXPlayer, ++ (void**)&pPlayer)) ++ { ++ m_pPlayer = pPlayer; ++ ++ IHXGroupManager* pGroupMgr = NULL; ++ if(HXR_OK == m_pPlayer->QueryInterface(IID_IHXGroupManager, ++ (void**)&pGroupMgr)) ++ { ++ pGroupMgr->AddSink((IHXGroupSink*)this); ++ pGroupMgr->Release(); ++ } ++ ++ pPlayer->AddAdviseSink(this); ++ ++ } ++ } ++ ++#ifdef __TCS__ ++ bEnableAdviceSink = TRUE; ++ iOpened = 0; ++#endif ++} ++ ++ExampleClientAdviceSink::~ExampleClientAdviceSink(void) ++{ ++ if (m_pScheduler) ++ { ++ m_pScheduler->Release(); ++ m_pScheduler = NULL; ++ } ++ ++ if (m_pRegistry) ++ { ++ m_pRegistry->Release(); ++ m_pRegistry = NULL; ++ } ++ ++ if (m_pPlayer) ++ { ++ m_pPlayer->Release(); ++ m_pPlayer = NULL; ++ } ++ if (m_pUnknown) ++ { ++ m_pUnknown->Release(); ++ m_pUnknown = NULL; ++ } ++} ++ ++ ++// *** IUnknown methods *** ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::QueryInterface ++// Purpose: ++// Implement this to export the interfaces supported by your ++// object. ++// ++STDMETHODIMP ExampleClientAdviceSink::QueryInterface(REFIID riid, void** ppvObj) ++{ ++ if (IsEqualIID(riid, IID_IUnknown)) ++ { ++ AddRef(); ++ *ppvObj = (IUnknown*)(IHXClientAdviseSink*)this; ++ return HXR_OK; ++ } ++ else if (IsEqualIID(riid, IID_IHXClientAdviseSink)) ++ { ++ AddRef(); ++ *ppvObj = (IHXClientAdviseSink*)this; ++ return HXR_OK; ++ } ++ else if (IsEqualIID(riid, IID_IHXGroupSink)) ++ { ++ AddRef(); ++ *ppvObj = (IHXGroupSink*)this; ++ return HXR_OK; ++ } ++ ++ *ppvObj = NULL; ++ return HXR_NOINTERFACE; ++} ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::AddRef ++// Purpose: ++// Everyone usually implements this the same... feel free to use ++// this implementation. ++// ++STDMETHODIMP_(ULONG32) ExampleClientAdviceSink::AddRef() ++{ ++ return InterlockedIncrement(&m_lRefCount); ++} ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::Release ++// Purpose: ++// Everyone usually implements this the same... feel free to use ++// this implementation. ++// ++STDMETHODIMP_(ULONG32) ExampleClientAdviceSink::Release() ++{ ++ if (InterlockedDecrement(&m_lRefCount) > 0) ++ { ++ return m_lRefCount; ++ } ++ ++ delete this; ++ return 0; ++} ++ ++/* ++ * IHXClientAdviseSink methods ++ */ ++ ++/************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPosLength ++ * Purpose: ++ * Called to advise the client that the position or length of the ++ * current playback context has changed. ++ */ ++ ++#ifdef __TCS__ ++static long lastPosition = -1; ++#endif ++ ++STDMETHODIMP ++ExampleClientAdviceSink::OnPosLength(UINT32 ulPosition, ++ UINT32 ulLength) ++{ ++ // Are we doing a multi-seek? ++ if (GetGlobal()->g_bMultiSeek) ++ { ++ // Have we run out of seek times? ++ if (GetGlobal()->g_ulMultiSeekIndex < GetGlobal()->g_ulNumMultiSeeks) ++ { ++ STDOUT("Multi-seeking the first player to %lu\n", ++ GetGlobal()->g_ulMultiSeekTime[GetGlobal()->g_ulMultiSeekIndex]); ++ GetGlobal()->g_Players[0]->Seek(GetGlobal()->g_ulMultiSeekTime[GetGlobal()->g_ulMultiSeekIndex++]); ++ } ++ else ++ { ++ // We've run out - stop the multi-seek ++ GetGlobal()->g_bMultiSeek = FALSE; ++ GetGlobal()->g_ulNumMultiSeeks = 0; ++ GetGlobal()->g_ulMultiSeekIndex = 0; ++ } ++ } ++ ++ if (m_on_pos_length_cb) ++ m_on_pos_length_cb(ulPosition, ulLength, m_context); ++ ++ return HXR_OK; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPresentationOpened ++ * Purpose: ++ * Called to advise the client a presentation has been opened. ++ */ ++STDMETHODIMP ExampleClientAdviceSink::OnPresentationOpened() ++{ ++#ifdef __TCS__ ++ iOpened = 1; ++ lastPosition = -1; ++#else ++ if (GetGlobal()->bEnableAdviceSink) ++ { ++ STDOUT("OnPresentationOpened()\n"); ++ } ++#if defined(HELIX_FEATURE_PLAYBACK_VELOCITY) ++ // Try to get the IHXPlaybackVelocity interface ++ // from the first player ++ if (GetGlobal()->g_nPlayers > 0 && GetGlobal()->g_Players[0]) ++ { ++ IHXPlaybackVelocity* pVel = NULL; ++ HX_RESULT rv = GetGlobal()->g_Players[0]->QueryInterface(IID_IHXPlaybackVelocity, (void**) &pVel); ++ if (SUCCEEDED(rv)) ++ { ++ // Get the capabilities object from the player ++ rv = pVel->QueryVelocityCaps(GetGlobal()->g_pVelocityCaps); ++ if (SUCCEEDED(rv) && GetGlobal()->bEnableAdviceSink) ++ { ++ STDOUT("Available Velocity Ranges:"); ++ UINT32 ulNumRanges = GetGlobal()->g_pVelocityCaps->GetNumRanges(); ++ for (UINT32 i = 0; i < ulNumRanges && SUCCEEDED(rv); i++) ++ { ++ INT32 lMin = 0; ++ INT32 lMax = 0; ++ rv = GetGlobal()->g_pVelocityCaps->GetRange(i, lMin, lMax); ++ if (SUCCEEDED(rv)) ++ { ++ STDOUT(" [%ld,%ld]", lMin, lMax); ++ } ++ } ++ STDOUT("\n"); ++ } ++ } ++ HX_RELEASE(pVel); ++ } ++#endif /* #if defined(HELIX_FEATURE_PLAYBACK_VELOCITY) */ ++#endif ++ ++ UINT32 sourceCount = m_pPlayer->GetSourceCount(); ++ for (UINT32 sourceID = 0; sourceID < sourceCount; sourceID ++) ++ { ++ // get HXSource ++ IUnknown* pUnkSource = NULL; ++ IHXStreamSource* pStreamSrc = NULL; ++ ++ if (HXR_OK != m_pPlayer->GetSource (sourceID, pUnkSource)) ++ { ++ continue; ++ } ++ ++ pUnkSource->QueryInterface(IID_IHXStreamSource, (void **)&pStreamSrc); ++ ++ HX_RELEASE(pUnkSource); ++ ++ if (!pStreamSrc) ++ { ++ continue; ++ } ++ ++ UINT32 num_streams = pStreamSrc->GetStreamCount(); ++ ++ // get information from Streams ++ for (UINT32 streamID = 0; streamID < num_streams ; streamID++) ++ { ++ IUnknown* pUnkStream = NULL; ++ ++ if (HXR_OK == pStreamSrc->GetStream(streamID, pUnkStream)) ++ { ++ IHXStream* pStream = NULL; ++ ++ if (HXR_OK == pUnkStream->QueryInterface(IID_IHXStream, ++ (void**)&pStream)) ++ { ++ const char* pMimeType = pStream->GetStreamType(); ++ if( 0 == strcmp(pMimeType, "application/ram")) ++ { ++ m_bWaitForTrackStart = TRUE; ++ } ++ else ++ { ++ m_bWaitForTrackStart = FALSE; ++ } ++ } ++ HX_RELEASE(pStream); ++ } ++ HX_RELEASE(pUnkStream); ++ if (!m_bWaitForTrackStart) ++ { ++ break; ++ } ++ } ++ ++ if (!m_bWaitForTrackStart) ++ { ++ break; ++ } ++ HX_RELEASE(pStreamSrc); ++ } ++ ++ if (!m_bWaitForTrackStart) ++ { ++ STDOUT("----------------clip info--------------------\n"); ++ if(m_pScheduler) { ++ m_hCallback = m_pScheduler->RelativeEnter(this,50); ++ } ++ } ++ return HXR_OK; ++} ++ ++ ++/************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPresentationClosed ++ * Purpose: ++ * Called to advise the client a presentation has been closed. ++ */ ++STDMETHODIMP ExampleClientAdviceSink::OnPresentationClosed() ++{ ++#ifdef __TCS__ ++ iOpened = 0; ++ lastPosition = -1; ++#else ++ if (GetGlobal()->bEnableAdviceSink) ++ { ++ STDOUT("OnPresentationClosed()\n"); ++ } ++#endif ++ ++ return HXR_OK; ++} ++ ++void ExampleClientAdviceSink::GetStatistics (char* pszRegistryKey) ++{ ++ char szRegistryValue[MAX_DISPLAY_NAME] = {0}; /* Flawfinder: ignore */ ++ INT32 lValue = 0; ++ INT32 i = 0; ++ INT32 lStatistics = 8; ++ UINT32 *plValue; ++ ++#ifdef __TCS__ ++ return; // DISABLED FOR NOW ++#endif ++ ++ // collect statistic ++ for (i = 0; i < lStatistics; i++) ++ { ++ plValue = NULL; ++ switch (i) ++ { ++ case 0: ++ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.Normal", pszRegistryKey); ++ break; ++ case 1: ++ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.Recovered", pszRegistryKey); ++ break; ++ case 2: ++ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.Received", pszRegistryKey); ++ break; ++ case 3: ++ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.Lost", pszRegistryKey); ++ break; ++ case 4: ++ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.Late", pszRegistryKey); ++ break; ++ case 5: ++ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.ClipBandwidth", pszRegistryKey); ++ break; ++ case 6: ++ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.AverageBandwidth", pszRegistryKey); ++ plValue = &m_lAverageBandwidth; ++ break; ++ case 7: ++ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.CurrentBandwidth", pszRegistryKey); ++ plValue = &m_lCurrentBandwidth; ++ break; ++ default: ++ break; ++ } ++ ++ m_pRegistry->GetIntByName(szRegistryValue, lValue); ++ if (plValue) ++ { ++ if (m_bOnStop || lValue == 0) ++ { ++ lValue = *plValue; ++ } ++ else ++ { ++ *plValue = lValue; ++ } ++ } ++ if (GetGlobal()->bEnableAdviceSink || (GetGlobal()->bEnableVerboseMode && m_bOnStop)) ++ { ++ STDOUT("%s = %ld\n", szRegistryValue, lValue); ++ } ++ } ++} ++ ++void ExampleClientAdviceSink::GetAllStatistics(void) ++{ ++ UINT32 unPlayerIndex = 0; ++ UINT32 unSourceIndex = 0; ++ UINT32 unStreamIndex = 0; ++ ++ char* pszRegistryPrefix = "Statistics"; ++ char szRegistryName[MAX_DISPLAY_NAME] = {0}; /* Flawfinder: ignore */ ++ ++#ifdef __TCS__ ++ return; // DISABLED FOR NOW ++#endif ++ ++ // display the content of whole statistic registry ++ if (m_pRegistry) ++ { ++ // ok, let's start from the top (player) ++ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Player%ld", pszRegistryPrefix, m_lClientIndex); ++ if (PT_COMPOSITE == m_pRegistry->GetTypeByName(szRegistryName)) ++ { ++ // display player statistic ++ GetStatistics(szRegistryName); ++ ++ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Source%ld", szRegistryName, unSourceIndex); ++ while (PT_COMPOSITE == m_pRegistry->GetTypeByName(szRegistryName)) ++ { ++ // display source statistic ++ GetStatistics(szRegistryName); ++ ++ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Stream%ld", szRegistryName, unStreamIndex); ++ while (PT_COMPOSITE == m_pRegistry->GetTypeByName(szRegistryName)) ++ { ++ // display stream statistic ++ GetStatistics(szRegistryName); ++ ++ unStreamIndex++; ++ ++ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Player%ld.Source%ld.Stream%ld", ++ pszRegistryPrefix, unPlayerIndex, unSourceIndex, unStreamIndex); ++ } ++ ++ unSourceIndex++; ++ ++ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Player%ld.Source%ld", ++ pszRegistryPrefix, unPlayerIndex, unSourceIndex); ++ } ++ ++ unPlayerIndex++; ++ ++ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Player%ld", pszRegistryPrefix, unPlayerIndex); ++ } ++ } ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnStatisticsChanged ++ * Purpose: ++ * Called to advise the client that the presentation statistics ++ * have changed. ++ */ ++STDMETHODIMP ExampleClientAdviceSink::OnStatisticsChanged(void) ++{ ++ char szBuff[1024]; /* Flawfinder: ignore */ ++ HX_RESULT res = HXR_OK; ++ UINT16 uPlayer = 0; ++ ++#ifdef __TCS__ ++ return HXR_OK; // DISABLED FOR NOW ++#endif ++ ++ if(GetGlobal()->bEnableAdviceSink) ++ { ++ STDOUT("OnStatisticsChanged():\n"); ++ ++ SafeSprintf(szBuff, 1024, "Statistics"); ++ res = DumpRegTree( szBuff ); ++ } ++ ++ return HXR_OK; ++} ++ ++HX_RESULT ExampleClientAdviceSink::DumpRegTree(const char* pszTreeName ) ++{ ++ const char* pszName = NULL; ++ ULONG32 ulRegID = 0; ++ HX_RESULT res = HXR_OK; ++ INT32 nVal = 0; ++ IHXBuffer* pBuff = NULL; ++ IHXValues* pValues = NULL; ++ ++ //See if the name exists in the reg tree. ++ res = m_pRegistry->GetPropListByName( pszTreeName, pValues); ++ if( HXR_OK!=res || !pValues ) ++ return HXR_FAIL; ++ ++ //make sure this is a PT_COMPOSITE type reg entry. ++ if( PT_COMPOSITE != m_pRegistry->GetTypeByName(pszTreeName)) ++ return HXR_FAIL; ++ ++ //Print out the value of each member of this tree. ++ res = pValues->GetFirstPropertyULONG32( pszName, ulRegID ); ++ while( HXR_OK == res ) ++ { ++ //We have at least one entry. See what type it is. ++ HXPropType pt = m_pRegistry->GetTypeById(ulRegID); ++ switch(pt) ++ { ++ case PT_COMPOSITE: ++ DumpRegTree(pszName); ++ break; ++ case PT_INTEGER : ++ nVal = 0; ++ m_pRegistry->GetIntById( ulRegID, nVal ); ++ STDOUT("%s : %d\n", pszName, nVal ); ++ break; ++ case PT_INTREF : ++ nVal = 0; ++ m_pRegistry->GetIntById( ulRegID, nVal ); ++ STDOUT("%s : %d\n", pszName, nVal ); ++ break; ++ case PT_STRING : ++ pBuff = NULL; ++ m_pRegistry->GetStrById( ulRegID, pBuff ); ++ STDOUT("%s : \"", pszName ); ++ if( pBuff ) ++ STDOUT("%s", (const char *)(pBuff->GetBuffer()) ); ++ STDOUT("\"\n" ); ++ HX_RELEASE(pBuff); ++ break; ++ case PT_BUFFER : ++ STDOUT("%s : BUFFER TYPE NOT SHOWN\n", ++ pszName, nVal ); ++ break; ++ case PT_UNKNOWN: ++ STDOUT("%s Unkown registry type entry\n", pszName ); ++ break; ++ default: ++ STDOUT("%s Unkown registry type entry\n", pszName ); ++ break; ++ } ++ res = pValues->GetNextPropertyULONG32( pszName, ulRegID); ++ } ++ ++ HX_RELEASE( pValues ); ++ ++ return HXR_OK; ++} ++ ++ ++/************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPreSeek ++ * Purpose: ++ * Called by client engine to inform the client that a seek is ++ * about to occur. The render is informed the last time for the ++ * stream's time line before the seek, as well as the first new ++ * time for the stream's time line after the seek will be completed. ++ * ++ */ ++STDMETHODIMP ExampleClientAdviceSink::OnPreSeek( ULONG32 ulOldTime, ++ ULONG32 ulNewTime) ++{ ++#if !defined(__TCS__) ++ if (GetGlobal()->bEnableAdviceSink) ++ { ++ STDOUT("OnPreSeek(%ld, %ld)\n", ulOldTime, ulNewTime); ++ } ++#endif ++ ++ return HXR_OK; ++} ++ ++ ++/************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPostSeek ++ * Purpose: ++ * Called by client engine to inform the client that a seek has ++ * just occured. The render is informed the last time for the ++ * stream's time line before the seek, as well as the first new ++ * time for the stream's time line after the seek. ++ * ++ */ ++STDMETHODIMP ExampleClientAdviceSink::OnPostSeek( ULONG32 ulOldTime, ++ ULONG32 ulNewTime) ++{ ++#ifdef __TCS__ ++ lastPosition = -1; ++#else ++ if (GetGlobal()->bEnableAdviceSink) ++ { ++ STDOUT("OnPostSeek(%ld, %ld)\n", ulOldTime, ulNewTime); ++ } ++#endif ++ ++ return HXR_OK; ++} ++ ++ ++/************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnStop ++ * Purpose: ++ * Called by client engine to inform the client that a stop has ++ * just occured. ++ * ++ */ ++STDMETHODIMP ExampleClientAdviceSink::OnStop(void) ++{ ++ HXTimeval now; ++ ++#ifdef __TCS__ ++ hookRealAudio_State(eStop); ++#else ++ if (GetGlobal()->bEnableAdviceSink) ++ { ++ STDOUT("OnStop()\n"); ++ } ++ ++ if (GetGlobal()->bEnableVerboseMode) ++ { ++ STDOUT("Player %ld stopped.\n", m_lClientIndex); ++ m_bOnStop = TRUE; ++ GetAllStatistics(); ++ } ++#endif ++ ++ // Find out the current time and subtract the beginning time to ++ // figure out how many seconds we played ++ now = m_pScheduler->GetCurrentSchedulerTime(); ++ m_ulStopTime = now.tv_sec; ++ ++ GetGlobal()->g_ulNumSecondsPlayed = m_ulStopTime - m_ulStartTime; ++ ++ return HXR_OK; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPause ++ * Purpose: ++ * Called by client engine to inform the client that a pause has ++ * just occured. The render is informed the last time for the ++ * stream's time line before the pause. ++ * ++ */ ++STDMETHODIMP ExampleClientAdviceSink::OnPause(ULONG32 ulTime) ++{ ++#ifdef __TCS__ ++ hookRealAudio_State(ePause); ++#else ++ if (GetGlobal()->bEnableAdviceSink) ++ { ++ STDOUT("OnPause(%ld)\n", ulTime); ++ } ++#endif ++ ++ return HXR_OK; ++} ++ ++ ++/************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnBegin ++ * Purpose: ++ * Called by client engine to inform the client that a begin or ++ * resume has just occured. The render is informed the first time ++ * for the stream's time line after the resume. ++ * ++ */ ++STDMETHODIMP ExampleClientAdviceSink::OnBegin(ULONG32 ulTime) ++{ ++ HXTimeval now; ++ ++#if !defined(__TCS__) ++ if (GetGlobal()->bEnableAdviceSink) ++ { ++ STDOUT("OnBegin(%ld)\n", ulTime); ++ } ++ ++ if (GetGlobal()->bEnableVerboseMode) ++ { ++ STDOUT("Player %ld beginning playback...\n", m_lClientIndex); ++ } ++#endif ++ ++ GetGlobal()->g_bOnBeginOccurred = TRUE; ++ ++ // Record the current time, so we can figure out many seconds we played ++ now = m_pScheduler->GetCurrentSchedulerTime(); ++ m_ulStartTime = now.tv_sec; ++ ++ return HXR_OK; ++} ++ ++ ++/************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnBuffering ++ * Purpose: ++ * Called by client engine to inform the client that buffering ++ * of data is occuring. The render is informed of the reason for ++ * the buffering (start-up of stream, seek has occured, network ++ * congestion, etc.), as well as percentage complete of the ++ * buffering process. ++ * ++ */ ++STDMETHODIMP ExampleClientAdviceSink::OnBuffering(ULONG32 ulFlags, ++ UINT16 unPercentComplete) ++{ ++#ifdef __TCS__ ++static UINT16 lastPct = 0; ++ if (unPercentComplete > 0) ++ { ++ UINT16 nextPct = lastPct + 10; ++ if (unPercentComplete < lastPct) ++ { ++ lastPct = 0; ++ nextPct = lastPct + 10; ++ } ++ if (unPercentComplete >= nextPct) ++ { ++ lastPct = (unPercentComplete / 10) * 10; ++ nextPct = lastPct + 10; ++ hookRealAudio_Buffering(eBuffering,lastPct); ++ } ++ } ++#else ++ if (GetGlobal()->bEnableAdviceSink) ++ { ++ STDOUT("OnBuffering(%ld, %d)\n", ulFlags, unPercentComplete); ++ } ++#endif ++ if (m_on_buffering_cb) ++ m_on_buffering_cb(ulFlags, unPercentComplete, m_context); ++ ++ return HXR_OK; ++} ++ ++ ++/************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnContacting ++ * Purpose: ++ * Called by client engine to inform the client is contacting ++ * hosts(s). ++ * ++ */ ++STDMETHODIMP ExampleClientAdviceSink::OnContacting(const char* pHostName) ++{ ++#ifdef __TCS__ ++ printf("Contacting\n"); ++ hookRealAudio_Buffering(eContacting,0); ++#else ++ if (GetGlobal()->bEnableAdviceSink) ++ { ++ STDOUT("OnContacting(\"%s\")\n", pHostName); ++ } ++#endif ++ ++ return HXR_OK; ++} ++ ++void ExampleClientAdviceSink::PrintPropName( IHXValues* pHeader ) ++{ ++ if ( pHeader == NULL ) ++ { ++ return ; ++ } ++ ++ const char *pChar; ++ ULONG32 pValue; ++ if(HXR_OK == pHeader->GetFirstPropertyULONG32(pChar, pValue)) ++ { ++ do ++ { ++ STDOUT("%s %d\n", pChar, pValue); ++ } ++ while(HXR_OK == pHeader->GetNextPropertyULONG32(pChar, pValue)); ++ } ++ ++ IHXBuffer *pBuffer; ++ ++ if(HXR_OK == pHeader->GetFirstPropertyBuffer(pChar, pBuffer)) ++ { ++ do ++ { ++ STDOUT("%s %s\n", pChar, (const char *) ( pBuffer->GetBuffer() )); ++ PrintBuffer(pChar, pBuffer->GetBuffer() ,pBuffer->GetSize()); ++ HX_RELEASE(pBuffer); ++ } while(HXR_OK == pHeader->GetNextPropertyBuffer(pChar, pBuffer )); ++ } ++ ++ if(HXR_OK == pHeader->GetFirstPropertyCString(pChar, pBuffer)) ++ { ++ do ++ { ++ STDERR("%s %s\n", pChar, (const char *) ( pBuffer->GetBuffer() )); ++ HX_RELEASE(pBuffer); ++ } while(HXR_OK == pHeader->GetNextPropertyCString(pChar, pBuffer )); ++ } ++ ++ fflush(stdout); ++} ++ ++ ++void ExampleClientAdviceSink::SetClipInfo( IHXPlayer* m_pRMAPlayer) ++{ ++ bool bSendOnClipInfo = false; ++ ++ // Get HXSource and try to get clip infor. ++ UINT32 sourceCount = m_pRMAPlayer->GetSourceCount(); ++ for (UINT32 sourceID = 0; sourceID < sourceCount; sourceID ++) ++ { ++ // get HXSource ++ STDOUT("========Source %d========\n",sourceID); ++ IUnknown* pUnkSource = NULL; ++ IHXStreamSource* pStreamSrc = NULL; ++ ++ if (HXR_OK != m_pRMAPlayer->GetSource (sourceID, pUnkSource)) ++ { ++ continue; ++ } ++ ++ pUnkSource->QueryInterface(IID_IHXStreamSource, (void **)&pStreamSrc); ++ ++ HX_RELEASE(pUnkSource); ++ ++ if (!pStreamSrc) ++ { ++ continue; ++ } ++ ++ UINT32 num_streams = pStreamSrc->GetStreamCount(); ++ ++ STDOUT("====File Header====\n"); ++ ++ IHXValues* pFileHdr = NULL; ++ pStreamSrc->QueryInterface(IID_IHXValues, (void**)&pFileHdr); ++ ++ if ( pFileHdr) ++ { ++ PrintPropName(pFileHdr); ++ } ++ HX_RELEASE(pFileHdr); ++ ++ // get information from Streams ++ for (UINT32 streamID = 0; streamID < num_streams ; streamID++) ++ { ++ STDOUT("====Stream %d====\n",streamID); ++ IUnknown* pUnkStream = NULL; ++ ++ if (HXR_OK == pStreamSrc->GetStream(streamID, pUnkStream)) ++ { ++ IHXStream* pStream = NULL; ++ ++ if (HXR_OK == pUnkStream->QueryInterface(IID_IHXStream, ++ (void**)&pStream)) ++ { ++ IHXValues* pStreamHdr = pStream->GetHeader(); ++ if (pStreamHdr) ++ { ++ PrintPropName(pStreamHdr); ++ } ++ HX_RELEASE(pStreamHdr); ++ } ++ HX_RELEASE(pStream); ++ } ++ HX_RELEASE(pUnkStream); ++ } ++ STDOUT("---------------------------------------------\n"); ++ ++ HX_RELEASE(pStreamSrc); ++ } ++} ++ ++ ++STDMETHODIMP ExampleClientAdviceSink::Func() ++{ ++ m_hCallback = 0; ++ ++ // set clip info ++ if(m_pPlayer) ++ SetClipInfo(m_pPlayer); ++ ++ return HXR_OK; ++} ++ ++void PrintBuffer(const char* pszName,const unsigned char* pbBuf, unsigned int dwBytes) ++{ ++ if(pszName == NULL || pbBuf == NULL) ++ return; ++ ++ STDOUT(" "); ++ for(unsigned int i= 0; iRelativeEnter(this,50); ++ } ++ m_bWaitForTrackStart = FALSE; ++ } ++ return HXR_OK; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXGroupSink::TrackStopped ++ * Purpose: ++ * Notification of a track being stopped ++ * ++ */ ++STDMETHODIMP ExampleClientAdviceSink::TrackStopped( UINT16 /*IN*/ uGroupIndex, ++ UINT16 /*IN*/ uTrackIndex, ++ IHXValues* /*IN*/ pTrack) ++{ ++ return HXR_OK; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXGroupSink::CurrentGroupSet ++ * Purpose: ++ * This group is being currently played in the presentation. ++ */ ++STDMETHODIMP ExampleClientAdviceSink::CurrentGroupSet( UINT16 /*IN*/ uGroupIndex, ++ IHXGroup* /*IN*/ pGroup) ++{ ++ return HXR_OK; ++} ++ +Index: helix-libs/clientapps/clutter/exadvsnk.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exadvsnk.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,324 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _EXAMPLECLSNK_ ++#define _EXAMPLECLSNK_ ++ ++#include "player.h" ++ ++struct IHXClientAdviseSink; ++struct IHXGroupSink; ++struct IUnknown; ++struct IHXRegistry; ++struct IHXScheduler; ++struct IHXCallback; ++struct IHXPlayer; ++struct IHXGroup; ++ ++class ExampleClientAdviceSink : public IHXClientAdviseSink, ++ public IHXGroupSink, ++ public IHXCallback ++{ ++ private: ++ LONG32 m_lRefCount; ++ LONG32 m_lClientIndex; ++ ++ IUnknown* m_pUnknown; ++ IHXRegistry* m_pRegistry; ++ IHXScheduler* m_pScheduler; ++ ++ UINT32 m_ulStartTime; ++ UINT32 m_ulStopTime; ++ ++ UINT32 m_lCurrentBandwidth; ++ UINT32 m_lAverageBandwidth; ++ HXBOOL m_bOnStop; ++ ++ HXBOOL m_bWaitForTrackStart; ++ ++ on_buffering_cb_t m_on_buffering_cb; ++ on_pos_length_cb_t m_on_pos_length_cb; ++ void *m_context; /* a argument passed by texture-helix lib */ ++ ++ // IHXCallback ++ IHXPlayer* m_pPlayer; ++ ULONG32 m_hCallback; ++ ~ExampleClientAdviceSink(); ++ HX_RESULT DumpRegTree(const char* pszTreeName ); ++ ++ ++ void GetStatistics (char* /*IN*/ pszRegistryKey); ++ void GetAllStatistics (void); ++ void SetClipInfo( IHXPlayer* m_pRMAPlayer); ++ void PrintPropName( IHXValues* pHeader ); ++ ++ public: ++ ++ ExampleClientAdviceSink(IUnknown* /*IN*/ pUnknown, LONG32 /*IN*/ lClientIndex, on_buffering_cb_t on_buffer_cb, on_pos_length_cb_t on_pos_length_cb, void *context); ++ ++ /* ++ * IUnknown methods ++ */ ++ STDMETHOD(QueryInterface) (THIS_ ++ REFIID riid, ++ void** ppvObj); ++ ++ STDMETHOD_(ULONG32,AddRef) (THIS); ++ ++ STDMETHOD_(ULONG32,Release) (THIS); ++ ++ /* ++ * IHXClientAdviseSink methods ++ */ ++ ++ /************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPosLength ++ * Purpose: ++ * Called to advise the client that the position or length of the ++ * current playback context has changed. ++ */ ++ STDMETHOD(OnPosLength) (THIS_ ++ UINT32 ulPosition, ++ UINT32 ulLength); ++ ++ /************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPresentationOpened ++ * Purpose: ++ * Called to advise the client a presentation has been opened. ++ */ ++ STDMETHOD(OnPresentationOpened) (THIS); ++ ++ /************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPresentationClosed ++ * Purpose: ++ * Called to advise the client a presentation has been closed. ++ */ ++ STDMETHOD(OnPresentationClosed) (THIS); ++ ++ /************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnStatisticsChanged ++ * Purpose: ++ * Called to advise the client that the presentation statistics ++ * have changed. ++ */ ++ STDMETHOD(OnStatisticsChanged) (THIS); ++ ++ /************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPreSeek ++ * Purpose: ++ * Called by client engine to inform the client that a seek is ++ * about to occur. The render is informed the last time for the ++ * stream's time line before the seek, as well as the first new ++ * time for the stream's time line after the seek will be completed. ++ * ++ */ ++ STDMETHOD (OnPreSeek) (THIS_ ++ ULONG32 ulOldTime, ++ ULONG32 ulNewTime); ++ ++ /************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPostSeek ++ * Purpose: ++ * Called by client engine to inform the client that a seek has ++ * just occured. The render is informed the last time for the ++ * stream's time line before the seek, as well as the first new ++ * time for the stream's time line after the seek. ++ * ++ */ ++ STDMETHOD (OnPostSeek) (THIS_ ++ ULONG32 ulOldTime, ++ ULONG32 ulNewTime); ++ ++ /************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnStop ++ * Purpose: ++ * Called by client engine to inform the client that a stop has ++ * just occured. ++ * ++ */ ++ STDMETHOD (OnStop) (THIS); ++ ++ /************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnPause ++ * Purpose: ++ * Called by client engine to inform the client that a pause has ++ * just occured. The render is informed the last time for the ++ * stream's time line before the pause. ++ * ++ */ ++ STDMETHOD (OnPause) (THIS_ ++ ULONG32 ulTime); ++ ++ /************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnBegin ++ * Purpose: ++ * Called by client engine to inform the client that a begin or ++ * resume has just occured. The render is informed the first time ++ * for the stream's time line after the resume. ++ * ++ */ ++ STDMETHOD (OnBegin) (THIS_ ++ ULONG32 ulTime); ++ ++ /************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnBuffering ++ * Purpose: ++ * Called by client engine to inform the client that buffering ++ * of data is occuring. The render is informed of the reason for ++ * the buffering (start-up of stream, seek has occured, network ++ * congestion, etc.), as well as percentage complete of the ++ * buffering process. ++ * ++ */ ++ STDMETHOD (OnBuffering) (THIS_ ++ ULONG32 ulFlags, ++ UINT16 unPercentComplete); ++ ++ ++ /************************************************************************ ++ * Method: ++ * IHXClientAdviseSink::OnContacting ++ * Purpose: ++ * Called by client engine to inform the client is contacting ++ * hosts(s). ++ * ++ */ ++ STDMETHOD (OnContacting) (THIS_ ++ const char* pHostName); ++ ++ // IHXCallback ++ STDMETHOD(Func) (THIS); ++ ++ /* ++ * IHXGroupSink methods ++ */ ++ /************************************************************************ ++ * Method: ++ * IHXGroupSink::GroupAdded ++ * Purpose: ++ * Notification of a new group being added to the presentation. ++ */ ++ STDMETHOD(GroupAdded) (THIS_ ++ UINT16 /*IN*/ uGroupIndex, ++ IHXGroup* /*IN*/ pGroup); ++ ++ /************************************************************************ ++ * Method: ++ * IHXGroupSink::GroupRemoved ++ * Purpose: ++ * Notification of a group being removed from the presentation. ++ */ ++ STDMETHOD(GroupRemoved) (THIS_ ++ UINT16 /*IN*/ uGroupIndex, ++ IHXGroup* /*IN*/ pGroup); ++ ++ /************************************************************************ ++ * Method: ++ * IHXGroupSink::AllGroupsRemoved ++ * Purpose: ++ * Notification that all groups have been removed from the ++ * current presentation. ++ */ ++ STDMETHOD(AllGroupsRemoved) (THIS); ++ ++ /************************************************************************ ++ * Method: ++ * IHXGroupSink::TrackAdded ++ * Purpose: ++ * Notification of a new track being added to a group. ++ */ ++ STDMETHOD(TrackAdded) (THIS_ ++ UINT16 /*IN*/ uGroupIndex, ++ UINT16 /*IN*/ uTrackIndex, ++ IHXValues* /*IN*/ pTrack); ++ ++ /************************************************************************ ++ * Method: ++ * IHXGroupSink::TrackRemoved ++ * Purpose: ++ * Notification of a track being removed from a group. ++ */ ++ STDMETHOD(TrackRemoved) (THIS_ ++ UINT16 /*IN*/ uGroupIndex, ++ UINT16 /*IN*/ uTrackIndex, ++ IHXValues* /*IN*/ pTrack); ++ ++ /************************************************************************ ++ * Method: ++ * IHXGroupSink::TrackStarted ++ * Purpose: ++ * Notification of a track being started (to get duration, for ++ * instance...) ++ */ ++ STDMETHOD (TrackStarted) (THIS_ ++ UINT16 /*IN*/ uGroupIndex, ++ UINT16 /*IN*/ uTrackIndex, ++ IHXValues* /*IN*/ pTrack) ; ++ ++ /************************************************************************ ++ * Method: ++ * IHXGroupSink::TrackStopped ++ * Purpose: ++ * Notification of a track being stopped ++ * ++ */ ++ STDMETHOD(TrackStopped) (THIS_ ++ UINT16 /*IN*/ uGroupIndex, ++ UINT16 /*IN*/ uTrackIndex, ++ IHXValues* /*IN*/ pTrack); ++ ++ /************************************************************************ ++ * Method: ++ * IHXGroupSink::CurrentGroupSet ++ * Purpose: ++ * This group is being currently played in the presentation. ++ */ ++ STDMETHOD(CurrentGroupSet) (THIS_ ++ UINT16 /*IN*/ uGroupIndex, ++ IHXGroup* /*IN*/ pGroup); ++ ++}; ++ ++#endif /* _EXAMPLECLSNK_ */ +Index: helix-libs/clientapps/clutter/exaumgr.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exaumgr.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,137 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include ++#include "hxtypes.h" ++#include "hxcom.h" ++#include "hxauth.h" ++#include "hxstrutl.h" ++#include "exaumgr.h" ++#include ++#include "print.h" ++ ++ ++#include "globals.h" ++struct _stGlobals*& GetGlobal(); //in main.cpp ++ ++ ++ ++ExampleAuthenticationManager::ExampleAuthenticationManager() : ++ m_lRefCount(0), ++ m_bSentPassword(FALSE) ++{ ++} ++ ++ExampleAuthenticationManager::~ExampleAuthenticationManager() ++{ ++} ++ ++STDMETHODIMP ++ExampleAuthenticationManager::QueryInterface(REFIID riid, void**ppvObj) ++{ ++ if(IsEqualIID(riid, IID_IUnknown)) ++ { ++ AddRef(); ++ *ppvObj = (IUnknown*)(IHXAuthenticationManager*)this; ++ return HXR_OK; ++ } ++ else if(IsEqualIID(riid, IID_IHXAuthenticationManager)) ++ { ++ AddRef(); ++ *ppvObj = (IHXAuthenticationManager*)this; ++ return HXR_OK; ++ } ++ *ppvObj = NULL; ++ return HXR_NOINTERFACE; ++} ++ ++STDMETHODIMP_(UINT32) ++ExampleAuthenticationManager::AddRef() ++{ ++ return InterlockedIncrement(&m_lRefCount); ++} ++ ++STDMETHODIMP_(UINT32) ++ExampleAuthenticationManager::Release() ++{ ++ if (InterlockedDecrement(&m_lRefCount) > 0) ++ { ++ return m_lRefCount; ++ } ++ ++ delete this; ++ return 0; ++} ++ ++STDMETHODIMP ++ExampleAuthenticationManager::HandleAuthenticationRequest(IHXAuthenticationManagerResponse* pResponse) ++{ ++ char username[1024] = ""; /* Flawfinder: ignore */ ++ char password[1024] = ""; /* Flawfinder: ignore */ ++ HX_RESULT res = HXR_FAIL; ++ ++ if( !m_bSentPassword ) ++ { ++ res = HXR_OK; ++ if (GetGlobal()->bEnableVerboseMode) ++ STDOUT("\nSending Username and Password...\n"); ++ ++ SafeStrCpy(username, GetGlobal()->g_pszUsername, 1024); ++ SafeStrCpy(password, GetGlobal()->g_pszPassword, 1024); ++ ++ //strip trailing whitespace ++ char* c; ++ for(c = username + strlen(username) - 1; ++ c > username && isspace(*c); ++ c--) ++ ; ++ *(c+1) = 0; ++ ++ for(c = password + strlen(password) - 1; ++ c > password && isspace(*c); ++ c--) ++ ; ++ *(c+1) = 0; ++ ++ m_bSentPassword = TRUE; ++ } ++ ++ if (GetGlobal()->bEnableVerboseMode && FAILED(res) ) ++ STDOUT("\nInvalid Username and/or Password.\n"); ++ ++ pResponse->AuthenticationRequestDone(res, username, password); ++ return res; ++} ++ +Index: helix-libs/clientapps/clutter/exaumgr.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exaumgr.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,56 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _EXAUMGR_H_ ++#define _EXAUMGR_H_ ++ ++#include "hxauth.h" ++ ++class ExampleAuthenticationManager : public IHXAuthenticationManager ++{ ++private: ++ INT32 m_lRefCount; ++ HXBOOL m_bSentPassword; ++ ~ExampleAuthenticationManager(); ++ ++public: ++ ExampleAuthenticationManager(); ++ STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvObj); ++ STDMETHOD_(UINT32,AddRef) (THIS); ++ STDMETHOD_(UINT32,Release) (THIS); ++ ++ STDMETHOD(HandleAuthenticationRequest) (IHXAuthenticationManagerResponse* pResponse); ++}; ++#endif +Index: helix-libs/clientapps/clutter/excallback.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/excallback.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,38 @@ ++#include "excallback.h" ++ ++STDMETHODIMP ExCallback::QueryInterface(REFIID riid, void** ppvObj) ++{ ++ if (IsEqualIID(riid, IID_IHXCallback)) ++ { ++ AddRef(); ++ *ppvObj = (IHXCallback*)this; ++ return HXR_OK; ++ } ++ else if (IsEqualIID(riid, IID_IUnknown)) ++ { ++ AddRef(); ++ *ppvObj = this; ++ return HXR_OK; ++ } ++ ++ *ppvObj = NULL; ++ return HXR_NOINTERFACE; ++} ++ ++STDMETHODIMP_(ULONG32) ExCallback::AddRef() ++{ ++ return HXR_OK; ++} ++ ++STDMETHODIMP_(ULONG32) ExCallback::Release() ++{ ++ return HXR_OK; ++} ++ ++STDMETHODIMP ExCallback::Func(void) ++{ ++ UINT32 sleepTime = 0; ++ m_pKicker->Kick(HXGetCurrentThreadID, &sleepTime); ++ printf("Get called, sleeptime:%d\n", sleepTime); ++ m_pScheduler->RelativeEnter(this, sleepTime/1000); ++} +Index: helix-libs/clientapps/clutter/excallback.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/excallback.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,32 @@ ++#ifndef _EX_CALLBACK_H_ ++#define _EX_CALLBACK_H_ ++ ++#include "hxcom.h" ++#include "hxengin.h" ++#include "ihxmedpltfm.h" ++#include "thrdutil.h" ++ ++class ExCallback : public IHXCallback ++{ ++ public: ++ ExCallback(IHXScheduler *pIHXScheduler, IHXMediaPlatformKicker *pKicker) : m_pScheduler(pIHXScheduler), m_pKicker(pKicker){}; ++ ++ /* ++ * * IUnknown methods ++ * */ ++ STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvObj); ++ STDMETHOD_(ULONG32,AddRef) (THIS); ++ STDMETHOD_(ULONG32,Release) (THIS); ++ ++ /* ++ * * IHXCallback methods ++ * */ ++ STDMETHOD(Func) (THIS); ++ private: ++ IHXScheduler *m_pScheduler; ++ IHXMediaPlatformKicker* m_pKicker; ++ ++}; ++ ++ ++#endif +Index: helix-libs/clientapps/clutter/excontxt.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/excontxt.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,315 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include "hxtypes.h" ++ ++#include "hxwintyp.h" ++#include "hxcom.h" ++#include "hxcomm.h" ++#include "hxwin.h" ++#include "fivemmap.h" ++ ++#include "hxbuffer.h" ++#include "hxmangle.h" ++ ++#include "hxclsnk.h" ++#include "hxgroup.h" ++#include "hxerror.h" ++#include "hxprefs.h" ++#include "hxstrutl.h" ++ ++#include "exadvsnk.h" ++#include "exstateadvsnk.h" ++#include "exerror.h" ++#include "exsitsup.h" ++#include "exaumgr.h" ++#include "hxprdnld.h" ++#include "exprdnld.h" ++ ++#include "excontxt.h" ++ ++extern HXBOOL bEnableAdviceSink; ++ ++ ++ExampleClientContext::ExampleClientContext(LONG32 lClientIndex) ++ : m_lRefCount(0) ++ , m_lClientIndex(lClientIndex) ++ , m_pClientSink(NULL) ++ , m_pClientStateSink(NULL) ++ , m_pErrorSink(NULL) ++ , m_pAuthMgr(NULL) ++ , m_pSiteSupplier(NULL) ++ , m_pDefaultPrefs(NULL) ++#if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS) ++ , m_pPrgDnldStatusObserver(NULL) ++#endif // /HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS. ++{ ++} ++ ++ ++ExampleClientContext::~ExampleClientContext() ++{ ++ Close(); ++}; ++ ++void ExampleClientContext::Init(IUnknown* /*IN*/ pUnknown, ++ IHXPreferences* /*IN*/ pPreferences, ++ char* /*IN*/ pszGUID, ++ on_buffering_cb_t on_buffering_cb, ++ on_pos_length_cb_t on_pos_length_cb, ++ on_state_change_cb_t on_state_change_cb, ++ on_new_frame_cb_t on_new_frame_cb, ++ void *context) ++{ ++ char* pszCipher = NULL; ++ ++ ++ m_pClientSink = new ExampleClientAdviceSink(pUnknown, m_lClientIndex, on_buffering_cb, on_pos_length_cb, context); ++ ++ m_pClientStateSink = new ExampleClientStateAdviceSink(pUnknown, m_lClientIndex, on_state_change_cb, context); ++ m_pErrorSink = new ExampleErrorSink(pUnknown); ++#if defined(HELIX_FEATURE_AUTHENTICATION) ++ m_pAuthMgr = new ExampleAuthenticationManager(); ++ if(m_pAuthMgr) ++ { ++ m_pAuthMgr->AddRef(); ++ } ++ ++#endif /* #if defined(HELIX_FEATURE_AUTHENTICATION) */ ++#if defined(HELIX_FEATURE_VIDEO) ++ m_pSiteSupplier = new ExampleSiteSupplier(pUnknown, on_new_frame_cb, context); ++#endif ++ ++#if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS) ++ m_pPrgDnldStatusObserver = new ExamplePDStatusObserver(pUnknown); ++#endif // /HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS. ++ ++ if (m_pClientSink) ++ { ++ m_pClientSink->AddRef(); ++ } ++ ++ if (m_pErrorSink) ++ { ++ m_pErrorSink->AddRef(); ++ } ++ ++ if (m_pClientStateSink) ++ m_pClientStateSink->AddRef(); ++ ++ if(m_pSiteSupplier) ++ { ++ m_pSiteSupplier->AddRef(); ++ } ++ ++ if (pPreferences) ++ { ++ m_pDefaultPrefs = pPreferences; ++ m_pDefaultPrefs->AddRef(); ++ } ++ ++ if (pszGUID && *pszGUID) ++ { ++ // Encode GUID ++ pszCipher = Cipher(pszGUID); ++ SafeStrCpy(m_pszGUID, pszCipher, 256); ++ } ++ else ++ { ++ m_pszGUID[0] = '\0'; ++ } ++} ++ ++void ExampleClientContext::Close() ++{ ++ HX_RELEASE(m_pClientSink); ++ HX_RELEASE(m_pClientStateSink); ++ HX_RELEASE(m_pErrorSink); ++#if defined(HELIX_FEATURE_AUTHENTICATION) ++ HX_RELEASE(m_pAuthMgr); ++#endif /* #if defined(HELIX_FEATURE_AUTHENTICATION) */ ++ HX_RELEASE(m_pSiteSupplier); ++ HX_RELEASE(m_pDefaultPrefs); ++#if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS) ++ HX_RELEASE(m_pPrgDnldStatusObserver); ++#endif // /HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS. ++} ++ ++ ++ ++// *** IUnknown methods *** ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::QueryInterface ++// Purpose: ++// Implement this to export the interfaces supported by your ++// object. ++// ++STDMETHODIMP ExampleClientContext::QueryInterface(REFIID riid, void** ppvObj) ++{ ++ if (IsEqualIID(riid, IID_IUnknown)) ++ { ++ AddRef(); ++ *ppvObj = this; ++ return HXR_OK; ++ } ++ else if (IsEqualIID(riid, IID_IHXPreferences)) ++ { ++ AddRef(); ++ *ppvObj = (IHXPreferences*)this; ++ return HXR_OK; ++ } ++ else if (m_pClientSink && ++ m_pClientSink->QueryInterface(riid, ppvObj) == HXR_OK) ++ { ++ return HXR_OK; ++ } ++ else if (m_pErrorSink && ++ m_pErrorSink->QueryInterface(riid, ppvObj) == HXR_OK) ++ { ++ return HXR_OK; ++ } ++ else if (m_pClientStateSink && ++ m_pClientStateSink->QueryInterface(riid, ppvObj) == HXR_OK) ++ { ++ return HXR_OK; ++ } ++#if defined(HELIX_FEATURE_AUTHENTICATION) ++ else if(m_pAuthMgr && ++ m_pAuthMgr->QueryInterface(riid, ppvObj) == HXR_OK) ++ { ++ return HXR_OK; ++ } ++#endif /* #if defined(HELIX_FEATURE_AUTHENTICATION) */ ++ else if(m_pSiteSupplier && ++ m_pSiteSupplier->QueryInterface(riid, ppvObj) == HXR_OK) ++ { ++ return HXR_OK; ++ } ++ *ppvObj = NULL; ++ return HXR_NOINTERFACE; ++} ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::AddRef ++// Purpose: ++// Everyone usually implements this the same... feel free to use ++// this implementation. ++// ++STDMETHODIMP_(ULONG32) ExampleClientContext::AddRef() ++{ ++ return InterlockedIncrement(&m_lRefCount); ++} ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::Release ++// Purpose: ++// Everyone usually implements this the same... feel free to use ++// this implementation. ++// ++STDMETHODIMP_(ULONG32) ExampleClientContext::Release() ++{ ++ if (InterlockedDecrement(&m_lRefCount) > 0) ++ { ++ return m_lRefCount; ++ } ++ ++ delete this; ++ return 0; ++} ++ ++ ++// *** IUnknown methods *** ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IHXPreferences::ReadPref ++// Purpose: ++// Read a Preference from the registry. ++// ++STDMETHODIMP ++ExampleClientContext::ReadPref(const char* pref_key, IHXBuffer*& buffer) ++{ ++ HX_RESULT hResult = HXR_OK; ++ char* pszCipher = NULL; ++ ++ if ((stricmp(pref_key, CLIENT_GUID_REGNAME) == 0) && ++ (*m_pszGUID)) ++ { ++ // Create a Buffer ++ buffer = new CHXBuffer(); ++ buffer->AddRef(); ++ ++ // Copy the encoded GUID into the buffer ++ buffer->Set((UCHAR*)m_pszGUID, strlen(m_pszGUID) + 1); ++ } ++ else if (m_pDefaultPrefs) ++ { ++ hResult = m_pDefaultPrefs->ReadPref(pref_key, buffer); ++ } ++ else ++ { ++ hResult = HXR_NOTIMPL; ++ } ++ ++ return hResult; ++} ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IHXPreferences::WritePref ++// Purpose: ++// Write a Preference to the registry. ++// ++STDMETHODIMP ++ExampleClientContext::WritePref(const char* pref_key, IHXBuffer* buffer) ++{ ++ if (m_pDefaultPrefs) ++ { ++ return m_pDefaultPrefs->WritePref(pref_key, buffer); ++ } ++ else ++ { ++ return HXR_OK; ++ } ++} ++ ++EHXClientState ExampleClientContext::GetState() ++{ ++ return m_pClientStateSink->GetState(); ++}; +Index: helix-libs/clientapps/clutter/excontxt.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/excontxt.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,106 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++#ifndef _EXCONTXT_H_ ++#define _EXCONTXT_H_ ++ ++#include "exerror.h" ++#include "exsitsup.h" ++#include "hxprefs.h" ++#include "player.h" ++#include "hxclsnk.h" ++ ++struct IUnknown; ++struct IHXPreferences; ++class ExampleClientAdviceSink; ++class ExampleClientStateAdviceSink; ++class ExampleErrorMessages; ++class ExampleAuthenticationManager; ++class ExamplePDStatusObserver; ++ ++ ++class ExampleClientContext : public IHXPreferences ++{ ++private: ++ LONG32 m_lRefCount; ++ LONG32 m_lClientIndex; ++ ++ ExampleClientAdviceSink* m_pClientSink; ++ ExampleClientStateAdviceSink* m_pClientStateSink; ++ ExampleErrorSink* m_pErrorSink; ++ ExampleAuthenticationManager* m_pAuthMgr; ++ ++ ExampleSiteSupplier* m_pSiteSupplier; ++ ExamplePDStatusObserver* m_pPrgDnldStatusObserver; ++ IHXPreferences* m_pDefaultPrefs; ++ char m_pszGUID[256]; /* Flawfinder: ignore */ ++ ++ ++public: ++ ++ ExampleClientContext(LONG32 /*IN*/ lClientIndex); ++ ~ExampleClientContext(); ++ ++ void Init(IUnknown* /*IN*/ pUnknown, ++ IHXPreferences* /*IN*/ pPreferences, ++ char* /*IN*/ pszGUID, ++ on_buffering_cb_t on_buffering_cb = NULL, ++ on_pos_length_cb_t on_pos_length_cb = NULL, ++ on_state_change_cb_t on_state_change_cb = NULL, ++ on_new_frame_cb_t on_new_frame_cb = NULL, ++ void *context = NULL); ++ void Close(); ++ ++ EHXClientState GetState(); ++ ++ /* ++ * IUnknown methods ++ */ ++ STDMETHOD(QueryInterface) (THIS_ ++ REFIID riid, ++ void** ppvObj); ++ ++ STDMETHOD_(ULONG32,AddRef) (THIS); ++ STDMETHOD_(ULONG32,Release) (THIS); ++ ++ /* ++ * IHXPreferences methods ++ */ ++ STDMETHOD(ReadPref) (THIS_ const char* pref_key, ++ IHXBuffer*& buffer); ++ STDMETHOD(WritePref) (THIS_ const char* pref_key, ++ IHXBuffer* buffer); ++}; ++ ++#endif +Index: helix-libs/clientapps/clutter/exerror.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exerror.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,230 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include "hxtypes.h" ++ ++#include "hxcom.h" ++#include "hxcomm.h" ++#include "hxerror.h" ++#include "hxstrutl.h" ++#include "hxcore.h" ++#include "hxassert.h" ++#include "hxbuffer.h" ++ ++#ifdef __TCS__ ++#include "hxresult.h" ++#endif ++ ++#if !defined(HELIX_CONFIG_MINIMIZE_SIZE) ++#include "HXErrorCodeStrings.h" ++#endif ++ ++#include "exerror.h" ++ ++#include ++#include "print.h" ++ ++#include "globals.h" ++struct _stGlobals*& GetGlobal(); //in main.cpp ++ ++#ifdef __TCS__ ++#if defined(__cplusplus) ++extern "C" { ++#endif ++ ++void hookRealAudio_ReportError(int err, long errVal); ++ ++#ifdef __cplusplus ++} ++#endif ++#endif ++ ++ExampleErrorSink::ExampleErrorSink(IUnknown* pUnknown) ++ : m_lRefCount(0), ++ m_pPlayer(NULL) ++{ ++ IHXClientEngine* pEngine = NULL; ++ pUnknown->QueryInterface(IID_IHXClientEngine, (void**)&pEngine ); ++ if( pEngine ) ++ { ++ IUnknown* pTmp = NULL; ++ pEngine->GetPlayer(0, pTmp); ++ m_pPlayer = (IHXPlayer*)pTmp; ++ } ++ ++ HX_RELEASE( pEngine ); ++ HX_ASSERT(m_pPlayer); ++} ++ ++ExampleErrorSink::~ExampleErrorSink() ++{ ++ HX_RELEASE(m_pPlayer); ++} ++ ++// *** IUnknown methods *** ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::QueryInterface ++// Purpose: ++// Implement this to export the interfaces supported by your ++// object. ++// ++STDMETHODIMP ExampleErrorSink::QueryInterface(REFIID riid, void** ppvObj) ++{ ++ if (IsEqualIID(riid, IID_IUnknown)) ++ { ++ AddRef(); ++ *ppvObj = (IUnknown*)(IHXErrorSink*)this; ++ return HXR_OK; ++ } ++ else if (IsEqualIID(riid, IID_IHXErrorSink)) ++ { ++ AddRef(); ++ *ppvObj = (IHXErrorSink*) this; ++ return HXR_OK; ++ } ++ ++ *ppvObj = NULL; ++ return HXR_NOINTERFACE; ++} ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::AddRef ++// Purpose: ++// Everyone usually implements this the same... feel free to use ++// this implementation. ++// ++STDMETHODIMP_(ULONG32) ExampleErrorSink::AddRef() ++{ ++ return InterlockedIncrement(&m_lRefCount); ++} ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::Release ++// Purpose: ++// Everyone usually implements this the same... feel free to use ++// this implementation. ++// ++STDMETHODIMP_(ULONG32) ExampleErrorSink::Release() ++{ ++ if (InterlockedDecrement(&m_lRefCount) > 0) ++ { ++ return m_lRefCount; ++ } ++ ++ delete this; ++ return 0; ++} ++ ++/* ++ * IHXErrorSink methods ++ */ ++ ++STDMETHODIMP ++ExampleErrorSink::ErrorOccurred(const UINT8 unSeverity, ++ const ULONG32 ulHXCode, ++ const ULONG32 ulUserCode, ++ const char* pUserString, ++ const char* pMoreInfoURL ++ ) ++{ ++ char HXDefine[256]; /* Flawfinder: ignore */ ++ ++ // Store the code, so we can return it from main() ++ GetGlobal()->g_Error = ulHXCode; ++ ++ ConvertErrorToString(ulHXCode, HXDefine, 256); ++ ++#ifdef __TCS__ ++ hookRealAudio_ReportError(ulHXCode,ulUserCode); ++#else ++ STDOUT("Report(%d, %ld, \"%s\", %ld, \"%s\", \"%s\")\n", ++ unSeverity, ++ ulHXCode, ++ (pUserString && *pUserString) ? pUserString : "(NULL)", ++ ulUserCode, ++ (pMoreInfoURL && *pMoreInfoURL) ? pMoreInfoURL : "(NULL)", ++ HXDefine); ++#endif ++ ++ return HXR_OK; ++} ++ ++void ++ExampleErrorSink::ConvertErrorToString(const ULONG32 ulHXCode, char* pszBuffer, UINT32 ulBufLen) ++{ ++ IHXErrorMessages* pErrMsg = NULL; ++ ++ if( !pszBuffer) ++ return; ++ ++ pszBuffer[0]='\0'; ++ ++ HX_ASSERT(m_pPlayer); ++ if( m_pPlayer) ++ { ++ m_pPlayer->QueryInterface(IID_IHXErrorMessages, (void**)&pErrMsg); ++ if( pErrMsg ) ++ { ++ IHXBuffer* pMessage = pErrMsg->GetErrorText(ulHXCode); ++ if( pMessage ) ++ { ++ SafeStrCpy( pszBuffer, (const char*)pMessage->GetBuffer(), ulBufLen); ++ pMessage->Release(); ++ } ++ } ++ HX_RELEASE(pErrMsg); ++ } ++ ++ if( strlen(pszBuffer)==0 ) ++ { ++#if !defined(HELIX_CONFIG_MINIMIZE_SIZE) ++ const char* pszHXCodeString = HXErrorCodeToString(ulHXCode); ++ if (pszHXCodeString) ++ { ++ SafeSprintf( pszBuffer, ulBufLen, "%s", pszHXCodeString); ++ } ++ else ++#endif ++ { ++ HX_ASSERT(FALSE); ++ SafeSprintf( pszBuffer, ulBufLen, "Can't convert error code %p - make sure it's defined in common/util/HXErrorCodeStrings.c", ulHXCode ); ++ } ++ } ++} ++ +Index: helix-libs/clientapps/clutter/exerror.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exerror.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,92 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _EXAMPLEERRORMESSAGES_ ++#define _EXAMPLEERRORMESSAGES_ ++ ++#include "hxerror.h" ++ ++struct IUnknown; ++struct IHXErrorMessages; ++struct IHXPlayer; ++ ++class ExampleErrorSink : public IHXErrorSink ++{ ++public: ++ ++ ExampleErrorSink(IUnknown* pUnknown); ++ ~ExampleErrorSink(); ++ ++ /* ++ * IUnknown methods ++ */ ++ STDMETHOD(QueryInterface) (THIS_ ++ REFIID riid, ++ void** ppvObj); ++ ++ STDMETHOD_(ULONG32,AddRef) (THIS); ++ ++ STDMETHOD_(ULONG32,Release) (THIS); ++ ++ /* ++ * IHXErrorSink methods ++ */ ++ ++ /************************************************************************ ++ * Method: ++ * IHXErrorSink::ErrorOccurred ++ * Purpose: ++ * After you have registered your error sink with an IHXErrorSinkControl ++ * (either in the server or player core) this method will be called to ++ * report an error, event, or status message. ++ * ++ * The meaning of the arguments is exactly as described in ++ * hxerror.h ++ */ ++ STDMETHOD(ErrorOccurred) (THIS_ ++ const UINT8 unSeverity, ++ const ULONG32 ulHXCode, ++ const ULONG32 ulUserCode, ++ const char* pUserString, ++ const char* pMoreInfoURL ++ ); ++ ++protected: ++ LONG32 m_lRefCount; ++ IHXPlayer* m_pPlayer; ++ ++ void ConvertErrorToString (const ULONG32 ulHXCode, char* pszBuffer, UINT32 ulBufLen); ++}; ++#endif /*_EXAMPLEERRORMESSAGES_*/ +Index: helix-libs/clientapps/clutter/exprdnld.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exprdnld.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,468 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include "hxcom.h" ++#include "hxtypes.h" ++#include "hxcore.h" ++#include "hxprdnld.h" ++#include "exprdnld.h" ++#include "print.h" ++ ++#include "globals.h" ++struct _stGlobals*& GetGlobal(); ++ ++UINT32 GetTime(); // /In main.cpp. ++ ++// /#if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS) ++/************************************************************************ ++ * Method: ++ * Constructor ++ */ ++ExamplePDStatusObserver::ExamplePDStatusObserver(IUnknown* pUnkPlayer) ++ : m_lRefCount(0) ++ , m_pPrgDnldStatusMgr(NULL) ++ , m_pUnkPlayer(pUnkPlayer) ++ , m_pHXPlayer(NULL) ++ , m_bPlayerIsPausedByThis(FALSE) ++ , m_bFirstPDStatusMessage(TRUE) ++ , m_ulTotalDurReported(HX_PROGDOWNLD_UNKNOWN_DURATION) ++ , m_ulDurSoFar(HX_PROGDOWNLD_UNKNOWN_DURATION) ++ , m_ulCurStatusUpdateGranularity( ++ HX_PROGDOWNLD_DEFAULT_STATUSREPORT_INTERVAL_MSEC) ++ , m_bInitialPrerollUpateGranularitySet(FALSE) ++ , m_bDownloadIsComplete(FALSE) ++{ ++ if (m_pUnkPlayer) ++ { ++ m_pUnkPlayer->QueryInterface(IID_IHXPlayer, ++ (void**)&m_pHXPlayer); ++ ++ m_pUnkPlayer->QueryInterface(IID_IHXPDStatusMgr, ++ (void**)&m_pPrgDnldStatusMgr); ++ ++ if (m_pPrgDnldStatusMgr) ++ { ++ // /Add ourselves as an observer of progressive download playback: ++ m_pPrgDnldStatusMgr->AddObserver(this); ++ // /Set granularity of status reports to 10 per second until we ++ // know enough about the situation to go back to getting reports ++ // at the default interval (every 5 seconds). Do that as soon ++ // as we receive the first progress report: ++ m_ulCurStatusUpdateGranularity = 100; ++ } ++ ++ m_pUnkPlayer->AddRef(); ++ } ++}; ++ ++/************************************************************************ ++ * Method: ++ * Destructor ++ */ ++ExamplePDStatusObserver::~ExamplePDStatusObserver() ++{ ++ if (m_pPrgDnldStatusMgr) ++ { ++ m_pPrgDnldStatusMgr->RemoveObserver(this); ++ } ++ HX_RELEASE(m_pPrgDnldStatusMgr); ++ HX_RELEASE(m_pHXPlayer); ++ HX_RELEASE(m_pUnkPlayer); ++} ++ ++/************************************************************************ ++ * Method: ++ * IUnknown::QueryInterface ++ */ ++STDMETHODIMP ++ExamplePDStatusObserver::QueryInterface(REFIID riid, void** ppvObj) ++{ ++ if (IsEqualIID(riid, IID_IUnknown)) ++ { ++ AddRef(); ++ *ppvObj = (IUnknown*)(IHXPDStatusObserver*)this; ++ return HXR_OK; ++ } ++ else if (IsEqualIID(riid, IID_IHXPDStatusObserver)) ++ { ++ AddRef(); ++ *ppvObj = (IHXPDStatusObserver*)this; ++ return HXR_OK; ++ } ++ ++ *ppvObj = NULL; ++ return HXR_NOINTERFACE; ++} ++ ++/************************************************************************ ++ * Method: ++ * IUnknown::AddRef ++ */ ++STDMETHODIMP_(ULONG32) ++ExamplePDStatusObserver::AddRef() ++{ ++ return InterlockedIncrement(&m_lRefCount); ++} ++ ++/************************************************************************ ++ * Method: ++ * IUnknown::Release ++ */ ++STDMETHODIMP_(ULONG32) ++ExamplePDStatusObserver::Release() ++{ ++ if (InterlockedDecrement(&m_lRefCount) > 0) ++ { ++ return m_lRefCount; ++ } ++ ++ delete this; ++ return 0; ++} ++ ++ ++/* ++ * IHXPDStatusObserver methods ++ */ ++ ++/************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::OnDownloadProgress ++ * ++ * Purpose: ++ * Notification from IHXPDStatusMgr of download progress when ++ * file size changes. ++ * ++ * lTimeSurplus: ++ * - When negative, the absolute value of it is the estimated number ++ * of milliseconds of wall-clock time that need to pass while ++ * downloading continues before reaching the point at which playback ++ * can resume and play the remainder of the stream without having to ++ * buffer, assuming that playback is paused and remains so during ++ * that period. ++ * - When positive, it is the estimated number of milliseconds of ++ * wall-clock time between when the download should complete and when ++ * the natural content play-out duration will be reached, assuming ++ * playback is currently progressing and that no pause will occur. ++ * ++ * Note: ulNewDurSoFar can be HX_PROGDOWNLD_UNKNOWN_DURATION if the ++ * IHXMediaBytesToMediaDur was not available to, or was unable to ++ * convert the bytes to a duration for the IHXPDStatusMgr calling this: ++ */ ++STDMETHODIMP ++ExamplePDStatusObserver::OnDownloadProgress( ++ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource, ++ UINT32 /*IN*/ ulNewDurSoFar, ++ UINT32 /*IN*/ ulNewBytesSoFar, ++ INT32 /*IN*/ lTimeSurplus) ++{ ++ m_ulDurSoFar = ulNewDurSoFar; ++ ++ if (m_ulCurStatusUpdateGranularity < ++ HX_PROGDOWNLD_DEFAULT_STATUSREPORT_INTERVAL_MSEC) ++ { ++ if (m_bInitialPrerollUpateGranularitySet) ++ { ++ if (HX_PROGDOWNLD_UNKNOWN_DURATION != ulNewDurSoFar && ++ // /Preroll is done, so reset update interval back to default: ++ GetGlobal()->g_bOnBeginOccurred) ++ { ++ m_ulCurStatusUpdateGranularity = ++ HX_PROGDOWNLD_DEFAULT_STATUSREPORT_INTERVAL_MSEC; ++ m_pPrgDnldStatusMgr->SetStatusUpdateGranularityMsec( ++ m_ulCurStatusUpdateGranularity); ++ } ++ } ++ else if (!GetGlobal()->g_bOnBeginOccurred) ++ { ++ if (HXR_OK == m_pPrgDnldStatusMgr->SetStatusUpdateGranularityMsec( ++ m_ulCurStatusUpdateGranularity)) ++ { ++ m_bInitialPrerollUpateGranularitySet = TRUE; ++ } ++ } ++ } ++ ++ UINT32 ulCurPlayTime = 0; ++ ++ HXBOOL bPauseWasAttempted = FALSE; ++ HXBOOL bPauseOccurred = FALSE; ++ HXBOOL bResumeWasAttempted = FALSE; ++ HXBOOL bResumeOccurred = FALSE; ++ ++ ++ if (m_pHXPlayer) ++ { ++ ulCurPlayTime = m_pHXPlayer->GetCurrentPlayTime(); ++ ++ if (GetGlobal()->g_bEnableSlowStart && ++ lTimeSurplus != HX_PROGDOWNLD_UNKNOWN_TIME_SURPLUS) ++ { ++ // /"slow start" is enabled so if we have run dry of data, ++ // pause and wait for more data: ++ if (!m_bPlayerIsPausedByThis) ++ { ++ if (!m_bDownloadIsComplete && lTimeSurplus<0) ++ { ++ // /Use a 1000-millisecond allowance for variation: ++ if (lTimeSurplus < -1000) ++ { ++ bPauseWasAttempted = TRUE; ++ bPauseOccurred = m_bPlayerIsPausedByThis = ++ (HXR_OK == m_pHXPlayer->Pause()); ++ } ++ } ++ } ++ else // /paused; see if we can resume yet: ++ { ++ if (lTimeSurplus > 0) ++ { ++ // /Use a 1000-millisecond allowance for variation: ++ if (lTimeSurplus > 1000) ++ { ++ bResumeWasAttempted = TRUE; ++ bResumeOccurred = (HXR_OK == m_pHXPlayer->Begin()); ++ m_bPlayerIsPausedByThis = !bResumeOccurred; ++ } ++ } ++ } ++ } ++ } ++ ++ if (GetGlobal()->bEnableVerboseMode && !m_bDownloadIsComplete) ++ { ++ STDOUT("\nDownload progress: (play time=%lu,", ++ ulCurPlayTime); ++ if (HX_PROGDOWNLD_UNKNOWN_TIME_SURPLUS == lTimeSurplus) ++ { ++ STDOUT(" UNKNOWN surplus|deficit)"); ++ } ++ else if (HX_PROGDOWNLD_MIN_TIME_SURPLUS == lTimeSurplus) ++ { ++ STDOUT(" deficit exceeds maximum"); ++ } ++ else if (HX_PROGDOWNLD_MAX_TIME_SURPLUS == lTimeSurplus) ++ { ++ STDOUT(" surplus exceeds maximum)"); ++ } ++ else ++ { ++ STDOUT(" surplus=%ld milliseconds)", lTimeSurplus); ++ } ++ if (HX_PROGDOWNLD_UNKNOWN_DURATION == ulNewDurSoFar) ++ { ++ STDOUT("\n\thave UNKNOWN"); ++ } ++ else ++ { ++ STDOUT("\n\thave %lu", ulNewDurSoFar); ++ } ++ ++ if (HX_PROGDOWNLD_UNKNOWN_DURATION != m_ulTotalDurReported) ++ { ++ STDOUT(" of %lu msec", m_ulTotalDurReported); ++ } ++ else ++ { ++ STDOUT(" of UNKNOWN msec of media"); ++ } ++ if (HX_PROGDOWNLD_UNKNOWN_FILE_SIZE != ulNewBytesSoFar) ++ { ++ STDOUT(" (%lu", ulNewBytesSoFar); ++ } ++ else ++ { ++ STDOUT(" (UNKNOWN"); ++ } ++ STDOUT(" bytes downloaded so far)\n", ulNewBytesSoFar); ++ ++ if (bPauseOccurred || bPauseWasAttempted) ++ { ++ STDOUT("# Waiting for more data: %splayback.\n " ++ " Should take %ld milliseconds before playback resumes.\n", ++ bPauseOccurred? "Pausing " : ++ (bPauseWasAttempted? "Failed attempting to pause " ++ : " "), -lTimeSurplus); ++ } ++ if (bResumeOccurred || bResumeWasAttempted) ++ { ++ STDOUT("# Data available: %splayback\n " ++ " Time surplus is now %ld", ++ bResumeOccurred? "Resuming " : ++ (bResumeWasAttempted? "Failed attempting to resume " ++ : " "), lTimeSurplus); ++ } ++ } ++ ++ m_bFirstPDStatusMessage = FALSE; ++ ++ return HXR_OK; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::OnTotalDurChanged ++ * Purpose: ++ * This is a notification if the total file duration becomes known ++ * or becomes better-known during download/playback ++ * ++ * Note: pStreamSource can be NULL. This will be true when ++ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource ++ * object. ++ */ ++STDMETHODIMP ++ExamplePDStatusObserver::OnTotalDurChanged( ++ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource, ++ UINT32 ulNewTotalDur) ++{ ++ m_ulTotalDurReported = ulNewTotalDur; ++ ++ if (GetGlobal()->bEnableVerboseMode) ++ { ++ STDOUT("\nOnTotalDurChanged(): to %lu milliseconds\n", ulNewTotalDur); ++ } ++ ++ return HXR_OK; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::OnDownloadComplete ++ * ++ * Purpose: ++ * Notification that the entire file has been downloaded. ++ * ++ * Note: pStreamSource can be NULL. This will be true when ++ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource ++ * object. ++ * ++ */ ++STDMETHODIMP ++ExamplePDStatusObserver::OnDownloadComplete( ++ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource) ++{ ++ m_bDownloadIsComplete = TRUE; ++ ++ HXBOOL bResumeWasAttempted = FALSE; ++ HXBOOL bResumeOccurred = FALSE; ++ ++ // /In case we're paused, resume now that there is no more data to get: ++ if (m_pHXPlayer && m_bPlayerIsPausedByThis) ++ { ++ bResumeWasAttempted = TRUE; ++ bResumeOccurred = (HXR_OK == m_pHXPlayer->Begin()); ++ m_bPlayerIsPausedByThis = !bResumeOccurred; ++ } ++ ++ if (GetGlobal()->bEnableVerboseMode) ++ { ++ STDOUT("\nOnDownloadComplete()\n"); ++ if (bResumeOccurred || bResumeWasAttempted) ++ { ++ STDOUT("\n%splayback now that bytes are available for " ++ "uninterrupted playback\n", ++ bResumeOccurred? "Resuming " : ++ (bResumeWasAttempted? "Failed attempting to resume " ++ : " ")); ++ } ++ } ++ ++ return HXR_OK; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::SrcClaimsSeekSupport ref: hxprdnld.h ++ * Purpose: ++ * Passes along notification from file sys that seek support ++ * is or is not claimed to be available (although sometimes HTTP ++ * server claims this when it doesn't actually support it). ++ */ ++STDMETHODIMP ++ExamplePDStatusObserver::SrcClaimsSeekSupport(IHXStreamSource* pStreamSource, ++ HXBOOL bClaimsSupport) ++{ ++ if (GetGlobal()->bEnableVerboseMode) ++ { ++ STDOUT("\nSrcClaimsSeekSupport(%sE)\n", bClaimsSupport?"TRU":"FALS"); ++ } ++ return HXR_OK; ++} ++ ++ ++/************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::OnDownloadPause ++ * Purpose: ++ * Notification that the file-download process has purposefully ++ * and temporarily halted downloading of the file ++ * ++ * Note: pStreamSource can be NULL. This will be true when ++ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource ++ * object. ++ */ ++STDMETHODIMP ++ExamplePDStatusObserver::OnDownloadPause( ++ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource) ++{ ++ if (GetGlobal()->bEnableVerboseMode) ++ { ++ STDOUT("\nOnDownloadPause()\n"); ++ } ++ return HXR_OK; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::OnDownloadResume ++ * Purpose: ++ * Notification that the file-download process has resumed ++ * the process of downloading the remainder of the file ++ * ++ * Note: pStreamSource can be NULL. This will be true when ++ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource ++ * object. ++ */ ++STDMETHODIMP ++ExamplePDStatusObserver::OnDownloadResume( ++ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource) ++{ ++ if (GetGlobal()->bEnableVerboseMode) ++ { ++ STDOUT("\nOnDownloadResume()\n"); ++ } ++ return HXR_OK; ++} ++// /#endif // /HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS. +Index: helix-libs/clientapps/clutter/exprdnld.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exprdnld.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,196 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _EXPRDNLD_H_ ++#define _EXPRDNLD_H_ ++ ++// /#if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS) ++ ++/**************************************************************************** ++ * ++ * Class: ++ * ++ * ExamplePDStatusObserver ++ * ++ * Purpose: ++ * ++ * Implementation for IHXPDStatusObserver which receives progressive- ++ * download status reports: ++ * ++ */ ++class ExamplePDStatusObserver : ++ public IHXPDStatusObserver ++{ ++private: ++ INT32 m_lRefCount; ++ IHXPDStatusMgr* m_pPrgDnldStatusMgr; ++ IUnknown* m_pUnkPlayer; ++ IHXPlayer* m_pHXPlayer; ++ HXBOOL m_bPlayerIsPausedByThis; ++ HXBOOL m_bFirstPDStatusMessage; ++ UINT32 m_ulTotalDurReported; ++ UINT32 m_ulDurSoFar; ++ UINT32 m_ulCurStatusUpdateGranularity; ++ HXBOOL m_bInitialPrerollUpateGranularitySet; ++ HXBOOL m_bDownloadIsComplete; ++ ++ ExamplePDStatusObserver(); ++ ~ExamplePDStatusObserver(); ++ ++public: ++ ExamplePDStatusObserver(IUnknown* pUnkPlayer); ++ ++ /* ++ * IUnknown methods ++ */ ++ STDMETHOD(QueryInterface) (THIS_ ++ REFIID riid, ++ void** ppvObj); ++ ++ STDMETHOD_(ULONG32,AddRef) (THIS); ++ ++ STDMETHOD_(ULONG32,Release) (THIS); ++ ++ /* ++ * IHXPDStatusObserver methods ++ */ ++ ++ /************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::OnDownloadProgress ++ * ++ * Purpose: ++ * Notification from IHXPDStatusMgr of download progress when ++ * file size changes. ++ * ++ * lTimeSurplus: ++ * - When negative, the absolute value of it is the estimated number ++ * of milliseconds of wall-clock time that need to pass while ++ * downloading continues before reaching the point at which playback ++ * can resume and play the remainder of the stream without having to ++ * buffer, assuming that playback is paused and remains so during ++ * that period. ++ * - When positive, it is the estimated number of milliseconds of ++ * wall-clock time between when the download should complete and when ++ * the natural content play-out duration will be reached, assuming ++ * playback is currently progressing and that no pause will occur. ++ * ++ * Note: ulNewDurSoFar can be HX_PROGDOWNLD_UNKNOWN_DURATION if the ++ * IHXMediaBytesToMediaDurConverter was not available to, or was ++ * unable to convert the bytes to a duration for the IHXPDStatusMgr ++ * calling this: ++ */ ++ STDMETHOD(OnDownloadProgress) (THIS_ ++ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource, ++ UINT32 /*IN*/ ulNewDurSoFar, ++ UINT32 /*IN*/ ulNewBytesSoFar, ++ INT32 /*IN*/ lTimeSurplus); ++ ++ /************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::OnTotalDurChanged ++ * Purpose: ++ * This is a notification if the total file duration becomes known ++ * or becomes better-known during download/playback ++ * ++ * Note: pStreamSource can be NULL. This will be true when ++ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource ++ * object. ++ */ ++ STDMETHOD(OnTotalDurChanged) (THIS_ ++ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource, ++ UINT32 /*IN*/ ulNewDur); ++ ++ /************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::OnDownloadComplete ++ * ++ * Purpose: ++ * Notification that the entire file has been downloaded. ++ * ++ * Note: pStreamSource can be NULL. This will be true when ++ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource ++ * object. ++ * ++ */ ++ STDMETHOD(OnDownloadComplete) (THIS_ ++ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource); ++ ++ /************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::SrcClaimsSeekSupport ++ * ++ * Purpose: ++ * Passes along notification from file sys that seek support ++ * is claimed to be available (although sometimes HTTP server ++ * claims this when it doesn't actually support it). ++ * ++ */ ++ STDMETHOD(SrcClaimsSeekSupport) (THIS_ ++ IHXStreamSource* pStreamSource, ++ HXBOOL /*IN*/ bSrcClaimsSeekSupport); ++ ++ /************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::OnDownloadPause ++ * Purpose: ++ * Notification that the file-download process has purposefully ++ * and temporarily halted downloading of the file ++ * ++ * Note: pStreamSource can be NULL. This will be true when ++ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource ++ * object. ++ */ ++ STDMETHOD(OnDownloadPause) (THIS_ ++ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource); ++ ++ /************************************************************************ ++ * Method: ++ * IHXPDStatusObserver::OnDownloadResume ++ * Purpose: ++ * Notification that the file-download process has resumed ++ * the process of downloading the remainder of the file ++ * ++ * Note: pStreamSource can be NULL. This will be true when ++ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource ++ * object. ++ */ ++ STDMETHOD(OnDownloadResume) (THIS_ ++ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource); ++}; ++// /#endif // /HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS. ++ ++#endif // _EXPRDNLD_H_ ++ +Index: helix-libs/clientapps/clutter/exroot.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exroot.cpp 2008-10-13 06:54:08.000000000 -0700 +@@ -0,0 +1,672 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Source last modified: $Id: unixroot.cpp,v 1.9 2007/07/06 20:54:01 jfinnecy Exp $ ++ * ++ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, ++ * are subject to the current version of the RealNetworks Public ++ * Source License (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the current version of the RealNetworks Community ++ * Source License (the "RCSL") available at ++ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL ++ * will apply. You may also obtain the license terms directly from ++ * RealNetworks. You may not use this file except in compliance with ++ * the RPSL or, if you have a valid RCSL with RealNetworks applicable ++ * to this file, the RCSL. Please see the applicable RPSL or RCSL for ++ * the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License Version 2 (the ++ * "GPL") in which case the provisions of the GPL are applicable ++ * instead of those above. If you wish to allow use of your version of ++ * this file only under the terms of the GPL, and not to allow others ++ * to use your version of this file under the terms of either the RPSL ++ * or RCSL, indicate your decision by deleting the provisions above ++ * and replace them with the notice and other provisions required by ++ * the GPL. If you do not delete the provisions above, a recipient may ++ * use your version of this file under the terms of any one of the ++ * RPSL, the RCSL or the GPL. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the ++ * portions it created. ++ * ++ * This file, and the files included with this file, is distributed ++ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY ++ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ++ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ++ * ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++// for shared memory ++#include ++#include ++#include ++#include ++ ++#include "hxcom.h" ++#include "hxwintyp.h" ++#include "hxvsurf.h" ++#include "hxslist.h" ++#include "colormap.h" ++#include "hxprefs.h" ++#include "hxtick.h" ++#include "hxthread.h" ++#include "basesite.h" ++#include "exroot.h" ++#include "exsite.h" ++#include "unixcmap.h" ++#include "shmhelp.h" ++ ++// #ifdef _DEBUG ++// #include //for debug video sync rates.. ++// #endif ++ ++//Work around AIX problem. ++#ifdef _AIX ++# define MAX_SHARED_REGIONS ((UINT32)1) ++#else ++# define MAX_SHARED_REGIONS ((UINT32)9999) ++#endif ++ ++CExRootSurf::CExRootSurf(IUnknown* pContext, CHXBaseSite* pSite, on_new_frame_cb_t on_new_frame_cb, void *context ) ++ : CBaseRootSurface(pContext, pSite) ++ , m_bUseShm(FALSE) ++ , m_nShmId(0) ++ , m_pDisplay(NULL) ++ , m_GC(0) ++ , m_nScreenNumber(0) ++ , m_pXImage(NULL) ++ , m_pVisual(NULL) ++ , m_unDepth(0) ++ , m_pScreen(NULL) ++ , m_pYUVScratchBits(NULL) ++ , m_nYUVScratchPitch(0) ++ , m_pScratchBits(NULL) ++ , m_nScratchPitch(0) ++ , m_nBitsPerPixel(0) ++ , m_nCompositionSize(0) ++ , m_on_new_frame_cb(on_new_frame_cb) ++ , m_context(context) ++{ ++} ++ ++HX_RESULT CExRootSurf::Init() ++{ ++ //get window and display from main Site. ++ HXxWindow* pWindow = m_pSite->GetWindow(); ++ HX_ASSERT(pWindow); ++ ++ m_pDisplay = (Display*)pWindow->display; ++ m_window = (Window)pWindow->window; ++ ++ HX_ASSERT( m_pDisplay ); ++ HX_ASSERT( m_window ); ++ ++ // ++ // Now see if our X11 server supports the Shared Memory extension. ++ // ++ // ShmHelp::Init(m_pDisplay); ++ // m_bUseShm = ShmHelp::ShmAvailable(); ++ ++ //Create the graphics context ++ XGCValues values; ++ ++ XLockDisplay(m_pDisplay); ++ m_GC = XCreateGC(m_pDisplay, m_window, 0, &values); ++ ++ //Get X window attributes & visual ++ XWindowAttributes attr; ++ XGetWindowAttributes(m_pDisplay, m_window, &attr); ++ XUnlockDisplay(m_pDisplay); ++ m_pVisual = attr.visual; ++ ++ // get visual info & depth ++ int nv=0; ++ XVisualInfo visInfo; ++ memset(&visInfo, 0, sizeof(XVisualInfo)); ++ XLockDisplay(m_pDisplay); ++ visInfo.visualid = XVisualIDFromVisual(m_pVisual); ++ XVisualInfo* pVisualInfo = XGetVisualInfo (m_pDisplay, VisualIDMask, &visInfo, &nv); ++// m_unDepth = pVisualInfo->depth; ++ m_unDepth = 24; ++ m_nScreenNumber = DefaultScreen(m_pDisplay); ++ m_pScreen = XScreenOfDisplay(m_pDisplay, m_nScreenNumber); ++ XUnlockDisplay(m_pDisplay); ++ m_colormap = HXGetXColormap(m_pDisplay, m_window); ++ ++ // get pixmap (blt) information for the best depth we can display ++ int i=0; ++ int nNum=0; ++ XLockDisplay(m_pDisplay); ++ XPixmapFormatValues *pixmap_formats = XListPixmapFormats(m_pDisplay, &nNum); ++ XUnlockDisplay(m_pDisplay); ++ if(pixmap_formats) ++ { ++ for (i=0 ; ired_mask; ++ m_bmiSave.un.dwBitMask[1] = pVisualInfo->green_mask; ++ m_bmiSave.un.dwBitMask[2] = pVisualInfo->blue_mask; ++#else ++ /* Fake a RGB24 */ ++ m_nBitsPerPixel = 24; ++ m_bmiSave.bmiHeader.biBitCount = m_nBitsPerPixel; ++ m_bmiSave.bmiHeader.biCompression = BI_RGB; ++#endif ++ //Set primary surface CID. ++ m_nCompositionSurfaceCID = GetBitmapColor(&m_bmiSave); ++ XFree( pVisualInfo ); ++ ++// #ifdef _DEBUG ++// //Lets find out what Hsync and Vsync rates we have for this display. ++// //Ripped from xvidtune.c ++// XF86VidModeModeLine mode_line; ++// int scrn=0; ++// int dot_clock; ++// double vsync_hz, HSyncRate,HTotal, VTotal, PixelClock; ++// if(XF86VidModeGetModeLine(m_pDisplay, scrn, &dot_clock, &mode_line)) ++// { ++// PixelClock=dot_clock; ++// HTotal = mode_line.htotal; ++// VTotal = mode_line.vtotal; ++// HSyncRate = PixelClock*1000.0/HTotal; ++// vsync_hz = HSyncRate/VTotal; ++// fprintf( stderr, "This Display's Hsync rate is: %f and Vsync: %f\n", ++// HSyncRate, vsync_hz ); ++// } ++ ++// #endif ++ ++ return HXR_OK; ++} ++ ++CExRootSurf::~CExRootSurf() ++{ ++ _DestroyCompositionSurface(); ++ ++ if( m_GC ) ++ { ++ XLockDisplay(m_pDisplay); ++ XFreeGC( m_pDisplay, m_GC ); ++ XUnlockDisplay(m_pDisplay); ++ m_GC=0; ++ } ++ if (m_pVisual) ++ { ++ /* PJG: don't have to free visuals */ ++ m_pVisual = NULL; ++ } ++ ++ if(m_bUseShm) ++ { ++ if( m_pCompositionSurface != NULL ) ++ ShmHelp::DetachSharedRegion(&m_pCompositionSurface, &m_shmInfo); ++ } ++ else ++ { ++ HX_DELETE(m_pCompositionSurface); ++ m_nCompositionSize=0; ++ m_bCompositionSurfaceCreated=FALSE; ++ } ++ ++ //XXXgfw any more clean up for these two? ++ HX_VECTOR_DELETE( m_pScratchBits ); ++ HX_VECTOR_DELETE( m_pYUVScratchBits ); ++ ++} ++ ++HX_RESULT CExRootSurf::_ResizeVideoBuffer( INT32 nSize) ++{ ++ HX_RESULT retVal=HXR_OK; ++ ++ if(nSize <= m_nCompositionSize) ++ return retVal; ++ ++ if(m_bUseShm) ++ { ++ if( m_pCompositionSurface != NULL ) ++ retVal = ShmHelp::DetachSharedRegion(&m_pCompositionSurface, &m_shmInfo); ++ if( retVal==HXR_OK ) ++ { ++ retVal = ShmHelp::CreateSharedRegion( nSize, ++ &m_pCompositionSurface, ++ &m_nShmId, ++ &m_shmInfo ++ ); ++ ++ } ++ if( retVal != HXR_OK ) ++ { ++ m_bCompositionSurfaceCreated = FALSE; ++ m_nCompositionSize = 0; ++ m_bUseShm = FALSE; ++ } ++ else ++ { ++ //It all worked ++ m_nCompositionSize = nSize; ++ m_bCompositionSurfaceCreated = TRUE; ++ return retVal; ++ } ++ ++ } ++ ++ //We need to fall through here so that if the shared memory stuff ++ //above fails we can create it the old fashioned way. ++ if(m_pCompositionSurface == NULL) ++ { ++ m_pCompositionSurface = (UCHAR*) malloc(nSize); ++ } ++ else ++ { ++ m_pCompositionSurface = (UCHAR*) realloc(m_pCompositionSurface, nSize); ++ } ++ if( m_pCompositionSurface ) ++ { ++ m_nCompositionSize = nSize; ++ } ++ else ++ { ++ HX_ASSERT("We can't alloc the composition surface." == NULL ); ++ m_nCompositionSize = 0; ++ } ++ ++ return retVal; ++} ++ ++HX_RESULT CExRootSurf::_DebugBlt( UCHAR* pImageData, HXBitmapInfoHeader* pBitmapInfo, ++ HXxRect& rDestRect, HXxRect& rSrcRect) ++{ ++ HX_ASSERT( m_window ); ++ HX_ASSERT( m_pDisplay ); ++ HX_ASSERT( m_GC ); ++ XLockDisplay(m_pDisplay); ++ XSetForeground( m_pDisplay, m_GC, WhitePixel(m_pDisplay, 0 )); ++ XSetBackground( m_pDisplay, m_GC, BlackPixel(m_pDisplay, 0 )); ++ XSetLineAttributes(m_pDisplay, m_GC, 5, LineSolid, CapRound, JoinRound ); ++ XSetForeground( m_pDisplay, m_GC, WhitePixel(m_pDisplay, 0) ); ++ XFillRectangle( m_pDisplay, m_window, m_GC, ++ rDestRect.left, rDestRect.top, ++ rDestRect.right-rDestRect.left, ++ rDestRect.bottom-rDestRect.top ++ ); ++ XDrawRectangle( m_pDisplay, m_window, m_GC, ++ rDestRect.left, rDestRect.top, ++ rDestRect.right-rDestRect.left, ++ rDestRect.bottom-rDestRect.top ++ ); ++ XUnlockDisplay(m_pDisplay); ++ return HXR_OK; ++} ++ ++void CExRootSurf::_GetYUVScratchWidthHeight(UINT32* pWidth, UINT32* pHeight) ++{ ++ *pWidth = m_bmiYUVScratch.bmiHeader.biWidth; ++ *pHeight = m_bmiYUVScratch.bmiHeader.biHeight; ++} ++ ++XImage* CExRootSurf::_GetCompositionSurfaceDrawable() ++{ ++ return m_pXImage; ++} ++ ++ ++ ++//Not used except for XING..... ++void CExRootSurf::_CreateYUVScratchSurface(UINT32 width, UINT32 height) ++{ ++ //Remove old bits.... ++ HX_DELETE(m_pYUVScratchBits); ++ ++ //Clear BitmapInfo struct.... ++ memset(&m_bmiYUVScratch, 0, sizeof(HXBitmapInfo)); ++ int nResult = MakeBitmap( &m_bmiYUVScratch, ++ sizeof(m_bmiYUVScratch), ++ CID_YUY2, ++ width, ++ height, ++ NULL, ++ 0); ++ if( nResult ) ++ { ++ m_pYUVScratchBits = new UCHAR[m_bmiYUVScratch.bmiHeader.biSizeImage]; ++ m_nYUVScratchPitch = GetBitmapPitch(&m_bmiYUVScratch); ++ } ++} ++ ++ ++void CExRootSurf::_GetYUVScratchSurfacePointer(UCHAR** pYUVBits, INT32* YUVPitch) ++{ ++ *pYUVBits = m_pYUVScratchBits; ++ *YUVPitch = m_nYUVScratchPitch; ++} ++ ++HX_RESULT CExRootSurf::CreateScratchSurface( int nCompositionSurfaceCID, HXxSize* pSize) ++{ ++ //Remove old bits.... ++ HX_DELETE(m_pScratchBits); ++ ++ //Clear BitmapInfo struct.... ++ memset(&m_bmiScratch, 0, sizeof(HXBitmapInfo)); ++ int nResult = MakeBitmap( &m_bmiScratch, ++ sizeof(m_bmiScratch), ++ nCompositionSurfaceCID, ++ pSize->cx, ++ pSize->cy, ++ NULL, ++ 0); ++ if( nResult ) ++ { ++ m_pScratchBits = new UCHAR[m_bmiScratch.bmiHeader.biSizeImage]; ++ m_nScratchPitch = GetBitmapPitch(&m_bmiScratch); ++ } ++ ++ return nResult? HXR_OK : HXR_FAIL; ++} ++ ++HX_RESULT CExRootSurf::ScratchLock(UCHAR** pBits, INT32* pPitch) ++{ ++ *pBits = m_pScratchBits; ++ *pPitch = m_nScratchPitch; ++ return HXR_OK; ++} ++ ++HX_RESULT CExRootSurf::ScratchUnlock(UCHAR* pBits) ++{ ++ return HXR_OK; ++} ++ ++HX_RESULT CExRootSurf::_MinimalUnlock(HXxWindow* pWindow) ++{ ++// Window win = m_window; ++// HX_ASSERT(win); ++// HXxSize hxxSize; ++// m_pSite->GetSize(hxxSize); ++ ++// if (m_bUseShm) ++// { ++// XShmPutImage(m_pDisplay, ++// win, ++// m_GC, ++// m_pXImage, ++// 0, ++// 0, ++// 0, ++// 0, ++// hxxSize.cx, ++// hxxSize.cy, ++// False ++// ); ++// } ++// else ++// { ++// XPutImage(m_pDisplay, ++// win, ++// m_GC, ++// m_pXImage, ++// 0, ++// 0, ++// 0, ++// 0, ++// hxxSize.cx, ++// hxxSize.cy ++// ); ++// } ++ return HXR_OK; ++} ++ ++HX_RESULT CExRootSurf::_LockComposition(UCHAR** pBits, INT32* pPitch) ++{ ++ HX_RESULT retVal = HXR_OK; ++ if( !m_bCompositionSurfaceCreated || m_pCompositionSurface==NULL ) ++ { ++ retVal = _CreateCompositionSurface(); ++ } ++ HX_ASSERT( m_pCompositionSurface ); ++ *pBits = m_pCompositionSurface; ++ *pPitch = m_nCompositionPitch; ++ return HXR_OK; ++} ++ ++ ++void CExRootSurf::_BltFromScratchToComposition( HXxRect& rDestRect, HXxRect& rSrcRect) ++{ ++ HX_ASSERT( "Not implemented on unix yet...."==NULL ); ++} ++ ++HX_RESULT CExRootSurf::_CreateCompositionSurface() ++{ ++ HX_RESULT retVal = HXR_FAIL; ++ ++ if(m_bCompositionSurfaceCreated) ++ { ++ return HXR_OK; ++ } ++ ++ HX_ASSERT( !m_bCompositionSurfaceCreated ); ++ HX_ASSERT( m_pSite ); ++ ++ //Create a BMI to describe the composition surface ++ HXxSize hxxSize; ++ m_pSite->GetSize(hxxSize); ++ memcpy(&m_compositionSize, &hxxSize, sizeof(HXxSize)); /* Flawfinder: ignore */ ++ ++ // find out how big we want to allocate. ++ if (m_pSite->IsFullScreen()) ++ { ++ UINT16 unDummy=0; ++ UINT16 unHorzRes=0; ++ UINT16 unVertRes=0; ++ m_pSite->_GetDeviceCaps(NULL, unDummy, unHorzRes, unVertRes ); ++ m_allocatedCompositionSize.cx = unHorzRes; ++ m_allocatedCompositionSize.cy = unVertRes; ++ } ++ else ++ { ++ // we use root surface for BASIC_BLT and it assumes the offset(position) ++ // of the root site it cooresponding to is (0, 0). ++ // ++ // this is not true for "windowless" mode where the root site can be given ++ // an offset, as a result, we fail to blt the video. ++ // ++ // to fix this, we'll take the m_positionOrg into consideration when ++ // creating the composition surface, this may not be optimal but good enough ++ // for now. ++ // ++ // similar logic is also added for other platforms, we need to move this ++ // common code to the base class when we have chance to clean it up ++ if (m_compositionSize.cx && m_compositionSize.cy) ++ { ++ m_compositionSize.cx += m_pSite->m_positionOrig.x; ++ m_compositionSize.cy += m_pSite->m_positionOrig.y; ++ } ++ ++ m_allocatedCompositionSize.cx = m_compositionSize.cx; ++ m_allocatedCompositionSize.cy = m_compositionSize.cy; ++ } ++ ++ //XXXgfw uhhhh, OK. ++ if( m_compositionSize.cx > m_allocatedCompositionSize.cx || ++ m_compositionSize.cy > m_allocatedCompositionSize.cy ) ++ { ++ m_allocatedCompositionSize.cx = m_compositionSize.cx; ++ m_allocatedCompositionSize.cy = m_compositionSize.cy; ++ } ++ ++ //Make the bitmap header struct. ++ m_bmiComposition.bmiHeader.biBitCount = m_bmiSave.bmiHeader.biBitCount; ++ m_bmiComposition.bmiHeader.biCompression = m_bmiSave.bmiHeader.biCompression; ++ m_bmiComposition.un.dwBitMask[0] = m_bmiSave.un.dwBitMask[0]; ++ m_bmiComposition.un.dwBitMask[1] = m_bmiSave.un.dwBitMask[1]; ++ m_bmiComposition.un.dwBitMask[2] = m_bmiSave.un.dwBitMask[2]; ++ int nResult = MakeBitmap( &m_bmiComposition, ++ sizeof(m_bmiComposition), ++ m_nCompositionSurfaceCID, ++ m_allocatedCompositionSize.cx, ++ m_allocatedCompositionSize.cy, ++ NULL, ++ 0 ++ ); ++ m_bmiComposition.bmiHeader.biBitCount = m_bmiSave.bmiHeader.biBitCount; ++ m_bmiComposition.bmiHeader.biCompression = m_bmiSave.bmiHeader.biCompression; ++ m_bmiComposition.un.dwBitMask[0] = m_bmiSave.un.dwBitMask[0]; ++ m_bmiComposition.un.dwBitMask[1] = m_bmiSave.un.dwBitMask[1]; ++ m_bmiComposition.un.dwBitMask[2] = m_bmiSave.un.dwBitMask[2]; ++ ++ //Now create the bits.... ++ _ResizeVideoBuffer( m_bmiComposition.bmiHeader.biSizeImage ); ++ m_nCompositionPitch = GetBitmapPitch( &m_bmiComposition ); ++ ++ if( m_pXImage ) ++ { ++ XFree( m_pXImage ); ++ } ++ ++ if( m_bUseShm ) ++ { ++ XLockDisplay(m_pDisplay); ++ m_pXImage = XShmCreateImage( m_pDisplay, ++ m_pVisual, ++ m_unDepth, ++ ZPixmap, ++ (char*)m_pCompositionSurface, ++ &m_shmInfo, ++ m_allocatedCompositionSize.cx, ++ m_allocatedCompositionSize.cy ++ ); ++ XUnlockDisplay(m_pDisplay); ++ } ++ else ++ { ++ XLockDisplay(m_pDisplay); ++ m_pXImage = XCreateImage( m_pDisplay, ++ m_pVisual, ++ m_unDepth, ++ ZPixmap, ++ 0, ++ (char*)m_pCompositionSurface, ++ m_allocatedCompositionSize.cx, ++ m_allocatedCompositionSize.cy, ++ 32, ++ 0); ++ XUnlockDisplay(m_pDisplay); ++ } ++ ++ if( m_pXImage ) ++ { ++ m_bCompositionSurfaceCreated = TRUE; ++#ifdef _BIG_ENDIAN ++ m_pXImage->byte_order = MSBFirst; ++#else ++ m_pXImage->byte_order = LSBFirst; ++#endif ++ retVal = HXR_OK; ++ } ++ return retVal; ++} ++ ++void CExRootSurf::_MinimalBlt(HXxRect& destRect) ++{ ++ if (m_on_new_frame_cb) ++ { ++ PlayerImgInfo Info; ++ Info.Rect.left = destRect.left; ++ Info.Rect.right = destRect.right; ++ Info.Rect.top = destRect.top; ++ Info.Rect.bottom = destRect.bottom; ++ Info.cx = m_allocatedCompositionSize.cx; ++ Info.cy = m_allocatedCompositionSize.cy; ++ m_on_new_frame_cb(m_pCompositionSurface, ++ m_bmiComposition.bmiHeader.biSizeImage, ++ &Info, ++ m_context); ++ } ++} ++ ++HX_RESULT CExRootSurf::_DestroyCompositionSurface() ++{ ++ HX_RESULT retVal = HXR_OK; ++ if( m_bCompositionSurfaceCreated ) ++ { ++ if( m_pXImage ) ++ { ++ XFree(m_pXImage); ++ m_pXImage = NULL; ++ } ++ m_bCompositionSurfaceCreated = FALSE; ++ } ++ ++ return retVal; ++} ++ ++ ++ ++HX_RESULT CExRootSurf::BeginOptimizedBlt(HXBitmapInfoHeader* pBitmapInfo) ++{ ++#ifdef _DEBUG ++ fprintf(stderr, "CExRootSurf::BeginOptimizedBlt Needs to be written\n" ); ++#endif ++ return HXR_NOTIMPL; ++} ++ ++HX_RESULT CExRootSurf::OptimizedBlt( UCHAR* pImageBits, ++ HXxRect& rDestRect, ++ HXxRect& rSrcRect) ++{ ++#ifdef _DEBUG ++ fprintf(stderr, "CExRootSurf::OptimizedBlt Needs to be written\n" ); ++#endif ++ return HXR_NOTIMPL; ++} ++ ++HX_RESULT CExRootSurf::EndOptimizedBlt(void) ++{ ++#ifdef _DEBUG ++ fprintf(stderr, "CExRootSurf::EndOptimizedBlt Needs to be written\n" ); ++#endif ++ return HXR_NOTIMPL; ++} ++ ++HX_RESULT CExRootSurf::GetOptimizedFormat(HX_COMPRESSION_TYPE& ulType) ++{ ++#ifdef _DEBUG ++ fprintf(stderr, "CExRootSurf::GetOptimizedFormat Needs to be written\n" ); ++#endif ++ return HXR_NOTIMPL; ++} ++ ++HX_RESULT CExRootSurf::GetPreferredFormat(HX_COMPRESSION_TYPE& ulType) ++{ ++#ifdef _DEBUG ++ fprintf(stderr, "CExRootSurf::GetPreferredFormat Needs to be written\n" ); ++#endif ++ return HXR_NOTIMPL; ++} ++ ++GC CExRootSurf::GetGC() ++{ ++ return m_GC; ++} +Index: helix-libs/clientapps/clutter/exroot.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exroot.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,155 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Source last modified: $Id: unixroot.h,v 1.8 2007/07/06 20:54:05 jfinnecy Exp $ ++ * ++ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, ++ * are subject to the current version of the RealNetworks Public ++ * Source License (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the current version of the RealNetworks Community ++ * Source License (the "RCSL") available at ++ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL ++ * will apply. You may also obtain the license terms directly from ++ * RealNetworks. You may not use this file except in compliance with ++ * the RPSL or, if you have a valid RCSL with RealNetworks applicable ++ * to this file, the RCSL. Please see the applicable RPSL or RCSL for ++ * the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License Version 2 (the ++ * "GPL") in which case the provisions of the GPL are applicable ++ * instead of those above. If you wish to allow use of your version of ++ * this file only under the terms of the GPL, and not to allow others ++ * to use your version of this file under the terms of either the RPSL ++ * or RCSL, indicate your decision by deleting the provisions above ++ * and replace them with the notice and other provisions required by ++ * the GPL. If you do not delete the provisions above, a recipient may ++ * use your version of this file under the terms of any one of the ++ * RPSL, the RCSL or the GPL. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the ++ * portions it created. ++ * ++ * This file, and the files included with this file, is distributed ++ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY ++ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ++ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ++ * ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _UNIXROOT_H ++#define _UNIXROOT_H ++ ++#include "baseroot.h" ++#if defined(USE_XWINDOWS) ++#include ++#include ++#include ++#include ++#include ++#include ++#endif ++ ++#include "player.h" ++ ++class CExRootSurf : public CBaseRootSurface ++{ ++public: ++ CExRootSurf(IUnknown* pContext, CHXBaseSite* pSite, on_new_frame_cb_t on_new_frame_cb = NULL, void *context = NULL); ++ ++ //Helpers.... ++ HX_RESULT Init(); ++ GC GetGC(); ++ ++ //public inherited stuff ++ virtual HX_RESULT CreateScratchSurface(int nCompositionSurfaceCID, ++ HXxSize* pSize); ++ virtual HX_RESULT ScratchLock(UCHAR** pBits, INT32* pPitch); ++ virtual HX_RESULT ScratchUnlock(UCHAR* pBits); ++ ++ virtual HX_RESULT BeginOptimizedBlt(HXBitmapInfoHeader* pBitmapInfo); ++ virtual HX_RESULT OptimizedBlt( UCHAR* pImageBits, ++ HXxRect& rDestRect, ++ HXxRect& rSrcRect); ++ virtual HX_RESULT EndOptimizedBlt(void); ++ virtual HX_RESULT GetOptimizedFormat(HX_COMPRESSION_TYPE& ulType); ++ virtual HX_RESULT GetPreferredFormat(HX_COMPRESSION_TYPE& ulType); ++ ++ XImage* _GetCompositionSurfaceDrawable(); ++ ++ //Shared Memory helper func for the basesurf to use. ++// HX_RESULT _DetachSharedRegion(); ++// HX_RESULT _CreateSharedRegion(INT32 nSize); ++ ++protected: ++ ++ //Smartly handle resizing of shm buffer. ++ HX_RESULT _ResizeVideoBuffer(INT32 nSize); ++ ++ //Inherited from CBaseRootSurface.... ++ virtual void _BltFromScratchToComposition(HXxRect& rDestRect, ++ HXxRect& rSrcRect); ++ virtual HX_RESULT _DebugBlt( UCHAR* pImageData, ++ HXBitmapInfoHeader* pBitmapInfo, ++ HXxRect& rDestRect, ++ HXxRect& rSrcRect); ++ virtual void _GetYUVScratchWidthHeight(UINT32* pWidth, UINT32* pHeight); ++ virtual void _CreateYUVScratchSurface(UINT32 width, UINT32 height); ++ virtual void _GetYUVScratchSurfacePointer(UCHAR** pYUVBits, INT32* YUVPitch); ++ virtual HX_RESULT _MinimalUnlock(HXxWindow* pWindow); ++ virtual HX_RESULT _LockComposition(UCHAR** pBits, INT32* pPitch); ++ virtual HX_RESULT _CreateCompositionSurface(); ++ virtual HX_RESULT _DestroyCompositionSurface(); ++ virtual void _MinimalBlt(HXxRect& dest); ++ ++ ++private: ++ ++ virtual ~CExRootSurf(); ++ ++ //Protect unintentional copy and default ctors. ++ CExRootSurf(); ++ CExRootSurf( const CExRootSurf& ); ++ CExRootSurf& operator=( const CExRootSurf& it ); ++ ++ //Shared memory members. ++ HXBOOL m_bUseShm; ++ XShmSegmentInfo m_shmInfo; ++ int m_nShmId; ++ ++ //General display and GC stuff. ++ Display* m_pDisplay; ++ GC m_GC; ++ int m_nScreenNumber; ++ XImage* m_pXImage; ++ Window m_window; ++ Visual* m_pVisual; ++ unsigned int m_unDepth; ++ Screen* m_pScreen; ++ Colormap m_colormap; ++ int m_nBitsPerPixel; ++ ++ //Bitmap stuff. ++ UCHAR* m_pYUVScratchBits; ++ HXBitmapInfo m_bmiYUVScratch; ++ int m_nYUVScratchPitch; ++ UCHAR* m_pScratchBits; ++ HXBitmapInfo m_bmiScratch; ++ int m_nScratchPitch; ++ HXBitmapInfo m_bmiSave; ++ ULONG32 m_nCompositionSize; ++ on_new_frame_cb_t m_on_new_frame_cb; ++ void * m_context; ++}; ++ ++#endif +Index: helix-libs/clientapps/clutter/exsite.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exsite.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,2915 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Source last modified: $Id: unixsite.cpp,v 1.18.2.6 2008/06/05 14:24:30 lovish Exp $ ++ * ++ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, ++ * are subject to the current version of the RealNetworks Public ++ * Source License (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the current version of the RealNetworks Community ++ * Source License (the "RCSL") available at ++ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL ++ * will apply. You may also obtain the license terms directly from ++ * RealNetworks. You may not use this file except in compliance with ++ * the RPSL or, if you have a valid RCSL with RealNetworks applicable ++ * to this file, the RCSL. Please see the applicable RPSL or RCSL for ++ * the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License Version 2 (the ++ * "GPL") in which case the provisions of the GPL are applicable ++ * instead of those above. If you wish to allow use of your version of ++ * this file only under the terms of the GPL, and not to allow others ++ * to use your version of this file under the terms of either the RPSL ++ * or RCSL, indicate your decision by deleting the provisions above ++ * and replace them with the notice and other provisions required by ++ * the GPL. If you do not delete the provisions above, a recipient may ++ * use your version of this file under the terms of any one of the ++ * RPSL, the RCSL or the GPL. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the ++ * portions it created. ++ * ++ * This file, and the files included with this file, is distributed ++ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY ++ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ++ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ++ * ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * Phil Dibowitz ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _UNIX ++#error This is the UNIX platform specific implementation. ++#endif ++ ++// ++// System includes... ++// ++#include ++#include "hlxclib/string.h" ++#if defined(USE_XWINDOWS) ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#endif ++ ++ ++// ++// RMA includes... ++// ++#include "hxcom.h" ++#include "hxcore.h" ++#include "hxevent.h" ++#include "hxwintyp.h" ++#include "hxwin.h" ++#include "hxsite2.h" ++#include "hxtypes.h" ++#include "exsite.h" ++#include "unixcmap.h" ++#include "visuals.h" ++#include "region.h" ++#include "basesurf.h" ++#include "exroot.h" ++#include "hxthread.h" ++#include "hxtick.h" ++#include "sitetext.h" ++ ++#include "unixsurf.h" ++ ++#include "hxprefs.h" ++ ++// ++// Global & Static global/member data.... ++// ++Display *CHXExSite::zm_display = NULL; ++static CHXMapPtrToPtr z_mapSiteToWindow; ++ ++// ++// Scroll bar support ++// ++#define SCROLL_BAR_WIDTH 13 //Width of scroll bar. ++//#define _ARROWS_SIDE_BY_SIDE 1 //Regular or side by side arrows? ++ ++ ++ ++ ++// ++// CHXExSite only Methods... ++// ++CHXExSite::CHXExSite( IUnknown* pContext, IUnknown* pUnkOuter, INT32 lInitialZorder, on_new_frame_cb_t on_new_frame_cb, void *context) ++ : CHXBaseSite( pContext, pUnkOuter, lInitialZorder ) ++ , m_pUnixEventHandler(NULL) ++ , m_ScrollHorizButtonL(0) ++ , m_ScrollHorizButtonR(0) ++ , m_ScrollVertButtonT(0) ++ , m_ScrollVertButtonB(0) ++ , m_winFullScreenWindow(0) ++ , m_winOldParent(0) ++ , m_bScrollingInProgress(FALSE) ++ , m_nScrollDir(0) ++ , m_bLastPointInSite(FALSE) ++ , m_bDamaged(FALSE) ++ , m_bIgnoreFocusOutInFS(FALSE) ++ , m_bReparent(FALSE) ++ , m_on_new_frame_cb(on_new_frame_cb) ++ , m_context(context) ++#if defined(HELIX_CONFIG_MOBLIN) ++ , m_pAttachWindowCallback(NULL) ++ , m_pForceRedrawCallback(NULL) ++#endif ++{ ++ m_ptScrollVertPosT.x = m_ptScrollVertPosT.y = 0; ++ m_ptScrollVertPosB.x = m_ptScrollVertPosB.y = 0; ++ m_ptScrollHorizPosR.x = m_ptScrollHorizPosR.y = 0; ++ m_ptScrollHorizPosL.x = m_ptScrollHorizPosL.y = 0; ++ m_ptFullScreenOffset.x = m_ptFullScreenOffset.y = 0; ++ memset( &m_PreFullScreenSize, 0, sizeof( m_PreFullScreenSize ) ); ++ ++ HX_ASSERT( m_pContext ); ++ ++ /* Replace m_pVideoSurface with my own */ ++/* HX_RELEASE(m_pVideoSurface); ++ m_pVideoSurface = new CUnixSurf(m_pContext, this); ++ HX_ASSERT( m_pVideoSurface ); ++ m_pVideoSurface->InitSurface(m_pContext); ++ m_pVideoSurface->AddRef(); ++*/ ++ IHXPreferences* pPreferences = NULL; ++ if( m_pContext && HXR_OK == m_pContext->QueryInterface( IID_IHXPreferences, (void **) &pPreferences)) ++ { ++ IHXBuffer *pBuffer = NULL; ++ pPreferences->ReadPref("IgnoreFocusOutInFS", pBuffer); ++ if(pBuffer) ++ { ++ m_bIgnoreFocusOutInFS = (::atoi((const char*)pBuffer->GetBuffer()) == 1); ++ HX_RELEASE(pBuffer); ++ } ++ } ++} ++ ++CHXExSite::~CHXExSite() ++{ ++#if defined(HELIX_CONFIG_MOBLIN) ++ RemovePendingCallback(m_pAttachWindowCallback); ++ HX_RELEASE(m_pAttachWindowCallback); ++ ++ RemovePendingCallback(m_pForceRedrawCallback); ++ HX_RELEASE(m_pForceRedrawCallback); ++#endif ++ void* pDummy; ++ if (z_mapSiteToWindow.Lookup((void*)this, pDummy)) ++ { ++ z_mapSiteToWindow.RemoveKey((void*)this); ++ } ++ ++ if( m_pUnixEventHandler ) ++ { ++ m_pUnixEventHandler->CancelCallback(); ++ HX_RELEASE(m_pUnixEventHandler); ++ } ++} ++ ++HX_RESULT CHXExSite::_OpenXDisplay(char* pszDisplayString) ++{ ++ HX_RESULT retVal = HXR_OK; ++ ++ //Is the connection open already? ++ if( NULL==zm_display ) ++ { ++ zm_display = XOpenDisplay(pszDisplayString); ++ ++ //If you can't open the display your done. ++ if(NULL == zm_display ) ++ { ++ HX_ASSERT("Can't open X Display..."==NULL); ++ retVal = HXR_FAIL; ++ } ++ else ++ { ++ HX_ASSERT(m_pScheduler); ++ if( m_pScheduler ) ++ { ++ //UnixEventHandler scheduls itself for init callback ++ //in the ctor. ++ m_pUnixEventHandler = new UnixEventHandler(this); ++ m_pUnixEventHandler->AddRef(); ++ } ++ } ++ } ++ return retVal; ++} ++ ++Window CHXExSite::CreateXWindow( Window win ) ++{ ++ Window parentWindow; ++ HXxWindow* pWindow = NULL; ++ //If parentWin is NULL then we belong to the root window. ++ if( win ) ++ { ++ parentWindow = win; ++ } ++ else ++ { ++ HX_ASSERT(zm_display); ++ XLockDisplay(zm_display); ++ parentWindow = RootWindow(zm_display, DefaultScreen(zm_display)); ++ XUnlockDisplay(zm_display); ++ } ++ ++ //Find the best visual to use on this display. ++ Visual* visual = GetBestVisual(zm_display); ++ ++ //Get the visual info. ++ int nNotUsed=0; ++ XVisualInfo stVisInfo; ++ ++ memset(&stVisInfo, 0, sizeof(XVisualInfo)); ++ stVisInfo.visualid = XVisualIDFromVisual(visual); ++ XLockDisplay(zm_display); ++ XVisualInfo* pVisual = XGetVisualInfo( zm_display, ++ VisualIDMask, ++ &stVisInfo, ++ &nNotUsed ); ++ XUnlockDisplay(zm_display); ++ ++ // Set up attributes of the window. ++ int attrMask = CWBackPixel | CWBorderPixel; ++ XSetWindowAttributes attr; ++ ++ memset(&attr, 0, sizeof(XSetWindowAttributes)); ++ XLockDisplay(zm_display); ++ attr.background_pixel = BlackPixel(zm_display, DefaultScreen(zm_display)); ++ attr.border_pixel = BlackPixel(zm_display, DefaultScreen(zm_display)); ++ XUnlockDisplay(zm_display); ++ ++ //See if the default visaul of hte screen is the same one we Want ++ //to use. If not, create a new one and install it. ++ Colormap cmap; ++ XLockDisplay(zm_display); ++ Visual* defVisual = DefaultVisual(zm_display, DefaultScreen(zm_display)); ++ XUnlockDisplay(zm_display); ++ if( defVisual->visualid != stVisInfo.visualid ) ++ { ++ //XXXgfw Are we leaking this colormap???? ++ XLockDisplay(zm_display); ++ cmap = XCreateColormap(zm_display, parentWindow, visual, AllocNone); ++ XUnlockDisplay(zm_display); ++ attr.colormap = cmap; ++ attrMask |= CWColormap; ++ } ++ ++ // Set the size/position of the window before creating. ++ XSizeHints size_hints; ++ ++ size_hints.flags = PPosition | PSize; ++ size_hints.x = m_position.x; ++ size_hints.y = m_position.y; ++ size_hints.width = 1; ++ size_hints.height = 1; ++ ++ //Create it. ++ XLockDisplay(zm_display); ++ Window window = XCreateWindow(zm_display, ++ parentWindow, ++ size_hints.x, ++ size_hints.y, ++ size_hints.width, ++ size_hints.height, ++ 0, ++ pVisual->depth, ++ InputOutput, ++ visual, ++ attrMask, ++ &attr); ++ XUnlockDisplay(zm_display); ++ XFree(pVisual); ++ ++ //Tell the WM about this window. ++#if 0 ++ XSetStandardProperties( zm_display, ++ window, ++ "CHXExSite", ++ "CHXExSite", ++ None, ++ NULL, 0, ++ &size_hints ++ ); ++#endif ++ ++ //Select all input events on the window since the other platforms ++ //we work with have no concept of event masks ++ XLockDisplay(zm_display); ++#if 0 ++ int result = XSelectInput( zm_display, window, ++ ButtonPressMask | ButtonReleaseMask | KeyPressMask | ++ KeyReleaseMask | EnterWindowMask | LeaveWindowMask | ++ PointerMotionMask | ButtonMotionMask | KeymapStateMask | ++ ExposureMask | StructureNotifyMask | FocusChangeMask ++ ); ++#else ++ int result = XSelectInput( zm_display, window, 0 ); ++ ++ ++#endif ++ XUnlockDisplay(zm_display); ++ if( BadWindow == result ) ++ { ++#ifdef _DEBUG ++ fprintf( stderr, "Can select events.\n" ); ++#endif ++ } ++ ++ //Map the window. ++ XLockDisplay(zm_display); ++ /* XMapWindow(zm_display, window); */ ++ ++ //Flush event queue. ++ XFlush(zm_display); ++ XUnlockDisplay(zm_display); ++ ++ ++ return window; ++} ++ ++void CHXExSite::_MapHorzScroll() ++{ ++#if 0 ++ if( GetWindow() && GetWindow()->display && m_ScrollHorizButtonL) ++ { ++ Display* pDis = (Display*)GetWindow()->display; ++ XLockDisplay(pDis); ++ XMapWindow( pDis, m_ScrollHorizButtonL ); ++ XMapWindow( pDis, m_ScrollHorizButtonR ); ++ XUnlockDisplay(pDis); ++ } ++ _DrawArrows(); ++#endif ++} ++ ++void CHXExSite::_MapVertScroll() ++{ ++#if 0 ++ if( GetWindow() && GetWindow()->display && m_ScrollVertButtonT) ++ { ++ Display* pDis = (Display*)GetWindow()->display; ++ XLockDisplay(pDis); ++ XMapWindow( pDis, m_ScrollVertButtonT ); ++ XMapWindow( pDis, m_ScrollVertButtonB ); ++ XUnlockDisplay(pDis); ++ } ++ _DrawArrows(); ++#endif ++} ++ ++void CHXExSite::_MapScrollButtons() ++{ ++#if 0 ++ _MapHorzScroll(); ++ _MapVertScroll(); ++#endif ++} ++ ++void CHXExSite::_UnmapHorzScroll() ++{ ++#if 0 ++ HX_ASSERT( GetWindow() ); ++ if( m_ScrollHorizButtonL && GetWindow()->display ) ++ { ++ Display* pDis = (Display*)GetWindow()->display; ++ XLockDisplay(pDis); ++ XUnmapWindow( pDis, m_ScrollHorizButtonL ); ++ XUnmapWindow( pDis, m_ScrollHorizButtonR ); ++ XUnlockDisplay(pDis); ++ } ++#endif ++} ++void CHXExSite::_UnmapVertScroll() ++{ ++#if 0 ++ HX_ASSERT( GetWindow() ); ++ if( m_ScrollVertButtonT && GetWindow()->display ) ++ { ++ Display* pDis = (Display*)GetWindow()->display; ++ XLockDisplay(pDis); ++ XUnmapWindow( pDis, m_ScrollVertButtonT ); ++ XUnmapWindow( pDis, m_ScrollVertButtonB ); ++ XUnlockDisplay(pDis); ++ } ++#endif ++} ++ ++void CHXExSite::_UnmapScrollButtons() ++{ ++#if 0 ++ if( GetWindow() ) ++ { ++ _UnmapVertScroll(); ++ _UnmapHorzScroll(); ++ } ++#endif ++} ++ ++void CHXExSite::_DestroyScrollButtons() ++{ ++ HXxWindow* pWin = GetWindow(); ++ Display* pDis = (Display*)(pWin?pWin->display:NULL); ++ ++ if( m_ScrollHorizButtonL && pDis ) ++ { ++ XLockDisplay(pDis); ++ XDestroyWindow( pDis, m_ScrollHorizButtonL ); ++ m_ScrollHorizButtonL = 0; ++ XDestroyWindow( pDis, m_ScrollHorizButtonR ); ++ XUnlockDisplay(pDis); ++ m_ScrollHorizButtonR = 0; ++ } ++ ++ if( m_ScrollVertButtonT && pDis) ++ { ++ XLockDisplay(pDis); ++ XDestroyWindow( pDis, m_ScrollVertButtonT ); ++ m_ScrollVertButtonT = 0; ++ XDestroyWindow( pDis, m_ScrollVertButtonB ); ++ XUnlockDisplay(pDis); ++ m_ScrollVertButtonB = 0; ++ } ++ m_ptScrollVertPosT.x = m_ptScrollVertPosT.y = 0; ++ m_ptScrollVertPosB.x = m_ptScrollVertPosB.y = 0; ++ m_ptScrollHorizPosR.x = m_ptScrollHorizPosR.y = 0; ++ m_ptScrollHorizPosL.x = m_ptScrollHorizPosL.y = 0; ++} ++ ++void CHXExSite::_DrawArrows() ++{ ++#if 0 //Paul Debug ++ //only do the work if our site is visible. ++ if( !IsSiteVisible() ) ++ return; ++ ++ //Draw an arrow on this window. ++ XPoint points[4]; ++ int offset = SCROLL_BAR_WIDTH/10; ++ GC tmpGC; ++ XGCValues values; ++ Display* dis = (Display*)GetWindow()->display; ++ ++ if( m_ScrollVertButtonB ) ++ { ++ XLockDisplay(dis); ++ tmpGC = XCreateGC( dis, m_ScrollVertButtonB, 0, &values ); ++ XUnlockDisplay(dis); ++ } ++ else if( m_ScrollHorizButtonL ) ++ { ++ XLockDisplay(dis); ++ tmpGC = XCreateGC( dis, m_ScrollHorizButtonL, 0, &values ); ++ XUnlockDisplay(dis); ++ } ++ else ++ { ++ //We don't have any scroll bars to draw.... ++ return; ++ } ++ ++ ++ XLockDisplay(dis); ++ XSetForeground( dis, tmpGC, WhitePixel(dis, 0 )); ++ XSetBackground( dis, tmpGC, BlackPixel(dis, 0 )); ++ XUnlockDisplay(dis); ++ Colormap cmap = HXGetXColormap((Display*)GetWindow()->display, ++ (Window)GetWindow()->window); ++ XColor color; ++ ++ memset(&color, 0, sizeof(XColor)); ++ XLockDisplay(dis); ++ XParseColor(dis, cmap, "blue", &color); ++ XUnlockDisplay(dis); ++ HXFindBestXColor(dis, cmap, &color); ++ XLockDisplay(dis); ++ XSetForeground( dis, tmpGC, color.pixel); ++ XSetLineAttributes(dis, tmpGC, 1, LineSolid, CapRound, JoinRound ); ++ XUnlockDisplay(dis); ++ ++ ++ //Draw up Vertical arrow. ++ if( m_ScrollVertButtonT ) ++ { ++ points[0].x = offset; ++ points[0].y = SCROLL_BAR_WIDTH-offset; ++ points[1].x = SCROLL_BAR_WIDTH/2; ++ points[1].y = offset; ++ points[2].x = SCROLL_BAR_WIDTH-offset; ++ points[2].y = SCROLL_BAR_WIDTH-offset; ++ points[3].x = points[0].x; ++ points[3].y = points[0].y; ++ XLockDisplay(dis); ++ XFillPolygon( dis, m_ScrollVertButtonT, tmpGC, points, 4, Convex, CoordModeOrigin); ++ XUnlockDisplay(dis); ++ } ++ ++ //Draw down Vertical arrow. ++ if( m_ScrollVertButtonB ) ++ { ++ points[0].x = offset; ++ points[0].y = offset; ++ points[1].x = SCROLL_BAR_WIDTH-offset; ++ points[1].y = offset; ++ points[2].x = SCROLL_BAR_WIDTH/2; ++ points[2].y = SCROLL_BAR_WIDTH-offset; ++ points[3].x = points[0].x; ++ points[3].y = points[0].y; ++ XLockDisplay(dis); ++ XFillPolygon( dis, m_ScrollVertButtonB, tmpGC, points, 4, Convex, CoordModeOrigin); ++ XUnlockDisplay(dis); ++ } ++ ++ //Draw Left Horizontal arrow. ++ if( m_ScrollHorizButtonL ) ++ { ++ points[0].x = SCROLL_BAR_WIDTH-offset; ++ points[0].y = offset; ++ points[1].x = SCROLL_BAR_WIDTH-offset; ++ points[1].y = SCROLL_BAR_WIDTH-offset; ++ points[2].x = offset; ++ points[2].y = SCROLL_BAR_WIDTH/2; ++ points[3].x = points[0].x; ++ points[3].y = points[0].y; ++ XLockDisplay(dis); ++ XFillPolygon( dis, m_ScrollHorizButtonL, tmpGC, points, 4, Convex, CoordModeOrigin); ++ XUnlockDisplay(dis); ++ } ++ ++ //Draw Right Horizontal arrow. ++ if( m_ScrollHorizButtonR ) ++ { ++ points[0].x = offset; ++ points[0].y = SCROLL_BAR_WIDTH-offset; ++ points[1].x = offset; ++ points[1].y = offset; ++ points[2].x = SCROLL_BAR_WIDTH-offset; ++ points[2].y = SCROLL_BAR_WIDTH/2; ++ points[3].x = points[0].x; ++ points[3].y = points[0].y; ++ XLockDisplay(dis); ++ XFillPolygon( dis, m_ScrollHorizButtonR, tmpGC, points, 4, Convex, CoordModeOrigin); ++ XUnlockDisplay(dis); ++ } ++ ++ //Free the GC and go. ++ XLockDisplay(dis); ++ XFreeGC( dis, tmpGC ); ++ XUnlockDisplay(dis); ++#endif ++} ++ ++HXBOOL CHXExSite::_InButton( HXxPoint& pt, int x, int y ) ++{ ++ HXBOOL retVal =FALSE; ++ if( x>= pt.x && x< pt.x+SCROLL_BAR_WIDTH && y>=pt.y && yGetWindow(); ++ } ++ if(pParentWindow) ++ { ++ GetParentSite()->GetSize(mySize); ++ } ++ ++ HX_ASSERT( pParentWindow ); ++ HX_ASSERT( pParentWindow->window != 0 ); ++ ++ if( m_ScrollVertButtonB ) ++ { ++ // if the other bar already exists, don't overlap it! ++ mySize.cx -= SCROLL_BAR_WIDTH; ++ } ++ ++ m_ptScrollHorizPosL.x = m_topleft.x; ++ m_ptScrollHorizPosL.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH; ++ ++#ifndef _ARROWS_SIDE_BY_SIDE ++ m_ptScrollHorizPosR.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH; ++#else ++ m_ptScrollHorizPosR.x = m_topleft.x+SCROLL_BAR_WIDTH; ++#endif ++ m_ptScrollHorizPosR.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH; ++ ++ Display* dis = (Display*)GetWindow()->display; ++ XLockDisplay(dis); ++ Pixel blackPixel = BlackPixel( dis, DefaultScreen(dis) ); ++ XUnlockDisplay(dis); ++ Pixel greyPixel = blackPixel; ++ ++ Colormap cmap = HXGetXColormap(dis, (Window)GetWindow()->window); ++ XColor color; ++ ++ XLockDisplay(dis); ++ XParseColor(dis, cmap, "gray", &color); ++ XUnlockDisplay(dis); ++ HXFindBestXColor(dis, cmap, &color); ++ greyPixel = color.pixel; ++ ++ XLockDisplay(dis); ++ m_ScrollHorizButtonL = XCreateSimpleWindow( dis, ++ (Window)pParentWindow->window, ++ m_ptScrollHorizPosL.x, m_ptScrollHorizPosL.y, ++ SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH, ++ 1, ++ blackPixel, ++ greyPixel ++ ); ++ m_ScrollHorizButtonR = XCreateSimpleWindow( dis, ++ (Window)pParentWindow->window, ++ m_ptScrollHorizPosR.x, m_ptScrollHorizPosR.y, ++ SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH, ++ 1, ++ blackPixel, ++ greyPixel ++ ); ++ XUnlockDisplay(dis); ++ HX_ASSERT( m_ScrollHorizButtonR && m_ScrollHorizButtonL ); ++ ++} ++ ++void CHXExSite::_CreateVertScrollBar() ++{ ++ HX_ASSERT( m_ScrollVertButtonB == 0 ); ++ HX_ASSERT( m_ScrollVertButtonT == 0 ); ++ ++ HXxSize mySize; ++ ++ HXxWindow* pParentWindow = NULL; ++ if(GetParentSite()) ++ { ++ pParentWindow = GetParentSite()->GetWindow(); ++ } ++ if(pParentWindow) ++ { ++ GetParentSite()->GetSize(mySize); ++ } ++ ++ HX_ASSERT( pParentWindow ); ++ HX_ASSERT( pParentWindow->window != 0 ); ++ ++ if( m_ScrollHorizButtonR ) ++ { ++ // if the other bar already exists, don't overlap it! ++ mySize.cy -= SCROLL_BAR_WIDTH; ++ } ++ ++ ++ m_ptScrollVertPosT.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH; ++ m_ptScrollVertPosT.y = m_topleft.y; ++ ++ m_ptScrollVertPosB.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH; ++#ifndef _ARROWS_SIDE_BY_SIDE ++ m_ptScrollVertPosB.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH; ++#else ++ m_ptScrollVertPosB.y = m_topleft.y+SCROLL_BAR_WIDTH; ++#endif ++ ++ Display* dis = (Display*)GetWindow()->display; ++ XLockDisplay(dis); ++ Pixel blackPixel = BlackPixel( dis, DefaultScreen(dis) ); ++ XUnlockDisplay(dis); ++ Pixel greyPixel = blackPixel; ++ Colormap cmap = HXGetXColormap((Display*)GetWindow()->display, ++ (Window)GetWindow()->window); ++ XColor color; ++ XLockDisplay(dis); ++ XParseColor(dis, cmap, "gray", &color); ++ XUnlockDisplay(dis); ++ HXFindBestXColor(dis, cmap, &color); ++ greyPixel = color.pixel; ++ ++ HX_ASSERT( GetWindow() ); ++ XLockDisplay(dis); ++ m_ScrollVertButtonT = XCreateSimpleWindow( dis, ++ (Window)pParentWindow->window, ++ m_ptScrollVertPosT.x, m_ptScrollVertPosT.y, ++ SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH, ++ 1, ++ blackPixel, ++ greyPixel ++ ); ++ m_ScrollVertButtonB = XCreateSimpleWindow( dis, ++ (Window)pParentWindow->window, ++ m_ptScrollVertPosB.x, m_ptScrollVertPosB.y, ++ SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH, ++ 1, ++ blackPixel, ++ greyPixel ++ ); ++ XUnlockDisplay(dis); ++ ++ HX_ASSERT( m_ScrollVertButtonB && m_ScrollVertButtonT ); ++ ++} ++ ++// ++// Inherited CHXBaseSite methods. ++// ++void CHXExSite::_NeedWindowedSite() ++{ ++#ifdef _DEBUG ++ fprintf( stderr, "CHXExSite::_NeedWindowedSite do something here....\n" ); ++#endif ++ //Nothing to do on unix.... ++} ++ ++void CHXExSite::_AttachWindow() ++{ ++#if 1 ++ void* pDummy=NULL; ++ ++ if (m_pRootSurface) ++ { /* Replace CUnixRootSurf with my own CExRootSurf */ ++ HX_RELEASE(m_pRootSurface); ++ m_pRootSurface = new CExRootSurf(m_pContext, this, m_on_new_frame_cb, m_context); ++ m_pRootSurface->AddRef(); ++ } ++ ++ if(!z_mapSiteToWindow.Lookup((void*)this, pDummy)) ++ { ++ z_mapSiteToWindow.SetAt((void*)this, (void*)m_pWindow); ++ } ++ ++ //Set the display variable. ++ if( m_pWindow->display == NULL ) ++ { ++ HX_ASSERT(zm_display); ++ m_pWindow->display = zm_display; ++ } ++ ++ //Now that we have a window be sure to init the CExRootSurf. ++ //this lets it set up the display, colormap, etc. ++ ((CExRootSurf*)m_pRootSurface)->Init(); ++#endif ++} ++ ++void CHXExSite::_DetachWindow() ++{ ++#if 1 ++ void* pDummy; ++ ++ if (z_mapSiteToWindow.Lookup((void*)this, pDummy)) ++ { ++ z_mapSiteToWindow.RemoveKey((void*)this); ++ } ++#endif ++} ++ ++void* CHXExSite::_Create(void* pParentWindow, UINT32 style) ++{ ++ HRESULT result = HXR_OK; ++ if( m_pWindow && m_pWindow->window ) ++ { ++ HX_ASSERT( "We already have created a window"==NULL); ++ return NULL; ++ } ++ ++ if (pParentWindow==NULL || style) ++ { ++ m_bIsChildWindow = FALSE; ++ } ++ else ++ { ++ m_bIsChildWindow = TRUE; ++ } ++ ++ if( _OpenXDisplay(NULL) != HXR_OK ) ++ { ++ return NULL; ++ } ++ return (void*)CreateXWindow((Window)pParentWindow); ++} ++ ++ ++void CHXExSite::_Destroy(HXxWindow* pWindow) ++{ ++ _DestroySliders(); ++ HXxWindow* pWin = GetWindow(); ++ Display* pDis = (Display*)(pWin?pWin->display:NULL); ++ if( pDis ) ++ { ++ XLockDisplay(pDis); ++ XDestroyWindow( pDis, (Window)pWindow->window ); ++ XUnlockDisplay(pDis); ++ } ++} ++ ++void CHXExSite::_SetSize(HXxSize size) ++{ ++ HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window); ++ //The scroll bars get resized also... ++ _DestroySliders(); ++ Display* pDis = (Display*)GetWindow()->display; ++ XLockDisplay(pDis); ++ XResizeWindow(pDis, ++ (Window) m_pWindow->window, ++ size.cx, ++ size.cy); ++ XUnlockDisplay(pDis); ++} ++ ++void CHXExSite::_SetPosition(HXxPoint position) ++{ ++ HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window); ++ _DestroyScrollButtons(); ++ XLockDisplay((Display*) m_pWindow->display); ++ XMoveWindow((Display*)m_pWindow->display, ++ (Window)m_pWindow->window, ++ position.x, ++ position.y); ++ XUnlockDisplay((Display*) m_pWindow->display); ++} ++ ++void CHXExSite::_DamageRect(HXxRect rect) ++{ ++ if(GetWindow()) ++ { ++ m_bDamaged = TRUE; ++ } ++ return; ++} ++ ++void CHXExSite::_DamageRegion(HXxRegion rect) ++{ ++ if(GetWindow()) ++ { ++ m_bDamaged = TRUE; ++ } ++ return; ++} ++ ++void CHXExSite::_SendOSUpdateMessage() ++{ ++ //We need to redraw our window here, m_pWindow. ++} ++ ++void CHXExSite::_ShowSite(HXBOOL bShow) ++{ ++ if( bShow ) ++ { ++ _MapScrollButtons(); ++ } ++ else ++ { ++ _UnmapScrollButtons(); ++ } ++ //do nothing.... ++} ++ ++HXBOOL CHXExSite::_AtSystemTime() ++{ ++ return TRUE; ++} ++ ++void CHXExSite::_GetDeviceCaps( void* hdc, ++ UINT16& uBitsPerPixel, ++ UINT16& uHorzRes, ++ UINT16& uVertRes ) ++{ ++ Screen* pScreen = NULL; ++ HXxWindow* pWin = GetWindow(); ++ HX_ASSERT( pWin ); ++ if( pWin ) ++ { ++ Display* dis = (Display*)pWin->display; ++ HX_ASSERT( dis ); ++ if( dis ) ++ { ++ Display* pDisp = (Display*)GetWindow()->display; ++ XLockDisplay(pDisp); ++ pScreen = DefaultScreenOfDisplay(pDisp); ++ XUnlockDisplay(pDisp); ++ ++ uBitsPerPixel = pScreen->root_depth; ++ uHorzRes = pScreen->width; ++ uVertRes = pScreen->height; ++ } ++ } ++} ++ ++void CHXExSite::_GetWindowRect(HXxRect* destRect) ++{ ++ HX_ASSERT( "Doesn't seem to be used anywhere"==NULL ); ++} ++ ++void CHXExSite::_DestroySliders() ++{ ++ _DestroyScrollButtons(); ++} ++ ++void CHXExSite::_ForwardUpdateEvent(HXxEvent* pEvent) ++{ ++ GC gc = NULL; ++ AddRef(); ++ ++ HX_ASSERT(GetWindow()->window); ++ HX_ASSERT(m_pUser); ++ if(m_bIsChildWindow) ++ { ++ //Create a clip region that excludes our higher z-order ++ //siblings and is clipped to our parent. ++ if( !m_bRegionIsValid ) ++ { ++ RecomputeClip(); ++ } ++ ++ // The problem is that regions are locked to the origin so we ++ // will need to reverse shift the region before we set the ++ // origin of the graph port! get the GC from the video surface ++ gc = ((CExRootSurf*)m_pRootSurface)->GetGC(); ++ HX_ASSERT( gc ); ++ ++ //Actually setup our clip region ++ Display* pDis = (Display*)GetWindow()->display; ++ XLockDisplay(pDis); ++ XSetRegion( pDis, gc, (Region) m_Region ); ++ XUnlockDisplay(pDis); ++ } ++ ++ XEvent* pXEvent = (XEvent*) pEvent->param2; ++ XExposeEvent* exposeEvent = (XExposeEvent*) pXEvent; ++ ++ // get the rect for this site with respect to our parent ++ HXRECTANGLE exposedRect = { exposeEvent->x, ++ exposeEvent->y, ++ exposeEvent->width, ++ exposeEvent->height }; ++ HXREGION* exposedRegion = HXCreateRegion(); ++ HXUnionRectWithRegion(&exposedRect, exposedRegion, exposedRegion); ++ ++ // does the site intersect the current clipping region? ++ HXREGION* resultRegion = HXCreateRegion(); ++ HXIntersectRegion(exposedRegion, m_Region, resultRegion); ++ HXBOOL bSiteIntersectsExposed = (HXEmptyRegion(resultRegion)==FALSE); ++ ++ HXDestroyRegion(resultRegion); ++ HXDestroyRegion(exposedRegion); ++ ++ // if the exposed region intersects the sites clipping region ++ if(bSiteIntersectsExposed) ++ { ++ m_pUser->HandleEvent(pEvent); ++ } ++ ++ //If the user doesn't handle the standard update event then send ++ //them the cross platform HX_SURFACE_UPDATE event don't damage the ++ //original event structure ++ if(!pEvent->handled && m_pUser ) ++ { ++ HX_ASSERT(GetWindow()); ++ HXxEvent event; ++ event.event = HX_SURFACE_UPDATE; ++ event.window = GetWindow()->window; ++ event.param1 = m_pVideoSurface; ++ event.param2 = GetWindow(); ++ event.result = 0; ++ event.handled = FALSE; ++ m_pUser->HandleEvent(&event); ++ pEvent->handled = event.handled; ++ } ++ ++ ++ //reset the gc to use no region ++ if(m_bIsChildWindow && gc) ++ { ++ Display* pDisp = (Display*)GetWindow()->display; ++ XLockDisplay(pDisp); ++ XSetClipMask(pDisp, gc, None); ++ XUnlockDisplay(pDisp); ++ } ++ ++ //Handle the drawing of our arrows... ++ _DrawArrows(); ++ ++ //Now do all our children.... ++ CHXMapPtrToPtr::Iterator i = m_ChildrenMap.Begin(); ++ for(;i!=m_ChildrenMap.End();++i) ++ { ++ CHXExSite* pSite = (CHXExSite*) *i; ++ pSite->_ForwardUpdateEvent(pEvent); ++ } ++ ++ Release(); ++} ++ ++UINT32 CHXExSite::_MapKeySymToHXVK(KeySym sym, UINT32& uFlags ) ++{ ++ //XXXgfw if we add the extended flag in the HX_KEYBOARD event ++ //structure then we can modify the flags here to show that these ++ //keys are 'extended' in the windows sense. ++ UINT32 ulRet = 0; ++ switch( sym ) ++ { ++ case XK_Shift_R: ++ ulRet = XK_Shift_L; ++ break; ++ case XK_Alt_R: ++ ulRet = XK_Alt_L; ++ break; ++ case XK_KP_Home: ++ ulRet = XK_Home; ++ break; ++ case XK_KP_Next: ++ ulRet = XK_Next; ++ break; ++ case XK_KP_Prior: ++ ulRet = XK_Prior; ++ break; ++ case XK_KP_Enter: ++ ulRet = XK_Return; ++ break; ++ case XK_KP_End: ++ ulRet = XK_End; ++ break; ++ case XK_KP_Begin: ++ ulRet = XK_Begin; ++ break; ++ case XK_KP_Left: ++ ulRet = XK_Left; ++ break; ++ case XK_KP_Up: ++ ulRet = XK_Up; ++ break; ++ case XK_Control_R: ++ ulRet = XK_Control_L; ++ break; ++ case XK_KP_Right: ++ ulRet = XK_Right; ++ break; ++ case XK_KP_Down: ++ ulRet = XK_Down; ++ break; ++ case XK_KP_Insert: ++ ulRet = XK_Insert; ++ break; ++ case XK_KP_Delete: ++ ulRet = XK_Delete; ++ break; ++ default: ++ ulRet = sym; ++ break; ++ } ++ if( ulRet != sym ) ++ { ++ //We have mapped a key from Right hand side, keypad, arrows ++ //or other parts of an extended keyboard. Set the flag. ++ uFlags |= HX_EXTENDED_KEY_MASK; ++ } ++ return ulRet; ++} ++ ++ ++HXBOOL CHXExSite::_ConvertToHXEvent(HXxEvent* pEvent ) ++{ ++ // get original events info from pEvent ++ XEvent* pXEvent = (XEvent*) pEvent->param2; ++ XButtonEvent* buttonEvent = (XButtonEvent*) pXEvent; ++ ++ ++ //=============================================================== ++ // Convert all other event to RMA generic events and pass back. ++ //=============================================================== ++ if( ((pEvent->event == ButtonPress) || ++ (pEvent->event == ButtonRelease) || ++ (pEvent->event == MotionNotify ) || ++ (pEvent->event == EnterNotify) || ++ (pEvent->event == FocusIn) || ++ (pEvent->event == FocusOut) || ++ (pEvent->event == KeyPress) || ++ (pEvent->event == KeyRelease) || ++ (pEvent->event == LeaveNotify)) ++ ) ++ { ++ // set modifier flags for all events.... ++ UINT32 flags = 0; ++ ++ // create new HXxEvent ++ HXxEvent theEvent; ++ ++ //XXXgfw ouch.... ++ static HXxPoint realPt = {0,0}; ++ ++ //Init certain members. ++ memset(&theEvent, 0, sizeof(HXxEvent)); ++ theEvent.window = pEvent->window; ++ theEvent.handled = FALSE; ++ ++ // ++ // NOTE: ++ // ++ // theEvent must be filled in by *ALL* event types. ++ // theEvent will be memcopied into the pEvent passed ++ // back to the basesite at the end of the method. ++ // ++ ++ //================================================== ++ // LEAVE NOTIFY EVENT ++ //================================================== ++ if( pEvent->event==LeaveNotify) ++ { ++ if( m_pTopLevelSite->m_pMouseInSite ) ++ { ++ HXxPoint oobPoint; ++ oobPoint.x = -1; ++ oobPoint.y = -1; ++ HXxEvent Outevent = { HX_MOUSE_LEAVE, ++ m_pWindow->window, ++ (void*)&oobPoint, ++ 0, 0, ++ FALSE }; ++ m_pTopLevelSite->m_pMouseInSite->EventOccurred(&Outevent); ++ m_pTopLevelSite->m_pMouseInSite = NULL; ++ } ++ pEvent->handled=TRUE; ++ return TRUE; ++ } ++ ++ //================================================== ++ // ENTER NOTIFY EVENT ++ //================================================== ++ if( pEvent->event==EnterNotify) ++ { ++ pEvent->handled=TRUE; ++ return TRUE; ++ } ++ ++ //================================================== ++ // KEY PRESS/RELEASE EVENT ++ //================================================== ++ if ( pEvent->event == KeyPress || pEvent->event==KeyRelease ) ++ { ++ XKeyEvent* pKeyEvent = (XKeyEvent*)pEvent->param2; ++ ++ // ++ //Set the event type ++ // ++ theEvent.event = pEvent->event==KeyPress?HX_KEY_DOWN:HX_KEY_UP; ++ ++ // ++ // Fill in the scan/key code. ++ // ++ flags = pKeyEvent->keycode; ++ flags &= 0x000000ff; //the scan code only gets bits 0-7 ++ ++ // ++ // build key modifier list... ++ // ++ if( pKeyEvent->state & ShiftMask ) ++ flags |= HX_SHIFT_MASK; ++ ++ if( pKeyEvent->state & ControlMask ) ++ flags |= HX_CTRL_MASK; ++ ++ if( pKeyEvent->state & LockMask ) ++ flags |= HX_CAPS_LOCK_MASK; ++ ++ if( pKeyEvent->state & Mod1Mask) ++ flags |= HX_ALT_MASK; ++ ++ if( pKeyEvent->state & Mod2Mask) ++ flags |= HX_NUM_LOCK_MASK; ++ ++ if( pKeyEvent->state & Mod5Mask) ++ flags |= HX_SCROLL_LOCK_MASK; ++ ++ // ++ //Store the char pressed. ++ // ++ KeySym sym; ++ char szBuf[10]; /* Flawfinder: ignore */ ++ int nNum; ++ ++ //Save the state of the keys... ++ unsigned int unSave = pKeyEvent->state; ++ pKeyEvent->state=0; ++ ++ //Lookup the key without any state. ++ nNum = XLookupString( pKeyEvent, szBuf, 10, &sym, NULL ); ++ if( nNum > 0 ) ++ { ++ theEvent.param1 = (void*)*szBuf; ++ } ++ else ++ { ++ theEvent.param1 = (void*)_MapKeySymToHXVK(sym, flags); ++ flags |= HX_VIRTUAL_KEY_MASK; ++ } ++ //restore the state of the event ++ pKeyEvent->state = unSave; ++ ++ //Set the flags... ++ theEvent.param2 = (void*)flags; ++ ++ //Check for HX_CHAR needed or not. ++ if( theEvent.event == HX_KEY_DOWN ) ++ { ++ //We have to send an extra HX_CHAR event ++ HXxEvent extraEvent; ++ memcpy( &extraEvent, &theEvent, sizeof( extraEvent ) ); /* Flawfinder: ignore */ ++ ++ //Change the type. ++ extraEvent.event = HX_CHAR; ++ ++ // ++ //Change the keycode to an translated ascii char. ++ // ++ KeySym sym; ++ char szBuf[10]; /* Flawfinder: ignore */ ++ int nNum; ++ ++ nNum = XLookupString( pKeyEvent, szBuf, 10, &sym, NULL ); ++ ++ if( nNum > 0 ) ++ { ++ extraEvent.param1 = (void*)*szBuf; ++ } ++ else ++ { ++ extraEvent.param1 = (void*)_MapKeySymToHXVK(sym, flags); ++ flags |= HX_VIRTUAL_KEY_MASK; ++ } ++ extraEvent.param2 = (void*)flags; ++ ++ // ++ // Now send the extra event.... ++ // ++ CHXBaseSite::EventOccurred(&extraEvent); ++ } ++ } ++ ++ //================================================== ++ // FOCUS OUT EVENT ++ //================================================== ++ if ( pEvent->event == FocusOut ) ++ { ++ theEvent.event = HX_LOSE_FOCUS; ++ } ++ ++ if ( pEvent->event == FocusIn ) ++ { ++ theEvent.event = HX_SET_FOCUS; ++ } ++ ++ //================================================== ++ // MOUSE MOVE EVENT ++ //================================================== ++ if( pEvent->event == MotionNotify ) ++ { ++ XMotionEvent* pp = (XMotionEvent*)pEvent->param2; ++ theEvent.event = HX_MOUSE_MOVE; ++ ++ if( pp->state&Button1Mask ) ++ flags |= HX_PRIMARY_BUTTON; ++ ++ if( pp->state&Button2Mask ) ++ flags |= HX_CONTEXT_BUTTON; ++ ++ if( pp->state&Button3Mask ) ++ flags |= HX_THIRD_BUTTON; ++ ++ if(pp->state & ShiftMask) ++ flags |= HX_SHIFT_KEY; ++ ++ if(pp->state & ControlMask) ++ flags |= HX_CTRL_KEY; ++ ++ if(pp->state & Mod1Mask) ++ flags |= HX_ALT_COMMAND_KEY; ++ ++ theEvent.param2 = (void*) flags; ++ ++ //Grab the X and Y. ++ theEvent.param1 = (void*) &realPt; ++ realPt.x = pp->x; ++ realPt.y = pp->y; ++ } ++ ++ //================================================== ++ // BUTTON PRESS/RELEASE EVENT ++ //================================================== ++ if((pEvent->event == ButtonPress) || (pEvent->event == ButtonRelease)) ++ { ++ // remap event ++ if (pEvent->event == ButtonPress) ++ { ++ if (buttonEvent->button == Button3) ++ theEvent.event = HX_CONTEXT_BUTTON_DOWN; ++ else ++ theEvent.event = HX_PRIMARY_BUTTON_DOWN; ++ } ++ else if (pEvent->event == ButtonRelease) ++ { ++ if (buttonEvent->button == Button3) ++ theEvent.event = HX_CONTEXT_BUTTON_UP; ++ else ++ theEvent.event = HX_PRIMARY_BUTTON_UP; ++ } ++ ++ if(buttonEvent->state & ShiftMask) ++ flags |= HX_SHIFT_KEY; ++ ++ if(buttonEvent->state & ControlMask) ++ flags |= HX_CTRL_KEY; ++ ++ theEvent.param2 = (void*) flags; ++ ++ //Grab the X and Y. ++ theEvent.param1 = (void*) &realPt; ++ realPt.x = buttonEvent->x; ++ realPt.y = buttonEvent->y; ++ } ++ ++ //Copy the new event back into the passed in one for ++ //all events that fall through here... ++ memcpy( pEvent, &theEvent, sizeof(HXxEvent) ); /* Flawfinder: ignore */ ++ ++#if defined(_DEBUG) ++ //If the users presses control-primary button ++ //dump info on all sites. If shift-context, then ++ //just this site. ++ if( (buttonEvent->state&ControlMask)&& ++ (theEvent.event==HX_PRIMARY_BUTTON_DOWN)) ++ { ++ DisplayAllSiteData(); ++ } ++ if( (buttonEvent->state&ShiftMask)&& ++ (theEvent.event==HX_PRIMARY_BUTTON_DOWN)) ++ { ++ DisplaySiteData(""); ++ } ++#endif ++ } ++ return pEvent->handled; ++} ++ ++ ++void CHXExSite::CheckColorSettings() ++{ ++#if !defined(HELIX_FEATURE_HARDWARE_COLOR_CONTROLS) ++ CHXBaseSite::CheckColorSettings(); ++#else ++ CUnixSurf* pSurf = (CUnixSurf*)m_pVideoSurface; ++ if( !pSurf->HasHWColorConrols() ) ++ { ++ CHXBaseSite::CheckColorSettings(); ++ } ++ else ++ { ++ pSurf->SetHWColorControls(); ++ ++ //We do all color stuff except sharpmess in hardware. ++ float fCurrentSharpness; ++ INT16 bInterpolate; ++ zm_pColorAcc->GetSharpnessAdjustments(&fCurrentSharpness, &bInterpolate); ++ ++ if (fCurrentSharpness != m_fSharpness) ++ { ++ zm_pColorAcc->SetSharpnessAdjustments(m_fSharpness, FALSE); ++ } ++ } ++#endif ++} ++ ++// ++// OK, here it is. Take care of any OS specific duties, like scrollbar ++// stuff and expose events. Then, if the event isn't handled, convert ++// to an RMA event and return. ++HXBOOL CHXExSite::_HandleOSEvents(HXxEvent* pEvent) ++{ ++ HXxPoint position = {0, 0}; ++ HXxPoint point; ++ ++ if( NULL==pEvent ) ++ { ++ return FALSE; ++ } ++ ++ return TRUE; ++ ++#if defined(_DEBUG) && 0 ++// fprintf( stderr, "this: %p m_pUser: %p ", this, m_pUser ); ++ switch( pEvent->event ) ++ { ++ case HX_MOUSE_LEAVE: ++ fprintf( stderr, "HX_MOUSE_LEAVE\n" ); ++ break; ++// case HX_MOUSE_MOVE: ++// point.x = ((HXxPoint*)pEvent->param1)->x; ++// point.y = ((HXxPoint*)pEvent->param1)->y; ++// fprintf( stderr, "HX_MOUSE_MOVE: %d %d\n", point.x, point.y ); ++// break; ++ case HX_MOUSE_ENTER: ++ fprintf( stderr, "HX_MOUSE_ENTER\n" ); ++ break; ++// case MotionNotify: ++// point.x = ((XMotionEvent*)pEvent->param2)->x; ++// point.y = ((XMotionEvent*)pEvent->param2)->y; ++// fprintf( stderr, "MotionNotify: %d %d\n", point.x, point.y ); ++// break; ++ case Expose: ++ fprintf( stderr, "Expose\n" ); ++ break; ++ case EnterNotify : ++ fprintf( stderr, "EnterNotify\n" ); ++ break; ++ case LeaveNotify: ++ fprintf( stderr, "LeaveNotify\n" ); ++ break; ++ case KeyPress: ++ fprintf( stderr, "this: %p m_pUser: %p ", this, m_pUser ); ++ fprintf( stderr, "Keypress\n\n" ); ++ break; ++ case KeyRelease: ++ fprintf( stderr, "this: %p m_pUser: %p ", this, m_pUser ); ++ fprintf( stderr, "KeyRelease\n" ); ++ break; ++ default: ++ fprintf( stderr, "Other\n" ); ++ break; ++ } ++#endif ++ ++ //Find the ConfigureNotify events so we can drop to RGB from ++ //overlay while we move.... ++// if( pEvent->event == ConfigureNotify && this==m_pTopLevelSite ) ++// { ++// XConfigureEvent* pev = (XConfigureEvent*)pEvent->param2; ++// if( m_pWindow && pev->window == (Window)m_pWindow->window ) ++// { ++// HXxPoint p; ++// _GetPositionRelativeToActualWindow( p ); ++// // fprintf( stderr, "wint %p -- x,y width, height: %d %d %d %d \n", ++// // pev->window, ++// // pev->x, pev->y, pev->width, pev->height); ++// // fprintf( stderr, "size of site: %d %d\n", m_size.cx, m_size.cy); ++// // fprintf( stderr, "pos of site: %d %d\n", m_topleft.x, m_topleft.y); ++// m_pTopLevelSite->m_pMutex->Lock(); ++// m_pTopLevelSite->SiteMoving(0, 0); ++// m_pTopLevelSite->m_nLastMoveTime = HX_GET_TICKCOUNT(); ++// m_pTopLevelSite->ScheduleCallback(MOUSE, 100); ++// m_pTopLevelSite->m_pMutex->Unlock(); ++// } ++// } ++ ++ //See if we should drop out of full screen ++ if( pEvent->event == FocusOut && IsFullScreen() && !m_bIgnoreFocusOutInFS ) ++ { ++// fprintf( stderr, "_HandleOSEvents: focus out: " ); ++// XEvent* pXEvent = (XEvent*) pEvent->param2; ++// XFocusChangeEvent* event = (XFocusChangeEvent*) pXEvent; ++// switch( event->mode ) ++// { ++// case NotifyAncestor: ++// fprintf( stderr, "NotifyAncestor\n" ); ++// break; ++// case NotifyVirtual: ++// fprintf( stderr, "NotifyVirtual\n" ); ++// break; ++// case NotifyInferior: ++// fprintf( stderr, "NotifyInferior\n" ); ++// break; ++// case NotifyNonlinear: ++// fprintf( stderr, "NotifyNonlinear\n" ); ++// break; ++// case NotifyNonlinearVirtual: ++// fprintf( stderr, "NotifyNonlinearVirtual\n" ); ++// break; ++// case NotifyPointer: ++// fprintf( stderr, "NotifyPointer\n" ); ++// break; ++// case NotifyPointerRoot: ++// fprintf( stderr, "NotifyPointerRoot\n" ); ++// break; ++// case NotifyDetailNone: ++// fprintf( stderr, "NotifyDetailNone\n" ); ++// break; ++// default: ++// fprintf( stderr, "screwed.....\n" ); ++// } ++ ExitFullScreen(); ++ } ++ ++ ++#if defined(_DEBUG) && defined(TEST_FULL_SCREEN) ++ if( pEvent->event == KeyPress ) ++ { ++ KeySym sym; ++ char szBuf[10]; /* Flawfinder: ignore */ ++ int nNum; ++ ++ //Lookup the key without any state. ++ nNum = XLookupString( (XKeyEvent*)(pEvent->param2), szBuf, 10, &sym, NULL ); ++ if( nNum > 0 ) ++ { ++ if( 'f' == szBuf[0] && IsFullScreen() ) ++ { ++ //Exit full screen if 'f' is pressed..... ++ m_pTopLevelSite->ExitFullScreen(); ++ } ++ else if( 'f' == szBuf[0] && !IsFullScreen() ) ++ { ++ //Enter full screen if 'f' is pressed..... ++ m_pTopLevelSite->EnterFullScreen(); ++ } ++ ++ } ++ ++ } ++#endif ++ ++#if defined(_DEBUG) && defined(_TEST_COLOR_CONTROLS) ++ if( pEvent->event == KeyPress ) ++ { ++ KeySym sym; ++ char szBuf[10]; /* Flawfinder: ignore */ ++ int nNum; ++ ++ //Lookup the key without any state. ++ nNum = XLookupString( (XKeyEvent*)(pEvent->param2), szBuf, 10, &sym, NULL ); ++ if( nNum > 0 ) ++ { ++ if( 'b' == szBuf[0] ) ++ { ++ SetBrightness( GetBrightness()-.05); ++ } ++ if( 'B' == szBuf[0] ) ++ { ++ SetBrightness( GetBrightness()+.05); ++ } ++ ++ if( 'c' == szBuf[0] ) ++ { ++ SetContrast( GetContrast()-.05); ++ } ++ if( 'C' == szBuf[0] ) ++ { ++ SetContrast( GetContrast()+.05); ++ } ++ ++ if( 'h' == szBuf[0] ) ++ { ++ SetHue( GetHue()-.05); ++ } ++ if( 'H' == szBuf[0] ) ++ { ++ SetHue( GetHue()+.05 ); ++ } ++ ++ if( 's' == szBuf[0] ) ++ { ++ SetSaturation( GetSaturation()-.05); ++ } ++ if( 'S' == szBuf[0] ) ++ { ++ SetSaturation( GetSaturation()+.05); ++ } ++ fprintf( stderr, "colors %f %f %f %f\n", ++ GetBrightness(), ++ GetContrast(), ++ GetSaturation(), ++ GetHue()); ++ } ++ ++ } ++#endif ++ ++ //Exit full screen on ESC pressed...... ++ if( pEvent->event == KeyPress ) ++ { ++ KeySym sym; ++ char szBuf[10]; /* Flawfinder: ignore */ ++ int nNum; ++ ++ //Lookup the key without any state. ++ nNum = XLookupString( (XKeyEvent*)(pEvent->param2), szBuf, 10, &sym, NULL ); ++ if( nNum > 0 ) ++ { ++ if( 27 == (int)szBuf[0] && IsFullScreen() ) ++ { ++ //Exit full screen if esc is pressed..... ++ m_pTopLevelSite->ExitFullScreen(); ++ } ++ } ++ } ++ ++ //Find out if this is an event we are interested in. Make sure we ++ //are visible, it isn't a button, expose or FocusIn event and also ++ //make sure it is headed for our window. ++ if (!_ShouldProcess(pEvent)) ++ { ++ return FALSE; ++ } ++ ++ ++ if(m_pUser && GetWindow() && GetWindow()->window) ++ { ++ //Do not send an update event to a hidden site. ++ if( pEvent->event == Expose || ++ pEvent->event == FocusIn || ++ pEvent->event == HX_SURFACE_UPDATE ) ++ { ++ if( (m_ScrollVertButtonT || m_ScrollHorizButtonR) && IsSiteVisible() ) ++ { ++ _DrawArrows(); ++ } ++ _ForwardUpdateEvent(pEvent); ++ return TRUE; ++ } ++ else ++ { ++ // get original events info from pEvent ++ XEvent* pXEvent = (XEvent*) pEvent->param2; ++ XButtonEvent* buttonEvent = (XButtonEvent*) pXEvent; ++ ++ ++ //XXXgfw all this code sucks! It really need to be written ++ //for just native events or RMA events. With the change to a ++ //common site it is all screwed up. I am leaving it for now ++ //so we can get on with transparancy but get back to it! ++ ++ //If the user clicks MB1 on a scroll button, handle it here and ++ //don't pass it up or let the user handle the event. ++ //Hit detection here. ++ ++ //////////////////////////////////////////////////////// ++ // BEGIN SCROLLING GARBAGE ++ //////////////////////////////////////////////////////// ++ if( ++ ((pEvent->event==ButtonPress || pEvent->event==ButtonRelease) && ++ buttonEvent->button==Button1) && ++ (m_ScrollHorizButtonL || m_ScrollVertButtonB ) ++ ) ++ { ++ int buttonX=0; ++ int buttonY=0; ++ ++ if( pEvent->event==ButtonRelease ) ++ { ++ if( m_bScrollingInProgress ) ++ { ++ m_bScrollingInProgress = FALSE; ++ m_nScrollDir = 0; ++ return TRUE ; ++ } ++ } ++ else ++ { ++ buttonX = buttonEvent->x; ++ buttonY = buttonEvent->y; ++ ++ HXBOOL bPointInSite = FALSE; ++ if( m_Region ) ++ bPointInSite = HXPointInRegion(m_Region, buttonX, buttonY); ++ ++ if( bPointInSite ) ++ { ++ if( m_ScrollHorizButtonL ) ++ { ++ if( _InButton( m_ptScrollHorizPosL, buttonX, buttonY )) ++ { ++ m_bScrollingInProgress = TRUE; ++ m_nScrollDir = 1; ++ } ++ if( _InButton( m_ptScrollHorizPosR, buttonX, buttonY )) ++ { ++ m_bScrollingInProgress = TRUE; ++ m_nScrollDir = 2; ++ } ++ } ++ if( m_ScrollVertButtonT ) ++ { ++ if( _InButton( m_ptScrollVertPosT, buttonX, buttonY )) ++ { ++ m_bScrollingInProgress = TRUE; ++ m_nScrollDir = 3; ++ } ++ if( _InButton( m_ptScrollVertPosB, buttonX, buttonY )) ++ { ++ m_bScrollingInProgress = TRUE; ++ m_nScrollDir = 4; ++ } ++ } ++ } ++ } ++ ++ if( (m_ScrollHorizButtonL||m_ScrollVertButtonT) && m_bScrollingInProgress) ++ { ++ int xx=0; ++ int yy=0; ++ HXxWindow* pParentWindow = GetParentSite()->GetWindow(); ++ //Make it scroll 10% of the parent window each click. ++ HXxSize sizeTmp; ++ GetParentSite()->GetSize(sizeTmp); ++ ++ //Set it to a percentage of the slider range. ++ int incX = sizeTmp.cx/10; ++ int incY = sizeTmp.cy/10; ++ ++ HX_ASSERT( pParentWindow ); ++ ++ xx = m_XSliderPos; ++ yy = m_YSliderPos; ++ ++ if( m_nScrollDir == 1 ) ++ xx-=incX; ++ if( m_nScrollDir == 2 ) ++ xx+=incX; ++ if( m_nScrollDir == 3 ) ++ yy-=incY; ++ if( m_nScrollDir == 4 ) ++ yy+=incY; ++ ++ if( xx > m_size.cx-sizeTmp.cx ) ++ xx = m_size.cx-sizeTmp.cx; ++ if( yy > m_size.cy-sizeTmp.cy) ++ yy = m_size.cy-sizeTmp.cy; ++ ++ if( xx < 0 ) ++ xx = 0; ++ if( yy < 0 ) ++ yy = 0; ++ ++ m_XSliderPos = xx; ++ m_YSliderPos = yy; ++ ++ HXxRect rect; ++ DamageRect(rect); ++ ++ InternalForceRedraw(); ++ } ++ //Only throw away the event if it had something to do with ++ //scolling. ++ if( m_bScrollingInProgress ) ++ { ++ m_bScrollingInProgress = FALSE; ++ m_nScrollDir = 0; ++ return TRUE; ++ } ++ } ++ //////////////////////////////////////////////////////// ++ // END SCROLLING GARBAGE ++ //////////////////////////////////////////////////////// ++ point.x = -1; ++ point.y = -1; ++ ++ if( pEvent->event == MotionNotify) ++ { ++ point.x = ((XMotionEvent*)pXEvent)->x; ++ point.y = ((XMotionEvent*)pXEvent)->y; ++ } ++ else if( pEvent->event == ButtonPress ) ++ { ++ point.x = ((XMotionEvent*)pXEvent)->x; ++ point.y = ((XMotionEvent*)pXEvent)->y; ++ } ++ ++ // ++ //Give the user a chance at the native event. ++ // ++ if( m_RegionWithoutChildren && HXPointInRegion(m_RegionWithoutChildren, point.x, point.y )) ++ { ++ if( m_Region && HXPointInRegion(m_Region, point.x, point.y) ) ++ { ++ if (m_pUser) ++ m_pUser->HandleEvent(pEvent); ++ } ++ else ++ { ++ INT32 handledCount = 0; ++ INT32 mapCount = 0; ++ ++ //try send this to all of our children ++ _unixsitecpp1: ++ mapCount = m_ChildrenMap.GetCount(); ++ CHXMapPtrToPtr::Iterator i; ++ for(i=m_ChildrenMap.Begin() ; i!=m_ChildrenMap.End() ; ++i) ++ { ++ CHXBaseSite* pSite = (CHXBaseSite*) *i; ++ pSite->_HandleOSEvents(pEvent); ++ if (pEvent->handled) ++ { ++ break; ++ } ++ handledCount+=pEvent->handled; ++ pEvent->handled=0; ++ ++ if (m_ChildrenMap.GetCount() != mapCount) ++ { ++ goto _unixsitecpp1; ++ } ++ } ++ if (handledCount) ++ { ++ pEvent->handled = 1; ++ } ++ HX_ASSERT(handledCount<2); ++ } ++ } ++ pEvent->handled=FALSE; ++ } ++ } ++ ++ return FALSE; ++} ++ ++void CHXExSite::_GenerateOSEvent(HXxEvent* pEvent, HXxEvent* pEvent2) ++{ ++ //XXXgfw Not needed on UNIX I guess??? ++} ++ ++void CHXExSite::_GenerateSetCursorEvent() ++{ ++#ifdef _DEBUG ++ fprintf( stderr, "CHXExSite::_GenerateSetCursorEvent\n" ); ++#endif ++ //XXXgfw do we need this?? ++} ++ ++void CHXExSite::_TryCreateXSlider() ++{ ++#if 0 ++ if( !m_ScrollHorizButtonL && IsSiteVisible() ) ++ _CreateHorizScrollBar(); ++#endif ++} ++ ++void CHXExSite::_SetXSliderValues(INT32 range, INT32 pageSize) ++{ ++ //XXXgfw this is a do nothing as long as we only have ++ //scroll buttons on unix and not real scroll bars. ++} ++ ++void CHXExSite::_TryCreateYSlider() ++{ ++#if 0 ++ if( !m_ScrollVertButtonT && IsSiteVisible() ) ++ _CreateVertScrollBar(); ++#endif ++} ++ ++void CHXExSite::_SetYSliderValues(INT32 range, INT32 pageSize) ++{ ++ //XXXgfw this is a do nothing as long as we only have ++ //scroll buttons on unix and not real scroll bars. ++} ++ ++void CHXExSite::_GetSystemSizeOfSliders(INT32* pWidth, INT32* pHeight) ++{ ++#if 0 ++ *pWidth = *pHeight = SCROLL_BAR_WIDTH; ++#endif ++} ++ ++HXBOOL CHXExSite::_IsWindowVisible() ++{ ++#if 0 ++ HX_RESULT retVal = FALSE; ++ //XXXgfw do this for now... ++ retVal = IsSiteVisible(); ++ return retVal; ++#else ++ return FALSE; ++#endif ++ ++} ++ ++void CHXExSite::_ShowXSlider(HXBOOL bShow) ++{ ++#if 0 ++ if( GetWindow() ) ++ { ++ if( bShow ) ++ _MapHorzScroll(); ++ else ++ _UnmapHorzScroll(); ++ } ++#endif ++} ++ ++void CHXExSite::_MoveXSlider( INT32 left, ++ INT32 top, ++ INT32 right, ++ INT32 bottom, ++ HXBOOL bRedraw ) ++{ ++ //Do nothing right now.... ++} ++ ++void CHXExSite::_ShowYSlider(HXBOOL bShow) ++{ ++#if 0 ++ if( GetWindow() ) ++ { ++ if( bShow ) ++ _MapVertScroll(); ++ else ++ _UnmapVertScroll(); ++ } ++#endif ++} ++ ++void CHXExSite::_MoveYSlider( INT32 left, ++ INT32 top, ++ INT32 right, ++ INT32 bottom, ++ HXBOOL bRedraw) ++{ ++ //do nothing right now... ++} ++ ++HXBOOL CHXExSite::_DoesXSliderExist() ++{ ++ return FALSE; ++// return (m_ScrollHorizButtonL!=0); ++} ++ ++void* CHXExSite::_GetContainingWindow() ++{ ++ //XXXgfw Do we need this??? ++ return NULL; ++} ++ ++void CHXExSite::_GetCursorPos(HXxPoint* pPoint) ++{ ++ //Return the cursor pos in screen coords. ++ Window rootWin; ++ Window childWin; ++ int rootX=0; ++ int rootY=0; ++ int childX=0; ++ int childY=0; ++ unsigned int mask=0; ++ Bool ret=FALSE; ++ ++ HX_ASSERT(GetWindow()); ++ Display* pDis = (Display*)GetWindow()->display; ++ XLockDisplay(pDis); ++ ret = XQueryPointer(pDis, ++ (Window)GetWindow()->window, ++ &rootWin, ++ &childWin, ++ &rootX, &rootY, ++ &childX, &childY, ++ &mask); ++ XUnlockDisplay(pDis); ++ ++ if(ret) ++ { ++ pPoint->x = rootX; ++ pPoint->y = rootY; ++ } ++} ++void* CHXExSite::_GetWindowWithCursor() ++{ ++#if 0 ++ //Return the cursor pos in screen coords. ++ void* pRet = NULL; ++ int rootX = 0; ++ int rootY = 0; ++ int childX= 0; ++ int childY= 0; ++ unsigned int mask = 0; ++ Bool ret = FALSE; ++ Window rootWin; ++ Window childWin; ++ ++ HX_ASSERT(GetWindow()); ++ Display* pDis = (Display*)GetWindow()->display; ++ XLockDisplay(pDis); ++ ret = XQueryPointer(pDis, ++ (Window)GetWindow()->window, ++ &rootWin, ++ &childWin, ++ &rootX, &rootY, ++ &childX, &childY, ++ &mask); ++ XUnlockDisplay(pDis); ++ ++ if(ret) ++ { ++ pRet = (void*)childWin; ++ } ++ return pRet; ++#else ++ HX_ASSERT( "Not implemented..." == NULL ); ++ return NULL; ++#endif ++} ++ ++void CHXExSite::_MapPointToOSWindow(HXxPoint* pPt, void** pWindowHandle) ++{ ++ //XXXgfw we could query the window tree and traverse down but that ++ //is really slow and this isn't used right now. ++ HX_ASSERT( "Not implemented..." == NULL ); ++} ++ ++void CHXExSite::_ReInitPrimarySurface() ++{ ++ //Nothing to do in unix here right? ++} ++ ++HXBOOL CHXExSite::_MoveWindow( void* win, ++ INT32 X, ++ INT32 Y, ++ INT32 nWidth, ++ INT32 nHeight, ++ HXBOOL bRepaint) ++{ ++#if 0 ++ //XXXgfw we still have to do bRepaint.... ++ HX_ASSERT( m_pWindow && m_pWindow->window && m_pWindow->display); ++ _DestroyScrollButtons(); ++ XLockDisplay((Display*) m_pWindow->display); ++ XMoveResizeWindow( (Display*)m_pWindow->display, ++ (Window)m_pWindow->window, ++ X, ++ Y, ++ nWidth, ++ nHeight ++ ); ++ XUnlockDisplay((Display*) m_pWindow->display); ++#else ++ HX_ASSERT( "Not implemented..." == NULL ); ++#endif ++ return TRUE; ++} ++ ++HXBOOL CHXExSite::_UpdateWindow(void* hWnd) ++{ ++ //We need to generate a repaint here of the window.... ++ return TRUE; ++} ++ ++HXBOOL CHXExSite::_ShowWindow(void* hWnd, INT32 nCmdShow) ++{ ++#if 0 ++ HX_ASSERT( nCmdShow==HX_SHOW_WINDOW || nCmdShow==HX_HIDE_WINDOW); ++ if( !m_pWindow || !m_pWindow->window || !m_pWindow->display ) ++ return FALSE; ++ ++ if( nCmdShow == HX_SHOW_WINDOW ) ++ { ++ _MapScrollButtons(); ++ XLockDisplay((Display*) m_pWindow->display); ++ XMapWindow( (Display*)m_pWindow->display, (Window)m_pWindow->window ); ++ XUnlockDisplay((Display*) m_pWindow->display); ++ } ++ else ++ { ++ _UnmapScrollButtons(); ++ XLockDisplay((Display*) m_pWindow->display); ++ XUnmapWindow( (Display*)m_pWindow->display, (Window)m_pWindow->window ); ++ XUnlockDisplay((Display*) m_pWindow->display); ++ } ++#endif ++ return TRUE; ++} ++ ++HXBOOL CHXExSite::_SetWindowPos(void* hWnd, ++ void* hWndInsertAfter, ++ INT32 X, ++ INT32 Y, ++ INT32 cx, ++ INT32 cy, ++ INT32 uFlags) ++{ ++#ifdef _DEBUG ++ fprintf( stderr, "Now what on earth is this suppose to do??\n" ); ++#endif ++ return TRUE; ++} ++ ++HXBOOL CHXExSite::_SetWindowRgn(void* hWnd, HXREGION* hRgn, HXBOOL bRedraw) ++{ ++#if 0 ++ HX_ASSERT( GetWindow() ); ++ Display* pDis = (Display*)GetWindow()->display; ++ XLockDisplay(pDis); ++ XSetRegion( pDis, ++ (GC)m_pVideoSurface->_GetDC(NULL), ++ (Region)hRgn ++ ); ++ XUnlockDisplay(pDis); ++ if( bRedraw ) ++ { ++ HX_ASSERT("Redraw asked for here"==NULL ); ++ } ++#endif ++ return TRUE; ++} ++ ++void CHXExSite::_SetFocus(void* pWindow) ++{ ++#if 0 ++ XWindowAttributes attr; ++ HXxWindow* pWin = GetWindow(); ++ ++ HX_ASSERT(pWin); ++ HX_ASSERT(pWindow); ++ ++ XLockDisplay((Display*) pWin->display); ++ XGetWindowAttributes((Display*)pWin->display, (Window)pWindow, &attr); ++ XUnlockDisplay((Display*) pWin->display); ++ if( attr.map_state == IsViewable ) ++ { ++ XLockDisplay((Display*) pWin->display); ++ XSetInputFocus( (Display*)pWin->display, ++ (Window)pWindow, ++ RevertToParent, ++ CurrentTime ++ ); ++ XUnlockDisplay((Display*) pWin->display); ++ } ++ ++ return; ++#endif ++} ++ ++HX_RESULT CHXExSite::_EnterFullScreen(HXxWindow* pWindow) ++{ ++#if 0 ++ HXxWindow* pWin = GetWindow(); ++ HX_ASSERT( pWin && pWin->display && pWin->display); ++ HX_ASSERT( this == m_pTopLevelSite ); ++ ++ if( 0 != m_winFullScreenWindow || IsFullScreen() ) ++ { ++ //We are already in full screen ++ return HXR_FAIL; ++ } ++ ++ //Create a override redirect window to fill the root. ++ XSizeHints size_hints; ++ XLockDisplay((Display*) pWin->display); ++ Screen* pScreen = XDefaultScreenOfDisplay((Display*)pWin->display); ++ XUnlockDisplay((Display*) pWin->display); ++ UINT16 uHorzRes = WidthOfScreen(pScreen); ++ UINT16 uVertRes = HeightOfScreen(pScreen); ++ int attrMask = 0; ++ XSetWindowAttributes attr; ++ ++ memset(&attr, 0, sizeof(XSetWindowAttributes)); ++ attrMask = CWOverrideRedirect | CWBorderPixel | ++ CWBackPixel | CWCursor; ++ attr.cursor = None; ++ attr.override_redirect = True; ++ XLockDisplay((Display*)pWin->display); ++ attr.background_pixel = BlackPixel((Display*)pWin->display, ++ DefaultScreen((Display*)pWin->display)); ++ attr.border_pixel = BlackPixel((Display*)pWin->display, ++ DefaultScreen((Display*)pWin->display)); ++ XUnlockDisplay((Display*)pWin->display); ++ ++ size_hints.flags = PPosition | PSize; ++ size_hints.x = 0; ++ size_hints.y = 0; ++ size_hints.width = uHorzRes; ++ size_hints.height = uVertRes; ++ ++ //Create it. ++ XLockDisplay((Display*) pWin->display); ++ Window window = XCreateWindow((Display*)pWin->display, ++ DefaultRootWindow((Display*)pWin->display), ++ size_hints.x, ++ size_hints.y, ++ size_hints.width, ++ size_hints.height, ++ 0, ++ CopyFromParent, ++ InputOutput, ++ CopyFromParent, ++ attrMask, ++ &attr); ++ ++ //Tell the WM about this window. ++ XSetStandardProperties( (Display*)pWin->display, ++ window, ++ "unixfullscreen", ++ "unixfullscreen", ++ None, ++ NULL, 0, ++ &size_hints ++ ); ++ ++ int result = XSelectInput( zm_display, window, ++ ButtonPressMask | ButtonReleaseMask | KeyPressMask | ++ KeyReleaseMask | EnterWindowMask | LeaveWindowMask | ++ PointerMotionMask | ButtonMotionMask | KeymapStateMask | ++ ExposureMask | StructureNotifyMask | FocusChangeMask ++ ); ++ ++ //Map the window. ++ XMapWindow((Display*)pWin->display, window); ++ XUnlockDisplay((Display*) pWin->display); ++ ++ ++ //Get ready to resize the presentation.... ++ if(m_pTopLevelSite) ++ { ++ m_pTopLevelSite->m_bDisableForceRedraw = TRUE; ++ } ++ ++ //Maintain aspect ratio and Scale it. ++ float fXScale = (float)uHorzRes/(float)(m_size.cx); ++ float fYScale = (float)uVertRes/(float)(m_size.cy); ++ float fScale = (fXScaledisplay); ++ XQueryTree( (Display*)pWin->display, ++ (Window)pWin->window, ++ &winRootParent, ++ &winParent, ++ &pwinChildren, ++ &nNumChildren ++ ); ++ //Free unused children list. ++ XFree( pwinChildren ); ++ XUnlockDisplay((Display*) pWin->display); ++ ++ HX_ASSERT( winParent ); ++ m_winOldParent = winParent; ++ XLockDisplay((Display*) pWin->display); ++ XReparentWindow( (Display*)pWin->display, ++ (Window)pWin->window, ++ window, ++ m_ptFullScreenOffset.x, ++ m_ptFullScreenOffset.y ++ ); ++ ++ //Flush event queue. ++ XSync((Display*)pWin->display, False); ++ XUnlockDisplay((Display*) pWin->display); ++ ++ //Save it ++ m_winFullScreenWindow = window; ++ m_bInFullScreen = TRUE; ++ ++ //Now resize it... ++ SetSize(m_size); ++ //Redraw the presentation.... ++ m_pTopLevelSite->m_bDisableForceRedraw = FALSE; ++ _ForceRedrawAll(); ++ ++ //Give it focus.... ++ _SetFocus( (void*)pWin->window ); ++ ++ // now eat all the focusouts that came as a result of this reparent... ++ XEvent event; ++ XLockDisplay((Display*) pWin->display); ++ HXBOOL status = XCheckTypedWindowEvent((Display*)pWin->display, (Window)pWin->window, ++ FocusOut, &event); ++ XUnlockDisplay((Display*) pWin->display); ++ while (m_bWindowCreatedByCreate && status) ++ { ++ // just discarding these ++ XLockDisplay((Display*) pWin->display); ++ status = XCheckTypedWindowEvent((Display*)pWin->display, (Window)pWin->window, ++ FocusOut, &event); ++ XUnlockDisplay((Display*) pWin->display); ++ } ++ ++ //Update the status text... ++ if(m_pStatusText) ++ { ++ m_pStatusText->ParentChangedSize(); ++ m_pStatusText->Show(); ++ } ++ ++#else ++ HX_ASSERT( "Not implemented..." == NULL ); ++#endif ++ return HXR_OK; ++} ++ ++HX_RESULT CHXExSite::_ExitFullScreen() ++{ ++#if 0 ++ HX_ASSERT( this == m_pTopLevelSite ); ++ ++ HXxWindow* pWin = GetWindow(); ++ ++ HX_ASSERT( pWin && pWin->display && pWin->window ); ++ ++ //Give the window back to the TLC. ++ ++ XLockDisplay((Display*) pWin->display); ++ XReparentWindow( (Display*)pWin->display, ++ (Window)pWin->window, ++ m_winOldParent, ++ m_position.x, m_position.y ++ ); ++ XUnlockDisplay((Display*) pWin->display); ++ ++ //Just kill our window and take us out of full screen.... ++ if( 0 != m_winFullScreenWindow ) ++ { ++ XLockDisplay((Display*) pWin->display); ++ XDestroyWindow( (Display*)pWin->display, m_winFullScreenWindow ); ++ XUnlockDisplay((Display*) pWin->display); ++ m_winFullScreenWindow = 0; ++ } ++ ++ m_bDisableForceRedraw = TRUE; ++ ++ m_bInFullScreen = FALSE; ++ HXxSize size = {0,0}; ++ memcpy( &size, &m_PreFullScreenSize, sizeof(HXxSize) ); /* Flawfinder: ignore */ ++ m_PreFullScreenSize.cx = m_PreFullScreenSize.cy = 0; ++ ++ SetSize(size); ++ _SetFocus( (void*)pWin->window ); ++ m_ptFullScreenOffset.x = 0; ++ m_ptFullScreenOffset.y = 0; ++ ++ ++ m_bDisableForceRedraw = FALSE; ++ _ForceRedrawAll(); ++ ++ if(m_pStatusText) ++ { ++ m_pStatusText->ParentChangedSize(); ++ m_pStatusText->Hide(); ++ } ++ ++ //move the site back to where it was. ++ if( m_pTopLevelSite ) ++ { ++ m_pTopLevelSite->_SetPosition(m_CreateWindowPos); ++ } ++ ++ return HXR_OK; ++#else ++ HX_ASSERT( "Not implemented..." == NULL ); ++#endif ++} ++ ++HX_RESULT CHXExSite::_EnterFullScreenNoNewWindow() ++{ ++#if 0 ++ HXxWindow* pWin = GetWindow(); ++ ++ HX_ASSERT( pWin && pWin->display && pWin->display); ++ HX_ASSERT( this == m_pTopLevelSite ); ++ ++ if(IsFullScreen() || !pWin) ++ { ++ //We are already in full screen ++ return HXR_FAIL; ++ } ++ ++ //Get the screen size. ++ XLockDisplay((Display*) pWin->display); ++ Screen* pScreen = XDefaultScreenOfDisplay((Display*)pWin->display); ++ UINT16 uHorzRes = WidthOfScreen(pScreen); ++ UINT16 uVertRes = HeightOfScreen(pScreen); ++ XUnlockDisplay((Display*)pWin->display); ++ ++ //Get ready to resize the presentation.... ++ if( m_pTopLevelSite ) ++ { ++ m_pTopLevelSite->m_bDisableForceRedraw = TRUE; ++ } ++ ++ //Maintain aspect ratio and Scale it. ++ float fXScale = (float)uHorzRes/(float)(m_size.cx); ++ float fYScale = (float)uVertRes/(float)(m_size.cy); ++ float fScale = (fXScaledisplay); ++ XQueryTree( (Display*)pWin->display, ++ (Window)pWin->window, ++ &winRootParent, ++ &winParent, ++ &pwinChildren, ++ &nNumChildren ++ ); ++ ++ //Free unused children list. ++ XFree( pwinChildren ); ++ XUnlockDisplay((Display*) pWin->display); ++ ++ HX_ASSERT( winParent ); ++ m_winOldParent = winParent; ++ ++ m_bInFullScreen = TRUE; ++ ++ //Now resize it... ++ SetSize(m_size); ++ ++ //Redraw the presentation.... ++ if( m_pTopLevelSite ) ++ { ++ m_pTopLevelSite->m_bDisableForceRedraw = FALSE; ++ } ++ ++ _ForceRedrawAll(); ++ ++ //Give it focus.... ++ _SetFocus( (void*)pWin->window ); ++ ++ // now eat all the focusouts that came as a result of this reparent... ++ XEvent event; ++ XLockDisplay((Display*) pWin->display); ++ HXBOOL status = XCheckTypedWindowEvent((Display*)pWin->display, (Window)pWin->window, ++ FocusOut, &event); ++ XUnlockDisplay((Display*) pWin->display); ++ while (m_bWindowCreatedByCreate && status) ++ { ++ // just discarding these ++ XLockDisplay((Display*) pWin->display); ++ status = XCheckTypedWindowEvent((Display*)pWin->display, (Window)pWin->window, ++ FocusOut, &event); ++ XUnlockDisplay((Display*) pWin->display); ++ } ++ ++ //Update the status text... ++ if(m_pStatusText) ++ { ++ m_pStatusText->ParentChangedSize(); ++ m_pStatusText->Show(); ++ } ++#if defined(HELIX_CONFIG_MOBLIN) ++ if(!m_pAttachWindowCallback) ++ { ++ m_pAttachWindowCallback = new CHXGenericCallback((void*)this, (fGenericCBFunc)AttachWindowCallback); ++ m_pAttachWindowCallback->AddRef(); ++ } ++ if(!m_pForceRedrawCallback) ++ { ++ m_pForceRedrawCallback = new CHXGenericCallback((void*)this, (fGenericCBFunc)ForceRedrawCallback); ++ m_pForceRedrawCallback->AddRef(); ++ } ++ ++ // schedule callback for Attaching Window ++ if(m_pAttachWindowCallback) ++ { ++ m_pAttachWindowCallback->CallbackScheduled(m_pScheduler->RelativeEnter(m_pAttachWindowCallback, 100)); ++ } ++ if(m_pForceRedrawCallback) ++ { ++ m_pForceRedrawCallback->CallbackScheduled(m_pScheduler->RelativeEnter(m_pForceRedrawCallback, 500)); ++ } ++ ++#endif ++#else ++ HX_ASSERT( "Not implemented..." == NULL ); ++#endif ++ return HXR_OK; ++} ++ ++#if defined(HELIX_CONFIG_MOBLIN) ++void CHXExSite::AttachWindowCallback(void* pParam) ++{ ++ CHXExSite* pObj = (CHXExSite*)pParam; ++ if (pObj) ++ { ++ pObj->_AttachWindow(); ++ } ++} ++ ++ ++void CHXExSite::ForceRedrawCallback(void* pParam) ++{ ++ CHXExSite* pObj = (CHXExSite*)pParam; ++ ++ if (pObj) ++ { ++ UINT32 ulNumOfChildren = pObj->GetNumberOfChildSites(); ++ if(pObj->m_pTopLevelSite) ++ { ++ pObj->m_pTopLevelSite->m_bDisableForceRedraw = FALSE; ++ } ++ for ( UINT32 i = 0; i < ulNumOfChildren; ++i ) ++ { ++ SPIHXSite spChildSite; ++ if ( SUCCEEDED( pObj->GetNthChildSite( i, *spChildSite.AsInOutParam() ) ) ++ && spChildSite.IsValid() ) ++ { ++ spChildSite->DamageRegion( NULL ); ++ spChildSite->ForceRedraw(); ++ } ++ ++ } ++ } ++} ++ ++void CHXExSite::RemovePendingCallback(CHXGenericCallback* pCB) ++{ ++ if (pCB && ++ pCB->GetPendingCallback() && ++ m_pScheduler) ++ { ++ m_pScheduler->Remove(pCB->GetPendingCallback()); ++ pCB->CallbackCanceled(); ++ } ++} ++#endif ++ ++HX_RESULT CHXExSite::_EnterFullScreenExt(HXxWindow* pWindow, IHXValues* pValues) ++{ ++#if 0 ++ m_bReparent = FALSE; ++ HX_RESULT res = HXR_OK; ++ UINT32 ulReparent = 0; ++ ++ if (pValues) ++ { ++ pValues->GetPropertyULONG32("Reparent", ulReparent); ++ } ++ ++ m_bReparent = (HXBOOL)ulReparent; ++ ++ if (m_bReparent) ++ { ++ res = _EnterFullScreen(pWindow); ++ } ++ else ++ { ++ res = _EnterFullScreenNoNewWindow(); ++ } ++ ++ CHXBaseSite::FullScreenEntered(res); ++ return res; ++#else ++ HX_ASSERT( "Not implemented..." == NULL ); ++ return HXR_OK; /* this makes compiler happy */ ++#endif ++} ++ ++HX_RESULT CHXExSite::_ExitFullScreenExt() ++{ ++#if 0 ++ HX_RESULT res = _ExitFullScreen(); ++#if defined(HELIX_CONFIG_MOBLIN) ++ // schedule callback for attaching window ++ if(m_pAttachWindowCallback) ++ { ++ m_pAttachWindowCallback->CallbackScheduled(m_pScheduler->RelativeEnter(m_pAttachWindowCallback, 100)); ++ } ++ // schedule callback for Force Redraw the window ++ if(m_pForceRedrawCallback) ++ { ++ m_pForceRedrawCallback->CallbackScheduled(m_pScheduler->RelativeEnter(m_pForceRedrawCallback, 500)); ++ } ++#endif ++ CHXBaseSite::FullScreenExited(res); ++ ++ return res; ++#else ++ HX_ASSERT( "Not implemented..." == NULL ); ++ return HXR_OK; /* this makes compiler happy */ ++#endif ++ ++} ++ ++HX_RESULT CHXExSite::_EventOccurred(HXxEvent* pEvent) ++{ ++ return HXR_OK; ++} ++ ++HX_RESULT CHXExSite::_TestFullScreen( void* hTestBitmap, ++ const char* pszStatusText ) ++{ ++#ifdef _DEBUG ++ fprintf( stderr, "Going to test full screen....\n" ); ++#endif ++ return HXR_OK; ++} ++ ++void CHXExSite::ProcessEvent(HXxEvent* pEvent) ++{ ++ if(pEvent) ++ { ++ //Expose event compression. Combine all outstanding expose events ++ //into one big region. ++ if(Expose==pEvent->event) ++ { ++ _CollapseExposeEvents((XEvent*)pEvent->param2); ++ } ++ } ++ ++ //Send the event to each registered UnixSite. ++ void* pSite = NULL; ++ void* pWindow = NULL; ++ POSITION pos = z_mapSiteToWindow.GetStartPosition(); ++ while( pos ) ++ { ++ z_mapSiteToWindow.GetNextAssoc(pos, pSite, pWindow); ++ CHXExSite* pSiteWindowed = (CHXExSite*)pSite; ++ CHXExSite* pTopLevel = NULL; ++ HX_ASSERT(pSiteWindowed); ++ pSiteWindowed->AddRef(); ++ pTopLevel = (CHXExSite*)pSiteWindowed->GetTopLevelSite(); ++ ++ if(pEvent) ++ { ++ //Call back into the basesite's event loop. ++ pTopLevel->EventOccurred(pEvent); ++ } ++ ++ //XXXgfw As a workaround for the overlay not moving while the ++ //player is paused, we will check it here and update it if needed. ++ ++ //XXXRGG We might be able to use X's ConfigureNotify messages instead ++ //of doing a refresh every 50 ms. ++ pTopLevel->_UpdateOverlayIfNeeded(); ++ ++ pSiteWindowed->Release(); ++ } ++} ++ ++void CHXExSite::_CollapseExposeEvents(XEvent* xevent) ++{ ++ Display* display = xevent->xany.display; ++ Window window = xevent->xany.window; ++ XExposeEvent* expose_event = (XExposeEvent*)xevent; ++ XEvent new_event; ++ XExposeEvent* new_expose_event = (XExposeEvent*)&new_event; ++ ushort x1; ++ ushort y1; ++ ushort x2; ++ ushort y2; ++ ushort x3; ++ ushort y3; ++ ++ x1 = expose_event->x; ++ y1 = expose_event->y; ++ x2 = x1 + expose_event->width; ++ y2 = y1 + expose_event->height; ++ XLockDisplay(display); ++ HXBOOL status = XCheckWindowEvent(display, window, ExposureMask, &new_event); ++ XUnlockDisplay(display); ++ while( status) ++ { ++ if (new_expose_event->x < x1) ++ x1 = new_expose_event->x; ++ ++ if (new_expose_event->y < y1) ++ y1 = new_expose_event->y; ++ ++ x3 = new_expose_event->x + new_expose_event->width; ++ if (x3 > x2) ++ x2 = x3; ++ ++ y3 = new_expose_event->y + new_expose_event->height; ++ if (y3 > y2) ++ y2 = y3; ++ XLockDisplay(display); ++ status = XCheckWindowEvent(display, window, ExposureMask, &new_event); ++ XUnlockDisplay(display); ++ ++ } ++ ++ expose_event->x = x1; ++ expose_event->y = y1; ++ expose_event->width = x2 - x1; ++ expose_event->height = y2 - y1; ++ expose_event->count = new_expose_event->count; ++} ++ ++ ++HXBOOL CHXExSite::_ShouldProcess(HXxEvent* pEvent) ++{ ++ HXBOOL bShouldProcessThisEvent = TRUE; ++ ++ ++ if( !IsSiteVisible() ) ++ { ++ switch (pEvent->event) ++ { ++ case ButtonPress: ++ case ButtonRelease: ++ case Expose: ++ case FocusIn: ++ bShouldProcessThisEvent = FALSE; ++ break; ++ default: ++ break; ++ } ++ } ++ ++ if(m_pWindow && m_pWindow->window!=pEvent->window) ++ { ++ bShouldProcessThisEvent = FALSE; ++ } ++ return bShouldProcessThisEvent; ++} ++ ++ ++/////////////////////////////////////////////////////// ++// ++// UnixEventHandler methods... ++// ++CHXExSite::UnixEventHandler::UnixEventHandler(CHXExSite* pParent) ++ : m_pParent(pParent), ++ m_lRefCount(0), ++ m_cbHandle(0) ++{ ++ HX_ASSERT(m_pParent); ++ HX_ASSERT(m_pParent->m_pScheduler); ++ m_cbHandle = m_pParent->m_pScheduler->RelativeEnter((IHXCallback*)this, 30); ++} ++ ++CHXExSite::UnixEventHandler::~UnixEventHandler() ++{ ++ CancelCallback(); ++} ++ ++void ++CHXExSite::UnixEventHandler::CancelCallback() ++{ ++ if( m_cbHandle && m_pParent && m_pParent->m_pScheduler ) ++ { ++ UINT32 tempHandle = m_cbHandle; ++ m_cbHandle = 0; ++ m_pParent->m_pScheduler->Remove(tempHandle); ++ } ++} ++ ++HX_RESULT CHXExSite::UnixEventHandler::QueryInterface(REFIID riid, void** ppvObj) ++{ ++ if (IsEqualIID(riid, IID_IHXCallback)) ++ { ++ AddRef(); ++ *ppvObj = (IHXCallback*)this; ++ return HXR_OK; ++ } ++ else if (IsEqualIID(riid, IID_IUnknown)) ++ { ++ AddRef(); ++ *ppvObj = this; ++ return HXR_OK; ++ } ++ ++ *ppvObj = NULL; ++ return HXR_NOINTERFACE; ++} ++ ++ULONG32 CHXExSite::UnixEventHandler::AddRef() ++{ ++ return InterlockedIncrement(&m_lRefCount); ++} ++ ++ULONG32 CHXExSite::UnixEventHandler::Release() ++{ ++ HX_ASSERT(m_lRefCount>0); ++ if( InterlockedDecrement(&m_lRefCount)>0 ) ++ { ++ return m_lRefCount; ++ } ++ delete this; ++ return 0; ++} ++ ++//IHXCallback methods ++HX_RESULT CHXExSite::UnixEventHandler::Func() ++{ ++ XEvent xevent; ++ static HXxEvent pnevent; ++ ++ m_cbHandle = 0; ++ XLockDisplay(m_pParent->zm_display); ++ int status = XPending(m_pParent->zm_display); ++ XUnlockDisplay(m_pParent->zm_display); ++ while(status) ++ { ++ XLockDisplay(m_pParent->zm_display); ++ XNextEvent(m_pParent->zm_display, &xevent); ++ XUnlockDisplay(m_pParent->zm_display); ++ ++ // package native event in HXxEvent and send to dispatcher ++ pnevent.event = xevent.type; ++ pnevent.window = (void *)xevent.xany.window; ++ pnevent.param1 = xevent.xany.display; ++ pnevent.param2 = &xevent; ++ ++ m_pParent->ProcessEvent(&pnevent); ++ XLockDisplay(m_pParent->zm_display); ++ status = XPending(m_pParent->zm_display); ++ XUnlockDisplay(m_pParent->zm_display); ++ } ++ ++ if (m_pParent && m_pParent->m_pScheduler) ++ { ++ m_cbHandle = m_pParent->m_pScheduler->RelativeEnter((IHXCallback*)this, 30); ++ } ++ return HXR_OK; ++} ++ ++void CHXExSite::_UpdateOverlayIfNeeded() ++{ ++ if( m_pVideoSurface ) ++ { ++ if( m_pVideoSurface->m_nBltMode == HX_OVERLAY_BLT ) ++ { ++ ULONG32 ulNow = HX_GET_BETTERTICKCOUNT(); ++ CUnixSurf* pSurf = (CUnixSurf*)m_pVideoSurface; ++ if( ulNow- pSurf->m_ulLastOverlayUpdateTime > 50 ) ++ { ++ SiteMoving(0,0); ++ } ++ } ++ } ++ LISTPOSITION pos = m_ChildrenInZOrder.GetHeadPosition(); ++ while(pos) ++ { ++ CHXExSite* pSite = (CHXExSite*)m_ChildrenInZOrder.GetNext(pos); ++ pSite->_UpdateOverlayIfNeeded(); ++ } ++} ++ ++ ++HXBOOL CHXExSite::_ShouldEnterForceRedraw() ++{ ++ if( !m_bDamaged || !m_pUser || !IsSiteVisible() ) ++ { ++ return FALSE; ++ } ++ ++ if(InterlockedIncrement(&m_lBltEntryCount)>1) ++ { ++ InterlockedDecrement(&m_lBltEntryCount); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ ++void CHXExSite::_ExitForceRedraw() ++{ ++ InterlockedDecrement(&m_lBltEntryCount); ++} ++ +Index: helix-libs/clientapps/clutter/exsite.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exsite.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,272 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Source last modified: $Id: unixsite.h,v 1.10.2.3 2008/06/05 14:24:30 lovish Exp $ ++ * ++ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, ++ * are subject to the current version of the RealNetworks Public ++ * Source License (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the current version of the RealNetworks Community ++ * Source License (the "RCSL") available at ++ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL ++ * will apply. You may also obtain the license terms directly from ++ * RealNetworks. You may not use this file except in compliance with ++ * the RPSL or, if you have a valid RCSL with RealNetworks applicable ++ * to this file, the RCSL. Please see the applicable RPSL or RCSL for ++ * the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License Version 2 (the ++ * "GPL") in which case the provisions of the GPL are applicable ++ * instead of those above. If you wish to allow use of your version of ++ * this file only under the terms of the GPL, and not to allow others ++ * to use your version of this file under the terms of either the RPSL ++ * or RCSL, indicate your decision by deleting the provisions above ++ * and replace them with the notice and other provisions required by ++ * the GPL. If you do not delete the provisions above, a recipient may ++ * use your version of this file under the terms of any one of the ++ * RPSL, the RCSL or the GPL. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the ++ * portions it created. ++ * ++ * This file, and the files included with this file, is distributed ++ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY ++ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ++ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ++ * ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * Phil Dibowitz (jaymzh) ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _UNIXSITE_H ++#define _UNIXSITE_H ++ ++#if defined(USE_XWINDOWS) ++#include ++#include ++#include ++#include ++#include ++#include ++#endif ++ ++#include "basesite.h" ++#include "hxcbobj.h" ++#include "player.h" ++ ++class CHXExSite : public CHXBaseSite ++{ ++public: ++ ++ friend class CExSurf; ++ friend class CExRootSurf; ++ ++ CHXExSite( IUnknown* pContext, ++ IUnknown* pUnkOuter, ++ INT32 lInitialZorder, ++ on_new_frame_cb_t on_new_frame_cb = NULL, ++ void *context = NULL); ++ ++ static void ProcessEvent(HXxEvent* pEvent); ++ Window CreateXWindow( Window win ); ++ ++ void _ForwardUpdateEvent(HXxEvent* pEvent); ++ ++ //static member vars. ++ static Display* zm_display; ++ void _UpdateOverlayIfNeeded(); ++ HXBOOL m_bIgnoreFocusOutInFS; ++ ++ //We override this. ++ void CheckColorSettings(); ++ ++protected: ++ ++ virtual ~CHXExSite(); ++ ++ // ++ // CHXExSite only methods.... ++ // ++ HX_RESULT _OpenXDisplay(char* DiplayString); ++ static void _CollapseExposeEvents(XEvent* xevent); ++ HXBOOL _ShouldProcess(HXxEvent* pEvent); ++ void _DrawArrows(); ++ void _CreateHorizScrollBar(void); ++ void _CreateVertScrollBar(void); ++ HXBOOL _InButton(HXxPoint& pt, int x, int y ); ++ void _DestroyScrollButtons(); ++ void _MapScrollButtons(); ++ void _MapHorzScroll(); ++ void _MapVertScroll(); ++ void _UnmapHorzScroll(); ++ void _UnmapVertScroll(); ++ void _UnmapScrollButtons(); ++ void _BuildClipRegion(); ++ void _ReleaseClippingRegion(); ++ ++ // ++ // Seperate object for our callbacks to keep the events flowing. ++ // ++ class UnixEventHandler : public IHXCallback ++ { ++ public: ++ UnixEventHandler(CHXExSite* pParent); ++ ++ //IUnknown methods ++ virtual HX_RESULT QueryInterface(REFIID riid, void** ppvObj); ++ virtual ULONG32 AddRef(); ++ virtual ULONG32 Release(); ++ ++ //IHXCallback methods ++ virtual HX_RESULT Func(); ++ void CancelCallback(); ++ ++ private: ++ virtual ~UnixEventHandler(); ++ ++ UnixEventHandler(); ++ UnixEventHandler(const UnixEventHandler&); ++ UnixEventHandler& operator=(const UnixEventHandler& it ); ++ ++ CHXExSite* m_pParent; ++ LONG32 m_lRefCount; ++ CallbackHandle m_cbHandle; ++ ++ IUnknown* m_pUnkPlayer; ++ }; ++ ++ ++ // ++ // CHXBaseSite inherited methods ++ // ++ virtual void _NeedWindowedSite(); ++ virtual void _AttachWindow(); ++ virtual void _DetachWindow(); ++ virtual void* _Create(void* ParentWindow, UINT32 style); ++ virtual void _Destroy(HXxWindow* pWindow); ++ virtual void _SetSize(HXxSize size); ++ virtual void _SetPosition(HXxPoint position); ++ virtual void _DamageRect(HXxRect rect); ++ virtual void _DamageRegion(HXxRegion rect); ++ virtual HXBOOL _ShouldEnterForceRedraw(); ++ virtual void _ExitForceRedraw(); ++ virtual void _SendOSUpdateMessage(); ++ virtual void _ShowSite(HXBOOL bShow); ++ virtual HXBOOL _AtSystemTime(); ++ virtual void _GetDeviceCaps( void* hdc, ++ UINT16& uBitesPerPixel, ++ UINT16& uHorzRes, ++ UINT16& uVertRes ); ++ virtual void _GetWindowRect(HXxRect* destRect); ++ virtual void _DestroySliders(); ++ virtual HXBOOL _HandleOSEvents(HXxEvent* pEvent); ++ virtual HXBOOL _ConvertToHXEvent(HXxEvent* pEvent); ++ virtual void _GenerateOSEvent(HXxEvent* pEvent, HXxEvent* pEvent2); ++ virtual void _GenerateSetCursorEvent(); ++ virtual void _TryCreateXSlider(); ++ virtual void _SetXSliderValues(INT32 range, INT32 pageSize); ++ virtual void _TryCreateYSlider(); ++ virtual void _SetYSliderValues(INT32 range, INT32 pageSize); ++ virtual void _GetSystemSizeOfSliders(INT32* pWidth, INT32* pHeight); ++ virtual HXBOOL _IsWindowVisible(); ++ virtual void _ShowXSlider(HXBOOL bShow); ++ virtual void _MoveXSlider( INT32 left, ++ INT32 top, ++ INT32 right, ++ INT32 bottom, ++ HXBOOL bRedraw ); ++ virtual void _ShowYSlider(HXBOOL bShow); ++ virtual void _MoveYSlider( INT32 left, ++ INT32 top, ++ INT32 right, ++ INT32 bottom, ++ HXBOOL bRedraw); ++ virtual HXBOOL _DoesXSliderExist(); ++ virtual void* _GetContainingWindow(); ++ virtual void _GetCursorPos(HXxPoint* pPoint); ++ virtual void _MapPointToOSWindow(HXxPoint* pPt, void** pWindowHandle); ++ virtual void* _GetWindowWithCursor(); ++ virtual void _ReInitPrimarySurface(); ++ virtual HXBOOL _MoveWindow( void* , ++ INT32 X, ++ INT32 Y, ++ INT32 nWidth, ++ INT32 nHeight, ++ HXBOOL bRepaint); ++ virtual HXBOOL _UpdateWindow(void* hWnd); ++ virtual HXBOOL _ShowWindow(void* hWnd, INT32 nCmdShow); ++ virtual HXBOOL _SetWindowPos(void* hWnd, ++ void* hWndInsertAfter, ++ INT32 X, ++ INT32 Y, ++ INT32 cx, ++ INT32 cy, ++ INT32 uFlags); ++ virtual HXBOOL _SetWindowRgn(void* hWnd, HXREGION* hRgn, HXBOOL bRedraw); ++ virtual void _SetFocus(void* pWindow); ++ ++ virtual HX_RESULT _EnterFullScreen(HXxWindow* pWindow = NULL); ++ virtual HX_RESULT _EventOccurred(HXxEvent* pEvent); ++ virtual HX_RESULT _ExitFullScreen(); ++ virtual HX_RESULT _TestFullScreen( void* hTestBitmap, ++ const char* pszStatusText ); ++ virtual HX_RESULT _EnterFullScreenExt(HXxWindow* pWindow, IHXValues* pValues); ++ virtual HX_RESULT _ExitFullScreenExt(); ++#if defined(HELIX_CONFIG_MOBLIN) ++ static void AttachWindowCallback(void *pParam); ++ static void ForceRedrawCallback(void *pParam); ++ void RemovePendingCallback(CHXGenericCallback* pCB); ++ ++ CHXGenericCallback* m_pAttachWindowCallback; ++ CHXGenericCallback* m_pForceRedrawCallback; ++#endif ++ HXBOOL m_bReparent; ++ ++private: ++ ++ //Protect unintentional copy and default ctors. ++ CHXExSite(); ++ CHXExSite( const CHXExSite& ); ++ CHXExSite& operator=( const CHXExSite& it ); ++ HX_RESULT _EnterFullScreenNoNewWindow(); ++ ++ //member vars. ++ UnixEventHandler* m_pUnixEventHandler; ++ static Cursor zm_GrabCursor; ++ Window m_ScrollHorizButtonL; ++ Window m_ScrollHorizButtonR; ++ Window m_ScrollVertButtonT; ++ Window m_ScrollVertButtonB; ++ Window m_winFullScreenWindow; ++ Window m_winOldParent; ++ HXxPoint m_ptScrollHorizPosL; ++ HXxPoint m_ptScrollHorizPosR; ++ HXxPoint m_ptScrollVertPosT; ++ HXxPoint m_ptScrollVertPosB; ++ HXxPoint m_ptFullScreenOffset; ++ HXxSize m_PreFullScreenSize; ++ HXBOOL m_bScrollingInProgress; ++ int m_nScrollDir; ++ HXBOOL m_bLastPointInSite; ++ HXBOOL m_bDamaged; ++ // ++ //Private helpers... ++ // ++ ++ //returns the HX_VK associated with this keysym.... ++ UINT32 _MapKeySymToHXVK(KeySym tmpSym, UINT32& uFlags); ++ on_new_frame_cb_t m_on_new_frame_cb; ++ void *m_context; ++}; ++ ++#endif //_UNIXSITE_H +Index: helix-libs/clientapps/clutter/exsitsup.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exsitsup.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,455 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifdef _WIN16 ++#include ++#endif ++ ++#include "hxcom.h" ++#include "hxtypes.h" ++#include "hxwintyp.h" ++#include "hxwin.h" ++#include "ihxpckts.h" ++#include "hxcomm.h" ++#include "fivemmap.h" ++#include "hxstring.h" // CHXString ++#include "exsite.h" ++#include "exsitsup.h" ++#include "pckunpck.h" // CreateBufferCCF ++#include "ciddefs.h" // CID_RGB32 ++#if defined(HELIX_FEATURE_PNG) ++#include "pxpngenc.h" // PXPNGEncode::EncodeToPNGBuffer ++#endif // HELIX_FEATURE_PNG ++#include "print.h" ++ ++ ++#include "globals.h" ++struct _stGlobals*& GetGlobal(); ++ ++/************************************************************************ ++ * Method: ++ * Constructor ++ */ ++ ExampleSiteSupplier::ExampleSiteSupplier(IUnknown* pUnkPlayer, on_new_frame_cb_t on_new_frame_cb = NULL, void *context = NULL) ++ : m_lRefCount(0) ++ , m_pSiteManager(NULL) ++ , m_pSite(NULL) ++ , m_pSiteCapture(NULL) ++ , m_pCaptureBuffer(NULL) ++ , m_pCCF(NULL) ++ , m_pUnkPlayer(pUnkPlayer) ++ , m_on_new_frame_cb(on_new_frame_cb) ++ , m_context(context) ++{ ++ if (m_pUnkPlayer) ++ { ++ m_pUnkPlayer->QueryInterface(IID_IHXSiteManager, ++ (void**)&m_pSiteManager); ++ ++ //printf("pauldebug:m_pUnkplayer->QueryInterface for m_pCCF calling\n"); ++ m_pUnkPlayer->QueryInterface(IID_IHXCommonClassFactory, ++ (void**)&m_pCCF); ++ //printf("pauldebug:m_pUnkplayer->QueryInterface for m_pCCF called\n"); ++ ++ m_pUnkPlayer->AddRef(); ++ } ++}; ++ ++/************************************************************************ ++ * Method: ++ * Destructor ++ */ ++ExampleSiteSupplier::~ExampleSiteSupplier() ++{ ++ HX_RELEASE(m_pSiteManager); ++ HX_RELEASE(m_pSite); ++ HX_RELEASE(m_pSiteCapture); ++ HX_RELEASE(m_pCaptureBuffer); ++ HX_RELEASE(m_pCCF); ++ HX_RELEASE(m_pUnkPlayer); ++} ++ ++/************************************************************************ ++ * Method: ++ * IUnknown::QueryInterface ++ */ ++ STDMETHODIMP ++ExampleSiteSupplier::QueryInterface(REFIID riid, void** ppvObj) ++{ ++ if (IsEqualIID(riid, IID_IUnknown)) ++ { ++ AddRef(); ++ *ppvObj = (IUnknown*)(IHXSiteSupplier*)this; ++ return HXR_OK; ++ } ++ else if (IsEqualIID(riid, IID_IHXSiteSupplier)) ++ { ++ AddRef(); ++ *ppvObj = (IHXSiteSupplier*)this; ++ return HXR_OK; ++ } ++ ++ *ppvObj = NULL; ++ return HXR_NOINTERFACE; ++} ++ ++/************************************************************************ ++ * Method: ++ * IUnknown::AddRef ++ */ ++ STDMETHODIMP_(ULONG32) ++ExampleSiteSupplier::AddRef() ++{ ++ return InterlockedIncrement(&m_lRefCount); ++} ++ ++/************************************************************************ ++ * Method: ++ * IUnknown::Release ++ */ ++ STDMETHODIMP_(ULONG32) ++ExampleSiteSupplier::Release() ++{ ++ if (InterlockedDecrement(&m_lRefCount) > 0) ++ { ++ return m_lRefCount; ++ } ++ ++ delete this; ++ return 0; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXSiteSupplier::SitesNeeded ++ * Purpose: ++ * Called to inform the site supplier that a site with a particular ++ * set of characteristics is needed. If the site supplier can ++ * fulfill the request it should call the site manager and add one ++ * or more new sites. ++ * Note that the request for sites is associated with a Request ID ++ * the client core will inform the site supplier when this requested ++ * site is no longer needed. ++ */ ++STDMETHODIMP ++ExampleSiteSupplier::SitesNeeded ++( ++ UINT32 uRequestID, ++ IHXValues* pProps ++ ) ++{ ++ /* ++ * Don't create a site if the -NULL_RENDER command line option ++ * was given. - jfarr ++ */ ++ if (GetGlobal()->g_bNullRender) ++ { ++ return (HXR_OK); ++ } ++ ++ /* ++ * If there are no properties, then we can't really create a ++ * site, because we have no idea what type of site is desired! ++ */ ++ if (!pProps) ++ { ++ return HXR_INVALID_PARAMETER; ++ } ++ ++ HRESULT hres = HXR_OK; ++ IHXValues* pSiteProps = NULL; ++ IHXSiteWindowed* pSiteWindowed = NULL; ++ IHXBuffer* pValue = NULL; ++ UINT32 style = 0; ++ IHXSite* pSite = NULL; ++ ++#if 0 ++ // Just let the RMA client core create a windowed site for us. ++ hres = m_pCCF->CreateInstance(CLSID_IHXSiteWindowed,(void**)&pSiteWindowed); ++ if (HXR_OK != hres) ++ { ++ goto exit; ++ } ++#else ++ { ++ *(void **)&pSiteWindowed = (IUnknown*)(IHXSiteWindowed*)(new CHXExSite(GetGlobal()->pMediaPlatform, NULL, 0, m_on_new_frame_cb, m_context)); ++ hres = ((IUnknown*)*(void **)&pSiteWindowed)->QueryInterface(IID_IHXSiteWindowed, (void**)&pSiteWindowed); ++ if (HXR_OK != hres) ++ { ++ goto exit; ++ } ++ } ++#endif ++ ++ hres = pSiteWindowed->QueryInterface(IID_IHXSite,(void**)&pSite); ++ if (HXR_OK != hres) ++ { ++ goto exit; ++ } ++ ++ if( !m_pSite ) ++ { ++ m_pSite = pSite; ++ m_pSite->AddRef(); ++ } ++ ++ ++ hres = pSiteWindowed->QueryInterface(IID_IHXValues,(void**)&pSiteProps); ++ if (HXR_OK != hres) ++ { ++ goto exit; ++ } ++ ++ /* ++ * We need to figure out what type of site we are supposed to ++ * to create. We need to "switch" between site user and site ++ * properties. So look for the well known site user properties ++ * that are mapped onto sites... ++ */ ++ hres = pProps->GetPropertyCString("playto",pValue); ++ if (HXR_OK == hres) ++ { ++ pSiteProps->SetPropertyCString("channel",pValue); ++ HX_RELEASE(pValue); ++ } ++ else ++ { ++ hres = pProps->GetPropertyCString("name",pValue); ++ if (HXR_OK == hres) ++ { ++ pSiteProps->SetPropertyCString("LayoutGroup",pValue); ++ HX_RELEASE(pValue); ++ } ++ } ++ ++#ifdef _WINDOWS ++ style = WS_OVERLAPPED | WS_VISIBLE | WS_CLIPCHILDREN; ++#endif ++ ++ hres = pSiteWindowed->Create(NULL, style); ++ if (HXR_OK != hres) ++ { ++ goto exit; ++ } ++ ++ /* ++ * We need to wait until we have set all the properties before ++ * we add the site. ++ */ ++ hres = m_pSiteManager->AddSite(pSite); ++ if (HXR_OK != hres) ++ { ++ goto exit; ++ } ++#ifdef _WINDOWS ++ { ++ HXxWindow* pWindow = pSiteWindowed->GetWindow(); ++ if (pWindow && pWindow->window) ::SetForegroundWindow( (HWND)(pWindow->window) ); ++ } ++#endif ++ m_CreatedSites.SetAt((void*)uRequestID,pSite); ++ pSite->AddRef(); ++ ++exit: ++ ++ HX_RELEASE(pSiteProps); ++ HX_RELEASE(pSiteWindowed); ++ HX_RELEASE(pSite); ++ ++ return hres; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXSiteSupplier::SitesNotNeeded ++ * Purpose: ++ * Called to inform the site supplier that all sites from a previos ++ * site request are no longer needed. If the site supplier had ++ * previously created non-persistant sites (like popup windows) ++ * to fulfill a request for sites it should call the site manager ++ * and remove those sites. ++ */ ++STDMETHODIMP ++ExampleSiteSupplier::SitesNotNeeded(UINT32 uRequestID) ++{ ++ IHXSite* pSite = NULL; ++ IHXSiteWindowed* pSiteWindowed = NULL; ++ void* pVoid = NULL; ++ ++ if (!m_CreatedSites.Lookup((void*)uRequestID,pVoid)) ++ { ++ return HXR_INVALID_PARAMETER; ++ } ++ pSite = (IHXSite*)pVoid; ++ ++ m_pSiteManager->RemoveSite(pSite); ++ ++ // Need to actually do the work on destroying the window ++ // and all that jazz. ++ pSite->QueryInterface(IID_IHXSiteWindowed,(void**)&pSiteWindowed); ++ ++ pSiteWindowed->Destroy(); ++ ++ // ref count = 2 ++ pSiteWindowed->Release(); ++ ++ // ref count = 1; deleted from this object's view! ++ pSite->Release(); ++ ++ m_CreatedSites.RemoveKey((void*)uRequestID); ++ ++ return HXR_OK; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXSiteSupplier::BeginChangeLayout ++ * Purpose: ++ * Called to inform the site supplier a layout change has beginning ++ * it can expect to recieve SitesNeeded() and SitesNotNeeded() calls ++ * while a layout change is in progress, ++ */ ++STDMETHODIMP ++ExampleSiteSupplier::BeginChangeLayout() ++{ ++ return HXR_OK; ++} ++ ++/************************************************************************ ++ * Method: ++ * IHXSiteSupplier::DoneChangeLayout ++ * Purpose: ++ * Called to inform the site supplier the layout change has been ++ * completed. ++ */ ++STDMETHODIMP ++ExampleSiteSupplier::DoneChangeLayout() ++{ ++ return HXR_OK; ++} ++ ++HX_RESULT ++ExampleSiteSupplier::CaptureImage(CHXString pszFileName, INT32 dWidth, INT32 dHeight) ++{ ++ HX_RESULT res=HXR_FAIL; ++ ++ // Get the IHXSiteCapture object from the site ++ if (m_pSiteCapture == NULL) ++ { ++ if (m_pSite && m_pSite->QueryInterface(IID_IHXSiteCapture, (void**)&m_pSiteCapture) == HXR_OK) ++ { ++ m_pSiteCapture->AddRef(); ++ } ++ } ++ ++ // Create the buffer that will receive the image data ++ if (m_pCaptureBuffer == NULL) ++ { ++ CreateBufferCCF(m_pCaptureBuffer, m_pCCF); ++ if (!m_pCaptureBuffer) ++ { ++ return HXR_OUTOFMEMORY; ++ } ++ } ++ ++ HXBOOL bCanCapture = FALSE; ++ ++ // Check if the site is available to capture an image ++ if (m_pSiteCapture && (res = m_pSiteCapture->CanCapture(bCanCapture)) == HXR_OK && bCanCapture) ++ { ++ HX_RESULT res; ++ HXxSize outputSize; ++ outputSize.cx = dWidth; ++ outputSize.cy = dHeight; ++ m_strFileName = pszFileName; ++ ++ // Asynchronous call. CaptureDone() will be called with result. ++ res = m_pSiteCapture->Capture((IHXSiteCaptureResponse*)this, m_pCaptureBuffer, &outputSize, CID_RGB32); ++ } ++ ++ return res; ++ ++} ++ ++// ++// IHXSiteCaptureResponse::CaptureDone ++// ++// Called when the site has captured the next frame. ++// bmiOutputFormat points to image format description which ++// is valid until the completion of CaptureDone. ++// bmiOutputFormat can be different for every capture. ++// pCaptureBuffer holds the image if supplied in ++// Capture() method. pCaptureBuffer is automatically ++// resized if it has insufficient size to hold the image ++// data. ++// ++// status may be: ++// HXR_FAIL -- No capture was done. General Error. All data is invalid. ++// HXR_OK -- Capture was done. Both variables are valid. ++STDMETHODIMP ++ExampleSiteSupplier::CaptureDone(REF(HX_RESULT) status, ++ REF(HXBitmapInfoHeader) bmiOutputFormat, ++ REF(IHXBuffer*) pCaptureBuffer) ++{ ++ if (status == HXR_OK) ++ { ++#if defined(HELIX_FEATURE_PNG) ++ // Convert capture buffer into PNG ++ IHXBuffer* pConvertedBuffer=NULL; ++ HX_RESULT res = HXR_OK; ++ res = PXPNGEncode::EncodeToPNGBuffer(pCaptureBuffer, &bmiOutputFormat, m_pCCF, pConvertedBuffer); ++ if (res == HXR_OK && !m_strFileName.IsEmpty()) ++ { ++ CHXString strTail = m_strFileName.Right(4); ++ if (strTail.CompareNoCase(".png") != 0) ++ { ++ m_strFileName += ".png"; ++ } ++ ++ FILE* fp = fopen(m_strFileName, "wb"); ++ if (fp) ++ { ++ fwrite(pConvertedBuffer->GetBuffer(), 1, pConvertedBuffer->GetSize(), fp); ++ fclose(fp); ++ STDOUT("Captured image to PNG file: %s\n", (const char*)m_strFileName); ++ STDOUT("File size: %ld\n", pConvertedBuffer->GetSize()); ++ } ++ HX_RELEASE(pConvertedBuffer); ++ } ++#endif // HELIX_FEATURE_PNG ++ } ++ ++ return status; ++} +Index: helix-libs/clientapps/clutter/exsitsup.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exsitsup.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,154 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _EXSITSUP_H_ ++#define _EXSITSUP_H_ ++ ++#include "fivemmap.h" ++#include "player.h" ++ ++/**************************************************************************** ++ * ++ * Class: ++ * ++ * ExampleSiteSupplier ++ * ++ * Purpose: ++ * ++ * Implementation for ragui's IHXSiteSupplier ++ * ++ */ ++class ExampleSiteSupplier : ++ public IHXSiteSupplier ++ , public IHXSiteCaptureResponse ++{ ++private: ++ LONG32 m_lRefCount; ++ IHXSiteManager* m_pSiteManager; ++ IHXSite* m_pSite; ++ IHXSiteCapture* m_pSiteCapture; ++ IHXBuffer* m_pCaptureBuffer; ++ IHXCommonClassFactory* m_pCCF; ++ IUnknown* m_pUnkPlayer; ++ FiveMinuteMap m_CreatedSites; ++ CHXString m_strFileName; ++ on_new_frame_cb_t m_on_new_frame_cb; ++ void * m_context; ++ ++ ~ExampleSiteSupplier(); ++ ++public: ++ ExampleSiteSupplier(IUnknown* pUnkPlayer, on_new_frame_cb_t new_frame_cb = NULL, void *context = NULL); ++ ++ /* ++ * IUnknown methods ++ */ ++ STDMETHOD(QueryInterface) (THIS_ ++ REFIID riid, ++ void** ppvObj); ++ ++ STDMETHOD_(ULONG32,AddRef) (THIS); ++ ++ STDMETHOD_(ULONG32,Release) (THIS); ++ ++ /* ++ * IHXSiteSupplier methods ++ */ ++ ++ /************************************************************************ ++ * Method: ++ * IHXSiteSupplier::SitesNeeded ++ * Purpose: ++ * Called to inform the site supplier that a site with a particular ++ * set of characteristics is needed. If the site supplier can ++ * fulfill the request it should call the site manager and add one ++ * or more new sites. ++ * Note that the request for sites is associated with a Request ID ++ * the client core will inform the site supplier when this requested ++ * site is no longer needed. ++ */ ++ STDMETHOD(SitesNeeded) (THIS_ ++ UINT32 uRequestID, ++ IHXValues* pSiteProps); ++ ++ /************************************************************************ ++ * Method: ++ * IHXSiteSupplier::SitesNotNeeded ++ * Purpose: ++ * Called to inform the site supplier that all sites from a previos ++ * site request are no longer needed. If the site supplier had ++ * previously created non-persistant sites (like popup windows) ++ * to fulfill a request for sites it should call the site manager ++ * and remove those sites. ++ */ ++ STDMETHOD(SitesNotNeeded) ++ (THIS_ ++ UINT32 uRequestID); ++ ++ ++ /************************************************************************ ++ * Method: ++ * IHXSiteSupplier::BeginChangeLayout ++ * Purpose: ++ * Called to inform the site supplier a layout change has beginning ++ * it can expect to recieve SitesNeeded() and SitesNotNeeded() calls ++ * while a layout change is in progress, ++ */ ++ STDMETHOD(BeginChangeLayout) (THIS); ++ ++ /************************************************************************ ++ * Method: ++ * IHXSiteSupplier::DoneChangeLayout ++ * Purpose: ++ * Called to inform the site supplier the layout change has been ++ * completed. ++ */ ++ STDMETHOD(DoneChangeLayout) (THIS); ++ ++ /* ++ * IHXSiteCaptureResponse ++ */ ++ STDMETHOD(CaptureDone) (THIS_ ++ REF(HX_RESULT) status, ++ REF(HXBitmapInfoHeader) bmiOutputFormat, ++ REF(IHXBuffer*) pImageDataBuffer ++ ); ++ ++ HX_RESULT CaptureImage(CHXString pFileName, INT32 dWidth, INT32 dHeight); ++ ++}; ++ ++#endif // _EXSITSUP_H_ ++ +Index: helix-libs/clientapps/clutter/exstateadvsnk.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exstateadvsnk.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,229 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include ++ ++#include "hxtypes.h" ++ ++#include "hxcom.h" ++#include "hxcomm.h" ++#include "hxmon.h" ++#include "hxcore.h" ++#include "hxengin.h" ++#include "hxclsnk.h" ++#include "hxgroup.h" ++#include "hxstrutl.h" ++#include "exstateadvsnk.h" ++#include "hxstring.h" ++#include "hxprefs.h" ++#include "excontxt.h" ++ ++#include "print.h" ++ ++#include "globals.h" ++#include "player.h" ++ ++struct _stGlobals*& GetGlobal(); //in main.cpp ++ ++#ifdef __TCS__ ++extern unsigned long gStreamTime; ++ ++static int iOpened = 0; ++ ++ ++#if defined(__cplusplus) ++extern "C" { ++#endif /* defined(__cplusplus) */ ++ ++typedef enum hookBuffering { ++ eContacting = 0, ++ eConnecting = 1, ++ eBuffering = 2, ++ ePlaying = 3 ++}hookBuffering; ++ ++void hookRealAudio_Buffering(hookBuffering connectState, int pct); ++ ++void hookRealAudio_PlayPosition(unsigned long current,unsigned long duration); ++ ++typedef enum hookState { ++ ePlay = 0, ++ ePause = 1, ++ eStop = 2, ++ eResume = 3, ++ eComplete // Clip is done playing ++}hookState; ++void hookRealAudio_State(hookState newState); ++ ++ ++#if defined(__cplusplus) ++} ++#endif /* defined(__cplusplus) */ ++ ++#endif // __TCS__ ++ ++void PrintBuffer(const char* pszName,const unsigned char* pbBuf, unsigned int dwBytes); ++ ++ExampleClientStateAdviceSink::ExampleClientStateAdviceSink(IUnknown* pUnknown, LONG32 lClientIndex, on_state_change_cb_t on_state_change_cb, void *context) ++ : m_lRefCount (0) ++ , m_lClientIndex (lClientIndex) ++ , m_pUnknown (NULL) ++ , m_State (HX_CLIENT_STATE_READY) ++ , m_state_change_cb(on_state_change_cb) ++ , m_context(context) ++{ ++ if (pUnknown) ++ { ++ m_pUnknown = pUnknown; ++ m_pUnknown->AddRef(); ++ ++ IHXPlayer* pPlayer; ++ IHXClientStateAdviseSinkControl *pStateControl; ++ if(HXR_OK == m_pUnknown->QueryInterface(IID_IHXPlayer, ++ (void**)&pPlayer)) ++ { ++ m_pPlayer = pPlayer; ++ ++ ++ } ++ ++ if (HXR_OK == m_pUnknown->QueryInterface(IID_IHXClientStateAdviseSinkControl, (void **)&pStateControl)) ++ { ++ pStateControl->AddClientStateAdviseSink(this); ++ } ++ } ++ ++#ifdef __TCS__ ++ bEnableAdviceSink = TRUE; ++ iOpened = 0; ++#endif ++} ++ ++ExampleClientStateAdviceSink::~ExampleClientStateAdviceSink(void) ++{ ++ ++ if (m_pPlayer) ++ { ++ m_pPlayer->Release(); ++ m_pPlayer = NULL; ++ } ++ if (m_pUnknown) ++ { ++ m_pUnknown->Release(); ++ m_pUnknown = NULL; ++ } ++} ++ ++ ++// *** IUnknown methods *** ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::QueryInterface ++// Purpose: ++// Implement this to export the interfaces supported by your ++// object. ++// ++STDMETHODIMP ExampleClientStateAdviceSink::QueryInterface(REFIID riid, void** ppvObj) ++{ ++ if (IsEqualIID(riid, IID_IUnknown)) ++ { ++ AddRef(); ++ *ppvObj = (IUnknown*)(IHXClientStateAdviseSink *)this; ++ return HXR_OK; ++ } ++ else if (IsEqualIID(riid, IID_IHXClientStateAdviseSink)) ++ { ++ AddRef(); ++ *ppvObj = (IHXClientStateAdviseSink*)this; ++ return HXR_OK; ++ } ++ ++ *ppvObj = NULL; ++ return HXR_NOINTERFACE; ++} ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::AddRef ++// Purpose: ++// Everyone usually implements this the same... feel free to use ++// this implementation. ++// ++STDMETHODIMP_(ULONG32) ExampleClientStateAdviceSink::AddRef() ++{ ++ return InterlockedIncrement(&m_lRefCount); ++} ++ ++///////////////////////////////////////////////////////////////////////// ++// Method: ++// IUnknown::Release ++// Purpose: ++// Everyone usually implements this the same... feel free to use ++// this implementation. ++// ++STDMETHODIMP_(ULONG32) ExampleClientStateAdviceSink::Release() ++{ ++ if (InterlockedDecrement(&m_lRefCount) > 0) ++ { ++ return m_lRefCount; ++ } ++ ++ delete this; ++ return 0; ++} ++ ++ ++/************************************************************************ ++ * Method: ++ * IHXClientStateAdviseSink::OnStateChange ++ * Purpose: ++ * Called to advise the client state has changed state ++ */ ++STDMETHODIMP ExampleClientStateAdviceSink::OnStateChange(UINT16 uOldState, UINT16 uNewState) ++{ ++ if (m_state_change_cb) ++ m_state_change_cb(uOldState, uNewState, m_context); ++ ++ m_State = uNewState; ++ return HXR_OK; ++} ++ ++EHXClientState ExampleClientStateAdviceSink::GetState() ++{ ++ return m_State; ++} ++ ++ +Index: helix-libs/clientapps/clutter/exstateadvsnk.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/exstateadvsnk.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,108 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _EXAMPLE_CLIENT_STATE_ADVISE_SNK_H_ ++#define _EXAMPLE_CLIENT_STATE_ADVISE_SNK_H_ ++ ++#include "player.h" ++ ++struct IHXClientStateAdviseSink; ++struct IHXGroupSink; ++struct IUnknown; ++struct IHXRegistry; ++struct IHXScheduler; ++struct IHXCallback; ++struct IHXPlayer; ++struct IHXGroup; ++ ++class ExampleClientStateAdviceSink : public IHXClientStateAdviseSink ++{ ++ private: ++ LONG32 m_lRefCount; ++ LONG32 m_lClientIndex; ++ ++ IUnknown* m_pUnknown; ++ ++ UINT32 m_ulStartTime; ++ UINT32 m_ulStopTime; ++ ++ UINT32 m_lCurrentBandwidth; ++ UINT32 m_lAverageBandwidth; ++ HXBOOL m_bOnStop; ++ ++ HXBOOL m_bWaitForTrackStart; ++ ++ on_state_change_cb_t m_state_change_cb; ++ void *m_context; ++ EHXClientState m_State; ++ ++ // IHXCallback ++ IHXPlayer* m_pPlayer; ++ ULONG32 m_hCallback; ++ ~ExampleClientStateAdviceSink(); ++ ++ ++ public: ++ ++ ExampleClientStateAdviceSink(IUnknown* /*IN*/ pUnknown, LONG32 /*IN*/ lClientIndex, on_state_change_cb_t on_state_change_cb = NULL, void *context = NULL); ++ ++ /* ++ * IUnknown methods ++ */ ++ STDMETHOD(QueryInterface) (THIS_ ++ REFIID riid, ++ void** ppvObj); ++ ++ STDMETHOD_(ULONG32,AddRef) (THIS); ++ ++ STDMETHOD_(ULONG32,Release) (THIS); ++ ++ /*********************************************************************** ++ * Method: ++ * IHXClientStateAdviseSink::OnStateChange ++ * Purpose: ++ * Called by client engine to inform the client that the state has changed. ++ * States are defined in the enum EHXClientState, defined in this file. ++ * ++ */ ++ STDMETHOD(OnStateChange) (THIS_ ++ UINT16 uOldState, ++ UINT16 uNewState ++ ) ; ++ ++ EHXClientState GetState(); ++}; ++ ++#endif /* _EXAMPLECLSNK_ */ +Index: helix-libs/clientapps/clutter/fivemmap.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/fivemmap.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,175 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include ++#include "hxtypes.h" ++#include "fivemmap.h" ++ ++void* FiveMinuteMap::GetFirstValue() ++{ ++ m_nCursor = 0; ++ ++ if (m_nMapSize) ++ { ++ return m_pValueArray[m_nCursor]; ++ } ++ else ++ { ++ return NULL; ++ } ++} ++ ++void* FiveMinuteMap::GetNextValue() ++{ ++ m_nCursor++; ++ ++ if (m_nCursor < m_nMapSize) ++ { ++ return m_pValueArray[m_nCursor]; ++ } ++ else ++ { ++ return NULL; ++ } ++} ++ ++HXBOOL FiveMinuteMap::Lookup(void* Key, void*& Value) const ++{ ++ HXBOOL bFound = FALSE; ++ int nIndex = 0; ++ ++ // If Key is alrady in the list, replace value ++ for (; nIndex < m_nMapSize; nIndex++) ++ { ++ if (m_pKeyArray[nIndex] == Key) ++ { ++ Value = m_pValueArray[nIndex]; ++ bFound = TRUE; ++ goto exit; ++ } ++ } ++ ++exit: ++ return bFound; ++} ++ ++void FiveMinuteMap::RemoveKey(void* Key) ++{ ++ HXBOOL bFound = FALSE; ++ int nIndex = 0; ++ ++ // If Key is alrady in the list, replace value ++ for (; nIndex < m_nMapSize; nIndex++) ++ { ++ if (m_pKeyArray[nIndex] == Key) ++ { ++ if (nIndex < (m_nMapSize-1)) ++ { ++ memmove(&(m_pKeyArray[nIndex]),&(m_pKeyArray[nIndex+1]),sizeof(void*)*(m_nMapSize-(nIndex+1))); ++ memmove(&(m_pValueArray[nIndex]),&(m_pValueArray[nIndex+1]),sizeof(void*)*(m_nMapSize-(nIndex+1))); ++ } ++ m_nMapSize--; ++ goto exit; ++ } ++ } ++ ++exit: ++ (NULL); // We're done! ++} ++ ++void FiveMinuteMap::RemoveValue(void* Value) ++{ ++ HXBOOL bFound = FALSE; ++ int nIndex = 0; ++ ++ // If Value is alrady in the list, replace value ++ for (; nIndex < m_nMapSize; nIndex++) ++ { ++ if (m_pValueArray[nIndex] == Value) ++ { ++ if (nIndex < (m_nMapSize-1)) ++ { ++ memmove(&(m_pKeyArray[nIndex]),&(m_pKeyArray[nIndex+1]),sizeof(void*)*(m_nMapSize-(nIndex+1))); ++ memmove(&(m_pValueArray[nIndex]),&(m_pValueArray[nIndex+1]),sizeof(void*)*(m_nMapSize-(nIndex+1))); ++ } ++ m_nMapSize--; ++ goto exit; ++ } ++ } ++ ++exit: ++ (NULL); // We're done! ++} ++ ++ ++void FiveMinuteMap::SetAt(void* Key, void* Value) ++{ ++ int nIndex = 0; ++ ++ // If Key is alrady in the list, replace value ++ for (; nIndex < m_nMapSize; nIndex++) ++ { ++ if (m_pKeyArray[nIndex] == Key) ++ { ++ m_pValueArray[nIndex] = Value; ++ goto exit; ++ } ++ } ++ ++ // If we have room, add it to the end! ++ if (m_nAllocSize == m_nMapSize) ++ { ++ m_nAllocSize += AllocationSize; ++ void** pNewKeys = new void*[m_nAllocSize]; ++ void** pNewValues = new void*[m_nAllocSize]; ++ ++ memcpy(pNewKeys,m_pKeyArray,sizeof(void*)*m_nMapSize); /* Flawfinder: ignore */ ++ memcpy(pNewValues,m_pValueArray,sizeof(void*)*m_nMapSize); /* Flawfinder: ignore */ ++ ++ delete [] m_pKeyArray; ++ delete [] m_pValueArray; ++ ++ m_pKeyArray = pNewKeys; ++ m_pValueArray = pNewValues; ++ } ++ ++ m_pKeyArray[m_nMapSize] = Key; ++ m_pValueArray[m_nMapSize] = Value; ++ m_nMapSize++; ++ ++exit: ++ (NULL); // We're done! ++} ++ +Index: helix-libs/clientapps/clutter/fivemmap.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/fivemmap.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,79 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _FIVEMMAP_H_ ++#define _FIVEMMAP_H_ ++ ++#ifndef _HXTYPES_H_ ++#error FiveMinuteMap assumes pntypes.h. ++#endif ++ ++class FiveMinuteMap ++{ ++ const int AllocationSize; ++ ++ void** m_pKeyArray; ++ void** m_pValueArray; ++ int m_nMapSize; ++ int m_nAllocSize; ++ int m_nCursor; ++public: ++ FiveMinuteMap() ++ : m_pKeyArray(NULL) ++ , m_pValueArray(NULL) ++ , m_nMapSize(0) ++ , m_nAllocSize(0) ++ , m_nCursor(0) ++ , AllocationSize(10) ++ {}; ++ ++ ~FiveMinuteMap() ++ { ++ delete [] m_pKeyArray; ++ delete [] m_pValueArray; ++ }; ++ ++ int GetCount() {return m_nMapSize;} ++ ++ void* GetFirstValue(); ++ void* GetNextValue(); ++ ++ HXBOOL Lookup(void* Key, void*& Value) const; ++ void RemoveKey(void* Key); ++ void RemoveValue(void* Value); ++ void SetAt(void* Key, void* Value); ++}; ++ ++#endif /* _FIVEMMAP_H_ */ +Index: helix-libs/clientapps/clutter/globals.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/globals.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,150 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++/**************************************************************************** ++ * ++ * Test Client: ++ * ++ * ++ * This is an test client running on Windows, Mac, and Unix without a GUI. ++ * ++ */ ++ ++#ifndef _SPLAY_GLOBALS_H ++#define _SPLAY_GLOBALS_H ++ ++#include "dllacces.h" ++#include "dllpath.h" ++#include "hxengin.h" ++#include "hxplayvelocity.h" ++#include "hxcore.h" ++#include "ihxmedpltfm.h" ++#include "excontxt.h" ++#include "preflist.h" ++ ++#define HX_COMMAND_BUFFER_SIZE 256 ++#define HX_MAX_NUM_MULTI_SEEKS 10 ++struct _stGlobals ++{ ++ _stGlobals() ++ : g_pDLLAccess(NULL), ++ g_nPlayers(0), ++ m_fpHXMediaPlatformOpen(NULL), ++ m_fpHXCreateMediaPlatform(NULL), ++ m_fpHXMediaPlatformClose(NULL), ++ m_fpCreateEngine(NULL), ++ m_fpCloseEngine(NULL), ++ m_fpSetDLLAccessPath(NULL), ++ bEnableAdviceSink(FALSE), ++ bEnableVerboseMode(FALSE), ++ g_bEnableSlowStart(TRUE), ++ g_bOnBeginOccurred(FALSE), ++ g_pszUsername( NULL), ++ g_pszPassword(NULL), ++ g_pszGUIDFile(NULL), ++ g_pszGUIDList(NULL), ++ g_Error(HXR_OK), ++ g_ulNumSecondsPlayed(0), ++ pMediaPlatform(NULL), ++ g_pIHXKicker(NULL), ++ bUseLegacyAPIs(FALSE), ++ pEngine(NULL), ++ g_pQuickSeek(NULL), ++ g_bNullRender(FALSE), ++ g_bUserStop(FALSE), ++ g_bInitVelocity(FALSE), ++ g_bABD(FALSE), ++ g_pVelocityCaps(NULL), ++ g_ulNumMultiSeeks(0), ++ g_ulMultiSeekIndex(0), ++ g_bMultiSeek(FALSE), ++ g_uThreadIDForKicker(-1) ++ { ++ memset(g_szCommandBuffer, 0, HX_COMMAND_BUFFER_SIZE); ++ memset(g_szPriorCommandBuffer, 0, HX_COMMAND_BUFFER_SIZE); ++ memset(g_Players, 0, sizeof(g_Players)); ++ memset(g_pszURLs, 0, sizeof(g_pszURLs)); ++ memset(g_pClientContexts, 0, sizeof(g_pClientContexts)); ++ } ++ ++ #define MAX_NUM_PLAYERS 256 ++ IHXPlayer* g_Players[MAX_NUM_PLAYERS]; ++ char *g_pszURLs[MAX_NUM_PLAYERS]; ++ ExampleClientContext *g_pClientContexts[MAX_NUM_PLAYERS]; ++ int g_nPlayers; ++ DLLAccessPath g_statclnt; ++ DLLAccess* g_pDLLAccess; ++ CHXPrefList g_prefList; ++ ++ FPHXMEDIAPLATFORMOPEN m_fpHXMediaPlatformOpen; ++ FPHXCREATEMEDIAPLATFORM m_fpHXCreateMediaPlatform; ++ FPHXMEDIAPLATFORMCLOSE m_fpHXMediaPlatformClose; ++ ++ FPRMCREATEENGINE m_fpCreateEngine; ++ FPRMCLOSEENGINE m_fpCloseEngine; ++ FPRMSETDLLACCESSPATH m_fpSetDLLAccessPath; ++ ++ HXBOOL bEnableAdviceSink; ++ HXBOOL bEnableVerboseMode; ++ HXBOOL g_bEnableSlowStart; ++ HXBOOL g_bOnBeginOccurred; ++ char* g_pszUsername; ++ char* g_pszPassword; ++ char* g_pszGUIDFile; ++ char* g_pszGUIDList; ++ HX_RESULT g_Error; ++ UINT32 g_ulNumSecondsPlayed; ++ IHXMediaPlatform* pMediaPlatform; ++ IHXMediaPlatformKicker* g_pIHXKicker; ++ UINT32 g_uThreadIDForKicker; ++ pthread_t g_pThreadKickmanId; ++ HXBOOL bUseLegacyAPIs; ++ IHXClientEngine* pEngine; ++ IHXQuickSeek* g_pQuickSeek; ++ HXBOOL g_bNullRender; ++ HXBOOL g_bUserStop; ++ HXBOOL g_bInitVelocity; ++ HXBOOL g_bABD; ++ IHXPlaybackVelocityCaps* g_pVelocityCaps; ++ HXBOOL g_bMultiSeek; ++ UINT32 g_ulMultiSeekTime[HX_MAX_NUM_MULTI_SEEKS]; ++ UINT32 g_ulNumMultiSeeks; ++ UINT32 g_ulMultiSeekIndex; ++ char g_szCommandBuffer[HX_COMMAND_BUFFER_SIZE]; ++ char g_szPriorCommandBuffer[HX_COMMAND_BUFFER_SIZE]; ++}; ++ ++ ++#endif // _SPLAY_GLOBALS_H +Index: helix-libs/clientapps/clutter/iids.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/iids.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,50 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++// define all guids here once... ++#define INITGUID ++#define NCIHACK ++#include "hxtypes.h" ++#include "hxcom.h" ++#include "hxiids.h" ++#include "hxpiids.h" ++#if defined _WINDOWS ++#if defined (HELIX_FEATURE_DIRECT_SOUND) ++#include "dsound.h" ++#endif /* HELIX_FEATURE_DIRECT_SOUND */ ++#if defined (HELIX_FEATURE_VIDEO) && !defined(_WINCE) ++#include "ddraw.h" ++#endif /* HELIX_FEATURE_VIDEO */ ++#endif +Index: helix-libs/clientapps/clutter/linux2.pcf +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/linux2.pcf 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,42 @@ ++# ++# ***** BEGIN LICENSE BLOCK ***** ++# Version: RCSL 1.0/RPSL 1.0 ++# ++# Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++# ++# The contents of this file, and the files included with this file, are ++# subject to the current version of the RealNetworks Public Source License ++# Version 1.0 (the "RPSL") available at ++# http://www.helixcommunity.org/content/rpsl unless you have licensed ++# the file under the RealNetworks Community Source License Version 1.0 ++# (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++# in which case the RCSL will apply. You may also obtain the license terms ++# directly from RealNetworks. You may not use this file except in ++# compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++# applicable to this file, the RCSL. Please see the applicable RPSL or ++# RCSL for the rights, obligations and limitations governing use of the ++# contents of the file. ++# ++# This file is part of the Helix DNA Technology. RealNetworks is the ++# developer of the Original Code and owns the copyrights in the portions ++# it created. ++# ++# This file, and the files included with this file, is distributed and made ++# available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++# EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++# FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++# ++# Technology Compatibility Kit Test Suite(s) Location: ++# http://www.helixcommunity.org/content/tck ++# ++# Contributor(s): ++# ++# ***** END LICENSE BLOCK ***** ++# ++ ++project.AddSystemLibraries("dl", "m", "pthread") ++ ++if (project.IsDefined("HELIX_FEATURE_VIDEO") and ++ project.IsDefined("USE_XWINDOWS")): ++ project.AddSystemLibraries("X11") +Index: helix-libs/clientapps/clutter/player.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/player.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,1057 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++/**************************************************************************** ++ * ++ * Test Client: ++ * ++ * ++ * This is an test client running on Windows, Mac, and Unix without a GUI. ++ * ++ */ ++#include "hxtypes.h" ++ ++#include ++ ++#include "hlxclib/time.h" ++#include "ihxmedpltfm.h" ++#include "hxwintyp.h" ++#include "hxcom.h" ++#include "ihxpckts.h" ++#include "hxcomm.h" ++#include "hxmon.h" ++#include "hxfiles.h" ++#include "hxengin.h" ++#include "hxcore.h" ++#include "hxclsnk.h" ++#include "hxgroup.h" ++#include "hxerror.h" ++#include "hxauth.h" ++#include "hxwin.h" ++#include "hxprefs.h" ++#include "hxtbuf.h" ++#include "fivemmap.h" ++#include "dllacces.h" ++#include "hxausvc.h" ++#include "hxstrutl.h" ++#include "hxgroup.h" ++#include "hxwin.h" ++#include "hxtick.h" ++#include "hxbuffer.h" ++#include "hxplayvelocity.h" ++#include "pckunpck.h" // For CreateAndSetBufferCCF() ++#include "hxvctrl.h" ++#include "hxbsrc.h" ++#include "excallback.h" ++#include "pthread.h" ++ ++#if defined(HELIX_FEATURE_PRESENTATION_FEATURE_SELECTION) ++#include "hxpfs.h" ++#endif // HELIX_FEATURE_PRESENTATION_FEATURE_SELECTION. ++ ++#if defined(HELIX_FEATURE_PREFERENCES) ++#include "preflist.h" ++#endif /* #if defined(HELIX_FEATURE_PREFERENCES) */ ++#include "exadvsnk.h" ++#include "exerror.h" ++#include "exsitsup.h" ++#include "exaumgr.h" ++#if defined(_WIN32) ++#include "exabd.h" ++#endif ++#include "excontxt.h" ++#include "print.h" ++#if defined(USE_XWINDOWS) ++#include ++#endif ++#if defined (_UNIX) ++#include ++#include ++#include ++#include ++#include ++#endif ++#if defined(_WINDOWS) ++#include ++#endif ++ ++#ifdef __TCS__ ++#include ++#if defined(__cplusplus) ++extern "C" { ++#endif /* defined(__cplusplus) */ ++ extern unsigned long tmosTimSleep(unsigned long ticks); ++ unsigned long gForcePlayerToStop = 0; ++#if defined(__cplusplus) ++} ++#endif /* defined(__cplusplus) */ ++#endif ++ ++#if defined (_MACINTOSH) || defined (_MAC_UNIX) ++bool gMacPlayerIsDone = false; ++#endif ++ ++ ++#if defined _VXWORKS ++#include "sys/times.h" ++#include "string.h" ++#include "hxtime.h" ++#endif ++ ++#if defined(_MACINTOSH) ++#ifndef _MAC_MACHO ++#include ++#include ++#endif ++#endif ++ ++#include "dllpath.h" ++ ++#ifdef _SYMBIAN ++#include ++#include "platform/symbian/symbian_event_hndlr.h" ++#endif ++ ++ENABLE_DLLACCESS_PATHS(g_SPlayAccessPath); ++ ++// typedef for SetDLLAccessPath ++ ++ ++#include "thrdutil.h" ++ ++#if defined(_AIX) ++#include ++#endif ++ ++#if defined _DEBUG || defined DEBUG ++#include "debug.h" ++#endif ++ ++#ifndef MAX_PATH ++#define MAX_PATH 256 ++#endif //!MAX_PATH ++ ++#if defined(HELIX_CONFIG_NOSTATICS) ++# include "globals/hxglobals.h" ++#endif ++ ++#define MAX_NUM_URLS 10 ++ ++#include "globals.h" //for global struct. ++ ++#include "player.h" ++ ++#if defined(_WINDOWS) && defined(_STATICALLY_LINKED) ++HINSTANCE g_hInstance = NULL; ++#endif ++ ++struct _stGlobals*& GetGlobal() ++{ ++#if defined(HELIX_CONFIG_NOSTATICS) ++ static const struct _stGlobals* const _g_pstGlobals = NULL; ++ struct _stGlobals*& g_pstGlobals = (struct _stGlobals*&)HXGlobalPtr::Get(&_g_pstGlobals); ++#else ++ static struct _stGlobals* g_pstGlobals = NULL; ++#endif ++ if( g_pstGlobals == NULL ) ++ { ++ g_pstGlobals = new struct _stGlobals(); ++ } ++ return g_pstGlobals; ++ ++} ++ ++ ++// Constants ++const int DEFAULT_TIME_DELTA = 2000; ++const int DEFAULT_STOP_TIME = -1; ++const int SLEEP_TIME = 5; ++const int GUID_LEN = 64; ++ ++// Function prototypes ++void PrintUsage(const char* pszAppName); ++HXBOOL AllPlayersDone(int nNumPlayers, IHXPlayer** ppPlayers); ++void StopAllPlayers(int nNumPlayers, IHXPlayer** ppPlayers); ++HXBOOL ReadGUIDFile(); ++char* GetAppName(char* pszArgv0); ++ ++#ifdef __TCS__ ++#if defined(__cplusplus) ++extern "C" { ++#endif /* defined(__cplusplus) */ ++ ++ extern void _alloc_stats(int verbose); ++#if defined(__cplusplus) ++} ++#endif /* defined(__cplusplus) */ ++ ++static IHXPlayer** g_Players; ++static int g_nPlayers = 0; ++static long evtCount = 0; ++static long evtFullCount = 0; ++#endif ++ ++ ++ ++#if defined(HELIX_FEATURE_PRESENTATION_FEATURE_SELECTION) ++HX_RESULT ++DumpPFdata(IHXPresentationFeatureManager* pPFMgr, ++ const char* pszPFName) ++{ ++ HX_RESULT hxr = HXR_OK; ++ ++ IHXBuffer* pFeatureCurrentSetting = NULL; ++ IHXValues* pFeatureOptions = NULL; ++ ++ if (!pPFMgr || !pszPFName) ++ { ++ hxr = HXR_INVALID_PARAMETER; ++ } ++ else ++ { ++ // List all the options for this PF: ++ HX_RESULT hxr = pPFMgr->GetPresentationFeature( ++ pszPFName, ++ pFeatureCurrentSetting, ++ pFeatureOptions); ++ ++ if (FAILED(hxr)) ++ { ++ // PF doesn't exist! ++ STDOUT("\t%s - No such presentation feature\n\n", pszPFName); ++ } ++ else ++ { ++ // Now, go through pFeatureOptions and display ++ // them and their "is-selectable"-flag values: ++ const char* pszPFOptionName = NULL; ++ const char* pszPFCurSetting = pFeatureCurrentSetting? ++ (const char*)pFeatureCurrentSetting->GetBuffer() : NULL; ++ UINT32 bPFOptionIsSelectableFlag = FALSE; ++ IHXBuffer* pPFOptionIsSelectableFlag = NULL; ++ ++ HX_ASSERT(pszPFCurSetting); ++ STDOUT("\t%s\t(Current setting == \"%s\")\n", pszPFName, pszPFCurSetting? ++ pszPFCurSetting : ""); ++ ++ if (!pFeatureOptions) // NULL is OK; that means freeform (open-ended): ++ { ++ STDOUT("\t\t(%s's options are freeform, i.e., open-ended)\n", ++ pszPFName); ++ } ++ else // List all the options and their flags: ++ { ++ if (HXR_OK == pFeatureOptions->GetFirstPropertyCString(pszPFOptionName, ++ pPFOptionIsSelectableFlag) && *pszPFOptionName) ++ { ++ do ++ { ++ const UCHAR* pIsSelFlag = pPFOptionIsSelectableFlag->GetBuffer(); ++ if (pIsSelFlag && *pIsSelFlag) ++ { ++ // Anything but '0' (zero) is treated as '1' (is selectable): ++ bPFOptionIsSelectableFlag = (HXBOOL)('0' != *pIsSelFlag && ++ '\0' == *(pIsSelFlag+1)); ++ } ++ else ++ { ++ // Set the error, but we'll go ahead and treat it as '0': ++ hxr = HXR_INVALID_PARAMETER; ++ bPFOptionIsSelectableFlag = FALSE; ++ } ++ ++ STDOUT("\t\t%s\t\tIs selectable: %s\n", ++ pszPFOptionName, bPFOptionIsSelectableFlag? "yes":"no"); ++ // Release it to get the next PF: ++ HX_RELEASE(pPFOptionIsSelectableFlag); ++ } while (HXR_OK == pFeatureOptions->GetNextPropertyCString( ++ pszPFOptionName, pPFOptionIsSelectableFlag)); ++ } ++ } ++ ++ HX_RELEASE(pPFOptionIsSelectableFlag); ++ } ++ } ++ ++ HX_RELEASE(pFeatureCurrentSetting); ++ HX_RELEASE(pFeatureOptions); ++ ++ return hxr; ++} ++#endif // HELIX_FEATURE_PRESENTATION_FEATURE_SELECTION. ++ ++ ++char* RemoveWrappingQuotes(char* str) ++{ ++ int len = strlen(str); ++ if (len > 0) ++ { ++ if (str[len-1] == '"') str[--len] = 0; ++ if (str[0] == '"') { int i = 0; do { str[i++] = str[i+1]; } while(--len); } ++ } ++ return str; ++} ++ ++void *kickman(void *dummy) ++{ ++ while(1) { ++ UINT32 sleepTime = 0; ++ IHXMediaPlatformKicker* pKicker = GetGlobal()->g_pIHXKicker; ++ if( pKicker ) ++ { ++ pKicker->Kick(GetGlobal()->g_uThreadIDForKicker, &sleepTime); ++ } ++ usleep(sleepTime); ++ } ++} ++ ++PLAYER_API int init_main( ) ++{ ++#if defined(_WIN32) && !defined(WIN32_PLATFORM_PSPC) ++ setvbuf(stdout, NULL, _IONBF, 0); ++#endif /* defined(_WIN32) && !defined(WIN32_PLATFORM_PSPC) */ ++ ++ FPHXMEDIAPLATFORMOPEN fpHXMediaPlatformOpen = NULL; ++ FPHXCREATEMEDIAPLATFORM fpHXCreateMediaPlatform = NULL; ++ FPHXMEDIAPLATFORMCLOSE fpHXMediaPlatformClose = NULL; ++ ++ FPRMCREATEENGINE fpCreateEngine = NULL; ++ FPRMCLOSEENGINE fpCloseEngine = NULL; ++ FPRMSETDLLACCESSPATH fpSetDll = NULL; ++ ++ HX_RESULT theErr = HXR_OK; ++ ExampleClientContext** ppExContexts = NULL; ++#if defined(HELIX_FEATURE_AUTO_BANDWIDTH_DETECTION) && defined(_WIN32) ++ ExampleABD* pABD = NULL; ++#endif ++ IHXPlayer** ppPlayers = NULL; ++ IHXQuickSeek* ppQuickSeek = NULL; ++ IHXErrorSink* pErrorSink = NULL; ++ IHXErrorSinkControl* pErrorSinkControl = NULL; ++ UINT32 ulABDResult = 0; ++ UINT32 ulProbPktSize = 0; ++ UINT32 ulProbPktNum = 0; ++#if defined(HELIX_FEATURE_PLAYBACK_VELOCITY) ++ INT32 lVelocity = 100; ++ INT32 lKeyFrameMode = 0; ++ INT32 lAutoSwitch = 0; ++#endif /* #if defined(HELIX_FEATURE_PLAYBACK_VELOCITY) */ ++ CHXString* pABDServer = NULL; ++ char* pszURL[MAX_NUM_URLS]; ++ char* pszURLOrig[MAX_NUM_URLS]; ++ UINT32 ulNumURLsFound = 0; ++ int nNumPlayers = 1; ++ int nNumPlayRepeats = 1; ++ int nTimeDelta = DEFAULT_TIME_DELTA; ++ int nStopTime = DEFAULT_STOP_TIME; ++ bool bStopTime = true; ++ int i = 0; ++ char* pszGUIDList = NULL; ++#ifdef _MACINTOSH ++ char dllhome[MAX_PATH] = {'\0'}; /* Flawfinder: ignore */ ++#elif defined(_SYMBIAN) ++ char dllhome[MAX_PATH] = "c:"; /* Flawfinder: ignore */ ++#else ++ char dllhome[MAX_PATH] = {'.','\0'}; /* Flawfinder: ignore */ ++#endif ++ DLLAccess* pDLLAccess = NULL; ++ char staticLibPath[MAX_PATH] = {0}; /* Flawfinder: ignore */ ++#ifdef _WINDOWS ++ HINSTANCE hDll = NULL; ++#endif ++ bool bStopping = false; ++ int nPlay = 0; ++ ++ // NULL out the URL arrays ++ memset(pszURL, 0, MAX_NUM_URLS * sizeof(char*)); ++ memset(pszURLOrig, 0, MAX_NUM_URLS * sizeof(char*)); ++ ++ ++ //See if the user has set their HELIX_LIBS env var. This is overridden by the ++ //-l option. ++ const char* pszHelixLibs = getenv("HELIX_LIBS"); ++ if( pszHelixLibs ) ++ SafeStrCpy( dllhome, pszHelixLibs, MAX_PATH); ++ ++ ++ ++ GetGlobal()->bEnableAdviceSink = TRUE; ++ GetGlobal()->g_prefList.Add("UseOverlay", "0"); ++ ++ SafeSprintf(staticLibPath, MAX_PATH, "%s/%s", dllhome, "hxmedpltfm.so"); ++ ++ if (dllhome) ++ { ++ GetDLLAccessPath()->SetPath(DLLTYPE_COMMON, dllhome); ++ GetDLLAccessPath()->SetPath(DLLTYPE_PLUGIN, dllhome); ++ GetDLLAccessPath()->SetPath(DLLTYPE_CODEC, dllhome); ++ } ++ ++ // initialize the globals ++ GetGlobal()->m_fpCreateEngine = NULL; ++ GetGlobal()->m_fpCloseEngine = NULL; ++ GetGlobal()->g_nPlayers = 0; ++ ++ // prepare/load the HXCore module ++ pDLLAccess = new DLLAccess(); ++ ++ STDOUT("Simpleplayer is looking for the client core at %s\n", staticLibPath ); ++ ++ if (DLLAccess::DLL_OK != pDLLAccess->open(staticLibPath)) ++ { ++ const char* pErrorString = NULL; ++ pErrorString = pDLLAccess->getErrorString(); ++ STDERR("splayer: %s\n\n", pErrorString); ++#ifndef _STATICALLY_LINKED ++#ifndef _MACINTOSH ++ //Make sure the user has told us where to find the DLLs at. Either ++ //with the -l option or with the HELIX_LIBS env var. ++ STDERR("You must tell the player where to find the client core and\n"); ++ STDERR("all of its supporting DLLs and codecs. Please use the -l\n"); ++ STDERR("option or set your HELIX_LIBS env variable to point the player.\n"); ++ STDERR("to where you have all of the DLLs installed.\n\n" ); ++ //PrintUsage(argv[0]); ++#endif ++#endif ++ goto cleanup; ++ } ++ ++ GetGlobal()->m_fpHXMediaPlatformOpen = (FPHXMEDIAPLATFORMOPEN) pDLLAccess->getSymbol("HXMediaPlatformOpen"); ++ GetGlobal()->m_fpHXCreateMediaPlatform = (FPHXCREATEMEDIAPLATFORM) pDLLAccess->getSymbol("HXCreateMediaPlatform"); ++ GetGlobal()->m_fpHXMediaPlatformClose = (FPHXMEDIAPLATFORMCLOSE) pDLLAccess->getSymbol("HXMediaPlatformClose"); ++ ++ GetGlobal()->m_fpCreateEngine = (FPRMCREATEENGINE) pDLLAccess->getSymbol("CreateEngine"); ++ GetGlobal()->m_fpCloseEngine = (FPRMCLOSEENGINE) pDLLAccess->getSymbol("CloseEngine"); ++ GetGlobal()->m_fpSetDLLAccessPath = (FPRMSETDLLACCESSPATH) pDLLAccess->getSymbol("SetDLLAccessPath"); ++ ++ if (GetGlobal()->m_fpHXMediaPlatformOpen == NULL || ++ GetGlobal()->m_fpHXCreateMediaPlatform == NULL || ++ GetGlobal()->m_fpHXMediaPlatformClose == NULL || ++ GetGlobal()->m_fpCreateEngine == NULL || ++ GetGlobal()->m_fpCloseEngine == NULL || ++ GetGlobal()->m_fpSetDLLAccessPath == NULL ) ++ { ++ theErr = HXR_FAILED; ++ goto cleanup; ++ } ++ ++#if defined(USE_XWINDOWS) && defined(HELIX_FEATURE_VIDEO) ++ XInitThreads(); ++#endif ++ ++ { ++ fpHXMediaPlatformOpen = GetGlobal()->m_fpHXMediaPlatformOpen; ++ fpHXCreateMediaPlatform = GetGlobal()->m_fpHXCreateMediaPlatform; ++ fpHXMediaPlatformClose = GetGlobal()->m_fpHXMediaPlatformClose; ++ ++ if (HXR_OK != fpHXMediaPlatformOpen()) ++ { ++ theErr = HXR_FAILED; ++ goto cleanup; ++ } ++ ++ if (HXR_OK != fpHXCreateMediaPlatform((IHXMediaPlatform**)&GetGlobal()->pMediaPlatform)) ++ { ++ theErr = HXR_FAILED; ++ goto cleanup; ++ } ++ ++ IHXMediaPlatform* pMediaPlatform = GetGlobal()->pMediaPlatform; ++ ++ ++ if (HXR_OK != pMediaPlatform->AddPluginPath("HelixSimplePlayer", dllhome)) ++ { ++ theErr = HXR_FAILED; ++ goto cleanup; ++ } ++ ++ if (HXR_OK != pMediaPlatform->Init(NULL)) ++ { ++ theErr = HXR_FAILED; ++ goto cleanup; ++ } ++ ++ IHXCommonClassFactory* pCCF = NULL; ++ if (HXR_OK != pMediaPlatform->QueryInterface(IID_IHXCommonClassFactory, ++ (void**)&pCCF)) ++ { ++ theErr = HXR_FAILED; ++ goto cleanup; ++ } ++ ++ if (HXR_OK != pCCF->CreateInstance(CLSID_IHXClientEngine, (void**)&GetGlobal()->pEngine)) ++ { ++ HX_RELEASE(pCCF); ++ theErr = HXR_FAILED; ++ goto cleanup; ++ } ++ ++ HX_RELEASE(pCCF); ++ ++ IHXMediaPlatformKicker* pKicker = NULL; ++ pMediaPlatform->QueryInterface(IID_IHXMediaPlatformKicker, (void**)&pKicker); ++ HX_ASSERT(pKicker); ++ GetGlobal()->g_pIHXKicker = pKicker; ++ GetGlobal()->g_uThreadIDForKicker = HXGetCurrentThreadID(); ++ ++ pthread_t thread_id; ++ pthread_create(&thread_id, NULL, kickman, NULL); ++ GetGlobal()->g_pThreadKickmanId = thread_id; ++ } ++ ++ ++ ++ { ++ ++ ++#if defined(_WIN32) && !defined(WIN32_PLATFORM_PSPC) ++ SetConsoleCtrlHandler((PHANDLER_ROUTINE)HandlerRoutine, ++ TRUE); ++#endif ++ ++ } ++ ++ return HXR_OK; ++ ++ cleanup: ++ deinit_main(); ++ return HXR_FAIL; ++} ++ ++/* Get the least index to available entry in Getglobal()->gPlayers */ ++static int get_index() ++{ ++ int i; ++ /* an simple implementation */ ++ for (i = 0; i < MAX_NUM_PLAYERS; i++) ++ { ++ if (GetGlobal()->g_Players[i] == NULL) ++ return i; ++ } ++ ++ return -1; ++} ++ ++PLAYER_API unsigned int get_curr_playtime(void *pPlayerHandle) ++{ ++ unsigned int time = 0; ++ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle; ++ if (pPlayer) ++ time = pPlayer->GetCurrentPlayTime(); ++ return time; ++} ++ ++PLAYER_API int get_player(void **ppPlayerHandle, on_buffering_cb_t on_buffering_cb, on_pos_length_cb_t on_pos_length_cb, on_state_change_cb_t on_state_change_cb, on_new_frame_cb_t on_new_frame_cb, void *context) ++{ ++ int index = get_index(); ++ IHXPlayer **ppPlayer = (IHXPlayer **)ppPlayerHandle; ++ ExampleClientContext* pExContext = NULL; ++ pExContext = new ExampleClientContext(index); ++ if (!pExContext) ++ { ++ return HXR_UNEXPECTED; ++ } ++ pExContext->AddRef(); ++ ++ ppPlayer[0] = NULL; ++ IHXClientEngine* pEngine = GetGlobal()->pEngine; ++ if (HXR_OK != pEngine->CreatePlayer(*ppPlayer)) ++ { ++ HX_RELEASE(pExContext); ++ return HXR_FAILED; ++ } ++#if 1 ++ char* pszGUIDList = NULL; ++ //initialize the example context ++ pszGUIDList = GetGlobal()->g_pszGUIDList; ++ { ++ char pszGUID[GUID_LEN + 1]; /* Flawfinder: ignore */ // add 1 for terminator ++ char* token = NULL; ++ IHXPreferences* pPreferences = NULL; ++ ++ pszGUID[0] = '\0'; ++ ++ if (pszGUIDList) ++ { ++ // Get next GUID from the GUID list ++ { ++ token = strtok(pszGUIDList, "\n\0"); ++ } ++ if (token) ++ { ++ strncpy(pszGUID, token, GUID_LEN); /* Flawfinder: ignore */ ++ pszGUID[GUID_LEN] = '\0'; ++ } ++ } ++ ++ ppPlayer[0]->QueryInterface(IID_IHXPreferences, ++ (void**) &pPreferences); ++ ++ pExContext->Init(ppPlayer[0], pPreferences, pszGUID, on_buffering_cb, on_pos_length_cb, on_state_change_cb, on_new_frame_cb, context); ++ ++ ppPlayer[0]->SetClientContext(pExContext); ++ ++ HX_RELEASE(pPreferences); ++ ++ IHXErrorSinkControl* pErrorSinkControl = NULL; ++ ppPlayer[0]->QueryInterface(IID_IHXErrorSinkControl, ++ (void**) &pErrorSinkControl); ++ ++ if (pErrorSinkControl) ++ { ++ IHXErrorSink* pErrorSink = NULL; ++ pExContext->QueryInterface(IID_IHXErrorSink, ++ (void**) &pErrorSink); ++ if (pErrorSink) ++ { ++ pErrorSinkControl->AddErrorSink(pErrorSink, HXLOG_EMERG, HXLOG_INFO); ++ } ++ HX_RELEASE(pErrorSink); ++ } ++ HX_RELEASE(pErrorSinkControl); ++ GetGlobal()->g_prefList.SetPreferences(ppPlayer[0]); ++ ++ } ++#endif ++ HX_ASSERT(GetGlobal()->g_nPlayers < MAX_NUM_PLAYERS); ++ GetGlobal()->g_Players[index] = ppPlayer[0]; ++ GetGlobal()->g_pClientContexts[index] = pExContext; ++ GetGlobal()->g_nPlayers++; ++ ++ return HXR_OK; ++} ++ ++static int get_index_by_player( IHXPlayer *pPlayer) ++{ ++ int i; ++ /* an simple implementation */ ++ for (i = 0; i < MAX_NUM_PLAYERS; i++) ++ { ++ if (GetGlobal()->g_Players[i] && GetGlobal()->g_Players[i] == pPlayer) ++ return i; ++ } ++ ++ return -1; ++} ++ ++PLAYER_API int player_openurl( void *pPlayerHandle, char *pszRawURL) ++{ ++ HX_RESULT ret; ++ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle; ++ int index = get_index_by_player(pPlayer); ++ if (index < 0) ++ return HXR_FAIL; ++ ++ char *pszURLOrig = RemoveWrappingQuotes(pszRawURL); ++ ++ //if no "://" was found lets add file:// by default so that you ++ //can refer to local content as just ./splay ~/Content/startrek.rm, ++ //for example, and not ./splay file:///home/gregory/Content/startrek.rm ++ char* pszAddOn = NULL; ++ if( strstr( pszURLOrig, "://") ) ++ pszAddOn = (char *)""; ++ else ++ pszAddOn = (char *)"file://"; ++ ++ char *pszURL = new char[strlen(pszURLOrig)+strlen(pszAddOn)+1]; ++ sprintf( pszURL, "%s%s", pszAddOn, pszURLOrig ); /* Flawfinder: ignore */ ++ // Increment the number of URLs we have found ++ STDERR("opening %s on player\n", pszURL); ++ ++ GetGlobal()->g_pszURLs[index] = pszURL; ++ ret = pPlayer->OpenURL(pszURL); ++ ++ UINT32 sleepTime = 0; ++ ++ IHXMediaPlatformKicker* pKicker = GetGlobal()->g_pIHXKicker; ++ if( pKicker ) ++ { ++ pKicker->Kick(HXGetCurrentThreadID(), &sleepTime); ++ } ++ ++ return ret; ++} ++ ++PLAYER_API int put_player( void *pPlayerHandle) ++{ ++ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle; ++ int index; ++ index = get_index_by_player(pPlayer); ++ if (index < 0) ++ return HXR_FAIL; ++ ++ ExampleClientContext *pClientContext = GetGlobal()->g_pClientContexts[index]; ++ if (pClientContext) { ++ pClientContext->Release(); ++ pClientContext = NULL; ++ } ++ ++ GetGlobal()->g_pClientContexts[index] = NULL; ++ if (pPlayer) { ++ if (GetGlobal()->pEngine) { ++ GetGlobal()->pEngine->ClosePlayer(pPlayer); ++ } ++ pPlayer->Release(); ++ pPlayer = NULL; ++ } ++ GetGlobal()->g_Players[index] = NULL; ++ GetGlobal()->g_nPlayers--; ++ delete [] GetGlobal()->g_pszURLs[index]; ++ GetGlobal()->g_pszURLs[index] = NULL; ++ ++ return HXR_OK; ++} ++ ++PLAYER_API int player_geturl( void *pPlayerHandle, char **pszURL) ++{ ++ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle; ++ int index = get_index_by_player(pPlayer); ++ if (index >= 0) { ++ *pszURL = GetGlobal()->g_pszURLs[index]; ++ return HXR_OK; ++ } ++ ++ return HXR_FAIL; ++} ++ ++PLAYER_API int player_begin( void *pPlayerHandle ) ++{ ++ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle; ++ UINT32 sleepTime = 0; ++ pPlayer->Begin(); ++ ++#if 0 ++ IHXMediaPlatformKicker* pKicker = GetGlobal()->g_pIHXKicker; ++ if( pKicker ) ++ { ++ pKicker->Kick(HXGetCurrentThreadID(), &sleepTime); ++ } ++#endif ++ return HXR_OK; ++} ++ ++PLAYER_API int player_pause( void *pPlayerHandle ) ++{ ++ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle; ++ UINT32 sleepTime = 0; ++ pPlayer->Pause(); ++ ++#if 0 ++ IHXMediaPlatformKicker* pKicker = GetGlobal()->g_pIHXKicker; ++ if( pKicker ) ++ { ++ pKicker->Kick(HXGetCurrentThreadID(), &sleepTime); ++ } ++#endif ++ return HXR_OK; ++} ++ ++PLAYER_API int player_stop( void *pPlayerHandle ) ++{ ++ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle; ++ pPlayer->Stop(); ++ return HXR_OK; ++} ++ ++#if 0 ++int main(int argc, char *argv[]) ++{ ++ IHXPlayer *pPlayer; ++ init_main(); ++ while(1) { ++ get_player(&pPlayer); ++ player_openurl(pPlayer, argv[1]); ++ player_begin(pPlayer); ++ // sleep(2); ++ player_stop(pPlayer); ++ put_player(pPlayer); ++ } ++ deinit_main(); ++ return 0; ++} ++#endif ++ ++PLAYER_API int player_seek(void *pPlayerHandle, int pos) ++{ ++ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle; ++ if (pPlayer == NULL) ++ return HXR_FAIL; ++ ++ return pPlayer->Seek(pos); ++} ++PLAYER_API int player_getvolume(void *pPlayerHandle) ++{ ++ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle; ++ if (pPlayer == NULL) ++ return HXR_FAIL; ++ ++ int volume = 0; ++ ++ IHXAudioPlayer* pAudioPlayer = NULL; ++ pPlayer->QueryInterface(IID_IHXAudioPlayer, (void**) &pAudioPlayer); ++ if (pAudioPlayer) ++ { ++ // Get the IHXVolume ++ IHXVolume* pVolume = pAudioPlayer->GetAudioVolume(); ++ if (pVolume) ++ { ++ volume = pVolume->GetVolume(); ++ } ++ HX_RELEASE(pVolume); ++ } ++ HX_RELEASE(pAudioPlayer); ++ ++ return volume; ++} ++ ++ ++PLAYER_API int player_setvolume(void *pPlayerHandle, unsigned short volume) ++{ ++ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle; ++ if (pPlayer == NULL) ++ return HXR_FAIL; ++ ++ IHXAudioPlayer* pAudioPlayer = NULL; ++ pPlayer->QueryInterface(IID_IHXAudioPlayer, (void**) &pAudioPlayer); ++ if (pAudioPlayer) ++ { ++ // Get the IHXVolume ++ IHXVolume* pVolume = pAudioPlayer->GetAudioVolume(); ++ if (pVolume) ++ { ++ pVolume->SetVolume(volume); ++ } ++ HX_RELEASE(pVolume); ++ } ++ HX_RELEASE(pAudioPlayer); ++} ++ ++PLAYER_API int deinit_main() ++{ ++ ++ pthread_cancel(GetGlobal()->g_pThreadKickmanId); ++ int ret ; ++ ret = pthread_join(GetGlobal()->g_pThreadKickmanId, NULL); ++ if (ret < 0) { ++ perror("pthread_join error\n"); ++ } ++#if defined(HELIX_FEATURE_PLAYBACK_VELOCITY) ++ if (GetGlobal()->g_pVelocityCaps) ++ { ++ IHXPlaybackVelocityCaps* pCaps = GetGlobal()->g_pVelocityCaps; ++ pCaps->Release(); ++ GetGlobal()->g_pVelocityCaps = NULL; ++ } ++#endif /* #if defined(HELIX_FEATURE_PLAYBACK_VELOCITY) */ ++ ++#ifdef __TCS__ ++ g_nPlayers = 0; ++#endif ++ ++ ++ { ++ IHXClientEngine* pEngine = GetGlobal()->pEngine; ++ ++ if (pEngine) ++ { ++ IHXClientEngine2* pEngine2 = NULL; ++ if (HXR_OK == pEngine->QueryInterface(IID_IHXClientEngine2, ++ (void**)&pEngine2)) ++ { ++ pEngine2->Close(); ++ } ++ HX_RELEASE(pEngine2); ++ } ++ HX_RELEASE(GetGlobal()->pEngine); ++ HX_RELEASE(GetGlobal()->g_pIHXKicker); ++ ++ if (GetGlobal()->pMediaPlatform) ++ { ++ // Reset() not only close the platform but also remove all ++ // persistent information(i.e. preferences) maintained by the ++ // platform ++ // GetGlobal()->pMediaPlatform->Reset(NULL); ++ GetGlobal()->pMediaPlatform->Close(); ++ HX_RELEASE(GetGlobal()->pMediaPlatform); ++ } ++ ++ if (GetGlobal()->m_fpHXMediaPlatformClose) ++ { ++ GetGlobal()->m_fpHXMediaPlatformClose(); ++ } ++ } ++ ++ ++ if (GetGlobal()->bEnableVerboseMode) ++ { ++ STDOUT("\nDone.\n"); ++ } ++ ++ if (GetGlobal()->g_pszUsername) ++ { ++ delete [] GetGlobal()->g_pszUsername; ++ GetGlobal()->g_pszUsername = NULL; ++ } ++ if (GetGlobal()->g_pszPassword) ++ { ++ delete [] GetGlobal()->g_pszPassword; ++ GetGlobal()->g_pszPassword = NULL; ++ } ++ if (GetGlobal()->g_pszGUIDFile) ++ { ++ delete [] GetGlobal()->g_pszGUIDFile; ++ GetGlobal()->g_pszGUIDFile = NULL; ++ } ++ if (GetGlobal()->g_pszGUIDList) ++ { ++ delete [] GetGlobal()->g_pszGUIDList; ++ GetGlobal()->g_pszGUIDList = NULL; ++ } ++ // If an error occurred during playback, return that ++ ++ if (GetGlobal()->g_Error != HXR_OK) ++ { ++ return GetGlobal()->g_Error; ++ } ++ // or HXR_OK (if there was more than one player) ++ else ++ { ++ return HXR_OK; ++ } ++} ++char* GetAppName(char* pszArgv0) ++{ ++ char* pszAppName; ++ ++ pszAppName = strrchr(pszArgv0, '\\'); ++ ++ if (NULL == pszAppName) ++ { ++ return pszArgv0; ++ } ++ else ++ { ++ return pszAppName + 1; ++ } ++} ++ ++void PrintUsage(const char* pszAppName) ++{ ++} ++ ++ ++ ++HXBOOL ReadGUIDFile() ++{ ++ HXBOOL bSuccess = FALSE; ++ FILE* pFile = NULL; ++ int nNumRead = 0; ++ int readSize = 10000; ++ char* pszBuffer = new char[readSize]; ++ ++ if (GetGlobal()->g_pszGUIDFile) ++ { ++ if((pFile = fopen(GetGlobal()->g_pszGUIDFile, "r")) != NULL) ++ { ++ // Read in the entire file ++ nNumRead = fread(pszBuffer, sizeof(char), readSize, pFile); ++ pszBuffer[nNumRead] = '\0'; ++ ++ // Store it for later parsing ++ GetGlobal()->g_pszGUIDList = new char[nNumRead + 1]; ++ strcpy(GetGlobal()->g_pszGUIDList, pszBuffer); /* Flawfinder: ignore */ ++ ++ fclose(pFile); ++ pFile = NULL; ++ ++ if (nNumRead > 0) ++ { ++ bSuccess = TRUE; ++ } ++ } ++ } ++ ++ delete [] pszBuffer; ++ ++ return bSuccess; ++} ++ ++static int are_all_src_seekable(IHXPlayer *pPlayer) ++{ ++ UINT16 nSrcCnt; ++ nSrcCnt = pPlayer->GetSourceCount(); ++ HXSource *pSource = NULL; /* This is brute-force */ ++ for (UINT16 i = 0; i < nSrcCnt; i++) ++ { ++ if (pPlayer->GetSource(i, (IUnknown *&)pSource) == HXR_OK) ++ { ++ if (!pSource->IsSeekable()) ++ return FALSE; ++ ++ ++ } ++ } ++ ++} ++ ++PLAYER_API int player_canseek(void *pPlayerHandle) ++{ ++ if (!pPlayerHandle) ++ return FALSE; ++ ++ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle; ++ ExampleClientContext* pExContext=NULL; ++ if (pPlayer->GetClientContext((IUnknown*&)pExContext) != HXR_OK) ++ return FALSE; ++ ++ if (!pExContext) ++ return FALSE; ++ ++ EHXClientState State = pExContext->GetState(); ++ ++ int all_src_seekable = are_all_src_seekable(pPlayer); ++ ++ HX_RELEASE(pExContext); ++ ++ if (State < HX_CLIENT_STATE_CONNECTED) ++ return TRUE; ++ ++ if (all_src_seekable && (!pPlayer->IsLive() || State == HX_CLIENT_STATE_PAUSED)) ++ return TRUE; ++ ++ return FALSE; ++} ++ ++ +Index: helix-libs/clientapps/clutter/player.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/player.h 2008-10-13 06:54:45.000000000 -0700 +@@ -0,0 +1,60 @@ ++#ifndef _PLAYER_H_ ++#define _PLAYER_H_ ++ ++#ifdef __cplusplus ++#define PLAYER_API extern "C" ++#else ++#define PLAYER_API ++#endif ++ ++/* Duplicate of EHXClientState */ ++typedef enum _EPlayerStateState ++{ ++ PLAYER_STATE_READY = 0, // uninitialized ++ PLAYER_STATE_CONNECTING, // attempting to connect to sources ++ PLAYER_STATE_CONNECTED, // connected to sources (realized) ++ PLAYER_STATE_OPENING, // opening sources ++ PLAYER_STATE_OPENED, // opened sources ++ PLAYER_STATE_PREFETCHING,// obtaining resources, buffering, etc. ++ PLAYER_STATE_PREFETCHED, // ready for playback at time zero ++ PLAYER_STATE_PLAYING, // currently playing ++ PLAYER_STATE_PAUSED, // paused ++ PLAYER_STATE_SEEKING // seeking ++} EHXPlayerState; ++ ++typedef struct { ++ int left; ++ int top; ++ int right; ++ int bottom; ++} PlayerRect; ++ ++typedef struct { ++ PlayerRect Rect; ++ unsigned int cx; ++ unsigned int cy; ++} PlayerImgInfo; ++ ++typedef void (*on_pos_length_cb_t)(unsigned int, unsigned int, void *); ++typedef void (*on_buffering_cb_t)(unsigned int, unsigned short, void *); ++typedef void (*on_state_change_cb_t)(unsigned short, unsigned short, void *); ++typedef void (*on_new_frame_cb_t)(unsigned char *p, unsigned int size, PlayerImgInfo *rect, void *context); ++ ++PLAYER_API int init_main(); ++PLAYER_API int deinit_main(); ++PLAYER_API int get_player(void **ppPlayerHandle, on_buffering_cb_t on_buffering_cb, on_pos_length_cb_t on_pos_length_cb, on_state_change_cb_t on_state_change_cb, on_new_frame_cb_t on_new_frame_cb, void *context); ++PLAYER_API int player_openurl( void *pPlayerHandle, char *pszRawURL); ++PLAYER_API int put_player( void *pPlayerHandle); ++PLAYER_API int player_geturl( void *pPlayerHandle, char **pszURL); ++PLAYER_API int player_begin( void *pPlayerHandle ); ++PLAYER_API int player_stop( void *pPlayerHandle ); ++PLAYER_API int player_pause( void *pPlayerHandle ); ++PLAYER_API unsigned int get_curr_playtime(void *pPlayerHandle); ++PLAYER_API int player_seek(void *pPlayerHandle, int pos); ++PLAYER_API int player_getvolume(void *pPlayerHandle); ++PLAYER_API int player_setvolume(void *pPlayerHandle, unsigned short volumn); ++PLAYER_API int player_canseek(void *pPlayerHandle); ++ ++ ++#endif ++ +Index: helix-libs/clientapps/clutter/preflist.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/preflist.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,142 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Source last modified: $Id: preflist.cpp,v 1.2 2007/07/06 20:32:36 jfinnecy Exp $ ++ * ++ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, ++ * are subject to the current version of the RealNetworks Public ++ * Source License (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the current version of the RealNetworks Community ++ * Source License (the "RCSL") available at ++ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL ++ * will apply. You may also obtain the license terms directly from ++ * RealNetworks. You may not use this file except in compliance with ++ * the RPSL or, if you have a valid RCSL with RealNetworks applicable ++ * to this file, the RCSL. Please see the applicable RPSL or RCSL for ++ * the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License Version 2 (the ++ * "GPL") in which case the provisions of the GPL are applicable ++ * instead of those above. If you wish to allow use of your version of ++ * this file only under the terms of the GPL, and not to allow others ++ * to use your version of this file under the terms of either the RPSL ++ * or RCSL, indicate your decision by deleting the provisions above ++ * and replace them with the notice and other provisions required by ++ * the GPL. If you do not delete the provisions above, a recipient may ++ * use your version of this file under the terms of any one of the ++ * RPSL, the RCSL or the GPL. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the ++ * portions it created. ++ * ++ * This file, and the files included with this file, is distributed ++ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY ++ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ++ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ++ * ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++#include "preflist.h" ++ ++#include "hxstring.h" ++#include "hxccf.h" ++#include "hxprefs.h" ++#include "ihxpckts.h" ++ ++class CHXPrefInfo ++{ ++public: ++ CHXPrefInfo(const char* pKey, const char* pValue); ++ ~CHXPrefInfo(); ++ ++ const char* Key() const { return m_key;} ++ const char* Value() const { return m_value;} ++ ++private: ++ CHXString m_key; ++ CHXString m_value; ++}; ++ ++CHXPrefInfo::CHXPrefInfo(const char* pKey, const char* pValue) : ++ m_key(pKey), ++ m_value(pValue) ++{} ++ ++CHXPrefInfo::~CHXPrefInfo() ++{} ++ ++CHXPrefList::CHXPrefList() ++{} ++ ++CHXPrefList::~CHXPrefList() ++{ ++ Clear(); ++} ++ ++void CHXPrefList::Add(const char* pKey, const char* pValue) ++{ ++ CHXPrefInfo* pInfo = new CHXPrefInfo(pKey, pValue); ++ ++ if (pInfo) ++ { ++ if (!m_prefInfo.AddTail(pInfo)) ++ { ++ // We failed to insert the preference. ++ HX_DELETE(pInfo); ++ } ++ } ++} ++ ++void CHXPrefList::Clear() ++{ ++ while(!m_prefInfo.IsEmpty()) ++ { ++ CHXPrefInfo* pInfo = (CHXPrefInfo*)m_prefInfo.RemoveHead(); ++ HX_DELETE(pInfo); ++ } ++} ++ ++void CHXPrefList::SetPreferences(IUnknown* pContext) ++{ ++ IHXPreferences* pPrefs = NULL; ++ IHXCommonClassFactory* pCCF = NULL; ++ ++ if (pContext && ++ (HXR_OK == pContext->QueryInterface(IID_IHXPreferences, ++ (void**)&pPrefs)) && ++ (HXR_OK == pContext->QueryInterface(IID_IHXCommonClassFactory, ++ (void**)&pCCF))) ++ { ++ CHXSimpleList::Iterator itr = m_prefInfo.Begin(); ++ ++ for(; itr != m_prefInfo.End(); ++itr) ++ { ++ CHXPrefInfo* pInfo = (CHXPrefInfo*)(*itr); ++ ++ IHXBuffer* pBuf = NULL; ++ ++ if ((HXR_OK == pCCF->CreateInstance(CLSID_IHXBuffer, ++ (void**)&pBuf)) && ++ (HXR_OK == pBuf->Set((const unsigned char*)pInfo->Value(), ++ strlen(pInfo->Value())))) ++ { ++ pPrefs->WritePref(pInfo->Key(), pBuf); ++ } ++ ++ HX_RELEASE(pBuf); ++ } ++ } ++ ++ HX_RELEASE(pPrefs); ++ HX_RELEASE(pCCF); ++} +Index: helix-libs/clientapps/clutter/preflist.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/preflist.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,69 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Source last modified: $Id: preflist.h,v 1.2 2007/07/06 20:32:36 jfinnecy Exp $ ++ * ++ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, ++ * are subject to the current version of the RealNetworks Public ++ * Source License (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the current version of the RealNetworks Community ++ * Source License (the "RCSL") available at ++ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL ++ * will apply. You may also obtain the license terms directly from ++ * RealNetworks. You may not use this file except in compliance with ++ * the RPSL or, if you have a valid RCSL with RealNetworks applicable ++ * to this file, the RCSL. Please see the applicable RPSL or RCSL for ++ * the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License Version 2 (the ++ * "GPL") in which case the provisions of the GPL are applicable ++ * instead of those above. If you wish to allow use of your version of ++ * this file only under the terms of the GPL, and not to allow others ++ * to use your version of this file under the terms of either the RPSL ++ * or RCSL, indicate your decision by deleting the provisions above ++ * and replace them with the notice and other provisions required by ++ * the GPL. If you do not delete the provisions above, a recipient may ++ * use your version of this file under the terms of any one of the ++ * RPSL, the RCSL or the GPL. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the ++ * portions it created. ++ * ++ * This file, and the files included with this file, is distributed ++ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY ++ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ++ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ++ * ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++#ifndef PREFLIST_H ++#define PREFLIST_H ++ ++#include "hxslist.h" ++ ++class CHXPrefList ++{ ++public: ++ CHXPrefList(); ++ ~CHXPrefList(); ++ ++ void Add(const char* pKey, const char* pValue); ++ void Clear(); ++ ++ void SetPreferences(IUnknown* pContext); ++ ++private: ++ CHXSimpleList m_prefInfo; ++}; ++ ++#endif /* PREFLIST_H */ +Index: helix-libs/clientapps/clutter/print.cpp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/print.cpp 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,80 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include ++#include ++#include "print.h" ++#ifdef WIN32_PLATFORM_PSPC ++#include "hlxosstr.h" ++#include ++#endif ++ ++int print2stdout(const char* pFmt, ...) ++{ ++ va_list args; ++ ++ va_start(args, pFmt); ++ ++#ifdef WIN32_PLATFORM_PSPC ++ char szMessage[512]; ++ int ret = vsprintf(szMessage, pFmt, args); ++ OutputDebugString(OS_STRING(szMessage)); ++#else ++ int ret = vfprintf(stdout, pFmt, args); ++#endif ++ ++ va_end(args); ++ ++ return ret; ++} ++ ++int print2stderr(const char* pFmt, ...) ++{ ++ va_list args; ++ ++ va_start(args, pFmt); ++ ++#ifdef WIN32_PLATFORM_PSPC ++ char szMessage[512]; ++ int ret = vsprintf(szMessage, pFmt, args); ++ OutputDebugString(OS_STRING(szMessage)); ++#else ++ int ret = vfprintf(stderr, pFmt, args); ++#endif ++ ++ va_end(args); ++ ++ return ret; ++} +Index: helix-libs/clientapps/clutter/print.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/print.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,60 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: RCSL 1.0/RPSL 1.0 ++ * ++ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, are ++ * subject to the current version of the RealNetworks Public Source License ++ * Version 1.0 (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the RealNetworks Community Source License Version 1.0 ++ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++ * in which case the RCSL will apply. You may also obtain the license terms ++ * directly from RealNetworks. You may not use this file except in ++ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++ * applicable to this file, the RCSL. Please see the applicable RPSL or ++ * RCSL for the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the portions ++ * it created. ++ * ++ * This file, and the files included with this file, is distributed and made ++ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef PRINT_H ++#define PRINT_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifdef _SYMBIAN ++#include "platform/symbian/symbian_print.h" ++ ++#define STDOUT symbianPrint ++#define STDERR symbianPrint ++#else ++int print2stdout(const char* pFmt, ...); ++int print2stderr(const char* pFmt, ...); ++#define STDOUT print2stdout ++#define STDERR print2stderr ++#endif ++ ++#ifdef __cplusplus ++}; ++#endif ++ ++ ++#endif /* PRINT_H */ +Index: helix-libs/clientapps/clutter/shmhelp.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/shmhelp.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,88 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Source last modified: $Id: shmhelp.h,v 1.5 2007/07/06 20:54:01 jfinnecy Exp $ ++ * ++ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, ++ * are subject to the current version of the RealNetworks Public ++ * Source License (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the current version of the RealNetworks Community ++ * Source License (the "RCSL") available at ++ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL ++ * will apply. You may also obtain the license terms directly from ++ * RealNetworks. You may not use this file except in compliance with ++ * the RPSL or, if you have a valid RCSL with RealNetworks applicable ++ * to this file, the RCSL. Please see the applicable RPSL or RCSL for ++ * the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License Version 2 (the ++ * "GPL") in which case the provisions of the GPL are applicable ++ * instead of those above. If you wish to allow use of your version of ++ * this file only under the terms of the GPL, and not to allow others ++ * to use your version of this file under the terms of either the RPSL ++ * or RCSL, indicate your decision by deleting the provisions above ++ * and replace them with the notice and other provisions required by ++ * the GPL. If you do not delete the provisions above, a recipient may ++ * use your version of this file under the terms of any one of the ++ * RPSL, the RCSL or the GPL. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the ++ * portions it created. ++ * ++ * This file, and the files included with this file, is distributed ++ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY ++ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ++ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ++ * ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#if defined(USE_XWINDOWS) ++#include ++#include ++#include ++#endif ++ ++#include "hxcom.h" ++#include "hxtypes.h" ++ ++ ++class ShmHelp ++{ ++ public: ++ ++ //Helpers ++ static void Init(Display* pDisplay ); ++ static HXBOOL ShmAvailable(); ++ static HX_RESULT DetachSharedRegion(UCHAR**ppMem, XShmSegmentInfo* pInfo ); ++ static HX_RESULT CreateSharedRegion( INT32 nSize, ++ UCHAR**ppMem, ++ int* pnShmID, ++ XShmSegmentInfo* pInfo ); ++ ++ ++ protected: ++ ++ private: ++ static HXBOOL zm_bUseShm; ++ ++ //The X11 Segment ID.... ++ static int zm_nSegment; ++ static Display* zm_pDisplay; ++ ++ ShmHelp(); ++ ShmHelp(Display*); ++ ~ShmHelp(); ++ ++}; ++ +Index: helix-libs/clientapps/clutter/unix.pcf +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/unix.pcf 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,65 @@ ++# ++# ***** BEGIN LICENSE BLOCK ***** ++# Version: RCSL 1.0/RPSL 1.0 ++# ++# Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. ++# ++# The contents of this file, and the files included with this file, are ++# subject to the current version of the RealNetworks Public Source License ++# Version 1.0 (the "RPSL") available at ++# http://www.helixcommunity.org/content/rpsl unless you have licensed ++# the file under the RealNetworks Community Source License Version 1.0 ++# (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, ++# in which case the RCSL will apply. You may also obtain the license terms ++# directly from RealNetworks. You may not use this file except in ++# compliance with the RPSL or, if you have a valid RCSL with RealNetworks ++# applicable to this file, the RCSL. Please see the applicable RPSL or ++# RCSL for the rights, obligations and limitations governing use of the ++# contents of the file. ++# ++# This file is part of the Helix DNA Technology. RealNetworks is the ++# developer of the Original Code and owns the copyrights in the portions ++# it created. ++# ++# This file, and the files included with this file, is distributed and made ++# available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++# EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS ++# FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. ++# ++# Technology Compatibility Kit Test Suite(s) Location: ++# http://www.helixcommunity.org/content/tck ++# ++# Contributor(s): ++# ++# ***** END LICENSE BLOCK ***** ++# ++ ++ ++if( ('HELIX_FEATURE_MINI_SITE' not in project.defines) and ++ (platform.name in ('linux2', 'linux-i386')) and ++ ('HELIX_FEATURE_VIDEO' in project.defines) and ++ (project.BuildOption("nodll")) ++ ): ++ project.sys_libraries.append('Xv', 'Xext') ++ ++ ++ ++ ++if project.BuildOption("nodll"): ++ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV20"): ++ if platform.name in ('linux2', 'linux-i386', 'win32') and sysinfo.arch == 'i386': ++ project.AddLibraries(GetSDKPath("rvg2dec_libs") + '[adecg2]') ++ else: ++ project.AddLibraries(GetSDKPath("rvg2dec_libs") + '[cdecg2]') ++ ++ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV30") or \ ++ project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV40"): ++ if project.IsDefined("HELIX_FEATURE_ANSIC_RV89COMBO"): ++ project.AddLibraries(GetSDKPath("rv89combo_c_libs")+"[cdec]") ++ else: ++ if platform.name in ('linux2', 'linux-i386') and sysinfo.arch == 'i386': ++ project.AddLibraries(GetSDKPath("rv89combo_libs")+"[adec40]") ++ else: ++ project.AddLibraries(GetSDKPath("rv89combo_libs")+"[cdec40]") ++ +Index: helix-libs/clientapps/clutter/unixcmap.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/unixcmap.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,51 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Source last modified: $Id: unixcmap.h,v 1.3 2007/07/06 20:54:01 jfinnecy Exp $ ++ * ++ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, ++ * are subject to the current version of the RealNetworks Public ++ * Source License (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the current version of the RealNetworks Community ++ * Source License (the "RCSL") available at ++ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL ++ * will apply. You may also obtain the license terms directly from ++ * RealNetworks. You may not use this file except in compliance with ++ * the RPSL or, if you have a valid RCSL with RealNetworks applicable ++ * to this file, the RCSL. Please see the applicable RPSL or RCSL for ++ * the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License Version 2 (the ++ * "GPL") in which case the provisions of the GPL are applicable ++ * instead of those above. If you wish to allow use of your version of ++ * this file only under the terms of the GPL, and not to allow others ++ * to use your version of this file under the terms of either the RPSL ++ * or RCSL, indicate your decision by deleting the provisions above ++ * and replace them with the notice and other provisions required by ++ * the GPL. If you do not delete the provisions above, a recipient may ++ * use your version of this file under the terms of any one of the ++ * RPSL, the RCSL or the GPL. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the ++ * portions it created. ++ * ++ * This file, and the files included with this file, is distributed ++ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY ++ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ++ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ++ * ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++EXTERN_C Colormap HXGetXColormap(Display* pDisplay, Window window); ++EXTERN_C void HXFindBestXColor(Display* pDisplay, Colormap cmap, XColor* desired); +Index: helix-libs/clientapps/clutter/visuals.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ helix-libs/clientapps/clutter/visuals.h 2008-10-13 06:05:49.000000000 -0700 +@@ -0,0 +1,74 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Source last modified: $Id: visuals.h,v 1.4 2007/07/06 20:54:01 jfinnecy Exp $ ++ * ++ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. ++ * ++ * The contents of this file, and the files included with this file, ++ * are subject to the current version of the RealNetworks Public ++ * Source License (the "RPSL") available at ++ * http://www.helixcommunity.org/content/rpsl unless you have licensed ++ * the file under the current version of the RealNetworks Community ++ * Source License (the "RCSL") available at ++ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL ++ * will apply. You may also obtain the license terms directly from ++ * RealNetworks. You may not use this file except in compliance with ++ * the RPSL or, if you have a valid RCSL with RealNetworks applicable ++ * to this file, the RCSL. Please see the applicable RPSL or RCSL for ++ * the rights, obligations and limitations governing use of the ++ * contents of the file. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU General Public License Version 2 (the ++ * "GPL") in which case the provisions of the GPL are applicable ++ * instead of those above. If you wish to allow use of your version of ++ * this file only under the terms of the GPL, and not to allow others ++ * to use your version of this file under the terms of either the RPSL ++ * or RCSL, indicate your decision by deleting the provisions above ++ * and replace them with the notice and other provisions required by ++ * the GPL. If you do not delete the provisions above, a recipient may ++ * use your version of this file under the terms of any one of the ++ * RPSL, the RCSL or the GPL. ++ * ++ * This file is part of the Helix DNA Technology. RealNetworks is the ++ * developer of the Original Code and owns the copyrights in the ++ * portions it created. ++ * ++ * This file, and the files included with this file, is distributed ++ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY ++ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ++ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ++ * ENJOYMENT OR NON-INFRINGEMENT. ++ * ++ * Technology Compatibility Kit Test Suite(s) Location: ++ * http://www.helixcommunity.org/content/tck ++ * ++ * Contributor(s): ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef _UNIX ++#error This is the UNIX platform specific implementation. ++#endif ++ ++#ifndef _VISUALS_H_ ++#define _VISUALS_H_ ++ ++#if defined(USE_XWINDOWS) ++#include ++#include ++#include ++#endif ++ ++// ++// These functions are loaded with dlsym() so turn off name mangling ++// with extern "C". ++// ++extern "C" { ++ ++Visual* GetBestVisual(Display* display); ++Visual* GetVisual(Display* display, long mask, XVisualInfo* templ); ++ ++} ++ ++#endif // _VISUALS_H_ diff --git a/meta/packages/helix/helix-libs/helix-player.pc b/meta/packages/helix/helix-libs/helix-player.pc new file mode 100644 index 000000000..bac67fc5c --- /dev/null +++ b/meta/packages/helix/helix-libs/helix-player.pc @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: helix-player +Description: Helix Player Interface +Version: 4.1.0 +Libs: -L${libdir} -lhelix-player +Cflags: -I/opt/helix/include -D_UNIX +Requires: diff --git a/meta/packages/helix/helix-libs/hxclient.pc b/meta/packages/helix/helix-libs/hxclient.pc new file mode 100644 index 000000000..8f64d2567 --- /dev/null +++ b/meta/packages/helix/helix-libs/hxclient.pc @@ -0,0 +1,11 @@ +prefix=/opt/helix +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: hxclient +Description: Helix Client Libraries off the Atlas Branch +Version: 4.1.0 +Libs: -L${libdir} -lhxclient -lstdc++ +Cflags: -I${includedir} -D_UNIX +Requires: diff --git a/meta/packages/helix/ribosome.bb b/meta/packages/helix/ribosome.bb new file mode 100644 index 000000000..4339a6ce4 --- /dev/null +++ b/meta/packages/helix/ribosome.bb @@ -0,0 +1,37 @@ +DESCRIPTION = "Ribosome: HelixCommunity Build System" +SECTION = "base" +HOMEPAGE = "http://helixcommunity.org" +LICENSE = "GPLv2" + +_SNAPSHOT = "22102008" +_TARBALL_SERVER = "http://git.moblin.org/repos/users/rusty" + +PV="r0" + +SRC_URI = "${_TARBALL_SERVER}/ribosome-${_SNAPSHOT}.tar.bz2 \ + ${_TARBALL_SERVER}/client-bif-${_SNAPSHOT}.tar.bz2 \ + ${_TARBALL_SERVER}/common-bif-${_SNAPSHOT}.tar.bz2 \ + file://ribosome/clutter.bif \ + file://ribosome/buildrc" + +S = "${WORKDIR}" + +do_stage() { + # Install build system of doom + install -d ${STAGING_DIR_HOST}${libdir} + cp -a ribosome-${_SNAPSHOT} ${STAGING_DIR_HOST}${libdir}/ribosome + install -m 0644 ribosome/buildrc ${STAGING_DIR_HOST}${libdir}/ribosome/ + + # Install client BIF's + install -d ${STAGING_DIR_HOST}${libdir}/ribosome/bif-cvs/helix/client/build/BIF + install -m 0644 client-bif-${_SNAPSHOT}/*.bif \ + ${STAGING_DIR_HOST}${libdir}/ribosome/bif-cvs/helix/client/build/BIF + + # Install common BIF's + install -d ${STAGING_DIR_HOST}${libdir}/ribosome/bif-cvs/helix/common/build/BIF + install -m 0644 common-bif-${_SNAPSHOT}/*.bif \ + ${STAGING_DIR_HOST}${libdir}/ribosome/bif-cvs/helix/common/build/BIF + + # Install our own custom BIF + install -m 0644 ribosome/*.bif ${STAGING_DIR_HOST}${libdir}/ribosome/bif-cvs/helix/client/build/BIF/ +} diff --git a/meta/packages/helix/ribosome/buildrc b/meta/packages/helix/ribosome/buildrc new file mode 100644 index 000000000..6dbc47a06 --- /dev/null +++ b/meta/packages/helix/ribosome/buildrc @@ -0,0 +1,4 @@ +AddMultiCVS("helix",":ext:cvs.helixcommunity.org:/cvsroot/") +AddBIFPath("common", "[helix]/common/build/BIF") +AddBIFPath("client", "[helix]/client/build/BIF") +SetSDKPath("oggvorbissdk", "/usr/") diff --git a/meta/packages/helix/ribosome/clutter.bif b/meta/packages/helix/ribosome/clutter.bif new file mode 100755 index 000000000..a87fcb3fa --- /dev/null +++ b/meta/packages/helix/ribosome/clutter.bif @@ -0,0 +1,68 @@ + + + + + + + + + + + + unix + + + + HELIX_FEATURE_AUDIO_VORBIS + HELIX_FEATURE_VIDEO_THEORA + HELIX_FEATURE_NETSERVICES_SHIM + HELIX_FEATURE_AVIFF + HELIX_CONFIG_SLUGGISHAUTOUPGRADE + HELIX_FEATURE_ALSA + _FORTIFY_SOURCE=2 + + + + client_include + datatype_tools_dtdriver_dtdrplin + + + + helix_client_objs + player_hxclientkit + player_hxclientkit_src_hxrecordengine + client_core + client_resource + client_xres + protocol_sdp + video_site + datatype_smil + datatype_text_realtext_fileformat + datatype_text_realtext_renderer + datatype_tools_dtdriver_dtdrplin + datatype_ogg_fileformat + datatype_vorbis_renderer + datatype_theora_renderer + datatype_h261_renderer + datatype_h263 + datatype_group_audio + datatype_group_image + datatype_ram + datatype_sdp + datatype_avi_fileformat + filesystem_local + filesystem_http + filesystem_memory + common_auth_authmgr + common_auth_rn5auth + client_auth_basicauth + common_log_logsystem + common_log_logobserverfile + + + + + + + + -- cgit v1.2.3