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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? util.h

?? ril source code for Windows CE
?? H
?? 第 1 頁 / 共 3 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:

util.h

Abstract:


Notes:


--*/

#pragma once

#include "rildebug.h"
#include "FunctionTrace.h"

//
// Character mapping structure used for binary search
//
struct CHARMAP {
    char ch;
    WCHAR wch;
};

//
// Encoding types
//
enum ENCODING_TYPE {
    ENCODING_GSMDEFAULT = 0,// GSM Default alphabet
    ENCODING_GSMDEFAULT_HEX, // GSM Default alphabet, HEX encoded
    ENCODING_GSMDEFAULT_UNPACKED, // GSM Default alphabet, 7 bit packed see GSM 07.07 5.5
    ENCODING_GSMDEFAULT_HEX_UNPACKED, // GSM Default alphabet, HEX encoded, not 7 bit packed see GSM 07.07 5.5
    ENCODING_GSMDEFAULT_UNICODE, // Unicode alphabet, HEX encoded
    ENCODING_GSMDEFAULT_UTF8, // Unicode alphabet, UTF-8 encoded
    // Others to be added later
};

//
// Function declarations
//
BOOL UnicodeCharToGSM(const WCHAR wch, char *pchRet);
BOOL GSMCharToUnicode(const char ch, WCHAR *pwchRet);
char SemiByteToChar(const BYTE bByte, const BOOL fHigh);
BYTE SemiByteCharsToByte(const char chHigh, const char chLow);
BOOL GSMHexToGSM(const LPCSTR sIn, const UINT cbIn, __out_bcount( cbOut ) const LPSTR sOut, const UINT cbOut, UINT& rcbUsed);
BOOL GSMToGSMHex(const LPCSTR sIn, const UINT cbIn, __out_bcount( cbOut ) const LPSTR sOut, const UINT cbOut, UINT& rcbUsed);
BOOL ConvertFromUnicode(const ENCODING_TYPE enc, const LPCWSTR wsIn, const UINT cchIn, __out_bcount( cbOut ) const LPSTR sOut, const UINT cbOut,
                        UINT& rcbUsed);
BOOL ConvertToUnicode(const ENCODING_TYPE enc, const LPCSTR sIn, const UINT cbIn, __out_ecount( cchOut ) const LPWSTR wsOut, const UINT cchOut,
                      UINT& rcchUsed);
BOOL ConvertTECharSetToUnicode(const LPCSTR sIn, const UINT cchIn,
                               const LPWSTR wsOut, const UINT cchOut,
                               UINT * pcchUsed);
BOOL ConvertUnicodeToTECharSet(const LPWSTR wsIn, const UINT cchIn,
                               const LPSTR sOut, const UINT cchOut,
                               UINT * pcchUsed);
HRESULT RILAddressToString(const RILADDRESS& rraAddress, __out_bcount( cbOut ) const LPSTR szOut, const UINT cbOut, BYTE& rbTypeOfAddress, ENCODING_TYPE etEncoding = ENCODING_GSMDEFAULT_HEX);
BOOL StringToRILAddress(const LPCSTR szAddress, const BYTE bTypeOfAddress, RILADDRESS& rraAddress, ENCODING_TYPE etEncoding = ENCODING_GSMDEFAULT_HEX);
HRESULT RILSubAddressToString(const RILSUBADDRESS& rrsaSubAddress, __out_ecount( cchOut ) const LPSTR szOut, const UINT cchOut, BYTE& rbType);
BOOL StringToRILSubAddress(const LPCSTR szSubAddress, const BYTE bType, RILSUBADDRESS& rrsaSubAddress);
HRESULT DetermineSimResponseError(DWORD dwSW1, DWORD dwSW2);
BOOL IsElementarySimFile(DWORD dwFileID);
BOOL ComposeCmdWithByteArray(const LPCSTR szPrefix, const BYTE* const pbBytes, const UINT cbBytes,
                             const LPCSTR szPostfix, LPSTR& rszCmd);
char * BeginLineSpecificCommand( __out_ecount( cchSize ) char *szCmdDst, UINT cchSize, DWORD dwAddressId);
BOOL AllocateOrReallocateStorage(BYTE** const prgrData, const size_t stSize, const UINT nUsed, UINT* const pnAllocated,
                                 const UINT nGrowSize);
