www.pudn.com > symbianliulanqi.rar > BrCtlSampleAppLinkResolver.cpp


/* 
* ============================================================================ 
*  Name        : BrCtlSampleAppLinkResolver.cpp 
*  基于SYMBIAN,通过插件方式,实现浏览器. 
* ============================================================================ 
*/ 
 
// INCLUDE FILES 
#include  
#include  
#include  
#include  
#include "BrCtlSampleAppLinkResolver.h" 
 
// ================= MEMBER FUNCTIONS ======================= 
 
// --------------------------------------------------------- 
// CBrCtlSampleAppLinkResolver::ResolveEmbeddedLinkL 
// --------------------------------------------------------- 
// 
TBool  
CBrCtlSampleAppLinkResolver::ResolveEmbeddedLinkL(const TDesC& aEmbeddedUrl, 
    		                                      const TDesC& /*aCurrentUrl*/, 
        	                                      TBrCtlLoadContentType /*aLoadContentType*/,  
                                                  MBrCtlLinkContent& aEmbeddedLinkContent)  
    {         
    if (IsFileScheme(aEmbeddedUrl)) 
        { 
        GetFileNameL(aEmbeddedUrl); 
        HBufC8* buf = ReadFileLC(*iFileName); 
        HBufC* contentType = NULL; 
        TPtrC p(NULL, 0); 
        contentType = RecognizeLC(*iFileName, *buf); 
        aEmbeddedLinkContent.HandleResolveComplete(*contentType, p, buf);         
        CleanupStack::PopAndDestroy(2); // contentType, buf 
        return ETrue; 
        } 
    return EFalse; 
    } 
 
// --------------------------------------------------------- 
// CBrCtlSampleAppLinkResolver::ResolveLinkL 
// --------------------------------------------------------- 
// 
TBool  
CBrCtlSampleAppLinkResolver::ResolveLinkL(const TDesC& aUrl,  
                                          const TDesC& /*aCurrentUrl*/, 
                                          MBrCtlLinkContent& aBrCtlLinkContent)  
    {         
    if (IsFileScheme(aUrl)) 
        { 
        GetFileNameL(aUrl); 
        HBufC8* buf = ReadFileLC(*iFileName); 
        HBufC* contentType = NULL; 
        TPtrC p(NULL, 0); 
        contentType = RecognizeLC(*iFileName, *buf); 
        aBrCtlLinkContent.HandleResolveComplete(*contentType, p, buf);         
        CleanupStack::PopAndDestroy(2); // contentType, buf 
        return ETrue; 
        } 
    return EFalse; 
    } 
 
// --------------------------------------------------------- 
// CBrCtlSampleAppLinkResolver::CancelAll 
// --------------------------------------------------------- 
// 
void  
CBrCtlSampleAppLinkResolver::CancelAll()  
    {         
    } 
 
 
// --------------------------------------------------------- 
// CBrCtlSampleAppLinkResolver::ConstructL 
// --------------------------------------------------------- 
// 
void  
CBrCtlSampleAppLinkResolver::ConstructL() 
    { 
    } 
 
// --------------------------------------------------------- 
// CBrCtlSampleAppLinkResolver::~CBrCtlSampleAppLinkResolver 
// --------------------------------------------------------- 
// 
CBrCtlSampleAppLinkResolver::~CBrCtlSampleAppLinkResolver() 
    { 
    delete iFileName; 
    } 
 
 
// --------------------------------------------------------- 
// CBrCtlSampleAppLinkResolver::NewL 
// --------------------------------------------------------- 
// 
CBrCtlSampleAppLinkResolver*  
CBrCtlSampleAppLinkResolver::NewL() 
    { 
    CBrCtlSampleAppLinkResolver* self = new(ELeave)CBrCtlSampleAppLinkResolver; 
    CleanupStack::PushL(self); 
    self->ConstructL(); 
    CleanupStack::Pop(); 
    return self; 
    } 
 
// --------------------------------------------------------- 
// CBrCtlSampleAppLinkResolver::IsFileScheme 
// --------------------------------------------------------- 
// 
TBool  
CBrCtlSampleAppLinkResolver::IsFileScheme(const TDesC& aFileName) 
    { 
    _LIT(KFileScheme, "file://"); 
    if (aFileName.Length() > 0 && aFileName.Ptr() != NULL) 
        { 
        if (aFileName.FindF(KFileScheme) == 0) 
            { 
            return ETrue; 
            } 
        } 
    return EFalse; 
    } 
 
// --------------------------------------------------------- 
// CBrCtlSampleAppLinkResolver::ReadFile 
// --------------------------------------------------------- 
// 
HBufC8*  
CBrCtlSampleAppLinkResolver::ReadFileLC(const TDesC& aFileName) 
    { 
    RFs rfs; 
    RFile file; 
    User::LeaveIfError(rfs.Connect()); 
    CleanupClosePushL(rfs); 
    User::LeaveIfError(file.Open(rfs, aFileName, EFileRead)); 
    CleanupClosePushL(file); 
    TInt size; 
    User::LeaveIfError(file.Size(size)); 
    HBufC8* buf = HBufC8::NewLC(size); 
    TPtr8 bufPtr(buf->Des()); 
    User::LeaveIfError(file.Read(bufPtr)); 
    CleanupStack::Pop(); // buf 
    CleanupStack::PopAndDestroy(2); // file, rfs 
    CleanupStack::PushL(buf); 
    return buf; 
    } 
 
