diff -r 0ea12c182930 -r 63b81d807542 javaextensions/centralrepository/javasrc/com/nokia/mj/impl/cenrep/CentralRepositoryImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/centralrepository/javasrc/com/nokia/mj/impl/cenrep/CentralRepositoryImpl.java Thu Sep 02 13:22:59 2010 +0300 @@ -0,0 +1,354 @@ +/* +* 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: +* +*/ + +package com.nokia.mj.impl.cenrep; + +import com.nokia.mid.cenrep.CentralRepository; +import com.nokia.mid.cenrep.CentralRepositoryException; +import com.nokia.mj.impl.gcf.utils.NativeError; +import com.nokia.mj.impl.rt.support.ApplicationInfo; +import com.nokia.mj.impl.utils.Logger; +import com.nokia.mj.impl.rt.support.Finalizer; +import com.nokia.mj.impl.rt.support.Jvm; + +/** + * CentralRepositoryImpl implements the functionality specified in + * com.nokia.mid.cenrep.CentralRepository class. + */ +public class CentralRepositoryImpl extends CentralRepository +{ + + static + { + try + { + Jvm.loadSystemLibrary("javacentrep"); + } + catch (Exception e) + { + Logger.ELOG(Logger.EJavaCentrep, + "Unable to load javacentrep dll."); + } + } + + private static final int INITIAL = 0; + + private static final int OPEN = 1; + + private static final int CLOSED = 2; + + /* + * Central Repository API Function server. + */ + private int iFunctionSourceHandle; + + /** + * Handle to the native side peer object. + */ + private int iCenrepHandle = 0; + + /** + * Repository ID + */ + private String iRepositoryId = null; + + private Finalizer iFinalizer; + + private int iState; + + /** + * Hidden default constructor. + */ + private CentralRepositoryImpl() + { + } + + /** + * Hidden constructor. + * + * @param repositoryId it is platform specific and in S60 it is + * Symbian Central Repository UID. + */ + private CentralRepositoryImpl(String repositoryId) + throws CentralRepositoryException + { + checkAccess(); + iState = INITIAL; + int cenrepUid = CentralRepositoryUid.getIntValue(repositoryId); + this.iRepositoryId = repositoryId; + iFinalizer = registerFinalize(); + + iFunctionSourceHandle = _createFunctionSource(); + iCenrepHandle = _createNativePeer(iFunctionSourceHandle, cenrepUid); + iState = OPEN; + } + + /** + * See class CentralRepository for comments. + */ + static public CentralRepository open(String repositoryId) + throws CentralRepositoryException + { + return new CentralRepositoryImpl(repositoryId); + } + + /** + * See class CentralRepository for comments. + */ + public void close() throws CentralRepositoryException + { + synchronized (this) + { + + if (iState != CLOSED) + { + iState = CLOSED; + _close(iFunctionSourceHandle, iCenrepHandle); + _dispose(iFunctionSourceHandle, iCenrepHandle); + } + iRepositoryId = null; + } + } + + /** + * See class CentralRepository for comments. + */ + public String getString(String key) + throws CentralRepositoryException + { + synchronized (this) + { + + if (iState == CLOSED) + { + throw new CentralRepositoryException("Connection Already Closed"); + } + long cenrepKey = CentralRepositoryKey.getLongValue(key); + String value = _getString(iFunctionSourceHandle, iCenrepHandle, cenrepKey); + return value; + } + } + + /** + * See class CentralRepository for comments. + */ + public int getInt(String key) + throws CentralRepositoryException + { + synchronized (this) + { + + if (iState == CLOSED) + { + throw new CentralRepositoryException("Connection Already Closed"); + } + long cenrepKey = CentralRepositoryKey.getLongValue(key); + int res = _getInt(iFunctionSourceHandle, iCenrepHandle, cenrepKey); + return res; + } + } + + /** + * See class CentralRepository for comments. + */ + public void setString(String key, String value) + throws CentralRepositoryException + { + synchronized (this) + { + + if (iState == CLOSED) + { + throw new CentralRepositoryException("Connection Already Closed"); + } + long cenrepKey = CentralRepositoryKey.getLongValue(key); + if (value == null) + { + throw new CentralRepositoryException("Value is null"); + } + _setString(iFunctionSourceHandle, iCenrepHandle, cenrepKey, value); + } + } + + /** + * See class CentralRepository for comments. + */ + public void setInt(String key, int value) + throws CentralRepositoryException + { + synchronized (this) + { + + if (iState == CLOSED) + { + throw new CentralRepositoryException("Connection Already Closed"); + } + long cenrepKey = CentralRepositoryKey.getLongValue(key); + _setInt(iFunctionSourceHandle, iCenrepHandle, cenrepKey, value); + } + } + + /** + * Registers with Finalizer to call a method when the object gets collected + * by GC + * + * @return Finalizer object that will be notified when GC happens + */ + private Finalizer registerFinalize() + { + return new Finalizer() + { + public void finalizeImpl() + { + registeredFinalize(); + } + }; + } + + /** + * Called when the object is finalized by the garbage collector. + */ + final void registeredFinalize() + { + try + { + close(); + } + catch (CentralRepositoryException e) + { + // Ignore + } + } + + /** + * Creates a native side function source. + * + * @return handle to the native function source. + */ + private native int _createFunctionSource(); + + /** + * Create native side peer of this Java class. It opens a repository. + * + * @param FunctionSource Handle handle to the native function source. + * @param arepositoryId is platform specific and in S60 it is + * Symbian Central Repository UID. + * @return handle to the native side peer. + * @return Symbian OS error code, if openning fails. + */ + private native int _createNativePeer( + int aFunctionSourceHandle, + int repositoryId); + + /** + * Closes a repository. + * + * @param FunctionSourceHandle handle to the native function source. + * @param cenrepHandle handle to the native side peer object. + * @return Symbian OS error code, if closing fails. + */ + private native void _close(int aFunctionSourceHandle, int cenrepHandle); + + /** + * Dispose native side resources owned by this class. + * + * @param FunctionSourceHandle handle to the native function source. + * @param cenrepHandle handle to the native side peer object. + */ + private native void _dispose(int aFunctionSourceHandle, int cenrepHandle); + + /** + * Returns string stored in given key. + * + * @param FunctionSourceHandle handle to the native function source. + * @param cenrepHandle handle to the native side peer object. + * @param key the key of setting to be read. + * @param value returns the value of the setting if it is the string. + * @return Symbian OS error code, if key is not found or + * stored data is not string. + */ + private native String _getString( + int aFunctionSourceHandle, + int cenrepHandle, + long key); + + /** + * Returns integer stored in given key. + * + * @param FunctionSourceHandle handle to the native function source. + * @param cenrepHandle handle to the native side peer object. + * @param key the key of setting to be read. + * @param value the value of the setting if it is an integer. + * @return Symbian OS error code, if key is not found or + * stored data is not integer. + */ + private native int _getInt( + int aFunctionSourceHandle, + int cenrepHandle, + long key); + + /** Stores string value in key. + * + * @param FunctionSourceHandle handle to the native function source. + * @param cenrepHandle handle to the native side peer object. + * @param key the key of setting to be stored. + * @param value the string value of the setting to be stored. + * @return Symbian OS error code, if string value cannot be stored. + */ + private native void _setString( + int aFunctionSourceHandle, + int cenrepHandle, + long key, + String value); + + /** Stores integer value in key. + * + * @param FunctionSourceHandle handle to the native function source. + * @param cenrepHandle handle to the native side peer object. + * @param key the key of setting to be stored. + * @param value the integer value of the setting to be stored. + * @return Symbian OS error code, if integer value cannot be stored. + */ + private native void _setInt( + int aFunctionSourceHandle, + int cenrepHandle, + long key, + int value); + + + /** + * Checks if MIDlet is permited to access the central repository. + * Only MIDlets in manufacturer or operator domain are allowed. + * @throws CentralRepositoryException if MIDlet is not in manufacturer or + * operator domain. + */ + private void checkAccess() + throws SecurityException + { + + ApplicationInfo appInfo = ApplicationInfo.getInstance(); + String protectionDomain = appInfo.getProtectionDomain(); + + if (protectionDomain.equals(ApplicationInfo.MANUFACTURER_DOMAIN) == false && + protectionDomain.equals(ApplicationInfo.OPERATOR_DOMAIN) == false) + { + Logger.ELOG(Logger.EJavaCentrep, "Protection Domain: " + protectionDomain + + ", Access denied"); + throw new SecurityException("Access denied!"); + } + } +}