void UpdateSIMState(DWORD dwSimState);
HRESULT StringFilterW( __out_ecount( cchDest ) LPWSTR wszDest, size_t cchDest, const WCHAR *wszSrc, const WCHAR *wszFilter);

#ifdef GPRS_CONTEXT_CACHING
void UpdateGPRSContextCommandCache( LPCSTR szCmd );
void ClearGPRSContextCommandCache();
bool IsGPRSContextCommandCached( LPCSTR szCmd );
#endif GPRS_CONTEXT_CACHING
#ifdef RIL_RADIO_RESILIENCE
void SavePINSecure(LPCSTR szNewPIN);
BOOL FetchPINSecure(LPSTR szPinBuffer, DWORD cbBufferSIze);
#endif // RIL_RADIO_RESILIENCE
void IndicateCallActivityToAudioSubsystem(BOOL fActive, BOOL fCheckCallList);
//
// Class declarations
//

// Growable character buffer
class CBuffer
{
public:
            CBuffer();
            virtual ~CBuffer();

    BOOL    Append(const LPCSTR szString, const UINT cbString);
    LPSTR   GetData() const     { return m_szData; };
    UINT    GetLength() const   { return m_cbLength; };
    LPSTR   GiveUpData();
    void    InheritData(CBuffer* pSrcBuffer);

protected:
    LPSTR   m_szData;
    UINT    m_cbLength;
    UINT    m_cbAlloc;
};


// Doubly-linked list element
class CListElem
{
public:
                CListElem() : m_pNext(NULL), m_pPrev(NULL) {};
                ~CListElem() {};

    CListElem*  GetNext() const         { return m_pNext; };
    CListElem*  GetPrev() const         { return m_pPrev; };

    void        SetNext(CListElem* p)   { m_pNext = p; };
    void        SetPrev(CListElem* p)   { m_pPrev = p; };

private:
    CListElem*  m_pNext;
    CListElem*  m_pPrev;
};


// Callback used when entering exclusive use mode
typedef void (*PFN_SHRDUSE_ACTION)(DWORD dwParam);


// Shared resource with readers/writers synchronization
class CSharedResource
{
public:
            CSharedResource();
            ~CSharedResource();

    BOOL    Init(const HANDLE hCancelEvent);
    BOOL    EnterSharedUse();
    BOOL    ExitSharedUse();
    BOOL    EnterExclusiveUse(PFN_SHRDUSE_ACTION pfnAction, const DWORD dwParam) const;
    BOOL    ExitExclusiveUse() const;

private:
    BOOL                m_fInited;
    CRITICAL_SECTION    m_cs;
    DWORD               m_dwSharedUsers;
    HANDLE              m_hSharedUseSph;
    HANDLE              m_hExclusiveUseSph;
    HANDLE              m_hCancelEvent;
};


// Function to be passed to CQueue::Enum().
//    This function should return TRUE for enumeration to stop.
typedef BOOL (*PFN_QUEUE_ENUM)(void* pItem, DWORD dwData);

// Function to be passed to CQueue::ConditionalGet().
//    This function should return TRUE for for the item to be removed from the queue.
typedef BOOL (*PFN_QUEUE_TEST)(void* pItem, DWORD dwData);

// Function to be used to destroy items in the queue
// when the queue is destroyed.
typedef void (*PFN_QUEUE_ITEMDTOR)(void *pItem);

template <class Type, UINT Size>
class CBoundedQueue
{
private:
    CEvent              m_eventSpace;
    CUniquelyNamedEvent m_eventItems;
    Type *              m_rgpItems[Size];
    UINT                m_nUsed;
    PFN_QUEUE_ITEMDTOR  m_pfnItemDtor;
    CRITICAL_SECTION    m_cs;

public:
            CBoundedQueue(PFN_QUEUE_ITEMDTOR pfnItemDtor = NULL);
    virtual ~CBoundedQueue();

    BOOL    Ready() const { return m_eventSpace.Ready() && m_eventItems.Ready(); }
    BOOL    Init();
    BOOL    Put(Type* const pItem);
    BOOL    Get(Type** ppItem);
    BOOL    Peek(Type** ppItem);
    HRESULT ConditionalGet(const PFN_QUEUE_TEST pfnTest, const DWORD dwData, Type** rpItem);

