📄 syncmanager.cpp
字号:
if ( sources[count]->beginSync() ) {
// Error from SyncSource
lastErrorCode = ERR_UNSPECIFIED;
ret = lastErrorCode;
// syncsource should have set its own errors. If not, set default error.
if (sources[count]->getReport()->checkState()) {
setSourceStateAndError(count, SOURCE_ERROR, ERR_UNSPECIFIED, "Error in begin sync");
}
continue;
}
else {
isAtLeastOneSourceCorrect = TRUE;
}
// keep sending changes for current source until done with it
do {
if (modificationCommand) {
delete modificationCommand;
modificationCommand = NULL;
}
if (commands->isEmpty()) {
status = syncMLBuilder.prepareSyncHdrStatus(NULL, 200);
commands->add(*status);
deleteStatus(&status);
/* The server should not send any alert...
list = syncMLProcessor.getCommands(syncml->getSyncBody(), ALERT);
status = syncMLBuilder.prepareAlertStatus(*sources[0], list, 200);
if (status) {
commands->add(*status);
deleteStatus(&status);
}
deleteArrayList(&list);
*/
}
// Accumulate changes for the current sync source until
// an item cannot be sent completely because the message size would be exceeded
//
// In each loop iteration at least one change must be sent to ensure progress.
// Keeping track of the current message size is a heuristic which assumes a constant
// overhead for each message and change item and then adds the actual item data sent.
deleteSyncML(&syncml);
static long msgOverhead = 2000;
static long changeOverhead = 150;
long msgSize = 0;
Sync* sync = syncMLBuilder.prepareSyncCommand(*sources[count]);
ArrayList* list = new ArrayList();
switch (sources[count]->getSyncMode()) {
case SYNC_SLOW:
{
if (syncItem == NULL) {
if (tot == 0) {
syncItem = getItem(*sources[count], &SyncSource::getFirstItem);
syncItemOffset = 0;
if (syncItem) {
// Fire Sync Item Event - Item sent as Updated
fireSyncItemEvent(sources[count]->getConfig().getURI(), sources[count]->getConfig().getName(), syncItem->getKey(), ITEM_UPDATED_BY_CLIENT);
}
}
}
tot = 0;
do {
if (syncItem == NULL) {
syncItem = getItem(*sources[count], &SyncSource::getNextItem);
syncItemOffset = 0;
if (syncItem) {
// Fire Sync Item Event - Item sent as Updated
fireSyncItemEvent(sources[count]->getConfig().getURI(), sources[count]->getConfig().getName(), syncItem->getKey(), ITEM_UPDATED_BY_CLIENT);
}
}
if (tot &&
maxMsgSize &&
syncItem &&
msgSize + changeOverhead + syncItem->getDataSize() - syncItemOffset > maxMsgSize) {
// avoid adding another item that exceeds the message size
break;
}
msgSize += changeOverhead;
msgSize +=
syncMLBuilder.addItem(modificationCommand,
syncItemOffset,
(maxMsgSize && loSupport) ? (maxMsgSize - msgSize) : LONG_MAX,
REPLACE_COMMAND_NAME,
syncItem,
sources[count]->getConfig().getType());
if (syncItem) {
if (syncItemOffset == syncItem->getDataSize()) {
// the item is only the pointer not another instance. to save mem
delete syncItem; syncItem = NULL;
} else {
assert(msgSize >= maxMsgSize);
break;
}
}
else {
last = TRUE;
break;
}
tot++;
} while(msgSize < maxMsgSize);
}
break;
case SYNC_REFRESH_FROM_SERVER:
last = TRUE;
allItemsList[count] = new ArrayList();
syncItem = getItem(*sources[count], &SyncSource::getFirstItemKey);
if(syncItem) {
allItemsList[count]->add((ArrayElement&)*syncItem);
delete syncItem; syncItem = NULL;
}
syncItem = getItem(*sources[count], &SyncSource::getNextItemKey);
while(syncItem) {
allItemsList[count]->add((ArrayElement&)*syncItem);
delete syncItem; syncItem = NULL;
syncItem = getItem(*sources[count], &SyncSource::getNextItemKey);
}
break;
case SYNC_ONE_WAY_FROM_SERVER:
last = TRUE;
break;
case SYNC_REFRESH_FROM_CLIENT:
{
if (syncItem == NULL) {
if (tot == 0) {
syncItem = getItem(*sources[count], &SyncSource::getFirstItem);
syncItemOffset = 0;
if (syncItem) {
// Fire Sync Item Event - Item sent as Updated
fireSyncItemEvent(sources[count]->getConfig().getURI(), sources[count]->getConfig().getName(), syncItem->getKey(), ITEM_UPDATED_BY_CLIENT);
}
}
}
tot = 0;
do {
if (syncItem == NULL) {
syncItem = getItem(*sources[count], &SyncSource::getNextItem);
syncItemOffset = 0;
if (syncItem) {
// Fire Sync Item Event - Item sent as Updated
fireSyncItemEvent(sources[count]->getConfig().getURI(), sources[count]->getConfig().getName(), syncItem->getKey(), ITEM_UPDATED_BY_CLIENT);
}
}
if (tot &&
maxMsgSize &&
syncItem &&
msgSize + changeOverhead + syncItem->getDataSize() - syncItemOffset > maxMsgSize) {
// avoid adding another item that exceeds the message size
break;
}
msgSize += changeOverhead;
msgSize +=
syncMLBuilder.addItem(modificationCommand,
syncItemOffset,
(maxMsgSize && loSupport) ? (maxMsgSize - msgSize) : LONG_MAX,
REPLACE_COMMAND_NAME, syncItem,
sources[count]->getConfig().getType());
if (syncItem) {
if (syncItemOffset == syncItem->getDataSize()) {
delete syncItem; syncItem = NULL;// the item is only the pointer not another instance. to save mem
} else {
assert(msgSize >= maxMsgSize);
break;
}
}
else {
last = TRUE;
break;
}
tot++;
} while(msgSize < maxMsgSize);
}
break;
default:
{
tot = 0;
//
// New Item
//
if (step == 0) {
assert(syncItem == NULL);
syncItem = getItem(*sources[count], &SyncSource::getFirstNewItem);
syncItemOffset = 0;
step++;
if (syncItem == NULL)
step++;
}
if (step == 1) {
do {
if (syncItem == NULL) {
syncItem = getItem(*sources[count], &SyncSource::getNextNewItem);
syncItemOffset = 0;
}
if (tot &&
maxMsgSize &&
syncItem &&
msgSize + changeOverhead + syncItem->getDataSize() - syncItemOffset > maxMsgSize) {
// avoid adding another item that exceeds the message size
break;
}
msgSize += changeOverhead;
msgSize +=
syncMLBuilder.addItem(modificationCommand,
syncItemOffset,
(maxMsgSize && loSupport) ? (maxMsgSize - msgSize) : LONG_MAX,
ADD_COMMAND_NAME,
syncItem, sources[count]->getConfig().getType());
if (syncItem) {
if (syncItemOffset == syncItem->getDataSize()) {
// Fire Sync Item Event - New Item Detected
fireSyncItemEvent(sources[count]->getConfig().getURI(), sources[count]->getConfig().getName(), syncItem->getKey(), ITEM_ADDED_BY_CLIENT);
delete syncItem; syncItem = NULL;
} else {
assert(msgSize >= maxMsgSize);
break;
}
}
else {
step++;
break;
}
tot++;
} while(msgSize < maxMsgSize);
}
//
// Updated Item
//
if (step == 2) {
if (modificationCommand) {
list->add(*modificationCommand);
delete modificationCommand;
modificationCommand = NULL;
}
assert(syncItem == NULL);
syncItem = getItem(*sources[count], &SyncSource::getFirstUpdatedItem);
syncItemOffset = 0;
step++;
if (syncItem == NULL)
step++;
}
if (step == 3) {
do {
if (syncItem == NULL) {
syncItem = getItem(*sources[count], &SyncSource::getNextUpdatedItem);
syncItemOffset = 0;
}
if (tot &&
maxMsgSize &&
syncItem &&
msgSize + changeOverhead + syncItem->getDataSize() - syncItemOffset > maxMsgSize) {
// avoid adding another item that exceeds the message size
break;
}
msgSize += changeOverhead;
msgSize +=
syncMLBuilder.addItem(modificationCommand,
syncItemOffset,
(maxMsgSize && loSupport) ? (maxMsgSize - msgSize) : LONG_MAX,
REPLACE_COMMAND_NAME,
syncItem, sources[count]->getConfig().getType());
if (syncItem) {
if (syncItemOffset == syncItem->getDataSize()) {
// Fire Sync Item Event - Item Updated
fireSyncItemEvent(sources[count]->getConfig().getURI(), sources[count]->getConfig().getName(), syncItem->getKey(), ITEM_UPDATED_BY_CLIENT);
delete syncItem; syncItem = NULL;
} else {
assert(msgSize >= maxMsgSize);
break;
}
}
else {
step++;
break;
}
tot++;
} while( msgSize < maxMsgSize);
}
//
// Deleted Item
//
if (step == 4) {
if (modificationCommand) {
list->add(*modificationCommand);
delete modificationCommand;
modificationCommand = NULL;
}
syncItem = getItem(*sources[count], &SyncSource::getFirstDeletedItem);
syncItemOffset = 0;
step++;
if (syncItem == NULL)
step++;
}
if (step == 5) {
do {
if (syncItem == NULL) {
syncItem = getItem(*sources[count], &SyncSource::getNextDeletedItem);
syncItemOffset = 0;
}
if (tot &&
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -