📄 mailsyncsource.cpp
字号:
else {
LOG.info("update flags only");
}
syncItem = buildSyncItem(m);
syncItem->setState(SYNC_STATE_UPDATED);
//syncItem->setSourceParent(m->getParent());
if (m->getParent()[0] == 'O')
isMailInOutbox = true;
delete m; m = NULL;
} else {
LOG.info("No updated mail");
}
return syncItem;
}
SyncItem* MailSyncSource::getNextUpdatedItem() {
if (syncItem) {
//delete syncItem; syncItem = NULL;
syncItem = NULL;
}
MailClientData* m = mailClient2Server->getNextUpdatedItem();
if (m) {
LOG.info("Subject other updated mail: -%s-", m->getEmailData()->getEmailItem().getSubject());
syncItem = buildSyncItem(m);
syncItem->setState(SYNC_STATE_UPDATED);
//syncItem->setSourceParent(m->getParent());
if (m->getParent()[0] == 'O')
isMailInOutbox = true;
delete m; m = NULL;
} else {
LOG.info("No other updated mail");
}
return syncItem;
}
SyncItem* MailSyncSource::getFirstDeletedItem() {
if (syncItem) {
//delete syncItem; syncItem = NULL;
syncItem = NULL;
}
MailClientData* m = mailClient2Server->getFirstDeletedItem();
if (m) {
syncItem = new SyncItem(m->getEntryId());
syncItem->setState(SYNC_STATE_DELETED);
syncItem->setSourceParent((wchar_t*)m->getParent());
LOG.info("ID of deleted mail: -%S-", m->getEntryId());
delete m; m = NULL;
} else {
LOG.info("No deleted mail");
}
return syncItem;
}
SyncItem* MailSyncSource::getNextDeletedItem() {
if (syncItem) {
//delete syncItem; syncItem = NULL;
syncItem = NULL;
}
MailClientData* m = mailClient2Server->getNextDeletedItem();
if (m) {
syncItem = new SyncItem(m->getEntryId());
syncItem->setState(SYNC_STATE_DELETED);
syncItem->setSourceParent((wchar_t*)m->getParent());
LOG.info("ID of other deleted mail: -%S-", m->getEntryId());
delete m; m = NULL;
} else {
LOG.info("No other deleted mail");
}
return syncItem;
}
void MailSyncSource::setItemStatus(const wchar_t* key, int status) {
if (wcsstr(key, TEXT("O/")) != NULL) {
if (status == 500 || status == 418 || status == 419) {
failedSendMailInOutbox = true;
SyncSourceReport* rep = getReport();
int res = rep->getItemReportFailedCount(SERVER, COMMAND_ADD);
BOOL found = FALSE;
for (int i = 0; i < res; i++) {
ItemReport* r = rep->getItemReport(SERVER, COMMAND_ADD, i);
if (wcscmp(r->getId(), key) == 0) {
found = TRUE;
if (r->getStatusMessage())
LOG.error("The mail in outbox cannot be sent. Server says: %S", r->getStatusMessage());
}
}
if (!found) {
int res = rep->getItemReportFailedCount(SERVER, COMMAND_REPLACE);
for (int i = 0; i < res; i++) {
ItemReport* r = rep->getItemReport(SERVER, COMMAND_REPLACE, i);
if (wcscmp(r->getId(), key) == 0) {
if (r->getStatusMessage())
LOG.error("The mail in outbox cannot be sent. Server says: %S", r->getStatusMessage());
}
}
}
} else if (status == 200 || status == 201) {
mailClient2Server->moveMessageFromOutboxToSentItemsFolder(key);
}
}
LOG.info("Item status - key: %S, status: %i", key, status);
}
int MailSyncSource::addItem(SyncItem& item) {
int ret = STC_COMMAND_FAILED; // command Failed;
if (!isMemoryAvailable()) {
LOG.error(LOW_DEVICE_MEMORY);
throw OutOfMemoryException(0, -50); //defined in startsync //return ret;
}
MailClientData m(TEXT("undef"));
wchar_t* id = NULL;
wchar_t tt[3];
char* posFolder = NULL;
mailServer2Client->setFolderToSync(s_folderToSync);
if (item.getTargetParent() == NULL) {
wsprintf(tt, TEXT("%c"), item.getKey()[0]);
} else {
wsprintf(tt, TEXT("%s"), item.getTargetParent());
}
char* itemData = (char*)item.getData();
if(!itemData){
LOG.error("addItem: empty data from server");
ret = 500;
goto finally;
}
// Check Folder tag
posFolder = strstr(itemData, "Folder>");
if ((posFolder != NULL) && ((posFolder - itemData) < 10)) {
FolderData folder;
if (!setFolderData(item, folder))
{
ret = 500;
goto finally;
}
else
{
ret = 200;
if (wcsicmp(folder.getRole(), TEXT("Inbox")) == 0)
item.setKey(TEXT("I"));
else if (wcsicmp(folder.getRole(), TEXT("Outbox")) == 0)
item.setKey(TEXT("O"));
else if (wcsicmp(folder.getRole(), TEXT("Drafts")) == 0)
item.setKey(TEXT("D"));
else if (wcsicmp(folder.getRole(), TEXT("Sent")) == 0)
item.setKey(TEXT("S"));
else if (wcsicmp(folder.getRole(), TEXT("Deleted")) == 0 )
item.setKey(TEXT("T"));
else
ret = 500;
goto finally;
}
}
else{
if (!isInFolderToSync(tt))
goto finally;
if (!setMailData(item, tt, m, false))
goto finally;
}
// If the message is empty, discard it
if(m.getEmailData()->getEmailItem().empty()) {
LOG.info("Empty message from server");
ret = 500;
goto finally;
}
// set the max mail message size in the mail to handle the inclusive filter
m.setMaxMailMessageSize(getMaxMailMessageSize());
// set the current size filter
m.setCurrentMessageSizeFilter(((MailSyncSourceConfig&)getConfig()).getAttachSize());
//set if the sync is inclusive
m.setIsSyncInclusive(getIsSyncInclusive());
id = mailServer2Client->addMessage(&m);
if (!id) {
LOG.error("Error in MailServer2Client::addMessage");
goto finally;
}
else if (wcscmp(id, ITEM_ARLEADY_EXISTS) == 0) {
ret = STC_ALREADY_EXISTS;
LOG.debug("Mail already exists");
goto finally;
}
// Ok: set the new key and the status code
ret = STC_ITEM_ADDED;
item.setKey(id);
if (HwndFunctions::wnd)
SendMessage(HwndFunctions::wnd, ID_MYMSG_ITEM_SYNCED_FROM_SERVER,(WPARAM) SOURCE_MAIL, NULL);
// commented only for debug. It must be used!!!!
// MailMessage& msg = m.getEmailData()->getEmailItem();
// logInfo(TEXT("Mail added: -%S-"), msg.getSubject());
// Set new mail in Inbox flag
if (isMailInInbox == false && wcscmp(tt, TEXT("I")) == 0)
isMailInInbox = true;
finally:
if (id) { delete [] id; id = NULL; }
return ret;
}
int MailSyncSource::updateItem(SyncItem& item) {
int ret = STC_COMMAND_FAILED; // command Failed;
if (!isMemoryAvailable()) {
LOG.error(LOW_DEVICE_MEMORY);
throw OutOfMemoryException(0, -50); //defined in startsync //return ret;
}
wchar_t tt[3];
MailClientData m(item.getKey());;
int errorCode = 0;
HRESULT hr = S_OK;
char* tmp = NULL;
wchar_t* toUse = NULL;
mailServer2Client->setFolderToSync(s_folderToSync);
if (item.getTargetParent() == NULL) {
wsprintf(tt, TEXT("%c"), item.getKey()[0]);
} else {
wsprintf(tt, TEXT("%s"), item.getTargetParent());
}
/*
char *id = toMultibyte(item.getKey());
m.emailData->getEmailItem().setEntryID(id);
delete [] id;
*/
if (!isInFolderToSync(tt))
goto finally;
if (!setMailData(item, tt, m, true))
goto finally;
// set the max mail message size in the mail to handle the inclusive filter
m.setMaxMailMessageSize(getMaxMailMessageSize());
// set the current size filter
m.setCurrentMessageSizeFilter(((MailSyncSourceConfig&)getConfig()).getAttachSize());
//set if the sync is inclusive
m.setIsSyncInclusive(getIsSyncInclusive());
hr = mailServer2Client->updateMessage(&m);
if (hr == S_OK) {
if (HwndFunctions::wnd)
SendMessage(HwndFunctions::wnd, ID_MYMSG_ITEM_SYNCED_FROM_SERVER, (WPARAM) SOURCE_MAIL, NULL);
ret = STC_OK;
LOG.info("Mail updated: -%s-", m.getEmailData()->getEmailItem().getSubject());
}
finally:
return ret;
}
int MailSyncSource::deleteItem(SyncItem& item) {
int ret = STC_COMMAND_FAILED; // command Failed;
wchar_t tt[3];
mailServer2Client->setFolderToSync(s_folderToSync);
MailClientData m(item.getKey());
if (item.getTargetParent() == NULL) {
wsprintf(tt, TEXT("%c"), item.getKey()[0]);
} else {
wsprintf(tt, TEXT("%s"), item.getTargetParent());
}
m.setParent(tt);
HRESULT hr = mailServer2Client->deleteMessage(&m);
if (hr == S_OK) {
if (HwndFunctions::wnd)
SendMessage(HwndFunctions::wnd, ID_MYMSG_ITEM_SYNCED_FROM_SERVER, (WPARAM) SOURCE_MAIL, NULL);
ret = STC_OK;
LOG.info("Mail deleted: -%S-", item.getKey());
}
return ret;
}
int MailSyncSource::beginSync() {
// Init mailServer2Client
if (mailServer2Client)
delete mailServer2Client;
mailServer2Client = new MailServer2Client();
if(!mailServer2Client){
LOG.error("memory error getting mailServer2Client");
return 500;
}
// Init mailClient2server
if (mailClient2Server)
delete mailClient2Server;
mailClient2Server = new MailClient2Server();
mailClient2Server->setFolderToSync(s_folderToSync);
if(!mailClient2Server){
LOG.error("memory error getting mailServer2Client");
return 500;
}
/*
if (getSyncMode() == SYNC_REFRESH_FROM_SERVER) {
int val = TimedMessageBox(NULL, ASK_REFRESH_MESSAGE, TEXT("Alert"),
MB_YESNO | MB_ICONQUESTION | MB_SETFOREGROUND, ASK_REFRESH_TIMEOUT * 1000); // default ASK_TIMEOUT = 10
if (val == IDYES) {
LOG.debug("User said yes to delete local mail and refresh.");
}
else {
LOG.debug("User said no to delete local mail and refresh");
return -1;
}
}
*/
return 0;
}
int MailSyncSource::endSync() {
// Get a new mailClient2server
if (mailClient2Server)
delete mailClient2Server;
mailClient2Server = new MailClient2Server();
mailClient2Server->setFolderToSync(s_folderToSync);
mailClient2Server->setSync(ONLY_ALL_MESSAGE_LIST, getPath());
mailClient2Server->writeCurrentMails(getPath());
return 0;
}
MailSyncSource& MailSyncSource::operator=(MailSyncSource& s) {
if (this != &s) {
setSyncMode(s.getSyncMode());
setLastSync(s.getLastSync());
setNextSync(s.getNextSync());
setLastAnchor(s.getLastAnchor());
setNextAnchor(s.getNextAnchor());
//setErrorHandler(s.getErrorHandler());
setFilter(s.getFilter());
setPath(s.getPath());
setFolderToSync(s.getFolderToSync());
// This attributes are not copied from the other source
setIsMailInOutbox(false);
setIsMailInInbox(false);
mailClient2Server = NULL;
mailServer2Client = NULL;
setReport(s.getReport());
setMaxMailMessageSize(s.getMaxMailMessageSize());
}
return *this;
}
ArrayElement* MailSyncSource::clone() {
MailSyncSource* s = new MailSyncSource(getName(), &(getConfig()));
*s = *this;
return s;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -