uifw/EikStd/cdlgsrc/EIKALERT.CPP
changeset 0 2f259fa3e83a
child 33 b3425bf29f82
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/cdlgsrc/EIKALERT.CPP	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,225 @@
+/*
+* Copyright (c) 1997-1999 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:
+*
+*/
+
+
+#include <eikalert.h>
+#include <eikon.hrh>
+#include <eikcdlg.rsg>
+#include <eikappui.h>
+
+#include <aknnotecontrol.h>
+#include <AknGlobalNote.h>
+#include <AknCapServerDefs.h>
+#include <AknSgcc.h>
+
+
+const TInt KEikAlertMaxMsgLength=17; // Maximum characters that fit on Avkon note
+const TInt KCbaPriorityOffset = 10;
+const TUint KCombinedBufferMaxLength = 80; // used with notifs
+
+_LIT(KENDL,"\n");
+
+
+void CEikAlert::ConstructL()
+	{
+	ConstructSleepingDialogL(R_EIK_DIALOG_ALERT);
+
+    // preallocate text, 
+    TBuf< KEikAlertMaxMsgLength*2 +1> buffer;
+    buffer.SetLength( KEikAlertMaxMsgLength*2 +1);
+    buffer.Fill( '1' );
+
+	buffer.Replace( KEikAlertMaxMsgLength, 1, KENDL);
+    SetTextL( buffer );
+
+    Window().SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront-1);
+	}
+
+void CEikAlert::RunAlert(const TDesC& aMsg1,const TDesC& aMsg2)
+	{
+	iMsg1=(&aMsg1);
+	iMsg2=(&aMsg2);
+	RouseSleepingDialog();
+	}
+
+void CEikAlert::Release()
+	{
+	delete this;
+	}
+
+CEikDialog* CEikAlert::AsEikDialog()
+	{
+	return this;
+	}
+
+void CEikAlert::PreLayoutDynInitL()
+	{
+    TBuf< KEikAlertMaxMsgLength*2 + 1 > buffer;
+
+    if ( iMsg1->Length() > KEikAlertMaxMsgLength )
+        {
+        buffer.Copy( iMsg1->Left( KEikAlertMaxMsgLength ) );
+        }
+    else
+        {
+        buffer.Copy( *iMsg1 );
+        }
+
+    if ( iMsg2->Length() )
+        {
+        buffer.Append( '\n' );
+        }
+
+    if ( iMsg2->Length() > KEikAlertMaxMsgLength )
+        {
+        buffer.Append( iMsg2->Left( KEikAlertMaxMsgLength ) );
+        }
+    else
+        {
+        buffer.Append( *iMsg2 );
+        }
+
+    // This cannot leave because long enough text has been preallocated
+    // in ConstructL.
+	SetNoMemoryAllocation();
+    SetTextL( buffer );
+
+	// Update CBA stack priority, to match dialog priority
+	CCoeControl* cba = ButtonGroupContainer().ButtonGroup()->AsControl();
+	iEikonEnv->RemoveFromStack(cba);
+	iEikonEnv->EikAppUi()->AddToStackL(cba, ECoeStackPriorityAlert+KCbaPriorityOffset, ECoeStackFlagRefusesFocus);	// Won't fail since we just removed it (and array will not reallocate)
+	}
+
+EXPORT_C void CEikAlert::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CAknNoteDialog::HandlePointerEventL(aPointerEvent); 
+    }
+
+EXPORT_C void* CEikAlert::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }
+
+void CEikAlert::CEikDialog_Reserved_1()
+	{
+	}
+
+void CEikAlert::CEikDialog_Reserved_2()
+	{
+	}
+	
+void CEikAlert::CAknNoteDialog_Reserved()
+	{
+	}
+
+CEikAlertNotifier::~CEikAlertNotifier()
+    {
+    delete iLocalDialog;
+    delete iNotifierBuffer;        
+    }
+
+void CEikAlertNotifier::ConstructL()
+    {
+    iNotifierBuffer = CBufFlat::NewL(0); // no need to expand later on
+    iNotifierBuffer->SetReserveL(200); // about 80 chars and control bytes
+    RThread r;
+    if (r.Name().CompareF(KAknCapServerThreadName) == 0)
+        {
+        CreateLocalDialogIfRequired();
+        }
+    
+    }
+
+class RAknUiServer2: public RAknUiServer
+    {
+    public:
+    void DoSendNotifBuf(TPtrC8& aPtr)
+       {
+       TPckgBuf<SAknGlobalNoteReturnParams> retPckg;
+       SendReceive(EStartNotifier,TIpcArgs(KAknGlobalNoteUid.iUid,&aPtr, &retPckg));
+       }
+    };
+
+
+void CEikAlertNotifier::RunAlert(const TDesC& aTitle, const TDesC& aMsg)
+    {
+    RAknUiServer2* client = (RAknUiServer2*) CAknSgcClient::AknSrv();
+    if (!client || client->Handle() == 0)
+        {
+        CreateLocalDialogIfRequired();
+        if (iLocalDialog)
+            iLocalDialog->RunAlert(aTitle, aMsg);
+        return;
+        }
+    
+    TBuf<KCombinedBufferMaxLength> combinedBuffer; // so sad, too bad
+    combinedBuffer.Append(aTitle.Left(Min(aTitle.Length(), KCombinedBufferMaxLength)));
+    if (combinedBuffer.Length() < KCombinedBufferMaxLength-1 && aMsg.Length())
+        {
+        combinedBuffer.Append(KENDL);
+        combinedBuffer.Append(aMsg.Left(Min(KCombinedBufferMaxLength-combinedBuffer.Length(),aMsg.Length())));
+        }   
+     CAknGlobalNote::DoGlobaNoteBufferL(
+        EAknGlobalWarningNote,
+        0,
+        R_AVKON_SOFTKEYS_OK_EMPTY,
+        -1,
+        -1,
+        -1,
+        -1,
+        EFalse,
+        ETrue,
+        combinedBuffer,
+        iNotifierBuffer
+        );
+    
+    TPtrC8 bufferPtr;
+    bufferPtr.Set(iNotifierBuffer->Ptr(0));
+    
+    client->DoSendNotifBuf(bufferPtr);
+    }
+
+void CEikAlertNotifier::Release()
+    {
+    delete this;
+    }
+
+CEikDialog* CEikAlertNotifier::AsEikDialog()
+    {
+    CreateLocalDialogIfRequired();
+    return iLocalDialog;
+    }
+
+void CEikAlertNotifier::CreateLocalDialogIfRequired()
+    {
+    if (!iLocalDialog)
+        {
+        iLocalDialog = new CEikAlert;
+        if (iLocalDialog)
+            {
+            TRAPD(err, iLocalDialog->ConstructL());
+            if (err)
+                {
+                delete iLocalDialog;
+                iLocalDialog = 0;
+                }
+            }
+        }
+    }
+
+
+