summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/src/images/symbian-draw-pixmap-sequence.pngbin0 -> 5724 bytes
-rw-r--r--doc/src/images/symbian-qt-draw-pixmap-sequence.pngbin0 -> 9141 bytes
-rw-r--r--doc/src/images/symbian-qt-rendering-stack-non-screenplay.pngbin0 -> 52802 bytes
-rw-r--r--doc/src/images/symbian-rendering-stack-non-screenplay.pngbin0 -> 44655 bytes
-rw-r--r--doc/src/index.qdoc2
-rw-r--r--doc/src/legal/3rdparty.qdoc32
-rw-r--r--doc/src/platforms/compiler-notes.qdoc3
-rw-r--r--doc/src/platforms/platform-notes.qdoc50
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog36
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri1
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/interpreter/RegisterFile.cpp2
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/interpreter/RegisterFile.h33
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp111
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.h69
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/SymbianDefines.h42
-rw-r--r--src/corelib/io/qurl.cpp2
-rw-r--r--src/dbus/qdbusintegrator.cpp3
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp3
-rw-r--r--src/gui/inputmethod/qcoefepinputcontext_p.h1
-rw-r--r--src/gui/inputmethod/qcoefepinputcontext_s60.cpp17
-rw-r--r--src/gui/kernel/qapplication_mac.mm3
-rw-r--r--src/gui/kernel/qapplication_s60.cpp8
-rw-r--r--src/gui/kernel/qcocoasharedwindowmethods_mac_p.h13
-rw-r--r--src/gui/kernel/qwidget_s60.cpp6
-rw-r--r--src/gui/text/qfont_s60.cpp36
-rw-r--r--src/gui/text/qfontengine.cpp4
-rw-r--r--src/gui/text/qfontengine_ft.cpp2
-rw-r--r--src/gui/text/qfontengine_qpf.cpp2
-rw-r--r--src/gui/text/qfontengine_s60.cpp7
-rw-r--r--src/gui/text/qfontengine_s60_p.h1
-rw-r--r--src/opengl/qgl_mac.mm14
-rw-r--r--src/plugins/bearer/connman/connman.pro2
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.cpp162
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.h3
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux.cpp9
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux_p.h1
-rw-r--r--src/plugins/bearer/connman/qofonoservice_linux.cpp940
-rw-r--r--src/plugins/bearer/connman/qofonoservice_linux_p.h332
-rw-r--r--src/plugins/bearer/corewlan/qcorewlanengine.mm85
-rw-r--r--src/plugins/bearer/symbian/qnetworksession_impl.cpp21
-rw-r--r--src/script/script.pro5
-rw-r--r--tests/auto/qinputcontext/tst_qinputcontext.cpp124
-rw-r--r--tests/auto/qurl/tst_qurl.cpp13
-rw-r--r--tools/qdoc3/test/qt-html-templates.qdocconf2
-rw-r--r--translations/assistant_uk.ts461
-rw-r--r--translations/designer_uk.ts131
-rw-r--r--translations/linguist_uk.ts1081
-rw-r--r--translations/qt_help_uk.ts4
-rw-r--r--translations/qt_uk.ts124
-rw-r--r--translations/qvfb_uk.ts145
50 files changed, 3321 insertions, 827 deletions
diff --git a/doc/src/images/symbian-draw-pixmap-sequence.png b/doc/src/images/symbian-draw-pixmap-sequence.png
new file mode 100644
index 0000000..05e3739
--- /dev/null
+++ b/doc/src/images/symbian-draw-pixmap-sequence.png
Binary files differ
diff --git a/doc/src/images/symbian-qt-draw-pixmap-sequence.png b/doc/src/images/symbian-qt-draw-pixmap-sequence.png
new file mode 100644
index 0000000..f7546f4
--- /dev/null
+++ b/doc/src/images/symbian-qt-draw-pixmap-sequence.png
Binary files differ
diff --git a/doc/src/images/symbian-qt-rendering-stack-non-screenplay.png b/doc/src/images/symbian-qt-rendering-stack-non-screenplay.png
new file mode 100644
index 0000000..9e1997d
--- /dev/null
+++ b/doc/src/images/symbian-qt-rendering-stack-non-screenplay.png
Binary files differ
diff --git a/doc/src/images/symbian-rendering-stack-non-screenplay.png b/doc/src/images/symbian-rendering-stack-non-screenplay.png
new file mode 100644
index 0000000..80cb078
--- /dev/null
+++ b/doc/src/images/symbian-rendering-stack-non-screenplay.png
Binary files differ
diff --git a/doc/src/index.qdoc b/doc/src/index.qdoc
index e45892f..77856ec 100644
--- a/doc/src/index.qdoc
+++ b/doc/src/index.qdoc
@@ -99,7 +99,7 @@
<li><a href="linguist-manual.html">Qt Linguist</a></li>
<li><a href="assistant-manual.html">Qt Assistant</a></li>
<li><a href="qmake-manual.html">Qt qmake</a></li>
- <li><a href="http://doc.qt.nokia.com/qtsimulator-1.0/simulator-description.html">Qt Simulator</a></li>
+ <li><a href="http://doc.qt.nokia.com/qtsimulator-1.0/index.html">Qt Simulator</a></li>
<li><a href="http://qt.nokia.com/developer/eclipse-integration">Eclipse Integration</a></li>
<li><a href="http://qt.nokia.com/products/appdev">Add-On Products and Services</a></li>
<li><a href="qvfb.html">Virtual Framebuffer</a></li>
diff --git a/doc/src/legal/3rdparty.qdoc b/doc/src/legal/3rdparty.qdoc
index e7133e3..db6ff7c 100644
--- a/doc/src/legal/3rdparty.qdoc
+++ b/doc/src/legal/3rdparty.qdoc
@@ -683,4 +683,36 @@
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ \hr
+
+ jquery 1.4.2.js Copyright 2010 John Resig
+ This software is dual licensed under the MIT or GPL version 2 licenses.
+ Nokia has used the software herein under the MIT license.
+
+ jquery includes Sizzle.js Copyright 2010 The Dojo Foundaton and is
+ licensed under the MIT, BSD and GPL licenses. Nokia has used this
+ software herein under the MIT license.
+
+ The MIT License
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
+
*/
diff --git a/doc/src/platforms/compiler-notes.qdoc b/doc/src/platforms/compiler-notes.qdoc
index c6ecd68..3870e8f 100644
--- a/doc/src/platforms/compiler-notes.qdoc
+++ b/doc/src/platforms/compiler-notes.qdoc
@@ -68,7 +68,7 @@
\endtable
* WebKit is only supported as a dynamically built library. Static linkage is not supported.
-
+
\target GCC
\section1 GCC
@@ -115,6 +115,7 @@
\section2 Solaris
Please use GCC 3.4.2 or later.
+ Please not that WebKit is not supported for Solaris, regardless of which compiler is used.
\section2 Mac OS X
diff --git a/doc/src/platforms/platform-notes.qdoc b/doc/src/platforms/platform-notes.qdoc
index 94b9856..6f533ae 100644
--- a/doc/src/platforms/platform-notes.qdoc
+++ b/doc/src/platforms/platform-notes.qdoc
@@ -526,6 +526,56 @@
platform in use. If available, it is loaded in preference over the MMF
plugin. If the Helix plugin fails to load, the MMF plugin, if present on
the device, will be loaded instead.
+
+ \section1 UI Performance in devices prior to Symbian^3
+
+ Qt uses the QPainter class to perform low-level painting on widgets and
+ other paint devices. QPainter provides functions to draw complex shapes,
+ aligned text and pixmaps. It can also do vector path clipping, coordinate
+ transformations and Porter-Duff composition. If the underlying graphics
+ architecture does not support all of these operations then Qt uses the
+ raster graphics system for rendering.
+
+ Most of the Symbian devices prior to Symbian^3 use a non-ScreenPlay
+ graphics architecture which does not have native support for all functions
+ provided by QPainter. In non-ScreenPlay devices Qt uses the raster
+ graphics system by default which has a performance penalty when compared
+ to native Symbian rendering.
+
+ In order to be able to perform all functions provided by QPainter, the
+ raster graphics system needs to have pixel level framebuffer access. To
+ make this possible in non-ScreenPlay devices Qt has to create an
+ additional offscreen buffer that is the target for all Qt rendering
+ operations. Qt renders the widget tree to the offscreen buffer and the
+ offscreen buffer is blitted to the framebuffer via Symbian Window Server.
+
+ The following table shows the rendering stacks of native Symbian and Qt in
+ non-ScreenPlay devices.
+
+ \table
+ \header \o Symbian
+ \o Qt
+ \row \o \image symbian-rendering-stack-non-screenplay.png
+ \o \image symbian-qt-rendering-stack-non-screenplay.png
+ \endtable
+
+ The following diagrams show a simplified sequence of drawing a pixmap in
+ a non-ScreenPlay device.
+
+ \table
+ \header \o Symbian
+ \row \o \image symbian-draw-pixmap-sequence.png
+ \endtable
+
+ \table
+ \header \o Qt
+ \row \o \image symbian-qt-draw-pixmap-sequence.png
+ \endtable
+
+ When compared to a native Symbian application, Qt does an additional blit
+ to the offscreen buffer before drawing to the framebuffer. That is the
+ performance penalty which needs to be paid to get all functionality
+ provided by QPainter in non-ScreenPlay architecture.
*/
/*!
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog
index 93431df..fbaf5d2 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog
@@ -1,3 +1,39 @@
+2010-06-18 Tucker Jay <jay.tucker@nokia.com>
+
+ Reviewed by NOBODY (OOPS!).
+
+ [Symbian] Lazy commit of memory required in JSC register file
+ https://bugs.webkit.org/show_bug.cgi?id=34349
+
+ * JavaScriptCore.pro: Added 1 new Symbian source file
+ * interpreter/RegisterFile.cpp:
+ (JSC::RegisterFile::~RegisterFile):
+ * interpreter/RegisterFile.h:
+ (JSC::RegisterFile::):
+ (JSC::RegisterFile::start):
+ (JSC::RegisterFile::end):
+ (JSC::RegisterFile::size):
+ (JSC::RegisterFile::setNumGlobals):
+ (JSC::RegisterFile::numGlobals):
+ (JSC::RegisterFile::maxGlobals):
+ (JSC::RegisterFile::lastGlobal):
+ (JSC::RegisterFile::markGlobals):
+ (JSC::RegisterFile::markCallFrames):
+ (JSC::isPageAligned):
+ (JSC::RegisterFile::RegisterFile):
+ (JSC::RegisterFile::shrink):
+ (JSC::RegisterFile::grow):
+ * wtf/symbian/RegisterFileAllocatorSymbian.cpp: Added.
+ (WTF::RegisterFileAllocator::RegisterFileAllocator):
+ Helper class to allocate memory required by RegisterFile
+ more efficiently.
+ (WTF::RegisterFileAllocator::~RegisterFileAllocator):
+ (WTF::RegisterFileAllocator::buffer):
+ (WTF::RegisterFileAllocator::grow):
+ (WTF::RegisterFileAllocator::shrink):
+ * wtf/symbian/RegisterFileAllocatorSymbian.h: Added.
+ * wtf/symbian/SymbianDefines.h: Added.
+
2010-06-19 Thiago Macieira <thiago.macieira@nokia.com>
Reviewed by Kenneth Rohde Christiansen.
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri
index 75737ae..d75bd31 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/JavaScriptCore.pri
@@ -211,6 +211,7 @@ SOURCES += \
wtf/qt/ThreadingQt.cpp \
wtf/RandomNumber.cpp \
wtf/RefCountedLeakCounter.cpp \
+ wtf/symbian/RegisterFileAllocatorSymbian.cpp \
wtf/ThreadingNone.cpp \
wtf/Threading.cpp \
wtf/TypeTraits.cpp \
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/interpreter/RegisterFile.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/interpreter/RegisterFile.cpp
index 939573b..293fc38 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/interpreter/RegisterFile.cpp
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/interpreter/RegisterFile.cpp
@@ -40,6 +40,8 @@ RegisterFile::~RegisterFile()
VirtualFree(m_buffer, DWORD(m_commitEnd) - DWORD(m_buffer), MEM_DECOMMIT);
#endif
VirtualFree(m_buffer, 0, MEM_RELEASE);
+#elif OS(SYMBIAN)
+ delete m_registerFileAllocator;
#else
fastFree(m_buffer);
#endif
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/interpreter/RegisterFile.h b/src/3rdparty/javascriptcore/JavaScriptCore/interpreter/RegisterFile.h
index 34e2504..49304d9 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/interpreter/RegisterFile.h
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/interpreter/RegisterFile.h
@@ -41,6 +41,10 @@
#include <sys/mman.h>
#endif
+#if OS(SYMBIAN)
+#include <wtf/symbian/RegisterFileAllocatorSymbian.h>
+#endif
+
namespace JSC {
/*
@@ -152,12 +156,21 @@ namespace JSC {
#if HAVE(VIRTUALALLOC)
Register* m_commitEnd;
#endif
+#if OS(SYMBIAN)
+ // Commits and frees a continguous chunk of memory as required
+ WTF::RegisterFileAllocator* m_registerFileAllocator;
+#endif
JSGlobalObject* m_globalObject; // The global object whose vars are currently stored in the register file.
};
// FIXME: Add a generic getpagesize() to WTF, then move this function to WTF as well.
- inline bool isPageAligned(size_t size) { return size != 0 && size % (8 * 1024) == 0; }
+ // This is still a hack that should be fixed later. We know that a Symbian page size is 4K.
+ #if OS(SYMBIAN)
+ inline bool isPageAligned(size_t size) { return size && !(size % (4 * 1024)); }
+ #else
+ inline bool isPageAligned(size_t size) { return size && !(size % (8 * 1024)); }
+ #endif
inline RegisterFile::RegisterFile(size_t capacity, size_t maxGlobals)
: m_numGlobals(0)
@@ -204,7 +217,13 @@ namespace JSC {
CRASH();
}
m_commitEnd = reinterpret_cast<Register*>(reinterpret_cast<char*>(m_buffer) + committedSize);
- #else
+ #elif OS(SYMBIAN)
+ m_registerFileAllocator = new WTF::RegisterFileAllocator(bufferLength);
+ m_buffer = (Register*)(m_registerFileAllocator->buffer());
+ // start by committing enough space to hold maxGlobals
+ void* newEnd = (void*)((int)m_buffer + (maxGlobals * sizeof(Register)));
+ m_registerFileAllocator->grow(newEnd);
+ #else
/*
* If neither MMAP nor VIRTUALALLOC are available - use fastMalloc instead.
*
@@ -226,8 +245,13 @@ namespace JSC {
if (newEnd >= m_end)
return;
m_end = newEnd;
- if (m_end == m_start && (m_maxUsed - m_start) > maxExcessCapacity)
+ if (m_end == m_start && (m_maxUsed - m_start) > maxExcessCapacity) {
+#if OS(SYMBIAN)
+ m_registerFileAllocator->shrink(newEnd);
+#endif
+
releaseExcessCapacity();
+ }
}
inline bool RegisterFile::grow(Register* newEnd)
@@ -252,6 +276,9 @@ namespace JSC {
m_commitEnd = reinterpret_cast<Register*>(reinterpret_cast<char*>(m_commitEnd) + size);
}
#endif
+#if OS(SYMBIAN)
+ m_registerFileAllocator->grow((void*)newEnd);
+#endif
if (newEnd > m_maxUsed)
m_maxUsed = newEnd;
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp
new file mode 100644
index 0000000..baa7841
--- /dev/null
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.cpp
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if OS(SYMBIAN)
+
+#include "RegisterFileAllocatorSymbian.h"
+
+namespace WTF {
+
+/** Efficiently allocates memory pools of size poolSize.
+ * Primarily designed for JSC RegisterFile's needs.
+ * Not thread-safe.
+ */
+RegisterFileAllocator::RegisterFileAllocator(TUint32 reservationSize, TUint32 poolSize) :
+ m_reserved(reservationSize), m_poolSize(poolSize)
+{
+ // Get system's page size value.
+ SYMBIAN_PAGESIZE(m_pageSize);
+
+ // We only accept multiples of system page size for both initial reservation
+ // and the alignment/pool size
+ m_reserved = SYMBIAN_ROUNDUPTOMULTIPLE(m_reserved, m_pageSize);
+ __ASSERT_ALWAYS(SYMBIAN_ROUNDUPTOMULTIPLE(m_poolSize, m_pageSize),
+ User::Panic(_L("RegisterFileAllocator1"), KErrArgument));
+
+ // Open a Symbian RChunk, and reserve requested virtual address range
+ // Any thread in this process can operate this RChunk due to EOwnerProcess access rights.
+ TInt ret = m_chunk.CreateDisconnectedLocal(0 , 0, (TInt)m_reserved , EOwnerProcess);
+ if (ret != KErrNone)
+ User::Panic(_L("RegisterFileAllocator2"), ret);
+
+ m_buffer = (void*)m_chunk.Base();
+ m_resEnd = (void*)(m_chunk.Base() + m_chunk.MaxSize());
+ m_comEnd = m_buffer;
+}
+
+RegisterFileAllocator::~RegisterFileAllocator()
+{
+ // release everything!
+ m_chunk.Decommit(0, m_chunk.MaxSize());
+ m_chunk.Close();
+}
+
+void* RegisterFileAllocator::buffer() const
+{
+ return m_buffer;
+}
+
+void RegisterFileAllocator::grow(void* newEnd)
+{
+ // trying to commit more memory than reserved!
+ if (newEnd > m_resEnd)
+ return;
+
+ if (newEnd > m_comEnd) {
+ TInt nBytes = (TInt)(newEnd) - (TInt)(m_comEnd);
+ nBytes = SYMBIAN_ROUNDUPTOMULTIPLE(nBytes, m_poolSize);
+ TInt offset = (TInt)m_comEnd - (TInt)m_buffer;
+
+ TInt ret = m_chunk.Commit(offset, nBytes);
+ if (ret == KErrNone)
+ m_comEnd = (void*)(m_chunk.Base() + m_chunk.Size());
+ }
+}
+
+void RegisterFileAllocator::shrink(void* newEnd)
+{
+ if (newEnd < m_comEnd) {
+ TInt nBytes = (TInt)newEnd - (TInt)m_comEnd;
+ if (nBytes >= m_poolSize) {
+ TInt offset = SYMBIAN_ROUNDUPTOMULTIPLE((TUint)newEnd, m_poolSize) - (TInt)m_buffer;
+ nBytes = (TInt)m_comEnd - offset - (TInt)m_buffer;
+ if (nBytes > 0) {
+ TInt ret = m_chunk.Decommit(offset, nBytes);
+ if (ret == KErrNone)
+ m_comEnd = (void*)(m_chunk.Base() + m_chunk.Size());
+ }
+ }
+ }
+}
+
+} // end of namespace
+
+#endif // SYMBIAN
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.h b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.h
new file mode 100644
index 0000000..4cfc8c5
--- /dev/null
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/RegisterFileAllocatorSymbian.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RegisterFileAllocatorSymbian_h
+#define RegisterFileAllocatorSymbian_h
+
+#include "SymbianDefines.h"
+
+namespace WTF {
+
+/**
+ * Allocates contiguous regions of size poolSize.
+ * poolSize must be a multiple of system page size (typically 4K on Symbian/ARM)
+ *
+ * @param reservationSize Virtual address range to be reserved upon creation of chunk (bytes).
+ * @param poolSize Size of a single allocation.
+ */
+class RegisterFileAllocator {
+
+public:
+ RegisterFileAllocator(
+ TUint32 reservationSize, TUint32 poolSize = SYMBIAN_REGFILEALLOC_DEFAULTPOOLSIZE);
+ ~RegisterFileAllocator();
+ void* buffer() const;
+ void grow(void* newEnd);
+ void shrink(void* newEnd);
+
+private:
+ RChunk m_chunk; // Symbian chunk that lets us reserve/commit/decommit
+
+ // all following values are in numbers of bytes
+ TInt m_pageSize; // cached value of system page size, typically 4K on Symbian
+ TUint32 m_reserved; // total number of reserved bytes in virtual memory
+ TUint32 m_poolSize; // size of one memory pool, set by default to 64K in wtf/symbian/SymbianDefines.h
+
+ void* m_buffer; // pointer to base of the chunk
+ void* m_comEnd; // pointer to end of currently committed memory
+ void* m_resEnd; // pointer to end of reserved memory
+
+};
+
+} // end of namespace
+
+#endif // RegisterFileAllocatorSymbian_h
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/SymbianDefines.h b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/SymbianDefines.h
new file mode 100644
index 0000000..43e22b3
--- /dev/null
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/symbian/SymbianDefines.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SymbianDefines_h
+#define SymbianDefines_h
+
+#include <e32cmn.h>
+#include <e32std.h>
+#include <hal.h>
+
+#define SYMBIAN_PAGESIZE(x) (HAL::Get(HALData::EMemoryPageSize, x));
+#define SYMBIAN_FREERAM(x) (HAL::Get(HALData::EMemoryRAMFree, x));
+#define SYMBIAN_ROUNDUPTOMULTIPLE(x, multipleof) ( (x + multipleof - 1) & ~(multipleof - 1) )
+
+#define SYMBIAN_REGFILEALLOC_DEFAULTPOOLSIZE 65536 // 64K
+
+#endif // SymbianDefines_h
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index 79a8ce4..f57a402 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -5610,7 +5610,7 @@ QString QUrl::toString(FormattingOptions options) const
if ((options & QUrl::RemoveAuthority) != QUrl::RemoveAuthority) {
bool doFileScheme = d->scheme == QLatin1String("file") && ourPath.startsWith(QLatin1Char('/'));
QString tmp = d->authority(options);
- if (!tmp.isEmpty() || doFileScheme) {
+ if (!tmp.isNull() || doFileScheme) {
if (doFileScheme && !ourPath.startsWith(QLatin1Char('/')))
url += QLatin1Char('/');
url += QLatin1String("//");
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index 7951177..3833874 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -714,6 +714,9 @@ QDBusCallDeliveryEvent* QDBusConnectionPrivate::prepareReply(QDBusConnectionPriv
if (metaTypes[n] == QDBusMetaTypeId::message)
--n;
+ if (msg.arguments().count() < n)
+ return 0; // too few arguments
+
// check that types match
for (int i = 0; i < n; ++i)
if (metaTypes.at(i + 1) != msg.arguments().at(i).userType() &&
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index 7a622f1..fc122d2 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -5666,9 +5666,6 @@ void QGraphicsItem::update(const QRectF &rect)
return;
}
- if (d_ptr->discardUpdateRequest())
- return;
-
if (d_ptr->scene)
d_ptr->scene->d_func()->markDirty(this, rect);
}
diff --git a/src/gui/inputmethod/qcoefepinputcontext_p.h b/src/gui/inputmethod/qcoefepinputcontext_p.h
index 2fd6d16..ac40bba 100644
--- a/src/gui/inputmethod/qcoefepinputcontext_p.h
+++ b/src/gui/inputmethod/qcoefepinputcontext_p.h
@@ -84,6 +84,7 @@ public:
void update();
bool filterEvent(const QEvent *event);
+ bool symbianFilterEvent(QWidget *keyWidget, const QSymbianEvent *event);
void mouseHandler( int x, QMouseEvent *event);
bool isComposing() const { return !m_preeditString.isEmpty(); }
diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
index add3d17..b08b9a9 100644
--- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
+++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
@@ -47,6 +47,7 @@
#include <qgraphicsview.h>
#include <qgraphicsscene.h>
#include <qgraphicswidget.h>
+#include <qsymbianevent.h>
#include <private/qcore_symbian_p.h>
#include <fepitfr.h>
@@ -287,6 +288,18 @@ bool QCoeFepInputContext::filterEvent(const QEvent *event)
return false;
}
+bool QCoeFepInputContext::symbianFilterEvent(QWidget *keyWidget, const QSymbianEvent *event)
+{
+ Q_UNUSED(keyWidget);
+ if (event->type() == QSymbianEvent::CommandEvent)
+ // A command basically means the same as a button being pushed. With Qt buttons
+ // that would normally result in a reset of the input method due to the focus change.
+ // This should also happen for commands.
+ reset();
+
+ return false;
+}
+
void QCoeFepInputContext::timerEvent(QTimerEvent *timerEvent)
{
if (timerEvent->timerId() == m_tempPreeditStringTimeout.timerId())
@@ -651,7 +664,7 @@ void QCoeFepInputContext::UpdateFepInlineTextL(const TDesC& aNewInlineText,
QInputMethodEvent event(newPreeditString, attributes);
if (newPreeditString.isEmpty() && m_preeditString.isEmpty()) {
// In Symbian world this means "erase last character".
- event.setCommitString("", -1, 1);
+ event.setCommitString(QLatin1String(""), -1, 1);
}
m_preeditString = newPreeditString;
sendEvent(event);
@@ -823,8 +836,6 @@ void QCoeFepInputContext::DoCommitFepInlineEditL()
void QCoeFepInputContext::commitCurrentString(bool cancelFepTransaction)
{
- int longPress = 0;
-
QList<QInputMethodEvent::Attribute> attributes;
QInputMethodEvent event(QLatin1String(""), attributes);
event.setCommitString(m_preeditString, 0, 0);
diff --git a/src/gui/kernel/qapplication_mac.mm b/src/gui/kernel/qapplication_mac.mm
index 321492d..dd819e5 100644
--- a/src/gui/kernel/qapplication_mac.mm
+++ b/src/gui/kernel/qapplication_mac.mm
@@ -737,9 +737,6 @@ static void qt_post_window_change_event(QWidget *widget)
*/
static void qt_mac_update_child_gl_widgets(QWidget *widget)
{
- if (widget->isWindow())
- return;
-
// Update all OpenGL child widgets for the given widget.
QList<QWidgetPrivate::GlWidgetInfo> &glWidgets = qt_widget_private(widget)->glWidgets;
QList<QWidgetPrivate::GlWidgetInfo>::iterator end = glWidgets.end();
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index 4ed4ba3..e937918 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -129,7 +129,13 @@ void QS60Data::setStatusPaneAndButtonGroupVisibility(bool statusPaneVisible, boo
statusPaneVisibilityChanged = (s->IsVisible() != statusPaneVisible);
s->MakeVisible(statusPaneVisible);
}
- if (buttonGroupVisibilityChanged && !statusPaneVisibilityChanged)
+ if (buttonGroupVisibilityChanged || statusPaneVisibilityChanged) {
+ const QSize size = qt_TRect2QRect(static_cast<CEikAppUi*>(S60->appUi())->ClientRect()).size();
+ const QSize oldSize; // note that QDesktopWidget::resizeEvent ignores the QResizeEvent contents
+ QResizeEvent event(size, oldSize);
+ QApplication::instance()->sendEvent(QApplication::desktop(), &event);
+ }
+ if (buttonGroupVisibilityChanged && !statusPaneVisibilityChanged && QApplication::activeWindow())
// Ensure that control rectangle is updated
static_cast<QSymbianControl *>(QApplication::activeWindow()->winId())->handleClientAreaChange();
}
diff --git a/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h b/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h
index 6795149..16f5bd6 100644
--- a/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h
+++ b/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h
@@ -58,6 +58,8 @@ QT_BEGIN_NAMESPACE
extern Qt::MouseButton cocoaButton2QtButton(NSInteger buttonNum); // qcocoaview.mm
extern QPointer<QWidget> qt_button_down; //qapplication_mac.cpp
extern const QStringList& qEnabledDraggedTypes(); // qmime_mac.cpp
+extern void qt_event_request_window_change(QWidget *); // qapplication_mac.mm
+extern void qt_mac_send_posted_gl_updates(QWidget *widget); // qapplication_mac.mm
Q_GLOBAL_STATIC(QPointer<QWidget>, currentDragTarget);
@@ -227,6 +229,17 @@ QT_END_NAMESPACE
[self release];
}
+- (void)setInitialFirstResponder:(NSView *)view
+{
+ // This method is called the first time the window is placed on screen and
+ // is the earliest point in time we can connect OpenGL contexts to NSViews.
+ QWidget *qwidget = [[QT_MANGLE_NAMESPACE(QCocoaWindowDelegate) sharedDelegate] qt_qwidgetForWindow:self];
+ qt_event_request_window_change(qwidget);
+ qt_mac_send_posted_gl_updates(qwidget);
+
+ [super setInitialFirstResponder:view];
+}
+
- (BOOL)makeFirstResponder:(NSResponder *)responder
{
// For some reason Cocoa wants to flip the first responder
diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp
index fc13c93..c98c05a 100644
--- a/src/gui/kernel/qwidget_s60.cpp
+++ b/src/gui/kernel/qwidget_s60.cpp
@@ -503,8 +503,10 @@ void QWidgetPrivate::show_sys()
// Can't use AppUi directly because it privately inherits from MEikStatusPaneObserver.
QSymbianControl *desktopControl = static_cast<QSymbianControl *>(QApplication::desktop()->winId());
S60->statusPane()->SetObserver(desktopControl);
- if (isFullscreen)
- S60->statusPane()->MakeVisible(false);
+ if (isFullscreen) {
+ const bool cbaVisible = S60->buttonGroupContainer() && S60->buttonGroupContainer()->IsVisible();
+ S60->setStatusPaneAndButtonGroupVisibility(false, cbaVisible);
+ }
}
}
}
diff --git a/src/gui/text/qfont_s60.cpp b/src/gui/text/qfont_s60.cpp
index ccd17a2..2d547a9 100644
--- a/src/gui/text/qfont_s60.cpp
+++ b/src/gui/text/qfont_s60.cpp
@@ -40,15 +40,26 @@
****************************************************************************/
#include "qfont.h"
+#include "qfont_p.h"
#include <private/qt_s60_p.h>
#include <private/qpixmap_s60_p.h>
#include "qmutex.h"
QT_BEGIN_NAMESPACE
-#if 1
#ifdef QT_NO_FREETYPE
Q_GLOBAL_STATIC(QMutex, lastResortFamilyMutex);
+Q_GLOBAL_STATIC_WITH_INITIALIZER(QStringList, fontFamiliesOnFontServer, {
+ QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock);
+ const int numTypeFaces = S60->screenDevice()->NumTypefaces();
+ for (int i = 0; i < numTypeFaces; i++) {
+ TTypefaceSupport typefaceSupport;
+ S60->screenDevice()->TypefaceSupport(typefaceSupport, i);
+ const QString familyName((const QChar *)typefaceSupport.iTypeface.iName.Ptr(), typefaceSupport.iTypeface.iName.Length());
+ x->append(familyName);
+ }
+ lock.relock();
+});
#endif // QT_NO_FREETYPE
QString QFont::lastResortFamily() const
@@ -70,7 +81,7 @@ QString QFont::lastResortFamily() const
lock.relock();
}
return family;
-#else
+#else // QT_NO_FREETYPE
// For the FreeType case we just hard code the face name, since otherwise on
// East Asian systems we may get a name for a stroke based (non-ttf) font.
@@ -82,15 +93,24 @@ QString QFont::lastResortFamily() const
return QLatin1String(isJapaneseOrChineseSystem?"Heisei Kaku Gothic S60":"Series 60 Sans");
#endif // QT_NO_FREETYPE
}
-#else // 0
-QString QFont::lastResortFamily() const
-{
- return QLatin1String("Series 60 Sans");
-}
-#endif // 0
QString QFont::defaultFamily() const
{
+#ifdef QT_NO_FREETYPE
+ switch(d->request.styleHint) {
+ case QFont::SansSerif: {
+ static const char* const preferredSansSerif[] = {"Nokia Sans S60", "Series 60 Sans"};
+ for (int i = 0; i < sizeof preferredSansSerif / sizeof preferredSansSerif[0]; ++i) {
+ const QString sansSerif = QLatin1String(preferredSansSerif[i]);
+ if (fontFamiliesOnFontServer()->contains(sansSerif))
+ return sansSerif;
+ }
+ }
+ // No break. Intentional fall through.
+ default:
+ return lastResortFamily();
+ }
+#endif // QT_NO_FREETYPE
return lastResortFamily();
}
diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp
index 3f758b1..1e8461f 100644
--- a/src/gui/text/qfontengine.cpp
+++ b/src/gui/text/qfontengine.cpp
@@ -874,8 +874,8 @@ const uchar *QFontEngine::getCMap(const uchar *table, uint tableSize, bool *isSy
enum {
Invalid,
- Symbol,
AppleRoman,
+ Symbol,
Unicode11,
Unicode,
MicrosoftUnicode,
@@ -939,7 +939,7 @@ const uchar *QFontEngine::getCMap(const uchar *table, uint tableSize, bool *isSy
return 0;
resolveTable:
- *isSymbolFont = (score == Symbol);
+ *isSymbolFont = (symbolTable > -1);
unsigned int unicode_table = qFromBigEndian<quint32>(maps + 8*tableToUse + 4);
diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp
index 60db8b6..a9b25f5 100644
--- a/src/gui/text/qfontengine_ft.cpp
+++ b/src/gui/text/qfontengine_ft.cpp
@@ -1565,8 +1565,6 @@ bool QFontEngineFT::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs
FT_Face face = freetype->face;
for ( int i = 0; i < len; ++i ) {
unsigned int uc = getChar(str, i, len);
- if (mirrored)
- uc = QChar::mirroredChar(uc);
glyphs->glyphs[glyph_pos] = uc < QFreetypeFace::cmapCacheSize ? freetype->cmapCache[uc] : 0;
if ( !glyphs->glyphs[glyph_pos] ) {
glyph_t glyph;
diff --git a/src/gui/text/qfontengine_qpf.cpp b/src/gui/text/qfontengine_qpf.cpp
index a0593cc..53b6910 100644
--- a/src/gui/text/qfontengine_qpf.cpp
+++ b/src/gui/text/qfontengine_qpf.cpp
@@ -578,8 +578,6 @@ bool QFontEngineQPF::stringToCMap(const QChar *str, int len, QGlyphLayout *glyph
if (symbol) {
for (int i = 0; i < len; ++i) {
unsigned int uc = getChar(str, i, len);
- if (mirrored)
- uc = QChar::mirroredChar(uc);
glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, uc);
if(!glyphs->glyphs[glyph_pos] && uc < 0x100)
glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, uc + 0xf000);
diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp
index 2cc3f50..5980f20 100644
--- a/src/gui/text/qfontengine_s60.cpp
+++ b/src/gui/text/qfontengine_s60.cpp
@@ -166,6 +166,11 @@ const uchar *QSymbianTypeFaceExtras::cmap() const
return reinterpret_cast<const uchar *>(m_cmapTable.constData());
}
+bool QSymbianTypeFaceExtras::isSymbolCMap() const
+{
+ return m_symbolCMap;
+}
+
CFont *QSymbianTypeFaceExtras::fontOwner() const
{
return m_cFont;
@@ -256,7 +261,7 @@ bool QFontEngineS60::stringToCMap(const QChar *characters, int len, QGlyphLayout
for (int i = 0; i < len; ++i) {
const unsigned int uc = getChar(characters, i, len);
*g++ = QFontEngine::getTrueTypeGlyphIndex(cmap,
- isRtl ? QChar::mirroredChar(uc) : uc);
+ (isRtl && !m_extras->isSymbolCMap()) ? QChar::mirroredChar(uc) : uc);
}
glyphs->numGlyphs = g - glyphs->glyphs;
diff --git a/src/gui/text/qfontengine_s60_p.h b/src/gui/text/qfontengine_s60_p.h
index d65f13b..d05c23c 100644
--- a/src/gui/text/qfontengine_s60_p.h
+++ b/src/gui/text/qfontengine_s60_p.h
@@ -81,6 +81,7 @@ public:
bool getSfntTableData(uint tag, uchar *buffer, uint *length) const;
const uchar *cmap() const;
CFont *fontOwner() const;
+ bool isSymbolCMap() const;
private:
CFont* m_cFont;
diff --git a/src/opengl/qgl_mac.mm b/src/opengl/qgl_mac.mm
index 66fe7d3..f023a97 100644
--- a/src/opengl/qgl_mac.mm
+++ b/src/opengl/qgl_mac.mm
@@ -697,9 +697,17 @@ void QGLContext::updatePaintDevice()
QWidget *w = (QWidget *)d->paintDevice;
NSView *view = qt_mac_nativeview_for(w);
- // ideally we would use QWidget::isVisible(), but we get "invalid drawable" errors
- if (![(NSWindow *)qt_mac_window_for(w) isVisible])
- return;
+ // Trying to attach the GL context to the NSView will fail with
+ // "invalid drawable" if done too soon, but we have to make sure
+ // the connection is made before the first paint event. Using
+ // the NSView do to this check fails as the NSView is visible
+ // before it's safe to connect, and using the NSWindow fails as
+ // the NSWindow will become visible after the first paint event.
+ // This leaves us with the QWidget, who's visible state seems
+ // to match the point in time when it's safe to connect.
+ if (!w || !w->isVisible())
+ return; // Not safe to attach GL context to view yet
+
if ([static_cast<NSOpenGLContext *>(d->cx) view] != view && ![view isHidden])
[static_cast<NSOpenGLContext *>(d->cx) setView:view];
} else if (d->paintDevice->devType() == QInternal::Pixmap) {
diff --git a/src/plugins/bearer/connman/connman.pro b/src/plugins/bearer/connman/connman.pro
index 4be752b..dec408c 100644
--- a/src/plugins/bearer/connman/connman.pro
+++ b/src/plugins/bearer/connman/connman.pro
@@ -4,12 +4,14 @@ include(../../qpluginbase.pri)
QT = core network dbus
HEADERS += qconnmanservice_linux_p.h \
+ qofonoservice_linux_p.h \
qconnmanengine.h \
../qnetworksession_impl.h \
../qbearerengine_impl.h
SOURCES += main.cpp \
qconnmanservice_linux.cpp \
+ qofonoservice_linux.cpp \
qconnmanengine.cpp \
../qnetworksession_impl.cpp
diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp
index 341f7cd..a8b8911 100644
--- a/src/plugins/bearer/connman/qconnmanengine.cpp
+++ b/src/plugins/bearer/connman/qconnmanengine.cpp
@@ -41,6 +41,7 @@
#include "qconnmanengine.h"
#include "qconnmanservice_linux_p.h"
+#include "qofonoservice_linux_p.h"
#include "../qnetworksession_impl.h"
#include <QtNetwork/private/qnetworkconfiguration_p.h>
@@ -109,7 +110,6 @@ void QConnmanEngine::initialize()
QList<QNetworkConfigurationPrivate *> QConnmanEngine::getConfigurations()
{
QMutexLocker locker(&mutex);
- // foundConfigurations.clear();
getNetworkListing();
QList<QNetworkConfigurationPrivate *> fetchedConfigurations;
QNetworkConfigurationPrivate* cpPriv = 0;
@@ -131,7 +131,6 @@ QList<QNetworkConfigurationPrivate *> QConnmanEngine::getConfigurations()
delete config;
}
return fetchedConfigurations;
-// return foundConfigurations;
}
void QConnmanEngine::getNetworkListing()
@@ -149,7 +148,6 @@ void QConnmanEngine::getNetworkListing()
}
}
-
void QConnmanEngine::doRequestUpdate()
{
connmanManager->requestScan("");
@@ -184,11 +182,24 @@ void QConnmanEngine::connectToId(const QString &id)
void QConnmanEngine::disconnectFromId(const QString &id)
{
QMutexLocker locker(&mutex);
- QConnmanServiceInterface serv(serviceFromId(id));
+ QString servicePath = serviceFromId(id);
+ QConnmanServiceInterface serv(servicePath);
if(!serv.isValid()) {
emit connectionError(id, DisconnectionError);
} else {
- serv.disconnect();
+ if(serv.getType() != "cellular") {
+ serv.disconnect();
+ } else {
+ QOfonoManagerInterface ofonoManager(0);
+ QString modemPath = ofonoManager.currentModem().path();
+ QOfonoDataConnectionManagerInterface dc(modemPath,0);
+ foreach(const QDBusObjectPath dcPath,dc.getPrimaryContexts()) {
+ if(dcPath.path().contains(servicePath.section("_",-1))) {
+ QOfonoPrimaryDataContextInterface primaryContext(dcPath.path(),0);
+ primaryContext.setActive(false);
+ }
+ }
+ }
}
}
@@ -324,7 +335,6 @@ QString QConnmanEngine::getServiceForNetwork(const QString &netPath)
return QString();
}
-
void QConnmanEngine::propertyChangedContext(const QString &path,const QString &item, const QDBusVariant &value)
{
Q_UNUSED(path);
@@ -376,7 +386,7 @@ void QConnmanEngine::servicePropertyChangedContext(const QString &path,const QSt
}
}
-void QConnmanEngine::networkPropertyChangedContext(const QString &path,const QString &item, const QDBusVariant &value)
+void QConnmanEngine::networkPropertyChangedContext(const QString &/*path*/,const QString &/*item*/, const QDBusVariant &/*value*/)
{
QMutexLocker locker(&mutex);
}
@@ -388,7 +398,6 @@ void QConnmanEngine::devicePropertyChangedContext(const QString &devpath,const Q
QConnmanNetworkInterface network(devpath, this);
-
QDBusArgument arg = qvariant_cast<QDBusArgument>(value.variant());
QStringList remainingNetworks = qdbus_cast<QStringList>(arg);
QString devicetype;
@@ -502,10 +511,18 @@ QNetworkConfiguration::StateFlags QConnmanEngine::getStateForService(const QStri
QMutexLocker locker(&mutex);
QConnmanServiceInterface serv(service);
QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
- if(serv.isFavorite()) {
- flag = ( flag | QNetworkConfiguration::Discovered);
+ if( serv.getType() == "cellular") {
+ if(serv.isSetupRequired()) {
+ flag = ( flag | QNetworkConfiguration::Defined);
+ } else {
+ flag = ( flag | QNetworkConfiguration::Discovered);
+ }
} else {
- flag = QNetworkConfiguration::Undefined;
+ if(serv.isFavorite()) {
+ flag = ( flag | QNetworkConfiguration::Discovered);
+ } else {
+ flag = QNetworkConfiguration::Undefined;
+ }
}
if(serv.getState() == "ready" || serv.getState() == "online") {
@@ -524,8 +541,7 @@ QNetworkConfiguration::BearerType QConnmanEngine::typeToBearer(const QString &ty
if (type == "bluetooth")
return QNetworkConfiguration::BearerBluetooth;
if (type == "cellular") {
- return QNetworkConfiguration::Bearer2G;
- // not handled: CDMA2000 HSPA
+ return ofonoTechToBearerType(type);
}
if (type == "wimax")
return QNetworkConfiguration::BearerWiMAX;
@@ -536,6 +552,51 @@ QNetworkConfiguration::BearerType QConnmanEngine::typeToBearer(const QString &ty
return QNetworkConfiguration::BearerUnknown;
}
+QNetworkConfiguration::BearerType QConnmanEngine::ofonoTechToBearerType(const QString &/*type*/)
+{
+ QOfonoManagerInterface ofonoManager(this);
+ QOfonoNetworkRegistrationInterface ofonoNetwork(ofonoManager.currentModem().path(),this);
+
+ if(ofonoNetwork.isValid()) {
+ foreach(const QDBusObjectPath op,ofonoNetwork.getOperators() ) {
+ QOfonoNetworkOperatorInterface opIface(op.path(),this);
+
+ foreach(const QString opTech, opIface.getTechnologies()) {
+
+ if(opTech == "gsm") {
+ return QNetworkConfiguration::Bearer2G;
+ }
+ if(opTech == "edge"){
+ return QNetworkConfiguration::BearerCDMA2000; //wrong, I know
+ }
+ if(opTech == "umts"){
+ return QNetworkConfiguration::BearerWCDMA;
+ }
+ if(opTech == "hspa"){
+ return QNetworkConfiguration::BearerHSPA;
+ }
+ if(opTech == "lte"){
+ return QNetworkConfiguration::BearerWiMAX; //not exact
+ }
+ }
+ }
+ }
+ return QNetworkConfiguration::BearerUnknown;
+}
+
+bool QConnmanEngine::isRoamingAllowed(const QString &context)
+{
+ QOfonoManagerInterface ofonoManager(this);
+ QString modemPath = ofonoManager.currentModem().path();
+ QOfonoDataConnectionManagerInterface dc(modemPath,this);
+ foreach(const QDBusObjectPath dcPath,dc.getPrimaryContexts()) {
+ if(dcPath.path().contains(context.section("_",-1))) {
+ return dc.isRoamingAllowed();
+ }
+ }
+ return false;
+}
+
void QConnmanEngine::removeConfiguration(const QString &id)
{
QMutexLocker locker(&mutex);
@@ -564,7 +625,6 @@ void QConnmanEngine::removeConfiguration(const QString &id)
void QConnmanEngine::addServiceConfiguration(const QString &servicePath)
{
-
QMutexLocker locker(&mutex);
QConnmanServiceInterface *serv;
serv = new QConnmanServiceInterface(servicePath);
@@ -589,36 +649,31 @@ void QConnmanEngine::addServiceConfiguration(const QString &servicePath)
QString networkName = serv->getName();
- if(serv->getType() == "cellular") {
- networkName = serv->getAPN();
- if(networkName.isEmpty()) {
- networkName = serv->getName();
- }
- }
-
- cpPriv->name = networkName;
- cpPriv->isValid = true;
- cpPriv->id = id;
- cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
-
-
const QString connectionType = serv->getType();
if (connectionType == "ethernet") {
cpPriv->bearerType = QNetworkConfiguration::BearerEthernet;
} else if (connectionType == "wifi") {
cpPriv->bearerType = QNetworkConfiguration::BearerWLAN;
} else if (connectionType == "cellular") {
- const QString mode = serv->getMode();
- if (mode == "gprs" || mode == "edge")
- cpPriv->bearerType = QNetworkConfiguration::Bearer2G;
- else if (mode == "umts")
- cpPriv->bearerType = QNetworkConfiguration::BearerWCDMA;
+ cpPriv->bearerType = ofonoTechToBearerType("cellular");
+ if(servicePath.isEmpty()) {
+ networkName = serv->getAPN();
+ if(networkName.isEmpty()) {
+ networkName = serv->getName();
+ }
+ }
+ cpPriv->roamingSupported = isRoamingAllowed(servicePath);
} else if (connectionType == "wimax") {
cpPriv->bearerType = QNetworkConfiguration::BearerWiMAX;
} else {
cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
}
+ cpPriv->name = networkName;
+ cpPriv->isValid = true;
+ cpPriv->id = id;
+ cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
+
if(serv->getSecurity() == "none") {
cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
} else {
@@ -635,7 +690,6 @@ void QConnmanEngine::addServiceConfiguration(const QString &servicePath)
foundConfigurations.append(cpPriv);
configInterfaces[cpPriv->id] = device.getInterface();
-
locker.unlock();
emit configurationAdded(ptr);
locker.relock();
@@ -646,7 +700,6 @@ void QConnmanEngine::addServiceConfiguration(const QString &servicePath)
void QConnmanEngine::addNetworkConfiguration(const QString &networkPath)
{
QMutexLocker locker(&mutex);
-
if(networkPath.isNull())
return;
@@ -662,10 +715,9 @@ void QConnmanEngine::addNetworkConfiguration(const QString &networkPath)
id = QString::number(qHash(networkPath));
} else {
id = QString::number(qHash(servicePath));
- serv = new QConnmanServiceInterface(servicePath,this);
- connect(serv,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
- this,SLOT(servicePropertyChangedContext(QString,QString, QDBusVariant)));
-
+ serv = new QConnmanServiceInterface(servicePath,this);
+ connect(serv,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
+ this,SLOT(servicePropertyChangedContext(QString,QString, QDBusVariant)));
}
if (!id.isEmpty() && !accessPointConfigurations.contains(id)) {
@@ -684,7 +736,6 @@ void QConnmanEngine::addNetworkConfiguration(const QString &networkPath)
if(networkName.isEmpty())
networkName = "Hidden Network";
-
QNetworkConfiguration::BearerType bearerType;
if(servicePath.isEmpty()) {
@@ -693,21 +744,14 @@ void QConnmanEngine::addNetworkConfiguration(const QString &networkPath)
QConnmanDeviceInterface device(devicePath,this);
bearerType = typeToBearer(device.getType());
} else {
- bearerType = typeToBearer(serv->getType());
- }
-
- if (bearerType == QNetworkConfiguration::Bearer2G) {
- QString mode = serv->getMode();
- if (mode == "gprs" || mode == "edge") {
- bearerType = QNetworkConfiguration::Bearer2G;
- } else if (mode == "umts") {
- bearerType = QNetworkConfiguration::BearerWCDMA;
- }
- if(servicePath.isEmpty()) {
- networkName = serv->getAPN();
- if(networkName.isEmpty()) {
+ if(serv->getType() == "cellular") {
+ bearerType = ofonoTechToBearerType("cellular");
+ if(servicePath.isEmpty()) {
networkName = serv->getName();
}
+ cpPriv->roamingSupported = isRoamingAllowed(servicePath);
+ } else {
+ bearerType = typeToBearer(serv->getType());
}
}
@@ -775,7 +819,19 @@ void QConnmanConnectThread::run()
if(!serv.isValid()) {
emit connectionError(identifier, QBearerEngineImpl::InterfaceLookupError);
} else {
- serv.connect();
+ if(serv.getType() != "cellular") {
+ serv.connect();
+ } else {
+ QOfonoManagerInterface ofonoManager(0);
+ QString modemPath = ofonoManager.currentModem().path();
+ QOfonoDataConnectionManagerInterface dc(modemPath,0);
+ foreach(const QDBusObjectPath dcPath,dc.getPrimaryContexts()) {
+ if(dcPath.path().contains(servicePath.section("_",-1))) {
+ QOfonoPrimaryDataContextInterface primaryContext(dcPath.path(),0);
+ primaryContext.setActive(true);
+ }
+ }
+ }
}
}
diff --git a/src/plugins/bearer/connman/qconnmanengine.h b/src/plugins/bearer/connman/qconnmanengine.h
index 2ee6da5..569bbc7 100644
--- a/src/plugins/bearer/connman/qconnmanengine.h
+++ b/src/plugins/bearer/connman/qconnmanengine.h
@@ -137,7 +137,8 @@ private:
QMap<QString,QStringList> deviceMap; //tech path, device path
QMap<QString, QString> serviceNetworks; //service, network
-
+ QNetworkConfiguration::BearerType ofonoTechToBearerType(const QString &type);
+ bool isRoamingAllowed(const QString &context);
protected:
bool requiresPolling() const;
QConnmanConnectThread *connThread;
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
index 3722c43..549a07a 100644
--- a/src/plugins/bearer/connman/qconnmanservice_linux.cpp
+++ b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
@@ -984,12 +984,17 @@ QConnmanCounterInterface::~QConnmanCounterInterface()
quint32 QConnmanCounterInterface::getReceivedByteCount()
{
-return 0;
+ return 0;
}
quint32 QConnmanCounterInterface::getTransmittedByteCount()
{
-return 0;
+ return 0;
+}
+
+quint64 QConnmanCounterInterface::getTimeOnline()
+{
+ return 0;
}
/////////////////////////////////////////
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux_p.h b/src/plugins/bearer/connman/qconnmanservice_linux_p.h
index a2b1e73..6e6b702 100644
--- a/src/plugins/bearer/connman/qconnmanservice_linux_p.h
+++ b/src/plugins/bearer/connman/qconnmanservice_linux_p.h
@@ -331,6 +331,7 @@ public:
QString getInterface();
quint32 getReceivedByteCount();
quint32 getTransmittedByteCount();
+ quint64 getTimeOnline();
private:
QConnmanCounterInterfacePrivate *d;
diff --git a/src/plugins/bearer/connman/qofonoservice_linux.cpp b/src/plugins/bearer/connman/qofonoservice_linux.cpp
new file mode 100644
index 0000000..955f4b1
--- /dev/null
+++ b/src/plugins/bearer/connman/qofonoservice_linux.cpp
@@ -0,0 +1,940 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QObject>
+#include <QList>
+#include <QtDBus/QtDBus>
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusError>
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusReply>
+#include <QtDBus/QDBusPendingCallWatcher>
+#include <QtDBus/QDBusObjectPath>
+#include <QtDBus/QDBusPendingCall>
+
+#include "qofonoservice_linux_p.h"
+
+
+QT_BEGIN_NAMESPACE
+static QDBusConnection dbusConnection = QDBusConnection::systemBus();
+
+
+QOfonoManagerInterface::QOfonoManagerInterface( QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ QLatin1String(OFONO_MANAGER_PATH),
+ OFONO_MANAGER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoManagerInterface::~QOfonoManagerInterface()
+{
+}
+
+QList <QDBusObjectPath> QOfonoManagerInterface::getModems()
+{
+ QVariant var = getProperty("Modems");
+ return qdbus_cast<QList<QDBusObjectPath> >(var);
+}
+
+QDBusObjectPath QOfonoManagerInterface::currentModem()
+{
+ QList<QDBusObjectPath> modems = getModems();
+ foreach(const QDBusObjectPath modem, modems) {
+ QOfonoModemInterface device(modem.path());
+ if(device.isPowered() && device.isOnline())
+ return modem;;
+ }
+ return QDBusObjectPath();
+}
+
+
+void QOfonoManagerInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ QLatin1String(OFONO_MANAGER_PATH),
+ QLatin1String(OFONO_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ QLatin1String(OFONO_MANAGER_PATH),
+ QLatin1String(OFONO_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)));
+ }
+}
+
+void QOfonoManagerInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoManagerInterface::getProperty(const QString &property)
+{
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ return map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return QVariant();
+}
+
+QVariantMap QOfonoManagerInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ if(reply.isValid())
+ return reply.value();
+ else
+ return QVariantMap();
+}
+
+QOfonoDBusHelper::QOfonoDBusHelper(QObject * parent)
+ : QObject(parent)
+{
+}
+
+QOfonoDBusHelper::~QOfonoDBusHelper()
+{
+}
+
+void QOfonoDBusHelper::propertyChanged(const QString &item, const QDBusVariant &var)
+{
+ QDBusMessage msg = this->message();
+ Q_EMIT propertyChangedContext(msg.path() ,item, var);
+}
+
+
+QOfonoModemInterface::QOfonoModemInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_MODEM_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoModemInterface::~QOfonoModemInterface()
+{
+}
+
+bool QOfonoModemInterface::isPowered()
+{
+ QVariant var = getProperty("Powered");
+ return qdbus_cast<bool>(var);
+}
+
+bool QOfonoModemInterface::isOnline()
+{
+ QVariant var = getProperty("Online");
+ return qdbus_cast<bool>(var);
+}
+
+QString QOfonoModemInterface::getName()
+{
+ QVariant var = getProperty("Name");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoModemInterface::getManufacturer()
+{
+ QVariant var = getProperty("Manufacturer");
+ return qdbus_cast<QString>(var);
+
+}
+
+QString QOfonoModemInterface::getModel()
+{
+
+ QVariant var = getProperty("Model");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoModemInterface::getRevision()
+{
+ QVariant var = getProperty("Revision");
+ return qdbus_cast<QString>(var);
+
+}
+QString QOfonoModemInterface::getSerial()
+{
+ QVariant var = getProperty("Serial");
+ return qdbus_cast<QString>(var);
+
+}
+
+QStringList QOfonoModemInterface::getFeatures()
+{
+ //sms, sim
+ QVariant var = getProperty("Features");
+ return qdbus_cast<QStringList>(var);
+}
+
+QStringList QOfonoModemInterface::getInterfaces()
+{
+ QVariant var = getProperty("Interfaces");
+ return qdbus_cast<QStringList>(var);
+}
+
+QString QOfonoModemInterface::defaultInterface()
+{
+ foreach(const QString &modem,getInterfaces()) {
+ return modem;
+ }
+ return QString();
+}
+
+
+void QOfonoModemInterface::connectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_MODEM_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_MODEM_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)));
+ }}
+
+void QOfonoModemInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariantMap QOfonoModemInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+QVariant QOfonoModemInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+
+QOfonoNetworkRegistrationInterface::QOfonoNetworkRegistrationInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_NETWORK_REGISTRATION_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoNetworkRegistrationInterface::~QOfonoNetworkRegistrationInterface()
+{
+}
+
+QString QOfonoNetworkRegistrationInterface::getStatus()
+{
+ /*
+ "unregistered" Not registered to any network
+ "registered" Registered to home network
+ "searching" Not registered, but searching
+ "denied" Registration has been denied
+ "unknown" Status is unknown
+ "roaming" Registered, but roaming*/
+ QVariant var = getProperty("Status");
+ return qdbus_cast<QString>(var);
+}
+
+quint16 QOfonoNetworkRegistrationInterface::getLac()
+{
+ QVariant var = getProperty("LocationAreaCode");
+ return var.value<quint16>();
+}
+
+
+quint32 QOfonoNetworkRegistrationInterface::getCellId()
+{
+ QVariant var = getProperty("CellId");
+ return var.value<quint32>();
+}
+
+QString QOfonoNetworkRegistrationInterface::getTechnology()
+{
+ // "gsm", "edge", "umts", "hspa","lte"
+ QVariant var = getProperty("Technology");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoNetworkRegistrationInterface::getOperatorName()
+{
+ QVariant var = getProperty("Name");
+ return qdbus_cast<QString>(var);
+}
+
+int QOfonoNetworkRegistrationInterface::getSignalStrength()
+{
+ QVariant var = getProperty("Strength");
+ return qdbus_cast<int>(var);
+
+}
+
+QString QOfonoNetworkRegistrationInterface::getBaseStation()
+{
+ QVariant var = getProperty("BaseStation");
+ return qdbus_cast<QString>(var);
+}
+
+QList <QDBusObjectPath> QOfonoNetworkRegistrationInterface::getOperators()
+{
+ QVariant var = getProperty("Operators");
+ return qdbus_cast<QList <QDBusObjectPath> >(var);
+}
+
+void QOfonoNetworkRegistrationInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_NETWORK_REGISTRATION_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_NETWORK_REGISTRATION_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)));
+ }
+}
+
+void QOfonoNetworkRegistrationInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoNetworkRegistrationInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoNetworkRegistrationInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+
+
+QOfonoNetworkOperatorInterface::QOfonoNetworkOperatorInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_NETWORK_OPERATOR_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoNetworkOperatorInterface::~QOfonoNetworkOperatorInterface()
+{
+}
+
+QString QOfonoNetworkOperatorInterface::getName()
+{
+ QVariant var = getProperty("Name");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoNetworkOperatorInterface::getStatus()
+{
+ // "unknown", "available", "current" and "forbidden"
+ QVariant var = getProperty("Status");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoNetworkOperatorInterface::getMcc()
+{
+ QVariant var = getProperty("MobileCountryCode");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoNetworkOperatorInterface::getMnc()
+{
+ QVariant var = getProperty("MobileNetworkCode");
+ return qdbus_cast<QString>(var);
+}
+
+QStringList QOfonoNetworkOperatorInterface::getTechnologies()
+{
+ QVariant var = getProperty("Technologies");
+ return qdbus_cast<QStringList>(var);
+}
+
+void QOfonoNetworkOperatorInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_NETWORK_OPERATOR_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_NETWORK_OPERATOR_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)));
+ }
+}
+
+void QOfonoNetworkOperatorInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoNetworkOperatorInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoNetworkOperatorInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+QOfonoSimInterface::QOfonoSimInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_SIM_MANAGER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoSimInterface::~QOfonoSimInterface()
+{
+}
+
+bool QOfonoSimInterface::isPresent()
+{
+ QVariant var = getProperty("Present");
+ return qdbus_cast<bool>(var);
+}
+
+QString QOfonoSimInterface::getHomeMcc()
+{
+ QVariant var = getProperty("MobileCountryCode");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoSimInterface::getHomeMnc()
+{
+ QVariant var = getProperty("MobileNetworkCode");
+ return qdbus_cast<QString>(var);
+}
+
+// QStringList subscriberNumbers();
+// QMap<QString,QString> serviceNumbers();
+QString QOfonoSimInterface::pinRequired()
+{
+ QVariant var = getProperty("PinRequired");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoSimInterface::lockedPins()
+{
+ QVariant var = getProperty("LockedPins");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoSimInterface::cardIdentifier()
+{
+ QVariant var = getProperty("CardIdentifier");
+ return qdbus_cast<QString>(var);
+}
+
+void QOfonoSimInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SIM_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SIM_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)));
+ }
+}
+
+void QOfonoSimInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoSimInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoSimInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+QOfonoDataConnectionManagerInterface::QOfonoDataConnectionManagerInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_DATA_CONNECTION_MANAGER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoDataConnectionManagerInterface::~QOfonoDataConnectionManagerInterface()
+{
+}
+
+QList<QDBusObjectPath> QOfonoDataConnectionManagerInterface::getPrimaryContexts()
+{
+ QVariant var = getProperty("PrimaryContexts");
+ return qdbus_cast<QList<QDBusObjectPath> >(var);
+}
+
+bool QOfonoDataConnectionManagerInterface::isAttached()
+{
+ QVariant var = getProperty("Attached");
+ return qdbus_cast<bool>(var);
+}
+
+bool QOfonoDataConnectionManagerInterface::isRoamingAllowed()
+{
+ QVariant var = getProperty("RoamingAllowed");
+ return qdbus_cast<bool>(var);
+}
+
+bool QOfonoDataConnectionManagerInterface::isPowered()
+{
+ QVariant var = getProperty("Powered");
+ return qdbus_cast<bool>(var);
+}
+
+void QOfonoDataConnectionManagerInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_DATA_CONNECTION_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_DATA_CONNECTION_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)));
+ }
+}
+
+void QOfonoDataConnectionManagerInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoDataConnectionManagerInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoDataConnectionManagerInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+QOfonoPrimaryDataContextInterface::QOfonoPrimaryDataContextInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_DATA_CONTEXT_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoPrimaryDataContextInterface::~QOfonoPrimaryDataContextInterface()
+{
+}
+
+bool QOfonoPrimaryDataContextInterface::isActive()
+{
+ QVariant var = getProperty("Active");
+ return qdbus_cast<bool>(var);
+}
+
+QString QOfonoPrimaryDataContextInterface::getApName()
+{
+ QVariant var = getProperty("AccessPointName");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoPrimaryDataContextInterface::getType()
+{
+ QVariant var = getProperty("Type");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoPrimaryDataContextInterface::getName()
+{
+ QVariant var = getProperty("Name");
+ return qdbus_cast<QString>(var);
+}
+
+QVariantMap QOfonoPrimaryDataContextInterface::getSettings()
+{
+ QVariant var = getProperty("Settings");
+ return qdbus_cast<QVariantMap>(var);
+}
+
+QString QOfonoPrimaryDataContextInterface::getInterface()
+{
+ QVariant var = getProperty("Interface");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoPrimaryDataContextInterface::getAddress()
+{
+ QVariant var = getProperty("Address");
+ return qdbus_cast<QString>(var);
+}
+
+bool QOfonoPrimaryDataContextInterface::setActive(bool on)
+{
+// this->setProperty("Active", QVariant(on));
+
+ return setProp("Active", qVariantFromValue(on));
+}
+
+bool QOfonoPrimaryDataContextInterface::setApn(const QString &name)
+{
+ return setProp("AccessPointName", QVariant::fromValue(name));
+}
+
+void QOfonoPrimaryDataContextInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_DATA_CONTEXT_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_DATA_CONTEXT_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)));
+ }
+}
+
+void QOfonoPrimaryDataContextInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoPrimaryDataContextInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoPrimaryDataContextInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+bool QOfonoPrimaryDataContextInterface::setProp(const QString &property, const QVariant &var)
+{
+ QList<QVariant> args;
+ args << qVariantFromValue(property) << qVariantFromValue(QDBusVariant(var));
+
+ QDBusMessage reply = this->callWithArgumentList(QDBus::AutoDetect,
+ QLatin1String("SetProperty"),
+ args);
+ bool ok = true;
+ if(reply.type() != QDBusMessage::ReplyMessage) {
+ qWarning() << reply.errorMessage();
+ ok = false;
+ }
+ qWarning() << reply.errorMessage();
+ return ok;
+}
+
+QOfonoSmsInterface::QOfonoSmsInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_SMS_MANAGER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoSmsInterface::~QOfonoSmsInterface()
+{
+}
+
+void QOfonoSmsInterface::connectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)));
+ }
+
+ if (QLatin1String(signal) == SIGNAL(immediateMessage(QString,QVariantMap))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
+ QLatin1String("ImmediateMessage"),
+ this,SIGNAL(immediateMessage(QString,QVariantMap )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(incomingMessage(QString,QVariantMap))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
+ QLatin1String("IncomingMessage"),
+ this,SIGNAL(incomingMessage(QString,QVariantMap)))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+}
+
+void QOfonoSmsInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoSmsInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoSmsInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+void QOfonoSmsInterface::sendMessage(const QString &to, const QString &message)
+{
+ QDBusReply<QString> reply = this->call(QLatin1String("SendMessage"),
+ QVariant::fromValue(to),
+ QVariant::fromValue(message));
+ bool ok = true;
+ if(reply.error().type() == QDBusError::InvalidArgs) {
+ qWarning() << reply.error().message();
+ ok = false;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/bearer/connman/qofonoservice_linux_p.h b/src/plugins/bearer/connman/qofonoservice_linux_p.h
new file mode 100644
index 0000000..4892666
--- /dev/null
+++ b/src/plugins/bearer/connman/qofonoservice_linux_p.h
@@ -0,0 +1,332 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOFONOSERVICE_H
+#define QOFONOSERVICE_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtDBus/QtDBus>
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusError>
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusReply>
+
+#include <QtDBus/QDBusPendingCallWatcher>
+#include <QtDBus/QDBusObjectPath>
+#include <QtDBus/QDBusContext>
+#include <QMap>
+
+#define OFONO_SERVICE "org.ofono"
+#define OFONO_MANAGER_INTERFACE "org.ofono.Manager"
+#define OFONO_MANAGER_PATH "/"
+#define OFONO_MODEM_INTERFACE "org.ofono.Modem"
+#define OFONO_NETWORK_REGISTRATION_INTERFACE "org.ofono.NetworkRegistration"
+#define OFONO_NETWORK_OPERATOR_INTERFACE "org.ofono.NetworkOperator"
+#define OFONO_DATA_CONNECTION_MANAGER_INTERFACE "org.ofono.DataConnectionManager"
+#define OFONO_SIM_MANAGER_INTERFACE "org.ofono.SimManager"
+#define OFONO_DATA_CONTEXT_INTERFACE "org.ofono.PrimaryDataContext"
+
+#define OFONO_SMS_MANAGER_INTERFACE "org.ofono.SmsManager"
+#define OFONO_PHONEBOOK_INTERFACE "org.ofono.Phonebook"
+#define OFONO_MESSAGE_WAITING_INTERFACE "org.ofono.MessageWaiting"
+
+
+
+QT_BEGIN_NAMESPACE
+
+QT_END_NAMESPACE
+
+
+QT_BEGIN_NAMESPACE
+
+class QOfonoManagerInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoManagerInterface( QObject *parent = 0);
+ ~QOfonoManagerInterface();
+
+ QDBusObjectPath path() const;
+
+ QVariantMap getProperties();
+ bool setProperty(const QString &name, const QDBusVariant &value);
+ QList <QDBusObjectPath> getModems();
+ QDBusObjectPath currentModem();
+
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+
+};
+
+
+class QOfonoDBusHelper: public QObject, protected QDBusContext
+ {
+ Q_OBJECT
+ public:
+ QOfonoDBusHelper(QObject *parent = 0);
+ ~QOfonoDBusHelper();
+
+ public slots:
+ void propertyChanged(const QString &, const QDBusVariant &);
+ Q_SIGNALS:
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+};
+
+class QOfonoModemInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoModemInterface(const QString &dbusModemPathName, QObject *parent = 0);
+ ~QOfonoModemInterface();
+
+ QVariantMap getProperties();
+ //properties
+ bool isPowered();
+ bool isOnline();
+ QString getName();
+ QString getManufacturer();
+ QString getModel();
+ QString getRevision();
+ QString getSerial();
+
+ QStringList getFeatures(); //sms, sim
+ QStringList getInterfaces();
+ QString defaultInterface();
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+};
+
+
+class QOfonoNetworkRegistrationInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoNetworkRegistrationInterface(const QString &dbusModemPathName, QObject *parent = 0);
+ ~QOfonoNetworkRegistrationInterface();
+
+ QVariantMap getProperties();
+
+ //properties
+ QString getStatus();
+ quint16 getLac();
+ quint32 getCellId();
+ QString getTechnology();
+ QString getOperatorName();
+ int getSignalStrength();
+ QString getBaseStation();
+ QList <QDBusObjectPath> getOperators();
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+
+};
+
+class QOfonoNetworkOperatorInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+//modem or operator paths
+ QOfonoNetworkOperatorInterface(const QString &dbusPathName, QObject *parent = 0);
+ ~QOfonoNetworkOperatorInterface();
+
+ QVariantMap getProperties();
+
+ //properties
+ QString getName();
+ QString getStatus();// "unknown", "available", "current" and "forbidden"
+ QString getMcc();
+ QString getMnc();
+ QStringList getTechnologies();
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+};
+
+class QOfonoSimInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoSimInterface(const QString &dbusModemPathName, QObject *parent = 0);
+ ~QOfonoSimInterface();
+
+ QVariantMap getProperties();
+
+ //properties
+ bool isPresent();
+ QString getHomeMcc();
+ QString getHomeMnc();
+// QStringList subscriberNumbers();
+// QMap<QString,QString> serviceNumbers();
+ QString pinRequired();
+ QString lockedPins();
+ QString cardIdentifier();
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+};
+
+
+class QOfonoDataConnectionManagerInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoDataConnectionManagerInterface(const QString &dbusPathName, QObject *parent = 0);
+ ~QOfonoDataConnectionManagerInterface();
+
+ QVariantMap getProperties();
+
+ //properties
+ QList<QDBusObjectPath> getPrimaryContexts();
+ bool isAttached();
+ bool isRoamingAllowed();
+ bool isPowered();
+
+ bool setPower(bool on);
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+};
+
+
+class QOfonoPrimaryDataContextInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoPrimaryDataContextInterface(const QString &dbusPathName, QObject *parent = 0);
+ ~QOfonoPrimaryDataContextInterface();
+
+ QVariantMap getProperties();
+
+ //properties
+ bool isActive();
+ QString getApName();
+ QString getType();
+ QString getName();
+ QVariantMap getSettings();
+ QString getInterface();
+ QString getAddress();
+
+ bool setActive(bool on);
+ bool setApn(const QString &name);
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+ bool setProp(const QString &, const QVariant &var);
+};
+
+class QOfonoSmsInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoSmsInterface(const QString &dbusModemPathName, QObject *parent = 0);
+ ~QOfonoSmsInterface();
+
+ QVariantMap getProperties();
+ void sendMessage(const QString &to, const QString &message);
+
+ //properties
+ QString serviceCenterAddress();
+ bool useDeliveryReports();
+ QString bearer();
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+ void immediateMessage(const QString &message, const QVariantMap &info);
+ void incomingMessage(const QString &message, const QVariantMap &info);
+};
+
+#endif //QOFONOSERVICE_H
diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.mm b/src/plugins/bearer/corewlan/qcorewlanengine.mm
index 131f36d..844e38b 100644
--- a/src/plugins/bearer/corewlan/qcorewlanengine.mm
+++ b/src/plugins/bearer/corewlan/qcorewlanengine.mm
@@ -305,50 +305,53 @@ void QScanThread::getUserConfigurations()
SCDynamicStoreRef dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, (CFStringRef)@"Qt corewlan", nil, nil);
NSDictionary * airportPlist = (NSDictionary *)SCDynamicStoreCopyValue(dynRef, (CFStringRef)[NSString stringWithFormat:@"Setup:/Network/Interface/%@/AirPort", nsInterfaceName]);
CFRelease(dynRef);
-
- NSDictionary *prefNetDict = [airportPlist objectForKey:@"PreferredNetworks"];
-
- NSArray *thisSsidarray = [prefNetDict valueForKey:@"SSID_STR"];
- for(NSString *ssidkey in thisSsidarray) {
- QString thisSsid = qt_mac_NSStringToQString(ssidkey);
- if(!userProfiles.contains(thisSsid)) {
- QMap <QString,QString> map;
- map.insert(thisSsid, qt_mac_NSStringToQString(nsInterfaceName));
- userProfiles.insert(thisSsid, map);
+ if(airportPlist != nil) {
+ NSDictionary *prefNetDict = [airportPlist objectForKey:@"PreferredNetworks"];
+
+ NSArray *thisSsidarray = [prefNetDict valueForKey:@"SSID_STR"];
+ for(NSString *ssidkey in thisSsidarray) {
+ QString thisSsid = qt_mac_NSStringToQString(ssidkey);
+ if(!userProfiles.contains(thisSsid)) {
+ QMap <QString,QString> map;
+ map.insert(thisSsid, qt_mac_NSStringToQString(nsInterfaceName));
+ userProfiles.insert(thisSsid, map);
+ }
}
+ CFRelease(airportPlist);
}
- CFRelease(airportPlist);
// 802.1X user profiles
QString userProfilePath = QDir::homePath() + "/Library/Preferences/com.apple.eap.profiles.plist";
NSDictionary* eapDict = [[[NSDictionary alloc] initWithContentsOfFile:qt_mac_QStringToNSString(userProfilePath)] autorelease];
- NSString *profileStr= @"Profiles";
- NSString *nameStr = @"UserDefinedName";
- NSString *networkSsidStr = @"Wireless Network";
- for (id profileKey in eapDict) {
- if ([profileStr isEqualToString:profileKey]) {
- NSDictionary *itemDict = [eapDict objectForKey:profileKey];
- for (id itemKey in itemDict) {
-
- NSInteger dictSize = [itemKey count];
- id objects[dictSize];
- id keys[dictSize];
-
- [itemKey getObjects:objects andKeys:keys];
- QString networkName;
- QString ssid;
- for(int i = 0; i < dictSize; i++) {
- if([nameStr isEqualToString:keys[i]]) {
- networkName = qt_mac_NSStringToQString(objects[i]);
- }
- if([networkSsidStr isEqualToString:keys[i]]) {
- ssid = qt_mac_NSStringToQString(objects[i]);
- }
- if(!userProfiles.contains(networkName)
- && !ssid.isEmpty()) {
- QMap<QString,QString> map;
- map.insert(ssid, qt_mac_NSStringToQString(nsInterfaceName));
- userProfiles.insert(networkName, map);
+ if(eapDict != nil) {
+ NSString *profileStr= @"Profiles";
+ NSString *nameStr = @"UserDefinedName";
+ NSString *networkSsidStr = @"Wireless Network";
+ for (id profileKey in eapDict) {
+ if ([profileStr isEqualToString:profileKey]) {
+ NSDictionary *itemDict = [eapDict objectForKey:profileKey];
+ for (id itemKey in itemDict) {
+
+ NSInteger dictSize = [itemKey count];
+ id objects[dictSize];
+ id keys[dictSize];
+
+ [itemKey getObjects:objects andKeys:keys];
+ QString networkName;
+ QString ssid;
+ for(int i = 0; i < dictSize; i++) {
+ if([nameStr isEqualToString:keys[i]]) {
+ networkName = qt_mac_NSStringToQString(objects[i]);
+ }
+ if([networkSsidStr isEqualToString:keys[i]]) {
+ ssid = qt_mac_NSStringToQString(objects[i]);
+ }
+ if(!userProfiles.contains(networkName)
+ && !ssid.isEmpty()) {
+ QMap<QString,QString> map;
+ map.insert(ssid, qt_mac_NSStringToQString(nsInterfaceName));
+ userProfiles.insert(networkName, map);
+ }
}
}
}
@@ -855,6 +858,8 @@ quint64 QCoreWlanEngine::startTime(const QString &id)
NSString *filePath = @"/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist";
NSDictionary* plistDict = [[[NSDictionary alloc] initWithContentsOfFile:filePath] autorelease];
+ if(plistDict == nil)
+ return timestamp;
NSString *input = @"KnownNetworks";
NSString *timeStampStr = @"_timeStamp";
@@ -864,9 +869,13 @@ quint64 QCoreWlanEngine::startTime(const QString &id)
if ([input isEqualToString:key]) {
NSDictionary *knownNetworksDict = [plistDict objectForKey:key];
+ if(knownNetworksDict == nil)
+ return timestamp;
for (id networkKey in knownNetworksDict) {
bool isFound = false;
NSDictionary *itemDict = [knownNetworksDict objectForKey:networkKey];
+ if(itemDict == nil)
+ return timestamp;
NSInteger dictSize = [itemDict count];
id objects[dictSize];
id keys[dictSize];
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index 2091898..7f81397 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -968,11 +968,17 @@ QNetworkConfiguration QNetworkSessionPrivateImpl::activeConfiguration(TUint32 ia
}
} else {
#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- // On Symbian^3 (only, not earlier or Symbian^4) if the SNAP was not reachable, it triggers
- // user choice type of activity (EasyWLAN). As a result, a new IAP may be created, and
- // hence if was not found yet. Therefore update configurations and see if there is something new.
+ // On Symbian^3 (only, not earlier or Symbian^4) if the SNAP was not reachable, it
+ // triggers user choice type of activity (EasyWLAN). As a result, a new IAP may be
+ // created, and hence if was not found yet. Therefore update configurations and see if
+ // there is something new.
+
// 1. Update knowledge from the databases.
- engine->requestUpdate();
+ if (thread() != engine->thread())
+ QMetaObject::invokeMethod(engine, "requestUpdate", Qt::BlockingQueuedConnection);
+ else
+ engine->requestUpdate();
+
// 2. Check if new configuration was created during connection creation
QList<QString> knownConfigs = engine->accessPointConfigurationIdentifiers();
#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
@@ -1025,7 +1031,12 @@ QNetworkConfiguration QNetworkSessionPrivateImpl::activeConfiguration(TUint32 ia
} else {
// Check if new (WLAN) IAP was created in IAP/SNAP dialog
// 1. Sync internal configurations array to commsdb first
- engine->updateConfigurations();
+ if (thread() != engine->thread()) {
+ QMetaObject::invokeMethod(engine, "requestUpdate",
+ Qt::BlockingQueuedConnection);
+ } else {
+ engine->requestUpdate();
+ }
// 2. Check if new configuration was created during connection creation
QStringList knownConfigs = engine->accessPointConfigurationIdentifiers();
if (knownConfigs.count() > iKnownConfigsBeforeConnectionStart.count()) {
diff --git a/src/script/script.pro b/src/script/script.pro
index 55217e0..4ee86d7 100644
--- a/src/script/script.pro
+++ b/src/script/script.pro
@@ -79,7 +79,10 @@ INCLUDEPATH += $$PWD
include(script.pri)
-symbian:TARGET.UID3=0x2001B2E1
+symbian {
+ TARGET.UID3=0x2001B2E1
+ LIBS += -lhal
+}
# WebKit doesn't compile in C++0x mode
*-g++*:QMAKE_CXXFLAGS -= -std=c++0x -std=gnu++0x
diff --git a/tests/auto/qinputcontext/tst_qinputcontext.cpp b/tests/auto/qinputcontext/tst_qinputcontext.cpp
index 93813f9..52e655b 100644
--- a/tests/auto/qinputcontext/tst_qinputcontext.cpp
+++ b/tests/auto/qinputcontext/tst_qinputcontext.cpp
@@ -49,6 +49,7 @@
#include <qradiobutton.h>
#include <qwindowsstyle.h>
#include <qdesktopwidget.h>
+#include <qpushbutton.h>
#ifdef Q_OS_SYMBIAN
#include <private/qt_s60_p.h>
@@ -80,6 +81,8 @@ private slots:
void focusProxy();
void symbianTestCoeFepInputContext_data();
void symbianTestCoeFepInputContext();
+ void symbianTestCoeFepAutoCommit_data();
+ void symbianTestCoeFepAutoCommit();
private:
bool m_phoneIsQwerty;
@@ -936,5 +939,126 @@ void tst_QInputContext::symbianTestCoeFepInputContext()
#endif
}
+void tst_QInputContext::symbianTestCoeFepAutoCommit_data()
+{
+#ifdef Q_OS_SYMBIAN
+ QTest::addColumn<Qt::InputMethodHints> ("inputMethodHints");
+ QTest::addColumn<QLineEdit::EchoMode> ("echoMode");
+ QTest::addColumn<QList<FepReplayEvent> > ("keyEvents");
+ QTest::addColumn<QString> ("finalString");
+
+ QList<FepReplayEvent> events;
+
+ events << FepReplayEvent('4', '4', 0, 0);
+ events << FepReplayEvent('4', '4', 0, 0);
+ events << FepReplayEvent('0', '0', 0, 0);
+ events << FepReplayEvent('9', '9', 0, 0);
+ events << FepReplayEvent('6', '6', 0, 0);
+ events << FepReplayEvent('8', '8', 0, 0);
+ QTest::newRow("Numbers")
+ << Qt::InputMethodHints(Qt::ImhDigitsOnly)
+ << QLineEdit::Normal
+ << events
+ << QString("440968");
+ QTest::newRow("Numbers and password")
+ << Qt::InputMethodHints(Qt::ImhDigitsOnly)
+ << QLineEdit::Password
+ << events
+ << QString("440968");
+ QTest::newRow("Multitap")
+ << Qt::InputMethodHints(Qt::ImhPreferLowercase | Qt::ImhNoPredictiveText)
+ << QLineEdit::Normal
+ << events
+ << QString("h wmt");
+ QTest::newRow("T9")
+ << Qt::InputMethodHints(Qt::ImhPreferLowercase)
+ << QLineEdit::Normal
+ << events
+ << QString("hi you");
+ QTest::newRow("Multitap with password")
+ << Qt::InputMethodHints(Qt::ImhPreferLowercase | Qt::ImhNoPredictiveText)
+ << QLineEdit::Password
+ << events
+ << QString("h wmt");
+ QTest::newRow("T9 with password")
+ << Qt::InputMethodHints(Qt::ImhPreferLowercase)
+ << QLineEdit::Password
+ << events
+ << QString("h wmt");
+#endif
+}
+
+void tst_QInputContext::symbianTestCoeFepAutoCommit()
+{
+#ifndef Q_OS_SYMBIAN
+ QSKIP("This is a Symbian-only test", SkipAll);
+#else
+ QCoeFepInputContext *ic = qobject_cast<QCoeFepInputContext *>(qApp->inputContext());
+ if (!ic) {
+ QSKIP("coefep is not the active input context; skipping test", SkipAll);
+ }
+
+ QFETCH(Qt::InputMethodHints, inputMethodHints);
+ QFETCH(QLineEdit::EchoMode, echoMode);
+ QFETCH(QList<FepReplayEvent>, keyEvents);
+ QFETCH(QString, finalString);
+
+ if (m_phoneIsQwerty) {
+ QSKIP("Skipping advanced input method tests on QWERTY phones", SkipSingle);
+ }
+
+ QWidget w;
+ QLayout *layout = new QVBoxLayout;
+ w.setLayout(layout);
+ QLineEdit *lineedit = new QLineEdit;
+ layout->addWidget(lineedit);
+ lineedit->setFocus();
+#ifdef QT_KEYPAD_NAVIGATION
+ lineedit->setEditFocus(true);
+#endif
+ QPushButton *pushButton = new QPushButton("Done");
+ layout->addWidget(pushButton);
+ QAction softkey("Done", &w);
+ softkey.setSoftKeyRole(QAction::PositiveSoftKey);
+ w.addAction(&softkey);
+ w.show();
+
+ lineedit->setInputMethodHints(inputMethodHints);
+ lineedit->setEchoMode(echoMode);
+
+ QTest::qWait(200);
+ foreach(FepReplayEvent event, keyEvents) {
+ event.replay(lineedit);
+ }
+ QApplication::processEvents();
+
+ QTest::mouseClick(pushButton, Qt::LeftButton);
+
+ QCOMPARE(lineedit->text(), finalString);
+ QVERIFY(ic->m_preeditString.isEmpty());
+
+#ifdef Q_WS_S60
+ lineedit->inputContext()->reset();
+ lineedit->clear();
+ lineedit->setFocus();
+#ifdef QT_KEYPAD_NAVIGATION
+ lineedit->setEditFocus(true);
+#endif
+
+ QTest::qWait(200);
+ foreach(FepReplayEvent event, keyEvents) {
+ event.replay(lineedit);
+ }
+ QApplication::processEvents();
+
+ FepReplayEvent(EStdKeyDevice0, EKeyDevice0, 0, 0).replay(lineedit); // Left softkey
+
+ QCOMPARE(lineedit->text(), finalString);
+ QVERIFY(ic->m_preeditString.isEmpty());
+
+#endif // Q_WS_S60
+#endif // Q_OS_SYMBIAN
+}
+
QTEST_MAIN(tst_QInputContext)
#include "tst_qinputcontext.moc"
diff --git a/tests/auto/qurl/tst_qurl.cpp b/tests/auto/qurl/tst_qurl.cpp
index 820e32d..370bd13 100644
--- a/tests/auto/qurl/tst_qurl.cpp
+++ b/tests/auto/qurl/tst_qurl.cpp
@@ -194,6 +194,7 @@ private slots:
void task_199967();
void task_240612();
void taskQTBUG_6962();
+ void taskQTBUG_8701();
#ifdef QT3_SUPPORT
void dirPath();
@@ -3912,5 +3913,17 @@ void tst_QUrl::taskQTBUG_6962()
QCOMPARE(url.authority(), QString());
}
+void tst_QUrl::taskQTBUG_8701()
+{
+ //bug 8701: foo:///bar mangled to foo:/bar
+ QString foo_triple_bar("foo:///bar"), foo_uni_bar("foo:/bar");
+
+ QCOMPARE(foo_triple_bar, QUrl(foo_triple_bar).toString());
+ QCOMPARE(foo_uni_bar, QUrl(foo_uni_bar).toString());
+
+ QCOMPARE(foo_triple_bar, QUrl(foo_triple_bar, QUrl::StrictMode).toString()); // fails
+ QCOMPARE(foo_uni_bar, QUrl(foo_uni_bar, QUrl::StrictMode).toString());
+}
+
QTEST_MAIN(tst_QUrl)
#include "tst_qurl.moc"
diff --git a/tools/qdoc3/test/qt-html-templates.qdocconf b/tools/qdoc3/test/qt-html-templates.qdocconf
index 8d4d27f..ed5ee17 100644
--- a/tools/qdoc3/test/qt-html-templates.qdocconf
+++ b/tools/qdoc3/test/qt-html-templates.qdocconf
@@ -171,5 +171,5 @@ HTML.footer = " <!-- /div -->\n" \
" </form>\n" \
" </div>\n" \
" <div id=\"blurpage\">\n" \
- " </div>\n" \
+ " <!--/div -->\n" \
" </div>\n"
diff --git a/translations/assistant_uk.ts b/translations/assistant_uk.ts
index c7aad83..d08003e 100644
--- a/translations/assistant_uk.ts
+++ b/translations/assistant_uk.ts
@@ -41,7 +41,7 @@
Reason:
%2</source>
- <translation>Не можу зареєструвати файл документації
+ <translation>Не вдалось зареєструвати файл документації
%1
Причина:
@@ -57,7 +57,7 @@ Reason:
Reason:
%2</source>
- <translation>Не можу скасувати реєстрацію файлу документації
+ <translation>Не вдалось скасувати реєстрацію файлу документації
%1
Причина:
@@ -77,7 +77,7 @@ Reason:
</message>
<message>
<source>Cannot load sqlite database driver!</source>
- <translation>Не можу завантажити драйвер бази даних SQLite!</translation>
+ <translation>Неможливо завантажити драйвер бази даних SQLite!</translation>
</message>
</context>
<context>
@@ -108,6 +108,17 @@ Reason:
</message>
</context>
<context>
+ <name>BookmarkItem</name>
+ <message>
+ <source>New Folder</source>
+ <translation>Нова тека</translation>
+ </message>
+ <message>
+ <source>Untitled</source>
+ <translation>Без назви</translation>
+ </message>
+</context>
+<context>
<name>BookmarkManager</name>
<message>
<source>Untitled</source>
@@ -313,6 +324,60 @@ Reason:
<context>
<name>CmdLineParser</name>
<message>
+ <source>Usage: assistant [Options]
+
+-collectionFile file Uses the specified collection
+ file instead of the default one
+-showUrl url Shows the document with the
+ url.
+-enableRemoteControl Enables Assistant to be
+ remotely controlled.
+-show widget Shows the specified dockwidget
+ which can be &quot;contents&quot;, &quot;index&quot;,
+ &quot;bookmarks&quot; or &quot;search&quot;.
+-activate widget Activates the specified dockwidget
+ which can be &quot;contents&quot;, &quot;index&quot;,
+ &quot;bookmarks&quot; or &quot;search&quot;.
+-hide widget Hides the specified dockwidget
+ which can be &quot;contents&quot;, &quot;index&quot;
+ &quot;bookmarks&quot; or &quot;search&quot;.
+-register helpFile Registers the specified help file
+ (.qch) in the given collection
+ file.
+-unregister helpFile Unregisters the specified help file
+ (.qch) from the give collection
+ file.
+-setCurrentFilter filter Set the filter as the active filter.
+-remove-search-index Removes the full text search index.
+-rebuild-search-index Re-builds the full text search index (potentially slow).
+-quiet Does not display any error or
+ status message.
+-help Displays this help.
+</source>
+ <translation>Використання: assistant [Опції]
+
+-collectionFile файл Використати вказаний файл колекції
+ замість типового
+-showUrl URL Показати документ з URL.
+-enableRemoteControl Увімкнути віддалене керування Assistant.
+-show віджет Показати вказаний віджет (може бути:
+ &quot;contents&quot;, &quot;index&quot;, &quot;bookmarks&quot; чи &quot;search&quot;).
+-activate віджет Активувати вказаний віджет (може бути:
+ &quot;contents&quot;, &quot;index&quot;, &quot;bookmarks&quot; чи &quot;search&quot;).
+-hide віджет Сховати вказаний віджет (може бути:
+ &quot;contents&quot;, &quot;index&quot;, &quot;bookmarks&quot; чи &quot;search&quot;).
+-register файлДовідки Зареєструвати вказаний файл довідки
+ (.qch) в даному файлі колекції.
+-unregister файлДовідки Скасувати реєстрацію вказаного файлу довідки
+ (.qch) в даному файлі колекції.
+-setCurrentFilter фільтр Встановити фільтр в якості активного.
+-remove-search-index Видалити повнотекстовий пошуковий індекс.
+-rebuild-search-index Перебудувати повнотекстовий пошуковий індекс (можливо довго).
+-quiet Не показувати жодних помилок чи статусних повідомлень.
+-help Показати цю довідку.
+</translation>
+ </message>
+ <message>
<source>Unknown option: %1</source>
<translation>Невідома опція: %1</translation>
</message>
@@ -487,6 +552,11 @@ Reason:
<source>The attributes for custom filter &apos;%1&apos; are defined multiple times.</source>
<translation>Атрибути для користувацького фільтра &apos;%1&apos; визначено декілька раз.</translation>
</message>
+ <message>
+ <source>unfiltered</source>
+ <comment>list of available documentation</comment>
+ <translation>без фільтра</translation>
+ </message>
</context>
<context>
<name>FindWidget</name>
@@ -513,6 +583,10 @@ Reason:
<source>Converting File</source>
<translation>Конвертування файлу</translation>
</message>
+ <message>
+ <source>Creating the new Qt help files from the old ADP file.</source>
+ <translation>Створення нових файлів довідки Qt зі старого файлу ADP.</translation>
+ </message>
</context>
<context>
<name>FontPanel</name>
@@ -577,6 +651,13 @@ Reason:
</message>
</context>
<context>
+ <name>HelpGenerator</name>
+ <message>
+ <source>Warning: %1</source>
+ <translation>Попередження: %1</translation>
+ </message>
+</context>
+<context>
<name>HelpViewer</name>
<message>
<source>&lt;title&gt;about:blank&lt;/title&gt;</source>
@@ -584,7 +665,7 @@ Reason:
</message>
<message>
<source>&lt;title&gt;Error 404...&lt;/title&gt;&lt;div align=&quot;center&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;h1&gt;The page could not be found&lt;/h1&gt;&lt;br&gt;&lt;h3&gt;&apos;%1&apos;&lt;/h3&gt;&lt;/div&gt;</source>
- <translation>&lt;title&gt;Помилка 404...&lt;/title&gt;&lt;div align=&quot;center&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;h1&gt;Неможливо знайти сторінку&lt;/h1&gt;&lt;br&gt;&lt;h3&gt;&apos;%1&apos;&lt;/h3&gt;&lt;/div&gt;</translation>
+ <translation>&lt;title&gt;Помилка 404...&lt;/title&gt;&lt;div align=&quot;center&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;h1&gt;Не вдалось знайти сторінку&lt;/h1&gt;&lt;br&gt;&lt;h3&gt;&apos;%1&apos;&lt;/h3&gt;&lt;/div&gt;</translation>
</message>
<message>
<source>Copy &amp;Link Location</source>
@@ -600,6 +681,13 @@ Reason:
</message>
</context>
<context>
+ <name>HelpWindow</name>
+ <message>
+ <source>&lt;center&gt;&lt;b&gt;Wizard Assistant&lt;/b&gt;&lt;/center&gt;</source>
+ <translation>&lt;center&gt;&lt;b&gt;Майстер Assistant&lt;/b&gt;&lt;/center&gt;</translation>
+ </message>
+</context>
+<context>
<name>IdentifierPage</name>
<message>
<source>Form</source>
@@ -736,7 +824,7 @@ Reason:
</message>
<message>
<source>Unable to save the file %1: %2.</source>
- <translation>Не можу зберегти файл %1: %2.</translation>
+ <translation>Неможливо зберегти файл %1: %2.</translation>
</message>
<message>
<source>Downloading %1...</source>
@@ -988,6 +1076,10 @@ Reason:
<translation>Не вдалось знайти елемент, пов&apos;язаний зі змістом.</translation>
</message>
<message>
+ <source>&lt;center&gt;&lt;h3&gt;%1&lt;/h3&gt;&lt;p&gt;Version %2&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;</source>
+ <translation>&lt;center&gt;&lt;h3&gt;%1&lt;/h3&gt;&lt;p&gt;Версія %2&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Copyright (C) 2010 Корпорація Nokia та/або її дочірні компанії.&lt;/p&gt;</translation>
+ </message>
+ <message>
<source>About %1</source>
<translation>Про %1</translation>
</message>
@@ -997,7 +1089,7 @@ Reason:
</message>
<message>
<source>Could not register file &apos;%1&apos;: %2</source>
- <translation>Не можу зареєструвати файл &apos;%1&apos;: %2</translation>
+ <translation>Не вдалось зареєструвати файл &apos;%1&apos;: %2</translation>
</message>
</context>
<context>
@@ -1221,45 +1313,20 @@ Do you want to remove it?</source>
</message>
</context>
<context>
- <name>QCLuceneResultWidget</name>
- <message>
- <source>Search Results</source>
- <translation>Результати пошуку</translation>
- </message>
- <message>
- <source>Note:</source>
- <translation>Примітка:</translation>
- </message>
- <message>
- <source>The search results may not be complete since the documentation is still being indexed!</source>
- <translation>Результати пошуку можуть бути не повні, оскільки документація досі індексується!</translation>
- </message>
- <message>
- <source>Your search did not match any documents.</source>
- <translation>Ваш пошук не повернув результатів.</translation>
- </message>
- <message>
- <source>(The reason for this might be that the documentation is still being indexed.)</source>
- <translation>(Причиною цього може бути те, що документація досі індексується.)</translation>
- </message>
-</context>
-<context>
<name>QCollectionGenerator</name>
<message>
<source>Unknown token at line %1.</source>
<translation>Невідомий токен в рядку %1.</translation>
</message>
<message>
- <source>Unknown token at line %1. Expected &quot;QtHelpCollectionProject&quot;!</source>
- <translation>Невідомий токен в рядку %1. Очікувався &quot;QtHelpCollectionProject&quot;!</translation>
+ <source>Missing end tags.</source>
+ <translation>Відсутні кінцеві теги.</translation>
</message>
<message>
- <source>Missing output file name!</source>
- <translation>Відсутнє ім&apos;я вихідного файлу!</translation>
- </message>
- <message>
- <source>Missing collection config file!</source>
- <translation>Відсутній файл налаштувань колекції!</translation>
+ <source>Qt Collection Generator version 1.0 (Qt %1)
+</source>
+ <translation>Qt Collection Generator версії 1.0 (Qt %1)
+</translation>
</message>
<message>
<source>
@@ -1288,209 +1355,92 @@ qcollectiongenerator &lt;файл-налаштувань-колекції&gt; [
</translation>
</message>
-</context>
-<context>
- <name>QHelp</name>
<message>
- <source>Untitled</source>
- <translation>Без назви</translation>
- </message>
-</context>
-<context>
- <name>QHelpCollectionHandler</name>
- <message>
- <source>The collection file &apos;%1&apos; is not set up yet!</source>
- <translation>Файл колекції &apos;%1&apos; ще не встановлено!</translation>
- </message>
- <message>
- <source>Cannot load sqlite database driver!</source>
- <translation>Не можу завантажити драйвер бази даних SQLite!</translation>
- </message>
- <message>
- <source>Cannot open collection file: %1</source>
- <translation>Неможливо відкрити файл колекції: %1</translation>
- </message>
- <message>
- <source>Cannot create tables in file %1!</source>
- <translation>Неможливо створити таблиці в файлі %1!</translation>
- </message>
- <message>
- <source>The collection file &apos;%1&apos; already exists!</source>
- <translation>Файл колекції &apos;%1&apos; вже існує!</translation>
- </message>
- <message>
- <source>Cannot create directory: %1</source>
- <translation>Неможливо створити теку: %1</translation>
- </message>
- <message>
- <source>Cannot copy collection file: %1</source>
- <translation>Неможливо скопіювати файл колекції: %1</translation>
+ <source>Unknown token at line %1. Expected &quot;QtHelpCollectionProject&quot;.</source>
+ <translation>Невідомий токен в рядку %1. Очікувався &quot;QtHelpCollectionProject&quot;.</translation>
</message>
<message>
- <source>Unknown filter &apos;%1&apos;!</source>
- <translation>Невідомий фільтр &apos;%1&apos;!</translation>
+ <source>Missing input or output file for help file generation.</source>
+ <translation>Відсутній вхідний чи вихідний файл для генерації файлу довідки.</translation>
</message>
<message>
- <source>Cannot register filter %1!</source>
- <translation>Неможливо зареєструвати фільтр %1!</translation>
+ <source>Missing output file name.</source>
+ <translation>Відсутнє ім&apos;я вихідного файлу.</translation>
</message>
<message>
- <source>Cannot open documentation file %1!</source>
- <translation>Неможливо відкрити файл документації %1!</translation>
+ <source>Missing collection config file.</source>
+ <translation>Відсутній файл налаштувань колекції.</translation>
</message>
<message>
- <source>Invalid documentation file &apos;%1&apos;!</source>
- <translation>Неправильний файл документації &apos;%1&apos;!</translation>
+ <source>Could not open %1.
+</source>
+ <translation>Не вдалось відкрити %1.
+</translation>
</message>
<message>
- <source>The namespace %1 was not registered!</source>
- <translation>Простір імен %1 не зареєстровано!</translation>
+ <source>Reading collection config file...
+</source>
+ <translation>Читання файлу налаштувань колекції...
+</translation>
</message>
<message>
- <source>Namespace %1 already exists!</source>
- <translation>Простір імен %1 вже існує!</translation>
+ <source>Collection config file error: %1
+</source>
+ <translation>Помилка файлу налаштувань колекції: %1
+</translation>
</message>
<message>
- <source>Cannot register namespace &apos;%1&apos;!</source>
- <translation>Неможливо зареєструвати простір імен &apos;%1&apos;!</translation>
+ <source>Generating help for %1...
+</source>
+ <translation>Генерування довідки для %1...
+</translation>
</message>
<message>
- <source>Cannot open database &apos;%1&apos; to optimize!</source>
- <translation>Неможливо відкрити базу даних &apos;%1&apos; для оптимізації!</translation>
+ <source>Creating collection file...
+</source>
+ <translation>Створення файлу колекції...
+</translation>
</message>
-</context>
-<context>
- <name>QHelpDBReader</name>
<message>
- <source>Cannot open database &apos;%1&apos; &apos;%2&apos;: %3</source>
- <extracomment>The placeholders are: %1 - The name of the database which cannot be opened %2 - The unique id for the connection %3 - The actual error string</extracomment>
- <translation>Неможливо відкрити базу даних: &apos;%1&apos; &apos;%2&apos;: %3</translation>
+ <source>The file %1 cannot be overwritten.
+</source>
+ <translation>Неможливо перезаписати файл %1.
+</translation>
</message>
-</context>
-<context>
- <name>QHelpEngineCore</name>
<message>
- <source>Cannot open documentation file %1: %2!</source>
- <translation>Неможливо файл документації %1: %2!</translation>
+ <source>Cannot open %1.
+</source>
+ <translation>Неможливо відкрити %1.
+</translation>
</message>
<message>
- <source>The specified namespace does not exist!</source>
- <translation>Вказаний простір імен не існує!</translation>
+ <source>Cannot open referenced image file %1.
+</source>
+ <translation>Неможливо відкрити файл зображення %1, на який є посилання.
+</translation>
</message>
</context>
<context>
<name>QHelpGenerator</name>
<message>
- <source>Invalid help data!</source>
- <translation>Неправильні дані довідки!</translation>
- </message>
- <message>
- <source>No output file name specified!</source>
- <translation>Не вказане ім&apos;я вихідного файлу!</translation>
- </message>
- <message>
- <source>The file %1 cannot be overwritten!</source>
- <translation>Неможливо перезаписати файл %1!</translation>
- </message>
- <message>
- <source>Building up file structure...</source>
- <translation>Побудова структури файлу....</translation>
- </message>
- <message>
- <source>Cannot open data base file %1!</source>
- <translation>Неможливо відкрити файл бази даних %1!</translation>
+ <source>Missing output file name.</source>
+ <translation>Відсутнє ім&apos;я вихідного файлу.</translation>
</message>
<message>
- <source>Cannot register namespace %1!</source>
- <translation>Неможливо зареєструвати простір імен %1!</translation>
- </message>
- <message>
- <source>Insert custom filters...</source>
- <translation>Вставка фільтрів користувача...</translation>
- </message>
- <message>
- <source>Insert help data for filter section (%1 of %2)...</source>
- <translation>Вставка даних довідки для розділу фільтра (%1 з %2)...</translation>
- </message>
- <message>
- <source>Documentation successfully generated.</source>
- <translation>Документацію успішно згенеровано.</translation>
- </message>
- <message>
- <source>Some tables already exist!</source>
- <translation>Деякі таблиці вже існують!</translation>
- </message>
- <message>
- <source>Cannot create tables!</source>
- <translation>Неможливо створити таблиці!</translation>
- </message>
- <message>
- <source>Cannot register virtual folder!</source>
- <translation>Неможливо зареєструвати віртуальну теку!</translation>
- </message>
- <message>
- <source>Insert files...</source>
- <translation>Вставка файлів...</translation>
- </message>
- <message>
- <source>The referenced file %1 must be inside or within a subdirectory of (%2). Skipping it.</source>
- <translation>Файл %1 має бути всередині підтеки (%2). Пропускаємо його.</translation>
- </message>
- <message>
- <source>The file %1 does not exist! Skipping it.</source>
- <translation>Файл %1 не існує! Пропускаємо його.</translation>
- </message>
- <message>
- <source>Cannot open file %1! Skipping it.</source>
- <translation>Неможливо відкрити файл %1! Пропускаємо його.</translation>
- </message>
- <message>
- <source>The filter %1 is already registered!</source>
- <translation>Фільтр %1 вже зареєстровано!</translation>
- </message>
- <message>
- <source>Cannot register filter %1!</source>
- <translation>Неможливо зареєструвати фільтр %1!</translation>
- </message>
- <message>
- <source>Insert indices...</source>
- <translation>Вставка індексів...</translation>
- </message>
- <message>
- <source>Insert contents...</source>
- <translation>Вставка змісту...</translation>
- </message>
- <message>
- <source>Cannot insert contents!</source>
- <translation>Неможливо вставити зміст!</translation>
- </message>
- <message>
- <source>Cannot register contents!</source>
- <translation>Неможливо зареєструвати зміст!</translation>
- </message>
- <message>
- <source>File &apos;%1&apos; does not exist.</source>
- <translation>Файл &apos;%1&apos; не існує.</translation>
- </message>
- <message>
- <source>File &apos;%1&apos; cannot be opened.</source>
- <translation>Неможливо відкрити файл &apos;%1&apos;.</translation>
- </message>
- <message>
- <source>File &apos;%1&apos; contains an invalid link to file &apos;%2&apos;</source>
- <translation>Файл &apos;%1&apos; містить неправильне посилання до файлу &apos;%2&apos;</translation>
- </message>
- <message>
- <source>Invalid links in HTML files.</source>
- <translation>Неправильні посилання в файлах HTML.</translation>
+ <source>Qt Help Generator version 1.0 (Qt %1)
+</source>
+ <translation>Qt Help Generator версії 1.0 (Qt %1)
+</translation>
</message>
<message>
- <source>Missing output file name!</source>
- <translation>Відсутнє ім&apos;я вихідного файлу!</translation>
+ <source>Missing Qt help project file.</source>
+ <translation>Відсутній файл проекту колекції довідки Qt.</translation>
</message>
<message>
- <source>Missing Qt help project file!</source>
- <translation>Відсутній файл проекту колекції довідки Qt!</translation>
+ <source>Could not open %1.
+</source>
+ <translation>Не вдалось відкрити %1.
+</translation>
</message>
<message>
<source>
@@ -1524,102 +1474,11 @@ qhelpgenerator &lt;файл-проекту-довідки&gt; [опції]
</translation>
</message>
-</context>
-<context>
- <name>QHelpProject</name>
- <message>
- <source>Unknown token.</source>
- <translation>Невідомий токен.</translation>
- </message>
- <message>
- <source>Unknown token. Expected &quot;QtHelpProject&quot;!</source>
- <translation>Невідомий токен. Очікувався &quot;QtHelpProject&quot;!</translation>
- </message>
- <message>
- <source>Error in line %1: %2</source>
- <translation>Помилка в рядку %1: %2</translation>
- </message>
- <message>
- <source>Virtual folder has invalid syntax.</source>
- <translation>Віртуальна тека має неправильний синтаксис.</translation>
- </message>
- <message>
- <source>Namespace has invalid syntax.</source>
- <translation>Простір імен має неправильний синтаксис.</translation>
- </message>
- <message>
- <source>Missing namespace in QtHelpProject.</source>
- <translation>Відсутній простір імен в QtHelpProject.</translation>
- </message>
- <message>
- <source>Missing virtual folder in QtHelpProject</source>
- <translation>Відсутня віртуальна тека в QtHelpProject</translation>
- </message>
- <message>
- <source>Missing attribute in keyword at line %1.</source>
- <translation>Відсутній атрибут в ключовому слові на рядку %1.</translation>
- </message>
- <message>
- <source>The input file %1 could not be opened!</source>
- <translation>Неможливо відкрити вхідний файл %1!</translation>
- </message>
-</context>
-<context>
- <name>QHelpSearchQueryWidget</name>
- <message>
- <source>Search for:</source>
- <translation>Шукати:</translation>
- </message>
<message>
- <source>Previous search</source>
- <translation>Попередній пошук</translation>
- </message>
- <message>
- <source>Next search</source>
- <translation>Наступний пошук</translation>
- </message>
- <message>
- <source>Search</source>
- <translation>Пошук</translation>
- </message>
- <message>
- <source>Advanced search</source>
- <translation>Розширений пошук</translation>
- </message>
- <message>
- <source>words &lt;B&gt;similar&lt;/B&gt; to:</source>
- <translation>слова &lt;B&gt;схожі&lt;/B&gt; на:</translation>
- </message>
- <message>
- <source>&lt;B&gt;without&lt;/B&gt; the words:</source>
- <translation>&lt;B&gt;без&lt;/B&gt; слів:</translation>
- </message>
- <message>
- <source>with &lt;B&gt;exact phrase&lt;/B&gt;:</source>
- <translation>з &lt;B&gt;точною фразою&lt;/B&gt;:</translation>
- </message>
- <message>
- <source>with &lt;B&gt;all&lt;/B&gt; of the words:</source>
- <translation>з &lt;B&gt;усіма&lt;/B&gt; словами:</translation>
- </message>
- <message>
- <source>with &lt;B&gt;at least one&lt;/B&gt; of the words:</source>
- <translation>з &lt;B&gt;щонайменше одним&lt;/B&gt; зі слів:</translation>
- </message>
-</context>
-<context>
- <name>QHelpSearchResultWidget</name>
- <message numerus="yes">
- <source>%1 - %2 of %n Hits</source>
- <translation>
- <numerusform>%1 - %2 з %n збігу</numerusform>
- <numerusform>%1 - %2 з %n збігів</numerusform>
- <numerusform>%1 - %2 з %n збігів</numerusform>
- </translation>
- </message>
- <message>
- <source>0 - 0 of 0 Hits</source>
- <translation>0 - 0 of 0 збігів</translation>
+ <source>Could not create output directory: %1
+</source>
+ <translation>Не вдалось створити вихідну теку: %1
+</translation>
</message>
</context>
<context>
diff --git a/translations/designer_uk.ts b/translations/designer_uk.ts
index ae27e67..12e60e6 100644
--- a/translations/designer_uk.ts
+++ b/translations/designer_uk.ts
@@ -25,6 +25,49 @@
</message>
</context>
<context>
+ <name>AbstractItemEditor</name>
+ <message>
+ <source>Selectable</source>
+ <translation>Можна вибирати</translation>
+ </message>
+ <message>
+ <source>Editable</source>
+ <translation>Можна редагувати</translation>
+ </message>
+ <message>
+ <source>DragEnabled</source>
+ <translation>Можна тягти</translation>
+ </message>
+ <message>
+ <source>DropEnabled</source>
+ <translation>Можна кидати</translation>
+ </message>
+ <message>
+ <source>UserCheckable</source>
+ <translation>Користувач може позначати</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <translation>Увімкнено</translation>
+ </message>
+ <message>
+ <source>Tristate</source>
+ <translation>Три стани</translation>
+ </message>
+ <message>
+ <source>Unchecked</source>
+ <translation>Не позначено</translation>
+ </message>
+ <message>
+ <source>PartiallyChecked</source>
+ <translation>Частково позначено</translation>
+ </message>
+ <message>
+ <source>Checked</source>
+ <translation>Позначено</translation>
+ </message>
+</context>
+<context>
<name>AddLinkDialog</name>
<message>
<source>Insert Link</source>
@@ -62,7 +105,7 @@
</message>
<message>
<source>The font file &apos;%1&apos; could not be loaded.</source>
- <translation>Неможливо завантажити файл шрифт &apos;%1&apos;.</translation>
+ <translation>Не вдалось завантажити файл шрифт &apos;%1&apos;.</translation>
</message>
<message>
<source>&apos;%1&apos; is not a valid font id.</source>
@@ -74,7 +117,7 @@
</message>
<message>
<source>The font &apos;%1&apos; (%2) could not be unloaded.</source>
- <translation>Неможливо вивантажити шрифт &apos;%1&apos; (%2).</translation>
+ <translation>Не вдалось вивантажити шрифт &apos;%1&apos; (%2).</translation>
</message>
</context>
<context>
@@ -639,7 +682,7 @@
</message>
<message>
<source>The converted file could not be read.</source>
- <translation>Неможливо прочитати конвертований файл.</translation>
+ <translation>Не вдалось прочитати конвертований файл.</translation>
</message>
<message>
<source>This file was created using Designer from Qt-%1 and will be converted to a new form by Qt Designer.</source>
@@ -652,7 +695,7 @@
<message>
<source>This file was created using Designer from Qt-%1 and could not be read:
%2</source>
- <translation>Неможливо прочитати файл, бо його було створено з використанням Designer з Qt-%1:
+ <translation>Не вдалось прочитати файл, бо його було створено з використанням Designer з Qt-%1:
%2</translation>
</message>
<message>
@@ -672,14 +715,14 @@
</message>
<message>
<source>&apos;%1&apos; could not be converted to an enumeration value of type &apos;%2&apos;.</source>
- <translation>Неможливо сконвертувати &apos;%1&apos;до типу значень переліку &apos;%2&apos;.</translation>
+ <translation>Не вдалось сконвертувати &apos;%1&apos;до типу значень переліку &apos;%2&apos;.</translation>
</message>
</context>
<context>
<name>DesignerMetaFlags</name>
<message>
<source>&apos;%1&apos; could not be converted to a flag value of type &apos;%2&apos;.</source>
- <translation>&apos;%1&apos; не можу бути сконвертовано до прапорця типу &apos;%2&apos;.</translation>
+ <translation>Не вдалось перетворити &apos;%1&apos; прапорця типу &apos;%2&apos;.</translation>
</message>
</context>
<context>
@@ -721,7 +764,7 @@
<name>DeviceSkin</name>
<message>
<source>The image file &apos;%1&apos; could not be loaded.</source>
- <translation>Неможливо завантажити файл зображення &apos;%1&apos;.</translation>
+ <translation>Не вдалось завантажити файл зображення &apos;%1&apos;.</translation>
</message>
<message>
<source>The skin directory &apos;%1&apos; does not contain a configuration file.</source>
@@ -729,11 +772,11 @@
</message>
<message>
<source>The skin configuration file &apos;%1&apos; could not be opened.</source>
- <translation>Неможливо відкрити файл налаштувань &apos;%1&apos;.</translation>
+ <translation>Не вдалось відкрити файл налаштувань &apos;%1&apos;.</translation>
</message>
<message>
<source>The skin configuration file &apos;%1&apos; could not be read: %2</source>
- <translation>Неможливо прочитати файл налаштувань &apos;%1&apos;: %2</translation>
+ <translation>Не вдалось прочитати файл налаштувань &apos;%1&apos;: %2</translation>
</message>
<message>
<source>Syntax error: %1</source>
@@ -1044,11 +1087,11 @@ Parsing grid layout minimum size values</extracomment>
</message>
<message>
<source>A temporary form file could not be created in %1.</source>
- <translation>Неможливо створити тимчасовий файл форми в %1.</translation>
+ <translation>Не вдалось створити тимчасовий файл форми в %1.</translation>
</message>
<message>
<source>The temporary form file %1 could not be written.</source>
- <translation>Неможливо записати тимчасовий файл форми %1.</translation>
+ <translation>Не вдалось записати тимчасовий файл форми %1.</translation>
</message>
</context>
<context>
@@ -1179,7 +1222,7 @@ This indicates an inconsistency in the ui-file.</source>
</message>
<message>
<source>While applying tab stops: The widget &apos;%1&apos; could not be found.</source>
- <translation>Під час застосування позицій табуляції: Неможливо знайти віджет &apos;%1&apos;.</translation>
+ <translation>Під час застосування позицій табуляції: Не вдалось знайти віджет &apos;%1&apos;.</translation>
</message>
<message>
<source>Invalid QButtonGroup reference &apos;%1&apos; referenced by &apos;%2&apos;.</source>
@@ -1464,13 +1507,13 @@ Do you want to update the file location or generate a new form?</source>
</message>
<message>
<source>Could not open file</source>
- <translation>Неможливо відкрити файл</translation>
+ <translation>Не вдалось відкрити файл</translation>
</message>
<message>
<source>The file %1 could not be opened.
Reason: %2
Would you like to retry or select a different file?</source>
- <translation>Неможливо відкрити файл %1.
+ <translation>Не вдалось відкрити файл %1.
Причина: %2
Чи не хотіли б ви спробувати ще раз чи вибрати інший файл?</translation>
</message>
@@ -1480,7 +1523,7 @@ Would you like to retry or select a different file?</source>
</message>
<message>
<source>Could not write file</source>
- <translation>Неможливо записати файл</translation>
+ <translation>Не вдалось записати файл</translation>
</message>
<message>
<source>It was not possible to write the entire file %1 to disk.
@@ -1500,15 +1543,15 @@ Would you like to retry?</source>
</message>
<message>
<source>The backup file %1 could not be written.</source>
- <translation>Неможливо записати файл резервної копії %1.</translation>
+ <translation>Не вдалось записати файл резервної копії %1.</translation>
</message>
<message>
<source>The backup directory %1 could not be created.</source>
- <translation>Неможливо створити теку резервних копій %1.</translation>
+ <translation>Не вдалось створити теку резервних копій %1.</translation>
</message>
<message>
<source>The temporary backup directory %1 could not be created.</source>
- <translation>Неможливо створити тимчасову теку резервних копій %1.</translation>
+ <translation>Не вдалось створити тимчасову теку резервних копій %1.</translation>
</message>
<message>
<source>Preview failed</source>
@@ -1528,7 +1571,7 @@ Would you like to retry?</source>
</message>
<message>
<source>The file %1 could not be written.</source>
- <translation>Неможливо записати файл %1.</translation>
+ <translation>Не вдалось записати файл %1.</translation>
</message>
<message>
<source>Please close all forms to enable the loading of additional fonts.</source>
@@ -1735,7 +1778,7 @@ Container pages should only be added by specifying them in XML returned by the d
<name>QDesignerSharedSettings</name>
<message>
<source>The template path %1 could not be created.</source>
- <translation>Неможливо створити шлях до шаблону %1.</translation>
+ <translation>Не вдалось створити шлях до шаблону %1.</translation>
</message>
<message>
<source>An error has been encountered while parsing device profile XML: %1</source>
@@ -1845,7 +1888,7 @@ Container pages should only be added by specifying them in XML returned by the d
</message>
<message>
<source>The file &lt;b&gt;%1&lt;/b&gt; could not be opened.</source>
- <translation>Неможливо відкрити файл &lt;b&gt;%1&lt;/b&gt;.</translation>
+ <translation>Не вдалось відкрити файл &lt;b&gt;%1&lt;/b&gt;.</translation>
</message>
<message>
<source>The file &lt;b&gt;%1&lt;/b&gt; is not a valid Designer UI file.</source>
@@ -1877,11 +1920,11 @@ Empty class name passed to widget factory method</extracomment>
</message>
<message>
<source>The set-type property %1 could not be read.</source>
- <translation>Неможливо прочитати властивість %1 типу &quot;множина&quot;.</translation>
+ <translation>Не вдалось прочитати властивість %1 типу &quot;множина&quot;.</translation>
</message>
<message>
<source>The enumeration-type property %1 could not be read.</source>
- <translation>Неможливо прочитати властивість %1 типу &quot;перелік&quot;.</translation>
+ <translation>Не вдалось прочитати властивість %1 типу &quot;перелік&quot;.</translation>
</message>
<message>
<source>Reading properties of the type %1 is not supported yet.</source>
@@ -1889,7 +1932,7 @@ Empty class name passed to widget factory method</extracomment>
</message>
<message>
<source>The property %1 could not be written. The type %2 is not supported yet.</source>
- <translation>Неможливо записати властивість %1. Тип %2 ще не підтримується.</translation>
+ <translation>Не вдалось записати властивість %1. Тип %2 ще не підтримується.</translation>
</message>
<message>
<source>The enumeration-value &apos;%1&apos; is invalid. The default value &apos;%2&apos; will be used instead.</source>
@@ -2513,6 +2556,10 @@ Empty class name passed to widget factory method</extracomment>
<context>
<name>QtLocalePropertyManager</name>
<message>
+ <source>&lt;Invalid&gt;</source>
+ <translation>&lt;Неправильний&gt;</translation>
+ </message>
+ <message>
<source>%1, %2</source>
<translation>%1, %2</translation>
</message>
@@ -2740,14 +2787,14 @@ This could for example be a language extension like &quot;_de&quot;.</source>
</message>
<message>
<source>Could not overwrite %1.</source>
- <translation>Неможливо перезаписати %1.</translation>
+ <translation>Не вдалось перезаписати %1.</translation>
</message>
<message>
<source>Could not copy
%1
to
%2</source>
- <translation>Неможливо копіювати
+ <translation>Не вдалось скопіювати
%1
до
%2</translation>
@@ -2764,7 +2811,7 @@ to
</message>
<message>
<source>Could not write %1: %2</source>
- <translation>Неможливо записати %1: %2</translation>
+ <translation>Не вдалось записати %1: %2</translation>
</message>
<message>
<source>Edit Resources</source>
@@ -3480,11 +3527,11 @@ Do you want overwrite the template?</source>
</message>
<message>
<source>A temporary form file could not be created in %1.</source>
- <translation>Неможливо створити тимчасовий файл форми в %1.</translation>
+ <translation>Не вдалось створити тимчасовий файл форми в %1.</translation>
</message>
<message>
<source>The temporary form file %1 could not be written.</source>
- <translation>Неможливо записати тимчасовий файл форми %1.</translation>
+ <translation>Не вдалось записати тимчасовий файл форми %1.</translation>
</message>
<message>
<source>%1 - [Code]</source>
@@ -3500,11 +3547,11 @@ Do you want overwrite the template?</source>
</message>
<message>
<source>The file %1 could not be opened: %2</source>
- <translation>Неможливо відкрити файл %1: %2</translation>
+ <translation>Не вдалось відкрити файл %1: %2</translation>
</message>
<message>
<source>The file %1 could not be written: %2</source>
- <translation>Неможливо записати файл %1: %2</translation>
+ <translation>Не вдалось записати файл %1: %2</translation>
</message>
<message>
<source>%1 - Error</source>
@@ -3951,7 +3998,7 @@ Do you want overwrite the template?</source>
</message>
<message>
<source>Cannot paste widgets. Designer could not find a container without a layout to paste into.</source>
- <translation>Неможливо вставити віджети. Qt Designer не зміг знайти контейнер без розташування для вставки.</translation>
+ <translation>Неможливо вставити віджети. Qt Designer&apos;у не вдалось знайти контейнер без розташування для вставки.</translation>
</message>
<message>
<source>Break the layout of the container you want to paste into, select this container and then paste again.</source>
@@ -4150,7 +4197,7 @@ Do you want overwrite the template?</source>
<message>
<source>Could not create form preview</source>
<comment>Title of warning message box</comment>
- <translation>Неможливо створити попередній перегляд форми</translation>
+ <translation>Не вдалось створити попередній перегляд форми</translation>
</message>
<message>
<source>Form Settings - %1</source>
@@ -4225,7 +4272,7 @@ Do you want overwrite the template?</source>
</message>
<message>
<source>The file &apos;%1&apos; could not be read: %2</source>
- <translation>Неможливо прочитати файл &apos;%1&apos;: %2</translation>
+ <translation>Не вдалось прочитати файл &apos;%1&apos;: %2</translation>
</message>
<message>
<source>Choose a Pixmap</source>
@@ -4740,8 +4787,16 @@ Please select another name.</source>
<translation>Шукати нові встановлені додатки користувацьких віджетів.</translation>
</message>
<message>
+ <source>Loaded Plugins</source>
+ <translation>Завантажені додатки</translation>
+ </message>
+ <message>
+ <source>Failed Plugins</source>
+ <translation>Проблемні додатки</translation>
+ </message>
+ <message>
<source>Qt Designer couldn&apos;t find any plugins</source>
- <translation>Qt Designer не зміг знайти жодного додатку</translation>
+ <translation>Qt Designer&apos;у не вдалось знайти жодного додатку</translation>
</message>
<message>
<source>Qt Designer found the following plugins</source>
@@ -5014,7 +5069,7 @@ Class: %2</source>
</message>
<message>
<source>The specified qrc file &lt;p&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/p&gt;&lt;p&gt;could not be found. Do you want to update the file location?&lt;/p&gt;</source>
- <translation>Неможливо знайти вказаний файл qrc &lt;p&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/p&gt;&lt;p&gt;. Бажаєте оновити розташування файлу?&lt;/p&gt;</translation>
+ <translation>Не вдалось знайти вказаний файл qrc &lt;p&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/p&gt;&lt;p&gt;. Бажаєте оновити розташування файлу?&lt;/p&gt;</translation>
</message>
<message>
<source>New location for %1</source>
@@ -5152,7 +5207,7 @@ Class: %2</source>
</message>
<message>
<source>A widget element could not be found.</source>
- <translation>Неможливо знайти елемент віджета.</translation>
+ <translation>Не вдалось знайти елемент віджета.</translation>
</message>
</context>
<context>
@@ -5741,7 +5796,7 @@ Class: %2</source>
</message>
<message>
<source>The current page of the container &apos;%1&apos; (%2) could not be determined while creating a layout.This indicates an inconsistency in the ui-file, probably a layout being constructed on a container widget.</source>
- <translation>Неможливо визначити поточну сторінку контейнера &apos;%1&apos; (%2) під час створення розташування. Це вказує на некоректність файлу UI, можливо, розташування було створене на контейнерному віджеті.</translation>
+ <translation>Не вдалось визначити поточну сторінку контейнера &apos;%1&apos; (%2) під час створення розташування. Це вказує на некоректність файлу UI, можливо, розташування було створене на контейнерному віджеті.</translation>
</message>
<message>
<source>Attempt to add a layout to a widget &apos;%1&apos; (%2) which already has an unmanaged layout of type %3.
diff --git a/translations/linguist_uk.ts b/translations/linguist_uk.ts
index 6e58be5..ca326d6 100644
--- a/translations/linguist_uk.ts
+++ b/translations/linguist_uk.ts
@@ -113,7 +113,7 @@ Will assume a single universal form.</source>
</message>
<message>
<source>Cannot create &apos;%2&apos;: %1</source>
- <translation>Не можу створити &apos;%2&apos;: %1</translation>
+ <translation>Неможливо створити &apos;%2&apos;: %1</translation>
</message>
<message>
<source>Universal Form</source>
@@ -259,6 +259,186 @@ Will assume a single universal form.</source>
</message>
</context>
<context>
+ <name>LConvert</name>
+ <message>
+ <source>
+Usage:
+ lconvert [options] &lt;infile&gt; [&lt;infile&gt;...]
+
+lconvert is part of Qt&apos;s Linguist tool chain. It can be used as a
+stand-alone tool to convert and filter translation data files.
+The following file formats are supported:
+
+%1
+If multiple input files are specified, they are merged with
+translations from later files taking precedence.
+
+Options:
+ -h
+ --help Display this information and exit.
+
+ -i &lt;infile&gt;
+ --input-file &lt;infile&gt;
+ Specify input file. Use if &lt;infile&gt; might start with a dash.
+ This option can be used several times to merge inputs.
+ May be &apos;-&apos; (standard input) for use in a pipe.
+
+ -o &lt;outfile&gt;
+ --output-file &lt;outfile&gt;
+ Specify output file. Default is &apos;-&apos; (standard output).
+
+ -if &lt;informat&gt;
+ --input-format &lt;format&gt;
+ Specify input format for subsequent &lt;infile&gt;s.
+ The format is auto-detected from the file name and defaults to &apos;ts&apos;.
+
+ -of &lt;outformat&gt;
+ --output-format &lt;outformat&gt;
+ Specify output format. See -if.
+
+ --input-codec &lt;codec&gt;
+ Specify encoding for QM and PO input files. Default is &apos;Latin1&apos;
+ for QM and &apos;UTF-8&apos; for PO files. UTF-8 is always tried as well for
+ QM, corresponding to the possible use of the trUtf8() function.
+
+ --output-codec &lt;codec&gt;
+ Specify encoding for PO output files. Default is &apos;UTF-8&apos;.
+
+ --drop-tags &lt;regexp&gt;
+ Drop named extra tags when writing TS or XLIFF files.
+ May be specified repeatedly.
+
+ --drop-translations
+ Drop existing translations and reset the status to &apos;unfinished&apos;.
+ Note: this implies --no-obsolete.
+
+ --source-language &lt;language&gt;[_&lt;region&gt;]
+ Specify/override the language of the source strings. Defaults to
+ POSIX if not specified and the file does not name it yet.
+
+ --target-language &lt;language&gt;[_&lt;region&gt;]
+ Specify/override the language of the translation.
+ The target language is guessed from the file name if this option
+ is not specified and the file contents name no language yet.
+
+ --no-obsolete
+ Drop obsolete messages.
+
+ --no-finished
+ Drop finished messages.
+
+ --sort-contexts
+ Sort contexts in output TS file alphabetically.
+
+ --locations {absolute|relative|none}
+ Override how source code references are saved in TS files.
+ Default is absolute.
+
+ --no-ui-lines
+ Drop line numbers from references to UI files.
+
+ --verbose
+ be a bit more verbose
+
+Long options can be specified with only one leading dash, too.
+
+Return value:
+ 0 on success
+ 1 on command line parse failures
+ 2 on read failures
+ 3 on write failures
+</source>
+ <translation>
+Використання:
+ lconvert [опції] &lt;вхідний_файл&gt; [&lt;вхідний_файл&gt;...]
+
+lconvert - це частина набору програм Qt Linguist. Вона може використовуватись,
+як окремий інструмент, для конвертування та фільтрування файлів перекладу.
+Підтримуються наступні формати файлів:
+
+%1
+Якщо вказано декілька вхідних файлів, то вони об&apos;єднується з перекладами з
+попередньо вказаних файлів з урахуванням порядку задання.
+
+Опції:
+ -h
+ --help Показати цю інформацію та вийти.
+
+ -i &lt;вхідний_файл&gt;
+ --input-file &lt;вхідний_файл&gt;
+ Вказати вхідний файл. Використовуйте, якщо &lt;вхідний_файл&gt;
+ починається з дефіса. Ця опція може бути використана декілька
+ раз, щоб об&apos;єднати вхідні дані.
+ Може бути &apos;-&apos; (стандартний вхід) для використання в конвеєрі.
+
+ -o &lt;вихідний_файл&gt;
+ --output-file &lt;вихідний_файл&gt;
+ Вказати вихідний файл. Типово - &apos;-&apos; (стандартний вихід).
+
+ -if &lt;формат&gt;
+ --input-format &lt;формат&gt;
+ Вказати вхідний формат для наступних &lt;вхідних_файлів&gt;.
+ Формат автоматично визначається з імені файлу. Типово - &apos;ts&apos;.
+
+ -of &lt;формат&gt;
+ --output-format &lt;формат&gt;
+ Вказати вихідний формат. Дивіться -if.
+
+ --input-codec &lt;кодек&gt;
+ Вказати кодування для вхідних файлів QM та PO. Типово - &apos;Latin1&apos;
+ для QM та &apos;UTF-8&apos; файлів PO. Для QM також здійснюється спроба
+ використати UTF-8, відповідно до можливого застосування функції trUtf8().
+
+ --output-codec &lt;кодек&gt;
+ Вказати кодування для вихідних файлів PO. Типово - &apos;UTF-8&apos;.
+
+ --drop-tags &lt;регулярний_вираз&gt;
+ Видалити вказані додаткові теги під час запису файлів TS чи XLIFF.
+ Може вказуватись декілька раз.
+
+ --drop-translations
+ Видаляти існуючі переклади та скидати статус в &apos;незавершений&apos;.
+ Примітка: це включає --no-obsolete.
+
+ --source-language &lt;мова&gt;[_&lt;регіон&gt;]
+ Вказати/замінити мову оригінальних рядків. Типово - POSIX,
+ якщо не вказано та не встановлено в файлі.
+
+ --target-language &lt;мова&gt;[_&lt;регіон&gt;]
+ Вказати/замінити мову перекладу.
+ Якщо ця опція не вказана і у вмісті файлу мова не задана, то
+ мова перекладу вгадується з імені файлу.
+
+ --no-obsolete
+ Відкинути застарілі повідомлення.
+
+ --no-finished
+ Відкинути завершені повідомлення.
+
+ --sort-contexts
+ Сортувати контексти в вихідному файлі TS за абеткою.
+
+ --locations {absolute|relative|none}
+ Замінити як посилання на код зберігаються в файлі TS.
+ Типово - абсолютно.
+
+ --no-ui-lines
+ Видалити номери рядків з посилань на файли UI.
+
+ --verbose
+ бути трохи більш детальним
+
+Довгі опції також можуть вказуватись лише з одним дефісом.
+
+Коди повернення:
+ 0 при успіху
+ 1 при помилці розбору командного рядка
+ 2 при помилках читання
+ 3 при помилках запису
+</translation>
+ </message>
+</context>
+<context>
<name>LRelease</name>
<message numerus="yes">
<source>Dropped %n message(s) which had no ID.</source>
@@ -292,10 +472,231 @@ Will assume a single universal form.</source>
<numerusform> Зігноровано %n неперекладених оригінальних текстів</numerusform>
</translation>
</message>
+ <message>
+ <source>Usage:
+ lrelease [options] project-file
+ lrelease [options] ts-files [-qm qm-file]
+
+lrelease is part of Qt&apos;s Linguist tool chain. It can be used as a
+stand-alone tool to convert XML-based translations files in the TS
+format into the &apos;compiled&apos; QM format used by QTranslator objects.
+
+Options:
+ -help Display this information and exit
+ -idbased
+ Use IDs instead of source strings for message keying
+ -compress
+ Compress the QM files
+ -nounfinished
+ Do not include unfinished translations
+ -removeidentical
+ If the translated text is the same as
+ the source text, do not include the message
+ -markuntranslated &lt;prefix&gt;
+ If a message has no real translation, use the source text
+ prefixed with the given string instead
+ -silent
+ Do not explain what is being done
+ -version
+ Display the version of lrelease and exit
+</source>
+ <translation>Використання:
+ lrelease [опції] файл-проект
+ lrelease [опції] файли-ts [-qm файл-qm]
+
+lrelease - це частина набору програм Qt Linguist. Вона може використовуватися
+як окремий засіб для перетворення файлів перекладу на базі XML в форматі TS
+до &apos;скомпільованого&apos; формату QM, що використовується об&apos;єктами QTranslator.
+
+Опції:
+ -help Показати цю інформацію та вийти
+ -idbased
+ Використовувати ID замість рядків оригіналу як ключі повідомлень
+ -compress
+ Стискати файли QM
+ -nounfinished
+ Не включати незавершені переклади
+ -removeidentical
+ Якщо перекладений текст однаковий з оригіналом, то
+ не включати повідомлення
+ -markuntranslated &lt;prefix&gt;
+ If a message has no real translation, use the source text
+ prefixed with the given string instead
+ -silent
+ Не пояснювати, що відбувається
+ -version
+ Показати версію lrelease та вийти
+</translation>
+ </message>
+ <message>
+ <source>lrelease error: %1</source>
+ <translation>помилка lrelease: %1</translation>
+ </message>
+ <message>
+ <source>Updating &apos;%1&apos;...
+</source>
+ <translation>Оновлюю &apos;%1&apos;...
+</translation>
+ </message>
+ <message>
+ <source>Removing translations equal to source text in &apos;%1&apos;...
+</source>
+ <translation>Видалення перекладів однакових з оригінальним текстом в &apos;%1&apos;...
+</translation>
+ </message>
+ <message>
+ <source>lrelease error: cannot create &apos;%1&apos;: %2
+</source>
+ <translation>помилка lrelease: неможливо створити &apos;%1&apos;: %2
+</translation>
+ </message>
+ <message>
+ <source>lrelease error: cannot save &apos;%1&apos;: %2</source>
+ <translation>помилка lrelease: неможливо зберегти &apos;%1&apos;: %2
+</translation>
+ </message>
+ <message>
+ <source>lrelease version %1
+</source>
+ <translation>lrelease версії %1
+</translation>
+ </message>
+ <message>
+ <source>lrelease error: cannot read project file &apos;%1&apos;.
+</source>
+ <translation>помилка lrelease: неможливо прочитати файл проекту &apos;%1&apos;.
+</translation>
+ </message>
+ <message>
+ <source>lrelease error: cannot process project file &apos;%1&apos;.
+</source>
+ <translation>помилка lrelease: неможливо обробити файл проекту &apos;%1&apos;.
+</translation>
+ </message>
+ <message>
+ <source>lrelease warning: Met no &apos;TRANSLATIONS&apos; entry in project file &apos;%1&apos;
+</source>
+ <translation>попередження lrelease: в файлу проекту &apos;%1&apos; не знайдено елементу &apos;TRANSLATIONS&apos;
+</translation>
+ </message>
</context>
<context>
<name>LUpdate</name>
<message>
+ <source>Usage:
+ lupdate [options] [project-file]...
+ lupdate [options] [source-file|path|@lst-file]... -ts ts-files|@lst-file
+
+lupdate is part of Qt&apos;s Linguist tool chain. It extracts translatable
+messages from Qt UI files, C++, Java and JavaScript/QtScript source code.
+Extracted messages are stored in textual translation source files (typically
+Qt TS XML). New and modified messages can be merged into existing TS files.
+
+Options:
+ -help Display this information and exit.
+ -no-obsolete
+ Drop all obsolete strings.
+ -extensions &lt;ext&gt;[,&lt;ext&gt;]...
+ Process files with the given extensions only.
+ The extension list must be separated with commas, not with whitespace.
+ Default: &apos;%1&apos;.
+ -pluralonly
+ Only include plural form messages.
+ -silent
+ Do not explain what is being done.
+ -no-sort
+ Do not sort contexts in TS files.
+ -no-recursive
+ Do not recursively scan the following directories.
+ -recursive
+ Recursively scan the following directories (default).
+ -I &lt;includepath&gt; or -I&lt;includepath&gt;
+ Additional location to look for include files.
+ May be specified multiple times.
+ -locations {absolute|relative|none}
+ Specify/override how source code references are saved in TS files.
+ Default is absolute.
+ -no-ui-lines
+ Do not record line numbers in references to UI files.
+ -disable-heuristic {sametext|similartext|number}
+ Disable the named merge heuristic. Can be specified multiple times.
+ -pro &lt;filename&gt;
+ Name of a .pro file. Useful for files with .pro file syntax but
+ different file suffix. Projects are recursed into and merged.
+ -source-language &lt;language&gt;[_&lt;region&gt;]
+ Specify the language of the source strings for new files.
+ Defaults to POSIX if not specified.
+ -target-language &lt;language&gt;[_&lt;region&gt;]
+ Specify the language of the translations for new files.
+ Guessed from the file name if not specified.
+ -ts &lt;ts-file&gt;...
+ Specify the output file(s). This will override the TRANSLATIONS
+ and nullify the CODECFORTR from possibly specified project files.
+ -codecfortr &lt;codec&gt;
+ Specify the codec assumed for tr() calls. Effective only with -ts.
+ -version
+ Display the version of lupdate and exit.
+ @lst-file
+ Read additional file names (one per line) from lst-file.
+</source>
+ <translation>Використання:
+ lupdate [опції] [файл-проект]...
+ lupdate [опції] [вхідний-файл|шлях|@файл-список]... -ts ts-файли|@файл-список
+
+lupdate - це частина набору програм Qt Linguist. Вона It витягає придатні для перекладу
+повідомлення з файлів Qt UI, коду C++, Java та JavaScript/QtScript. Витягнуті повідомлення
+зберігаються в текстовому файлі перекладу (типово Qt TS XML). Нові та модифіковані
+повідомлення можуть бути об&apos;єднанні з існуючими файлами TS.
+
+Опції:
+ -help Показати цю інформацію та вийти.
+ -no-obsolete
+ Видалити всі застарілі рядки.
+ -extensions &lt;розширення&gt;[,&lt;розширення&gt;]...
+ Обробляти файли лише з вказаними розширеннями.
+ Список розширень має розділюватись комами, а не пропусками.
+ Типово: &apos;%1&apos;.
+ -pluralonly
+ Включати лише повідомлення з формою множини.
+ -silent
+ Не пояснювати, що відбувається.
+ -no-sort
+ Не сортувати контексти в файлах TS.
+ -no-recursive
+ Не сканувати рекурсивно наступні теки.
+ -recursive
+ Рекурсивно сканувати наступні теки (типово).
+ -I &lt;шлях-включення&gt; або -I&lt;шлях-включення&gt;
+ Додаткові місця для пошуку файлів включення.
+ Може бути вказано декілька разів.
+ -locations {absolute|relative|none}
+ Вказати/замістити як посилання на код зберігаються в файлі TS.
+ Типово - абсолютно.
+ -no-ui-lines
+ Не записувати номери рядків в посиланнях на файли UI.
+ -disable-heuristic {sametext|similartext|number}
+ Вимкнути вказану евристику об&apos;єдання. Може бути вказано декілька разів.
+ -pro &lt;ім&apos;я-файлу&gt;
+ Ім&apos;я .pro файлу. Корисно для файлів із синтаксисом фалів .pro, але з
+ іншим розширенням. Projects are recursed into and merged.
+ -source-language &lt;мова&gt;[_&lt;регіон&gt;]
+ Вказати мову оригінальних рядків для нових файлів.
+ Типово, якщо не вказано - POSIX.
+ -target-language &lt;мова&gt;[_&lt;регіон&gt;]
+ Вказати мову перекладу для нових файлів.
+ Вгадується з імені файла, якщо не вказано.
+ -ts &lt;файл-ts&gt;...
+ Вказати вихідний файл(и). Це замістить TRANSLATIONS
+ та скине CODECFORTR з, можливо, вказаних файлів проекту.
+ -codecfortr &lt;кодек&gt;
+ Вказати кодек, що Specify the codec вживається для викликів tr(). Ефективно лише з -ts.
+ -version
+ Показати версію lupdate та вийти.
+ @файл-список
+ Читати додаткові імена файлів (одне на рядок) з файла-списку.
+</translation>
+ </message>
+ <message>
<source>lupdate warning: Codec for tr() &apos;%1&apos; disagrees with existing file&apos;s codec &apos;%2&apos;. Expect trouble.
</source>
<translation>попередження lupdate: Кодек для tr() &apos;%1&apos; не узгоджується з існуючим кодеком файлу &apos;%2&apos;. Очікуйте неприємностей.
@@ -314,12 +715,42 @@ Will assume a single universal form.</source>
</translation>
</message>
<message>
+ <source>Updating &apos;%1&apos;...
+</source>
+ <translation>Оновлюю &apos;%1&apos;...
+</translation>
+ </message>
+ <message>
+ <source>Stripping non plural forms in &apos;%1&apos;...
+</source>
+ <translation>Видалення не множинних форм в &apos;%1&apos;...
+</translation>
+ </message>
+ <message>
<source>lupdate warning: Codec for source &apos;%1&apos; is invalid. Falling back to codec for tr().
</source>
<translation>попередження lupdate: Кодек для джерела &apos;%1&apos; неправильний. Повертаємось до використання кодеку для tr().
</translation>
</message>
<message>
+ <source>lupdate warning: TS files from command line will override TRANSLATIONS in %1.
+</source>
+ <translation>попередження lupdate: файл-TS з командного рядка замінять TRANSLATIONS в %1.
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: TS files from command line prevent recursing into %1.
+</source>
+ <translation>попередження lupdate: файли TS з командного рядка перешкоджають рекурсивному проходу %1.
+</translation>
+ </message>
+ <message>
+ <source>lupdate warning: no TS files specified. Only diagnostics will be produced for &apos;%1&apos;.
+</source>
+ <translation>попередження lupdate: не вказано файлів TS. Здійснюватиметься лише діагностика для &apos;%1&apos;.
+</translation>
+ </message>
+ <message>
<source>The option -target-language requires a parameter.
</source>
<translation>Опція -target-language вимагає параметра.
@@ -410,6 +841,12 @@ Will assume a single universal form.</source>
</translation>
</message>
<message>
+ <source>Scanning directory &apos;%1&apos;...
+</source>
+ <translation>Сканування теки &apos;%1&apos;...
+</translation>
+ </message>
+ <message>
<source>lupdate warning: -target-language usually only makes sense with exactly one TS file.
</source>
<translation>попередження lupdate: Використання -target-language, зазвичай, має сенс лише з одним файлом TS.
@@ -433,6 +870,360 @@ Will assume a single universal form.</source>
<translation>помилка lupdate: Одночасно вказані файл проекту та вхідні файли / шляхи для включення.
</translation>
</message>
+ <message>
+ <source>Parenthesis/bracket/brace mismatch between #if and #else branches; using #if branch
+</source>
+ <translation>Круглі/квадратні/фігурні дужки не збігаються між гілками #if та #else, використовую гілку #if
+</translation>
+ </message>
+ <message>
+ <source>Parenthesis/brace mismatch between #if and #else branches; using #if branch
+</source>
+ <translation>Круглі/фігурні дужки не збігаються між гілками #if та #else, використовую гілку #if
+</translation>
+ </message>
+ <message>
+ <source>Unterminated C++ comment
+</source>
+ <translation>Незавершений коментар C++
+</translation>
+ </message>
+ <message>
+ <source>Unterminated C++ string
+</source>
+ <translation>Незавершений рядок C++
+</translation>
+ </message>
+ <message>
+ <source>Excess closing brace in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Забагато закриваючих фігурних дужок в коді C++ (або неправильне застосування препроцесора C++)
+</translation>
+ </message>
+ <message>
+ <source>Excess closing parenthesis in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Забагато закриваючих круглих дужок в коді C++ (або неправильне застосування препроцесора C++)
+</translation>
+ </message>
+ <message>
+ <source>Excess closing bracket in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Забагато закриваючих квадратних дужок в коді C++ (або неправильне застосування препроцесора C++)
+</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: %2</source>
+ <translation>Неможливо відкрити %1: %2</translation>
+ </message>
+ <message>
+ <source>//% cannot be used with tr() / QT_TR_NOOP(). Ignoring
+</source>
+ <translation>//% не може бути використаний разом з tr() / QT_TR_NOOP(). Ігнорую
+</translation>
+ </message>
+ <message>
+ <source>circular inclusion of %1
+</source>
+ <translation>циклічне вкладення %1
+</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: %2
+</source>
+ <translation>Неможливо відкрити %1: %2
+</translation>
+ </message>
+ <message>
+ <source>Qualifying with unknown namespace/class %1::%2
+</source>
+ <translation>Задаю з невідомим простором імен/класом %1::%2
+</translation>
+ </message>
+ <message>
+ <source>tr() cannot be called without context
+</source>
+ <translation>tr() не можна викликати без контексту
+</translation>
+ </message>
+ <message>
+ <source>Class &apos;%1&apos; lacks Q_OBJECT macro
+</source>
+ <translation>У класу &apos;%1&apos; не вистачає макросу Q_OBJECT
+</translation>
+ </message>
+ <message>
+ <source>It is not recommended to call tr() from within a constructor &apos;%1::%2&apos;
+</source>
+ <translation>Не рекомендовано викликати tr() з конструктора &apos;%1::%2&apos;
+</translation>
+ </message>
+ <message>
+ <source>//% cannot be used with translate() / QT_TRANSLATE_NOOP(). Ignoring
+</source>
+ <translation>//% не може бути використаний разом з translate() / QT_TRANSLATE_NOOP(). Ігнорую
+</translation>
+ </message>
+ <message>
+ <source>//= cannot be used with qtTrId() / QT_TRID_NOOP(). Ignoring
+</source>
+ <translation>//= не може бути використаний разом з qtTrId() / QT_TRID_NOOP(). Ігнорую
+</translation>
+ </message>
+ <message>
+ <source>Unexpected character in meta string
+</source>
+ <translation>Неочікуваний символ в мета-рядку
+</translation>
+ </message>
+ <message>
+ <source>Unterminated meta string
+</source>
+ <translation>Незавершений мета-рядок
+</translation>
+ </message>
+ <message>
+ <source>Cannot invoke tr() like this
+</source>
+ <translation>Неможливо викликати tr() подібним чином
+</translation>
+ </message>
+ <message>
+ <source>Discarding unconsumed meta data
+</source>
+ <translation>Відкидаю невжиті мета-дані
+</translation>
+ </message>
+ <message>
+ <source>Unbalanced opening brace in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Незбалансовані відкриваючі фігурні дужки в коді C++ (або неправильне застосування препроцесора C++)
+</translation>
+ </message>
+ <message>
+ <source>Unbalanced opening parenthesis in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Незбалансовані відкриваючі круглі дужки в коді C++ (або неправильне застосування препроцесора C++)
+</translation>
+ </message>
+ <message>
+ <source>Unbalanced opening bracket in C++ code (or abuse of the C++ preprocessor)
+</source>
+ <translation>Незбалансовані відкриваючі квадратні дужки в коді C++ (або неправильне застосування препроцесора C++)
+</translation>
+ </message>
+ <message>
+ <source>Unterminated Java comment.
+</source>
+ <translation>Незавершений коментар Java.
+</translation>
+ </message>
+ <message>
+ <source>Invalid Unicode value.
+</source>
+ <translation>Неправильне значення Unicode.
+</translation>
+ </message>
+ <message>
+ <source>Unterminated string.
+</source>
+ <translation>Незавершений рядок.
+</translation>
+ </message>
+ <message>
+ <source>String used in translation can contain only literals concatenated with other literals, not expressions or numbers.
+</source>
+ <translation>Рядки, що використовуються в перекладі, можуть містити лише літерали об&apos;єднані з іншими літералами, а не вирази або числа.
+</translation>
+ </message>
+ <message>
+ <source>&apos;class&apos; must be followed by a class name.
+</source>
+ <translation>Після &apos;class&apos; повинна слідувати назва класу.
+</translation>
+ </message>
+ <message>
+ <source>Excess closing brace.
+</source>
+ <translation>Забагато закриваючих фігурних дужок.</translation>
+ </message>
+ <message>
+ <source>&apos;package&apos; must be followed by package name.
+</source>
+ <translation>Після &apos;package&apos; повинна слідувати назва пакунку.
+</translation>
+ </message>
+ <message>
+ <source>Unbalanced opening brace.
+</source>
+ <translation>Незбалансовані відкриваючі фігурні дужки.
+</translation>
+ </message>
+ <message>
+ <source>Unbalanced opening parenthesis.
+</source>
+ <translation>Незбалансовані відкриваючі круглі дужки.
+</translation>
+ </message>
+ <message numerus="yes">
+ <source> Found %n source text(s) (%1 new and %2 already existing)
+</source>
+ <translation>
+ <numerusform> Знайдено %n оригінальний текст (%1 новий та %2 вже існує)
+</numerusform>
+ <numerusform> Знайдено %n оригінальних тексти (%1 нових та %2 вже існує)
+</numerusform>
+ <numerusform> Знайдено %n оригінальних текстів (%1 нових та %2 вже існує)
+</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source> Removed %n obsolete entries
+</source>
+ <translation>
+ <numerusform> Видалено %n застарілий елемент
+</numerusform>
+ <numerusform> Видалено %n застарілих елементи
+</numerusform>
+ <numerusform> Видалено %n застарілих елементів
+</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source> Kept %n obsolete entries
+</source>
+ <translation>
+ <numerusform> Залишено %n застарілий елемент
+</numerusform>
+ <numerusform> Залишено %n застарілих елементи
+</numerusform>
+ <numerusform> Залишено %n застарілих елементів
+</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source> Number heuristic provided %n translation(s)
+</source>
+ <translation>
+ <numerusform>Числова евристика надала %n переклад
+</numerusform>
+ <numerusform>Числова евристика надала %n переклади
+</numerusform>
+ <numerusform>Числова евристика надала %n перекладів
+</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source> Same-text heuristic provided %n translation(s)
+</source>
+ <translation>
+ <numerusform>Евристика &quot;однаковий текст&quot; надала %n переклад
+</numerusform>
+ <numerusform>Евристика &quot;однаковий текст&quot; надала %n переклади
+</numerusform>
+ <numerusform>Евристика &quot;однаковий текст&quot; надала %n перекладів
+</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source> Similar-text heuristic provided %n translation(s)
+</source>
+ <translation>
+ <numerusform>Евристика &quot;схожий текст&quot; надала %n переклад
+</numerusform>
+ <numerusform>Евристика &quot;схожий текст&quot; надала %n переклади
+</numerusform>
+ <numerusform>Евристика &quot;схожий текст&quot; надала %n перекладів
+</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Illegal character</source>
+ <translation>Неприпустимий символ</translation>
+ </message>
+ <message>
+ <source>Unclosed string at end of line</source>
+ <translation>Незакритий рядок в кінці файлу</translation>
+ </message>
+ <message>
+ <source>Illegal escape squence</source>
+ <translation>Неприпустима керуюча послідовність</translation>
+ </message>
+ <message>
+ <source>Illegal unicode escape sequence</source>
+ <translation>Неприпустима керуюча послідовність Unicode</translation>
+ </message>
+ <message>
+ <source>Unclosed comment at end of file</source>
+ <translation>Незакритий коментар в кінці файлу</translation>
+ </message>
+ <message>
+ <source>Illegal syntax for exponential number</source>
+ <translation>Неприпустимий синтаксис для експоненційного числа</translation>
+ </message>
+ <message>
+ <source>Identifier cannot start with numeric literal</source>
+ <translation>Ідентифікатор не може починатись з числового літералу</translation>
+ </message>
+ <message>
+ <source>Unterminated regular expression literal</source>
+ <translation>Незавершений літерал регулярного виразу</translation>
+ </message>
+ <message>
+ <source>//% cannot be used with %1(). Ignoring
+</source>
+ <translation>//% не може бути використаний разом з %1(). Ігнорую
+</translation>
+ </message>
+ <message>
+ <source>%1() requires at least two arguments.
+</source>
+ <translation>%1() вимагає щонайменше двох аргументів.
+</translation>
+ </message>
+ <message>
+ <source>%1(): both arguments must be literal strings.
+</source>
+ <translation>%1(): обидва аргументи повинні бути рядковими літералами.
+</translation>
+ </message>
+ <message>
+ <source>%1() requires at least one argument.
+</source>
+ <translation>%1() вимагає щонайменше одного аргументу.
+</translation>
+ </message>
+ <message>
+ <source>%1(): text to translate must be a literal string.
+</source>
+ <translation>%1(): текст для перекладу повинен бути рядковим літералом.
+</translation>
+ </message>
+ <message>
+ <source>//= cannot be used with %1(). Ignoring
+</source>
+ <translation>//= не може бути використаний разом з %1(). Ігнорую
+</translation>
+ </message>
+ <message>
+ <source>%1(): identifier must be a literal string.
+</source>
+ <translation>%1(): ідентифікатор повинен бути рядковим літералом.
+</translation>
+ </message>
+ <message>
+ <source>Expected </source>
+ <extracomment>Beginning of the string that contains comma-separated list of expected tokens</extracomment>
+ <translation>Очікувалось </translation>
+ </message>
+ <message>
+ <source>XML error: Parse error at line %1, column %2 (%3).</source>
+ <translation>Помилка XML: Помилка розбору в рядку %1, позиція %2 (%3).</translation>
+ </message>
+ <message>
+ <source>Parse error in UI file</source>
+ <translation>Помилка розбору файлу UI</translation>
+ </message>
</context>
<context>
<name>MainWindow</name>
@@ -1431,6 +2222,13 @@ Line: %2</source>
</message>
</context>
<context>
+ <name>PhraseBook</name>
+ <message>
+ <source>Parse error at line %1, column %2 (%3).</source>
+ <translation>Помилка розбору в рядку %1, позиція %2 (%3).</translation>
+ </message>
+</context>
+<context>
<name>PhraseBookBox</name>
<message>
<source>Edit Phrase Book</source>
@@ -1558,83 +2356,6 @@ Line: %2</source>
</message>
</context>
<context>
- <name>QCoreApplication</name>
- <message>
- <source>Usage:
- lrelease [options] project-file
- lrelease [options] ts-files [-qm qm-file]
-
-lrelease is part of Qt&apos;s Linguist tool chain. It can be used as a
-stand-alone tool to convert XML-based translations files in the TS
-format into the &apos;compiled&apos; QM format used by QTranslator objects.
-
-Options:
- -help Display this information and exit
- -idbased
- Use IDs instead of source strings for message keying
- -compress
- Compress the QM files
- -nounfinished
- Do not include unfinished translations
- -removeidentical
- If the translated text is the same as
- the source text, do not include the message
- -markuntranslated &lt;prefix&gt;
- If a message has no real translation, use the source text
- prefixed with the given string instead
- -silent
- Do not explain what is being done
- -version
- Display the version of lrelease and exit
-</source>
- <translation>Використання:
- lrelease [опції] файл-проект
- lrelease [опції] файли-ts [-qm файл-qm]
-
-lrelease - це частина набору програм Qt Linguist. Вона може використовуватися
-як окремий засіб для перетворення файлів перекладу на базі XML в форматі TS
-до &apos;скомпільованого&apos; формату QM, що використовується об&apos;єктами QTranslator.
-
-Опції:
- -help Показати цю інформацію та вийти
- -idbased
- Використовувати ID замість рядків оригіналу як ключі повідомлень
- -compress
- Стискати файли QM
- -nounfinished
- Не включати незавершені переклади
- -removeidentical
- Якщо перекладений текст однаковий з оригіналом, то
- не включати повідомлення
- -markuntranslated &lt;prefix&gt;
- If a message has no real translation, use the source text
- prefixed with the given string instead
- -silent
- Не пояснювати, що відбувається
- -version
- Показати версію lrelease та вийти
-</translation>
- </message>
- <message>
- <source>Updating &apos;%1&apos;...
-</source>
- <translation>Оновлюю &apos;%1&apos;...
-</translation>
- </message>
- <message>
- <source>Removing translations equal to source text in &apos;%1&apos;...
-</source>
- <translation>Видалення перекладів однакових з оригінальним текстом в &apos;%1&apos;...
-</translation>
- </message>
- <message>
- <source>lrelease version %1
-</source>
- <translation>lrelease версії %1
-</translation>
- </message>
-</context>
-<context>
<name>QObject</name>
<message>
<source>Translation files (%1);;</source>
@@ -1681,215 +2402,11 @@ lrelease - це частина набору програм Qt Linguist. Вона
<translation>Файли локалізації XLIFF</translation>
</message>
<message>
- <source>Usage:
- lupdate [options] [project-file]...
- lupdate [options] [source-file|path|@lst-file]... -ts ts-files|@lst-file
-
-lupdate is part of Qt&apos;s Linguist tool chain. It extracts translatable
-messages from Qt UI files, C++, Java and JavaScript/QtScript source code.
-Extracted messages are stored in textual translation source files (typically
-Qt TS XML). New and modified messages can be merged into existing TS files.
-
-Options:
- -help Display this information and exit.
- -no-obsolete
- Drop all obsolete strings.
- -extensions &lt;ext&gt;[,&lt;ext&gt;]...
- Process files with the given extensions only.
- The extension list must be separated with commas, not with whitespace.
- Default: &apos;%1&apos;.
- -pluralonly
- Only include plural form messages.
- -silent
- Do not explain what is being done.
- -no-sort
- Do not sort contexts in TS files.
- -no-recursive
- Do not recursively scan the following directories.
- -recursive
- Recursively scan the following directories (default).
- -I &lt;includepath&gt; or -I&lt;includepath&gt;
- Additional location to look for include files.
- May be specified multiple times.
- -locations {absolute|relative|none}
- Specify/override how source code references are saved in TS files.
- Default is absolute.
- -no-ui-lines
- Do not record line numbers in references to UI files.
- -disable-heuristic {sametext|similartext|number}
- Disable the named merge heuristic. Can be specified multiple times.
- -pro &lt;filename&gt;
- Name of a .pro file. Useful for files with .pro file syntax but
- different file suffix. Projects are recursed into and merged.
- -source-language &lt;language&gt;[_&lt;region&gt;]
- Specify the language of the source strings for new files.
- Defaults to POSIX if not specified.
- -target-language &lt;language&gt;[_&lt;region&gt;]
- Specify the language of the translations for new files.
- Guessed from the file name if not specified.
- -ts &lt;ts-file&gt;...
- Specify the output file(s). This will override the TRANSLATIONS
- and nullify the CODECFORTR from possibly specified project files.
- -codecfortr &lt;codec&gt;
- Specify the codec assumed for tr() calls. Effective only with -ts.
- -version
- Display the version of lupdate and exit.
- @lst-file
- Read additional file names (one per line) from lst-file.
-</source>
- <translation>Використання:
- lupdate [опції] [файл-проект]...
- lupdate [опції] [вхідний-файл|шлях|@файл-список]... -ts ts-файли|@файл-список
-
-lupdate - це частина набору програм Qt Linguist. Вона It витягає придатні для перекладу
-повідомлення з файлів Qt UI, коду C++, Java та JavaScript/QtScript. Витягнуті повідомлення
-зберігаються в текстовому файлі перекладу (типово Qt TS XML). Нові та модифіковані
-повідомлення можуть бути об&apos;єднанні з існуючими файлами TS.
-
-Опції:
- -help Показати цю інформацію та вийти.
- -no-obsolete
- Видалити всі застарілі рядки.
- -extensions &lt;розширення&gt;[,&lt;розширення&gt;]...
- Обробляти файли лише з вказаними розширеннями.
- Список розширень має розділюватись комами, а не пропусками.
- Типово: &apos;%1&apos;.
- -pluralonly
- Включати лише повідомлення з формою множини.
- -silent
- Не пояснювати, що відбувається.
- -no-sort
- Не сортувати контексти в файлах TS.
- -no-recursive
- Не сканувати рекурсивно наступні теки.
- -recursive
- Рекурсивно сканувати наступні теки (типово).
- -I &lt;шлях-включення&gt; або -I&lt;шлях-включення&gt;
- Додаткові місця для пошуку файлів включення.
- Може бути вказано декілька разів.
- -locations {absolute|relative|none}
- Вказати/замістити як посилання на код зберігаються в файлі TS.
- Типово - абсолютно.
- -no-ui-lines
- Не записувати номери рядків в посиланнях на файли UI.
- -disable-heuristic {sametext|similartext|number}
- Вимкнути вказану евристику об&apos;єдання. Може бути вказано декілька разів.
- -pro &lt;ім&apos;я-файлу&gt;
- Ім&apos;я .pro файлу. Корисно для файлів із синтаксисом фалів .pro, але з
- іншим розширенням. Projects are recursed into and merged.
- -source-language &lt;мова&gt;[_&lt;регіон&gt;]
- Вказати мову оригінальних рядків для нових файлів.
- Типово, якщо не вказано - POSIX.
- -target-language &lt;мова&gt;[_&lt;регіон&gt;]
- Вказати мову перекладу для нових файлів.
- Вгадується з імені файла, якщо не вказано.
- -ts &lt;файл-ts&gt;...
- Вказати вихідний файл(и). Це замістить TRANSLATIONS
- та скине CODECFORTR з, можливо, вказаних файлів проекту.
- -codecfortr &lt;кодек&gt;
- Вказати кодек, що Specify the codec вживається для викликів tr(). Ефективно лише з -ts.
- -version
- Показати версію lupdate та вийти.
- @файл-список
- Читати додаткові імена файлів (одне на рядок) з файла-списку.
-</translation>
- </message>
- <message>
- <source>Updating &apos;%1&apos;...
-</source>
- <translation>Оновлюю &apos;%1&apos;...
-</translation>
- </message>
- <message>
- <source>Stripping non plural forms in &apos;%1&apos;...
-</source>
- <translation>Видалення не множинних форм в &apos;%1&apos;...
-</translation>
- </message>
- <message>
<source>lupdate version %1
</source>
<translation>lupdate версії %1
</translation>
</message>
- <message>
- <source>Scanning directory &apos;%1&apos;...
-</source>
- <translation>Сканування теки &apos;%1&apos;...
-</translation>
- </message>
- <message numerus="yes">
- <source> Found %n source text(s) (%1 new and %2 already existing)
-</source>
- <translation>
- <numerusform> Знайдено %n оригінальний текст (%1 новий та %2 вже існує)
-</numerusform>
- <numerusform> Знайдено %n оригінальних тексти (%1 нових та %2 вже існує)
-</numerusform>
- <numerusform> Знайдено %n оригінальних текстів (%1 нових та %2 вже існує)
-</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source> Removed %n obsolete entries
-</source>
- <translation>
- <numerusform> Видалено %n застарілий елемент
-</numerusform>
- <numerusform> Видалено %n застарілих елементи
-</numerusform>
- <numerusform> Видалено %n застарілих елементів
-</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source> Kept %n obsolete entries
-</source>
- <translation>
- <numerusform> Залишено %n застарілий елемент
-</numerusform>
- <numerusform> Залишено %n застарілих елементи
-</numerusform>
- <numerusform> Залишено %n застарілих елементів
-</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source> Number heuristic provided %n translation(s)
-</source>
- <translation>
- <numerusform>Числова евристика надала %n переклад
-</numerusform>
- <numerusform>Числова евристика надала %n переклади
-</numerusform>
- <numerusform>Числова евристика надала %n перекладів
-</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source> Same-text heuristic provided %n translation(s)
-</source>
- <translation>
- <numerusform>Евристика &quot;однаковий текст&quot; надала %n переклад
-</numerusform>
- <numerusform>Евристика &quot;однаковий текст&quot; надала %n переклади
-</numerusform>
- <numerusform>Евристика &quot;однаковий текст&quot; надала %n перекладів
-</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source> Similar-text heuristic provided %n translation(s)
-</source>
- <translation>
- <numerusform>Евристика &quot;схожий текст&quot; надала %n переклад
-</numerusform>
- <numerusform>Евристика &quot;схожий текст&quot; надала %n переклади
-</numerusform>
- <numerusform>Евристика &quot;схожий текст&quot; надала %n перекладів
-</numerusform>
- </translation>
- </message>
</context>
<context>
<name>SourceCodeView</name>
diff --git a/translations/qt_help_uk.ts b/translations/qt_help_uk.ts
index b8bc984..32e47b4 100644
--- a/translations/qt_help_uk.ts
+++ b/translations/qt_help_uk.ts
@@ -106,7 +106,7 @@
<name>QHelpEngineCore</name>
<message>
<source>Cannot open documentation file %1: %2!</source>
- <translation>Не можу відкрити файл документації %1: %2!</translation>
+ <translation>Неможливо відкрити файл документації %1: %2!</translation>
</message>
<message>
<source>The specified namespace does not exist!</source>
@@ -256,7 +256,7 @@
</message>
<message>
<source>The input file %1 could not be opened!</source>
- <translation>Неможливо відкрити вхідний файл %1!</translation>
+ <translation>Не вдалось відкрити вхідний файл %1!</translation>
</message>
</context>
<context>
diff --git a/translations/qt_uk.ts b/translations/qt_uk.ts
index 7a223f4..e1716fb 100644
--- a/translations/qt_uk.ts
+++ b/translations/qt_uk.ts
@@ -1697,25 +1697,6 @@ to
</message>
</context>
<context>
- <name>QDeclarativeCompositeTypeManager</name>
- <message>
- <source>Resource %1 unavailable</source>
- <translation>Ресурс %1 недоступний</translation>
- </message>
- <message>
- <source>Namespace %1 cannot be used as a type</source>
- <translation>Простір імен %1 не може бути використаний як тип</translation>
- </message>
- <message>
- <source>%1 %2</source>
- <translation>%1 %2</translation>
- </message>
- <message>
- <source>Type %1 unavailable</source>
- <translation>Тип %1 недоступний</translation>
- </message>
-</context>
-<context>
<name>QDeclarativeConnections</name>
<message>
<source>Cannot assign to non-existent property &quot;%1&quot;</source>
@@ -2096,6 +2077,25 @@ to
</message>
</context>
<context>
+ <name>QDeclarativeTypeData</name>
+ <message>
+ <source>Script %1 unavailable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type %1 unavailable</source>
+ <translation type="unfinished">Тип %1 недоступний</translation>
+ </message>
+ <message>
+ <source>Namespace %1 cannot be used as a type</source>
+ <translation type="unfinished">Простір імен %1 не може бути використаний як тип</translation>
+ </message>
+ <message>
+ <source>%1 %2</source>
+ <translation type="unfinished">%1 %2</translation>
+ </message>
+</context>
+<context>
<name>QDeclarativeVME</name>
<message>
<source>Unable to create object of type %1</source>
@@ -3313,18 +3313,10 @@ Do you want to delete it anyway?</source>
<context>
<name>QLibrary</name>
<message>
- <source>Could not mmap &apos;%1&apos;: %2</source>
- <translation>Не вдалося виконати mmap &apos;%1&apos;: %2</translation>
- </message>
- <message>
<source>Plugin verification data mismatch in &apos;%1&apos;</source>
<translation>Дані верифікації додатку не збігаються для ’%1’</translation>
</message>
<message>
- <source>Could not unmap &apos;%1&apos;: %2</source>
- <translation>Не вдалося виконати unmap &apos;%1&apos;: %2</translation>
- </message>
- <message>
<source>The shared library was not found.</source>
<translation>Динамічна бібліотека не знайдена.</translation>
</message>
@@ -7917,7 +7909,7 @@ Do you want to overwrite it?</source>
<name>QtXmlPatterns</name>
<message>
<source>%1 is an unsupported encoding.</source>
- <translation type="unfinished"></translation>
+ <translation>Кодування %1 не підтримується.</translation>
</message>
<message>
<source>%1 contains octets which are disallowed in the requested encoding %2.</source>
@@ -7941,23 +7933,23 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Year %1 is invalid because it begins with %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Рік %1 неправильний, бо він починається з %2.</translation>
</message>
<message>
<source>Day %1 is outside the range %2..%3.</source>
- <translation type="unfinished"></translation>
+ <translation>День %1 поза межами діапазону %2..%3.</translation>
</message>
<message>
<source>Month %1 is outside the range %2..%3.</source>
- <translation type="unfinished"></translation>
+ <translation>Місяць %1 поза межами діапазону %2..%3.</translation>
</message>
<message>
<source>Overflow: Can&apos;t represent date %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Переповнення: Не можу представити дату %1.</translation>
</message>
<message>
<source>Day %1 is invalid for month %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Неправильний день %1 для місяця %2.</translation>
</message>
<message>
<source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
@@ -7965,15 +7957,15 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Time %1:%2:%3.%4 is invalid.</source>
- <translation type="unfinished"></translation>
+ <translation>Неправильний час %1:%2:%3.%4.</translation>
</message>
<message>
<source>Overflow: Date can&apos;t be represented.</source>
- <translation type="unfinished"></translation>
+ <translation>Переповнення: Не можу представити дату.</translation>
</message>
<message>
<source>At least one component must be present.</source>
- <translation type="unfinished"></translation>
+ <translation>Щонайменше один компонент має бути присутнім.</translation>
</message>
<message>
<source>At least one time component must appear after the %1-delimiter.</source>
@@ -7981,7 +7973,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>%1 is not a valid value of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не є правильним значенням для типу %2.</translation>
</message>
<message>
<source>When casting to %1 from %2, the source value cannot be %3.</source>
@@ -7989,11 +7981,11 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Integer division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Цілочисельне ділення (%1) на нуль (%2) не визначене.</translation>
</message>
<message>
<source>Division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Ділення (%1) на нуль (%2) не визначене.</translation>
</message>
<message>
<source>Modulus division (%1) by zero (%2) is undefined.</source>
@@ -8021,11 +8013,11 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Value %1 of type %2 exceeds maximum (%3).</source>
- <translation type="unfinished"></translation>
+ <translation>Значення %1 типу %2 перевищує максимум (%3).</translation>
</message>
<message>
<source>Value %1 of type %2 is below minimum (%3).</source>
- <translation type="unfinished"></translation>
+ <translation>Значення %1 типу %2 менше за мінімум (%3).</translation>
</message>
<message>
<source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
@@ -8033,7 +8025,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>%1 is not valid as a value of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не є правильним значенням для типу %2.</translation>
</message>
<message>
<source>Ambiguous rule match.</source>
@@ -8041,11 +8033,11 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Operator %1 cannot be used on type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Оператор %1 не може використовуватись для типу %2.</translation>
</message>
<message>
<source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Оператор %1 не може використовуватись для атомарних значень типу %2 та %3.</translation>
</message>
<message>
<source>The namespace URI in the name for a computed attribute cannot be %1.</source>
@@ -8065,11 +8057,11 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>A comment cannot contain %1</source>
- <translation type="unfinished"></translation>
+ <translation>Коментар не може містити %1</translation>
</message>
<message>
<source>A comment cannot end with a %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Коментар не може закінчувати на %1.</translation>
</message>
<message>
<source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
@@ -8081,7 +8073,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>The prefix %1 cannot be bound.</source>
- <translation type="unfinished"></translation>
+ <translation>Неможливо прив&apos;язати префікс %1.</translation>
</message>
<message>
<source>Only the prefix %1 can be bound to %2 and vice versa.</source>
@@ -8147,12 +8139,16 @@ Do you want to overwrite it?</source>
<source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
<translation type="unfinished">
<numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
<translation type="unfinished">
<numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
</translation>
</message>
<message>
@@ -8169,7 +8165,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>%1 is not a valid XML 1.0 character.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не є правильним символом XML 1.0.</translation>
</message>
<message>
<source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source>
@@ -8257,11 +8253,11 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>The item %1 did not match the required type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Елемент %1 не відповідає необхідному типу %2.</translation>
</message>
<message>
<source>The variable %1 is unused</source>
- <translation type="unfinished"></translation>
+ <translation>Змінна %1 не використовується</translation>
</message>
<message>
<source>W3C XML Schema identity constraint selector</source>
@@ -8301,7 +8297,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
- <translation type="unfinished"></translation>
+ <translation>Версія %1 не підтримується. Підтримується XQuery версії 1.0.</translation>
</message>
<message>
<source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
@@ -8357,7 +8353,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>The module import feature is not supported</source>
- <translation type="unfinished"></translation>
+ <translation>Можливість імпорту модулів не підтримується</translation>
</message>
<message>
<source>A variable with name %1 has already been declared.</source>
@@ -8517,7 +8513,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Parse error: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Помилка розбору: %1</translation>
</message>
<message>
<source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</source>
@@ -8529,7 +8525,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Unknown XSL-T attribute %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Невідомий атрибут XSL-T %1.</translation>
</message>
<message>
<source>Attribute %1 and %2 are mutually exclusive.</source>
@@ -9041,11 +9037,11 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут %1 елемента %2 містить неправильний вміст: {%3} не є значенням типу %4.</translation>
</message>
<message>
<source>%1 attribute of %2 element contains invalid content: {%3}.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут %1 елемента %2 містить неправильний вміст: {%3}.</translation>
</message>
<message>
<source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source>
@@ -9077,7 +9073,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>%1 attribute of %2 element must be %3 or %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут %1 елемента %2 має бути %3 або %4.</translation>
</message>
<message>
<source>%1 attribute of %2 element must have a value of %3.</source>
@@ -9157,7 +9153,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Type %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Тип %1 вже визначено.</translation>
</message>
<message>
<source>Attribute group %1 already defined.</source>
@@ -9297,7 +9293,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>%1 is not valid according to %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не є правильним відповідно до %2.</translation>
</message>
<message>
<source>String content does not match the length facet.</source>
@@ -9697,7 +9693,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>zero or one</source>
- <translation type="unfinished"></translation>
+ <translation>нуль чи один</translation>
</message>
<message>
<source>exactly one</source>
@@ -9705,15 +9701,15 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>one or more</source>
- <translation type="unfinished"></translation>
+ <translation>один чи більше</translation>
</message>
<message>
<source>zero or more</source>
- <translation type="unfinished"></translation>
+ <translation>нуль чи більше</translation>
</message>
<message>
<source>Required type is %1, but %2 was found.</source>
- <translation type="unfinished"></translation>
+ <translation>Вимагається тип %1, але знайдено %2.</translation>
</message>
<message>
<source>Promoting %1 to %2 may cause loss of precision.</source>
@@ -9721,7 +9717,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>The focus is undefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Фокус не визначено.</translation>
</message>
<message>
<source>It&apos;s not possible to add attributes after any other kind of node.</source>
diff --git a/translations/qvfb_uk.ts b/translations/qvfb_uk.ts
index 0e0c5da6..e857e9d 100644
--- a/translations/qvfb_uk.ts
+++ b/translations/qvfb_uk.ts
@@ -215,7 +215,7 @@
<name>DeviceSkin</name>
<message>
<source>The image file &apos;%1&apos; could not be loaded.</source>
- <translation>Неможливо завантажити файл зображення &apos;%1&apos;.</translation>
+ <translation>Не вдалось завантажити файл зображення &apos;%1&apos;.</translation>
</message>
<message>
<source>The skin directory &apos;%1&apos; does not contain a configuration file.</source>
@@ -223,11 +223,11 @@
</message>
<message>
<source>The skin configuration file &apos;%1&apos; could not be opened.</source>
- <translation>Неможливо відкрити файл налаштувань &apos;%1&apos;.</translation>
+ <translation>Не вдалось відкрити файл налаштувань обкладинки &apos;%1&apos;.</translation>
</message>
<message>
<source>The skin configuration file &apos;%1&apos; could not be read: %2</source>
- <translation>Неможливо прочитати файл налаштувань &apos;%1&apos;: %2</translation>
+ <translation>Не вдалось прочитати файл налаштувань обкладинки &apos;%1&apos;: %2</translation>
</message>
<message>
<source>Syntax error: %1</source>
@@ -261,6 +261,126 @@
<context>
<name>QVFb</name>
<message>
+ <source>&amp;File</source>
+ <translation>&amp;Файл</translation>
+ </message>
+ <message>
+ <source>&amp;Configure...</source>
+ <translation>&amp;Налаштувати...</translation>
+ </message>
+ <message>
+ <source>&amp;Save image...</source>
+ <translation>&amp;Зберегти зображення...</translation>
+ </message>
+ <message>
+ <source>&amp;Animation...</source>
+ <translation>&amp;Анімація...</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation>Ви&amp;йти</translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation>&amp;Вид</translation>
+ </message>
+ <message>
+ <source>Show &amp;Cursor</source>
+ <translation>Показувати &amp;курсор</translation>
+ </message>
+ <message>
+ <source>&amp;Refresh Rate...</source>
+ <translation>Швидкість &amp;оновлення...</translation>
+ </message>
+ <message>
+ <source>&amp;No rotation</source>
+ <translation>&amp;Без обертання</translation>
+ </message>
+ <message>
+ <source>&amp;90° rotation</source>
+ <translation>Обернути на &amp;90°</translation>
+ </message>
+ <message>
+ <source>1&amp;80° rotation</source>
+ <translation>Обернути на 1&amp;80°</translation>
+ </message>
+ <message>
+ <source>2&amp;70° rotation</source>
+ <translation>Обернути на 2&amp;70°</translation>
+ </message>
+ <message>
+ <source>Zoom scale &amp;0.5</source>
+ <translation>Коефіцієнт масштабування &amp;0.5</translation>
+ </message>
+ <message>
+ <source>Zoom scale 0.7&amp;5</source>
+ <translation>Коефіцієнт масштабування 0.7&amp;5</translation>
+ </message>
+ <message>
+ <source>Zoom scale &amp;1</source>
+ <translation>Коефіцієнт масштабування &amp;1</translation>
+ </message>
+ <message>
+ <source>Zoom scale &amp;2</source>
+ <translation>Коефіцієнт масштабування &amp;2</translation>
+ </message>
+ <message>
+ <source>Zoom scale &amp;3</source>
+ <translation>Коефіцієнт масштабування &amp;3</translation>
+ </message>
+ <message>
+ <source>Zoom scale &amp;4</source>
+ <translation>Коефіцієнт масштабування &amp;4</translation>
+ </message>
+ <message>
+ <source>Zoom &amp;scale...</source>
+ <translation>Коефіцієнт &amp;масштабування...</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Довідка</translation>
+ </message>
+ <message>
+ <source>&amp;About...</source>
+ <translation>&amp;Про...</translation>
+ </message>
+ <message>
+ <source>Save Main Screen image</source>
+ <translation>Зберегти зображення головного екрану</translation>
+ </message>
+ <message>
+ <source>snapshot.png</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Portable Network Graphics (*.png)</source>
+ <translation>Переносима мережева графіка (*.png)</translation>
+ </message>
+ <message>
+ <source>Save Main Screen Image</source>
+ <translation>Зберегти зображення головного екрану</translation>
+ </message>
+ <message>
+ <source>Save failed. Check that you have permission to write to the target directory.</source>
+ <translation>Збій збереження. Перевірте чи маєте ви право на запис в теку збереження.</translation>
+ </message>
+ <message>
+ <source>Save Second Screen image</source>
+ <translation>Зберегти зображення другого екрану</translation>
+ </message>
+ <message>
+ <source>Save Second Screen Image</source>
+ <translation>Зберегти зображення другого екрану</translation>
+ </message>
+ <message>
+ <source>About QVFB</source>
+ <translation>Про QVFB</translation>
+ </message>
+ <message>
+ <source>&lt;h2&gt;The Qt for Embedded Linux Virtual X11 Framebuffer&lt;/h2&gt;&lt;p&gt;This application runs under Qt for X11, emulating a simple framebuffer, which the Qt for Embedded Linux server and clients can attach to just as if it was a hardware Linux framebuffer. &lt;p&gt;With the aid of this development tool, you can develop Qt for Embedded Linux applications under X11 without having to switch to a virtual console. This means you can comfortably use your other development tools such as GUI profilers and debuggers.</source>
+ <translation>&lt;h2&gt;Віртуальний фреймбуфер X11 Qt для Embedded Linux&lt;/h2&gt;&lt;p&gt;Ця програма виконується під Qt для X11, емулюючи простий фреймбуфер, до якого сервер та клієнти Qt для Embedded Linux можуть приєднуватись так само, як би це був апаратний фреймбуфер Linux. &lt;p&gt;За допомогою цього інструменту ви можете розробляти програми Qt для Embedded Linux під X11, без потреби перемикатись на віртуальну консоль. Це означає, що ви можете зручно використовувати інші ваші інструменти розробки, такі як профайлери та зневаджувачі з графічним інтерфейсом користувача.</translation>
+ </message>
+ <message>
<source>Browse...</source>
<translation>Оглянути...</translation>
</message>
@@ -273,4 +393,23 @@
<translation>Усі обкладинки QVFB (*.skin)</translation>
</message>
</context>
+<context>
+ <name>QVFbRateDialog</name>
+ <message>
+ <source>Target frame rate:</source>
+ <translation>Швидкість оновлення:</translation>
+ </message>
+ <message>
+ <source>%1fps</source>
+ <translation>%1 кадрів в секунду</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Скасувати</translation>
+ </message>
+</context>
</TS>