⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cipherappui.cpp

📁 Symbian 手机编程
💻 CPP
字号:
/* Copyright (c) 2003, Nokia. All rights reserved */

#include <avkon.hrh>
#include <aknnotewrappers.h> 
#include <aknlists.h>
#include <s32file.h>
#include <s32crypt.h>

#include <Cipher.rsg>

#include "Cipher.pan"
#include "CipherAppUi.h"
#include "CipherAppView.h"
#include "Cipher.hrh"

// Maximum length of the password
const TInt KAknExQueryTextBufLength = 24;

// Maximum length of the key data
const TInt KMaxKeyDataLength = 2024;

// Maximum length of the message
const TInt KMaxPlainTextDataLength = 1012;

// Location of the encrypted file
_LIT(KCipherFilePath,"\\system\\apps\\cipher\\cipher.enc");
_LIT(KCipherDir,"\\system\\apps\\cipher\\");

// ConstructL is called by the application framework
void CCipherAppUi::ConstructL()
    {
    BaseConstructL();
    iAppView = CCipherAppView::NewL(ClientRect());
    iAppView->SetMopParent(this);
    AddToStackL(iAppView);
    }

CCipherAppUi::CCipherAppUi()                              
    {
    // No implementation required
    }

CCipherAppUi::~CCipherAppUi()
    {
    if (iAppView)
        {
        iEikonEnv->RemoveFromStack(iAppView);
        delete iAppView;
        iAppView = NULL;
        }
    }


void CCipherAppUi::HandleCommandL(TInt aCommand)
    {
    switch(aCommand)
        {
        case EEikCmdExit:
        case EAknSoftkeyExit:
            Exit();
            break;

        case ECipherEncrypt:
            EncryptL();
            break;

        case ECipherDecrypt:
            DecryptL();
            break;

        default:
            Panic(ECipherBasicUi);
            break;
        }
    }


void CCipherAppUi::EncryptL()
    {
    // Query the user for the password and text
    TBuf<KAknExQueryTextBufLength> textToEncrypt;
    TBuf<KAknExQueryTextBufLength> password;
    
    CAknMultiLineDataQueryDialog* dlg = 
        CAknMultiLineDataQueryDialog::NewL(textToEncrypt, password);
    if (!dlg->ExecuteLD(R_DIALOG_TEXT_PASSWORD_QUERY))
		{
        return;
		}

    // Create a file to write the cipher text to
    RFs fileSession;
    User::LeaveIfError(fileSession.Connect());
    CleanupClosePushL(fileSession);
    fileSession.MkDir(KCipherDir); // Ignore return value
    RFile file;
    if (file.Replace(fileSession, KCipherFilePath, EFileWrite) != KErrNone)
        {
        CAknInformationNote* informationNote = new (ELeave)CAknInformationNote;

        _LIT(KCreateFailedMessage,"Failed to create cipher.enc");
        informationNote->ExecuteLD(KCreateFailedMessage);
        CleanupStack::PopAndDestroy(); // Close fileSession
        return;
        }
    CleanupClosePushL(file);

    // Set up the encryption engine with the user supplied password
    CBoundedSecurityBase* encrypter = Security::NewL();
    CleanupStack::PushL(encrypter);
    encrypter->SetL(KNullDesC, password);

    // Write the security data, used in the decryption process to
    // verify the password
    RFileWriteStream outputFileStream(file);
    CleanupClosePushL(outputFileStream);
    outputFileStream << encrypter->SecurityData(); // Must use streaming api not WriteL

    // Write the encrypted data
    REncryptStream encryptedFileStream;
    encryptedFileStream.AttachLC(outputFileStream, *encrypter, KNullDesC8); 
    encryptedFileStream << textToEncrypt;
    encryptedFileStream.Close();
    encryptedFileStream.Pop();

    // Clean up
    CleanupStack::PopAndDestroy(); // Close outputFileStream
    CleanupStack::PopAndDestroy(encrypter); 
    CleanupStack::PopAndDestroy(); // Close file 
    CleanupStack::PopAndDestroy(); // Close fileSession
    
    _LIT(KEncryptedText,"Encrypted text:");
    iAppView->PrintLineL(KEncryptedText);

    iAppView->PrintLineL(textToEncrypt);

    _LIT(KToFile,"to file cipher.enc");
    iAppView->PrintLineL(KToFile);
    }

void CCipherAppUi::DecryptL()
    {
    // Query the user for the password
    TBuf<KAknExQueryTextBufLength> password;
    CAknTextQueryDialog* dlg = 
        new (ELeave) CAknTextQueryDialog(password, CAknQueryDialog::ENoTone);
    if (! dlg->ExecuteLD(R_DIALOG_PASSWORD_QUERY))
    {
        return;
    }

    // Open file containing encrypted data
    RFs fileSession;
    User::LeaveIfError(fileSession.Connect());
    CleanupClosePushL(fileSession);
    RFile file;
    User::LeaveIfError(file.Open(fileSession, KCipherFilePath, EFileRead));
    CleanupClosePushL(file);

    RFileReadStream inputFileStream(file);
    CleanupClosePushL(inputFileStream);

    // Read the security data 
    HBufC8* securityData = HBufC8::NewLC(inputFileStream, KMaxKeyDataLength);

    // Create security object, using the read security data
    CBoundedSecurityBase* decrypter = Security::NewL(*securityData); 
    CleanupStack::PushL(decrypter);

    // Authenticate password
    TRAPD(err, decrypter->PrepareL(password));
    if (err != KErrNone)
        {
        CAknInformationNote* informationNote = new (ELeave)CAknInformationNote;

        _LIT(KPasswdFailedMessage,"Failed to verify password!");
        informationNote->ExecuteLD(KPasswdFailedMessage);
        }
    else 
        {
        // Read the encrypted data
        RDecryptStream decryptedFileStream;
        decryptedFileStream.AttachLC(inputFileStream, *decrypter, KNullDesC8); 
        CleanupClosePushL(decryptedFileStream);
        HBufC* decryptedData = HBufC::NewLC(decryptedFileStream, KMaxPlainTextDataLength);

        _LIT(KDecryptedMessage,"Decrypted cipher.enc");
        _LIT(KContentsMessage,"Contents:");
        iAppView->PrintLineL(KDecryptedMessage);
        iAppView->PrintLineL(KContentsMessage);
        iAppView->PrintLineL(*decryptedData);

        CleanupStack::PopAndDestroy(decryptedData);
        CleanupStack::PopAndDestroy(); // Close decryptedFileStream
        decryptedFileStream.Pop(); // Removes item placed on cleanup stack by AttachLC
        }

    CleanupStack::PopAndDestroy(decrypter);
    CleanupStack::PopAndDestroy(securityData);

    CleanupStack::PopAndDestroy(); // Close inputFileStream 
    CleanupStack::PopAndDestroy(); // Close file 
    CleanupStack::PopAndDestroy(); // Close fileSession
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -