browserplugin/cpixnpplugin/src/ccpixnpplugininterface.cpp
author hgs
Fri, 15 Oct 2010 11:45:38 +0530
changeset 27 7a8855317cbd
parent 0 ccd0fd43f247
permissions -rw-r--r--
201041

/*
* Copyright (c) 2010 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:  Interface to Browser for handling embedded system info requests.
 *
*/

// INCLUDE FILES
#include "CCPixNPPluginInterface.h"
#include "HarvesterServerLogger.h"
#include <string.h>
#include <common.h>

#include "utf.h"

#include "CCPixNPSearcher.h"
#include "CCPixNPPluginEcom.h"
#include "CPixNPExceptions.h"
#include "CMobileInfo.h"

#include "NPUtils.h"
using namespace nputils; 


// ============================ MEMBER FUNCTIONS ===============================

CCPixNPPluginInterface::~CCPixNPPluginInterface()
    {
    }

// -----------------------------------------------------------------------------

const NPUTF8 *CPixNPPluginPropertyNames[] =
	{ 
	"DOCUID",				// 0
	"APPCLASS",
	"EXCERPT",
	"MIMETYPE", 
	"AGGREGATE",			
	"DEFAULT"               // 5
	"TERM",
	"DOCFREQ",
	"ANALYZER_STANDARD",
	"TOKENIZER_STANDARD",   
	"TOKENIZER_WHITESPACE", // 10
	"TOKENIZER_LETTER",     
	"TOKENIZER_KEYWORD",
	"FILTER_STANDARD",
	"FILTER_LOWERCASE",
	"FILTER_ACCENT",        // 15
	"FILTER_STOP",
	"FILTER_STEM",
   	"FILTER_LENGTH",
   	"LANG_EN",
  	"LANG_FI",              // 20
  	"LANG_HU",
  	"LANG_RU"
    };



typedef const TDesC& (CCPixNPPluginInterface::*CPixNPPluginGetPropertyMethod)() const;

const CPixNPPluginGetPropertyMethod CPixNPPluginGetPropertyMethods[] =
	{ 
	&CCPixNPPluginInterface::DocUidFieldName,		// 0
	&CCPixNPPluginInterface::AppClassFieldName,
	&CCPixNPPluginInterface::ExcerptFieldName,
	&CCPixNPPluginInterface::MimeTypeFieldName, 
	&CCPixNPPluginInterface::AggregateFieldName, 
	&CCPixNPPluginInterface::DefaultFieldName,	    // 5
	&CCPixNPPluginInterface::TermTextFieldName,
	&CCPixNPPluginInterface::TermDocFreqFieldName, 
	&CCPixNPPluginInterface::StandardAnalyzerId,
	&CCPixNPPluginInterface::StandardTokenizerId, 
	&CCPixNPPluginInterface::WhitespaceTokenizerId,  // 10
	&CCPixNPPluginInterface::LetterTokenizerId,
	&CCPixNPPluginInterface::KeywordTokenizerId, 
	&CCPixNPPluginInterface::StandardFilterId,
	&CCPixNPPluginInterface::LowercaseFilterId, 
	&CCPixNPPluginInterface::AccentFilterId, 		// 15
	&CCPixNPPluginInterface::StopFilterId, 
	&CCPixNPPluginInterface::StemFilterId, 
	&CCPixNPPluginInterface::LengthFilterId, 
	&CCPixNPPluginInterface::EnglishLanguageId, 
	&CCPixNPPluginInterface::FinnishLanguageId, 		// 20
	&CCPixNPPluginInterface::HungarianLanguageId, 
	&CCPixNPPluginInterface::RussianLanguageId, 
    };


const NPUTF8 *CPixNPPluginMethodNames[] =
	{
	"createSearcher",
	"defineVolume",
	"undefineVolume",
    "openContact",
    "openMessaging",
    "openCalendar",
    "openMaps",
    "getCountryCode",
    "getVersionNumber",
    "openNote",
    "getDriveFromMediaId"
	};

void CCPixNPPluginInterface::InitInterfaceL()
    {
    SetIdentifiersL( CPixNPPluginPropertyNames, sizeof(CPixNPPluginPropertyNames)/sizeof(CPixNPPluginPropertyNames[0]),
    				 CPixNPPluginMethodNames, sizeof(CPixNPPluginMethodNames)/sizeof(CPixNPPluginMethodNames[0]) );
    }

// -----------------------------------------------------------------------------

