diff -r 000000000000 -r f1112f777ce9 testmgmt/testdriver/shared/com.symbian.jstat/nativeSrc/JStat.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testmgmt/testdriver/shared/com.symbian.jstat/nativeSrc/JStat.cpp Mon Mar 08 15:05:03 2010 +0800 @@ -0,0 +1,307 @@ +/* +* Copyright (c) 2005-2009 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: +* +*/ + + +//Source file that creates the interface between the C++ * +//STAT component and Java. + +#include +#include + +#include + +#include "com_symbian_jstat_JStat.h" +#include "Stat.h" +#include "StatExp.h" + +static const int MAX_PORT_STRING=6; +char ComPort[MAX_PORT_STRING]=""; + +HMODULE ihLib = NULL; +PROC_CONNECT iptrConnect = NULL; +PROC_DISCONNECT iptrDisconnect = NULL; +PROC_SENDRAWCOMMAND iptrSendRawCommand = NULL; +PROC_SETCOMMANDLOGGING iptrSetCommandLogging = NULL; +PROC_GETERROR iptrGetError = NULL; +PROC_VERSION iptrVersion = NULL; + +PROC_GETRECEIVEDDATA iptrGetReceivedData = NULL; + +int iType; + + +void jstring2string( JNIEnv *env, const jstring src, std::string &dest ) +{ + const char *ptr = env->GetStringUTFChars( src, false ); + dest = ptr; + env->ReleaseStringUTFChars( src, ptr ); +} + +void string2jstring( JNIEnv *env, const char* src, jstring &dest ) +{ + dest = env->NewStringUTF( src ); +} + + +JNIEXPORT jint JNICALL Java_com_symbian_jstat_JStatRunCommand_connect + (JNIEnv *_env, jobject, jstring _pszPlatformType) +{ + try { + using std::cout; + using std::endl; + + int connection=-1; + std::string aIPAddress; + std::string pszPlatformType; + + jstring2string( _env, _pszPlatformType, pszPlatformType ); + + //*********************************************************************** + // USB + //*********************************************************************** + if(strncmp(pszPlatformType.c_str(),"usb",3) == 0) + { + strcat(ComPort,pszPlatformType.c_str( )+3); + iType=SymbianUsb; + } + + + //*********************************************************************** + // TCP/IP + //*********************************************************************** + else if(strncmp(pszPlatformType.c_str(),"tcp",3) == 0) + { + aIPAddress = pszPlatformType.substr(4); + pszPlatformType = pszPlatformType.substr(0,3); + iType=SymbianSocket; + } + + + //*********************************************************************** + // Infrared + //*********************************************************************** + else if(strncmp(pszPlatformType.c_str( ),"ir",2) == 0) + { + strcpy(ComPort,"COM"); + strcat(ComPort,pszPlatformType.c_str( )+2); + } + + //*********************************************************************** + // Serial + //*********************************************************************** + else if(strncmp(pszPlatformType.c_str( ),"serial",6) == 0) + { + strcpy(ComPort,"COM"); + strcat(ComPort,pszPlatformType.c_str( )+6); + iType=SymbianSerial; + } + + //*********************************************************************** + // Bluetooth + //*********************************************************************** + else if(strncmp(pszPlatformType.c_str( ),"bt",2) == 0) + { + strcpy(ComPort,"COM"); + strcat(ComPort,pszPlatformType.c_str( )+2); + iType=SymbianBluetooth; + } + + // load stat library first from local, if failed from epoc32 + + HMODULE ihLib = ::LoadLibrary( DLLName ); + + if( ihLib == NULL ) + { + char path[MAX_PATH]=".\\stat.dll"; + sprintf( path, "%s\\%s", DLLFolder, DLLName ); + ihLib = ::LoadLibrary( path ); + } + + //if fails loading stat.dll return -1 + if( ihLib == NULL ) + { + cout << "Could not connect JStat.dll to STAT.dll." << endl; + return -1; + } + + // load functions + iptrConnect = reinterpret_cast(::GetProcAddress( ihLib, ProcConnect )); + iptrDisconnect = reinterpret_cast(::GetProcAddress( ihLib, ProcDisconnect )); + iptrSendRawCommand = reinterpret_cast(::GetProcAddress( ihLib, ProcSendRawCommand )); + iptrSetCommandLogging = reinterpret_cast(::GetProcAddress( ihLib, ProcSetCommandLogging )); + iptrGetError = reinterpret_cast(::GetProcAddress( ihLib, ProcGetError )); + iptrGetReceivedData = reinterpret_cast(::GetProcAddress( ihLib, ProcGetReceivedData )); + + //check all fuunctions were correctly loaded + if (iptrConnect == NULL) + { + cout << "Could not load JStat Function CONNECT." << endl; + return -1; + } + if (iptrDisconnect == NULL) + { + cout << "Could not load JStat Function DISCONNECT." << endl; + return -1; + } + if (iptrSendRawCommand == NULL) + { + cout << "Could not load JStat Function SENDRAWCOMMAND." << endl; + return -1; + } + if (iptrSetCommandLogging == NULL) + { + cout << "Could not load JStat Function SETCOMMANDLOGGING." << endl; + return -1; + } + if (iptrGetError == NULL) + { + cout << "Could not load JStat Function GETERROR." << endl; + return -1; + } + if (iptrGetReceivedData == NULL) + { + cout << "Could not load JStat Function GETRECIEVEDDATA." << endl; + return -1; + } + + + //connect using the previously set type + if(iType==SymbianSocket) + { + connection = (iptrConnect)((STATConnectType)iType,aIPAddress.c_str(),NULL,NULL); + } + else + { + connection = iptrConnect((STATConnectType)iType,ComPort,NULL,NULL); + } + + + if(!connection) + { + cout << "Could not connect JStat with transport." << endl; + return -1; + } + + + // Use default file name for logging (named according to the current date). + // Do not append. + char *fileName = NULL; + bool append = true; + (iptrSetCommandLogging)(connection,fileName,NULL,EVerbose,append,NULL,NULL); + + return connection; + } catch (...) { + return -1; + } + +} + +JNIEXPORT jint JNICALL Java_com_symbian_jstat_JStatRunCommand_disconnect + (JNIEnv *_env, jobject, jint _handle) +{ + //disconnect from STAT + try { + int ret; + + ret=(iptrDisconnect)(_handle); + + if( ihLib != NULL ) + { + ::FreeLibrary( ihLib ); + ihLib = NULL; + iptrConnect = NULL; + iptrDisconnect = NULL; + iptrSendRawCommand = NULL; + iptrGetError = NULL; + } + + return ret; + } catch (...) { + return -1; + } + +} + +JNIEXPORT jint JNICALL Java_com_symbian_jstat_JStatRunCommand_doCommand + (JNIEnv *_env, jobject, jint _handle, jstring _command ) +{ + //send a raw command to stat and returns the returned value + try { + int ret; + + std::string command; + jstring2string( _env, _command, command ); + ret = iptrSendRawCommand(_handle,command.c_str( ),NULL); + + return (ret); + } catch (...) { + return -1; + } +} + + +JNIEXPORT jstring JNICALL Java_com_symbian_jstat_JStatRunCommand_getError + (JNIEnv *_env, jobject, jint _handle) +{ + //return the error definition from stat + jstring error; + + string2jstring( _env, iptrGetError(_handle), error); + + return error; +} + + +JNIEXPORT jstring JNICALL Java_com_symbian_jstat_JStatRunCommand_getReceivedData + (JNIEnv *_env, jobject, jint _handle) +{ + //return the exposed buffer from received data + + return (_env->NewStringUTF(iptrGetReceivedData(_handle))); +} + +JNIEXPORT jstring JNICALL Java_com_symbian_jstat_JStat_getStatVersion +(JNIEnv *_env, jobject) +{ + // load stat library first from local, if failed from epoc32 + HMODULE ihLib = ::LoadLibrary( DLLName ); + + if( ihLib == NULL ) + { + char path[MAX_PATH]=".\\stat.dll"; + sprintf( path, "%s\\%s", DLLFolder, DLLName ); + ihLib = ::LoadLibrary( path ); + } + + //if fails loading stat.dll return -1 + if( ihLib == NULL ) + { + return _env->NewStringUTF("Error loading stat.dll"); + } + + // load version function + iptrVersion = reinterpret_cast(::GetProcAddress( ihLib, ProcVersion )); + + //check version function was correctly loaded + if(iptrVersion ==NULL ) + { + return _env->NewStringUTF("Error loading Version function"); + } + + return _env->NewStringUTF(iptrVersion()); +} +