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

📄 browserutils.cpp

📁 Last change: 2008-02-03 This is the source code of KCeasy。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
};

static METHODDATA rgmdataExtDisp[] =
{
/*
    { OLESTR("Test"), &rgpDataTest, IDMEMBER_Test, IMETH_setTest, CC_CDECL, 1, DISPATCH_PROPERTYPUT, VT_EMPTY },
    { OLESTR("Test"), NULL,         IDMEMBER_Test, IMETH_getTest, CC_CDECL, 0, DISPATCH_PROPERTYGET, VT_BSTR },
*/
    { OLESTR("getNetworks"),        NULL,         IDMEMBER_getNetworks,      IMETH_getNetworks,      CC_CDECL, 0, DISPATCH_METHOD, VT_BSTR  },
    { OLESTR("getOnlineStatus"),    NULL,         IDMEMBER_getOnlineStatus,  IMETH_getOnlineStatus,  CC_CDECL, 0, DISPATCH_METHOD, VT_BSTR  },
    { OLESTR("getDaemonAddress"),   NULL,         IDMEMBER_getDaemonAddress, IMETH_getDaemonAddress, CC_CDECL, 0, DISPATCH_METHOD, VT_BSTR  },
    { OLESTR("UpdateStats"),        NULL,         IDMEMBER_UpdateStats,      IMETH_UpdateStats,      CC_CDECL, 0, DISPATCH_METHOD, VT_EMPTY },
    { OLESTR("getVersion"),         NULL,         IDMEMBER_getVersion,       IMETH_getVersion,       CC_CDECL, 0, DISPATCH_METHOD, VT_BSTR  },
    { OLESTR("getBuildDate"),       NULL,         IDMEMBER_getBuildDate,     IMETH_getBuildDate,     CC_CDECL, 0, DISPATCH_METHOD, VT_BSTR  },
    { OLESTR("P2PSearch"),          rgpP2PSearch, IDMEMBER_P2PSearch,        IMETH_P2PSearch,        CC_CDECL, 2, DISPATCH_METHOD, VT_EMPTY }
};

INTERFACEDATA idataExtDisp =
{
    rgmdataExtDisp, sizeof(rgmdataExtDisp) / sizeof(METHODDATA)
};


/* our interface */

BSTR STDMETHODCALLTYPE IBrowserExternal::getNetworks()
{
    string Ret = "";
    bool DetailedStats = Config->GetValueInt("gui/show_network_stats");

    if(Engine && Engine->GetNetworks() && !Engine->IsOffline()) {
        TNetworks* Nets = Engine->GetNetworks();
        Nets->Lock();
        for(TNetworks::TNetworkIterator itr = Nets->GetBegin(); itr != Nets->GetEnd(); ++itr) {
            Ret += string("network=") + (*itr)->GetName() + "&";
            Ret += string("show_stats=") + (DetailedStats ? "1" : "0") + "&";

            if((*itr)->IsConnected())
                // TRANSLATOR: Network status shown in browser
                Ret += string("status=") + _("Connected").c_str() + "&";
            else
                // TRANSLATOR: Network status shown in browser
                Ret += string("status=") + _("Connecting...").c_str() + "&";

            Ret += string("users=") + uint_to_string((*itr)->GetUsers()) + "&";
            Ret += string("files=") + uint_to_string((*itr)->GetFiles()) + "&";
            Ret += string("size=") + uint_to_string((*itr)->GetSize()) + ";";
        }
        Nets->Release();
    }

    return WideString(Ret.c_str()).Detach();
}

BSTR STDMETHODCALLTYPE IBrowserExternal::getOnlineStatus()
{
    string Ret = "";

    if(Engine) {
        switch(Engine->GetState()) {
        // TRANSLATOR: Connection state shown in browser
        case TEngine::Offline:           Ret = _("Offline").c_str();            break;
        // TRANSLATOR: Connection state shown in browser
        case TEngine::Connecting:        Ret = _("Connecting...").c_str();      break;
        // TRANSLATOR: Connection state shown in browser
        case TEngine::LaunchingGift:     Ret = _("Launching giFT...").c_str();  break;
        // TRANSLATOR: Connection state shown in browser
        case TEngine::LaunchFailed:      Ret = _("Launch failed").c_str();      break;
        // TRANSLATOR: Connection state shown in browser
        case TEngine::LaunchSucceeded:   Ret = _("Launch succeeded").c_str();   break;
        // TRANSLATOR: Connection state shown in browser
        case TEngine::ConnectFailed:     Ret = _("Connect failed").c_str();     break;
        // TRANSLATOR: Connection state shown in browser
        case TEngine::Online:            Ret = _("Online").c_str();             break;
        // TRANSLATOR: Connection state shown in browser
        case TEngine::Disconnecting:     Ret = _("Disconnecting...").c_str();   break;
        }
    }

    return WideString(Ret.c_str()).Detach();
}

BSTR STDMETHODCALLTYPE IBrowserExternal::getDaemonAddress()
{
    string Ret = "";

    if(Engine && !Engine->IsOffline()) {
        Ret = Engine->GetGiftHost() + ":";
        Ret += int_to_string(Engine->GetGiftPort());
    }

    return WideString(Ret.c_str()).Detach();
}

void STDMETHODCALLTYPE IBrowserExternal::UpdateStats()
{
    if(Engine && !Engine->IsOffline()) {
        Engine->GetNetworks()->Update();
    }
}

BSTR STDMETHODCALLTYPE IBrowserExternal::getVersion()
{
    return WideString(Brand->GetVersionString().c_str()).Detach();
}

BSTR STDMETHODCALLTYPE IBrowserExternal::getBuildDate()
{
    return WideString(Brand->GetBuildDate().c_str()).Detach();
}

void STDMETHODCALLTYPE IBrowserExternal::P2PSearch(BSTR BQuery, BSTR BRealm)
{
    WideString WQuery, WRealm;
    WQuery.Attach(BQuery);
    WRealm.Attach(BRealm);

    TSearchRealm Realm = SRAny;
    if     (WRealm == WideString(L"audio"))    Realm = SRAudio;
    else if(WRealm == WideString(L"video"))    Realm = SRVideo;
    else if(WRealm == WideString(L"image"))    Realm = SRImage;
    else if(WRealm == WideString(L"document")) Realm = SRDocument;
    else if(WRealm == WideString(L"torrent"))  Realm = SRTorrent;

    SearchForm->RunSearch(AnsiString(WQuery).c_str(), Realm);
    MainForm->SetVisiblePage(SearchForm);

    WQuery.Detach();
    WRealm.Detach();
}

/* IDispatch class for our interface */

TExternalDispatch::TExternalDispatch()
:   refcount(1),
    BrowserExternal(NULL),
    TypeInfo(NULL)
{
    BrowserExternal = new IBrowserExternal();
    CreateDispTypeInfo(&idataExtDisp, LOCALE_SYSTEM_DEFAULT, &TypeInfo);
}

TExternalDispatch::~TExternalDispatch()
{
    if(TypeInfo)
        TypeInfo->Release();

    delete BrowserExternal;
}

/* IUnknown */

HRESULT STDMETHODCALLTYPE TExternalDispatch::QueryInterface(REFIID classid, void** intf)
{
    if(intf == NULL)
        return E_INVALIDARG;

    if (classid == IID_IDispatch || classid == IID_IUnknown) {
        AddRef();
        *intf = this;
        return S_OK;
    }

    *intf = NULL;
    return E_NOINTERFACE;
}

ULONG STDMETHODCALLTYPE TExternalDispatch::AddRef()
{
    InterlockedIncrement(&refcount);
    return refcount;
}

ULONG STDMETHODCALLTYPE TExternalDispatch::Release()
{
    InterlockedDecrement(&refcount);
    if (refcount == 0) {
        delete this;
        return 0;
    }
    return refcount;
}

/* IDispatch */

HRESULT STDMETHODCALLTYPE TExternalDispatch::GetTypeInfoCount(
    UINT* pctinfo)
{
    if(TypeInfo == NULL)
        return E_NOTIMPL; // shouldn't happen

    if(pctinfo == NULL)
        return E_INVALIDARG;

    *pctinfo = 1;

	return S_OK;
}

HRESULT STDMETHODCALLTYPE TExternalDispatch::GetTypeInfo(
    /* [in] */ UINT iTInfo,
    /* [in] */ LCID lcid,
    /* [out] */ ITypeInfo** ppTInfo)
{
    if(TypeInfo == NULL)
        return E_NOTIMPL; // shouldn't happen

    if(iTInfo != 0)
        return DISP_E_BADINDEX;

    if(ppTInfo == NULL)
        return E_INVALIDARG;

    TypeInfo->AddRef();
    *ppTInfo = TypeInfo;

	return S_OK;
}

HRESULT STDMETHODCALLTYPE TExternalDispatch::GetIDsOfNames(
    /* [in] */ REFIID riid,
    /* [size_is][in] */ OLECHAR** rgszNames,
    /* [in] */ UINT cNames,
    /* [in] */ LCID lcid,
    /* [size_is][out] */ DISPID* rgDispId)
{
    if(TypeInfo == NULL)
        return E_NOTIMPL; // shouldn't happen

    return TypeInfo->GetIDsOfNames(rgszNames, cNames, rgDispId);
}

HRESULT STDMETHODCALLTYPE TExternalDispatch::Invoke(
    /* [in] */ DISPID dispIdMember,
    /* [in] */ REFIID /*riid*/,
    /* [in] */ LCID /*lcid*/,
    /* [in] */ WORD wFlags,
    /* [out][in] */ DISPPARAMS* pDispParams,
    /* [out] */ VARIANT* pVarResult,
    /* [out] */ EXCEPINFO* pExcepInfo,
    /* [out] */ UINT* puArgErr)
{
    if(TypeInfo == NULL)
        return E_NOTIMPL; // shouldn't happen

    return TypeInfo->Invoke(BrowserExternal, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -