/* © 2010 Stephan Reichholf <stephan at reichholf dot net> * * Licensed under the Create-Commons Attribution-Noncommercial-Share Alike 3.0 Unported * http://creativecommons.org/licenses/by-nc-sa/3.0/ */ package net.reichholf.dreamdroid; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; import android.os.Environment; import android.util.Log; import net.reichholf.dreamdroid.helpers.ExtendedHashMap; import net.reichholf.dreamdroid.helpers.enigma2.Event; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import java.util.ArrayList; /** * @author sre * */ public class DatabaseHelper extends SQLiteOpenHelper { public static final String LOG_TAG = DatabaseHelper.class.getSimpleName(); public static final String KEY_PROFILE_ID = "_id"; public static final String KEY_PROFILE_PROFILE = "profile"; public static final String KEY_PROFILE_HOST = "host"; public static final String KEY_PROFILE_STREAM_HOST = "streamhost"; public static final String KEY_PROFILE_STREAM_PORT = "streamport"; public static final String KEY_PROFILE_STREAM_LOGIN = "streamlogin"; public static final String KEY_PROFILE_FILE_PORT = "fileport"; public static final String KEY_PROFILE_PORT = "port"; public static final String KEY_PROFILE_LOGIN = "login"; public static final String KEY_PROFILE_USER = "user"; public static final String KEY_PROFILE_PASS = "pass"; public static final String KEY_PROFILE_SSL = "ssl"; public static final String KEY_PROFILE_FILE_SSL = "file_ssl"; public static final String KEY_PROFILE_FILE_LOGIN = "file_login"; public static final String KEY_PROFILE_SIMPLE_REMOTE = "simpleremote"; public static final String KEY_PROFILE_DEFAULT_REF = "default_ref"; public static final String KEY_PROFILE_DEFAULT_REF_NAME = "default_ref_name"; public static final String KEY_PROFILE_DEFAULT_REF_2 = "default_ref_2"; public static final String KEY_PROFILE_DEFAULT_REF_2_NAME = "default_ref_2_name"; //ENCODER public static final String KEY_PROFILE_ENCODER_STREAM = "encoder_stream"; public static final String KEY_PROFILE_ENCODER_PATH = "encoder_path"; public static final String KEY_PROFILE_ENCODER_PORT = "encoder_port"; public static final String KEY_PROFILE_ENCODER_LOGIN = "encoder_login"; public static final String KEY_PROFILE_ENCODER_USER = "encoder_user"; public static final String KEY_PROFILE_ENCODER_PASS = "encoder_pass"; public static final String KEY_PROFILE_ENCODER_VIDEO_BITRATE = "encoder_video_bitrate"; public static final String KEY_PROFILE_ENCODER_AUDIO_BITRATE = "encoder_audio_bitrate"; public static final String KEY_EVENT_ID = "id"; public static final String KEY_EVENT_START = "start"; public static final String KEY_EVENT_DURATION = "duration"; public static final String KEY_EVENT_TITLE = "title"; public static final String KEY_EVENT_DESCRIPTION = "description"; public static final String KEY_EVENT_DESCRIPTION_EXTENDED = "description_ext"; public static final String KEY_EVENT_SERVICE_REFERENCE = "sid"; public static final String KEY_SERVICES_REFERENCE = "ref"; public static final String KEY_SERVICES_NAME = "name"; public static final String DATABASE_NAME = "dreamdroid"; private static final int DATABASE_VERSION = 12; private static final String PROFILES_TABLE_NAME = "profiles"; private static final String EVENT_TABLE_NAME = "events"; private static final String SERVICES_TABLE_NAME = "services"; private static final String PROFILES_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " + PROFILES_TABLE_NAME + " (" + KEY_PROFILE_ID + " INTEGER PRIMARY KEY, " + KEY_PROFILE_PROFILE + " TEXT, " + KEY_PROFILE_HOST + " TEXT, " + KEY_PROFILE_STREAM_HOST + " TEXT, " + KEY_PROFILE_PORT + " INTEGER, " + KEY_PROFILE_STREAM_PORT + " INTEGER, " + KEY_PROFILE_FILE_PORT + " INTEGER, " + KEY_PROFILE_LOGIN + " BOOLEAN, " + KEY_PROFILE_USER + " TEXT, " + KEY_PROFILE_PASS + " TEXT, " + KEY_PROFILE_SSL + " BOOLEAN, " + KEY_PROFILE_SIMPLE_REMOTE + " BOOLEAN, " + KEY_PROFILE_DEFAULT_REF + " TEXT, " + KEY_PROFILE_DEFAULT_REF_NAME + " TEXT, " + KEY_PROFILE_DEFAULT_REF_2 + " TEXT, " + KEY_PROFILE_DEFAULT_REF_2_NAME + " TEXT, " + KEY_PROFILE_FILE_LOGIN + " BOOLEAN, " + KEY_PROFILE_FILE_SSL + " BOOLEAN, " + KEY_PROFILE_STREAM_LOGIN + " BOOLEAN, " + KEY_PROFILE_ENCODER_STREAM + " BOOLEAN, " + KEY_PROFILE_ENCODER_PATH + " TEXT, " + KEY_PROFILE_ENCODER_PORT + " INTEGER, " + KEY_PROFILE_ENCODER_LOGIN + " BOOLEAN, " + KEY_PROFILE_ENCODER_USER + " TEXT, " + KEY_PROFILE_ENCODER_PASS + " TEXT, " + KEY_PROFILE_ENCODER_VIDEO_BITRATE + " TEXT, " + KEY_PROFILE_ENCODER_AUDIO_BITRATE + " TEXT);"; private static final String PROFILES_TABLE_UPGRADE_2_3 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_STREAM_HOST + " TEXT;"; private static final String PROFILES_TABLE_UPGRADE_3_4 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_SIMPLE_REMOTE + " BOOLEAN;"; private static final String PROFILES_TABLE_UPGRADE_4_5 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_STREAM_PORT + " INTEGER;"; private static final String PROFILES_TABLE_UPGRADE_5_6 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_FILE_PORT + " INTEGER;"; private static final String PROFILES_TABLE_UPGRADE_6_7_1 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_DEFAULT_REF + " TEXT;"; private static final String PROFILES_TABLE_UPGRADE_6_7_2 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_DEFAULT_REF_NAME + " TEXT;"; private static final String PROFILES_TABLE_UPGRADE_6_7_3 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_DEFAULT_REF_2 + " TEXT;"; private static final String PROFILES_TABLE_UPGRADE_6_7_4 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_DEFAULT_REF_2_NAME + " TEXT;"; private static final String PROFILES_TABLE_UPGRADE_7_8_1 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_FILE_LOGIN + " BOOLEAN;"; private static final String PROFILES_TABLE_UPGRADE_7_8_2 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_FILE_SSL + " BOOLEAN;"; private static final String PROFILES_TABLE_UPGRADE_8_9 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_STREAM_LOGIN + " BOOLEAN;"; private static final String PROFILES_TABLE_UPGRADE_11_12_1 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_ENCODER_STREAM + " BOOLEAN;"; private static final String PROFILES_TABLE_UPGRADE_11_12_2 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_ENCODER_PATH + " TEXT;"; private static final String PROFILES_TABLE_UPGRADE_11_12_3 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_ENCODER_PORT + " INTEGER;"; private static final String PROFILES_TABLE_UPGRADE_11_12_4 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_ENCODER_LOGIN + " BOOLEAN;"; private static final String PROFILES_TABLE_UPGRADE_11_12_5 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_ENCODER_USER + " TEXT;"; private static final String PROFILES_TABLE_UPGRADE_11_12_6 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_ENCODER_PASS + " TEXT;"; private static final String PROFILES_TABLE_UPGRADE_11_12_7 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_ENCODER_VIDEO_BITRATE + " INTEGER;"; private static final String PROFILES_TABLE_UPGRADE_11_12_8 = "ALTER TABLE " + PROFILES_TABLE_NAME + " ADD " + KEY_PROFILE_ENCODER_AUDIO_BITRATE + " INTEGER;"; private static final String EVENT_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " + EVENT_TABLE_NAME + " (" + KEY_EVENT_ID + " INTEGER PRIMARY KEY, " + KEY_EVENT_START + " INTEGER, " + KEY_EVENT_DURATION + " INTEGER, " + KEY_EVENT_TITLE + " TEXT, " + KEY_EVENT_DESCRIPTION + " TEXT, " + KEY_EVENT_DESCRIPTION_EXTENDED + " TEXT, " + KEY_EVENT_SERVICE_REFERENCE + " TEXT);"; private static final String SERVICES_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " + SERVICES_TABLE_NAME + " (" + KEY_SERVICES_REFERENCE + " TEXT PRIMARY KEY, " + KEY_SERVICES_NAME + " TEXT);"; private Context mContext; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); mContext = context; } /* (non-Javadoc) * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase) */ @Override public void onCreate(SQLiteDatabase db) { db.execSQL(PROFILES_TABLE_CREATE); db.execSQL(EVENT_TABLE_CREATE); db.execSQL(SERVICES_TABLE_CREATE); } private void upgrade6to7(SQLiteDatabase db){ db.execSQL(PROFILES_TABLE_UPGRADE_6_7_1); db.execSQL(PROFILES_TABLE_UPGRADE_6_7_2); db.execSQL(PROFILES_TABLE_UPGRADE_6_7_3); db.execSQL(PROFILES_TABLE_UPGRADE_6_7_4); } private void upgrade7to8(SQLiteDatabase db){ db.execSQL(PROFILES_TABLE_UPGRADE_7_8_1); db.execSQL(PROFILES_TABLE_UPGRADE_7_8_2); } private void upgrade11to12(SQLiteDatabase db){ db.execSQL(PROFILES_TABLE_UPGRADE_11_12_1); db.execSQL(PROFILES_TABLE_UPGRADE_11_12_2); db.execSQL(PROFILES_TABLE_UPGRADE_11_12_3); db.execSQL(PROFILES_TABLE_UPGRADE_11_12_4); db.execSQL(PROFILES_TABLE_UPGRADE_11_12_5); db.execSQL(PROFILES_TABLE_UPGRADE_11_12_6); db.execSQL(PROFILES_TABLE_UPGRADE_11_12_7); db.execSQL(PROFILES_TABLE_UPGRADE_11_12_8); } /* (non-Javadoc) * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int) */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { boolean scheduleBackup = oldVersion < newVersion; try { if (oldVersion == 2) { db.execSQL(PROFILES_TABLE_UPGRADE_2_3); oldVersion++; } if (oldVersion == 3) { db.execSQL(PROFILES_TABLE_UPGRADE_3_4); oldVersion++; } if (oldVersion == 4){ db.execSQL(PROFILES_TABLE_UPGRADE_4_5); oldVersion++; } if (oldVersion == 5){ db.execSQL(PROFILES_TABLE_UPGRADE_5_6); oldVersion++; } if(oldVersion == 6){ upgrade6to7(db); oldVersion++; } if (oldVersion == 7){ upgrade7to8(db); oldVersion++; } if (oldVersion == 8){ db.execSQL(PROFILES_TABLE_UPGRADE_8_9); oldVersion++; } if (oldVersion == 9){ db.execSQL(EVENT_TABLE_CREATE); db.execSQL(SERVICES_TABLE_CREATE); oldVersion += 2; } if(oldVersion == 10){ //DEVELOPMENT VERSIONS ONLY db.execSQL("DROP TABLE EPG;"); db.execSQL(EVENT_TABLE_CREATE); oldVersion++; } if(oldVersion == 11){ upgrade11to12(db); oldVersion++; } if (oldVersion != DATABASE_VERSION){ //this should never happen... emergencyRecovery(db); } } catch (SQLiteException e) { Log.e(LOG_TAG, "onUpgrade: SQLiteException, recreating db. ", e); Log.e(LOG_TAG, "(oldVersion was " + oldVersion + ")"); emergencyRecovery(db); return; // this was lossy } if(scheduleBackup) DreamDroid.scheduleBackup(mContext); } private void emergencyRecovery(SQLiteDatabase db){ db.execSQL("DROP TABLE IF EXISTS " + PROFILES_TABLE_NAME + ";"); db.execSQL(PROFILES_TABLE_CREATE); } private ContentValues p2cv(Profile p){ ContentValues values = new ContentValues(); values.put(KEY_PROFILE_PROFILE, p.getName()); values.put(KEY_PROFILE_HOST, p.getHost()); values.put(KEY_PROFILE_STREAM_HOST, p.getStreamHostValue()); values.put(KEY_PROFILE_PORT, p.getPort()); values.put(KEY_PROFILE_STREAM_PORT, p.getStreamPort()); values.put(KEY_PROFILE_FILE_PORT, p.getFilePort()); values.put(KEY_PROFILE_LOGIN, p.isLogin()); values.put(KEY_PROFILE_USER, p.getUser()); values.put(KEY_PROFILE_PASS, p.getPass()); values.put(KEY_PROFILE_SSL, p.isSsl()); values.put(KEY_PROFILE_STREAM_LOGIN, p.isStreamLogin()); values.put(KEY_PROFILE_FILE_LOGIN, p.isFileLogin()); values.put(KEY_PROFILE_FILE_SSL, p.isFileSsl()); values.put(KEY_PROFILE_SIMPLE_REMOTE, p.isSimpleRemote()); values.put(KEY_PROFILE_DEFAULT_REF, p.getDefaultRef()); values.put(KEY_PROFILE_DEFAULT_REF_NAME, p.getDefaultRefName()); values.put(KEY_PROFILE_DEFAULT_REF_2, p.getDefaultRef2()); values.put(KEY_PROFILE_DEFAULT_REF_2_NAME, p.getDefaultRef2Name()); values.put(KEY_PROFILE_ENCODER_STREAM, p.isEncoderStream()); values.put(KEY_PROFILE_ENCODER_PATH, p.getEncoderPath()); values.put(KEY_PROFILE_ENCODER_PORT, p.getEncoderPort()); values.put(KEY_PROFILE_ENCODER_LOGIN, p.isEncoderLogin()); values.put(KEY_PROFILE_ENCODER_USER, p.getEncoderUser()); values.put(KEY_PROFILE_ENCODER_PASS, p.getEncoderPass()); values.put(KEY_PROFILE_ENCODER_VIDEO_BITRATE, p.getEncoderVideoBitrate()); values.put(KEY_PROFILE_ENCODER_AUDIO_BITRATE, p.getEncoderAudioBitrate()); return values; } /** * @param p */ public boolean addProfile(Profile p) { SQLiteDatabase db = getWritableDatabase(); if (db.insert(PROFILES_TABLE_NAME, null, p2cv(p)) > -1) { db.close(); DreamDroid.scheduleBackup(mContext); return true; } db.close(); return false; } /** * @param p */ public boolean updateProfile(Profile p) { SQLiteDatabase db = getWritableDatabase(); int numRows = db.update(PROFILES_TABLE_NAME, p2cv(p), KEY_PROFILE_ID + "=" + p.getId(), null); db.close(); if (numRows == 1) { DreamDroid.scheduleBackup(mContext); DreamDroid.profileChanged(mContext, p); return true; } return false; } /** * @param p */ public boolean deleteProfile(Profile p) { SQLiteDatabase db = getWritableDatabase(); int numRows = db.delete(PROFILES_TABLE_NAME, KEY_PROFILE_ID + "=" + p.getId(), null); db.close(); if (numRows == 1) { DreamDroid.scheduleBackup(mContext); return true; } return false; } /** * @return Profile for all Settings */ public ArrayList<Profile> getProfiles() { String[] columns = {KEY_PROFILE_ID, KEY_PROFILE_PROFILE, KEY_PROFILE_HOST, KEY_PROFILE_STREAM_HOST, KEY_PROFILE_PORT, KEY_PROFILE_STREAM_PORT, KEY_PROFILE_FILE_PORT, KEY_PROFILE_LOGIN, KEY_PROFILE_USER, KEY_PROFILE_PASS, KEY_PROFILE_SSL, KEY_PROFILE_SIMPLE_REMOTE, KEY_PROFILE_STREAM_LOGIN, KEY_PROFILE_FILE_LOGIN, KEY_PROFILE_FILE_SSL, KEY_PROFILE_DEFAULT_REF, KEY_PROFILE_DEFAULT_REF_NAME, KEY_PROFILE_DEFAULT_REF_2, KEY_PROFILE_DEFAULT_REF_2_NAME, KEY_PROFILE_ENCODER_STREAM, KEY_PROFILE_ENCODER_PATH, KEY_PROFILE_ENCODER_PORT, KEY_PROFILE_ENCODER_LOGIN, KEY_PROFILE_ENCODER_USER, KEY_PROFILE_ENCODER_PASS, KEY_PROFILE_ENCODER_VIDEO_BITRATE, KEY_PROFILE_ENCODER_AUDIO_BITRATE}; SQLiteDatabase db = getReadableDatabase(); ArrayList<Profile> list = new ArrayList<>(); Cursor c = db.query(PROFILES_TABLE_NAME, columns, null, null, null, null, KEY_PROFILE_PROFILE); if(c.getCount() == 0){ db.close(); c.close(); return list; } while(!c.isLast()){ c.moveToNext(); list.add(getProfileFrom(c)); } c.close(); db.close(); return list; } /** * * @param id * @return the profile for the given id, or null if no such profile was found */ public Profile getProfile(int id) { String[] columns = {KEY_PROFILE_ID, KEY_PROFILE_PROFILE, KEY_PROFILE_HOST, KEY_PROFILE_STREAM_HOST, KEY_PROFILE_PORT, KEY_PROFILE_STREAM_PORT, KEY_PROFILE_FILE_PORT, KEY_PROFILE_LOGIN, KEY_PROFILE_USER, KEY_PROFILE_PASS, KEY_PROFILE_SSL, KEY_PROFILE_SIMPLE_REMOTE, KEY_PROFILE_STREAM_LOGIN, KEY_PROFILE_FILE_LOGIN, KEY_PROFILE_FILE_SSL, KEY_PROFILE_DEFAULT_REF, KEY_PROFILE_DEFAULT_REF_NAME, KEY_PROFILE_DEFAULT_REF_2, KEY_PROFILE_DEFAULT_REF_2_NAME, KEY_PROFILE_ENCODER_STREAM, KEY_PROFILE_ENCODER_PATH, KEY_PROFILE_ENCODER_PORT, KEY_PROFILE_ENCODER_LOGIN, KEY_PROFILE_ENCODER_USER, KEY_PROFILE_ENCODER_PASS, KEY_PROFILE_ENCODER_VIDEO_BITRATE, KEY_PROFILE_ENCODER_AUDIO_BITRATE}; SQLiteDatabase db = getReadableDatabase(); Cursor c = db.query(PROFILES_TABLE_NAME, columns, KEY_PROFILE_ID + "=" + id, null, null, null, KEY_PROFILE_PROFILE); Profile p = null; if(c.getCount() == 1 && c.moveToFirst()) { p = getProfileFrom(c); } c.close(); db.close(); return p; } private Profile getProfileFrom(Cursor c) { int id = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_ID)); String name = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_PROFILE)); String host = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_HOST)); String streamHost = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_STREAM_HOST)); int port = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_PORT)); int streamPort = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_STREAM_PORT)); if (streamPort <= 0) { streamPort = 8001; } int filePort = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_FILE_PORT)); if (filePort <= 0) { filePort = 80; } boolean isLogin = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_LOGIN)) == 1; boolean isSsl = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_SSL)) == 1; boolean isStreamLogin = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_STREAM_LOGIN)) == 1; boolean isFileLogin = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_FILE_LOGIN)) == 1; boolean isFileSsl = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_FILE_SSL)) == 1; boolean isSimpleRemote = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_SIMPLE_REMOTE)) == 1; String user = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_USER)); String pass = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_PASS)); String defaultRef = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_DEFAULT_REF)); String defaultRefName = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_DEFAULT_REF_NAME)); String defaultRef2 = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_DEFAULT_REF_2)); String defaultRef2Name = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_DEFAULT_REF_2_NAME)); boolean isEncoderStream = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_ENCODER_STREAM)) == 1; String encoderPath = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_ENCODER_PATH)); int encoderPort = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_ENCODER_PORT)); boolean isEncoderLogin = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_ENCODER_LOGIN)) == 1; String encoderUser = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_ENCODER_USER)); String encoderPass = c.getString(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_ENCODER_PASS)); int encoderAudioBitrate = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_ENCODER_AUDIO_BITRATE)); int encoderVideoBitrate = c.getInt(c.getColumnIndex(DatabaseHelper.KEY_PROFILE_ENCODER_VIDEO_BITRATE)); encoderPath = encoderPath == null ? "stream" : encoderPath; encoderPort = encoderPort <= 0 ? 554 : encoderPort; encoderUser = encoderUser == null ? "" : encoderUser; encoderPass = encoderPass == null ? "" : encoderPass; encoderAudioBitrate = encoderAudioBitrate <= 0 ? 128 : encoderAudioBitrate; encoderVideoBitrate = encoderVideoBitrate <= 0 ? 2500 : encoderVideoBitrate; return new Profile(id, name, host, streamHost, port, streamPort, filePort, isLogin, user, pass, isSsl, isStreamLogin, isFileLogin, isFileSsl, isSimpleRemote, defaultRef, defaultRefName, defaultRef2, defaultRef2Name, isEncoderStream, encoderPath, encoderPort, isEncoderLogin, encoderUser, encoderPass, encoderVideoBitrate, encoderAudioBitrate ); } public int setEvents(ArrayList<ExtendedHashMap> events){ SQLiteDatabase db = getWritableDatabase(); db.beginTransaction(); int success = 0; for(ExtendedHashMap event: events){ if(setEvent(event, db)) success++; } db.endTransaction(); db.close(); return success; } public boolean setEvent(ExtendedHashMap event, SQLiteDatabase db){ ContentValues values = eventToCv(event); if(values == null) { return false; } String id = values.getAsString(KEY_EVENT_ID); db.delete(EVENT_TABLE_NAME, KEY_EVENT_ID + "=?;", new String[]{id,}); return db.insert(EVENT_TABLE_NAME, null, values) > -1; } public ContentValues eventToCv(ExtendedHashMap event){ ContentValues values = new ContentValues(); int _id, _start, _duration; try { _id = Integer.parseInt(event.getString(Event.KEY_EVENT_ID)); _start = Integer.parseInt(event.getString(Event.KEY_EVENT_START)); _duration = Integer.parseInt(event.getString(Event.KEY_EVENT_DURATION)); } catch(NumberFormatException nex){ return null; } values.put(KEY_EVENT_ID, _id); values.put(KEY_EVENT_START, _start); values.put(KEY_EVENT_DURATION, _duration); values.put(KEY_EVENT_TITLE, event.getString(Event.KEY_EVENT_TITLE)); values.put(KEY_EVENT_DESCRIPTION,event.getString(Event.KEY_EVENT_DESCRIPTION)); values.put(KEY_EVENT_DESCRIPTION_EXTENDED,event.getString(Event.KEY_EVENT_DESCRIPTION_EXTENDED)); values.put(KEY_EVENT_SERVICE_REFERENCE, event.getString(Event.KEY_SERVICE_REFERENCE)); return values; } public static DatabaseHelper getInstance(Context ctx){ return new DatabaseHelper(ctx); } public boolean exportDB(){ File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); FileChannel source=null; FileChannel destination=null; String currentDBPath = "/data/net.reichholf.dreamdroid" +"/databases/" + DATABASE_NAME; String backupDBPath = DATABASE_NAME + ".sqlite"; File currentDB = new File(data, currentDBPath); File backupDB = new File(sd, backupDBPath); try { source = new FileInputStream(currentDB).getChannel(); destination = new FileOutputStream(backupDB).getChannel(); destination.transferFrom(source, 0, source.size()); source.close(); destination.close(); return true; } catch(IOException e) { e.printStackTrace(); } return false; } }