qtmobileextensions/src/keycapture/capturerequest_s60.cpp
changeset 1 2b40d63a9c3d
child 14 6fbed849b4f4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qtmobileextensions/src/keycapture/capturerequest_s60.cpp	Fri Apr 16 15:51:22 2010 +0300
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, version 2.1 of the License.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, 
+ * see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
+ *
+ * Description:
+ *
+ */
+
+#include "capturerequest_s60.h"
+#include <w32std.h>
+#include "txlogger.h"
+
+#ifdef _XQKEYCAPTURE_UNITTEST_
+    #include "tsrc\mytestwindowgroup.h"
+#endif
+
+CaptureRequest::CaptureRequest(TUint aKey, Qt::KeyboardModifiers aModifiersMask,
+        Qt::KeyboardModifiers aModifier, CaptureRequestType aRequestType, 
+        XqKeyCapture::LongFlags aLongKeyFlags, 
+#ifndef _XQKEYCAPTURE_UNITTEST_
+    RWindowGroup* aGroup
+#else
+    MyTestWindowGroup* aGroup
+#endif
+	):
+    mKey(aKey), 
+    mModifiersMask(aModifiersMask), 
+    mModifier(aModifier), 
+    mRequestType(aRequestType),
+    longKeyFlags(aLongKeyFlags),
+    mRequestHandle(-1), 
+    mAdditionalRequestHandle(-1),
+    mGroup(aGroup)  
+{
+}
+
+CaptureRequest::~CaptureRequest()
+{
+}
+
+int CaptureRequest::request()
+{
+    TX_ENTRY
+    int res(KErrNone);
+    if (!mGroup) {
+        res = KErrNotReady;
+        TX_LOG_ARGS( QString("!mGroup"));
+    } else {
+        switch (mRequestType) {
+            case CaptureRequestTypeNormal:
+                mRequestHandle = mGroup->CaptureKey(mKey, translatedModifierMask(),
+                    translatedModifier());
+                TX_LOG_ARGS( QString("CaptureKey done"))
+                break;
+            case CaptureRequestTypeLong:
+                mRequestHandle = mGroup->CaptureLongKey(mKey, mKey,
+                    translatedModifierMask(), translatedModifier(), 0, longKeyFlags);
+                TX_LOG_ARGS( QString("CaptureLongKey done"))
+                break;
+            case CaptureRequestTypeUpAndDown:
+                mRequestHandle = mGroup->CaptureKeyUpAndDowns(mKey,
+                    translatedModifierMask(), translatedModifier());
+                TX_LOG_ARGS( QString("CaptureKeyUpAndDowns done"))
+                break;
+            default:
+                res = KErrNotSupported;
+                TX_LOG_ARGS( QString("request not done"))
+                break;
+        }
+        
+        if (mRequestHandle < 0){
+            res = mRequestHandle;
+        } else { // following probably is not needed, it could be used to capture Modifires keys as normal keys
+            //In Qt you might request capture CTRL key, in symbian you have to capture Left and Right CTRL keys
+            bool additionalAction = false;
+            TUint additionalKey = 0;
+			if (mRequestType == CaptureRequestTypeNormal && mRequestType == CaptureRequestTypeLong){
+				if (mKey == EKeyLeftShift) {
+					additionalAction = true;
+					additionalKey = EKeyRightShift;
+				}
+			
+				if (mKey == EKeyLeftCtrl) {
+					additionalAction = true;
+					additionalKey = EKeyRightCtrl;
+				}
+			
+				if (mKey == EKeyLeftFunc) {
+					additionalAction = true;
+					additionalKey = EKeyRightFunc;
+				}
+			} else { //for CaptureRequestTypeUpAndDown ise StdKeys
+				if (mKey == EStdKeyLeftShift) {
+					additionalAction = true;
+					additionalKey = EStdKeyRightShift;
+				}
+			
+				if (mKey == EStdKeyLeftCtrl) {
+					additionalAction = true;
+					additionalKey = EStdKeyRightCtrl;
+				}
+			
+				if (mKey == EStdKeyLeftFunc) {
+					additionalAction = true;
+					additionalKey = EStdKeyRightFunc;
+				}
+			}
+            if (additionalAction && additionalKey != 0) {
+                TX_LOG_ARGS( QString("additionalAction needed"));
+                switch (mRequestType) {
+                case CaptureRequestTypeNormal:
+                    mAdditionalRequestHandle = mGroup->CaptureKey(additionalKey,
+                        translatedModifierMask(), translatedModifier());
+                    break;
+                case CaptureRequestTypeLong:
+                    mAdditionalRequestHandle = mGroup->CaptureLongKey(additionalKey,
+                        additionalKey, translatedModifierMask(), translatedModifier(), 0, longKeyFlags);
+                    break;
+                case CaptureRequestTypeUpAndDown:
+                    mAdditionalRequestHandle = mGroup->CaptureKeyUpAndDowns(additionalKey,
+                        translatedModifierMask(), translatedModifier());
+                    break;
+                default:
+                    res = KErrNotSupported;
+                    break;
+                }
+                if (mAdditionalRequestHandle < 0)
+                    res = mAdditionalRequestHandle;
+            }
+        }
+    }
+    TX_EXIT
+    return res;
+}
+
+int CaptureRequest::cancel()
+{
+    TX_ENTRY
+    int res(KErrNone);
+    if (mRequestHandle < 0 || !mGroup) {
+    res = KErrNotReady;
+    } else {
+    switch (mRequestType) {
+        case CaptureRequestTypeNormal:
+        mGroup->CancelCaptureKey(mRequestHandle);
+        break;
+        case CaptureRequestTypeLong:
+        mGroup->CancelCaptureLongKey(mRequestHandle);
+        break;
+        case CaptureRequestTypeUpAndDown:
+        mGroup->CancelCaptureKeyUpAndDowns(mRequestHandle);
+        break;
+        default:
+        res = KErrNotSupported;
+        break;
+    }
+    if (mAdditionalRequestHandle > -1) {
+        switch (mRequestType) {
+        case CaptureRequestTypeNormal:
+            mGroup->CancelCaptureKey(mAdditionalRequestHandle);
+            break;
+        case CaptureRequestTypeLong:
+            mGroup->CancelCaptureLongKey(mAdditionalRequestHandle);
+            break;
+        case CaptureRequestTypeUpAndDown:
+            mGroup->CancelCaptureKeyUpAndDowns(mAdditionalRequestHandle);
+            break;
+        default:
+            res = KErrNotSupported;
+            break;
+        }
+    }
+    }TX_EXIT
+    return res;
+}
+
+bool CaptureRequest::operator==(const CaptureRequest& other) const
+{
+    bool res = mKey == other.mKey && mModifiersMask == other.mModifiersMask && mModifier
+        == other.mModifier && mRequestType == other.mRequestType;
+    return res;
+}
+
+bool CaptureRequest::matches(TUint aKey, Qt::KeyboardModifiers aModifiersMask,
+    Qt::KeyboardModifiers aModifier, CaptureRequestType aRequestType,
+    XqKeyCapture::LongFlags captureLongFlag) const
+{
+    bool res = mKey == aKey && mModifiersMask == aModifiersMask && mModifier == aModifier
+        && mRequestType == aRequestType && 
+            longKeyFlags == captureLongFlag;
+    return res;
+}
+
+TUint CaptureRequest::translatedModifierMask()
+{
+    TUint res = translatedModifier(mModifiersMask);
+    return res;
+}
+
+TUint CaptureRequest::translatedModifier()
+{
+    TUint res = translatedModifier(mModifier);
+    return res;
+}
+
+TUint CaptureRequest::translatedModifier(Qt::KeyboardModifiers aModifier)
+{
+    TUint res = 0;
+    if (aModifier & Qt::ShiftModifier) {
+        res |= EModifierShift;
+    }
+
+    if (aModifier & Qt::ControlModifier) {
+        res |= EModifierCtrl;
+    }
+
+    if (aModifier & Qt::AltModifier) {
+        res |= EModifierAlt;
+    }
+
+    if (aModifier & Qt::KeypadModifier) {
+        res |= EModifierKeypad;
+    }
+    return res;
+}
+