|
|
/**
|
|
|
* 功能:syncType分类,addLocalNode,addRemoteNode,deleteNode,updateLocalNode,updateRemoteNode
|
|
|
* @author TTS
|
|
|
* @param syncType
|
|
|
* @param node
|
|
|
* @param c
|
|
|
* @throws NetworkFailureException
|
|
|
*/
|
|
|
private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException {
|
|
|
if (mCancelled) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
MetaData meta;
|
|
|
switch (syncType) {
|
|
|
case Node.SYNC_ACTION_ADD_LOCAL:
|
|
|
addLocalNode(node);
|
|
|
break;
|
|
|
case Node.SYNC_ACTION_ADD_REMOTE:
|
|
|
addRemoteNode(node, c);
|
|
|
break;
|
|
|
case Node.SYNC_ACTION_DEL_LOCAL:
|
|
|
meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN));
|
|
|
if (meta != null) {
|
|
|
GTaskClient.getInstance().deleteNode(meta);
|
|
|
}
|
|
|
mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN));
|
|
|
break;
|
|
|
case Node.SYNC_ACTION_DEL_REMOTE:
|
|
|
meta = mMetaHashMap.get(node.getGid());
|
|
|
if (meta != null) {
|
|
|
GTaskClient.getInstance().deleteNode(meta);
|
|
|
}
|
|
|
GTaskClient.getInstance().deleteNode(node);
|
|
|
break;
|
|
|
case Node.SYNC_ACTION_UPDATE_LOCAL:
|
|
|
updateLocalNode(node, c);
|
|
|
break;
|
|
|
case Node.SYNC_ACTION_UPDATE_REMOTE:
|
|
|
updateRemoteNode(node, c);
|
|
|
break;
|
|
|
case Node.SYNC_ACTION_UPDATE_CONFLICT:
|
|
|
// merging both modifications maybe a good idea
|
|
|
// right now just use local update simply
|
|
|
updateRemoteNode(node, c);
|
|
|
break;
|
|
|
case Node.SYNC_ACTION_NONE:
|
|
|
break;
|
|
|
case Node.SYNC_ACTION_ERROR:
|
|
|
default:
|
|
|
throw new ActionFailureException("unkown sync action type");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 功能:本地增加Node
|
|
|
* @author TTS
|
|
|
* @param node
|
|
|
* @throws NetworkFailureException
|
|
|
*/
|
|
|
private void addLocalNode(Node node) throws NetworkFailureException {
|
|
|
if (mCancelled) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
SqlNote sqlNote;
|
|
|
if (node instanceof TaskList) {
|
|
|
if (node.getName().equals(
|
|
|
GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) {
|
|
|
sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER);
|
|
|
} else if (node.getName().equals(
|
|
|
GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) {
|
|
|
sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER);
|
|
|
} else {
|
|
|
sqlNote = new SqlNote(mContext);
|
|
|
sqlNote.setContent(node.getLocalJSONFromContent());
|
|
|
sqlNote.setParentId(Notes.ID_ROOT_FOLDER);
|
|
|
}
|
|
|
} else {
|
|
|
sqlNote = new SqlNote(mContext);
|
|
|
JSONObject js = node.getLocalJSONFromContent();
|
|
|
try {
|
|
|
if (js.has(GTaskStringUtils.META_HEAD_NOTE)) {
|
|
|
JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
|
|
|
if (note.has(NoteColumns.ID)) {
|
|
|
long id = note.getLong(NoteColumns.ID);
|
|
|
if (DataUtils.existInNoteDatabase(mContentResolver, id)) {
|
|
|
// the id is not available, have to create a new one
|
|
|
note.remove(NoteColumns.ID);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (js.has(GTaskStringUtils.META_HEAD_DATA)) {
|
|
|
JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
|
|
|
for (int i = 0; i < dataArray.length(); i++) {
|
|
|
JSONObject data = dataArray.getJSONObject(i);
|
|
|
if (data.has(DataColumns.ID)) {
|
|
|
long dataId = data.getLong(DataColumns.ID);
|
|
|
if (DataUtils.existInDataDatabase(mContentResolver, dataId)) {
|
|
|
// the data id is not available, have to create
|
|
|
// a new one
|
|
|
data.remove(DataColumns.ID);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
} catch (JSONException e) {
|
|
|
Log.w(TAG, e.toString());
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
sqlNote.setContent(js);
|
|
|
|
|
|
Long parentId = mGidToNid.get(((Task) node).getParent().getGid());
|
|
|
if (parentId == null) {
|
|
|
Log.e(TAG, "cannot find task's parent id locally");
|
|
|
throw new ActionFailureException("cannot add local node");
|
|
|
}
|
|
|
sqlNote.setParentId(parentId.longValue());
|
|
|
}
|
|
|
|
|
|
// create the local node
|
|
|
sqlNote.setGtaskId(node.getGid());
|
|
|
sqlNote.commit(false);
|
|
|
|
|
|
// update gid-nid mapping
|
|
|
mGidToNid.put(node.getGid(), sqlNote.getId());
|
|
|
mNidToGid.put(sqlNote.getId(), node.getGid());
|
|
|
|
|
|
// update meta
|
|
|
updateRemoteMeta(node.getGid(), sqlNote);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 功能:update本地node
|
|
|
* @author TTS
|
|
|
* @param node
|
|
|
* ----同步操作的基础数据类型
|
|
|
* @param c
|
|
|
* ----Cursor
|
|
|
* @throws NetworkFailureException
|
|
|
*/
|
|
|
private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException {
|
|
|
if (mCancelled) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
SqlNote sqlNote;
|
|
|
// update the note locally
|
|
|
sqlNote = new SqlNote(mContext, c);
|
|
|
sqlNote.setContent(node.getLocalJSONFromContent());
|
|
|
|
|
|
Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid())
|
|
|
: new Long(Notes.ID_ROOT_FOLDER);
|
|
|
if (parentId == null) {
|
|
|
Log.e(TAG, "cannot find task's parent id locally");
|
|
|
throw new ActionFailureException("cannot update local node");
|
|
|
}
|
|
|
sqlNote.setParentId(parentId.longValue());
|
|
|
sqlNote.commit(true);
|
|
|
|
|
|
// update meta info
|
|
|
updateRemoteMeta(node.getGid(), sqlNote);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 功能:远程增加Node
|
|
|
* 需要updateRemoteMeta
|
|
|
* @author TTS
|
|
|
* @param node
|
|
|
* ----同步操作的基础数据类型
|
|
|
* @param c
|
|
|
* --Cursor
|
|
|
* @throws NetworkFailureException
|
|
|
*/
|
|
|
private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException {
|
|
|
if (mCancelled) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
SqlNote sqlNote = new SqlNote(mContext, c); //从本地mContext中获取内容
|
|
|
Node n;
|
|
|
|
|
|
// update remotely
|
|
|
if (sqlNote.isNoteType()) {
|
|
|
Task task = new Task();
|
|
|
task.setContentByLocalJSON(sqlNote.getContent());
|
|
|
|
|
|
String parentGid = mNidToGid.get(sqlNote.getParentId());
|
|
|
if (parentGid == null) {
|
|
|
Log.e(TAG, "cannot find task's parent tasklist"); //调试信息
|
|
|
throw new ActionFailureException("cannot add remote task");
|
|
|
}
|
|
|
mGTaskListHashMap.get(parentGid).addChildTask(task); //在本地生成的GTaskList中增加子结点
|
|
|
|
|
|
//登录远程服务器,创建Task
|
|
|
GTaskClient.getInstance().createTask(task);
|
|
|
n = (Node) task;
|
|
|
|
|
|
// add meta
|
|
|
updateRemoteMeta(task.getGid(), sqlNote);
|
|
|
} else {
|
|
|
TaskList tasklist = null;
|
|
|
|
|
|
// we need to skip folder if it has already existed
|
|
|
String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX;
|
|
|
if (sqlNote.getId() == Notes.ID_ROOT_FOLDER)
|
|
|
folderName += GTaskStringUtils.FOLDER_DEFAULT;
|
|
|
else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER)
|
|
|
folderName += GTaskStringUtils.FOLDER_CALL_NOTE;
|
|
|
else
|
|
|
folderName += sqlNote.getSnippet();
|
|
|
|
|
|
//iterator迭代器,通过统一的接口迭代所有的map元素
|
|
|
Iterator<Map.Entry<String, TaskList>> iter = mGTaskListHashMap.entrySet().iterator();
|
|
|
while (iter.hasNext()) {
|
|
|
Map.Entry<String, TaskList> entry = iter.next();
|
|
|
String gid = entry.getKey();
|
|
|
TaskList list = entry.getValue();
|
|
|
|
|
|
if (list.getName().equals(folderName)) {
|
|
|
tasklist = list;
|
|
|
if (mGTaskHashMap.containsKey(gid)) {
|
|
|
mGTaskHashMap.remove(gid);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// no match we can add now
|
|
|
if (tasklist == null) {
|
|
|
tasklist = new TaskList();
|
|
|
tasklist.setContentByLocalJSON(sqlNote.getContent());
|
|
|
GTaskClient.getInstance().createTaskList(tasklist);
|
|
|
mGTaskListHashMap.put(tasklist.getGid(), tasklist);
|
|
|
}
|
|
|
n = (Node) tasklist;
|
|
|
}
|
|
|
|
|
|
// update local note
|
|
|
sqlNote.setGtaskId(n.getGid());
|
|
|
sqlNote.commit(false);
|
|
|
sqlNote.resetLocalModified();
|
|
|
sqlNote.commit(true);
|
|
|
|
|
|
// gid-id mapping //创建id间的映射
|
|
|
mGidToNid.put(n.getGid(), sqlNote.getId());
|
|
|
mNidToGid.put(sqlNote.getId(), n.getGid());
|
|
|
}
|