/*******************************************************************************
* Copyright (c) 2013 Jens Kristian Villadsen.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* Jens Kristian Villadsen - Lead developer, owner and creator
******************************************************************************/
package org.dyndns.jkiddo.service.dacp.client;
import java.io.UnsupportedEncodingException;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.dyndns.jkiddo.service.dmap.Util;
import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.sqlobject.Bind;
import org.skife.jdbi.v2.sqlobject.SqlQuery;
import org.skife.jdbi.v2.sqlobject.SqlUpdate;
import com.google.common.base.Preconditions;
@Singleton
public class PairingDatabase implements IPairingDatabase
{
public static final String NAME_OF_DB = "NAME_OF_DB";
private final String serviceguid = Util.toHex(new StringBuilder("Jolivia!").reverse().toString().getBytes("UTF-8"));
private final String randomPairCode = Util.toHex("Jolivia!".getBytes("UTF-8"));
private final DBI dbi;
private final PairingDatabaseCommands dbHandler;
private final static String TABLE_PAIR = "pairing";
private final static String FIELD_PAIR_SERVICENAME = "servicename";
private final static String FIELD_PAIR_GUID = "guid";
private final static String KEY_PAIRING_CODE = "pair";
private final static String KEY_SERVICE_GUID = "serviceguid";
@Inject
public PairingDatabase(@Named(NAME_OF_DB) String name) throws UnsupportedEncodingException, ClassNotFoundException
{
Class.forName("org.sqlite.JDBC");
dbi = new DBI("jdbc:sqlite:" + name);
dbHandler = dbi.open().attach(PairingDatabaseCommands.class);
dbHandler.createTable();
// assert random pair code
Preconditions.checkState(randomPairCode.length() == 16, "Random paircode did not match expected length");
dbHandler.updateEntry(KEY_PAIRING_CODE, randomPairCode);
// assert the guid that uniquely identifies this remote
Preconditions.checkState(serviceguid.length() == 16, "Service GUID did not match expected length");
dbHandler.updateEntry(KEY_SERVICE_GUID, serviceguid);
}
private interface PairingDatabaseCommands
{
@SqlUpdate("CREATE TABLE IF NOT EXISTS " + TABLE_PAIR + " (" + FIELD_PAIR_SERVICENAME + " text primary key, " + FIELD_PAIR_GUID + " text)")
public void createTable();
@SqlUpdate("insert or replace into " + TABLE_PAIR + " (" + FIELD_PAIR_SERVICENAME + "," + FIELD_PAIR_GUID + ") VALUES (:" + FIELD_PAIR_SERVICENAME + ", :" + FIELD_PAIR_GUID + ")")
public void updateEntry(@Bind(FIELD_PAIR_SERVICENAME) String serviceName, @Bind(FIELD_PAIR_GUID) String guid);
@SqlQuery("select " + FIELD_PAIR_GUID + " from " + TABLE_PAIR + " where " + FIELD_PAIR_SERVICENAME + " = :" + FIELD_PAIR_SERVICENAME + "")
public String getCode(@Bind(FIELD_PAIR_SERVICENAME) String servicename);
}
@Override
public String findCode(String serviceName)
{
return dbHandler.getCode(serviceName);
}
@Override
public void updateCode(String serviceName, String guid)
{
dbHandler.updateEntry(serviceName, guid);
}
@Override
public String getPairCode()
{
return findCode(KEY_PAIRING_CODE);
}
@Override
public String getServiceGuid()
{
return findCode(KEY_SERVICE_GUID);
}
}