    const
    TCHAR * GetItemsEventName() { return m_eventItems.GetName(); }
    HANDLE  GetItemsEvent() { return m_eventItems.GetHandle(); }
    HANDLE  GetSpaceEvent() { return m_eventSpace.GetHandle(); }
};

template <class Type, UINT Size>
CBoundedQueue<Type, Size>::CBoundedQueue(PFN_QUEUE_ITEMDTOR pfnItemDtor)
:   m_nUsed(0),
    m_pfnItemDtor(pfnItemDtor)
{
    InitializeCriticalSection(&m_cs);

    for (UINT i = 0; i < Size; i++)
        m_rgpItems[i] = NULL;
}

template <class Type, UINT Size>
CBoundedQueue<Type, Size>::~CBoundedQueue()
{
    // In case someone is still waiting on
    // this queue, try to avoid conflicts...
    if (m_eventItems.Ready())
        m_eventItems.Reset();   // no items to dequeue
    if (m_eventSpace.Ready())
        m_eventSpace.Reset();   // no space for enqueue

    if (m_pfnItemDtor)
    {
        for (UINT i = 0; i < m_nUsed; i++)
        {
            m_pfnItemDtor(m_rgpItems[i]);
            m_rgpItems[i] = NULL;
        }
    }

    m_nUsed = 0;

    DeleteCriticalSection(&m_cs);
}

template <class Type, UINT Size>
BOOL CBoundedQueue<Type, Size>::Init()
{
    return
        m_eventSpace.Init(TRUE, TRUE) &&
        m_eventItems.Init(TRUE, FALSE, TEXT("CBoundedQueue_"));
}

