Monday, April 13, 2009

SyncML

I'll not go in the theory. I start its coding here.

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package mypackage;

import com.funambol.storage.NamedObjectStore;
import com.funambol.syncml.protocol.SyncML;
import com.funambol.syncml.spds.SourceConfig;
import com.funambol.syncml.spds.SyncConfig;
import com.funambol.syncml.spds.SyncManager;
import com.funambol.syncml.spds.SyncSource;
import com.funambol.util.Log;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;


/**
*
* @author ali hassan
*/
public class MainMIDlet extends MIDlet implements CommandListener, Runnable{

private SourceConfig sc;
private SyncConfig conf;
private ContactSync cs ;

private Display display;
private Form mainFrm;

private Command cmd_exit;
private Command cmd_sync;


public MainMIDlet() {
Log.setLogLevel(Log.DEBUG);
sc = new SourceConfig();
conf = new SyncConfig();

NamedObjectStore store = new NamedObjectStore();

try{

store.create("DB");
sc.setRemoteUri("card");
sc.setType("text/x-vcard");
sc.setEncoding(SyncSource.ENCODING_B64);

conf.syncUrl = "http://myserver/funambol/ds";
conf.userName="username";
conf.password="password";
conf.compress=true;
conf.userAgent="NokiaN70";

store.store(SyncConfig.NAME, conf);
if(store.lookup("card")==0)
store.store("card", sc);
else
store.retrieve("card", sc);
}catch(Exception ex){
ex.printStackTrace();
}

mainFrm = new Form("MyForm");

this.cmd_exit = new Command("Exit", Command.EXIT, 0);
this.cmd_sync = new Command("Sync", Command.OK, 1);

mainFrm.addCommand(cmd_exit);
mainFrm.addCommand(cmd_sync);

mainFrm.setCommandListener(this);

display = Display.getDisplay(this);
}


protected void startApp(){
display.setCurrent(mainFrm);
}

protected void pauseApp() {

}

protected void destroyApp(boolean arg0){

}

public void commandAction(Command c, Displayable d) {
if(c==cmd_exit)
notifyDestroyed();
else if(c==cmd_sync)
{
new Thread(this).start();
}
}

public void run()
{
NamedObjectStore os = new NamedObjectStore();
try{
os.open("DB");
os.retrieve("card", sc);
os.retrieve(SyncConfig.NAME, conf);
}catch(Exception ex){
ex.printStackTrace();
}

SyncManager sm = new SyncManager(conf);
cs = new ContactSync(sc);
//Log.info(cs.+ "------------------------------");
try{
Log.info("Last Anchor Before Sync: "+sc.getLastAnchor());
sm.sync(cs, SyncML.ALERT_CODE_FAST);
Log.info("Last Anchor After Sync: "+sc.getLastAnchor());
os.store("card", sc);
os.close();
}catch(Exception ex){
ex.printStackTrace();
}

show();
}

private void show()
{

/*MyContacts mc = new MyContacts();
SyncItem si = cs.getNextItem();
Log.info("--------------------"+si.getType());*/
}

}

second step is:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package vopium;

import com.funambol.syncml.client.BaseSyncSource;
import com.funambol.syncml.spds.SourceConfig;
import com.funambol.syncml.spds.SyncException;
import com.funambol.syncml.spds.SyncItem;
import com.funambol.util.Log;

/**
*
* @author ali hassan
*/
public class ContactSync extends BaseSyncSource{

public ContactSync(SourceConfig config) {
super(config);
}

public int addItem(SyncItem item) throws SyncException {

Log.info(item.getKey()+"--------------------------------------------"+new String(item.getContent()));
if (item.getType().equals(SourceConfig.VCARD_TYPE)) {
try{
MyContacts c = new MyContacts();
c.parse( new String(item.getContent()));
RMSContactManager cm = new RMSContactManager();
item.setKey(""+cm.addContactToRMS(c));
}catch(Exception ex)
{
ex.printStackTrace();
}
}
return 200;
}

public int updateItem(SyncItem item) throws SyncException {
Log.info("update");
return 200;
}

public int deleteItem(String key) throws SyncException {
Log.info("del");
return 200;
}

protected void initAllItems() throws SyncException {
Log.info("init All");
}

protected void initNewItems() throws SyncException {
Log.info("init New");
}

protected void initUpdItems() throws SyncException {
Log.info("init Update");
}

protected void initDelItems() throws SyncException {
Log.info("init Del");
}

protected SyncItem getItemContent(SyncItem item) throws SyncException {
Log.info("getItemContent");
return new SyncItem(item);
}

public void beginSync(int syncMode)
{
super.beginSync(syncMode);
}


}



Above class is responsible for the object serialization. Like hibernate.



we are using funambol J2ME API for this purpose.

2 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. Nice article ali hassan,

    but it is very basic one, can you provide some more information on funambol classes used in this. (Where can i find this classes, or how to compile this classes)

    i have created my symbian application, i want to create my j2me application.

    Or can you provide any url for reference, my email is sanjaysurani[at]gmail[dot]com

    THANKS ANYWAYS

    Sanjay Surani

    ReplyDelete