csxhelp/src/CSXHHtmlTopicContainer.cpp
changeset 0 1f04cf54edd8
child 1 27f5851bd5a5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/csxhelp/src/CSXHHtmlTopicContainer.cpp	Tue Jan 26 15:15:23 2010 +0200
@@ -0,0 +1,591 @@
+/*
+* Copyright (c) 2006 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:  CCSXHHtmlTopicContainer class definition
+*
+*/
+
+
+#include "CSXHHtmlTOC2.h"
+#include "CSXHHtmlTOC1.h"
+#include "CSXHDocument.h"
+#include "CSXHAppUi.h"
+#include "CSXHHtmlTopicView.h"
+#include "CSXHViewIDs.h"
+#include <cshelp.rsg>
+#include "CsHelp.hrh"
+#include "CSXHHtmlTopicContainer.h"
+#include "AppLauncherForCSXH.h"
+#include "csxhconstants.h"
+
+
+#include <brctlinterface.h>
+#include <BrowserLauncher.h>
+#include <BrCtlDefs.h>
+
+#include <coemain.h>
+#include <AknUtils.h>
+#include <akntitle.h>
+#include <aknnotewrappers.h> 
+#include <AknGlobalNote.h>
+#include <apmrec.h>
+#include <apgcli.h>
+#include <zipfile.h> 
+#include <utf.h>
+#include <charconv.h>
+#include <bautils.h>
+
+_LIT(KContentType,"text/html");
+_LIT(KCsstextToRemovePathinfo,"<style>\n #APP_LAUNCH_LINK{display:none}\n</style>");
+
+// Standard construction sequence
+CCSXHHtmlTopicContainer* CCSXHHtmlTopicContainer::NewL(const TRect& aRect,CCSXHDocument 
+&aDocument,CCSXHHtmlTopicView *aView)
+    {
+    CCSXHHtmlTopicContainer* self = CCSXHHtmlTopicContainer::NewLC(aRect,aDocument,aView);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CCSXHHtmlTopicContainer* CCSXHHtmlTopicContainer::NewLC(const TRect& aRect,CCSXHDocument 
+&aDocument,CCSXHHtmlTopicView *aView)
+    {
+    CCSXHHtmlTopicContainer* self = new (ELeave) CCSXHHtmlTopicContainer(aDocument,aView);
+    CleanupStack::PushL(self);
+    self->ConstructL(aRect);
+    return self;
+    }
+
+CCSXHHtmlTopicContainer::CCSXHHtmlTopicContainer(CCSXHDocument &aDocument,CCSXHHtmlTopicView *aView)
+        : iTopic(NULL),iDocument(aDocument),iView(aView)
+        ,iAppLauncher(NULL), iLoadHtml(EFalse), iPrevPageCount(0), iBack(EFalse)
+
+    {
+    // no implementation required
+    }
+
+CCSXHHtmlTopicContainer::~CCSXHHtmlTopicContainer()
+    {
+    if(iBrCtrl)
+        {
+        iBrCtrl->SetFocus(EFalse);
+        iBrCtrl->RemoveLoadEventObserver(this);
+        delete iBrCtrl;
+        iBrLibrary.Close();
+        }
+    if(iAppLauncher)
+    	{
+    	delete iAppLauncher;
+    	}     
+    }
+
+void CCSXHHtmlTopicContainer::ConstructL(const TRect& aRect)
+    {
+    // Create a window for this application view
+    CreateWindowL();
+
+    // Set the windows size
+    SetRect(aRect);
+    if(KErrNone != iBrLibrary.Load(_L("BrowserEngine.dll")))
+    	{
+       	HBufC* ErrorMessage = CCSXHAppUi::GetCoeEnv()->AllocReadResourceLC(
+    				R_CSHELP_RETRIEVE_NO_MEMORY_TEXT);      
+    	CAknGlobalNote* note = CAknGlobalNote::NewLC();
+    	note->ShowNoteL(EAknGlobalInformationNote, *ErrorMessage);
+    	CleanupStack::PopAndDestroy(note); 
+    	CleanupStack::PopAndDestroy(ErrorMessage); 
+    	iDocument.SetDisplayTopic(iDocument.GetPrevTopic());
+		CCSXHAppUi::GetInstance()->HandleCommandL(ECSXHOpenItem);
+		User::Leave(KErrNoMemory);
+    	}     
+
+#ifdef __WINS__    
+    TLibraryFunction result = iBrLibrary.Lookup(10); 
+#else
+    TLibraryFunction result = iBrLibrary.Lookup(1);   
+#endif    
+		
+	FuncPtr_CreateBrowserControlL fptr  = (FuncPtr_CreateBrowserControlL)result;
+    
+    iBrCtrl = (*fptr)(
+                    this,aRect,
+                    TBrCtlDefs::ECapabilityDisplayScrollBar|
+                    TBrCtlDefs::ECapabilityClientResolveEmbeddedURL|
+#ifndef __SERIES60_30__                                 
+                    TBrCtlDefs::ECapabilityCursorNavigation|
+                    TBrCtlDefs::ECapabilityWebKitLite|
+#endif                                  
+                    TBrCtlDefs::ECapabilityClientNotifyURL,
+                    TBrCtlDefs::ECommandIdBase,this,this,NULL,this
+                    );
+    iBrCtrl->SetBrowserSettingL(TBrCtlDefs::ESettingsCSSFetchEnabled,1);    
+    iBrCtrl->AddLoadEventObserverL(this);   
+    
+    
+    SetSelectedFontSizeL(iView->GetCurrentFontSize());
+    iBrCtrl->MakeVisible(ETrue);
+    
+    ActivateL();
+    }
+
+void CCSXHHtmlTopicContainer::Draw(const TRect& /*aRect*/) const
+    {
+    CWindowGc& gc = SystemGc();
+    TRect rect = Rect();
+    gc.Clear(rect);    
+    }
+void CCSXHHtmlTopicContainer::SetAndLoadInitialTopicL(CCSXHHtmlTOC2* aTopic)
+	{
+	iTopic = aTopic;
+	TRAPD(err,LoadHtmlL());
+    if( KErrNone != err )
+	    {
+	    HBufC* ErrorMessage = CCSXHAppUi::GetCoeEnv()->AllocReadResourceLC(
+    				R_CSHELP_RETRIEVE_NO_MEMORY_TEXT);      
+    	CAknGlobalNote* note = CAknGlobalNote::NewLC();
+    	note->ShowNoteL(EAknGlobalInformationNote, *ErrorMessage);
+    	CleanupStack::PopAndDestroy(note); 
+    	CleanupStack::PopAndDestroy(ErrorMessage); 
+    	iDocument.SetDisplayTopic(iDocument.GetPrevTopic());
+		CCSXHAppUi::GetInstance()->HandleCommandL(ECSXHOpenItem);
+		User::Leave(KErrNoMemory);	    
+	    }
+ 
+	}
+
+void CCSXHHtmlTopicContainer::LoadHtmlL()
+    {
+    HBufC8 *htmlBuffer = STATIC_CAST(HBufC8*,iTopic->GetTopicContentL());
+    if(htmlBuffer)
+        {
+        CleanupStack::PushL(htmlBuffer);
+        TUid uid;
+        uid.iUid = KCharacterSetIdentifierIso88591;
+        _LIT8(KContentType,"text/html");
+        TDataType dataType(KContentType());
+        iTopic->GetHtmlUrlL(iUrlNoAnchors);
+        iBack = EFalse;
+        ClearHistoryL();
+        iLoadHtml = ETrue;
+        
+        //RUNTIME
+        //if it is context sensitive launch, Add CSS content to remove
+        //Application launch link.
+        if(iView->GetViewType() == CCSXHHtmlTopicView::EContextHtmlView)
+	        {
+	        HBufC8* ContextHtmlbuffer = HBufC8::NewLC(htmlBuffer->Size() + 100);
+	        TPtr8 bufferPtr = ContextHtmlbuffer->Des();
+	        bufferPtr.Copy(KCsstextToRemovePathinfo);
+	        bufferPtr.Append(htmlBuffer->Des());
+	        iBrCtrl->LoadDataL(iUrlNoAnchors,*ContextHtmlbuffer,dataType,uid);	
+	    	CleanupStack::PopAndDestroy(ContextHtmlbuffer);    	
+	        }
+        else
+	        {
+	        iBrCtrl->LoadDataL(iUrlNoAnchors,*htmlBuffer,dataType,uid);	
+	        }
+        CleanupStack::PopAndDestroy(htmlBuffer);
+        }
+    else
+        {
+        iTopic->GetHtmlUrlL(iUrlNoAnchors);
+        iBrCtrl->LoadUrlL(iUrlNoAnchors);
+        }
+    CheckForMSK();  
+    }
+
+TKeyResponse CCSXHHtmlTopicContainer::OfferKeyEventL(const TKeyEvent &  
+aKeyEvent,TEventCode  aType )
+    {
+    TKeyResponse result(EKeyWasNotConsumed);
+    
+    if ((aKeyEvent.iCode == EKeyEnter )&& (aType == EEventKey)
+    	&& (IsHyperLinkFocused()))
+        { 
+        HandleCommandOpenHyperLinkL();
+        CheckForMSK();
+        return EKeyWasConsumed; 
+        }
+    
+    if(iBrCtrl)
+        {
+        result = iBrCtrl->OfferKeyEventL(aKeyEvent, aType);        
+		CheckForMSK();
+		}       
+    return result;  
+    }
+
+TInt CCSXHHtmlTopicContainer::CountComponentControls() const
+    {
+    return 1; 
+    }
+
+CCoeControl* CCSXHHtmlTopicContainer::ComponentControl(TInt aIndex) const
+    {
+    switch (aIndex)
+        {
+        case 0:
+            return iBrCtrl;
+        default:
+            return NULL;
+        }
+    }
+    
+void CCSXHHtmlTopicContainer::HandleResourceChange(TInt aType)
+    {
+    CCSXHAppUi::GetInstance()->PropagateResourceChange(aType); 
+    }
+void CCSXHHtmlTopicContainer::HandleResourceChangeImpl(TInt aType)
+    {
+    if (aType == KEikDynamicLayoutVariantSwitch)
+        {
+        iBrCtrl->HandleResourceChange(aType);
+        TRect mainRect; 
+        TRect statusPaneRect;
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainRect);
+        SetRect(mainRect);
+            if(iBrCtrl)
+#ifndef __SERIES60_30__             
+                iBrCtrl->SetRect(Rect());
+#else                       
+                iBrCtrl->SetRect(mainRect);
+#endif              
+        DrawNow();
+        }
+    else
+        {
+        CCoeControl::HandleResourceChange(aType);   
+        }
+    }
+
+void CCSXHHtmlTopicContainer::SizeChanged()
+    {
+#ifndef __SERIES60_30__ 
+    if(iBrCtrl)
+        iBrCtrl->SetRect(Rect());
+#endif  
+    }
+
+void CCSXHHtmlTopicContainer::HandleCommandBackL()
+    {
+    iBrCtrl->HandleCommandL(TBrCtlDefs::ECommandIdBase + TBrCtlDefs::ECommandBack);
+    }
+ 
+
+TBool CCSXHHtmlTopicContainer::IsPrevPageAvbl()
+    {
+    if (iPrevPageCount > 0)
+      	{
+      	return ETrue;
+      	}
+     else
+      	{
+      	return EFalse;
+      	}
+    } 
+
+
+
+void CCSXHHtmlTopicContainer::ClearHistoryL()
+    {
+    iBrCtrl->HandleCommandL(TBrCtlDefs::ECommandIdBase + TBrCtlDefs::ECommandClearHistory);
+    iPrevPageCount = 0;
+    }
+ 
+TBool CCSXHHtmlTopicContainer::ResolveEmbeddedLinkL(const TDesC& /*aEmbeddedUrl*/,
+                                           const TDesC& /*aCurrentUrl*/,
+                                           TBrCtlLoadContentType /*aLoadContentType*/, 
+                                           MBrCtlLinkContent& /*aEmbeddedLinkContent*/)
+    {
+    return EFalse;
+    }
+// --------------------------------------------------------------------------
+// Handling for
+// 1) Compressed HTML content
+// 2) Application Launch Links
+// 3) External Hyperlinks
+// --------------------------------------------------------------------------
+TBool CCSXHHtmlTopicContainer::ResolveLinkL(const TDesC& aUrl, const TDesC& aCurrentUrl,
+                                   MBrCtlLinkContent& aBrCtlLinkContent)
+    {
+#ifdef FF_HELP_TUTORIAL_MERGE
+    if( KErrNotFound != aUrl.Find( KTutorialFileExtn ))
+        {
+        iView->LaunchTutorial();
+        return ETrue;
+        }
+#endif // FF_HELP_TUTORIAL_MERGE
+    if(NULL == iAppLauncher)
+		{
+		iAppLauncher = AppLauncherForCSXH::NewL();	
+		}
+        //Handling for application launch.
+    if(iAppLauncher->LaunchAppL(aUrl,aCurrentUrl))
+        return ETrue;//Link is resolved locally.
+        
+    if(CheckForExternalLinkL(aUrl))     
+        return ETrue;//Link is resolved locally.
+    
+    //Remove the Anchor, if any     
+    TInt DotPos = aUrl.LocateReverseF('.');
+    TInt HashPos = aUrl.LocateReverseF('#');
+    if(KErrNotFound != HashPos && HashPos > DotPos )
+        {
+        //Direct assignment does not work
+        iUrlNoAnchors.Copy(KEmptyString);
+        iUrlNoAnchors.Append(aUrl.Mid(0,HashPos));
+        }
+    else
+        {
+        //Direct assignment does not work
+        iUrlNoAnchors.Copy(KEmptyString);
+        iUrlNoAnchors.Append(aUrl);
+        }   
+    
+    HBufC8 *htmlBuffer = CCSXHHtmlTOC2::GetContentsFromUrlL(iUrlNoAnchors,CCSXHAppUi::GetCoeEnv(),iFeatureControl);
+    if(htmlBuffer)
+        {
+        TPtrC p(NULL,0);
+        aBrCtlLinkContent.HandleResolveComplete(KContentType,p,htmlBuffer);
+        delete htmlBuffer;
+        iLoadHtml = EFalse;
+        if (iBack)
+        	{
+        	iPrevPageCount--;
+        	iBack = EFalse;
+        	}
+        else
+        	{
+            iPrevPageCount++;
+        	}
+
+        return ETrue;//Link is resolved locally.    
+        }
+        
+    return  EFalse;
+    }
+
+void CCSXHHtmlTopicContainer::CancelFetchL()
+    {
+    if (iBrCtrl)
+        {
+        iBrCtrl->HandleCommandL(
+        	    		(TInt)TBrCtlDefs::ECommandCancelFetch + (TInt)TBrCtlDefs::ECommandIdBase ); 
+        }
+    }
+
+void CCSXHHtmlTopicContainer::CancelAll()
+    {
+
+    }
+
+
+void CCSXHHtmlTopicContainer::HandleResolveComplete(const TDesC& /*aContentType*/,
+                                           const TDesC& /*aCharset*/,
+                                           const HBufC8* /*aContentBuf*/)
+    {
+
+    }
+
+void CCSXHHtmlTopicContainer::HandleResolveError(TInt /*aError*/)
+    {
+    
+    }
+void CCSXHHtmlTopicContainer::RefreshL(CCSXHHtmlTOC2 *aTopic)
+    {
+  	SetAndLoadInitialTopicL(aTopic);
+    }
+
+// --------------------------------------------------------------------------
+// This callback function is used for the following
+// 1) When an HTML page is loaded, this callback function will be called. If 
+// this callback is invoked for hyperlink navigation, then the display topic
+// has to be updated. For example, the Application Topics option menu is
+// dependent on the dipslay topic.
+// 2) Updation of the softkey from Options-Close to Options-Back (& Vice-Versa)
+// in the context view as a result of hyperlink traveral
+// --------------------------------------------------------------------------
+void CCSXHHtmlTopicContainer::HandleBrowserLoadEventL(TBrCtlDefs::TBrCtlLoadEvent aLoadEvent, 
+                                    TUint /*aSize*/, TUint16 /*aTransactionId*/)
+    {
+    if(aLoadEvent == TBrCtlDefs::EEventLoadFinished)
+        {
+        
+        HBufC* title = iBrCtrl->PageInfoLC(TBrCtlDefs::EPageInfoTitle);
+        if(!title)
+            {
+            CleanupStack::PopAndDestroy(title);
+            return;
+            }
+        
+        //Update the title bar
+        CEikStatusPane* sp = CCSXHAppUi::GetInstance()->StatusPane();
+        CAknTitlePane* titlePane = STATIC_CAST(CAknTitlePane*, 
+        sp->ControlL(TUid::Uid(EEikStatusPaneUidTitle)));
+        titlePane->SetTextL(*title);
+        CleanupStack::PopAndDestroy(title);
+        
+        //For the context sensitive view, the softkey texts need to be changed.
+        //add label iLoadHtml for ESNN-7N9CLN.If the html is opened by 
+        //loadHtmlL, the iLoadHtml will be set to ETrue, which 
+        //can guarantee the RSK keep as "CLOSE" when context is sensitive.
+        if ((!iLoadHtml) && (iView->GetViewType() == CCSXHHtmlTopicView::EContextHtmlView))
+        {  
+            iView->SetViewTypeL(IsPrevHtmlPageAvblL() ? 
+                    CCSXHHtmlTopicView::EHtmlView : CCSXHHtmlTopicView::EContextHtmlView);
+        }
+        
+        //TSW Error:TKOI-74KE89: Help crashes when closing after viewing a link topic
+        //When user presses back keys very quickly, TOC2 objects use to destroy and 
+        //then browser call back function triggers which leads to crash. This check 
+        //will avoid crash.
+        TUid viewId = iDocument.GetDisplayTopic()->GetViewID();
+		if(viewId == KCSXHToc1ViewID ||	viewId == KCSXHKywdToc1ViewID
+		|| viewId == KCSXHToc2ViewID || viewId == KCSXHKywdToc2ViewID)
+			return;
+		
+        //When user clicks on Application Topics, application topics 
+        //corresponding to the topic being displayed has to be opened
+        //Hence update the Display topic information if required.
+        
+        //Check if this event is triggered for the first load after construction
+        TFileName url;
+        iTopic->GetHtmlUrlL(url);
+        if(url.Compare(iUrlNoAnchors) == 0)
+        	{
+        	iDocument.SetDisplayTopic(iTopic);
+        	iNewTopic = NULL;
+        	//Move the code from SetAndLoadInitialTopicL
+        	//TSW Error:EJZG-7E2BUV
+        	ClearHistoryL();
+        	return;
+        	}
+            
+        iNewTopic = iDocument.GetHtmlTopicForUrlL(iUrlNoAnchors);            
+        CheckForMSK();
+        }
+    }
+    
+CCSXHHelpContentBase* CCSXHHtmlTopicContainer::GetCurrActiveObject()
+    	{
+    	return iNewTopic;
+    	}    
+// --------------------------------------------------------------------------
+// Back Key Handling
+// --------------------------------------------------------------------------
+TBool CCSXHHtmlTopicContainer::HandleBackKeyL()
+    {
+    //When this view is initially created, the HTML content is loaded 
+    //using the LoadDataL function and hence it will not be part of the
+    //History stack but all other subsequest navigation by the user 
+    //using the hyperlinks will be part of the History Stack
+    if(IsPrevPageAvbl())
+        {
+        iBack = ETrue;
+        TRAPD(res,HandleCommandBackL());
+        if(res == KErrNone)
+            return ETrue;
+        else
+            ClearHistoryL();
+        }
+    ClearHistoryL();
+        
+    return EFalse;  
+    }
+TBool CCSXHHtmlTopicContainer::IsPrevHtmlPageAvblL()
+    {
+    if(IsPrevPageAvbl())
+        return ETrue;
+    
+    return EFalse;  
+    }
+
+void CCSXHHtmlTopicContainer::SetSelectedFontSizeL(TInt aValue)
+    {
+    iBrCtrl->SetBrowserSettingL(TBrCtlDefs::ESettingsFontSize,aValue);  
+    }
+    
+TInt CCSXHHtmlTopicContainer::GetCurrentValueL(TInt aSetting)
+    {
+        return iBrCtrl->BrowserSettingL(aSetting);  
+    }   
+
+void CCSXHHtmlTopicContainer::UpdateSoftkeyL(TBrCtlKeySoftkey /*aKeySoftkey*/,
+                                    const TDesC& /*aLabel*/,
+                                    TUint32 /*aCommandId*/,
+                                    TBrCtlSoftkeyChangeReason /*aBrCtlSoftkeyChangeReason*/)
+    {
+    }
+
+void CCSXHHtmlTopicContainer::UpdateBrowserVScrollBarL(TInt /*aDocumentHeight*/, 
+                                              TInt /*aDisplayHeight*/,
+                                              TInt /*aDisplayPosY*/ ) 
+    {
+    if(iBrCtrl)
+        CheckForMSK();
+}
+void CCSXHHtmlTopicContainer::UpdateBrowserHScrollBarL(TInt /*aDocumentWidth*/, 
+                                              TInt /*aDisplayWidth*/,
+                                              TInt /*aDisplayPosX*/ )
+    {
+    if(iBrCtrl)
+        CheckForMSK();
+    }
+void CCSXHHtmlTopicContainer::NotifyLayoutChange( TBrCtlLayout /*aNewLayout*/ )
+    {
+    }
+        
+void CCSXHHtmlTopicContainer::UpdateTitleL( const TDesC& /*aTitle*/ )
+    {
+    }
+
+void CCSXHHtmlTopicContainer::CheckForMSK()
+    {
+    if(IsHyperLinkFocused())
+        {
+        iView->SetMiddleSoftKey(ETrue); 
+        }
+    else
+        {
+        iView->SetMiddleSoftKey(EFalse);    
+        }
+    }
+    
+TBool CCSXHHtmlTopicContainer::IsHyperLinkFocused() 
+    {
+    if(TBrCtlDefs::EElementAnchor == iBrCtrl->FocusedElementType())
+        return ETrue;
+    else
+        return EFalse;
+    }
+    
+void CCSXHHtmlTopicContainer::HandleCommandOpenHyperLinkL()
+    {
+    iBrCtrl->HandleCommandL(TBrCtlDefs::ECommandIdBase + TBrCtlDefs::ECommandOpen);
+    }
+
+TBool CCSXHHtmlTopicContainer::CheckForExternalLinkL(const TDesC& aUrl)
+	{
+    TBool Result = EFalse;
+        
+    if( KErrNotFound != aUrl.Find(_L("http://")) |
+        KErrNotFound != aUrl.Find(_L("https://")) |
+        KErrNotFound != aUrl.Find(_L("ftp://")))
+        {
+        iAppLauncher->LaunchBrowserNGL(aUrl);           
+        Result = ETrue;
+        }
+        
+    return Result;
+	}
+