// --------------------------------------------------------- 
// CBrCtlSampleAppLinkResolver::RecognizeL 
// --------------------------------------------------------- 
// 
HBufC*  
CBrCtlSampleAppLinkResolver::RecognizeLC(const TDesC& aFileName, const TDesC8& aData) 
    { 
    TDataRecognitionResult dataType; 
    RApaLsSession apaSession; 
    TInt ret; 
    HBufC* contentTypeString = NULL; 
 
    User::LeaveIfError(apaSession.Connect()); 
    // Ask the application architecture to find the file type 
    ret = apaSession.RecognizeData(aFileName, aData, dataType); 
    apaSession.Close(); 
 
    if (ret == KErrNone && 
        (dataType.iConfidence == CApaDataRecognizerType::ECertain) || 
        (dataType.iConfidence == CApaDataRecognizerType::EProbable)) 
        { 
        // If the file type was found, try to match it to a known file type 
        TPtrC8 mimeTypePtr = dataType.iDataType.Des8(); 
        TInt len = mimeTypePtr.Length() + 1; 
        contentTypeString = HBufC::NewL(len);  
        contentTypeString->Des().Copy(mimeTypePtr); 
        contentTypeString->Des().ZeroTerminate(); 
        } 
    CleanupStack::PushL(contentTypeString); 
    return contentTypeString; 
    } 
 
// ----------------------------------------------------------------------------- 
// CBrCtlSampleAppLinkResolver::GetFileNameL 
// Translate the file name from a URL to a valid file name in the system. 
// ----------------------------------------------------------------------------- 
// 
TBool  
CBrCtlSampleAppLinkResolver::GetFileNameL(const TDesC& aFileName) 
    { 
    // This function accepts URLs in the following format: 
    // file://filename.xxx 
    // file:///filename.xxx 
    // file://c:/filename.xxx 
    // file:///c:/filename.xxx 
    // 
    _LIT(KFileScheme, "file://"); 
    _LIT(KDefaultDrivePath, "C:\\"); 
    _LIT(KPathChar, "\\"); 
     
    TInt count; 
    TInt index = 0; 
    TBool drvLetter = EFalse; 
    TUint16 c; 
     
    // Verify the file scheme 
    TPtrC urlPtr(aFileName); 
    if (urlPtr.FindF(KFileScheme) != 0) 
        { 
        return EFalse; 
        } 
    urlPtr.Set(urlPtr.Mid(KFileScheme().Length())); 
     
    // make sure there are enough characters in the filename before 
    // trying to check them 
    count = urlPtr.Length(); 
    if(count == 0) 
        { 
        return EFalse;            // no filename, so can't look at urlPtr[0] 
        } 
     
    // Skip the first '/' if there is one 
    if (urlPtr[0] == '/') 
        { 
        urlPtr.Set(urlPtr.Mid(1)); 
        } 
    count = urlPtr.Length(); 
     
    // Is there a drive letter? 
    if(count > 1) 
        { 
        // can check for drive letter 
        if (urlPtr[1 + index] == ':') 
            { 
            drvLetter = ETrue; 
            } 
        } 
    if(drvLetter == EFalse) 
        { 
        // 3 additional characters for the string "c:\" 
        count = urlPtr.Length() + 3; 
        } 
    iFileName = HBufC::NewL(count); 
    if (!drvLetter) 
        { 
        iFileName->Des().Append(KDefaultDrivePath); 
        } 
     
    TBool fragment(EFalse); 
    // Convert relative path containing /./ and /../ to absolute path 
    for (; index < urlPtr.Length() && !fragment; index ++) 
        { 
        switch(urlPtr[index]) 
            { 
            case '#':    //Check if there is a fragment '#' 
                { 
                fragment = ETrue; 
                continue; // Just stop there 
                } 
                 
            case '/': 
                { 
                iFileName->Des().Append(KPathChar); 
                break; 
                } 
            case '.': 
                { 
                if (index > 1 && urlPtr[index - 1] == '/') 
                    { 
                    if (index < count - 1 && urlPtr[index + 1] == '/') 
                        { 
                        index ++; // skip  ./ 
                        break; 
                        } 
                    if (index > 2 && index < count - 3 && 
                        urlPtr[index + 1] == '.' && urlPtr[index + 2] == '/') 
                        { 
                        TInt i = index - 2; 
                         
                        for (; i > 0 && urlPtr[i] != '/'; i--) {} // skip  /../ 
                         
                        iFileName->Des().SetLength(iFileName->Des().Length() - (index - i)); 
                        index += 2; 
                        break; 
                        } 
                    } 
                } 
                // no break 
                //lint -fallthrough 
                 
            default: 
                { 
                c = urlPtr[index]; 
                iFileName->Des().Append(&c, 1); 
                break; 
                } 
            }	// end of switch 
        } 
    return ETrue; 
} 
 
// End of File