summaryrefslogtreecommitdiffstats
path: root/meta/packages/helix/helix-libs/add-clutter.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/packages/helix/helix-libs/add-clutter.patch')
-rw-r--r--meta/packages/helix/helix-libs/add-clutter.patch12668
1 files changed, 0 insertions, 12668 deletions
diff --git a/meta/packages/helix/helix-libs/add-clutter.patch b/meta/packages/helix/helix-libs/add-clutter.patch
deleted file mode 100644
index eb545ff73f..0000000000
--- a/meta/packages/helix/helix-libs/add-clutter.patch
+++ /dev/null
@@ -1,12668 +0,0 @@
1Index: helix-libs/clientapps/clutter/LICENSE.txt
2===================================================================
3--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4+++ helix-libs/clientapps/clutter/LICENSE.txt 2008-10-13 06:05:49.000000000 -0700
5@@ -0,0 +1,30 @@
6+ Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
7+
8+ The contents of this directory, and (except where otherwise
9+ indicated) the directories included within this directory, are
10+ subject to the current version of the RealNetworks Public Source
11+ License (the "RPSL") available at RPSL.txt in this directory, unless
12+ you have licensed the directory under the current version of the
13+ RealNetworks Community Source License (the "RCSL") available at
14+ RCSL.txt in this directory, in which case the RCSL will apply. You
15+ may also obtain the license terms directly from RealNetworks. You
16+ may not use the files in this directory except in compliance with the
17+ RPSL or, if you have a valid RCSL with RealNetworks applicable to
18+ this directory, the RCSL. Please see the applicable RPSL or RCSL for
19+ the rights, obligations and limitations governing use of the contents
20+ of the directory.
21+
22+ This directory is part of the Helix DNA Technology. RealNetworks is
23+ the developer of the Original Code and owns the copyrights in the
24+ portions it created.
25+
26+ This directory, and the directories included with this directory, are
27+ distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY
28+ OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY
29+ DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY
30+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
31+ QUIET ENJOYMENT OR NON-INFRINGEMENT.
32+
33+ Technology Compatibility Kit Test Suite(s) Location:
34+ http://www.helixcommunity.org/content/tck
35+
36Index: helix-libs/clientapps/clutter/RCSL.txt
37===================================================================
38--- /dev/null 1970-01-01 00:00:00.000000000 +0000
39+++ helix-libs/clientapps/clutter/RCSL.txt 2008-10-13 06:05:49.000000000 -0700
40@@ -0,0 +1,948 @@
41+The RCSL is made up of a base agreement and a few Attachments.
42+
43+For Research and Development use, you agree to the terms of the
44+RCSL R&D License (base RCSL and Attachments A, B, and C)
45+
46+For Commercial Use (either distribution or internal commercial
47+deployment) of the Helix DNA with or without support for RealNetworks'
48+RealAudio and RealVideo Add-on Technology, you agree to the
49+terms of the same RCSL R&D license
50+and execute one or more additional Commercial Use License attachments
51+<see http://www.helixcommunity.org/content/rcsl-attachments>.
52+
53+------------------------------------------------------------------------
54+
55+
56+ REALNETWORKS COMMUNITY SOURCE LICENSE
57+
58+Version 1.2 (Rev. Date: January 22, 2003).
59+
60+
61+ RECITALS
62+
63+Original Contributor has developed Specifications, Source Code
64+implementations and Executables of certain Technology; and
65+
66+Original Contributor desires to license the Technology to a large
67+community to facilitate research, innovation and product development
68+while maintaining compatibility of such products with the Technology as
69+delivered by Original Contributor; and
70+
71+Original Contributor desires to license certain Trademarks for the
72+purpose of branding products that are compatible with the relevant
73+Technology delivered by Original Contributor; and
74+
75+You desire to license the Technology and possibly certain Trademarks
76+from Original Contributor on the terms and conditions specified in this
77+License.
78+
79+In consideration for the mutual covenants contained herein, You and
80+Original Contributor agree as follows:
81+
82+
83+ AGREEMENT
84+
85+*1. Introduction.*
86+
87+The RealNetworks Community Source License ("RCSL") and effective
88+attachments ("License") may include five distinct licenses:
89+
90+i) Research Use license -- License plus Attachments A, B and C only.
91+
92+ii) Commercial Use and Trademark License, which may be for Internal
93+Deployment Use or external distribution, or both -- License plus
94+Attachments A, B, C, and D.
95+
96+iii) Technology Compatibility Kit (TCK) license -- Attachment C.
97+
98+iv) Add-On Technology License (Executable) Commercial Use License
99+-Attachment F.
100+
101+v) Add-On Technology Source Code Porting and Optimization
102+License-Attachment G.
103+
104+The Research Use license is effective when You click and accept this
105+License. The TCK is effective when You click and accept this License,
106+unless otherwise specified in the TCK attachments. The Commercial Use
107+and Trademark, Add-On Technology License, and the Add-On Technology
108+Source Code Porting and Optimization licenses must each be signed by You
109+and Original Contributor to become effective. Once effective, these
110+licenses and the associated requirements and responsibilities are
111+cumulative. Capitalized terms used in this License are defined in the
112+Glossary.
113+
114+*2. License Grants.*
115+
116+2.1 Original Contributor Grant.
117+
118+Subject to Your compliance with Sections 3, 8.10 and Attachment A of
119+this License, Original Contributor grants to You a worldwide,
120+royalty-free, non-exclusive license, to the extent of Original
121+Contributor's Intellectual Property Rights covering the Original Code,
122+Upgraded Code and Specifications, to do the following:
123+
124+(a) Research Use License:
125+
126+(i) use, reproduce and modify the Original Code, Upgraded Code and
127+Specifications to create Modifications and Reformatted Specifications
128+for Research Use by You;
129+
130+(ii) publish and display Original Code, Upgraded Code and Specifications
131+with, or as part of Modifications, as permitted under Section 3.1(b) below;
132+
133+(iii) reproduce and distribute copies of Original Code and Upgraded Code
134+to Licensees and students for Research Use by You;
135+
136+(iv) compile, reproduce and distribute Original Code and Upgraded Code
137+in Executable form, and Reformatted Specifications to anyone for
138+Research Use by You.
139+
140+(b) Other than the licenses expressly granted in this License, Original
141+Contributor retains all right, title, and interest in Original Code and
142+Upgraded Code and Specifications.
143+
144+2.2 Your Grants.
145+
146+(a) To Other Licensees. You hereby grant to each Licensee a license to
147+Your Error Corrections and Shared Modifications, of the same scope and
148+extent as Original Contributor's licenses under Section 2.1 a) above
149+relative to Research Use and Attachment D relative to Commercial Use.
150+
151+(b) To Original Contributor. You hereby grant to Original Contributor a
152+worldwide, royalty-free, non-exclusive, perpetual and irrevocable
153+license, to the extent of Your Intellectual Property Rights covering
154+Your Error Corrections, Shared Modifications and Reformatted
155+Specifications, to use, reproduce, modify, display and distribute Your
156+Error Corrections, Shared Modifications and Reformatted Specifications,
157+in any form, including the right to sublicense such rights through
158+multiple tiers of distribution.
159+
160+(c) Other than the licenses expressly granted in Sections 2.2(a) and (b)
161+above, and the restrictions set forth in Section 3.1(d)(iv) below, You
162+retain all right, title, and interest in Your Error Corrections, Shared
163+Modifications and Reformatted Specifications.
164+
165+2.3 Contributor Modifications.
166+
167+You may use, reproduce, modify, display and distribute Contributor Error
168+Corrections, Shared Modifications and Reformatted Specifications,
169+obtained by You under this License, to the same scope and extent as with
170+Original Code, Upgraded Code and Specifications.
171+
172+2.4 Subcontracting.
173+
174+You may deliver the Source Code of Covered Code to other Licensees
175+having at least a Research Use license, for the sole purpose of
176+furnishing development services to You in connection with Your rights
177+granted in this License. All such Licensees must execute appropriate
178+documents with respect to such work consistent with the terms of this
179+License, and acknowledging their work-made-for-hire status or assigning
180+exclusive right to the work product and associated Intellectual Property
181+Rights to You.
182+
183+*3. Requirements and Responsibilities*.
184+
185+3.1 Research Use License.
186+
187+As a condition of exercising the rights granted under Section 2.1(a)
188+above, You agree to comply with the following:
189+
190+(a) Your Contribution to the Community. All Error Corrections and Shared
191+Modifications which You create or contribute to are automatically
192+subject to the licenses granted under Section 2.2 above. You are
193+encouraged to license all of Your other Modifications under Section 2.2
194+as Shared Modifications, but are not required to do so. You agree to
195+notify Original Contributor of any errors in the Specification.
196+
197+(b) Source Code Availability. You agree to provide all Your Error
198+Corrections to Original Contributor as soon as reasonably practicable
199+and, in any event, prior to Internal Deployment Use or Commercial Use,
200+if applicable. Original Contributor may, at its discretion, post Source
201+Code for Your Error Corrections and Shared Modifications on the
202+Community Webserver. You may also post Error Corrections and Shared
203+Modifications on a web-server of Your choice; provided, that You must
204+take reasonable precautions to ensure that only Licensees have access to
205+such Error Corrections and Shared Modifications. Such precautions shall
206+include, without limitation, a password protection scheme limited to
207+Licensees and a click-on, download certification of Licensee status
208+required of those attempting to download from the server. An example of
209+an acceptable certification is attached as Attachment A-2.
210+
211+(c) Notices. All Error Corrections and Shared Modifications You create
212+or contribute to must include a file documenting the additions and
213+changes You made and the date of such additions and changes. You must
214+also include the notice set forth in Attachment A-1 in the file header.
215+If it is not possible to put the notice in a particular Source Code file
216+due to its structure, then You must include the notice in a location
217+(such as a relevant directory file), where a recipient would be most
218+likely to look for such a notice.
219+
220+(d) Redistribution.
221+
222+(i) Source. Covered Code may be distributed in Source Code form only to
223+another Licensee (except for students as provided below). You may not
224+offer or impose any terms on any Covered Code that alter the rights,
225+requirements, or responsibilities of such Licensee. You may distribute
226+Covered Code to students for use in connection with their course work
227+and research projects undertaken at accredited educational institutions.
228+Such students need not be Licensees, but must be given a copy of the
229+notice set forth in Attachment A-3 and such notice must also be included
230+in a file header or prominent location in the Source Code made available
231+to such students.
232+
233+(ii) Executable. You may distribute Executable version(s) of Covered
234+Code to Licensees and other third parties only for the purpose of
235+evaluation and comment in connection with Research Use by You and under
236+a license of Your choice, but which limits use of such Executable
237+version(s) of Covered Code only to that purpose.
238+
239+(iii) Modified Class, Interface and Package Naming. In connection with
240+Research Use by You only, You may use Original Contributor's class,
241+Interface and package names only to accurately reference or invoke the
242+Source Code files You modify. Original Contributor grants to You a
243+limited license to the extent necessary for such purposes.
244+
245+(iv) You expressly agree that any distribution, in whole or in part, of
246+Modifications developed by You shall only be done pursuant to the terms
247+and conditions of this License.
248+
249+(e) Extensions.
250+
251+(i) Covered Code. You may not include any Source Code of Community Code
252+in any Extensions. You may include the compiled Header Files of
253+Community Code in an Extension provided that Your use of the Covered
254+Code, including Heading Files, complies with the Commercial Use License,
255+the TCK and all other terms of this License.
256+
257+(ii) Publication. No later than the date on which You first distribute
258+such Extension for Commercial Use, You must publish to the industry, on
259+a non-confidential basis and free of all copyright restrictions with
260+respect to reproduction and use, an accurate and current specification
261+for any Extension. In addition, You must make available an appropriate
262+test suite, pursuant to the same rights as the specification,
263+sufficiently detailed to allow any third party reasonably skilled in the
264+technology to produce implementations of the Extension compatible with
265+the specification. Such test suites must be made available as soon as
266+reasonably practicable but, in no event, later than ninety (90) days
267+after Your first Commercial Use of the Extension. You must use
268+reasonable efforts to promptly clarify and correct the specification and
269+the test suite upon written request by Original Contributor.
270+
271+(iii) Open. You agree to refrain from enforcing any Intellectual
272+Property Rights You may have covering any interface(s) of Your
273+Extension, which would prevent the implementation of such interface(s)
274+by Original Contributor or any Licensee. This obligation does not
275+prevent You from enforcing any Intellectual Property Right You have that
276+would otherwise be infringed by an implementation of Your Extension.
277+
278+(iv) Interface Modifications and Naming. You may not modify or add to
279+the GUID space * * "xxxxxxxx-0901-11d1-8B06-00A024406D59" or any other
280+GUID space designated by Original Contributor. You may not modify any
281+Interface prefix provided with the Covered Code or any other prefix
282+designated by Original Contributor.* *
283+
284+* *
285+
286+(f) You agree that any Specifications provided to You by Original
287+Contributor are confidential and proprietary information of Original
288+Contributor. You must maintain the confidentiality of the Specifications
289+and may not disclose them to any third party without Original
290+Contributor's prior written consent. You may only use the Specifications
291+under the terms of this License and only for the purpose of implementing
292+the terms of this License with respect to Covered Code. You agree not
293+use, copy or distribute any such Specifications except as provided in
294+writing by Original Contributor.
295+
296+3.2 Commercial Use License.
297+
298+You may not make Commercial Use of any Covered Code unless You and
299+Original Contributor have executed a copy of the Commercial Use and
300+Trademark License attached as Attachment D.
301+
302+*4. Versions of the License.*
303+
304+4.1 License Versions.
305+
306+Original Contributor may publish revised versions of the License from
307+time to time. Each version will be given a distinguishing version number.
308+
309+4.2 Effect.
310+
311+Once a particular version of Covered Code has been provided under a
312+version of the License, You may always continue to use such Covered Code
313+under the terms of that version of the License. You may also choose to
314+use such Covered Code under the terms of any subsequent version of the
315+License. No one other than Original Contributor has the right to
316+promulgate License versions.
317+
318+4.3 Multiple-Licensed Code.
319+
320+Original Contributor may designate portions of the Covered Code as
321+"Multiple-Licensed." "Multiple-Licensed" means that the Original
322+Contributor permits You to utilize those designated portions of the
323+Covered Code under Your choice of this License or the alternative
324+license(s), if any, specified by the Original Contributor in an
325+Attachment to this License.
326+
327+*5. Disclaimer of Warranty.*
328+
329+5.1 COVERED CODE PROVIDED AS IS.
330+
331+COVERED CODE IS PROVIDED UNDER THIS LICENSE "AS IS," WITHOUT WARRANTY OF
332+ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION,
333+WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT
334+FOR A PARTICULAR PURPOSE OR NON-INFRINGING. YOU AGREE TO BEAR THE ENTIRE
335+RISK IN CONNECTION WITH YOUR USE AND DISTRIBUTION OF COVERED CODE UNDER
336+THIS LICENSE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART
337+OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER
338+EXCEPT SUBJECT TO THIS DISCLAIMER.
339+
340+5.2 Not Designed for High Risk Activities.
341+
342+You acknowledge that Original Code, Upgraded Code and Specifications are
343+not designed or intended for use in high risk activities including, but
344+not limited to: (i) on-line control of aircraft, air traffic, aircraft
345+navigation or aircraft communications; or (ii) in the design,
346+construction, operation or maintenance of any nuclear facility. Original
347+Contributor disclaims any express or implied warranty of fitness for
348+such uses.
349+
350+*6. Termination.*
351+
352+6.1 By You.
353+
354+You may terminate this Research Use license at anytime by providing
355+written notice to Original Contributor.
356+
357+6.2 By Original Contributor.
358+
359+This License and the rights granted hereunder will terminate:
360+
361+(i) automatically if You fail to comply with the terms of this License
362+and fail to cure such breach within 30 days of receipt of written notice
363+of the breach;
364+
365+(ii) immediately in the event of circumstances specified in Sections 7.1
366+and 8.4; or
367+
368+(iii) at Original Contributor's discretion upon any action initiated by
369+You (including by cross-claim or counter claim) alleging that use or
370+distribution by Original Contributor or any Licensee, of Original Code,
371+Upgraded Code, Error Corrections, Shared Modifications or Specifications
372+infringe a patent owned or controlled by You.
373+
374+6.3 Effective of Termination.
375+
376+Upon termination, You agree to discontinue use of and destroy all copies
377+of Covered Code in Your possession. All sublicenses to the Covered Code
378+which You have properly granted shall survive any termination of this
379+License. Provisions that, by their nature, should remain in effect
380+beyond the termination of this License shall survive including, without
381+limitation, Sections 2.2, 3, 5, 7 and 8.
382+
383+6.4 No Compensation.
384+
385+Each party waives and releases the other from any claim to compensation
386+or indemnity for permitted or lawful termination of the business
387+relationship established by this License.
388+
389+*7. Liability.*
390+
391+7.1 Infringement. Should any of the Original Code, Upgraded Code, TCK or
392+Specifications ("Materials") become the subject of a claim of
393+infringement, Original Contributor may, at its sole option, (i) attempt
394+to procure the rights necessary for You to continue using the Materials,
395+(ii) modify the Materials so that they are no longer infringing, or
396+(iii) terminate Your right to use the Materials, immediately upon
397+written notice, and refund to You the amount, if any, having then
398+actually been paid by You to Original Contributor for the Original Code,
399+Upgraded Code and TCK, depreciated on a straight line, five year basis.
400+
401+7.2 LIMITATION OF LIABILITY. TO THE FULL EXTENT ALLOWED BY APPLICABLE
402+LAW, ORIGINAL CONTRIBUTOR'S LIABILITY TO YOU FOR CLAIMS RELATING TO THIS
403+LICENSE, WHETHER FOR BREACH OR IN TORT, SHALL BE LIMITED TO ONE HUNDRED
404+PERCENT (100%) OF THE AMOUNT HAVING THEN ACTUALLY BEEN PAID BY YOU TO
405+ORIGINAL CONTRIBUTOR FOR ALL COPIES LICENSED HEREUNDER OF THE PARTICULAR
406+ITEMS GIVING RISE TO SUCH CLAIM, IF ANY, DURING THE TWELVE MONTHS
407+PRECEDING THE CLAIMED BREACH. IN NO EVENT WILL YOU (RELATIVE TO YOUR
408+SHARED MODIFICATIONS OR ERROR CORRECTIONS) OR ORIGINAL CONTRIBUTOR BE
409+LIABLE FOR ANY INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
410+DAMAGES IN CONNECTION WITH OR RISING OUT OF THIS LICENSE (INCLUDING,
411+WITHOUT LIMITATION, LOSS OF PROFITS, USE, DATA, OR OTHER ECONOMIC
412+ADVANTAGE), HOWEVER IT ARISES AND ON ANY THEORY OF LIABILITY, WHETHER IN
413+AN ACTION FOR CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE)
414+OR OTHERWISE, WHETHER OR NOT YOU OR ORIGINAL CONTRIBUTOR HAS BEEN
415+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE AND NOTWITHSTANDING THE
416+FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY.
417+
418+*8. Miscellaneous.*
419+
420+8.1 Trademark.
421+
422+You shall not use any Trademark unless You and Original Contributor
423+execute a copy of the Commercial Use and Trademark License Agreement
424+attached hereto as Attachment D. Except as expressly provided in the
425+License, You are granted no right, title or license to, or interest in,
426+any Trademarks. Whether or not You and Original Contributor enter into
427+the Trademark License, You agree not to (i) challenge Original
428+Contributor's ownership or use of Trademarks; (ii) attempt to register
429+any Trademarks, or any mark or logo substantially similar thereto; or
430+(iii) incorporate any Trademarks into Your own trademarks, product
431+names, service marks, company names, or domain names.
432+
433+8.2 Integration.
434+
435+This License represents the complete agreement concerning the subject
436+matter hereof.
437+
438+8.3 Assignment.
439+
440+Original Contributor may assign this License, and its rights and
441+obligations hereunder, in its sole discretion. You may assign the
442+Research Use portions of this License and the TCK license to a third
443+party upon prior written notice to Original Contributor (which may be
444+provided electronically via the Community Web-Server). You may not
445+assign the Commercial Use and Trademark license, the Add-On Technology
446+License, or the Add-On Technology Source Code Porting License, including
447+by way of merger (regardless of whether You are the surviving entity) or
448+acquisition, without Original Contributor's prior written consent.
449+
450+8.4 Severability.
451+
452+If any provision of this License is held to be unenforceable, such
453+provision shall be reformed only to the extent necessary to make it
454+enforceable. Notwithstanding the foregoing, if You are prohibited by law
455+from fully and specifically complying with Sections 2.2 or 3, this
456+License will immediately terminate and You must immediately discontinue
457+any use of Covered Code.
458+
459+8.5 Governing Law.
460+
461+This License shall be governed by the laws of the United States and the
462+State of Washington, as applied to contracts entered into and to be
463+performed in Washington between Washington residents. The application of
464+the United Nations Convention on Contracts for the International Sale of
465+Goods is expressly excluded. You agree that the state and federal courts
466+located in Seattle, Washington have exclusive jurisdiction over any
467+claim relating to the License, including contract and tort claims.
468+
469+8.6 Dispute Resolution.
470+
471+a) Arbitration. Any dispute arising out of or relating to this License
472+shall be finally settled by arbitration as set out herein, except that
473+either party may bring any action, in a court of competent jurisdiction
474+(which jurisdiction shall be exclusive), with respect to any dispute
475+relating to such party's Intellectual Property Rights or with respect to
476+Your compliance with the TCK license. Arbitration shall be administered:
477+(i) by the American Arbitration Association (AAA), (ii) in accordance
478+with the rules of the United Nations Commission on International Trade
479+Law (UNCITRAL) (the "Rules") in effect at the time of arbitration as
480+modified herein; and (iii) the arbitrator will apply the substantive
481+laws of Washington and the United States. Judgment upon the award
482+rendered by the arbitrator may be entered in any court having
483+jurisdiction to enforce such award.
484+
485+b) Arbitration language, venue and damages. All arbitration proceedings
486+shall be conducted in English by a single arbitrator selected in
487+accordance with the Rules, who must be fluent in English and be either a
488+retired judge or practicing attorney having at least ten (10) years
489+litigation experience and be reasonably familiar with the technology
490+matters relative to the dispute. Unless otherwise agreed, arbitration
491+venue shall be in Seattle, Washington. The arbitrator may award monetary
492+damages only and nothing shall preclude either party from seeking
493+provisional or emergency relief from a court of competent jurisdiction.
494+The arbitrator shall have no authority to award damages in excess of
495+those permitted in this License and any such award in excess is void.
496+All awards will be payable in U.S. dollars and may include, for the
497+prevailing party (i) pre-judgment award interest, (ii) reasonable
498+attorneys' fees incurred in connection with the arbitration, and (iii)
499+reasonable costs and expenses incurred in enforcing the award. The
500+arbitrator will order each party to produce identified documents and
501+respond to no more than twenty-five single question interrogatories.
502+
503+8.7 Construction.
504+
505+Any law or regulation, which provides that the language of a contract
506+shall be construed against the drafter, shall not apply to this License.
507+
508+8.8 U.S. Government End Users.
509+
510+The Covered Code is a "commercial item," as that term is defined in 48
511+C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software"
512+and "commercial computer software documentation," as such terms are used
513+in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and
514+48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government
515+End Users acquire Covered Code with only those rights set forth herein.
516+You agree to pass this notice to our licensees.
517+
518+8.9 Marketing Activities.
519+
520+Licensee hereby grants Original Contributor a non-exclusive,
521+non-transferable, limited license to use the Licensee's company name and
522+logo ("Licensee Marks") in any presentations, press releases, or
523+marketing materials solely for the purpose of identifying Licensee as a
524+member of the Helix Community. Licensee shall provide samples of
525+Licensee Marks to Original Contributor upon request by Original
526+Contributor. Original Contributor acknowledges that the Licensee Marks
527+are the trademarks of Licensee. Original Contributor shall not use the
528+Licensee Marks in a way that may imply that Original Contributor is an
529+agency or branch of Licensee. Original Contributor understands and
530+agrees that the use of any Licensee Marks in connection with this
531+Agreement shall not create any right, title or interest, in, or to the
532+Licensee Marks or any Licensee trademarks and that all such use and
533+goodwill associated with any such trademarks will inure to the benefit
534+of Licensee. Further the Original Contributor will stop usage of the
535+Licensee Marks upon Licensee's request.
536+
537+8.10 Press Announcements.
538+
539+You may make press announcements or other public statements regarding
540+this License without the prior written consent of the Original
541+Contributor, if Your statement is limited to announcing the licensing of
542+the Covered Code or the availability of Your Product and its
543+compatibility with the Covered Code. All other public announcements
544+regarding this license require the prior written consent of the Original
545+Contributor. Consent requests are welcome at press@helixcommunity.org.
546+
547+8.11 International Use.
548+
549+a) Export/Import laws. Covered Code is subject to U.S. export control
550+laws and may be subject to export or import regulations in other
551+countries. Each party agrees to comply strictly with all such laws and
552+regulations and acknowledges their responsibility to obtain such
553+licenses to export, re-export, or import as may be required. You agree
554+to pass these obligations to Your licensees.
555+
556+b) Intellectual Property Protection. Due to limited intellectual
557+property protection and enforcement in certain countries, You agree not
558+to redistribute the Original Code, Upgraded Code, TCK and Specifications
559+to any country on the list of restricted countries on the Community Web
560+Server.
561+
562+8.12 Language.
563+
564+This License is in the English language only, which language shall be
565+controlling in all respects, and all versions of this License in any
566+other language shall be for accommodation only and shall not be binding
567+on the parties to this License. All communications and notices made or
568+given pursuant to this License, and all documentation and support to be
569+provided, unless otherwise noted, shall be in the English language.
570+
571+PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE
572+"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND
573+CONDITIONS OF THIS LICENSE WITH REALNETWORKS, INC. IF YOU ARE AGREEING
574+TO THIS LICENSE ON BEHALF OF A COMPANY, YOU REPRESENT THAT YOU ARE
575+AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. WHETHER YOU ARE ACTING
576+ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, YOU MUST BE OF MAJORITY
577+AGE AND BE OTHERWISE COMPETENT TO ENTER INTO CONTRACTS. IF YOU DO NOT
578+MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY OF THE TERMS AND
579+CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON TO EXIT.
580+
581+
582+ GLOSSARY
583+
584+1. *"Added Value"* means code which:
585+
586+(i) has a principal purpose which is substantially different from that
587+of the stand-alone Technology;
588+
589+(ii) represents a significant functional and value enhancement to the
590+Technology;
591+
592+(iii) operates in conjunction with the Technology; and
593+
594+(iv) is not marketed as a technology which replaces or substitutes for
595+the Technology
596+
597+2. "*Applicable Patent Rights*" mean: (a) in the case where Original
598+Contributor is the grantor of rights, claims of patents that (i) are now
599+or hereafter acquired, owned by or assigned to Original Contributor and
600+(ii) are necessarily infringed by using or making the Original Code or
601+Upgraded Code, including Modifications provided by Original Contributor,
602+alone and not in combination with other software or hardware; and (b) in
603+the case where Licensee is the grantor of rights, claims of patents that
604+(i) are now or hereafter acquired, owned by or assigned to Licensee and
605+(ii) are infringed (directly or indirectly) by using or making
606+Licensee's Modifications or Error Corrections, taken alone or in
607+combination with Covered Code.
608+
609+3. "*Application Programming Interfaces (APIs)"* means the interfaces,
610+associated header files, service provider interfaces, and protocols that
611+enable a device, application, Operating System, or other program to
612+obtain services from or make requests of (or provide services in
613+response to requests from) other programs, and to use, benefit from, or
614+rely on the resources, facilities, and capabilities of the relevant
615+programs using the APIs. APIs includes the technical documentation
616+describing the APIs, the Source Code constituting the API, and any
617+Header Files used with the APIs.
618+
619+4. "*Commercial Use*" means any use (internal or external), copying,
620+sublicensing or distribution (internal or external), directly or
621+indirectly of Covered Code by You other than Your Research Use of
622+Covered Code within Your business or organization or in conjunction with
623+other Licensees with equivalent Research Use rights. Commercial Use
624+includes any use of the Covered Code for direct or indirect commercial
625+or strategic gain, advantage or other business purpose. Any Commercial
626+Use requires execution of Attachment D by You and Original Contributor.
627+
628+5. "*Community Code*" means the Original Code, Upgraded Code, Error
629+Corrections, Shared Modifications, or any combination thereof.
630+
631+6. "*Community Webserver(s)"* means the webservers designated by
632+Original Contributor for access to the Original Code, Upgraded Code, TCK
633+and Specifications and for posting Error Corrections and Shared
634+Modifications.
635+
636+7. "*Compliant Covered Code*" means Covered Code that complies with the
637+requirements of the TCK.
638+
639+8. "*Contributor*" means each Licensee that creates or contributes to
640+the creation of any Error Correction or Shared Modification.
641+
642+9. "*Covered Code*" means the Original Code, Upgraded Code,
643+Modifications, or any combination thereof.
644+
645+10. "*Error Correction*" means any change made to Community Code which
646+conforms to the Specification and corrects the adverse effect of a
647+failure of Community Code to perform any function set forth in or
648+required by the Specifications.
649+
650+11. "*Executable*" means Covered Code that has been converted from
651+Source Code to the preferred form for execution by a computer or digital
652+processor (e.g. binary form).
653+
654+12. "*Extension(s)"* means any additional Interfaces developed by or for
655+You which: (i) are designed for use with the Technology; (ii) constitute
656+an API for a library of computing functions or services; and (iii) are
657+disclosed or otherwise made available to third party software developers
658+for the purpose of developing software which invokes such additional
659+Interfaces. The foregoing shall not apply to software developed by Your
660+subcontractors to be exclusively used by You.
661+
662+13. "*Header File(s)"* means that portion of the Source Code that
663+provides the names and types of member functions, data members, class
664+definitions, and interface definitions necessary to implement the APIs
665+for the Covered Code. Header Files include, files specifically
666+designated by Original Contributor as Header Files. Header Files do not
667+include the code necessary to implement the functionality underlying the
668+Interface.
669+
670+14. *"Helix DNA Server Technology"* means the program(s) that implement
671+the Helix Universal Server streaming engine for the Technology as
672+defined in the Specification.
673+
674+15. *"Helix DNA Client Technology"* means the Covered Code that
675+implements the RealOne Player engine as defined in the Specification.
676+
677+16. *"Helix DNA Producer Technology"* means the Covered Code that
678+implements the Helix Producer engine as defined in the Specification.
679+
680+17. *"Helix DNA Technology"* means the Helix DNA Server Technology, the
681+Helix DNA Client Technology, the Helix DNA Producer Technology and other
682+Helix technologies designated by Original Contributor.
683+
684+18. "*Intellectual Property Rights*" means worldwide statutory and
685+common law rights associated solely with (i) Applicable Patent Rights;
686+(ii) works of authorship including copyrights, copyright applications,
687+copyright registrations and "moral rights"; (iii) the protection of
688+trade and industrial secrets and confidential information; and (iv)
689+divisions, continuations, renewals, and re-issuances of the foregoing
690+now existing or acquired in the future.
691+
692+19. *"Interface*" means interfaces, functions, properties, class
693+definitions, APIs, Header Files, GUIDs, V-Tables, and/or protocols
694+allowing one piece of software, firmware or hardware to communicate or
695+interoperate with another piece of software, firmware or hardware.
696+
697+20. "*Internal Deployment Use*" means use of Compliant Covered Code
698+(excluding Research Use) within Your business or organization only by
699+Your employees and/or agents on behalf of Your business or organization,
700+but not to provide services, including content distribution, to third
701+parties, subject to execution of Attachment D by You and Original
702+Contributor, if required.
703+
704+21. "*Licensee*" means any party that has entered into and has in effect
705+a version of this License with Original Contributor.
706+
707+22. "*MIME type*" means a description of what type of media or other
708+content is in a file, including by way of example but not limited to
709+'audio/x-pn-realaudio-plugin.'
710+
711+23. "*Modification(s)"* means (i) any addition to, deletion from and/or
712+change to the substance and/or structure of the Covered Code, including
713+Interfaces; (ii) the combination of any Covered Code and any previous
714+Modifications; (iii) any new file or other representation of computer
715+program statements that contains any portion of Covered Code; and/or
716+(iv) any new Source Code implementing any portion of the Specifications.
717+
718+24. "*MP3 Patents*" means any patents necessary to make, use or sell
719+technology implementing any portion of the specification developed by
720+the Moving Picture Experts Group known as MPEG-1 Audio Layer-3 or MP3,
721+including but not limited to all past and future versions, profiles,
722+extensions, parts and amendments relating to the MP3 specification.
723+
724+25. "*MPEG-4 Patents*" means any patents necessary to make, use or sell
725+technology implementing any portion of the specification developed by
726+the Moving Pictures Experts Group known as MPEG-4, including but not
727+limited to all past and future versions, profiles, extensions, parts and
728+amendments relating to the MPEG-4 specification.
729+
730+26. "*Original Code*" means the initial Source Code for the Technology
731+as described on the Community Web Server.
732+
733+27. "*Original Contributor*" means RealNetworks, Inc., its affiliates
734+and its successors and assigns.
735+
736+28. "*Original Contributor MIME Type*" means the MIME registry, browser
737+preferences, or local file/protocol associations invoking any Helix DNA
738+Client-based application, including the RealOne Player, for playback of
739+RealAudio, RealVideo, other RealMedia MIME types or datatypes (e.g.,
740+.ram, .rnx, .rpm, .ra, .rm, .rp, .rt, .rf, .prx, .mpe, .rmp, .rmj, .rav,
741+.rjs, .rmx, .rjt, .rms), and any other Original Contributor-specific or
742+proprietary MIME types that Original Contributor may introduce in the
743+future.
744+
745+29. "*Personal Use*" means use of Covered Code by an individual solely
746+for his or her personal, private and non-commercial purposes. An
747+individual's use of Covered Code in his or her capacity as an officer,
748+employee, member, independent contractor or agent of a corporation,
749+business or organization (commercial or non-commercial) does not qualify
750+as Personal Use.
751+
752+30. "*RealMedia File Format*" means the file format designed and
753+developed by RealNetworks for storing multimedia data and used to store
754+RealAudio and RealVideo encoded streams. Valid RealMedia File Format
755+extensions include: .rm, .rmj, .rmc, .rmvb, .rms.
756+
757+31. "*RCSL Webpage*" means the RealNetworks Community Source License
758+webpage located at https://www.helixcommunity.org/content/rcsl or such
759+other URL that Original Contributor may designate from time to time.
760+
761+32. "*Reformatted Specifications*" means any revision to the
762+Specifications which translates or reformats the Specifications (as for
763+example in connection with Your documentation) but which does not alter,
764+subset or superset * *the functional or operational aspects of the
765+Specifications.
766+
767+33. "*Research Use*" means use and distribution of Covered Code only for
768+Your Personal Use, research or development use and expressly excludes
769+Internal Deployment Use and Commercial Use. Research Use also includes
770+use of Covered Code to teach individuals how to use Covered Code.
771+
772+34. "*Shared Modifications*" means Modifications that You distribute or
773+use for a Commercial Use, in addition to any Modifications provided by
774+You, at Your option, pursuant to Section 2.2, or received by You from a
775+Contributor pursuant to Section 2.3.
776+
777+35. "*Source Code*" means the preferred form of the Covered Code for
778+making modifications to it, including all modules it contains, plus any
779+associated interface definition files, scripts used to control
780+compilation and installation of an Executable, or source code
781+differential comparisons against either the Original Code or another
782+well known, available Covered Code of the Contributor's choice. The
783+Source Code can be in a compressed or archival form, provided the
784+appropriate decompression or de-archiving software is widely available
785+for no charge.
786+
787+36. "*Specifications*" means the specifications for the Technology and
788+other documentation, as designated on the Community Web Server, as may
789+be revised by Original Contributor from time to time.
790+
791+37. "*Trademarks*" means Original Contributor's trademarks and logos,
792+including, but not limited to, RealNetworks, RealAudio, RealVideo,
793+RealOne, RealSystem, SureStream, Helix, Helix DNA and other trademarks
794+whether now used or adopted in the future.
795+
796+38. "*Technology*" means the technology described in Attachment B, and
797+Upgrades.
798+
799+39. "*Technology Compatibility Kit"* or *"TCK*" means the test programs,
800+procedures, acceptance criteria and/or other requirements, designated by
801+Original Contributor for use in verifying compliance of Covered Code
802+with the Specifications, in conjunction with the Original Code and
803+Upgraded Code. Original Contributor may, in its sole discretion and from
804+time to time, revise a TCK to correct errors and/or omissions and in
805+connection with Upgrades.
806+
807+40. "*Upgrade(s)"* means new versions of Technology designated
808+exclusively by Original Contributor as an "Upgrade" and released by
809+Original Contributor from time to time under the terms of the License.
810+
811+41. "*Upgraded Code*" means the Source Code and/or Executables for
812+Upgrades, possibly including Modifications made by Contributors.
813+
814+42. *"User's Guide"* means the users guide for the TCK which Original
815+Contributor makes available to You to provide direction in how to run
816+the TCK and properly interpret the results, as may be revised by
817+Original Contributor from time to time.
818+
819+43. "*You(r)*" means an individual, or a legal entity acting by and
820+through an individual or individuals, exercising rights either under
821+this License or under a future version of this License issued pursuant
822+to Section 4.1. For legal entities, "You(r)" includes any entity that by
823+majority voting interest controls, is controlled by, or is under common
824+control with You.
825+
826+44. "*Your Products*" means any (i) hardware products You distribute
827+integrating the Covered Code; (ii) any software products You distribute
828+with the Covered Code that utilize the APIs of the Covered Code; or
829+(iii) any services You provide using the Covered Code.
830+
831+
832+ ATTACHMENT A
833+
834+REQUIRED NOTICES
835+
836+
837+ ATTACHMENT A-1
838+
839+REQUIRED IN ALL CASES
840+
841+Notice to be included in header file of all Error Corrections and Shared
842+Modifications:
843+
844+Portions Copyright 1994-2003 © RealNetworks, Inc. All rights reserved.
845+
846+The contents of this file, and the files included with this file, are
847+subject to the current version of RealNetworks Community Source License
848+Version 1.1 (the "License"). You may not use this file except in
849+compliance with the License executed by both You and RealNetworks. You
850+may obtain a copy of the License at *
851+https://www.helixcommunity.org/content/rcsl.* You may also obtain a copy
852+of the License by contacting RealNetworks directly. Please see the
853+License for the rights, obligations and limitations governing use of the
854+contents of the file.
855+
856+This file is part of the Helix DNA technology. RealNetworks, Inc., is
857+the developer of the Original code and owns the copyrights in the
858+portions it created.
859+
860+This file, and the files included with this file, are distributed on an
861+'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
862+AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
863+LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
864+PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
865+
866+Contributor(s):
867+
868+_______________________________________________
869+
870+Technology Compatibility Kit Test Suite(s) Location:
871+
872+________________________________
873+
874+
875+ ATTACHMENT A-2
876+
877+SAMPLE LICENSEE CERTIFICATION
878+
879+"By clicking the `Agree' button below, You certify that You are a
880+Licensee in good standing under the RealNetworks Community Source
881+License, ("License") and that Your access, use and distribution of code
882+and information You may obtain at this site is subject to the License.
883+If You are not a Licensee under the RealNetworks Community Source
884+License You agree not to download, copy or use the Helix DNA technology.
885+
886+
887+ ATTACHMENT A-3
888+
889+REQUIRED STUDENT NOTIFICATION
890+
891+"This software and related documentation has been obtained by Your
892+educational institution subject to the RealNetworks Community Source
893+License. You have been provided access to the software and related
894+documentation for use only in connection with your course work and
895+research activities as a matriculated student of Your educational
896+institution. Any other use is expressly prohibited.
897+
898+THIS SOFTWARE AND RELATED DOCUMENTATION CONTAINS PROPRIETARY MATERIAL OF
899+REALNETWORKS, INC, WHICH ARE PROTECTED BY VARIOUS INTELLECTUAL PROPERTY
900+RIGHTS.
901+
902+You may not use this file except in compliance with the License. You may
903+obtain a copy of the License on the web at
904+https://www.helixcommunity.org/content/rcsl.
905+
906+*
907+*
908+
909+
910+ ATTACHMENT B
911+
912+Description of Technology
913+
914+Helix DNA, which consists of Helix DNA Client, Helix DNA Server and
915+Helix DNA Producer.
916+
917+Description of "Technology"
918+
919+Helix DNA Technology v1.0 as described on the Community Web Server.
920+
921+
922+ ATTACHMENT C
923+
924+TECHNOLOGY COMPATIBILITY KIT LICENSE
925+
926+The following license is effective for the *Helix DNA* Technology
927+Compatibility Kit - as described on the Community Web Server. The
928+Technology Compatibility Kit(s) for the Technology specified in
929+Attachment B may be accessed at the Community Web Server.
930+
931+1. TCK License.
932+
933+1.1 Grants to use TCK
934+
935+Subject to the terms and restrictions set forth below and the
936+RealNetworks Community Source License, and the Research Use license,
937+Original Contributor grants to You a worldwide, non-exclusive,
938+non-transferable license, to the extent of Original Contributor's
939+Intellectual Property Rights in the TCK (without the right to
940+sublicense), to use the TCK to develop and test Covered Code.
941+
942+1.2 TCK Use Restrictions.
943+
944+You are not authorized to create derivative works of the TCK or use the
945+TCK to test any implementation of the Specification that is not Covered
946+Code. You may not publish Your test results or make claims of
947+comparative compatibility with respect to other implementations of the
948+Specification. In consideration for the license grant in Section 1.1
949+above You agree not to develop Your own tests that are intended to
950+validate conformation with the Specification.
951+
952+2. Test Results.
953+
954+You agree to provide to Original Contributor or the third party test
955+facility if applicable, Your test results that demonstrate that Covered
956+Code is Compliant Covered Code and that Original Contributor may publish
957+or otherwise distribute such test results.
958+
959+PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE
960+"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND
961+CONDITIONS OF THIS LICENSE WITH THE ORIGINAL CONTRIBUTOR, REALNETWORKS,
962+INC. IF YOU ARE AGREEING TO THIS LICENSE ON BEHALF OF A COMPANY, YOU
963+REPRESENT THAT YOU ARE AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE.
964+WHETHER YOU ARE ACTING ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY,
965+YOU MUST BE OF MAJORITY AGE AND BE OTHERWISE COMPETENT TO ENTER INTO
966+CONTRACTS. IF YOU DO NOT MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY
967+OF THE TERMS AND CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON
968+TO EXIT.
969+
970+*ACCEPT / REJECT
971+*
972+
973+*
974+*
975+
976+*To agree to the R&D/academic terms of this license, please register
977+<https://www.helixcommunity.org/2002/intro/why-register> on the site --
978+you will then be given a chance to agree to the clickwrap RCSL
979+<https://reguseronly.helixcommunity.org/2002/clickwrap/rcsl-clickwrap>
980+R&D License
981+<https://reguseronly.helixcommunity.org/2002/clickwrap/rcsl-clickwrap>
982+and gain access to the RCSL-licensed source code. To build or deploy
983+commercial applications based on the RCSL, you will need to agree to the
984+Commercial Use license attachments
985+<https://www.helixcommunity.org/content/rcsl-attachments>*
986+
987+
988+
989Index: helix-libs/clientapps/clutter/RPSL.txt
990===================================================================
991--- /dev/null 1970-01-01 00:00:00.000000000 +0000
992+++ helix-libs/clientapps/clutter/RPSL.txt 2008-10-13 06:05:49.000000000 -0700
993@@ -0,0 +1,518 @@
994+RealNetworks Public Source License Version 1.0
995+(Rev. Date October 28, 2002)
996+
997+1. General Definitions. This License applies to any program or other work which
998+RealNetworks, Inc., or any other entity that elects to use this license,
999+("Licensor") makes publicly available and which contains a notice placed by
1000+Licensor identifying such program or work as "Original Code" and stating that it
1001+is subject to the terms of this RealNetworks Public Source License version 1.0
1002+(or subsequent version thereof) ("License"). You are not required to accept this
1003+License. However, nothing else grants You permission to use, copy, modify or
1004+distribute the software or its derivative works. These actions are prohibited by
1005+law if You do not accept this License. Therefore, by modifying, copying or
1006+distributing the software (or any work based on the software), You indicate your
1007+acceptance of this License to do so, and all its terms and conditions. In
1008+addition, you agree to the terms of this License by clicking the Accept button
1009+or downloading the software. As used in this License:
1010+
1011+1.1 "Applicable Patent Rights" mean: (a) in the case where Licensor is the
1012+grantor of rights, claims of patents that (i) are now or hereafter acquired,
1013+owned by or assigned to Licensor and (ii) are necessarily infringed by using or
1014+making the Original Code alone and not in combination with other software or
1015+hardware; and (b) in the case where You are the grantor of rights, claims of
1016+patents that (i) are now or hereafter acquired, owned by or assigned to You and
1017+(ii) are infringed (directly or indirectly) by using or making Your
1018+Modifications, taken alone or in combination with Original Code.
1019+
1020+1.2 "Compatible Source License" means any one of the licenses listed on Exhibit
1021+B or at https://www.helixcommunity.org/content/complicense or other licenses
1022+specifically identified by Licensor in writing. Notwithstanding any term to the
1023+contrary in any Compatible Source License, any code covered by any Compatible
1024+Source License that is used with Covered Code must be made readily available in
1025+Source Code format for royalty-free use under the terms of the Compatible Source
1026+License or this License.
1027+
1028+1.3 "Contributor" means any person or entity that creates or contributes to the
1029+creation of Modifications.
1030+
1031+1.4 "Covered Code" means the Original Code, Modifications, the combination of
1032+Original Code and any Modifications, and/or any respective portions thereof.
1033+
1034+1.5 "Deploy" means to use, sublicense or distribute Covered Code other than for
1035+Your internal research and development (R&D) and/or Personal Use, and includes
1036+without limitation, any and all internal use or distribution of Covered Code
1037+within Your business or organization except for R&D use and/or Personal Use, as
1038+well as direct or indirect sublicensing or distribution of Covered Code by You
1039+to any third party in any form or manner.
1040+
1041+1.6 "Derivative Work" means either the Covered Code or any derivative work under
1042+United States copyright law, and including any work containing or including any
1043+portion of the Covered Code or Modifications, either verbatim or with
1044+modifications and/or translated into another language. Derivative Work also
1045+includes any work which combines any portion of Covered Code or Modifications
1046+with code not otherwise governed by the terms of this License.
1047+
1048+1.7 "Externally Deploy" means to Deploy the Covered Code in any way that may be
1049+accessed or used by anyone other than You, used to provide any services to
1050+anyone other than You, or used in any way to deliver any content to anyone other
1051+than You, whether the Covered Code is distributed to those parties, made
1052+available as an application intended for use over a computer network, or used to
1053+provide services or otherwise deliver content to anyone other than You.
1054+
1055+1.8. "Interface" means interfaces, functions, properties, class definitions,
1056+APIs, header files, GUIDs, V-Tables, and/or protocols allowing one piece of
1057+software, firmware or hardware to communicate or interoperate with another piece
1058+of software, firmware or hardware.
1059+
1060+1.9 "Modifications" mean any addition to, deletion from, and/or change to, the
1061+substance and/or structure of the Original Code, any previous Modifications, the
1062+combination of Original Code and any previous Modifications, and/or any
1063+respective portions thereof. When code is released as a series of files, a
1064+Modification is: (a) any addition to or deletion from the contents of a file
1065+containing Covered Code; and/or (b) any new file or other representation of
1066+computer program statements that contains any part of Covered Code.
1067+
1068+1.10 "Original Code" means (a) the Source Code of a program or other work as
1069+originally made available by Licensor under this License, including the Source
1070+Code of any updates or upgrades to such programs or works made available by
1071+Licensor under this License, and that has been expressly identified by Licensor
1072+as such in the header file(s) of such work; and (b) the object code compiled
1073+from such Source Code and originally made available by Licensor under this
1074+License.
1075+
1076+1.11 "Personal Use" means use of Covered Code by an individual solely for his or
1077+her personal, private and non-commercial purposes. An individual's use of
1078+Covered Code in his or her capacity as an officer, employee, member, independent
1079+contractor or agent of a corporation, business or organization (commercial or
1080+non-commercial) does not qualify as Personal Use.
1081+
1082+1.12 "Source Code" means the human readable form of a program or other work that
1083+is suitable for making modifications to it, including all modules it contains,
1084+plus any associated interface definition files, scripts used to control
1085+compilation and installation of an executable (object code).
1086+
1087+1.13 "You" or "Your" means an individual or a legal entity exercising rights
1088+under this License. For legal entities, "You" or "Your" includes any entity
1089+which controls, is controlled by, or is under common control with, You, where
1090+"control" means (a) the power, direct or indirect, to cause the direction or
1091+management of such entity, whether by contract or otherwise, or (b) ownership of
1092+fifty percent (50%) or more of the outstanding shares or beneficial ownership of
1093+such entity.
1094+
1095+2. Permitted Uses; Conditions & Restrictions. Subject to the terms and
1096+conditions of this License, Licensor hereby grants You, effective on the date
1097+You accept this License (via downloading or using Covered Code or otherwise
1098+indicating your acceptance of this License), a worldwide, royalty-free,
1099+non-exclusive copyright license, to the extent of Licensor's copyrights cover
1100+the Original Code, to do the following:
1101+
1102+2.1 You may reproduce, display, perform, modify and Deploy Covered Code,
1103+provided that in each instance:
1104+
1105+(a) You must retain and reproduce in all copies of Original Code the copyright
1106+and other proprietary notices and disclaimers of Licensor as they appear in the
1107+Original Code, and keep intact all notices in the Original Code that refer to
1108+this License;
1109+
1110+(b) You must include a copy of this License with every copy of Source Code of
1111+Covered Code and documentation You distribute, and You may not offer or impose
1112+any terms on such Source Code that alter or restrict this License or the
1113+recipients' rights hereunder, except as permitted under Section 6;
1114+
1115+(c) You must duplicate, to the extent it does not already exist, the notice in
1116+Exhibit A in each file of the Source Code of all Your Modifications, and cause
1117+the modified files to carry prominent notices stating that You changed the files
1118+and the date of any change;
1119+
1120+(d) You must make Source Code of all Your Externally Deployed Modifications
1121+publicly available under the terms of this License, including the license grants
1122+set forth in Section 3 below, for as long as you Deploy the Covered Code or
1123+twelve (12) months from the date of initial Deployment, whichever is longer. You
1124+should preferably distribute the Source Code of Your Deployed Modifications
1125+electronically (e.g. download from a web site); and
1126+
1127+(e) if You Deploy Covered Code in object code, executable form only, You must
1128+include a prominent notice, in the code itself as well as in related
1129+documentation, stating that Source Code of the Covered Code is available under
1130+the terms of this License with information on how and where to obtain such
1131+Source Code. You must also include the Object Code Notice set forth in Exhibit A
1132+in the "about" box or other appropriate place where other copyright notices are
1133+placed, including any packaging materials.
1134+
1135+2.2 You expressly acknowledge and agree that although Licensor and each
1136+Contributor grants the licenses to their respective portions of the Covered Code
1137+set forth herein, no assurances are provided by Licensor or any Contributor that
1138+the Covered Code does not infringe the patent or other intellectual property
1139+rights of any other entity. Licensor and each Contributor disclaim any liability
1140+to You for claims brought by any other entity based on infringement of
1141+intellectual property rights or otherwise. As a condition to exercising the
1142+rights and licenses granted hereunder, You hereby assume sole responsibility to
1143+secure any other intellectual property rights needed, if any. For example, if a
1144+third party patent license is required to allow You to make, use, sell, import
1145+or offer for sale the Covered Code, it is Your responsibility to acquire such
1146+license(s).
1147+
1148+2.3 Subject to the terms and conditions of this License, Licensor hereby grants
1149+You, effective on the date You accept this License (via downloading or using
1150+Covered Code or otherwise indicating your acceptance of this License), a
1151+worldwide, royalty-free, perpetual, non-exclusive patent license under
1152+Licensor's Applicable Patent Rights to make, use, sell, offer for sale and
1153+import the Covered Code, provided that in each instance you comply with the
1154+terms of this License.
1155+
1156+3. Your Grants. In consideration of, and as a condition to, the licenses granted
1157+to You under this License:
1158+
1159+(a) You grant to Licensor and all third parties a non-exclusive, perpetual,
1160+irrevocable, royalty free license under Your Applicable Patent Rights and other
1161+intellectual property rights owned or controlled by You, to make, sell, offer
1162+for sale, use, import, reproduce, display, perform, modify, distribute and
1163+Deploy Your Modifications of the same scope and extent as Licensor's licenses
1164+under Sections 2.1 and 2.2; and
1165+
1166+(b) You grant to Licensor and its subsidiaries a non-exclusive, worldwide,
1167+royalty-free, perpetual and irrevocable license, under Your Applicable Patent
1168+Rights and other intellectual property rights owned or controlled by You, to
1169+make, use, sell, offer for sale, import, reproduce, display, perform,
1170+distribute, modify or have modified (for Licensor and/or its subsidiaries),
1171+sublicense and distribute Your Modifications, in any form and for any purpose,
1172+through multiple tiers of distribution.
1173+
1174+(c) You agree not use any information derived from Your use and review of the
1175+Covered Code, including but not limited to any algorithms or inventions that may
1176+be contained in the Covered Code, for the purpose of asserting any of Your
1177+patent rights, or assisting a third party to assert any of its patent rights,
1178+against Licensor or any Contributor.
1179+
1180+4. Derivative Works. You may create a Derivative Work by combining Covered Code
1181+with other code not otherwise governed by the terms of this License and
1182+distribute the Derivative Work as an integrated product. In each such instance,
1183+You must make sure the requirements of this License are fulfilled for the
1184+Covered Code or any portion thereof, including all Modifications.
1185+
1186+4.1 You must cause any Derivative Work that you distribute, publish or
1187+Externally Deploy, that in whole or in part contains or is derived from the
1188+Covered Code or any part thereof, to be licensed as a whole at no charge to all
1189+third parties under the terms of this License and no other license except as
1190+provided in Section 4.2. You also must make Source Code available for the
1191+Derivative Work under the same terms as Modifications, described in Sections 2
1192+and 3, above.
1193+
1194+4.2 Compatible Source Licenses. Software modules that have been independently
1195+developed without any use of Covered Code and which contain no portion of the
1196+Covered Code, Modifications or other Derivative Works, but are used or combined
1197+in any way wtih the Covered Code or any Derivative Work to form a larger
1198+Derivative Work, are exempt from the conditions described in Section 4.1 but
1199+only to the extent that: the software module, including any software that is
1200+linked to, integrated with, or part of the same applications as, the software
1201+module by any method must be wholly subject to one of the Compatible Source
1202+Licenses. Notwithstanding the foregoing, all Covered Code must be subject to the
1203+terms of this License. Thus, the entire Derivative Work must be licensed under a
1204+combination of the RPSL (for Covered Code) and a Compatible Source License for
1205+any independently developed software modules within the Derivative Work. The
1206+foregoing requirement applies even if the Compatible Source License would
1207+ordinarily allow the software module to link with, or form larger works with,
1208+other software that is not subject to the Compatible Source License. For
1209+example, although the Mozilla Public License v1.1 allows Mozilla code to be
1210+combined with proprietary software that is not subject to the MPL, if
1211+MPL-licensed code is used with Covered Code the MPL-licensed code could not be
1212+combined or linked with any code not governed by the MPL. The general intent of
1213+this section 4.2 is to enable use of Covered Code with applications that are
1214+wholly subject to an acceptable open source license. You are responsible for
1215+determining whether your use of software with Covered Code is allowed under Your
1216+license to such software.
1217+
1218+4.3 Mere aggregation of another work not based on the Covered Code with the
1219+Covered Code (or with a work based on the Covered Code) on a volume of a storage
1220+or distribution medium does not bring the other work under the scope of this
1221+License. If You deliver the Covered Code for combination and/or integration with
1222+an application previously provided by You (for example, via automatic updating
1223+technology), such combination and/or integration constitutes a Derivative Work
1224+subject to the terms of this License.
1225+
1226+5. Exclusions From License Grant. Nothing in this License shall be deemed to
1227+grant any rights to trademarks, copyrights, patents, trade secrets or any other
1228+intellectual property of Licensor or any Contributor except as expressly stated
1229+herein. No right is granted to the trademarks of Licensor or any Contributor
1230+even if such marks are included in the Covered Code. Nothing in this License
1231+shall be interpreted to prohibit Licensor from licensing under different terms
1232+from this License any code that Licensor otherwise would have a right to
1233+license. Modifications, Derivative Works and/or any use or combination of
1234+Covered Code with other technology provided by Licensor or third parties may
1235+require additional patent licenses from Licensor which Licensor may grant in its
1236+sole discretion. No patent license is granted separate from the Original Code or
1237+combinations of the Original Code with other software or hardware.
1238+
1239+5.1. Trademarks. This License does not grant any rights to use the trademarks or
1240+trade names owned by Licensor ("Licensor Marks" defined in Exhibit C) or to any
1241+trademark or trade name belonging to any Contributor. No Licensor Marks may be
1242+used to endorse or promote products derived from the Original Code other than as
1243+permitted by the Licensor Trademark Policy defined in Exhibit C.
1244+
1245+6. Additional Terms. You may choose to offer, and to charge a fee for, warranty,
1246+support, indemnity or liability obligations and/or other rights consistent with
1247+the scope of the license granted herein ("Additional Terms") to one or more
1248+recipients of Covered Code. However, You may do so only on Your own behalf and
1249+as Your sole responsibility, and not on behalf of Licensor or any Contributor.
1250+You must obtain the recipient's agreement that any such Additional Terms are
1251+offered by You alone, and You hereby agree to indemnify, defend and hold
1252+Licensor and every Contributor harmless for any liability incurred by or claims
1253+asserted against Licensor or such Contributor by reason of any such Additional
1254+Terms.
1255+
1256+7. Versions of the License. Licensor may publish revised and/or new versions of
1257+this License from time to time. Each version will be given a distinguishing
1258+version number. Once Original Code has been published under a particular version
1259+of this License, You may continue to use it under the terms of that version. You
1260+may also choose to use such Original Code under the terms of any subsequent
1261+version of this License published by Licensor. No one other than Licensor has
1262+the right to modify the terms applicable to Covered Code created under this
1263+License.
1264+
1265+8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part
1266+pre-release, untested, or not fully tested works. The Covered Code may contain
1267+errors that could cause failures or loss of data, and may be incomplete or
1268+contain inaccuracies. You expressly acknowledge and agree that use of the
1269+Covered Code, or any portion thereof, is at Your sole and entire risk. THE
1270+COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF
1271+ANY KIND AND LICENSOR AND LICENSOR'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS
1272+"LICENSOR" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY
1273+DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT
1274+NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF
1275+SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET
1276+ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. LICENSOR AND EACH
1277+CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE
1278+COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR
1279+REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR
1280+ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR
1281+WRITTEN DOCUMENTATION, INFORMATION OR ADVICE GIVEN BY LICENSOR, A LICENSOR
1282+AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You
1283+acknowledge that the Covered Code is not intended for use in high risk
1284+activities, including, but not limited to, the design, construction, operation
1285+or maintenance of nuclear facilities, aircraft navigation, aircraft
1286+communication systems, or air traffic control machines in which case the failure
1287+of the Covered Code could lead to death, personal injury, or severe physical or
1288+environmental damage. Licensor disclaims any express or implied warranty of
1289+fitness for such uses.
1290+
1291+9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT
1292+SHALL LICENSOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL,
1293+INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR
1294+YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER
1295+UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR STRICT
1296+LIABILITY), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF LICENSOR OR SUCH
1297+CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND
1298+NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME
1299+JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR
1300+CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event
1301+shall Licensor's total liability to You for all damages (other than as may be
1302+required by applicable law) under this License exceed the amount of ten dollars
1303+($10.00).
1304+
1305+10. Ownership. Subject to the licenses granted under this License, each
1306+Contributor retains all rights, title and interest in and to any Modifications
1307+made by such Contributor. Licensor retains all rights, title and interest in and
1308+to the Original Code and any Modifications made by or on behalf of Licensor
1309+("Licensor Modifications"), and such Licensor Modifications will not be
1310+automatically subject to this License. Licensor may, at its sole discretion,
1311+choose to license such Licensor Modifications under this License, or on
1312+different terms from those contained in this License or may choose not to
1313+license them at all.
1314+
1315+11. Termination.
1316+
1317+11.1 Term and Termination. The term of this License is perpetual unless
1318+terminated as provided below. This License and the rights granted hereunder will
1319+terminate:
1320+
1321+(a) automatically without notice from Licensor if You fail to comply with any
1322+term(s) of this License and fail to cure such breach within 30 days of becoming
1323+aware of such breach;
1324+
1325+(b) immediately in the event of the circumstances described in Section 12.5(b);
1326+or
1327+
1328+(c) automatically without notice from Licensor if You, at any time during the
1329+term of this License, commence an action for patent infringement against
1330+Licensor (including by cross-claim or counter claim in a lawsuit);
1331+
1332+(d) upon written notice from Licensor if You, at any time during the term of
1333+this License, commence an action for patent infringement against any third party
1334+alleging that the Covered Code itself (excluding combinations with other
1335+software or hardware) infringes any patent (including by cross-claim or counter
1336+claim in a lawsuit).
1337+
1338+11.2 Effect of Termination. Upon termination, You agree to immediately stop any
1339+further use, reproduction, modification, sublicensing and distribution of the
1340+Covered Code and to destroy all copies of the Covered Code that are in your
1341+possession or control. All sublicenses to the Covered Code which have been
1342+properly granted prior to termination shall survive any termination of this
1343+License. Provisions which, by their nature, should remain in effect beyond the
1344+termination of this License shall survive, including but not limited to Sections
1345+3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for
1346+compensation, indemnity or damages of any sort solely as a result of terminating
1347+this License in accordance with its terms, and termination of this License will
1348+be without prejudice to any other right or remedy of any party.
1349+
1350+12. Miscellaneous.
1351+
1352+12.1 Government End Users. The Covered Code is a "commercial item" as defined in
1353+FAR 2.101. Government software and technical data rights in the Covered Code
1354+include only those rights customarily provided to the public as defined in this
1355+License. This customary commercial license in technical data and software is
1356+provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer
1357+Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical
1358+Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software
1359+or Computer Software Documentation). Accordingly, all U.S. Government End Users
1360+acquire Covered Code with only those rights set forth herein.
1361+
1362+12.2 Relationship of Parties. This License will not be construed as creating an
1363+agency, partnership, joint venture or any other form of legal association
1364+between or among You, Licensor or any Contributor, and You will not represent to
1365+the contrary, whether expressly, by implication, appearance or otherwise.
1366+
1367+12.3 Independent Development. Nothing in this License will impair Licensor's
1368+right to acquire, license, develop, have others develop for it, market and/or
1369+distribute technology or products that perform the same or similar functions as,
1370+or otherwise compete with, Modifications, Derivative Works, technology or
1371+products that You may develop, produce, market or distribute.
1372+
1373+12.4 Waiver; Construction. Failure by Licensor or any Contributor to enforce any
1374+provision of this License will not be deemed a waiver of future enforcement of
1375+that or any other provision. Any law or regulation which provides that the
1376+language of a contract shall be construed against the drafter will not apply to
1377+this License.
1378+
1379+12.5 Severability. (a) If for any reason a court of competent jurisdiction finds
1380+any provision of this License, or portion thereof, to be unenforceable, that
1381+provision of the License will be enforced to the maximum extent permissible so
1382+as to effect the economic benefits and intent of the parties, and the remainder
1383+of this License will continue in full force and effect. (b) Notwithstanding the
1384+foregoing, if applicable law prohibits or restricts You from fully and/or
1385+specifically complying with Sections 2 and/or 3 or prevents the enforceability
1386+of either of those Sections, this License will immediately terminate and You
1387+must immediately discontinue any use of the Covered Code and destroy all copies
1388+of it that are in your possession or control.
1389+
1390+12.6 Dispute Resolution. Any litigation or other dispute resolution between You
1391+and Licensor relating to this License shall take place in the Seattle,
1392+Washington, and You and Licensor hereby consent to the personal jurisdiction of,
1393+and venue in, the state and federal courts within that District with respect to
1394+this License. The application of the United Nations Convention on Contracts for
1395+the International Sale of Goods is expressly excluded.
1396+
1397+12.7 Export/Import Laws. This software is subject to all export and import laws
1398+and restrictions and regulations of the country in which you receive the Covered
1399+Code and You are solely responsible for ensuring that You do not export,
1400+re-export or import the Covered Code or any direct product thereof in violation
1401+of any such restrictions, laws or regulations, or without all necessary
1402+authorizations.
1403+
1404+12.8 Entire Agreement; Governing Law. This License constitutes the entire
1405+agreement between the parties with respect to the subject matter hereof. This
1406+License shall be governed by the laws of the United States and the State of
1407+Washington.
1408+
1409+Where You are located in the province of Quebec, Canada, the following clause
1410+applies: The parties hereby confirm that they have requested that this License
1411+and all related documents be drafted in English. Les parties ont exig&eacute;
1412+que le pr&eacute;sent contrat et tous les documents connexes soient
1413+r&eacute;dig&eacute;s en anglais.
1414+
1415+ EXHIBIT A.
1416+
1417+"Copyright &copy; 1995-2002
1418+RealNetworks, Inc. and/or its licensors. All Rights Reserved.
1419+
1420+The contents of this file, and the files included with this file, are subject to
1421+the current version of the RealNetworks Public Source License Version 1.0 (the
1422+"RPSL") available at https://www.helixcommunity.org/content/rpsl unless you have
1423+licensed the file under the RealNetworks Community Source License Version 1.0
1424+(the "RCSL") available at https://www.helixcommunity.org/content/rcsl, in which
1425+case the RCSL will apply. You may also obtain the license terms directly from
1426+RealNetworks. You may not use this file except in compliance with the RPSL or,
1427+if you have a valid RCSL with RealNetworks applicable to this file, the RCSL.
1428+Please see the applicable RPSL or RCSL for the rights, obligations and
1429+limitations governing use of the contents of the file.
1430+
1431+This file is part of the Helix DNA Technology. RealNetworks is the developer of
1432+the Original code and owns the copyrights in the portions it created.
1433+
1434+This file, and the files included with this file, is distributed and made
1435+available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR
1436+IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING
1437+WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
1438+PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
1439+
1440+Contributor(s): ____________________________________
1441+
1442+Technology Compatibility Kit Test
1443+Suite(s) Location (if licensed under the RCSL): ______________________________
1444+
1445+Object Code Notice: Helix DNA Client technology included. Copyright (c)
1446+RealNetworks, Inc., 1995-2002. All rights reserved.
1447+
1448+
1449+ EXHIBIT B
1450+
1451+Compatible Source Licenses for the RealNetworks Public Source License. The
1452+following list applies to the most recent version of the license as of October
1453+25, 2002, unless otherwise indicated.
1454+
1455+* Academic Free License
1456+* Apache Software License
1457+* Apple Public Source License
1458+* Artistic license
1459+* Attribution Assurance Licenses
1460+* BSD license
1461+* Common Public License (1)
1462+* Eiffel Forum License
1463+* GNU General Public License (GPL) (1)
1464+* GNU Library or "Lesser" General Public License (LGPL) (1)
1465+* IBM Public License
1466+* Intel Open Source License
1467+* Jabber Open Source License
1468+* MIT license
1469+* MITRE Collaborative Virtual Workspace License (CVW License)
1470+* Motosoto License
1471+* Mozilla Public License 1.0 (MPL)
1472+* Mozilla Public License 1.1 (MPL)
1473+* Nokia Open Source License
1474+* Open Group Test Suite License
1475+* Python Software Foundation License
1476+* Ricoh Source Code Public License
1477+* Sun Industry Standards Source License (SISSL)
1478+* Sun Public License
1479+* University of Illinois/NCSA Open Source License
1480+* Vovida Software License v. 1.0
1481+* W3C License
1482+* X.Net License
1483+* Zope Public License
1484+* zlib/libpng license
1485+
1486+(1) Note: because this license contains certain reciprocal licensing terms that
1487+purport to extend to independently developed code, You may be prohibited under
1488+the terms of this otherwise compatible license from using code licensed under
1489+its terms with Covered Code because Covered Code may only be licensed under the
1490+RealNetworks Public Source License. Any attempt to apply non RPSL license terms,
1491+including without limitation the GPL, to Covered Code is expressly forbidden.
1492+You are responsible for ensuring that Your use of Compatible Source Licensed
1493+code does not violate either the RPSL or the Compatible Source License.
1494+
1495+The latest version of this list can be found at:
1496+https://www.helixcommunity.org/content/complicense
1497+
1498+ EXHIBIT C
1499+
1500+RealNetworks' Trademark policy.
1501+
1502+RealNetworks defines the following trademarks collectively as "Licensor
1503+Trademarks": "RealNetworks", "RealPlayer", "RealJukebox", "RealSystem",
1504+"RealAudio", "RealVideo", "RealOne Player", "RealMedia", "Helix" or any other
1505+trademarks or trade names belonging to RealNetworks.
1506+
1507+RealNetworks "Licensor Trademark Policy" forbids any use of Licensor Trademarks
1508+except as permitted by and in strict compliance at all times with RealNetworks'
1509+third party trademark usage guidelines which are posted at
1510+http://www.realnetworks.com/info/helixlogo.html.
1511+
1512Index: helix-libs/clientapps/clutter/Umakefil
1513===================================================================
1514--- /dev/null 1970-01-01 00:00:00.000000000 +0000
1515+++ helix-libs/clientapps/clutter/Umakefil 2008-10-13 06:05:49.000000000 -0700
1516@@ -0,0 +1,325 @@
1517+#
1518+# ***** BEGIN LICENSE BLOCK *****
1519+# Version: RCSL 1.0/RPSL 1.0
1520+#
1521+# Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
1522+#
1523+# The contents of this file, and the files included with this file, are
1524+# subject to the current version of the RealNetworks Public Source License
1525+# Version 1.0 (the "RPSL") available at
1526+# http://www.helixcommunity.org/content/rpsl unless you have licensed
1527+# the file under the RealNetworks Community Source License Version 1.0
1528+# (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
1529+# in which case the RCSL will apply. You may also obtain the license terms
1530+# directly from RealNetworks. You may not use this file except in
1531+# compliance with the RPSL or, if you have a valid RCSL with RealNetworks
1532+# applicable to this file, the RCSL. Please see the applicable RPSL or
1533+# RCSL for the rights, obligations and limitations governing use of the
1534+# contents of the file.
1535+#
1536+# This file is part of the Helix DNA Technology. RealNetworks is the
1537+# developer of the Original Code and owns the copyrights in the portions
1538+# it created.
1539+#
1540+# This file, and the files included with this file, is distributed and made
1541+# available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
1542+# EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
1543+# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
1544+# FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
1545+#
1546+# Technology Compatibility Kit Test Suite(s) Location:
1547+# http://www.helixcommunity.org/content/tck
1548+#
1549+# Contributor(s):
1550+#
1551+# ***** END LICENSE BLOCK *****
1552+#
1553+
1554+UmakefileVersion(2,2)
1555+
1556+project.AddModuleIncludes("common/include",
1557+ "common/runtime/pub",
1558+ "client/include",
1559+ "client/common/system/pub",
1560+ "client/common/container/pub",
1561+ "client/audiosvc/pub",
1562+ "common/container/pub",
1563+ "video/sitelib/pub",
1564+ "video/colconverter/pub",
1565+ "video/sitelib/pub/platform/unix",
1566+ "video/sitelib",
1567+ "datatype/rm/include",
1568+ "client/core")
1569+
1570+project.AddSources("player.cpp",
1571+ "excontxt.cpp",
1572+ "exsite.cpp",
1573+ "exroot.cpp",
1574+ "exadvsnk.cpp",
1575+ "exerror.cpp",
1576+ "iids.cpp",
1577+ "exstateadvsnk.cpp",
1578+ "excallback.cpp",
1579+ "print.cpp")
1580+
1581+project.AddModuleLibraries(
1582+ "common/runtime[runtlib]",
1583+ "common/system[syslib]",
1584+ "common/container[contlib]",
1585+ "common/runtime[runtlib]",
1586+ "client/common/system[sysclntlib]",
1587+ "common/dbgtool[debuglib]",
1588+ "common/util[utillib]",
1589+ "video/sitelib[sitelib]",
1590+ "video/sitelib[sitecreatelib]",
1591+ "common/log/logutil[logutillib]",
1592+ "video/vidutil[vidutillib]"
1593+ )
1594+project.AddSystemLibraries('Xv', 'Xext')
1595+
1596+if project.IsDefined("HELIX_FEATURE_PREFERENCES"):
1597+ project.AddSources("preflist.cpp")
1598+
1599+if project.IsDefined("HELIX_FEATURE_AUTHENTICATION"):
1600+ project.AddSources("exaumgr.cpp")
1601+
1602+if project.IsDefined("HELIX_FEATURE_VIDEO"):
1603+ project.AddSources("exsitsup.cpp",
1604+ "fivemmap.cpp")
1605+ project.AddModuleIncludes('video/include')
1606+ if project.IsDefined("HELIX_FEATURE_PNG"):
1607+ project.AddModuleIncludes('datatype/image/png/common/pub')
1608+ project.AddModuleLibraries("common/import/zlib[zlib]",
1609+ "datatype/image/png/import/libpng[libpng]",
1610+ "datatype/image/png/common[pngcomlib]")
1611+
1612+if project.IsDefined("HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS"):
1613+ project.AddSources("exprdnld.cpp")
1614+
1615+if project.BuildOption("nodll"):
1616+ ## Client core
1617+ static_plugin_list = ["clntcore"]
1618+ project.AddModuleLibraries("common/runtime[runtlib]",
1619+ "common/fileio[fileiolib]",
1620+ "client/common/system[sysclntlib]",
1621+ "client/common/container[contclntlib]",
1622+ "client/core[clntcorelib]")
1623+ if not project.IsDefined("HELIX_FEATURE_LOGLEVEL_NONE"):
1624+ project.AddModuleLibraries("common/log/logutil[logutillib]")
1625+ if not project.IsDefined("HELIX_CONFIG_MINIMIZE_SIZE"):
1626+ project.AddModuleLibraries("client/common/util[utlclntlib]")
1627+ ## Client core libraries
1628+ if project.IsDefined("HELIX_FEATURE_AUDIO"):
1629+ project.AddModuleLibraries("audio/device[auddevlib]",
1630+ "client/audiosvc[audsvclib]")
1631+ if ('HELIX_FEATURE_VOLUME' in project.defines):
1632+ project.AddModuleLibraries("audio/gaintool[audgainlib]" )
1633+ if ('HELIX_FEATURE_VOLUME' in project.defines):
1634+ project.AddModuleLibraries("audio/crossfade[audxfadelib]")
1635+ if project.IsDefined("HELIX_FEATURE_MIXER"):
1636+ project.AddModuleLibraries("audio/mixer[audmixlib]")
1637+ if project.IsDefined("HELIX_FEATURE_RESAMPLER"):
1638+ project.AddModuleLibraries("audio/resampler[audresamplib]")
1639+ if project.IsDefined("HELIX_FEATURE_LIMITER"):
1640+ project.AddModuleLibraries("audio/limiter[audlimiter]")
1641+
1642+ if project.IsDefined("HELIX_FEATURE_VIDEO"):
1643+ project.AddModuleLibraries("client/videosvc[vidsvclib]",
1644+ "protocol/sdp[sdplib]")
1645+ if project.IsDefined("HELIX_FEATURE_PLAYBACK_NET"):
1646+ project.AddModuleLibraries("client/netwksvc[netsvclib]",
1647+ "common/netio[netiolib]",
1648+ "client/common/netio[netioclntlib]",
1649+ "protocol/transport/common/system[systranlib]",
1650+ "protocol/transport/rtp[rtptranlib]",
1651+ "protocol/common/util[protutillib]",
1652+ "protocol/rtsp[rtsplib]")
1653+ if project.IsDefined("HELIX_FEATURE_RDT"):
1654+ project.AddLibraries(GetSDKPath("prtclrdt_lib"))
1655+ project.AddModuleLibraries("protocol/transport/rdt[rdttranlib]")
1656+ if project.IsDefined("HELIX_FEATURE_PNA"):
1657+ project.AddLibraries(GetSDKPath("prtclpna_lib"))
1658+ if project.IsDefined("HELIX_FEATURE_XMLPARSER"):
1659+ project.AddModuleLibraries("common/lang/xml[xmllib]")
1660+ ## Add RAM file format and renderer
1661+ if project.IsDefined("HELIX_FEATURE_META"):
1662+ static_plugin_list[-1:-1] = ["ramfformat", "ramrender"]
1663+ project.AddModuleLibraries("datatype/ram/renderer[ramrendrlib]")
1664+ ## Add local file system
1665+ if project.IsDefined("HELIX_FEATURE_PLAYBACK_LOCAL"):
1666+ static_plugin_list[-1:-1] = ["smplfsys"]
1667+ project.AddModuleLibraries("common/fileio[fileiolib]")
1668+ ## Add http file system
1669+ if project.IsDefined("HELIX_FEATURE_PLAYBACK_NET"):
1670+ static_plugin_list[-1:-1] = ["hxsdp", "httpfsys"]
1671+ project.AddModuleLibraries("protocol/http[httplib]",
1672+ "protocol/common/util[protutillib]",
1673+ "protocol/sdp[sdplib]",
1674+ "filesystem/data[datafsys]",
1675+ "common/fileio[fileiolib]",
1676+ "common/import/zlib[zlib]")
1677+ ## Add realmedia file format
1678+ if project.IsDefined("HELIX_FEATURE_PLAYBACK_LOCAL") and \
1679+ (project.IsDefined("HELIX_FEATURE_AUDIO_REAL") or \
1680+ project.IsDefined("HELIX_FEATURE_VIDEO_REAL")):
1681+ static_plugin_list[-1:-1] = ["rmfformat"]
1682+ project.AddModuleLibraries("datatype/common/util[dtutillib]",
1683+ "datatype/common/container[dtcomcontlib]")
1684+ project.AddLibraries(GetSDKPath("rmcom_lib"),
1685+ GetSDKPath("rmacom_lib"),
1686+ GetSDKPath("rmff_lib"),
1687+ GetSDKPath("rmvidpyld_lib"))
1688+
1689+ ## Add realmedia renderer
1690+ if project.IsDefined("HELIX_FEATURE_AUDIO_REAL"):
1691+ static_plugin_list[-1:-1] = ["rarender"]
1692+ project.AddModuleLibraries("datatype/rm/audio/payload[rapayld]")
1693+ project.AddLibraries(GetSDKPath("rmarend_lib"),
1694+ GetSDKPath("rmacom_lib"))
1695+ ## Add mp3 file format and renderer
1696+ if project.IsDefined("HELIX_FEATURE_AUDIO_MPA_LAYER3") or \
1697+ project.IsDefined("HELIX_FEATURE_AUDIO_MPA_LAYER2") or \
1698+ project.IsDefined("HELIX_FEATURE_AUDIO_MPA_LAYER1"):
1699+ static_plugin_list[-1:-1] = ["mp3render"]
1700+ project.AddModuleLibraries("datatype/mp3/codec/fltpt[mp3codecfltpt]",
1701+ "datatype/mp3/common[mp3lib]",
1702+ "datatype/mp3/payload[mp3payld]",
1703+ "datatype/common/util[dtutillib]")
1704+ if project.IsDefined("HELIX_FEATURE_PLAYBACK_LOCAL"):
1705+ static_plugin_list[-1:-1] = ["mp3fformat"]
1706+ project.AddModuleLibraries("datatype/mp3/common[mp3lib]")
1707+ ## Add gecko realmedia codec
1708+ if project.IsDefined("HELIX_FEATURE_AUDIO_CODEC_GECKO"):
1709+ static_plugin_list[-1:-1] = ["cook"]
1710+ if not project.IsDefined("HELIX_CONFIG_FIXEDPOINT"):
1711+ project.AddLibraries(GetSDKPath("ra8lbrdec_flt_lib"))
1712+ else:
1713+ project.AddLibraries(GetSDKPath("ra8lbrdec_fix_lib"))
1714+ project.AddModuleLibraries("datatype/rm/audio/codec/common[racompat]")
1715+ ## Add RAAC codec
1716+ if project.IsDefined("HELIX_FEATURE_AUDIO_CODEC_RAAC"):
1717+ static_plugin_list[-1:-1] = ["raac"]
1718+ project.AddModuleLibraries("datatype/mp4/common[mp4comlib]",
1719+ "datatype/aac/codec/fixpt/decoder/hxwrap[aacdeclib]")
1720+ ## Add sipro realmedia codec
1721+ ## (Right now this only works for floating-point platforms)
1722+ if project.IsDefined("HELIX_FEATURE_AUDIO_CODEC_SIPRO"):
1723+ static_plugin_list[-1:-1] = ["sipr"]
1724+ project.AddLibraries(GetSDKPath("sipro_flt_backend_lib"))
1725+ ## Add tokyo realmedia codec
1726+ if project.IsDefined("HELIX_FEATURE_AUDIO_CODEC_TOKYO"):
1727+ static_plugin_list[-1:-1] = ["atrc"]
1728+ project.AddLibraries(GetSDKPath("ra8hbr_lib"))
1729+ ##
1730+ if project.IsDefined("HELIX_FEATURE_VIDEO"):
1731+ static_plugin_list[-1:-1] = ["vidsite"]
1732+ static_plugin_list[-1:-1] = ["hxltcolor"]
1733+ project.AddModuleLibraries("datatype/common/vidrend[vidrend]",
1734+ "video/sitelib[sitelib]",
1735+ "video/site[vidsite]",
1736+ "video/colconverter[hxltcolor]",
1737+ "datatype/rm/common[rmcomlib]",
1738+ "video/vidutil[vidutillib]")
1739+
1740+ if (project.IsDefined('HELIX_FEATURE_ALTERNATE_SITE_CREATE_LIB')):
1741+ project.AddLibraries(GetSDKPath("sitecreate_lib"))
1742+ else:
1743+ project.AddModuleLibraries('video/sitelib[sitecreatelib]')
1744+
1745+ ## Add realvideo renderer
1746+ if project.IsDefined("HELIX_FEATURE_VIDEO_REAL"):
1747+ project.AddModuleLibraries("datatype/rm/video/renderer[rvxrendlib]")
1748+ project.AddLibraries(GetSDKPath("rmvidcom_lib"),
1749+ GetSDKPath("rmvidpyld_lib"),
1750+ GetSDKPath("rvcodcom_lib"))
1751+ project.AddModuleLibraries("datatype/common/util[dtutillib]")
1752+ static_plugin_list[-1:-1] = ["rvrender"]
1753+
1754+ ## Add mpeg4 file format
1755+ if project.IsDefined("HELIX_FEATURE_PLAYBACK_LOCAL")and \
1756+ (project.IsDefined("HELIX_FEATURE_VIDEO_H263") or \
1757+ project.IsDefined("HELIX_FEATURE_VIDEO_MPEG4") or \
1758+ project.IsDefined("HELIX_FEATURE_AUDIO_MPEG4")):
1759+ static_plugin_list[-1:-1] = ["mp4fformat"]
1760+ project.AddModuleLibraries("datatype/common/util[dtutillib]",
1761+ "datatype/common/audrend",
1762+ "datatype/mp4/common[mp4comlib]",
1763+ "datatype/mp4/payload[mp4pyldlib]",
1764+ "datatype/mp4/fileformat[mp4fformatlib]")
1765+ if not project.IsDefined("HELIX_FEATURE_MP4_FILEFORMAT_M4A_ONLY"):
1766+ project.AddModuleLibraries("protocol/sdp[sdplib]",
1767+ "protocol/rtsp[rtsplib]",
1768+ "protocol/common/util[protutillib]",
1769+ "datatype/rm/common[rmcomlib]",
1770+ "datatype/amr/common[amrcomlib]")
1771+ ## Add h.263 renderer
1772+ if project.IsDefined("HELIX_FEATURE_VIDEO_H263"):
1773+ project.AddModuleLibraries("datatype/h263/payload[h263pyldlib]")
1774+ static_plugin_list[-1:-1] = ["h263render"]
1775+ ## Add MPEG4 renderer
1776+# if project.IsDefined("HELIX_FEATURE_VIDEO_MPEG4"):
1777+# static_plugin_list[-1:-1] = ["mp4xrender"]
1778+ ## Add mpeg 4 audio renderer
1779+ if project.IsDefined("HELIX_FEATURE_AUDIO_MPEG4"):
1780+ static_plugin_list[-1:-1] = ["mp4arender"]
1781+ project.AddModuleLibraries("datatype/mp4/audio/renderer[mp4arenderlib]")
1782+ if not project.IsDefined("HELIX_FEATURE_MP4_FILEFORMAT_M4A_ONLY"):
1783+ project.AddModuleLibraries("datatype/amr/common[amrcomlib]")
1784+ ## Add RV10 codec
1785+ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV10"):
1786+ project.AddLibraries(GetSDKPath("rv1dec_libs")+"[rv10lib]",
1787+ GetSDKPath("rv1dec_libs")+"[drv1lib]")
1788+ static_plugin_list[-1:-1] = ["rv10", "drv1"]
1789+ ## Add RV20 codec
1790+ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV20"):
1791+ project.AddLibraries(GetSDKPath("rvg2dec_libs")+"[rv20lib]",
1792+ GetSDKPath("rvg2dec_libs")+"[drv2lib]")
1793+ static_plugin_list[-1:-1] = ["rv20", "drv2"]
1794+
1795+ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV30") or \
1796+ project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV40"):
1797+ static_plugin_list[-1:-1] = ["drvc"]
1798+ if project.IsDefined("HELIX_FEATURE_ANSIC_RV89COMBO"):
1799+ project.AddLibraries(GetSDKPath("rv89combo_c_libs")+"[drvc]")
1800+ else:
1801+ project.AddLibraries(GetSDKPath("rv89combo_libs")+"[drvclib]")
1802+
1803+ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV30"):
1804+ static_plugin_list[-1:-1] = ["rv30"]
1805+ project.AddLibraries(GetSDKPath("rv89combo_libs")+"[rv3xlib]")
1806+ project.AddModuleLibraries("datatype/rm/video/codec/rv89combo[rv30]")
1807+
1808+ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV40"):
1809+ static_plugin_list[-1:-1] = ["rv40"]
1810+ project.AddLibraries(GetSDKPath("rv89combo_libs")+"[rv4xlib]")
1811+ project.AddModuleLibraries("datatype/rm/video/codec/rv89combo[rv40]")
1812+
1813+# if project.IsDefined("HELIX_FEATURE_AUDIO_CODEC_AAC"):
1814+# static_plugin_list[-1:-1] = ["aac4"]
1815+
1816+ CreateStaticPluginTable(static_plugin_list)
1817+
1818+project.ExportFunction("init_main", "void")
1819+project.ExportFunction("deinit_main", "void")
1820+project.ExportFunction("get_player", "void **ppPlayer",
1821+ "on_buffering_cb_t on_buffering_cb",
1822+ "on_pos_length_cb_t on_pos_length_cb")
1823+project.ExportFunction("player_openurl", "void *pPlayerHandle",
1824+ "char *pszRawURL")
1825+project.ExportFunction("put_player", "void *pPlayerHandle")
1826+project.ExportFunction("player_geturl", "void *pPlayerHandle", "char **pszURL")
1827+project.ExportFunction("player_begin", "void *pPlayerHandle")
1828+project.ExportFunction("player_stop", "void *pPlayerHandle")
1829+project.ExportFunction("player_pause", "void *pPlayerHandle")
1830+project.ExportFunction("player_seek", "void *pPlayerHandle", "int pos")
1831+project.ExportFunction("get_curr_playtime", "void *pPlayerHandle")
1832+project.ExportFunction("player_getvolume", "void *pPlayerHandle")
1833+project.ExportFunction("player_canseek", "void *pPlayerHandle")
1834+project.ExportFunction("player_setvolume", "void *pPlayerHandle", "unsigned short volumn")
1835+
1836+
1837+
1838+DLLTarget('libhelix-player')
1839+
1840+DependTarget()
1841+
1842Index: helix-libs/clientapps/clutter/exabd.cpp
1843===================================================================
1844--- /dev/null 1970-01-01 00:00:00.000000000 +0000
1845+++ helix-libs/clientapps/clutter/exabd.cpp 2008-10-13 06:05:49.000000000 -0700
1846@@ -0,0 +1,245 @@
1847+/* ***** BEGIN LICENSE BLOCK *****
1848+ * Version: RCSL 1.0/RPSL 1.0
1849+ *
1850+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
1851+ *
1852+ * The contents of this file, and the files included with this file, are
1853+ * subject to the current version of the RealNetworks Public Source License
1854+ * Version 1.0 (the "RPSL") available at
1855+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
1856+ * the file under the RealNetworks Community Source License Version 1.0
1857+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
1858+ * in which case the RCSL will apply. You may also obtain the license terms
1859+ * directly from RealNetworks. You may not use this file except in
1860+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
1861+ * applicable to this file, the RCSL. Please see the applicable RPSL or
1862+ * RCSL for the rights, obligations and limitations governing use of the
1863+ * contents of the file.
1864+ *
1865+ * This file is part of the Helix DNA Technology. RealNetworks is the
1866+ * developer of the Original Code and owns the copyrights in the portions
1867+ * it created.
1868+ *
1869+ * This file, and the files included with this file, is distributed and made
1870+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
1871+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
1872+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
1873+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
1874+ *
1875+ * Technology Compatibility Kit Test Suite(s) Location:
1876+ * http://www.helixcommunity.org/content/tck
1877+ *
1878+ * Contributor(s):
1879+ *
1880+ * ***** END LICENSE BLOCK ***** */
1881+
1882+#include <stdio.h>
1883+
1884+#include "hxtypes.h"
1885+
1886+#include "hxcom.h"
1887+#include "hxcomm.h"
1888+#include "hxmon.h"
1889+#include "hxcore.h"
1890+#include "hxengin.h"
1891+#include "chxpckts.h"
1892+#include "hxclsnk.h"
1893+#include "hxstrutl.h"
1894+#include "exabd.h"
1895+
1896+#include "print.h"
1897+
1898+#include "globals.h"
1899+
1900+struct _stGlobals*& GetGlobal(); //in main.cpp
1901+
1902+ExampleABD::ExampleABD(IUnknown* pUnknown)
1903+ : m_lRefCount (0)
1904+ , m_pUnknown (NULL)
1905+ , m_ulABDStartTime(0)
1906+ , m_ulABDResult(0)
1907+ , m_bABDDone(FALSE)
1908+{
1909+ if (pUnknown)
1910+ {
1911+ m_pUnknown = pUnknown;
1912+ m_pUnknown->AddRef();
1913+ }
1914+}
1915+
1916+ExampleABD::~ExampleABD(void)
1917+{
1918+ HX_RELEASE(m_pUnknown);
1919+}
1920+
1921+
1922+// *** IUnknown methods ***
1923+
1924+/////////////////////////////////////////////////////////////////////////
1925+// Method:
1926+// IUnknown::QueryInterface
1927+// Purpose:
1928+// Implement this to export the interfaces supported by your
1929+// object.
1930+//
1931+STDMETHODIMP ExampleABD::QueryInterface(REFIID riid, void** ppvObj)
1932+{
1933+ if (IsEqualIID(riid, IID_IUnknown))
1934+ {
1935+ AddRef();
1936+ *ppvObj = (IUnknown*)(IHXAutoBWCalibrationAdviseSink*)this;
1937+ return HXR_OK;
1938+ }
1939+ else if (IsEqualIID(riid, IID_IHXAutoBWCalibrationAdviseSink))
1940+ {
1941+ AddRef();
1942+ *ppvObj = (IHXAutoBWCalibrationAdviseSink*)this;
1943+ return HXR_OK;
1944+ }
1945+
1946+ *ppvObj = NULL;
1947+ return HXR_NOINTERFACE;
1948+}
1949+
1950+/////////////////////////////////////////////////////////////////////////
1951+// Method:
1952+// IUnknown::AddRef
1953+// Purpose:
1954+// Everyone usually implements this the same... feel free to use
1955+// this implementation.
1956+//
1957+STDMETHODIMP_(ULONG32) ExampleABD::AddRef()
1958+{
1959+ return InterlockedIncrement(&m_lRefCount);
1960+}
1961+
1962+/////////////////////////////////////////////////////////////////////////
1963+// Method:
1964+// IUnknown::Release
1965+// Purpose:
1966+// Everyone usually implements this the same... feel free to use
1967+// this implementation.
1968+//
1969+STDMETHODIMP_(ULONG32) ExampleABD::Release()
1970+{
1971+ if (InterlockedDecrement(&m_lRefCount) > 0)
1972+ {
1973+ return m_lRefCount;
1974+ }
1975+
1976+ delete this;
1977+ return 0;
1978+}
1979+
1980+/*
1981+ * IHXAutoBWCalibrationAdviseSink methods
1982+ */
1983+STDMETHODIMP
1984+ExampleABD::AutoBWCalibrationStarted (const char* pszServer)
1985+{
1986+ if (pszServer)
1987+ {
1988+ STDOUT("ABD: contacting %s\n", pszServer);
1989+ }
1990+
1991+ return HXR_OK;
1992+}
1993+
1994+STDMETHODIMP
1995+ExampleABD::AutoBWCalibrationDone(HX_RESULT status,
1996+ UINT32 ulBW)
1997+{
1998+ m_bABDDone = TRUE;
1999+
2000+ if (HXR_OK == status)
2001+ {
2002+ m_ulABDResult = ulBW;
2003+ STDOUT("ABD: %lu(Kbps) %lu(ms)\n", ulBW, GetTickCount() - m_ulABDStartTime);
2004+ }
2005+ else
2006+ {
2007+ STDOUT("ABD failed: %lu\n", status);
2008+ }
2009+
2010+ return HXR_OK;
2011+}
2012+
2013+HX_RESULT
2014+ExampleABD::DoABD(const char* pszServer,
2015+ UINT32 mode,
2016+ UINT32 packetSize,
2017+ UINT32 packetNum)
2018+{
2019+ HX_RESULT rc = HXR_OK;
2020+ UINT32 length = 0;
2021+ IHXAutoBWCalibration* pABD = NULL;
2022+ IHXValues* pValues = NULL;
2023+ IHXBuffer* pBuffer = NULL;
2024+
2025+ m_ulABDStartTime = GetTickCount();
2026+ m_ulABDResult = 0;
2027+ m_bABDDone = FALSE;
2028+
2029+ if (m_pUnknown &&
2030+ HXR_OK == m_pUnknown->QueryInterface(IID_IHXAutoBWCalibration, (void**)&pABD))
2031+ {
2032+ pValues = (IHXValues*) new CHXHeader();
2033+ pValues->AddRef();
2034+
2035+ pBuffer = (IHXBuffer*) new CHXBuffer();
2036+ pBuffer->AddRef();
2037+
2038+ pBuffer->Set((UCHAR*)pszServer, strlen(pszServer)+1);
2039+ pValues->SetPropertyCString("ABDServers", pBuffer);
2040+
2041+ pValues->SetPropertyULONG32("AutoBWDetectionMode", mode);
2042+ pValues->SetPropertyULONG32("AutoBWDetectionPacketSize", packetSize);
2043+ pValues->SetPropertyULONG32("AutoBWDetectionPackets", packetNum);
2044+
2045+ pABD->AddAutoBWCalibrationSink((IHXAutoBWCalibrationAdviseSink*)this);
2046+ pABD->InitAutoBWCalibration(pValues);
2047+
2048+ pABD->StartAutoBWCalibration();
2049+
2050+ while (!m_bABDDone)
2051+ {
2052+ MSG msg;
2053+ DWORD starttime, endtime, i;
2054+ BOOL sleep = TRUE;
2055+ static const int checkinterval = 10;
2056+
2057+ starttime = GetTickCount();
2058+ endtime = starttime + (20);
2059+ i = 0;
2060+ while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
2061+ {
2062+ DispatchMessage(&msg);
2063+ if ((i % checkinterval) == 0)
2064+ {
2065+ if (GetTickCount() > endtime)
2066+ break;
2067+ ++i;
2068+ }
2069+ sleep = FALSE;
2070+ }
2071+
2072+ if (sleep)
2073+ Sleep(10);
2074+ }
2075+ }
2076+
2077+cleanup:
2078+
2079+ if (pABD)
2080+ {
2081+ pABD->RemoveAutoBWCalibrationSink((IHXAutoBWCalibrationAdviseSink*)this);
2082+ }
2083+
2084+ HX_RELEASE(pBuffer);
2085+ HX_RELEASE(pValues);
2086+ HX_RELEASE(pABD);
2087+
2088+ return rc;
2089+}
2090+
2091+
2092Index: helix-libs/clientapps/clutter/exabd.h
2093===================================================================
2094--- /dev/null 1970-01-01 00:00:00.000000000 +0000
2095+++ helix-libs/clientapps/clutter/exabd.h 2008-10-13 06:05:49.000000000 -0700
2096@@ -0,0 +1,85 @@
2097+/* ***** BEGIN LICENSE BLOCK *****
2098+ * Version: RCSL 1.0/RPSL 1.0
2099+ *
2100+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
2101+ *
2102+ * The contents of this file, and the files included with this file, are
2103+ * subject to the current version of the RealNetworks Public Source License
2104+ * Version 1.0 (the "RPSL") available at
2105+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
2106+ * the file under the RealNetworks Community Source License Version 1.0
2107+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
2108+ * in which case the RCSL will apply. You may also obtain the license terms
2109+ * directly from RealNetworks. You may not use this file except in
2110+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
2111+ * applicable to this file, the RCSL. Please see the applicable RPSL or
2112+ * RCSL for the rights, obligations and limitations governing use of the
2113+ * contents of the file.
2114+ *
2115+ * This file is part of the Helix DNA Technology. RealNetworks is the
2116+ * developer of the Original Code and owns the copyrights in the portions
2117+ * it created.
2118+ *
2119+ * This file, and the files included with this file, is distributed and made
2120+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
2121+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
2122+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
2123+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
2124+ *
2125+ * Technology Compatibility Kit Test Suite(s) Location:
2126+ * http://www.helixcommunity.org/content/tck
2127+ *
2128+ * Contributor(s):
2129+ *
2130+ * ***** END LICENSE BLOCK ***** */
2131+
2132+#ifndef _EXAMPLEABD_
2133+#define _EXAMPLEABD_
2134+
2135+struct IHXAutoBWCalibrationAdviseSink;
2136+struct IUnknown;
2137+
2138+class ExampleABD : public IHXAutoBWCalibrationAdviseSink
2139+{
2140+ private:
2141+ LONG32 m_lRefCount;
2142+ IUnknown* m_pUnknown;
2143+ UINT32 m_ulABDStartTime;
2144+ UINT32 m_ulABDResult;
2145+ BOOL m_bABDDone;
2146+
2147+ ~ExampleABD();
2148+
2149+ public:
2150+
2151+ ExampleABD(IUnknown* /*IN*/ pUnknown);
2152+
2153+ /*
2154+ * IUnknown methods
2155+ */
2156+ STDMETHOD(QueryInterface) (THIS_
2157+ REFIID riid,
2158+ void** ppvObj);
2159+
2160+ STDMETHOD_(ULONG32,AddRef) (THIS);
2161+
2162+ STDMETHOD_(ULONG32,Release) (THIS);
2163+
2164+ /*
2165+ * IHXAutoBWCalibrationAdviseSink methods
2166+ */
2167+ STDMETHOD(AutoBWCalibrationStarted) (THIS_
2168+ const char* pszServer);
2169+ STDMETHOD(AutoBWCalibrationDone) (THIS_
2170+ HX_RESULT status,
2171+ UINT32 ulBW);
2172+
2173+ HX_RESULT DoABD(const char* pszServer,
2174+ UINT32 mode,
2175+ UINT32 packetSize,
2176+ UINT32 packetNum);
2177+
2178+ UINT32 GetABD(void) { return m_ulABDResult; };
2179+};
2180+
2181+#endif /* _EXAMPLEABDSNK_ */
2182Index: helix-libs/clientapps/clutter/exadvsnk.cpp
2183===================================================================
2184--- /dev/null 1970-01-01 00:00:00.000000000 +0000
2185+++ helix-libs/clientapps/clutter/exadvsnk.cpp 2008-10-13 06:05:49.000000000 -0700
2186@@ -0,0 +1,1116 @@
2187+/* ***** BEGIN LICENSE BLOCK *****
2188+ * Version: RCSL 1.0/RPSL 1.0
2189+ *
2190+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
2191+ *
2192+ * The contents of this file, and the files included with this file, are
2193+ * subject to the current version of the RealNetworks Public Source License
2194+ * Version 1.0 (the "RPSL") available at
2195+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
2196+ * the file under the RealNetworks Community Source License Version 1.0
2197+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
2198+ * in which case the RCSL will apply. You may also obtain the license terms
2199+ * directly from RealNetworks. You may not use this file except in
2200+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
2201+ * applicable to this file, the RCSL. Please see the applicable RPSL or
2202+ * RCSL for the rights, obligations and limitations governing use of the
2203+ * contents of the file.
2204+ *
2205+ * This file is part of the Helix DNA Technology. RealNetworks is the
2206+ * developer of the Original Code and owns the copyrights in the portions
2207+ * it created.
2208+ *
2209+ * This file, and the files included with this file, is distributed and made
2210+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
2211+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
2212+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
2213+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
2214+ *
2215+ * Technology Compatibility Kit Test Suite(s) Location:
2216+ * http://www.helixcommunity.org/content/tck
2217+ *
2218+ * Contributor(s):
2219+ *
2220+ * ***** END LICENSE BLOCK ***** */
2221+
2222+#include <stdio.h>
2223+
2224+#include "hxtypes.h"
2225+
2226+#include "hxcom.h"
2227+#include "hxcomm.h"
2228+#include "hxmon.h"
2229+#include "hxcore.h"
2230+#include "hxengin.h"
2231+#include "hxclsnk.h"
2232+#include "hxgroup.h"
2233+#include "hxstrutl.h"
2234+#include "exadvsnk.h"
2235+#include "hxstring.h"
2236+#include "hxprefs.h"
2237+#include "excontxt.h"
2238+
2239+#include "print.h"
2240+
2241+#include "globals.h"
2242+#include "player.h"
2243+
2244+struct _stGlobals*& GetGlobal(); //in main.cpp
2245+
2246+#ifdef __TCS__
2247+extern unsigned long gStreamTime;
2248+
2249+static int iOpened = 0;
2250+
2251+
2252+#if defined(__cplusplus)
2253+extern "C" {
2254+#endif /* defined(__cplusplus) */
2255+
2256+typedef enum hookBuffering {
2257+ eContacting = 0,
2258+ eConnecting = 1,
2259+ eBuffering = 2,
2260+ ePlaying = 3
2261+}hookBuffering;
2262+
2263+void hookRealAudio_Buffering(hookBuffering connectState, int pct);
2264+
2265+void hookRealAudio_PlayPosition(unsigned long current,unsigned long duration);
2266+
2267+typedef enum hookState {
2268+ ePlay = 0,
2269+ ePause = 1,
2270+ eStop = 2,
2271+ eResume = 3,
2272+ eComplete // Clip is done playing
2273+}hookState;
2274+void hookRealAudio_State(hookState newState);
2275+
2276+
2277+#if defined(__cplusplus)
2278+}
2279+#endif /* defined(__cplusplus) */
2280+
2281+#endif // __TCS__
2282+
2283+void PrintBuffer(const char* pszName,const unsigned char* pbBuf, unsigned int dwBytes);
2284+
2285+ExampleClientAdviceSink::ExampleClientAdviceSink(IUnknown* pUnknown, LONG32 lClientIndex, on_buffering_cb_t on_buffering_cb, on_pos_length_cb_t on_pos_length_cb, void *context)
2286+ : m_lRefCount (0)
2287+ , m_lClientIndex (lClientIndex)
2288+ , m_pUnknown (NULL)
2289+ , m_pRegistry (NULL)
2290+ , m_pScheduler (NULL)
2291+ , m_lCurrentBandwidth(0)
2292+ , m_lAverageBandwidth(0)
2293+ , m_bOnStop(0)
2294+ , m_pPlayer(0)
2295+ , m_bWaitForTrackStart(0)
2296+ , m_on_buffering_cb(on_buffering_cb)
2297+ , m_on_pos_length_cb(on_pos_length_cb)
2298+ , m_context(context)
2299+{
2300+ if (pUnknown)
2301+ {
2302+ m_pUnknown = pUnknown;
2303+ m_pUnknown->AddRef();
2304+
2305+ if (HXR_OK != m_pUnknown->QueryInterface(IID_IHXRegistry, (void**)&m_pRegistry))
2306+ {
2307+ m_pRegistry = NULL;
2308+ }
2309+
2310+ if (HXR_OK != m_pUnknown->QueryInterface(IID_IHXScheduler, (void**)&m_pScheduler))
2311+ {
2312+ m_pScheduler = NULL;
2313+ }
2314+
2315+ IHXPlayer* pPlayer;
2316+ if(HXR_OK == m_pUnknown->QueryInterface(IID_IHXPlayer,
2317+ (void**)&pPlayer))
2318+ {
2319+ m_pPlayer = pPlayer;
2320+
2321+ IHXGroupManager* pGroupMgr = NULL;
2322+ if(HXR_OK == m_pPlayer->QueryInterface(IID_IHXGroupManager,
2323+ (void**)&pGroupMgr))
2324+ {
2325+ pGroupMgr->AddSink((IHXGroupSink*)this);
2326+ pGroupMgr->Release();
2327+ }
2328+
2329+ pPlayer->AddAdviseSink(this);
2330+
2331+ }
2332+ }
2333+
2334+#ifdef __TCS__
2335+ bEnableAdviceSink = TRUE;
2336+ iOpened = 0;
2337+#endif
2338+}
2339+
2340+ExampleClientAdviceSink::~ExampleClientAdviceSink(void)
2341+{
2342+ if (m_pScheduler)
2343+ {
2344+ m_pScheduler->Release();
2345+ m_pScheduler = NULL;
2346+ }
2347+
2348+ if (m_pRegistry)
2349+ {
2350+ m_pRegistry->Release();
2351+ m_pRegistry = NULL;
2352+ }
2353+
2354+ if (m_pPlayer)
2355+ {
2356+ m_pPlayer->Release();
2357+ m_pPlayer = NULL;
2358+ }
2359+ if (m_pUnknown)
2360+ {
2361+ m_pUnknown->Release();
2362+ m_pUnknown = NULL;
2363+ }
2364+}
2365+
2366+
2367+// *** IUnknown methods ***
2368+
2369+/////////////////////////////////////////////////////////////////////////
2370+// Method:
2371+// IUnknown::QueryInterface
2372+// Purpose:
2373+// Implement this to export the interfaces supported by your
2374+// object.
2375+//
2376+STDMETHODIMP ExampleClientAdviceSink::QueryInterface(REFIID riid, void** ppvObj)
2377+{
2378+ if (IsEqualIID(riid, IID_IUnknown))
2379+ {
2380+ AddRef();
2381+ *ppvObj = (IUnknown*)(IHXClientAdviseSink*)this;
2382+ return HXR_OK;
2383+ }
2384+ else if (IsEqualIID(riid, IID_IHXClientAdviseSink))
2385+ {
2386+ AddRef();
2387+ *ppvObj = (IHXClientAdviseSink*)this;
2388+ return HXR_OK;
2389+ }
2390+ else if (IsEqualIID(riid, IID_IHXGroupSink))
2391+ {
2392+ AddRef();
2393+ *ppvObj = (IHXGroupSink*)this;
2394+ return HXR_OK;
2395+ }
2396+
2397+ *ppvObj = NULL;
2398+ return HXR_NOINTERFACE;
2399+}
2400+
2401+/////////////////////////////////////////////////////////////////////////
2402+// Method:
2403+// IUnknown::AddRef
2404+// Purpose:
2405+// Everyone usually implements this the same... feel free to use
2406+// this implementation.
2407+//
2408+STDMETHODIMP_(ULONG32) ExampleClientAdviceSink::AddRef()
2409+{
2410+ return InterlockedIncrement(&m_lRefCount);
2411+}
2412+
2413+/////////////////////////////////////////////////////////////////////////
2414+// Method:
2415+// IUnknown::Release
2416+// Purpose:
2417+// Everyone usually implements this the same... feel free to use
2418+// this implementation.
2419+//
2420+STDMETHODIMP_(ULONG32) ExampleClientAdviceSink::Release()
2421+{
2422+ if (InterlockedDecrement(&m_lRefCount) > 0)
2423+ {
2424+ return m_lRefCount;
2425+ }
2426+
2427+ delete this;
2428+ return 0;
2429+}
2430+
2431+/*
2432+ * IHXClientAdviseSink methods
2433+ */
2434+
2435+/************************************************************************
2436+ * Method:
2437+ * IHXClientAdviseSink::OnPosLength
2438+ * Purpose:
2439+ * Called to advise the client that the position or length of the
2440+ * current playback context has changed.
2441+ */
2442+
2443+#ifdef __TCS__
2444+static long lastPosition = -1;
2445+#endif
2446+
2447+STDMETHODIMP
2448+ExampleClientAdviceSink::OnPosLength(UINT32 ulPosition,
2449+ UINT32 ulLength)
2450+{
2451+ // Are we doing a multi-seek?
2452+ if (GetGlobal()->g_bMultiSeek)
2453+ {
2454+ // Have we run out of seek times?
2455+ if (GetGlobal()->g_ulMultiSeekIndex < GetGlobal()->g_ulNumMultiSeeks)
2456+ {
2457+ STDOUT("Multi-seeking the first player to %lu\n",
2458+ GetGlobal()->g_ulMultiSeekTime[GetGlobal()->g_ulMultiSeekIndex]);
2459+ GetGlobal()->g_Players[0]->Seek(GetGlobal()->g_ulMultiSeekTime[GetGlobal()->g_ulMultiSeekIndex++]);
2460+ }
2461+ else
2462+ {
2463+ // We've run out - stop the multi-seek
2464+ GetGlobal()->g_bMultiSeek = FALSE;
2465+ GetGlobal()->g_ulNumMultiSeeks = 0;
2466+ GetGlobal()->g_ulMultiSeekIndex = 0;
2467+ }
2468+ }
2469+
2470+ if (m_on_pos_length_cb)
2471+ m_on_pos_length_cb(ulPosition, ulLength, m_context);
2472+
2473+ return HXR_OK;
2474+}
2475+
2476+/************************************************************************
2477+ * Method:
2478+ * IHXClientAdviseSink::OnPresentationOpened
2479+ * Purpose:
2480+ * Called to advise the client a presentation has been opened.
2481+ */
2482+STDMETHODIMP ExampleClientAdviceSink::OnPresentationOpened()
2483+{
2484+#ifdef __TCS__
2485+ iOpened = 1;
2486+ lastPosition = -1;
2487+#else
2488+ if (GetGlobal()->bEnableAdviceSink)
2489+ {
2490+ STDOUT("OnPresentationOpened()\n");
2491+ }
2492+#if defined(HELIX_FEATURE_PLAYBACK_VELOCITY)
2493+ // Try to get the IHXPlaybackVelocity interface
2494+ // from the first player
2495+ if (GetGlobal()->g_nPlayers > 0 && GetGlobal()->g_Players[0])
2496+ {
2497+ IHXPlaybackVelocity* pVel = NULL;
2498+ HX_RESULT rv = GetGlobal()->g_Players[0]->QueryInterface(IID_IHXPlaybackVelocity, (void**) &pVel);
2499+ if (SUCCEEDED(rv))
2500+ {
2501+ // Get the capabilities object from the player
2502+ rv = pVel->QueryVelocityCaps(GetGlobal()->g_pVelocityCaps);
2503+ if (SUCCEEDED(rv) && GetGlobal()->bEnableAdviceSink)
2504+ {
2505+ STDOUT("Available Velocity Ranges:");
2506+ UINT32 ulNumRanges = GetGlobal()->g_pVelocityCaps->GetNumRanges();
2507+ for (UINT32 i = 0; i < ulNumRanges && SUCCEEDED(rv); i++)
2508+ {
2509+ INT32 lMin = 0;
2510+ INT32 lMax = 0;
2511+ rv = GetGlobal()->g_pVelocityCaps->GetRange(i, lMin, lMax);
2512+ if (SUCCEEDED(rv))
2513+ {
2514+ STDOUT(" [%ld,%ld]", lMin, lMax);
2515+ }
2516+ }
2517+ STDOUT("\n");
2518+ }
2519+ }
2520+ HX_RELEASE(pVel);
2521+ }
2522+#endif /* #if defined(HELIX_FEATURE_PLAYBACK_VELOCITY) */
2523+#endif
2524+
2525+ UINT32 sourceCount = m_pPlayer->GetSourceCount();
2526+ for (UINT32 sourceID = 0; sourceID < sourceCount; sourceID ++)
2527+ {
2528+ // get HXSource
2529+ IUnknown* pUnkSource = NULL;
2530+ IHXStreamSource* pStreamSrc = NULL;
2531+
2532+ if (HXR_OK != m_pPlayer->GetSource (sourceID, pUnkSource))
2533+ {
2534+ continue;
2535+ }
2536+
2537+ pUnkSource->QueryInterface(IID_IHXStreamSource, (void **)&pStreamSrc);
2538+
2539+ HX_RELEASE(pUnkSource);
2540+
2541+ if (!pStreamSrc)
2542+ {
2543+ continue;
2544+ }
2545+
2546+ UINT32 num_streams = pStreamSrc->GetStreamCount();
2547+
2548+ // get information from Streams
2549+ for (UINT32 streamID = 0; streamID < num_streams ; streamID++)
2550+ {
2551+ IUnknown* pUnkStream = NULL;
2552+
2553+ if (HXR_OK == pStreamSrc->GetStream(streamID, pUnkStream))
2554+ {
2555+ IHXStream* pStream = NULL;
2556+
2557+ if (HXR_OK == pUnkStream->QueryInterface(IID_IHXStream,
2558+ (void**)&pStream))
2559+ {
2560+ const char* pMimeType = pStream->GetStreamType();
2561+ if( 0 == strcmp(pMimeType, "application/ram"))
2562+ {
2563+ m_bWaitForTrackStart = TRUE;
2564+ }
2565+ else
2566+ {
2567+ m_bWaitForTrackStart = FALSE;
2568+ }
2569+ }
2570+ HX_RELEASE(pStream);
2571+ }
2572+ HX_RELEASE(pUnkStream);
2573+ if (!m_bWaitForTrackStart)
2574+ {
2575+ break;
2576+ }
2577+ }
2578+
2579+ if (!m_bWaitForTrackStart)
2580+ {
2581+ break;
2582+ }
2583+ HX_RELEASE(pStreamSrc);
2584+ }
2585+
2586+ if (!m_bWaitForTrackStart)
2587+ {
2588+ STDOUT("----------------clip info--------------------\n");
2589+ if(m_pScheduler) {
2590+ m_hCallback = m_pScheduler->RelativeEnter(this,50);
2591+ }
2592+ }
2593+ return HXR_OK;
2594+}
2595+
2596+
2597+/************************************************************************
2598+ * Method:
2599+ * IHXClientAdviseSink::OnPresentationClosed
2600+ * Purpose:
2601+ * Called to advise the client a presentation has been closed.
2602+ */
2603+STDMETHODIMP ExampleClientAdviceSink::OnPresentationClosed()
2604+{
2605+#ifdef __TCS__
2606+ iOpened = 0;
2607+ lastPosition = -1;
2608+#else
2609+ if (GetGlobal()->bEnableAdviceSink)
2610+ {
2611+ STDOUT("OnPresentationClosed()\n");
2612+ }
2613+#endif
2614+
2615+ return HXR_OK;
2616+}
2617+
2618+void ExampleClientAdviceSink::GetStatistics (char* pszRegistryKey)
2619+{
2620+ char szRegistryValue[MAX_DISPLAY_NAME] = {0}; /* Flawfinder: ignore */
2621+ INT32 lValue = 0;
2622+ INT32 i = 0;
2623+ INT32 lStatistics = 8;
2624+ UINT32 *plValue;
2625+
2626+#ifdef __TCS__
2627+ return; // DISABLED FOR NOW
2628+#endif
2629+
2630+ // collect statistic
2631+ for (i = 0; i < lStatistics; i++)
2632+ {
2633+ plValue = NULL;
2634+ switch (i)
2635+ {
2636+ case 0:
2637+ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.Normal", pszRegistryKey);
2638+ break;
2639+ case 1:
2640+ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.Recovered", pszRegistryKey);
2641+ break;
2642+ case 2:
2643+ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.Received", pszRegistryKey);
2644+ break;
2645+ case 3:
2646+ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.Lost", pszRegistryKey);
2647+ break;
2648+ case 4:
2649+ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.Late", pszRegistryKey);
2650+ break;
2651+ case 5:
2652+ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.ClipBandwidth", pszRegistryKey);
2653+ break;
2654+ case 6:
2655+ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.AverageBandwidth", pszRegistryKey);
2656+ plValue = &m_lAverageBandwidth;
2657+ break;
2658+ case 7:
2659+ SafeSprintf(szRegistryValue, MAX_DISPLAY_NAME, "%s.CurrentBandwidth", pszRegistryKey);
2660+ plValue = &m_lCurrentBandwidth;
2661+ break;
2662+ default:
2663+ break;
2664+ }
2665+
2666+ m_pRegistry->GetIntByName(szRegistryValue, lValue);
2667+ if (plValue)
2668+ {
2669+ if (m_bOnStop || lValue == 0)
2670+ {
2671+ lValue = *plValue;
2672+ }
2673+ else
2674+ {
2675+ *plValue = lValue;
2676+ }
2677+ }
2678+ if (GetGlobal()->bEnableAdviceSink || (GetGlobal()->bEnableVerboseMode && m_bOnStop))
2679+ {
2680+ STDOUT("%s = %ld\n", szRegistryValue, lValue);
2681+ }
2682+ }
2683+}
2684+
2685+void ExampleClientAdviceSink::GetAllStatistics(void)
2686+{
2687+ UINT32 unPlayerIndex = 0;
2688+ UINT32 unSourceIndex = 0;
2689+ UINT32 unStreamIndex = 0;
2690+
2691+ char* pszRegistryPrefix = "Statistics";
2692+ char szRegistryName[MAX_DISPLAY_NAME] = {0}; /* Flawfinder: ignore */
2693+
2694+#ifdef __TCS__
2695+ return; // DISABLED FOR NOW
2696+#endif
2697+
2698+ // display the content of whole statistic registry
2699+ if (m_pRegistry)
2700+ {
2701+ // ok, let's start from the top (player)
2702+ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Player%ld", pszRegistryPrefix, m_lClientIndex);
2703+ if (PT_COMPOSITE == m_pRegistry->GetTypeByName(szRegistryName))
2704+ {
2705+ // display player statistic
2706+ GetStatistics(szRegistryName);
2707+
2708+ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Source%ld", szRegistryName, unSourceIndex);
2709+ while (PT_COMPOSITE == m_pRegistry->GetTypeByName(szRegistryName))
2710+ {
2711+ // display source statistic
2712+ GetStatistics(szRegistryName);
2713+
2714+ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Stream%ld", szRegistryName, unStreamIndex);
2715+ while (PT_COMPOSITE == m_pRegistry->GetTypeByName(szRegistryName))
2716+ {
2717+ // display stream statistic
2718+ GetStatistics(szRegistryName);
2719+
2720+ unStreamIndex++;
2721+
2722+ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Player%ld.Source%ld.Stream%ld",
2723+ pszRegistryPrefix, unPlayerIndex, unSourceIndex, unStreamIndex);
2724+ }
2725+
2726+ unSourceIndex++;
2727+
2728+ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Player%ld.Source%ld",
2729+ pszRegistryPrefix, unPlayerIndex, unSourceIndex);
2730+ }
2731+
2732+ unPlayerIndex++;
2733+
2734+ SafeSprintf(szRegistryName, MAX_DISPLAY_NAME, "%s.Player%ld", pszRegistryPrefix, unPlayerIndex);
2735+ }
2736+ }
2737+}
2738+
2739+/************************************************************************
2740+ * Method:
2741+ * IHXClientAdviseSink::OnStatisticsChanged
2742+ * Purpose:
2743+ * Called to advise the client that the presentation statistics
2744+ * have changed.
2745+ */
2746+STDMETHODIMP ExampleClientAdviceSink::OnStatisticsChanged(void)
2747+{
2748+ char szBuff[1024]; /* Flawfinder: ignore */
2749+ HX_RESULT res = HXR_OK;
2750+ UINT16 uPlayer = 0;
2751+
2752+#ifdef __TCS__
2753+ return HXR_OK; // DISABLED FOR NOW
2754+#endif
2755+
2756+ if(GetGlobal()->bEnableAdviceSink)
2757+ {
2758+ STDOUT("OnStatisticsChanged():\n");
2759+
2760+ SafeSprintf(szBuff, 1024, "Statistics");
2761+ res = DumpRegTree( szBuff );
2762+ }
2763+
2764+ return HXR_OK;
2765+}
2766+
2767+HX_RESULT ExampleClientAdviceSink::DumpRegTree(const char* pszTreeName )
2768+{
2769+ const char* pszName = NULL;
2770+ ULONG32 ulRegID = 0;
2771+ HX_RESULT res = HXR_OK;
2772+ INT32 nVal = 0;
2773+ IHXBuffer* pBuff = NULL;
2774+ IHXValues* pValues = NULL;
2775+
2776+ //See if the name exists in the reg tree.
2777+ res = m_pRegistry->GetPropListByName( pszTreeName, pValues);
2778+ if( HXR_OK!=res || !pValues )
2779+ return HXR_FAIL;
2780+
2781+ //make sure this is a PT_COMPOSITE type reg entry.
2782+ if( PT_COMPOSITE != m_pRegistry->GetTypeByName(pszTreeName))
2783+ return HXR_FAIL;
2784+
2785+ //Print out the value of each member of this tree.
2786+ res = pValues->GetFirstPropertyULONG32( pszName, ulRegID );
2787+ while( HXR_OK == res )
2788+ {
2789+ //We have at least one entry. See what type it is.
2790+ HXPropType pt = m_pRegistry->GetTypeById(ulRegID);
2791+ switch(pt)
2792+ {
2793+ case PT_COMPOSITE:
2794+ DumpRegTree(pszName);
2795+ break;
2796+ case PT_INTEGER :
2797+ nVal = 0;
2798+ m_pRegistry->GetIntById( ulRegID, nVal );
2799+ STDOUT("%s : %d\n", pszName, nVal );
2800+ break;
2801+ case PT_INTREF :
2802+ nVal = 0;
2803+ m_pRegistry->GetIntById( ulRegID, nVal );
2804+ STDOUT("%s : %d\n", pszName, nVal );
2805+ break;
2806+ case PT_STRING :
2807+ pBuff = NULL;
2808+ m_pRegistry->GetStrById( ulRegID, pBuff );
2809+ STDOUT("%s : \"", pszName );
2810+ if( pBuff )
2811+ STDOUT("%s", (const char *)(pBuff->GetBuffer()) );
2812+ STDOUT("\"\n" );
2813+ HX_RELEASE(pBuff);
2814+ break;
2815+ case PT_BUFFER :
2816+ STDOUT("%s : BUFFER TYPE NOT SHOWN\n",
2817+ pszName, nVal );
2818+ break;
2819+ case PT_UNKNOWN:
2820+ STDOUT("%s Unkown registry type entry\n", pszName );
2821+ break;
2822+ default:
2823+ STDOUT("%s Unkown registry type entry\n", pszName );
2824+ break;
2825+ }
2826+ res = pValues->GetNextPropertyULONG32( pszName, ulRegID);
2827+ }
2828+
2829+ HX_RELEASE( pValues );
2830+
2831+ return HXR_OK;
2832+}
2833+
2834+
2835+/************************************************************************
2836+ * Method:
2837+ * IHXClientAdviseSink::OnPreSeek
2838+ * Purpose:
2839+ * Called by client engine to inform the client that a seek is
2840+ * about to occur. The render is informed the last time for the
2841+ * stream's time line before the seek, as well as the first new
2842+ * time for the stream's time line after the seek will be completed.
2843+ *
2844+ */
2845+STDMETHODIMP ExampleClientAdviceSink::OnPreSeek( ULONG32 ulOldTime,
2846+ ULONG32 ulNewTime)
2847+{
2848+#if !defined(__TCS__)
2849+ if (GetGlobal()->bEnableAdviceSink)
2850+ {
2851+ STDOUT("OnPreSeek(%ld, %ld)\n", ulOldTime, ulNewTime);
2852+ }
2853+#endif
2854+
2855+ return HXR_OK;
2856+}
2857+
2858+
2859+/************************************************************************
2860+ * Method:
2861+ * IHXClientAdviseSink::OnPostSeek
2862+ * Purpose:
2863+ * Called by client engine to inform the client that a seek has
2864+ * just occured. The render is informed the last time for the
2865+ * stream's time line before the seek, as well as the first new
2866+ * time for the stream's time line after the seek.
2867+ *
2868+ */
2869+STDMETHODIMP ExampleClientAdviceSink::OnPostSeek( ULONG32 ulOldTime,
2870+ ULONG32 ulNewTime)
2871+{
2872+#ifdef __TCS__
2873+ lastPosition = -1;
2874+#else
2875+ if (GetGlobal()->bEnableAdviceSink)
2876+ {
2877+ STDOUT("OnPostSeek(%ld, %ld)\n", ulOldTime, ulNewTime);
2878+ }
2879+#endif
2880+
2881+ return HXR_OK;
2882+}
2883+
2884+
2885+/************************************************************************
2886+ * Method:
2887+ * IHXClientAdviseSink::OnStop
2888+ * Purpose:
2889+ * Called by client engine to inform the client that a stop has
2890+ * just occured.
2891+ *
2892+ */
2893+STDMETHODIMP ExampleClientAdviceSink::OnStop(void)
2894+{
2895+ HXTimeval now;
2896+
2897+#ifdef __TCS__
2898+ hookRealAudio_State(eStop);
2899+#else
2900+ if (GetGlobal()->bEnableAdviceSink)
2901+ {
2902+ STDOUT("OnStop()\n");
2903+ }
2904+
2905+ if (GetGlobal()->bEnableVerboseMode)
2906+ {
2907+ STDOUT("Player %ld stopped.\n", m_lClientIndex);
2908+ m_bOnStop = TRUE;
2909+ GetAllStatistics();
2910+ }
2911+#endif
2912+
2913+ // Find out the current time and subtract the beginning time to
2914+ // figure out how many seconds we played
2915+ now = m_pScheduler->GetCurrentSchedulerTime();
2916+ m_ulStopTime = now.tv_sec;
2917+
2918+ GetGlobal()->g_ulNumSecondsPlayed = m_ulStopTime - m_ulStartTime;
2919+
2920+ return HXR_OK;
2921+}
2922+
2923+/************************************************************************
2924+ * Method:
2925+ * IHXClientAdviseSink::OnPause
2926+ * Purpose:
2927+ * Called by client engine to inform the client that a pause has
2928+ * just occured. The render is informed the last time for the
2929+ * stream's time line before the pause.
2930+ *
2931+ */
2932+STDMETHODIMP ExampleClientAdviceSink::OnPause(ULONG32 ulTime)
2933+{
2934+#ifdef __TCS__
2935+ hookRealAudio_State(ePause);
2936+#else
2937+ if (GetGlobal()->bEnableAdviceSink)
2938+ {
2939+ STDOUT("OnPause(%ld)\n", ulTime);
2940+ }
2941+#endif
2942+
2943+ return HXR_OK;
2944+}
2945+
2946+
2947+/************************************************************************
2948+ * Method:
2949+ * IHXClientAdviseSink::OnBegin
2950+ * Purpose:
2951+ * Called by client engine to inform the client that a begin or
2952+ * resume has just occured. The render is informed the first time
2953+ * for the stream's time line after the resume.
2954+ *
2955+ */
2956+STDMETHODIMP ExampleClientAdviceSink::OnBegin(ULONG32 ulTime)
2957+{
2958+ HXTimeval now;
2959+
2960+#if !defined(__TCS__)
2961+ if (GetGlobal()->bEnableAdviceSink)
2962+ {
2963+ STDOUT("OnBegin(%ld)\n", ulTime);
2964+ }
2965+
2966+ if (GetGlobal()->bEnableVerboseMode)
2967+ {
2968+ STDOUT("Player %ld beginning playback...\n", m_lClientIndex);
2969+ }
2970+#endif
2971+
2972+ GetGlobal()->g_bOnBeginOccurred = TRUE;
2973+
2974+ // Record the current time, so we can figure out many seconds we played
2975+ now = m_pScheduler->GetCurrentSchedulerTime();
2976+ m_ulStartTime = now.tv_sec;
2977+
2978+ return HXR_OK;
2979+}
2980+
2981+
2982+/************************************************************************
2983+ * Method:
2984+ * IHXClientAdviseSink::OnBuffering
2985+ * Purpose:
2986+ * Called by client engine to inform the client that buffering
2987+ * of data is occuring. The render is informed of the reason for
2988+ * the buffering (start-up of stream, seek has occured, network
2989+ * congestion, etc.), as well as percentage complete of the
2990+ * buffering process.
2991+ *
2992+ */
2993+STDMETHODIMP ExampleClientAdviceSink::OnBuffering(ULONG32 ulFlags,
2994+ UINT16 unPercentComplete)
2995+{
2996+#ifdef __TCS__
2997+static UINT16 lastPct = 0;
2998+ if (unPercentComplete > 0)
2999+ {
3000+ UINT16 nextPct = lastPct + 10;
3001+ if (unPercentComplete < lastPct)
3002+ {
3003+ lastPct = 0;
3004+ nextPct = lastPct + 10;
3005+ }
3006+ if (unPercentComplete >= nextPct)
3007+ {
3008+ lastPct = (unPercentComplete / 10) * 10;
3009+ nextPct = lastPct + 10;
3010+ hookRealAudio_Buffering(eBuffering,lastPct);
3011+ }
3012+ }
3013+#else
3014+ if (GetGlobal()->bEnableAdviceSink)
3015+ {
3016+ STDOUT("OnBuffering(%ld, %d)\n", ulFlags, unPercentComplete);
3017+ }
3018+#endif
3019+ if (m_on_buffering_cb)
3020+ m_on_buffering_cb(ulFlags, unPercentComplete, m_context);
3021+
3022+ return HXR_OK;
3023+}
3024+
3025+
3026+/************************************************************************
3027+ * Method:
3028+ * IHXClientAdviseSink::OnContacting
3029+ * Purpose:
3030+ * Called by client engine to inform the client is contacting
3031+ * hosts(s).
3032+ *
3033+ */
3034+STDMETHODIMP ExampleClientAdviceSink::OnContacting(const char* pHostName)
3035+{
3036+#ifdef __TCS__
3037+ printf("Contacting\n");
3038+ hookRealAudio_Buffering(eContacting,0);
3039+#else
3040+ if (GetGlobal()->bEnableAdviceSink)
3041+ {
3042+ STDOUT("OnContacting(\"%s\")\n", pHostName);
3043+ }
3044+#endif
3045+
3046+ return HXR_OK;
3047+}
3048+
3049+void ExampleClientAdviceSink::PrintPropName( IHXValues* pHeader )
3050+{
3051+ if ( pHeader == NULL )
3052+ {
3053+ return ;
3054+ }
3055+
3056+ const char *pChar;
3057+ ULONG32 pValue;
3058+ if(HXR_OK == pHeader->GetFirstPropertyULONG32(pChar, pValue))
3059+ {
3060+ do
3061+ {
3062+ STDOUT("%s %d\n", pChar, pValue);
3063+ }
3064+ while(HXR_OK == pHeader->GetNextPropertyULONG32(pChar, pValue));
3065+ }
3066+
3067+ IHXBuffer *pBuffer;
3068+
3069+ if(HXR_OK == pHeader->GetFirstPropertyBuffer(pChar, pBuffer))
3070+ {
3071+ do
3072+ {
3073+ STDOUT("%s %s\n", pChar, (const char *) ( pBuffer->GetBuffer() ));
3074+ PrintBuffer(pChar, pBuffer->GetBuffer() ,pBuffer->GetSize());
3075+ HX_RELEASE(pBuffer);
3076+ } while(HXR_OK == pHeader->GetNextPropertyBuffer(pChar, pBuffer ));
3077+ }
3078+
3079+ if(HXR_OK == pHeader->GetFirstPropertyCString(pChar, pBuffer))
3080+ {
3081+ do
3082+ {
3083+ STDERR("%s %s\n", pChar, (const char *) ( pBuffer->GetBuffer() ));
3084+ HX_RELEASE(pBuffer);
3085+ } while(HXR_OK == pHeader->GetNextPropertyCString(pChar, pBuffer ));
3086+ }
3087+
3088+ fflush(stdout);
3089+}
3090+
3091+
3092+void ExampleClientAdviceSink::SetClipInfo( IHXPlayer* m_pRMAPlayer)
3093+{
3094+ bool bSendOnClipInfo = false;
3095+
3096+ // Get HXSource and try to get clip infor.
3097+ UINT32 sourceCount = m_pRMAPlayer->GetSourceCount();
3098+ for (UINT32 sourceID = 0; sourceID < sourceCount; sourceID ++)
3099+ {
3100+ // get HXSource
3101+ STDOUT("========Source %d========\n",sourceID);
3102+ IUnknown* pUnkSource = NULL;
3103+ IHXStreamSource* pStreamSrc = NULL;
3104+
3105+ if (HXR_OK != m_pRMAPlayer->GetSource (sourceID, pUnkSource))
3106+ {
3107+ continue;
3108+ }
3109+
3110+ pUnkSource->QueryInterface(IID_IHXStreamSource, (void **)&pStreamSrc);
3111+
3112+ HX_RELEASE(pUnkSource);
3113+
3114+ if (!pStreamSrc)
3115+ {
3116+ continue;
3117+ }
3118+
3119+ UINT32 num_streams = pStreamSrc->GetStreamCount();
3120+
3121+ STDOUT("====File Header====\n");
3122+
3123+ IHXValues* pFileHdr = NULL;
3124+ pStreamSrc->QueryInterface(IID_IHXValues, (void**)&pFileHdr);
3125+
3126+ if ( pFileHdr)
3127+ {
3128+ PrintPropName(pFileHdr);
3129+ }
3130+ HX_RELEASE(pFileHdr);
3131+
3132+ // get information from Streams
3133+ for (UINT32 streamID = 0; streamID < num_streams ; streamID++)
3134+ {
3135+ STDOUT("====Stream %d====\n",streamID);
3136+ IUnknown* pUnkStream = NULL;
3137+
3138+ if (HXR_OK == pStreamSrc->GetStream(streamID, pUnkStream))
3139+ {
3140+ IHXStream* pStream = NULL;
3141+
3142+ if (HXR_OK == pUnkStream->QueryInterface(IID_IHXStream,
3143+ (void**)&pStream))
3144+ {
3145+ IHXValues* pStreamHdr = pStream->GetHeader();
3146+ if (pStreamHdr)
3147+ {
3148+ PrintPropName(pStreamHdr);
3149+ }
3150+ HX_RELEASE(pStreamHdr);
3151+ }
3152+ HX_RELEASE(pStream);
3153+ }
3154+ HX_RELEASE(pUnkStream);
3155+ }
3156+ STDOUT("---------------------------------------------\n");
3157+
3158+ HX_RELEASE(pStreamSrc);
3159+ }
3160+}
3161+
3162+
3163+STDMETHODIMP ExampleClientAdviceSink::Func()
3164+{
3165+ m_hCallback = 0;
3166+
3167+ // set clip info
3168+ if(m_pPlayer)
3169+ SetClipInfo(m_pPlayer);
3170+
3171+ return HXR_OK;
3172+}
3173+
3174+void PrintBuffer(const char* pszName,const unsigned char* pbBuf, unsigned int dwBytes)
3175+{
3176+ if(pszName == NULL || pbBuf == NULL)
3177+ return;
3178+
3179+ STDOUT(" ");
3180+ for(unsigned int i= 0; i<dwBytes; i++) {
3181+ STDOUT("0x%02x ",*pbBuf++);
3182+ if(i % 15 == 0 && i!=0)
3183+ STDOUT("\n ");
3184+ }
3185+ STDOUT("\n");
3186+ return;
3187+}
3188+
3189+/*
3190+ * IHXGroupSink methods
3191+ */
3192+/************************************************************************
3193+ * Method:
3194+ * IHXGroupSink::GroupAdded
3195+ * Purpose:
3196+ * Notification of a new group being added to the presentation.
3197+ */
3198+STDMETHODIMP ExampleClientAdviceSink::GroupAdded( UINT16 /*IN*/ uGroupIndex,
3199+ IHXGroup* /*IN*/ pGroup)
3200+{
3201+ return HXR_OK;
3202+}
3203+
3204+/************************************************************************
3205+ * Method:
3206+ * IHXGroupSink::GroupRemoved
3207+ * Purpose:
3208+ * Notification of a group being removed from the presentation.
3209+ */
3210+STDMETHODIMP ExampleClientAdviceSink::GroupRemoved( UINT16 /*IN*/ uGroupIndex,
3211+ IHXGroup* /*IN*/ pGroup)
3212+{
3213+ return HXR_OK;
3214+}
3215+
3216+/************************************************************************
3217+ * Method:
3218+ * IHXGroupSink::AllGroupsRemoved
3219+ * Purpose:
3220+ * Notification that all groups have been removed from the
3221+ * current presentation.
3222+ */
3223+STDMETHODIMP ExampleClientAdviceSink::AllGroupsRemoved()
3224+{
3225+ return HXR_OK;
3226+}
3227+
3228+/************************************************************************
3229+ * Method:
3230+ * IHXGroupSink::TrackAdded
3231+ * Purpose:
3232+ * Notification of a new track being added to a group.
3233+ */
3234+STDMETHODIMP ExampleClientAdviceSink::TrackAdded( UINT16 /*IN*/ uGroupIndex,
3235+ UINT16 /*IN*/ uTrackIndex,
3236+ IHXValues* /*IN*/ pTrack)
3237+{
3238+ return HXR_OK;
3239+}
3240+
3241+/************************************************************************
3242+ * Method:
3243+ * IHXGroupSink::TrackRemoved
3244+ * Purpose:
3245+ * Notification of a track being removed from a group.
3246+ */
3247+STDMETHODIMP ExampleClientAdviceSink::TrackRemoved( UINT16 /*IN*/ uGroupIndex,
3248+ UINT16 /*IN*/ uTrackIndex,
3249+ IHXValues* /*IN*/ pTrack)
3250+{
3251+ return HXR_OK;
3252+}
3253+
3254+/************************************************************************
3255+ * Method:
3256+ * IHXGroupSink::TrackStarted
3257+ * Purpose:
3258+ * Notification of a track being started (to get duration, for
3259+ * instance...)
3260+ */
3261+STDMETHODIMP ExampleClientAdviceSink::TrackStarted( UINT16 /*IN*/ uGroupIndex,
3262+ UINT16 /*IN*/ uTrackIndex,
3263+ IHXValues* /*IN*/ pTrack)
3264+{
3265+ if ( m_bWaitForTrackStart )
3266+ {
3267+ STDOUT("----------------clip info--------------------\n");
3268+ if(m_pScheduler)
3269+ {
3270+ m_hCallback = m_pScheduler->RelativeEnter(this,50);
3271+ }
3272+ m_bWaitForTrackStart = FALSE;
3273+ }
3274+ return HXR_OK;
3275+}
3276+
3277+/************************************************************************
3278+ * Method:
3279+ * IHXGroupSink::TrackStopped
3280+ * Purpose:
3281+ * Notification of a track being stopped
3282+ *
3283+ */
3284+STDMETHODIMP ExampleClientAdviceSink::TrackStopped( UINT16 /*IN*/ uGroupIndex,
3285+ UINT16 /*IN*/ uTrackIndex,
3286+ IHXValues* /*IN*/ pTrack)
3287+{
3288+ return HXR_OK;
3289+}
3290+
3291+/************************************************************************
3292+ * Method:
3293+ * IHXGroupSink::CurrentGroupSet
3294+ * Purpose:
3295+ * This group is being currently played in the presentation.
3296+ */
3297+STDMETHODIMP ExampleClientAdviceSink::CurrentGroupSet( UINT16 /*IN*/ uGroupIndex,
3298+ IHXGroup* /*IN*/ pGroup)
3299+{
3300+ return HXR_OK;
3301+}
3302+
3303Index: helix-libs/clientapps/clutter/exadvsnk.h
3304===================================================================
3305--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3306+++ helix-libs/clientapps/clutter/exadvsnk.h 2008-10-13 06:05:49.000000000 -0700
3307@@ -0,0 +1,324 @@
3308+/* ***** BEGIN LICENSE BLOCK *****
3309+ * Version: RCSL 1.0/RPSL 1.0
3310+ *
3311+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
3312+ *
3313+ * The contents of this file, and the files included with this file, are
3314+ * subject to the current version of the RealNetworks Public Source License
3315+ * Version 1.0 (the "RPSL") available at
3316+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
3317+ * the file under the RealNetworks Community Source License Version 1.0
3318+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
3319+ * in which case the RCSL will apply. You may also obtain the license terms
3320+ * directly from RealNetworks. You may not use this file except in
3321+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
3322+ * applicable to this file, the RCSL. Please see the applicable RPSL or
3323+ * RCSL for the rights, obligations and limitations governing use of the
3324+ * contents of the file.
3325+ *
3326+ * This file is part of the Helix DNA Technology. RealNetworks is the
3327+ * developer of the Original Code and owns the copyrights in the portions
3328+ * it created.
3329+ *
3330+ * This file, and the files included with this file, is distributed and made
3331+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
3332+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
3333+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
3334+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
3335+ *
3336+ * Technology Compatibility Kit Test Suite(s) Location:
3337+ * http://www.helixcommunity.org/content/tck
3338+ *
3339+ * Contributor(s):
3340+ *
3341+ * ***** END LICENSE BLOCK ***** */
3342+
3343+#ifndef _EXAMPLECLSNK_
3344+#define _EXAMPLECLSNK_
3345+
3346+#include "player.h"
3347+
3348+struct IHXClientAdviseSink;
3349+struct IHXGroupSink;
3350+struct IUnknown;
3351+struct IHXRegistry;
3352+struct IHXScheduler;
3353+struct IHXCallback;
3354+struct IHXPlayer;
3355+struct IHXGroup;
3356+
3357+class ExampleClientAdviceSink : public IHXClientAdviseSink,
3358+ public IHXGroupSink,
3359+ public IHXCallback
3360+{
3361+ private:
3362+ LONG32 m_lRefCount;
3363+ LONG32 m_lClientIndex;
3364+
3365+ IUnknown* m_pUnknown;
3366+ IHXRegistry* m_pRegistry;
3367+ IHXScheduler* m_pScheduler;
3368+
3369+ UINT32 m_ulStartTime;
3370+ UINT32 m_ulStopTime;
3371+
3372+ UINT32 m_lCurrentBandwidth;
3373+ UINT32 m_lAverageBandwidth;
3374+ HXBOOL m_bOnStop;
3375+
3376+ HXBOOL m_bWaitForTrackStart;
3377+
3378+ on_buffering_cb_t m_on_buffering_cb;
3379+ on_pos_length_cb_t m_on_pos_length_cb;
3380+ void *m_context; /* a argument passed by texture-helix lib */
3381+
3382+ // IHXCallback
3383+ IHXPlayer* m_pPlayer;
3384+ ULONG32 m_hCallback;
3385+ ~ExampleClientAdviceSink();
3386+ HX_RESULT DumpRegTree(const char* pszTreeName );
3387+
3388+
3389+ void GetStatistics (char* /*IN*/ pszRegistryKey);
3390+ void GetAllStatistics (void);
3391+ void SetClipInfo( IHXPlayer* m_pRMAPlayer);
3392+ void PrintPropName( IHXValues* pHeader );
3393+
3394+ public:
3395+
3396+ 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);
3397+
3398+ /*
3399+ * IUnknown methods
3400+ */
3401+ STDMETHOD(QueryInterface) (THIS_
3402+ REFIID riid,
3403+ void** ppvObj);
3404+
3405+ STDMETHOD_(ULONG32,AddRef) (THIS);
3406+
3407+ STDMETHOD_(ULONG32,Release) (THIS);
3408+
3409+ /*
3410+ * IHXClientAdviseSink methods
3411+ */
3412+
3413+ /************************************************************************
3414+ * Method:
3415+ * IHXClientAdviseSink::OnPosLength
3416+ * Purpose:
3417+ * Called to advise the client that the position or length of the
3418+ * current playback context has changed.
3419+ */
3420+ STDMETHOD(OnPosLength) (THIS_
3421+ UINT32 ulPosition,
3422+ UINT32 ulLength);
3423+
3424+ /************************************************************************
3425+ * Method:
3426+ * IHXClientAdviseSink::OnPresentationOpened
3427+ * Purpose:
3428+ * Called to advise the client a presentation has been opened.
3429+ */
3430+ STDMETHOD(OnPresentationOpened) (THIS);
3431+
3432+ /************************************************************************
3433+ * Method:
3434+ * IHXClientAdviseSink::OnPresentationClosed
3435+ * Purpose:
3436+ * Called to advise the client a presentation has been closed.
3437+ */
3438+ STDMETHOD(OnPresentationClosed) (THIS);
3439+
3440+ /************************************************************************
3441+ * Method:
3442+ * IHXClientAdviseSink::OnStatisticsChanged
3443+ * Purpose:
3444+ * Called to advise the client that the presentation statistics
3445+ * have changed.
3446+ */
3447+ STDMETHOD(OnStatisticsChanged) (THIS);
3448+
3449+ /************************************************************************
3450+ * Method:
3451+ * IHXClientAdviseSink::OnPreSeek
3452+ * Purpose:
3453+ * Called by client engine to inform the client that a seek is
3454+ * about to occur. The render is informed the last time for the
3455+ * stream's time line before the seek, as well as the first new
3456+ * time for the stream's time line after the seek will be completed.
3457+ *
3458+ */
3459+ STDMETHOD (OnPreSeek) (THIS_
3460+ ULONG32 ulOldTime,
3461+ ULONG32 ulNewTime);
3462+
3463+ /************************************************************************
3464+ * Method:
3465+ * IHXClientAdviseSink::OnPostSeek
3466+ * Purpose:
3467+ * Called by client engine to inform the client that a seek has
3468+ * just occured. The render is informed the last time for the
3469+ * stream's time line before the seek, as well as the first new
3470+ * time for the stream's time line after the seek.
3471+ *
3472+ */
3473+ STDMETHOD (OnPostSeek) (THIS_
3474+ ULONG32 ulOldTime,
3475+ ULONG32 ulNewTime);
3476+
3477+ /************************************************************************
3478+ * Method:
3479+ * IHXClientAdviseSink::OnStop
3480+ * Purpose:
3481+ * Called by client engine to inform the client that a stop has
3482+ * just occured.
3483+ *
3484+ */
3485+ STDMETHOD (OnStop) (THIS);
3486+
3487+ /************************************************************************
3488+ * Method:
3489+ * IHXClientAdviseSink::OnPause
3490+ * Purpose:
3491+ * Called by client engine to inform the client that a pause has
3492+ * just occured. The render is informed the last time for the
3493+ * stream's time line before the pause.
3494+ *
3495+ */
3496+ STDMETHOD (OnPause) (THIS_
3497+ ULONG32 ulTime);
3498+
3499+ /************************************************************************
3500+ * Method:
3501+ * IHXClientAdviseSink::OnBegin
3502+ * Purpose:
3503+ * Called by client engine to inform the client that a begin or
3504+ * resume has just occured. The render is informed the first time
3505+ * for the stream's time line after the resume.
3506+ *
3507+ */
3508+ STDMETHOD (OnBegin) (THIS_
3509+ ULONG32 ulTime);
3510+
3511+ /************************************************************************
3512+ * Method:
3513+ * IHXClientAdviseSink::OnBuffering
3514+ * Purpose:
3515+ * Called by client engine to inform the client that buffering
3516+ * of data is occuring. The render is informed of the reason for
3517+ * the buffering (start-up of stream, seek has occured, network
3518+ * congestion, etc.), as well as percentage complete of the
3519+ * buffering process.
3520+ *
3521+ */
3522+ STDMETHOD (OnBuffering) (THIS_
3523+ ULONG32 ulFlags,
3524+ UINT16 unPercentComplete);
3525+
3526+
3527+ /************************************************************************
3528+ * Method:
3529+ * IHXClientAdviseSink::OnContacting
3530+ * Purpose:
3531+ * Called by client engine to inform the client is contacting
3532+ * hosts(s).
3533+ *
3534+ */
3535+ STDMETHOD (OnContacting) (THIS_
3536+ const char* pHostName);
3537+
3538+ // IHXCallback
3539+ STDMETHOD(Func) (THIS);
3540+
3541+ /*
3542+ * IHXGroupSink methods
3543+ */
3544+ /************************************************************************
3545+ * Method:
3546+ * IHXGroupSink::GroupAdded
3547+ * Purpose:
3548+ * Notification of a new group being added to the presentation.
3549+ */
3550+ STDMETHOD(GroupAdded) (THIS_
3551+ UINT16 /*IN*/ uGroupIndex,
3552+ IHXGroup* /*IN*/ pGroup);
3553+
3554+ /************************************************************************
3555+ * Method:
3556+ * IHXGroupSink::GroupRemoved
3557+ * Purpose:
3558+ * Notification of a group being removed from the presentation.
3559+ */
3560+ STDMETHOD(GroupRemoved) (THIS_
3561+ UINT16 /*IN*/ uGroupIndex,
3562+ IHXGroup* /*IN*/ pGroup);
3563+
3564+ /************************************************************************
3565+ * Method:
3566+ * IHXGroupSink::AllGroupsRemoved
3567+ * Purpose:
3568+ * Notification that all groups have been removed from the
3569+ * current presentation.
3570+ */
3571+ STDMETHOD(AllGroupsRemoved) (THIS);
3572+
3573+ /************************************************************************
3574+ * Method:
3575+ * IHXGroupSink::TrackAdded
3576+ * Purpose:
3577+ * Notification of a new track being added to a group.
3578+ */
3579+ STDMETHOD(TrackAdded) (THIS_
3580+ UINT16 /*IN*/ uGroupIndex,
3581+ UINT16 /*IN*/ uTrackIndex,
3582+ IHXValues* /*IN*/ pTrack);
3583+
3584+ /************************************************************************
3585+ * Method:
3586+ * IHXGroupSink::TrackRemoved
3587+ * Purpose:
3588+ * Notification of a track being removed from a group.
3589+ */
3590+ STDMETHOD(TrackRemoved) (THIS_
3591+ UINT16 /*IN*/ uGroupIndex,
3592+ UINT16 /*IN*/ uTrackIndex,
3593+ IHXValues* /*IN*/ pTrack);
3594+
3595+ /************************************************************************
3596+ * Method:
3597+ * IHXGroupSink::TrackStarted
3598+ * Purpose:
3599+ * Notification of a track being started (to get duration, for
3600+ * instance...)
3601+ */
3602+ STDMETHOD (TrackStarted) (THIS_
3603+ UINT16 /*IN*/ uGroupIndex,
3604+ UINT16 /*IN*/ uTrackIndex,
3605+ IHXValues* /*IN*/ pTrack) ;
3606+
3607+ /************************************************************************
3608+ * Method:
3609+ * IHXGroupSink::TrackStopped
3610+ * Purpose:
3611+ * Notification of a track being stopped
3612+ *
3613+ */
3614+ STDMETHOD(TrackStopped) (THIS_
3615+ UINT16 /*IN*/ uGroupIndex,
3616+ UINT16 /*IN*/ uTrackIndex,
3617+ IHXValues* /*IN*/ pTrack);
3618+
3619+ /************************************************************************
3620+ * Method:
3621+ * IHXGroupSink::CurrentGroupSet
3622+ * Purpose:
3623+ * This group is being currently played in the presentation.
3624+ */
3625+ STDMETHOD(CurrentGroupSet) (THIS_
3626+ UINT16 /*IN*/ uGroupIndex,
3627+ IHXGroup* /*IN*/ pGroup);
3628+
3629+};
3630+
3631+#endif /* _EXAMPLECLSNK_ */
3632Index: helix-libs/clientapps/clutter/exaumgr.cpp
3633===================================================================
3634--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3635+++ helix-libs/clientapps/clutter/exaumgr.cpp 2008-10-13 06:05:49.000000000 -0700
3636@@ -0,0 +1,137 @@
3637+/* ***** BEGIN LICENSE BLOCK *****
3638+ * Version: RCSL 1.0/RPSL 1.0
3639+ *
3640+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
3641+ *
3642+ * The contents of this file, and the files included with this file, are
3643+ * subject to the current version of the RealNetworks Public Source License
3644+ * Version 1.0 (the "RPSL") available at
3645+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
3646+ * the file under the RealNetworks Community Source License Version 1.0
3647+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
3648+ * in which case the RCSL will apply. You may also obtain the license terms
3649+ * directly from RealNetworks. You may not use this file except in
3650+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
3651+ * applicable to this file, the RCSL. Please see the applicable RPSL or
3652+ * RCSL for the rights, obligations and limitations governing use of the
3653+ * contents of the file.
3654+ *
3655+ * This file is part of the Helix DNA Technology. RealNetworks is the
3656+ * developer of the Original Code and owns the copyrights in the portions
3657+ * it created.
3658+ *
3659+ * This file, and the files included with this file, is distributed and made
3660+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
3661+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
3662+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
3663+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
3664+ *
3665+ * Technology Compatibility Kit Test Suite(s) Location:
3666+ * http://www.helixcommunity.org/content/tck
3667+ *
3668+ * Contributor(s):
3669+ *
3670+ * ***** END LICENSE BLOCK ***** */
3671+
3672+#include <stdio.h>
3673+#include "hxtypes.h"
3674+#include "hxcom.h"
3675+#include "hxauth.h"
3676+#include "hxstrutl.h"
3677+#include "exaumgr.h"
3678+#include <ctype.h>
3679+#include "print.h"
3680+
3681+
3682+#include "globals.h"
3683+struct _stGlobals*& GetGlobal(); //in main.cpp
3684+
3685+
3686+
3687+ExampleAuthenticationManager::ExampleAuthenticationManager() :
3688+ m_lRefCount(0),
3689+ m_bSentPassword(FALSE)
3690+{
3691+}
3692+
3693+ExampleAuthenticationManager::~ExampleAuthenticationManager()
3694+{
3695+}
3696+
3697+STDMETHODIMP
3698+ExampleAuthenticationManager::QueryInterface(REFIID riid, void**ppvObj)
3699+{
3700+ if(IsEqualIID(riid, IID_IUnknown))
3701+ {
3702+ AddRef();
3703+ *ppvObj = (IUnknown*)(IHXAuthenticationManager*)this;
3704+ return HXR_OK;
3705+ }
3706+ else if(IsEqualIID(riid, IID_IHXAuthenticationManager))
3707+ {
3708+ AddRef();
3709+ *ppvObj = (IHXAuthenticationManager*)this;
3710+ return HXR_OK;
3711+ }
3712+ *ppvObj = NULL;
3713+ return HXR_NOINTERFACE;
3714+}
3715+
3716+STDMETHODIMP_(UINT32)
3717+ExampleAuthenticationManager::AddRef()
3718+{
3719+ return InterlockedIncrement(&m_lRefCount);
3720+}
3721+
3722+STDMETHODIMP_(UINT32)
3723+ExampleAuthenticationManager::Release()
3724+{
3725+ if (InterlockedDecrement(&m_lRefCount) > 0)
3726+ {
3727+ return m_lRefCount;
3728+ }
3729+
3730+ delete this;
3731+ return 0;
3732+}
3733+
3734+STDMETHODIMP
3735+ExampleAuthenticationManager::HandleAuthenticationRequest(IHXAuthenticationManagerResponse* pResponse)
3736+{
3737+ char username[1024] = ""; /* Flawfinder: ignore */
3738+ char password[1024] = ""; /* Flawfinder: ignore */
3739+ HX_RESULT res = HXR_FAIL;
3740+
3741+ if( !m_bSentPassword )
3742+ {
3743+ res = HXR_OK;
3744+ if (GetGlobal()->bEnableVerboseMode)
3745+ STDOUT("\nSending Username and Password...\n");
3746+
3747+ SafeStrCpy(username, GetGlobal()->g_pszUsername, 1024);
3748+ SafeStrCpy(password, GetGlobal()->g_pszPassword, 1024);
3749+
3750+ //strip trailing whitespace
3751+ char* c;
3752+ for(c = username + strlen(username) - 1;
3753+ c > username && isspace(*c);
3754+ c--)
3755+ ;
3756+ *(c+1) = 0;
3757+
3758+ for(c = password + strlen(password) - 1;
3759+ c > password && isspace(*c);
3760+ c--)
3761+ ;
3762+ *(c+1) = 0;
3763+
3764+ m_bSentPassword = TRUE;
3765+ }
3766+
3767+ if (GetGlobal()->bEnableVerboseMode && FAILED(res) )
3768+ STDOUT("\nInvalid Username and/or Password.\n");
3769+
3770+ pResponse->AuthenticationRequestDone(res, username, password);
3771+ return res;
3772+}
3773+
3774Index: helix-libs/clientapps/clutter/exaumgr.h
3775===================================================================
3776--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3777+++ helix-libs/clientapps/clutter/exaumgr.h 2008-10-13 06:05:49.000000000 -0700
3778@@ -0,0 +1,56 @@
3779+/* ***** BEGIN LICENSE BLOCK *****
3780+ * Version: RCSL 1.0/RPSL 1.0
3781+ *
3782+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
3783+ *
3784+ * The contents of this file, and the files included with this file, are
3785+ * subject to the current version of the RealNetworks Public Source License
3786+ * Version 1.0 (the "RPSL") available at
3787+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
3788+ * the file under the RealNetworks Community Source License Version 1.0
3789+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
3790+ * in which case the RCSL will apply. You may also obtain the license terms
3791+ * directly from RealNetworks. You may not use this file except in
3792+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
3793+ * applicable to this file, the RCSL. Please see the applicable RPSL or
3794+ * RCSL for the rights, obligations and limitations governing use of the
3795+ * contents of the file.
3796+ *
3797+ * This file is part of the Helix DNA Technology. RealNetworks is the
3798+ * developer of the Original Code and owns the copyrights in the portions
3799+ * it created.
3800+ *
3801+ * This file, and the files included with this file, is distributed and made
3802+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
3803+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
3804+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
3805+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
3806+ *
3807+ * Technology Compatibility Kit Test Suite(s) Location:
3808+ * http://www.helixcommunity.org/content/tck
3809+ *
3810+ * Contributor(s):
3811+ *
3812+ * ***** END LICENSE BLOCK ***** */
3813+
3814+#ifndef _EXAUMGR_H_
3815+#define _EXAUMGR_H_
3816+
3817+#include "hxauth.h"
3818+
3819+class ExampleAuthenticationManager : public IHXAuthenticationManager
3820+{
3821+private:
3822+ INT32 m_lRefCount;
3823+ HXBOOL m_bSentPassword;
3824+ ~ExampleAuthenticationManager();
3825+
3826+public:
3827+ ExampleAuthenticationManager();
3828+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvObj);
3829+ STDMETHOD_(UINT32,AddRef) (THIS);
3830+ STDMETHOD_(UINT32,Release) (THIS);
3831+
3832+ STDMETHOD(HandleAuthenticationRequest) (IHXAuthenticationManagerResponse* pResponse);
3833+};
3834+#endif
3835Index: helix-libs/clientapps/clutter/excallback.cpp
3836===================================================================
3837--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3838+++ helix-libs/clientapps/clutter/excallback.cpp 2008-10-13 06:05:49.000000000 -0700
3839@@ -0,0 +1,38 @@
3840+#include "excallback.h"
3841+
3842+STDMETHODIMP ExCallback::QueryInterface(REFIID riid, void** ppvObj)
3843+{
3844+ if (IsEqualIID(riid, IID_IHXCallback))
3845+ {
3846+ AddRef();
3847+ *ppvObj = (IHXCallback*)this;
3848+ return HXR_OK;
3849+ }
3850+ else if (IsEqualIID(riid, IID_IUnknown))
3851+ {
3852+ AddRef();
3853+ *ppvObj = this;
3854+ return HXR_OK;
3855+ }
3856+
3857+ *ppvObj = NULL;
3858+ return HXR_NOINTERFACE;
3859+}
3860+
3861+STDMETHODIMP_(ULONG32) ExCallback::AddRef()
3862+{
3863+ return HXR_OK;
3864+}
3865+
3866+STDMETHODIMP_(ULONG32) ExCallback::Release()
3867+{
3868+ return HXR_OK;
3869+}
3870+
3871+STDMETHODIMP ExCallback::Func(void)
3872+{
3873+ UINT32 sleepTime = 0;
3874+ m_pKicker->Kick(HXGetCurrentThreadID, &sleepTime);
3875+ printf("Get called, sleeptime:%d\n", sleepTime);
3876+ m_pScheduler->RelativeEnter(this, sleepTime/1000);
3877+}
3878Index: helix-libs/clientapps/clutter/excallback.h
3879===================================================================
3880--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3881+++ helix-libs/clientapps/clutter/excallback.h 2008-10-13 06:05:49.000000000 -0700
3882@@ -0,0 +1,32 @@
3883+#ifndef _EX_CALLBACK_H_
3884+#define _EX_CALLBACK_H_
3885+
3886+#include "hxcom.h"
3887+#include "hxengin.h"
3888+#include "ihxmedpltfm.h"
3889+#include "thrdutil.h"
3890+
3891+class ExCallback : public IHXCallback
3892+{
3893+ public:
3894+ ExCallback(IHXScheduler *pIHXScheduler, IHXMediaPlatformKicker *pKicker) : m_pScheduler(pIHXScheduler), m_pKicker(pKicker){};
3895+
3896+ /*
3897+ * * IUnknown methods
3898+ * */
3899+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvObj);
3900+ STDMETHOD_(ULONG32,AddRef) (THIS);
3901+ STDMETHOD_(ULONG32,Release) (THIS);
3902+
3903+ /*
3904+ * * IHXCallback methods
3905+ * */
3906+ STDMETHOD(Func) (THIS);
3907+ private:
3908+ IHXScheduler *m_pScheduler;
3909+ IHXMediaPlatformKicker* m_pKicker;
3910+
3911+};
3912+
3913+
3914+#endif
3915Index: helix-libs/clientapps/clutter/excontxt.cpp
3916===================================================================
3917--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3918+++ helix-libs/clientapps/clutter/excontxt.cpp 2008-10-13 06:05:49.000000000 -0700
3919@@ -0,0 +1,315 @@
3920+/* ***** BEGIN LICENSE BLOCK *****
3921+ * Version: RCSL 1.0/RPSL 1.0
3922+ *
3923+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
3924+ *
3925+ * The contents of this file, and the files included with this file, are
3926+ * subject to the current version of the RealNetworks Public Source License
3927+ * Version 1.0 (the "RPSL") available at
3928+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
3929+ * the file under the RealNetworks Community Source License Version 1.0
3930+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
3931+ * in which case the RCSL will apply. You may also obtain the license terms
3932+ * directly from RealNetworks. You may not use this file except in
3933+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
3934+ * applicable to this file, the RCSL. Please see the applicable RPSL or
3935+ * RCSL for the rights, obligations and limitations governing use of the
3936+ * contents of the file.
3937+ *
3938+ * This file is part of the Helix DNA Technology. RealNetworks is the
3939+ * developer of the Original Code and owns the copyrights in the portions
3940+ * it created.
3941+ *
3942+ * This file, and the files included with this file, is distributed and made
3943+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
3944+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
3945+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
3946+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
3947+ *
3948+ * Technology Compatibility Kit Test Suite(s) Location:
3949+ * http://www.helixcommunity.org/content/tck
3950+ *
3951+ * Contributor(s):
3952+ *
3953+ * ***** END LICENSE BLOCK ***** */
3954+
3955+#include "hxtypes.h"
3956+
3957+#include "hxwintyp.h"
3958+#include "hxcom.h"
3959+#include "hxcomm.h"
3960+#include "hxwin.h"
3961+#include "fivemmap.h"
3962+
3963+#include "hxbuffer.h"
3964+#include "hxmangle.h"
3965+
3966+#include "hxclsnk.h"
3967+#include "hxgroup.h"
3968+#include "hxerror.h"
3969+#include "hxprefs.h"
3970+#include "hxstrutl.h"
3971+
3972+#include "exadvsnk.h"
3973+#include "exstateadvsnk.h"
3974+#include "exerror.h"
3975+#include "exsitsup.h"
3976+#include "exaumgr.h"
3977+#include "hxprdnld.h"
3978+#include "exprdnld.h"
3979+
3980+#include "excontxt.h"
3981+
3982+extern HXBOOL bEnableAdviceSink;
3983+
3984+
3985+ExampleClientContext::ExampleClientContext(LONG32 lClientIndex)
3986+ : m_lRefCount(0)
3987+ , m_lClientIndex(lClientIndex)
3988+ , m_pClientSink(NULL)
3989+ , m_pClientStateSink(NULL)
3990+ , m_pErrorSink(NULL)
3991+ , m_pAuthMgr(NULL)
3992+ , m_pSiteSupplier(NULL)
3993+ , m_pDefaultPrefs(NULL)
3994+#if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS)
3995+ , m_pPrgDnldStatusObserver(NULL)
3996+#endif // /HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS.
3997+{
3998+}
3999+
4000+
4001+ExampleClientContext::~ExampleClientContext()
4002+{
4003+ Close();
4004+};
4005+
4006+void ExampleClientContext::Init(IUnknown* /*IN*/ pUnknown,
4007+ IHXPreferences* /*IN*/ pPreferences,
4008+ char* /*IN*/ pszGUID,
4009+ on_buffering_cb_t on_buffering_cb,
4010+ on_pos_length_cb_t on_pos_length_cb,
4011+ on_state_change_cb_t on_state_change_cb,
4012+ on_new_frame_cb_t on_new_frame_cb,
4013+ void *context)
4014+{
4015+ char* pszCipher = NULL;
4016+
4017+
4018+ m_pClientSink = new ExampleClientAdviceSink(pUnknown, m_lClientIndex, on_buffering_cb, on_pos_length_cb, context);
4019+
4020+ m_pClientStateSink = new ExampleClientStateAdviceSink(pUnknown, m_lClientIndex, on_state_change_cb, context);
4021+ m_pErrorSink = new ExampleErrorSink(pUnknown);
4022+#if defined(HELIX_FEATURE_AUTHENTICATION)
4023+ m_pAuthMgr = new ExampleAuthenticationManager();
4024+ if(m_pAuthMgr)
4025+ {
4026+ m_pAuthMgr->AddRef();
4027+ }
4028+
4029+#endif /* #if defined(HELIX_FEATURE_AUTHENTICATION) */
4030+#if defined(HELIX_FEATURE_VIDEO)
4031+ m_pSiteSupplier = new ExampleSiteSupplier(pUnknown, on_new_frame_cb, context);
4032+#endif
4033+
4034+#if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS)
4035+ m_pPrgDnldStatusObserver = new ExamplePDStatusObserver(pUnknown);
4036+#endif // /HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS.
4037+
4038+ if (m_pClientSink)
4039+ {
4040+ m_pClientSink->AddRef();
4041+ }
4042+
4043+ if (m_pErrorSink)
4044+ {
4045+ m_pErrorSink->AddRef();
4046+ }
4047+
4048+ if (m_pClientStateSink)
4049+ m_pClientStateSink->AddRef();
4050+
4051+ if(m_pSiteSupplier)
4052+ {
4053+ m_pSiteSupplier->AddRef();
4054+ }
4055+
4056+ if (pPreferences)
4057+ {
4058+ m_pDefaultPrefs = pPreferences;
4059+ m_pDefaultPrefs->AddRef();
4060+ }
4061+
4062+ if (pszGUID && *pszGUID)
4063+ {
4064+ // Encode GUID
4065+ pszCipher = Cipher(pszGUID);
4066+ SafeStrCpy(m_pszGUID, pszCipher, 256);
4067+ }
4068+ else
4069+ {
4070+ m_pszGUID[0] = '\0';
4071+ }
4072+}
4073+
4074+void ExampleClientContext::Close()
4075+{
4076+ HX_RELEASE(m_pClientSink);
4077+ HX_RELEASE(m_pClientStateSink);
4078+ HX_RELEASE(m_pErrorSink);
4079+#if defined(HELIX_FEATURE_AUTHENTICATION)
4080+ HX_RELEASE(m_pAuthMgr);
4081+#endif /* #if defined(HELIX_FEATURE_AUTHENTICATION) */
4082+ HX_RELEASE(m_pSiteSupplier);
4083+ HX_RELEASE(m_pDefaultPrefs);
4084+#if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS)
4085+ HX_RELEASE(m_pPrgDnldStatusObserver);
4086+#endif // /HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS.
4087+}
4088+
4089+
4090+
4091+// *** IUnknown methods ***
4092+
4093+/////////////////////////////////////////////////////////////////////////
4094+// Method:
4095+// IUnknown::QueryInterface
4096+// Purpose:
4097+// Implement this to export the interfaces supported by your
4098+// object.
4099+//
4100+STDMETHODIMP ExampleClientContext::QueryInterface(REFIID riid, void** ppvObj)
4101+{
4102+ if (IsEqualIID(riid, IID_IUnknown))
4103+ {
4104+ AddRef();
4105+ *ppvObj = this;
4106+ return HXR_OK;
4107+ }
4108+ else if (IsEqualIID(riid, IID_IHXPreferences))
4109+ {
4110+ AddRef();
4111+ *ppvObj = (IHXPreferences*)this;
4112+ return HXR_OK;
4113+ }
4114+ else if (m_pClientSink &&
4115+ m_pClientSink->QueryInterface(riid, ppvObj) == HXR_OK)
4116+ {
4117+ return HXR_OK;
4118+ }
4119+ else if (m_pErrorSink &&
4120+ m_pErrorSink->QueryInterface(riid, ppvObj) == HXR_OK)
4121+ {
4122+ return HXR_OK;
4123+ }
4124+ else if (m_pClientStateSink &&
4125+ m_pClientStateSink->QueryInterface(riid, ppvObj) == HXR_OK)
4126+ {
4127+ return HXR_OK;
4128+ }
4129+#if defined(HELIX_FEATURE_AUTHENTICATION)
4130+ else if(m_pAuthMgr &&
4131+ m_pAuthMgr->QueryInterface(riid, ppvObj) == HXR_OK)
4132+ {
4133+ return HXR_OK;
4134+ }
4135+#endif /* #if defined(HELIX_FEATURE_AUTHENTICATION) */
4136+ else if(m_pSiteSupplier &&
4137+ m_pSiteSupplier->QueryInterface(riid, ppvObj) == HXR_OK)
4138+ {
4139+ return HXR_OK;
4140+ }
4141+ *ppvObj = NULL;
4142+ return HXR_NOINTERFACE;
4143+}
4144+
4145+/////////////////////////////////////////////////////////////////////////
4146+// Method:
4147+// IUnknown::AddRef
4148+// Purpose:
4149+// Everyone usually implements this the same... feel free to use
4150+// this implementation.
4151+//
4152+STDMETHODIMP_(ULONG32) ExampleClientContext::AddRef()
4153+{
4154+ return InterlockedIncrement(&m_lRefCount);
4155+}
4156+
4157+/////////////////////////////////////////////////////////////////////////
4158+// Method:
4159+// IUnknown::Release
4160+// Purpose:
4161+// Everyone usually implements this the same... feel free to use
4162+// this implementation.
4163+//
4164+STDMETHODIMP_(ULONG32) ExampleClientContext::Release()
4165+{
4166+ if (InterlockedDecrement(&m_lRefCount) > 0)
4167+ {
4168+ return m_lRefCount;
4169+ }
4170+
4171+ delete this;
4172+ return 0;
4173+}
4174+
4175+
4176+// *** IUnknown methods ***
4177+
4178+/////////////////////////////////////////////////////////////////////////
4179+// Method:
4180+// IHXPreferences::ReadPref
4181+// Purpose:
4182+// Read a Preference from the registry.
4183+//
4184+STDMETHODIMP
4185+ExampleClientContext::ReadPref(const char* pref_key, IHXBuffer*& buffer)
4186+{
4187+ HX_RESULT hResult = HXR_OK;
4188+ char* pszCipher = NULL;
4189+
4190+ if ((stricmp(pref_key, CLIENT_GUID_REGNAME) == 0) &&
4191+ (*m_pszGUID))
4192+ {
4193+ // Create a Buffer
4194+ buffer = new CHXBuffer();
4195+ buffer->AddRef();
4196+
4197+ // Copy the encoded GUID into the buffer
4198+ buffer->Set((UCHAR*)m_pszGUID, strlen(m_pszGUID) + 1);
4199+ }
4200+ else if (m_pDefaultPrefs)
4201+ {
4202+ hResult = m_pDefaultPrefs->ReadPref(pref_key, buffer);
4203+ }
4204+ else
4205+ {
4206+ hResult = HXR_NOTIMPL;
4207+ }
4208+
4209+ return hResult;
4210+}
4211+
4212+/////////////////////////////////////////////////////////////////////////
4213+// Method:
4214+// IHXPreferences::WritePref
4215+// Purpose:
4216+// Write a Preference to the registry.
4217+//
4218+STDMETHODIMP
4219+ExampleClientContext::WritePref(const char* pref_key, IHXBuffer* buffer)
4220+{
4221+ if (m_pDefaultPrefs)
4222+ {
4223+ return m_pDefaultPrefs->WritePref(pref_key, buffer);
4224+ }
4225+ else
4226+ {
4227+ return HXR_OK;
4228+ }
4229+}
4230+
4231+EHXClientState ExampleClientContext::GetState()
4232+{
4233+ return m_pClientStateSink->GetState();
4234+};
4235Index: helix-libs/clientapps/clutter/excontxt.h
4236===================================================================
4237--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4238+++ helix-libs/clientapps/clutter/excontxt.h 2008-10-13 06:05:49.000000000 -0700
4239@@ -0,0 +1,106 @@
4240+/* ***** BEGIN LICENSE BLOCK *****
4241+ * Version: RCSL 1.0/RPSL 1.0
4242+ *
4243+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
4244+ *
4245+ * The contents of this file, and the files included with this file, are
4246+ * subject to the current version of the RealNetworks Public Source License
4247+ * Version 1.0 (the "RPSL") available at
4248+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
4249+ * the file under the RealNetworks Community Source License Version 1.0
4250+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
4251+ * in which case the RCSL will apply. You may also obtain the license terms
4252+ * directly from RealNetworks. You may not use this file except in
4253+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
4254+ * applicable to this file, the RCSL. Please see the applicable RPSL or
4255+ * RCSL for the rights, obligations and limitations governing use of the
4256+ * contents of the file.
4257+ *
4258+ * This file is part of the Helix DNA Technology. RealNetworks is the
4259+ * developer of the Original Code and owns the copyrights in the portions
4260+ * it created.
4261+ *
4262+ * This file, and the files included with this file, is distributed and made
4263+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
4264+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
4265+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
4266+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
4267+ *
4268+ * Technology Compatibility Kit Test Suite(s) Location:
4269+ * http://www.helixcommunity.org/content/tck
4270+ *
4271+ * Contributor(s):
4272+ *
4273+ * ***** END LICENSE BLOCK ***** */
4274+#ifndef _EXCONTXT_H_
4275+#define _EXCONTXT_H_
4276+
4277+#include "exerror.h"
4278+#include "exsitsup.h"
4279+#include "hxprefs.h"
4280+#include "player.h"
4281+#include "hxclsnk.h"
4282+
4283+struct IUnknown;
4284+struct IHXPreferences;
4285+class ExampleClientAdviceSink;
4286+class ExampleClientStateAdviceSink;
4287+class ExampleErrorMessages;
4288+class ExampleAuthenticationManager;
4289+class ExamplePDStatusObserver;
4290+
4291+
4292+class ExampleClientContext : public IHXPreferences
4293+{
4294+private:
4295+ LONG32 m_lRefCount;
4296+ LONG32 m_lClientIndex;
4297+
4298+ ExampleClientAdviceSink* m_pClientSink;
4299+ ExampleClientStateAdviceSink* m_pClientStateSink;
4300+ ExampleErrorSink* m_pErrorSink;
4301+ ExampleAuthenticationManager* m_pAuthMgr;
4302+
4303+ ExampleSiteSupplier* m_pSiteSupplier;
4304+ ExamplePDStatusObserver* m_pPrgDnldStatusObserver;
4305+ IHXPreferences* m_pDefaultPrefs;
4306+ char m_pszGUID[256]; /* Flawfinder: ignore */
4307+
4308+
4309+public:
4310+
4311+ ExampleClientContext(LONG32 /*IN*/ lClientIndex);
4312+ ~ExampleClientContext();
4313+
4314+ void Init(IUnknown* /*IN*/ pUnknown,
4315+ IHXPreferences* /*IN*/ pPreferences,
4316+ char* /*IN*/ pszGUID,
4317+ on_buffering_cb_t on_buffering_cb = NULL,
4318+ on_pos_length_cb_t on_pos_length_cb = NULL,
4319+ on_state_change_cb_t on_state_change_cb = NULL,
4320+ on_new_frame_cb_t on_new_frame_cb = NULL,
4321+ void *context = NULL);
4322+ void Close();
4323+
4324+ EHXClientState GetState();
4325+
4326+ /*
4327+ * IUnknown methods
4328+ */
4329+ STDMETHOD(QueryInterface) (THIS_
4330+ REFIID riid,
4331+ void** ppvObj);
4332+
4333+ STDMETHOD_(ULONG32,AddRef) (THIS);
4334+ STDMETHOD_(ULONG32,Release) (THIS);
4335+
4336+ /*
4337+ * IHXPreferences methods
4338+ */
4339+ STDMETHOD(ReadPref) (THIS_ const char* pref_key,
4340+ IHXBuffer*& buffer);
4341+ STDMETHOD(WritePref) (THIS_ const char* pref_key,
4342+ IHXBuffer* buffer);
4343+};
4344+
4345+#endif
4346Index: helix-libs/clientapps/clutter/exerror.cpp
4347===================================================================
4348--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4349+++ helix-libs/clientapps/clutter/exerror.cpp 2008-10-13 06:05:49.000000000 -0700
4350@@ -0,0 +1,230 @@
4351+/* ***** BEGIN LICENSE BLOCK *****
4352+ * Version: RCSL 1.0/RPSL 1.0
4353+ *
4354+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
4355+ *
4356+ * The contents of this file, and the files included with this file, are
4357+ * subject to the current version of the RealNetworks Public Source License
4358+ * Version 1.0 (the "RPSL") available at
4359+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
4360+ * the file under the RealNetworks Community Source License Version 1.0
4361+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
4362+ * in which case the RCSL will apply. You may also obtain the license terms
4363+ * directly from RealNetworks. You may not use this file except in
4364+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
4365+ * applicable to this file, the RCSL. Please see the applicable RPSL or
4366+ * RCSL for the rights, obligations and limitations governing use of the
4367+ * contents of the file.
4368+ *
4369+ * This file is part of the Helix DNA Technology. RealNetworks is the
4370+ * developer of the Original Code and owns the copyrights in the portions
4371+ * it created.
4372+ *
4373+ * This file, and the files included with this file, is distributed and made
4374+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
4375+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
4376+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
4377+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
4378+ *
4379+ * Technology Compatibility Kit Test Suite(s) Location:
4380+ * http://www.helixcommunity.org/content/tck
4381+ *
4382+ * Contributor(s):
4383+ *
4384+ * ***** END LICENSE BLOCK ***** */
4385+
4386+#include "hxtypes.h"
4387+
4388+#include "hxcom.h"
4389+#include "hxcomm.h"
4390+#include "hxerror.h"
4391+#include "hxstrutl.h"
4392+#include "hxcore.h"
4393+#include "hxassert.h"
4394+#include "hxbuffer.h"
4395+
4396+#ifdef __TCS__
4397+#include "hxresult.h"
4398+#endif
4399+
4400+#if !defined(HELIX_CONFIG_MINIMIZE_SIZE)
4401+#include "HXErrorCodeStrings.h"
4402+#endif
4403+
4404+#include "exerror.h"
4405+
4406+#include <stdio.h>
4407+#include "print.h"
4408+
4409+#include "globals.h"
4410+struct _stGlobals*& GetGlobal(); //in main.cpp
4411+
4412+#ifdef __TCS__
4413+#if defined(__cplusplus)
4414+extern "C" {
4415+#endif
4416+
4417+void hookRealAudio_ReportError(int err, long errVal);
4418+
4419+#ifdef __cplusplus
4420+}
4421+#endif
4422+#endif
4423+
4424+ExampleErrorSink::ExampleErrorSink(IUnknown* pUnknown)
4425+ : m_lRefCount(0),
4426+ m_pPlayer(NULL)
4427+{
4428+ IHXClientEngine* pEngine = NULL;
4429+ pUnknown->QueryInterface(IID_IHXClientEngine, (void**)&pEngine );
4430+ if( pEngine )
4431+ {
4432+ IUnknown* pTmp = NULL;
4433+ pEngine->GetPlayer(0, pTmp);
4434+ m_pPlayer = (IHXPlayer*)pTmp;
4435+ }
4436+
4437+ HX_RELEASE( pEngine );
4438+ HX_ASSERT(m_pPlayer);
4439+}
4440+
4441+ExampleErrorSink::~ExampleErrorSink()
4442+{
4443+ HX_RELEASE(m_pPlayer);
4444+}
4445+
4446+// *** IUnknown methods ***
4447+
4448+/////////////////////////////////////////////////////////////////////////
4449+// Method:
4450+// IUnknown::QueryInterface
4451+// Purpose:
4452+// Implement this to export the interfaces supported by your
4453+// object.
4454+//
4455+STDMETHODIMP ExampleErrorSink::QueryInterface(REFIID riid, void** ppvObj)
4456+{
4457+ if (IsEqualIID(riid, IID_IUnknown))
4458+ {
4459+ AddRef();
4460+ *ppvObj = (IUnknown*)(IHXErrorSink*)this;
4461+ return HXR_OK;
4462+ }
4463+ else if (IsEqualIID(riid, IID_IHXErrorSink))
4464+ {
4465+ AddRef();
4466+ *ppvObj = (IHXErrorSink*) this;
4467+ return HXR_OK;
4468+ }
4469+
4470+ *ppvObj = NULL;
4471+ return HXR_NOINTERFACE;
4472+}
4473+
4474+/////////////////////////////////////////////////////////////////////////
4475+// Method:
4476+// IUnknown::AddRef
4477+// Purpose:
4478+// Everyone usually implements this the same... feel free to use
4479+// this implementation.
4480+//
4481+STDMETHODIMP_(ULONG32) ExampleErrorSink::AddRef()
4482+{
4483+ return InterlockedIncrement(&m_lRefCount);
4484+}
4485+
4486+/////////////////////////////////////////////////////////////////////////
4487+// Method:
4488+// IUnknown::Release
4489+// Purpose:
4490+// Everyone usually implements this the same... feel free to use
4491+// this implementation.
4492+//
4493+STDMETHODIMP_(ULONG32) ExampleErrorSink::Release()
4494+{
4495+ if (InterlockedDecrement(&m_lRefCount) > 0)
4496+ {
4497+ return m_lRefCount;
4498+ }
4499+
4500+ delete this;
4501+ return 0;
4502+}
4503+
4504+/*
4505+ * IHXErrorSink methods
4506+ */
4507+
4508+STDMETHODIMP
4509+ExampleErrorSink::ErrorOccurred(const UINT8 unSeverity,
4510+ const ULONG32 ulHXCode,
4511+ const ULONG32 ulUserCode,
4512+ const char* pUserString,
4513+ const char* pMoreInfoURL
4514+ )
4515+{
4516+ char HXDefine[256]; /* Flawfinder: ignore */
4517+
4518+ // Store the code, so we can return it from main()
4519+ GetGlobal()->g_Error = ulHXCode;
4520+
4521+ ConvertErrorToString(ulHXCode, HXDefine, 256);
4522+
4523+#ifdef __TCS__
4524+ hookRealAudio_ReportError(ulHXCode,ulUserCode);
4525+#else
4526+ STDOUT("Report(%d, %ld, \"%s\", %ld, \"%s\", \"%s\")\n",
4527+ unSeverity,
4528+ ulHXCode,
4529+ (pUserString && *pUserString) ? pUserString : "(NULL)",
4530+ ulUserCode,
4531+ (pMoreInfoURL && *pMoreInfoURL) ? pMoreInfoURL : "(NULL)",
4532+ HXDefine);
4533+#endif
4534+
4535+ return HXR_OK;
4536+}
4537+
4538+void
4539+ExampleErrorSink::ConvertErrorToString(const ULONG32 ulHXCode, char* pszBuffer, UINT32 ulBufLen)
4540+{
4541+ IHXErrorMessages* pErrMsg = NULL;
4542+
4543+ if( !pszBuffer)
4544+ return;
4545+
4546+ pszBuffer[0]='\0';
4547+
4548+ HX_ASSERT(m_pPlayer);
4549+ if( m_pPlayer)
4550+ {
4551+ m_pPlayer->QueryInterface(IID_IHXErrorMessages, (void**)&pErrMsg);
4552+ if( pErrMsg )
4553+ {
4554+ IHXBuffer* pMessage = pErrMsg->GetErrorText(ulHXCode);
4555+ if( pMessage )
4556+ {
4557+ SafeStrCpy( pszBuffer, (const char*)pMessage->GetBuffer(), ulBufLen);
4558+ pMessage->Release();
4559+ }
4560+ }
4561+ HX_RELEASE(pErrMsg);
4562+ }
4563+
4564+ if( strlen(pszBuffer)==0 )
4565+ {
4566+#if !defined(HELIX_CONFIG_MINIMIZE_SIZE)
4567+ const char* pszHXCodeString = HXErrorCodeToString(ulHXCode);
4568+ if (pszHXCodeString)
4569+ {
4570+ SafeSprintf( pszBuffer, ulBufLen, "%s", pszHXCodeString);
4571+ }
4572+ else
4573+#endif
4574+ {
4575+ HX_ASSERT(FALSE);
4576+ SafeSprintf( pszBuffer, ulBufLen, "Can't convert error code %p - make sure it's defined in common/util/HXErrorCodeStrings.c", ulHXCode );
4577+ }
4578+ }
4579+}
4580+
4581Index: helix-libs/clientapps/clutter/exerror.h
4582===================================================================
4583--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4584+++ helix-libs/clientapps/clutter/exerror.h 2008-10-13 06:05:49.000000000 -0700
4585@@ -0,0 +1,92 @@
4586+/* ***** BEGIN LICENSE BLOCK *****
4587+ * Version: RCSL 1.0/RPSL 1.0
4588+ *
4589+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
4590+ *
4591+ * The contents of this file, and the files included with this file, are
4592+ * subject to the current version of the RealNetworks Public Source License
4593+ * Version 1.0 (the "RPSL") available at
4594+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
4595+ * the file under the RealNetworks Community Source License Version 1.0
4596+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
4597+ * in which case the RCSL will apply. You may also obtain the license terms
4598+ * directly from RealNetworks. You may not use this file except in
4599+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
4600+ * applicable to this file, the RCSL. Please see the applicable RPSL or
4601+ * RCSL for the rights, obligations and limitations governing use of the
4602+ * contents of the file.
4603+ *
4604+ * This file is part of the Helix DNA Technology. RealNetworks is the
4605+ * developer of the Original Code and owns the copyrights in the portions
4606+ * it created.
4607+ *
4608+ * This file, and the files included with this file, is distributed and made
4609+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
4610+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
4611+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
4612+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
4613+ *
4614+ * Technology Compatibility Kit Test Suite(s) Location:
4615+ * http://www.helixcommunity.org/content/tck
4616+ *
4617+ * Contributor(s):
4618+ *
4619+ * ***** END LICENSE BLOCK ***** */
4620+
4621+#ifndef _EXAMPLEERRORMESSAGES_
4622+#define _EXAMPLEERRORMESSAGES_
4623+
4624+#include "hxerror.h"
4625+
4626+struct IUnknown;
4627+struct IHXErrorMessages;
4628+struct IHXPlayer;
4629+
4630+class ExampleErrorSink : public IHXErrorSink
4631+{
4632+public:
4633+
4634+ ExampleErrorSink(IUnknown* pUnknown);
4635+ ~ExampleErrorSink();
4636+
4637+ /*
4638+ * IUnknown methods
4639+ */
4640+ STDMETHOD(QueryInterface) (THIS_
4641+ REFIID riid,
4642+ void** ppvObj);
4643+
4644+ STDMETHOD_(ULONG32,AddRef) (THIS);
4645+
4646+ STDMETHOD_(ULONG32,Release) (THIS);
4647+
4648+ /*
4649+ * IHXErrorSink methods
4650+ */
4651+
4652+ /************************************************************************
4653+ * Method:
4654+ * IHXErrorSink::ErrorOccurred
4655+ * Purpose:
4656+ * After you have registered your error sink with an IHXErrorSinkControl
4657+ * (either in the server or player core) this method will be called to
4658+ * report an error, event, or status message.
4659+ *
4660+ * The meaning of the arguments is exactly as described in
4661+ * hxerror.h
4662+ */
4663+ STDMETHOD(ErrorOccurred) (THIS_
4664+ const UINT8 unSeverity,
4665+ const ULONG32 ulHXCode,
4666+ const ULONG32 ulUserCode,
4667+ const char* pUserString,
4668+ const char* pMoreInfoURL
4669+ );
4670+
4671+protected:
4672+ LONG32 m_lRefCount;
4673+ IHXPlayer* m_pPlayer;
4674+
4675+ void ConvertErrorToString (const ULONG32 ulHXCode, char* pszBuffer, UINT32 ulBufLen);
4676+};
4677+#endif /*_EXAMPLEERRORMESSAGES_*/
4678Index: helix-libs/clientapps/clutter/exprdnld.cpp
4679===================================================================
4680--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4681+++ helix-libs/clientapps/clutter/exprdnld.cpp 2008-10-13 06:05:49.000000000 -0700
4682@@ -0,0 +1,468 @@
4683+/* ***** BEGIN LICENSE BLOCK *****
4684+ * Version: RCSL 1.0/RPSL 1.0
4685+ *
4686+ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
4687+ *
4688+ * The contents of this file, and the files included with this file, are
4689+ * subject to the current version of the RealNetworks Public Source License
4690+ * Version 1.0 (the "RPSL") available at
4691+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
4692+ * the file under the RealNetworks Community Source License Version 1.0
4693+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
4694+ * in which case the RCSL will apply. You may also obtain the license terms
4695+ * directly from RealNetworks. You may not use this file except in
4696+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
4697+ * applicable to this file, the RCSL. Please see the applicable RPSL or
4698+ * RCSL for the rights, obligations and limitations governing use of the
4699+ * contents of the file.
4700+ *
4701+ * This file is part of the Helix DNA Technology. RealNetworks is the
4702+ * developer of the Original Code and owns the copyrights in the portions
4703+ * it created.
4704+ *
4705+ * This file, and the files included with this file, is distributed and made
4706+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
4707+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
4708+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
4709+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
4710+ *
4711+ * Technology Compatibility Kit Test Suite(s) Location:
4712+ * http://www.helixcommunity.org/content/tck
4713+ *
4714+ * Contributor(s):
4715+ *
4716+ * ***** END LICENSE BLOCK ***** */
4717+
4718+#include "hxcom.h"
4719+#include "hxtypes.h"
4720+#include "hxcore.h"
4721+#include "hxprdnld.h"
4722+#include "exprdnld.h"
4723+#include "print.h"
4724+
4725+#include "globals.h"
4726+struct _stGlobals*& GetGlobal();
4727+
4728+UINT32 GetTime(); // /In main.cpp.
4729+
4730+// /#if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS)
4731+/************************************************************************
4732+ * Method:
4733+ * Constructor
4734+ */
4735+ExamplePDStatusObserver::ExamplePDStatusObserver(IUnknown* pUnkPlayer)
4736+ : m_lRefCount(0)
4737+ , m_pPrgDnldStatusMgr(NULL)
4738+ , m_pUnkPlayer(pUnkPlayer)
4739+ , m_pHXPlayer(NULL)
4740+ , m_bPlayerIsPausedByThis(FALSE)
4741+ , m_bFirstPDStatusMessage(TRUE)
4742+ , m_ulTotalDurReported(HX_PROGDOWNLD_UNKNOWN_DURATION)
4743+ , m_ulDurSoFar(HX_PROGDOWNLD_UNKNOWN_DURATION)
4744+ , m_ulCurStatusUpdateGranularity(
4745+ HX_PROGDOWNLD_DEFAULT_STATUSREPORT_INTERVAL_MSEC)
4746+ , m_bInitialPrerollUpateGranularitySet(FALSE)
4747+ , m_bDownloadIsComplete(FALSE)
4748+{
4749+ if (m_pUnkPlayer)
4750+ {
4751+ m_pUnkPlayer->QueryInterface(IID_IHXPlayer,
4752+ (void**)&m_pHXPlayer);
4753+
4754+ m_pUnkPlayer->QueryInterface(IID_IHXPDStatusMgr,
4755+ (void**)&m_pPrgDnldStatusMgr);
4756+
4757+ if (m_pPrgDnldStatusMgr)
4758+ {
4759+ // /Add ourselves as an observer of progressive download playback:
4760+ m_pPrgDnldStatusMgr->AddObserver(this);
4761+ // /Set granularity of status reports to 10 per second until we
4762+ // know enough about the situation to go back to getting reports
4763+ // at the default interval (every 5 seconds). Do that as soon
4764+ // as we receive the first progress report:
4765+ m_ulCurStatusUpdateGranularity = 100;
4766+ }
4767+
4768+ m_pUnkPlayer->AddRef();
4769+ }
4770+};
4771+
4772+/************************************************************************
4773+ * Method:
4774+ * Destructor
4775+ */
4776+ExamplePDStatusObserver::~ExamplePDStatusObserver()
4777+{
4778+ if (m_pPrgDnldStatusMgr)
4779+ {
4780+ m_pPrgDnldStatusMgr->RemoveObserver(this);
4781+ }
4782+ HX_RELEASE(m_pPrgDnldStatusMgr);
4783+ HX_RELEASE(m_pHXPlayer);
4784+ HX_RELEASE(m_pUnkPlayer);
4785+}
4786+
4787+/************************************************************************
4788+ * Method:
4789+ * IUnknown::QueryInterface
4790+ */
4791+STDMETHODIMP
4792+ExamplePDStatusObserver::QueryInterface(REFIID riid, void** ppvObj)
4793+{
4794+ if (IsEqualIID(riid, IID_IUnknown))
4795+ {
4796+ AddRef();
4797+ *ppvObj = (IUnknown*)(IHXPDStatusObserver*)this;
4798+ return HXR_OK;
4799+ }
4800+ else if (IsEqualIID(riid, IID_IHXPDStatusObserver))
4801+ {
4802+ AddRef();
4803+ *ppvObj = (IHXPDStatusObserver*)this;
4804+ return HXR_OK;
4805+ }
4806+
4807+ *ppvObj = NULL;
4808+ return HXR_NOINTERFACE;
4809+}
4810+
4811+/************************************************************************
4812+ * Method:
4813+ * IUnknown::AddRef
4814+ */
4815+STDMETHODIMP_(ULONG32)
4816+ExamplePDStatusObserver::AddRef()
4817+{
4818+ return InterlockedIncrement(&m_lRefCount);
4819+}
4820+
4821+/************************************************************************
4822+ * Method:
4823+ * IUnknown::Release
4824+ */
4825+STDMETHODIMP_(ULONG32)
4826+ExamplePDStatusObserver::Release()
4827+{
4828+ if (InterlockedDecrement(&m_lRefCount) > 0)
4829+ {
4830+ return m_lRefCount;
4831+ }
4832+
4833+ delete this;
4834+ return 0;
4835+}
4836+
4837+
4838+/*
4839+ * IHXPDStatusObserver methods
4840+ */
4841+
4842+/************************************************************************
4843+ * Method:
4844+ * IHXPDStatusObserver::OnDownloadProgress
4845+ *
4846+ * Purpose:
4847+ * Notification from IHXPDStatusMgr of download progress when
4848+ * file size changes.
4849+ *
4850+ * lTimeSurplus:
4851+ * - When negative, the absolute value of it is the estimated number
4852+ * of milliseconds of wall-clock time that need to pass while
4853+ * downloading continues before reaching the point at which playback
4854+ * can resume and play the remainder of the stream without having to
4855+ * buffer, assuming that playback is paused and remains so during
4856+ * that period.
4857+ * - When positive, it is the estimated number of milliseconds of
4858+ * wall-clock time between when the download should complete and when
4859+ * the natural content play-out duration will be reached, assuming
4860+ * playback is currently progressing and that no pause will occur.
4861+ *
4862+ * Note: ulNewDurSoFar can be HX_PROGDOWNLD_UNKNOWN_DURATION if the
4863+ * IHXMediaBytesToMediaDur was not available to, or was unable to
4864+ * convert the bytes to a duration for the IHXPDStatusMgr calling this:
4865+ */
4866+STDMETHODIMP
4867+ExamplePDStatusObserver::OnDownloadProgress(
4868+ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource,
4869+ UINT32 /*IN*/ ulNewDurSoFar,
4870+ UINT32 /*IN*/ ulNewBytesSoFar,
4871+ INT32 /*IN*/ lTimeSurplus)
4872+{
4873+ m_ulDurSoFar = ulNewDurSoFar;
4874+
4875+ if (m_ulCurStatusUpdateGranularity <
4876+ HX_PROGDOWNLD_DEFAULT_STATUSREPORT_INTERVAL_MSEC)
4877+ {
4878+ if (m_bInitialPrerollUpateGranularitySet)
4879+ {
4880+ if (HX_PROGDOWNLD_UNKNOWN_DURATION != ulNewDurSoFar &&
4881+ // /Preroll is done, so reset update interval back to default:
4882+ GetGlobal()->g_bOnBeginOccurred)
4883+ {
4884+ m_ulCurStatusUpdateGranularity =
4885+ HX_PROGDOWNLD_DEFAULT_STATUSREPORT_INTERVAL_MSEC;
4886+ m_pPrgDnldStatusMgr->SetStatusUpdateGranularityMsec(
4887+ m_ulCurStatusUpdateGranularity);
4888+ }
4889+ }
4890+ else if (!GetGlobal()->g_bOnBeginOccurred)
4891+ {
4892+ if (HXR_OK == m_pPrgDnldStatusMgr->SetStatusUpdateGranularityMsec(
4893+ m_ulCurStatusUpdateGranularity))
4894+ {
4895+ m_bInitialPrerollUpateGranularitySet = TRUE;
4896+ }
4897+ }
4898+ }
4899+
4900+ UINT32 ulCurPlayTime = 0;
4901+
4902+ HXBOOL bPauseWasAttempted = FALSE;
4903+ HXBOOL bPauseOccurred = FALSE;
4904+ HXBOOL bResumeWasAttempted = FALSE;
4905+ HXBOOL bResumeOccurred = FALSE;
4906+
4907+
4908+ if (m_pHXPlayer)
4909+ {
4910+ ulCurPlayTime = m_pHXPlayer->GetCurrentPlayTime();
4911+
4912+ if (GetGlobal()->g_bEnableSlowStart &&
4913+ lTimeSurplus != HX_PROGDOWNLD_UNKNOWN_TIME_SURPLUS)
4914+ {
4915+ // /"slow start" is enabled so if we have run dry of data,
4916+ // pause and wait for more data:
4917+ if (!m_bPlayerIsPausedByThis)
4918+ {
4919+ if (!m_bDownloadIsComplete && lTimeSurplus<0)
4920+ {
4921+ // /Use a 1000-millisecond allowance for variation:
4922+ if (lTimeSurplus < -1000)
4923+ {
4924+ bPauseWasAttempted = TRUE;
4925+ bPauseOccurred = m_bPlayerIsPausedByThis =
4926+ (HXR_OK == m_pHXPlayer->Pause());
4927+ }
4928+ }
4929+ }
4930+ else // /paused; see if we can resume yet:
4931+ {
4932+ if (lTimeSurplus > 0)
4933+ {
4934+ // /Use a 1000-millisecond allowance for variation:
4935+ if (lTimeSurplus > 1000)
4936+ {
4937+ bResumeWasAttempted = TRUE;
4938+ bResumeOccurred = (HXR_OK == m_pHXPlayer->Begin());
4939+ m_bPlayerIsPausedByThis = !bResumeOccurred;
4940+ }
4941+ }
4942+ }
4943+ }
4944+ }
4945+
4946+ if (GetGlobal()->bEnableVerboseMode && !m_bDownloadIsComplete)
4947+ {
4948+ STDOUT("\nDownload progress: (play time=%lu,",
4949+ ulCurPlayTime);
4950+ if (HX_PROGDOWNLD_UNKNOWN_TIME_SURPLUS == lTimeSurplus)
4951+ {
4952+ STDOUT(" UNKNOWN surplus|deficit)");
4953+ }
4954+ else if (HX_PROGDOWNLD_MIN_TIME_SURPLUS == lTimeSurplus)
4955+ {
4956+ STDOUT(" deficit exceeds maximum");
4957+ }
4958+ else if (HX_PROGDOWNLD_MAX_TIME_SURPLUS == lTimeSurplus)
4959+ {
4960+ STDOUT(" surplus exceeds maximum)");
4961+ }
4962+ else
4963+ {
4964+ STDOUT(" surplus=%ld milliseconds)", lTimeSurplus);
4965+ }
4966+ if (HX_PROGDOWNLD_UNKNOWN_DURATION == ulNewDurSoFar)
4967+ {
4968+ STDOUT("\n\thave UNKNOWN");
4969+ }
4970+ else
4971+ {
4972+ STDOUT("\n\thave %lu", ulNewDurSoFar);
4973+ }
4974+
4975+ if (HX_PROGDOWNLD_UNKNOWN_DURATION != m_ulTotalDurReported)
4976+ {
4977+ STDOUT(" of %lu msec", m_ulTotalDurReported);
4978+ }
4979+ else
4980+ {
4981+ STDOUT(" of UNKNOWN msec of media");
4982+ }
4983+ if (HX_PROGDOWNLD_UNKNOWN_FILE_SIZE != ulNewBytesSoFar)
4984+ {
4985+ STDOUT(" (%lu", ulNewBytesSoFar);
4986+ }
4987+ else
4988+ {
4989+ STDOUT(" (UNKNOWN");
4990+ }
4991+ STDOUT(" bytes downloaded so far)\n", ulNewBytesSoFar);
4992+
4993+ if (bPauseOccurred || bPauseWasAttempted)
4994+ {
4995+ STDOUT("# Waiting for more data: %splayback.\n "
4996+ " Should take %ld milliseconds before playback resumes.\n",
4997+ bPauseOccurred? "Pausing " :
4998+ (bPauseWasAttempted? "Failed attempting to pause "
4999+ : " "), -lTimeSurplus);
5000+ }
5001+ if (bResumeOccurred || bResumeWasAttempted)
5002+ {
5003+ STDOUT("# Data available: %splayback\n "
5004+ " Time surplus is now %ld",
5005+ bResumeOccurred? "Resuming " :
5006+ (bResumeWasAttempted? "Failed attempting to resume "
5007+ : " "), lTimeSurplus);
5008+ }
5009+ }
5010+
5011+ m_bFirstPDStatusMessage = FALSE;
5012+
5013+ return HXR_OK;
5014+}
5015+
5016+/************************************************************************
5017+ * Method:
5018+ * IHXPDStatusObserver::OnTotalDurChanged
5019+ * Purpose:
5020+ * This is a notification if the total file duration becomes known
5021+ * or becomes better-known during download/playback
5022+ *
5023+ * Note: pStreamSource can be NULL. This will be true when
5024+ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource
5025+ * object.
5026+ */
5027+STDMETHODIMP
5028+ExamplePDStatusObserver::OnTotalDurChanged(
5029+ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource,
5030+ UINT32 ulNewTotalDur)
5031+{
5032+ m_ulTotalDurReported = ulNewTotalDur;
5033+
5034+ if (GetGlobal()->bEnableVerboseMode)
5035+ {
5036+ STDOUT("\nOnTotalDurChanged(): to %lu milliseconds\n", ulNewTotalDur);
5037+ }
5038+
5039+ return HXR_OK;
5040+}
5041+
5042+/************************************************************************
5043+ * Method:
5044+ * IHXPDStatusObserver::OnDownloadComplete
5045+ *
5046+ * Purpose:
5047+ * Notification that the entire file has been downloaded.
5048+ *
5049+ * Note: pStreamSource can be NULL. This will be true when
5050+ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource
5051+ * object.
5052+ *
5053+ */
5054+STDMETHODIMP
5055+ExamplePDStatusObserver::OnDownloadComplete(
5056+ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource)
5057+{
5058+ m_bDownloadIsComplete = TRUE;
5059+
5060+ HXBOOL bResumeWasAttempted = FALSE;
5061+ HXBOOL bResumeOccurred = FALSE;
5062+
5063+ // /In case we're paused, resume now that there is no more data to get:
5064+ if (m_pHXPlayer && m_bPlayerIsPausedByThis)
5065+ {
5066+ bResumeWasAttempted = TRUE;
5067+ bResumeOccurred = (HXR_OK == m_pHXPlayer->Begin());
5068+ m_bPlayerIsPausedByThis = !bResumeOccurred;
5069+ }
5070+
5071+ if (GetGlobal()->bEnableVerboseMode)
5072+ {
5073+ STDOUT("\nOnDownloadComplete()\n");
5074+ if (bResumeOccurred || bResumeWasAttempted)
5075+ {
5076+ STDOUT("\n%splayback now that bytes are available for "
5077+ "uninterrupted playback\n",
5078+ bResumeOccurred? "Resuming " :
5079+ (bResumeWasAttempted? "Failed attempting to resume "
5080+ : " "));
5081+ }
5082+ }
5083+
5084+ return HXR_OK;
5085+}
5086+
5087+/************************************************************************
5088+ * Method:
5089+ * IHXPDStatusObserver::SrcClaimsSeekSupport ref: hxprdnld.h
5090+ * Purpose:
5091+ * Passes along notification from file sys that seek support
5092+ * is or is not claimed to be available (although sometimes HTTP
5093+ * server claims this when it doesn't actually support it).
5094+ */
5095+STDMETHODIMP
5096+ExamplePDStatusObserver::SrcClaimsSeekSupport(IHXStreamSource* pStreamSource,
5097+ HXBOOL bClaimsSupport)
5098+{
5099+ if (GetGlobal()->bEnableVerboseMode)
5100+ {
5101+ STDOUT("\nSrcClaimsSeekSupport(%sE)\n", bClaimsSupport?"TRU":"FALS");
5102+ }
5103+ return HXR_OK;
5104+}
5105+
5106+
5107+/************************************************************************
5108+ * Method:
5109+ * IHXPDStatusObserver::OnDownloadPause
5110+ * Purpose:
5111+ * Notification that the file-download process has purposefully
5112+ * and temporarily halted downloading of the file
5113+ *
5114+ * Note: pStreamSource can be NULL. This will be true when
5115+ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource
5116+ * object.
5117+ */
5118+STDMETHODIMP
5119+ExamplePDStatusObserver::OnDownloadPause(
5120+ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource)
5121+{
5122+ if (GetGlobal()->bEnableVerboseMode)
5123+ {
5124+ STDOUT("\nOnDownloadPause()\n");
5125+ }
5126+ return HXR_OK;
5127+}
5128+
5129+/************************************************************************
5130+ * Method:
5131+ * IHXPDStatusObserver::OnDownloadResume
5132+ * Purpose:
5133+ * Notification that the file-download process has resumed
5134+ * the process of downloading the remainder of the file
5135+ *
5136+ * Note: pStreamSource can be NULL. This will be true when
5137+ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource
5138+ * object.
5139+ */
5140+STDMETHODIMP
5141+ExamplePDStatusObserver::OnDownloadResume(
5142+ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource)
5143+{
5144+ if (GetGlobal()->bEnableVerboseMode)
5145+ {
5146+ STDOUT("\nOnDownloadResume()\n");
5147+ }
5148+ return HXR_OK;
5149+}
5150+// /#endif // /HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS.
5151Index: helix-libs/clientapps/clutter/exprdnld.h
5152===================================================================
5153--- /dev/null 1970-01-01 00:00:00.000000000 +0000
5154+++ helix-libs/clientapps/clutter/exprdnld.h 2008-10-13 06:05:49.000000000 -0700
5155@@ -0,0 +1,196 @@
5156+/* ***** BEGIN LICENSE BLOCK *****
5157+ * Version: RCSL 1.0/RPSL 1.0
5158+ *
5159+ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
5160+ *
5161+ * The contents of this file, and the files included with this file, are
5162+ * subject to the current version of the RealNetworks Public Source License
5163+ * Version 1.0 (the "RPSL") available at
5164+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
5165+ * the file under the RealNetworks Community Source License Version 1.0
5166+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
5167+ * in which case the RCSL will apply. You may also obtain the license terms
5168+ * directly from RealNetworks. You may not use this file except in
5169+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
5170+ * applicable to this file, the RCSL. Please see the applicable RPSL or
5171+ * RCSL for the rights, obligations and limitations governing use of the
5172+ * contents of the file.
5173+ *
5174+ * This file is part of the Helix DNA Technology. RealNetworks is the
5175+ * developer of the Original Code and owns the copyrights in the portions
5176+ * it created.
5177+ *
5178+ * This file, and the files included with this file, is distributed and made
5179+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
5180+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
5181+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
5182+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
5183+ *
5184+ * Technology Compatibility Kit Test Suite(s) Location:
5185+ * http://www.helixcommunity.org/content/tck
5186+ *
5187+ * Contributor(s):
5188+ *
5189+ * ***** END LICENSE BLOCK ***** */
5190+
5191+#ifndef _EXPRDNLD_H_
5192+#define _EXPRDNLD_H_
5193+
5194+// /#if defined(HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS)
5195+
5196+/****************************************************************************
5197+ *
5198+ * Class:
5199+ *
5200+ * ExamplePDStatusObserver
5201+ *
5202+ * Purpose:
5203+ *
5204+ * Implementation for IHXPDStatusObserver which receives progressive-
5205+ * download status reports:
5206+ *
5207+ */
5208+class ExamplePDStatusObserver :
5209+ public IHXPDStatusObserver
5210+{
5211+private:
5212+ INT32 m_lRefCount;
5213+ IHXPDStatusMgr* m_pPrgDnldStatusMgr;
5214+ IUnknown* m_pUnkPlayer;
5215+ IHXPlayer* m_pHXPlayer;
5216+ HXBOOL m_bPlayerIsPausedByThis;
5217+ HXBOOL m_bFirstPDStatusMessage;
5218+ UINT32 m_ulTotalDurReported;
5219+ UINT32 m_ulDurSoFar;
5220+ UINT32 m_ulCurStatusUpdateGranularity;
5221+ HXBOOL m_bInitialPrerollUpateGranularitySet;
5222+ HXBOOL m_bDownloadIsComplete;
5223+
5224+ ExamplePDStatusObserver();
5225+ ~ExamplePDStatusObserver();
5226+
5227+public:
5228+ ExamplePDStatusObserver(IUnknown* pUnkPlayer);
5229+
5230+ /*
5231+ * IUnknown methods
5232+ */
5233+ STDMETHOD(QueryInterface) (THIS_
5234+ REFIID riid,
5235+ void** ppvObj);
5236+
5237+ STDMETHOD_(ULONG32,AddRef) (THIS);
5238+
5239+ STDMETHOD_(ULONG32,Release) (THIS);
5240+
5241+ /*
5242+ * IHXPDStatusObserver methods
5243+ */
5244+
5245+ /************************************************************************
5246+ * Method:
5247+ * IHXPDStatusObserver::OnDownloadProgress
5248+ *
5249+ * Purpose:
5250+ * Notification from IHXPDStatusMgr of download progress when
5251+ * file size changes.
5252+ *
5253+ * lTimeSurplus:
5254+ * - When negative, the absolute value of it is the estimated number
5255+ * of milliseconds of wall-clock time that need to pass while
5256+ * downloading continues before reaching the point at which playback
5257+ * can resume and play the remainder of the stream without having to
5258+ * buffer, assuming that playback is paused and remains so during
5259+ * that period.
5260+ * - When positive, it is the estimated number of milliseconds of
5261+ * wall-clock time between when the download should complete and when
5262+ * the natural content play-out duration will be reached, assuming
5263+ * playback is currently progressing and that no pause will occur.
5264+ *
5265+ * Note: ulNewDurSoFar can be HX_PROGDOWNLD_UNKNOWN_DURATION if the
5266+ * IHXMediaBytesToMediaDurConverter was not available to, or was
5267+ * unable to convert the bytes to a duration for the IHXPDStatusMgr
5268+ * calling this:
5269+ */
5270+ STDMETHOD(OnDownloadProgress) (THIS_
5271+ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource,
5272+ UINT32 /*IN*/ ulNewDurSoFar,
5273+ UINT32 /*IN*/ ulNewBytesSoFar,
5274+ INT32 /*IN*/ lTimeSurplus);
5275+
5276+ /************************************************************************
5277+ * Method:
5278+ * IHXPDStatusObserver::OnTotalDurChanged
5279+ * Purpose:
5280+ * This is a notification if the total file duration becomes known
5281+ * or becomes better-known during download/playback
5282+ *
5283+ * Note: pStreamSource can be NULL. This will be true when
5284+ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource
5285+ * object.
5286+ */
5287+ STDMETHOD(OnTotalDurChanged) (THIS_
5288+ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource,
5289+ UINT32 /*IN*/ ulNewDur);
5290+
5291+ /************************************************************************
5292+ * Method:
5293+ * IHXPDStatusObserver::OnDownloadComplete
5294+ *
5295+ * Purpose:
5296+ * Notification that the entire file has been downloaded.
5297+ *
5298+ * Note: pStreamSource can be NULL. This will be true when
5299+ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource
5300+ * object.
5301+ *
5302+ */
5303+ STDMETHOD(OnDownloadComplete) (THIS_
5304+ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource);
5305+
5306+ /************************************************************************
5307+ * Method:
5308+ * IHXPDStatusObserver::SrcClaimsSeekSupport
5309+ *
5310+ * Purpose:
5311+ * Passes along notification from file sys that seek support
5312+ * is claimed to be available (although sometimes HTTP server
5313+ * claims this when it doesn't actually support it).
5314+ *
5315+ */
5316+ STDMETHOD(SrcClaimsSeekSupport) (THIS_
5317+ IHXStreamSource* pStreamSource,
5318+ HXBOOL /*IN*/ bSrcClaimsSeekSupport);
5319+
5320+ /************************************************************************
5321+ * Method:
5322+ * IHXPDStatusObserver::OnDownloadPause
5323+ * Purpose:
5324+ * Notification that the file-download process has purposefully
5325+ * and temporarily halted downloading of the file
5326+ *
5327+ * Note: pStreamSource can be NULL. This will be true when
5328+ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource
5329+ * object.
5330+ */
5331+ STDMETHOD(OnDownloadPause) (THIS_
5332+ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource);
5333+
5334+ /************************************************************************
5335+ * Method:
5336+ * IHXPDStatusObserver::OnDownloadResume
5337+ * Purpose:
5338+ * Notification that the file-download process has resumed
5339+ * the process of downloading the remainder of the file
5340+ *
5341+ * Note: pStreamSource can be NULL. This will be true when
5342+ * IHXPDStatusMgr calling this is upstream of the IHXStreamSource
5343+ * object.
5344+ */
5345+ STDMETHOD(OnDownloadResume) (THIS_
5346+ IHXStreamSource* /*IN*/ /*NULL is valid value*/ pStreamSource);
5347+};
5348+// /#endif // /HELIX_FEATURE_PROGRESSIVE_DOWNLD_STATUS.
5349+
5350+#endif // _EXPRDNLD_H_
5351+
5352Index: helix-libs/clientapps/clutter/exroot.cpp
5353===================================================================
5354--- /dev/null 1970-01-01 00:00:00.000000000 +0000
5355+++ helix-libs/clientapps/clutter/exroot.cpp 2008-10-13 06:54:08.000000000 -0700
5356@@ -0,0 +1,672 @@
5357+/* ***** BEGIN LICENSE BLOCK *****
5358+ * Source last modified: $Id: unixroot.cpp,v 1.9 2007/07/06 20:54:01 jfinnecy Exp $
5359+ *
5360+ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
5361+ *
5362+ * The contents of this file, and the files included with this file,
5363+ * are subject to the current version of the RealNetworks Public
5364+ * Source License (the "RPSL") available at
5365+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
5366+ * the file under the current version of the RealNetworks Community
5367+ * Source License (the "RCSL") available at
5368+ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
5369+ * will apply. You may also obtain the license terms directly from
5370+ * RealNetworks. You may not use this file except in compliance with
5371+ * the RPSL or, if you have a valid RCSL with RealNetworks applicable
5372+ * to this file, the RCSL. Please see the applicable RPSL or RCSL for
5373+ * the rights, obligations and limitations governing use of the
5374+ * contents of the file.
5375+ *
5376+ * Alternatively, the contents of this file may be used under the
5377+ * terms of the GNU General Public License Version 2 (the
5378+ * "GPL") in which case the provisions of the GPL are applicable
5379+ * instead of those above. If you wish to allow use of your version of
5380+ * this file only under the terms of the GPL, and not to allow others
5381+ * to use your version of this file under the terms of either the RPSL
5382+ * or RCSL, indicate your decision by deleting the provisions above
5383+ * and replace them with the notice and other provisions required by
5384+ * the GPL. If you do not delete the provisions above, a recipient may
5385+ * use your version of this file under the terms of any one of the
5386+ * RPSL, the RCSL or the GPL.
5387+ *
5388+ * This file is part of the Helix DNA Technology. RealNetworks is the
5389+ * developer of the Original Code and owns the copyrights in the
5390+ * portions it created.
5391+ *
5392+ * This file, and the files included with this file, is distributed
5393+ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
5394+ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
5395+ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
5396+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
5397+ * ENJOYMENT OR NON-INFRINGEMENT.
5398+ *
5399+ * Technology Compatibility Kit Test Suite(s) Location:
5400+ * http://www.helixcommunity.org/content/tck
5401+ *
5402+ * Contributor(s):
5403+ *
5404+ * ***** END LICENSE BLOCK ***** */
5405+
5406+// for shared memory
5407+#include <sys/types.h>
5408+#include <sys/ipc.h>
5409+#include <sys/shm.h>
5410+#include <sys/utsname.h>
5411+
5412+#include "hxcom.h"
5413+#include "hxwintyp.h"
5414+#include "hxvsurf.h"
5415+#include "hxslist.h"
5416+#include "colormap.h"
5417+#include "hxprefs.h"
5418+#include "hxtick.h"
5419+#include "hxthread.h"
5420+#include "basesite.h"
5421+#include "exroot.h"
5422+#include "exsite.h"
5423+#include "unixcmap.h"
5424+#include "shmhelp.h"
5425+
5426+// #ifdef _DEBUG
5427+// #include <X11/extensions/xf86vmode.h> //for debug video sync rates..
5428+// #endif
5429+
5430+//Work around AIX problem.
5431+#ifdef _AIX
5432+# define MAX_SHARED_REGIONS ((UINT32)1)
5433+#else
5434+# define MAX_SHARED_REGIONS ((UINT32)9999)
5435+#endif
5436+
5437+CExRootSurf::CExRootSurf(IUnknown* pContext, CHXBaseSite* pSite, on_new_frame_cb_t on_new_frame_cb, void *context )
5438+ : CBaseRootSurface(pContext, pSite)
5439+ , m_bUseShm(FALSE)
5440+ , m_nShmId(0)
5441+ , m_pDisplay(NULL)
5442+ , m_GC(0)
5443+ , m_nScreenNumber(0)
5444+ , m_pXImage(NULL)
5445+ , m_pVisual(NULL)
5446+ , m_unDepth(0)
5447+ , m_pScreen(NULL)
5448+ , m_pYUVScratchBits(NULL)
5449+ , m_nYUVScratchPitch(0)
5450+ , m_pScratchBits(NULL)
5451+ , m_nScratchPitch(0)
5452+ , m_nBitsPerPixel(0)
5453+ , m_nCompositionSize(0)
5454+ , m_on_new_frame_cb(on_new_frame_cb)
5455+ , m_context(context)
5456+{
5457+}
5458+
5459+HX_RESULT CExRootSurf::Init()
5460+{
5461+ //get window and display from main Site.
5462+ HXxWindow* pWindow = m_pSite->GetWindow();
5463+ HX_ASSERT(pWindow);
5464+
5465+ m_pDisplay = (Display*)pWindow->display;
5466+ m_window = (Window)pWindow->window;
5467+
5468+ HX_ASSERT( m_pDisplay );
5469+ HX_ASSERT( m_window );
5470+
5471+ //
5472+ // Now see if our X11 server supports the Shared Memory extension.
5473+ //
5474+ // ShmHelp::Init(m_pDisplay);
5475+ // m_bUseShm = ShmHelp::ShmAvailable();
5476+
5477+ //Create the graphics context
5478+ XGCValues values;
5479+
5480+ XLockDisplay(m_pDisplay);
5481+ m_GC = XCreateGC(m_pDisplay, m_window, 0, &values);
5482+
5483+ //Get X window attributes & visual
5484+ XWindowAttributes attr;
5485+ XGetWindowAttributes(m_pDisplay, m_window, &attr);
5486+ XUnlockDisplay(m_pDisplay);
5487+ m_pVisual = attr.visual;
5488+
5489+ // get visual info & depth
5490+ int nv=0;
5491+ XVisualInfo visInfo;
5492+ memset(&visInfo, 0, sizeof(XVisualInfo));
5493+ XLockDisplay(m_pDisplay);
5494+ visInfo.visualid = XVisualIDFromVisual(m_pVisual);
5495+ XVisualInfo* pVisualInfo = XGetVisualInfo (m_pDisplay, VisualIDMask, &visInfo, &nv);
5496+// m_unDepth = pVisualInfo->depth;
5497+ m_unDepth = 24;
5498+ m_nScreenNumber = DefaultScreen(m_pDisplay);
5499+ m_pScreen = XScreenOfDisplay(m_pDisplay, m_nScreenNumber);
5500+ XUnlockDisplay(m_pDisplay);
5501+ m_colormap = HXGetXColormap(m_pDisplay, m_window);
5502+
5503+ // get pixmap (blt) information for the best depth we can display
5504+ int i=0;
5505+ int nNum=0;
5506+ XLockDisplay(m_pDisplay);
5507+ XPixmapFormatValues *pixmap_formats = XListPixmapFormats(m_pDisplay, &nNum);
5508+ XUnlockDisplay(m_pDisplay);
5509+ if(pixmap_formats)
5510+ {
5511+ for (i=0 ; i<nNum; i++)
5512+ {
5513+ if (pixmap_formats[i].depth == m_unDepth)
5514+ {
5515+ m_nBitsPerPixel = pixmap_formats[i].bits_per_pixel;
5516+ }
5517+ }
5518+ XFree(pixmap_formats);
5519+ pixmap_formats = NULL;
5520+ }
5521+
5522+ memset(&m_bmiSave, 0, sizeof(HXBitmapInfo));
5523+#if 0
5524+ m_bmiSave.bmiHeader.biBitCount = m_nBitsPerPixel;
5525+ m_bmiSave.bmiHeader.biCompression = (m_unDepth==8 ? BI_RGB : BI_BITFIELDS);
5526+ m_bmiSave.un.dwBitMask[0] = pVisualInfo->red_mask;
5527+ m_bmiSave.un.dwBitMask[1] = pVisualInfo->green_mask;
5528+ m_bmiSave.un.dwBitMask[2] = pVisualInfo->blue_mask;
5529+#else
5530+ /* Fake a RGB24 */
5531+ m_nBitsPerPixel = 24;
5532+ m_bmiSave.bmiHeader.biBitCount = m_nBitsPerPixel;
5533+ m_bmiSave.bmiHeader.biCompression = BI_RGB;
5534+#endif
5535+ //Set primary surface CID.
5536+ m_nCompositionSurfaceCID = GetBitmapColor(&m_bmiSave);
5537+ XFree( pVisualInfo );
5538+
5539+// #ifdef _DEBUG
5540+// //Lets find out what Hsync and Vsync rates we have for this display.
5541+// //Ripped from xvidtune.c
5542+// XF86VidModeModeLine mode_line;
5543+// int scrn=0;
5544+// int dot_clock;
5545+// double vsync_hz, HSyncRate,HTotal, VTotal, PixelClock;
5546+// if(XF86VidModeGetModeLine(m_pDisplay, scrn, &dot_clock, &mode_line))
5547+// {
5548+// PixelClock=dot_clock;
5549+// HTotal = mode_line.htotal;
5550+// VTotal = mode_line.vtotal;
5551+// HSyncRate = PixelClock*1000.0/HTotal;
5552+// vsync_hz = HSyncRate/VTotal;
5553+// fprintf( stderr, "This Display's Hsync rate is: %f and Vsync: %f\n",
5554+// HSyncRate, vsync_hz );
5555+// }
5556+
5557+// #endif
5558+
5559+ return HXR_OK;
5560+}
5561+
5562+CExRootSurf::~CExRootSurf()
5563+{
5564+ _DestroyCompositionSurface();
5565+
5566+ if( m_GC )
5567+ {
5568+ XLockDisplay(m_pDisplay);
5569+ XFreeGC( m_pDisplay, m_GC );
5570+ XUnlockDisplay(m_pDisplay);
5571+ m_GC=0;
5572+ }
5573+ if (m_pVisual)
5574+ {
5575+ /* PJG: don't have to free visuals */
5576+ m_pVisual = NULL;
5577+ }
5578+
5579+ if(m_bUseShm)
5580+ {
5581+ if( m_pCompositionSurface != NULL )
5582+ ShmHelp::DetachSharedRegion(&m_pCompositionSurface, &m_shmInfo);
5583+ }
5584+ else
5585+ {
5586+ HX_DELETE(m_pCompositionSurface);
5587+ m_nCompositionSize=0;
5588+ m_bCompositionSurfaceCreated=FALSE;
5589+ }
5590+
5591+ //XXXgfw any more clean up for these two?
5592+ HX_VECTOR_DELETE( m_pScratchBits );
5593+ HX_VECTOR_DELETE( m_pYUVScratchBits );
5594+
5595+}
5596+
5597+HX_RESULT CExRootSurf::_ResizeVideoBuffer( INT32 nSize)
5598+{
5599+ HX_RESULT retVal=HXR_OK;
5600+
5601+ if(nSize <= m_nCompositionSize)
5602+ return retVal;
5603+
5604+ if(m_bUseShm)
5605+ {
5606+ if( m_pCompositionSurface != NULL )
5607+ retVal = ShmHelp::DetachSharedRegion(&m_pCompositionSurface, &m_shmInfo);
5608+ if( retVal==HXR_OK )
5609+ {
5610+ retVal = ShmHelp::CreateSharedRegion( nSize,
5611+ &m_pCompositionSurface,
5612+ &m_nShmId,
5613+ &m_shmInfo
5614+ );
5615+
5616+ }
5617+ if( retVal != HXR_OK )
5618+ {
5619+ m_bCompositionSurfaceCreated = FALSE;
5620+ m_nCompositionSize = 0;
5621+ m_bUseShm = FALSE;
5622+ }
5623+ else
5624+ {
5625+ //It all worked
5626+ m_nCompositionSize = nSize;
5627+ m_bCompositionSurfaceCreated = TRUE;
5628+ return retVal;
5629+ }
5630+
5631+ }
5632+
5633+ //We need to fall through here so that if the shared memory stuff
5634+ //above fails we can create it the old fashioned way.
5635+ if(m_pCompositionSurface == NULL)
5636+ {
5637+ m_pCompositionSurface = (UCHAR*) malloc(nSize);
5638+ }
5639+ else
5640+ {
5641+ m_pCompositionSurface = (UCHAR*) realloc(m_pCompositionSurface, nSize);
5642+ }
5643+ if( m_pCompositionSurface )
5644+ {
5645+ m_nCompositionSize = nSize;
5646+ }
5647+ else
5648+ {
5649+ HX_ASSERT("We can't alloc the composition surface." == NULL );
5650+ m_nCompositionSize = 0;
5651+ }
5652+
5653+ return retVal;
5654+}
5655+
5656+HX_RESULT CExRootSurf::_DebugBlt( UCHAR* pImageData, HXBitmapInfoHeader* pBitmapInfo,
5657+ HXxRect& rDestRect, HXxRect& rSrcRect)
5658+{
5659+ HX_ASSERT( m_window );
5660+ HX_ASSERT( m_pDisplay );
5661+ HX_ASSERT( m_GC );
5662+ XLockDisplay(m_pDisplay);
5663+ XSetForeground( m_pDisplay, m_GC, WhitePixel(m_pDisplay, 0 ));
5664+ XSetBackground( m_pDisplay, m_GC, BlackPixel(m_pDisplay, 0 ));
5665+ XSetLineAttributes(m_pDisplay, m_GC, 5, LineSolid, CapRound, JoinRound );
5666+ XSetForeground( m_pDisplay, m_GC, WhitePixel(m_pDisplay, 0) );
5667+ XFillRectangle( m_pDisplay, m_window, m_GC,
5668+ rDestRect.left, rDestRect.top,
5669+ rDestRect.right-rDestRect.left,
5670+ rDestRect.bottom-rDestRect.top
5671+ );
5672+ XDrawRectangle( m_pDisplay, m_window, m_GC,
5673+ rDestRect.left, rDestRect.top,
5674+ rDestRect.right-rDestRect.left,
5675+ rDestRect.bottom-rDestRect.top
5676+ );
5677+ XUnlockDisplay(m_pDisplay);
5678+ return HXR_OK;
5679+}
5680+
5681+void CExRootSurf::_GetYUVScratchWidthHeight(UINT32* pWidth, UINT32* pHeight)
5682+{
5683+ *pWidth = m_bmiYUVScratch.bmiHeader.biWidth;
5684+ *pHeight = m_bmiYUVScratch.bmiHeader.biHeight;
5685+}
5686+
5687+XImage* CExRootSurf::_GetCompositionSurfaceDrawable()
5688+{
5689+ return m_pXImage;
5690+}
5691+
5692+
5693+
5694+//Not used except for XING.....
5695+void CExRootSurf::_CreateYUVScratchSurface(UINT32 width, UINT32 height)
5696+{
5697+ //Remove old bits....
5698+ HX_DELETE(m_pYUVScratchBits);
5699+
5700+ //Clear BitmapInfo struct....
5701+ memset(&m_bmiYUVScratch, 0, sizeof(HXBitmapInfo));
5702+ int nResult = MakeBitmap( &m_bmiYUVScratch,
5703+ sizeof(m_bmiYUVScratch),
5704+ CID_YUY2,
5705+ width,
5706+ height,
5707+ NULL,
5708+ 0);
5709+ if( nResult )
5710+ {
5711+ m_pYUVScratchBits = new UCHAR[m_bmiYUVScratch.bmiHeader.biSizeImage];
5712+ m_nYUVScratchPitch = GetBitmapPitch(&m_bmiYUVScratch);
5713+ }
5714+}
5715+
5716+
5717+void CExRootSurf::_GetYUVScratchSurfacePointer(UCHAR** pYUVBits, INT32* YUVPitch)
5718+{
5719+ *pYUVBits = m_pYUVScratchBits;
5720+ *YUVPitch = m_nYUVScratchPitch;
5721+}
5722+
5723+HX_RESULT CExRootSurf::CreateScratchSurface( int nCompositionSurfaceCID, HXxSize* pSize)
5724+{
5725+ //Remove old bits....
5726+ HX_DELETE(m_pScratchBits);
5727+
5728+ //Clear BitmapInfo struct....
5729+ memset(&m_bmiScratch, 0, sizeof(HXBitmapInfo));
5730+ int nResult = MakeBitmap( &m_bmiScratch,
5731+ sizeof(m_bmiScratch),
5732+ nCompositionSurfaceCID,
5733+ pSize->cx,
5734+ pSize->cy,
5735+ NULL,
5736+ 0);
5737+ if( nResult )
5738+ {
5739+ m_pScratchBits = new UCHAR[m_bmiScratch.bmiHeader.biSizeImage];
5740+ m_nScratchPitch = GetBitmapPitch(&m_bmiScratch);
5741+ }
5742+
5743+ return nResult? HXR_OK : HXR_FAIL;
5744+}
5745+
5746+HX_RESULT CExRootSurf::ScratchLock(UCHAR** pBits, INT32* pPitch)
5747+{
5748+ *pBits = m_pScratchBits;
5749+ *pPitch = m_nScratchPitch;
5750+ return HXR_OK;
5751+}
5752+
5753+HX_RESULT CExRootSurf::ScratchUnlock(UCHAR* pBits)
5754+{
5755+ return HXR_OK;
5756+}
5757+
5758+HX_RESULT CExRootSurf::_MinimalUnlock(HXxWindow* pWindow)
5759+{
5760+// Window win = m_window;
5761+// HX_ASSERT(win);
5762+// HXxSize hxxSize;
5763+// m_pSite->GetSize(hxxSize);
5764+
5765+// if (m_bUseShm)
5766+// {
5767+// XShmPutImage(m_pDisplay,
5768+// win,
5769+// m_GC,
5770+// m_pXImage,
5771+// 0,
5772+// 0,
5773+// 0,
5774+// 0,
5775+// hxxSize.cx,
5776+// hxxSize.cy,
5777+// False
5778+// );
5779+// }
5780+// else
5781+// {
5782+// XPutImage(m_pDisplay,
5783+// win,
5784+// m_GC,
5785+// m_pXImage,
5786+// 0,
5787+// 0,
5788+// 0,
5789+// 0,
5790+// hxxSize.cx,
5791+// hxxSize.cy
5792+// );
5793+// }
5794+ return HXR_OK;
5795+}
5796+
5797+HX_RESULT CExRootSurf::_LockComposition(UCHAR** pBits, INT32* pPitch)
5798+{
5799+ HX_RESULT retVal = HXR_OK;
5800+ if( !m_bCompositionSurfaceCreated || m_pCompositionSurface==NULL )
5801+ {
5802+ retVal = _CreateCompositionSurface();
5803+ }
5804+ HX_ASSERT( m_pCompositionSurface );
5805+ *pBits = m_pCompositionSurface;
5806+ *pPitch = m_nCompositionPitch;
5807+ return HXR_OK;
5808+}
5809+
5810+
5811+void CExRootSurf::_BltFromScratchToComposition( HXxRect& rDestRect, HXxRect& rSrcRect)
5812+{
5813+ HX_ASSERT( "Not implemented on unix yet...."==NULL );
5814+}
5815+
5816+HX_RESULT CExRootSurf::_CreateCompositionSurface()
5817+{
5818+ HX_RESULT retVal = HXR_FAIL;
5819+
5820+ if(m_bCompositionSurfaceCreated)
5821+ {
5822+ return HXR_OK;
5823+ }
5824+
5825+ HX_ASSERT( !m_bCompositionSurfaceCreated );
5826+ HX_ASSERT( m_pSite );
5827+
5828+ //Create a BMI to describe the composition surface
5829+ HXxSize hxxSize;
5830+ m_pSite->GetSize(hxxSize);
5831+ memcpy(&m_compositionSize, &hxxSize, sizeof(HXxSize)); /* Flawfinder: ignore */
5832+
5833+ // find out how big we want to allocate.
5834+ if (m_pSite->IsFullScreen())
5835+ {
5836+ UINT16 unDummy=0;
5837+ UINT16 unHorzRes=0;
5838+ UINT16 unVertRes=0;
5839+ m_pSite->_GetDeviceCaps(NULL, unDummy, unHorzRes, unVertRes );
5840+ m_allocatedCompositionSize.cx = unHorzRes;
5841+ m_allocatedCompositionSize.cy = unVertRes;
5842+ }
5843+ else
5844+ {
5845+ // we use root surface for BASIC_BLT and it assumes the offset(position)
5846+ // of the root site it cooresponding to is (0, 0).
5847+ //
5848+ // this is not true for "windowless" mode where the root site can be given
5849+ // an offset, as a result, we fail to blt the video.
5850+ //
5851+ // to fix this, we'll take the m_positionOrg into consideration when
5852+ // creating the composition surface, this may not be optimal but good enough
5853+ // for now.
5854+ //
5855+ // similar logic is also added for other platforms, we need to move this
5856+ // common code to the base class when we have chance to clean it up
5857+ if (m_compositionSize.cx && m_compositionSize.cy)
5858+ {
5859+ m_compositionSize.cx += m_pSite->m_positionOrig.x;
5860+ m_compositionSize.cy += m_pSite->m_positionOrig.y;
5861+ }
5862+
5863+ m_allocatedCompositionSize.cx = m_compositionSize.cx;
5864+ m_allocatedCompositionSize.cy = m_compositionSize.cy;
5865+ }
5866+
5867+ //XXXgfw uhhhh, OK.
5868+ if( m_compositionSize.cx > m_allocatedCompositionSize.cx ||
5869+ m_compositionSize.cy > m_allocatedCompositionSize.cy )
5870+ {
5871+ m_allocatedCompositionSize.cx = m_compositionSize.cx;
5872+ m_allocatedCompositionSize.cy = m_compositionSize.cy;
5873+ }
5874+
5875+ //Make the bitmap header struct.
5876+ m_bmiComposition.bmiHeader.biBitCount = m_bmiSave.bmiHeader.biBitCount;
5877+ m_bmiComposition.bmiHeader.biCompression = m_bmiSave.bmiHeader.biCompression;
5878+ m_bmiComposition.un.dwBitMask[0] = m_bmiSave.un.dwBitMask[0];
5879+ m_bmiComposition.un.dwBitMask[1] = m_bmiSave.un.dwBitMask[1];
5880+ m_bmiComposition.un.dwBitMask[2] = m_bmiSave.un.dwBitMask[2];
5881+ int nResult = MakeBitmap( &m_bmiComposition,
5882+ sizeof(m_bmiComposition),
5883+ m_nCompositionSurfaceCID,
5884+ m_allocatedCompositionSize.cx,
5885+ m_allocatedCompositionSize.cy,
5886+ NULL,
5887+ 0
5888+ );
5889+ m_bmiComposition.bmiHeader.biBitCount = m_bmiSave.bmiHeader.biBitCount;
5890+ m_bmiComposition.bmiHeader.biCompression = m_bmiSave.bmiHeader.biCompression;
5891+ m_bmiComposition.un.dwBitMask[0] = m_bmiSave.un.dwBitMask[0];
5892+ m_bmiComposition.un.dwBitMask[1] = m_bmiSave.un.dwBitMask[1];
5893+ m_bmiComposition.un.dwBitMask[2] = m_bmiSave.un.dwBitMask[2];
5894+
5895+ //Now create the bits....
5896+ _ResizeVideoBuffer( m_bmiComposition.bmiHeader.biSizeImage );
5897+ m_nCompositionPitch = GetBitmapPitch( &m_bmiComposition );
5898+
5899+ if( m_pXImage )
5900+ {
5901+ XFree( m_pXImage );
5902+ }
5903+
5904+ if( m_bUseShm )
5905+ {
5906+ XLockDisplay(m_pDisplay);
5907+ m_pXImage = XShmCreateImage( m_pDisplay,
5908+ m_pVisual,
5909+ m_unDepth,
5910+ ZPixmap,
5911+ (char*)m_pCompositionSurface,
5912+ &m_shmInfo,
5913+ m_allocatedCompositionSize.cx,
5914+ m_allocatedCompositionSize.cy
5915+ );
5916+ XUnlockDisplay(m_pDisplay);
5917+ }
5918+ else
5919+ {
5920+ XLockDisplay(m_pDisplay);
5921+ m_pXImage = XCreateImage( m_pDisplay,
5922+ m_pVisual,
5923+ m_unDepth,
5924+ ZPixmap,
5925+ 0,
5926+ (char*)m_pCompositionSurface,
5927+ m_allocatedCompositionSize.cx,
5928+ m_allocatedCompositionSize.cy,
5929+ 32,
5930+ 0);
5931+ XUnlockDisplay(m_pDisplay);
5932+ }
5933+
5934+ if( m_pXImage )
5935+ {
5936+ m_bCompositionSurfaceCreated = TRUE;
5937+#ifdef _BIG_ENDIAN
5938+ m_pXImage->byte_order = MSBFirst;
5939+#else
5940+ m_pXImage->byte_order = LSBFirst;
5941+#endif
5942+ retVal = HXR_OK;
5943+ }
5944+ return retVal;
5945+}
5946+
5947+void CExRootSurf::_MinimalBlt(HXxRect& destRect)
5948+{
5949+ if (m_on_new_frame_cb)
5950+ {
5951+ PlayerImgInfo Info;
5952+ Info.Rect.left = destRect.left;
5953+ Info.Rect.right = destRect.right;
5954+ Info.Rect.top = destRect.top;
5955+ Info.Rect.bottom = destRect.bottom;
5956+ Info.cx = m_allocatedCompositionSize.cx;
5957+ Info.cy = m_allocatedCompositionSize.cy;
5958+ m_on_new_frame_cb(m_pCompositionSurface,
5959+ m_bmiComposition.bmiHeader.biSizeImage,
5960+ &Info,
5961+ m_context);
5962+ }
5963+}
5964+
5965+HX_RESULT CExRootSurf::_DestroyCompositionSurface()
5966+{
5967+ HX_RESULT retVal = HXR_OK;
5968+ if( m_bCompositionSurfaceCreated )
5969+ {
5970+ if( m_pXImage )
5971+ {
5972+ XFree(m_pXImage);
5973+ m_pXImage = NULL;
5974+ }
5975+ m_bCompositionSurfaceCreated = FALSE;
5976+ }
5977+
5978+ return retVal;
5979+}
5980+
5981+
5982+
5983+HX_RESULT CExRootSurf::BeginOptimizedBlt(HXBitmapInfoHeader* pBitmapInfo)
5984+{
5985+#ifdef _DEBUG
5986+ fprintf(stderr, "CExRootSurf::BeginOptimizedBlt Needs to be written\n" );
5987+#endif
5988+ return HXR_NOTIMPL;
5989+}
5990+
5991+HX_RESULT CExRootSurf::OptimizedBlt( UCHAR* pImageBits,
5992+ HXxRect& rDestRect,
5993+ HXxRect& rSrcRect)
5994+{
5995+#ifdef _DEBUG
5996+ fprintf(stderr, "CExRootSurf::OptimizedBlt Needs to be written\n" );
5997+#endif
5998+ return HXR_NOTIMPL;
5999+}
6000+
6001+HX_RESULT CExRootSurf::EndOptimizedBlt(void)
6002+{
6003+#ifdef _DEBUG
6004+ fprintf(stderr, "CExRootSurf::EndOptimizedBlt Needs to be written\n" );
6005+#endif
6006+ return HXR_NOTIMPL;
6007+}
6008+
6009+HX_RESULT CExRootSurf::GetOptimizedFormat(HX_COMPRESSION_TYPE& ulType)
6010+{
6011+#ifdef _DEBUG
6012+ fprintf(stderr, "CExRootSurf::GetOptimizedFormat Needs to be written\n" );
6013+#endif
6014+ return HXR_NOTIMPL;
6015+}
6016+
6017+HX_RESULT CExRootSurf::GetPreferredFormat(HX_COMPRESSION_TYPE& ulType)
6018+{
6019+#ifdef _DEBUG
6020+ fprintf(stderr, "CExRootSurf::GetPreferredFormat Needs to be written\n" );
6021+#endif
6022+ return HXR_NOTIMPL;
6023+}
6024+
6025+GC CExRootSurf::GetGC()
6026+{
6027+ return m_GC;
6028+}
6029Index: helix-libs/clientapps/clutter/exroot.h
6030===================================================================
6031--- /dev/null 1970-01-01 00:00:00.000000000 +0000
6032+++ helix-libs/clientapps/clutter/exroot.h 2008-10-13 06:05:49.000000000 -0700
6033@@ -0,0 +1,155 @@
6034+/* ***** BEGIN LICENSE BLOCK *****
6035+ * Source last modified: $Id: unixroot.h,v 1.8 2007/07/06 20:54:05 jfinnecy Exp $
6036+ *
6037+ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
6038+ *
6039+ * The contents of this file, and the files included with this file,
6040+ * are subject to the current version of the RealNetworks Public
6041+ * Source License (the "RPSL") available at
6042+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
6043+ * the file under the current version of the RealNetworks Community
6044+ * Source License (the "RCSL") available at
6045+ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
6046+ * will apply. You may also obtain the license terms directly from
6047+ * RealNetworks. You may not use this file except in compliance with
6048+ * the RPSL or, if you have a valid RCSL with RealNetworks applicable
6049+ * to this file, the RCSL. Please see the applicable RPSL or RCSL for
6050+ * the rights, obligations and limitations governing use of the
6051+ * contents of the file.
6052+ *
6053+ * Alternatively, the contents of this file may be used under the
6054+ * terms of the GNU General Public License Version 2 (the
6055+ * "GPL") in which case the provisions of the GPL are applicable
6056+ * instead of those above. If you wish to allow use of your version of
6057+ * this file only under the terms of the GPL, and not to allow others
6058+ * to use your version of this file under the terms of either the RPSL
6059+ * or RCSL, indicate your decision by deleting the provisions above
6060+ * and replace them with the notice and other provisions required by
6061+ * the GPL. If you do not delete the provisions above, a recipient may
6062+ * use your version of this file under the terms of any one of the
6063+ * RPSL, the RCSL or the GPL.
6064+ *
6065+ * This file is part of the Helix DNA Technology. RealNetworks is the
6066+ * developer of the Original Code and owns the copyrights in the
6067+ * portions it created.
6068+ *
6069+ * This file, and the files included with this file, is distributed
6070+ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
6071+ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
6072+ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
6073+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
6074+ * ENJOYMENT OR NON-INFRINGEMENT.
6075+ *
6076+ * Technology Compatibility Kit Test Suite(s) Location:
6077+ * http://www.helixcommunity.org/content/tck
6078+ *
6079+ * Contributor(s):
6080+ *
6081+ * ***** END LICENSE BLOCK ***** */
6082+
6083+#ifndef _UNIXROOT_H
6084+#define _UNIXROOT_H
6085+
6086+#include "baseroot.h"
6087+#if defined(USE_XWINDOWS)
6088+#include <X11/Xatom.h>
6089+#include <X11/Xlib.h>
6090+#include <X11/Xutil.h>
6091+#include <X11/Xos.h>
6092+#include <X11/Intrinsic.h>
6093+#include <X11/extensions/XShm.h>
6094+#endif
6095+
6096+#include "player.h"
6097+
6098+class CExRootSurf : public CBaseRootSurface
6099+{
6100+public:
6101+ CExRootSurf(IUnknown* pContext, CHXBaseSite* pSite, on_new_frame_cb_t on_new_frame_cb = NULL, void *context = NULL);
6102+
6103+ //Helpers....
6104+ HX_RESULT Init();
6105+ GC GetGC();
6106+
6107+ //public inherited stuff
6108+ virtual HX_RESULT CreateScratchSurface(int nCompositionSurfaceCID,
6109+ HXxSize* pSize);
6110+ virtual HX_RESULT ScratchLock(UCHAR** pBits, INT32* pPitch);
6111+ virtual HX_RESULT ScratchUnlock(UCHAR* pBits);
6112+
6113+ virtual HX_RESULT BeginOptimizedBlt(HXBitmapInfoHeader* pBitmapInfo);
6114+ virtual HX_RESULT OptimizedBlt( UCHAR* pImageBits,
6115+ HXxRect& rDestRect,
6116+ HXxRect& rSrcRect);
6117+ virtual HX_RESULT EndOptimizedBlt(void);
6118+ virtual HX_RESULT GetOptimizedFormat(HX_COMPRESSION_TYPE& ulType);
6119+ virtual HX_RESULT GetPreferredFormat(HX_COMPRESSION_TYPE& ulType);
6120+
6121+ XImage* _GetCompositionSurfaceDrawable();
6122+
6123+ //Shared Memory helper func for the basesurf to use.
6124+// HX_RESULT _DetachSharedRegion();
6125+// HX_RESULT _CreateSharedRegion(INT32 nSize);
6126+
6127+protected:
6128+
6129+ //Smartly handle resizing of shm buffer.
6130+ HX_RESULT _ResizeVideoBuffer(INT32 nSize);
6131+
6132+ //Inherited from CBaseRootSurface....
6133+ virtual void _BltFromScratchToComposition(HXxRect& rDestRect,
6134+ HXxRect& rSrcRect);
6135+ virtual HX_RESULT _DebugBlt( UCHAR* pImageData,
6136+ HXBitmapInfoHeader* pBitmapInfo,
6137+ HXxRect& rDestRect,
6138+ HXxRect& rSrcRect);
6139+ virtual void _GetYUVScratchWidthHeight(UINT32* pWidth, UINT32* pHeight);
6140+ virtual void _CreateYUVScratchSurface(UINT32 width, UINT32 height);
6141+ virtual void _GetYUVScratchSurfacePointer(UCHAR** pYUVBits, INT32* YUVPitch);
6142+ virtual HX_RESULT _MinimalUnlock(HXxWindow* pWindow);
6143+ virtual HX_RESULT _LockComposition(UCHAR** pBits, INT32* pPitch);
6144+ virtual HX_RESULT _CreateCompositionSurface();
6145+ virtual HX_RESULT _DestroyCompositionSurface();
6146+ virtual void _MinimalBlt(HXxRect& dest);
6147+
6148+
6149+private:
6150+
6151+ virtual ~CExRootSurf();
6152+
6153+ //Protect unintentional copy and default ctors.
6154+ CExRootSurf();
6155+ CExRootSurf( const CExRootSurf& );
6156+ CExRootSurf& operator=( const CExRootSurf& it );
6157+
6158+ //Shared memory members.
6159+ HXBOOL m_bUseShm;
6160+ XShmSegmentInfo m_shmInfo;
6161+ int m_nShmId;
6162+
6163+ //General display and GC stuff.
6164+ Display* m_pDisplay;
6165+ GC m_GC;
6166+ int m_nScreenNumber;
6167+ XImage* m_pXImage;
6168+ Window m_window;
6169+ Visual* m_pVisual;
6170+ unsigned int m_unDepth;
6171+ Screen* m_pScreen;
6172+ Colormap m_colormap;
6173+ int m_nBitsPerPixel;
6174+
6175+ //Bitmap stuff.
6176+ UCHAR* m_pYUVScratchBits;
6177+ HXBitmapInfo m_bmiYUVScratch;
6178+ int m_nYUVScratchPitch;
6179+ UCHAR* m_pScratchBits;
6180+ HXBitmapInfo m_bmiScratch;
6181+ int m_nScratchPitch;
6182+ HXBitmapInfo m_bmiSave;
6183+ ULONG32 m_nCompositionSize;
6184+ on_new_frame_cb_t m_on_new_frame_cb;
6185+ void * m_context;
6186+};
6187+
6188+#endif
6189Index: helix-libs/clientapps/clutter/exsite.cpp
6190===================================================================
6191--- /dev/null 1970-01-01 00:00:00.000000000 +0000
6192+++ helix-libs/clientapps/clutter/exsite.cpp 2008-10-13 06:05:49.000000000 -0700
6193@@ -0,0 +1,2915 @@
6194+/* ***** BEGIN LICENSE BLOCK *****
6195+ * Source last modified: $Id: unixsite.cpp,v 1.18.2.6 2008/06/05 14:24:30 lovish Exp $
6196+ *
6197+ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
6198+ *
6199+ * The contents of this file, and the files included with this file,
6200+ * are subject to the current version of the RealNetworks Public
6201+ * Source License (the "RPSL") available at
6202+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
6203+ * the file under the current version of the RealNetworks Community
6204+ * Source License (the "RCSL") available at
6205+ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
6206+ * will apply. You may also obtain the license terms directly from
6207+ * RealNetworks. You may not use this file except in compliance with
6208+ * the RPSL or, if you have a valid RCSL with RealNetworks applicable
6209+ * to this file, the RCSL. Please see the applicable RPSL or RCSL for
6210+ * the rights, obligations and limitations governing use of the
6211+ * contents of the file.
6212+ *
6213+ * Alternatively, the contents of this file may be used under the
6214+ * terms of the GNU General Public License Version 2 (the
6215+ * "GPL") in which case the provisions of the GPL are applicable
6216+ * instead of those above. If you wish to allow use of your version of
6217+ * this file only under the terms of the GPL, and not to allow others
6218+ * to use your version of this file under the terms of either the RPSL
6219+ * or RCSL, indicate your decision by deleting the provisions above
6220+ * and replace them with the notice and other provisions required by
6221+ * the GPL. If you do not delete the provisions above, a recipient may
6222+ * use your version of this file under the terms of any one of the
6223+ * RPSL, the RCSL or the GPL.
6224+ *
6225+ * This file is part of the Helix DNA Technology. RealNetworks is the
6226+ * developer of the Original Code and owns the copyrights in the
6227+ * portions it created.
6228+ *
6229+ * This file, and the files included with this file, is distributed
6230+ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
6231+ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
6232+ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
6233+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
6234+ * ENJOYMENT OR NON-INFRINGEMENT.
6235+ *
6236+ * Technology Compatibility Kit Test Suite(s) Location:
6237+ * http://www.helixcommunity.org/content/tck
6238+ *
6239+ * Contributor(s):
6240+ * Phil Dibowitz
6241+ *
6242+ * ***** END LICENSE BLOCK ***** */
6243+
6244+#ifndef _UNIX
6245+#error This is the UNIX platform specific implementation.
6246+#endif
6247+
6248+//
6249+// System includes...
6250+//
6251+#include <stdio.h>
6252+#include "hlxclib/string.h"
6253+#if defined(USE_XWINDOWS)
6254+#include <X11/Intrinsic.h>
6255+#include <X11/Shell.h>
6256+#include <X11/Xlib.h>
6257+#include <X11/Xutil.h>
6258+#include <X11/keysym.h>
6259+#include <X11/Xos.h>
6260+#include <X11/cursorfont.h>
6261+#include <X11/extensions/XShm.h>
6262+#endif
6263+
6264+
6265+//
6266+// RMA includes...
6267+//
6268+#include "hxcom.h"
6269+#include "hxcore.h"
6270+#include "hxevent.h"
6271+#include "hxwintyp.h"
6272+#include "hxwin.h"
6273+#include "hxsite2.h"
6274+#include "hxtypes.h"
6275+#include "exsite.h"
6276+#include "unixcmap.h"
6277+#include "visuals.h"
6278+#include "region.h"
6279+#include "basesurf.h"
6280+#include "exroot.h"
6281+#include "hxthread.h"
6282+#include "hxtick.h"
6283+#include "sitetext.h"
6284+
6285+#include "unixsurf.h"
6286+
6287+#include "hxprefs.h"
6288+
6289+//
6290+// Global & Static global/member data....
6291+//
6292+Display *CHXExSite::zm_display = NULL;
6293+static CHXMapPtrToPtr z_mapSiteToWindow;
6294+
6295+//
6296+// Scroll bar support
6297+//
6298+#define SCROLL_BAR_WIDTH 13 //Width of scroll bar.
6299+//#define _ARROWS_SIDE_BY_SIDE 1 //Regular or side by side arrows?
6300+
6301+
6302+
6303+
6304+//
6305+// CHXExSite only Methods...
6306+//
6307+CHXExSite::CHXExSite( IUnknown* pContext, IUnknown* pUnkOuter, INT32 lInitialZorder, on_new_frame_cb_t on_new_frame_cb, void *context)
6308+ : CHXBaseSite( pContext, pUnkOuter, lInitialZorder )
6309+ , m_pUnixEventHandler(NULL)
6310+ , m_ScrollHorizButtonL(0)
6311+ , m_ScrollHorizButtonR(0)
6312+ , m_ScrollVertButtonT(0)
6313+ , m_ScrollVertButtonB(0)
6314+ , m_winFullScreenWindow(0)
6315+ , m_winOldParent(0)
6316+ , m_bScrollingInProgress(FALSE)
6317+ , m_nScrollDir(0)
6318+ , m_bLastPointInSite(FALSE)
6319+ , m_bDamaged(FALSE)
6320+ , m_bIgnoreFocusOutInFS(FALSE)
6321+ , m_bReparent(FALSE)
6322+ , m_on_new_frame_cb(on_new_frame_cb)
6323+ , m_context(context)
6324+#if defined(HELIX_CONFIG_MOBLIN)
6325+ , m_pAttachWindowCallback(NULL)
6326+ , m_pForceRedrawCallback(NULL)
6327+#endif
6328+{
6329+ m_ptScrollVertPosT.x = m_ptScrollVertPosT.y = 0;
6330+ m_ptScrollVertPosB.x = m_ptScrollVertPosB.y = 0;
6331+ m_ptScrollHorizPosR.x = m_ptScrollHorizPosR.y = 0;
6332+ m_ptScrollHorizPosL.x = m_ptScrollHorizPosL.y = 0;
6333+ m_ptFullScreenOffset.x = m_ptFullScreenOffset.y = 0;
6334+ memset( &m_PreFullScreenSize, 0, sizeof( m_PreFullScreenSize ) );
6335+
6336+ HX_ASSERT( m_pContext );
6337+
6338+ /* Replace m_pVideoSurface with my own */
6339+/* HX_RELEASE(m_pVideoSurface);
6340+ m_pVideoSurface = new CUnixSurf(m_pContext, this);
6341+ HX_ASSERT( m_pVideoSurface );
6342+ m_pVideoSurface->InitSurface(m_pContext);
6343+ m_pVideoSurface->AddRef();
6344+*/
6345+ IHXPreferences* pPreferences = NULL;
6346+ if( m_pContext && HXR_OK == m_pContext->QueryInterface( IID_IHXPreferences, (void **) &pPreferences))
6347+ {
6348+ IHXBuffer *pBuffer = NULL;
6349+ pPreferences->ReadPref("IgnoreFocusOutInFS", pBuffer);
6350+ if(pBuffer)
6351+ {
6352+ m_bIgnoreFocusOutInFS = (::atoi((const char*)pBuffer->GetBuffer()) == 1);
6353+ HX_RELEASE(pBuffer);
6354+ }
6355+ }
6356+}
6357+
6358+CHXExSite::~CHXExSite()
6359+{
6360+#if defined(HELIX_CONFIG_MOBLIN)
6361+ RemovePendingCallback(m_pAttachWindowCallback);
6362+ HX_RELEASE(m_pAttachWindowCallback);
6363+
6364+ RemovePendingCallback(m_pForceRedrawCallback);
6365+ HX_RELEASE(m_pForceRedrawCallback);
6366+#endif
6367+ void* pDummy;
6368+ if (z_mapSiteToWindow.Lookup((void*)this, pDummy))
6369+ {
6370+ z_mapSiteToWindow.RemoveKey((void*)this);
6371+ }
6372+
6373+ if( m_pUnixEventHandler )
6374+ {
6375+ m_pUnixEventHandler->CancelCallback();
6376+ HX_RELEASE(m_pUnixEventHandler);
6377+ }
6378+}
6379+
6380+HX_RESULT CHXExSite::_OpenXDisplay(char* pszDisplayString)
6381+{
6382+ HX_RESULT retVal = HXR_OK;
6383+
6384+ //Is the connection open already?
6385+ if( NULL==zm_display )
6386+ {
6387+ zm_display = XOpenDisplay(pszDisplayString);
6388+
6389+ //If you can't open the display your done.
6390+ if(NULL == zm_display )
6391+ {
6392+ HX_ASSERT("Can't open X Display..."==NULL);
6393+ retVal = HXR_FAIL;
6394+ }
6395+ else
6396+ {
6397+ HX_ASSERT(m_pScheduler);
6398+ if( m_pScheduler )
6399+ {
6400+ //UnixEventHandler scheduls itself for init callback
6401+ //in the ctor.
6402+ m_pUnixEventHandler = new UnixEventHandler(this);
6403+ m_pUnixEventHandler->AddRef();
6404+ }
6405+ }
6406+ }
6407+ return retVal;
6408+}
6409+
6410+Window CHXExSite::CreateXWindow( Window win )
6411+{
6412+ Window parentWindow;
6413+ HXxWindow* pWindow = NULL;
6414+ //If parentWin is NULL then we belong to the root window.
6415+ if( win )
6416+ {
6417+ parentWindow = win;
6418+ }
6419+ else
6420+ {
6421+ HX_ASSERT(zm_display);
6422+ XLockDisplay(zm_display);
6423+ parentWindow = RootWindow(zm_display, DefaultScreen(zm_display));
6424+ XUnlockDisplay(zm_display);
6425+ }
6426+
6427+ //Find the best visual to use on this display.
6428+ Visual* visual = GetBestVisual(zm_display);
6429+
6430+ //Get the visual info.
6431+ int nNotUsed=0;
6432+ XVisualInfo stVisInfo;
6433+
6434+ memset(&stVisInfo, 0, sizeof(XVisualInfo));
6435+ stVisInfo.visualid = XVisualIDFromVisual(visual);
6436+ XLockDisplay(zm_display);
6437+ XVisualInfo* pVisual = XGetVisualInfo( zm_display,
6438+ VisualIDMask,
6439+ &stVisInfo,
6440+ &nNotUsed );
6441+ XUnlockDisplay(zm_display);
6442+
6443+ // Set up attributes of the window.
6444+ int attrMask = CWBackPixel | CWBorderPixel;
6445+ XSetWindowAttributes attr;
6446+
6447+ memset(&attr, 0, sizeof(XSetWindowAttributes));
6448+ XLockDisplay(zm_display);
6449+ attr.background_pixel = BlackPixel(zm_display, DefaultScreen(zm_display));
6450+ attr.border_pixel = BlackPixel(zm_display, DefaultScreen(zm_display));
6451+ XUnlockDisplay(zm_display);
6452+
6453+ //See if the default visaul of hte screen is the same one we Want
6454+ //to use. If not, create a new one and install it.
6455+ Colormap cmap;
6456+ XLockDisplay(zm_display);
6457+ Visual* defVisual = DefaultVisual(zm_display, DefaultScreen(zm_display));
6458+ XUnlockDisplay(zm_display);
6459+ if( defVisual->visualid != stVisInfo.visualid )
6460+ {
6461+ //XXXgfw Are we leaking this colormap????
6462+ XLockDisplay(zm_display);
6463+ cmap = XCreateColormap(zm_display, parentWindow, visual, AllocNone);
6464+ XUnlockDisplay(zm_display);
6465+ attr.colormap = cmap;
6466+ attrMask |= CWColormap;
6467+ }
6468+
6469+ // Set the size/position of the window before creating.
6470+ XSizeHints size_hints;
6471+
6472+ size_hints.flags = PPosition | PSize;
6473+ size_hints.x = m_position.x;
6474+ size_hints.y = m_position.y;
6475+ size_hints.width = 1;
6476+ size_hints.height = 1;
6477+
6478+ //Create it.
6479+ XLockDisplay(zm_display);
6480+ Window window = XCreateWindow(zm_display,
6481+ parentWindow,
6482+ size_hints.x,
6483+ size_hints.y,
6484+ size_hints.width,
6485+ size_hints.height,
6486+ 0,
6487+ pVisual->depth,
6488+ InputOutput,
6489+ visual,
6490+ attrMask,
6491+ &attr);
6492+ XUnlockDisplay(zm_display);
6493+ XFree(pVisual);
6494+
6495+ //Tell the WM about this window.
6496+#if 0
6497+ XSetStandardProperties( zm_display,
6498+ window,
6499+ "CHXExSite",
6500+ "CHXExSite",
6501+ None,
6502+ NULL, 0,
6503+ &size_hints
6504+ );
6505+#endif
6506+
6507+ //Select all input events on the window since the other platforms
6508+ //we work with have no concept of event masks
6509+ XLockDisplay(zm_display);
6510+#if 0
6511+ int result = XSelectInput( zm_display, window,
6512+ ButtonPressMask | ButtonReleaseMask | KeyPressMask |
6513+ KeyReleaseMask | EnterWindowMask | LeaveWindowMask |
6514+ PointerMotionMask | ButtonMotionMask | KeymapStateMask |
6515+ ExposureMask | StructureNotifyMask | FocusChangeMask
6516+ );
6517+#else
6518+ int result = XSelectInput( zm_display, window, 0 );
6519+
6520+
6521+#endif
6522+ XUnlockDisplay(zm_display);
6523+ if( BadWindow == result )
6524+ {
6525+#ifdef _DEBUG
6526+ fprintf( stderr, "Can select events.\n" );
6527+#endif
6528+ }
6529+
6530+ //Map the window.
6531+ XLockDisplay(zm_display);
6532+ /* XMapWindow(zm_display, window); */
6533+
6534+ //Flush event queue.
6535+ XFlush(zm_display);
6536+ XUnlockDisplay(zm_display);
6537+
6538+
6539+ return window;
6540+}
6541+
6542+void CHXExSite::_MapHorzScroll()
6543+{
6544+#if 0
6545+ if( GetWindow() && GetWindow()->display && m_ScrollHorizButtonL)
6546+ {
6547+ Display* pDis = (Display*)GetWindow()->display;
6548+ XLockDisplay(pDis);
6549+ XMapWindow( pDis, m_ScrollHorizButtonL );
6550+ XMapWindow( pDis, m_ScrollHorizButtonR );
6551+ XUnlockDisplay(pDis);
6552+ }
6553+ _DrawArrows();
6554+#endif
6555+}
6556+
6557+void CHXExSite::_MapVertScroll()
6558+{
6559+#if 0
6560+ if( GetWindow() && GetWindow()->display && m_ScrollVertButtonT)
6561+ {
6562+ Display* pDis = (Display*)GetWindow()->display;
6563+ XLockDisplay(pDis);
6564+ XMapWindow( pDis, m_ScrollVertButtonT );
6565+ XMapWindow( pDis, m_ScrollVertButtonB );
6566+ XUnlockDisplay(pDis);
6567+ }
6568+ _DrawArrows();
6569+#endif
6570+}
6571+
6572+void CHXExSite::_MapScrollButtons()
6573+{
6574+#if 0
6575+ _MapHorzScroll();
6576+ _MapVertScroll();
6577+#endif
6578+}
6579+
6580+void CHXExSite::_UnmapHorzScroll()
6581+{
6582+#if 0
6583+ HX_ASSERT( GetWindow() );
6584+ if( m_ScrollHorizButtonL && GetWindow()->display )
6585+ {
6586+ Display* pDis = (Display*)GetWindow()->display;
6587+ XLockDisplay(pDis);
6588+ XUnmapWindow( pDis, m_ScrollHorizButtonL );
6589+ XUnmapWindow( pDis, m_ScrollHorizButtonR );
6590+ XUnlockDisplay(pDis);
6591+ }
6592+#endif
6593+}
6594+void CHXExSite::_UnmapVertScroll()
6595+{
6596+#if 0
6597+ HX_ASSERT( GetWindow() );
6598+ if( m_ScrollVertButtonT && GetWindow()->display )
6599+ {
6600+ Display* pDis = (Display*)GetWindow()->display;
6601+ XLockDisplay(pDis);
6602+ XUnmapWindow( pDis, m_ScrollVertButtonT );
6603+ XUnmapWindow( pDis, m_ScrollVertButtonB );
6604+ XUnlockDisplay(pDis);
6605+ }
6606+#endif
6607+}
6608+
6609+void CHXExSite::_UnmapScrollButtons()
6610+{
6611+#if 0
6612+ if( GetWindow() )
6613+ {
6614+ _UnmapVertScroll();
6615+ _UnmapHorzScroll();
6616+ }
6617+#endif
6618+}
6619+
6620+void CHXExSite::_DestroyScrollButtons()
6621+{
6622+ HXxWindow* pWin = GetWindow();
6623+ Display* pDis = (Display*)(pWin?pWin->display:NULL);
6624+
6625+ if( m_ScrollHorizButtonL && pDis )
6626+ {
6627+ XLockDisplay(pDis);
6628+ XDestroyWindow( pDis, m_ScrollHorizButtonL );
6629+ m_ScrollHorizButtonL = 0;
6630+ XDestroyWindow( pDis, m_ScrollHorizButtonR );
6631+ XUnlockDisplay(pDis);
6632+ m_ScrollHorizButtonR = 0;
6633+ }
6634+
6635+ if( m_ScrollVertButtonT && pDis)
6636+ {
6637+ XLockDisplay(pDis);
6638+ XDestroyWindow( pDis, m_ScrollVertButtonT );
6639+ m_ScrollVertButtonT = 0;
6640+ XDestroyWindow( pDis, m_ScrollVertButtonB );
6641+ XUnlockDisplay(pDis);
6642+ m_ScrollVertButtonB = 0;
6643+ }
6644+ m_ptScrollVertPosT.x = m_ptScrollVertPosT.y = 0;
6645+ m_ptScrollVertPosB.x = m_ptScrollVertPosB.y = 0;
6646+ m_ptScrollHorizPosR.x = m_ptScrollHorizPosR.y = 0;
6647+ m_ptScrollHorizPosL.x = m_ptScrollHorizPosL.y = 0;
6648+}
6649+
6650+void CHXExSite::_DrawArrows()
6651+{
6652+#if 0 //Paul Debug
6653+ //only do the work if our site is visible.
6654+ if( !IsSiteVisible() )
6655+ return;
6656+
6657+ //Draw an arrow on this window.
6658+ XPoint points[4];
6659+ int offset = SCROLL_BAR_WIDTH/10;
6660+ GC tmpGC;
6661+ XGCValues values;
6662+ Display* dis = (Display*)GetWindow()->display;
6663+
6664+ if( m_ScrollVertButtonB )
6665+ {
6666+ XLockDisplay(dis);
6667+ tmpGC = XCreateGC( dis, m_ScrollVertButtonB, 0, &values );
6668+ XUnlockDisplay(dis);
6669+ }
6670+ else if( m_ScrollHorizButtonL )
6671+ {
6672+ XLockDisplay(dis);
6673+ tmpGC = XCreateGC( dis, m_ScrollHorizButtonL, 0, &values );
6674+ XUnlockDisplay(dis);
6675+ }
6676+ else
6677+ {
6678+ //We don't have any scroll bars to draw....
6679+ return;
6680+ }
6681+
6682+
6683+ XLockDisplay(dis);
6684+ XSetForeground( dis, tmpGC, WhitePixel(dis, 0 ));
6685+ XSetBackground( dis, tmpGC, BlackPixel(dis, 0 ));
6686+ XUnlockDisplay(dis);
6687+ Colormap cmap = HXGetXColormap((Display*)GetWindow()->display,
6688+ (Window)GetWindow()->window);
6689+ XColor color;
6690+
6691+ memset(&color, 0, sizeof(XColor));
6692+ XLockDisplay(dis);
6693+ XParseColor(dis, cmap, "blue", &color);
6694+ XUnlockDisplay(dis);
6695+ HXFindBestXColor(dis, cmap, &color);
6696+ XLockDisplay(dis);
6697+ XSetForeground( dis, tmpGC, color.pixel);
6698+ XSetLineAttributes(dis, tmpGC, 1, LineSolid, CapRound, JoinRound );
6699+ XUnlockDisplay(dis);
6700+
6701+
6702+ //Draw up Vertical arrow.
6703+ if( m_ScrollVertButtonT )
6704+ {
6705+ points[0].x = offset;
6706+ points[0].y = SCROLL_BAR_WIDTH-offset;
6707+ points[1].x = SCROLL_BAR_WIDTH/2;
6708+ points[1].y = offset;
6709+ points[2].x = SCROLL_BAR_WIDTH-offset;
6710+ points[2].y = SCROLL_BAR_WIDTH-offset;
6711+ points[3].x = points[0].x;
6712+ points[3].y = points[0].y;
6713+ XLockDisplay(dis);
6714+ XFillPolygon( dis, m_ScrollVertButtonT, tmpGC, points, 4, Convex, CoordModeOrigin);
6715+ XUnlockDisplay(dis);
6716+ }
6717+
6718+ //Draw down Vertical arrow.
6719+ if( m_ScrollVertButtonB )
6720+ {
6721+ points[0].x = offset;
6722+ points[0].y = offset;
6723+ points[1].x = SCROLL_BAR_WIDTH-offset;
6724+ points[1].y = offset;
6725+ points[2].x = SCROLL_BAR_WIDTH/2;
6726+ points[2].y = SCROLL_BAR_WIDTH-offset;
6727+ points[3].x = points[0].x;
6728+ points[3].y = points[0].y;
6729+ XLockDisplay(dis);
6730+ XFillPolygon( dis, m_ScrollVertButtonB, tmpGC, points, 4, Convex, CoordModeOrigin);
6731+ XUnlockDisplay(dis);
6732+ }
6733+
6734+ //Draw Left Horizontal arrow.
6735+ if( m_ScrollHorizButtonL )
6736+ {
6737+ points[0].x = SCROLL_BAR_WIDTH-offset;
6738+ points[0].y = offset;
6739+ points[1].x = SCROLL_BAR_WIDTH-offset;
6740+ points[1].y = SCROLL_BAR_WIDTH-offset;
6741+ points[2].x = offset;
6742+ points[2].y = SCROLL_BAR_WIDTH/2;
6743+ points[3].x = points[0].x;
6744+ points[3].y = points[0].y;
6745+ XLockDisplay(dis);
6746+ XFillPolygon( dis, m_ScrollHorizButtonL, tmpGC, points, 4, Convex, CoordModeOrigin);
6747+ XUnlockDisplay(dis);
6748+ }
6749+
6750+ //Draw Right Horizontal arrow.
6751+ if( m_ScrollHorizButtonR )
6752+ {
6753+ points[0].x = offset;
6754+ points[0].y = SCROLL_BAR_WIDTH-offset;
6755+ points[1].x = offset;
6756+ points[1].y = offset;
6757+ points[2].x = SCROLL_BAR_WIDTH-offset;
6758+ points[2].y = SCROLL_BAR_WIDTH/2;
6759+ points[3].x = points[0].x;
6760+ points[3].y = points[0].y;
6761+ XLockDisplay(dis);
6762+ XFillPolygon( dis, m_ScrollHorizButtonR, tmpGC, points, 4, Convex, CoordModeOrigin);
6763+ XUnlockDisplay(dis);
6764+ }
6765+
6766+ //Free the GC and go.
6767+ XLockDisplay(dis);
6768+ XFreeGC( dis, tmpGC );
6769+ XUnlockDisplay(dis);
6770+#endif
6771+}
6772+
6773+HXBOOL CHXExSite::_InButton( HXxPoint& pt, int x, int y )
6774+{
6775+ HXBOOL retVal =FALSE;
6776+ if( x>= pt.x && x< pt.x+SCROLL_BAR_WIDTH && y>=pt.y && y<pt.y+SCROLL_BAR_WIDTH )
6777+ retVal=TRUE;
6778+ else
6779+ retVal=FALSE;
6780+
6781+ return retVal;
6782+}
6783+
6784+void CHXExSite::_CreateHorizScrollBar()
6785+{
6786+ HX_ASSERT( m_ScrollHorizButtonL == 0 );
6787+ HX_ASSERT( m_ScrollHorizButtonR == 0 );
6788+
6789+ HXxSize mySize;
6790+
6791+ HXxWindow* pParentWindow = NULL;
6792+ if(GetParentSite())
6793+ {
6794+ pParentWindow = GetParentSite()->GetWindow();
6795+ }
6796+ if(pParentWindow)
6797+ {
6798+ GetParentSite()->GetSize(mySize);
6799+ }
6800+
6801+ HX_ASSERT( pParentWindow );
6802+ HX_ASSERT( pParentWindow->window != 0 );
6803+
6804+ if( m_ScrollVertButtonB )
6805+ {
6806+ // if the other bar already exists, don't overlap it!
6807+ mySize.cx -= SCROLL_BAR_WIDTH;
6808+ }
6809+
6810+ m_ptScrollHorizPosL.x = m_topleft.x;
6811+ m_ptScrollHorizPosL.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH;
6812+
6813+#ifndef _ARROWS_SIDE_BY_SIDE
6814+ m_ptScrollHorizPosR.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH;
6815+#else
6816+ m_ptScrollHorizPosR.x = m_topleft.x+SCROLL_BAR_WIDTH;
6817+#endif
6818+ m_ptScrollHorizPosR.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH;
6819+
6820+ Display* dis = (Display*)GetWindow()->display;
6821+ XLockDisplay(dis);
6822+ Pixel blackPixel = BlackPixel( dis, DefaultScreen(dis) );
6823+ XUnlockDisplay(dis);
6824+ Pixel greyPixel = blackPixel;
6825+
6826+ Colormap cmap = HXGetXColormap(dis, (Window)GetWindow()->window);
6827+ XColor color;
6828+
6829+ XLockDisplay(dis);
6830+ XParseColor(dis, cmap, "gray", &color);
6831+ XUnlockDisplay(dis);
6832+ HXFindBestXColor(dis, cmap, &color);
6833+ greyPixel = color.pixel;
6834+
6835+ XLockDisplay(dis);
6836+ m_ScrollHorizButtonL = XCreateSimpleWindow( dis,
6837+ (Window)pParentWindow->window,
6838+ m_ptScrollHorizPosL.x, m_ptScrollHorizPosL.y,
6839+ SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
6840+ 1,
6841+ blackPixel,
6842+ greyPixel
6843+ );
6844+ m_ScrollHorizButtonR = XCreateSimpleWindow( dis,
6845+ (Window)pParentWindow->window,
6846+ m_ptScrollHorizPosR.x, m_ptScrollHorizPosR.y,
6847+ SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
6848+ 1,
6849+ blackPixel,
6850+ greyPixel
6851+ );
6852+ XUnlockDisplay(dis);
6853+ HX_ASSERT( m_ScrollHorizButtonR && m_ScrollHorizButtonL );
6854+
6855+}
6856+
6857+void CHXExSite::_CreateVertScrollBar()
6858+{
6859+ HX_ASSERT( m_ScrollVertButtonB == 0 );
6860+ HX_ASSERT( m_ScrollVertButtonT == 0 );
6861+
6862+ HXxSize mySize;
6863+
6864+ HXxWindow* pParentWindow = NULL;
6865+ if(GetParentSite())
6866+ {
6867+ pParentWindow = GetParentSite()->GetWindow();
6868+ }
6869+ if(pParentWindow)
6870+ {
6871+ GetParentSite()->GetSize(mySize);
6872+ }
6873+
6874+ HX_ASSERT( pParentWindow );
6875+ HX_ASSERT( pParentWindow->window != 0 );
6876+
6877+ if( m_ScrollHorizButtonR )
6878+ {
6879+ // if the other bar already exists, don't overlap it!
6880+ mySize.cy -= SCROLL_BAR_WIDTH;
6881+ }
6882+
6883+
6884+ m_ptScrollVertPosT.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH;
6885+ m_ptScrollVertPosT.y = m_topleft.y;
6886+
6887+ m_ptScrollVertPosB.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH;
6888+#ifndef _ARROWS_SIDE_BY_SIDE
6889+ m_ptScrollVertPosB.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH;
6890+#else
6891+ m_ptScrollVertPosB.y = m_topleft.y+SCROLL_BAR_WIDTH;
6892+#endif
6893+
6894+ Display* dis = (Display*)GetWindow()->display;
6895+ XLockDisplay(dis);
6896+ Pixel blackPixel = BlackPixel( dis, DefaultScreen(dis) );
6897+ XUnlockDisplay(dis);
6898+ Pixel greyPixel = blackPixel;
6899+ Colormap cmap = HXGetXColormap((Display*)GetWindow()->display,
6900+ (Window)GetWindow()->window);
6901+ XColor color;
6902+ XLockDisplay(dis);
6903+ XParseColor(dis, cmap, "gray", &color);
6904+ XUnlockDisplay(dis);
6905+ HXFindBestXColor(dis, cmap, &color);
6906+ greyPixel = color.pixel;
6907+
6908+ HX_ASSERT( GetWindow() );
6909+ XLockDisplay(dis);
6910+ m_ScrollVertButtonT = XCreateSimpleWindow( dis,
6911+ (Window)pParentWindow->window,
6912+ m_ptScrollVertPosT.x, m_ptScrollVertPosT.y,
6913+ SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
6914+ 1,
6915+ blackPixel,
6916+ greyPixel
6917+ );
6918+ m_ScrollVertButtonB = XCreateSimpleWindow( dis,
6919+ (Window)pParentWindow->window,
6920+ m_ptScrollVertPosB.x, m_ptScrollVertPosB.y,
6921+ SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
6922+ 1,
6923+ blackPixel,
6924+ greyPixel
6925+ );
6926+ XUnlockDisplay(dis);
6927+
6928+ HX_ASSERT( m_ScrollVertButtonB && m_ScrollVertButtonT );
6929+
6930+}
6931+
6932+//
6933+// Inherited CHXBaseSite methods.
6934+//
6935+void CHXExSite::_NeedWindowedSite()
6936+{
6937+#ifdef _DEBUG
6938+ fprintf( stderr, "CHXExSite::_NeedWindowedSite do something here....\n" );
6939+#endif
6940+ //Nothing to do on unix....
6941+}
6942+
6943+void CHXExSite::_AttachWindow()
6944+{
6945+#if 1
6946+ void* pDummy=NULL;
6947+
6948+ if (m_pRootSurface)
6949+ { /* Replace CUnixRootSurf with my own CExRootSurf */
6950+ HX_RELEASE(m_pRootSurface);
6951+ m_pRootSurface = new CExRootSurf(m_pContext, this, m_on_new_frame_cb, m_context);
6952+ m_pRootSurface->AddRef();
6953+ }
6954+
6955+ if(!z_mapSiteToWindow.Lookup((void*)this, pDummy))
6956+ {
6957+ z_mapSiteToWindow.SetAt((void*)this, (void*)m_pWindow);
6958+ }
6959+
6960+ //Set the display variable.
6961+ if( m_pWindow->display == NULL )
6962+ {
6963+ HX_ASSERT(zm_display);
6964+ m_pWindow->display = zm_display;
6965+ }
6966+
6967+ //Now that we have a window be sure to init the CExRootSurf.
6968+ //this lets it set up the display, colormap, etc.
6969+ ((CExRootSurf*)m_pRootSurface)->Init();
6970+#endif
6971+}
6972+
6973+void CHXExSite::_DetachWindow()
6974+{
6975+#if 1
6976+ void* pDummy;
6977+
6978+ if (z_mapSiteToWindow.Lookup((void*)this, pDummy))
6979+ {
6980+ z_mapSiteToWindow.RemoveKey((void*)this);
6981+ }
6982+#endif
6983+}
6984+
6985+void* CHXExSite::_Create(void* pParentWindow, UINT32 style)
6986+{
6987+ HRESULT result = HXR_OK;
6988+ if( m_pWindow && m_pWindow->window )
6989+ {
6990+ HX_ASSERT( "We already have created a window"==NULL);
6991+ return NULL;
6992+ }
6993+
6994+ if (pParentWindow==NULL || style)
6995+ {
6996+ m_bIsChildWindow = FALSE;
6997+ }
6998+ else
6999+ {
7000+ m_bIsChildWindow = TRUE;
7001+ }
7002+
7003+ if( _OpenXDisplay(NULL) != HXR_OK )
7004+ {
7005+ return NULL;
7006+ }
7007+ return (void*)CreateXWindow((Window)pParentWindow);
7008+}
7009+
7010+
7011+void CHXExSite::_Destroy(HXxWindow* pWindow)
7012+{
7013+ _DestroySliders();
7014+ HXxWindow* pWin = GetWindow();
7015+ Display* pDis = (Display*)(pWin?pWin->display:NULL);
7016+ if( pDis )
7017+ {
7018+ XLockDisplay(pDis);
7019+ XDestroyWindow( pDis, (Window)pWindow->window );
7020+ XUnlockDisplay(pDis);
7021+ }
7022+}
7023+
7024+void CHXExSite::_SetSize(HXxSize size)
7025+{
7026+ HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window);
7027+ //The scroll bars get resized also...
7028+ _DestroySliders();
7029+ Display* pDis = (Display*)GetWindow()->display;
7030+ XLockDisplay(pDis);
7031+ XResizeWindow(pDis,
7032+ (Window) m_pWindow->window,
7033+ size.cx,
7034+ size.cy);
7035+ XUnlockDisplay(pDis);
7036+}
7037+
7038+void CHXExSite::_SetPosition(HXxPoint position)
7039+{
7040+ HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window);
7041+ _DestroyScrollButtons();
7042+ XLockDisplay((Display*) m_pWindow->display);
7043+ XMoveWindow((Display*)m_pWindow->display,
7044+ (Window)m_pWindow->window,
7045+ position.x,
7046+ position.y);
7047+ XUnlockDisplay((Display*) m_pWindow->display);
7048+}
7049+
7050+void CHXExSite::_DamageRect(HXxRect rect)
7051+{
7052+ if(GetWindow())
7053+ {
7054+ m_bDamaged = TRUE;
7055+ }
7056+ return;
7057+}
7058+
7059+void CHXExSite::_DamageRegion(HXxRegion rect)
7060+{
7061+ if(GetWindow())
7062+ {
7063+ m_bDamaged = TRUE;
7064+ }
7065+ return;
7066+}
7067+
7068+void CHXExSite::_SendOSUpdateMessage()
7069+{
7070+ //We need to redraw our window here, m_pWindow.
7071+}
7072+
7073+void CHXExSite::_ShowSite(HXBOOL bShow)
7074+{
7075+ if( bShow )
7076+ {
7077+ _MapScrollButtons();
7078+ }
7079+ else
7080+ {
7081+ _UnmapScrollButtons();
7082+ }
7083+ //do nothing....
7084+}
7085+
7086+HXBOOL CHXExSite::_AtSystemTime()
7087+{
7088+ return TRUE;
7089+}
7090+
7091+void CHXExSite::_GetDeviceCaps( void* hdc,
7092+ UINT16& uBitsPerPixel,
7093+ UINT16& uHorzRes,
7094+ UINT16& uVertRes )
7095+{
7096+ Screen* pScreen = NULL;
7097+ HXxWindow* pWin = GetWindow();
7098+ HX_ASSERT( pWin );
7099+ if( pWin )
7100+ {
7101+ Display* dis = (Display*)pWin->display;
7102+ HX_ASSERT( dis );
7103+ if( dis )
7104+ {
7105+ Display* pDisp = (Display*)GetWindow()->display;
7106+ XLockDisplay(pDisp);
7107+ pScreen = DefaultScreenOfDisplay(pDisp);
7108+ XUnlockDisplay(pDisp);
7109+
7110+ uBitsPerPixel = pScreen->root_depth;
7111+ uHorzRes = pScreen->width;
7112+ uVertRes = pScreen->height;
7113+ }
7114+ }
7115+}
7116+
7117+void CHXExSite::_GetWindowRect(HXxRect* destRect)
7118+{
7119+ HX_ASSERT( "Doesn't seem to be used anywhere"==NULL );
7120+}
7121+
7122+void CHXExSite::_DestroySliders()
7123+{
7124+ _DestroyScrollButtons();
7125+}
7126+
7127+void CHXExSite::_ForwardUpdateEvent(HXxEvent* pEvent)
7128+{
7129+ GC gc = NULL;
7130+ AddRef();
7131+
7132+ HX_ASSERT(GetWindow()->window);
7133+ HX_ASSERT(m_pUser);
7134+ if(m_bIsChildWindow)
7135+ {
7136+ //Create a clip region that excludes our higher z-order
7137+ //siblings and is clipped to our parent.
7138+ if( !m_bRegionIsValid )
7139+ {
7140+ RecomputeClip();
7141+ }
7142+
7143+ // The problem is that regions are locked to the origin so we
7144+ // will need to reverse shift the region before we set the
7145+ // origin of the graph port! get the GC from the video surface
7146+ gc = ((CExRootSurf*)m_pRootSurface)->GetGC();
7147+ HX_ASSERT( gc );
7148+
7149+ //Actually setup our clip region
7150+ Display* pDis = (Display*)GetWindow()->display;
7151+ XLockDisplay(pDis);
7152+ XSetRegion( pDis, gc, (Region) m_Region );
7153+ XUnlockDisplay(pDis);
7154+ }
7155+
7156+ XEvent* pXEvent = (XEvent*) pEvent->param2;
7157+ XExposeEvent* exposeEvent = (XExposeEvent*) pXEvent;
7158+
7159+ // get the rect for this site with respect to our parent
7160+ HXRECTANGLE exposedRect = { exposeEvent->x,
7161+ exposeEvent->y,
7162+ exposeEvent->width,
7163+ exposeEvent->height };
7164+ HXREGION* exposedRegion = HXCreateRegion();
7165+ HXUnionRectWithRegion(&exposedRect, exposedRegion, exposedRegion);
7166+
7167+ // does the site intersect the current clipping region?
7168+ HXREGION* resultRegion = HXCreateRegion();
7169+ HXIntersectRegion(exposedRegion, m_Region, resultRegion);
7170+ HXBOOL bSiteIntersectsExposed = (HXEmptyRegion(resultRegion)==FALSE);
7171+
7172+ HXDestroyRegion(resultRegion);
7173+ HXDestroyRegion(exposedRegion);
7174+
7175+ // if the exposed region intersects the sites clipping region
7176+ if(bSiteIntersectsExposed)
7177+ {
7178+ m_pUser->HandleEvent(pEvent);
7179+ }
7180+
7181+ //If the user doesn't handle the standard update event then send
7182+ //them the cross platform HX_SURFACE_UPDATE event don't damage the
7183+ //original event structure
7184+ if(!pEvent->handled && m_pUser )
7185+ {
7186+ HX_ASSERT(GetWindow());
7187+ HXxEvent event;
7188+ event.event = HX_SURFACE_UPDATE;
7189+ event.window = GetWindow()->window;
7190+ event.param1 = m_pVideoSurface;
7191+ event.param2 = GetWindow();
7192+ event.result = 0;
7193+ event.handled = FALSE;
7194+ m_pUser->HandleEvent(&event);
7195+ pEvent->handled = event.handled;
7196+ }
7197+
7198+
7199+ //reset the gc to use no region
7200+ if(m_bIsChildWindow && gc)
7201+ {
7202+ Display* pDisp = (Display*)GetWindow()->display;
7203+ XLockDisplay(pDisp);
7204+ XSetClipMask(pDisp, gc, None);
7205+ XUnlockDisplay(pDisp);
7206+ }
7207+
7208+ //Handle the drawing of our arrows...
7209+ _DrawArrows();
7210+
7211+ //Now do all our children....
7212+ CHXMapPtrToPtr::Iterator i = m_ChildrenMap.Begin();
7213+ for(;i!=m_ChildrenMap.End();++i)
7214+ {
7215+ CHXExSite* pSite = (CHXExSite*) *i;
7216+ pSite->_ForwardUpdateEvent(pEvent);
7217+ }
7218+
7219+ Release();
7220+}
7221+
7222+UINT32 CHXExSite::_MapKeySymToHXVK(KeySym sym, UINT32& uFlags )
7223+{
7224+ //XXXgfw if we add the extended flag in the HX_KEYBOARD event
7225+ //structure then we can modify the flags here to show that these
7226+ //keys are 'extended' in the windows sense.
7227+ UINT32 ulRet = 0;
7228+ switch( sym )
7229+ {
7230+ case XK_Shift_R:
7231+ ulRet = XK_Shift_L;
7232+ break;
7233+ case XK_Alt_R:
7234+ ulRet = XK_Alt_L;
7235+ break;
7236+ case XK_KP_Home:
7237+ ulRet = XK_Home;
7238+ break;
7239+ case XK_KP_Next:
7240+ ulRet = XK_Next;
7241+ break;
7242+ case XK_KP_Prior:
7243+ ulRet = XK_Prior;
7244+ break;
7245+ case XK_KP_Enter:
7246+ ulRet = XK_Return;
7247+ break;
7248+ case XK_KP_End:
7249+ ulRet = XK_End;
7250+ break;
7251+ case XK_KP_Begin:
7252+ ulRet = XK_Begin;
7253+ break;
7254+ case XK_KP_Left:
7255+ ulRet = XK_Left;
7256+ break;
7257+ case XK_KP_Up:
7258+ ulRet = XK_Up;
7259+ break;
7260+ case XK_Control_R:
7261+ ulRet = XK_Control_L;
7262+ break;
7263+ case XK_KP_Right:
7264+ ulRet = XK_Right;
7265+ break;
7266+ case XK_KP_Down:
7267+ ulRet = XK_Down;
7268+ break;
7269+ case XK_KP_Insert:
7270+ ulRet = XK_Insert;
7271+ break;
7272+ case XK_KP_Delete:
7273+ ulRet = XK_Delete;
7274+ break;
7275+ default:
7276+ ulRet = sym;
7277+ break;
7278+ }
7279+ if( ulRet != sym )
7280+ {
7281+ //We have mapped a key from Right hand side, keypad, arrows
7282+ //or other parts of an extended keyboard. Set the flag.
7283+ uFlags |= HX_EXTENDED_KEY_MASK;
7284+ }
7285+ return ulRet;
7286+}
7287+
7288+
7289+HXBOOL CHXExSite::_ConvertToHXEvent(HXxEvent* pEvent )
7290+{
7291+ // get original events info from pEvent
7292+ XEvent* pXEvent = (XEvent*) pEvent->param2;
7293+ XButtonEvent* buttonEvent = (XButtonEvent*) pXEvent;
7294+
7295+
7296+ //===============================================================
7297+ // Convert all other event to RMA generic events and pass back.
7298+ //===============================================================
7299+ if( ((pEvent->event == ButtonPress) ||
7300+ (pEvent->event == ButtonRelease) ||
7301+ (pEvent->event == MotionNotify ) ||
7302+ (pEvent->event == EnterNotify) ||
7303+ (pEvent->event == FocusIn) ||
7304+ (pEvent->event == FocusOut) ||
7305+ (pEvent->event == KeyPress) ||
7306+ (pEvent->event == KeyRelease) ||
7307+ (pEvent->event == LeaveNotify))
7308+ )
7309+ {
7310+ // set modifier flags for all events....
7311+ UINT32 flags = 0;
7312+
7313+ // create new HXxEvent
7314+ HXxEvent theEvent;
7315+
7316+ //XXXgfw ouch....
7317+ static HXxPoint realPt = {0,0};
7318+
7319+ //Init certain members.
7320+ memset(&theEvent, 0, sizeof(HXxEvent));
7321+ theEvent.window = pEvent->window;
7322+ theEvent.handled = FALSE;
7323+
7324+ //
7325+ // NOTE:
7326+ //
7327+ // theEvent must be filled in by *ALL* event types.
7328+ // theEvent will be memcopied into the pEvent passed
7329+ // back to the basesite at the end of the method.
7330+ //
7331+
7332+ //==================================================
7333+ // LEAVE NOTIFY EVENT
7334+ //==================================================
7335+ if( pEvent->event==LeaveNotify)
7336+ {
7337+ if( m_pTopLevelSite->m_pMouseInSite )
7338+ {
7339+ HXxPoint oobPoint;
7340+ oobPoint.x = -1;
7341+ oobPoint.y = -1;
7342+ HXxEvent Outevent = { HX_MOUSE_LEAVE,
7343+ m_pWindow->window,
7344+ (void*)&oobPoint,
7345+ 0, 0,
7346+ FALSE };
7347+ m_pTopLevelSite->m_pMouseInSite->EventOccurred(&Outevent);
7348+ m_pTopLevelSite->m_pMouseInSite = NULL;
7349+ }
7350+ pEvent->handled=TRUE;
7351+ return TRUE;
7352+ }
7353+
7354+ //==================================================
7355+ // ENTER NOTIFY EVENT
7356+ //==================================================
7357+ if( pEvent->event==EnterNotify)
7358+ {
7359+ pEvent->handled=TRUE;
7360+ return TRUE;
7361+ }
7362+
7363+ //==================================================
7364+ // KEY PRESS/RELEASE EVENT
7365+ //==================================================
7366+ if ( pEvent->event == KeyPress || pEvent->event==KeyRelease )
7367+ {
7368+ XKeyEvent* pKeyEvent = (XKeyEvent*)pEvent->param2;
7369+
7370+ //
7371+ //Set the event type
7372+ //
7373+ theEvent.event = pEvent->event==KeyPress?HX_KEY_DOWN:HX_KEY_UP;
7374+
7375+ //
7376+ // Fill in the scan/key code.
7377+ //
7378+ flags = pKeyEvent->keycode;
7379+ flags &= 0x000000ff; //the scan code only gets bits 0-7
7380+
7381+ //
7382+ // build key modifier list...
7383+ //
7384+ if( pKeyEvent->state & ShiftMask )
7385+ flags |= HX_SHIFT_MASK;
7386+
7387+ if( pKeyEvent->state & ControlMask )
7388+ flags |= HX_CTRL_MASK;
7389+
7390+ if( pKeyEvent->state & LockMask )
7391+ flags |= HX_CAPS_LOCK_MASK;
7392+
7393+ if( pKeyEvent->state & Mod1Mask)
7394+ flags |= HX_ALT_MASK;
7395+
7396+ if( pKeyEvent->state & Mod2Mask)
7397+ flags |= HX_NUM_LOCK_MASK;
7398+
7399+ if( pKeyEvent->state & Mod5Mask)
7400+ flags |= HX_SCROLL_LOCK_MASK;
7401+
7402+ //
7403+ //Store the char pressed.
7404+ //
7405+ KeySym sym;
7406+ char szBuf[10]; /* Flawfinder: ignore */
7407+ int nNum;
7408+
7409+ //Save the state of the keys...
7410+ unsigned int unSave = pKeyEvent->state;
7411+ pKeyEvent->state=0;
7412+
7413+ //Lookup the key without any state.
7414+ nNum = XLookupString( pKeyEvent, szBuf, 10, &sym, NULL );
7415+ if( nNum > 0 )
7416+ {
7417+ theEvent.param1 = (void*)*szBuf;
7418+ }
7419+ else
7420+ {
7421+ theEvent.param1 = (void*)_MapKeySymToHXVK(sym, flags);
7422+ flags |= HX_VIRTUAL_KEY_MASK;
7423+ }
7424+ //restore the state of the event
7425+ pKeyEvent->state = unSave;
7426+
7427+ //Set the flags...
7428+ theEvent.param2 = (void*)flags;
7429+
7430+ //Check for HX_CHAR needed or not.
7431+ if( theEvent.event == HX_KEY_DOWN )
7432+ {
7433+ //We have to send an extra HX_CHAR event
7434+ HXxEvent extraEvent;
7435+ memcpy( &extraEvent, &theEvent, sizeof( extraEvent ) ); /* Flawfinder: ignore */
7436+
7437+ //Change the type.
7438+ extraEvent.event = HX_CHAR;
7439+
7440+ //
7441+ //Change the keycode to an translated ascii char.
7442+ //
7443+ KeySym sym;
7444+ char szBuf[10]; /* Flawfinder: ignore */
7445+ int nNum;
7446+
7447+ nNum = XLookupString( pKeyEvent, szBuf, 10, &sym, NULL );
7448+
7449+ if( nNum > 0 )
7450+ {
7451+ extraEvent.param1 = (void*)*szBuf;
7452+ }
7453+ else
7454+ {
7455+ extraEvent.param1 = (void*)_MapKeySymToHXVK(sym, flags);
7456+ flags |= HX_VIRTUAL_KEY_MASK;
7457+ }
7458+ extraEvent.param2 = (void*)flags;
7459+
7460+ //
7461+ // Now send the extra event....
7462+ //
7463+ CHXBaseSite::EventOccurred(&extraEvent);
7464+ }
7465+ }
7466+
7467+ //==================================================
7468+ // FOCUS OUT EVENT
7469+ //==================================================
7470+ if ( pEvent->event == FocusOut )
7471+ {
7472+ theEvent.event = HX_LOSE_FOCUS;
7473+ }
7474+
7475+ if ( pEvent->event == FocusIn )
7476+ {
7477+ theEvent.event = HX_SET_FOCUS;
7478+ }
7479+
7480+ //==================================================
7481+ // MOUSE MOVE EVENT
7482+ //==================================================
7483+ if( pEvent->event == MotionNotify )
7484+ {
7485+ XMotionEvent* pp = (XMotionEvent*)pEvent->param2;
7486+ theEvent.event = HX_MOUSE_MOVE;
7487+
7488+ if( pp->state&Button1Mask )
7489+ flags |= HX_PRIMARY_BUTTON;
7490+
7491+ if( pp->state&Button2Mask )
7492+ flags |= HX_CONTEXT_BUTTON;
7493+
7494+ if( pp->state&Button3Mask )
7495+ flags |= HX_THIRD_BUTTON;
7496+
7497+ if(pp->state & ShiftMask)
7498+ flags |= HX_SHIFT_KEY;
7499+
7500+ if(pp->state & ControlMask)
7501+ flags |= HX_CTRL_KEY;
7502+
7503+ if(pp->state & Mod1Mask)
7504+ flags |= HX_ALT_COMMAND_KEY;
7505+
7506+ theEvent.param2 = (void*) flags;
7507+
7508+ //Grab the X and Y.
7509+ theEvent.param1 = (void*) &realPt;
7510+ realPt.x = pp->x;
7511+ realPt.y = pp->y;
7512+ }
7513+
7514+ //==================================================
7515+ // BUTTON PRESS/RELEASE EVENT
7516+ //==================================================
7517+ if((pEvent->event == ButtonPress) || (pEvent->event == ButtonRelease))
7518+ {
7519+ // remap event
7520+ if (pEvent->event == ButtonPress)
7521+ {
7522+ if (buttonEvent->button == Button3)
7523+ theEvent.event = HX_CONTEXT_BUTTON_DOWN;
7524+ else
7525+ theEvent.event = HX_PRIMARY_BUTTON_DOWN;
7526+ }
7527+ else if (pEvent->event == ButtonRelease)
7528+ {
7529+ if (buttonEvent->button == Button3)
7530+ theEvent.event = HX_CONTEXT_BUTTON_UP;
7531+ else
7532+ theEvent.event = HX_PRIMARY_BUTTON_UP;
7533+ }
7534+
7535+ if(buttonEvent->state & ShiftMask)
7536+ flags |= HX_SHIFT_KEY;
7537+
7538+ if(buttonEvent->state & ControlMask)
7539+ flags |= HX_CTRL_KEY;
7540+
7541+ theEvent.param2 = (void*) flags;
7542+
7543+ //Grab the X and Y.
7544+ theEvent.param1 = (void*) &realPt;
7545+ realPt.x = buttonEvent->x;
7546+ realPt.y = buttonEvent->y;
7547+ }
7548+
7549+ //Copy the new event back into the passed in one for
7550+ //all events that fall through here...
7551+ memcpy( pEvent, &theEvent, sizeof(HXxEvent) ); /* Flawfinder: ignore */
7552+
7553+#if defined(_DEBUG)
7554+ //If the users presses control-primary button
7555+ //dump info on all sites. If shift-context, then
7556+ //just this site.
7557+ if( (buttonEvent->state&ControlMask)&&
7558+ (theEvent.event==HX_PRIMARY_BUTTON_DOWN))
7559+ {
7560+ DisplayAllSiteData();
7561+ }
7562+ if( (buttonEvent->state&ShiftMask)&&
7563+ (theEvent.event==HX_PRIMARY_BUTTON_DOWN))
7564+ {
7565+ DisplaySiteData("");
7566+ }
7567+#endif
7568+ }
7569+ return pEvent->handled;
7570+}
7571+
7572+
7573+void CHXExSite::CheckColorSettings()
7574+{
7575+#if !defined(HELIX_FEATURE_HARDWARE_COLOR_CONTROLS)
7576+ CHXBaseSite::CheckColorSettings();
7577+#else
7578+ CUnixSurf* pSurf = (CUnixSurf*)m_pVideoSurface;
7579+ if( !pSurf->HasHWColorConrols() )
7580+ {
7581+ CHXBaseSite::CheckColorSettings();
7582+ }
7583+ else
7584+ {
7585+ pSurf->SetHWColorControls();
7586+
7587+ //We do all color stuff except sharpmess in hardware.
7588+ float fCurrentSharpness;
7589+ INT16 bInterpolate;
7590+ zm_pColorAcc->GetSharpnessAdjustments(&fCurrentSharpness, &bInterpolate);
7591+
7592+ if (fCurrentSharpness != m_fSharpness)
7593+ {
7594+ zm_pColorAcc->SetSharpnessAdjustments(m_fSharpness, FALSE);
7595+ }
7596+ }
7597+#endif
7598+}
7599+
7600+//
7601+// OK, here it is. Take care of any OS specific duties, like scrollbar
7602+// stuff and expose events. Then, if the event isn't handled, convert
7603+// to an RMA event and return.
7604+HXBOOL CHXExSite::_HandleOSEvents(HXxEvent* pEvent)
7605+{
7606+ HXxPoint position = {0, 0};
7607+ HXxPoint point;
7608+
7609+ if( NULL==pEvent )
7610+ {
7611+ return FALSE;
7612+ }
7613+
7614+ return TRUE;
7615+
7616+#if defined(_DEBUG) && 0
7617+// fprintf( stderr, "this: %p m_pUser: %p ", this, m_pUser );
7618+ switch( pEvent->event )
7619+ {
7620+ case HX_MOUSE_LEAVE:
7621+ fprintf( stderr, "HX_MOUSE_LEAVE\n" );
7622+ break;
7623+// case HX_MOUSE_MOVE:
7624+// point.x = ((HXxPoint*)pEvent->param1)->x;
7625+// point.y = ((HXxPoint*)pEvent->param1)->y;
7626+// fprintf( stderr, "HX_MOUSE_MOVE: %d %d\n", point.x, point.y );
7627+// break;
7628+ case HX_MOUSE_ENTER:
7629+ fprintf( stderr, "HX_MOUSE_ENTER\n" );
7630+ break;
7631+// case MotionNotify:
7632+// point.x = ((XMotionEvent*)pEvent->param2)->x;
7633+// point.y = ((XMotionEvent*)pEvent->param2)->y;
7634+// fprintf( stderr, "MotionNotify: %d %d\n", point.x, point.y );
7635+// break;
7636+ case Expose:
7637+ fprintf( stderr, "Expose\n" );
7638+ break;
7639+ case EnterNotify :
7640+ fprintf( stderr, "EnterNotify\n" );
7641+ break;
7642+ case LeaveNotify:
7643+ fprintf( stderr, "LeaveNotify\n" );
7644+ break;
7645+ case KeyPress:
7646+ fprintf( stderr, "this: %p m_pUser: %p ", this, m_pUser );
7647+ fprintf( stderr, "Keypress\n\n" );
7648+ break;
7649+ case KeyRelease:
7650+ fprintf( stderr, "this: %p m_pUser: %p ", this, m_pUser );
7651+ fprintf( stderr, "KeyRelease\n" );
7652+ break;
7653+ default:
7654+ fprintf( stderr, "Other\n" );
7655+ break;
7656+ }
7657+#endif
7658+
7659+ //Find the ConfigureNotify events so we can drop to RGB from
7660+ //overlay while we move....
7661+// if( pEvent->event == ConfigureNotify && this==m_pTopLevelSite )
7662+// {
7663+// XConfigureEvent* pev = (XConfigureEvent*)pEvent->param2;
7664+// if( m_pWindow && pev->window == (Window)m_pWindow->window )
7665+// {
7666+// HXxPoint p;
7667+// _GetPositionRelativeToActualWindow( p );
7668+// // fprintf( stderr, "wint %p -- x,y width, height: %d %d %d %d \n",
7669+// // pev->window,
7670+// // pev->x, pev->y, pev->width, pev->height);
7671+// // fprintf( stderr, "size of site: %d %d\n", m_size.cx, m_size.cy);
7672+// // fprintf( stderr, "pos of site: %d %d\n", m_topleft.x, m_topleft.y);
7673+// m_pTopLevelSite->m_pMutex->Lock();
7674+// m_pTopLevelSite->SiteMoving(0, 0);
7675+// m_pTopLevelSite->m_nLastMoveTime = HX_GET_TICKCOUNT();
7676+// m_pTopLevelSite->ScheduleCallback(MOUSE, 100);
7677+// m_pTopLevelSite->m_pMutex->Unlock();
7678+// }
7679+// }
7680+
7681+ //See if we should drop out of full screen
7682+ if( pEvent->event == FocusOut && IsFullScreen() && !m_bIgnoreFocusOutInFS )
7683+ {
7684+// fprintf( stderr, "_HandleOSEvents: focus out: " );
7685+// XEvent* pXEvent = (XEvent*) pEvent->param2;
7686+// XFocusChangeEvent* event = (XFocusChangeEvent*) pXEvent;
7687+// switch( event->mode )
7688+// {
7689+// case NotifyAncestor:
7690+// fprintf( stderr, "NotifyAncestor\n" );
7691+// break;
7692+// case NotifyVirtual:
7693+// fprintf( stderr, "NotifyVirtual\n" );
7694+// break;
7695+// case NotifyInferior:
7696+// fprintf( stderr, "NotifyInferior\n" );
7697+// break;
7698+// case NotifyNonlinear:
7699+// fprintf( stderr, "NotifyNonlinear\n" );
7700+// break;
7701+// case NotifyNonlinearVirtual:
7702+// fprintf( stderr, "NotifyNonlinearVirtual\n" );
7703+// break;
7704+// case NotifyPointer:
7705+// fprintf( stderr, "NotifyPointer\n" );
7706+// break;
7707+// case NotifyPointerRoot:
7708+// fprintf( stderr, "NotifyPointerRoot\n" );
7709+// break;
7710+// case NotifyDetailNone:
7711+// fprintf( stderr, "NotifyDetailNone\n" );
7712+// break;
7713+// default:
7714+// fprintf( stderr, "screwed.....\n" );
7715+// }
7716+ ExitFullScreen();
7717+ }
7718+
7719+
7720+#if defined(_DEBUG) && defined(TEST_FULL_SCREEN)
7721+ if( pEvent->event == KeyPress )
7722+ {
7723+ KeySym sym;
7724+ char szBuf[10]; /* Flawfinder: ignore */
7725+ int nNum;
7726+
7727+ //Lookup the key without any state.
7728+ nNum = XLookupString( (XKeyEvent*)(pEvent->param2), szBuf, 10, &sym, NULL );
7729+ if( nNum > 0 )
7730+ {
7731+ if( 'f' == szBuf[0] && IsFullScreen() )
7732+ {
7733+ //Exit full screen if 'f' is pressed.....
7734+ m_pTopLevelSite->ExitFullScreen();
7735+ }
7736+ else if( 'f' == szBuf[0] && !IsFullScreen() )
7737+ {
7738+ //Enter full screen if 'f' is pressed.....
7739+ m_pTopLevelSite->EnterFullScreen();
7740+ }
7741+
7742+ }
7743+
7744+ }
7745+#endif
7746+
7747+#if defined(_DEBUG) && defined(_TEST_COLOR_CONTROLS)
7748+ if( pEvent->event == KeyPress )
7749+ {
7750+ KeySym sym;
7751+ char szBuf[10]; /* Flawfinder: ignore */
7752+ int nNum;
7753+
7754+ //Lookup the key without any state.
7755+ nNum = XLookupString( (XKeyEvent*)(pEvent->param2), szBuf, 10, &sym, NULL );
7756+ if( nNum > 0 )
7757+ {
7758+ if( 'b' == szBuf[0] )
7759+ {
7760+ SetBrightness( GetBrightness()-.05);
7761+ }
7762+ if( 'B' == szBuf[0] )
7763+ {
7764+ SetBrightness( GetBrightness()+.05);
7765+ }
7766+
7767+ if( 'c' == szBuf[0] )
7768+ {
7769+ SetContrast( GetContrast()-.05);
7770+ }
7771+ if( 'C' == szBuf[0] )
7772+ {
7773+ SetContrast( GetContrast()+.05);
7774+ }
7775+
7776+ if( 'h' == szBuf[0] )
7777+ {
7778+ SetHue( GetHue()-.05);
7779+ }
7780+ if( 'H' == szBuf[0] )
7781+ {
7782+ SetHue( GetHue()+.05 );
7783+ }
7784+
7785+ if( 's' == szBuf[0] )
7786+ {
7787+ SetSaturation( GetSaturation()-.05);
7788+ }
7789+ if( 'S' == szBuf[0] )
7790+ {
7791+ SetSaturation( GetSaturation()+.05);
7792+ }
7793+ fprintf( stderr, "colors %f %f %f %f\n",
7794+ GetBrightness(),
7795+ GetContrast(),
7796+ GetSaturation(),
7797+ GetHue());
7798+ }
7799+
7800+ }
7801+#endif
7802+
7803+ //Exit full screen on ESC pressed......
7804+ if( pEvent->event == KeyPress )
7805+ {
7806+ KeySym sym;
7807+ char szBuf[10]; /* Flawfinder: ignore */
7808+ int nNum;
7809+
7810+ //Lookup the key without any state.
7811+ nNum = XLookupString( (XKeyEvent*)(pEvent->param2), szBuf, 10, &sym, NULL );
7812+ if( nNum > 0 )
7813+ {
7814+ if( 27 == (int)szBuf[0] && IsFullScreen() )
7815+ {
7816+ //Exit full screen if esc is pressed.....
7817+ m_pTopLevelSite->ExitFullScreen();
7818+ }
7819+ }
7820+ }
7821+
7822+ //Find out if this is an event we are interested in. Make sure we
7823+ //are visible, it isn't a button, expose or FocusIn event and also
7824+ //make sure it is headed for our window.
7825+ if (!_ShouldProcess(pEvent))
7826+ {
7827+ return FALSE;
7828+ }
7829+
7830+
7831+ if(m_pUser && GetWindow() && GetWindow()->window)
7832+ {
7833+ //Do not send an update event to a hidden site.
7834+ if( pEvent->event == Expose ||
7835+ pEvent->event == FocusIn ||
7836+ pEvent->event == HX_SURFACE_UPDATE )
7837+ {
7838+ if( (m_ScrollVertButtonT || m_ScrollHorizButtonR) && IsSiteVisible() )
7839+ {
7840+ _DrawArrows();
7841+ }
7842+ _ForwardUpdateEvent(pEvent);
7843+ return TRUE;
7844+ }
7845+ else
7846+ {
7847+ // get original events info from pEvent
7848+ XEvent* pXEvent = (XEvent*) pEvent->param2;
7849+ XButtonEvent* buttonEvent = (XButtonEvent*) pXEvent;
7850+
7851+
7852+ //XXXgfw all this code sucks! It really need to be written
7853+ //for just native events or RMA events. With the change to a
7854+ //common site it is all screwed up. I am leaving it for now
7855+ //so we can get on with transparancy but get back to it!
7856+
7857+ //If the user clicks MB1 on a scroll button, handle it here and
7858+ //don't pass it up or let the user handle the event.
7859+ //Hit detection here.
7860+
7861+ ////////////////////////////////////////////////////////
7862+ // BEGIN SCROLLING GARBAGE
7863+ ////////////////////////////////////////////////////////
7864+ if(
7865+ ((pEvent->event==ButtonPress || pEvent->event==ButtonRelease) &&
7866+ buttonEvent->button==Button1) &&
7867+ (m_ScrollHorizButtonL || m_ScrollVertButtonB )
7868+ )
7869+ {
7870+ int buttonX=0;
7871+ int buttonY=0;
7872+
7873+ if( pEvent->event==ButtonRelease )
7874+ {
7875+ if( m_bScrollingInProgress )
7876+ {
7877+ m_bScrollingInProgress = FALSE;
7878+ m_nScrollDir = 0;
7879+ return TRUE ;
7880+ }
7881+ }
7882+ else
7883+ {
7884+ buttonX = buttonEvent->x;
7885+ buttonY = buttonEvent->y;
7886+
7887+ HXBOOL bPointInSite = FALSE;
7888+ if( m_Region )
7889+ bPointInSite = HXPointInRegion(m_Region, buttonX, buttonY);
7890+
7891+ if( bPointInSite )
7892+ {
7893+ if( m_ScrollHorizButtonL )
7894+ {
7895+ if( _InButton( m_ptScrollHorizPosL, buttonX, buttonY ))
7896+ {
7897+ m_bScrollingInProgress = TRUE;
7898+ m_nScrollDir = 1;
7899+ }
7900+ if( _InButton( m_ptScrollHorizPosR, buttonX, buttonY ))
7901+ {
7902+ m_bScrollingInProgress = TRUE;
7903+ m_nScrollDir = 2;
7904+ }
7905+ }
7906+ if( m_ScrollVertButtonT )
7907+ {
7908+ if( _InButton( m_ptScrollVertPosT, buttonX, buttonY ))
7909+ {
7910+ m_bScrollingInProgress = TRUE;
7911+ m_nScrollDir = 3;
7912+ }
7913+ if( _InButton( m_ptScrollVertPosB, buttonX, buttonY ))
7914+ {
7915+ m_bScrollingInProgress = TRUE;
7916+ m_nScrollDir = 4;
7917+ }
7918+ }
7919+ }
7920+ }
7921+
7922+ if( (m_ScrollHorizButtonL||m_ScrollVertButtonT) && m_bScrollingInProgress)
7923+ {
7924+ int xx=0;
7925+ int yy=0;
7926+ HXxWindow* pParentWindow = GetParentSite()->GetWindow();
7927+ //Make it scroll 10% of the parent window each click.
7928+ HXxSize sizeTmp;
7929+ GetParentSite()->GetSize(sizeTmp);
7930+
7931+ //Set it to a percentage of the slider range.
7932+ int incX = sizeTmp.cx/10;
7933+ int incY = sizeTmp.cy/10;
7934+
7935+ HX_ASSERT( pParentWindow );
7936+
7937+ xx = m_XSliderPos;
7938+ yy = m_YSliderPos;
7939+
7940+ if( m_nScrollDir == 1 )
7941+ xx-=incX;
7942+ if( m_nScrollDir == 2 )
7943+ xx+=incX;
7944+ if( m_nScrollDir == 3 )
7945+ yy-=incY;
7946+ if( m_nScrollDir == 4 )
7947+ yy+=incY;
7948+
7949+ if( xx > m_size.cx-sizeTmp.cx )
7950+ xx = m_size.cx-sizeTmp.cx;
7951+ if( yy > m_size.cy-sizeTmp.cy)
7952+ yy = m_size.cy-sizeTmp.cy;
7953+
7954+ if( xx < 0 )
7955+ xx = 0;
7956+ if( yy < 0 )
7957+ yy = 0;
7958+
7959+ m_XSliderPos = xx;
7960+ m_YSliderPos = yy;
7961+
7962+ HXxRect rect;
7963+ DamageRect(rect);
7964+
7965+ InternalForceRedraw();
7966+ }
7967+ //Only throw away the event if it had something to do with
7968+ //scolling.
7969+ if( m_bScrollingInProgress )
7970+ {
7971+ m_bScrollingInProgress = FALSE;
7972+ m_nScrollDir = 0;
7973+ return TRUE;
7974+ }
7975+ }
7976+ ////////////////////////////////////////////////////////
7977+ // END SCROLLING GARBAGE
7978+ ////////////////////////////////////////////////////////
7979+ point.x = -1;
7980+ point.y = -1;
7981+
7982+ if( pEvent->event == MotionNotify)
7983+ {
7984+ point.x = ((XMotionEvent*)pXEvent)->x;
7985+ point.y = ((XMotionEvent*)pXEvent)->y;
7986+ }
7987+ else if( pEvent->event == ButtonPress )
7988+ {
7989+ point.x = ((XMotionEvent*)pXEvent)->x;
7990+ point.y = ((XMotionEvent*)pXEvent)->y;
7991+ }
7992+
7993+ //
7994+ //Give the user a chance at the native event.
7995+ //
7996+ if( m_RegionWithoutChildren && HXPointInRegion(m_RegionWithoutChildren, point.x, point.y ))
7997+ {
7998+ if( m_Region && HXPointInRegion(m_Region, point.x, point.y) )
7999+ {
8000+ if (m_pUser)
8001+ m_pUser->HandleEvent(pEvent);
8002+ }
8003+ else
8004+ {
8005+ INT32 handledCount = 0;
8006+ INT32 mapCount = 0;
8007+
8008+ //try send this to all of our children
8009+ _unixsitecpp1:
8010+ mapCount = m_ChildrenMap.GetCount();
8011+ CHXMapPtrToPtr::Iterator i;
8012+ for(i=m_ChildrenMap.Begin() ; i!=m_ChildrenMap.End() ; ++i)
8013+ {
8014+ CHXBaseSite* pSite = (CHXBaseSite*) *i;
8015+ pSite->_HandleOSEvents(pEvent);
8016+ if (pEvent->handled)
8017+ {
8018+ break;
8019+ }
8020+ handledCount+=pEvent->handled;
8021+ pEvent->handled=0;
8022+
8023+ if (m_ChildrenMap.GetCount() != mapCount)
8024+ {
8025+ goto _unixsitecpp1;
8026+ }
8027+ }
8028+ if (handledCount)
8029+ {
8030+ pEvent->handled = 1;
8031+ }
8032+ HX_ASSERT(handledCount<2);
8033+ }
8034+ }
8035+ pEvent->handled=FALSE;
8036+ }
8037+ }
8038+
8039+ return FALSE;
8040+}
8041+
8042+void CHXExSite::_GenerateOSEvent(HXxEvent* pEvent, HXxEvent* pEvent2)
8043+{
8044+ //XXXgfw Not needed on UNIX I guess???
8045+}
8046+
8047+void CHXExSite::_GenerateSetCursorEvent()
8048+{
8049+#ifdef _DEBUG
8050+ fprintf( stderr, "CHXExSite::_GenerateSetCursorEvent\n" );
8051+#endif
8052+ //XXXgfw do we need this??
8053+}
8054+
8055+void CHXExSite::_TryCreateXSlider()
8056+{
8057+#if 0
8058+ if( !m_ScrollHorizButtonL && IsSiteVisible() )
8059+ _CreateHorizScrollBar();
8060+#endif
8061+}
8062+
8063+void CHXExSite::_SetXSliderValues(INT32 range, INT32 pageSize)
8064+{
8065+ //XXXgfw this is a do nothing as long as we only have
8066+ //scroll buttons on unix and not real scroll bars.
8067+}
8068+
8069+void CHXExSite::_TryCreateYSlider()
8070+{
8071+#if 0
8072+ if( !m_ScrollVertButtonT && IsSiteVisible() )
8073+ _CreateVertScrollBar();
8074+#endif
8075+}
8076+
8077+void CHXExSite::_SetYSliderValues(INT32 range, INT32 pageSize)
8078+{
8079+ //XXXgfw this is a do nothing as long as we only have
8080+ //scroll buttons on unix and not real scroll bars.
8081+}
8082+
8083+void CHXExSite::_GetSystemSizeOfSliders(INT32* pWidth, INT32* pHeight)
8084+{
8085+#if 0
8086+ *pWidth = *pHeight = SCROLL_BAR_WIDTH;
8087+#endif
8088+}
8089+
8090+HXBOOL CHXExSite::_IsWindowVisible()
8091+{
8092+#if 0
8093+ HX_RESULT retVal = FALSE;
8094+ //XXXgfw do this for now...
8095+ retVal = IsSiteVisible();
8096+ return retVal;
8097+#else
8098+ return FALSE;
8099+#endif
8100+
8101+}
8102+
8103+void CHXExSite::_ShowXSlider(HXBOOL bShow)
8104+{
8105+#if 0
8106+ if( GetWindow() )
8107+ {
8108+ if( bShow )
8109+ _MapHorzScroll();
8110+ else
8111+ _UnmapHorzScroll();
8112+ }
8113+#endif
8114+}
8115+
8116+void CHXExSite::_MoveXSlider( INT32 left,
8117+ INT32 top,
8118+ INT32 right,
8119+ INT32 bottom,
8120+ HXBOOL bRedraw )
8121+{
8122+ //Do nothing right now....
8123+}
8124+
8125+void CHXExSite::_ShowYSlider(HXBOOL bShow)
8126+{
8127+#if 0
8128+ if( GetWindow() )
8129+ {
8130+ if( bShow )
8131+ _MapVertScroll();
8132+ else
8133+ _UnmapVertScroll();
8134+ }
8135+#endif
8136+}
8137+
8138+void CHXExSite::_MoveYSlider( INT32 left,
8139+ INT32 top,
8140+ INT32 right,
8141+ INT32 bottom,
8142+ HXBOOL bRedraw)
8143+{
8144+ //do nothing right now...
8145+}
8146+
8147+HXBOOL CHXExSite::_DoesXSliderExist()
8148+{
8149+ return FALSE;
8150+// return (m_ScrollHorizButtonL!=0);
8151+}
8152+
8153+void* CHXExSite::_GetContainingWindow()
8154+{
8155+ //XXXgfw Do we need this???
8156+ return NULL;
8157+}
8158+
8159+void CHXExSite::_GetCursorPos(HXxPoint* pPoint)
8160+{
8161+ //Return the cursor pos in screen coords.
8162+ Window rootWin;
8163+ Window childWin;
8164+ int rootX=0;
8165+ int rootY=0;
8166+ int childX=0;
8167+ int childY=0;
8168+ unsigned int mask=0;
8169+ Bool ret=FALSE;
8170+
8171+ HX_ASSERT(GetWindow());
8172+ Display* pDis = (Display*)GetWindow()->display;
8173+ XLockDisplay(pDis);
8174+ ret = XQueryPointer(pDis,
8175+ (Window)GetWindow()->window,
8176+ &rootWin,
8177+ &childWin,
8178+ &rootX, &rootY,
8179+ &childX, &childY,
8180+ &mask);
8181+ XUnlockDisplay(pDis);
8182+
8183+ if(ret)
8184+ {
8185+ pPoint->x = rootX;
8186+ pPoint->y = rootY;
8187+ }
8188+}
8189+void* CHXExSite::_GetWindowWithCursor()
8190+{
8191+#if 0
8192+ //Return the cursor pos in screen coords.
8193+ void* pRet = NULL;
8194+ int rootX = 0;
8195+ int rootY = 0;
8196+ int childX= 0;
8197+ int childY= 0;
8198+ unsigned int mask = 0;
8199+ Bool ret = FALSE;
8200+ Window rootWin;
8201+ Window childWin;
8202+
8203+ HX_ASSERT(GetWindow());
8204+ Display* pDis = (Display*)GetWindow()->display;
8205+ XLockDisplay(pDis);
8206+ ret = XQueryPointer(pDis,
8207+ (Window)GetWindow()->window,
8208+ &rootWin,
8209+ &childWin,
8210+ &rootX, &rootY,
8211+ &childX, &childY,
8212+ &mask);
8213+ XUnlockDisplay(pDis);
8214+
8215+ if(ret)
8216+ {
8217+ pRet = (void*)childWin;
8218+ }
8219+ return pRet;
8220+#else
8221+ HX_ASSERT( "Not implemented..." == NULL );
8222+ return NULL;
8223+#endif
8224+}
8225+
8226+void CHXExSite::_MapPointToOSWindow(HXxPoint* pPt, void** pWindowHandle)
8227+{
8228+ //XXXgfw we could query the window tree and traverse down but that
8229+ //is really slow and this isn't used right now.
8230+ HX_ASSERT( "Not implemented..." == NULL );
8231+}
8232+
8233+void CHXExSite::_ReInitPrimarySurface()
8234+{
8235+ //Nothing to do in unix here right?
8236+}
8237+
8238+HXBOOL CHXExSite::_MoveWindow( void* win,
8239+ INT32 X,
8240+ INT32 Y,
8241+ INT32 nWidth,
8242+ INT32 nHeight,
8243+ HXBOOL bRepaint)
8244+{
8245+#if 0
8246+ //XXXgfw we still have to do bRepaint....
8247+ HX_ASSERT( m_pWindow && m_pWindow->window && m_pWindow->display);
8248+ _DestroyScrollButtons();
8249+ XLockDisplay((Display*) m_pWindow->display);
8250+ XMoveResizeWindow( (Display*)m_pWindow->display,
8251+ (Window)m_pWindow->window,
8252+ X,
8253+ Y,
8254+ nWidth,
8255+ nHeight
8256+ );
8257+ XUnlockDisplay((Display*) m_pWindow->display);
8258+#else
8259+ HX_ASSERT( "Not implemented..." == NULL );
8260+#endif
8261+ return TRUE;
8262+}
8263+
8264+HXBOOL CHXExSite::_UpdateWindow(void* hWnd)
8265+{
8266+ //We need to generate a repaint here of the window....
8267+ return TRUE;
8268+}
8269+
8270+HXBOOL CHXExSite::_ShowWindow(void* hWnd, INT32 nCmdShow)
8271+{
8272+#if 0
8273+ HX_ASSERT( nCmdShow==HX_SHOW_WINDOW || nCmdShow==HX_HIDE_WINDOW);
8274+ if( !m_pWindow || !m_pWindow->window || !m_pWindow->display )
8275+ return FALSE;
8276+
8277+ if( nCmdShow == HX_SHOW_WINDOW )
8278+ {
8279+ _MapScrollButtons();
8280+ XLockDisplay((Display*) m_pWindow->display);
8281+ XMapWindow( (Display*)m_pWindow->display, (Window)m_pWindow->window );
8282+ XUnlockDisplay((Display*) m_pWindow->display);
8283+ }
8284+ else
8285+ {
8286+ _UnmapScrollButtons();
8287+ XLockDisplay((Display*) m_pWindow->display);
8288+ XUnmapWindow( (Display*)m_pWindow->display, (Window)m_pWindow->window );
8289+ XUnlockDisplay((Display*) m_pWindow->display);
8290+ }
8291+#endif
8292+ return TRUE;
8293+}
8294+
8295+HXBOOL CHXExSite::_SetWindowPos(void* hWnd,
8296+ void* hWndInsertAfter,
8297+ INT32 X,
8298+ INT32 Y,
8299+ INT32 cx,
8300+ INT32 cy,
8301+ INT32 uFlags)
8302+{
8303+#ifdef _DEBUG
8304+ fprintf( stderr, "Now what on earth is this suppose to do??\n" );
8305+#endif
8306+ return TRUE;
8307+}
8308+
8309+HXBOOL CHXExSite::_SetWindowRgn(void* hWnd, HXREGION* hRgn, HXBOOL bRedraw)
8310+{
8311+#if 0
8312+ HX_ASSERT( GetWindow() );
8313+ Display* pDis = (Display*)GetWindow()->display;
8314+ XLockDisplay(pDis);
8315+ XSetRegion( pDis,
8316+ (GC)m_pVideoSurface->_GetDC(NULL),
8317+ (Region)hRgn
8318+ );
8319+ XUnlockDisplay(pDis);
8320+ if( bRedraw )
8321+ {
8322+ HX_ASSERT("Redraw asked for here"==NULL );
8323+ }
8324+#endif
8325+ return TRUE;
8326+}
8327+
8328+void CHXExSite::_SetFocus(void* pWindow)
8329+{
8330+#if 0
8331+ XWindowAttributes attr;
8332+ HXxWindow* pWin = GetWindow();
8333+
8334+ HX_ASSERT(pWin);
8335+ HX_ASSERT(pWindow);
8336+
8337+ XLockDisplay((Display*) pWin->display);
8338+ XGetWindowAttributes((Display*)pWin->display, (Window)pWindow, &attr);
8339+ XUnlockDisplay((Display*) pWin->display);
8340+ if( attr.map_state == IsViewable )
8341+ {
8342+ XLockDisplay((Display*) pWin->display);
8343+ XSetInputFocus( (Display*)pWin->display,
8344+ (Window)pWindow,
8345+ RevertToParent,
8346+ CurrentTime
8347+ );
8348+ XUnlockDisplay((Display*) pWin->display);
8349+ }
8350+
8351+ return;
8352+#endif
8353+}
8354+
8355+HX_RESULT CHXExSite::_EnterFullScreen(HXxWindow* pWindow)
8356+{
8357+#if 0
8358+ HXxWindow* pWin = GetWindow();
8359+ HX_ASSERT( pWin && pWin->display && pWin->display);
8360+ HX_ASSERT( this == m_pTopLevelSite );
8361+
8362+ if( 0 != m_winFullScreenWindow || IsFullScreen() )
8363+ {
8364+ //We are already in full screen
8365+ return HXR_FAIL;
8366+ }
8367+
8368+ //Create a override redirect window to fill the root.
8369+ XSizeHints size_hints;
8370+ XLockDisplay((Display*) pWin->display);
8371+ Screen* pScreen = XDefaultScreenOfDisplay((Display*)pWin->display);
8372+ XUnlockDisplay((Display*) pWin->display);
8373+ UINT16 uHorzRes = WidthOfScreen(pScreen);
8374+ UINT16 uVertRes = HeightOfScreen(pScreen);
8375+ int attrMask = 0;
8376+ XSetWindowAttributes attr;
8377+
8378+ memset(&attr, 0, sizeof(XSetWindowAttributes));
8379+ attrMask = CWOverrideRedirect | CWBorderPixel |
8380+ CWBackPixel | CWCursor;
8381+ attr.cursor = None;
8382+ attr.override_redirect = True;
8383+ XLockDisplay((Display*)pWin->display);
8384+ attr.background_pixel = BlackPixel((Display*)pWin->display,
8385+ DefaultScreen((Display*)pWin->display));
8386+ attr.border_pixel = BlackPixel((Display*)pWin->display,
8387+ DefaultScreen((Display*)pWin->display));
8388+ XUnlockDisplay((Display*)pWin->display);
8389+
8390+ size_hints.flags = PPosition | PSize;
8391+ size_hints.x = 0;
8392+ size_hints.y = 0;
8393+ size_hints.width = uHorzRes;
8394+ size_hints.height = uVertRes;
8395+
8396+ //Create it.
8397+ XLockDisplay((Display*) pWin->display);
8398+ Window window = XCreateWindow((Display*)pWin->display,
8399+ DefaultRootWindow((Display*)pWin->display),
8400+ size_hints.x,
8401+ size_hints.y,
8402+ size_hints.width,
8403+ size_hints.height,
8404+ 0,
8405+ CopyFromParent,
8406+ InputOutput,
8407+ CopyFromParent,
8408+ attrMask,
8409+ &attr);
8410+
8411+ //Tell the WM about this window.
8412+ XSetStandardProperties( (Display*)pWin->display,
8413+ window,
8414+ "unixfullscreen",
8415+ "unixfullscreen",
8416+ None,
8417+ NULL, 0,
8418+ &size_hints
8419+ );
8420+
8421+ int result = XSelectInput( zm_display, window,
8422+ ButtonPressMask | ButtonReleaseMask | KeyPressMask |
8423+ KeyReleaseMask | EnterWindowMask | LeaveWindowMask |
8424+ PointerMotionMask | ButtonMotionMask | KeymapStateMask |
8425+ ExposureMask | StructureNotifyMask | FocusChangeMask
8426+ );
8427+
8428+ //Map the window.
8429+ XMapWindow((Display*)pWin->display, window);
8430+ XUnlockDisplay((Display*) pWin->display);
8431+
8432+
8433+ //Get ready to resize the presentation....
8434+ if(m_pTopLevelSite)
8435+ {
8436+ m_pTopLevelSite->m_bDisableForceRedraw = TRUE;
8437+ }
8438+
8439+ //Maintain aspect ratio and Scale it.
8440+ float fXScale = (float)uHorzRes/(float)(m_size.cx);
8441+ float fYScale = (float)uVertRes/(float)(m_size.cy);
8442+ float fScale = (fXScale<fYScale) ? fXScale : fYScale;
8443+ int nWidth = (int)(fScale*m_size.cx+.5);
8444+ int nHeight = (int)(fScale*m_size.cy+.5);
8445+
8446+ //Center the presentation and save the old size
8447+ memcpy( &m_PreFullScreenSize, &m_size, sizeof( HXxSize) ); /* Flawfinder: ignore */
8448+ HXxSize size = {nWidth, nHeight};
8449+
8450+ if( nWidth<uHorzRes )
8451+ m_ptFullScreenOffset.x = (uHorzRes-nWidth)/2;
8452+
8453+ if( nHeight<uVertRes )
8454+ m_ptFullScreenOffset.y = (uVertRes-nHeight)/2;
8455+
8456+ //Reparent our main window.......
8457+ Window winRootParent = 0;
8458+ Window winParent = 0;
8459+ Window* pwinChildren = NULL;
8460+ unsigned int nNumChildren = 0;
8461+ XLockDisplay((Display*) pWin->display);
8462+ XQueryTree( (Display*)pWin->display,
8463+ (Window)pWin->window,
8464+ &winRootParent,
8465+ &winParent,
8466+ &pwinChildren,
8467+ &nNumChildren
8468+ );
8469+ //Free unused children list.
8470+ XFree( pwinChildren );
8471+ XUnlockDisplay((Display*) pWin->display);
8472+
8473+ HX_ASSERT( winParent );
8474+ m_winOldParent = winParent;
8475+ XLockDisplay((Display*) pWin->display);
8476+ XReparentWindow( (Display*)pWin->display,
8477+ (Window)pWin->window,
8478+ window,
8479+ m_ptFullScreenOffset.x,
8480+ m_ptFullScreenOffset.y
8481+ );
8482+
8483+ //Flush event queue.
8484+ XSync((Display*)pWin->display, False);
8485+ XUnlockDisplay((Display*) pWin->display);
8486+
8487+ //Save it
8488+ m_winFullScreenWindow = window;
8489+ m_bInFullScreen = TRUE;
8490+
8491+ //Now resize it...
8492+ SetSize(m_size);
8493+ //Redraw the presentation....
8494+ m_pTopLevelSite->m_bDisableForceRedraw = FALSE;
8495+ _ForceRedrawAll();
8496+
8497+ //Give it focus....
8498+ _SetFocus( (void*)pWin->window );
8499+
8500+ // now eat all the focusouts that came as a result of this reparent...
8501+ XEvent event;
8502+ XLockDisplay((Display*) pWin->display);
8503+ HXBOOL status = XCheckTypedWindowEvent((Display*)pWin->display, (Window)pWin->window,
8504+ FocusOut, &event);
8505+ XUnlockDisplay((Display*) pWin->display);
8506+ while (m_bWindowCreatedByCreate && status)
8507+ {
8508+ // just discarding these
8509+ XLockDisplay((Display*) pWin->display);
8510+ status = XCheckTypedWindowEvent((Display*)pWin->display, (Window)pWin->window,
8511+ FocusOut, &event);
8512+ XUnlockDisplay((Display*) pWin->display);
8513+ }
8514+
8515+ //Update the status text...
8516+ if(m_pStatusText)
8517+ {
8518+ m_pStatusText->ParentChangedSize();
8519+ m_pStatusText->Show();
8520+ }
8521+
8522+#else
8523+ HX_ASSERT( "Not implemented..." == NULL );
8524+#endif
8525+ return HXR_OK;
8526+}
8527+
8528+HX_RESULT CHXExSite::_ExitFullScreen()
8529+{
8530+#if 0
8531+ HX_ASSERT( this == m_pTopLevelSite );
8532+
8533+ HXxWindow* pWin = GetWindow();
8534+
8535+ HX_ASSERT( pWin && pWin->display && pWin->window );
8536+
8537+ //Give the window back to the TLC.
8538+
8539+ XLockDisplay((Display*) pWin->display);
8540+ XReparentWindow( (Display*)pWin->display,
8541+ (Window)pWin->window,
8542+ m_winOldParent,
8543+ m_position.x, m_position.y
8544+ );
8545+ XUnlockDisplay((Display*) pWin->display);
8546+
8547+ //Just kill our window and take us out of full screen....
8548+ if( 0 != m_winFullScreenWindow )
8549+ {
8550+ XLockDisplay((Display*) pWin->display);
8551+ XDestroyWindow( (Display*)pWin->display, m_winFullScreenWindow );
8552+ XUnlockDisplay((Display*) pWin->display);
8553+ m_winFullScreenWindow = 0;
8554+ }
8555+
8556+ m_bDisableForceRedraw = TRUE;
8557+
8558+ m_bInFullScreen = FALSE;
8559+ HXxSize size = {0,0};
8560+ memcpy( &size, &m_PreFullScreenSize, sizeof(HXxSize) ); /* Flawfinder: ignore */
8561+ m_PreFullScreenSize.cx = m_PreFullScreenSize.cy = 0;
8562+
8563+ SetSize(size);
8564+ _SetFocus( (void*)pWin->window );
8565+ m_ptFullScreenOffset.x = 0;
8566+ m_ptFullScreenOffset.y = 0;
8567+
8568+
8569+ m_bDisableForceRedraw = FALSE;
8570+ _ForceRedrawAll();
8571+
8572+ if(m_pStatusText)
8573+ {
8574+ m_pStatusText->ParentChangedSize();
8575+ m_pStatusText->Hide();
8576+ }
8577+
8578+ //move the site back to where it was.
8579+ if( m_pTopLevelSite )
8580+ {
8581+ m_pTopLevelSite->_SetPosition(m_CreateWindowPos);
8582+ }
8583+
8584+ return HXR_OK;
8585+#else
8586+ HX_ASSERT( "Not implemented..." == NULL );
8587+#endif
8588+}
8589+
8590+HX_RESULT CHXExSite::_EnterFullScreenNoNewWindow()
8591+{
8592+#if 0
8593+ HXxWindow* pWin = GetWindow();
8594+
8595+ HX_ASSERT( pWin && pWin->display && pWin->display);
8596+ HX_ASSERT( this == m_pTopLevelSite );
8597+
8598+ if(IsFullScreen() || !pWin)
8599+ {
8600+ //We are already in full screen
8601+ return HXR_FAIL;
8602+ }
8603+
8604+ //Get the screen size.
8605+ XLockDisplay((Display*) pWin->display);
8606+ Screen* pScreen = XDefaultScreenOfDisplay((Display*)pWin->display);
8607+ UINT16 uHorzRes = WidthOfScreen(pScreen);
8608+ UINT16 uVertRes = HeightOfScreen(pScreen);
8609+ XUnlockDisplay((Display*)pWin->display);
8610+
8611+ //Get ready to resize the presentation....
8612+ if( m_pTopLevelSite )
8613+ {
8614+ m_pTopLevelSite->m_bDisableForceRedraw = TRUE;
8615+ }
8616+
8617+ //Maintain aspect ratio and Scale it.
8618+ float fXScale = (float)uHorzRes/(float)(m_size.cx);
8619+ float fYScale = (float)uVertRes/(float)(m_size.cy);
8620+ float fScale = (fXScale<fYScale) ? fXScale : fYScale;
8621+ int nWidth = (int)(fScale*m_size.cx+.5);
8622+ int nHeight = (int)(fScale*m_size.cy+.5);
8623+
8624+ //Center the presentation and save the old size
8625+ memcpy( &m_PreFullScreenSize, &m_size, sizeof( HXxSize) ); /* Flawfinder: ignore */
8626+
8627+ HXxSize size = {nWidth, nHeight};
8628+
8629+ if( nWidth < uHorzRes )
8630+ {
8631+ m_ptFullScreenOffset.x = (uHorzRes - nWidth)/2;
8632+ }
8633+
8634+ if( nHeight < uVertRes )
8635+ {
8636+ m_ptFullScreenOffset.y = (uVertRes - nHeight)/2;
8637+ }
8638+
8639+ //Reparent our main window.......
8640+ Window winRootParent = 0;
8641+ Window winParent = 0;
8642+ Window* pwinChildren = NULL;
8643+ unsigned int nNumChildren = 0;
8644+ XLockDisplay((Display*) pWin->display);
8645+ XQueryTree( (Display*)pWin->display,
8646+ (Window)pWin->window,
8647+ &winRootParent,
8648+ &winParent,
8649+ &pwinChildren,
8650+ &nNumChildren
8651+ );
8652+
8653+ //Free unused children list.
8654+ XFree( pwinChildren );
8655+ XUnlockDisplay((Display*) pWin->display);
8656+
8657+ HX_ASSERT( winParent );
8658+ m_winOldParent = winParent;
8659+
8660+ m_bInFullScreen = TRUE;
8661+
8662+ //Now resize it...
8663+ SetSize(m_size);
8664+
8665+ //Redraw the presentation....
8666+ if( m_pTopLevelSite )
8667+ {
8668+ m_pTopLevelSite->m_bDisableForceRedraw = FALSE;
8669+ }
8670+
8671+ _ForceRedrawAll();
8672+
8673+ //Give it focus....
8674+ _SetFocus( (void*)pWin->window );
8675+
8676+ // now eat all the focusouts that came as a result of this reparent...
8677+ XEvent event;
8678+ XLockDisplay((Display*) pWin->display);
8679+ HXBOOL status = XCheckTypedWindowEvent((Display*)pWin->display, (Window)pWin->window,
8680+ FocusOut, &event);
8681+ XUnlockDisplay((Display*) pWin->display);
8682+ while (m_bWindowCreatedByCreate && status)
8683+ {
8684+ // just discarding these
8685+ XLockDisplay((Display*) pWin->display);
8686+ status = XCheckTypedWindowEvent((Display*)pWin->display, (Window)pWin->window,
8687+ FocusOut, &event);
8688+ XUnlockDisplay((Display*) pWin->display);
8689+ }
8690+
8691+ //Update the status text...
8692+ if(m_pStatusText)
8693+ {
8694+ m_pStatusText->ParentChangedSize();
8695+ m_pStatusText->Show();
8696+ }
8697+#if defined(HELIX_CONFIG_MOBLIN)
8698+ if(!m_pAttachWindowCallback)
8699+ {
8700+ m_pAttachWindowCallback = new CHXGenericCallback((void*)this, (fGenericCBFunc)AttachWindowCallback);
8701+ m_pAttachWindowCallback->AddRef();
8702+ }
8703+ if(!m_pForceRedrawCallback)
8704+ {
8705+ m_pForceRedrawCallback = new CHXGenericCallback((void*)this, (fGenericCBFunc)ForceRedrawCallback);
8706+ m_pForceRedrawCallback->AddRef();
8707+ }
8708+
8709+ // schedule callback for Attaching Window
8710+ if(m_pAttachWindowCallback)
8711+ {
8712+ m_pAttachWindowCallback->CallbackScheduled(m_pScheduler->RelativeEnter(m_pAttachWindowCallback, 100));
8713+ }
8714+ if(m_pForceRedrawCallback)
8715+ {
8716+ m_pForceRedrawCallback->CallbackScheduled(m_pScheduler->RelativeEnter(m_pForceRedrawCallback, 500));
8717+ }
8718+
8719+#endif
8720+#else
8721+ HX_ASSERT( "Not implemented..." == NULL );
8722+#endif
8723+ return HXR_OK;
8724+}
8725+
8726+#if defined(HELIX_CONFIG_MOBLIN)
8727+void CHXExSite::AttachWindowCallback(void* pParam)
8728+{
8729+ CHXExSite* pObj = (CHXExSite*)pParam;
8730+ if (pObj)
8731+ {
8732+ pObj->_AttachWindow();
8733+ }
8734+}
8735+
8736+
8737+void CHXExSite::ForceRedrawCallback(void* pParam)
8738+{
8739+ CHXExSite* pObj = (CHXExSite*)pParam;
8740+
8741+ if (pObj)
8742+ {
8743+ UINT32 ulNumOfChildren = pObj->GetNumberOfChildSites();
8744+ if(pObj->m_pTopLevelSite)
8745+ {
8746+ pObj->m_pTopLevelSite->m_bDisableForceRedraw = FALSE;
8747+ }
8748+ for ( UINT32 i = 0; i < ulNumOfChildren; ++i )
8749+ {
8750+ SPIHXSite spChildSite;
8751+ if ( SUCCEEDED( pObj->GetNthChildSite( i, *spChildSite.AsInOutParam() ) )
8752+ && spChildSite.IsValid() )
8753+ {
8754+ spChildSite->DamageRegion( NULL );
8755+ spChildSite->ForceRedraw();
8756+ }
8757+
8758+ }
8759+ }
8760+}
8761+
8762+void CHXExSite::RemovePendingCallback(CHXGenericCallback* pCB)
8763+{
8764+ if (pCB &&
8765+ pCB->GetPendingCallback() &&
8766+ m_pScheduler)
8767+ {
8768+ m_pScheduler->Remove(pCB->GetPendingCallback());
8769+ pCB->CallbackCanceled();
8770+ }
8771+}
8772+#endif
8773+
8774+HX_RESULT CHXExSite::_EnterFullScreenExt(HXxWindow* pWindow, IHXValues* pValues)
8775+{
8776+#if 0
8777+ m_bReparent = FALSE;
8778+ HX_RESULT res = HXR_OK;
8779+ UINT32 ulReparent = 0;
8780+
8781+ if (pValues)
8782+ {
8783+ pValues->GetPropertyULONG32("Reparent", ulReparent);
8784+ }
8785+
8786+ m_bReparent = (HXBOOL)ulReparent;
8787+
8788+ if (m_bReparent)
8789+ {
8790+ res = _EnterFullScreen(pWindow);
8791+ }
8792+ else
8793+ {
8794+ res = _EnterFullScreenNoNewWindow();
8795+ }
8796+
8797+ CHXBaseSite::FullScreenEntered(res);
8798+ return res;
8799+#else
8800+ HX_ASSERT( "Not implemented..." == NULL );
8801+ return HXR_OK; /* this makes compiler happy */
8802+#endif
8803+}
8804+
8805+HX_RESULT CHXExSite::_ExitFullScreenExt()
8806+{
8807+#if 0
8808+ HX_RESULT res = _ExitFullScreen();
8809+#if defined(HELIX_CONFIG_MOBLIN)
8810+ // schedule callback for attaching window
8811+ if(m_pAttachWindowCallback)
8812+ {
8813+ m_pAttachWindowCallback->CallbackScheduled(m_pScheduler->RelativeEnter(m_pAttachWindowCallback, 100));
8814+ }
8815+ // schedule callback for Force Redraw the window
8816+ if(m_pForceRedrawCallback)
8817+ {
8818+ m_pForceRedrawCallback->CallbackScheduled(m_pScheduler->RelativeEnter(m_pForceRedrawCallback, 500));
8819+ }
8820+#endif
8821+ CHXBaseSite::FullScreenExited(res);
8822+
8823+ return res;
8824+#else
8825+ HX_ASSERT( "Not implemented..." == NULL );
8826+ return HXR_OK; /* this makes compiler happy */
8827+#endif
8828+
8829+}
8830+
8831+HX_RESULT CHXExSite::_EventOccurred(HXxEvent* pEvent)
8832+{
8833+ return HXR_OK;
8834+}
8835+
8836+HX_RESULT CHXExSite::_TestFullScreen( void* hTestBitmap,
8837+ const char* pszStatusText )
8838+{
8839+#ifdef _DEBUG
8840+ fprintf( stderr, "Going to test full screen....\n" );
8841+#endif
8842+ return HXR_OK;
8843+}
8844+
8845+void CHXExSite::ProcessEvent(HXxEvent* pEvent)
8846+{
8847+ if(pEvent)
8848+ {
8849+ //Expose event compression. Combine all outstanding expose events
8850+ //into one big region.
8851+ if(Expose==pEvent->event)
8852+ {
8853+ _CollapseExposeEvents((XEvent*)pEvent->param2);
8854+ }
8855+ }
8856+
8857+ //Send the event to each registered UnixSite.
8858+ void* pSite = NULL;
8859+ void* pWindow = NULL;
8860+ POSITION pos = z_mapSiteToWindow.GetStartPosition();
8861+ while( pos )
8862+ {
8863+ z_mapSiteToWindow.GetNextAssoc(pos, pSite, pWindow);
8864+ CHXExSite* pSiteWindowed = (CHXExSite*)pSite;
8865+ CHXExSite* pTopLevel = NULL;
8866+ HX_ASSERT(pSiteWindowed);
8867+ pSiteWindowed->AddRef();
8868+ pTopLevel = (CHXExSite*)pSiteWindowed->GetTopLevelSite();
8869+
8870+ if(pEvent)
8871+ {
8872+ //Call back into the basesite's event loop.
8873+ pTopLevel->EventOccurred(pEvent);
8874+ }
8875+
8876+ //XXXgfw As a workaround for the overlay not moving while the
8877+ //player is paused, we will check it here and update it if needed.
8878+
8879+ //XXXRGG We might be able to use X's ConfigureNotify messages instead
8880+ //of doing a refresh every 50 ms.
8881+ pTopLevel->_UpdateOverlayIfNeeded();
8882+
8883+ pSiteWindowed->Release();
8884+ }
8885+}
8886+
8887+void CHXExSite::_CollapseExposeEvents(XEvent* xevent)
8888+{
8889+ Display* display = xevent->xany.display;
8890+ Window window = xevent->xany.window;
8891+ XExposeEvent* expose_event = (XExposeEvent*)xevent;
8892+ XEvent new_event;
8893+ XExposeEvent* new_expose_event = (XExposeEvent*)&new_event;
8894+ ushort x1;
8895+ ushort y1;
8896+ ushort x2;
8897+ ushort y2;
8898+ ushort x3;
8899+ ushort y3;
8900+
8901+ x1 = expose_event->x;
8902+ y1 = expose_event->y;
8903+ x2 = x1 + expose_event->width;
8904+ y2 = y1 + expose_event->height;
8905+ XLockDisplay(display);
8906+ HXBOOL status = XCheckWindowEvent(display, window, ExposureMask, &new_event);
8907+ XUnlockDisplay(display);
8908+ while( status)
8909+ {
8910+ if (new_expose_event->x < x1)
8911+ x1 = new_expose_event->x;
8912+
8913+ if (new_expose_event->y < y1)
8914+ y1 = new_expose_event->y;
8915+
8916+ x3 = new_expose_event->x + new_expose_event->width;
8917+ if (x3 > x2)
8918+ x2 = x3;
8919+
8920+ y3 = new_expose_event->y + new_expose_event->height;
8921+ if (y3 > y2)
8922+ y2 = y3;
8923+ XLockDisplay(display);
8924+ status = XCheckWindowEvent(display, window, ExposureMask, &new_event);
8925+ XUnlockDisplay(display);
8926+
8927+ }
8928+
8929+ expose_event->x = x1;
8930+ expose_event->y = y1;
8931+ expose_event->width = x2 - x1;
8932+ expose_event->height = y2 - y1;
8933+ expose_event->count = new_expose_event->count;
8934+}
8935+
8936+
8937+HXBOOL CHXExSite::_ShouldProcess(HXxEvent* pEvent)
8938+{
8939+ HXBOOL bShouldProcessThisEvent = TRUE;
8940+
8941+
8942+ if( !IsSiteVisible() )
8943+ {
8944+ switch (pEvent->event)
8945+ {
8946+ case ButtonPress:
8947+ case ButtonRelease:
8948+ case Expose:
8949+ case FocusIn:
8950+ bShouldProcessThisEvent = FALSE;
8951+ break;
8952+ default:
8953+ break;
8954+ }
8955+ }
8956+
8957+ if(m_pWindow && m_pWindow->window!=pEvent->window)
8958+ {
8959+ bShouldProcessThisEvent = FALSE;
8960+ }
8961+ return bShouldProcessThisEvent;
8962+}
8963+
8964+
8965+///////////////////////////////////////////////////////
8966+//
8967+// UnixEventHandler methods...
8968+//
8969+CHXExSite::UnixEventHandler::UnixEventHandler(CHXExSite* pParent)
8970+ : m_pParent(pParent),
8971+ m_lRefCount(0),
8972+ m_cbHandle(0)
8973+{
8974+ HX_ASSERT(m_pParent);
8975+ HX_ASSERT(m_pParent->m_pScheduler);
8976+ m_cbHandle = m_pParent->m_pScheduler->RelativeEnter((IHXCallback*)this, 30);
8977+}
8978+
8979+CHXExSite::UnixEventHandler::~UnixEventHandler()
8980+{
8981+ CancelCallback();
8982+}
8983+
8984+void
8985+CHXExSite::UnixEventHandler::CancelCallback()
8986+{
8987+ if( m_cbHandle && m_pParent && m_pParent->m_pScheduler )
8988+ {
8989+ UINT32 tempHandle = m_cbHandle;
8990+ m_cbHandle = 0;
8991+ m_pParent->m_pScheduler->Remove(tempHandle);
8992+ }
8993+}
8994+
8995+HX_RESULT CHXExSite::UnixEventHandler::QueryInterface(REFIID riid, void** ppvObj)
8996+{
8997+ if (IsEqualIID(riid, IID_IHXCallback))
8998+ {
8999+ AddRef();
9000+ *ppvObj = (IHXCallback*)this;
9001+ return HXR_OK;
9002+ }
9003+ else if (IsEqualIID(riid, IID_IUnknown))
9004+ {
9005+ AddRef();
9006+ *ppvObj = this;
9007+ return HXR_OK;
9008+ }
9009+
9010+ *ppvObj = NULL;
9011+ return HXR_NOINTERFACE;
9012+}
9013+
9014+ULONG32 CHXExSite::UnixEventHandler::AddRef()
9015+{
9016+ return InterlockedIncrement(&m_lRefCount);
9017+}
9018+
9019+ULONG32 CHXExSite::UnixEventHandler::Release()
9020+{
9021+ HX_ASSERT(m_lRefCount>0);
9022+ if( InterlockedDecrement(&m_lRefCount)>0 )
9023+ {
9024+ return m_lRefCount;
9025+ }
9026+ delete this;
9027+ return 0;
9028+}
9029+
9030+//IHXCallback methods
9031+HX_RESULT CHXExSite::UnixEventHandler::Func()
9032+{
9033+ XEvent xevent;
9034+ static HXxEvent pnevent;
9035+
9036+ m_cbHandle = 0;
9037+ XLockDisplay(m_pParent->zm_display);
9038+ int status = XPending(m_pParent->zm_display);
9039+ XUnlockDisplay(m_pParent->zm_display);
9040+ while(status)
9041+ {
9042+ XLockDisplay(m_pParent->zm_display);
9043+ XNextEvent(m_pParent->zm_display, &xevent);
9044+ XUnlockDisplay(m_pParent->zm_display);
9045+
9046+ // package native event in HXxEvent and send to dispatcher
9047+ pnevent.event = xevent.type;
9048+ pnevent.window = (void *)xevent.xany.window;
9049+ pnevent.param1 = xevent.xany.display;
9050+ pnevent.param2 = &xevent;
9051+
9052+ m_pParent->ProcessEvent(&pnevent);
9053+ XLockDisplay(m_pParent->zm_display);
9054+ status = XPending(m_pParent->zm_display);
9055+ XUnlockDisplay(m_pParent->zm_display);
9056+ }
9057+
9058+ if (m_pParent && m_pParent->m_pScheduler)
9059+ {
9060+ m_cbHandle = m_pParent->m_pScheduler->RelativeEnter((IHXCallback*)this, 30);
9061+ }
9062+ return HXR_OK;
9063+}
9064+
9065+void CHXExSite::_UpdateOverlayIfNeeded()
9066+{
9067+ if( m_pVideoSurface )
9068+ {
9069+ if( m_pVideoSurface->m_nBltMode == HX_OVERLAY_BLT )
9070+ {
9071+ ULONG32 ulNow = HX_GET_BETTERTICKCOUNT();
9072+ CUnixSurf* pSurf = (CUnixSurf*)m_pVideoSurface;
9073+ if( ulNow- pSurf->m_ulLastOverlayUpdateTime > 50 )
9074+ {
9075+ SiteMoving(0,0);
9076+ }
9077+ }
9078+ }
9079+ LISTPOSITION pos = m_ChildrenInZOrder.GetHeadPosition();
9080+ while(pos)
9081+ {
9082+ CHXExSite* pSite = (CHXExSite*)m_ChildrenInZOrder.GetNext(pos);
9083+ pSite->_UpdateOverlayIfNeeded();
9084+ }
9085+}
9086+
9087+
9088+HXBOOL CHXExSite::_ShouldEnterForceRedraw()
9089+{
9090+ if( !m_bDamaged || !m_pUser || !IsSiteVisible() )
9091+ {
9092+ return FALSE;
9093+ }
9094+
9095+ if(InterlockedIncrement(&m_lBltEntryCount)>1)
9096+ {
9097+ InterlockedDecrement(&m_lBltEntryCount);
9098+ return FALSE;
9099+ }
9100+
9101+ return TRUE;
9102+}
9103+
9104+void CHXExSite::_ExitForceRedraw()
9105+{
9106+ InterlockedDecrement(&m_lBltEntryCount);
9107+}
9108+
9109Index: helix-libs/clientapps/clutter/exsite.h
9110===================================================================
9111--- /dev/null 1970-01-01 00:00:00.000000000 +0000
9112+++ helix-libs/clientapps/clutter/exsite.h 2008-10-13 06:05:49.000000000 -0700
9113@@ -0,0 +1,272 @@
9114+/* ***** BEGIN LICENSE BLOCK *****
9115+ * Source last modified: $Id: unixsite.h,v 1.10.2.3 2008/06/05 14:24:30 lovish Exp $
9116+ *
9117+ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
9118+ *
9119+ * The contents of this file, and the files included with this file,
9120+ * are subject to the current version of the RealNetworks Public
9121+ * Source License (the "RPSL") available at
9122+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
9123+ * the file under the current version of the RealNetworks Community
9124+ * Source License (the "RCSL") available at
9125+ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
9126+ * will apply. You may also obtain the license terms directly from
9127+ * RealNetworks. You may not use this file except in compliance with
9128+ * the RPSL or, if you have a valid RCSL with RealNetworks applicable
9129+ * to this file, the RCSL. Please see the applicable RPSL or RCSL for
9130+ * the rights, obligations and limitations governing use of the
9131+ * contents of the file.
9132+ *
9133+ * Alternatively, the contents of this file may be used under the
9134+ * terms of the GNU General Public License Version 2 (the
9135+ * "GPL") in which case the provisions of the GPL are applicable
9136+ * instead of those above. If you wish to allow use of your version of
9137+ * this file only under the terms of the GPL, and not to allow others
9138+ * to use your version of this file under the terms of either the RPSL
9139+ * or RCSL, indicate your decision by deleting the provisions above
9140+ * and replace them with the notice and other provisions required by
9141+ * the GPL. If you do not delete the provisions above, a recipient may
9142+ * use your version of this file under the terms of any one of the
9143+ * RPSL, the RCSL or the GPL.
9144+ *
9145+ * This file is part of the Helix DNA Technology. RealNetworks is the
9146+ * developer of the Original Code and owns the copyrights in the
9147+ * portions it created.
9148+ *
9149+ * This file, and the files included with this file, is distributed
9150+ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
9151+ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
9152+ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
9153+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
9154+ * ENJOYMENT OR NON-INFRINGEMENT.
9155+ *
9156+ * Technology Compatibility Kit Test Suite(s) Location:
9157+ * http://www.helixcommunity.org/content/tck
9158+ *
9159+ * Contributor(s):
9160+ * Phil Dibowitz (jaymzh)
9161+ *
9162+ * ***** END LICENSE BLOCK ***** */
9163+
9164+#ifndef _UNIXSITE_H
9165+#define _UNIXSITE_H
9166+
9167+#if defined(USE_XWINDOWS)
9168+#include <X11/Xatom.h>
9169+#include <X11/Xlib.h>
9170+#include <X11/Xutil.h>
9171+#include <X11/Xos.h>
9172+#include <X11/Intrinsic.h>
9173+#include <X11/extensions/XShm.h>
9174+#endif
9175+
9176+#include "basesite.h"
9177+#include "hxcbobj.h"
9178+#include "player.h"
9179+
9180+class CHXExSite : public CHXBaseSite
9181+{
9182+public:
9183+
9184+ friend class CExSurf;
9185+ friend class CExRootSurf;
9186+
9187+ CHXExSite( IUnknown* pContext,
9188+ IUnknown* pUnkOuter,
9189+ INT32 lInitialZorder,
9190+ on_new_frame_cb_t on_new_frame_cb = NULL,
9191+ void *context = NULL);
9192+
9193+ static void ProcessEvent(HXxEvent* pEvent);
9194+ Window CreateXWindow( Window win );
9195+
9196+ void _ForwardUpdateEvent(HXxEvent* pEvent);
9197+
9198+ //static member vars.
9199+ static Display* zm_display;
9200+ void _UpdateOverlayIfNeeded();
9201+ HXBOOL m_bIgnoreFocusOutInFS;
9202+
9203+ //We override this.
9204+ void CheckColorSettings();
9205+
9206+protected:
9207+
9208+ virtual ~CHXExSite();
9209+
9210+ //
9211+ // CHXExSite only methods....
9212+ //
9213+ HX_RESULT _OpenXDisplay(char* DiplayString);
9214+ static void _CollapseExposeEvents(XEvent* xevent);
9215+ HXBOOL _ShouldProcess(HXxEvent* pEvent);
9216+ void _DrawArrows();
9217+ void _CreateHorizScrollBar(void);
9218+ void _CreateVertScrollBar(void);
9219+ HXBOOL _InButton(HXxPoint& pt, int x, int y );
9220+ void _DestroyScrollButtons();
9221+ void _MapScrollButtons();
9222+ void _MapHorzScroll();
9223+ void _MapVertScroll();
9224+ void _UnmapHorzScroll();
9225+ void _UnmapVertScroll();
9226+ void _UnmapScrollButtons();
9227+ void _BuildClipRegion();
9228+ void _ReleaseClippingRegion();
9229+
9230+ //
9231+ // Seperate object for our callbacks to keep the events flowing.
9232+ //
9233+ class UnixEventHandler : public IHXCallback
9234+ {
9235+ public:
9236+ UnixEventHandler(CHXExSite* pParent);
9237+
9238+ //IUnknown methods
9239+ virtual HX_RESULT QueryInterface(REFIID riid, void** ppvObj);
9240+ virtual ULONG32 AddRef();
9241+ virtual ULONG32 Release();
9242+
9243+ //IHXCallback methods
9244+ virtual HX_RESULT Func();
9245+ void CancelCallback();
9246+
9247+ private:
9248+ virtual ~UnixEventHandler();
9249+
9250+ UnixEventHandler();
9251+ UnixEventHandler(const UnixEventHandler&);
9252+ UnixEventHandler& operator=(const UnixEventHandler& it );
9253+
9254+ CHXExSite* m_pParent;
9255+ LONG32 m_lRefCount;
9256+ CallbackHandle m_cbHandle;
9257+
9258+ IUnknown* m_pUnkPlayer;
9259+ };
9260+
9261+
9262+ //
9263+ // CHXBaseSite inherited methods
9264+ //
9265+ virtual void _NeedWindowedSite();
9266+ virtual void _AttachWindow();
9267+ virtual void _DetachWindow();
9268+ virtual void* _Create(void* ParentWindow, UINT32 style);
9269+ virtual void _Destroy(HXxWindow* pWindow);
9270+ virtual void _SetSize(HXxSize size);
9271+ virtual void _SetPosition(HXxPoint position);
9272+ virtual void _DamageRect(HXxRect rect);
9273+ virtual void _DamageRegion(HXxRegion rect);
9274+ virtual HXBOOL _ShouldEnterForceRedraw();
9275+ virtual void _ExitForceRedraw();
9276+ virtual void _SendOSUpdateMessage();
9277+ virtual void _ShowSite(HXBOOL bShow);
9278+ virtual HXBOOL _AtSystemTime();
9279+ virtual void _GetDeviceCaps( void* hdc,
9280+ UINT16& uBitesPerPixel,
9281+ UINT16& uHorzRes,
9282+ UINT16& uVertRes );
9283+ virtual void _GetWindowRect(HXxRect* destRect);
9284+ virtual void _DestroySliders();
9285+ virtual HXBOOL _HandleOSEvents(HXxEvent* pEvent);
9286+ virtual HXBOOL _ConvertToHXEvent(HXxEvent* pEvent);
9287+ virtual void _GenerateOSEvent(HXxEvent* pEvent, HXxEvent* pEvent2);
9288+ virtual void _GenerateSetCursorEvent();
9289+ virtual void _TryCreateXSlider();
9290+ virtual void _SetXSliderValues(INT32 range, INT32 pageSize);
9291+ virtual void _TryCreateYSlider();
9292+ virtual void _SetYSliderValues(INT32 range, INT32 pageSize);
9293+ virtual void _GetSystemSizeOfSliders(INT32* pWidth, INT32* pHeight);
9294+ virtual HXBOOL _IsWindowVisible();
9295+ virtual void _ShowXSlider(HXBOOL bShow);
9296+ virtual void _MoveXSlider( INT32 left,
9297+ INT32 top,
9298+ INT32 right,
9299+ INT32 bottom,
9300+ HXBOOL bRedraw );
9301+ virtual void _ShowYSlider(HXBOOL bShow);
9302+ virtual void _MoveYSlider( INT32 left,
9303+ INT32 top,
9304+ INT32 right,
9305+ INT32 bottom,
9306+ HXBOOL bRedraw);
9307+ virtual HXBOOL _DoesXSliderExist();
9308+ virtual void* _GetContainingWindow();
9309+ virtual void _GetCursorPos(HXxPoint* pPoint);
9310+ virtual void _MapPointToOSWindow(HXxPoint* pPt, void** pWindowHandle);
9311+ virtual void* _GetWindowWithCursor();
9312+ virtual void _ReInitPrimarySurface();
9313+ virtual HXBOOL _MoveWindow( void* ,
9314+ INT32 X,
9315+ INT32 Y,
9316+ INT32 nWidth,
9317+ INT32 nHeight,
9318+ HXBOOL bRepaint);
9319+ virtual HXBOOL _UpdateWindow(void* hWnd);
9320+ virtual HXBOOL _ShowWindow(void* hWnd, INT32 nCmdShow);
9321+ virtual HXBOOL _SetWindowPos(void* hWnd,
9322+ void* hWndInsertAfter,
9323+ INT32 X,
9324+ INT32 Y,
9325+ INT32 cx,
9326+ INT32 cy,
9327+ INT32 uFlags);
9328+ virtual HXBOOL _SetWindowRgn(void* hWnd, HXREGION* hRgn, HXBOOL bRedraw);
9329+ virtual void _SetFocus(void* pWindow);
9330+
9331+ virtual HX_RESULT _EnterFullScreen(HXxWindow* pWindow = NULL);
9332+ virtual HX_RESULT _EventOccurred(HXxEvent* pEvent);
9333+ virtual HX_RESULT _ExitFullScreen();
9334+ virtual HX_RESULT _TestFullScreen( void* hTestBitmap,
9335+ const char* pszStatusText );
9336+ virtual HX_RESULT _EnterFullScreenExt(HXxWindow* pWindow, IHXValues* pValues);
9337+ virtual HX_RESULT _ExitFullScreenExt();
9338+#if defined(HELIX_CONFIG_MOBLIN)
9339+ static void AttachWindowCallback(void *pParam);
9340+ static void ForceRedrawCallback(void *pParam);
9341+ void RemovePendingCallback(CHXGenericCallback* pCB);
9342+
9343+ CHXGenericCallback* m_pAttachWindowCallback;
9344+ CHXGenericCallback* m_pForceRedrawCallback;
9345+#endif
9346+ HXBOOL m_bReparent;
9347+
9348+private:
9349+
9350+ //Protect unintentional copy and default ctors.
9351+ CHXExSite();
9352+ CHXExSite( const CHXExSite& );
9353+ CHXExSite& operator=( const CHXExSite& it );
9354+ HX_RESULT _EnterFullScreenNoNewWindow();
9355+
9356+ //member vars.
9357+ UnixEventHandler* m_pUnixEventHandler;
9358+ static Cursor zm_GrabCursor;
9359+ Window m_ScrollHorizButtonL;
9360+ Window m_ScrollHorizButtonR;
9361+ Window m_ScrollVertButtonT;
9362+ Window m_ScrollVertButtonB;
9363+ Window m_winFullScreenWindow;
9364+ Window m_winOldParent;
9365+ HXxPoint m_ptScrollHorizPosL;
9366+ HXxPoint m_ptScrollHorizPosR;
9367+ HXxPoint m_ptScrollVertPosT;
9368+ HXxPoint m_ptScrollVertPosB;
9369+ HXxPoint m_ptFullScreenOffset;
9370+ HXxSize m_PreFullScreenSize;
9371+ HXBOOL m_bScrollingInProgress;
9372+ int m_nScrollDir;
9373+ HXBOOL m_bLastPointInSite;
9374+ HXBOOL m_bDamaged;
9375+ //
9376+ //Private helpers...
9377+ //
9378+
9379+ //returns the HX_VK associated with this keysym....
9380+ UINT32 _MapKeySymToHXVK(KeySym tmpSym, UINT32& uFlags);
9381+ on_new_frame_cb_t m_on_new_frame_cb;
9382+ void *m_context;
9383+};
9384+
9385+#endif //_UNIXSITE_H
9386Index: helix-libs/clientapps/clutter/exsitsup.cpp
9387===================================================================
9388--- /dev/null 1970-01-01 00:00:00.000000000 +0000
9389+++ helix-libs/clientapps/clutter/exsitsup.cpp 2008-10-13 06:05:49.000000000 -0700
9390@@ -0,0 +1,455 @@
9391+/* ***** BEGIN LICENSE BLOCK *****
9392+ * Version: RCSL 1.0/RPSL 1.0
9393+ *
9394+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
9395+ *
9396+ * The contents of this file, and the files included with this file, are
9397+ * subject to the current version of the RealNetworks Public Source License
9398+ * Version 1.0 (the "RPSL") available at
9399+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
9400+ * the file under the RealNetworks Community Source License Version 1.0
9401+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
9402+ * in which case the RCSL will apply. You may also obtain the license terms
9403+ * directly from RealNetworks. You may not use this file except in
9404+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
9405+ * applicable to this file, the RCSL. Please see the applicable RPSL or
9406+ * RCSL for the rights, obligations and limitations governing use of the
9407+ * contents of the file.
9408+ *
9409+ * This file is part of the Helix DNA Technology. RealNetworks is the
9410+ * developer of the Original Code and owns the copyrights in the portions
9411+ * it created.
9412+ *
9413+ * This file, and the files included with this file, is distributed and made
9414+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
9415+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
9416+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
9417+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
9418+ *
9419+ * Technology Compatibility Kit Test Suite(s) Location:
9420+ * http://www.helixcommunity.org/content/tck
9421+ *
9422+ * Contributor(s):
9423+ *
9424+ * ***** END LICENSE BLOCK ***** */
9425+
9426+#ifdef _WIN16
9427+#include <windows.h>
9428+#endif
9429+
9430+#include "hxcom.h"
9431+#include "hxtypes.h"
9432+#include "hxwintyp.h"
9433+#include "hxwin.h"
9434+#include "ihxpckts.h"
9435+#include "hxcomm.h"
9436+#include "fivemmap.h"
9437+#include "hxstring.h" // CHXString
9438+#include "exsite.h"
9439+#include "exsitsup.h"
9440+#include "pckunpck.h" // CreateBufferCCF
9441+#include "ciddefs.h" // CID_RGB32
9442+#if defined(HELIX_FEATURE_PNG)
9443+#include "pxpngenc.h" // PXPNGEncode::EncodeToPNGBuffer
9444+#endif // HELIX_FEATURE_PNG
9445+#include "print.h"
9446+
9447+
9448+#include "globals.h"
9449+struct _stGlobals*& GetGlobal();
9450+
9451+/************************************************************************
9452+ * Method:
9453+ * Constructor
9454+ */
9455+ ExampleSiteSupplier::ExampleSiteSupplier(IUnknown* pUnkPlayer, on_new_frame_cb_t on_new_frame_cb = NULL, void *context = NULL)
9456+ : m_lRefCount(0)
9457+ , m_pSiteManager(NULL)
9458+ , m_pSite(NULL)
9459+ , m_pSiteCapture(NULL)
9460+ , m_pCaptureBuffer(NULL)
9461+ , m_pCCF(NULL)
9462+ , m_pUnkPlayer(pUnkPlayer)
9463+ , m_on_new_frame_cb(on_new_frame_cb)
9464+ , m_context(context)
9465+{
9466+ if (m_pUnkPlayer)
9467+ {
9468+ m_pUnkPlayer->QueryInterface(IID_IHXSiteManager,
9469+ (void**)&m_pSiteManager);
9470+
9471+ //printf("pauldebug:m_pUnkplayer->QueryInterface for m_pCCF calling\n");
9472+ m_pUnkPlayer->QueryInterface(IID_IHXCommonClassFactory,
9473+ (void**)&m_pCCF);
9474+ //printf("pauldebug:m_pUnkplayer->QueryInterface for m_pCCF called\n");
9475+
9476+ m_pUnkPlayer->AddRef();
9477+ }
9478+};
9479+
9480+/************************************************************************
9481+ * Method:
9482+ * Destructor
9483+ */
9484+ExampleSiteSupplier::~ExampleSiteSupplier()
9485+{
9486+ HX_RELEASE(m_pSiteManager);
9487+ HX_RELEASE(m_pSite);
9488+ HX_RELEASE(m_pSiteCapture);
9489+ HX_RELEASE(m_pCaptureBuffer);
9490+ HX_RELEASE(m_pCCF);
9491+ HX_RELEASE(m_pUnkPlayer);
9492+}
9493+
9494+/************************************************************************
9495+ * Method:
9496+ * IUnknown::QueryInterface
9497+ */
9498+ STDMETHODIMP
9499+ExampleSiteSupplier::QueryInterface(REFIID riid, void** ppvObj)
9500+{
9501+ if (IsEqualIID(riid, IID_IUnknown))
9502+ {
9503+ AddRef();
9504+ *ppvObj = (IUnknown*)(IHXSiteSupplier*)this;
9505+ return HXR_OK;
9506+ }
9507+ else if (IsEqualIID(riid, IID_IHXSiteSupplier))
9508+ {
9509+ AddRef();
9510+ *ppvObj = (IHXSiteSupplier*)this;
9511+ return HXR_OK;
9512+ }
9513+
9514+ *ppvObj = NULL;
9515+ return HXR_NOINTERFACE;
9516+}
9517+
9518+/************************************************************************
9519+ * Method:
9520+ * IUnknown::AddRef
9521+ */
9522+ STDMETHODIMP_(ULONG32)
9523+ExampleSiteSupplier::AddRef()
9524+{
9525+ return InterlockedIncrement(&m_lRefCount);
9526+}
9527+
9528+/************************************************************************
9529+ * Method:
9530+ * IUnknown::Release
9531+ */
9532+ STDMETHODIMP_(ULONG32)
9533+ExampleSiteSupplier::Release()
9534+{
9535+ if (InterlockedDecrement(&m_lRefCount) > 0)
9536+ {
9537+ return m_lRefCount;
9538+ }
9539+
9540+ delete this;
9541+ return 0;
9542+}
9543+
9544+/************************************************************************
9545+ * Method:
9546+ * IHXSiteSupplier::SitesNeeded
9547+ * Purpose:
9548+ * Called to inform the site supplier that a site with a particular
9549+ * set of characteristics is needed. If the site supplier can
9550+ * fulfill the request it should call the site manager and add one
9551+ * or more new sites.
9552+ * Note that the request for sites is associated with a Request ID
9553+ * the client core will inform the site supplier when this requested
9554+ * site is no longer needed.
9555+ */
9556+STDMETHODIMP
9557+ExampleSiteSupplier::SitesNeeded
9558+(
9559+ UINT32 uRequestID,
9560+ IHXValues* pProps
9561+ )
9562+{
9563+ /*
9564+ * Don't create a site if the -NULL_RENDER command line option
9565+ * was given. - jfarr
9566+ */
9567+ if (GetGlobal()->g_bNullRender)
9568+ {
9569+ return (HXR_OK);
9570+ }
9571+
9572+ /*
9573+ * If there are no properties, then we can't really create a
9574+ * site, because we have no idea what type of site is desired!
9575+ */
9576+ if (!pProps)
9577+ {
9578+ return HXR_INVALID_PARAMETER;
9579+ }
9580+
9581+ HRESULT hres = HXR_OK;
9582+ IHXValues* pSiteProps = NULL;
9583+ IHXSiteWindowed* pSiteWindowed = NULL;
9584+ IHXBuffer* pValue = NULL;
9585+ UINT32 style = 0;
9586+ IHXSite* pSite = NULL;
9587+
9588+#if 0
9589+ // Just let the RMA client core create a windowed site for us.
9590+ hres = m_pCCF->CreateInstance(CLSID_IHXSiteWindowed,(void**)&pSiteWindowed);
9591+ if (HXR_OK != hres)
9592+ {
9593+ goto exit;
9594+ }
9595+#else
9596+ {
9597+ *(void **)&pSiteWindowed = (IUnknown*)(IHXSiteWindowed*)(new CHXExSite(GetGlobal()->pMediaPlatform, NULL, 0, m_on_new_frame_cb, m_context));
9598+ hres = ((IUnknown*)*(void **)&pSiteWindowed)->QueryInterface(IID_IHXSiteWindowed, (void**)&pSiteWindowed);
9599+ if (HXR_OK != hres)
9600+ {
9601+ goto exit;
9602+ }
9603+ }
9604+#endif
9605+
9606+ hres = pSiteWindowed->QueryInterface(IID_IHXSite,(void**)&pSite);
9607+ if (HXR_OK != hres)
9608+ {
9609+ goto exit;
9610+ }
9611+
9612+ if( !m_pSite )
9613+ {
9614+ m_pSite = pSite;
9615+ m_pSite->AddRef();
9616+ }
9617+
9618+
9619+ hres = pSiteWindowed->QueryInterface(IID_IHXValues,(void**)&pSiteProps);
9620+ if (HXR_OK != hres)
9621+ {
9622+ goto exit;
9623+ }
9624+
9625+ /*
9626+ * We need to figure out what type of site we are supposed to
9627+ * to create. We need to "switch" between site user and site
9628+ * properties. So look for the well known site user properties
9629+ * that are mapped onto sites...
9630+ */
9631+ hres = pProps->GetPropertyCString("playto",pValue);
9632+ if (HXR_OK == hres)
9633+ {
9634+ pSiteProps->SetPropertyCString("channel",pValue);
9635+ HX_RELEASE(pValue);
9636+ }
9637+ else
9638+ {
9639+ hres = pProps->GetPropertyCString("name",pValue);
9640+ if (HXR_OK == hres)
9641+ {
9642+ pSiteProps->SetPropertyCString("LayoutGroup",pValue);
9643+ HX_RELEASE(pValue);
9644+ }
9645+ }
9646+
9647+#ifdef _WINDOWS
9648+ style = WS_OVERLAPPED | WS_VISIBLE | WS_CLIPCHILDREN;
9649+#endif
9650+
9651+ hres = pSiteWindowed->Create(NULL, style);
9652+ if (HXR_OK != hres)
9653+ {
9654+ goto exit;
9655+ }
9656+
9657+ /*
9658+ * We need to wait until we have set all the properties before
9659+ * we add the site.
9660+ */
9661+ hres = m_pSiteManager->AddSite(pSite);
9662+ if (HXR_OK != hres)
9663+ {
9664+ goto exit;
9665+ }
9666+#ifdef _WINDOWS
9667+ {
9668+ HXxWindow* pWindow = pSiteWindowed->GetWindow();
9669+ if (pWindow && pWindow->window) ::SetForegroundWindow( (HWND)(pWindow->window) );
9670+ }
9671+#endif
9672+ m_CreatedSites.SetAt((void*)uRequestID,pSite);
9673+ pSite->AddRef();
9674+
9675+exit:
9676+
9677+ HX_RELEASE(pSiteProps);
9678+ HX_RELEASE(pSiteWindowed);
9679+ HX_RELEASE(pSite);
9680+
9681+ return hres;
9682+}
9683+
9684+/************************************************************************
9685+ * Method:
9686+ * IHXSiteSupplier::SitesNotNeeded
9687+ * Purpose:
9688+ * Called to inform the site supplier that all sites from a previos
9689+ * site request are no longer needed. If the site supplier had
9690+ * previously created non-persistant sites (like popup windows)
9691+ * to fulfill a request for sites it should call the site manager
9692+ * and remove those sites.
9693+ */
9694+STDMETHODIMP
9695+ExampleSiteSupplier::SitesNotNeeded(UINT32 uRequestID)
9696+{
9697+ IHXSite* pSite = NULL;
9698+ IHXSiteWindowed* pSiteWindowed = NULL;
9699+ void* pVoid = NULL;
9700+
9701+ if (!m_CreatedSites.Lookup((void*)uRequestID,pVoid))
9702+ {
9703+ return HXR_INVALID_PARAMETER;
9704+ }
9705+ pSite = (IHXSite*)pVoid;
9706+
9707+ m_pSiteManager->RemoveSite(pSite);
9708+
9709+ // Need to actually do the work on destroying the window
9710+ // and all that jazz.
9711+ pSite->QueryInterface(IID_IHXSiteWindowed,(void**)&pSiteWindowed);
9712+
9713+ pSiteWindowed->Destroy();
9714+
9715+ // ref count = 2
9716+ pSiteWindowed->Release();
9717+
9718+ // ref count = 1; deleted from this object's view!
9719+ pSite->Release();
9720+
9721+ m_CreatedSites.RemoveKey((void*)uRequestID);
9722+
9723+ return HXR_OK;
9724+}
9725+
9726+/************************************************************************
9727+ * Method:
9728+ * IHXSiteSupplier::BeginChangeLayout
9729+ * Purpose:
9730+ * Called to inform the site supplier a layout change has beginning
9731+ * it can expect to recieve SitesNeeded() and SitesNotNeeded() calls
9732+ * while a layout change is in progress,
9733+ */
9734+STDMETHODIMP
9735+ExampleSiteSupplier::BeginChangeLayout()
9736+{
9737+ return HXR_OK;
9738+}
9739+
9740+/************************************************************************
9741+ * Method:
9742+ * IHXSiteSupplier::DoneChangeLayout
9743+ * Purpose:
9744+ * Called to inform the site supplier the layout change has been
9745+ * completed.
9746+ */
9747+STDMETHODIMP
9748+ExampleSiteSupplier::DoneChangeLayout()
9749+{
9750+ return HXR_OK;
9751+}
9752+
9753+HX_RESULT
9754+ExampleSiteSupplier::CaptureImage(CHXString pszFileName, INT32 dWidth, INT32 dHeight)
9755+{
9756+ HX_RESULT res=HXR_FAIL;
9757+
9758+ // Get the IHXSiteCapture object from the site
9759+ if (m_pSiteCapture == NULL)
9760+ {
9761+ if (m_pSite && m_pSite->QueryInterface(IID_IHXSiteCapture, (void**)&m_pSiteCapture) == HXR_OK)
9762+ {
9763+ m_pSiteCapture->AddRef();
9764+ }
9765+ }
9766+
9767+ // Create the buffer that will receive the image data
9768+ if (m_pCaptureBuffer == NULL)
9769+ {
9770+ CreateBufferCCF(m_pCaptureBuffer, m_pCCF);
9771+ if (!m_pCaptureBuffer)
9772+ {
9773+ return HXR_OUTOFMEMORY;
9774+ }
9775+ }
9776+
9777+ HXBOOL bCanCapture = FALSE;
9778+
9779+ // Check if the site is available to capture an image
9780+ if (m_pSiteCapture && (res = m_pSiteCapture->CanCapture(bCanCapture)) == HXR_OK && bCanCapture)
9781+ {
9782+ HX_RESULT res;
9783+ HXxSize outputSize;
9784+ outputSize.cx = dWidth;
9785+ outputSize.cy = dHeight;
9786+ m_strFileName = pszFileName;
9787+
9788+ // Asynchronous call. CaptureDone() will be called with result.
9789+ res = m_pSiteCapture->Capture((IHXSiteCaptureResponse*)this, m_pCaptureBuffer, &outputSize, CID_RGB32);
9790+ }
9791+
9792+ return res;
9793+
9794+}
9795+
9796+//
9797+// IHXSiteCaptureResponse::CaptureDone
9798+//
9799+// Called when the site has captured the next frame.
9800+// bmiOutputFormat points to image format description which
9801+// is valid until the completion of CaptureDone.
9802+// bmiOutputFormat can be different for every capture.
9803+// pCaptureBuffer holds the image if supplied in
9804+// Capture() method. pCaptureBuffer is automatically
9805+// resized if it has insufficient size to hold the image
9806+// data.
9807+//
9808+// status may be:
9809+// HXR_FAIL -- No capture was done. General Error. All data is invalid.
9810+// HXR_OK -- Capture was done. Both variables are valid.
9811+STDMETHODIMP
9812+ExampleSiteSupplier::CaptureDone(REF(HX_RESULT) status,
9813+ REF(HXBitmapInfoHeader) bmiOutputFormat,
9814+ REF(IHXBuffer*) pCaptureBuffer)
9815+{
9816+ if (status == HXR_OK)
9817+ {
9818+#if defined(HELIX_FEATURE_PNG)
9819+ // Convert capture buffer into PNG
9820+ IHXBuffer* pConvertedBuffer=NULL;
9821+ HX_RESULT res = HXR_OK;
9822+ res = PXPNGEncode::EncodeToPNGBuffer(pCaptureBuffer, &bmiOutputFormat, m_pCCF, pConvertedBuffer);
9823+ if (res == HXR_OK && !m_strFileName.IsEmpty())
9824+ {
9825+ CHXString strTail = m_strFileName.Right(4);
9826+ if (strTail.CompareNoCase(".png") != 0)
9827+ {
9828+ m_strFileName += ".png";
9829+ }
9830+
9831+ FILE* fp = fopen(m_strFileName, "wb");
9832+ if (fp)
9833+ {
9834+ fwrite(pConvertedBuffer->GetBuffer(), 1, pConvertedBuffer->GetSize(), fp);
9835+ fclose(fp);
9836+ STDOUT("Captured image to PNG file: %s\n", (const char*)m_strFileName);
9837+ STDOUT("File size: %ld\n", pConvertedBuffer->GetSize());
9838+ }
9839+ HX_RELEASE(pConvertedBuffer);
9840+ }
9841+#endif // HELIX_FEATURE_PNG
9842+ }
9843+
9844+ return status;
9845+}
9846Index: helix-libs/clientapps/clutter/exsitsup.h
9847===================================================================
9848--- /dev/null 1970-01-01 00:00:00.000000000 +0000
9849+++ helix-libs/clientapps/clutter/exsitsup.h 2008-10-13 06:05:49.000000000 -0700
9850@@ -0,0 +1,154 @@
9851+/* ***** BEGIN LICENSE BLOCK *****
9852+ * Version: RCSL 1.0/RPSL 1.0
9853+ *
9854+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
9855+ *
9856+ * The contents of this file, and the files included with this file, are
9857+ * subject to the current version of the RealNetworks Public Source License
9858+ * Version 1.0 (the "RPSL") available at
9859+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
9860+ * the file under the RealNetworks Community Source License Version 1.0
9861+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
9862+ * in which case the RCSL will apply. You may also obtain the license terms
9863+ * directly from RealNetworks. You may not use this file except in
9864+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
9865+ * applicable to this file, the RCSL. Please see the applicable RPSL or
9866+ * RCSL for the rights, obligations and limitations governing use of the
9867+ * contents of the file.
9868+ *
9869+ * This file is part of the Helix DNA Technology. RealNetworks is the
9870+ * developer of the Original Code and owns the copyrights in the portions
9871+ * it created.
9872+ *
9873+ * This file, and the files included with this file, is distributed and made
9874+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
9875+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
9876+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
9877+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
9878+ *
9879+ * Technology Compatibility Kit Test Suite(s) Location:
9880+ * http://www.helixcommunity.org/content/tck
9881+ *
9882+ * Contributor(s):
9883+ *
9884+ * ***** END LICENSE BLOCK ***** */
9885+
9886+#ifndef _EXSITSUP_H_
9887+#define _EXSITSUP_H_
9888+
9889+#include "fivemmap.h"
9890+#include "player.h"
9891+
9892+/****************************************************************************
9893+ *
9894+ * Class:
9895+ *
9896+ * ExampleSiteSupplier
9897+ *
9898+ * Purpose:
9899+ *
9900+ * Implementation for ragui's IHXSiteSupplier
9901+ *
9902+ */
9903+class ExampleSiteSupplier :
9904+ public IHXSiteSupplier
9905+ , public IHXSiteCaptureResponse
9906+{
9907+private:
9908+ LONG32 m_lRefCount;
9909+ IHXSiteManager* m_pSiteManager;
9910+ IHXSite* m_pSite;
9911+ IHXSiteCapture* m_pSiteCapture;
9912+ IHXBuffer* m_pCaptureBuffer;
9913+ IHXCommonClassFactory* m_pCCF;
9914+ IUnknown* m_pUnkPlayer;
9915+ FiveMinuteMap m_CreatedSites;
9916+ CHXString m_strFileName;
9917+ on_new_frame_cb_t m_on_new_frame_cb;
9918+ void * m_context;
9919+
9920+ ~ExampleSiteSupplier();
9921+
9922+public:
9923+ ExampleSiteSupplier(IUnknown* pUnkPlayer, on_new_frame_cb_t new_frame_cb = NULL, void *context = NULL);
9924+
9925+ /*
9926+ * IUnknown methods
9927+ */
9928+ STDMETHOD(QueryInterface) (THIS_
9929+ REFIID riid,
9930+ void** ppvObj);
9931+
9932+ STDMETHOD_(ULONG32,AddRef) (THIS);
9933+
9934+ STDMETHOD_(ULONG32,Release) (THIS);
9935+
9936+ /*
9937+ * IHXSiteSupplier methods
9938+ */
9939+
9940+ /************************************************************************
9941+ * Method:
9942+ * IHXSiteSupplier::SitesNeeded
9943+ * Purpose:
9944+ * Called to inform the site supplier that a site with a particular
9945+ * set of characteristics is needed. If the site supplier can
9946+ * fulfill the request it should call the site manager and add one
9947+ * or more new sites.
9948+ * Note that the request for sites is associated with a Request ID
9949+ * the client core will inform the site supplier when this requested
9950+ * site is no longer needed.
9951+ */
9952+ STDMETHOD(SitesNeeded) (THIS_
9953+ UINT32 uRequestID,
9954+ IHXValues* pSiteProps);
9955+
9956+ /************************************************************************
9957+ * Method:
9958+ * IHXSiteSupplier::SitesNotNeeded
9959+ * Purpose:
9960+ * Called to inform the site supplier that all sites from a previos
9961+ * site request are no longer needed. If the site supplier had
9962+ * previously created non-persistant sites (like popup windows)
9963+ * to fulfill a request for sites it should call the site manager
9964+ * and remove those sites.
9965+ */
9966+ STDMETHOD(SitesNotNeeded)
9967+ (THIS_
9968+ UINT32 uRequestID);
9969+
9970+
9971+ /************************************************************************
9972+ * Method:
9973+ * IHXSiteSupplier::BeginChangeLayout
9974+ * Purpose:
9975+ * Called to inform the site supplier a layout change has beginning
9976+ * it can expect to recieve SitesNeeded() and SitesNotNeeded() calls
9977+ * while a layout change is in progress,
9978+ */
9979+ STDMETHOD(BeginChangeLayout) (THIS);
9980+
9981+ /************************************************************************
9982+ * Method:
9983+ * IHXSiteSupplier::DoneChangeLayout
9984+ * Purpose:
9985+ * Called to inform the site supplier the layout change has been
9986+ * completed.
9987+ */
9988+ STDMETHOD(DoneChangeLayout) (THIS);
9989+
9990+ /*
9991+ * IHXSiteCaptureResponse
9992+ */
9993+ STDMETHOD(CaptureDone) (THIS_
9994+ REF(HX_RESULT) status,
9995+ REF(HXBitmapInfoHeader) bmiOutputFormat,
9996+ REF(IHXBuffer*) pImageDataBuffer
9997+ );
9998+
9999+ HX_RESULT CaptureImage(CHXString pFileName, INT32 dWidth, INT32 dHeight);
10000+
10001+};
10002+
10003+#endif // _EXSITSUP_H_
10004+
10005Index: helix-libs/clientapps/clutter/exstateadvsnk.cpp
10006===================================================================
10007--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10008+++ helix-libs/clientapps/clutter/exstateadvsnk.cpp 2008-10-13 06:05:49.000000000 -0700
10009@@ -0,0 +1,229 @@
10010+/* ***** BEGIN LICENSE BLOCK *****
10011+ * Version: RCSL 1.0/RPSL 1.0
10012+ *
10013+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
10014+ *
10015+ * The contents of this file, and the files included with this file, are
10016+ * subject to the current version of the RealNetworks Public Source License
10017+ * Version 1.0 (the "RPSL") available at
10018+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
10019+ * the file under the RealNetworks Community Source License Version 1.0
10020+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
10021+ * in which case the RCSL will apply. You may also obtain the license terms
10022+ * directly from RealNetworks. You may not use this file except in
10023+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
10024+ * applicable to this file, the RCSL. Please see the applicable RPSL or
10025+ * RCSL for the rights, obligations and limitations governing use of the
10026+ * contents of the file.
10027+ *
10028+ * This file is part of the Helix DNA Technology. RealNetworks is the
10029+ * developer of the Original Code and owns the copyrights in the portions
10030+ * it created.
10031+ *
10032+ * This file, and the files included with this file, is distributed and made
10033+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
10034+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
10035+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
10036+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
10037+ *
10038+ * Technology Compatibility Kit Test Suite(s) Location:
10039+ * http://www.helixcommunity.org/content/tck
10040+ *
10041+ * Contributor(s):
10042+ *
10043+ * ***** END LICENSE BLOCK ***** */
10044+
10045+#include <stdio.h>
10046+
10047+#include "hxtypes.h"
10048+
10049+#include "hxcom.h"
10050+#include "hxcomm.h"
10051+#include "hxmon.h"
10052+#include "hxcore.h"
10053+#include "hxengin.h"
10054+#include "hxclsnk.h"
10055+#include "hxgroup.h"
10056+#include "hxstrutl.h"
10057+#include "exstateadvsnk.h"
10058+#include "hxstring.h"
10059+#include "hxprefs.h"
10060+#include "excontxt.h"
10061+
10062+#include "print.h"
10063+
10064+#include "globals.h"
10065+#include "player.h"
10066+
10067+struct _stGlobals*& GetGlobal(); //in main.cpp
10068+
10069+#ifdef __TCS__
10070+extern unsigned long gStreamTime;
10071+
10072+static int iOpened = 0;
10073+
10074+
10075+#if defined(__cplusplus)
10076+extern "C" {
10077+#endif /* defined(__cplusplus) */
10078+
10079+typedef enum hookBuffering {
10080+ eContacting = 0,
10081+ eConnecting = 1,
10082+ eBuffering = 2,
10083+ ePlaying = 3
10084+}hookBuffering;
10085+
10086+void hookRealAudio_Buffering(hookBuffering connectState, int pct);
10087+
10088+void hookRealAudio_PlayPosition(unsigned long current,unsigned long duration);
10089+
10090+typedef enum hookState {
10091+ ePlay = 0,
10092+ ePause = 1,
10093+ eStop = 2,
10094+ eResume = 3,
10095+ eComplete // Clip is done playing
10096+}hookState;
10097+void hookRealAudio_State(hookState newState);
10098+
10099+
10100+#if defined(__cplusplus)
10101+}
10102+#endif /* defined(__cplusplus) */
10103+
10104+#endif // __TCS__
10105+
10106+void PrintBuffer(const char* pszName,const unsigned char* pbBuf, unsigned int dwBytes);
10107+
10108+ExampleClientStateAdviceSink::ExampleClientStateAdviceSink(IUnknown* pUnknown, LONG32 lClientIndex, on_state_change_cb_t on_state_change_cb, void *context)
10109+ : m_lRefCount (0)
10110+ , m_lClientIndex (lClientIndex)
10111+ , m_pUnknown (NULL)
10112+ , m_State (HX_CLIENT_STATE_READY)
10113+ , m_state_change_cb(on_state_change_cb)
10114+ , m_context(context)
10115+{
10116+ if (pUnknown)
10117+ {
10118+ m_pUnknown = pUnknown;
10119+ m_pUnknown->AddRef();
10120+
10121+ IHXPlayer* pPlayer;
10122+ IHXClientStateAdviseSinkControl *pStateControl;
10123+ if(HXR_OK == m_pUnknown->QueryInterface(IID_IHXPlayer,
10124+ (void**)&pPlayer))
10125+ {
10126+ m_pPlayer = pPlayer;
10127+
10128+
10129+ }
10130+
10131+ if (HXR_OK == m_pUnknown->QueryInterface(IID_IHXClientStateAdviseSinkControl, (void **)&pStateControl))
10132+ {
10133+ pStateControl->AddClientStateAdviseSink(this);
10134+ }
10135+ }
10136+
10137+#ifdef __TCS__
10138+ bEnableAdviceSink = TRUE;
10139+ iOpened = 0;
10140+#endif
10141+}
10142+
10143+ExampleClientStateAdviceSink::~ExampleClientStateAdviceSink(void)
10144+{
10145+
10146+ if (m_pPlayer)
10147+ {
10148+ m_pPlayer->Release();
10149+ m_pPlayer = NULL;
10150+ }
10151+ if (m_pUnknown)
10152+ {
10153+ m_pUnknown->Release();
10154+ m_pUnknown = NULL;
10155+ }
10156+}
10157+
10158+
10159+// *** IUnknown methods ***
10160+
10161+/////////////////////////////////////////////////////////////////////////
10162+// Method:
10163+// IUnknown::QueryInterface
10164+// Purpose:
10165+// Implement this to export the interfaces supported by your
10166+// object.
10167+//
10168+STDMETHODIMP ExampleClientStateAdviceSink::QueryInterface(REFIID riid, void** ppvObj)
10169+{
10170+ if (IsEqualIID(riid, IID_IUnknown))
10171+ {
10172+ AddRef();
10173+ *ppvObj = (IUnknown*)(IHXClientStateAdviseSink *)this;
10174+ return HXR_OK;
10175+ }
10176+ else if (IsEqualIID(riid, IID_IHXClientStateAdviseSink))
10177+ {
10178+ AddRef();
10179+ *ppvObj = (IHXClientStateAdviseSink*)this;
10180+ return HXR_OK;
10181+ }
10182+
10183+ *ppvObj = NULL;
10184+ return HXR_NOINTERFACE;
10185+}
10186+
10187+/////////////////////////////////////////////////////////////////////////
10188+// Method:
10189+// IUnknown::AddRef
10190+// Purpose:
10191+// Everyone usually implements this the same... feel free to use
10192+// this implementation.
10193+//
10194+STDMETHODIMP_(ULONG32) ExampleClientStateAdviceSink::AddRef()
10195+{
10196+ return InterlockedIncrement(&m_lRefCount);
10197+}
10198+
10199+/////////////////////////////////////////////////////////////////////////
10200+// Method:
10201+// IUnknown::Release
10202+// Purpose:
10203+// Everyone usually implements this the same... feel free to use
10204+// this implementation.
10205+//
10206+STDMETHODIMP_(ULONG32) ExampleClientStateAdviceSink::Release()
10207+{
10208+ if (InterlockedDecrement(&m_lRefCount) > 0)
10209+ {
10210+ return m_lRefCount;
10211+ }
10212+
10213+ delete this;
10214+ return 0;
10215+}
10216+
10217+
10218+/************************************************************************
10219+ * Method:
10220+ * IHXClientStateAdviseSink::OnStateChange
10221+ * Purpose:
10222+ * Called to advise the client state has changed state
10223+ */
10224+STDMETHODIMP ExampleClientStateAdviceSink::OnStateChange(UINT16 uOldState, UINT16 uNewState)
10225+{
10226+ if (m_state_change_cb)
10227+ m_state_change_cb(uOldState, uNewState, m_context);
10228+
10229+ m_State = uNewState;
10230+ return HXR_OK;
10231+}
10232+
10233+EHXClientState ExampleClientStateAdviceSink::GetState()
10234+{
10235+ return m_State;
10236+}
10237+
10238+
10239Index: helix-libs/clientapps/clutter/exstateadvsnk.h
10240===================================================================
10241--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10242+++ helix-libs/clientapps/clutter/exstateadvsnk.h 2008-10-13 06:05:49.000000000 -0700
10243@@ -0,0 +1,108 @@
10244+/* ***** BEGIN LICENSE BLOCK *****
10245+ * Version: RCSL 1.0/RPSL 1.0
10246+ *
10247+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
10248+ *
10249+ * The contents of this file, and the files included with this file, are
10250+ * subject to the current version of the RealNetworks Public Source License
10251+ * Version 1.0 (the "RPSL") available at
10252+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
10253+ * the file under the RealNetworks Community Source License Version 1.0
10254+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
10255+ * in which case the RCSL will apply. You may also obtain the license terms
10256+ * directly from RealNetworks. You may not use this file except in
10257+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
10258+ * applicable to this file, the RCSL. Please see the applicable RPSL or
10259+ * RCSL for the rights, obligations and limitations governing use of the
10260+ * contents of the file.
10261+ *
10262+ * This file is part of the Helix DNA Technology. RealNetworks is the
10263+ * developer of the Original Code and owns the copyrights in the portions
10264+ * it created.
10265+ *
10266+ * This file, and the files included with this file, is distributed and made
10267+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
10268+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
10269+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
10270+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
10271+ *
10272+ * Technology Compatibility Kit Test Suite(s) Location:
10273+ * http://www.helixcommunity.org/content/tck
10274+ *
10275+ * Contributor(s):
10276+ *
10277+ * ***** END LICENSE BLOCK ***** */
10278+
10279+#ifndef _EXAMPLE_CLIENT_STATE_ADVISE_SNK_H_
10280+#define _EXAMPLE_CLIENT_STATE_ADVISE_SNK_H_
10281+
10282+#include "player.h"
10283+
10284+struct IHXClientStateAdviseSink;
10285+struct IHXGroupSink;
10286+struct IUnknown;
10287+struct IHXRegistry;
10288+struct IHXScheduler;
10289+struct IHXCallback;
10290+struct IHXPlayer;
10291+struct IHXGroup;
10292+
10293+class ExampleClientStateAdviceSink : public IHXClientStateAdviseSink
10294+{
10295+ private:
10296+ LONG32 m_lRefCount;
10297+ LONG32 m_lClientIndex;
10298+
10299+ IUnknown* m_pUnknown;
10300+
10301+ UINT32 m_ulStartTime;
10302+ UINT32 m_ulStopTime;
10303+
10304+ UINT32 m_lCurrentBandwidth;
10305+ UINT32 m_lAverageBandwidth;
10306+ HXBOOL m_bOnStop;
10307+
10308+ HXBOOL m_bWaitForTrackStart;
10309+
10310+ on_state_change_cb_t m_state_change_cb;
10311+ void *m_context;
10312+ EHXClientState m_State;
10313+
10314+ // IHXCallback
10315+ IHXPlayer* m_pPlayer;
10316+ ULONG32 m_hCallback;
10317+ ~ExampleClientStateAdviceSink();
10318+
10319+
10320+ public:
10321+
10322+ ExampleClientStateAdviceSink(IUnknown* /*IN*/ pUnknown, LONG32 /*IN*/ lClientIndex, on_state_change_cb_t on_state_change_cb = NULL, void *context = NULL);
10323+
10324+ /*
10325+ * IUnknown methods
10326+ */
10327+ STDMETHOD(QueryInterface) (THIS_
10328+ REFIID riid,
10329+ void** ppvObj);
10330+
10331+ STDMETHOD_(ULONG32,AddRef) (THIS);
10332+
10333+ STDMETHOD_(ULONG32,Release) (THIS);
10334+
10335+ /***********************************************************************
10336+ * Method:
10337+ * IHXClientStateAdviseSink::OnStateChange
10338+ * Purpose:
10339+ * Called by client engine to inform the client that the state has changed.
10340+ * States are defined in the enum EHXClientState, defined in this file.
10341+ *
10342+ */
10343+ STDMETHOD(OnStateChange) (THIS_
10344+ UINT16 uOldState,
10345+ UINT16 uNewState
10346+ ) ;
10347+
10348+ EHXClientState GetState();
10349+};
10350+
10351+#endif /* _EXAMPLECLSNK_ */
10352Index: helix-libs/clientapps/clutter/fivemmap.cpp
10353===================================================================
10354--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10355+++ helix-libs/clientapps/clutter/fivemmap.cpp 2008-10-13 06:05:49.000000000 -0700
10356@@ -0,0 +1,175 @@
10357+/* ***** BEGIN LICENSE BLOCK *****
10358+ * Version: RCSL 1.0/RPSL 1.0
10359+ *
10360+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
10361+ *
10362+ * The contents of this file, and the files included with this file, are
10363+ * subject to the current version of the RealNetworks Public Source License
10364+ * Version 1.0 (the "RPSL") available at
10365+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
10366+ * the file under the RealNetworks Community Source License Version 1.0
10367+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
10368+ * in which case the RCSL will apply. You may also obtain the license terms
10369+ * directly from RealNetworks. You may not use this file except in
10370+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
10371+ * applicable to this file, the RCSL. Please see the applicable RPSL or
10372+ * RCSL for the rights, obligations and limitations governing use of the
10373+ * contents of the file.
10374+ *
10375+ * This file is part of the Helix DNA Technology. RealNetworks is the
10376+ * developer of the Original Code and owns the copyrights in the portions
10377+ * it created.
10378+ *
10379+ * This file, and the files included with this file, is distributed and made
10380+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
10381+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
10382+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
10383+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
10384+ *
10385+ * Technology Compatibility Kit Test Suite(s) Location:
10386+ * http://www.helixcommunity.org/content/tck
10387+ *
10388+ * Contributor(s):
10389+ *
10390+ * ***** END LICENSE BLOCK ***** */
10391+
10392+#include <string.h>
10393+#include "hxtypes.h"
10394+#include "fivemmap.h"
10395+
10396+void* FiveMinuteMap::GetFirstValue()
10397+{
10398+ m_nCursor = 0;
10399+
10400+ if (m_nMapSize)
10401+ {
10402+ return m_pValueArray[m_nCursor];
10403+ }
10404+ else
10405+ {
10406+ return NULL;
10407+ }
10408+}
10409+
10410+void* FiveMinuteMap::GetNextValue()
10411+{
10412+ m_nCursor++;
10413+
10414+ if (m_nCursor < m_nMapSize)
10415+ {
10416+ return m_pValueArray[m_nCursor];
10417+ }
10418+ else
10419+ {
10420+ return NULL;
10421+ }
10422+}
10423+
10424+HXBOOL FiveMinuteMap::Lookup(void* Key, void*& Value) const
10425+{
10426+ HXBOOL bFound = FALSE;
10427+ int nIndex = 0;
10428+
10429+ // If Key is alrady in the list, replace value
10430+ for (; nIndex < m_nMapSize; nIndex++)
10431+ {
10432+ if (m_pKeyArray[nIndex] == Key)
10433+ {
10434+ Value = m_pValueArray[nIndex];
10435+ bFound = TRUE;
10436+ goto exit;
10437+ }
10438+ }
10439+
10440+exit:
10441+ return bFound;
10442+}
10443+
10444+void FiveMinuteMap::RemoveKey(void* Key)
10445+{
10446+ HXBOOL bFound = FALSE;
10447+ int nIndex = 0;
10448+
10449+ // If Key is alrady in the list, replace value
10450+ for (; nIndex < m_nMapSize; nIndex++)
10451+ {
10452+ if (m_pKeyArray[nIndex] == Key)
10453+ {
10454+ if (nIndex < (m_nMapSize-1))
10455+ {
10456+ memmove(&(m_pKeyArray[nIndex]),&(m_pKeyArray[nIndex+1]),sizeof(void*)*(m_nMapSize-(nIndex+1)));
10457+ memmove(&(m_pValueArray[nIndex]),&(m_pValueArray[nIndex+1]),sizeof(void*)*(m_nMapSize-(nIndex+1)));
10458+ }
10459+ m_nMapSize--;
10460+ goto exit;
10461+ }
10462+ }
10463+
10464+exit:
10465+ (NULL); // We're done!
10466+}
10467+
10468+void FiveMinuteMap::RemoveValue(void* Value)
10469+{
10470+ HXBOOL bFound = FALSE;
10471+ int nIndex = 0;
10472+
10473+ // If Value is alrady in the list, replace value
10474+ for (; nIndex < m_nMapSize; nIndex++)
10475+ {
10476+ if (m_pValueArray[nIndex] == Value)
10477+ {
10478+ if (nIndex < (m_nMapSize-1))
10479+ {
10480+ memmove(&(m_pKeyArray[nIndex]),&(m_pKeyArray[nIndex+1]),sizeof(void*)*(m_nMapSize-(nIndex+1)));
10481+ memmove(&(m_pValueArray[nIndex]),&(m_pValueArray[nIndex+1]),sizeof(void*)*(m_nMapSize-(nIndex+1)));
10482+ }
10483+ m_nMapSize--;
10484+ goto exit;
10485+ }
10486+ }
10487+
10488+exit:
10489+ (NULL); // We're done!
10490+}
10491+
10492+
10493+void FiveMinuteMap::SetAt(void* Key, void* Value)
10494+{
10495+ int nIndex = 0;
10496+
10497+ // If Key is alrady in the list, replace value
10498+ for (; nIndex < m_nMapSize; nIndex++)
10499+ {
10500+ if (m_pKeyArray[nIndex] == Key)
10501+ {
10502+ m_pValueArray[nIndex] = Value;
10503+ goto exit;
10504+ }
10505+ }
10506+
10507+ // If we have room, add it to the end!
10508+ if (m_nAllocSize == m_nMapSize)
10509+ {
10510+ m_nAllocSize += AllocationSize;
10511+ void** pNewKeys = new void*[m_nAllocSize];
10512+ void** pNewValues = new void*[m_nAllocSize];
10513+
10514+ memcpy(pNewKeys,m_pKeyArray,sizeof(void*)*m_nMapSize); /* Flawfinder: ignore */
10515+ memcpy(pNewValues,m_pValueArray,sizeof(void*)*m_nMapSize); /* Flawfinder: ignore */
10516+
10517+ delete [] m_pKeyArray;
10518+ delete [] m_pValueArray;
10519+
10520+ m_pKeyArray = pNewKeys;
10521+ m_pValueArray = pNewValues;
10522+ }
10523+
10524+ m_pKeyArray[m_nMapSize] = Key;
10525+ m_pValueArray[m_nMapSize] = Value;
10526+ m_nMapSize++;
10527+
10528+exit:
10529+ (NULL); // We're done!
10530+}
10531+
10532Index: helix-libs/clientapps/clutter/fivemmap.h
10533===================================================================
10534--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10535+++ helix-libs/clientapps/clutter/fivemmap.h 2008-10-13 06:05:49.000000000 -0700
10536@@ -0,0 +1,79 @@
10537+/* ***** BEGIN LICENSE BLOCK *****
10538+ * Version: RCSL 1.0/RPSL 1.0
10539+ *
10540+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
10541+ *
10542+ * The contents of this file, and the files included with this file, are
10543+ * subject to the current version of the RealNetworks Public Source License
10544+ * Version 1.0 (the "RPSL") available at
10545+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
10546+ * the file under the RealNetworks Community Source License Version 1.0
10547+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
10548+ * in which case the RCSL will apply. You may also obtain the license terms
10549+ * directly from RealNetworks. You may not use this file except in
10550+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
10551+ * applicable to this file, the RCSL. Please see the applicable RPSL or
10552+ * RCSL for the rights, obligations and limitations governing use of the
10553+ * contents of the file.
10554+ *
10555+ * This file is part of the Helix DNA Technology. RealNetworks is the
10556+ * developer of the Original Code and owns the copyrights in the portions
10557+ * it created.
10558+ *
10559+ * This file, and the files included with this file, is distributed and made
10560+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
10561+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
10562+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
10563+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
10564+ *
10565+ * Technology Compatibility Kit Test Suite(s) Location:
10566+ * http://www.helixcommunity.org/content/tck
10567+ *
10568+ * Contributor(s):
10569+ *
10570+ * ***** END LICENSE BLOCK ***** */
10571+
10572+#ifndef _FIVEMMAP_H_
10573+#define _FIVEMMAP_H_
10574+
10575+#ifndef _HXTYPES_H_
10576+#error FiveMinuteMap assumes pntypes.h.
10577+#endif
10578+
10579+class FiveMinuteMap
10580+{
10581+ const int AllocationSize;
10582+
10583+ void** m_pKeyArray;
10584+ void** m_pValueArray;
10585+ int m_nMapSize;
10586+ int m_nAllocSize;
10587+ int m_nCursor;
10588+public:
10589+ FiveMinuteMap()
10590+ : m_pKeyArray(NULL)
10591+ , m_pValueArray(NULL)
10592+ , m_nMapSize(0)
10593+ , m_nAllocSize(0)
10594+ , m_nCursor(0)
10595+ , AllocationSize(10)
10596+ {};
10597+
10598+ ~FiveMinuteMap()
10599+ {
10600+ delete [] m_pKeyArray;
10601+ delete [] m_pValueArray;
10602+ };
10603+
10604+ int GetCount() {return m_nMapSize;}
10605+
10606+ void* GetFirstValue();
10607+ void* GetNextValue();
10608+
10609+ HXBOOL Lookup(void* Key, void*& Value) const;
10610+ void RemoveKey(void* Key);
10611+ void RemoveValue(void* Value);
10612+ void SetAt(void* Key, void* Value);
10613+};
10614+
10615+#endif /* _FIVEMMAP_H_ */
10616Index: helix-libs/clientapps/clutter/globals.h
10617===================================================================
10618--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10619+++ helix-libs/clientapps/clutter/globals.h 2008-10-13 06:05:49.000000000 -0700
10620@@ -0,0 +1,150 @@
10621+/* ***** BEGIN LICENSE BLOCK *****
10622+ * Version: RCSL 1.0/RPSL 1.0
10623+ *
10624+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
10625+ *
10626+ * The contents of this file, and the files included with this file, are
10627+ * subject to the current version of the RealNetworks Public Source License
10628+ * Version 1.0 (the "RPSL") available at
10629+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
10630+ * the file under the RealNetworks Community Source License Version 1.0
10631+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
10632+ * in which case the RCSL will apply. You may also obtain the license terms
10633+ * directly from RealNetworks. You may not use this file except in
10634+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
10635+ * applicable to this file, the RCSL. Please see the applicable RPSL or
10636+ * RCSL for the rights, obligations and limitations governing use of the
10637+ * contents of the file.
10638+ *
10639+ * This file is part of the Helix DNA Technology. RealNetworks is the
10640+ * developer of the Original Code and owns the copyrights in the portions
10641+ * it created.
10642+ *
10643+ * This file, and the files included with this file, is distributed and made
10644+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
10645+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
10646+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
10647+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
10648+ *
10649+ * Technology Compatibility Kit Test Suite(s) Location:
10650+ * http://www.helixcommunity.org/content/tck
10651+ *
10652+ * Contributor(s):
10653+ *
10654+ * ***** END LICENSE BLOCK ***** */
10655+
10656+/****************************************************************************
10657+ *
10658+ * Test Client:
10659+ *
10660+ *
10661+ * This is an test client running on Windows, Mac, and Unix without a GUI.
10662+ *
10663+ */
10664+
10665+#ifndef _SPLAY_GLOBALS_H
10666+#define _SPLAY_GLOBALS_H
10667+
10668+#include "dllacces.h"
10669+#include "dllpath.h"
10670+#include "hxengin.h"
10671+#include "hxplayvelocity.h"
10672+#include "hxcore.h"
10673+#include "ihxmedpltfm.h"
10674+#include "excontxt.h"
10675+#include "preflist.h"
10676+
10677+#define HX_COMMAND_BUFFER_SIZE 256
10678+#define HX_MAX_NUM_MULTI_SEEKS 10
10679+struct _stGlobals
10680+{
10681+ _stGlobals()
10682+ : g_pDLLAccess(NULL),
10683+ g_nPlayers(0),
10684+ m_fpHXMediaPlatformOpen(NULL),
10685+ m_fpHXCreateMediaPlatform(NULL),
10686+ m_fpHXMediaPlatformClose(NULL),
10687+ m_fpCreateEngine(NULL),
10688+ m_fpCloseEngine(NULL),
10689+ m_fpSetDLLAccessPath(NULL),
10690+ bEnableAdviceSink(FALSE),
10691+ bEnableVerboseMode(FALSE),
10692+ g_bEnableSlowStart(TRUE),
10693+ g_bOnBeginOccurred(FALSE),
10694+ g_pszUsername( NULL),
10695+ g_pszPassword(NULL),
10696+ g_pszGUIDFile(NULL),
10697+ g_pszGUIDList(NULL),
10698+ g_Error(HXR_OK),
10699+ g_ulNumSecondsPlayed(0),
10700+ pMediaPlatform(NULL),
10701+ g_pIHXKicker(NULL),
10702+ bUseLegacyAPIs(FALSE),
10703+ pEngine(NULL),
10704+ g_pQuickSeek(NULL),
10705+ g_bNullRender(FALSE),
10706+ g_bUserStop(FALSE),
10707+ g_bInitVelocity(FALSE),
10708+ g_bABD(FALSE),
10709+ g_pVelocityCaps(NULL),
10710+ g_ulNumMultiSeeks(0),
10711+ g_ulMultiSeekIndex(0),
10712+ g_bMultiSeek(FALSE),
10713+ g_uThreadIDForKicker(-1)
10714+ {
10715+ memset(g_szCommandBuffer, 0, HX_COMMAND_BUFFER_SIZE);
10716+ memset(g_szPriorCommandBuffer, 0, HX_COMMAND_BUFFER_SIZE);
10717+ memset(g_Players, 0, sizeof(g_Players));
10718+ memset(g_pszURLs, 0, sizeof(g_pszURLs));
10719+ memset(g_pClientContexts, 0, sizeof(g_pClientContexts));
10720+ }
10721+
10722+ #define MAX_NUM_PLAYERS 256
10723+ IHXPlayer* g_Players[MAX_NUM_PLAYERS];
10724+ char *g_pszURLs[MAX_NUM_PLAYERS];
10725+ ExampleClientContext *g_pClientContexts[MAX_NUM_PLAYERS];
10726+ int g_nPlayers;
10727+ DLLAccessPath g_statclnt;
10728+ DLLAccess* g_pDLLAccess;
10729+ CHXPrefList g_prefList;
10730+
10731+ FPHXMEDIAPLATFORMOPEN m_fpHXMediaPlatformOpen;
10732+ FPHXCREATEMEDIAPLATFORM m_fpHXCreateMediaPlatform;
10733+ FPHXMEDIAPLATFORMCLOSE m_fpHXMediaPlatformClose;
10734+
10735+ FPRMCREATEENGINE m_fpCreateEngine;
10736+ FPRMCLOSEENGINE m_fpCloseEngine;
10737+ FPRMSETDLLACCESSPATH m_fpSetDLLAccessPath;
10738+
10739+ HXBOOL bEnableAdviceSink;
10740+ HXBOOL bEnableVerboseMode;
10741+ HXBOOL g_bEnableSlowStart;
10742+ HXBOOL g_bOnBeginOccurred;
10743+ char* g_pszUsername;
10744+ char* g_pszPassword;
10745+ char* g_pszGUIDFile;
10746+ char* g_pszGUIDList;
10747+ HX_RESULT g_Error;
10748+ UINT32 g_ulNumSecondsPlayed;
10749+ IHXMediaPlatform* pMediaPlatform;
10750+ IHXMediaPlatformKicker* g_pIHXKicker;
10751+ UINT32 g_uThreadIDForKicker;
10752+ pthread_t g_pThreadKickmanId;
10753+ HXBOOL bUseLegacyAPIs;
10754+ IHXClientEngine* pEngine;
10755+ IHXQuickSeek* g_pQuickSeek;
10756+ HXBOOL g_bNullRender;
10757+ HXBOOL g_bUserStop;
10758+ HXBOOL g_bInitVelocity;
10759+ HXBOOL g_bABD;
10760+ IHXPlaybackVelocityCaps* g_pVelocityCaps;
10761+ HXBOOL g_bMultiSeek;
10762+ UINT32 g_ulMultiSeekTime[HX_MAX_NUM_MULTI_SEEKS];
10763+ UINT32 g_ulNumMultiSeeks;
10764+ UINT32 g_ulMultiSeekIndex;
10765+ char g_szCommandBuffer[HX_COMMAND_BUFFER_SIZE];
10766+ char g_szPriorCommandBuffer[HX_COMMAND_BUFFER_SIZE];
10767+};
10768+
10769+
10770+#endif // _SPLAY_GLOBALS_H
10771Index: helix-libs/clientapps/clutter/iids.cpp
10772===================================================================
10773--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10774+++ helix-libs/clientapps/clutter/iids.cpp 2008-10-13 06:05:49.000000000 -0700
10775@@ -0,0 +1,50 @@
10776+/* ***** BEGIN LICENSE BLOCK *****
10777+ * Version: RCSL 1.0/RPSL 1.0
10778+ *
10779+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
10780+ *
10781+ * The contents of this file, and the files included with this file, are
10782+ * subject to the current version of the RealNetworks Public Source License
10783+ * Version 1.0 (the "RPSL") available at
10784+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
10785+ * the file under the RealNetworks Community Source License Version 1.0
10786+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
10787+ * in which case the RCSL will apply. You may also obtain the license terms
10788+ * directly from RealNetworks. You may not use this file except in
10789+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
10790+ * applicable to this file, the RCSL. Please see the applicable RPSL or
10791+ * RCSL for the rights, obligations and limitations governing use of the
10792+ * contents of the file.
10793+ *
10794+ * This file is part of the Helix DNA Technology. RealNetworks is the
10795+ * developer of the Original Code and owns the copyrights in the portions
10796+ * it created.
10797+ *
10798+ * This file, and the files included with this file, is distributed and made
10799+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
10800+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
10801+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
10802+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
10803+ *
10804+ * Technology Compatibility Kit Test Suite(s) Location:
10805+ * http://www.helixcommunity.org/content/tck
10806+ *
10807+ * Contributor(s):
10808+ *
10809+ * ***** END LICENSE BLOCK ***** */
10810+
10811+// define all guids here once...
10812+#define INITGUID
10813+#define NCIHACK
10814+#include "hxtypes.h"
10815+#include "hxcom.h"
10816+#include "hxiids.h"
10817+#include "hxpiids.h"
10818+#if defined _WINDOWS
10819+#if defined (HELIX_FEATURE_DIRECT_SOUND)
10820+#include "dsound.h"
10821+#endif /* HELIX_FEATURE_DIRECT_SOUND */
10822+#if defined (HELIX_FEATURE_VIDEO) && !defined(_WINCE)
10823+#include "ddraw.h"
10824+#endif /* HELIX_FEATURE_VIDEO */
10825+#endif
10826Index: helix-libs/clientapps/clutter/linux2.pcf
10827===================================================================
10828--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10829+++ helix-libs/clientapps/clutter/linux2.pcf 2008-10-13 06:05:49.000000000 -0700
10830@@ -0,0 +1,42 @@
10831+#
10832+# ***** BEGIN LICENSE BLOCK *****
10833+# Version: RCSL 1.0/RPSL 1.0
10834+#
10835+# Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
10836+#
10837+# The contents of this file, and the files included with this file, are
10838+# subject to the current version of the RealNetworks Public Source License
10839+# Version 1.0 (the "RPSL") available at
10840+# http://www.helixcommunity.org/content/rpsl unless you have licensed
10841+# the file under the RealNetworks Community Source License Version 1.0
10842+# (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
10843+# in which case the RCSL will apply. You may also obtain the license terms
10844+# directly from RealNetworks. You may not use this file except in
10845+# compliance with the RPSL or, if you have a valid RCSL with RealNetworks
10846+# applicable to this file, the RCSL. Please see the applicable RPSL or
10847+# RCSL for the rights, obligations and limitations governing use of the
10848+# contents of the file.
10849+#
10850+# This file is part of the Helix DNA Technology. RealNetworks is the
10851+# developer of the Original Code and owns the copyrights in the portions
10852+# it created.
10853+#
10854+# This file, and the files included with this file, is distributed and made
10855+# available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
10856+# EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
10857+# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
10858+# FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
10859+#
10860+# Technology Compatibility Kit Test Suite(s) Location:
10861+# http://www.helixcommunity.org/content/tck
10862+#
10863+# Contributor(s):
10864+#
10865+# ***** END LICENSE BLOCK *****
10866+#
10867+
10868+project.AddSystemLibraries("dl", "m", "pthread")
10869+
10870+if (project.IsDefined("HELIX_FEATURE_VIDEO") and
10871+ project.IsDefined("USE_XWINDOWS")):
10872+ project.AddSystemLibraries("X11")
10873Index: helix-libs/clientapps/clutter/player.cpp
10874===================================================================
10875--- /dev/null 1970-01-01 00:00:00.000000000 +0000
10876+++ helix-libs/clientapps/clutter/player.cpp 2008-10-13 06:05:49.000000000 -0700
10877@@ -0,0 +1,1057 @@
10878+/* ***** BEGIN LICENSE BLOCK *****
10879+ * Version: RCSL 1.0/RPSL 1.0
10880+ *
10881+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
10882+ *
10883+ * The contents of this file, and the files included with this file, are
10884+ * subject to the current version of the RealNetworks Public Source License
10885+ * Version 1.0 (the "RPSL") available at
10886+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
10887+ * the file under the RealNetworks Community Source License Version 1.0
10888+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
10889+ * in which case the RCSL will apply. You may also obtain the license terms
10890+ * directly from RealNetworks. You may not use this file except in
10891+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
10892+ * applicable to this file, the RCSL. Please see the applicable RPSL or
10893+ * RCSL for the rights, obligations and limitations governing use of the
10894+ * contents of the file.
10895+ *
10896+ * This file is part of the Helix DNA Technology. RealNetworks is the
10897+ * developer of the Original Code and owns the copyrights in the portions
10898+ * it created.
10899+ *
10900+ * This file, and the files included with this file, is distributed and made
10901+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
10902+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
10903+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
10904+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
10905+ *
10906+ * Technology Compatibility Kit Test Suite(s) Location:
10907+ * http://www.helixcommunity.org/content/tck
10908+ *
10909+ * Contributor(s):
10910+ *
10911+ * ***** END LICENSE BLOCK ***** */
10912+
10913+/****************************************************************************
10914+ *
10915+ * Test Client:
10916+ *
10917+ *
10918+ * This is an test client running on Windows, Mac, and Unix without a GUI.
10919+ *
10920+ */
10921+#include "hxtypes.h"
10922+
10923+#include <stdlib.h>
10924+
10925+#include "hlxclib/time.h"
10926+#include "ihxmedpltfm.h"
10927+#include "hxwintyp.h"
10928+#include "hxcom.h"
10929+#include "ihxpckts.h"
10930+#include "hxcomm.h"
10931+#include "hxmon.h"
10932+#include "hxfiles.h"
10933+#include "hxengin.h"
10934+#include "hxcore.h"
10935+#include "hxclsnk.h"
10936+#include "hxgroup.h"
10937+#include "hxerror.h"
10938+#include "hxauth.h"
10939+#include "hxwin.h"
10940+#include "hxprefs.h"
10941+#include "hxtbuf.h"
10942+#include "fivemmap.h"
10943+#include "dllacces.h"
10944+#include "hxausvc.h"
10945+#include "hxstrutl.h"
10946+#include "hxgroup.h"
10947+#include "hxwin.h"
10948+#include "hxtick.h"
10949+#include "hxbuffer.h"
10950+#include "hxplayvelocity.h"
10951+#include "pckunpck.h" // For CreateAndSetBufferCCF()
10952+#include "hxvctrl.h"
10953+#include "hxbsrc.h"
10954+#include "excallback.h"
10955+#include "pthread.h"
10956+
10957+#if defined(HELIX_FEATURE_PRESENTATION_FEATURE_SELECTION)
10958+#include "hxpfs.h"
10959+#endif // HELIX_FEATURE_PRESENTATION_FEATURE_SELECTION.
10960+
10961+#if defined(HELIX_FEATURE_PREFERENCES)
10962+#include "preflist.h"
10963+#endif /* #if defined(HELIX_FEATURE_PREFERENCES) */
10964+#include "exadvsnk.h"
10965+#include "exerror.h"
10966+#include "exsitsup.h"
10967+#include "exaumgr.h"
10968+#if defined(_WIN32)
10969+#include "exabd.h"
10970+#endif
10971+#include "excontxt.h"
10972+#include "print.h"
10973+#if defined(USE_XWINDOWS)
10974+#include <X11/Xlib.h>
10975+#endif
10976+#if defined (_UNIX)
10977+#include <stdio.h>
10978+#include <sys/time.h>
10979+#include <sys/types.h>
10980+#include <unistd.h>
10981+#include <termios.h>
10982+#endif
10983+#if defined(_WINDOWS)
10984+#include <conio.h>
10985+#endif
10986+
10987+#ifdef __TCS__
10988+#include <unistd.h>
10989+#if defined(__cplusplus)
10990+extern "C" {
10991+#endif /* defined(__cplusplus) */
10992+ extern unsigned long tmosTimSleep(unsigned long ticks);
10993+ unsigned long gForcePlayerToStop = 0;
10994+#if defined(__cplusplus)
10995+}
10996+#endif /* defined(__cplusplus) */
10997+#endif
10998+
10999+#if defined (_MACINTOSH) || defined (_MAC_UNIX)
11000+bool gMacPlayerIsDone = false;
11001+#endif
11002+
11003+
11004+#if defined _VXWORKS
11005+#include "sys/times.h"
11006+#include "string.h"
11007+#include "hxtime.h"
11008+#endif
11009+
11010+#if defined(_MACINTOSH)
11011+#ifndef _MAC_MACHO
11012+#include <sioux.h>
11013+#include <console.h>
11014+#endif
11015+#endif
11016+
11017+#include "dllpath.h"
11018+
11019+#ifdef _SYMBIAN
11020+#include <e32svr.h>
11021+#include "platform/symbian/symbian_event_hndlr.h"
11022+#endif
11023+
11024+ENABLE_DLLACCESS_PATHS(g_SPlayAccessPath);
11025+
11026+// typedef for SetDLLAccessPath
11027+
11028+
11029+#include "thrdutil.h"
11030+
11031+#if defined(_AIX)
11032+#include <strings.h>
11033+#endif
11034+
11035+#if defined _DEBUG || defined DEBUG
11036+#include "debug.h"
11037+#endif
11038+
11039+#ifndef MAX_PATH
11040+#define MAX_PATH 256
11041+#endif //!MAX_PATH
11042+
11043+#if defined(HELIX_CONFIG_NOSTATICS)
11044+# include "globals/hxglobals.h"
11045+#endif
11046+
11047+#define MAX_NUM_URLS 10
11048+
11049+#include "globals.h" //for global struct.
11050+
11051+#include "player.h"
11052+
11053+#if defined(_WINDOWS) && defined(_STATICALLY_LINKED)
11054+HINSTANCE g_hInstance = NULL;
11055+#endif
11056+
11057+struct _stGlobals*& GetGlobal()
11058+{
11059+#if defined(HELIX_CONFIG_NOSTATICS)
11060+ static const struct _stGlobals* const _g_pstGlobals = NULL;
11061+ struct _stGlobals*& g_pstGlobals = (struct _stGlobals*&)HXGlobalPtr::Get(&_g_pstGlobals);
11062+#else
11063+ static struct _stGlobals* g_pstGlobals = NULL;
11064+#endif
11065+ if( g_pstGlobals == NULL )
11066+ {
11067+ g_pstGlobals = new struct _stGlobals();
11068+ }
11069+ return g_pstGlobals;
11070+
11071+}
11072+
11073+
11074+// Constants
11075+const int DEFAULT_TIME_DELTA = 2000;
11076+const int DEFAULT_STOP_TIME = -1;
11077+const int SLEEP_TIME = 5;
11078+const int GUID_LEN = 64;
11079+
11080+// Function prototypes
11081+void PrintUsage(const char* pszAppName);
11082+HXBOOL AllPlayersDone(int nNumPlayers, IHXPlayer** ppPlayers);
11083+void StopAllPlayers(int nNumPlayers, IHXPlayer** ppPlayers);
11084+HXBOOL ReadGUIDFile();
11085+char* GetAppName(char* pszArgv0);
11086+
11087+#ifdef __TCS__
11088+#if defined(__cplusplus)
11089+extern "C" {
11090+#endif /* defined(__cplusplus) */
11091+
11092+ extern void _alloc_stats(int verbose);
11093+#if defined(__cplusplus)
11094+}
11095+#endif /* defined(__cplusplus) */
11096+
11097+static IHXPlayer** g_Players;
11098+static int g_nPlayers = 0;
11099+static long evtCount = 0;
11100+static long evtFullCount = 0;
11101+#endif
11102+
11103+
11104+
11105+#if defined(HELIX_FEATURE_PRESENTATION_FEATURE_SELECTION)
11106+HX_RESULT
11107+DumpPFdata(IHXPresentationFeatureManager* pPFMgr,
11108+ const char* pszPFName)
11109+{
11110+ HX_RESULT hxr = HXR_OK;
11111+
11112+ IHXBuffer* pFeatureCurrentSetting = NULL;
11113+ IHXValues* pFeatureOptions = NULL;
11114+
11115+ if (!pPFMgr || !pszPFName)
11116+ {
11117+ hxr = HXR_INVALID_PARAMETER;
11118+ }
11119+ else
11120+ {
11121+ // List all the options for this PF:
11122+ HX_RESULT hxr = pPFMgr->GetPresentationFeature(
11123+ pszPFName,
11124+ pFeatureCurrentSetting,
11125+ pFeatureOptions);
11126+
11127+ if (FAILED(hxr))
11128+ {
11129+ // PF doesn't exist!
11130+ STDOUT("\t%s - No such presentation feature\n\n", pszPFName);
11131+ }
11132+ else
11133+ {
11134+ // Now, go through pFeatureOptions and display
11135+ // them and their "is-selectable"-flag values:
11136+ const char* pszPFOptionName = NULL;
11137+ const char* pszPFCurSetting = pFeatureCurrentSetting?
11138+ (const char*)pFeatureCurrentSetting->GetBuffer() : NULL;
11139+ UINT32 bPFOptionIsSelectableFlag = FALSE;
11140+ IHXBuffer* pPFOptionIsSelectableFlag = NULL;
11141+
11142+ HX_ASSERT(pszPFCurSetting);
11143+ STDOUT("\t%s\t(Current setting == \"%s\")\n", pszPFName, pszPFCurSetting?
11144+ pszPFCurSetting : "<ERROR: THIS PF HAS NO CURRENT SETTING!>");
11145+
11146+ if (!pFeatureOptions) // NULL is OK; that means freeform (open-ended):
11147+ {
11148+ STDOUT("\t\t(%s's options are freeform, i.e., open-ended)\n",
11149+ pszPFName);
11150+ }
11151+ else // List all the options and their flags:
11152+ {
11153+ if (HXR_OK == pFeatureOptions->GetFirstPropertyCString(pszPFOptionName,
11154+ pPFOptionIsSelectableFlag) && *pszPFOptionName)
11155+ {
11156+ do
11157+ {
11158+ const UCHAR* pIsSelFlag = pPFOptionIsSelectableFlag->GetBuffer();
11159+ if (pIsSelFlag && *pIsSelFlag)
11160+ {
11161+ // Anything but '0' (zero) is treated as '1' (is selectable):
11162+ bPFOptionIsSelectableFlag = (HXBOOL)('0' != *pIsSelFlag &&
11163+ '\0' == *(pIsSelFlag+1));
11164+ }
11165+ else
11166+ {
11167+ // Set the error, but we'll go ahead and treat it as '0':
11168+ hxr = HXR_INVALID_PARAMETER;
11169+ bPFOptionIsSelectableFlag = FALSE;
11170+ }
11171+
11172+ STDOUT("\t\t%s\t\tIs selectable: %s\n",
11173+ pszPFOptionName, bPFOptionIsSelectableFlag? "yes":"no");
11174+ // Release it to get the next PF:
11175+ HX_RELEASE(pPFOptionIsSelectableFlag);
11176+ } while (HXR_OK == pFeatureOptions->GetNextPropertyCString(
11177+ pszPFOptionName, pPFOptionIsSelectableFlag));
11178+ }
11179+ }
11180+
11181+ HX_RELEASE(pPFOptionIsSelectableFlag);
11182+ }
11183+ }
11184+
11185+ HX_RELEASE(pFeatureCurrentSetting);
11186+ HX_RELEASE(pFeatureOptions);
11187+
11188+ return hxr;
11189+}
11190+#endif // HELIX_FEATURE_PRESENTATION_FEATURE_SELECTION.
11191+
11192+
11193+char* RemoveWrappingQuotes(char* str)
11194+{
11195+ int len = strlen(str);
11196+ if (len > 0)
11197+ {
11198+ if (str[len-1] == '"') str[--len] = 0;
11199+ if (str[0] == '"') { int i = 0; do { str[i++] = str[i+1]; } while(--len); }
11200+ }
11201+ return str;
11202+}
11203+
11204+void *kickman(void *dummy)
11205+{
11206+ while(1) {
11207+ UINT32 sleepTime = 0;
11208+ IHXMediaPlatformKicker* pKicker = GetGlobal()->g_pIHXKicker;
11209+ if( pKicker )
11210+ {
11211+ pKicker->Kick(GetGlobal()->g_uThreadIDForKicker, &sleepTime);
11212+ }
11213+ usleep(sleepTime);
11214+ }
11215+}
11216+
11217+PLAYER_API int init_main( )
11218+{
11219+#if defined(_WIN32) && !defined(WIN32_PLATFORM_PSPC)
11220+ setvbuf(stdout, NULL, _IONBF, 0);
11221+#endif /* defined(_WIN32) && !defined(WIN32_PLATFORM_PSPC) */
11222+
11223+ FPHXMEDIAPLATFORMOPEN fpHXMediaPlatformOpen = NULL;
11224+ FPHXCREATEMEDIAPLATFORM fpHXCreateMediaPlatform = NULL;
11225+ FPHXMEDIAPLATFORMCLOSE fpHXMediaPlatformClose = NULL;
11226+
11227+ FPRMCREATEENGINE fpCreateEngine = NULL;
11228+ FPRMCLOSEENGINE fpCloseEngine = NULL;
11229+ FPRMSETDLLACCESSPATH fpSetDll = NULL;
11230+
11231+ HX_RESULT theErr = HXR_OK;
11232+ ExampleClientContext** ppExContexts = NULL;
11233+#if defined(HELIX_FEATURE_AUTO_BANDWIDTH_DETECTION) && defined(_WIN32)
11234+ ExampleABD* pABD = NULL;
11235+#endif
11236+ IHXPlayer** ppPlayers = NULL;
11237+ IHXQuickSeek* ppQuickSeek = NULL;
11238+ IHXErrorSink* pErrorSink = NULL;
11239+ IHXErrorSinkControl* pErrorSinkControl = NULL;
11240+ UINT32 ulABDResult = 0;
11241+ UINT32 ulProbPktSize = 0;
11242+ UINT32 ulProbPktNum = 0;
11243+#if defined(HELIX_FEATURE_PLAYBACK_VELOCITY)
11244+ INT32 lVelocity = 100;
11245+ INT32 lKeyFrameMode = 0;
11246+ INT32 lAutoSwitch = 0;
11247+#endif /* #if defined(HELIX_FEATURE_PLAYBACK_VELOCITY) */
11248+ CHXString* pABDServer = NULL;
11249+ char* pszURL[MAX_NUM_URLS];
11250+ char* pszURLOrig[MAX_NUM_URLS];
11251+ UINT32 ulNumURLsFound = 0;
11252+ int nNumPlayers = 1;
11253+ int nNumPlayRepeats = 1;
11254+ int nTimeDelta = DEFAULT_TIME_DELTA;
11255+ int nStopTime = DEFAULT_STOP_TIME;
11256+ bool bStopTime = true;
11257+ int i = 0;
11258+ char* pszGUIDList = NULL;
11259+#ifdef _MACINTOSH
11260+ char dllhome[MAX_PATH] = {'\0'}; /* Flawfinder: ignore */
11261+#elif defined(_SYMBIAN)
11262+ char dllhome[MAX_PATH] = "c:"; /* Flawfinder: ignore */
11263+#else
11264+ char dllhome[MAX_PATH] = {'.','\0'}; /* Flawfinder: ignore */
11265+#endif
11266+ DLLAccess* pDLLAccess = NULL;
11267+ char staticLibPath[MAX_PATH] = {0}; /* Flawfinder: ignore */
11268+#ifdef _WINDOWS
11269+ HINSTANCE hDll = NULL;
11270+#endif
11271+ bool bStopping = false;
11272+ int nPlay = 0;
11273+
11274+ // NULL out the URL arrays
11275+ memset(pszURL, 0, MAX_NUM_URLS * sizeof(char*));
11276+ memset(pszURLOrig, 0, MAX_NUM_URLS * sizeof(char*));
11277+
11278+
11279+ //See if the user has set their HELIX_LIBS env var. This is overridden by the
11280+ //-l option.
11281+ const char* pszHelixLibs = getenv("HELIX_LIBS");
11282+ if( pszHelixLibs )
11283+ SafeStrCpy( dllhome, pszHelixLibs, MAX_PATH);
11284+
11285+
11286+
11287+ GetGlobal()->bEnableAdviceSink = TRUE;
11288+ GetGlobal()->g_prefList.Add("UseOverlay", "0");
11289+
11290+ SafeSprintf(staticLibPath, MAX_PATH, "%s/%s", dllhome, "hxmedpltfm.so");
11291+
11292+ if (dllhome)
11293+ {
11294+ GetDLLAccessPath()->SetPath(DLLTYPE_COMMON, dllhome);
11295+ GetDLLAccessPath()->SetPath(DLLTYPE_PLUGIN, dllhome);
11296+ GetDLLAccessPath()->SetPath(DLLTYPE_CODEC, dllhome);
11297+ }
11298+
11299+ // initialize the globals
11300+ GetGlobal()->m_fpCreateEngine = NULL;
11301+ GetGlobal()->m_fpCloseEngine = NULL;
11302+ GetGlobal()->g_nPlayers = 0;
11303+
11304+ // prepare/load the HXCore module
11305+ pDLLAccess = new DLLAccess();
11306+
11307+ STDOUT("Simpleplayer is looking for the client core at %s\n", staticLibPath );
11308+
11309+ if (DLLAccess::DLL_OK != pDLLAccess->open(staticLibPath))
11310+ {
11311+ const char* pErrorString = NULL;
11312+ pErrorString = pDLLAccess->getErrorString();
11313+ STDERR("splayer: %s\n\n", pErrorString);
11314+#ifndef _STATICALLY_LINKED
11315+#ifndef _MACINTOSH
11316+ //Make sure the user has told us where to find the DLLs at. Either
11317+ //with the -l option or with the HELIX_LIBS env var.
11318+ STDERR("You must tell the player where to find the client core and\n");
11319+ STDERR("all of its supporting DLLs and codecs. Please use the -l\n");
11320+ STDERR("option or set your HELIX_LIBS env variable to point the player.\n");
11321+ STDERR("to where you have all of the DLLs installed.\n\n" );
11322+ //PrintUsage(argv[0]);
11323+#endif
11324+#endif
11325+ goto cleanup;
11326+ }
11327+
11328+ GetGlobal()->m_fpHXMediaPlatformOpen = (FPHXMEDIAPLATFORMOPEN) pDLLAccess->getSymbol("HXMediaPlatformOpen");
11329+ GetGlobal()->m_fpHXCreateMediaPlatform = (FPHXCREATEMEDIAPLATFORM) pDLLAccess->getSymbol("HXCreateMediaPlatform");
11330+ GetGlobal()->m_fpHXMediaPlatformClose = (FPHXMEDIAPLATFORMCLOSE) pDLLAccess->getSymbol("HXMediaPlatformClose");
11331+
11332+ GetGlobal()->m_fpCreateEngine = (FPRMCREATEENGINE) pDLLAccess->getSymbol("CreateEngine");
11333+ GetGlobal()->m_fpCloseEngine = (FPRMCLOSEENGINE) pDLLAccess->getSymbol("CloseEngine");
11334+ GetGlobal()->m_fpSetDLLAccessPath = (FPRMSETDLLACCESSPATH) pDLLAccess->getSymbol("SetDLLAccessPath");
11335+
11336+ if (GetGlobal()->m_fpHXMediaPlatformOpen == NULL ||
11337+ GetGlobal()->m_fpHXCreateMediaPlatform == NULL ||
11338+ GetGlobal()->m_fpHXMediaPlatformClose == NULL ||
11339+ GetGlobal()->m_fpCreateEngine == NULL ||
11340+ GetGlobal()->m_fpCloseEngine == NULL ||
11341+ GetGlobal()->m_fpSetDLLAccessPath == NULL )
11342+ {
11343+ theErr = HXR_FAILED;
11344+ goto cleanup;
11345+ }
11346+
11347+#if defined(USE_XWINDOWS) && defined(HELIX_FEATURE_VIDEO)
11348+ XInitThreads();
11349+#endif
11350+
11351+ {
11352+ fpHXMediaPlatformOpen = GetGlobal()->m_fpHXMediaPlatformOpen;
11353+ fpHXCreateMediaPlatform = GetGlobal()->m_fpHXCreateMediaPlatform;
11354+ fpHXMediaPlatformClose = GetGlobal()->m_fpHXMediaPlatformClose;
11355+
11356+ if (HXR_OK != fpHXMediaPlatformOpen())
11357+ {
11358+ theErr = HXR_FAILED;
11359+ goto cleanup;
11360+ }
11361+
11362+ if (HXR_OK != fpHXCreateMediaPlatform((IHXMediaPlatform**)&GetGlobal()->pMediaPlatform))
11363+ {
11364+ theErr = HXR_FAILED;
11365+ goto cleanup;
11366+ }
11367+
11368+ IHXMediaPlatform* pMediaPlatform = GetGlobal()->pMediaPlatform;
11369+
11370+
11371+ if (HXR_OK != pMediaPlatform->AddPluginPath("HelixSimplePlayer", dllhome))
11372+ {
11373+ theErr = HXR_FAILED;
11374+ goto cleanup;
11375+ }
11376+
11377+ if (HXR_OK != pMediaPlatform->Init(NULL))
11378+ {
11379+ theErr = HXR_FAILED;
11380+ goto cleanup;
11381+ }
11382+
11383+ IHXCommonClassFactory* pCCF = NULL;
11384+ if (HXR_OK != pMediaPlatform->QueryInterface(IID_IHXCommonClassFactory,
11385+ (void**)&pCCF))
11386+ {
11387+ theErr = HXR_FAILED;
11388+ goto cleanup;
11389+ }
11390+
11391+ if (HXR_OK != pCCF->CreateInstance(CLSID_IHXClientEngine, (void**)&GetGlobal()->pEngine))
11392+ {
11393+ HX_RELEASE(pCCF);
11394+ theErr = HXR_FAILED;
11395+ goto cleanup;
11396+ }
11397+
11398+ HX_RELEASE(pCCF);
11399+
11400+ IHXMediaPlatformKicker* pKicker = NULL;
11401+ pMediaPlatform->QueryInterface(IID_IHXMediaPlatformKicker, (void**)&pKicker);
11402+ HX_ASSERT(pKicker);
11403+ GetGlobal()->g_pIHXKicker = pKicker;
11404+ GetGlobal()->g_uThreadIDForKicker = HXGetCurrentThreadID();
11405+
11406+ pthread_t thread_id;
11407+ pthread_create(&thread_id, NULL, kickman, NULL);
11408+ GetGlobal()->g_pThreadKickmanId = thread_id;
11409+ }
11410+
11411+
11412+
11413+ {
11414+
11415+
11416+#if defined(_WIN32) && !defined(WIN32_PLATFORM_PSPC)
11417+ SetConsoleCtrlHandler((PHANDLER_ROUTINE)HandlerRoutine,
11418+ TRUE);
11419+#endif
11420+
11421+ }
11422+
11423+ return HXR_OK;
11424+
11425+ cleanup:
11426+ deinit_main();
11427+ return HXR_FAIL;
11428+}
11429+
11430+/* Get the least index to available entry in Getglobal()->gPlayers */
11431+static int get_index()
11432+{
11433+ int i;
11434+ /* an simple implementation */
11435+ for (i = 0; i < MAX_NUM_PLAYERS; i++)
11436+ {
11437+ if (GetGlobal()->g_Players[i] == NULL)
11438+ return i;
11439+ }
11440+
11441+ return -1;
11442+}
11443+
11444+PLAYER_API unsigned int get_curr_playtime(void *pPlayerHandle)
11445+{
11446+ unsigned int time = 0;
11447+ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle;
11448+ if (pPlayer)
11449+ time = pPlayer->GetCurrentPlayTime();
11450+ return time;
11451+}
11452+
11453+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)
11454+{
11455+ int index = get_index();
11456+ IHXPlayer **ppPlayer = (IHXPlayer **)ppPlayerHandle;
11457+ ExampleClientContext* pExContext = NULL;
11458+ pExContext = new ExampleClientContext(index);
11459+ if (!pExContext)
11460+ {
11461+ return HXR_UNEXPECTED;
11462+ }
11463+ pExContext->AddRef();
11464+
11465+ ppPlayer[0] = NULL;
11466+ IHXClientEngine* pEngine = GetGlobal()->pEngine;
11467+ if (HXR_OK != pEngine->CreatePlayer(*ppPlayer))
11468+ {
11469+ HX_RELEASE(pExContext);
11470+ return HXR_FAILED;
11471+ }
11472+#if 1
11473+ char* pszGUIDList = NULL;
11474+ //initialize the example context
11475+ pszGUIDList = GetGlobal()->g_pszGUIDList;
11476+ {
11477+ char pszGUID[GUID_LEN + 1]; /* Flawfinder: ignore */ // add 1 for terminator
11478+ char* token = NULL;
11479+ IHXPreferences* pPreferences = NULL;
11480+
11481+ pszGUID[0] = '\0';
11482+
11483+ if (pszGUIDList)
11484+ {
11485+ // Get next GUID from the GUID list
11486+ {
11487+ token = strtok(pszGUIDList, "\n\0");
11488+ }
11489+ if (token)
11490+ {
11491+ strncpy(pszGUID, token, GUID_LEN); /* Flawfinder: ignore */
11492+ pszGUID[GUID_LEN] = '\0';
11493+ }
11494+ }
11495+
11496+ ppPlayer[0]->QueryInterface(IID_IHXPreferences,
11497+ (void**) &pPreferences);
11498+
11499+ pExContext->Init(ppPlayer[0], pPreferences, pszGUID, on_buffering_cb, on_pos_length_cb, on_state_change_cb, on_new_frame_cb, context);
11500+
11501+ ppPlayer[0]->SetClientContext(pExContext);
11502+
11503+ HX_RELEASE(pPreferences);
11504+
11505+ IHXErrorSinkControl* pErrorSinkControl = NULL;
11506+ ppPlayer[0]->QueryInterface(IID_IHXErrorSinkControl,
11507+ (void**) &pErrorSinkControl);
11508+
11509+ if (pErrorSinkControl)
11510+ {
11511+ IHXErrorSink* pErrorSink = NULL;
11512+ pExContext->QueryInterface(IID_IHXErrorSink,
11513+ (void**) &pErrorSink);
11514+ if (pErrorSink)
11515+ {
11516+ pErrorSinkControl->AddErrorSink(pErrorSink, HXLOG_EMERG, HXLOG_INFO);
11517+ }
11518+ HX_RELEASE(pErrorSink);
11519+ }
11520+ HX_RELEASE(pErrorSinkControl);
11521+ GetGlobal()->g_prefList.SetPreferences(ppPlayer[0]);
11522+
11523+ }
11524+#endif
11525+ HX_ASSERT(GetGlobal()->g_nPlayers < MAX_NUM_PLAYERS);
11526+ GetGlobal()->g_Players[index] = ppPlayer[0];
11527+ GetGlobal()->g_pClientContexts[index] = pExContext;
11528+ GetGlobal()->g_nPlayers++;
11529+
11530+ return HXR_OK;
11531+}
11532+
11533+static int get_index_by_player( IHXPlayer *pPlayer)
11534+{
11535+ int i;
11536+ /* an simple implementation */
11537+ for (i = 0; i < MAX_NUM_PLAYERS; i++)
11538+ {
11539+ if (GetGlobal()->g_Players[i] && GetGlobal()->g_Players[i] == pPlayer)
11540+ return i;
11541+ }
11542+
11543+ return -1;
11544+}
11545+
11546+PLAYER_API int player_openurl( void *pPlayerHandle, char *pszRawURL)
11547+{
11548+ HX_RESULT ret;
11549+ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle;
11550+ int index = get_index_by_player(pPlayer);
11551+ if (index < 0)
11552+ return HXR_FAIL;
11553+
11554+ char *pszURLOrig = RemoveWrappingQuotes(pszRawURL);
11555+
11556+ //if no "://" was found lets add file:// by default so that you
11557+ //can refer to local content as just ./splay ~/Content/startrek.rm,
11558+ //for example, and not ./splay file:///home/gregory/Content/startrek.rm
11559+ char* pszAddOn = NULL;
11560+ if( strstr( pszURLOrig, "://") )
11561+ pszAddOn = (char *)"";
11562+ else
11563+ pszAddOn = (char *)"file://";
11564+
11565+ char *pszURL = new char[strlen(pszURLOrig)+strlen(pszAddOn)+1];
11566+ sprintf( pszURL, "%s%s", pszAddOn, pszURLOrig ); /* Flawfinder: ignore */
11567+ // Increment the number of URLs we have found
11568+ STDERR("opening %s on player\n", pszURL);
11569+
11570+ GetGlobal()->g_pszURLs[index] = pszURL;
11571+ ret = pPlayer->OpenURL(pszURL);
11572+
11573+ UINT32 sleepTime = 0;
11574+
11575+ IHXMediaPlatformKicker* pKicker = GetGlobal()->g_pIHXKicker;
11576+ if( pKicker )
11577+ {
11578+ pKicker->Kick(HXGetCurrentThreadID(), &sleepTime);
11579+ }
11580+
11581+ return ret;
11582+}
11583+
11584+PLAYER_API int put_player( void *pPlayerHandle)
11585+{
11586+ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle;
11587+ int index;
11588+ index = get_index_by_player(pPlayer);
11589+ if (index < 0)
11590+ return HXR_FAIL;
11591+
11592+ ExampleClientContext *pClientContext = GetGlobal()->g_pClientContexts[index];
11593+ if (pClientContext) {
11594+ pClientContext->Release();
11595+ pClientContext = NULL;
11596+ }
11597+
11598+ GetGlobal()->g_pClientContexts[index] = NULL;
11599+ if (pPlayer) {
11600+ if (GetGlobal()->pEngine) {
11601+ GetGlobal()->pEngine->ClosePlayer(pPlayer);
11602+ }
11603+ pPlayer->Release();
11604+ pPlayer = NULL;
11605+ }
11606+ GetGlobal()->g_Players[index] = NULL;
11607+ GetGlobal()->g_nPlayers--;
11608+ delete [] GetGlobal()->g_pszURLs[index];
11609+ GetGlobal()->g_pszURLs[index] = NULL;
11610+
11611+ return HXR_OK;
11612+}
11613+
11614+PLAYER_API int player_geturl( void *pPlayerHandle, char **pszURL)
11615+{
11616+ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle;
11617+ int index = get_index_by_player(pPlayer);
11618+ if (index >= 0) {
11619+ *pszURL = GetGlobal()->g_pszURLs[index];
11620+ return HXR_OK;
11621+ }
11622+
11623+ return HXR_FAIL;
11624+}
11625+
11626+PLAYER_API int player_begin( void *pPlayerHandle )
11627+{
11628+ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle;
11629+ UINT32 sleepTime = 0;
11630+ pPlayer->Begin();
11631+
11632+#if 0
11633+ IHXMediaPlatformKicker* pKicker = GetGlobal()->g_pIHXKicker;
11634+ if( pKicker )
11635+ {
11636+ pKicker->Kick(HXGetCurrentThreadID(), &sleepTime);
11637+ }
11638+#endif
11639+ return HXR_OK;
11640+}
11641+
11642+PLAYER_API int player_pause( void *pPlayerHandle )
11643+{
11644+ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle;
11645+ UINT32 sleepTime = 0;
11646+ pPlayer->Pause();
11647+
11648+#if 0
11649+ IHXMediaPlatformKicker* pKicker = GetGlobal()->g_pIHXKicker;
11650+ if( pKicker )
11651+ {
11652+ pKicker->Kick(HXGetCurrentThreadID(), &sleepTime);
11653+ }
11654+#endif
11655+ return HXR_OK;
11656+}
11657+
11658+PLAYER_API int player_stop( void *pPlayerHandle )
11659+{
11660+ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle;
11661+ pPlayer->Stop();
11662+ return HXR_OK;
11663+}
11664+
11665+#if 0
11666+int main(int argc, char *argv[])
11667+{
11668+ IHXPlayer *pPlayer;
11669+ init_main();
11670+ while(1) {
11671+ get_player(&pPlayer);
11672+ player_openurl(pPlayer, argv[1]);
11673+ player_begin(pPlayer);
11674+ // sleep(2);
11675+ player_stop(pPlayer);
11676+ put_player(pPlayer);
11677+ }
11678+ deinit_main();
11679+ return 0;
11680+}
11681+#endif
11682+
11683+PLAYER_API int player_seek(void *pPlayerHandle, int pos)
11684+{
11685+ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle;
11686+ if (pPlayer == NULL)
11687+ return HXR_FAIL;
11688+
11689+ return pPlayer->Seek(pos);
11690+}
11691+PLAYER_API int player_getvolume(void *pPlayerHandle)
11692+{
11693+ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle;
11694+ if (pPlayer == NULL)
11695+ return HXR_FAIL;
11696+
11697+ int volume = 0;
11698+
11699+ IHXAudioPlayer* pAudioPlayer = NULL;
11700+ pPlayer->QueryInterface(IID_IHXAudioPlayer, (void**) &pAudioPlayer);
11701+ if (pAudioPlayer)
11702+ {
11703+ // Get the IHXVolume
11704+ IHXVolume* pVolume = pAudioPlayer->GetAudioVolume();
11705+ if (pVolume)
11706+ {
11707+ volume = pVolume->GetVolume();
11708+ }
11709+ HX_RELEASE(pVolume);
11710+ }
11711+ HX_RELEASE(pAudioPlayer);
11712+
11713+ return volume;
11714+}
11715+
11716+
11717+PLAYER_API int player_setvolume(void *pPlayerHandle, unsigned short volume)
11718+{
11719+ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle;
11720+ if (pPlayer == NULL)
11721+ return HXR_FAIL;
11722+
11723+ IHXAudioPlayer* pAudioPlayer = NULL;
11724+ pPlayer->QueryInterface(IID_IHXAudioPlayer, (void**) &pAudioPlayer);
11725+ if (pAudioPlayer)
11726+ {
11727+ // Get the IHXVolume
11728+ IHXVolume* pVolume = pAudioPlayer->GetAudioVolume();
11729+ if (pVolume)
11730+ {
11731+ pVolume->SetVolume(volume);
11732+ }
11733+ HX_RELEASE(pVolume);
11734+ }
11735+ HX_RELEASE(pAudioPlayer);
11736+}
11737+
11738+PLAYER_API int deinit_main()
11739+{
11740+
11741+ pthread_cancel(GetGlobal()->g_pThreadKickmanId);
11742+ int ret ;
11743+ ret = pthread_join(GetGlobal()->g_pThreadKickmanId, NULL);
11744+ if (ret < 0) {
11745+ perror("pthread_join error\n");
11746+ }
11747+#if defined(HELIX_FEATURE_PLAYBACK_VELOCITY)
11748+ if (GetGlobal()->g_pVelocityCaps)
11749+ {
11750+ IHXPlaybackVelocityCaps* pCaps = GetGlobal()->g_pVelocityCaps;
11751+ pCaps->Release();
11752+ GetGlobal()->g_pVelocityCaps = NULL;
11753+ }
11754+#endif /* #if defined(HELIX_FEATURE_PLAYBACK_VELOCITY) */
11755+
11756+#ifdef __TCS__
11757+ g_nPlayers = 0;
11758+#endif
11759+
11760+
11761+ {
11762+ IHXClientEngine* pEngine = GetGlobal()->pEngine;
11763+
11764+ if (pEngine)
11765+ {
11766+ IHXClientEngine2* pEngine2 = NULL;
11767+ if (HXR_OK == pEngine->QueryInterface(IID_IHXClientEngine2,
11768+ (void**)&pEngine2))
11769+ {
11770+ pEngine2->Close();
11771+ }
11772+ HX_RELEASE(pEngine2);
11773+ }
11774+ HX_RELEASE(GetGlobal()->pEngine);
11775+ HX_RELEASE(GetGlobal()->g_pIHXKicker);
11776+
11777+ if (GetGlobal()->pMediaPlatform)
11778+ {
11779+ // Reset() not only close the platform but also remove all
11780+ // persistent information(i.e. preferences) maintained by the
11781+ // platform
11782+ // GetGlobal()->pMediaPlatform->Reset(NULL);
11783+ GetGlobal()->pMediaPlatform->Close();
11784+ HX_RELEASE(GetGlobal()->pMediaPlatform);
11785+ }
11786+
11787+ if (GetGlobal()->m_fpHXMediaPlatformClose)
11788+ {
11789+ GetGlobal()->m_fpHXMediaPlatformClose();
11790+ }
11791+ }
11792+
11793+
11794+ if (GetGlobal()->bEnableVerboseMode)
11795+ {
11796+ STDOUT("\nDone.\n");
11797+ }
11798+
11799+ if (GetGlobal()->g_pszUsername)
11800+ {
11801+ delete [] GetGlobal()->g_pszUsername;
11802+ GetGlobal()->g_pszUsername = NULL;
11803+ }
11804+ if (GetGlobal()->g_pszPassword)
11805+ {
11806+ delete [] GetGlobal()->g_pszPassword;
11807+ GetGlobal()->g_pszPassword = NULL;
11808+ }
11809+ if (GetGlobal()->g_pszGUIDFile)
11810+ {
11811+ delete [] GetGlobal()->g_pszGUIDFile;
11812+ GetGlobal()->g_pszGUIDFile = NULL;
11813+ }
11814+ if (GetGlobal()->g_pszGUIDList)
11815+ {
11816+ delete [] GetGlobal()->g_pszGUIDList;
11817+ GetGlobal()->g_pszGUIDList = NULL;
11818+ }
11819+ // If an error occurred during playback, return that
11820+
11821+ if (GetGlobal()->g_Error != HXR_OK)
11822+ {
11823+ return GetGlobal()->g_Error;
11824+ }
11825+ // or HXR_OK (if there was more than one player)
11826+ else
11827+ {
11828+ return HXR_OK;
11829+ }
11830+}
11831+char* GetAppName(char* pszArgv0)
11832+{
11833+ char* pszAppName;
11834+
11835+ pszAppName = strrchr(pszArgv0, '\\');
11836+
11837+ if (NULL == pszAppName)
11838+ {
11839+ return pszArgv0;
11840+ }
11841+ else
11842+ {
11843+ return pszAppName + 1;
11844+ }
11845+}
11846+
11847+void PrintUsage(const char* pszAppName)
11848+{
11849+}
11850+
11851+
11852+
11853+HXBOOL ReadGUIDFile()
11854+{
11855+ HXBOOL bSuccess = FALSE;
11856+ FILE* pFile = NULL;
11857+ int nNumRead = 0;
11858+ int readSize = 10000;
11859+ char* pszBuffer = new char[readSize];
11860+
11861+ if (GetGlobal()->g_pszGUIDFile)
11862+ {
11863+ if((pFile = fopen(GetGlobal()->g_pszGUIDFile, "r")) != NULL)
11864+ {
11865+ // Read in the entire file
11866+ nNumRead = fread(pszBuffer, sizeof(char), readSize, pFile);
11867+ pszBuffer[nNumRead] = '\0';
11868+
11869+ // Store it for later parsing
11870+ GetGlobal()->g_pszGUIDList = new char[nNumRead + 1];
11871+ strcpy(GetGlobal()->g_pszGUIDList, pszBuffer); /* Flawfinder: ignore */
11872+
11873+ fclose(pFile);
11874+ pFile = NULL;
11875+
11876+ if (nNumRead > 0)
11877+ {
11878+ bSuccess = TRUE;
11879+ }
11880+ }
11881+ }
11882+
11883+ delete [] pszBuffer;
11884+
11885+ return bSuccess;
11886+}
11887+
11888+static int are_all_src_seekable(IHXPlayer *pPlayer)
11889+{
11890+ UINT16 nSrcCnt;
11891+ nSrcCnt = pPlayer->GetSourceCount();
11892+ HXSource *pSource = NULL; /* This is brute-force */
11893+ for (UINT16 i = 0; i < nSrcCnt; i++)
11894+ {
11895+ if (pPlayer->GetSource(i, (IUnknown *&)pSource) == HXR_OK)
11896+ {
11897+ if (!pSource->IsSeekable())
11898+ return FALSE;
11899+
11900+
11901+ }
11902+ }
11903+
11904+}
11905+
11906+PLAYER_API int player_canseek(void *pPlayerHandle)
11907+{
11908+ if (!pPlayerHandle)
11909+ return FALSE;
11910+
11911+ IHXPlayer *pPlayer = (IHXPlayer *)pPlayerHandle;
11912+ ExampleClientContext* pExContext=NULL;
11913+ if (pPlayer->GetClientContext((IUnknown*&)pExContext) != HXR_OK)
11914+ return FALSE;
11915+
11916+ if (!pExContext)
11917+ return FALSE;
11918+
11919+ EHXClientState State = pExContext->GetState();
11920+
11921+ int all_src_seekable = are_all_src_seekable(pPlayer);
11922+
11923+ HX_RELEASE(pExContext);
11924+
11925+ if (State < HX_CLIENT_STATE_CONNECTED)
11926+ return TRUE;
11927+
11928+ if (all_src_seekable && (!pPlayer->IsLive() || State == HX_CLIENT_STATE_PAUSED))
11929+ return TRUE;
11930+
11931+ return FALSE;
11932+}
11933+
11934+
11935Index: helix-libs/clientapps/clutter/player.h
11936===================================================================
11937--- /dev/null 1970-01-01 00:00:00.000000000 +0000
11938+++ helix-libs/clientapps/clutter/player.h 2008-10-13 06:54:45.000000000 -0700
11939@@ -0,0 +1,60 @@
11940+#ifndef _PLAYER_H_
11941+#define _PLAYER_H_
11942+
11943+#ifdef __cplusplus
11944+#define PLAYER_API extern "C"
11945+#else
11946+#define PLAYER_API
11947+#endif
11948+
11949+/* Duplicate of EHXClientState */
11950+typedef enum _EPlayerStateState
11951+{
11952+ PLAYER_STATE_READY = 0, // uninitialized
11953+ PLAYER_STATE_CONNECTING, // attempting to connect to sources
11954+ PLAYER_STATE_CONNECTED, // connected to sources (realized)
11955+ PLAYER_STATE_OPENING, // opening sources
11956+ PLAYER_STATE_OPENED, // opened sources
11957+ PLAYER_STATE_PREFETCHING,// obtaining resources, buffering, etc.
11958+ PLAYER_STATE_PREFETCHED, // ready for playback at time zero
11959+ PLAYER_STATE_PLAYING, // currently playing
11960+ PLAYER_STATE_PAUSED, // paused
11961+ PLAYER_STATE_SEEKING // seeking
11962+} EHXPlayerState;
11963+
11964+typedef struct {
11965+ int left;
11966+ int top;
11967+ int right;
11968+ int bottom;
11969+} PlayerRect;
11970+
11971+typedef struct {
11972+ PlayerRect Rect;
11973+ unsigned int cx;
11974+ unsigned int cy;
11975+} PlayerImgInfo;
11976+
11977+typedef void (*on_pos_length_cb_t)(unsigned int, unsigned int, void *);
11978+typedef void (*on_buffering_cb_t)(unsigned int, unsigned short, void *);
11979+typedef void (*on_state_change_cb_t)(unsigned short, unsigned short, void *);
11980+typedef void (*on_new_frame_cb_t)(unsigned char *p, unsigned int size, PlayerImgInfo *rect, void *context);
11981+
11982+PLAYER_API int init_main();
11983+PLAYER_API int deinit_main();
11984+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);
11985+PLAYER_API int player_openurl( void *pPlayerHandle, char *pszRawURL);
11986+PLAYER_API int put_player( void *pPlayerHandle);
11987+PLAYER_API int player_geturl( void *pPlayerHandle, char **pszURL);
11988+PLAYER_API int player_begin( void *pPlayerHandle );
11989+PLAYER_API int player_stop( void *pPlayerHandle );
11990+PLAYER_API int player_pause( void *pPlayerHandle );
11991+PLAYER_API unsigned int get_curr_playtime(void *pPlayerHandle);
11992+PLAYER_API int player_seek(void *pPlayerHandle, int pos);
11993+PLAYER_API int player_getvolume(void *pPlayerHandle);
11994+PLAYER_API int player_setvolume(void *pPlayerHandle, unsigned short volumn);
11995+PLAYER_API int player_canseek(void *pPlayerHandle);
11996+
11997+
11998+#endif
11999+
12000Index: helix-libs/clientapps/clutter/preflist.cpp
12001===================================================================
12002--- /dev/null 1970-01-01 00:00:00.000000000 +0000
12003+++ helix-libs/clientapps/clutter/preflist.cpp 2008-10-13 06:05:49.000000000 -0700
12004@@ -0,0 +1,142 @@
12005+/* ***** BEGIN LICENSE BLOCK *****
12006+ * Source last modified: $Id: preflist.cpp,v 1.2 2007/07/06 20:32:36 jfinnecy Exp $
12007+ *
12008+ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
12009+ *
12010+ * The contents of this file, and the files included with this file,
12011+ * are subject to the current version of the RealNetworks Public
12012+ * Source License (the "RPSL") available at
12013+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
12014+ * the file under the current version of the RealNetworks Community
12015+ * Source License (the "RCSL") available at
12016+ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
12017+ * will apply. You may also obtain the license terms directly from
12018+ * RealNetworks. You may not use this file except in compliance with
12019+ * the RPSL or, if you have a valid RCSL with RealNetworks applicable
12020+ * to this file, the RCSL. Please see the applicable RPSL or RCSL for
12021+ * the rights, obligations and limitations governing use of the
12022+ * contents of the file.
12023+ *
12024+ * Alternatively, the contents of this file may be used under the
12025+ * terms of the GNU General Public License Version 2 (the
12026+ * "GPL") in which case the provisions of the GPL are applicable
12027+ * instead of those above. If you wish to allow use of your version of
12028+ * this file only under the terms of the GPL, and not to allow others
12029+ * to use your version of this file under the terms of either the RPSL
12030+ * or RCSL, indicate your decision by deleting the provisions above
12031+ * and replace them with the notice and other provisions required by
12032+ * the GPL. If you do not delete the provisions above, a recipient may
12033+ * use your version of this file under the terms of any one of the
12034+ * RPSL, the RCSL or the GPL.
12035+ *
12036+ * This file is part of the Helix DNA Technology. RealNetworks is the
12037+ * developer of the Original Code and owns the copyrights in the
12038+ * portions it created.
12039+ *
12040+ * This file, and the files included with this file, is distributed
12041+ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
12042+ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
12043+ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
12044+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
12045+ * ENJOYMENT OR NON-INFRINGEMENT.
12046+ *
12047+ * Technology Compatibility Kit Test Suite(s) Location:
12048+ * http://www.helixcommunity.org/content/tck
12049+ *
12050+ * Contributor(s):
12051+ *
12052+ * ***** END LICENSE BLOCK ***** */
12053+#include "preflist.h"
12054+
12055+#include "hxstring.h"
12056+#include "hxccf.h"
12057+#include "hxprefs.h"
12058+#include "ihxpckts.h"
12059+
12060+class CHXPrefInfo
12061+{
12062+public:
12063+ CHXPrefInfo(const char* pKey, const char* pValue);
12064+ ~CHXPrefInfo();
12065+
12066+ const char* Key() const { return m_key;}
12067+ const char* Value() const { return m_value;}
12068+
12069+private:
12070+ CHXString m_key;
12071+ CHXString m_value;
12072+};
12073+
12074+CHXPrefInfo::CHXPrefInfo(const char* pKey, const char* pValue) :
12075+ m_key(pKey),
12076+ m_value(pValue)
12077+{}
12078+
12079+CHXPrefInfo::~CHXPrefInfo()
12080+{}
12081+
12082+CHXPrefList::CHXPrefList()
12083+{}
12084+
12085+CHXPrefList::~CHXPrefList()
12086+{
12087+ Clear();
12088+}
12089+
12090+void CHXPrefList::Add(const char* pKey, const char* pValue)
12091+{
12092+ CHXPrefInfo* pInfo = new CHXPrefInfo(pKey, pValue);
12093+
12094+ if (pInfo)
12095+ {
12096+ if (!m_prefInfo.AddTail(pInfo))
12097+ {
12098+ // We failed to insert the preference.
12099+ HX_DELETE(pInfo);
12100+ }
12101+ }
12102+}
12103+
12104+void CHXPrefList::Clear()
12105+{
12106+ while(!m_prefInfo.IsEmpty())
12107+ {
12108+ CHXPrefInfo* pInfo = (CHXPrefInfo*)m_prefInfo.RemoveHead();
12109+ HX_DELETE(pInfo);
12110+ }
12111+}
12112+
12113+void CHXPrefList::SetPreferences(IUnknown* pContext)
12114+{
12115+ IHXPreferences* pPrefs = NULL;
12116+ IHXCommonClassFactory* pCCF = NULL;
12117+
12118+ if (pContext &&
12119+ (HXR_OK == pContext->QueryInterface(IID_IHXPreferences,
12120+ (void**)&pPrefs)) &&
12121+ (HXR_OK == pContext->QueryInterface(IID_IHXCommonClassFactory,
12122+ (void**)&pCCF)))
12123+ {
12124+ CHXSimpleList::Iterator itr = m_prefInfo.Begin();
12125+
12126+ for(; itr != m_prefInfo.End(); ++itr)
12127+ {
12128+ CHXPrefInfo* pInfo = (CHXPrefInfo*)(*itr);
12129+
12130+ IHXBuffer* pBuf = NULL;
12131+
12132+ if ((HXR_OK == pCCF->CreateInstance(CLSID_IHXBuffer,
12133+ (void**)&pBuf)) &&
12134+ (HXR_OK == pBuf->Set((const unsigned char*)pInfo->Value(),
12135+ strlen(pInfo->Value()))))
12136+ {
12137+ pPrefs->WritePref(pInfo->Key(), pBuf);
12138+ }
12139+
12140+ HX_RELEASE(pBuf);
12141+ }
12142+ }
12143+
12144+ HX_RELEASE(pPrefs);
12145+ HX_RELEASE(pCCF);
12146+}
12147Index: helix-libs/clientapps/clutter/preflist.h
12148===================================================================
12149--- /dev/null 1970-01-01 00:00:00.000000000 +0000
12150+++ helix-libs/clientapps/clutter/preflist.h 2008-10-13 06:05:49.000000000 -0700
12151@@ -0,0 +1,69 @@
12152+/* ***** BEGIN LICENSE BLOCK *****
12153+ * Source last modified: $Id: preflist.h,v 1.2 2007/07/06 20:32:36 jfinnecy Exp $
12154+ *
12155+ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
12156+ *
12157+ * The contents of this file, and the files included with this file,
12158+ * are subject to the current version of the RealNetworks Public
12159+ * Source License (the "RPSL") available at
12160+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
12161+ * the file under the current version of the RealNetworks Community
12162+ * Source License (the "RCSL") available at
12163+ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
12164+ * will apply. You may also obtain the license terms directly from
12165+ * RealNetworks. You may not use this file except in compliance with
12166+ * the RPSL or, if you have a valid RCSL with RealNetworks applicable
12167+ * to this file, the RCSL. Please see the applicable RPSL or RCSL for
12168+ * the rights, obligations and limitations governing use of the
12169+ * contents of the file.
12170+ *
12171+ * Alternatively, the contents of this file may be used under the
12172+ * terms of the GNU General Public License Version 2 (the
12173+ * "GPL") in which case the provisions of the GPL are applicable
12174+ * instead of those above. If you wish to allow use of your version of
12175+ * this file only under the terms of the GPL, and not to allow others
12176+ * to use your version of this file under the terms of either the RPSL
12177+ * or RCSL, indicate your decision by deleting the provisions above
12178+ * and replace them with the notice and other provisions required by
12179+ * the GPL. If you do not delete the provisions above, a recipient may
12180+ * use your version of this file under the terms of any one of the
12181+ * RPSL, the RCSL or the GPL.
12182+ *
12183+ * This file is part of the Helix DNA Technology. RealNetworks is the
12184+ * developer of the Original Code and owns the copyrights in the
12185+ * portions it created.
12186+ *
12187+ * This file, and the files included with this file, is distributed
12188+ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
12189+ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
12190+ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
12191+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
12192+ * ENJOYMENT OR NON-INFRINGEMENT.
12193+ *
12194+ * Technology Compatibility Kit Test Suite(s) Location:
12195+ * http://www.helixcommunity.org/content/tck
12196+ *
12197+ * Contributor(s):
12198+ *
12199+ * ***** END LICENSE BLOCK ***** */
12200+#ifndef PREFLIST_H
12201+#define PREFLIST_H
12202+
12203+#include "hxslist.h"
12204+
12205+class CHXPrefList
12206+{
12207+public:
12208+ CHXPrefList();
12209+ ~CHXPrefList();
12210+
12211+ void Add(const char* pKey, const char* pValue);
12212+ void Clear();
12213+
12214+ void SetPreferences(IUnknown* pContext);
12215+
12216+private:
12217+ CHXSimpleList m_prefInfo;
12218+};
12219+
12220+#endif /* PREFLIST_H */
12221Index: helix-libs/clientapps/clutter/print.cpp
12222===================================================================
12223--- /dev/null 1970-01-01 00:00:00.000000000 +0000
12224+++ helix-libs/clientapps/clutter/print.cpp 2008-10-13 06:05:49.000000000 -0700
12225@@ -0,0 +1,80 @@
12226+/* ***** BEGIN LICENSE BLOCK *****
12227+ * Version: RCSL 1.0/RPSL 1.0
12228+ *
12229+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
12230+ *
12231+ * The contents of this file, and the files included with this file, are
12232+ * subject to the current version of the RealNetworks Public Source License
12233+ * Version 1.0 (the "RPSL") available at
12234+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
12235+ * the file under the RealNetworks Community Source License Version 1.0
12236+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
12237+ * in which case the RCSL will apply. You may also obtain the license terms
12238+ * directly from RealNetworks. You may not use this file except in
12239+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
12240+ * applicable to this file, the RCSL. Please see the applicable RPSL or
12241+ * RCSL for the rights, obligations and limitations governing use of the
12242+ * contents of the file.
12243+ *
12244+ * This file is part of the Helix DNA Technology. RealNetworks is the
12245+ * developer of the Original Code and owns the copyrights in the portions
12246+ * it created.
12247+ *
12248+ * This file, and the files included with this file, is distributed and made
12249+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
12250+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
12251+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
12252+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
12253+ *
12254+ * Technology Compatibility Kit Test Suite(s) Location:
12255+ * http://www.helixcommunity.org/content/tck
12256+ *
12257+ * Contributor(s):
12258+ *
12259+ * ***** END LICENSE BLOCK ***** */
12260+
12261+#include <stdarg.h>
12262+#include <stdio.h>
12263+#include "print.h"
12264+#ifdef WIN32_PLATFORM_PSPC
12265+#include "hlxosstr.h"
12266+#include <winbase.h>
12267+#endif
12268+
12269+int print2stdout(const char* pFmt, ...)
12270+{
12271+ va_list args;
12272+
12273+ va_start(args, pFmt);
12274+
12275+#ifdef WIN32_PLATFORM_PSPC
12276+ char szMessage[512];
12277+ int ret = vsprintf(szMessage, pFmt, args);
12278+ OutputDebugString(OS_STRING(szMessage));
12279+#else
12280+ int ret = vfprintf(stdout, pFmt, args);
12281+#endif
12282+
12283+ va_end(args);
12284+
12285+ return ret;
12286+}
12287+
12288+int print2stderr(const char* pFmt, ...)
12289+{
12290+ va_list args;
12291+
12292+ va_start(args, pFmt);
12293+
12294+#ifdef WIN32_PLATFORM_PSPC
12295+ char szMessage[512];
12296+ int ret = vsprintf(szMessage, pFmt, args);
12297+ OutputDebugString(OS_STRING(szMessage));
12298+#else
12299+ int ret = vfprintf(stderr, pFmt, args);
12300+#endif
12301+
12302+ va_end(args);
12303+
12304+ return ret;
12305+}
12306Index: helix-libs/clientapps/clutter/print.h
12307===================================================================
12308--- /dev/null 1970-01-01 00:00:00.000000000 +0000
12309+++ helix-libs/clientapps/clutter/print.h 2008-10-13 06:05:49.000000000 -0700
12310@@ -0,0 +1,60 @@
12311+/* ***** BEGIN LICENSE BLOCK *****
12312+ * Version: RCSL 1.0/RPSL 1.0
12313+ *
12314+ * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
12315+ *
12316+ * The contents of this file, and the files included with this file, are
12317+ * subject to the current version of the RealNetworks Public Source License
12318+ * Version 1.0 (the "RPSL") available at
12319+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
12320+ * the file under the RealNetworks Community Source License Version 1.0
12321+ * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
12322+ * in which case the RCSL will apply. You may also obtain the license terms
12323+ * directly from RealNetworks. You may not use this file except in
12324+ * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
12325+ * applicable to this file, the RCSL. Please see the applicable RPSL or
12326+ * RCSL for the rights, obligations and limitations governing use of the
12327+ * contents of the file.
12328+ *
12329+ * This file is part of the Helix DNA Technology. RealNetworks is the
12330+ * developer of the Original Code and owns the copyrights in the portions
12331+ * it created.
12332+ *
12333+ * This file, and the files included with this file, is distributed and made
12334+ * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
12335+ * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
12336+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
12337+ * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
12338+ *
12339+ * Technology Compatibility Kit Test Suite(s) Location:
12340+ * http://www.helixcommunity.org/content/tck
12341+ *
12342+ * Contributor(s):
12343+ *
12344+ * ***** END LICENSE BLOCK ***** */
12345+
12346+#ifndef PRINT_H
12347+#define PRINT_H
12348+
12349+#ifdef __cplusplus
12350+extern "C" {
12351+#endif
12352+
12353+#ifdef _SYMBIAN
12354+#include "platform/symbian/symbian_print.h"
12355+
12356+#define STDOUT symbianPrint
12357+#define STDERR symbianPrint
12358+#else
12359+int print2stdout(const char* pFmt, ...);
12360+int print2stderr(const char* pFmt, ...);
12361+#define STDOUT print2stdout
12362+#define STDERR print2stderr
12363+#endif
12364+
12365+#ifdef __cplusplus
12366+};
12367+#endif
12368+
12369+
12370+#endif /* PRINT_H */
12371Index: helix-libs/clientapps/clutter/shmhelp.h
12372===================================================================
12373--- /dev/null 1970-01-01 00:00:00.000000000 +0000
12374+++ helix-libs/clientapps/clutter/shmhelp.h 2008-10-13 06:05:49.000000000 -0700
12375@@ -0,0 +1,88 @@
12376+/* ***** BEGIN LICENSE BLOCK *****
12377+ * Source last modified: $Id: shmhelp.h,v 1.5 2007/07/06 20:54:01 jfinnecy Exp $
12378+ *
12379+ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
12380+ *
12381+ * The contents of this file, and the files included with this file,
12382+ * are subject to the current version of the RealNetworks Public
12383+ * Source License (the "RPSL") available at
12384+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
12385+ * the file under the current version of the RealNetworks Community
12386+ * Source License (the "RCSL") available at
12387+ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
12388+ * will apply. You may also obtain the license terms directly from
12389+ * RealNetworks. You may not use this file except in compliance with
12390+ * the RPSL or, if you have a valid RCSL with RealNetworks applicable
12391+ * to this file, the RCSL. Please see the applicable RPSL or RCSL for
12392+ * the rights, obligations and limitations governing use of the
12393+ * contents of the file.
12394+ *
12395+ * Alternatively, the contents of this file may be used under the
12396+ * terms of the GNU General Public License Version 2 (the
12397+ * "GPL") in which case the provisions of the GPL are applicable
12398+ * instead of those above. If you wish to allow use of your version of
12399+ * this file only under the terms of the GPL, and not to allow others
12400+ * to use your version of this file under the terms of either the RPSL
12401+ * or RCSL, indicate your decision by deleting the provisions above
12402+ * and replace them with the notice and other provisions required by
12403+ * the GPL. If you do not delete the provisions above, a recipient may
12404+ * use your version of this file under the terms of any one of the
12405+ * RPSL, the RCSL or the GPL.
12406+ *
12407+ * This file is part of the Helix DNA Technology. RealNetworks is the
12408+ * developer of the Original Code and owns the copyrights in the
12409+ * portions it created.
12410+ *
12411+ * This file, and the files included with this file, is distributed
12412+ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
12413+ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
12414+ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
12415+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
12416+ * ENJOYMENT OR NON-INFRINGEMENT.
12417+ *
12418+ * Technology Compatibility Kit Test Suite(s) Location:
12419+ * http://www.helixcommunity.org/content/tck
12420+ *
12421+ * Contributor(s):
12422+ *
12423+ * ***** END LICENSE BLOCK ***** */
12424+
12425+#if defined(USE_XWINDOWS)
12426+#include <X11/X.h>
12427+#include <X11/Xlib.h>
12428+#include <X11/extensions/XShm.h>
12429+#endif
12430+
12431+#include "hxcom.h"
12432+#include "hxtypes.h"
12433+
12434+
12435+class ShmHelp
12436+{
12437+ public:
12438+
12439+ //Helpers
12440+ static void Init(Display* pDisplay );
12441+ static HXBOOL ShmAvailable();
12442+ static HX_RESULT DetachSharedRegion(UCHAR**ppMem, XShmSegmentInfo* pInfo );
12443+ static HX_RESULT CreateSharedRegion( INT32 nSize,
12444+ UCHAR**ppMem,
12445+ int* pnShmID,
12446+ XShmSegmentInfo* pInfo );
12447+
12448+
12449+ protected:
12450+
12451+ private:
12452+ static HXBOOL zm_bUseShm;
12453+
12454+ //The X11 Segment ID....
12455+ static int zm_nSegment;
12456+ static Display* zm_pDisplay;
12457+
12458+ ShmHelp();
12459+ ShmHelp(Display*);
12460+ ~ShmHelp();
12461+
12462+};
12463+
12464Index: helix-libs/clientapps/clutter/unix.pcf
12465===================================================================
12466--- /dev/null 1970-01-01 00:00:00.000000000 +0000
12467+++ helix-libs/clientapps/clutter/unix.pcf 2008-10-13 06:05:49.000000000 -0700
12468@@ -0,0 +1,65 @@
12469+#
12470+# ***** BEGIN LICENSE BLOCK *****
12471+# Version: RCSL 1.0/RPSL 1.0
12472+#
12473+# Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
12474+#
12475+# The contents of this file, and the files included with this file, are
12476+# subject to the current version of the RealNetworks Public Source License
12477+# Version 1.0 (the "RPSL") available at
12478+# http://www.helixcommunity.org/content/rpsl unless you have licensed
12479+# the file under the RealNetworks Community Source License Version 1.0
12480+# (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
12481+# in which case the RCSL will apply. You may also obtain the license terms
12482+# directly from RealNetworks. You may not use this file except in
12483+# compliance with the RPSL or, if you have a valid RCSL with RealNetworks
12484+# applicable to this file, the RCSL. Please see the applicable RPSL or
12485+# RCSL for the rights, obligations and limitations governing use of the
12486+# contents of the file.
12487+#
12488+# This file is part of the Helix DNA Technology. RealNetworks is the
12489+# developer of the Original Code and owns the copyrights in the portions
12490+# it created.
12491+#
12492+# This file, and the files included with this file, is distributed and made
12493+# available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
12494+# EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
12495+# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
12496+# FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
12497+#
12498+# Technology Compatibility Kit Test Suite(s) Location:
12499+# http://www.helixcommunity.org/content/tck
12500+#
12501+# Contributor(s):
12502+#
12503+# ***** END LICENSE BLOCK *****
12504+#
12505+
12506+
12507+if( ('HELIX_FEATURE_MINI_SITE' not in project.defines) and
12508+ (platform.name in ('linux2', 'linux-i386')) and
12509+ ('HELIX_FEATURE_VIDEO' in project.defines) and
12510+ (project.BuildOption("nodll"))
12511+ ):
12512+ project.sys_libraries.append('Xv', 'Xext')
12513+
12514+
12515+
12516+
12517+if project.BuildOption("nodll"):
12518+ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV20"):
12519+ if platform.name in ('linux2', 'linux-i386', 'win32') and sysinfo.arch == 'i386':
12520+ project.AddLibraries(GetSDKPath("rvg2dec_libs") + '[adecg2]')
12521+ else:
12522+ project.AddLibraries(GetSDKPath("rvg2dec_libs") + '[cdecg2]')
12523+
12524+ if project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV30") or \
12525+ project.IsDefined("HELIX_FEATURE_VIDEO_CODEC_RV40"):
12526+ if project.IsDefined("HELIX_FEATURE_ANSIC_RV89COMBO"):
12527+ project.AddLibraries(GetSDKPath("rv89combo_c_libs")+"[cdec]")
12528+ else:
12529+ if platform.name in ('linux2', 'linux-i386') and sysinfo.arch == 'i386':
12530+ project.AddLibraries(GetSDKPath("rv89combo_libs")+"[adec40]")
12531+ else:
12532+ project.AddLibraries(GetSDKPath("rv89combo_libs")+"[cdec40]")
12533+
12534Index: helix-libs/clientapps/clutter/unixcmap.h
12535===================================================================
12536--- /dev/null 1970-01-01 00:00:00.000000000 +0000
12537+++ helix-libs/clientapps/clutter/unixcmap.h 2008-10-13 06:05:49.000000000 -0700
12538@@ -0,0 +1,51 @@
12539+/* ***** BEGIN LICENSE BLOCK *****
12540+ * Source last modified: $Id: unixcmap.h,v 1.3 2007/07/06 20:54:01 jfinnecy Exp $
12541+ *
12542+ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
12543+ *
12544+ * The contents of this file, and the files included with this file,
12545+ * are subject to the current version of the RealNetworks Public
12546+ * Source License (the "RPSL") available at
12547+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
12548+ * the file under the current version of the RealNetworks Community
12549+ * Source License (the "RCSL") available at
12550+ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
12551+ * will apply. You may also obtain the license terms directly from
12552+ * RealNetworks. You may not use this file except in compliance with
12553+ * the RPSL or, if you have a valid RCSL with RealNetworks applicable
12554+ * to this file, the RCSL. Please see the applicable RPSL or RCSL for
12555+ * the rights, obligations and limitations governing use of the
12556+ * contents of the file.
12557+ *
12558+ * Alternatively, the contents of this file may be used under the
12559+ * terms of the GNU General Public License Version 2 (the
12560+ * "GPL") in which case the provisions of the GPL are applicable
12561+ * instead of those above. If you wish to allow use of your version of
12562+ * this file only under the terms of the GPL, and not to allow others
12563+ * to use your version of this file under the terms of either the RPSL
12564+ * or RCSL, indicate your decision by deleting the provisions above
12565+ * and replace them with the notice and other provisions required by
12566+ * the GPL. If you do not delete the provisions above, a recipient may
12567+ * use your version of this file under the terms of any one of the
12568+ * RPSL, the RCSL or the GPL.
12569+ *
12570+ * This file is part of the Helix DNA Technology. RealNetworks is the
12571+ * developer of the Original Code and owns the copyrights in the
12572+ * portions it created.
12573+ *
12574+ * This file, and the files included with this file, is distributed
12575+ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
12576+ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
12577+ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
12578+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
12579+ * ENJOYMENT OR NON-INFRINGEMENT.
12580+ *
12581+ * Technology Compatibility Kit Test Suite(s) Location:
12582+ * http://www.helixcommunity.org/content/tck
12583+ *
12584+ * Contributor(s):
12585+ *
12586+ * ***** END LICENSE BLOCK ***** */
12587+
12588+EXTERN_C Colormap HXGetXColormap(Display* pDisplay, Window window);
12589+EXTERN_C void HXFindBestXColor(Display* pDisplay, Colormap cmap, XColor* desired);
12590Index: helix-libs/clientapps/clutter/visuals.h
12591===================================================================
12592--- /dev/null 1970-01-01 00:00:00.000000000 +0000
12593+++ helix-libs/clientapps/clutter/visuals.h 2008-10-13 06:05:49.000000000 -0700
12594@@ -0,0 +1,74 @@
12595+/* ***** BEGIN LICENSE BLOCK *****
12596+ * Source last modified: $Id: visuals.h,v 1.4 2007/07/06 20:54:01 jfinnecy Exp $
12597+ *
12598+ * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
12599+ *
12600+ * The contents of this file, and the files included with this file,
12601+ * are subject to the current version of the RealNetworks Public
12602+ * Source License (the "RPSL") available at
12603+ * http://www.helixcommunity.org/content/rpsl unless you have licensed
12604+ * the file under the current version of the RealNetworks Community
12605+ * Source License (the "RCSL") available at
12606+ * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
12607+ * will apply. You may also obtain the license terms directly from
12608+ * RealNetworks. You may not use this file except in compliance with
12609+ * the RPSL or, if you have a valid RCSL with RealNetworks applicable
12610+ * to this file, the RCSL. Please see the applicable RPSL or RCSL for
12611+ * the rights, obligations and limitations governing use of the
12612+ * contents of the file.
12613+ *
12614+ * Alternatively, the contents of this file may be used under the
12615+ * terms of the GNU General Public License Version 2 (the
12616+ * "GPL") in which case the provisions of the GPL are applicable
12617+ * instead of those above. If you wish to allow use of your version of
12618+ * this file only under the terms of the GPL, and not to allow others
12619+ * to use your version of this file under the terms of either the RPSL
12620+ * or RCSL, indicate your decision by deleting the provisions above
12621+ * and replace them with the notice and other provisions required by
12622+ * the GPL. If you do not delete the provisions above, a recipient may
12623+ * use your version of this file under the terms of any one of the
12624+ * RPSL, the RCSL or the GPL.
12625+ *
12626+ * This file is part of the Helix DNA Technology. RealNetworks is the
12627+ * developer of the Original Code and owns the copyrights in the
12628+ * portions it created.
12629+ *
12630+ * This file, and the files included with this file, is distributed
12631+ * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
12632+ * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
12633+ * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
12634+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
12635+ * ENJOYMENT OR NON-INFRINGEMENT.
12636+ *
12637+ * Technology Compatibility Kit Test Suite(s) Location:
12638+ * http://www.helixcommunity.org/content/tck
12639+ *
12640+ * Contributor(s):
12641+ *
12642+ * ***** END LICENSE BLOCK ***** */
12643+
12644+#ifndef _UNIX
12645+#error This is the UNIX platform specific implementation.
12646+#endif
12647+
12648+#ifndef _VISUALS_H_
12649+#define _VISUALS_H_
12650+
12651+#if defined(USE_XWINDOWS)
12652+#include <X11/Xlib.h>
12653+#include <X11/Xutil.h>
12654+#include <X11/Xos.h>
12655+#endif
12656+
12657+//
12658+// These functions are loaded with dlsym() so turn off name mangling
12659+// with extern "C".
12660+//
12661+extern "C" {
12662+
12663+Visual* GetBestVisual(Display* display);
12664+Visual* GetVisual(Display* display, long mask, XVisualInfo* templ);
12665+
12666+}
12667+
12668+#endif // _VISUALS_H_