⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mailsyncsource.cpp

📁 funambol windows mobile plugin source code, the source code is taken from the funambol site
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -