Before figuring md5sum (via java callback added recently), use new

callback to see if there's already one in the DB.  Required passing
context into jniutils getter, and passing name into jni dict
constructors that previously didn't need it.
This commit is contained in:
Eric House 2012-09-13 07:38:08 -07:00
parent edc6b9c270
commit aa974be567
13 changed files with 90 additions and 34 deletions

View file

@ -346,7 +346,10 @@ parseDict( AndDictionaryCtxt* ctxt, XP_U8 const* ptr, XP_U32 dictLength,
#endif #endif
) { ) {
JNIEnv* env = ctxt->env; JNIEnv* env = ctxt->env;
jstring jsum = and_util_figureMD5Sum( ctxt->jniutil, ptr, end - ptr ); jstring jsum = and_util_getMD5SumFor( ctxt->jniutil, ctxt->super.name );
if ( NULL == jsum ) {
jsum = and_util_figureMD5Sum( ctxt->jniutil, ptr, end - ptr );
}
XP_UCHAR* md5Sum = getStringCopy( MPPARM(ctxt->super.mpool) env, jsum ); XP_UCHAR* md5Sum = getStringCopy( MPPARM(ctxt->super.mpool) env, jsum );
(*env)->DeleteLocalRef( env, jsum ); (*env)->DeleteLocalRef( env, jsum );
if ( NULL == ctxt->super.md5Sum ) { if ( NULL == ctxt->super.md5Sum ) {

View file

@ -92,6 +92,19 @@ and_util_splitFaces( JNIUtilCtxt* jniutil, const XP_U8* bytes, jsize len,
return strarray; return strarray;
} }
jstring
and_util_getMD5SumFor( JNIUtilCtxt* jniutil, const XP_UCHAR* name )
{
JNIEnv* env = *jniutil->envp;
jmethodID mid = getMethodID( env, jniutil->jjniutil, "getMD5SumFor",
"(Ljava/lang/String;)Ljava/lang/String;" );
jstring jname = (*env)->NewStringUTF( env, name );
jstring result =
(*env)->CallObjectMethod( env, jniutil->jjniutil, mid, jname );
(*env)->DeleteLocalRef( env, jname );
return result;
}
jstring jstring
and_util_figureMD5Sum( JNIUtilCtxt* jniutil, const XP_U8* bytes, jsize len ) and_util_figureMD5Sum( JNIUtilCtxt* jniutil, const XP_U8* bytes, jsize len )
{ {

View file

@ -35,6 +35,7 @@ jobject and_util_makeJBitmap( JNIUtilCtxt* jniu, int nCols, int nRows,
const jboolean* colors ); const jboolean* colors );
jobject and_util_splitFaces( JNIUtilCtxt* jniu, const XP_U8* bytes, int len, jobject and_util_splitFaces( JNIUtilCtxt* jniu, const XP_U8* bytes, int len,
XP_Bool isUTF8 ); XP_Bool isUTF8 );
jstring and_util_getMD5SumFor( JNIUtilCtxt* jniutil, const XP_UCHAR* name );
jstring and_util_figureMD5Sum( JNIUtilCtxt* jniutil, const XP_U8* bytes, jstring and_util_figureMD5Sum( JNIUtilCtxt* jniutil, const XP_U8* bytes,
jsize len ); jsize len );

View file

@ -285,7 +285,7 @@ Java_org_eehouse_android_xw4_jni_XwJNI_comms_1getUUID
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL
Java_org_eehouse_android_xw4_jni_XwJNI_dict_1getInfo Java_org_eehouse_android_xw4_jni_XwJNI_dict_1getInfo
( JNIEnv* env, jclass C, jbyteArray jDictBytes, jstring jpath, ( JNIEnv* env, jclass C, jbyteArray jDictBytes, jstring jname, jstring jpath,
jobject jniu, jboolean check, jobject jinfo ) jobject jniu, jboolean check, jobject jinfo )
{ {
jboolean result = false; jboolean result = false;
@ -293,7 +293,7 @@ Java_org_eehouse_android_xw4_jni_XwJNI_dict_1getInfo
MemPoolCtx* mpool = mpool_make(); MemPoolCtx* mpool = mpool_make();
#endif #endif
JNIUtilCtxt* jniutil = makeJNIUtil( MPPARM(mpool) &env, jniu ); JNIUtilCtxt* jniutil = makeJNIUtil( MPPARM(mpool) &env, jniu );
DictionaryCtxt* dict = makeDict( MPPARM(mpool) env, jniutil, NULL, DictionaryCtxt* dict = makeDict( MPPARM(mpool) env, jniutil, jname,
jDictBytes, jpath, NULL, check ); jDictBytes, jpath, NULL, check );
if ( NULL != dict ) { if ( NULL != dict ) {
if ( NULL != jinfo ) { if ( NULL != jinfo ) {
@ -1382,7 +1382,8 @@ typedef struct _DictIterData {
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eehouse_android_xw4_jni_XwJNI_dict_1iter_1init Java_org_eehouse_android_xw4_jni_XwJNI_dict_1iter_1init
(JNIEnv* env, jclass C, jbyteArray jDictBytes, jstring jpath, jobject jniu ) ( JNIEnv* env, jclass C, jbyteArray jDictBytes, jstring jname,
jstring jpath, jobject jniu )
{ {
jint closure = 0; jint closure = 0;
#ifdef MEM_DEBUG #ifdef MEM_DEBUG
@ -1391,7 +1392,7 @@ Java_org_eehouse_android_xw4_jni_XwJNI_dict_1iter_1init
DictIterData* data = XP_CALLOC( mpool, sizeof(*data) ); DictIterData* data = XP_CALLOC( mpool, sizeof(*data) );
data->env = env; data->env = env;
JNIUtilCtxt* jniutil = makeJNIUtil( MPPARM(mpool) &data->env, jniu ); JNIUtilCtxt* jniutil = makeJNIUtil( MPPARM(mpool) &data->env, jniu );
DictionaryCtxt* dict = makeDict( MPPARM(mpool) env, jniutil, NULL, DictionaryCtxt* dict = makeDict( MPPARM(mpool) env, jniutil, jname,
jDictBytes, jpath, NULL, false ); jDictBytes, jpath, NULL, false );
if ( !!dict ) { if ( !!dict ) {
data->vtMgr = make_vtablemgr( MPPARM_NOCOMMA(mpool) ); data->vtMgr = make_vtablemgr( MPPARM_NOCOMMA(mpool) );

View file

@ -448,7 +448,7 @@ public class BoardActivity extends XWActivity
} }
m_utils = new BoardUtilCtxt(); m_utils = new BoardUtilCtxt();
m_jniu = JNIUtilsImpl.get(); m_jniu = JNIUtilsImpl.get( this );
setContentView( R.layout.board ); setContentView( R.layout.board );
m_timers = new TimerRunnable[4]; // needs to be in sync with m_timers = new TimerRunnable[4]; // needs to be in sync with
// XWTimerReason // XWTimerReason

View file

@ -1031,6 +1031,31 @@ public class DBUtils {
} }
} }
public static String dictsGetMD5Sum( Context context, String name )
{
DictInfo info = dictsGetInfo( context, name );
String result = null == info? null : info.md5Sum;
return result;
}
public static void dictsSetMD5Sum( Context context, String name, String sum )
{
initDB( context );
synchronized( s_dbHelper ) {
SQLiteDatabase db = s_dbHelper.getWritableDatabase();
String selection = String.format( NAME_FMT, DBHelper.DICTNAME, name );
ContentValues values = new ContentValues();
values.put( DBHelper.MD5SUM, sum );
int result = db.update( DBHelper.TABLE_NAME_DICTINFO,
values, selection, null );
if ( 0 == result ) {
values.put( DBHelper.DICTNAME, name );
db.insert( DBHelper.TABLE_NAME_DICTINFO, null, values );
}
db.close();
}
}
public static DictInfo dictsGetInfo( Context context, String name ) public static DictInfo dictsGetInfo( Context context, String name )
{ {
DictInfo result = null; DictInfo result = null;
@ -1147,6 +1172,8 @@ public class DBUtils {
{ {
if ( null == s_dbHelper ) { if ( null == s_dbHelper ) {
s_dbHelper = new DBHelper( context ); s_dbHelper = new DBHelper( context );
// force any upgrade
s_dbHelper.getWritableDatabase().close();
} }
} }

View file

@ -164,9 +164,9 @@ public class DictBrowseActivity extends XWListActivity
String[] names = { name }; String[] names = { name };
DictUtils.DictPairs pairs = DictUtils.openDicts( this, names ); DictUtils.DictPairs pairs = DictUtils.openDicts( this, names );
m_dictClosure = XwJNI.dict_iter_init( pairs.m_bytes[0], m_dictClosure = XwJNI.dict_iter_init( pairs.m_bytes[0],
pairs.m_paths[0], name, pairs.m_paths[0],
JNIUtilsImpl.get() ); JNIUtilsImpl.get(this) );
m_browseState = DBUtils.dictsGetOffset( this, name ); m_browseState = DBUtils.dictsGetOffset( this, name );
boolean newState = null == m_browseState; boolean newState = null == m_browseState;

View file

@ -367,8 +367,9 @@ public class DictLangCache {
DictUtils.DictPairs pairs = DictUtils.openDicts( context, names ); DictUtils.DictPairs pairs = DictUtils.openDicts( context, names );
info = new DictInfo(); info = new DictInfo();
if ( XwJNI.dict_getInfo( pairs.m_bytes[0], pairs.m_paths[0], if ( XwJNI.dict_getInfo( pairs.m_bytes[0], dal.name,
JNIUtilsImpl.get(), pairs.m_paths[0],
JNIUtilsImpl.get( context ),
DictUtils.DictLoc.DOWNLOAD == dal.loc, DictUtils.DictLoc.DOWNLOAD == dal.loc,
info ) ) { info ) ) {

View file

@ -114,14 +114,14 @@ public class DictUtils {
// changes? // changes?
} }
private static void tryDir( File dir, boolean strict, DictLoc loc, private static void tryDir( Context context, File dir, boolean strict,
ArrayList<DictAndLoc> al ) DictLoc loc, ArrayList<DictAndLoc> al )
{ {
if ( null != dir ) { if ( null != dir ) {
String[] list = dir.list(); String[] list = dir.list();
if ( null != list ) { if ( null != list ) {
for ( String file : list ) { for ( String file : list ) {
if ( isDict( file, strict? dir : null ) ) { if ( isDict( context, file, strict? dir : null ) ) {
al.add( new DictAndLoc( removeDictExtn( file ), loc ) ); al.add( new DictAndLoc( removeDictExtn( file ), loc ) );
} }
} }
@ -135,21 +135,21 @@ public class DictUtils {
ArrayList<DictAndLoc> al = new ArrayList<DictAndLoc>(); ArrayList<DictAndLoc> al = new ArrayList<DictAndLoc>();
for ( String file : getAssets( context ) ) { for ( String file : getAssets( context ) ) {
if ( isDict( file, null ) ) { if ( isDict( context, file, null ) ) {
al.add( new DictAndLoc( removeDictExtn( file ), al.add( new DictAndLoc( removeDictExtn( file ),
DictLoc.BUILT_IN ) ); DictLoc.BUILT_IN ) );
} }
} }
for ( String file : context.fileList() ) { for ( String file : context.fileList() ) {
if ( isDict( file, null ) ) { if ( isDict( context, file, null ) ) {
al.add( new DictAndLoc( removeDictExtn( file ), al.add( new DictAndLoc( removeDictExtn( file ),
DictLoc.INTERNAL ) ); DictLoc.INTERNAL ) );
} }
} }
tryDir( getSDDir( context ), false, DictLoc.EXTERNAL, al ); tryDir( context, getSDDir( context ), false, DictLoc.EXTERNAL, al );
tryDir( getDownloadDir(), true, DictLoc.DOWNLOAD, al ); tryDir( context, getDownloadDir(), true, DictLoc.DOWNLOAD, al );
s_dictListCache = s_dictListCache =
al.toArray( new DictUtils.DictAndLoc[al.size()] ); al.toArray( new DictUtils.DictAndLoc[al.size()] );
@ -480,13 +480,13 @@ public class DictUtils {
return file.endsWith( XWConstants.GAME_EXTN ); return file.endsWith( XWConstants.GAME_EXTN );
} }
private static boolean isDict( String file, File dir ) private static boolean isDict( Context context, String file, File dir )
{ {
boolean ok = file.endsWith( XWConstants.DICT_EXTN ); boolean ok = file.endsWith( XWConstants.DICT_EXTN );
if ( ok && null != dir ) { if ( ok && null != dir ) {
String fullPath = new File( dir, file ).getPath(); String fullPath = new File( dir, file ).getPath();
ok = XwJNI.dict_getInfo( null, fullPath, JNIUtilsImpl.get(), ok = XwJNI.dict_getInfo( null, removeDictExtn( file ), fullPath,
true, null ); JNIUtilsImpl.get(context), true, null );
} }
return ok; return ok;
} }

View file

@ -220,7 +220,7 @@ public class GameUtils {
XwJNI.game_dispose( gamePtr ); XwJNI.game_dispose( gamePtr );
gamePtr = XwJNI.initJNI(); gamePtr = XwJNI.initJNI();
XwJNI.game_makeNewGame( gamePtr, gi, JNIUtilsImpl.get(), XwJNI.game_makeNewGame( gamePtr, gi, JNIUtilsImpl.get( context ),
CommonPrefs.get( context ), dictNames, CommonPrefs.get( context ), dictNames,
pairs.m_bytes, pairs.m_paths, gi.langName() ); pairs.m_bytes, pairs.m_paths, gi.langName() );
@ -360,11 +360,11 @@ public class GameUtils {
XwJNI.game_makeFromStream( gamePtr, stream, gi, XwJNI.game_makeFromStream( gamePtr, stream, gi,
dictNames, pairs.m_bytes, dictNames, pairs.m_bytes,
pairs.m_paths, langName, pairs.m_paths, langName,
util, JNIUtilsImpl.get(), util, JNIUtilsImpl.get( context ),
CommonPrefs.get(context), CommonPrefs.get(context),
tp); tp);
if ( !madeGame ) { if ( !madeGame ) {
XwJNI.game_makeNewGame( gamePtr, gi, JNIUtilsImpl.get(), XwJNI.game_makeNewGame( gamePtr, gi, JNIUtilsImpl.get(context),
CommonPrefs.get(context), dictNames, CommonPrefs.get(context), dictNames,
pairs.m_bytes, pairs.m_paths, pairs.m_bytes, pairs.m_paths,
langName ); langName );
@ -773,7 +773,7 @@ public class GameUtils {
int gamePtr = XwJNI.initJNI(); int gamePtr = XwJNI.initJNI();
XwJNI.game_makeFromStream( gamePtr, stream, gi, dictNames, XwJNI.game_makeFromStream( gamePtr, stream, gi, dictNames,
pairs.m_bytes, pairs.m_paths, pairs.m_bytes, pairs.m_paths,
gi.langName(), JNIUtilsImpl.get(), gi.langName(), JNIUtilsImpl.get(context),
CommonPrefs.get( context ) ); CommonPrefs.get( context ) );
// second time required as game_makeFromStream can overwrite // second time required as game_makeFromStream can overwrite
gi.replaceDicts( newDict ); gi.replaceDicts( newDict );
@ -816,11 +816,12 @@ public class GameUtils {
new CurGameInfo(context), new CurGameInfo(context),
dictNames, pairs.m_bytes, dictNames, pairs.m_bytes,
pairs.m_paths, langName, pairs.m_paths, langName,
JNIUtilsImpl.get(), cp ); JNIUtilsImpl.get(context),
cp );
} }
if ( forceNew || !madeGame ) { if ( forceNew || !madeGame ) {
XwJNI.game_makeNewGame( gamePtr, gi, JNIUtilsImpl.get(), XwJNI.game_makeNewGame( gamePtr, gi, JNIUtilsImpl.get(context),
cp, dictNames, pairs.m_bytes, cp, dictNames, pairs.m_bytes,
pairs.m_paths, langName ); pairs.m_paths, langName );
} }

View file

@ -26,5 +26,6 @@ public interface JNIUtils {
// Stuff I can't do in C.... // Stuff I can't do in C....
String[] splitFaces( byte[] chars, boolean isUTF8 ); String[] splitFaces( byte[] chars, boolean isUTF8 );
String getMD5SumFor( String dictName );
String figureMD5Sum( byte[] bytes ); String figureMD5Sum( byte[] bytes );
} }

View file

@ -20,6 +20,7 @@
package org.eehouse.android.xw4.jni; package org.eehouse.android.xw4.jni;
import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@ -31,15 +32,17 @@ import org.eehouse.android.xw4.*;
public class JNIUtilsImpl implements JNIUtils { public class JNIUtilsImpl implements JNIUtils {
private static JNIUtils s_impl = null; private static JNIUtilsImpl s_impl = null;
private Context m_context;
private JNIUtilsImpl(){} private JNIUtilsImpl(){}
public static JNIUtils get() public static JNIUtils get( Context context )
{ {
if ( null == s_impl ) { if ( null == s_impl ) {
s_impl = new JNIUtilsImpl(); s_impl = new JNIUtilsImpl();
} }
s_impl.m_context = context;
return s_impl; return s_impl;
} }
@ -88,6 +91,11 @@ public class JNIUtilsImpl implements JNIUtils {
return result; return result;
} }
public String getMD5SumFor( String dictName )
{
return DBUtils.dictsGetMD5Sum( m_context, dictName );
}
public String figureMD5Sum( byte[] bytes ) public String figureMD5Sum( byte[] bytes )
{ {
byte[] digest = null; byte[] digest = null;

View file

@ -239,15 +239,15 @@ public class XwJNI {
// Dicts // Dicts
public static native boolean dict_tilesAreSame( int dictPtr1, int dictPtr2 ); public static native boolean dict_tilesAreSame( int dictPtr1, int dictPtr2 );
public static native String[] dict_getChars( int dictPtr ); public static native String[] dict_getChars( int dictPtr );
public static native boolean dict_getInfo( byte[] dict, String path, public static native boolean dict_getInfo( byte[] dict, String name,
JNIUtils jniu, boolean check, String path, JNIUtils jniu,
DictInfo info ); boolean check, DictInfo info );
public static native int dict_getTileValue( int dictPtr, int tile ); public static native int dict_getTileValue( int dictPtr, int tile );
// Dict iterator // Dict iterator
public final static int MAX_COLS_DICT = 15; // from dictiter.h public final static int MAX_COLS_DICT = 15; // from dictiter.h
public static native int dict_iter_init( byte[] dict, String path, public static native int dict_iter_init( byte[] dict, String name,
JNIUtils jniu ); String path, JNIUtils jniu );
public static native void dict_iter_setMinMax( int closure, public static native void dict_iter_setMinMax( int closure,
int min, int max ); int min, int max );
public static native void dict_iter_destroy( int closure ); public static native void dict_iter_destroy( int closure );