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

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

?? listdatacalllog.cpp

?? This code is Address book code for Windows Mobile. This source code support windows mobile 5.0 over.
?? CPP
字號:
#include "stdafx.h"
#include "ListDataCallLog.h"
#include "windows.h"
#include "PhoneUtils.h"
#include "Macros.h"

ListDataCallLog::ListDataCallLog(Settings * pSettings) {
    this->_settings = pSettings;
    this->Populate();
}

void ListDataCallLog::Release(void) {}

HRESULT ListDataCallLog::Populate(void) {
    HRESULT hr = S_OK;
    HANDLE ph = 0;
    DWORD lastEntryIndex = 0;
    DWORD currentEntryIndex = 0;
    TCHAR pszPrimary[PRIMARY_TEXT_LENGTH];
 	TCHAR pszSecondary[SECONDARY_TEXT_LENGTH];
    TCHAR pastTime;
    
    // these are for detecting repeating items
    TCHAR pszHash1[PRIMARY_TEXT_LENGTH*2] = {0};
    TCHAR pszHash2[PRIMARY_TEXT_LENGTH*2] = {0};
    int repeats = 0;

    COLORREF rgbPrimary = RGB(255, 255, 255);

    hr = PhoneOpenCallLog(&ph);
    CHR(hr);

    hr = PhoneSeekCallLog(ph, CALLLOGSEEK_END, 0, &lastEntryIndex);
    CHR(hr);

    hr = PhoneSeekCallLog(ph, CALLLOGSEEK_BEGINNING, 0, 
        &currentEntryIndex);
    CHR(hr);

    this->_arrayLength = lastEntryIndex - currentEntryIndex;
    this->_items = new Data[this->_arrayLength];

	CALLLOGENTRY *pEntry = new CALLLOGENTRY();
    //cbSize MUST be set before passing the struct in to the function!
    // Refer to the doc.
    pEntry->cbSize = sizeof(CALLLOGENTRY);

    for (int i = (int)currentEntryIndex; i <= (int)lastEntryIndex; i++) {
        if (this->_listCounter >= this->_arrayLength)
            break;

        pEntry->pszNumber = NULL;
        pEntry->pszName = NULL;
        pEntry->pszNameType = NULL;
        pEntry->pszNote = NULL;

        hr = PhoneGetCallLogEntry(ph, pEntry);
        CHR(hr);

		pastTime = _getPastTime(pEntry->ftStartTime, pszSecondary, 
            SECONDARY_TEXT_LENGTH);

        StringCchCopy(pszPrimary, PRIMARY_TEXT_LENGTH,  
            (pEntry->pszName ? pEntry->pszName
                : pEntry->pszNumber ? pEntry->pszNumber
                : this->_settings->unknown_string)
             );

        // calculate the hash for this entry, to check for duplicates
        // type (TCHAR)IOM and pastTime will be something like 0, 1, 2, 
        // so instead, make it 'A', 'B', 'C'
        pszHash2[0] = pastTime + 'A';
        pszHash2[1] = (TCHAR)pEntry->iom + 'A';
        pszHash2[2] = 0;
        if (pEntry->pszName)
            StringCchCat(pszHash2, PRIMARY_TEXT_LENGTH*2, pEntry->pszName);
        if (pEntry->pszNumber)
            StringCchCat(pszHash2, PRIMARY_TEXT_LENGTH*2, pEntry->pszNumber);

        // this is a repeated item
        if (_tcscmp(pszHash2, pszHash1) == 0) {
            repeats++;
        }

        // this is not a repeated item
        else {
            // the previous item was repeated
            if (repeats > 0) {
                Data * first = &this->_items[this->_listCounter - 1]; 
                StringCchPrintf(
                    &first->szPrimaryText[first->nPrimaryTextLength], 
                    PRIMARY_TEXT_LENGTH, TEXT(" [%d]"), repeats+1);
                first->nPrimaryTextLength = _tcslen(first->szPrimaryText);
                repeats = 0;
            }

            rgbPrimary = pEntry->iom == IOM_MISSED 
                ? this->_settings->rgbListItemMissedText 
                : this->_settings->rgbListItemText;

#ifdef DEBUG_SCREENSHOTS
            rgbPrimary = pEntry->iom == IOM_MISSED || i == 3
                ? this->_settings->rgbListItemMissedText 
                : this->_settings->rgbListItemText;
#endif
		    this->_addListItem(i, pszPrimary, pszSecondary, 
                pastTime, i, rgbPrimary);
        }

        StringCchCopy(pszHash1, PRIMARY_TEXT_LENGTH*2, pszHash2);

		// cleanup
		if (pEntry->pszNumber) delete pEntry->pszNumber;
		if (pEntry->pszName) delete pEntry->pszName;
		if (pEntry->pszNameType) delete pEntry->pszNameType;
		if (pEntry->pszNote) delete pEntry->pszNote;    
    }

Error:
    // more cleanup
    if (NULL != pEntry) {
        if (NULL != pEntry->pszNumber)
            delete pEntry->pszNumber;
        if (NULL != pEntry->pszName)
            delete pEntry->pszName;
        if (NULL != pEntry->pszNameType)
            delete pEntry->pszNameType;
        if (NULL != pEntry->pszNote)
            delete pEntry->pszNote;
        delete pEntry;
    }

    hr = PhoneCloseCallLog(ph);

    return hr;
}

