Files
AC_Pro/NotificationExUnit.cpp
2026-06-13 00:05:19 +08:00

357 lines
8.7 KiB
C++

//---------------------------------------------------------------------------
#pragma hdrstop
#include <vcl.h>
#include "NotificationExUnit.h"
#include <System.IOUtils.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
extern wstring g_strUserPath;
TJSONObject* __fastcall GetJsonContext(String strContextNoti)
{
TJSONObject *jsonTmp = new TJSONObject();
TBytes StringBytesTmp = TEncoding::UTF8->GetBytes(strContextNoti);
jsonTmp = (TJSONObject *)jsonTmp->ParseJSONValue(StringBytesTmp, 0);
return jsonTmp;
}
//---------------------------------------------------------------------------
TJSONObject* __fastcall GetJsonValue(TJSONObject *json, int index)
{
if( json->Count > index ){
String strkey = json->Get(index)->JsonString->Value();
return (TJSONObject *)json->GetValue(strkey);
}
return NULL;
}
//---------------------------------------------------------------------------
typedef struct tagBingdingWhere{
IBinding *bind;
int iWhereIs;
}BingdingWhere;
typedef vector<BingdingWhere *> VCBingding;
VCBingding vc_Bingding;
void __fastcall StopURLDownload(int iWhereIs)
{
for(int i=0; i<vc_Bingding.size(); i++) {
BingdingWhere *pTmp = vc_Bingding[i];
if( iWhereIs==pTmp->iWhereIs ) {
if( pTmp->bind ){
pTmp->bind->Abort();
}
break;
}
}
}
HRESULT STDMETHODCALLTYPE CBindCBHttpCallback::OnStartBinding(DWORD dwReserved, IBinding __RPC_FAR *pib)
{
pib->AddRef();
for(int i=0; i<vc_Bingding.size(); i++) {
BingdingWhere *pTmp = vc_Bingding[i];
if(pTmp->iWhereIs==iWhereIs){
pTmp->bind->Release();
pTmp->bind = pib;
return S_OK;
}
}
BingdingWhere *pWhere = new BingdingWhere();
pWhere->bind = pib;
pWhere->iWhereIs = iWhereIs;
vc_Bingding.push_back(pWhere);
return S_OK;
}
HRESULT STDMETHODCALLTYPE CBindCBHttpCallback::OnStopBinding(HRESULT hresult, LPCWSTR szError)
{
for(int i=0; i<vc_Bingding.size(); i++) {
BingdingWhere *pTmp = vc_Bingding[i];
if( iWhereIs==pTmp->iWhereIs ) {
if( pTmp->bind ){
pTmp->bind->Release();
pTmp->bind = NULL;
}
delete pTmp;
vc_Bingding.erase(vc_Bingding.begin()+i);
break;
}
}
return S_OK;
}
//**********************************************************************
//***************************************TUrlLabel
//**********************************************************************
//---------------------------------------------------------------------------
__fastcall TUrlLabel::TUrlLabel( TComponent* Owner):
Vcl::Stdctrls::TLabel( Owner )
{
FCloseForm = false;
Transparent = true;
ControlStyle>>csOpaque;
FColorNor = CLR_TEXT_NORMAL;
FColorEnt = CLR_TEXT_ENTER;
FColorLea = CLR_TEXT_LEAVE;
Font->Color = FColorNor;
}
//---------------------------------------------------------------------------
__fastcall TUrlLabel::~TUrlLabel()
{
}
//---------------------------------------------------------------------------
void __fastcall TUrlLabel::CMMouseLeave(Winapi::Messages::TMessage &Msg)
{
if( FStrUrl.Length() ) {
Screen->Cursor = crDefault;
Font->Color = FColorLea;
}
if( FOnMouseLeave )
FOnMouseLeave(this);
}
//---------------------------------------------------------------------------
void __fastcall TUrlLabel::CMMouseEnter(Winapi::Messages::TMessage &Msg)
{
if( FStrUrl.Length() ) {
Screen->Cursor = crHandPoint;
Font->Color = FColorEnt;
}else
Font->Color = FColorNor;
if( FOnMouseEnter ) {
FOnMouseEnter(this);
}
}
//---------------------------------------------------------------------------
void __fastcall TUrlLabel::Click()
{
if( StrUrl.Length() ) {
ShellExecute(Parent->Handle, NULL, StrUrl.c_str(), NULL, NULL, SW_SHOWNORMAL);
if(FCloseForm) {
TCustomForm * parentForm = GetParentForm( this );
parentForm->Close();
}
}
}
//---------------------------------------------------------------------------
void __fastcall TUrlLabel::SetStrUrl(String url)
{
FStrUrl = url;
if( FStrUrl.Length() ) {
Font->Color = FColorLea;
}
}
//---------------------------------------------------------------------------
//**********************************************************************
//***************************************TUrlPaintBox
//**********************************************************************
//---------------------------------------------------------------------------
const COLORREF
CLR_AD_CHANGE_NOR = RGB(63, 68, 76),
CLR_AD_CHANGE_ENTER = RGB(94, 101, 112);
#define STATE_NORMAL 0
#define STATE_ENTER 1
__fastcall TUrlPaintBox::TUrlPaintBox( TComponent* Owner, TPicture * graphicImg):
Vcl::Extctrls::TPaintBox( Owner )
{
FCloseForm = false;
FState = 0;
FStateCount = 1;
FIndex = 0;
FGraphicImg = graphicImg;
}
//---------------------------------------------------------------------------
__fastcall TUrlPaintBox::~TUrlPaintBox()
{
}
//---------------------------------------------------------------------------
void __fastcall TUrlPaintBox::Click()
{
if( FStrUrl.Length() ) {
ShellExecute(Parent->Handle, NULL, FStrUrl.c_str(), NULL, NULL, SW_SHOWNORMAL);
if(FCloseForm) {
TCustomForm * parentForm = GetParentForm( this );
parentForm->Close();
}
}
}
//---------------------------------------------------------------------------
void __fastcall TUrlPaintBox::CMMouseEnter(Winapi::Messages::TMessage &Msg)
{
if( FStrUrl.Length() )
Screen->Cursor = crHandPoint;
if( FOnMouseEnter )
FOnMouseEnter(this);
}
//---------------------------------------------------------------------------
void __fastcall TUrlPaintBox::CMMouseLeave(Winapi::Messages::TMessage &Msg)
{
if( FStrUrl.Length() )
Screen->Cursor = crDefault;
if( FOnMouseLeave )
FOnMouseLeave(this);
}
//---------------------------------------------------------------------------
void __fastcall TUrlPaintBox::SetGraphicImg(TPicture *GraphicImg)
{
FGraphicImg = GraphicImg;
this->Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TUrlPaintBox::SetStrUrl(String strUrl)
{
FStrUrl = strUrl;
}
//---------------------------------------------------------------------------
void __fastcall TUrlPaintBox::SetStateCount(int stateCount)
{
FStateCount = stateCount;
}
//---------------------------------------------------------------------------
void __fastcall TUrlPaintBox::Paint()
{
if( GraphicImg ){
if( 1< FStateCount )
Canvas->Draw((-(FGraphicImg->Width/FStateCount))*FState, 0, FGraphicImg->Graphic);
else
Canvas->StretchDraw( TRect(0, 0, Width, Height), FGraphicImg->Graphic);
}else{
if( FState==STATE_NORMAL ){
Canvas->Brush->Color = CLR_AD_CHANGE_NOR;
}else if( FState==STATE_ENTER ){
Canvas->Brush->Color = CLR_AD_CHANGE_ENTER;
}
Canvas->FillRect(TRect(0, 0, Width, Height));
}
}
//---------------------------------------------------------------------------
//**********************************************************************
//***************************************GetUrlData
//**********************************************************************
//---------------------------------------------------------------------------
HRESULT GetUrlData(String url, String fileDirect, String &fileName, TStringStream *fileToSteam, bool bfileToStream, int iWhereIs)
{
String BasePath = g_strUserPath.c_str();
BasePath += fileDirect;
fileName = BasePath + fileName;
if(!DirectoryExists(BasePath, false))
ForceDirectories(BasePath);
DeleteUrlCacheEntry(url.c_str());
CBindCBHttpCallback callBack;
callBack.iWhereIs = iWhereIs;
HRESULT result = URLDownloadToFile(NULL, url.c_str(), fileName.c_str(), 0, &callBack);
if( result==S_OK )
{
bool bfileExsit = true;
if( !FileExists(fileName) ){
result = S_FALSE;
fileName = L"";
bfileExsit = false;
}
if( bfileToStream )
{
if( bfileExsit )
{
if( fileToSteam == NULL ){
fileToSteam = new TStringStream(NULL, 65001);
}
fileToSteam->LoadFromFile(fileName);
fileToSteam->Position = 0;
DeleteFile(fileName);
}
}
}
return result;
}
//---------------------------------------------------------------------------
bool __fastcall GetPic(String &name, bool bCopy)
{
bool bReturn = true;
TMemoryStream *tmpMemoryStream = new TMemoryStream();
tmpMemoryStream->LoadFromFile(name);
tmpMemoryStream->Position = 0;
WORD wType = 0;
tmpMemoryStream->ReadBuffer(&wType, 2);
String tmpName = name;
if( wType==0x5089 ){ //png
name = ChangeFileExt(name, L".png");
RenameFile(tmpName, name);
}else if( wType==0xD8FF ) { //jpg
name = ChangeFileExt(name, L".jpg");
RenameFile(tmpName, name);
}else if( wType==0x4947 ){
name = ChangeFileExt(name, L".gif");
RenameFile(tmpName, name);
}else{
bReturn = false;
}
if( tmpMemoryStream )
delete tmpMemoryStream;
if( bReturn && bCopy)
CopyFile(name.c_str(), tmpName.c_str(), true);
return bReturn;
}