bool CCPixNPPluginInterface::InvokeL(NPIdentifier name, NPVariant* args, uint32_t argCount, NPVariant *result)
    {
    VOID_TO_NPVARIANT( *result ); // sets the result empty
    
    if ( name == iMethodIdentifiers[0] ) // createSearcher
        {
        if ( argCount == 1 ) 
        	{
            CPIXLOGSTRING("CCPixNPPluginInterface::InvokeL(1) : Requesting search server session");
			TRAPD(err, 
				HBufC16* baseAppClass = VariantToHBufC16LC( args[0] );
				
				CPixNPSearcherObject *object = (CPixNPSearcherObject *)NPN_CreateObject (iInstanceHandle, CPixNPSearcherClass);
				CCPixNPSearcher* customObject = CreateSearcherL( *baseAppClass  );
				customObject->SetInstance( iInstanceHandle, &object->object );
				object->plugin = customObject;
				OBJECT_TO_NPVARIANT( (NPObject*)object, *result );
				
				CleanupStack::PopAndDestroy( baseAppClass ); 
				);
			// TODO: Report err
        	} 
        else if ( argCount == 2 ) 
        	{ 
            CPIXLOGSTRING("CCPixNPPluginInterface::InvokeL(2) : Requesting search server session");
			TRAPD(err, 
				HBufC16* baseAppClass = VariantToHBufC16LC( args[0] );
				HBufC16* defaultField = VariantToHBufC16LC( args[1] );
				
				CPixNPSearcherObject *object = (CPixNPSearcherObject *)NPN_CreateObject (iInstanceHandle, CPixNPSearcherClass);
				CCPixNPSearcher* customObject = CreateSearcherL( *baseAppClass, *defaultField );
				customObject->SetInstance( iInstanceHandle, &object->object );
				object->plugin = customObject;
				OBJECT_TO_NPVARIANT( (NPObject*)object, *result );
				
				CleanupStack::PopAndDestroy( defaultField ); 
				CleanupStack::PopAndDestroy( baseAppClass );
				);
			// TODO Report err
        	}
        else 
        	{
        	// FIXME: Doesn't work
        	NPString string; 
        	// ugly conversion? 
        	string.UTF8Characters = reinterpret_cast<const char*>(KCPixNPNotEnoughArgumentsException().Ptr());
        	string.UTF8Length = KCPixNPNotEnoughArgumentsException().Length(); 
        	//NPN_SetException( this->iNpObject, &string );
        	}		
        return true;
        }
    else if ( name == iMethodIdentifiers[1] ) // defineVolume
        {
        TRAPD( err, InvokeDefineVolumeL( name, args, argCount, result ) );
        if ( KErrNone == err )
            {
            return true; // TODO Report err
            }
        return true;
        }
    else if ( name == iMethodIdentifiers[2] ) // undefineVolume
        {
        TRAPD( err, InvokeUnDefineVolumeL( name, args, argCount, result ) );
        if ( KErrNone == err )
            {
            return true; // TODO Report err
            }
        return true;
        }
    else if ( name == iMethodIdentifiers[3] ) // openContact
        {
    	if (argCount >= 1) 
    		{
			TInt contactId = VariantToInt( args[0] );
			TRAPD(err, OpenContactL(contactId));
			// TODO: report err
    		}
		// TODO: Report err
        return true;
        }    
    else if ( name == iMethodIdentifiers[4] ) // openMessaging
        {
    	if (argCount >= 1) 
    		{
			TInt mesId = VariantToInt( args[0] );
			TRAPD(err, OpenMessagingL(mesId));
			// TODO: report err
    		}
		// TODO: Report err
        return true;
        }    
    else if ( name == iMethodIdentifiers[5] ) // openCalendar
        {
    	if (argCount >= 1) 
    		{
			TInt calendarId = VariantToInt( args[0] );
			TRAPD(err, OpenCalendarL(calendarId));
			// TODO: report err
    		}
		// TODO: Report err
        return true;
        }        
    else if ( name == iMethodIdentifiers[6] ) // openMaps
        {
        if (argCount >= 2) 
            {
            TReal latitude = VariantToDouble( args[0] );
            TReal longitude = VariantToDouble( args[1] );
            TRAPD(err, OpenMapsL(latitude, longitude));
            // TODO: report err
            }
        // TODO: Report err
        return true;
        }        
    else if ( name == iMethodIdentifiers[7] ) // getCountryCode
        {
		TInt mccInt(0);
		TBuf<10> mcc; //MCC code has 3 digits 
		TRAPD(err, CMobileInfo::GetInfoL(mcc));
		if (KErrNone == err)
			{
			TLex lex(mcc);
			lex.Val(mccInt);
			}
		INT32_TO_NPVARIANT(mccInt, *result); 
        return true;
        }
    else if ( name == iMethodIdentifiers[8] ) // getVersionNumber
        {
		TInt versionNumber(0);
		versionNumber = GetVersionNumber();
		INT32_TO_NPVARIANT(versionNumber, *result); 
        return true;
        }
	else if ( name == iMethodIdentifiers[9] ) // openNote
        {
        if (argCount >= 1) 
            {
            TInt noteId = VariantToInt( args[0] );
            TRAPD(err, OpenNoteL(noteId));
            // TODO: report err
            }
        // TODO: Report err
        return true;
        } 
	else if( name == iMethodIdentifiers[10] ) //getDriveFromMediaId
	    {
	    if (argCount >= 1) 
            {
	        //Get arg[0] convert from Variant to Descriptor and get the drive
	        HBufC16* mediaId = VariantToHBufC16LC( args[0] );
	        TBuf<5> bufMedia;
	        GetDriveFromMediaIdL(mediaId,bufMedia);
	        DescriptorToVariantL(bufMedia,*result);
	        //Convert bufMedia to variant
	        CleanupStack::PopAndDestroy(mediaId);
            }
        // TODO: Report err
        return true;
	    }
    return false;
    }