HRESULT ListDataCallLog::PopulateDetailsFor(int index) {
    HRESULT hr = S_OK;
    HANDLE ph = 0;
    DWORD currentEntryIndex = 0;
    int id = this->_items[index].ID;

    // Save the original call
    IOM iom;
    TCHAR pszName[PRIMARY_TEXT_LENGTH] = {0};
    TCHAR pszNumber[PRIMARY_TEXT_LENGTH] = {0};
    TCHAR pastTime = 0;

    hr = PhoneOpenCallLog(&ph);
    CHR(hr);

    hr = PhoneSeekCallLog(ph, CALLLOGSEEK_BEGINNING, id, 
        &currentEntryIndex);
    CHR(hr);

    this->_itemDetailCount = 0;
    this->_currentItemIndex = index;

	CALLLOGENTRY *pEntry = new CALLLOGENTRY();
    //cbSize MUST be set before passing the struct in to the function!
    // Refer to the doc.
    pEntry->cbSize = sizeof(CALLLOGENTRY);

    hr = PhoneGetCallLogEntry(ph, pEntry);
    CHR(hr);

    // save the information for the first call
    iom = pEntry->iom;
    pastTime = _getPastTime(pEntry->ftStartTime);
    if (pEntry->pszName)
        StringCchCopy(pszName, PRIMARY_TEXT_LENGTH, pEntry->pszName);
    if (pEntry->pszNumber)
        StringCchCopy(pszNumber, PRIMARY_TEXT_LENGTH, pEntry->pszNumber);

    // Set the title of the details screen
    this->_currentDetailTitle =
          iom == IOM_MISSED   ? this->_settings->missed_string
        : iom == IOM_INCOMING ? this->_settings->incoming_string
        :                       this->_settings->outgoing_string;

    if (pEntry->pszName)
        this->_addDetail(diText, pszName);

    if (pEntry->pszNumber)
        this->_addDetail(diText, pszNumber);

    if (this->_itemDetailCount == 0)
        this->_addDetail(diText, this->_settings->unknown_string);

    do {
        if (pEntry->ftStartTime.dwHighDateTime > 0) {
            int c = this->_itemDetailCount;

            this->_detailItems[c].type = diText;
            StringCchCopy(this->_detailItems[c].label, SECONDARY_TEXT_LENGTH,
                this->_settings->date_string);
            _printDate(this->_detailItems[c].text, PRIMARY_TEXT_LENGTH, 
                pEntry->ftStartTime);
            
            this->_itemDetailCount++;
        }

        if (pEntry->iom != IOM_MISSED) {
            int c = this->_itemDetailCount;
            
            this->_detailItems[c].type = diText;
            StringCchCopy(this->_detailItems[c].label, SECONDARY_TEXT_LENGTH,
                this->_settings->duration_string);
            _printDuration(this->_detailItems[c].text, PRIMARY_TEXT_LENGTH, 
                pEntry->ftStartTime, pEntry->ftEndTime, this->_settings);

            this->_itemDetailCount++;
        }

	    if (pEntry->pszNumber) delete pEntry->pszNumber;
	    if (pEntry->pszName) delete pEntry->pszName;
	    if (pEntry->pszNameType) delete pEntry->pszNameType;
	    if (pEntry->pszNote) delete pEntry->pszNote;

        hr = PhoneGetCallLogEntry(ph, pEntry);
        CHR(hr);
    
    // this determines if the next entry is a duplicate entry
    // TODO: make this not ugly
    } while (NULL != pEntry 
        && iom == pEntry->iom
        && (pEntry->pszNumber == NULL && pszNumber[0] == 0 || pEntry->pszNumber != NULL && _tcscmp(pEntry->pszNumber, pszNumber) == 0)
        && (pEntry->pszName == NULL && pszName[0] == 0 || pEntry->pszName != NULL && _tcscmp(pEntry->pszName, pszName) == 0)
        && pastTime == _getPastTime(pEntry->ftStartTime));


    if (_tcslen(pszNumber) > 0) {
        // Button to return call
        this->_addDetail(diCallButton, this->_settings->returncall_string, 
            NULL, pszNumber, pszName);

        // Button to send SMS
        this->_addDetail(diSmsButton, this->_settings->sms_string, 
            NULL, pszNumber, pszName);

        // Button to add Contact
        if (_tcslen(pszName) == 0 || _tcscmp(pszName, pszNumber) == 0) {
            this->_addDetail(diSaveContactButton, 
                this->_settings->savecontact_string, NULL, pszNumber);
        }
    }

Error:
    // more cleanup
    if (NULL != pEntry) {
        if (NULL != pEntry->pszNumber)
            delete pEntry->pszNumber;
        if (NULL != pEntry->pszName)
            delete pEntry->pszName;
        if (NULL != pEntry->pszNameType)
            delete pEntry->pszNameType;
        if (NULL != pEntry->pszNote)
            delete pEntry->pszNote;
        delete pEntry;
        pEntry = NULL;
    }

    hr = PhoneCloseCallLog(ph);

    return hr;
}

