homescreenapp/hsapplication/src/main.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Mar 2010 09:27:44 +0200
changeset 35 f9ce957a272c
child 36 cdae8c6c3876
permissions -rw-r--r--
Revision: 201007 Kit: 201011

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  Main.
*
*/
#include <QTranslator>
#include <QMessageBox>
#include <hbapplication.h>
#include <hbmainwindow.h>
#include "hshomescreen.h"
#include "hsapptranslator.h"
#include "hstest_global.h"

namespace
{
    const char TR_FILE_PATH[] = "resource/qt/translations";
}

#ifdef Q_OS_SYMBIAN

#include <QFile>
#include <QDir>
#include <f32file.h>
#include <eikenv.h>
#include <e32debug.h>
#include <apgwgnam.h>

// it is temporary class used for getting notifcation about APA messages
// it is used for processing message send by AVKON to activate Menu
class HsMessageObserver: public MCoeMessageObserver {

TMessageResponse HandleMessageL(TUint32 /*aClientHandleOfTargetWindowGroup*/,
                                TUid /*aMessageUid*/,
                                const TDesC8& /*aMessageParameters*/)
    {
    // move application to foreground
    QApplication::topLevelAt(0,0)->raise();
    return EMessageHandled;
    }
};

void setHomescreenAsSystemAppL(CEikonEnv* eikonEnv)
{
    CApaWindowGroupName* wgName = CApaWindowGroupName::NewLC(eikonEnv->WsSession());
    wgName->SetSystem(ETrue); // Allow only application with PowerManagement cap to shut us down
    wgName->SetCaptionL(_L("HsApplication"));
    wgName->SetAppUid(TUid::Uid(0x20022F35));
    wgName->SetWindowGroupName(eikonEnv->RootWin());
    CleanupStack::PopAndDestroy();
}



void myMessageOutput(QtMsgType type, const char *msg)
{
    switch (type) {

    case QtDebugMsg:
        RDebug::Printf("[HS] Debug: %s\n", msg);
        break;

    case QtWarningMsg:
        RDebug::Printf("[HS] Warning: %s\n", msg);
        break;

    case QtCriticalMsg:
        RDebug::Printf("[HS] Critical: %s\n", msg);
        break;

    case QtFatalMsg:
        RDebug::Printf("[HS] Fatal: %s\n", msg);
        abort();
    }
}

#endif //Q_OS_SYMBIAN




// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
int main(int argc, char *argv[])
{
#ifdef Q_OS_SYMBIAN
     qInstallMsgHandler(myMessageOutput);
#endif

    HSTEST_FUNC_ENTRY("HS::main()");

    HbApplication app(argc, argv);

#ifdef Q_OS_SYMBIAN
    QString currentPath = QString(argv[0]).left(2);
    QDir::setCurrent(currentPath);
    QString debugMsg = "HS::main() - HsApplication's current dir set to: " + currentPath;
    HSDEBUG(debugMsg);
#endif //Q_OS_SYMBIAN

    HsAppTranslator *appTranslator = HsAppTranslator::instance();
    appTranslator->setLanguage();

    // add translator for homescreen and application library
    QString locale = QLocale::system().name();

    QTranslator hsTranslator;
    QString hsTrFile = QString("homescreen_") + locale;

    QTranslator alTranslator;
    QString alTrFile = QString("hsapplibrary_") + locale;
#ifdef Q_OS_SYMBIAN
    // TRAP is must here, otherwise it crashes
TRAP_IGNORE(
    bool hsLoaded(false);
    hsLoaded = hsTranslator.load(hsTrFile, QString("z:/") + TR_FILE_PATH);
    if (!hsLoaded)
        hsTranslator.load(hsTrFile, QString("c:/") + TR_FILE_PATH);

    bool alLoaded(false);
    alLoaded = alTranslator.load(alTrFile, QString("z:/") + TR_FILE_PATH);
    if (!alLoaded)
        alTranslator.load(alTrFile, QString("c:/") + TR_FILE_PATH);
);
#else
    hsTranslator.load(hsTrFile, QString(TR_FILE_PATH) );
    alTranslator.load(alTrFile, QString(TR_FILE_PATH) );
#endif //Q_OS_SYMBIAN
    app.installTranslator(&hsTranslator);
    app.installTranslator(&alTranslator);

#ifdef Q_OS_SYMBIAN
    QFile file("c:/private/20022f35/homescreendb");
    //If DB file does not exist copy default DB from z: (ROM)
    if(!file.exists()) {
        HSTEST("HS::main() - homescreendb not in c:");
        file.setFileName("z:/private/20022f35/homescreendb");
        if(!file.exists()) {
            HSTEST("HS::main() - homescreendb not in ROM!");
        }
        else {
            HSTEST("HS::main() - homescreendb found from z:");
            //We need to first create private folder if not exists
            QDir dir("c:/private/20022f35/");
            if(!dir.exists()) {
                HSTEST("HS::main() - c:/private/20022f35/ does not exist.");
                RFs fsSession;
                if(fsSession.Connect() != KErrNone){
                    HSTEST("HS::main() - Homescreen private dir creation failed!");
                }
                fsSession.CreatePrivatePath(EDriveC);
                HSTEST("HS::main() - c:/private/20022f35/ created.");
                fsSession.Close();
                if(!dir.exists()) {
                    HSTEST("HS::main() - c:/private/20022f35/ creation failed.");
                }
            }
            HSTEST("HS::main() - c:/private/20022f35/ exists.");
            //Copy DB from z: to c:
            if (!file.copy("c:/private/20022f35/homescreendb")) {
                HSTEST("HS::main() - homescreendb copy from ROM to c: failed!");
            }
            HSTEST("HS::main() - homescreendb copied from ROM to c:!");
            file.setFileName("c:/private/20022f35/homescreendb");
            if(!file.setPermissions(QFile::ReadOwner | QFile::WriteOwner)) {
                HSTEST("HS::main() - homescreendb ReadWrite permission settings on c: failed!");
            }
            HSTEST("HS::main() - homescreendb permission set to ReadWrite!");
        }
    }
#ifdef __WINS__
    else if(!file.setPermissions(QFile::ReadOwner | QFile::WriteOwner)) {
        HSTEST("HS::main() - homescreendb ReadWrite permission settings on emulator's c: failed!");
    }
#endif
    {
    QDir dir("c:/private/20022f35/wallpapers");
    if(!dir.exists()) {
        dir.mkpath("c:/private/20022f35/wallpapers/");
        QDir dir2("z:/private/20022f35/wallpapers");
        dir2.setFilter(QDir::Files);
        QStringList files = dir2.entryList();
        foreach(QString file, files)
        {
            QString targetFile("c:/private/20022f35/wallpapers/" + file);
            QFile::copy(dir2.absoluteFilePath(file), targetFile);
            qDebug() << "image copied" << dir2.absoluteFilePath(file);
            QFile createdFile(targetFile);
            if(!createdFile.setPermissions(QFile::ReadOwner | QFile::WriteOwner)) {
                qDebug() << "read write permission set failed for file" << targetFile;
            }
        }

    }


    }

#endif //Q_OS_SYMBIAN

    HbMainWindow window;
    window.setViewSwitchingEnabled(false);
    
    HsHomeScreen hs;
    QObject::connect(&app, SIGNAL(aboutToQuit()) ,&hs, SLOT(stop()));
    QObject::connect(&hs, SIGNAL(exit()), &app, SLOT(quit()),Qt::QueuedConnection);
    hs.start();

    app.installEventFilter(appTranslator);

#ifdef Q_OS_SYMBIAN
    CEikonEnv * env = CEikonEnv::Static();
#ifdef S60APP_KEY
    env->RootWin().CaptureKeyUpAndDowns( EStdKeyApplication0, 0, 0 );
#endif //S60APP_KEY
    TRAP_IGNORE(setHomescreenAsSystemAppL(env));
    HsMessageObserver observer;
    TRAP_IGNORE( env->AddMessageObserverL(observer));
#endif //Q_OS_SYMBIAN

    HSTEST("HS::main() call app.exec");
    try {
        app.exec();

    } catch(...) {
        HSTEST("HS::main() app.exec() catch");
    }
    return 0;
}