📄 browserutils.cpp
字号:
};
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 + -