亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? filesyncsource.cpp

?? funambol windows mobile plugin source code, the source code is taken from the funambol site
?? CPP
字號(hào):
/*
 * Copyright (C) 2003-2007 Funambol, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY, TITLE, NONINFRINGEMENT or FITNESS FOR A PARTICULAR
 * PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 * 02111-1307  USA
 */
#include "spds/SyncItem.h"
#include "spds/SyncItemStatus.h"
#include "base/util/utils.h"
#include "base/Log.h"
#include "spds/FileData.h"

#include "client/FileSyncSource.h"


FileSyncSource::FileSyncSource(const WCHAR* name, SyncSourceConfig* sc) : SyncSource(name, sc) {
    dir  = NULL;
    fileNode = NULL;

    setDir(".");
}

FileSyncSource::~FileSyncSource() {
    if(dir) {
        delete [] dir;
        dir = NULL;
    }
}



void FileSyncSource::setDir(const char* p) {
    if (dir)
        delete [] dir;

    dir = (p) ? stringdup(p) : stringdup("\\");
}

const char* FileSyncSource::getDir() {
    return dir;
}



/////////////////////////////////////////////////////////////////////////////////////////


int FileSyncSource::beginSync() {
    allItems.items.clear();
    deletedItems.items.clear();
    newItems.items.clear();
    updatedItems.items.clear();


    //
    // Get file list.
    //
    int count;
    char** fileNames = readDir(dir, &count);
    LOG.info("The client number of files to sync are %i", count);

    //
    // Create array list with empty data from file names.
    //
    for (int i=0; i<count; i++) {
        if (fileNames[i]) {
            WCHAR* wname = toWideChar(fileNames[i]);
            SyncItem* s = new SyncItem(wname);
            allItems.items.add(*s);

            if (fileNode) {
                char completeName[512];
                sprintf(completeName, "%s/%s", dir, fileNames[i]);
                unsigned long fileModTime = getFileModTime(completeName);
                unsigned long serverModTime = getServerModTime(fileNames[i]);

                if (!serverModTime) {
                    // added file
                    newItems.items.add(*s);
                } else if (serverModTime < fileModTime) {
                    // updated file
                    updatedItems.items.add(*s);
                }
            }

            delete s;
            delete [] wname;
            delete [] fileNames[i];
        }
    }

    if (fileNode) {
        // iterate over all files stored on server (i.e. those with non-zero time stamp property)
        // and check which of these have been deleted locally
        //
        // TODO: currently impossible with the ManagementNode interface, have to guess file names (works
        // for RawFileSyncSource)

        for (int key = 0; key < 1000; key++) {
            char keystr[80];
            sprintf(keystr, "%d", key);

            if (getServerModTime(keystr)) {
                char completeName[512];
                sprintf(completeName, "%s/%s", dir, keystr);
                if (!getFileModTime(completeName)) {
                    // file no longer exists locally
                    WCHAR* wname = toWideChar(keystr);
                    SyncItem* s = new SyncItem(wname);
                    deletedItems.items.add(*s);
                    delete s;
                    delete [] wname;
                }
            }
        }
    }

    if (fileNames) {
        delete [] fileNames;
        fileNames = NULL;
    }
    return 0;
}

SyncItem* FileSyncSource::getFirst(ItemIteratorContainer& container, BOOL getData) {
    container.index = 0;
    if (container.index >= container.items.size()) {
        return NULL;
    }
    SyncItem* syncItem = (SyncItem*)container.items.get(container.index)->clone();

    //
    // Set data from file content, return syncItem (freed by API)
    //
    if (!getData || setItemData(syncItem)){
        return syncItem;
    }
    else {
        delete syncItem;
        return NULL;
    }
}

SyncItem* FileSyncSource::getNext(ItemIteratorContainer& container, BOOL getData) {
    container.index++;
    if (container.index >= container.items.size()) {
        return NULL;
    }
    SyncItem* syncItem = (SyncItem*)container.items.get(container.index)->clone();

    // Set data from file content, return syncItem (freed by API)
    if (!getData || setItemData(syncItem)){
        return syncItem;
    }
    else {
        delete syncItem;
        return NULL;
    }
}

unsigned long FileSyncSource::getServerModTime(const char* keystr) {
    unsigned long modtime = 0;
    if (fileNode) {
        char* timestr = fileNode->readPropertyValue(keystr);
        modtime = anchorToTimestamp(timestr);
        delete [] timestr;
    }
    return modtime;
}

void FileSyncSource::setItemStatus(const WCHAR* key, int status) {
    LOG.debug("item key: %" WCHAR_PRINTF ", status: %i", key, status);
}



//////////////////////////////////////////////////////////////////////////////////////////


int FileSyncSource::addItem(SyncItem& item) {

    // format is the custom XML format understood by FileData
    int ret = STC_COMMAND_FAILED;
    FileData file;
    char* data = (char*)item.getData();
    size_t len = item.getDataSize();

    if (file.parse(data, len)) {
        sprintf(lastErrorMsg, "Error parsing item from server");
        report->setLastErrorCode(ERR_BAD_FILE_CONTENT);
        report->setLastErrorMsg(lastErrorMsg);
        report->setState(SOURCE_ERROR);
        return STC_COMMAND_FAILED;
    }


    if (file.getSize() >= 0) {
        //
        // Save item on FS
        //
        char completeName[512];
        sprintf(completeName, "%s/%" WCHAR_PRINTF, dir, file.getName());
        if (!saveFile(completeName, file.getBody(), file.getSize(), true)) {
            sprintf(lastErrorMsg, "Error saving file %" WCHAR_PRINTF, file.getName());
            report->setLastErrorCode(ERR_FILE_SYSTEM);
            report->setLastErrorMsg(lastErrorMsg);
            report->setState(SOURCE_ERROR);
            return STC_COMMAND_FAILED;
        }
        ret = addedItem(item, file.getName());
        LOG.debug("Added item: %" WCHAR_PRINTF, file.getName());
    }
    return ret;
}

int FileSyncSource::addedItem(SyncItem& item, const WCHAR* key) {
    item.setKey(key);

    // remember this item so that endSync() can store its time stamp
    SyncItem smallitem;
    smallitem.setKey(key);
    allItems.items.add(smallitem);

    return STC_ITEM_ADDED;
}

int FileSyncSource::updateItem(SyncItem& item) {
    ////// TBD ////////
    return STC_COMMAND_FAILED;
    ///////////////////

    int ret = STC_COMMAND_FAILED;

    FileData file;
    char* data      = NULL;
    long h          = 0;
    WCHAR* encod  = NULL;
    int size = 0;
    int res = 0;
    size = item.getDataSize();
    data = new char[size + 1];
    memset(data, 0, size + 1);
    memcpy(data, item.getData(), size);
    res = file.parse((data));
    encod = (WCHAR*)file.getEnc();
    delete [] data;

    if (wcslen(encod) > 0) {
        item.setData(file.getBody(), file.getSize());
        //
        // Replace item on FS (res=h)
        //
    }

    if (h == 0) {
        ret = STC_OK;
        LOG.debug("updated item: %S", item.getKey());
    }
    return ret;
}

int FileSyncSource::deleteItem(SyncItem& item) {
    int ret = STC_COMMAND_FAILED;

    char completeName[512];
    sprintf(completeName, "%s/%" WCHAR_PRINTF, dir, item.getKey());
    if (
#ifdef WIN32
		!_unlink(completeName)
#else
		!unlink(completeName)
#endif
		) {
        ret = STC_OK;
    }

    return ret;
}


int FileSyncSource::endSync() {
    if (fileNode) {
        SyncItem* item;

        // reset information about deleted items
        for (item = getFirst(deletedItems, FALSE); item; item = getNext(deletedItems, FALSE)) {
			char *tmp = toMultibyte(item->getKey());
            fileNode->setPropertyValue(tmp, "");
			delete [] tmp;
            delete item;
        }

        // update information about each file that currently exists on the server
        for (item = getFirst(allItems, FALSE); item; item = getNext(allItems, FALSE)) {
            char completeName[512];
            sprintf(completeName, "%s/%" WCHAR_PRINTF, dir, item->getKey());
            unsigned long modTime = getFileModTime(completeName);
            char anchor[30];
            timestampToAnchor(modTime, anchor);
			char *tmp = toMultibyte(item->getKey());
            fileNode->setPropertyValue(tmp, anchor);
			delete [] tmp;
            delete item;
        }
    }

    return 0;
}