void ListDataCallLog::GetItemGroup(int index, TCHAR * pszGroup) {
    TCHAR g = this->_items[index].wcGroup;
	StringCchCopy(pszGroup, 10, 
		  g == 1 ? this->_settings->sunday_string
		: g == 2 ? this->_settings->monday_string
		: g == 3 ? this->_settings->tuesday_string
		: g == 4 ? this->_settings->wednesday_string
		: g == 5 ? this->_settings->thursday_string
		: g == 6 ? this->_settings->friday_string
		: g == 7 ? this->_settings->saturday_string
        : g == 'T' ? this->_settings->today_string
        : g == 'Y' ? this->_settings->yesterday_string
        : this->_settings->older_string
	);
}

void ListDataCallLog::ToggleFavorite() {}

HRESULT ListDataCallLog::DisplayItem() { return S_OK; }

void ListDataCallLog::EditItem() {}

TCHAR _getPastTime(FILETIME ftTime, TCHAR * pszSecondary, int strLength) {

    // if ftTime somehow == 0, then get outta here
    if (!ftTime.dwHighDateTime && !ftTime.dwLowDateTime) {
        if (pszSecondary)
            pszSecondary[0] = 0;
        return 0;
    }

    FILETIME ftToday;		// midnight today (but UTC)
	FILETIME ftYesterday;	// midnight yesterday (but UTC)
	FILETIME ftThisWeek;	// midnight one week ago (but UTC)

	// temporary vars
	SYSTEMTIME st;
	FILETIME ft;

	// calculate ftToday
	GetLocalTime(&st);
	st.wMinute = 0;
	st.wSecond = 0;
	st.wHour = 0;
	SystemTimeToFileTime(&st, &ft);
	LocalFileTimeToFileTime(&ft, &ftToday);
	if (CompareFileTime(&ftTime, &ftToday) >= 0) {
		FileTimeToLocalFileTime(&ftTime, &ft);
		FileTimeToSystemTime(&ft, &st);
        if (pszSecondary)
            ::GetTimeFormat(LOCALE_USER_DEFAULT, 
                TIME_NOSECONDS, &st,
                NULL, pszSecondary, strLength);
		return 'T';
	}

	// calculate ftYesterday
	ULARGE_INTEGER uli;
	uli.HighPart = ftToday.dwHighDateTime;
	uli.LowPart = ftToday.dwLowDateTime;
	uli.QuadPart -= 864000000000;  // 100-nanosecond blocks in one day
	ftYesterday.dwHighDateTime = uli.HighPart;
	ftYesterday.dwLowDateTime = uli.LowPart;
	if (CompareFileTime(&ftTime, &ftYesterday) >= 0) {
		FileTimeToLocalFileTime(&ftTime, &ft);
		FileTimeToSystemTime(&ft, &st);
        if (pszSecondary)
            ::GetTimeFormat(LOCALE_USER_DEFAULT, 
                TIME_NOSECONDS, 
                &st, NULL, pszSecondary, strLength);
		return 'Y';
	}

	// calculate ftThisWeek
	uli.QuadPart -= 5184000000000;
	ftThisWeek.dwHighDateTime = uli.HighPart;
	ftThisWeek.dwLowDateTime = uli.LowPart;
	if (CompareFileTime(&ftTime, &ftThisWeek) >= 0) {
		FileTimeToLocalFileTime(&ftTime, &ft);
		FileTimeToSystemTime(&ft, &st);
        if (pszSecondary)
            ::GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, 
                &st, NULL, pszSecondary, strLength);
        return st.wDayOfWeek + 1;
	}

	// Older than one week ago
	FileTimeToLocalFileTime(&ftTime, &ft);
	FileTimeToSystemTime(&ft, &st);
    if (pszSecondary)
        ::GetDateFormat(LOCALE_USER_DEFAULT, NULL, &st,
            TEXT("M/dd"), pszSecondary, strLength);
	return 'O';
}