// -----------------------------------------------------------------------------



bool CCPixNPPluginInterface::GetProperty (NPIdentifier name, NPVariant *variant)
    {
    // default variant value maps to javascript undefined
    VOID_TO_NPVARIANT(*variant);
    
	for (int i = 0; i < iMethodCount; i++) 
		{
		if ( name == iPropertyIdentifiers[i] ) 
			{
			TRAP_IGNORE(
				CPixNPPluginGetPropertyMethod method = CPixNPPluginGetPropertyMethods[i];
				DescriptorToVariantL((*this.*method)(), *variant);
			);
			return true; 
			}
		}
	
    return false;
    }

// -----------------------------------------------------------------------------

bool CCPixNPPluginInterface::SetPropertyL( NPIdentifier /*name*/, NPVariant* /*variant*/ )
    {
    return false;
    }


// -----------------------------------------------------------------------------
// NPClass Function

NPObject *CPixPluginAllocate ()
    {
    CPixPluginObject *newInstance = (CPixPluginObject *)User::Alloc (sizeof(CPixPluginObject));       
    return (NPObject *)newInstance;
    }

void CPixPluginInvalidate ()
    {
    
    }

void CPixPluginDeallocate (CPixPluginObject* obj) 
    {    
    obj->plugin->Deallocate();
    User::Free ((void *)obj);
    }    
 
bool CPixPluginHasMethod(CPixPluginObject* obj, NPIdentifier name)
    {
    return obj->plugin->HasMethod(name);
    }

bool CPixPluginInvokeFunctionL(CPixPluginObject* obj, NPIdentifier name, NPVariant *args, uint32_t argCount, NPVariant *result)
    {
    return obj->plugin->InvokeL(name, args, argCount, result);
    }    

bool CPixPluginHasProperty(CPixPluginObject* obj, NPIdentifier name)
    {
    return obj->plugin->HasProperty(name);
    }    
    
bool CPixPluginGetProperty (CPixPluginObject* obj, NPIdentifier name, NPVariant *variant)
    {
    return obj->plugin->GetProperty(name,variant);
    }

void CPixPluginSetProperty (CPixPluginObject* obj, NPIdentifier name, NPVariant *variant)
    {
    TRAP_IGNORE(obj->plugin->SetPropertyL(name,variant));
    }

void CCPixNPPluginInterface::InvokeDefineVolumeL(NPIdentifier /*name*/, NPVariant* args, uint32_t argCount, NPVariant */*result*/)
    {
    if ( 2 == argCount )
        {
        HBufC16* baseAppClass = VariantToHBufC16LC( args[0] );
        HBufC16* indexDbPath = VariantToHBufC16LC( args[1] );

        if ( iInstanceHandle )
            {
            DefineVolumeL( *baseAppClass, *indexDbPath );
            }

        CleanupStack::PopAndDestroy( indexDbPath );
        CleanupStack::PopAndDestroy( baseAppClass );
        }
    else
        {
        User::Leave( KErrArgument );
        }
    }

void CCPixNPPluginInterface::InvokeUnDefineVolumeL(NPIdentifier /*name*/, NPVariant* args, uint32_t argCount, NPVariant */*result*/)
    {
    if ( 1 == argCount )
        {
        HBufC16* baseAppClass = VariantToHBufC16LC( args[0] );

        if ( iInstanceHandle )
            {
            UnDefineVolumeL( *baseAppClass );
            }

        CleanupStack::PopAndDestroy( baseAppClass );
        }
    else
        {
        User::Leave( KErrArgument );
        }
    }

//  End of File