template <class Type, UINT Size>
BOOL CBoundedQueue<Type, Size>::Put(Type * const pItem)
{
    ASSERT(Ready());

    SYNCBLOCK(m_cs);

    if (m_nUsed < Size)
    {
        // Put the element in our queue.
        m_rgpItems[m_nUsed++] = pItem;

        // If this filled the queue buffer,
        // then reset the space avail event.
        if (m_nUsed == Size)
            m_eventSpace.Reset();

        // There's something new in the queue,
        // so signal waiting threads.
        m_eventItems.Set();

        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

template <class Type, UINT Size>
BOOL CBoundedQueue<Type, Size>::Get(Type ** ppItem)
{
    return ConditionalGet(NULL, 0, ppItem);
}

template <class Type, UINT Size>
BOOL CBoundedQueue<Type, Size>::Peek(Type ** ppItem)
{
    ASSERT(Ready());

    ASSERT(ppItem);
    if (!ppItem)
        return FALSE;

    SYNCBLOCK(m_cs);

    if (m_nUsed > 0)
    {
        // Copy the element from the queue.
        *ppItem = m_rgpItems[0];

        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

template <class Type, UINT Size>
HRESULT CBoundedQueue<Type, Size>::ConditionalGet(const PFN_QUEUE_TEST pfnTest,
                                                  const DWORD dwData,
                                                  Type** ppItem)
{
    ASSERT(Ready());

    ASSERT(ppItem);
    if (!ppItem)
        return S_FALSE;

    SYNCBLOCK(m_cs);

    if (m_nUsed > 0)
    {
        // Copy the element from the queue.
        Type * pItem = m_rgpItems[0];

        // If there is a condition, make sure
        // it is satisfied.
        if (pfnTest && !pfnTest(pItem, dwData))
            return E_FAIL;

        // One less in queue now...
        m_nUsed--;

        if (m_nUsed)
        {
            // Slide remaining items over to the beginning of the buffer.
            memmove(m_rgpItems, (BYTE*)m_rgpItems + sizeof(Type*), sizeof(Type*) * m_nUsed);

            // If we just made space, then set this event.
            if (Size - 1 == m_nUsed)
                m_eventSpace.Set();
        }
        else
        {
            // The last item was copied from the queue,
            // so reset this event.
            m_eventItems.Reset();
        }

        // NULL out the space that was freed up.
        m_rgpItems[m_nUsed] = NULL;

        // Set the output parameter.
        *ppItem = pItem;

        return S_OK;
    }
    else
    {
        return S_FALSE;
    }
}

template <class Type>
class CUnboundedQueue
{
private:
    CUniquelyNamedEvent m_eventItems;
    Type **             m_rgpItems;
    DWORD               m_dwInitialSize;
    DWORD               m_dwCurrentSize;
    UINT                m_nUsed;
    PFN_QUEUE_ITEMDTOR  m_pfnItemDtor;
    CRITICAL_SECTION    m_cs;

protected:
    BOOL    GrowQueue();

public:
            CUnboundedQueue(PFN_QUEUE_ITEMDTOR pfnItemDtor = NULL);
    virtual ~CUnboundedQueue();

    BOOL    Ready() const { return m_rgpItems != NULL && m_eventItems.Ready(); }
    BOOL    Init(DWORD dwInitialSize);
    BOOL    Put(Type* const pItem);
    BOOL    Get(Type** ppItem);
    BOOL    Peek(Type** ppItem);
    HRESULT ConditionalGet(const PFN_QUEUE_TEST pfnTest, const DWORD dwData, Type** rpItem);

    const
    TCHAR * GetItemsEventName() { return m_eventItems.GetName(); }
    HANDLE  GetItemsEvent() { return m_eventItems.GetHandle(); }

    UINT    GetSize() { return m_nUsed; }
    DWORD   GetCurrentBufferSize() { return m_dwCurrentSize; }
};

template <class Type>
CUnboundedQueue<Type>::CUnboundedQueue(PFN_QUEUE_ITEMDTOR pfnItemDtor)
:   m_nUsed(0),
    m_dwInitialSize(0),
    m_dwCurrentSize(0),
    m_rgpItems(NULL),
    m_pfnItemDtor(pfnItemDtor)
{
    InitializeCriticalSection(&m_cs);
}

template <class Type>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
gogogo免费视频观看亚洲一| 在线免费观看视频一区| 亚洲视频免费看| 欧美一级日韩不卡播放免费| 国产成人精品亚洲777人妖| 亚洲h精品动漫在线观看| 国产三级久久久| 欧美一二三在线| 欧美性xxxxx极品少妇| 国产suv精品一区二区6| 美洲天堂一区二卡三卡四卡视频| 亚洲欧美福利一区二区| 久久人人超碰精品| 欧美一区午夜精品| 欧美在线视频你懂得| 成人一区二区三区视频在线观看| 青草av.久久免费一区| 一区二区在线看| 中文字幕国产一区二区| 欧美精品一区二区久久婷婷| 在线成人小视频| 欧美日本乱大交xxxxx| 在线精品视频一区二区三四| 99精品国产视频| 懂色av一区二区三区蜜臀| 久久精品国产99| 欧美a级理论片| 日韩一区精品字幕| 午夜不卡在线视频| 午夜精品一区二区三区免费视频 | 欧洲一区在线电影| 成人99免费视频| 粉嫩av亚洲一区二区图片| 国产精品亚洲视频| 国产原创一区二区| 国产麻豆成人传媒免费观看| 日本大胆欧美人术艺术动态| 91网站视频在线观看| 国产精品18久久久久久久网站| 青青草精品视频| 男女激情视频一区| 日本成人在线不卡视频| 麻豆精品一区二区三区| 国内久久精品视频| 国产乱一区二区| 成人晚上爱看视频| 91在线视频播放地址| 91片黄在线观看| 欧美综合色免费| 在线播放91灌醉迷j高跟美女| 69堂精品视频| 欧美xxxxxxxx| 国产精品丝袜一区| 亚洲精品视频自拍| 亚洲资源中文字幕| 久久精品国产精品青草| 九九视频精品免费| 国产不卡高清在线观看视频| 成人免费av在线| 在线免费亚洲电影| 欧美一区二区三区思思人| 精品福利在线导航| 国产精品成人一区二区艾草| 一区二区三区视频在线观看| 天天影视涩香欲综合网| 久久国产剧场电影| 成人丝袜视频网| 国产午夜精品一区二区三区四区| 欧美韩日一区二区三区| 亚洲欧美日韩国产成人精品影院| 亚洲午夜电影在线| 久久99精品国产.久久久久久| 国产成人精品aa毛片| 色婷婷综合久久久久中文| 9191国产精品| 国产精品久久久久一区二区三区共| 亚洲天堂免费看| 热久久一区二区| 成人av在线网站| 欧美精品国产精品| 国产精品你懂的| 日本中文字幕一区| 成人av电影免费在线播放| 欧美高清性hdvideosex| 久久精品一区二区三区四区| 亚洲综合色网站| 国产高清无密码一区二区三区| 欧美最猛黑人xxxxx猛交| 久久综合精品国产一区二区三区 | 日韩三级伦理片妻子的秘密按摩| 久久久久久久综合色一本| 亚洲午夜一二三区视频| 国产一区日韩二区欧美三区| 日本久久电影网| 2017欧美狠狠色| 五月天丁香久久| av一二三不卡影片| 精品1区2区在线观看| 亚洲一区二区三区四区的| 国产成人免费xxxxxxxx| 欧美一级国产精品| 一区二区三区精品在线观看| 久久99国产精品麻豆| 在线欧美日韩国产| 国产精品高潮久久久久无| 久久99国产精品免费| 欧美精品18+| 一区二区欧美视频| 成人午夜视频在线| 精品久久久久久亚洲综合网 | 精品国产乱码久久久久久夜甘婷婷| 综合色中文字幕| 国产一区二区免费在线| 欧美一区二区在线视频| 一区二区久久久| 99精品视频在线观看| 久久综合九色综合97婷婷| 天堂一区二区在线| 欧美天天综合网| 亚洲激情图片qvod| 色综合天天做天天爱| 欧美高清在线一区二区| 国产精品乡下勾搭老头1| 精品久久久久久久久久久久久久久久久| 欧洲人成人精品| 亚洲精品视频一区二区| av一本久道久久综合久久鬼色| 国产欧美一区二区三区在线老狼| 国产麻豆一精品一av一免费 | 蜜臀av一区二区在线观看| 国产亚洲精品免费| 美女视频黄免费的久久| 日韩精品一区二区三区视频在线观看 | 日韩色视频在线观看| 日日夜夜精品视频免费| 欧美嫩在线观看| 日本美女一区二区三区| 日韩视频免费观看高清完整版 | 成人国产电影网| 国产欧美一区视频| 成人短视频下载| 亚洲色图都市小说| 99精品偷自拍| 亚洲一区二区三区四区在线 | 国产女人aaa级久久久级| 国产美女视频91| 国产精品三级电影| 色综合av在线| 视频一区视频二区中文字幕| 欧美一区2区视频在线观看| 精品一区二区免费视频| 国产日韩欧美不卡在线| www.视频一区| 亚洲成av人片一区二区梦乃| 91麻豆精品国产综合久久久久久| 美国精品在线观看| 久久综合丝袜日本网| 不卡的av在线播放| 亚洲精品欧美二区三区中文字幕| 欧美日韩电影在线播放| 精彩视频一区二区| 国产精品电影院| 欧美日本韩国一区| 国产精品一区二区久激情瑜伽| 国产精品国产三级国产a| 欧美在线观看禁18| 久久疯狂做爰流白浆xx| 国产精品美女久久久久久| 欧美在线观看禁18| 久久不见久久见免费视频7| 国产精品久线在线观看| 欧美午夜视频网站| 国产精品一区免费视频| 亚洲日韩欧美一区二区在线| 欧美一区二区免费视频| 粉嫩aⅴ一区二区三区四区五区| 亚洲制服丝袜av| 久久久久国色av免费看影院| 欧美中文字幕一区二区三区亚洲| 经典三级在线一区| 亚洲免费电影在线| 精品美女一区二区三区| 色欧美乱欧美15图片| 激情伊人五月天久久综合| 亚洲一区二区精品久久av| xf在线a精品一区二区视频网站| 在线精品视频小说1| 国产精品99久久久久久久vr| 亚洲一区二区三区三| 中文字幕av一区 二区| 日韩三级免费观看| 在线亚洲+欧美+日本专区| 丰满亚洲少妇av| 日韩av电影免费观看高清完整版 | a级精品国产片在线观看| 日本女优在线视频一区二区| 亚洲卡通动漫在线| 国产欧美精品一区| 精品久久久三级丝袜| 欧美嫩在线观看|