// prints the date and time, like: 2008/04/02 23:59
// in the user's current locale
void _printDate(TCHAR * str, int strLength, FILETIME ft) {
    FILETIME ftLocal;
    SYSTEMTIME st;
    TCHAR buffer[10];

    FileTimeToLocalFileTime(&ft, &ftLocal);
    FileTimeToSystemTime(&ftLocal, &st);
    ::GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st,
        NULL, str, strLength);
    ::GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, 
        &st, NULL, buffer, 10);
    StringCchCat(str, strLength, TEXT(" "));
    StringCchCat(str, strLength, buffer);
}

void _printDuration(TCHAR * str, int strLength, FILETIME ftStart, 
    FILETIME ftEnd, Settings * pSettings) {
    LARGE_INTEGER liStart;
    LARGE_INTEGER liEnd;
    LONGLONG duration;
    int hours;
    int minutes;

    liStart.HighPart = ftStart.dwHighDateTime;
    liStart.LowPart = ftStart.dwLowDateTime;
    liEnd.HighPart = ftEnd.dwHighDateTime;
    liEnd.LowPart = ftEnd.dwLowDateTime;
    duration = liEnd.QuadPart - liStart.QuadPart;
    duration /= 10000000; //100 nanosecond intervals -> seconds

    if (duration > 3600) {
        hours = (int)duration / 3600;
        duration -= hours * 3600;
        minutes = (int)duration / 60;
        duration -= minutes * 60;
        StringCchPrintf(str, strLength, TEXT("%d:%02d:%02d"), 
            hours, minutes, duration);
    }
    else if (duration > 60) {
        minutes = (int)duration / 60;
        duration -= minutes * 60;
        StringCchPrintf(str, strLength, TEXT("%d:%02d"), minutes, duration);
    }
    else {
        StringCchPrintf(str, strLength, TEXT("%d "), duration);
        StringCchCat(str, strLength, pSettings->seconds_string);
    }
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女视频网站久久| 韩日欧美一区二区三区| 精品sm在线观看| 一本大道av一区二区在线播放| 亚洲一区二区四区蜜桃| 欧美精品一区二区三区高清aⅴ| 97久久精品人人做人人爽50路| 久久国产精品99久久久久久老狼 | 国产日韩亚洲欧美综合| 欧美在线啊v一区| 成人一区二区在线观看| 美女一区二区视频| 亚洲成在线观看| 国产精品理论片| 久久蜜臀精品av| 欧美一级日韩一级| 精品视频123区在线观看| 不卡的av电影在线观看| 国产麻豆91精品| 免费日本视频一区| 亚洲观看高清完整版在线观看| 亚洲欧美在线视频| 国产精品美女久久久久久2018 | 色婷婷精品久久二区二区蜜臂av | 国产视频不卡一区| 欧美成人r级一区二区三区| 欧美人妖巨大在线| 欧美午夜理伦三级在线观看| 色婷婷精品久久二区二区蜜臂av| 成人激情文学综合网| 国产99久久久精品| 国产伦精品一区二区三区免费迷 | 欧美一级夜夜爽| 欧美日韩成人综合天天影院| 色婷婷精品久久二区二区蜜臂av| 不卡的电影网站| 成人激情文学综合网| 国产成人在线影院| 高清不卡在线观看| 成人91在线观看| 91亚洲精品久久久蜜桃| 91亚洲精华国产精华精华液| 91亚洲精品一区二区乱码| 色综合久久久久久久久| 色呦呦一区二区三区| 欧美丝袜自拍制服另类| 91精品婷婷国产综合久久性色| 亚洲精品国产第一综合99久久| 亚洲免费观看高清在线观看| 亚洲免费在线视频一区 二区| 一区二区在线观看免费视频播放| 一级中文字幕一区二区| 亚洲成人在线网站| 奇米影视在线99精品| 精品系列免费在线观看| 久久97超碰国产精品超碰| 国产夫妻精品视频| 91在线观看美女| 欧美日韩国产大片| 日韩欧美综合在线| 国产欧美一区二区三区在线老狼| 国产精品久久免费看| 亚洲欧美日韩中文播放| 性欧美疯狂xxxxbbbb| 久久成人18免费观看| 风流少妇一区二区| 色老汉av一区二区三区| 欧美一区二区三区啪啪| www国产精品av| 亚洲天堂久久久久久久| 天天影视色香欲综合网老头| 国产一区二区美女诱惑| 色综合久久九月婷婷色综合| 69堂国产成人免费视频| 国产欧美一区二区精品性色| 亚洲三级电影网站| 日本不卡免费在线视频| 高清视频一区二区| 欧美美女喷水视频| 国产色91在线| 亚洲成av人片一区二区梦乃| 国产经典欧美精品| 一本一道波多野结衣一区二区| 884aa四虎影成人精品一区| 国产欧美一区二区精品性色| 亚洲国产一区二区三区青草影视| 韩国三级中文字幕hd久久精品| 色综合久久中文综合久久97| 精品日韩一区二区| 一区二区三区四区不卡视频 | 日本高清无吗v一区| 亚洲精品一区在线观看| 亚洲综合一二区| 丁香一区二区三区| 欧美一区二区三区喷汁尤物| 亚洲人妖av一区二区| 久久99精品久久久久| 精品视频一区三区九区| 欧美激情艳妇裸体舞| 日本亚洲视频在线| 色中色一区二区| 欧美激情在线一区二区| 蜜桃av一区二区| 欧美日韩一级片网站| 国产精品传媒视频| 国产福利精品导航| 欧美大片在线观看一区| 亚洲第一激情av| 91免费小视频| 国产精品人妖ts系列视频| 国模无码大尺度一区二区三区| 欧美视频一区在线| 一区二区三区四区高清精品免费观看| 国产精品18久久久| 免费不卡在线观看| 欧美亚洲国产一卡| 亚洲丝袜精品丝袜在线| 成人激情小说乱人伦| 久久久久97国产精华液好用吗| 免费av网站大全久久| 6080yy午夜一二三区久久| 亚洲伊人伊色伊影伊综合网| av中文一区二区三区| 欧美国产日本视频| 国产成人在线免费| 国产日韩亚洲欧美综合| 国产精品一级黄| 久久奇米777| 国产精品一二二区| 国产午夜精品一区二区三区嫩草| 国内欧美视频一区二区| 欧美va亚洲va| 国产一区二区毛片| 国产亚洲美州欧州综合国| 国产在线精品免费av| 亚洲精品在线一区二区| 国产综合久久久久久久久久久久| 日韩欧美国产麻豆| 国产一区二区主播在线| 久久看人人爽人人| 国产91精品露脸国语对白| 国产清纯白嫩初高生在线观看91 | 久久99久久99精品免视看婷婷| 欧美一级二级三级蜜桃| 久久99精品国产麻豆婷婷| 久久九九国产精品| 成人综合激情网| 一区二区三区在线视频免费观看| 精品污污网站免费看| 日本不卡一区二区三区高清视频| 欧美一区二区视频观看视频| 激情丁香综合五月| 国产精品久久国产精麻豆99网站| 色哦色哦哦色天天综合| 日本亚洲三级在线| 精品国产免费一区二区三区四区| 国产成人精品一区二| 成人免费一区二区三区在线观看| 91国产免费观看| 男人操女人的视频在线观看欧美| 精品处破学生在线二十三| 成人午夜碰碰视频| 亚洲国产精品一区二区久久恐怖片 | 日韩精品乱码免费| 久久无码av三级| 波波电影院一区二区三区| av一本久道久久综合久久鬼色| 一区二区在线观看视频| 欧美一区三区四区| 成人一区二区视频| 无码av免费一区二区三区试看| 精品国产一二三区| 91亚洲国产成人精品一区二区三| 丝袜诱惑制服诱惑色一区在线观看 | 91搞黄在线观看| 欧美aⅴ一区二区三区视频| 国产精品欧美久久久久一区二区| 欧美性高清videossexo| 国产在线精品一区二区| 亚洲精品高清在线| 2019国产精品| 欧美日韩亚洲另类| 成人性生交大片免费| 青娱乐精品视频在线| 亚洲欧美怡红院| 日韩女优av电影| 91久久免费观看| 国产成人精品1024| 日韩av在线免费观看不卡| 中日韩免费视频中文字幕| 777久久久精品| 色欧美乱欧美15图片| 国产在线精品视频| 日韩精品亚洲一区| 日韩伦理电影网| 国产亚洲福利社区一区| 91麻豆精品91久久久久同性| 91免费国产在线观看| 国产精品66部| 免费在线视频一区|