aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/util
Commit message (Collapse)AuthorAgeFilesLines
* Properly protect access to pixmap reader thread with mutexChris Adams2011-11-291-12/+41
| | | | | | | | | | | | | | | | | | Previously, access to the reader thread wasn't guarded properly, causing a crash when the reader thread was deleted prior to QDeclarativePixmapData (which then attempted to dereference the thread pointer to cancel the request). This commit adds locking to ensure that access to the reader is protected properly. This commit also fixes an issue where if a QDeclarativePixmapData was deleted after its QDeclarativePixmapReply was removed from the jobs queue but prior to processing, a pointer to the data could be dereferenced as part of processing, but caching the required information in the reply. Task-number: QTBUG-22125 Change-Id: I32aa2ca41a297b48e68cb358f4aa4fafd999f215 Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Rewrite Connections signal handlers at compile time.Michael Brasser2011-11-281-5/+13
| | | | | | Task-number: QTBUG-22726 Change-Id: I039d54661bbf7d44912c894bf0cc1d70023a9187 Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
* Fix searchs for insert positions in QDeclarativeListCompositor.Andrew den Exter2011-11-251-3/+3
| | | | | | | | | | | | When scanning for a start range don't stop on ranges that don't have an group flags unless that range is the terminal range. This fixes a couple of issues where moving an item to the end of the list would position it after a prepend only range instead of before it, or would miscalculate the iterator offset resulting in invalid indexes in the insert range. Change-Id: Ic4aa001edf43ec86a65d432cd8f80abf0b44d276 Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Fix style issuesKent Hansen2011-11-241-1/+1
| | | | | | | Make the Sanity Bot happy. Change-Id: Idb6d7f8c758de991c60e100b76d54ad49e16212b Reviewed-by: Aurindam Jana <aurindam.jana@nokia.com>
* Move QDeclarativeListModel and friends from util/ to qml/Kent Hansen2011-11-2414-3659/+2
| | | | | | | | | | | QDeclarativeWorkerScript depends on QDeclarativeListModel et al, so the latter should also reside under qml/. Note that QDeclarativeOpenMetaObject also had to be moved, since QDeclarativeListModel depends on it. Change-Id: I164cba0e530d22b5771056a2acde12a18d5e83e1 Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
* Move QDeclarativeApplication from util/ to qml/Kent Hansen2011-11-244-210/+0
| | | | | | | | QDeclarativeEngine/QV8Engine depend on QDeclarativeApplication, so this class should reside under qml/, not util/. Change-Id: I2cd49ba1170bfb610a7607525891cb80c8828f27 Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
* Use the AST for binding rewriting when possible.Michael Brasser2011-11-231-2/+1
| | | | | Change-Id: I1ac8bd39ea7e02f7c236c030ca233e1060746431 Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
* Increase the limit of the QDeclarativePixmapCache to something sensibleGunnar Sletta2011-11-231-6/+1
| | | | | | | | The limit used to be much higher, but was changed due to an accidental tag-along in a commit in April. Change-Id: Ie9f868b3059758aef87c2e1979ef22d840631930 Reviewed-by: Bjørn Erik Nilsen <bjorn.nilsen@nokia.com>
* Silence compiler warnings about unused variables (MSVC)Kai Koehne2011-11-211-0/+2
| | | | | | | Fixes most 'C4189: local variable is initialized but not referenced' warnings Change-Id: I8c5a1ba0a50dd3fcb22294e564425846362ee911 Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Fix Qt Declarative namespace compilation.Toby Tomkins2011-11-212-2/+6
| | | | | Change-Id: Ib3294278985cd43e40610dacd7b69bf98ff4d788 Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
* Add optional count parameter to ListModel.removeGlenn Watson2011-11-165-17/+27
| | | | | | | | | | | When calling remove on ListModel, it's now possible to supply a second parameter giving the number of items to remove. If the count parameter is omitted, it defaults to one, which maintains the previous behaviour. Task-number: QTBUG-22601 Change-Id: I0fb5c394a2b312095ce6e99e379d0f789d3ab4e6 Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Remove events from the revert list.Michael Brasser2011-11-162-3/+19
| | | | | | | | | State change "events" should be removed from the revert list the same way property changes are. Task-number: QTBUG-22583 Change-Id: Ia3f4d16ee8855d163a7f6118a0bc1f8492727940 Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>
* Support JS objects in ListModel via QVariantMapGlenn Watson2011-11-112-27/+132
| | | | | | | | | | | | Added support for the new listmodel implementation to store and retrieve JS objects via QVariantMap. Storing JS objects in a listmodel is significantly slower than storing native datatypes at the moment (this may be improved in the future). Also note that it's not currently possible to bind to fields within the JS object. Change-Id: I3b1a11ace7cdec754c1a2bb2b2d1b7edf561864d Reviewed-by: Martin Jones <martin.jones@nokia.com>
* QStringLiteral does not build on arm gcc 4.5.2 in this conditionJohannes Zellner2011-11-101-1/+1
| | | | | | | | Replace QStringLiteral with QLatin1String Change-Id: I205bcd4f446e225c3f4054798e74dd0cb356e126 Reviewed-by: Robert Griebl <robert.griebl@nokia.com> Reviewed-by: Kalle Lehtonen <kalle.ju.lehtonen@nokia.com>
* Improvements to listmodel implementation and tests.Glenn Watson2011-11-094-71/+80
| | | | | | | | | | | - Fixed edge case crash bug with QObjects being set on existing listmodel element. - Improved warning messages when assigning wrong type to role. - Removed a few code paths that can never be hit. - Added several tests to cover functionality not hit by coverage. Change-Id: I3d237c0555afbba6377b4d898bec911515b1b4ea Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Behavior on a value type should not cancel previous assignment.Michael Brasser2011-11-091-4/+2
| | | | | | | | | | | The call to read the value type value causes the previously assigned value to be overridden. This commit fixes the issue, but doesn't solve the root cause, which would require changes at the compiler/vme level. Task-number: QTBUG-20827 Change-Id: I1a53ee7b777bea81c5929ab7e47e2932e6901967 Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Fix crash on exit when overriding signal handlers in states.Michael Brasser2011-11-091-2/+3
| | | | | | | | Cherry-picked from 93c64e1be3a2d68eb504d7c4f7c60f66ce1ff650 in 4.7. Task-number: QTBUG-21617 Change-Id: I99ce8292d53954f5229867a384f47bedf7fad315 Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Documentation fixesDamian Jansen2011-11-072-3/+3
| | | | | | Change-Id: If30f98aafcedc5119e305dcb48b610a459780344 Reviewed-by: Thorbjørn Lund Martsum Reviewed-by: Glenn Watson <glenn.watson@nokia.com>
* Fix invalid remove cache indexes caused by consecutive ranges.Andrew den Exter2011-11-041-8/+36
| | | | | | | | | | | | listItemsRemoved attempts to merge and consecutive cache only ranges it produces, this same logic would also merge other consecutive ranges incorrectly incrementing the cacheIndex in the process. Since listItemsRemoved won't produce these consecutive ranges itself handle only the cache only ranges there and compress the other consecutive ranges where they originate. Change-Id: If4d95fb741c8e7003ed48bfb2559c30c948c255b Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Fix incorrect cache indexes when consecutive list items are removed.Andrew den Exter2011-11-022-39/+6
| | | | | | | | | | | | | | | When cached model items are removed listItemsRemoved will try and append a new cache only range onto a preceding one where possible. Previously it would then re-run that range so the current indexes in the list were incremented before moving onto the next range, which meant that the current indexes were incremented by size of the previous range twice. Instead of processing the range a second time increment the cache indexes directly when inserting a cache only range and move directly onto the next range in the list. Change-Id: I63418c4397f911cefb521c5a5b0dd25faf66e08b Reviewed-by: Martin Jones <martin.jones@nokia.com>
* QDeclarativeStyledText::parse on empty tag causes assert in QStringYann Bodson2011-11-011-0/+4
| | | | | | Task-number: QTBUG-22058 Change-Id: I7141002b751722ab34b378215251562153c4ff46 Reviewed-by: Yann Bodson <yann.bodson@nokia.com>
* Pass the right line information to signal handlers in Connection elementKai Koehne2011-10-311-1/+6
| | | | | | | | Make sure that the right line information is passed to v8 when executing signal handlers in the Connection element. Change-Id: I384caa40217e9c148fdb4943cf471d1aafcea735 Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Optimize listmodel and allow nested elements from worker script.Glenn Watson2011-10-265-1274/+1485
| | | | | | | | | | | | Added support for nested listmodels when used from a worker script thread. Optimized the implementation of ListModel, especially the performance of appending a large number of items. Added a batch append mode (with an array of JS objects) to reduce the overhead of calling from JS into native code for each append operation. Task-number:QTBUG-21508 Change-Id: I07b381dc3e8200d92d6e0af458df8850d78b510f Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Rename Qt Quick-specific classes to QQuick*Kent Hansen2011-10-211-1/+1
| | | | | | | | | | | | | | | | | | | | | | The QSG (SceneGraph) prefix is too generic for Qt Quick(2)-specific classes. All the classes and files in the declarative/items directory have been renamed. In particular, for classes that are currently public, the renaming is as follows: QSGView --> QQuickView QSGCanvas --> QQuickCanvas QSGItem --> QQuickItem QSGPaintedItem --> QQuickPaintedItem The header files have been renamed accordingly (e.g. qsgview.h --> qquickview.h). Change-Id: Iac937fff81db20bb639486a793c3aeb5230b038c Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
* Tidy up some more declarative includesKent Hansen2011-10-1714-19/+7
| | | | | | | Remove file dependencies that aren't needed. Change-Id: I0496ef9435141528f680bbd326da55c3a31e5978 Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
* Clean up declarative includesKent Hansen2011-10-1746-169/+167
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (This commit is in preparation of moving several files to a separate library (QtQuick2).) Don't add all subfolders to the includepath (from the .pri files). There's no good reason to do that. For headers (both public and private) that are in the same folder as the file that includes them, prefer to use #include "foo.h" #include "bar_p.h" For public headers that are outside the current folder but have "unambiguous" names (e.g. qdeclarative prefix), use #include <foo.h> For private headers that are outside the current folder, use #include <private/baz_p.h> Also change #include <QtDeclarative/private/foo_p.h> to #include <private/foo_p.h> The header filenames already have a qdeclarative or qsg prefix; there's no need to prefix by module name to disambiguate. Finally, #include "private/foo_p.h" should be avoided. private/ is used for auto-generated (forwarding) headers, which never reside in the current (source) directory. Use angle brackets instead. Change-Id: I04f8477fdba043546064ee276475c09dc373f8f2 Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
* Remove QMetaObjectBuilder from declarative.Friedemann Kleint2011-10-141-1/+1
| | | | | | | | Link on Windows. Change-Id: Idca11c1a21ad5aebf79d6487692d912b4dea249f Reviewed-on: http://codereview.qt-project.org/6553 Reviewed-by: Lorn Potter <lorn.potter@nokia.com>
* Allow view items to be preserved.Andrew den Exter2011-10-122-5/+9
| | | | | | | | | | | | | | | | | | | | Do not destroy items that are members of the VisualDataModel persistedItems group when they are released by the view. The create function on VisualDataGroup will return a reference to an instantiated item within that group, any item returned by this function is automatically added to the persistedItems group and can be released by removing it from the group. Uninstantiated items added to the persistedItems group by any other means are not instantiated until requested by a view or create. Task-number: QTBUG-21518 Task-number: QTBUG-20854 Change-Id: I59554711208504c8f20a3ebe783bddab9b21a558 Reviewed-on: http://codereview.qt-project.org/5831 Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Martin Jones <martin.jones@nokia.com>
* QInputPanel exposed as a property from QDeclarativeApplicationSami Kananoja2011-10-113-1/+10
| | | | | | | | | Task-number: QTBUG-21449 Change-Id: I437f80f4d1f0dbb3cb410940213eae50a4cef2cd Reviewed-on: http://codereview.qt-project.org/5852 Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
* Fix layout issues with recently removed items.Andrew den Exter2011-10-111-12/+15
| | | | | | | | | | | | Items removed from the source model aren't removed from the cache group until they've also been released by the view. Skip over these removed items when translating future changes to the source model so no invalid translated changes are created. Change-Id: I9bf3801135e78b5a6493b4ef50ce44ee5c912bfc Reviewed-on: http://codereview.qt-project.org/6298 Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Use QBasicAtomicInt load() and store() instead of implicit castingBradley T. Hughes2011-10-101-3/+3
| | | | | | | | | | | | | The implicit casts will be unavailable in the near future. This is a follow up to commit 7f8472af8c03296be9e9ce50d8e9b3089eedf2f1, which didn't catch all usages of the implicit cast and assignment operator. Change-Id: If05c343e2851b41e4a351c56328c4406c688fa0d Reviewed-on: http://codereview.qt-project.org/6351 Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
* Remove redundant checks in qdeclarativestategroupKent Hansen2011-10-071-1/+1
| | | | | | | | | | Checking once should be enough for everyone. Task-number: QTBUG-20482 Change-Id: I6cc1c608d9c1da0f4f745e436b9611937a8db160 Reviewed-on: http://codereview.qt-project.org/6054 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
* Add support for filtering VisualDataModels.Andrew den Exter2011-10-065-4/+1581
| | | | | | | | | | | | | | | | | Add a VisualDataGroup element which items within a VisualDataModel can be assigned to. Setting the group property of a VisualDataModel or one of its parts models will filter the items visible within a view to just items belonging to that group. By default all items belong to an 'items' group. The VisualDataModel attached object includes properties indicating whether a item is a member of a group and its index in the group. Task-number: QTBUG-21513 QTBUG-21515 Change-Id: If3df6a359a888a6f79923775d2f78076d5e7d2cf Reviewed-on: http://codereview.qt-project.org/4115 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Fix incorrect index when accumulating multiple removes.Andrew den Exter2011-10-041-5/+3
| | | | | | | | | | Don't remove the intersecting count from the current remove twice, and accumulate consecutive not just overlapping removes. Change-Id: I426d764d980ee17ad114aa03ca4089da89c6aed2 Reviewed-on: http://codereview.qt-project.org/5902 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
* Remove a few unneeded includesKent Hansen2011-09-301-7/+1
| | | | | | | Change-Id: I63a9cda5000cc872ad5a5d3c4b55243b8afb0527 Reviewed-on: http://codereview.qt-project.org/5782 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
* Fix issue with interpolating more than one path segment backwards.Michael Brasser2011-09-301-1/+2
| | | | | | | Change-Id: I463010ed63d41be80db96e8306aef8caa3863ccf Reviewed-on: http://codereview.qt-project.org/5821 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Remove more QByteArray<->QString conversionsKent Hansen2011-09-295-14/+14
| | | | | | | | | | Prefer to store types as QStrings. It's only when we manipulate raw (compiled, meta-)data that utf conversion is needed. Change-Id: Ie138a69c9a409804e1b90b21c1d60dedea35bddb Reviewed-on: http://codereview.qt-project.org/5781 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
* Fix warning: QString(const char*) is deprecatedKent Hansen2011-09-291-1/+1
| | | | | | | | | | Use fromUtf8() like the other functions in this class do. Change-Id: If25c8e8dc2562f68774002bfd11719227cbb4713 Reviewed-on: http://codereview.qt-project.org/5715 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com> Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
* Remove dead code in QDeclarativeSvgParserKent Hansen2011-09-291-19/+0
| | | | | | | | | 'toDouble(const QChar *&str)' is the only one still in use. Change-Id: I3e5af822a4772f1f11c8ee7011e847963077587d Reviewed-on: http://codereview.qt-project.org/5717 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
* Asynchronous component instantiationAaron Kennedy2011-09-292-2/+2
| | | | | | | | | | | | | This introduces two main: * the QML compiler executes in a separate thread * item instantiation can be interrupted and resumed to allow it to be split across multiple frames. Task-number: QTBUG-21151 Change-Id: I9631c62bb77da3a2e0c37f0da3719533fdce4fef Reviewed-on: http://codereview.qt-project.org/5676 Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Build with qt-in-namespaceKent Hansen2011-09-281-0/+4
| | | | | | | | Change-Id: Ia57e4f14d94ad63194dad52892bedf316a58a79a Reviewed-on: http://codereview.qt-project.org/5693 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com> Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
* Use QBasicTimer rather than QTimer in SmoothedAnimationMartin Jones2011-09-282-6/+14
| | | | | | | | | QBasicTimer does the same job for lower cost. Change-Id: I11d7033b9c456129f3f984c8baafa717f5b25d99 Reviewed-on: http://codereview.qt-project.org/5649 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
* Add convenience macro for fast connects in declarative.Michael Brasser2011-09-272-6/+5
| | | | | | | | | | | | We already follow this pattern several places, so this commit creates a convenience macro for it, and replaces previous usage where appropriate. Also adds the macro several places as further optimization. Change-Id: Ieff5ed6cc51c34d0a1c8aa42ac40314ea243477a Reviewed-on: http://codereview.qt-project.org/5342 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
* Don't give move ids to moved inserts.Andrew den Exter2011-09-261-1/+2
| | | | | | | | | | | Move ids identify a paired remove and insert, an insert that has a move id but no corresponding remove breaks anything relying on that identity. Change-Id: I9512e298bc518c5abf5bca7523a375baf8a39407 Reviewed-on: http://codereview.qt-project.org/5512 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
* Further delay animation creation in Behavior.Michael Brasser2011-09-231-2/+4
| | | | | | | | | | | Previously we always created the animation on the first call to write, regardless of whether the Behavior was enabled. Now we delay until the animation is needed. Change-Id: I14a319a4f045050fe6a99427b7c3804ef078d48d Reviewed-on: http://codereview.qt-project.org/5414 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Charles Yin <charles.yin@nokia.com>
* Compress consecutive removals.Andrew den Exter2011-09-211-0/+16
| | | | | | | | | | If an applied list of changes has consecutive removals compress them together before applying them to the change set. Change-Id: I75f178a31bbc8480d76be745c62e824125dbd8ba Reviewed-on: http://codereview.qt-project.org/4032 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
* PathAnimation updates.Michael Brasser2011-09-193-22/+30
| | | | | | | | | | Allow smooth orientation changes, smooth interruptions, and implicit "from" in PathAnimation. Change-Id: I2191f6df89ec25d78b1d498827281803a07129c9 Reviewed-on: http://codereview.qt-project.org/4378 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Martin Jones <martin.jones@nokia.com>
* Remove some unused includes.Jędrzej Nowacki2011-09-151-1/+0
| | | | | | | Change-Id: I5090b0d3c88f3c972b1f1d2a56a954138f8d02ca Reviewed-on: http://codereview.qt-project.org/4283 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
* Merge branch 'master' into refactorGunnar Sletta2011-09-1211-87/+2015
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: examples/declarative/cppextensions/qwidgets/qwidgets.pro examples/declarative/minehunt/main.cpp examples/declarative/minehunt/minehunt.pro src/declarative/items/context2d/qsgcontext2d.cpp src/declarative/items/qsgflickable.cpp src/declarative/items/qsgtextedit.cpp src/declarative/items/qsgtextinput.cpp src/declarative/particles/qsgangleddirection.cpp src/declarative/particles/qsgcumulativedirection.cpp src/declarative/particles/qsgcumulativedirection_p.h src/declarative/particles/qsgfollowemitter.cpp src/declarative/particles/qsgmodelparticle.cpp src/declarative/particles/qsgparticlesystem.cpp src/qtquick1/util/qdeclarativeview.h tests/auto/declarative/examples/examples.pro tests/auto/declarative/qsgfocusscope/tst_qsgfocusscope.cpp Change-Id: Ib4be2a5e742dee1a399d73da97161736f77448e5
| * Only fast-foward states when there is a transition.Michael Brasser2011-09-091-2/+5
| | | | | | | | | | | | | | | | | | | | Fast-forwarding is only required when we are animating a state change. Task-number: QTBUG-16662 Change-Id: I20e1a056cb3268b92b606be34809bcd0e2bfb898 Reviewed-on: http://codereview.qt-project.org/4390 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Charles Yin <charles.yin@nokia.com>