void FileSyncSource::assign(FileSyncSource& s) {
    SyncSource::assign(s);
    setDir(getDir());
}

ArrayElement* FileSyncSource::clone() {
    FileSyncSource* s = new FileSyncSource(getName(), &(getConfig()));

    s->assign(*this);

    return s;
}


bool FileSyncSource::setItemData(SyncItem* syncItem) {

    bool ret = true;
    size_t len;
    char* content;
    char fileName[512];

    //
    // Get file content.
    //
    sprintf(fileName, "%s/%" WCHAR_PRINTF, dir, syncItem->getKey());
    if (!readFile(fileName, &content, &len, true)) {
        sprintf(lastErrorMsg, "Error opening the file '%s'", fileName);
        report->setLastErrorCode(ERR_FILE_SYSTEM);
        report->setLastErrorMsg(lastErrorMsg);
        report->setState(SOURCE_ERROR);
        return false;
    }

    //
    // Set data
    //
    if (content) {
        FileData file;
        file.setName(syncItem->getKey());
        file.setSize((int)len);
        file.setEnc(TEXT("base64"));
        file.setBody(content, (int)len);
        char* encContent = file.format();
        syncItem->setData(encContent, (int)strlen(encContent));
        delete [] encContent;
        encContent = NULL;
        //syncItem->setData(content, (long)len);
        delete [] content;
        content = NULL;
        return true;
    }
    else {
        sprintf(lastErrorMsg, "Error bad file content: '%s'", fileName);
        report->setLastErrorCode(ERR_BAD_FILE_CONTENT);
        report->setLastErrorMsg(lastErrorMsg);
        report->setState(SOURCE_ERROR);
        return false;
    }
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色婷婷精品大视频在线蜜桃视频| 国产精品一区二区久久精品爱涩| 2019国产精品| 99久久国产综合精品色伊| 天天色 色综合| 国产精品色婷婷久久58| 制服丝袜国产精品| 99re热视频精品| 国产美女精品在线| 蜜桃视频一区二区| 亚洲一区在线观看免费| 中文字幕成人在线观看| 欧美成人在线直播| 欧美区一区二区三区| 91影院在线观看| 成人丝袜18视频在线观看| 美腿丝袜亚洲综合| 日韩高清欧美激情| 亚洲综合在线视频| 亚洲视频中文字幕| 中文字幕av在线一区二区三区| 日韩欧美国产系列| 欧美放荡的少妇| 欧美在线不卡视频| 99久久婷婷国产综合精品| 国产69精品久久久久777| 日本三级亚洲精品| 亚洲高清免费视频| 午夜视频一区在线观看| 依依成人精品视频| 一区二区三区在线视频免费 | 欧美大白屁股肥臀xxxxxx| 91国产免费观看| 91亚洲国产成人精品一区二三 | 91麻豆高清视频| 9人人澡人人爽人人精品| 懂色av一区二区在线播放| 国产又粗又猛又爽又黄91精品| 免费人成在线不卡| 激情六月婷婷久久| 国产精品一区二区久久精品爱涩 | 国产在线国偷精品产拍免费yy| 美腿丝袜亚洲三区| 麻豆成人免费电影| 免费不卡在线视频| 久草精品在线观看| 国产激情精品久久久第一区二区| 国产精品88888| 国产91精品一区二区| 国产99精品国产| 成人av在线观| 色94色欧美sute亚洲线路一ni| 日本福利一区二区| 欧美日韩电影在线播放| 欧美一级生活片| 久久久久国产免费免费| 国产精品丝袜在线| 一区二区三区中文字幕精品精品 | 欧美午夜一区二区三区免费大片| 欧美影视一区在线| 日韩一级片在线观看| 精品国产91亚洲一区二区三区婷婷| 欧美mv日韩mv| 国产精品你懂的在线欣赏| 亚洲天堂福利av| 日韩高清不卡在线| 国产福利一区二区三区| 99久久国产综合精品女不卡| 欧美日韩免费一区二区三区| 日韩一级欧美一级| 国产精品天干天干在观线| 亚洲综合色成人| 九九久久精品视频| 91老师片黄在线观看| 日韩亚洲欧美高清| 国产精品第四页| 视频一区国产视频| 国产精品18久久久久久久久久久久 | 亚洲一区二区中文在线| 精品亚洲aⅴ乱码一区二区三区| 国产永久精品大片wwwapp| 91啪在线观看| 日韩一区二区不卡| 亚洲三级久久久| 国产真实乱子伦精品视频| 一本到三区不卡视频| 日韩欧美成人一区| 亚洲婷婷在线视频| 国产一区二区三区四区在线观看| 暴力调教一区二区三区| 欧美美女一区二区| |精品福利一区二区三区| 麻豆国产91在线播放| 91在线观看美女| 久久亚洲春色中文字幕久久久| 亚洲精选视频在线| 国产激情一区二区三区桃花岛亚洲| 欧美偷拍一区二区| 中文字幕精品—区二区四季| 日韩成人av影视| 日本乱人伦aⅴ精品| www国产精品av| 丝袜脚交一区二区| 91丨porny丨国产入口| 久久婷婷国产综合国色天香| 午夜精品久久久久久久久久久| 成人av在线一区二区三区| 26uuu另类欧美| 亚洲成在线观看| 91视频国产资源| 国产精品免费丝袜| 国产精品夜夜嗨| 精品三级在线观看| 亚洲成av人影院在线观看网| 91在线国产观看| 日本一区二区三区电影| 激情综合色综合久久| 91精品国产一区二区人妖| 亚洲精品国产精华液| a在线播放不卡| 国产欧美精品区一区二区三区| 国内精品国产三级国产a久久 | 欧美不卡视频一区| 日本不卡不码高清免费观看| 欧美三日本三级三级在线播放| 中文字幕在线观看不卡| 粉嫩av一区二区三区粉嫩| 欧美精品一区二区蜜臀亚洲| 日本最新不卡在线| 欧美精品视频www在线观看| 亚洲国产一二三| 在线免费亚洲电影| 亚洲精品成人在线| 一本久道久久综合中文字幕| 日韩一区欧美一区| www.在线欧美| 亚洲私人影院在线观看| 一本大道久久a久久综合| 亚洲欧洲av在线| 91色视频在线| 亚洲尤物视频在线| 51精品久久久久久久蜜臀| 日韩精品每日更新| 日韩无一区二区| 久久99久久99精品免视看婷婷| 精品免费日韩av| 国产99精品国产| 亚洲手机成人高清视频| 欧美三级电影网| 日韩不卡免费视频| 精品国产污污免费网站入口| 激情图区综合网| 国产精品无人区| 在线一区二区视频| 日韩精品视频网站| 亚洲精品一区二区三区精华液 | 久久久久久99精品| 成人激情电影免费在线观看| 日韩一区欧美小说| 欧美日韩精品二区第二页| 免费人成在线不卡| 亚洲国产精品成人久久综合一区| 99久久久精品免费观看国产蜜| 一区二区免费在线播放| 91精品国产91热久久久做人人| 国产一区二区三区免费播放| 国产精品成人在线观看| 欧美日韩一区二区三区在线看 | 午夜私人影院久久久久| 日韩一区二区精品| 成人激情综合网站| 亚洲精品va在线观看| 日韩一区二区视频| 福利一区二区在线| 夜夜亚洲天天久久| 欧美成人a在线| 色综合咪咪久久| 极品少妇xxxx精品少妇| 自拍偷自拍亚洲精品播放| 欧美一区二区三区在线观看| 国产91丝袜在线播放九色| 亚洲国产精品一区二区www| 精品国产乱码久久久久久免费| 91视频精品在这里| 国产一区在线精品| 亚洲第一二三四区| 国产精品久久夜| 日韩欧美一二三四区| 色婷婷综合久色| 国产伦精品一区二区三区在线观看| 尤物av一区二区| 国产欧美一区二区三区在线老狼| 色哟哟欧美精品| 国产精品1区二区.| 日韩黄色免费网站| 亚洲同性同志一二三专区| 精品成人一区二区| 欧美日本精品一区二区三区| 国产精品小仙女| 免费观看在线色综合|